ZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9hbm9uLnB5CmluZGV4IDk5ZTAyY2IuLmQ4OTJiNTkgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Fub24ucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYW5vbi5weQpAQCAtMTQsMjIgKzE0LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCBjX2ludCldCiAgICAgICAgICAgICBfYW5vbnltb3VzXyA9IFsiXyJdCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWS5hLm9mZnNldCwgc2l6ZW9mKGNfaW50KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWS5iLm9mZnNldCwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChZLmEub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFkuYi5vZmZzZXQsIHNpemVvZihjX2ludCkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoQU5PTi5hLm9mZnNldCwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoQU5PTi5iLm9mZnNldCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChBTk9OLmEub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEFOT04uYi5vZmZzZXQsIDApCiAKICAgICBkZWYgdGVzdF9hbm9uX25vbnNlcShzZWxmKToKICAgICAgICAgIyBUeXBlRXJyb3I6IF9hbm9ueW1vdXNfIG11c3QgYmUgYSBzZXF1ZW5jZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHR5cGUoU3RydWN0dXJlKSgiTmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RydWN0dXJlLCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Il9maWVsZHNfIjogW10sICJfYW5vbnltb3VzXyI6IDQyfSkpCiAKICAgICBkZWYgdGVzdF9hbm9uX25vbm1lbWJlcihzZWxmKToKICAgICAgICAgIyBBdHRyaWJ1dGVFcnJvcjogdHlwZSBvYmplY3QgJ05hbWUnIGhhcyBubyBhdHRyaWJ1dGUgJ3gnCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhBdHRyaWJ1dGVFcnJvciwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IHR5cGUoU3RydWN0dXJlKSgiTmFtZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RydWN0dXJlLCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Il9maWVsZHNfIjogW10sCkBAIC01MCwxMSArNTAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfaW50KV0KICAgICAgICAgICAgIF9hbm9ueW1vdXNfID0gWyJfIl0KIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLngub2Zmc2V0LCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmEub2Zmc2V0LCBzaXplb2YoY19pbnQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLmIub2Zmc2V0LCBzaXplb2YoY19pbnQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLl8ub2Zmc2V0LCBzaXplb2YoY19pbnQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLnkub2Zmc2V0LCBzaXplb2YoY19pbnQpICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChZLngub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFkuYS5vZmZzZXQsIHNpemVvZihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWS5iLm9mZnNldCwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChZLl8ub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFkueS5vZmZzZXQsIHNpemVvZihjX2ludCkgKiAyKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlfaW5fcG9pbnRlci5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2FycmF5X2luX3BvaW50ZXIucHkKaW5kZXggM2VkMzEwYy4uYzMxM2FhNiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlfaW5fcG9pbnRlci5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9hcnJheV9pbl9wb2ludGVyLnB5CkBAIC0yNiw3ICsyNiw3IEBACiAgICAgICAgIGMucHZhbHVlcyA9IHZhbF9hcnJheQogCiAgICAgICAgICMgbWVtb3J5IGNvbnRhaW5zIDQgTlVMIGJ5dGVzIG5vdywgdGhhdCdzIGNvcnJlY3QKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjAwLTAwLTAwLTAwIiwgZHVtcCh2YWxfYXJyYXkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIwMC0wMC0wMC0wMCIsIGR1bXAodmFsX2FycmF5KSkKIAogICAgICAgICAjIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBhcnJheSB0aHJvdWdoIHRoZSBwb2ludGVyOgogICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKQEAgLTM1LDcgKzM1LDcgQEAKICAgICAgICAgdmFsdWVzID0gW2MucHZhbHVlc1tpXS52YWwgZm9yIGkgaW4gcmFuZ2UoNCldCiAKICAgICAgICAgIyBUaGVzZSBhcmUgdGhlIGV4cGVjdGVkIHJlc3VsdHM6IGhlcmUgcyB0aGUgYnVnIQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgICh2YWx1ZXMsIGR1bXAodmFsX2FycmF5KSksCiAgICAgICAgICAgICAoWzEsIDIsIDMsIDRdLCAiMDEtMDItMDMtMDQiKQogICAgICAgICApCkBAIC00NSw3ICs0NSw3IEBACiAgICAgICAgIHZhbF9hcnJheSA9IChWYWx1ZSAqIDQpKCkKIAogICAgICAgICAjIG1lbW9yeSBjb250YWlucyA0IE5VTCBieXRlcyBub3csIHRoYXQncyBjb3JyZWN0Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIwMC0wMC0wMC0wMCIsIGR1bXAodmFsX2FycmF5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMDAtMDAtMDAtMDAiLCBkdW1wKHZhbF9hcnJheSkpCiAKICAgICAgICAgcHRyID0gY2FzdCh2YWxfYXJyYXksIFBPSU5URVIoVmFsdWUpKQogICAgICAgICAjIHNldCB0aGUgdmFsdWVzIG9mIHRoZSBhcnJheSB0aHJvdWdoIHRoZSBwb2ludGVyOgpAQCAtNTUsNyArNTUsNyBAQAogICAgICAgICB2YWx1ZXMgPSBbcHRyW2ldLnZhbCBmb3IgaSBpbiByYW5nZSg0KV0KIAogICAgICAgICAjIFRoZXNlIGFyZSB0aGUgZXhwZWN0ZWQgcmVzdWx0czogaGVyZSBzIHRoZSBidWchCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgKHZhbHVlcywgZHVtcCh2YWxfYXJyYXkpKSwKICAgICAgICAgICAgIChbMSwgMiwgMywgNF0sICIwMS0wMi0wMy0wNCIpCiAgICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2FycmF5cy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2FycmF5cy5weQppbmRleCA3ZWUxNmMxLi40MzNhMWZmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9hcnJheXMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXJyYXlzLnB5CkBAIC0xOSwyMyArMTksMjMgQEAKIAogICAgICAgICAgICAgaWEgPSBpbnRfYXJyYXkoKmluaXQpCiAgICAgICAgICAgICAjIGxlbmd0aCBvZiBpbnN0YW5jZSBvaz8KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihpYSksIGFsZW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpYSksIGFsZW4pCiAKICAgICAgICAgICAgICMgc2xvdCB2YWx1ZXMgb2s/CiAgICAgICAgICAgICB2YWx1ZXMgPSBbaWFbaV0gZm9yIGkgaW4gcmFuZ2UobGVuKGluaXQpKV0KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbHVlcywgaW5pdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCBpbml0KQogCiAgICAgICAgICAgICAjIGNoYW5nZSB0aGUgaXRlbXMKICAgICAgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IHNldGl0ZW0KICAgICAgICAgICAgIG5ld192YWx1ZXMgPSByYW5nZSg0MiwgNDIrYWxlbikKICAgICAgICAgICAgIFtzZXRpdGVtKGlhLCBuLCBuZXdfdmFsdWVzW25dKSBmb3IgbiBpbiByYW5nZShhbGVuKV0KICAgICAgICAgICAgIHZhbHVlcyA9IFtpYVtpXSBmb3IgaSBpbiByYW5nZShsZW4oaW5pdCkpXQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsdWVzLCBuZXdfdmFsdWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXMsIG5ld192YWx1ZXMpCiAKICAgICAgICAgICAgICMgYXJlIHRoZSBpdGVtcyBpbml0aWFsaXplZCB0byAwPwogICAgICAgICAgICAgaWEgPSBpbnRfYXJyYXkoKQogICAgICAgICAgICAgdmFsdWVzID0gW2lhW2ldIGZvciBpIGluIHJhbmdlKGxlbihpbml0KSldCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWx1ZXMsIFswXSAqIGxlbihpbml0KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCBbMF0gKiBsZW4oaW5pdCkpCiAKICAgICAgICAgICAgICMgVG9vIG1hbnkgaW4gaXRpYWxpemVycyBzaG91bGQgYmUgY2F1Z2h0CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBpbnRfYXJyYXksICpyYW5nZShhbGVuKjIpKQpAQCAtNDgsMTQgKzQ4LDE0IEBACiAgICAgICAgICMgQ2hhckFycmF5KCJhYmMiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIENoYXJBcnJheSwgImFiYyIpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FbMF0sICJhIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FbMV0sICJiIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FbMl0sICJjIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FbLTNdLCAiYSIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNhWy0yXSwgImIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjYVstMV0sICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYVswXSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhWzFdLCAiYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2FbMl0sICJjIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYVstM10sICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYVstMl0sICJiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYVstMV0sICJjIikKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oY2EpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjYSksIDMpCiAKICAgICAgICAgIyBzbGljaW5nIGlzIG5vdyBzdXBwb3J0ZWQsIGJ1dCBub3QgZXh0ZW5kZWQgc2xpY2luZyAoMy1hcmd1bWVudCkhCiAgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IGdldHNsaWNlLCBkZWxpdGVtCkBAIC03MiwzNCArNzIsMzQgQEAKIAogICAgICAgICBuYSA9IG51bWFycmF5KCkKICAgICAgICAgdmFsdWVzID0gW25hW2ldIGZvciBpIGluIHJhbmdlKGFsZW4pXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWx1ZXMsIFswXSAqIGFsZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzLCBbMF0gKiBhbGVuKQogCiAgICAgICAgIG5hID0gbnVtYXJyYXkoKltjX2ludCgpXSAqIGFsZW4pCiAgICAgICAgIHZhbHVlcyA9IFtuYVtpXSBmb3IgaSBpbiByYW5nZShhbGVuKV0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsdWVzLCBbMF0qYWxlbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZXMsIFswXSphbGVuKQogCiAgICAgICAgIG5hID0gbnVtYXJyYXkoMSwgMiwgMywgNCwgNSkKICAgICAgICAgdmFsdWVzID0gW2kgZm9yIGkgaW4gbmFdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbHVlcywgWzEsIDIsIDMsIDQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlcywgWzEsIDIsIDMsIDQsIDVdKQogCiAgICAgICAgIG5hID0gbnVtYXJyYXkoKm1hcChjX2ludCwgKDEsIDIsIDMsIDQsIDUpKSkKICAgICAgICAgdmFsdWVzID0gW2kgZm9yIGkgaW4gbmFdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbHVlcywgWzEsIDIsIDMsIDQsIDVdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlcywgWzEsIDIsIDMsIDQsIDVdKQogCiAgICAgZGVmIHRlc3RfY2xhc3NjYWNoZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCBBUlJBWShjX2ludCwgMykgaXMgQVJSQVkoY19pbnQsIDQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoQVJSQVkoY19pbnQsIDMpIGlzIEFSUkFZKGNfaW50LCAzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBBUlJBWShjX2ludCwgMykgaXMgQVJSQVkoY19pbnQsIDQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoQVJSQVkoY19pbnQsIDMpIGlzIEFSUkFZKGNfaW50LCAzKSkKIAogICAgIGRlZiB0ZXN0X2Zyb21fYWRkcmVzcyhzZWxmKToKICAgICAgICAgIyBGYWlsZWQgd2l0aCAwLjkuOCwgcmVwb3J0ZWQgYnkgSlVybmVyCiAgICAgICAgIHAgPSBjcmVhdGVfc3RyaW5nX2J1ZmZlcigiZm9vIikKICAgICAgICAgc3ogPSAoY19jaGFyICogMykuZnJvbV9hZGRyZXNzKGFkZHJlc3NvZihwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3pbOl0sICJmb28iKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzels6Ol0sICJmb28iKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzels6Oi0xXSwgIm9vZiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN6Wzo6M10sICJmIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3pbMTo0OjJdLCAibyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN6LnZhbHVlLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6XSwgImZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbOjpdLCAiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6Oi0xXSwgIm9vZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbOjozXSwgImYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6WzE6NDoyXSwgIm8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6LnZhbHVlLCAiZm9vIikKIAogICAgIHRyeToKICAgICAgICAgY3JlYXRlX3VuaWNvZGVfYnVmZmVyCkBAIC0xMDksMTIgKzEwOSwxMiBAQAogICAgICAgICBkZWYgdGVzdF9mcm9tX2FkZHJlc3NXKHNlbGYpOgogICAgICAgICAgICAgcCA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcigiZm9vIikKICAgICAgICAgICAgIHN6ID0gKGNfd2NoYXIgKiAzKS5mcm9tX2FkZHJlc3MoYWRkcmVzc29mKHApKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3pbOl0sICJmb28iKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3pbOjpdLCAiZm9vIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN6Wzo6LTFdLCAib29mIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN6Wzo6M10sICJmIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN6WzE6NDoyXSwgIm8iKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3oudmFsdWUsICJmb28iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzels6XSwgImZvbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6Wzo6XSwgImZvbyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN6Wzo6LTFdLCAib29mIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3pbOjozXSwgImYiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzelsxOjQ6Ml0sICJvIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3oudmFsdWUsICJmb28iKQogCiAgICAgZGVmIHRlc3RfY2FjaGUoc2VsZik6CiAgICAgICAgICMgQXJyYXkgdHlwZXMgYXJlIGNhY2hlZCBpbnRlcm5hbGx5IGluIHRoZSBfY3R5cGVzIGV4dGVuc2lvbiwKQEAgLTEyOCw3ICsxMjgsNyBAQAogICAgICAgICAjIENyZWF0ZSBhIG5ldyBhcnJheSB0eXBlIGJhc2VkIG9uIGl0OgogICAgICAgICB0MSA9IG15X2ludCAqIDEKICAgICAgICAgdDIgPSBteV9pbnQgKiAxCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSBpcyB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIGlzIHQyKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXNfcGFyYW1ldGVyLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYXNfcGFyYW1ldGVyLnB5CmluZGV4IDA1ODEwNTkuLmYyNTM5YjEgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2FzX3BhcmFtZXRlci5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9hc19wYXJhbWV0ZXIucHkKQEAgLTI1LDggKzI1LDggQEAKICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfaV9iaGlsZmQKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfd2NoYXIsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQogICAgICAgICByZXN1bHQgPSBmKHNlbGYud3JhcCgxKSwgc2VsZi53cmFwKHUieCIpLCBzZWxmLndyYXAoMyksIHNlbGYud3JhcCg0KSwgc2VsZi53cmFwKDUuMCksIHNlbGYud3JhcCg2LjApKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDEzOSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUocmVzdWx0KSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMTM5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShyZXN1bHQpLCBpbnQpCiAKICAgICBkZWYgdGVzdF9wb2ludGVycyhzZWxmKToKICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfcF9wCkBAIC0zOSwxOCArMzksMTggQEAKIAogICAgICAgICB2ID0gY19pbnQoNDIpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocG9pbnRlcih2KS5jb250ZW50cy52YWx1ZSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9pbnRlcih2KS5jb250ZW50cy52YWx1ZSwgNDIpCiAgICAgICAgIHJlc3VsdCA9IGYoc2VsZi53cmFwKHBvaW50ZXIodikpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHJlc3VsdCksIFBPSU5URVIoY19pbnQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgUE9JTlRFUihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmNvbnRlbnRzLnZhbHVlLCA0MikKIAogICAgICAgICAjIFRoaXMgb24gd29ya3MuLi4KICAgICAgICAgcmVzdWx0ID0gZihzZWxmLndyYXAocG9pbnRlcih2KSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdC5jb250ZW50cy52YWx1ZSwgdi52YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIHYudmFsdWUpCiAKICAgICAgICAgcCA9IHBvaW50ZXIoY19pbnQoOTkpKQogICAgICAgICByZXN1bHQgPSBmKHNlbGYud3JhcChwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LmNvbnRlbnRzLnZhbHVlLCA5OSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIDk5KQogCiAgICAgZGVmIHRlc3Rfc2hvcnRzKHNlbGYpOgogICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19jYWxsYmFja19pX2lmCkBAIC02Nyw3ICs2Nyw3IEBACiAKICAgICAgICAgY2IgPSBDYWxsQmFjayhjYWxsYmFjaykKICAgICAgICAgZihzZWxmLndyYXAoMioqMTgpLCBzZWxmLndyYXAoY2IpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhcmdzLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmdzLCBleHBlY3RlZCkKIAogICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIApAQCAtODQsMTcgKzg0LDE3IEBACiAgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKIAogICAgICAgICByZXN1bHQgPSBmKHNlbGYud3JhcCgtMTApLCBzZWxmLndyYXAoY2IpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIC0xOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0xOCkKIAogICAgICAgICAjIHRlc3Qgd2l0aCBwcm90b3R5cGUKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2ludCwgTXlDYWxsYmFja10KICAgICAgICAgY2IgPSBNeUNhbGxiYWNrKGNhbGxiYWNrKQogCiAgICAgICAgIHJlc3VsdCA9IGYoc2VsZi53cmFwKC0xMCksIHNlbGYud3JhcChjYikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgLTE4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQogCiAgICAgICAgIHJlc3VsdCA9IGYoc2VsZi53cmFwKC0xMCksIHNlbGYud3JhcChjYikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgLTE4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQogCiAgICAgICAgIEFub3RoZXJDYWxsYmFjayA9IENBTExCQUNLX0ZVTkNUWVBFKGNfaW50LCBjX2ludCwgY19pbnQsIGNfaW50LCBjX2ludCkKIApAQCAtMTE2LDEyICsxMTYsMTIgQEAKIAogICAgICAgICBkZWYgY2FsbGJhY2sodmFsdWUpOgogICAgICAgICAgICAgI3ByaW50ICJjYWxsZWQgYmFjayB3aXRoIiwgdmFsdWUKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsdWUpLCBpbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodmFsdWUpLCBpbnQpCiAgICAgICAgICAgICByZXR1cm4gdmFsdWUKIAogICAgICAgICBjYiA9IE15Q2FsbGJhY2soY2FsbGJhY2spCiAgICAgICAgIHJlc3VsdCA9IGYoc2VsZi53cmFwKC0xMCksIHNlbGYud3JhcChjYikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgLTE4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQogCiAgICAgZGVmIHRlc3RfbG9uZ2xvbmdfY2FsbGJhY2tzKHNlbGYpOgogCkBAIC0xMzMsMTIgKzEzMywxMiBAQAogICAgICAgICBmLmFyZ3R5cGVzID0gW2NfbG9uZ2xvbmcsIE15Q2FsbGJhY2tdCiAKICAgICAgICAgZGVmIGNhbGxiYWNrKHZhbHVlKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHZhbHVlLCAoaW50LCBsb25nKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2YWx1ZSwgKGludCwgbG9uZykpKQogICAgICAgICAgICAgcmV0dXJuIHZhbHVlICYgMHg3RkZGRkZGRgogCiAgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgxMzU3NzYyNTU4NywgaW50KGYoc2VsZi53cmFwKDEwMDAwMDAwMDAwMDApLCBzZWxmLndyYXAoY2IpKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTM1Nzc2MjU1ODcsIGludChmKHNlbGYud3JhcCgxMDAwMDAwMDAwMDAwKSwgc2VsZi53cmFwKGNiKSkpKQogCiAgICAgZGVmIHRlc3RfYnl2YWwoc2VsZik6CiAgICAgICAgICMgd2l0aG91dCBwcm90b3R5cGUKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgICAgICByZXN1bHQgPSBkbGwuX3Rlc3RmdW5jX2J5dmFsKHB0aW4sIGJ5cmVmKHB0b3V0KSkKICAgICAgICAgZ290ID0gcmVzdWx0LCBwdG91dC54LCBwdG91dC55CiAgICAgICAgIGV4cGVjdGVkID0gMywgMSwgMgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChnb3QsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCiAKICAgICAgICAgIyB3aXRoIHByb3RvdHlwZQogICAgICAgICBwdGluID0gUE9JTlQoMTAxLCAxMDIpCkBAIC0xNTgsNyArMTU4LDcgQEAKICAgICAgICAgcmVzdWx0ID0gZGxsLl90ZXN0ZnVuY19ieXZhbChzZWxmLndyYXAocHRpbiksIGJ5cmVmKHB0b3V0KSkKICAgICAgICAgZ290ID0gcmVzdWx0LCBwdG91dC54LCBwdG91dC55CiAgICAgICAgIGV4cGVjdGVkID0gMjAzLCAxMDEsIDEwMgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChnb3QsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCiAKICAgICBkZWYgdGVzdF9zdHJ1Y3RfcmV0dXJuXzJIKHNlbGYpOgogICAgICAgICBjbGFzcyBTMkgoU3RydWN0dXJlKToKQEAgLTE2OCw3ICsxNjgsNyBAQAogICAgICAgICBkbGwucmV0XzJoX2Z1bmMuYXJndHlwZXMgPSBbUzJIXQogICAgICAgICBpbnAgPSBTMkgoOTksIDg4KQogICAgICAgICBzMmggPSBkbGwucmV0XzJoX2Z1bmMoc2VsZi53cmFwKGlucCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKChzMmgueCwgczJoLnkpLCAoOTkqMiwgODgqMykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHMyaC54LCBzMmgueSksICg5OSoyLCA4OCozKSkKIAogICAgIGRlZiB0ZXN0X3N0cnVjdF9yZXR1cm5fOEgoc2VsZik6CiAgICAgICAgIGNsYXNzIFM4SShTdHJ1Y3R1cmUpOgpAQCAtMTg0LDcgKzE4NCw3IEBACiAgICAgICAgIGRsbC5yZXRfOGlfZnVuYy5hcmd0eXBlcyA9IFtTOEldCiAgICAgICAgIGlucCA9IFM4SSg5LCA4LCA3LCA2LCA1LCA0LCAzLCAyKQogICAgICAgICBzOGkgPSBkbGwucmV0XzhpX2Z1bmMoc2VsZi53cmFwKGlucCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKChzOGkuYSwgczhpLmIsIHM4aS5jLCBzOGkuZCwgczhpLmUsIHM4aS5mLCBzOGkuZywgczhpLmgpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzOGkuYSwgczhpLmIsIHM4aS5jLCBzOGkuZCwgczhpLmUsIHM4aS5mLCBzOGkuZywgczhpLmgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOSoyLCA4KjMsIDcqNCwgNio1LCA1KjYsIDQqNywgMyo4LCAyKjkpKQogCiAjfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYml0ZmllbGRzLnB5CmluZGV4IDk2Y2Q3YzYuLmU5YzQ2YzIgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2JpdGZpZWxkcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9iaXRmaWVsZHMucHkKQEAgLTM3LDE0ICszNywxNCBAQAogICAgICAgICAgICAgZm9yIG5hbWUgaW4gIkFCQ0RFRkdISSI6CiAgICAgICAgICAgICAgICAgYiA9IEJJVFMoKQogICAgICAgICAgICAgICAgIHNldGF0dHIoYiwgbmFtZSwgaSkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgobmFtZSwgaSwgZ2V0YXR0cihiLCBuYW1lKSksIChuYW1lLCBpLCBmdW5jKGJ5cmVmKGIpLCBuYW1lKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgobmFtZSwgaSwgZ2V0YXR0cihiLCBuYW1lKSksIChuYW1lLCBpLCBmdW5jKGJ5cmVmKGIpLCBuYW1lKSkpCiAKICAgICBkZWYgdGVzdF9zaG9ydHMoc2VsZik6CiAgICAgICAgIGZvciBpIGluIHJhbmdlKDI1Nik6CiAgICAgICAgICAgICBmb3IgbmFtZSBpbiAiTU5PUFFSUyI6CiAgICAgICAgICAgICAgICAgYiA9IEJJVFMoKQogICAgICAgICAgICAgICAgIHNldGF0dHIoYiwgbmFtZSwgaSkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgobmFtZSwgaSwgZ2V0YXR0cihiLCBuYW1lKSksIChuYW1lLCBpLCBmdW5jKGJ5cmVmKGIpLCBuYW1lKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgobmFtZSwgaSwgZ2V0YXR0cihiLCBuYW1lKSksIChuYW1lLCBpLCBmdW5jKGJ5cmVmKGIpLCBuYW1lKSkpCiAKIHNpZ25lZF9pbnRfdHlwZXMgPSAoY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2xvbmdsb25nKQogdW5zaWduZWRfaW50X3R5cGVzID0gKGNfdWJ5dGUsIGNfdXNob3J0LCBjX3VpbnQsIGNfdWxvbmcsIGNfdWxvbmdsb25nKQpAQCAtNTgsMTAgKzU4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2xvbmdsb25nLCA2MiksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX2xvbmdsb25nLCAxKV0KIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2xvbmdsb25nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2xvbmdsb25nKSkKICAgICAgICAgeCA9IFgoKQogICAgICAgICB4LmEsIHguYiwgeC5jID0gLTEsIDcsIC0xCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh4LmEsIHguYiwgeC5jKSwgKC0xLCA3LCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHguYSwgeC5iLCB4LmMpLCAoLTEsIDcsIC0xKSkKIAogICAgIGRlZiB0ZXN0X3Vsb25nbG9uZyhzZWxmKToKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgpAQCAtNjksMTEgKzY5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3Vsb25nbG9uZywgNjIpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY191bG9uZ2xvbmcsIDEpXQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfbG9uZ2xvbmcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfbG9uZ2xvbmcpKQogICAgICAgICB4ID0gWCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh4LmEsIHguYiwgeC5jKSwgKDAsIDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4LmEsIHguYiwgeC5jKSwgKDAsIDAsIDApKQogICAgICAgICB4LmEsIHguYiwgeC5jID0gNywgNywgNwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoeC5hLCB4LmIsIHguYyksICgxLCA3LCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoeC5hLCB4LmIsIHguYyksICgxLCA3LCAxKSkKIAogICAgIGRlZiB0ZXN0X3NpZ25lZChzZWxmKToKICAgICAgICAgZm9yIGNfdHlwIGluIHNpZ25lZF9pbnRfdHlwZXM6CkBAIC04MiwxNCArODIsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImEiLCBjX3R5cCwgMyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY190eXAsIDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsIGNfdHlwLCAxKV0KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfdHlwKSoyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3R5cCkqMikKIAogICAgICAgICAgICAgeCA9IFgoKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCAwLCAwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCAwLCAwKSkKICAgICAgICAgICAgIHguYSA9IC0xCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoY190eXAsIHguYSwgeC5iLCB4LmMpLCAoY190eXAsIC0xLCAwLCAwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAtMSwgMCwgMCkpCiAgICAgICAgICAgICB4LmEsIHguYiA9IDAsIC0xCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoY190eXAsIHguYSwgeC5iLCB4LmMpLCAoY190eXAsIDAsIC0xLCAwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCAtMSwgMCkpCiAKIAogICAgIGRlZiB0ZXN0X3Vuc2lnbmVkKHNlbGYpOgpAQCAtOTgsMTQgKzk4LDE0IEBACiAgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY190eXAsIDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfdHlwLCAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX3R5cCwgMSldCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3R5cCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfdHlwKSkKIAogICAgICAgICAgICAgeCA9IFgoKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCAwLCAwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCAwLCAwKSkKICAgICAgICAgICAgIHguYSA9IC0xCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoY190eXAsIHguYSwgeC5iLCB4LmMpLCAoY190eXAsIDcsIDAsIDApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoY190eXAsIHguYSwgeC5iLCB4LmMpLCAoY190eXAsIDcsIDAsIDApKQogICAgICAgICAgICAgeC5hLCB4LmIgPSAwLCAtMQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCA3LCAwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNfdHlwLCB4LmEsIHguYiwgeC5jKSwgKGNfdHlwLCAwLCA3LCAwKSkKIAogCiAgICAgZGVmIGZhaWxfZmllbGRzKHNlbGYsICpmaWVsZHMpOgpAQCAtMTE1LDE3ICsxMTUsMTcgQEAKICAgICBkZWYgdGVzdF9ub25pbnRfdHlwZXMoc2VsZik6CiAgICAgICAgICMgYml0IGZpZWxkcyBhcmUgbm90IGFsbG93ZWQgb24gbm9uLWludGVnZXIgdHlwZXMuCiAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY19jaGFyX3AsIDEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfY2hhcl9wJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBjX2NoYXJfcCcpKQogCiAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY192b2lkX3AsIDEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfdm9pZF9wJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBjX3ZvaWRfcCcpKQogCiAgICAgICAgIGlmIGNfaW50ICE9IGNfbG9uZzoKICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgUE9JTlRFUihjX2ludCksIDEpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBMUF9jX2ludCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIExQX2NfaW50JykpCiAKICAgICAgICAgcmVzdWx0ID0gc2VsZi5mYWlsX2ZpZWxkcygoImEiLCBjX2NoYXIsIDEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfY2hhcicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKFR5cGVFcnJvciwgJ2JpdCBmaWVsZHMgbm90IGFsbG93ZWQgZm9yIHR5cGUgY19jaGFyJykpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgY193Y2hhcgpAQCAtMTMzLDU5ICsxMzMsNTkgQEAKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY193Y2hhciwgMSkpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIChUeXBlRXJyb3IsICdiaXQgZmllbGRzIG5vdCBhbGxvd2VkIGZvciB0eXBlIGNfd2NoYXInKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBjX3djaGFyJykpCiAKICAgICAgICAgY2xhc3MgRHVtbXkoU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gW10KIAogICAgICAgICByZXN1bHQgPSBzZWxmLmZhaWxfZmllbGRzKCgiYSIsIER1bW15LCAxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAoVHlwZUVycm9yLCAnYml0IGZpZWxkcyBub3QgYWxsb3dlZCBmb3IgdHlwZSBEdW1teScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKFR5cGVFcnJvciwgJ2JpdCBmaWVsZHMgbm90IGFsbG93ZWQgZm9yIHR5cGUgRHVtbXknKSkKIAogICAgIGRlZiB0ZXN0X3NpbmdsZV9iaXRmaWVsZF9zaXplKHNlbGYpOgogICAgICAgICBmb3IgY190eXAgaW4gaW50X3R5cGVzOgogICAgICAgICAgICAgcmVzdWx0ID0gc2VsZi5mYWlsX2ZpZWxkcygoImEiLCBjX3R5cCwgLTEpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAoVmFsdWVFcnJvciwgJ251bWJlciBvZiBiaXRzIGludmFsaWQgZm9yIGJpdCBmaWVsZCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChWYWx1ZUVycm9yLCAnbnVtYmVyIG9mIGJpdHMgaW52YWxpZCBmb3IgYml0IGZpZWxkJykpCiAKICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY190eXAsIDApKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAoVmFsdWVFcnJvciwgJ251bWJlciBvZiBiaXRzIGludmFsaWQgZm9yIGJpdCBmaWVsZCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChWYWx1ZUVycm9yLCAnbnVtYmVyIG9mIGJpdHMgaW52YWxpZCBmb3IgYml0IGZpZWxkJykpCiAKICAgICAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKICAgICAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX3R5cCwgMSldCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3R5cCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfdHlwKSkKIAogICAgICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfdHlwLCBzaXplb2YoY190eXApKjgpXQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY190eXApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3R5cCkpCiAKICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGYuZmFpbF9maWVsZHMoKCJhIiwgY190eXAsIHNpemVvZihjX3R5cCkqOCArIDEpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAoVmFsdWVFcnJvciwgJ251bWJlciBvZiBiaXRzIGludmFsaWQgZm9yIGJpdCBmaWVsZCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIChWYWx1ZUVycm9yLCAnbnVtYmVyIG9mIGJpdHMgaW52YWxpZCBmb3IgYml0IGZpZWxkJykpCiAKICAgICBkZWYgdGVzdF9tdWx0aV9iaXRmaWVsZHNfc2l6ZShzZWxmKToKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19zaG9ydCwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3Nob3J0LCAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX3Nob3J0LCAxKV0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19zaG9ydCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19zaG9ydCkpCiAKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19zaG9ydCwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImExIiwgY19zaG9ydCksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX3Nob3J0LCAxNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImMiLCBjX3Nob3J0LCAxKV0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19zaG9ydCkqMykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5hLm9mZnNldCwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5hMS5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5iLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKjIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFguYy5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSoyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfc2hvcnQpKjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5hLm9mZnNldCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmExLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYi5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSoyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYy5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSoyKQogCiAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfc2hvcnQsIDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19zaG9ydCwgMTQpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJjIiwgY19zaG9ydCwgMTQpXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3Nob3J0KSozKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLmEub2Zmc2V0LCBzaXplb2YoY19zaG9ydCkqMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5iLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKjEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFguYy5vZmZzZXQsIHNpemVvZihjX3Nob3J0KSoyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfc2hvcnQpKjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5hLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKjApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5iLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5jLm9mZnNldCwgc2l6ZW9mKGNfc2hvcnQpKjIpCiAKIAogICAgIGRlZiBnZXRfZXhjZXB0KHNlbGYsIGZ1bmMsICphcmdzLCAqKmt3KToKQEAgLTE5OSwyMSArMTk5LDIxIEBACiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBjX2J5dGUsIDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19pbnQsIDQpXQogICAgICAgICBpZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSoyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkqMikKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpKQogCiAgICAgZGVmIHRlc3RfbWl4ZWRfMihzZWxmKToKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlLCA0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfaW50LCAzMildCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSoyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSoyKQogCiAgICAgZGVmIHRlc3RfbWl4ZWRfMyhzZWxmKToKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlLCA0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfdWJ5dGUsIDQpXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2J5dGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfYnl0ZSkpCiAKICAgICBkZWYgdGVzdF9taXhlZF80KHNlbGYpOgogICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CkBAIC0yMjcsOSArMjI3LDkgQEAKICAgICAgICAgIyBkb2VzICh1bmxlc3MgR0NDIGlzIHJ1biB3aXRoICctbW1zLWJpdGZpZWxkcycgd2hpY2gKICAgICAgICAgIyBwcm9kdWNlcyBjb2RlIGNvbXBhdGlibGUgd2l0aCBNU1ZDKS4KICAgICAgICAgaWYgb3MubmFtZSBpbiAoIm50IiwgImNlIik6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkgKiA0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkgKiA0KQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpICogMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpICogMikKIAogICAgIGRlZiB0ZXN0X2Fub25fYml0ZmllbGRzKHNlbGYpOgogICAgICAgICAjIGFub255bW91cyBiaXQtZmllbGRzIGdhdmUgYSBzdHJhbmdlIGVycm9yIG1lc3NhZ2UKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J1ZmZlcnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9idWZmZXJzLnB5CmluZGV4IDViOTZkMTIuLmJmOTMxYWIgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J1ZmZlcnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYnVmZmVycy5weQpAQCAtNSwzMiArNSwzMiBAQAogCiAgICAgZGVmIHRlc3RfYnVmZmVyKHNlbGYpOgogICAgICAgICBiID0gY3JlYXRlX3N0cmluZ19idWZmZXIoMzIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihiKSwgMzIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihiKSwgMzIgKiBzaXplb2YoY19jaGFyKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoYlswXSkgaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiKSwgMzIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGIpLCAzMiAqIHNpemVvZihjX2NoYXIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShiWzBdKSBpcyBzdHIpCiAKICAgICAgICAgYiA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKCJhYmMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oYiksIDQpICMgdHJhaWxpbmcgbnVsIGNoYXIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKGIpLCA0ICogc2l6ZW9mKGNfY2hhcikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKGJbMF0pIGlzIHN0cikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYlswXSwgImEiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzpdLCAiYWJjXDAiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzo6XSwgImFiY1wwIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYls6Oi0xXSwgIlwwY2JhIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYls6OjJdLCAiYWMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzo6NV0sICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIDQpICMgdHJhaWxpbmcgbnVsIGNoYXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoYiksIDQgKiBzaXplb2YoY19jaGFyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoYlswXSkgaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbMF0sICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzpdLCAiYWJjXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjpdLCAiYWJjXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjotMV0sICJcMGNiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjJdLCAiYWMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjo1XSwgImEiKQogCiAgICAgZGVmIHRlc3Rfc3RyaW5nX2NvbnZlcnNpb24oc2VsZik6CiAgICAgICAgIGIgPSBjcmVhdGVfc3RyaW5nX2J1ZmZlcih1ImFiYyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihiKSwgNCkgIyB0cmFpbGluZyBudWwgY2hhcgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoYiksIDQgKiBzaXplb2YoY19jaGFyKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoYlswXSkgaXMgc3RyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzBdLCAiYSIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOl0sICJhYmNcMCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOjpdLCAiYWJjXDAiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzo6LTFdLCAiXDBjYmEiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzo6Ml0sICJhYyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOjo1XSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiKSwgNCkgIyB0cmFpbGluZyBudWwgY2hhcgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihiKSwgNCAqIHNpemVvZihjX2NoYXIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShiWzBdKSBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYlswXSwgImEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOl0sICJhYmNcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Ol0sICJhYmNcMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Oi0xXSwgIlwwY2JhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6Ml0sICJhYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjVdLCAiYSIpCiAKICAgICB0cnk6CiAgICAgICAgIGNfd2NoYXIKQEAgLTM5LDMyICszOSwzMiBAQAogICAgIGVsc2U6CiAgICAgICAgIGRlZiB0ZXN0X3VuaWNvZGVfYnVmZmVyKHNlbGYpOgogICAgICAgICAgICAgYiA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcigzMikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihiKSwgMzIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoYiksIDMyICogc2l6ZW9mKGNfd2NoYXIpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoYlswXSkgaXMgdW5pY29kZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCAzMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGIpLCAzMiAqIHNpemVvZihjX3djaGFyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGJbMF0pIGlzIHVuaWNvZGUpCiAKICAgICAgICAgICAgIGIgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIodSJhYmMiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKGIpLCA0KSAjIHRyYWlsaW5nIG51bCBjaGFyCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoYiksIDQgKiBzaXplb2YoY193Y2hhcikpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShiWzBdKSBpcyB1bmljb2RlKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYlswXSwgdSJhIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOl0sICJhYmNcMCIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzo6XSwgImFiY1wwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOjotMV0sICJcMGNiYSIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzo6Ml0sICJhYyIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzo6NV0sICJhIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGIpLCA0KSAjIHRyYWlsaW5nIG51bCBjaGFyCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihiKSwgNCAqIHNpemVvZihjX3djaGFyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGJbMF0pIGlzIHVuaWNvZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbMF0sIHUiYSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOl0sICJhYmNcMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjpdLCAiYWJjXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6LTFdLCAiXDBjYmEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiWzo6Ml0sICJhYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjo1XSwgImEiKQogCiAgICAgICAgIGRlZiB0ZXN0X3VuaWNvZGVfY29udmVyc2lvbihzZWxmKToKICAgICAgICAgICAgIGIgPSBjcmVhdGVfdW5pY29kZV9idWZmZXIoImFiYyIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oYiksIDQpICMgdHJhaWxpbmcgbnVsIGNoYXIKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihiKSwgNCAqIHNpemVvZihjX3djaGFyKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKGJbMF0pIGlzIHVuaWNvZGUpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiWzBdLCB1ImEiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYls6XSwgImFiY1wwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOjpdLCAiYWJjXDAiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYls6Oi0xXSwgIlwwY2JhIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOjoyXSwgImFjIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJbOjo1XSwgImEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYiksIDQpICMgdHJhaWxpbmcgbnVsIGNoYXIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGIpLCA0ICogc2l6ZW9mKGNfd2NoYXIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoYlswXSkgaXMgdW5pY29kZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYlswXSwgdSJhIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6XSwgImFiY1wwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6Ol0sICJhYmNcMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjotMV0sICJcMGNiYSIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbOjoyXSwgImFjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYls6OjVdLCAiYSIpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CmluZGV4IDFmNjg5OTIuLmU2NGZkNDUgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2J5dGVzd2FwLnB5CkBAIC0yMywxMzEgKzIzLDEzMSBAQAogCiAgICAgZGVmIHRlc3RfZW5kaWFuX3Nob3J0KHNlbGYpOgogICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfc2hvcnQuX19jdHlwZV9sZV9fIGlzIGNfc2hvcnQpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19zaG9ydC5fX2N0eXBlX2JlX18uX19jdHlwZV9sZV9fIGlzIGNfc2hvcnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zaG9ydC5fX2N0eXBlX2xlX18gaXMgY19zaG9ydCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3Nob3J0Ll9fY3R5cGVfYmVfXy5fX2N0eXBlX2xlX18gaXMgY19zaG9ydCkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX3Nob3J0Ll9fY3R5cGVfYmVfXyBpcyBjX3Nob3J0KQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfc2hvcnQuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX3Nob3J0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfc2hvcnQuX19jdHlwZV9iZV9fIGlzIGNfc2hvcnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zaG9ydC5fX2N0eXBlX2xlX18uX19jdHlwZV9iZV9fIGlzIGNfc2hvcnQpCiAgICAgICAgIHMgPSBjX3Nob3J0Ll9fY3R5cGVfYmVfXygweDEyMzQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmgiLCAweDEyMzQpKSwgIjEyMzQiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4ocyksICIxMjM0IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgMHgxMjM0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmgiLCAweDEyMzQpKSwgIjEyMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIjEyMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNCkKIAogICAgICAgICBzID0gY19zaG9ydC5fX2N0eXBlX2xlX18oMHgxMjM0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oc3RydWN0LnBhY2soIjxoIiwgMHgxMjM0KSksICIzNDEyIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiMzQxMiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMudmFsdWUsIDB4MTIzNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIjxoIiwgMHgxMjM0KSksICIzNDEyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4ocyksICIzNDEyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQpCiAKICAgICAgICAgcyA9IGNfdXNob3J0Ll9fY3R5cGVfYmVfXygweDEyMzQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmgiLCAweDEyMzQpKSwgIjEyMzQiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4ocyksICIxMjM0IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgMHgxMjM0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmgiLCAweDEyMzQpKSwgIjEyMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIjEyMzQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNCkKIAogICAgICAgICBzID0gY191c2hvcnQuX19jdHlwZV9sZV9fKDB4MTIzNCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8aCIsIDB4MTIzNCkpLCAiMzQxMiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzKSwgIjM0MTIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCAweDEyMzQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8aCIsIDB4MTIzNCkpLCAiMzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiMzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy52YWx1ZSwgMHgxMjM0KQogCiAgICAgZGVmIHRlc3RfZW5kaWFuX2ludChzZWxmKToKICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2ludC5fX2N0eXBlX2xlX18gaXMgY19pbnQpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19pbnQuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2ludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2ludC5fX2N0eXBlX2xlX18gaXMgY19pbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19pbnQuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2ludCkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2ludC5fX2N0eXBlX2JlX18gaXMgY19pbnQpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19pbnQuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2ludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2ludC5fX2N0eXBlX2JlX18gaXMgY19pbnQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19pbnQuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2ludCkKIAogICAgICAgICBzID0gY19pbnQuX19jdHlwZV9iZV9fKDB4MTIzNDU2NzgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmkiLCAweDEyMzQ1Njc4KSksICIxMjM0NTY3OCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzKSwgIjEyMzQ1Njc4IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgMHgxMjM0NTY3OCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIj5pIiwgMHgxMjM0NTY3OCkpLCAiMTIzNDU2NzgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIjEyMzQ1Njc4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4KQogCiAgICAgICAgIHMgPSBjX2ludC5fX2N0eXBlX2xlX18oMHgxMjM0NTY3OCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8aSIsIDB4MTIzNDU2NzgpKSwgIjc4NTYzNDEyIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiNzg1NjM0MTIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPGkiLCAweDEyMzQ1Njc4KSksICI3ODU2MzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNDU2NzgpCiAKICAgICAgICAgcyA9IGNfdWludC5fX2N0eXBlX2JlX18oMHgxMjM0NTY3OCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI+SSIsIDB4MTIzNDU2NzgpKSwgIjEyMzQ1Njc4IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiMTIzNDU2NzgiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPkkiLCAweDEyMzQ1Njc4KSksICIxMjM0NTY3OCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiMTIzNDU2NzgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNDU2NzgpCiAKICAgICAgICAgcyA9IGNfdWludC5fX2N0eXBlX2xlX18oMHgxMjM0NTY3OCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8SSIsIDB4MTIzNDU2NzgpKSwgIjc4NTYzNDEyIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiNzg1NjM0MTIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPEkiLCAweDEyMzQ1Njc4KSksICI3ODU2MzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNDU2NzgpCiAKICAgICBkZWYgdGVzdF9lbmRpYW5fbG9uZ2xvbmcoc2VsZik6CiAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19sb25nbG9uZy5fX2N0eXBlX2xlX18gaXMgY19sb25nbG9uZykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2xvbmdsb25nLl9fY3R5cGVfYmVfXy5fX2N0eXBlX2xlX18gaXMgY19sb25nbG9uZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2xvbmdsb25nLl9fY3R5cGVfbGVfXyBpcyBjX2xvbmdsb25nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfbG9uZ2xvbmcuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2xvbmdsb25nKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfbG9uZ2xvbmcuX19jdHlwZV9iZV9fIGlzIGNfbG9uZ2xvbmcpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19sb25nbG9uZy5fX2N0eXBlX2xlX18uX19jdHlwZV9iZV9fIGlzIGNfbG9uZ2xvbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19sb25nbG9uZy5fX2N0eXBlX2JlX18gaXMgY19sb25nbG9uZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2xvbmdsb25nLl9fY3R5cGVfbGVfXy5fX2N0eXBlX2JlX18gaXMgY19sb25nbG9uZykKIAogICAgICAgICBzID0gY19sb25nbG9uZy5fX2N0eXBlX2JlX18oMHgxMjM0NTY3ODkwQUJDREVGKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oc3RydWN0LnBhY2soIj5xIiwgMHgxMjM0NTY3ODkwQUJDREVGKSksICIxMjM0NTY3ODkwQUJDREVGIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiMTIzNDU2Nzg5MEFCQ0RFRiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMudmFsdWUsIDB4MTIzNDU2Nzg5MEFCQ0RFRikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIj5xIiwgMHgxMjM0NTY3ODkwQUJDREVGKSksICIxMjM0NTY3ODkwQUJDREVGIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4ocyksICIxMjM0NTY3ODkwQUJDREVGIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4OTBBQkNERUYpCiAKICAgICAgICAgcyA9IGNfbG9uZ2xvbmcuX19jdHlwZV9sZV9fKDB4MTIzNDU2Nzg5MEFCQ0RFRikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8cSIsIDB4MTIzNDU2Nzg5MEFCQ0RFRikpLCAiRUZDREFCOTA3ODU2MzQxMiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzKSwgIkVGQ0RBQjkwNzg1NjM0MTIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4OTBBQkNERUYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8cSIsIDB4MTIzNDU2Nzg5MEFCQ0RFRikpLCAiRUZDREFCOTA3ODU2MzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMpLCAiRUZDREFCOTA3ODU2MzQxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy52YWx1ZSwgMHgxMjM0NTY3ODkwQUJDREVGKQogCiAgICAgICAgIHMgPSBjX3Vsb25nbG9uZy5fX2N0eXBlX2JlX18oMHgxMjM0NTY3ODkwQUJDREVGKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oc3RydWN0LnBhY2soIj5RIiwgMHgxMjM0NTY3ODkwQUJDREVGKSksICIxMjM0NTY3ODkwQUJDREVGIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMpLCAiMTIzNDU2Nzg5MEFCQ0RFRiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMudmFsdWUsIDB4MTIzNDU2Nzg5MEFCQ0RFRikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soIj5RIiwgMHgxMjM0NTY3ODkwQUJDREVGKSksICIxMjM0NTY3ODkwQUJDREVGIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4ocyksICIxMjM0NTY3ODkwQUJDREVGIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCAweDEyMzQ1Njc4OTBBQkNERUYpCiAKICAgICAgICAgcyA9IGNfdWxvbmdsb25nLl9fY3R5cGVfbGVfXygweDEyMzQ1Njc4OTBBQkNERUYpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPFEiLCAweDEyMzQ1Njc4OTBBQkNERUYpKSwgIkVGQ0RBQjkwNzg1NjM0MTIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4ocyksICJFRkNEQUI5MDc4NTYzNDEyIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgMHgxMjM0NTY3ODkwQUJDREVGKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPFEiLCAweDEyMzQ1Njc4OTBBQkNERUYpKSwgIkVGQ0RBQjkwNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzKSwgIkVGQ0RBQjkwNzg1NjM0MTIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIDB4MTIzNDU2Nzg5MEFCQ0RFRikKIAogICAgIGRlZiB0ZXN0X2VuZGlhbl9mbG9hdChzZWxmKToKICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2Zsb2F0Ll9fY3R5cGVfbGVfXyBpcyBjX2Zsb2F0KQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfZmxvYXQuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2Zsb2F0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfZmxvYXQuX19jdHlwZV9sZV9fIGlzIGNfZmxvYXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19mbG9hdC5fX2N0eXBlX2JlX18uX19jdHlwZV9sZV9fIGlzIGNfZmxvYXQpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19mbG9hdC5fX2N0eXBlX2JlX18gaXMgY19mbG9hdCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2Zsb2F0Ll9fY3R5cGVfbGVfXy5fX2N0eXBlX2JlX18gaXMgY19mbG9hdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2Zsb2F0Ll9fY3R5cGVfYmVfXyBpcyBjX2Zsb2F0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfZmxvYXQuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2Zsb2F0KQogICAgICAgICBzID0gY19mbG9hdChtYXRoLnBpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oc3RydWN0LnBhY2soImYiLCBtYXRoLnBpKSksIGJpbihzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oc3RydWN0LnBhY2soImYiLCBtYXRoLnBpKSksIGJpbihzKSkKICAgICAgICAgIyBIbSwgd2hhdCdzIHRoZSBwcmVjaXNpb24gb2YgYSBmbG9hdCBjb21wYXJlZCB0byBhIGRvdWJsZT8KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzQWxtb3N0RXF1YWwocy52YWx1ZSwgbWF0aC5waSwgNikKKyAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbChzLnZhbHVlLCBtYXRoLnBpLCA2KQogICAgICAgICBzID0gY19mbG9hdC5fX2N0eXBlX2xlX18obWF0aC5waSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzQWxtb3N0RXF1YWwocy52YWx1ZSwgbWF0aC5waSwgNikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8ZiIsIG1hdGgucGkpKSwgYmluKHMpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHMudmFsdWUsIG1hdGgucGksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8ZiIsIG1hdGgucGkpKSwgYmluKHMpKQogICAgICAgICBzID0gY19mbG9hdC5fX2N0eXBlX2JlX18obWF0aC5waSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzQWxtb3N0RXF1YWwocy52YWx1ZSwgbWF0aC5waSwgNikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI+ZiIsIG1hdGgucGkpKSwgYmluKHMpKQorICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHMudmFsdWUsIG1hdGgucGksIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI+ZiIsIG1hdGgucGkpKSwgYmluKHMpKQogCiAgICAgZGVmIHRlc3RfZW5kaWFuX2RvdWJsZShzZWxmKToKICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2RvdWJsZS5fX2N0eXBlX2xlX18gaXMgY19kb3VibGUpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19kb3VibGUuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2RvdWJsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2RvdWJsZS5fX2N0eXBlX2xlX18gaXMgY19kb3VibGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19kb3VibGUuX19jdHlwZV9iZV9fLl9fY3R5cGVfbGVfXyBpcyBjX2RvdWJsZSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2RvdWJsZS5fX2N0eXBlX2JlX18gaXMgY19kb3VibGUpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19kb3VibGUuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2RvdWJsZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2RvdWJsZS5fX2N0eXBlX2JlX18gaXMgY19kb3VibGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY19kb3VibGUuX19jdHlwZV9sZV9fLl9fY3R5cGVfYmVfXyBpcyBjX2RvdWJsZSkKICAgICAgICAgcyA9IGNfZG91YmxlKG1hdGgucGkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMudmFsdWUsIG1hdGgucGkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiZCIsIG1hdGgucGkpKSwgYmluKHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIG1hdGgucGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCJkIiwgbWF0aC5waSkpLCBiaW4ocykpCiAgICAgICAgIHMgPSBjX2RvdWJsZS5fX2N0eXBlX2xlX18obWF0aC5waSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy52YWx1ZSwgbWF0aC5waSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8ZCIsIG1hdGgucGkpKSwgYmluKHMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMudmFsdWUsIG1hdGgucGkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHN0cnVjdC5wYWNrKCI8ZCIsIG1hdGgucGkpKSwgYmluKHMpKQogICAgICAgICBzID0gY19kb3VibGUuX19jdHlwZV9iZV9fKG1hdGgucGkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMudmFsdWUsIG1hdGgucGkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmQiLCBtYXRoLnBpKSksIGJpbihzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnZhbHVlLCBtYXRoLnBpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzdHJ1Y3QucGFjaygiPmQiLCBtYXRoLnBpKSksIGJpbihzKSkKIAogICAgIGRlZiB0ZXN0X2VuZGlhbl9vdGhlcihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfYnl0ZS5fX2N0eXBlX2xlX18gaXMgY19ieXRlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19ieXRlLl9fY3R5cGVfYmVfXyBpcyBjX2J5dGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2J5dGUuX19jdHlwZV9sZV9fIGlzIGNfYnl0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfYnl0ZS5fX2N0eXBlX2JlX18gaXMgY19ieXRlKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX3VieXRlLl9fY3R5cGVfbGVfXyBpcyBjX3VieXRlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY191Ynl0ZS5fX2N0eXBlX2JlX18gaXMgY191Ynl0ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfdWJ5dGUuX19jdHlwZV9sZV9fIGlzIGNfdWJ5dGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3VieXRlLl9fY3R5cGVfYmVfXyBpcyBjX3VieXRlKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2NoYXIuX19jdHlwZV9sZV9fIGlzIGNfY2hhcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfY2hhci5fX2N0eXBlX2JlX18gaXMgY19jaGFyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19jaGFyLl9fY3R5cGVfbGVfXyBpcyBjX2NoYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX2NoYXIuX19jdHlwZV9iZV9fIGlzIGNfY2hhcikKIAogICAgIGRlZiB0ZXN0X3N0cnVjdF9maWVsZHNfMShzZWxmKToKICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKQEAgLTIxOSw3ICsyMTksNyBAQAogCiAgICAgICAgIHMxID0gUygweDEyLCAweDEyMzQsIDB4MTIzNDU2NzgsIDMuMTQpCiAgICAgICAgIHMyID0gc3RydWN0LnBhY2soZm10LCAweDEyLCAweDEyMzQsIDB4MTIzNDU2NzgsIDMuMTQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzMSksIGJpbihzMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmluKHMxKSwgYmluKHMyKSkKIAogICAgIGRlZiB0ZXN0X3VuYWxpZ25lZF9ub25uYXRpdmVfc3RydWN0X2ZpZWxkcyhzZWxmKToKICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKQEAgLTI0Nyw3ICsyNDcsNyBAQAogICAgICAgICBzMS5pID0gMHgxMjM0NTY3OAogICAgICAgICBzMS5kID0gMy4xNAogICAgICAgICBzMiA9IHN0cnVjdC5wYWNrKGZtdCwgMHgxMiwgMHgxMjM0LCAweDEyMzQ1Njc4LCAzLjE0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oczEpLCBiaW4oczIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJpbihzMSksIGJpbihzMikpCiAKICAgICBkZWYgdGVzdF91bmFsaWduZWRfbmF0aXZlX3N0cnVjdF9maWVsZHMoc2VsZik6CiAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CkBAIC0yNzQsNyArMjc0LDcgQEAKICAgICAgICAgczEuaSA9IDB4MTIzNDU2NzgKICAgICAgICAgczEuZCA9IDMuMTQKICAgICAgICAgczIgPSBzdHJ1Y3QucGFjayhmbXQsIDB4MTIsIDB4MTIzNCwgMHgxMjM0NTY3OCwgMy4xNCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYmluKHMxKSwgYmluKHMyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiaW4oczEpLCBiaW4oczIpKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FsbGJhY2tzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FsbGJhY2tzLnB5CmluZGV4IGUzZTRiZTguLmI5ZTY2MjggMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NhbGxiYWNrcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYWxsYmFja3MucHkKQEAgLTE3LDE4ICsxNywxOCBAQAogICAgICAgICBQUk9UTyA9IHNlbGYuZnVuY3R5cGUuaW1fZnVuYyh0eXAsIHR5cCkKICAgICAgICAgcmVzdWx0ID0gUFJPVE8oc2VsZi5jYWxsYmFjaykoYXJnKQogICAgICAgICBpZiB0eXAgPT0gY19mbG9hdDoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0FsbW9zdEVxdWFsKHJlc3VsdCwgYXJnLCBwbGFjZXM9NSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwocmVzdWx0LCBhcmcsIHBsYWNlcz01KQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5nb3RfYXJncywgKGFyZywpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCBhcmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ290X2FyZ3MsIChhcmcsKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBhcmcpCiAKICAgICAgICAgUFJPVE8gPSBzZWxmLmZ1bmN0eXBlLmltX2Z1bmModHlwLCBjX2J5dGUsIHR5cCkKICAgICAgICAgcmVzdWx0ID0gUFJPVE8oc2VsZi5jYWxsYmFjaykoLTMsIGFyZykKICAgICAgICAgaWYgdHlwID09IGNfZmxvYXQ6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NBbG1vc3RFcXVhbChyZXN1bHQsIGFyZywgcGxhY2VzPTUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKHJlc3VsdCwgYXJnLCBwbGFjZXM9NSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuZ290X2FyZ3MsICgtMywgYXJnKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgYXJnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmdvdF9hcmdzLCAoLTMsIGFyZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgYXJnKQogCiAgICAgIyMjIyMjIyMjIyMjIyMjIwogCkBAIC0xMDMsNyArMTAzLDcgQEAKICAgICAgICAgICAgICMgLi4uYnV0IHRoaXMgY2FsbCBkb2Vzbid0IGxlYWsgYW55IG1vcmUuICBXaGVyZSBpcyB0aGUgcmVmY291bnQ/CiAgICAgICAgICAgICBzZWxmLmNoZWNrX3R5cGUocHlfb2JqZWN0LCBvKQogICAgICAgICAgICAgYWZ0ZXIgPSBncmMobykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKChhZnRlciwgbyksIChiZWZvcmUsIG8pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoYWZ0ZXIsIG8pLCAoYmVmb3JlLCBvKSkKIAogICAgIGRlZiB0ZXN0X3Vuc3VwcG9ydGVkX3Jlc3R5cGVfMShzZWxmKToKICAgICAgICAgIyBPbmx5ICJmdW5kYW1lbnRhbCIgcmVzdWx0IHR5cGVzIGFyZSBzdXBwb3J0ZWQgZm9yIGNhbGxiYWNrCkBAIC0xNDgsNyArMTQ4LDcgQEAKICAgICAgICAgcmVzdWx0ID0gaW50ZWdyYXRlKDAuMCwgMS4wLCBDQUxMQkFDSyhmdW5jKSwgMTApCiAgICAgICAgIGRpZmYgPSBhYnMocmVzdWx0IC0gMS4vMy4pCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRpZmYgPCAwLjAxLCAiJXMgbm90IGxlc3MgdGhhbiAwLjAxIiAlIGRpZmYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWZmIDwgMC4wMSwgIiVzIG5vdCBsZXNzIHRoYW4gMC4wMSIgJSBkaWZmKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jYXN0LnB5CmluZGV4IDIyYzY0NzUuLjkwNmZmZmMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Nhc3QucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2FzdC5weQpAQCAtOSwxNSArOSwxNSBAQAogCiAgICAgICAgICMgY2FzdGluZyBhbiBhcnJheSB0byBhIHBvaW50ZXIgd29ya3MuCiAgICAgICAgIHB0ciA9IGNhc3QoYXJyYXksIFBPSU5URVIoY19pbnQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChbcHRyW2ldIGZvciBpIGluIHJhbmdlKDMpXSwgWzQyLCAxNywgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW3B0cltpXSBmb3IgaSBpbiByYW5nZSgzKV0sIFs0MiwgMTcsIDJdKQogCiAgICAgICAgIGlmIDIqc2l6ZW9mKGNfc2hvcnQpID09IHNpemVvZihjX2ludCk6CiAgICAgICAgICAgICBwdHIgPSBjYXN0KGFycmF5LCBQT0lOVEVSKGNfc2hvcnQpKQogICAgICAgICAgICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAibGl0dGxlIjoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChbcHRyW2ldIGZvciBpIGluIHJhbmdlKDYpXSwKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoNildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs0MiwgMCwgMTcsIDAsIDIsIDBdKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChbcHRyW2ldIGZvciBpIGluIHJhbmdlKDYpXSwKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoNildLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCA0MiwgMCwgMTcsIDAsIDJdKQogCiAgICAgZGVmIHRlc3RfYWRkcmVzczJwb2ludGVyKHNlbGYpOgpAQCAtMjUsNTQgKzI1LDU0IEBACiAKICAgICAgICAgYWRkcmVzcyA9IGFkZHJlc3NvZihhcnJheSkKICAgICAgICAgcHRyID0gY2FzdChjX3ZvaWRfcChhZGRyZXNzKSwgUE9JTlRFUihjX2ludCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoMyldLCBbNDIsIDE3LCAyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbcHRyW2ldIGZvciBpIGluIHJhbmdlKDMpXSwgWzQyLCAxNywgMl0pCiAKICAgICAgICAgcHRyID0gY2FzdChhZGRyZXNzLCBQT0lOVEVSKGNfaW50KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoW3B0cltpXSBmb3IgaSBpbiByYW5nZSgzKV0sIFs0MiwgMTcsIDJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFtwdHJbaV0gZm9yIGkgaW4gcmFuZ2UoMyldLCBbNDIsIDE3LCAyXSkKIAogICAgIGRlZiB0ZXN0X3AyYV9vYmplY3RzKHNlbGYpOgogICAgICAgICBhcnJheSA9IChjX2NoYXJfcCAqIDUpKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYXJyYXkuX29iamVjdHMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJyYXkuX29iamVjdHMsIE5vbmUpCiAgICAgICAgIGFycmF5WzBdID0gImZvbyBiYXIiCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFycmF5Ll9vYmplY3RzLCB7JzAnOiAiZm9vIGJhciJ9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFycmF5Ll9vYmplY3RzLCB7JzAnOiAiZm9vIGJhciJ9KQogCiAgICAgICAgIHAgPSBjYXN0KGFycmF5LCBQT0lOVEVSKGNfY2hhcl9wKSkKICAgICAgICAgIyBhcnJheSBhbmQgcCBzaGFyZSBhIGNvbW1vbiBfb2JqZWN0cyBhdHRyaWJ1dGUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHAuX29iamVjdHMgaXMgYXJyYXkuX29iamVjdHMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFycmF5Ll9vYmplY3RzLCB7JzAnOiAiZm9vIGJhciIsIGlkKGFycmF5KTogYXJyYXl9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocC5fb2JqZWN0cyBpcyBhcnJheS5fb2JqZWN0cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcnJheS5fb2JqZWN0cywgeycwJzogImZvbyBiYXIiLCBpZChhcnJheSk6IGFycmF5fSkKICAgICAgICAgcFswXSA9ICJzcGFtIHNwYW0iCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHAuX29iamVjdHMsIHsnMCc6ICJzcGFtIHNwYW0iLCBpZChhcnJheSk6IGFycmF5fSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGFycmF5Ll9vYmplY3RzIGlzIHAuX29iamVjdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5fb2JqZWN0cywgeycwJzogInNwYW0gc3BhbSIsIGlkKGFycmF5KTogYXJyYXl9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXJyYXkuX29iamVjdHMgaXMgcC5fb2JqZWN0cykKICAgICAgICAgcFsxXSA9ICJmb28gYmFyIgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwLl9vYmplY3RzLCB7JzEnOiAnZm9vIGJhcicsICcwJzogInNwYW0gc3BhbSIsIGlkKGFycmF5KTogYXJyYXl9KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYXJyYXkuX29iamVjdHMgaXMgcC5fb2JqZWN0cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLl9vYmplY3RzLCB7JzEnOiAnZm9vIGJhcicsICcwJzogInNwYW0gc3BhbSIsIGlkKGFycmF5KTogYXJyYXl9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXJyYXkuX29iamVjdHMgaXMgcC5fb2JqZWN0cykKIAogICAgIGRlZiB0ZXN0X290aGVyKHNlbGYpOgogICAgICAgICBwID0gY2FzdCgoY19pbnQgKiA0KSgxLCAyLCAzLCA0KSwgUE9JTlRFUihjX2ludCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbOjRdLCBbMSwyLCAzLCA0XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs6NDpdLCBbMSwgMiwgMywgNF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbMzotMTotMV0sIFs0LCAzLCAyLCAxXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs6NDozXSwgWzEsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjRdLCBbMSwyLCAzLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0Ol0sIFsxLCAyLCAzLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzM6LTE6LTFdLCBbNCwgMywgMiwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs6NDozXSwgWzEsIDRdKQogICAgICAgICBjX2ludCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbOjRdLCBbMSwgMiwgMywgNF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbOjQ6XSwgWzEsIDIsIDMsIDRdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzM6LTE6LTFdLCBbNCwgMywgMiwgMV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbOjQ6M10sIFsxLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0XSwgWzEsIDIsIDMsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjQ6XSwgWzEsIDIsIDMsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbMzotMTotMV0sIFs0LCAzLCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0OjNdLCBbMSwgNF0pCiAgICAgICAgIHBbMl0gPSA5NgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzo0XSwgWzEsIDIsIDk2LCA0XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs6NDpdLCBbMSwgMiwgOTYsIDRdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzM6LTE6LTFdLCBbNCwgOTYsIDIsIDFdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzo0OjNdLCBbMSwgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs6NF0sIFsxLCAyLCA5NiwgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs6NDpdLCBbMSwgMiwgOTYsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbMzotMTotMV0sIFs0LCA5NiwgMiwgMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs6NDozXSwgWzEsIDRdKQogICAgICAgICBjX2ludCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbOjRdLCBbMSwgMiwgOTYsIDRdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzo0Ol0sIFsxLCAyLCA5NiwgNF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbMzotMTotMV0sIFs0LCA5NiwgMiwgMV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbOjQ6M10sIFsxLCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0XSwgWzEsIDIsIDk2LCA0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0Ol0sIFsxLCAyLCA5NiwgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFszOi0xOi0xXSwgWzQsIDk2LCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzo0OjNdLCBbMSwgNF0pCiAKICAgICBkZWYgdGVzdF9jaGFyX3Aoc2VsZik6CiAgICAgICAgICMgVGhpcyBkaWRuJ3Qgd29yazogYmFkIGFyZ3VtZW50IHRvIGludGVybmFsIGZ1bmN0aW9uCiAgICAgICAgIHMgPSBjX2NoYXJfcCgiaGlobyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNhc3QoY2FzdChzLCBjX3ZvaWRfcCksIGNfY2hhcl9wKS52YWx1ZSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGNhc3QocywgY192b2lkX3ApLCBjX2NoYXJfcCkudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoaWhvIikKIAogICAgIHRyeToKQEAgLTgyLDcgKzgyLDcgQEAKICAgICBlbHNlOgogICAgICAgICBkZWYgdGVzdF93Y2hhcl9wKHNlbGYpOgogICAgICAgICAgICAgcyA9IGNfd2NoYXJfcCgiaGlobyIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjYXN0KGNhc3QocywgY192b2lkX3ApLCBjX3djaGFyX3ApLnZhbHVlLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGNhc3QocywgY192b2lkX3ApLCBjX3djaGFyX3ApLnZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhpaG8iKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5CmluZGV4IDhmOTdmYzQuLjQ5M2NiZTkgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHkKQEAgLTE3LDE3NiArMTcsMTc2IEBACiAgICAgZGVmIHRlc3RfYnl0ZShzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX2IucmVzdHlwZSA9IGNfYnl0ZQogICAgICAgICBzZWxmLl9kbGwudGZfYi5hcmd0eXBlcyA9IChjX2J5dGUsKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfYigtMTI2KSwgLTQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlMoKSwgLTEyNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYigtMTI2KSwgLTQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtMTI2KQogCiAgICAgZGVmIHRlc3RfYnl0ZV9wbHVzKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfYmIucmVzdHlwZSA9IGNfYnl0ZQogICAgICAgICBzZWxmLl9kbGwudGZfYmIuYXJndHlwZXMgPSAoY19ieXRlLCBjX2J5dGUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iYigwLCAtMTI2KSwgLTQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlMoKSwgLTEyNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYmIoMCwgLTEyNiksIC00MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgLTEyNikKIAogICAgIGRlZiB0ZXN0X3VieXRlKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfQi5yZXN0eXBlID0gY191Ynl0ZQogICAgICAgICBzZWxmLl9kbGwudGZfQi5hcmd0eXBlcyA9IChjX3VieXRlLCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX0IoMjU1KSwgODUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuVSgpLCAyNTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX0IoMjU1KSwgODUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5VKCksIDI1NSkKIAogICAgIGRlZiB0ZXN0X3VieXRlX3BsdXMoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9iQi5yZXN0eXBlID0gY191Ynl0ZQogICAgICAgICBzZWxmLl9kbGwudGZfYkIuYXJndHlwZXMgPSAoY19ieXRlLCBjX3VieXRlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfYkIoMCwgMjU1KSwgODUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuVSgpLCAyNTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JCKDAsIDI1NSksIDg1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuVSgpLCAyNTUpCiAKICAgICBkZWYgdGVzdF9zaG9ydChzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX2gucmVzdHlwZSA9IGNfc2hvcnQKICAgICAgICAgc2VsZi5fZGxsLnRmX2guYXJndHlwZXMgPSAoY19zaG9ydCwpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9oKC0zMjc2NiksIC0xMDkyMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIC0zMjc2NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfaCgtMzI3NjYpLCAtMTA5MjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC0zMjc2NikKIAogICAgIGRlZiB0ZXN0X3Nob3J0X3BsdXMoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9iaC5yZXN0eXBlID0gY19zaG9ydAogICAgICAgICBzZWxmLl9kbGwudGZfYmguYXJndHlwZXMgPSAoY19ieXRlLCBjX3Nob3J0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfYmgoMCwgLTMyNzY2KSwgLTEwOTIyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlMoKSwgLTMyNzY2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9iaCgwLCAtMzI3NjYpLCAtMTA5MjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC0zMjc2NikKIAogICAgIGRlZiB0ZXN0X3VzaG9ydChzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX0gucmVzdHlwZSA9IGNfdXNob3J0CiAgICAgICAgIHNlbGYuX2RsbC50Zl9ILmFyZ3R5cGVzID0gKGNfdXNob3J0LCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX0goNjU1MzUpLCAyMTg0NSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5VKCksIDY1NTM1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9IKDY1NTM1KSwgMjE4NDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5VKCksIDY1NTM1KQogCiAgICAgZGVmIHRlc3RfdXNob3J0X3BsdXMoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9iSC5yZXN0eXBlID0gY191c2hvcnQKICAgICAgICAgc2VsZi5fZGxsLnRmX2JILmFyZ3R5cGVzID0gKGNfYnl0ZSwgY191c2hvcnQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iSCgwLCA2NTUzNSksIDIxODQ1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlUoKSwgNjU1MzUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JIKDAsIDY1NTM1KSwgMjE4NDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5VKCksIDY1NTM1KQogCiAgICAgZGVmIHRlc3RfaW50KHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfaS5yZXN0eXBlID0gY19pbnQKICAgICAgICAgc2VsZi5fZGxsLnRmX2kuYXJndHlwZXMgPSAoY19pbnQsKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfaSgtMjE0NzQ4MzY0NiksIC03MTU4Mjc4ODIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfaSgtMjE0NzQ4MzY0NiksIC03MTU4Mjc4ODIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC0yMTQ3NDgzNjQ2KQogCiAgICAgZGVmIHRlc3RfaW50X3BsdXMoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9iaS5yZXN0eXBlID0gY19pbnQKICAgICAgICAgc2VsZi5fZGxsLnRmX2JpLmFyZ3R5cGVzID0gKGNfYnl0ZSwgY19pbnQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iaSgwLCAtMjE0NzQ4MzY0NiksIC03MTU4Mjc4ODIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYmkoMCwgLTIxNDc0ODM2NDYpLCAtNzE1ODI3ODgyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKIAogICAgIGRlZiB0ZXN0X3VpbnQoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9JLnJlc3R5cGUgPSBjX3VpbnQKICAgICAgICAgc2VsZi5fZGxsLnRmX0kuYXJndHlwZXMgPSAoY191aW50LCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX0koNDI5NDk2NzI5NSksIDE0MzE2NTU3NjUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuVSgpLCA0Mjk0OTY3Mjk1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9JKDQyOTQ5NjcyOTUpLCAxNDMxNjU1NzY1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuVSgpLCA0Mjk0OTY3Mjk1KQogCiAgICAgZGVmIHRlc3RfdWludF9wbHVzKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfYkkucmVzdHlwZSA9IGNfdWludAogICAgICAgICBzZWxmLl9kbGwudGZfYkkuYXJndHlwZXMgPSAoY19ieXRlLCBjX3VpbnQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iSSgwLCA0Mjk0OTY3Mjk1KSwgMTQzMTY1NTc2NSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5VKCksIDQyOTQ5NjcyOTUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JJKDAsIDQyOTQ5NjcyOTUpLCAxNDMxNjU1NzY1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuVSgpLCA0Mjk0OTY3Mjk1KQogCiAgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX2wucmVzdHlwZSA9IGNfbG9uZwogICAgICAgICBzZWxmLl9kbGwudGZfbC5hcmd0eXBlcyA9IChjX2xvbmcsKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfbCgtMjE0NzQ4MzY0NiksIC03MTU4Mjc4ODIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfbCgtMjE0NzQ4MzY0NiksIC03MTU4Mjc4ODIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC0yMTQ3NDgzNjQ2KQogCiAgICAgZGVmIHRlc3RfbG9uZ19wbHVzKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfYmwucmVzdHlwZSA9IGNfbG9uZwogICAgICAgICBzZWxmLl9kbGwudGZfYmwuYXJndHlwZXMgPSAoY19ieXRlLCBjX2xvbmcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9ibCgwLCAtMjE0NzQ4MzY0NiksIC03MTU4Mjc4ODIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYmwoMCwgLTIxNDc0ODM2NDYpLCAtNzE1ODI3ODgyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtMjE0NzQ4MzY0NikKIAogICAgIGRlZiB0ZXN0X3Vsb25nKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfTC5yZXN0eXBlID0gY191bG9uZwogICAgICAgICBzZWxmLl9kbGwudGZfTC5hcmd0eXBlcyA9IChjX3Vsb25nLCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX0woNDI5NDk2NzI5NSksIDE0MzE2NTU3NjUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuVSgpLCA0Mjk0OTY3Mjk1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9MKDQyOTQ5NjcyOTUpLCAxNDMxNjU1NzY1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuVSgpLCA0Mjk0OTY3Mjk1KQogCiAgICAgZGVmIHRlc3RfdWxvbmdfcGx1cyhzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX2JMLnJlc3R5cGUgPSBjX3Vsb25nCiAgICAgICAgIHNlbGYuX2RsbC50Zl9iTC5hcmd0eXBlcyA9IChjX2NoYXIsIGNfdWxvbmcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iTCgnICcsIDQyOTQ5NjcyOTUpLCAxNDMxNjU1NzY1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlUoKSwgNDI5NDk2NzI5NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYkwoJyAnLCA0Mjk0OTY3Mjk1KSwgMTQzMTY1NTc2NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlUoKSwgNDI5NDk2NzI5NSkKIAogICAgIGRlZiB0ZXN0X2xvbmdsb25nKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfcS5yZXN0eXBlID0gY19sb25nbG9uZwogICAgICAgICBzZWxmLl9kbGwudGZfcS5hcmd0eXBlcyA9IChjX2xvbmdsb25nLCApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9xKC05MjIzMzcyMDM2ODU0Nzc1ODA2KSwgLTMwNzQ0NTczNDU2MTgyNTg2MDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtOTIyMzM3MjAzNjg1NDc3NTgwNikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfcSgtOTIyMzM3MjAzNjg1NDc3NTgwNiksIC0zMDc0NDU3MzQ1NjE4MjU4NjAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtOTIyMzM3MjAzNjg1NDc3NTgwNikKIAogICAgIGRlZiB0ZXN0X2xvbmdsb25nX3BsdXMoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9icS5yZXN0eXBlID0gY19sb25nbG9uZwogICAgICAgICBzZWxmLl9kbGwudGZfYnEuYXJndHlwZXMgPSAoY19ieXRlLCBjX2xvbmdsb25nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfYnEoMCwgLTkyMjMzNzIwMzY4NTQ3NzU4MDYpLCAtMzA3NDQ1NzM0NTYxODI1ODYwMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIC05MjIzMzcyMDM2ODU0Nzc1ODA2KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9icSgwLCAtOTIyMzM3MjAzNjg1NDc3NTgwNiksIC0zMDc0NDU3MzQ1NjE4MjU4NjAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtOTIyMzM3MjAzNjg1NDc3NTgwNikKIAogICAgIGRlZiB0ZXN0X3Vsb25nbG9uZyhzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX1EucmVzdHlwZSA9IGNfdWxvbmdsb25nCiAgICAgICAgIHNlbGYuX2RsbC50Zl9RLmFyZ3R5cGVzID0gKGNfdWxvbmdsb25nLCApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9RKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSwgNjE0ODkxNDY5MTIzNjUxNzIwNSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5VKCksIDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9RKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSwgNjE0ODkxNDY5MTIzNjUxNzIwNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlUoKSwgMTg0NDY3NDQwNzM3MDk1NTE2MTUpCiAKICAgICBkZWYgdGVzdF91bG9uZ2xvbmdfcGx1cyhzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX2JRLnJlc3R5cGUgPSBjX3Vsb25nbG9uZwogICAgICAgICBzZWxmLl9kbGwudGZfYlEuYXJndHlwZXMgPSAoY19ieXRlLCBjX3Vsb25nbG9uZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX2JRKDAsIDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSwgNjE0ODkxNDY5MTIzNjUxNzIwNSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5VKCksIDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9iUSgwLCAxODQ0Njc0NDA3MzcwOTU1MTYxNSksIDYxNDg5MTQ2OTEyMzY1MTcyMDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5VKCksIDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQogCiAgICAgZGVmIHRlc3RfZmxvYXQoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9mLnJlc3R5cGUgPSBjX2Zsb2F0CiAgICAgICAgIHNlbGYuX2RsbC50Zl9mLmFyZ3R5cGVzID0gKGNfZmxvYXQsKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfZigtNDIuKSwgLTE0LikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIC00MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfZigtNDIuKSwgLTE0LikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgLTQyKQogCiAgICAgZGVmIHRlc3RfZmxvYXRfcGx1cyhzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX2JmLnJlc3R5cGUgPSBjX2Zsb2F0CiAgICAgICAgIHNlbGYuX2RsbC50Zl9iZi5hcmd0eXBlcyA9IChjX2J5dGUsIGNfZmxvYXQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9iZigwLCAtNDIuKSwgLTE0LikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIC00MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9kbGwudGZfYmYoMCwgLTQyLiksIC0xNC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIC00MikKIAogICAgIGRlZiB0ZXN0X2RvdWJsZShzZWxmKToKICAgICAgICAgc2VsZi5fZGxsLnRmX2QucmVzdHlwZSA9IGNfZG91YmxlCiAgICAgICAgIHNlbGYuX2RsbC50Zl9kLmFyZ3R5cGVzID0gKGNfZG91YmxlLCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX2QoNDIuKSwgMTQuKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlMoKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2QoNDIuKSwgMTQuKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCA0MikKIAogICAgIGRlZiB0ZXN0X2RvdWJsZV9wbHVzKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfYmQucmVzdHlwZSA9IGNfZG91YmxlCiAgICAgICAgIHNlbGYuX2RsbC50Zl9iZC5hcmd0eXBlcyA9IChjX2J5dGUsIGNfZG91YmxlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfYmQoMCwgNDIuKSwgMTQuKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlMoKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2JkKDAsIDQyLiksIDE0LikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgNDIpCiAKICAgICBkZWYgdGVzdF9sb25nZG91YmxlKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudGZfRC5yZXN0eXBlID0gY19sb25nZG91YmxlCiAgICAgICAgIHNlbGYuX2RsbC50Zl9ELmFyZ3R5cGVzID0gKGNfbG9uZ2RvdWJsZSwpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50Zl9EKDQyLiksIDE0LikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9EKDQyLiksIDE0LikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgNDIpCiAKICAgICBkZWYgdGVzdF9sb25nZG91YmxlX3BsdXMoc2VsZik6CiAgICAgICAgIHNlbGYuX2RsbC50Zl9iRC5yZXN0eXBlID0gY19sb25nZG91YmxlCiAgICAgICAgIHNlbGYuX2RsbC50Zl9iRC5hcmd0eXBlcyA9IChjX2J5dGUsIGNfbG9uZ2RvdWJsZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX2JEKDAsIDQyLiksIDE0LikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50Zl9iRCgwLCA0Mi4pLCAxNC4pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5TKCksIDQyKQogCiAgICAgZGVmIHRlc3RfY2FsbHdpdGhyZXN1bHQoc2VsZik6CiAgICAgICAgIGRlZiBwcm9jZXNzX3Jlc3VsdChyZXN1bHQpOgogICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIDIKICAgICAgICAgc2VsZi5fZGxsLnRmX2kucmVzdHlwZSA9IHByb2Nlc3NfcmVzdWx0CiAgICAgICAgIHNlbGYuX2RsbC50Zl9pLmFyZ3R5cGVzID0gKGNfaW50LCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5fZGxsLnRmX2koNDIpLCAyOCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIDQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudGZfaSgtNDIpLCAtMjgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuUygpLCAtNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2koNDIpLCAyOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnRmX2koLTQyKSwgLTI4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuUygpLCAtNDIpCiAKICAgICBkZWYgdGVzdF92b2lkKHNlbGYpOgogICAgICAgICBzZWxmLl9kbGwudHZfaS5yZXN0eXBlID0gTm9uZQogICAgICAgICBzZWxmLl9kbGwudHZfaS5hcmd0eXBlcyA9IChjX2ludCwpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuX2RsbC50dl9pKDQyKSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5TKCksIDQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLl9kbGwudHZfaSgtNDIpLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLlMoKSwgLTQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2RsbC50dl9pKDQyKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZGxsLnR2X2koLTQyKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLlMoKSwgLTQyKQogCiAjIFRoZSBmb2xsb3dpbmcgcmVwZWF0ZXMgdGhlIGFib3ZlIHRlc3RzIHdpdGggc3RkY2FsbCBmdW5jdGlvbnMgKHdoZXJlCiAjIHRoZXkgYXJlIGF2YWlsYWJsZSkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NoZWNrcmV0dmFsLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2hlY2tyZXR2YWwucHkKaW5kZXggZDE1YmQyZS4uMDFjY2M1NyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2hlY2tyZXR2YWwucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2hlY2tyZXR2YWwucHkKQEAgLTE0LDE2ICsxNCwxNiBAQAogCiAgICAgICAgIGltcG9ydCBfY3R5cGVzX3Rlc3QKICAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBkbGwuX3Rlc3RmdW5jX3BfcCg0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGRsbC5fdGVzdGZ1bmNfcF9wKDQyKSkKIAogICAgICAgICBkbGwuX3Rlc3RmdW5jX3BfcC5yZXN0eXBlID0gQ0hFQ0tFRAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiNDIiLCBkbGwuX3Rlc3RmdW5jX3BfcCg0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjQyIiwgZGxsLl90ZXN0ZnVuY19wX3AoNDIpKQogCiAgICAgICAgIGRsbC5fdGVzdGZ1bmNfcF9wLnJlc3R5cGUgPSBOb25lCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGRsbC5fdGVzdGZ1bmNfcF9wKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBkbGwuX3Rlc3RmdW5jX3BfcCg0MikpCiAKICAgICAgICAgZGVsIGRsbC5fdGVzdGZ1bmNfcF9wLnJlc3R5cGUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGRsbC5fdGVzdGZ1bmNfcF9wKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZGxsLl90ZXN0ZnVuY19wX3AoNDIpKQogCiAgICAgdHJ5OgogICAgICAgICBvbGVkbGwKQEAgLTMxLDcgKzMxLDcgQEAKICAgICAgICAgcGFzcwogICAgIGVsc2U6CiAgICAgICAgIGRlZiB0ZXN0X29sZWRsbChzZWxmKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhXaW5kb3dzRXJyb3IsCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhXaW5kb3dzRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xlZGxsLm9sZWF1dDMyLkNyZWF0ZVR5cGVMaWIyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIE5vbmUsIE5vbmUpCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Vycm5vLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZXJybm8ucHkKaW5kZXggYjgwNjU2Yi4uMDI1NGMzYiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZXJybm8ucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZXJybm8ucHkKQEAgLTE1LDExICsxNSwxMSBAQAogCiAgICAgICAgICAgICBsaWJjX29wZW4uYXJndHlwZXMgPSBjX2NoYXJfcCwgY19pbnQKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGliY19vcGVuKCIiLCAwKSwgLTEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChnZXRfZXJybm8oKSwgZXJybm8uRU5PRU5UKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaWJjX29wZW4oIiIsIDApLCAtMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ2V0X2Vycm5vKCksIGVycm5vLkVOT0VOVCkKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2V0X2Vycm5vKDMyKSwgZXJybm8uRU5PRU5UKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ2V0X2Vycm5vKCksIDMyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXRfZXJybm8oMzIpLCBlcnJuby5FTk9FTlQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9lcnJubygpLCAzMikKIAogCiAgICAgICAgICAgICBkZWYgX3dvcmtlcigpOgpAQCAtMzEsMTQgKzMxLDE0IEBACiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgbGliY19vcGVuID0gbGliYy5vcGVuCiAgICAgICAgICAgICAgICAgbGliY19vcGVuLmFyZ3R5cGVzID0gY19jaGFyX3AsIGNfaW50Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGliY19vcGVuKCIiLCAwKSwgLTEpCi0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ2V0X2Vycm5vKCksIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaWJjX29wZW4oIiIsIDApLCAtMSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9lcnJubygpLCAwKQogCiAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9X3dvcmtlcikKICAgICAgICAgICAgIHQuc3RhcnQoKQogICAgICAgICAgICAgdC5qb2luKCkKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ2V0X2Vycm5vKCksIDMyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfZXJybm8oKSwgMzIpCiAgICAgICAgICAgICBzZXRfZXJybm8oMCkKIAogICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKQEAgLTQ4LDExICs0OCwxMSBAQAogICAgICAgICAgICAgR2V0TW9kdWxlSGFuZGxlID0gZGxsLkdldE1vZHVsZUhhbmRsZUEKICAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZS5hcmd0eXBlcyA9IFtjX3djaGFyX3BdCiAKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIEdldE1vZHVsZUhhbmRsZSgiZm9vIikpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChnZXRfbGFzdF9lcnJvcigpLCAxMjYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIEdldE1vZHVsZUhhbmRsZSgiZm9vIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9sYXN0X2Vycm9yKCksIDEyNikKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2V0X2xhc3RfZXJyb3IoMzIpLCAxMjYpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChnZXRfbGFzdF9lcnJvcigpLCAzMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2V0X2xhc3RfZXJyb3IoMzIpLCAxMjYpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9sYXN0X2Vycm9yKCksIDMyKQogCiAgICAgICAgICAgICBkZWYgX3dvcmtlcigpOgogICAgICAgICAgICAgICAgIHNldF9sYXN0X2Vycm9yKDApCkBAIC02MiwxMyArNjIsMTMgQEAKICAgICAgICAgICAgICAgICBHZXRNb2R1bGVIYW5kbGUuYXJndHlwZXMgPSBbY193Y2hhcl9wXQogICAgICAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZSgiYmFyIikKIAotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdldF9sYXN0X2Vycm9yKCksIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnZXRfbGFzdF9lcnJvcigpLCAwKQogCiAgICAgICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9X3dvcmtlcikKICAgICAgICAgICAgIHQuc3RhcnQoKQogICAgICAgICAgICAgdC5qb2luKCkKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ2V0X2xhc3RfZXJyb3IoKSwgMzIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdldF9sYXN0X2Vycm9yKCksIDMyKQogCiAgICAgICAgICAgICBzZXRfbGFzdF9lcnJvcigwKQogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZmluZC5weQppbmRleCBlZDEyOTdkLi43N2U3ODlmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9maW5kLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2ZpbmQucHkKQEAgLTc2LDcgKzc2LDcgQEAKICMjICAgICAgICAgICAgc3FydCA9IGxpYm0uc3FydAogIyMgICAgICAgICAgICBzcXJ0LmFyZ3R5cGVzID0gKGNfZG91YmxlLCkKICMjICAgICAgICAgICAgc3FydC5yZXN0eXBlID0gY19kb3VibGUKLSMjICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3FydCgyKSwgbWF0aC5zcXJ0KDIpKQorIyMgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNxcnQoMiksIG1hdGguc3FydCgyKSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Zyb21idWZmZXIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mcm9tYnVmZmVyLnB5CmluZGV4IDQyODVlNDAuLjYyNGZiNzAgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Zyb21idWZmZXIucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnJvbWJ1ZmZlci5weQpAQCAtMTYsMTQgKzE2LDE0IEBACiAKICAgICAgICAgeSA9IFguZnJvbV9idWZmZXIoYSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LmNfaW50LCBhWzBdKQotICAgICAgICBzZWxmLmZhaWxJZih5LmluaXRfY2FsbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHkuaW5pdF9jYWxsZWQpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzpdLCBhLnRvbGlzdCgpKQogCiAgICAgICAgIGFbMF0sIGFbLTFdID0gMjAwLCAtMjAwCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFs6XSwgYS50b2xpc3QoKSkKIAotICAgICAgICBzZWxmLmFzc2VydF8oYSBpbiB4Ll9vYmplY3RzLnZhbHVlcygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpbiB4Ll9vYmplY3RzLnZhbHVlcygpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfaW50LmZyb21fYnVmZmVyLCBhLCAtMSkKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogICAgICAgICB5ID0gWC5mcm9tX2J1ZmZlcl9jb3B5KGEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5jX2ludCwgYVswXSkKLSAgICAgICAgc2VsZi5mYWlsSWYoeS5pbml0X2NhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh5LmluaXRfY2FsbGVkKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeFs6XSwgcmFuZ2UoMTYpKQogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3B0ci5weQppbmRleCA3ZWE4NzNmLi45OWFmNWVkIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jcHRyLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Z1bmNwdHIucHkKQEAgLTE4LDEwICsxOCwxMCBAQAogICAgICAgICAgICAgcmV0dXJuIGxlbihhcmdzKQogCiAgICAgICAgIHggPSBYKGZ1bmMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHgucmVzdHlwZSwgY19pbnQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHguYXJndHlwZXMsIChjX2ludCwgY19pbnQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoeCksIHNpemVvZihjX3ZvaWRwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY192b2lkcCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5yZXN0eXBlLCBjX2ludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmFyZ3R5cGVzLCAoY19pbnQsIGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoeCksIHNpemVvZihjX3ZvaWRwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX3ZvaWRwKSkKIAogICAgIGRlZiB0ZXN0X2ZpcnN0KHNlbGYpOgogICAgICAgICBTdGRDYWxsYmFjayA9IFdJTkZVTkNUWVBFKGNfaW50LCBjX2ludCwgY19pbnQpCkBAIC0zMywxMiArMzMsMTIgQEAKICAgICAgICAgcyA9IFN0ZENhbGxiYWNrKGZ1bmMpCiAgICAgICAgIGMgPSBDZGVjbENhbGxiYWNrKGZ1bmMpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocygxLCAyKSwgMykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYygxLCAyKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzKDEsIDIpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMoMSwgMiksIDMpCiAgICAgICAgICMgVGhlIGZvbGxvd2luZyBubyBsb25nZXIgcmFpc2VzIGEgVHlwZUVycm9yIC0gaXQgaXMgbm93CiAgICAgICAgICMgcG9zc2libGUsIGFzIGluIEMsIHRvIGNhbGwgY2RlY2wgZnVuY3Rpb25zIHdpdGggbW9yZSBwYXJhbWV0ZXJzLgogICAgICAgICAjc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjLCAxLCAyLCAzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjKDEsIDIsIDMsIDQsIDUsIDYpLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMoMSwgMiwgMywgNCwgNSwgNiksIDMpCiAgICAgICAgIGlmIG5vdCBXSU5GVU5DVFlQRSBpcyBDRlVOQ1RZUEUgYW5kIG9zLm5hbWUgIT0gImNlIjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcywgMSwgMiwgMykKIApAQCAtNzUsOSArNzUsOSBAQAogICAgICAgICAjIyAgICAgICAgICAgICAgICAgICJscGZuV25kUHJvYyIsIFdORFBST0NfMih3bmRwcm9jKSkKICAgICAgICAgIyBpbnN0ZWFkOgogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhXTkRQUk9DIGlzIFdORFBST0NfMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFdORFBST0MgaXMgV05EUFJPQ18yKQogICAgICAgICAjICd3bmRjbGFzcy5scGZuV25kUHJvYycgbGVha3MgOTQgcmVmZXJlbmNlcy4gIFdoeT8KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod25kY2xhc3MubHBmblduZFByb2MoMSwgMiwgMywgNCksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHduZGNsYXNzLmxwZm5XbmRQcm9jKDEsIDIsIDMsIDQpLCAxMCkKIAogCiAgICAgICAgIGYgPSB3bmRjbGFzcy5scGZuV25kUHJvYwpAQCAtODUsNyArODUsNyBAQAogICAgICAgICBkZWwgd25kY2xhc3MKICAgICAgICAgZGVsIHduZHByb2MKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmKDEwLCAxMSwgMTIsIDEzKSwgNDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZigxMCwgMTEsIDEyLCAxMyksIDQ2KQogCiAgICAgZGVmIHRlc3RfZGxsZnVuY3Rpb25zKHNlbGYpOgogCkBAIC05Nyw4ICs5Nyw4IEBACiAgICAgICAgIHN0cmNociA9IGxpYi5teV9zdHJjaHIKICAgICAgICAgc3RyY2hyLnJlc3R5cGUgPSBjX2NoYXJfcAogICAgICAgICBzdHJjaHIuYXJndHlwZXMgPSAoY19jaGFyX3AsIGNfY2hhcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyY2hyKCJhYmNkZWZnaGkiLCAiYiIpLCAiYmNkZWZnaGkiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJjaHIoImFiY2RlZmdoaSIsICJ4IiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyY2hyKCJhYmNkZWZnaGkiLCAiYiIpLCAiYmNkZWZnaGkiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmNocigiYWJjZGVmZ2hpIiwgIngiKSwgTm9uZSkKIAogCiAgICAgICAgIHN0cnRvayA9IGxpYi5teV9zdHJ0b2sKQEAgLTExOCwxMCArMTE4LDEwIEBACiAjIyAgICAgICAgYi52YWx1ZSA9IHMKIAogIyMgICAgICAgIGIgPSBjX3N0cmluZyhzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJ0b2soYiwgIlxuIiksICJhIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RydG9rKE5vbmUsICJcbiIpLCAiYiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cnRvayhOb25lLCAiXG4iKSwgImMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJ0b2soTm9uZSwgIlxuIiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RydG9rKGIsICJcbiIpLCAiYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RydG9rKE5vbmUsICJcbiIpLCAiYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RydG9rKE5vbmUsICJcbiIpLCAiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RydG9rKE5vbmUsICJcbiIpLCBOb25lKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfZnVuY3Rpb25zLnB5CmluZGV4IDkzZDg5NWIuLjQ1MzQ4MTUgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2Z1bmN0aW9ucy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9mdW5jdGlvbnMucHkKQEAgLTcxLDggKzcxLDggQEAKICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfaV9iaGlsZmQKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfd2NoYXIsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQogICAgICAgICByZXN1bHQgPSBmKDEsIHUieCIsIDMsIDQsIDUuMCwgNi4wKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDEzOSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAxMzkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCiAKICAgICBkZWYgdGVzdF93Y2hhcl9yZXN1bHQoc2VsZik6CiAgICAgICAgIHRyeToKQEAgLTgzLDM4ICs4MywzOCBAQAogICAgICAgICBmLmFyZ3R5cGVzID0gW2NfYnl0ZSwgY19zaG9ydCwgY19pbnQsIGNfbG9uZywgY19mbG9hdCwgY19kb3VibGVdCiAgICAgICAgIGYucmVzdHlwZSA9IGNfd2NoYXIKICAgICAgICAgcmVzdWx0ID0gZigwLCAwLCAwLCAwLCAwLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIHUnXHgwMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCB1J1x4MDAnKQogCiAgICAgZGVmIHRlc3Rfdm9pZHJlc3VsdChzZWxmKToKICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfdgogICAgICAgICBmLnJlc3R5cGUgPSBOb25lCiAgICAgICAgIGYuYXJndHlwZXMgPSBbY19pbnQsIGNfaW50LCBQT0lOVEVSKGNfaW50KV0KICAgICAgICAgcmVzdWx0ID0gY19pbnQoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChOb25lLCBmKDEsIDIsIGJ5cmVmKHJlc3VsdCkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQudmFsdWUsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZigxLCAyLCBieXJlZihyZXN1bHQpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQudmFsdWUsIDMpCiAKICAgICBkZWYgdGVzdF9pbnRyZXN1bHQoc2VsZik6CiAgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2lfYmhpbGZkCiAgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2RvdWJsZV0KICAgICAgICAgZi5yZXN0eXBlID0gY19pbnQKICAgICAgICAgcmVzdWx0ID0gZigxLCAyLCAzLCA0LCA1LjAsIDYuMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAyMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIGludCkKIAogICAgICAgICByZXN1bHQgPSBmKC0xLCAtMiwgLTMsIC00LCAtNS4wLCAtNi4wKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIC0yMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAtMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCiAKICAgICAgICAgIyBJZiB3ZSBkZWNsYXJlIHRoZSBmdW5jdGlvbiB0byByZXR1cm4gYSBzaG9ydCwKICAgICAgICAgIyBpcyB0aGUgaGlnaCBwYXJ0IHNwbGl0IG9mZj8KICAgICAgICAgZi5yZXN0eXBlID0gY19zaG9ydAogICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDQsIDUuMCwgNi4wKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDIxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHJlc3VsdCksIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgaW50KQogCiAgICAgICAgIHJlc3VsdCA9IGYoMSwgMiwgMywgMHgxMDAwNCwgNS4wLCA2LjApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgMjEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUocmVzdWx0KSwgaW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBpbnQpCiAKICAgICAgICAgIyBZb3UgY2Fubm90IGFzc2luZyBjaGFyYWN0ZXIgZm9ybWF0IGNvZGVzIGFzIHJlc3R5cGUgYW55IGxvbmdlcgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIGYsICJyZXN0eXBlIiwgImkiKQpAQCAtMTI0LDM2ICsxMjQsMzYgQEAKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQogICAgICAgICBmLnJlc3R5cGUgPSBjX2Zsb2F0CiAgICAgICAgIHJlc3VsdCA9IGYoMSwgMiwgMywgNCwgNS4wLCA2LjApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgMjEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUocmVzdWx0KSwgZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAyMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIGZsb2F0KQogCiAgICAgICAgIHJlc3VsdCA9IGYoLTEsIC0yLCAtMywgLTQsIC01LjAsIC02LjApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgLTIxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHJlc3VsdCksIGZsb2F0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgZmxvYXQpCiAKICAgICBkZWYgdGVzdF9kb3VibGVyZXN1bHQoc2VsZik6CiAgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX2RfYmhpbGZkCiAgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2RvdWJsZV0KICAgICAgICAgZi5yZXN0eXBlID0gY19kb3VibGUKICAgICAgICAgcmVzdWx0ID0gZigxLCAyLCAzLCA0LCA1LjAsIDYuMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAyMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShyZXN1bHQpLCBmbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUocmVzdWx0KSwgZmxvYXQpCiAKICAgICAgICAgcmVzdWx0ID0gZigtMSwgLTIsIC0zLCAtNCwgLTUuMCwgLTYuMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAtMjEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUocmVzdWx0KSwgZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAtMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBmbG9hdCkKIAogICAgIGRlZiB0ZXN0X2xvbmdkb3VibGVyZXN1bHQoc2VsZik6CiAgICAgICAgIGYgPSBkbGwuX3Rlc3RmdW5jX0RfYmhpbGZECiAgICAgICAgIGYuYXJndHlwZXMgPSBbY19ieXRlLCBjX3Nob3J0LCBjX2ludCwgY19sb25nLCBjX2Zsb2F0LCBjX2xvbmdkb3VibGVdCiAgICAgICAgIGYucmVzdHlwZSA9IGNfbG9uZ2RvdWJsZQogICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDQsIDUuMCwgNi4wKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDIxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHJlc3VsdCksIGZsb2F0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMjEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBmbG9hdCkKIAogICAgICAgICByZXN1bHQgPSBmKC0xLCAtMiwgLTMsIC00LCAtNS4wLCAtNi4wKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIC0yMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShyZXN1bHQpLCBmbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0yMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHJlc3VsdCksIGZsb2F0KQogCiAgICAgZGVmIHRlc3RfbG9uZ2xvbmdyZXN1bHQoc2VsZik6CiAgICAgICAgIHRyeToKQEAgLTE2NCwyMyArMTY0LDIzIEBACiAgICAgICAgIGYucmVzdHlwZSA9IGNfbG9uZ2xvbmcKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlXQogICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDQsIDUuMCwgNi4wKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIDIxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgMjEpCiAKICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfcV9iaGlsZmRxCiAgICAgICAgIGYucmVzdHlwZSA9IGNfbG9uZ2xvbmcKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2J5dGUsIGNfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfZmxvYXQsIGNfZG91YmxlLCBjX2xvbmdsb25nXQogICAgICAgICByZXN1bHQgPSBmKDEsIDIsIDMsIDQsIDUuMCwgNi4wLCAyMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIDQyKQogCiAgICAgZGVmIHRlc3Rfc3RyaW5ncmVzdWx0KHNlbGYpOgogICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19wX3AKICAgICAgICAgZi5hcmd0eXBlcyA9IE5vbmUKICAgICAgICAgZi5yZXN0eXBlID0gY19jaGFyX3AKICAgICAgICAgcmVzdWx0ID0gZigiMTIzIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAiMTIzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsICIxMjMiKQogCiAgICAgICAgIHJlc3VsdCA9IGYoTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgTm9uZSkKIAogICAgIGRlZiB0ZXN0X3BvaW50ZXJzKHNlbGYpOgogICAgICAgICBmID0gZGxsLl90ZXN0ZnVuY19wX3AKQEAgLTE5MywyOSArMTkzLDI5IEBACiAKICAgICAgICAgdiA9IGNfaW50KDQyKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBvaW50ZXIodikuY29udGVudHMudmFsdWUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBvaW50ZXIodikuY29udGVudHMudmFsdWUsIDQyKQogICAgICAgICByZXN1bHQgPSBmKHBvaW50ZXIodikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUocmVzdWx0KSwgUE9JTlRFUihjX2ludCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdC5jb250ZW50cy52YWx1ZSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShyZXN1bHQpLCBQT0lOVEVSKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIDQyKQogCiAgICAgICAgICMgVGhpcyBvbiB3b3Jrcy4uLgogICAgICAgICByZXN1bHQgPSBmKHBvaW50ZXIodikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdC5jb250ZW50cy52YWx1ZSwgdi52YWx1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY29udGVudHMudmFsdWUsIHYudmFsdWUpCiAKICAgICAgICAgcCA9IHBvaW50ZXIoY19pbnQoOTkpKQogICAgICAgICByZXN1bHQgPSBmKHApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdC5jb250ZW50cy52YWx1ZSwgOTkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmNvbnRlbnRzLnZhbHVlLCA5OSkKIAogICAgICAgICBhcmcgPSBieXJlZih2KQogICAgICAgICByZXN1bHQgPSBmKGFyZykKLSAgICAgICAgc2VsZi5mYWlsSWZFcXVhbChyZXN1bHQuY29udGVudHMsIHYudmFsdWUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmVzdWx0LmNvbnRlbnRzLCB2LnZhbHVlKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEFyZ3VtZW50RXJyb3IsIGYsIGJ5cmVmKGNfc2hvcnQoMjIpKSkKIAogICAgICAgICAjIEl0IGlzIGRhbmdlcm91cywgaG93ZXZlciwgYmVjYXVzZSB5b3UgZG9uJ3QgY29udHJvbCB0aGUgbGlmZXRpbWUKICAgICAgICAgIyBvZiB0aGUgcG9pbnRlcjoKICAgICAgICAgcmVzdWx0ID0gZihieXJlZihjX2ludCg5OSkpKQotICAgICAgICBzZWxmLmZhaWxJZkVxdWFsKHJlc3VsdC5jb250ZW50cywgOTkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocmVzdWx0LmNvbnRlbnRzLCA5OSkKIAogICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKICAgICAgICAgZiA9IGRsbC5fdGVzdGZ1bmNfcF9wCkBAIC0yNDIsNyArMjQyLDcgQEAKIAogICAgICAgICBjYiA9IENhbGxCYWNrKGNhbGxiYWNrKQogICAgICAgICBmKDIqKjE4LCBjYikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYXJncywgZXhwZWN0ZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJncywgZXhwZWN0ZWQpCiAKICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAKQEAgLTI1OSwxMyArMjU5LDEzIEBACiAKICAgICAgICAgY2IgPSBNeUNhbGxiYWNrKGNhbGxiYWNrKQogICAgICAgICByZXN1bHQgPSBmKC0xMCwgY2IpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgLTE4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgLTE4KQogCiAgICAgICAgICMgdGVzdCB3aXRoIHByb3RvdHlwZQogICAgICAgICBmLmFyZ3R5cGVzID0gW2NfaW50LCBNeUNhbGxiYWNrXQogICAgICAgICBjYiA9IE15Q2FsbGJhY2soY2FsbGJhY2spCiAgICAgICAgIHJlc3VsdCA9IGYoLTEwLCBjYikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAtMTgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCAtMTgpCiAKICAgICAgICAgQW5vdGhlckNhbGxiYWNrID0gV0lORlVOQ1RZUEUoY19pbnQsIGNfaW50LCBjX2ludCwgY19pbnQsIGNfaW50KQogCkBAIC0yODgsMTIgKzI4OCwxMiBAQAogCiAgICAgICAgIGRlZiBjYWxsYmFjayh2YWx1ZSk6CiAgICAgICAgICAgICAjcHJpbnQgImNhbGxlZCBiYWNrIHdpdGgiLCB2YWx1ZQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWx1ZSksIGludCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZSh2YWx1ZSksIGludCkKICAgICAgICAgICAgIHJldHVybiB2YWx1ZQogCiAgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKICAgICAgICAgcmVzdWx0ID0gZigtMTAsIGNiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIC0xOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0xOCkKIAogICAgIGRlZiB0ZXN0X2xvbmdsb25nX2NhbGxiYWNrcyhzZWxmKToKIApAQCAtMzA1LDEyICszMDUsMTIgQEAKICAgICAgICAgZi5hcmd0eXBlcyA9IFtjX2xvbmdsb25nLCBNeUNhbGxiYWNrXQogCiAgICAgICAgIGRlZiBjYWxsYmFjayh2YWx1ZSk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZSh2YWx1ZSwgKGludCwgbG9uZykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmFsdWUsIChpbnQsIGxvbmcpKSkKICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAmIDB4N0ZGRkZGRkYKIAogICAgICAgICBjYiA9IE15Q2FsbGJhY2soY2FsbGJhY2spCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMTM1Nzc2MjU1ODcsIGYoMTAwMDAwMDAwMDAwMCwgY2IpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEzNTc3NjI1NTg3LCBmKDEwMDAwMDAwMDAwMDAsIGNiKSkKIAogICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGdldGF0dHIsIGRsbCwgIl94eHhfeXl5IikKQEAgLTMyNSw3ICszMjUsNyBAQAogICAgICAgICByZXN1bHQgPSBkbGwuX3Rlc3RmdW5jX2J5dmFsKHB0aW4sIGJ5cmVmKHB0b3V0KSkKICAgICAgICAgZ290ID0gcmVzdWx0LCBwdG91dC54LCBwdG91dC55CiAgICAgICAgIGV4cGVjdGVkID0gMywgMSwgMgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChnb3QsIGV4cGVjdGVkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCiAKICAgICAgICAgIyB3aXRoIHByb3RvdHlwZQogICAgICAgICBwdGluID0gUE9JTlQoMTAxLCAxMDIpCkBAIC0zMzUsNyArMzM1LDcgQEAKICAgICAgICAgcmVzdWx0ID0gZGxsLl90ZXN0ZnVuY19ieXZhbChwdGluLCBieXJlZihwdG91dCkpCiAgICAgICAgIGdvdCA9IHJlc3VsdCwgcHRvdXQueCwgcHRvdXQueQogICAgICAgICBleHBlY3RlZCA9IDIwMywgMTAxLCAxMDIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ290LCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QsIGV4cGVjdGVkKQogCiAgICAgZGVmIHRlc3Rfc3RydWN0X3JldHVybl8ySChzZWxmKToKICAgICAgICAgY2xhc3MgUzJIKFN0cnVjdHVyZSk6CkBAIC0zNDUsNyArMzQ1LDcgQEAKICAgICAgICAgZGxsLnJldF8yaF9mdW5jLmFyZ3R5cGVzID0gW1MySF0KICAgICAgICAgaW5wID0gUzJIKDk5LCA4OCkKICAgICAgICAgczJoID0gZGxsLnJldF8yaF9mdW5jKGlucCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHMyaC54LCBzMmgueSksICg5OSoyLCA4OCozKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoczJoLngsIHMyaC55KSwgKDk5KjIsIDg4KjMpKQogCiAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CiAgICAgICAgIGRlZiB0ZXN0X3N0cnVjdF9yZXR1cm5fMkhfc3RkY2FsbChzZWxmKToKQEAgLTM1Niw3ICszNTYsNyBAQAogICAgICAgICAgICAgd2luZGxsLnNfcmV0XzJoX2Z1bmMucmVzdHlwZSA9IFMySAogICAgICAgICAgICAgd2luZGxsLnNfcmV0XzJoX2Z1bmMuYXJndHlwZXMgPSBbUzJIXQogICAgICAgICAgICAgczJoID0gd2luZGxsLnNfcmV0XzJoX2Z1bmMoUzJIKDk5LCA4OCkpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoczJoLngsIHMyaC55KSwgKDk5KjIsIDg4KjMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoczJoLngsIHMyaC55KSwgKDk5KjIsIDg4KjMpKQogCiAgICAgZGVmIHRlc3Rfc3RydWN0X3JldHVybl84SChzZWxmKToKICAgICAgICAgY2xhc3MgUzhJKFN0cnVjdHVyZSk6CkBAIC0zNzIsNyArMzcyLDcgQEAKICAgICAgICAgZGxsLnJldF84aV9mdW5jLmFyZ3R5cGVzID0gW1M4SV0KICAgICAgICAgaW5wID0gUzhJKDksIDgsIDcsIDYsIDUsIDQsIDMsIDIpCiAgICAgICAgIHM4aSA9IGRsbC5yZXRfOGlfZnVuYyhpbnApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKChzOGkuYSwgczhpLmIsIHM4aS5jLCBzOGkuZCwgczhpLmUsIHM4aS5mLCBzOGkuZywgczhpLmgpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzOGkuYSwgczhpLmIsIHM4aS5jLCBzOGkuZCwgczhpLmUsIHM4aS5mLCBzOGkuZywgczhpLmgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOSoyLCA4KjMsIDcqNCwgNio1LCA1KjYsIDQqNywgMyo4LCAyKjkpKQogCiAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJ3aW4zMiI6CkBAIC0zOTAsNyArMzkwLDcgQEAKICAgICAgICAgICAgIHdpbmRsbC5zX3JldF84aV9mdW5jLmFyZ3R5cGVzID0gW1M4SV0KICAgICAgICAgICAgIGlucCA9IFM4SSg5LCA4LCA3LCA2LCA1LCA0LCAzLCAyKQogICAgICAgICAgICAgczhpID0gd2luZGxsLnNfcmV0XzhpX2Z1bmMoaW5wKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHM4aS5hLCBzOGkuYiwgczhpLmMsIHM4aS5kLCBzOGkuZSwgczhpLmYsIHM4aS5nLCBzOGkuaCksCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChzOGkuYSwgczhpLmIsIHM4aS5jLCBzOGkuZCwgczhpLmUsIHM4aS5mLCBzOGkuZywgczhpLmgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDkqMiwgOCozLCA3KjQsIDYqNSwgNSo2LCA0KjcsIDMqOCwgMio5KSkKIAogICAgIGRlZiB0ZXN0X3NmMTY1MTIzNShzZWxmKToKQEAgLTQwMSw3ICs0MDEsNyBAQAogICAgICAgICAgICAgcmV0dXJuIDAKIAogICAgICAgICBjYWxsYmFjayA9IHByb3RvKGNhbGxiYWNrKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoQXJndW1lbnRFcnJvciwgbGFtYmRhOiBjYWxsYmFjaygoMSwgMiwgMywgNCksIFBPSU5UKCkpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBsYW1iZGE6IGNhbGxiYWNrKCgxLCAyLCAzLCA0KSwgUE9JTlQoKSkpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9pbmNvbXBsZXRlLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfaW5jb21wbGV0ZS5weQppbmRleCBhZjlmNTA0Li4xZTAzZTlmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9pbmNvbXBsZXRlLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2luY29tcGxldGUucHkKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoOCk6CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHAubmFtZSkKICAgICAgICAgICAgIHAgPSBwLm5leHRbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCBbImZvbyIsICJiYXIiXSAqIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBbImZvbyIsICJiYXIiXSAqIDQpCiAKICAgICAgICAgIyB0byBub3QgbGVhayByZWZlcmVuY2VzLCB3ZSBtdXN0IGNsZWFuIF9wb2ludGVyX3R5cGVfY2FjaGUKICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IF9wb2ludGVyX3R5cGVfY2FjaGUKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2luaXQucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9pbml0LnB5CmluZGV4IDNkOWRjOTIuLjk1M2ExNDUgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2luaXQucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfaW5pdC5weQpAQCAtMjQsMTcgKzI0LDE3IEBACiAgICAgICAgICMgbWFrZSBzdXJlIHRoZSBvbmx5IGFjY2Vzc2luZyBhIG5lc3RlZCBzdHJ1Y3R1cmUKICAgICAgICAgIyBkb2Vzbid0IGNhbGwgdGhlIHN0cnVjdHVyZSdzIF9fbmV3X18gYW5kIF9faW5pdF9fCiAgICAgICAgIHkgPSBZKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHkueC5hLCB5LnguYiksICgwLCAwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeS54Lm5ld193YXNfY2FsbGVkLCBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoeS54LmEsIHkueC5iKSwgKDAsIDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkueC5uZXdfd2FzX2NhbGxlZCwgRmFsc2UpCiAKICAgICAgICAgIyBCdXQgZXhwbGljaXRlbHkgY3JlYXRpbmcgYW4gWCBzdHJ1Y3R1cmUgY2FsbHMgX19uZXdfXyBhbmQgX19pbml0X18sIG9mIGNvdXJzZS4KICAgICAgICAgeCA9IFgoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoeC5hLCB4LmIpLCAoOSwgMTIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4Lm5ld193YXNfY2FsbGVkLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4LmEsIHguYiksICg5LCAxMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5uZXdfd2FzX2NhbGxlZCwgVHJ1ZSkKIAogICAgICAgICB5LnggPSB4Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh5LnguYSwgeS54LmIpLCAoOSwgMTIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh5LngubmV3X3dhc19jYWxsZWQsIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh5LnguYSwgeS54LmIpLCAoOSwgMTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHkueC5uZXdfd2FzX2NhbGxlZCwgRmFsc2UpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlcm5hbHMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9pbnRlcm5hbHMucHkKaW5kZXggMDRiMjA0MC4uMDcwZGE0NiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfaW50ZXJuYWxzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2ludGVybmFscy5weQpAQCAtMTgsMjIgKzE4LDIyIEBACiAiIiIKIAogY2xhc3MgT2JqZWN0c1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgICBkZWYgZmFpbFVubGVzc1NhbWUoc2VsZiwgYSwgYik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGlkKGEpLCBpZChiKSkKKyAgICBkZWYgYXNzZXJ0VHJ1ZVNhbWUoc2VsZiwgYSwgYik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaWQoYSksIGlkKGIpKQogCiAgICAgZGVmIHRlc3RfaW50cyhzZWxmKToKICAgICAgICAgaSA9IDQyMDAwMTIzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDMsIGdyYyhpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBncmMoaSkpCiAgICAgICAgIGNpID0gY19pbnQoaSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMywgZ3JjKGkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjaS5fb2JqZWN0cywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBncmMoaSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2kuX29iamVjdHMsIE5vbmUpCiAKICAgICBkZWYgdGVzdF9jX2NoYXJfcChzZWxmKToKICAgICAgICAgcyA9ICJIZWxsbywgV29ybGQiCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDMsIGdyYyhzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBncmMocykpCiAgICAgICAgIGNzID0gY19jaGFyX3AocykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNCwgZ3JjKHMpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NTYW1lKGNzLl9vYmplY3RzLCBzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQsIGdyYyhzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlU2FtZShjcy5fb2JqZWN0cywgcykKIAogICAgIGRlZiB0ZXN0X3NpbXBsZV9zdHJ1Y3Qoc2VsZik6CiAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKQEAgLTQyLDEwICs0MiwxMCBAQAogICAgICAgICBhID0gNDIxMjM0CiAgICAgICAgIGIgPSA0MjEyMzUKICAgICAgICAgeCA9IFgoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4Ll9vYmplY3RzLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX29iamVjdHMsIE5vbmUpCiAgICAgICAgIHguYSA9IGEKICAgICAgICAgeC5iID0gYgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4Ll9vYmplY3RzLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguX29iamVjdHMsIE5vbmUpCiAKICAgICBkZWYgdGVzdF9lbWJlZGRlZF9zdHJ1Y3RzKHNlbGYpOgogICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CkBAIC01NSwxMyArNTUsMTMgQEAKICAgICAgICAgICAgIF9maWVsZHNfID0gWygieCIsIFgpLCAoInkiLCBYKV0KIAogICAgICAgICB5ID0gWSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHkuX29iamVjdHMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fb2JqZWN0cywgTm9uZSkKIAogICAgICAgICB4MSwgeDIgPSBYKCksIFgoKQogICAgICAgICB5LngsIHkueSA9IHgxLCB4MgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh5Ll9vYmplY3RzLCB7IjAiOiB7fSwgIjEiOiB7fX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fb2JqZWN0cywgeyIwIjoge30sICIxIjoge319KQogICAgICAgICB4MS5hLCB4Mi5iID0gNDIsIDkzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHkuX29iamVjdHMsIHsiMCI6IHt9LCAiMSI6IHt9fSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5Ll9vYmplY3RzLCB7IjAiOiB7fSwgIjEiOiB7fX0pCiAKICAgICBkZWYgdGVzdF94eHgoc2VsZik6CiAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKQEAgLTc2LDExICs3NiwxMSBAQAogICAgICAgICB4ID0gWCgpCiAgICAgICAgIHguYSA9IHMxCiAgICAgICAgIHguYiA9IHMyCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHguX29iamVjdHMsIHsiMCI6IHMxLCAiMSI6IHMyfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Ll9vYmplY3RzLCB7IjAiOiBzMSwgIjEiOiBzMn0pCiAKICAgICAgICAgeSA9IFkoKQogICAgICAgICB5LnggPSB4Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHkuX29iamVjdHMsIHsiMCI6IHsiMCI6IHMxLCAiMSI6IHMyfX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeS5fb2JqZWN0cywgeyIwIjogeyIwIjogczEsICIxIjogczJ9fSkKICMjICAgICAgICB4ID0geS54CiAjIyAgICAgICAgZGVsIHkKICMjICAgICAgICBwcmludCB4Ll9iX2Jhc2VfLl9vYmplY3RzCkBAIC05MSw3ICs5MSw3IEBACiAKICAgICAgICAgQSA9IGNfaW50KjQKICAgICAgICAgYSA9IEEoMTEsIDIyLCAzMywgNDQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGEuX29iamVjdHMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fb2JqZWN0cywgTm9uZSkKIAogICAgICAgICB4ID0gWCgpCiAgICAgICAgIHguZGF0YSA9IGEKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkKaW5kZXggODBiNmNhMi4uMDk1NWU3NiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkKQEAgLTkxLDcgKzkxLDcgQEAKICAgICBkZWYgdGVzdF9wX2NpbnQoc2VsZik6CiAgICAgICAgIGkgPSBjX2ludCg0MikKICAgICAgICAgeCA9IHBvaW50ZXIoaSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5fb2JqZWN0cywgeycxJzogaX0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fb2JqZWN0cywgeycxJzogaX0pCiAKIGNsYXNzIERlbGV0ZVBvaW50ZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIFhfdGVzdChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xpYmMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9saWJjLnB5CmluZGV4IDhkNTlmOTAuLjNkYzQ2M2YgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xpYmMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbGliYy5weQpAQCAtOSw5ICs5LDkgQEAKICAgICBkZWYgdGVzdF9zcXJ0KHNlbGYpOgogICAgICAgICBsaWIubXlfc3FydC5hcmd0eXBlcyA9IGNfZG91YmxlLAogICAgICAgICBsaWIubXlfc3FydC5yZXN0eXBlID0gY19kb3VibGUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGliLm15X3NxcnQoNC4wKSwgMi4wKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpYi5teV9zcXJ0KDQuMCksIDIuMCkKICAgICAgICAgaW1wb3J0IG1hdGgKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGliLm15X3NxcnQoMi4wKSwgbWF0aC5zcXJ0KDIuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGliLm15X3NxcnQoMi4wKSwgbWF0aC5zcXJ0KDIuMCkpCiAKICAgICBkZWYgdGVzdF9xc29ydChzZWxmKToKICAgICAgICAgY29tcGFyZWZ1bmMgPSBDRlVOQ1RZUEUoY19pbnQsIFBPSU5URVIoY19jaGFyKSwgUE9JTlRFUihjX2NoYXIpKQpAQCAtMjMsNyArMjMsNyBAQAogCiAgICAgICAgIGNoYXJzID0gY3JlYXRlX3N0cmluZ19idWZmZXIoInNwYW0sIHNwYW0sIGFuZCBzcGFtIikKICAgICAgICAgbGliLm15X3Fzb3J0KGNoYXJzLCBsZW4oY2hhcnMpLTEsIHNpemVvZihjX2NoYXIpLCBjb21wYXJlZnVuYyhzb3J0KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2hhcnMucmF3LCAiICAgLCxhYWFhZG1tbW5wcHBzc3NceDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjaGFycy5yYXcsICIgICAsLGFhYWFkbW1tbnBwcHNzc1x4MDAiKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkKaW5kZXggNzEyYjY1MC4uMjY2ODNkOCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CkBAIC00Myw3ICs0Myw3IEBACiAKICAgICBpZiBvcy5uYW1lIGluICgibnQiLCAiY2UiKToKICAgICAgICAgZGVmIHRlc3RfbG9hZF9saWJyYXJ5KHNlbGYpOgotICAgICAgICAgICAgc2VsZi5mYWlsSWYobGliY19uYW1lIGlzIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxpYmNfbmFtZSBpcyBOb25lKQogICAgICAgICAgICAgaWYgaXNfcmVzb3VyY2VfZW5hYmxlZCgicHJpbnRpbmciKToKICAgICAgICAgICAgICAgICBwcmludCBmaW5kX2xpYnJhcnkoImtlcm5lbDMyIikKICAgICAgICAgICAgICAgICBwcmludCBmaW5kX2xpYnJhcnkoInVzZXIzMiIpCkBAIC03MCw5ICs3MCw5IEBACiAgICAgICAgICAgICBhX25hbWUgPSBhZGRyZXNzb2YoZnVuY19uYW1lKQogICAgICAgICAgICAgZl9vcmRfYWRkciA9IGNfdm9pZF9wLmZyb21fYWRkcmVzcyhhX29yZCkudmFsdWUKICAgICAgICAgICAgIGZfbmFtZV9hZGRyID0gY192b2lkX3AuZnJvbV9hZGRyZXNzKGFfbmFtZSkudmFsdWUKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGhleChmX29yZF9hZGRyKSwgaGV4KGZfbmFtZV9hZGRyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGV4KGZfb3JkX2FkZHIpLCBoZXgoZl9uYW1lX2FkZHIpKQogCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGRsbC5fX2dldGl0ZW1fXywgMTIzNCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBkbGwuX19nZXRpdGVtX18sIDEyMzQpCiAKICAgICBpZiBvcy5uYW1lID09ICJudCI6CiAgICAgICAgIGRlZiB0ZXN0XzE3MDMyODZfQShzZWxmKToKQEAgLTk0LDEzICs5NCwxMyBAQAogICAgICAgICAgICAgYWR2YXBpMzIgPSB3aW5kbGwuYWR2YXBpMzIKICAgICAgICAgICAgICMgQ2FsbGluZyBDbG9zZUV2ZW50TG9nIHdpdGggYSBOVUxMIGFyZ3VtZW50IHNob3VsZCBmYWlsLAogICAgICAgICAgICAgIyBidXQgdGhlIGNhbGwgc2hvdWxkIG5vdCBzZWdmYXVsdCBvciBzby4KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIGFkdmFwaTMyLkNsb3NlRXZlbnRMb2coTm9uZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGFkdmFwaTMyLkNsb3NlRXZlbnRMb2coTm9uZSkpCiAgICAgICAgICAgICB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MuYXJndHlwZXMgPSBjX3ZvaWRfcCwgY19jaGFyX3AKICAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRQcm9jQWRkcmVzcy5yZXN0eXBlID0gY192b2lkX3AKICAgICAgICAgICAgIHByb2MgPSB3aW5kbGwua2VybmVsMzIuR2V0UHJvY0FkZHJlc3MoYWR2YXBpMzIuX2hhbmRsZSwgIkNsb3NlRXZlbnRMb2ciKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHByb2MpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvYykKICAgICAgICAgICAgICMgVGhpcyBpcyB0aGUgcmVhbCB0ZXN0OiBjYWxsIHRoZSBmdW5jdGlvbiB2aWEgJ2NhbGxfZnVuY3Rpb24nCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgwLCBjYWxsX2Z1bmN0aW9uKHByb2MsIChOb25lLCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBjYWxsX2Z1bmN0aW9uKHByb2MsIChOb25lLCkpKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbWFjaG9saWIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weQppbmRleCBmMmVlMDM1Li5lZGE4NDZkIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tYWNob2xpYi5weQpAQCAtNDgsMTQgKzQ4LDE0IEBACiAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgogICAgICAgICBkZWYgdGVzdF9maW5kKHNlbGYpOgogCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmaW5kX2xpYigncHRocmVhZCcpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmaW5kX2xpYigncHRocmVhZCcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy91c3IvbGliL2xpYlN5c3RlbS5CLmR5bGliJykKIAogICAgICAgICAgICAgcmVzdWx0ID0gZmluZF9saWIoJ3onKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlc3VsdC5zdGFydHN3aXRoKCcvdXNyL2xpYi9saWJ6LjEnKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXN1bHQuZW5kc3dpdGgoJy5keWxpYicpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC5zdGFydHN3aXRoKCcvdXNyL2xpYi9saWJ6LjEnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHQuZW5kc3dpdGgoJy5keWxpYicpKQogCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmaW5kX2xpYignSU9LaXQnKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmluZF9saWIoJ0lPS2l0JyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL1N5c3RlbS9MaWJyYXJ5L0ZyYW1ld29ya3MvSU9LaXQuZnJhbWV3b3JrL1ZlcnNpb25zL0EvSU9LaXQnKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbWVtZnVuY3Rpb25zLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbWVtZnVuY3Rpb25zLnB5CmluZGV4IGNiOTA5OWQuLmQwNzI2MDMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X21lbWZ1bmN0aW9ucy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9tZW1mdW5jdGlvbnMucHkKQEAgLTE5LDQ1ICsxOSw0NSBAQAogICAgICAgICBhID0gY3JlYXRlX3N0cmluZ19idWZmZXIoMTAwMDAwMCkKICAgICAgICAgcCA9ICJIZWxsbywgV29ybGQiCiAgICAgICAgIHJlc3VsdCA9IG1lbW1vdmUoYSwgcCwgbGVuKHApKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhLnZhbHVlLCAiSGVsbG8sIFdvcmxkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnZhbHVlLCAiSGVsbG8sIFdvcmxkIikKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJpbmdfYXQocmVzdWx0KSwgIkhlbGxvLCBXb3JsZCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmluZ19hdChyZXN1bHQsIDUpLCAiSGVsbG8iKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJpbmdfYXQocmVzdWx0LCAxNiksICJIZWxsbywgV29ybGRcMFwwXDBcMCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmluZ19hdChyZXN1bHQsIDApLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmdfYXQocmVzdWx0KSwgIkhlbGxvLCBXb3JsZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KHJlc3VsdCwgNSksICJIZWxsbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KHJlc3VsdCwgMTYpLCAiSGVsbG8sIFdvcmxkXDBcMFwwXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZ19hdChyZXN1bHQsIDApLCAiIikKIAogICAgIGRlZiB0ZXN0X21lbXNldChzZWxmKToKICAgICAgICAgYSA9IGNyZWF0ZV9zdHJpbmdfYnVmZmVyKDEwMDAwMDApCiAgICAgICAgIHJlc3VsdCA9IG1lbXNldChhLCBvcmQoJ3gnKSwgMTYpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGEudmFsdWUsICJ4eHh4eHh4eHh4eHh4eHh4IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnZhbHVlLCAieHh4eHh4eHh4eHh4eHh4eCIpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyaW5nX2F0KHJlc3VsdCksICJ4eHh4eHh4eHh4eHh4eHh4IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyaW5nX2F0KGEpLCAieHh4eHh4eHh4eHh4eHh4eCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmluZ19hdChhLCAyMCksICJ4eHh4eHh4eHh4eHh4eHh4XDBcMFwwXDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZ19hdChyZXN1bHQpLCAieHh4eHh4eHh4eHh4eHh4eCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KGEpLCAieHh4eHh4eHh4eHh4eHh4eCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nX2F0KGEsIDIwKSwgInh4eHh4eHh4eHh4eHh4eHhcMFwwXDBcMCIpCiAKICAgICBkZWYgdGVzdF9jYXN0KHNlbGYpOgogICAgICAgICBhID0gKGNfdWJ5dGUgKiAzMikoKm1hcChvcmQsICJhYmNkZWYiKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FzdChhLCBjX2NoYXJfcCkudmFsdWUsICJhYmNkZWYiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjYXN0KGEsIFBPSU5URVIoY19ieXRlKSlbOjddLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhc3QoYSwgY19jaGFyX3ApLnZhbHVlLCAiYWJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGEsIFBPSU5URVIoY19ieXRlKSlbOjddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNhc3QoYSwgUE9JTlRFUihjX2J5dGUpKVs6NzpdLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhc3QoYSwgUE9JTlRFUihjX2J5dGUpKVs6NzpdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOTcsIDk4LCA5OSwgMTAwLCAxMDEsIDEwMiwgMF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNhc3QoYSwgUE9JTlRFUihjX2J5dGUpKVs2Oi0xOi0xXSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXN0KGEsIFBPSU5URVIoY19ieXRlKSlbNjotMTotMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswLCAxMDIsIDEwMSwgMTAwLCA5OSwgOTgsIDk3XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FzdChhLCBQT0lOVEVSKGNfYnl0ZSkpWzo3OjJdLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhc3QoYSwgUE9JTlRFUihjX2J5dGUpKVs6NzoyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzk3LCA5OSwgMTAxLCAwXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2FzdChhLCBQT0lOVEVSKGNfYnl0ZSkpWzo3OjddLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNhc3QoYSwgUE9JTlRFUihjX2J5dGUpKVs6Nzo3XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzk3XSkKIAogICAgIGRlZiB0ZXN0X3N0cmluZ19hdChzZWxmKToKICAgICAgICAgcyA9IHN0cmluZ19hdCgiZm9vIGJhciIpCiAgICAgICAgICMgWFhYIFRoZSBmb2xsb3dpbmcgbWF5IGJlIHdyb25nLCBkZXBlbmRpbmcgb24gaG93IFB5dGhvbgogICAgICAgICAjIG1hbmFnZXMgc3RyaW5nIGluc3RhbmNlcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgyLCBzeXMuZ2V0cmVmY291bnQocykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLCAiZm9vIGJhciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgc3lzLmdldHJlZmNvdW50KHMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocywgImZvbyBiYXIiKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmluZ19hdCgiZm9vIGJhciIsIDgpLCAiZm9vIGJhclwwIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyaW5nX2F0KCJmb28gYmFyIiwgMyksICJmb28iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZ19hdCgiZm9vIGJhciIsIDgpLCAiZm9vIGJhclwwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmdfYXQoImZvbyBiYXIiLCAzKSwgImZvbyIpCiAKICAgICB0cnk6CiAgICAgICAgIGNyZWF0ZV91bmljb2RlX2J1ZmZlcgpAQCAtNjgsMTIgKzY4LDEyIEBACiAgICAgICAgICAgICBwID0gY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJIZWxsbywgV29ybGQiKQogICAgICAgICAgICAgYSA9IGNyZWF0ZV91bmljb2RlX2J1ZmZlcigxMDAwMDAwKQogICAgICAgICAgICAgcmVzdWx0ID0gbWVtbW92ZShhLCBwLCBsZW4ocCkgKiBzaXplb2YoY193Y2hhcikpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhLnZhbHVlLCAiSGVsbG8sIFdvcmxkIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS52YWx1ZSwgIkhlbGxvLCBXb3JsZCIpCiAKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdzdHJpbmdfYXQoYSksICJIZWxsbywgV29ybGQiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod3N0cmluZ19hdChhLCA1KSwgIkhlbGxvIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdzdHJpbmdfYXQoYSwgMTYpLCAiSGVsbG8sIFdvcmxkXDBcMFwwXDAiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod3N0cmluZ19hdChhLCAwKSwgIiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdzdHJpbmdfYXQoYSksICJIZWxsbywgV29ybGQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3c3RyaW5nX2F0KGEsIDUpLCAiSGVsbG8iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3c3RyaW5nX2F0KGEsIDE2KSwgIkhlbGxvLCBXb3JsZFwwXDBcMFwwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3N0cmluZ19hdChhLCAwKSwgIiIpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbnVtYmVycy5weQppbmRleCBkZmQ4NGVlLi5iNTE4NWJmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9udW1iZXJzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X251bWJlcnMucHkKQEAgLTU1LDI1ICs1NSwyNSBAQAogICAgIGRlZiB0ZXN0X2RlZmF1bHRfaW5pdChzZWxmKToKICAgICAgICAgIyBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IHRvIHplcm8KICAgICAgICAgZm9yIHQgaW4gc2lnbmVkX3R5cGVzICsgdW5zaWduZWRfdHlwZXMgKyBmbG9hdF90eXBlczoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHQoKS52YWx1ZSwgMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCgpLnZhbHVlLCAwKQogCiAgICAgZGVmIHRlc3RfdW5zaWduZWRfdmFsdWVzKHNlbGYpOgogICAgICAgICAjIHRoZSB2YWx1ZSBnaXZlbiB0byB0aGUgY29uc3RydWN0b3IgaXMgYXZhaWxhYmxlCiAgICAgICAgICMgYXMgdGhlICd2YWx1ZScgYXR0cmlidXRlCiAgICAgICAgIGZvciB0LCAobCwgaCkgaW4gemlwKHVuc2lnbmVkX3R5cGVzLCB1bnNpZ25lZF9yYW5nZXMpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodChsKS52YWx1ZSwgbCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHQoaCkudmFsdWUsIGgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQobCkudmFsdWUsIGwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQoaCkudmFsdWUsIGgpCiAKICAgICBkZWYgdGVzdF9zaWduZWRfdmFsdWVzKHNlbGYpOgogICAgICAgICAjIHNlZSBhYm92ZQogICAgICAgICBmb3IgdCwgKGwsIGgpIGluIHppcChzaWduZWRfdHlwZXMsIHNpZ25lZF9yYW5nZXMpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodChsKS52YWx1ZSwgbCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHQoaCkudmFsdWUsIGgpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQobCkudmFsdWUsIGwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQoaCkudmFsdWUsIGgpCiAKICAgICBkZWYgdGVzdF9ib29sX3ZhbHVlcyhzZWxmKToKICAgICAgICAgZnJvbSBvcGVyYXRvciBpbXBvcnQgdHJ1dGgKICAgICAgICAgZm9yIHQsIHYgaW4gemlwKGJvb2xfdHlwZXMsIGJvb2xfdmFsdWVzKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHQodikudmFsdWUsIHRydXRoKHYpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KHYpLnZhbHVlLCB0cnV0aCh2KSkKIAogICAgIGRlZiB0ZXN0X3R5cGVlcnJvcihzZWxmKToKICAgICAgICAgIyBPbmx5IG51bWJlcnMgYXJlIGFsbG93ZWQgaW4gdGhlIGNvbnRydWN0b3IsCkBAIC05MywxMyArOTMsMTMgQEAKICAgICAgICAgIyB0aGUgZnJvbV9wYXJhbSBjbGFzcyBtZXRob2QgYXR0cmlidXRlIGFsd2F5cwogICAgICAgICAjIHJldHVybnMgUHlDQXJnT2JqZWN0IGluc3RhbmNlcwogICAgICAgICBmb3IgdCBpbiBzaWduZWRfdHlwZXMgKyB1bnNpZ25lZF90eXBlcyArIGZsb2F0X3R5cGVzOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoQXJnVHlwZSwgdHlwZSh0LmZyb21fcGFyYW0oMCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChBcmdUeXBlLCB0eXBlKHQuZnJvbV9wYXJhbSgwKSkpCiAKICAgICBkZWYgdGVzdF9ieXJlZihzZWxmKToKICAgICAgICAgIyBjYWxsaW5nIGJ5cmVmIHJldHVybnMgYWxzbyBhIFB5Q0FyZ09iamVjdCBpbnN0YW5jZQogICAgICAgICBmb3IgdCBpbiBzaWduZWRfdHlwZXMgKyB1bnNpZ25lZF90eXBlcyArIGZsb2F0X3R5cGVzICsgYm9vbF90eXBlczoKICAgICAgICAgICAgIHBhcm0gPSBieXJlZih0KCkpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChBcmdUeXBlLCB0eXBlKHBhcm0pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChBcmdUeXBlLCB0eXBlKHBhcm0pKQogCiAKICAgICBkZWYgdGVzdF9mbG9hdHMoc2VsZik6CkBAIC0xMTAsMTAgKzExMCwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiAyLjAKICAgICAgICAgZiA9IEZsb2F0TGlrZSgpCiAgICAgICAgIGZvciB0IGluIGZsb2F0X3R5cGVzOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodCgyLjApLnZhbHVlLCAyLjApCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0KDIpLnZhbHVlLCAyLjApCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0KDJMKS52YWx1ZSwgMi4wKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodChmKS52YWx1ZSwgMi4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KDIuMCkudmFsdWUsIDIuMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCgyKS52YWx1ZSwgMi4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KDJMKS52YWx1ZSwgMi4wKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KGYpLnZhbHVlLCAyLjApCiAKICAgICBkZWYgdGVzdF9pbnRlZ2VycyhzZWxmKToKICAgICAgICAgY2xhc3MgRmxvYXRMaWtlKG9iamVjdCk6CkBAIC0xMjksNyArMTI5LDcgQEAKICAgICAgICAgZm9yIHQgaW4gc2lnbmVkX3R5cGVzICsgdW5zaWduZWRfdHlwZXM6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQsIDMuMTQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHQsIGYpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0KGkpLnZhbHVlLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0KGkpLnZhbHVlLCAyKQogCiAgICAgZGVmIHRlc3Rfc2l6ZXMoc2VsZik6CiAgICAgICAgIGZvciB0IGluIHNpZ25lZF90eXBlcyArIHVuc2lnbmVkX3R5cGVzICsgZmxvYXRfdHlwZXMgKyBib29sX3R5cGVzOgpAQCAtMTM4LDkgKzEzOCw5IEBACiAgICAgICAgICAgICBleGNlcHQgc3RydWN0LmVycm9yOgogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAjIHNpemVvZiBvZiB0aGUgdHlwZS4uLgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKHQpLCBzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YodCksIHNpemUpCiAgICAgICAgICAgICAjIGFuZCBzaXplb2Ygb2YgYW4gaW5zdGFuY2UKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZih0KCkpLCBzaXplKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YodCgpKSwgc2l6ZSkKIAogICAgIGRlZiB0ZXN0X2FsaWdubWVudHMoc2VsZik6CiAgICAgICAgIGZvciB0IGluIHNpZ25lZF90eXBlcyArIHVuc2lnbmVkX3R5cGVzICsgZmxvYXRfdHlwZXM6CkBAIC0xNDgsMTAgKzE0OCwxMCBAQAogICAgICAgICAgICAgYWxpZ24gPSBzdHJ1Y3QuY2FsY3NpemUoImMlYyIgJSBjb2RlKSAtIHN0cnVjdC5jYWxjc2l6ZShjb2RlKQogCiAgICAgICAgICAgICAjIGFsaWdubWVudCBvZiB0aGUgdHlwZS4uLgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKGNvZGUsIGFsaWdubWVudCh0KSksCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChjb2RlLCBhbGlnbm1lbnQodCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvZGUsIGFsaWduKSkKICAgICAgICAgICAgICMgYW5kIGFsaWdubWVudCBvZiBhbiBpbnN0YW5jZQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKGNvZGUsIGFsaWdubWVudCh0KCkpKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNvZGUsIGFsaWdubWVudCh0KCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb2RlLCBhbGlnbikpCiAKICAgICBkZWYgdGVzdF9pbnRfZnJvbV9hZGRyZXNzKHNlbGYpOgpAQCAtMTY3LDEyICsxNjcsMTIgQEAKIAogICAgICAgICAgICAgIyB2IG5vdyBpcyBhbiBpbnRlZ2VyIGF0IGFuICdleHRlcm5hbCcgbWVtb3J5IGxvY2F0aW9uCiAgICAgICAgICAgICB2ID0gdC5mcm9tX2FkZHJlc3MoYS5idWZmZXJfaW5mbygpWzBdKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodi52YWx1ZSwgYVswXSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodiksIHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYudmFsdWUsIGFbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodiksIHQpCiAKICAgICAgICAgICAgICMgY2hhbmdpbmcgdGhlIHZhbHVlIGF0IHRoZSBtZW1vcnkgbG9jYXRpb24gY2hhbmdlcyB2J3MgdmFsdWUgYWxzbwogICAgICAgICAgICAgYVswXSA9IDQyCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQogCiAKICAgICBkZWYgdGVzdF9mbG9hdF9mcm9tX2FkZHJlc3Moc2VsZik6CkBAIC0xODAsMTEgKzE4MCwxMSBAQAogICAgICAgICBmb3IgdCBpbiBmbG9hdF90eXBlczoKICAgICAgICAgICAgIGEgPSBhcnJheSh0Ll90eXBlXywgWzMuMTRdKQogICAgICAgICAgICAgdiA9IHQuZnJvbV9hZGRyZXNzKGEuYnVmZmVyX2luZm8oKVswXSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHYudmFsdWUsIGFbMF0pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZSh2KSBpcyB0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodikgaXMgdCkKICAgICAgICAgICAgIGFbMF0gPSAyLjM0NTZlMTcKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHYudmFsdWUsIGFbMF0pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZSh2KSBpcyB0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodikgaXMgdCkKIAogICAgIGRlZiB0ZXN0X2NoYXJfZnJvbV9hZGRyZXNzKHNlbGYpOgogICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY19jaGFyCkBAIC0xOTIsMTEgKzE5MiwxMSBAQAogCiAgICAgICAgIGEgPSBhcnJheSgnYycsICd4JykKICAgICAgICAgdiA9IGNfY2hhci5mcm9tX2FkZHJlc3MoYS5idWZmZXJfaW5mbygpWzBdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnZhbHVlLCBhWzBdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZSh2KSBpcyBjX2NoYXIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi52YWx1ZSwgYVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodikgaXMgY19jaGFyKQogCiAgICAgICAgIGFbMF0gPSAnPycKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodi52YWx1ZSwgYVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnZhbHVlLCBhWzBdKQogCiAgICAgIyBhcnJheSBkb2VzIG5vdCBzdXBwb3J0IGNfYm9vbCAvICd0JwogICAgICMgZGVmIHRlc3RfYm9vbF9mcm9tX2FkZHJlc3Moc2VsZik6CkBAIC0yMDQsMTEgKzIwNCwxMSBAQAogICAgICMgICAgIGZyb20gYXJyYXkgaW1wb3J0IGFycmF5CiAgICAgIyAgICAgYSA9IGFycmF5KGNfYm9vbC5fdHlwZV8sIFtUcnVlXSkKICAgICAjICAgICB2ID0gdC5mcm9tX2FkZHJlc3MoYS5idWZmZXJfaW5mbygpWzBdKQotICAgICMgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHYudmFsdWUsIGFbMF0pCi0gICAgIyAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2KSBpcyB0KQorICAgICMgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi52YWx1ZSwgYVswXSkKKyAgICAjICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUodikgaXMgdCkKICAgICAjICAgICBhWzBdID0gRmFsc2UKLSAgICAjICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnZhbHVlLCBhWzBdKQotICAgICMgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodikgaXMgdCkKKyAgICAjICAgICBzZWxmLmFzc2VydEVxdWFsKHYudmFsdWUsIGFbMF0pCisgICAgIyAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHYpIGlzIHQpCiAKICAgICBkZWYgdGVzdF9pbml0KHNlbGYpOgogICAgICAgICAjIGNfaW50KCkgY2FuIGJlIGluaXRpYWxpemVkIGZyb20gUHl0aG9uJ3MgaW50LCBhbmQgY19pbnQuCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGFyYW1ldGVycy5weQppbmRleCAxYjdmMGRjLi42OWRiMTRmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wYXJhbWV0ZXJzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BhcmFtZXRlcnMucHkKQEAgLTMzLDggKzMzLDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgKiA0CiAgICAgICAgICAgICBmcm9tX3BhcmFtID0gY2xhc3NtZXRob2QoZnJvbV9wYXJhbSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChDVk9JRFAuZnJvbV9wYXJhbSgiYWJjIiksICJhYmNhYmMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChDQ0hBUlAuZnJvbV9wYXJhbSgiYWJjIiksICJhYmNhYmNhYmNhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKENWT0lEUC5mcm9tX3BhcmFtKCJhYmMiKSwgImFiY2FiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ0NIQVJQLmZyb21fcGFyYW0oImFiYyIpLCAiYWJjYWJjYWJjYWJjIikKIAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgY193Y2hhcl9wCkBAIC00Niw3ICs0Niw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlICogMwogICAgICAgICAgICAgZnJvbV9wYXJhbSA9IGNsYXNzbWV0aG9kKGZyb21fcGFyYW0pCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoQ1dDSEFSUC5mcm9tX3BhcmFtKCJhYmMiKSwgImFiY2FiY2FiYyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQ1dDSEFSUC5mcm9tX3BhcmFtKCJhYmMiKSwgImFiY2FiY2FiYyIpCiAKICAgICAjIFhYWCBSZXBsYWNlIGJ5IGNfY2hhcl9wIHRlc3RzCiAgICAgZGVmIHRlc3RfY3N0cmluZ3Moc2VsZik6CkBAIC01NSwxMCArNTUsMTAgQEAKICAgICAgICAgIyBjX2NoYXJfcC5mcm9tX3BhcmFtIG9uIGEgUHl0aG9uIFN0cmluZyBwYWNrcyB0aGUgc3RyaW5nCiAgICAgICAgICMgaW50byBhIGNwYXJhbSBvYmplY3QKICAgICAgICAgcyA9ICIxMjMiCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2NoYXJfcC5mcm9tX3BhcmFtKHMpLl9vYmogaXMgcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfY2hhcl9wLmZyb21fcGFyYW0ocykuX29iaiBpcyBzKQogCiAgICAgICAgICMgbmV3IGluIDAuOS4xOiBjb252ZXJ0IChlbmNvZGUpIHVuaWNvZGUgdG8gYXNjaWkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY19jaGFyX3AuZnJvbV9wYXJhbSh1IjEyMyIpLl9vYmosICIxMjMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfY2hhcl9wLmZyb21fcGFyYW0odSIxMjMiKS5fb2JqLCAiMTIzIikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBjX2NoYXJfcC5mcm9tX3BhcmFtLCB1IjEyM1wzNzciKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY19jaGFyX3AuZnJvbV9wYXJhbSwgNDIpCkBAIC02Niw3ICs2Niw3IEBACiAgICAgICAgICMgY2FsbGluZyBjX2NoYXJfcC5mcm9tX3BhcmFtIHdpdGggYSBjX2NoYXJfcCBpbnN0YW5jZQogICAgICAgICAjIHJldHVybnMgdGhlIGFyZ3VtZW50IGl0c2VsZjoKICAgICAgICAgYSA9IGNfY2hhcl9wKCIxMjMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19jaGFyX3AuZnJvbV9wYXJhbShhKSBpcyBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19jaGFyX3AuZnJvbV9wYXJhbShhKSBpcyBhKQogCiAgICAgZGVmIHRlc3RfY3dfc3RyaW5ncyhzZWxmKToKICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGJ5cmVmCkBAIC03NywxNSArNzcsMTUgQEAKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBzID0gdSIxMjMiCiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfd2NoYXJfcC5mcm9tX3BhcmFtKHMpLl9vYmogaXMgcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3djaGFyX3AuZnJvbV9wYXJhbShzKS5fb2JqIGlzIHMpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfd2NoYXJfcC5mcm9tX3BhcmFtLCA0MikKIAogICAgICAgICAgICAgIyBuZXcgaW4gMC45LjE6IGNvbnZlcnQgKGRlY29kZSkgYXNjaWkgdG8gdW5pY29kZQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY193Y2hhcl9wLmZyb21fcGFyYW0oIjEyMyIpLl9vYmosIHUiMTIzIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY193Y2hhcl9wLmZyb21fcGFyYW0oIjEyMyIpLl9vYmosIHUiMTIzIikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBjX3djaGFyX3AuZnJvbV9wYXJhbSwgIjEyM1wzNzciKQogCiAgICAgICAgIHBhID0gY193Y2hhcl9wLmZyb21fcGFyYW0oY193Y2hhcl9wKHUiMTIzIikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUocGEpLCBjX3djaGFyX3ApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShwYSksIGNfd2NoYXJfcCkKIAogICAgIGRlZiB0ZXN0X2ludF9wb2ludGVycyhzZWxmKToKICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfc2hvcnQsIGNfdWludCwgY19pbnQsIGNfbG9uZywgUE9JTlRFUiwgcG9pbnRlcgpAQCAtOTQsMTAgKzk0LDEwIEBACiAjIyAgICAgICAgcCA9IHBvaW50ZXIoY19pbnQoNDIpKQogIyMgICAgICAgIHggPSBMUElOVC5mcm9tX3BhcmFtKHApCiAgICAgICAgIHggPSBMUElOVC5mcm9tX3BhcmFtKHBvaW50ZXIoY19pbnQoNDIpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5jb250ZW50cy52YWx1ZSwgNDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKExQSU5UKGNfaW50KDQyKSkuY29udGVudHMudmFsdWUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguY29udGVudHMudmFsdWUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKExQSU5UKGNfaW50KDQyKSkuY29udGVudHMudmFsdWUsIDQyKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKExQSU5ULmZyb21fcGFyYW0oTm9uZSksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTFBJTlQuZnJvbV9wYXJhbShOb25lKSwgMCkKIAogICAgICAgICBpZiBjX2ludCAhPSBjX2xvbmc6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIExQSU5ULmZyb21fcGFyYW0sIHBvaW50ZXIoY19sb25nKDQyKSkpCkBAIC0xMzMsOCArMTMzLDggQEAKICAgICAgICAgZnJvbSBjdHlwZXMgaW1wb3J0IGNfc2hvcnQsIGNfdWludCwgY19pbnQsIGNfbG9uZywgUE9JTlRFUgogICAgICAgICBJTlRBUlJBWSA9IGNfaW50ICogMwogICAgICAgICBpYSA9IElOVEFSUkFZKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKGlhKSwgMykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoW2lhW2ldIGZvciBpIGluIHJhbmdlKDMpXSwgWzAsIDAsIDBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihpYSksIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2lhW2ldIGZvciBpIGluIHJhbmdlKDMpXSwgWzAsIDAsIDBdKQogCiAgICAgICAgICMgUG9pbnRlcnMgYXJlIG9ubHkgY29tcGF0aWJsZSB3aXRoIGFycmF5cyBjb250YWluaW5nIGl0ZW1zIG9mCiAgICAgICAgICMgdGhlIHNhbWUgdHlwZSEKQEAgLTE2MSw4ICsxNjEsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBOb25lCiAKICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IChBZGFwdGVyKCksKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKE5vbmUpLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKG9iamVjdCgpKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKE5vbmUpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMob2JqZWN0KCkpLCBOb25lKQogCiAgICAgICAgIGNsYXNzIEFkYXB0ZXIob2JqZWN0KToKICAgICAgICAgICAgIGRlZiBmcm9tX3BhcmFtKGNscywgb2JqKToKQEAgLTE3MSw3ICsxNzEsNyBAQAogICAgICAgICBmdW5jLmFyZ3R5cGVzID0gKEFkYXB0ZXIoKSwpCiAgICAgICAgICMgZG9uJ3Qga25vdyBob3cgdG8gY29udmVydCBwYXJhbWV0ZXIgMQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBmdW5jLCBvYmplY3QoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZnVuYyhjX3ZvaWRfcCg0MikpLCA0MikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmdW5jKGNfdm9pZF9wKDQyKSksIDQyKQogCiAgICAgICAgIGNsYXNzIEFkYXB0ZXIob2JqZWN0KToKICAgICAgICAgICAgIGRlZiBmcm9tX3BhcmFtKGNscywgb2JqKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wZXAzMTE4LnB5CmluZGV4IDRmZjJjM2UuLmEwMTViNzQgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BlcDMxMTgucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGVwMzExOC5weQpAQCAtNDUsMjAgKzQ1LDIwIEBACiAgICAgICAgICAgICBvYiA9IHRwKCkKICAgICAgICAgICAgIHYgPSBtZW1vcnl2aWV3KG9iKQogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG5vcm1hbGl6ZSh2LmZvcm1hdCksIG5vcm1hbGl6ZShmbXQpKQotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHYuc2l6ZSwgc2l6ZW9mKG9iKSkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2Lml0ZW1zaXplLCBzaXplb2YoaXRlbXRwKSkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnNoYXBlLCBzaGFwZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vcm1hbGl6ZSh2LmZvcm1hdCksIG5vcm1hbGl6ZShmbXQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi5zaXplLCBzaXplb2Yob2IpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodi5pdGVtc2l6ZSwgc2l6ZW9mKGl0ZW10cCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnNoYXBlLCBzaGFwZSkKICAgICAgICAgICAgICAgICAjIGN0eXBlcyBvYmplY3QgYWx3YXlzIGhhdmUgYSBub24tc3RyaWRlZCBtZW1vcnkgYmxvY2sKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnN0cmlkZXMsIE5vbmUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnN0cmlkZXMsIE5vbmUpCiAgICAgICAgICAgICAgICAgIyB0aGV5IGFyZSBhbHdheXMgcmVhZC93cml0ZQotICAgICAgICAgICAgICAgIHNlbGYuZmFpbElmKHYucmVhZG9ubHkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh2LnJlYWRvbmx5KQogCiAgICAgICAgICAgICAgICAgaWYgdi5zaGFwZToKICAgICAgICAgICAgICAgICAgICAgbiA9IDEKICAgICAgICAgICAgICAgICAgICAgZm9yIGRpbSBpbiB2LnNoYXBlOgogICAgICAgICAgICAgICAgICAgICAgICAgbiA9IG4gKiBkaW0KLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodi5pdGVtc2l6ZSAqIG4sIHYuc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2Lml0ZW1zaXplICogbiwgdi5zaXplKQogICAgICAgICAgICAgZXhjZXB0OgogICAgICAgICAgICAgICAgICMgc28gdGhhdCB3ZSBjYW4gc2VlIHRoZSBmYWlsaW5nIHR5cGUKICAgICAgICAgICAgICAgICBwcmludCh0cCkKQEAgLTY5LDIwICs2OSwyMCBAQAogICAgICAgICAgICAgb2IgPSB0cCgpCiAgICAgICAgICAgICB2ID0gbWVtb3J5dmlldyhvYikKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LmZvcm1hdCwgZm10KQotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHYuc2l6ZSwgc2l6ZW9mKG9iKSkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2Lml0ZW1zaXplLCBzaXplb2YoaXRlbXRwKSkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2LnNoYXBlLCBzaGFwZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYuZm9ybWF0LCBmbXQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LnNpemUsIHNpemVvZihvYikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2Lml0ZW1zaXplLCBzaXplb2YoaXRlbXRwKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYuc2hhcGUsIHNoYXBlKQogICAgICAgICAgICAgICAgICMgY3R5cGVzIG9iamVjdCBhbHdheXMgaGF2ZSBhIG5vbi1zdHJpZGVkIG1lbW9yeSBibG9jawotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHYuc3RyaWRlcywgTm9uZSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYuc3RyaWRlcywgTm9uZSkKICAgICAgICAgICAgICAgICAjIHRoZXkgYXJlIGFsd2F5cyByZWFkL3dyaXRlCi0gICAgICAgICAgICAgICAgc2VsZi5mYWlsSWYodi5yZWFkb25seSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHYucmVhZG9ubHkpCiAKICAgICAgICAgICAgICAgICBpZiB2LnNoYXBlOgogICAgICAgICAgICAgICAgICAgICBuID0gMQogICAgICAgICAgICAgICAgICAgICBmb3IgZGltIGluIHYuc2hhcGU6CiAgICAgICAgICAgICAgICAgICAgICAgICBuID0gbiAqIGRpbQotICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2Lml0ZW1zaXplICogbiwgdi5zaXplKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYuaXRlbXNpemUgKiBuLCB2LnNpemUpCiAgICAgICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgICAgICAgIyBzbyB0aGF0IHdlIGNhbiBzZWUgdGhlIGZhaWxpbmcgdHlwZQogICAgICAgICAgICAgICAgIHByaW50KHRwKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcGlja2xpbmcucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9waWNrbGluZy5weQppbmRleCAyODg2OGY0Li5kZWUyMDYwIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9waWNrbGluZy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9waWNrbGluZy5weQpAQCAtMjcsOCArMjcsOCBAQAogICAgICAgICAgICAgY19kb3VibGUoMy4xNCksCiAgICAgICAgICAgICBdOgogICAgICAgICAgICAgZHN0ID0gc2VsZi5sb2FkcyhzZWxmLmR1bXBzKHNyYykpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzcmMuX19kaWN0X18sIGRzdC5fX2RpY3RfXykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1ZmZlcihzcmMpWzpdLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcmMuX19kaWN0X18sIGRzdC5fX2RpY3RfXykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmZmVyKHNyYylbOl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIoZHN0KVs6XSkKIAogICAgIGRlZiB0ZXN0X3N0cnVjdChzZWxmKToKQEAgLTM2LDE3ICszNiwxNyBAQAogCiAgICAgICAgIHggPSBYKCkKICAgICAgICAgeC5hID0gNDIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5pbml0X2NhbGxlZCwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmluaXRfY2FsbGVkLCAxKQogCiAgICAgICAgIHkgPSBzZWxmLmxvYWRzKHNlbGYuZHVtcHMoeCkpCiAKICAgICAgICAgIyBsb2FkcyBtdXN0IE5PVCBjYWxsIF9faW5pdF9fCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFguaW5pdF9jYWxsZWQsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5pbml0X2NhbGxlZCwgMSkKIAogICAgICAgICAjIGN0eXBlcyBpbnN0YW5jZXMgYXJlIGlkZW50aWNhbCB3aGVuIHRoZSBpbnN0YW5jZSBfX2RpY3RfXwogICAgICAgICAjIGFuZCB0aGUgbWVtb3J5IGJ1ZmZlciBhcmUgaWRlbnRpY2FsCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHkuX19kaWN0X18sIHguX19kaWN0X18pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1ZmZlcih5KVs6XSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5Ll9fZGljdF9fLCB4Ll9fZGljdF9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1ZmZlcih5KVs6XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKHgpWzpdKQogCiAgICAgZGVmIHRlc3RfdW5waWNrYWJsZShzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkKaW5kZXggMDc2Y2Q4Yi4uOTJiOGNlNiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkKQEAgLTE3LDcgKzE3LDcgQEAKIAogICAgICAgICBQT0lOVEVSKGNfdWxvbmcpKGNfdWxvbmcoMjIpKQogICAgICAgICAjIFBvaW50ZXIgY2FuJ3Qgc2V0IGNvbnRlbnRzOiBoYXMgbm8gX3R5cGVfCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIEEsIGNfdWxvbmcoMzMpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEEsIGNfdWxvbmcoMzMpKQogCiAgICAgZGVmIHRlc3RfcGFzc19wb2ludGVycyhzZWxmKToKICAgICAgICAgZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCkBAIC0yNywxMiArMjcsMTIgQEAKICAgICAgICAgaSA9IGNfaW50KDEyMzQ1Njc4KQogIyMgICAgICAgIGZ1bmMuYXJndHlwZXMgPSAoUE9JTlRFUihjX2ludCksKQogICAgICAgICBhZGRyZXNzID0gZnVuYyhieXJlZihpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY19pbnQuZnJvbV9hZGRyZXNzKGFkZHJlc3MpLnZhbHVlLCAxMjM0NTY3OCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX2ludC5mcm9tX2FkZHJlc3MoYWRkcmVzcykudmFsdWUsIDEyMzQ1Njc4KQogCiAgICAgICAgIGZ1bmMucmVzdHlwZSA9IFBPSU5URVIoY19pbnQpCiAgICAgICAgIHJlcyA9IGZ1bmMocG9pbnRlcihpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLmNvbnRlbnRzLnZhbHVlLCAxMjM0NTY3OCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzBdLCAxMjM0NTY3OCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMuY29udGVudHMudmFsdWUsIDEyMzQ1Njc4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1swXSwgMTIzNDU2NzgpCiAKICAgICBkZWYgdGVzdF9jaGFuZ2VfcG9pbnRlcnMoc2VsZik6CiAgICAgICAgIGRsbCA9IENETEwoX2N0eXBlc190ZXN0Ll9fZmlsZV9fKQpAQCAtNDMsMTggKzQzLDE4IEBACiAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSAoUE9JTlRFUihjX2ludCksKQogCiAgICAgICAgIHJlcyA9IGZ1bmMocG9pbnRlcihpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzBdLCA4NzY1NCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLmNvbnRlbnRzLnZhbHVlLCA4NzY1NCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbMF0sIDg3NjU0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcy5jb250ZW50cy52YWx1ZSwgODc2NTQpCiAKICAgICAgICAgIyBDIGNvZGU6ICpyZXMgPSA1NDM0NQogICAgICAgICByZXNbMF0gPSA1NDM0NQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChpLnZhbHVlLCA1NDM0NSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpLnZhbHVlLCA1NDM0NSkKIAogICAgICAgICAjIEMgY29kZToKICAgICAgICAgIyAgIGludCB4ID0gMTIzMjE7CiAgICAgICAgICMgICByZXMgPSAmeAogICAgICAgICByZXMuY29udGVudHMgPSBjX2ludCgxMjMyMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaS52YWx1ZSwgNTQzNDUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaS52YWx1ZSwgNTQzNDUpCiAKICAgICBkZWYgdGVzdF9jYWxsYmFja3Nfd2l0aF9wb2ludGVycyhzZWxmKToKICAgICAgICAgIyBhIGZ1bmN0aW9uIHR5cGUgcmVjZWl2aW5nIGEgcG9pbnRlcgpAQCAtNzgsNyArNzgsNyBAQAogCiAjIyAgICAgICAgaSA9IGNfaW50KDQyKQogIyMgICAgICAgIGNhbGxiYWNrKGJ5cmVmKGkpKQotIyMgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpLnZhbHVlID09IDg0KQorIyMgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpLnZhbHVlID09IDg0KQogCiAgICAgICAgIGRvaXQoY2FsbGJhY2spCiAjIyAgICAgICAgcHJpbnQgc2VsZi5yZXN1bHQKQEAgLTkxLDExICs5MSwxMSBAQAogICAgICAgICAgICAgaSA9IGN0KDQyKQogICAgICAgICAgICAgcCA9IHBvaW50ZXIoaSkKICMjICAgICAgICAgICAgcHJpbnQgdHlwZShwLmNvbnRlbnRzKSwgY3QKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKHAuY29udGVudHMpIGlzIGN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUocC5jb250ZW50cykgaXMgY3QpCiAgICAgICAgICAgICAjIHAuY29udGVudHMgaXMgdGhlIHNhbWUgYXMgcFswXQogIyMgICAgICAgICAgICBwcmludCBwLmNvbnRlbnRzCi0jIyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhwLmNvbnRlbnRzID09IDQyKQotIyMgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MocFswXSA9PSA0MikKKyMjICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAuY29udGVudHMgPT0gNDIpCisjIyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwWzBdID09IDQyKQogCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRlbGl0ZW0sIHAsIDApCiAKQEAgLTExNyw5ICsxMTcsOSBAQAogCiAgICAgICAgIHB0ID0gcG9pbnRlcihUYWJsZSgxLCAyLCAzKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwdC5jb250ZW50cy5hLCAxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwdC5jb250ZW50cy5iLCAyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwdC5jb250ZW50cy5jLCAzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHB0LmNvbnRlbnRzLmEsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHQuY29udGVudHMuYiwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwdC5jb250ZW50cy5jLCAzKQogCiAgICAgICAgIHB0LmNvbnRlbnRzLmMgPSAzMwogCkBAIC0xMzAsOCArMTMwLDggQEAKICAgICAgICAgcCA9IHBvaW50ZXIoY19pbnQoNDIpKQogICAgICAgICAjIEFsdGhvdWdoIGEgcG9pbnRlciBjYW4gYmUgaW5kZXhlZCwgaXQgaGEgbm8gbGVuZ3RoCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGVuLCBwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzBdLCA0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocC5jb250ZW50cy52YWx1ZSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFswXSwgNDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5jb250ZW50cy52YWx1ZSwgNDIpCiAKICAgICBkZWYgdGVzdF9jaGFycHAoc2VsZik6CiAgICAgICAgICIiIlRlc3QgdGhhdCBhIGNoYXJhY3RlciBwb2ludGVyLXRvLXBvaW50ZXIgaXMgY29ycmVjdGx5IHBhc3NlZCIiIgpAQCAtMTU2LDIwICsxNTYsMjAgQEAKICAgICAgICAgcHAgPSBwb2ludGVyKHApCiAgICAgICAgIHEgPSBwb2ludGVyKHkpCiAgICAgICAgIHBwWzBdID0gcSAgICAgICAgICMgPD09Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHBbMF0sIDYpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFswXSwgNikKICAgICBkZWYgdGVzdF9jX3ZvaWRfcChzZWxmKToKICAgICAgICAgIyBodHRwOi8vc291cmNlZm9yZ2UubmV0L3RyYWNrZXIvP2Z1bmM9ZGV0YWlsJmFpZD0xNTE4MTkwJmdyb3VwX2lkPTU0NzAmYXRpZD0xMDU0NzAKICAgICAgICAgaWYgc2l6ZW9mKGNfdm9pZF9wKSA9PSA0OgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY192b2lkX3AoMHhGRkZGRkZGRkwpLnZhbHVlLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGTCkudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZvaWRfcCgtMSkudmFsdWUpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGRkZGRkZGRkZMKS52YWx1ZSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY192b2lkX3AoMHhGRkZGRkZGRkZGRkZGRkZGTCkudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZvaWRfcCgtMSkudmFsdWUpCiAgICAgICAgIGVsaWYgc2l6ZW9mKGNfdm9pZF9wKSA9PSA4OgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY192b2lkX3AoMHhGRkZGRkZGRkwpLnZhbHVlLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGTCkudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGRkZGRkZGTCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNfdm9pZF9wKDB4RkZGRkZGRkZGRkZGRkZGRkwpLnZhbHVlLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3ZvaWRfcCgweEZGRkZGRkZGRkZGRkZGRkZMKS52YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfdm9pZF9wKC0xKS52YWx1ZSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNfdm9pZF9wKDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGTCkudmFsdWUsCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfdm9pZF9wKDB4RkZGRkZGRkZGRkZGRkZGRkZGRkZGRkZGTCkudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3ZvaWRfcCgtMSkudmFsdWUpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjX3ZvaWRfcCwgMy4xNCkgIyBtYWtlIHN1cmUgZmxvYXRzIGFyZSBOT1QgYWNjZXB0ZWQKQEAgLTE3NywxNiArMTc3LDE2IEBACiAKICAgICBkZWYgdGVzdF9wb2ludGVyc19ib29sKHNlbGYpOgogICAgICAgICAjIE5VTEwgcG9pbnRlcnMgaGF2ZSBhIGJvb2xlYW4gRmFsc2UgdmFsdWUsIG5vbi1OVUxMIHBvaW50ZXJzIFRydWUuCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJvb2woUE9JTlRFUihjX2ludCkoKSksIEZhbHNlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChib29sKHBvaW50ZXIoY19pbnQoKSkpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJvb2woUE9JTlRFUihjX2ludCkoKSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJvb2wocG9pbnRlcihjX2ludCgpKSksIFRydWUpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYm9vbChDRlVOQ1RZUEUoTm9uZSkoMCkpLCBGYWxzZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYm9vbChDRlVOQ1RZUEUoTm9uZSkoNDIpKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChib29sKENGVU5DVFlQRShOb25lKSgwKSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJvb2woQ0ZVTkNUWVBFKE5vbmUpKDQyKSksIFRydWUpCiAKICAgICAgICAgIyBDT00gbWV0aG9kcyBhcmUgYm9vbGVhbiBUcnVlOgogICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIndpbjMyIjoKICAgICAgICAgICAgIG10aCA9IFdJTkZVTkNUWVBFKE5vbmUpKDQyLCAibmFtZSIsICgpLCBOb25lKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYm9vbChtdGgpLCBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChib29sKG10aCksIFRydWUpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weQppbmRleCAzM2RlYWUzLi4wOWJhNjU1IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHkKQEAgLTU4LDIzICs1OCwyMyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmdW5jKCkKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZGV0YWlsczoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cihkZXRhaWxzKSwgInJlcXVpcmVkIGFyZ3VtZW50ICdpbnB1dCcgbWlzc2luZyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihkZXRhaWxzKSwgInJlcXVpcmVkIGFyZ3VtZW50ICdpbnB1dCcgbWlzc2luZyIpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIlR5cGVFcnJvciBub3QgcmFpc2VkIikKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKE5vbmUpLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKGlucHV0PU5vbmUpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoTm9uZSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyhpbnB1dD1Ob25lKSwgTm9uZSkKIAogCiAgICAgZGVmIHRlc3RfaW50X3BvaW50ZXJfYXJnKHNlbGYpOgogICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfcF9wCiAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfbG9uZwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgwLCBmdW5jKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGZ1bmMoMCkpCiAKICAgICAgICAgY2kgPSBjX2ludCgwKQogCiAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBQT0lOVEVSKGNfaW50KSwKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocG9zaXRpdmVfYWRkcmVzcyhhZGRyZXNzb2YoY2kpKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwb3NpdGl2ZV9hZGRyZXNzKGFkZHJlc3NvZihjaSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZV9hZGRyZXNzKGZ1bmMoYnlyZWYoY2kpKSkpCiAKICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfY2hhcl9wLApAQCAtOTEsNDUgKzkxLDQ1IEBACiAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfY2hhcl9wCiAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBQT0lOVEVSKGNfY2hhciksCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgZnVuYyhOb25lKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmMoIjEyMyIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChOb25lLCBmdW5jKGNfY2hhcl9wKE5vbmUpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmMoY19jaGFyX3AoIjEyMyIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKE5vbmUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKCIxMjMiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKGNfY2hhcl9wKE5vbmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyhjX2NoYXJfcCgiMTIzIikpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIxMjMiLCBmdW5jKGNfYnVmZmVyKCIxMjMiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIGZ1bmMoY19idWZmZXIoIjEyMyIpKSkKICAgICAgICAgY2EgPSBjX2NoYXIoImEiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYSIsIGZ1bmMocG9pbnRlcihjYSkpWzBdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYSIsIGZ1bmMoYnlyZWYoY2EpKVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYSIsIGZ1bmMocG9pbnRlcihjYSkpWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhieXJlZihjYSkpWzBdKQogCiAgICAgZGVmIHRlc3RfY19jaGFyX3BfYXJnKHNlbGYpOgogICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfcF9wCiAgICAgICAgIGZ1bmMucmVzdHlwZSA9IGNfY2hhcl9wCiAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBjX2NoYXJfcCwKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChOb25lLCBmdW5jKE5vbmUpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiMTIzIiwgZnVuYygiMTIzIikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGZ1bmMoY19jaGFyX3AoTm9uZSkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiMTIzIiwgZnVuYyhjX2NoYXJfcCgiMTIzIikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIGZ1bmMoIjEyMyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoY19jaGFyX3AoTm9uZSkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfY2hhcl9wKCIxMjMiKSkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmMoY19idWZmZXIoIjEyMyIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyhjX2J1ZmZlcigiMTIzIikpKQogICAgICAgICBjYSA9IGNfY2hhcigiYSIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhIiwgZnVuYyhieXJlZihjYSkpWzBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKGJ5cmVmKGNhKSlbMF0pCiAKICAgICBkZWYgdGVzdF9jX3ZvaWRfcF9hcmcoc2VsZik6CiAgICAgICAgIGZ1bmMgPSB0ZXN0ZGxsLl90ZXN0ZnVuY19wX3AKICAgICAgICAgZnVuYy5yZXN0eXBlID0gY19jaGFyX3AKICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfdm9pZF9wLAogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGZ1bmMoTm9uZSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIxMjMiLCBmdW5jKCIxMjMiKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmMoY19jaGFyX3AoIjEyMyIpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgZnVuYyhjX2NoYXJfcChOb25lKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYygiMTIzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIGZ1bmMoY19jaGFyX3AoIjEyMyIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKGNfY2hhcl9wKE5vbmUpKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiMTIzIiwgZnVuYyhjX2J1ZmZlcigiMTIzIikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfYnVmZmVyKCIxMjMiKSkpCiAgICAgICAgIGNhID0gY19jaGFyKCJhIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImEiLCBmdW5jKGJ5cmVmKGNhKSlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiYSIsIGZ1bmMoYnlyZWYoY2EpKVswXSkKIAogICAgICAgICBmdW5jKGJ5cmVmKGNfaW50KCkpKQogICAgICAgICBmdW5jKHBvaW50ZXIoY19pbnQoKSkpCkBAIC0xNDAsOCArMTQwLDggQEAKICAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGZ1bmMoY193Y2hhcl9wKE5vbmUpKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHUiMTIzIiwgZnVuYyhjX3djaGFyX3AodSIxMjMiKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoY193Y2hhcl9wKE5vbmUpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIxMjMiLCBmdW5jKGNfd2NoYXJfcCh1IjEyMyIpKSkKIAogICAgIGRlZiB0ZXN0X2luc3RhbmNlKHNlbGYpOgogICAgICAgICBmdW5jID0gdGVzdGRsbC5fdGVzdGZ1bmNfcF9wCkBAIC0xNTEsMTAgKzE1MSwxMCBAQAogICAgICAgICAgICAgX2FzX3BhcmFtZXRlcl8gPSBOb25lCiAKICAgICAgICAgZnVuYy5hcmd0eXBlcyA9IGNfdm9pZF9wLAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChOb25lLCBmdW5jKFgoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhYKCkpKQogCiAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBOb25lCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGZ1bmMoWCgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKFgoKSkpCiAKIHRyeToKICAgICBjX3djaGFyCkBAIC0xNzQsMTUgKzE3NCwxNSBAQAogICAgICAgICAgICAgZnVuYy5yZXN0eXBlID0gY193Y2hhcl9wCiAgICAgICAgICAgICBmdW5jLmFyZ3R5cGVzID0gUE9JTlRFUihjX3djaGFyKSwKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgZnVuYyhOb25lKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHUiMTIzIiwgZnVuYyh1IjEyMyIpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgZnVuYyhjX3djaGFyX3AoTm9uZSkpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodSIxMjMiLCBmdW5jKGNfd2NoYXJfcCh1IjEyMyIpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgZnVuYyhOb25lKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIxMjMiLCBmdW5jKHUiMTIzIikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIGZ1bmMoY193Y2hhcl9wKE5vbmUpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIxMjMiLCBmdW5jKGNfd2NoYXJfcCh1IjEyMyIpKSkKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodSIxMjMiLCBmdW5jKGNfd2J1ZmZlcih1IjEyMyIpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSIxMjMiLCBmdW5jKGNfd2J1ZmZlcih1IjEyMyIpKSkKICAgICAgICAgICAgIGNhID0gY193Y2hhcigiYSIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh1ImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHUiYSIsIGZ1bmMoYnlyZWYoY2EpKVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUiYSIsIGZ1bmMoYnlyZWYoY2EpKVswXSkKIAogICAgICAgICBkZWYgdGVzdF9jX3djaGFyX3BfYXJnKHNlbGYpOgogICAgICAgICAgICAgZnVuYyA9IHRlc3RkbGwuX3Rlc3RmdW5jX3BfcApAQCAtMTkxLDE2ICsxOTEsMTYgQEAKIAogICAgICAgICAgICAgY193Y2hhcl9wLmZyb21fcGFyYW0odSIxMjMiKQogCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChOb25lLCBmdW5jKE5vbmUpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmModSIxMjMiKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGZ1bmMoY193Y2hhcl9wKE5vbmUpKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCIxMjMiLCBmdW5jKGNfd2NoYXJfcCgiMTIzIikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKE5vbmUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiMTIzIiwgZnVuYyh1IjEyMyIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBmdW5jKGNfd2NoYXJfcChOb25lKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfd2NoYXJfcCgiMTIzIikpKQogCiAgICAgICAgICAgICAjIFhYWCBDdXJyZW50bHksIHRoZXNlIHJhaXNlIFR5cGVFcnJvcnMsIGFsdGhvdWdoIHRoZXkgc2hvdWxkbid0OgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjEyMyIsIGZ1bmMoY193YnVmZmVyKCIxMjMiKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIxMjMiLCBmdW5jKGNfd2J1ZmZlcigiMTIzIikpKQogICAgICAgICAgICAgY2EgPSBjX3djaGFyKCJhIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCJhIiwgZnVuYyhwb2ludGVyKGNhKSlbMF0pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgiYSIsIGZ1bmMoYnlyZWYoY2EpKVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKHBvaW50ZXIoY2EpKVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoImEiLCBmdW5jKGJ5cmVmKGNhKSlbMF0pCiAKIGNsYXNzIEFycmF5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3Qoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHl0aG9uX2FwaS5weQppbmRleCAyNjVlZTU1Li42OTgxNzBmIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9weXRob25fYXBpLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3B5dGhvbl9hcGkucHkKQEAgLTIzLDcgKzIzLDcgQEAKICAgICAgICAgUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUucmVzdHlwZSA9IHB5X29iamVjdAogICAgICAgICBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZS5hcmd0eXBlcyA9IGNfY2hhcl9wLCBjX3B5X3NzaXplX3QKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgiYWJjZGVmZ2hpIiwgMyksICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKCJhYmNkZWZnaGkiLCAzKSwgImFiYyIpCiAKICAgICBkZWYgdGVzdF9QeVN0cmluZ19Gcm9tU3RyaW5nKHNlbGYpOgogICAgICAgICBweXRob25hcGkuUHlTdHJpbmdfRnJvbVN0cmluZy5yZXN0eXBlID0gcHlfb2JqZWN0CkBAIC0zMiwxMCArMzIsMTAgQEAKICAgICAgICAgcyA9ICJhYmMiCiAgICAgICAgIHJlZmNudCA9IGdyYyhzKQogICAgICAgICBweW9iID0gcHl0aG9uYXBpLlB5U3RyaW5nX0Zyb21TdHJpbmcocykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKHMpLCByZWZjbnQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHMsIHB5b2IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKHMpLCByZWZjbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgcHlvYikKICAgICAgICAgZGVsIHB5b2IKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKHMpLCByZWZjbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ3JjKHMpLCByZWZjbnQpCiAKICAgICBpZiBpc19yZXNvdXJjZV9lbmFibGVkKCJyZWZjb3VudCIpOgogICAgICAgICAjIFRoaXMgdGVzdCBpcyB1bnJlbGlhYmxlLCBiZWNhdXNlIGl0IGlzIHBvc3NpYmxlIHRoYXQgY29kZSBpbgpAQCAtNDQsMjggKzQ0LDI4IEBACiAgICAgICAgIGRlZiB0ZXN0X1B5SW50X0xvbmcoc2VsZik6CiAgICAgICAgICAgICByZWY0MiA9IGdyYyg0MikKICAgICAgICAgICAgIHB5dGhvbmFwaS5QeUludF9Gcm9tTG9uZy5yZXN0eXBlID0gcHlfb2JqZWN0Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChweXRob25hcGkuUHlJbnRfRnJvbUxvbmcoNDIpLCA0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHl0aG9uYXBpLlB5SW50X0Zyb21Mb25nKDQyKSwgNDIpCiAKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyg0MiksIHJlZjQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoNDIpLCByZWY0MikKIAogICAgICAgICAgICAgcHl0aG9uYXBpLlB5SW50X0FzTG9uZy5hcmd0eXBlcyA9IChweV9vYmplY3QsKQogICAgICAgICAgICAgcHl0aG9uYXBpLlB5SW50X0FzTG9uZy5yZXN0eXBlID0gY19sb25nCiAKICAgICAgICAgICAgIHJlcyA9IHB5dGhvbmFwaS5QeUludF9Bc0xvbmcoNDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChncmMocmVzKSwgcmVmNDIgKyAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMocmVzKSwgcmVmNDIgKyAxKQogICAgICAgICAgICAgZGVsIHJlcwotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKDQyKSwgcmVmNDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyg0MiksIHJlZjQyKQogCiAgICAgZGVmIHRlc3RfUHlPYmpfRnJvbVB0cihzZWxmKToKICAgICAgICAgcyA9ICJhYmMgZGVmIGdoaSBqa2wiCiAgICAgICAgIHJlZiA9IGdyYyhzKQogICAgICAgICAjIGlkKHB5dGhvbi1vYmplY3QpIGlzIHRoZSBhZGRyZXNzCiAgICAgICAgIHB5b2JqID0gUHlPYmpfRnJvbVB0cihpZChzKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMgaXMgcHlvYmopCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzIGlzIHB5b2JqKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyhzKSwgcmVmICsgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMocyksIHJlZiArIDEpCiAgICAgICAgIGRlbCBweW9iagotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChncmMocyksIHJlZikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMocyksIHJlZikKIAogICAgIGRlZiB0ZXN0X1B5T1Nfc25wcmludGYoc2VsZik6CiAgICAgICAgIFB5T1Nfc25wcmludGYgPSBweXRob25hcGkuUHlPU19zbnByaW50ZgpAQCAtNzMsMTggKzczLDE4IEBACiAKICAgICAgICAgYnVmID0gY19idWZmZXIoMjU2KQogICAgICAgICBQeU9TX3NucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJIZWxsbyBmcm9tICVzIiwgImN0eXBlcyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgIkhlbGxvIGZyb20gY3R5cGVzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsICJIZWxsbyBmcm9tIGN0eXBlcyIpCiAKICAgICAgICAgUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiSGVsbG8gZnJvbSAlcyIsICJjdHlwZXMiLCAxLCAyLCAzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYudmFsdWUsICJIZWxsbyBmcm9tIGN0eXBlcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCAiSGVsbG8gZnJvbSBjdHlwZXMiKQogCiAgICAgICAgICMgbm90IGVub3VnaCBhcmd1bWVudHMKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgUHlPU19zbnByaW50ZiwgYnVmKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFB5T1Nfc25wcmludGYsIGJ1ZikKIAogICAgIGRlZiB0ZXN0X3B5b2JqZWN0X3JlcHIoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcHIocHlfb2JqZWN0KCkpLCAicHlfb2JqZWN0KDxOVUxMPikiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXByKHB5X29iamVjdCg0MikpLCAicHlfb2JqZWN0KDQyKSIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcHIocHlfb2JqZWN0KG9iamVjdCkpLCAicHlfb2JqZWN0KCVyKSIgJSBvYmplY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihweV9vYmplY3QoKSksICJweV9vYmplY3QoPE5VTEw+KSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihweV9vYmplY3QoNDIpKSwgInB5X29iamVjdCg0MikiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIocHlfb2JqZWN0KG9iamVjdCkpLCAicHlfb2JqZWN0KCVyKSIgJSBvYmplY3QpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weQppbmRleCAxODNiMWQ2Li5kZGI1OTdkIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JhbmRvbV90aGluZ3MucHkKQEAgLTIwLDcgKzIwLDcgQEAKICAgICAgICAgICAgIGhkbGwgPSB3aW5kbGwua2VybmVsMzIuTG9hZExpYnJhcnlBKCJrZXJuZWwzMiIpCiAgICAgICAgICAgICBmdW5jYWRkciA9IHdpbmRsbC5rZXJuZWwzMi5HZXRQcm9jQWRkcmVzcyhoZGxsLCAiR2V0TW9kdWxlSGFuZGxlQSIpCiAKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNhbGxfZnVuY3Rpb24oZnVuY2FkZHIsIChOb25lLCkpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYWxsX2Z1bmN0aW9uKGZ1bmNhZGRyLCAoTm9uZSwpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRsbC5rZXJuZWwzMi5HZXRNb2R1bGVIYW5kbGVBKE5vbmUpKQogCiBjbGFzcyBDYWxsYmFja1RyYWNiYWNrVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNDksMjUgKzQ5LDI1IEBACiAgICAgZGVmIHRlc3RfVmFsdWVFcnJvcihzZWxmKToKICAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfaW50KShjYWxsYmFja19mdW5jKQogICAgICAgICBvdXQgPSBzZWxmLmNhcHR1cmVfc3RkZXJyKGNiLCA0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV0sCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZUVycm9yOiA0MiIpCiAKICAgICBkZWYgdGVzdF9JbnRlZ2VyRGl2aXNpb25FcnJvcihzZWxmKToKICAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfaW50KShjYWxsYmFja19mdW5jKQogICAgICAgICBvdXQgPSBzZWxmLmNhcHR1cmVfc3RkZXJyKGNiLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvdXQuc3BsaXRsaW5lcygpWy0xXVs6MTldLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5zcGxpdGxpbmVzKClbLTFdWzoxOV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaZXJvRGl2aXNpb25FcnJvcjogIikKIAogICAgIGRlZiB0ZXN0X0Zsb2F0RGl2aXNpb25FcnJvcihzZWxmKToKICAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfZG91YmxlKShjYWxsYmFja19mdW5jKQogICAgICAgICBvdXQgPSBzZWxmLmNhcHR1cmVfc3RkZXJyKGNiLCAwLjApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG91dC5zcGxpdGxpbmVzKClbLTFdWzoxOV0sCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV1bOjE5XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplcm9EaXZpc2lvbkVycm9yOiAiKQogCiAgICAgZGVmIHRlc3RfVHlwZUVycm9yRGl2aXNpb25FcnJvcihzZWxmKToKICAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfY2hhcl9wKShjYWxsYmFja19mdW5jKQogICAgICAgICBvdXQgPSBzZWxmLmNhcHR1cmVfc3RkZXJyKGNiLCAic3BhbSIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG91dC5zcGxpdGxpbmVzKClbLTFdLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dC5zcGxpdGxpbmVzKClbLTFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHlwZUVycm9yOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBvcGVyYW5kIHR5cGUocykgZm9yIC86ICdpbnQnIGFuZCAnc3RyJyIpCiAKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JlZmNvdW50cy5weQppbmRleCA0NDhmMjkyLi4zNWE4MWFhIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yZWZjb3VudHMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmVmY291bnRzLnB5CkBAIC0yMSwxNyArMjEsMTcgQEAKICAgICAgICAgICAgICNwcmludCAiY2FsbGVkIGJhY2sgd2l0aCIsIHZhbHVlCiAgICAgICAgICAgICByZXR1cm4gdmFsdWUKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChncmMoY2FsbGJhY2spLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhjYWxsYmFjayksIDIpCiAgICAgICAgIGNiID0gTXlDYWxsYmFjayhjYWxsYmFjaykKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZ3JjKGNhbGxiYWNrKSA+IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncmMoY2FsbGJhY2spID4gMikKICAgICAgICAgcmVzdWx0ID0gZigtMTAsIGNiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHQsIC0xOCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIC0xOCkKICAgICAgICAgY2IgPSBOb25lCiAKICAgICAgICAgZ2MuY29sbGVjdCgpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKGNhbGxiYWNrKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoY2FsbGJhY2spLCAyKQogCiAKICAgICBkZWYgdGVzdF9yZWZjb3VudChzZWxmKToKQEAgLTM5LDE5ICszOSwxOSBAQAogICAgICAgICBkZWYgZnVuYygqYXJncyk6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgICMgdGhpcyBpcyB0aGUgc3RhbmRhcmQgcmVmY291bnQgZm9yIGZ1bmMKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKGZ1bmMpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhmdW5jKSwgMikKIAogICAgICAgICAjIHRoZSBDRnVuY1B0ciBpbnN0YW5jZSBob2xkcyBhdHIgbGVhc3Qgb25lIHJlZmNvdW50IG9uIGZ1bmM6CiAgICAgICAgIGYgPSBPdGhlckNhbGxiYWNrKGZ1bmMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhncmMoZnVuYykgPiAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ3JjKGZ1bmMpID4gMikKIAogICAgICAgICAjIGFuZCBtYXkgcmVsZWFzZSBpdCBhZ2FpbgogICAgICAgICBkZWwgZgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZ3JjKGZ1bmMpID49IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncmMoZnVuYykgPj0gMikKIAogICAgICAgICAjIGJ1dCBub3cgaXQgbXVzdCBiZSBnb25lCiAgICAgICAgIGdjLmNvbGxlY3QoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZ3JjKGZ1bmMpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncmMoZnVuYykgPT0gMikKIAogICAgICAgICBjbGFzcyBYKGN0eXBlcy5TdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgT3RoZXJDYWxsYmFjayldCkBAIC01OSwyNyArNTksMjcgQEAKICAgICAgICAgeC5hID0gT3RoZXJDYWxsYmFjayhmdW5jKQogCiAgICAgICAgICMgdGhlIENGdW5jUHRyIGluc3RhbmNlIGhvbGRzIGF0ciBsZWFzdCBvbmUgcmVmY291bnQgb24gZnVuYzoKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGdyYyhmdW5jKSA+IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShncmMoZnVuYykgPiAyKQogCiAgICAgICAgICMgYW5kIG1heSByZWxlYXNlIGl0IGFnYWluCiAgICAgICAgIGRlbCB4Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhncmMoZnVuYykgPj0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdyYyhmdW5jKSA+PSAyKQogCiAgICAgICAgICMgYW5kIG5vdyBpdCBtdXN0IGJlIGdvbmUgYWdhaW4KICAgICAgICAgZ2MuY29sbGVjdCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyhmdW5jKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoZnVuYyksIDIpCiAKICAgICAgICAgZiA9IE90aGVyQ2FsbGJhY2soZnVuYykKIAogICAgICAgICAjIHRoZSBDRnVuY1B0ciBpbnN0YW5jZSBob2xkcyBhdHIgbGVhc3Qgb25lIHJlZmNvdW50IG9uIGZ1bmM6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhncmMoZnVuYykgPiAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ3JjKGZ1bmMpID4gMikKIAogICAgICAgICAjIGNyZWF0ZSBhIGN5Y2xlCiAgICAgICAgIGYuY3ljbGUgPSBmCiAKICAgICAgICAgZGVsIGYKICAgICAgICAgZ2MuY29sbGVjdCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyhmdW5jKSwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoZnVuYyksIDIpCiAKIGNsYXNzIEFub3RoZXJMZWFrKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9jYWxsYmFjayhzZWxmKToKQEAgLTkyLDcgKzkyLDcgQEAKIAogICAgICAgICBhID0gc3lzLmdldHJlZmNvdW50KGN0eXBlcy5jX2ludCkKICAgICAgICAgZigxLCAyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzeXMuZ2V0cmVmY291bnQoY3R5cGVzLmNfaW50KSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0cmVmY291bnQoY3R5cGVzLmNfaW50KSwgYSkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JlcHIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yZXByLnB5CmluZGV4IDlmZWYyMWYuLjk5Y2M1NTYgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JlcHIucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmVwci5weQpAQCAtMTgsMTIgKzE4LDEyIEBACiAgICAgZGVmIHRlc3RfbnVtYmVycyhzZWxmKToKICAgICAgICAgZm9yIHR5cCBpbiBzdWJjbGFzc2VzOgogICAgICAgICAgICAgYmFzZSA9IHR5cC5fX2Jhc2VzX19bMF0KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXByKGJhc2UoNDIpKS5zdGFydHN3aXRoKGJhc2UuX19uYW1lX18pKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoIjxYIG9iamVjdCBhdCIsIHJlcHIodHlwKDQyKSlbOjEyXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGJhc2UoNDIpKS5zdGFydHN3aXRoKGJhc2UuX19uYW1lX18pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiPFggb2JqZWN0IGF0IiwgcmVwcih0eXAoNDIpKVs6MTJdKQogCiAgICAgZGVmIHRlc3RfY2hhcihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoImNfY2hhcigneCcpIiwgcmVwcihjX2NoYXIoJ3gnKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCI8WCBvYmplY3QgYXQiLCByZXByKFgoJ3gnKSlbOjEyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiY19jaGFyKCd4JykiLCByZXByKGNfY2hhcigneCcpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgiPFggb2JqZWN0IGF0IiwgcmVwcihYKCd4JykpWzoxMl0pCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yZXR1cm5mdW5jcHRycy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5CmluZGV4IDg4ZGNjZjIuLmY3NjYxODkgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JldHVybmZ1bmNwdHJzLnB5CkBAIC0xMiw4ICsxMiw4IEBACiAgICAgICAgIGdldF9zdHJjaHIgPSBkbGwuZ2V0X3N0cmNocgogICAgICAgICBnZXRfc3RyY2hyLnJlc3R5cGUgPSBDRlVOQ1RZUEUoY19jaGFyX3AsIGNfY2hhcl9wLCBjX2NoYXIpCiAgICAgICAgIHN0cmNociA9IGdldF9zdHJjaHIoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJjaHIoImFiY2RlZiIsICJiIiksICJiY2RlZiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmNocigiYWJjZGVmIiwgIngiKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJjaHIoImFiY2RlZiIsICJiIiksICJiY2RlZiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyY2hyKCJhYmNkZWYiLCAieCIpLCBOb25lKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhBcmd1bWVudEVycm9yLCBzdHJjaHIsICJhYmNkZWYiLCAzKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN0cmNociwgImFiY2RlZiIpCiAKQEAgLTI2LDggKzI2LDggQEAKICAgICAgICAgIyBfQ0Z1bmNQdHIgaW5zdGFuY2VzIGFyZSBub3cgY2FsbGFibGUgd2l0aCBhbiBpbnRlZ2VyIGFyZ3VtZW50CiAgICAgICAgICMgd2hpY2ggZGVub3RlcyBhIGZ1bmN0aW9uIGFkZHJlc3M6CiAgICAgICAgIHN0cmNociA9IENGVU5DVFlQRShjX2NoYXJfcCwgY19jaGFyX3AsIGNfY2hhcikoYWRkcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN0cmNocigiYWJjZGVmIiwgImIiKSwgImJjZGVmIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyY2hyKCJhYmNkZWYiLCAieCIpLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyY2hyKCJhYmNkZWYiLCAiYiIpLCAiYmNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmNocigiYWJjZGVmIiwgIngiKSwgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgc3RyY2hyLCAiYWJjZGVmIiwgMykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzdHJjaHIsICJhYmNkZWYiKQogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zaW1wbGVzdWJjbGFzc2VzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2ltcGxlc3ViY2xhc3Nlcy5weQppbmRleCA1NjcxY2NlLi4xYjczZmIzIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zaW1wbGVzdWJjbGFzc2VzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpbXBsZXN1YmNsYXNzZXMucHkKQEAgLTEyLDggKzEyLDggQEAKIGNsYXNzIFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTXlJbnQoMyksIE15SW50KDMpKQotICAgICAgICBzZWxmLmZhaWxJZkVxdWFsKE15SW50KDQyKSwgTXlJbnQoNDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKE15SW50KDMpLCBNeUludCgzKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChNeUludCg0MiksIE15SW50KDQzKSkKIAogICAgIGRlZiB0ZXN0X2lnbm9yZV9yZXR2YWwoc2VsZik6CiAgICAgICAgICMgVGVzdCBpZiB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgY2FsbGJhY2sgaXMgaWdub3JlZApAQCAtMjMsNyArMjMsNyBAQAogICAgICAgICAgICAgcmV0dXJuICgxLCAiYWJjIiwgTm9uZSkKIAogICAgICAgICBjYiA9IHByb3RvKGZ1bmMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKE5vbmUsIGNiKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgY2IoKSkKIAogCiAgICAgZGVmIHRlc3RfaW50X2NhbGxiYWNrKHNlbGYpOgpAQCAtMzQsMjQgKzM0LDI0IEBACiAKICAgICAgICAgY2IgPSBDRlVOQ1RZUEUoTm9uZSwgTXlJbnQpKGZ1bmMpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoTm9uZSwgY2IoNDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKGFyZ3NbLTFdKSwgTXlJbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgY2IoNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYXJnc1stMV0pLCBNeUludCkKIAogICAgICAgICBjYiA9IENGVU5DVFlQRShjX2ludCwgY19pbnQpKGZ1bmMpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGNiKDQyKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZShhcmdzWy0xXSksIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgY2IoNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoYXJnc1stMV0pLCBpbnQpCiAKICAgICBkZWYgdGVzdF9pbnRfc3RydWN0KHNlbGYpOgogICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBNeUludCldCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWCgpLngsIE15SW50KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWCgpLngsIE15SW50KCkpCiAKICAgICAgICAgcyA9IFgoKQogICAgICAgICBzLnggPSBNeUludCg0MikKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzLngsIE15SW50KDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLngsIE15SW50KDQyKSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHkKaW5kZXggMjA4YzAwZS4uMDUwOWNiYiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2l6ZXMucHkKQEAgLTUsMjMgKzUsMjMgQEAKIAogY2xhc3MgU2l6ZXNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfOChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMSwgc2l6ZW9mKGNfaW50OCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEsIHNpemVvZihjX3VpbnQ4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBzaXplb2YoY19pbnQ4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBzaXplb2YoY191aW50OCkpCiAKICAgICBkZWYgdGVzdF8xNihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMiwgc2l6ZW9mKGNfaW50MTYpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgyLCBzaXplb2YoY191aW50MTYpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNpemVvZihjX2ludDE2KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBzaXplb2YoY191aW50MTYpKQogCiAgICAgZGVmIHRlc3RfMzIoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQsIHNpemVvZihjX2ludDMyKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNCwgc2l6ZW9mKGNfdWludDMyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBzaXplb2YoY19pbnQzMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgc2l6ZW9mKGNfdWludDMyKSkKIAogICAgIGRlZiB0ZXN0XzY0KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg4LCBzaXplb2YoY19pbnQ2NCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDgsIHNpemVvZihjX3VpbnQ2NCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOCwgc2l6ZW9mKGNfaW50NjQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDgsIHNpemVvZihjX3VpbnQ2NCkpCiAKICAgICBkZWYgdGVzdF9zaXplX3Qoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihjX3ZvaWRfcCksIHNpemVvZihjX3NpemVfdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKGNfdm9pZF9wKSwgc2l6ZW9mKGNfc2l6ZV90KSkKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zbGljaW5nLnB5CmluZGV4IDI1YmQ4MDEuLmE1NjMyZWMgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NsaWNpbmcucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc2xpY2luZy5weQpAQCAtNyw0MyArNyw0MyBAQAogICAgIGRlZiB0ZXN0X2dldHNsaWNlX2NpbnQoc2VsZik6CiAgICAgICAgIGEgPSAoY19pbnQgKiAxMDApKCp4cmFuZ2UoMTEwMCwgMTIwMCkpCiAgICAgICAgIGIgPSByYW5nZSgxMTAwLCAxMjAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhWzA6Ml0sIGJbMDoyXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYVswOjI6XSwgYlswOjI6XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKGEpLCBsZW4oYikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbNTo3XSwgYls1OjddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhWzU6NzpdLCBiWzU6NzpdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhWy0xXSwgYlstMV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbOl0sIGJbOl0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbOjpdLCBiWzo6XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYVsxMDo6LTFdLCBiWzEwOjotMV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbMzA6MjA6LTFdLCBiWzMwOjIwOi0xXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYVs6MTI6Nl0sIGJbOjEyOjZdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhWzI6Njo0XSwgYlsyOjY6NF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVswOjJdLCBiWzA6Ml0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVswOjI6XSwgYlswOjI6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYSksIGxlbihiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzU6N10sIGJbNTo3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzU6NzpdLCBiWzU6NzpdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbLTFdLCBiWy0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzpdLCBiWzpdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOjpdLCBiWzo6XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzEwOjotMV0sIGJbMTA6Oi0xXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzMwOjIwOi0xXSwgYlszMDoyMDotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6MTI6Nl0sIGJbOjEyOjZdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbMjo2OjRdLCBiWzI6Njo0XSkKIAogICAgICAgICBhWzA6NV0gPSByYW5nZSg1LCAxMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYVswOjVdLCByYW5nZSg1LCAxMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbMDo1Ol0sIHJhbmdlKDUsIDEwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYVs0OjotMV0sIHJhbmdlKDksIDQsIC0xKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzA6NV0sIHJhbmdlKDUsIDEwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzA6NTpdLCByYW5nZSg1LCAxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs0OjotMV0sIHJhbmdlKDksIDQsIC0xKSkKIAogICAgIGRlZiB0ZXN0X3NldHNsaWNlX2NpbnQoc2VsZik6CiAgICAgICAgIGEgPSAoY19pbnQgKiAxMDApKCp4cmFuZ2UoMTEwMCwgMTIwMCkpCiAgICAgICAgIGIgPSByYW5nZSgxMTAwLCAxMjAwKQogCiAgICAgICAgIGFbMzI6NDddID0gcmFuZ2UoMzIsIDQ3KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhWzMyOjQ3XSwgcmFuZ2UoMzIsIDQ3KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzMyOjQ3XSwgcmFuZ2UoMzIsIDQ3KSkKICAgICAgICAgYVszMjo0N10gPSByYW5nZSgxMzIsIDE0NykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYVszMjo0NzpdLCByYW5nZSgxMzIsIDE0NykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVszMjo0NzpdLCByYW5nZSgxMzIsIDE0NykpCiAgICAgICAgIGFbNDY6MzE6LTFdID0gcmFuZ2UoMjMyLCAyNDcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbMzI6NDc6MV0sIHJhbmdlKDI0NiwgMjMxLCAtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVszMjo0NzoxXSwgcmFuZ2UoMjQ2LCAyMzEsIC0xKSkKIAogICAgICAgICBhWzMyOjQ3XSA9IHJhbmdlKDExMzIsIDExNDcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFbOl0sIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYVs6XSwgYikKICAgICAgICAgYVszMjo0Nzo3XSA9IHJhbmdlKDMpCiAgICAgICAgIGJbMzI6NDc6N10gPSByYW5nZSgzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhWzpdLCBiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFbOl0sIGIpCiAgICAgICAgIGFbMzM6Oi0zXSA9IHJhbmdlKDEyKQogICAgICAgICBiWzMzOjotM10gPSByYW5nZSgxMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYVs6XSwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhWzpdLCBiKQogCiAgICAgICAgIGZyb20gb3BlcmF0b3IgaW1wb3J0IHNldHNsaWNlLCBzZXRpdGVtCiAKQEAgLTY5LDEyICs2OSwxMiBAQAogICAgICAgICBkbGwubXlfc3RyZHVwLnJlc3R5cGUgPSBQT0lOVEVSKGNfY2hhcikKICAgICAgICAgZGxsLm15X2ZyZWUucmVzdHlwZSA9IE5vbmUKICAgICAgICAgcmVzID0gZGxsLm15X3N0cmR1cChzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbOmxlbihzKV0sIHMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1s6M10sIHNbOjNdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbOmxlbihzKTpdLCBzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbbGVuKHMpLTE6LTE6LTFdLCBzWzo6LTFdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbbGVuKHMpLTE6NTotN10sIHNbOjU6LTddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbMDotMTotMV0sIHNbMDo6LTFdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1s6bGVuKHMpXSwgcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOjNdLCBzWzozXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKTpdLCBzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMTotMTotMV0sIHNbOjotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzW2xlbihzKS0xOjU6LTddLCBzWzo1Oi03XSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbMDotMTotMV0sIHNbMDo6LTFdKQogCiAgICAgICAgIGltcG9ydCBvcGVyYXRvcgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBvcGVyYXRvci5nZXRpdGVtLApAQCAtOTQsOCArOTQsOCBAQAogCiAgICAgICAgIGRsbC5teV9zdHJkdXAucmVzdHlwZSA9IFBPSU5URVIoY19ieXRlKQogICAgICAgICByZXMgPSBkbGwubXlfc3RyZHVwKHMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1s6bGVuKHMpXSwgcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKzEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbOmxlbihzKTpdLCByYW5nZShvcmQoImEiKSwgb3JkKCJ6IikrMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzpsZW4ocyldLCByYW5nZShvcmQoImEiKSwgb3JkKCJ6IikrMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzpsZW4ocyk6XSwgcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKzEpKQogICAgICAgICBkbGwubXlfZnJlZShyZXMpCiAKICAgICBkZWYgdGVzdF9jaGFyX3B0cl93aXRoX2ZyZWUoc2VsZik6CkBAIC0xMTUsNyArMTE1LDcgQEAKICAgICAgICAgZGxsLm15X3N0cmR1cC5lcnJjaGVjayA9IGVycmNoZWNrCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHJlcyA9IGRsbC5teV9zdHJkdXAocykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcywgcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCBzKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgZGVsIGRsbC5teV9zdHJkdXAuZXJyY2hlY2sKIApAQCAtMTI0LDExICsxMjQsMTEgQEAKICAgICAgICAgcyA9ICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5elwwIgogCiAgICAgICAgIHAgPSAoY19jaGFyICogMjcpKCpzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzpdLCBzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzo6XSwgcykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs6Oi0xXSwgc1s6Oi0xXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFs1OjotMl0sIHNbNTo6LTJdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwWzI6NTotM10sIHNbMjo1Oi0zXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwWzpdLCBzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjpdLCBzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbOjotMV0sIHNbOjotMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocFs1OjotMl0sIHNbNTo6LTJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBbMjo1Oi0zXSwgc1syOjU6LTNdKQogCiAKICAgICB0cnk6CkBAIC0xNDQsMTAgKzE0NCwxMCBAQAogICAgICAgICAgICAgZGxsLm15X3djc2R1cC5hcmd0eXBlcyA9IFBPSU5URVIoY193Y2hhciksCiAgICAgICAgICAgICBkbGwubXlfZnJlZS5yZXN0eXBlID0gTm9uZQogICAgICAgICAgICAgcmVzID0gZGxsLm15X3djc2R1cChzKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzpsZW4ocyldLCBzKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzWzpsZW4ocyk6XSwgcykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1tsZW4ocyktMTotMTotMV0sIHNbOjotMV0pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbbGVuKHMpLTE6NTotN10sIHNbOjU6LTddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKV0sIHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1s6bGVuKHMpOl0sIHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMTotMTotMV0sIHNbOjotMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc1tsZW4ocyktMTo1Oi03XSwgc1s6NTotN10pCiAKICAgICAgICAgICAgIGltcG9ydCBvcGVyYXRvcgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRzbGljZSwKQEAgLTE2NiwxMCArMTY2LDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICByZXMgPSBkbGwubXlfd2NzZHVwKHMpCiAgICAgICAgICAgICB0bXBsID0gcmFuZ2Uob3JkKCJhIiksIG9yZCgieiIpKzEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbOmxlbihzKS0xXSwgdG1wbCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1s6bGVuKHMpLTE6XSwgdG1wbCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc1tsZW4ocyktMjotMTotMV0sIHRtcGxbOjotMV0pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbbGVuKHMpLTI6NTotN10sIHRtcGxbOjU6LTddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbOmxlbihzKS0xXSwgdG1wbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzWzpsZW4ocyktMTpdLCB0bXBsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbbGVuKHMpLTI6LTE6LTFdLCB0bXBsWzo6LTFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXNbbGVuKHMpLTI6NTotN10sIHRtcGxbOjU6LTddKQogICAgICAgICAgICAgZGxsLm15X2ZyZWUocmVzKQogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdwdHIucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdwdHIucHkKaW5kZXggNmVlNmFlMC4uYWJlZDU4YiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncHRyLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3B0ci5weQpAQCAtMTYsMTQgKzE2LDE0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGdldGF0dHIsIHguc3RyLCAiY29udGVudHMiKQogICAgICAgICBiID0gY19idWZmZXIoIkhlbGxvLCBXb3JsZCIpCiAgICAgICAgIGZyb20gc3lzIGltcG9ydCBnZXRyZWZjb3VudCBhcyBncmMKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZ3JjKGIpLCAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdyYyhiKSwgMikKICAgICAgICAgeC5zdHIgPSBiCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGdyYyhiKSwgMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChncmMoYiksIDMpCiAKICAgICAgICAgIyBQT0lOVEVSKGNfY2hhcikgYW5kIFB5dGhvbiBzdHJpbmcgaXMgTk9UIGNvbXBhdGlibGUKICAgICAgICAgIyBQT0lOVEVSKGNfY2hhcikgYW5kIGNfYnVmZmVyKCkgaXMgY29tcGF0aWJsZQogICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oYikpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYltpXSwgeC5zdHJbaV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJbaV0sIHguc3RyW2ldKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgeCwgInN0ciIsICJIZWxsbywgV29ybGQiKQogCkBAIC0zNCwxMSArMzQsMTEgQEAKIAogICAgICAgICAjIGNfY2hhcl9wIGFuZCBQeXRob24gc3RyaW5nIGlzIGNvbXBhdGlibGUKICAgICAgICAgIyBjX2NoYXJfcCBhbmQgY19idWZmZXIgaXMgTk9UIGNvbXBhdGlibGUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5zdHIsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5zdHIsIE5vbmUpCiAgICAgICAgIHguc3RyID0gIkhlbGxvLCBXb3JsZCIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5zdHIsICJIZWxsbywgV29ybGQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguc3RyLCAiSGVsbG8sIFdvcmxkIikKICAgICAgICAgYiA9IGNfYnVmZmVyKCJIZWxsbywgV29ybGQiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCB4LCAic3RyIiwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCB4LCAic3RyIiwgYikKIAogCiAgICAgZGVmIHRlc3RfZnVuY3Rpb25zKHNlbGYpOgpAQCAtNDgsMTUgKzQ4LDE1IEBACiAgICAgICAgICMgY19jaGFyX3AgYW5kIFB5dGhvbiBzdHJpbmcgaXMgY29tcGF0aWJsZQogICAgICAgICAjIGNfY2hhcl9wIGFuZCBjX2J1ZmZlciBhcmUgbm93IGNvbXBhdGlibGUKICAgICAgICAgc3RyY2hyLmFyZ3R5cGVzID0gY19jaGFyX3AsIGNfY2hhcgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJjaHIoImFiY2RlZiIsICJjIiksICJjZGVmIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3RyY2hyKGNfYnVmZmVyKCJhYmNkZWYiKSwgImMiKSwgImNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmNocigiYWJjZGVmIiwgImMiKSwgImNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmNocihjX2J1ZmZlcigiYWJjZGVmIiksICJjIiksICJjZGVmIikKIAogICAgICAgICAjIFBPSU5URVIoY19jaGFyKSBhbmQgUHl0aG9uIHN0cmluZyBpcyBOT1QgY29tcGF0aWJsZQogICAgICAgICAjIFBPSU5URVIoY19jaGFyKSBhbmQgY19idWZmZXIoKSBpcyBjb21wYXRpYmxlCiAgICAgICAgIHN0cmNoci5hcmd0eXBlcyA9IFBPSU5URVIoY19jaGFyKSwgY19jaGFyCiAgICAgICAgIGJ1ZiA9IGNfYnVmZmVyKCJhYmNkZWYiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJjaHIoYnVmLCAiYyIpLCAiY2RlZiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cmNocigiYWJjZGVmIiwgImMiKSwgImNkZWYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmNocihidWYsICJjIiksICJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJjaHIoImFiY2RlZiIsICJjIiksICJjZGVmIikKIAogICAgICAgICAjIFhYWCBUaGVzZSBjYWxscyBhcmUgZGFuZ2Vyb3VzLCBiZWNhdXNlIHRoZSBmaXJzdCBhcmd1bWVudAogICAgICAgICAjIHRvIHN0cmNociBpcyBubyBsb25nZXIgdmFsaWQgYWZ0ZXIgdGhlIGZ1bmN0aW9uIHJldHVybnMhCkBAIC02Niw3ICs2Niw3IEBACiAgICAgICAgIGJ1ZiA9IGNfYnVmZmVyKCJhYmNkZWYiKQogICAgICAgICByID0gc3RyY2hyKGJ1ZiwgImMiKQogICAgICAgICB4ID0gclswXSwgclsxXSwgclsyXSwgclszXSwgcls0XQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4LCAoImMiLCAiZCIsICJlIiwgImYiLCAiXDAwMCIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsICgiYyIsICJkIiwgImUiLCAiZiIsICJcMDAwIikpCiAgICAgICAgIGRlbCBidWYKICAgICAgICAgIyB4MSB3aWxsIE5PVCBiZSB0aGUgc2FtZSBhcyB4LCB1c3VhbGx5OgogICAgICAgICB4MSA9IHJbMF0sIHJbMV0sIHJbMl0sIHJbM10sIHJbNF0KZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3MucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJpbmdzLnB5CmluZGV4IDcyMjQ4ZTEuLmJjODAzZGIgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cmluZ3MucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RyaW5ncy5weQpAQCAtNiwyMCArNiwyMCBAQAogICAgICAgICBCVUYgPSBjX2NoYXIgKiA0CiAKICAgICAgICAgYnVmID0gQlVGKCJhIiwgImIiLCAiYyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgImFiYyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi5yYXcsICJhYmNcMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi5yYXcsICJhYmNcMDAwIikKIAogICAgICAgICBidWYudmFsdWUgPSAiQUJDRCIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYnVmLnZhbHVlLCAiQUJDRCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi5yYXcsICJBQkNEIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsICJBQkNEIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYucmF3LCAiQUJDRCIpCiAKICAgICAgICAgYnVmLnZhbHVlID0gIngiCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgIngiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYucmF3LCAieFwwMDBDRCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCAieCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnJhdywgInhcMDAwQ0QiKQogCiAgICAgICAgIGJ1ZlsxXSA9ICJaIgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYudmFsdWUsICJ4WkNEIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYnVmLnJhdywgInhaQ0QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgInhaQ0QiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi5yYXcsICJ4WkNEIikKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBidWYsICJ2YWx1ZSIsICJhYWFhYWFhYSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgYnVmLCAidmFsdWUiLCA0MikKQEAgLTI4LDkgKzI4LDkgQEAKICAgICAgICAgYnVmID0gY19idWZmZXIoMzIpCiAKICAgICAgICAgYnVmLnZhbHVlID0gIkhlbGxvLCBXb3JsZCIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYnVmLnZhbHVlLCAiSGVsbG8sIFdvcmxkIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsICJIZWxsbywgV29ybGQiKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIGJ1ZiwgInZhbHVlIiwgYnVmZmVyKCJIZWxsbywgV29ybGQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBidWYsICJ2YWx1ZSIsIGJ1ZmZlcigiSGVsbG8sIFdvcmxkIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgYnVmLCAidmFsdWUiLCBidWZmZXIoImFiYyIpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBidWYsICJyYXciLCBidWZmZXIoIngiICogMTAwKSkKIApAQCAtMzgsNyArMzgsNyBAQAogICAgICAgICBidWYgPSBjX2J1ZmZlcigzMikKIAogICAgICAgICBidWYucmF3ID0gYnVmZmVyKCJIZWxsbywgV29ybGQiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYudmFsdWUsICJIZWxsbywgV29ybGQiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgIkhlbGxvLCBXb3JsZCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgYnVmLCAidmFsdWUiLCBidWZmZXIoImFiYyIpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBidWYsICJyYXciLCBidWZmZXIoIngiICogMTAwKSkKIApAQCAtNjMsMTYgKzYzLDE2IEBACiAgICAgICAgICAgICBCVUYgPSBjX3djaGFyICogNAogCiAgICAgICAgICAgICBidWYgPSBCVUYodSJhIiwgdSJiIiwgdSJjIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgdSJhYmMiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsIHUiYWJjIikKIAogICAgICAgICAgICAgYnVmLnZhbHVlID0gdSJBQkNEIgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYnVmLnZhbHVlLCB1IkFCQ0QiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWYudmFsdWUsIHUiQUJDRCIpCiAKICAgICAgICAgICAgIGJ1Zi52YWx1ZSA9IHUieCIKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zi52YWx1ZSwgdSJ4IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmLnZhbHVlLCB1IngiKQogCiAgICAgICAgICAgICBidWZbMV0gPSB1IloiCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWYudmFsdWUsIHUieFpDRCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zi52YWx1ZSwgdSJ4WkNEIikKIAogY2xhc3MgU3RyaW5nVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBYWF90ZXN0X2Jhc2ljX3N0cmluZ3Moc2VsZik6CkBAIC04MCwyNCArODAsMjQgQEAKIAogICAgICAgICAjIENhbm5vdCBjYWxsIGxlbiBvbiBhIGNfc3RyaW5nIGFueSBsb25nZXIKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsZW4sIGNzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoY3MpLCA3KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihjcyksIDcpCiAKICAgICAgICAgIyBUaGUgdmFsdWUgcHJvcGVydHkgaXMgdGhlIHN0cmluZyB1cCB0byB0aGUgZmlyc3QgdGVybWluYXRpbmcgTlVMLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjcy52YWx1ZSwgImFiY2RlZiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNfc3RyaW5nKCJhYmNcMDAwZGVmIikudmFsdWUsICJhYmMiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNzLnZhbHVlLCAiYWJjZGVmIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjX3N0cmluZygiYWJjXDAwMGRlZiIpLnZhbHVlLCAiYWJjIikKIAogICAgICAgICAjIFRoZSByYXcgcHJvcGVydHkgaXMgdGhlIHRvdGFsIGJ1ZmZlciBjb250ZW50czoKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY3MucmF3LCAiYWJjZGVmXDAwMCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNfc3RyaW5nKCJhYmNcMDAwZGVmIikucmF3LCAiYWJjXDAwMGRlZlwwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNzLnJhdywgImFiY2RlZlwwMDAiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNfc3RyaW5nKCJhYmNcMDAwZGVmIikucmF3LCAiYWJjXDAwMGRlZlwwMDAiKQogCiAgICAgICAgICMgV2UgY2FuIGNoYW5nZSB0aGUgdmFsdWU6CiAgICAgICAgIGNzLnZhbHVlID0gImFiIgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjcy52YWx1ZSwgImFiIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY3MucmF3LCAiYWJcMDAwXDAwMFwwMDBcMDAwXDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MudmFsdWUsICJhYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MucmF3LCAiYWJcMDAwXDAwMFwwMDBcMDAwXDAwMCIpCiAKICAgICAgICAgY3MucmF3ID0gIlhZIgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjcy52YWx1ZSwgIlhZIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY3MucmF3LCAiWFlcMDAwXDAwMFwwMDBcMDAwXDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MudmFsdWUsICJYWSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3MucmF3LCAiWFlcMDAwXDAwMFwwMDBcMDAwXDAwMCIpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjX3N0cmluZywgdSIxMjMiKQogCkBAIC0xMDgsMjQgKzEwOCwyNCBAQAogCiAgICAgICAgICMgTmV3IGluIHJlbGVhc2VzIGxhdGVyIHRoYW4gMC40LjA6CiAgICAgICAgICMgY19zdHJpbmcobnVtYmVyKSByZXR1cm5zIGFuIGVtcHR5IHN0cmluZyBvZiBzaXplIG51bWJlcgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobGVuKGNfc3RyaW5nKDMyKS5yYXcpID09IDMyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGNfc3RyaW5nKDMyKS5yYXcpID09IDMyKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjX3N0cmluZywgLTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNfc3RyaW5nLCAwKQogCiAgICAgICAgICMgVGhlc2UgdGVzdHMgZmFpbCwgYmVjYXVzZSBpdCBpcyBubyBsb25nZXIgaW5pdGlhbGl6ZWQKLSMjICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19zdHJpbmcoMikudmFsdWUgPT0gIiIpCi0jIyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfc3RyaW5nKDIpLnJhdyA9PSAiXDAwMFwwMDAiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19zdHJpbmcoMikucmF3Wy0xXSA9PSAiXDAwMCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhsZW4oY19zdHJpbmcoMikucmF3KSA9PSAyKQorIyMgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygyKS52YWx1ZSA9PSAiIikKKyMjICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoMikucmF3ID09ICJcMDAwXDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygyKS5yYXdbLTFdID09ICJcMDAwIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihjX3N0cmluZygyKS5yYXcpID09IDIpCiAKICAgICBkZWYgWFhfdGVzdF9pbml0aWFsaXplZF9zdHJpbmdzKHNlbGYpOgogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX3N0cmluZygiYWIiLCA0KS5yYXdbOjJdID09ICJhYiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX3N0cmluZygiYWIiLCA0KS5yYXdbOjI6XSA9PSAiYWIiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19zdHJpbmcoImFiIiwgNCkucmF3WzoyOi0xXSA9PSAiYmEiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19zdHJpbmcoImFiIiwgNCkucmF3WzoyOjJdID09ICJhIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfc3RyaW5nKCJhYiIsIDQpLnJhd1stMV0gPT0gIlwwMDAiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY19zdHJpbmcoImFiIiwgMikucmF3ID09ICJhXDAwMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygiYWIiLCA0KS5yYXdbOjJdID09ICJhYiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3N0cmluZygiYWIiLCA0KS5yYXdbOjI6XSA9PSAiYWIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoImFiIiwgNCkucmF3WzoyOi0xXSA9PSAiYmEiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoImFiIiwgNCkucmF3WzoyOjJdID09ICJhIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNfc3RyaW5nKCJhYiIsIDQpLnJhd1stMV0gPT0gIlwwMDAiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY19zdHJpbmcoImFiIiwgMikucmF3ID09ICJhXDAwMCIpCiAKICAgICBkZWYgWFhfdGVzdF90b29sb25nKHNlbGYpOgogICAgICAgICBjcyA9IGNfc3RyaW5nKCJhYmNkZWYiKQpAQCAtMTU2LDIyICsxNTYsMjIgQEAKICAgICAgICAgICAgICMgWFhYIFRoaXMgYmVoYXZpb3VyIGlzIGFib3V0IHRvIGNoYW5nZToKICAgICAgICAgICAgICMgbGVuIHJldHVybnMgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIGJ1ZmZlciBpbiBieXRlcy4KICAgICAgICAgICAgICMgVGhpcyBpbmNsdWRlcyB0aGUgdGVybWluYXRpbmcgTlVMIGNoYXJhY3Rlci4KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzaXplb2YoY3MpID09IDE0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNpemVvZihjcykgPT0gMTQpCiAKICAgICAgICAgICAgICMgVGhlIHZhbHVlIHByb3BlcnR5IGlzIHRoZSBzdHJpbmcgdXAgdG8gdGhlIGZpcnN0IHRlcm1pbmF0aW5nIE5VTC4KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjcy52YWx1ZSA9PSB1ImFiY2RlZiIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY193c3RyaW5nKHUiYWJjXDAwMGRlZiIpLnZhbHVlID09IHUiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjcy52YWx1ZSA9PSB1ImFiY2RlZiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY193c3RyaW5nKHUiYWJjXDAwMGRlZiIpLnZhbHVlID09IHUiYWJjIikKIAotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfd3N0cmluZyh1ImFiY1wwMDBkZWYiKS52YWx1ZSA9PSB1ImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY193c3RyaW5nKHUiYWJjXDAwMGRlZiIpLnZhbHVlID09IHUiYWJjIikKIAogICAgICAgICAgICAgIyBUaGUgcmF3IHByb3BlcnR5IGlzIHRoZSB0b3RhbCBidWZmZXIgY29udGVudHM6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY3MucmF3ID09IHUiYWJjZGVmXDAwMCIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY193c3RyaW5nKHUiYWJjXDAwMGRlZiIpLnJhdyA9PSB1ImFiY1wwMDBkZWZcMDAwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjcy5yYXcgPT0gdSJhYmNkZWZcMDAwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjX3dzdHJpbmcodSJhYmNcMDAwZGVmIikucmF3ID09IHUiYWJjXDAwMGRlZlwwMDAiKQogCiAgICAgICAgICAgICAjIFdlIGNhbiBjaGFuZ2UgdGhlIHZhbHVlOgogICAgICAgICAgICAgY3MudmFsdWUgPSB1ImFiIgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNzLnZhbHVlID09IHUiYWIiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNzLnJhdyA9PSB1ImFiXDAwMFwwMDBcMDAwXDAwMFwwMDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNzLnZhbHVlID09IHUiYWIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNzLnJhdyA9PSB1ImFiXDAwMFwwMDBcMDAwXDAwMFwwMDAiKQogCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNfd3N0cmluZywgIjEyMyIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBjX3dzdHJpbmcsIDApCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3RfZmllbGRzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0X2ZpZWxkcy5weQppbmRleCBlZjVmYjUwLi4yMmViM2IwIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3RfZmllbGRzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdF9maWVsZHMucHkKQEAgLTE1LDcgKzE1LDcgQEAKICAgICBkZWYgdGVzdF8xX0Eoc2VsZik6CiAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCAwKSAjIG5vdCBmaW5hbGl6ZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIDApICMgbm90IGZpbmFsaXplZAogICAgICAgICBYLl9maWVsZHNfID0gW10gIyBmaW5hbGl6ZWQKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIFgsICJfZmllbGRzXyIsIFtdKQogCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfc3RydWN0dXJlcy5weQppbmRleCAwYzVhMzQ3Li4xNjhjM2NkIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zdHJ1Y3R1cmVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3N0cnVjdHVyZXMucHkKQEAgLTEzLDMzICsxMywzMyBAQAogICAgICAgICBjbGFzcyBaKFgpOgogICAgICAgICAgICAgcGFzcwogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYKSwgc2l6ZW9mKGNfaW50KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFkpLCBzaXplb2YoY19pbnQpKjIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihaKSwgc2l6ZW9mKGNfaW50KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5fZmllbGRzXywgWygiYSIsIGNfaW50KV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFkuX2ZpZWxkc18sIFsoImIiLCBjX2ludCldKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChaLl9maWVsZHNfLCBbKCJhIiwgY19pbnQpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFkpLCBzaXplb2YoY19pbnQpKjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFopLCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguX2ZpZWxkc18sIFsoImEiLCBjX2ludCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFkuX2ZpZWxkc18sIFsoImIiLCBjX2ludCldKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFouX2ZpZWxkc18sIFsoImEiLCBjX2ludCldKQogCiAgICAgZGVmIHRlc3Rfc3ViY2xhc3NfZGVsYXllZChzZWxmKToKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgcGFzcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCAwKQogICAgICAgICBYLl9maWVsZHNfID0gWygiYSIsIGNfaW50KV0KIAogICAgICAgICBjbGFzcyBZKFgpOgogICAgICAgICAgICAgcGFzcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWSksIHNpemVvZihYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWSksIHNpemVvZihYKSkKICAgICAgICAgWS5fZmllbGRzXyA9IFsoImIiLCBjX2ludCldCiAKICAgICAgICAgY2xhc3MgWihYKToKICAgICAgICAgICAgIHBhc3MKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihZKSwgc2l6ZW9mKGNfaW50KSoyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWiksIHNpemVvZihjX2ludCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFguX2ZpZWxkc18sIFsoImEiLCBjX2ludCldKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChZLl9maWVsZHNfLCBbKCJiIiwgY19pbnQpXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWi5fZmllbGRzXywgWygiYSIsIGNfaW50KV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihZKSwgc2l6ZW9mKGNfaW50KSoyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihaKSwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLl9maWVsZHNfLCBbKCJhIiwgY19pbnQpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChZLl9maWVsZHNfLCBbKCJiIiwgY19pbnQpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChaLl9maWVsZHNfLCBbKCJhIiwgY19pbnQpXSkKIAogY2xhc3MgU3RydWN0dXJlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGZvcm1hdHMgPSB7ImMiOiBjX2NoYXIsCkBAIC02Miw3ICs2Miw3IEBACiAgICAgICAgICAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19jaGFyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCB0cCldCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoc2l6ZW9mKFgpLCBjb2RlKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHNpemVvZihYKSwgY29kZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FsY3NpemUoImMlYzAlYyIgJSAoY29kZSwgY29kZSkpLCBjb2RlKSkKIAogICAgIGRlZiB0ZXN0X3VuaW9ucyhzZWxmKToKQEAgLTcwLDM5ICs3MCwzOSBAQAogICAgICAgICAgICAgY2xhc3MgWChVbmlvbik6CiAgICAgICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19jaGFyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInkiLCB0cCldCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoc2l6ZW9mKFgpLCBjb2RlKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHNpemVvZihYKSwgY29kZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FsY3NpemUoIiVjIiAlIChjb2RlKSksIGNvZGUpKQogCiAgICAgZGVmIHRlc3Rfc3RydWN0X2FsaWdubWVudChzZWxmKToKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19jaGFyICogMyldCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFsaWdubWVudChYKSwgY2FsY3NpemUoInMiKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBjYWxjc2l6ZSgiM3MiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGlnbm1lbnQoWCksIGNhbGNzaXplKCJzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFgpLCBjYWxjc2l6ZSgiM3MiKSkKIAogICAgICAgICBjbGFzcyBZKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2NoYXIgKiAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgieSIsIGNfaW50KV0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYWxpZ25tZW50KFkpLCBjYWxjc2l6ZSgiaSIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWSksIGNhbGNzaXplKCIzc2kiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGlnbm1lbnQoWSksIGNhbGNzaXplKCJpIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFkpLCBjYWxjc2l6ZSgiM3NpIikpCiAKICAgICAgICAgY2xhc3MgU0koU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIFgpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgWSldCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFsaWdubWVudChTSSksIG1heChhbGlnbm1lbnQoWSksIGFsaWdubWVudChYKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihTSSksIGNhbGNzaXplKCIzczBpIDNzaSAwaSIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaWdubWVudChTSSksIG1heChhbGlnbm1lbnQoWSksIGFsaWdubWVudChYKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKFNJKSwgY2FsY3NpemUoIjNzMGkgM3NpIDBpIikpCiAKICAgICAgICAgY2xhc3MgSVMoU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYiIsIFkpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJhIiwgWCldCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYWxpZ25tZW50KFNJKSwgbWF4KGFsaWdubWVudChYKSwgYWxpZ25tZW50KFkpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKElTKSwgY2FsY3NpemUoIjNzaSAzcyAwaSIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaWdubWVudChTSSksIG1heChhbGlnbm1lbnQoWCksIGFsaWdubWVudChZKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKElTKSwgY2FsY3NpemUoIjNzaSAzcyAwaSIpKQogCiAgICAgICAgIGNsYXNzIFhYKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBYKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIFgpXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChhbGlnbm1lbnQoWFgpLCBhbGlnbm1lbnQoWCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYWCksIGNhbGNzaXplKCIzcyAzcyAwcyIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFsaWdubWVudChYWCksIGFsaWdubWVudChYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWFgpLCBjYWxjc2l6ZSgiM3MgM3MgMHMiKSkKIAogICAgIGRlZiB0ZXN0X2VtdHB5KHNlbGYpOgogICAgICAgICAjIEkgaGFkIHByb2JsZW1zIHdpdGggdGhlc2UKQEAgLTExNSwxNSArMTE1LDE1IEBACiAgICAgICAgICAgICBfZmllbGRzXyA9IFtdCiAKICAgICAgICAgIyBJcyB0aGlzIHJlYWxseSB0aGUgY29ycmVjdCBhbGlnbm1lbnQsIG9yIHNob3VsZCBpdCBiZSAwPwotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYWxpZ25tZW50KFgpID09IGFsaWdubWVudChZKSA9PSAxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2l6ZW9mKFgpID09IHNpemVvZihZKSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYWxpZ25tZW50KFgpID09IGFsaWdubWVudChZKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2l6ZW9mKFgpID09IHNpemVvZihZKSA9PSAwKQogCiAgICAgICAgIGNsYXNzIFhYKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoImEiLCBYKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIFgpXQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFsaWdubWVudChYWCksIDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZihYWCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxpZ25tZW50KFhYKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWFgpLCAwKQogCiAgICAgZGVmIHRlc3RfZmllbGRzKHNlbGYpOgogICAgICAgICAjIHRlc3QgdGhlIG9mZnNldCBhbmQgc2l6ZSBhdHRyaWJ1dGVzIG9mIFN0cnVjdHVyZS9Vbm9pbiBmaWVsZHMuCkBAIC0xMzEsMTEgKzEzMSwxMSBAQAogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19jaGFyKV0KIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLngub2Zmc2V0LCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLnguc2l6ZSwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLngub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgueC5zaXplLCBzaXplb2YoY19pbnQpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFgueS5vZmZzZXQsIHNpemVvZihjX2ludCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFgueS5zaXplLCBzaXplb2YoY19jaGFyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLnkub2Zmc2V0LCBzaXplb2YoY19pbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgueS5zaXplLCBzaXplb2YoY19jaGFyKSkKIAogICAgICAgICAjIHJlYWRvbmx5CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgc2V0YXR0ciwgWC54LCAib2Zmc2V0IiwgOTIpCkBAIC0xNDUsMTEgKzE0NSwxMSBAQAogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJ4IiwgY19pbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJ5IiwgY19jaGFyKV0KIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLngub2Zmc2V0LCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLnguc2l6ZSwgc2l6ZW9mKGNfaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLngub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgueC5zaXplLCBzaXplb2YoY19pbnQpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFgueS5vZmZzZXQsIDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFgueS5zaXplLCBzaXplb2YoY19jaGFyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLnkub2Zmc2V0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFgueS5zaXplLCBzaXplb2YoY19jaGFyKSkKIAogICAgICAgICAjIHJlYWRvbmx5CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKChUeXBlRXJyb3IsIEF0dHJpYnV0ZUVycm9yKSwgc2V0YXR0ciwgWC54LCAib2Zmc2V0IiwgOTIpCkBAIC0xNjQsMjIgKzE2NCwyMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKCJiIiwgY19sb25nbG9uZyldCiAgICAgICAgICAgICBfcGFja18gPSAxCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCA5KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLmIub2Zmc2V0LCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgOSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmIub2Zmc2V0LCAxKQogCiAgICAgICAgIGNsYXNzIFgoU3RydWN0dXJlKToKICAgICAgICAgICAgIF9maWVsZHNfID0gWygiYSIsIGNfYnl0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2xvbmdsb25nKV0KICAgICAgICAgICAgIF9wYWNrXyA9IDIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCAxMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5iLm9mZnNldCwgMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFguYi5vZmZzZXQsIDIpCiAKICAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19ieXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgiYiIsIGNfbG9uZ2xvbmcpXQogICAgICAgICAgICAgX3BhY2tfID0gNAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIDEyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChYLmIub2Zmc2V0LCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZihYKSwgMTIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoWC5iLm9mZnNldCwgNCkKIAogICAgICAgICBpbXBvcnQgc3RydWN0CiAgICAgICAgIGxvbmdsb25nX3NpemUgPSBzdHJ1Y3QuY2FsY3NpemUoInEiKQpAQCAtMTkwLDggKzE5MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoImIiLCBjX2xvbmdsb25nKV0KICAgICAgICAgICAgIF9wYWNrXyA9IDgKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoWCksIGxvbmdsb25nX2FsaWduICsgbG9uZ2xvbmdfc2l6ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoWC5iLm9mZnNldCwgbWluKDgsIGxvbmdsb25nX2FsaWduKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIGxvbmdsb25nX2FsaWduICsgbG9uZ2xvbmdfc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChYLmIub2Zmc2V0LCBtaW4oOCwgbG9uZ2xvbmdfYWxpZ24pKQogCiAKICAgICAgICAgZCA9IHsiX2ZpZWxkc18iOiBbKCJhIiwgImIiKSwKQEAgLTIwOSw5ICsyMDksOSBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFBlcnNvbiwgIk5hbWUiLCAiSEkiKQogCiAgICAgICAgICMgc2hvcnQgZW5vdWdoCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFBlcnNvbigiMTIzNDUiLCA1KS5uYW1lLCAiMTIzNDUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFBlcnNvbigiMTIzNDUiLCA1KS5uYW1lLCAiMTIzNDUiKQogICAgICAgICAjIGV4YWN0IGZpdAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChQZXJzb24oIjEyMzQ1NiIsIDUpLm5hbWUsICIxMjM0NTYiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFBlcnNvbigiMTIzNDU2IiwgNSkubmFtZSwgIjEyMzQ1NiIpCiAgICAgICAgICMgdG9vIGxvbmcKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgUGVyc29uLCAiMTIzNDU2NyIsIDUpCiAKQEAgLTIyOSwxMCArMjI5LDEwIEBACiAgICAgICAgIGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CiAgICAgICAgICAgICBfZmllbGRzXyA9IFsoIngiLCBjX2ludCksICgieSIsIGNfaW50KV0KICAgICAgICAgcHQgPSBQT0lOVCgxLCAyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgocHQueCwgcHQueSksICgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgocHQueCwgcHQueSksICgxLCAyKSkKIAogICAgICAgICBwdCA9IFBPSU5UKHk9MiwgeD0xKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgocHQueCwgcHQueSksICgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgocHQueCwgcHQueSksICgxLCAyKSkKIAogICAgIGRlZiB0ZXN0X2ludmFsaWRfZmllbGRfdHlwZXMoc2VsZik6CiAgICAgICAgIGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CkBAIC0yNDQsMTQgKzI0NCwxNCBAQAogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJhIiwgY19pbnQgKiA0KV0KIAogICAgICAgICAjIGNhbiB1c2UgdHVwbGUgdG8gaW5pdGlhbGl6ZSBhcnJheSAoYnV0IG5vdCBsaXN0ISkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoU29tZUludHMoKDEsIDIpKS5hWzpdLCBbMSwgMiwgMCwgMF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFNvbWVJbnRzKCgxLCAyKSkuYVs6Ol0sIFsxLCAyLCAwLCAwXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoU29tZUludHMoKDEsIDIpKS5hWzo6LTFdLCBbMCwgMCwgMiwgMV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFNvbWVJbnRzKCgxLCAyKSkuYVs6OjJdLCBbMSwgMF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFNvbWVJbnRzKCgxLCAyKSkuYVsxOjU6Nl0sIFsyXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoU29tZUludHMoKDEsIDIpKS5hWzY6NDotMV0sIFtdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChTb21lSW50cygoMSwgMiwgMywgNCkpLmFbOl0sIFsxLCAyLCAzLCA0XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoU29tZUludHMoKDEsIDIsIDMsIDQpKS5hWzo6XSwgWzEsIDIsIDMsIDRdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFNvbWVJbnRzKCgxLCAyKSkuYVs6XSwgWzEsIDIsIDAsIDBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFNvbWVJbnRzKCgxLCAyKSkuYVs6Ol0sIFsxLCAyLCAwLCAwXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTb21lSW50cygoMSwgMikpLmFbOjotMV0sIFswLCAwLCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTb21lSW50cygoMSwgMikpLmFbOjoyXSwgWzEsIDBdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFNvbWVJbnRzKCgxLCAyKSkuYVsxOjU6Nl0sIFsyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChTb21lSW50cygoMSwgMikpLmFbNjo0Oi0xXSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU29tZUludHMoKDEsIDIsIDMsIDQpKS5hWzpdLCBbMSwgMiwgMywgNF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoU29tZUludHMoKDEsIDIsIDMsIDQpKS5hWzo6XSwgWzEsIDIsIDMsIDRdKQogICAgICAgICAjIHRvbyBsb25nCiAgICAgICAgICMgWFhYIFNob3VsZCByYWlzZSBWYWx1ZUVycm9yPywgbm90IFJ1bnRpbWVFcnJvcgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIFNvbWVJbnRzLCAoMSwgMiwgMywgNCwgNSkpCkBAIC0yNjksMTAgKzI2OSwxMCBAQAogCiAgICAgICAgIHAgPSBQZXJzb24oIlNvbWVvbmUiLCAoIjEyMzQiLCAiNTY3OCIpLCA1KQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHAubmFtZSwgIlNvbWVvbmUiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwLnBob25lLmFyZWFjb2RlLCAiMTIzNCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHAucGhvbmUubnVtYmVyLCAiNTY3OCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHAuYWdlLCA1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmFtZSwgIlNvbWVvbmUiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGhvbmUuYXJlYWNvZGUsICIxMjM0IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBob25lLm51bWJlciwgIjU2NzgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuYWdlLCA1KQogCiAgICAgZGVmIHRlc3Rfc3RydWN0dXJlc193aXRoX3djaGFyKHNlbGYpOgogICAgICAgICB0cnk6CkBAIC0yODUsMTIgKzI4NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKCJhZ2UiLCBjX2ludCldCiAKICAgICAgICAgcCA9IFBlcnNvblcodSJTb21lb25lIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocC5uYW1lLCAiU29tZW9uZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uYW1lLCAiU29tZW9uZSIpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoUGVyc29uVyh1IjEyMzQ1Njc4OTAiKS5uYW1lLCB1IjEyMzQ1Njc4OTAiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChQZXJzb25XKHUiMTIzNDU2Nzg5MDEiKS5uYW1lLCB1IjEyMzQ1Njc4OTAxIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQZXJzb25XKHUiMTIzNDU2Nzg5MCIpLm5hbWUsIHUiMTIzNDU2Nzg5MCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUGVyc29uVyh1IjEyMzQ1Njc4OTAxIikubmFtZSwgdSIxMjM0NTY3ODkwMSIpCiAgICAgICAgICMgZXhhY3QgZml0Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFBlcnNvblcodSIxMjM0NTY3ODkwMTIiKS5uYW1lLCB1IjEyMzQ1Njc4OTAxMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoUGVyc29uVyh1IjEyMzQ1Njc4OTAxMiIpLm5hbWUsIHUiMTIzNDU2Nzg5MDEyIikKICAgICAgICAgI3RvbyBsb25nCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIFBlcnNvblcsIHUiMTIzNDU2Nzg5MDEyMyIpCiAKQEAgLTMwNSwyNCArMzA1LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoImFnZSIsIGNfaW50KV0KIAogICAgICAgICBjbHMsIG1zZyA9IHNlbGYuZ2V0X2V4Y2VwdChQZXJzb24sICJTb21lb25lIiwgKDEsIDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjbHMsIFJ1bnRpbWVFcnJvcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbHMsIFJ1bnRpbWVFcnJvcikKICAgICAgICAgIyBJbiBQeXRob24gMi41LCBFeGNlcHRpb24gaXMgYSBuZXctc3R5bGUgY2xhc3MsIGFuZCB0aGUgcmVwciBjaGFuZ2VkCiAgICAgICAgIGlmIGlzc3ViY2xhc3MoRXhjZXB0aW9uLCBvYmplY3QpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobXNnLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBob25lKSA8dHlwZSAnZXhjZXB0aW9ucy5UeXBlRXJyb3InPjogIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHN0cmluZyBvciBVbmljb2RlIG9iamVjdCwgaW50IGZvdW5kIikKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG1zZywKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihQaG9uZSkgZXhjZXB0aW9ucy5UeXBlRXJyb3I6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCBzdHJpbmcgb3IgVW5pY29kZSBvYmplY3QsIGludCBmb3VuZCIpCiAKICAgICAgICAgY2xzLCBtc2cgPSBzZWxmLmdldF9leGNlcHQoUGVyc29uLCAiU29tZW9uZSIsICgiYSIsICJiIiwgImMiKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY2xzLCBSdW50aW1lRXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2xzLCBSdW50aW1lRXJyb3IpCiAgICAgICAgIGlmIGlzc3ViY2xhc3MoRXhjZXB0aW9uLCBvYmplY3QpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobXNnLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFBob25lKSA8dHlwZSAnZXhjZXB0aW9ucy5UeXBlRXJyb3InPjogdG9vIG1hbnkgaW5pdGlhbGl6ZXJzIikKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG1zZywgIihQaG9uZSkgZXhjZXB0aW9ucy5UeXBlRXJyb3I6IHRvbyBtYW55IGluaXRpYWxpemVycyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgIihQaG9uZSkgZXhjZXB0aW9ucy5UeXBlRXJyb3I6IHRvbyBtYW55IGluaXRpYWxpemVycyIpCiAKIAogICAgIGRlZiBnZXRfZXhjZXB0KHNlbGYsIGZ1bmMsICphcmdzKToKQEAgLTMzNyw3ICszMzcsNyBAQAogIyMgICAgICAgICMgc2FtZSBhcyAnY2xhc3MgWChTdHJ1Y3R1cmUpOiBwYXNzJwogIyMgICAgICAgICMgZmFpbHMsIHNpbmNlIHdlIG5lZWQgZWl0aGVyIGEgX2ZpZWxkc18gb3IgYSBfYWJzdHJhY3RfIGF0dHJpYnV0ZQogIyMgICAgICAgIGNscywgbXNnID0gc2VsZi5nZXRfZXhjZXB0KG1ldGEsICJYIiwgKFN0cnVjdHVyZSwpLCB7fSkKLSMjICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoY2xzLCBtc2cpLAorIyMgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGNscywgbXNnKSwKICMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXR0cmlidXRlRXJyb3IsICJjbGFzcyBtdXN0IGRlZmluZSBhICdfZmllbGRzXycgYXR0cmlidXRlIikpCiAKICAgICBkZWYgdGVzdF9hYnN0cmFjdF9jbGFzcyhzZWxmKToKQEAgLTM0NSwxNSArMzQ1LDE1IEBACiAgICAgICAgICAgICBfYWJzdHJhY3RfID0gInNvbWV0aGluZyIKICAgICAgICAgIyB0cnkgJ1goKScKICAgICAgICAgY2xzLCBtc2cgPSBzZWxmLmdldF9leGNlcHQoZXZhbCwgIlgoKSIsIGxvY2FscygpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoY2xzLCBtc2cpLCAoVHlwZUVycm9yLCAiYWJzdHJhY3QgY2xhc3MiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoY2xzLCBtc2cpLCAoVHlwZUVycm9yLCAiYWJzdHJhY3QgY2xhc3MiKSkKIAogICAgIGRlZiB0ZXN0X21ldGhvZHMoc2VsZik6CiAjIyAgICAgICAgY2xhc3MgWChTdHJ1Y3R1cmUpOgogIyMgICAgICAgICAgICBfZmllbGRzXyA9IFtdCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCJpbl9kbGwiIGluIGRpcih0eXBlKFN0cnVjdHVyZSkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoImZyb21fYWRkcmVzcyIgaW4gZGlyKHR5cGUoU3RydWN0dXJlKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygiaW5fZGxsIiBpbiBkaXIodHlwZShTdHJ1Y3R1cmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJpbl9kbGwiIGluIGRpcih0eXBlKFN0cnVjdHVyZSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImZyb21fYWRkcmVzcyIgaW4gZGlyKHR5cGUoU3RydWN0dXJlKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiaW5fZGxsIiBpbiBkaXIodHlwZShTdHJ1Y3R1cmUpKSkKIAogY2xhc3MgUG9pbnRlck1lbWJlclRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtMzY2LDcgKzM2Niw3IEBACiAgICAgICAgICMgV2UgY2FuIGFzc2lnbiBhcnJheXMgb2YgdGhlIGNvcnJlY3QgdHlwZQogICAgICAgICBzLmFycmF5ID0gKGNfaW50ICogMykoMSwgMiwgMykKICAgICAgICAgaXRlbXMgPSBbcy5hcnJheVtpXSBmb3IgaSBpbiByYW5nZSgzKV0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaXRlbXMsIFsxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtcywgWzEsIDIsIDNdKQogCiAgICAgICAgICMgVGhlIGZvbGxvd2luZyBhcmUgYnVncywgYnV0IGFyZSBpbmNsdWRlZCBoZXJlIGJlY2F1c2UgdGhlIHVuaXR0ZXN0cwogICAgICAgICAjIGFsc28gZGVzY3JpYmUgdGhlIGN1cnJlbnQgYmVoYXZpb3VyLgpAQCAtMzc3LDE0ICszNzcsMTQgQEAKICAgICAgICAgcy5hcnJheVswXSA9IDQyCiAKICAgICAgICAgaXRlbXMgPSBbcy5hcnJheVtpXSBmb3IgaSBpbiByYW5nZSgzKV0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaXRlbXMsIFs0MiwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbXMsIFs0MiwgMiwgM10pCiAKICAgICAgICAgcy5hcnJheVswXSA9IDEKIAogIyMgICAgICAgIHMuYXJyYXlbMV0gPSA0MgogCiAgICAgICAgIGl0ZW1zID0gW3MuYXJyYXlbaV0gZm9yIGkgaW4gcmFuZ2UoMyldCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGl0ZW1zLCBbMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbXMsIFsxLCAyLCAzXSkKIAogICAgIGRlZiB0ZXN0X25vbmVfdG9fcG9pbnRlcl9maWVsZHMoc2VsZik6CiAgICAgICAgIGNsYXNzIFMoU3RydWN0dXJlKToKQEAgLTM5NCw3ICszOTQsNyBAQAogICAgICAgICBzID0gUygpCiAgICAgICAgIHMueCA9IDEyMzQ1Njc4CiAgICAgICAgIHMucCA9IE5vbmUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocy54LCAxMjM0NTY3OCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLngsIDEyMzQ1Njc4KQogCiBjbGFzcyBUZXN0UmVjdXJzaXZlU3RydWN0dXJlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9jb250YWluc19pdHNlbGYoc2VsZik6CkBAIC00MDQsNyArNDA0LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgUmVjdXJzaXZlLl9maWVsZHNfID0gWygibmV4dCIsIFJlY3Vyc2l2ZSldCiAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvciwgZGV0YWlsczoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcygiU3RydWN0dXJlIG9yIHVuaW9uIGNhbm5vdCBjb250YWluIGl0c2VsZiIgaW4KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiU3RydWN0dXJlIG9yIHVuaW9uIGNhbm5vdCBjb250YWluIGl0c2VsZiIgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoZGV0YWlscykpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIlN0cnVjdHVyZSBvciB1bmlvbiBjYW5ub3QgY29udGFpbiBpdHNlbGYiKQpAQCAtNDIxLDcgKzQyMSw3IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIFNlY29uZC5fZmllbGRzXyA9IFsoImZpcnN0IiwgRmlyc3QpXQogICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3IsIGRldGFpbHM6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoIl9maWVsZHNfIGlzIGZpbmFsIiBpbgorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJfZmllbGRzXyBpcyBmaW5hbCIgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIoZGV0YWlscykpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIkF0dHJpYnV0ZUVycm9yIG5vdCByYWlzZWQiKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdW5hbGlnbmVkX3N0cnVjdHVyZXMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmFsaWduZWRfc3RydWN0dXJlcy5weQppbmRleCA4OTM0M2JhLi5iY2FjZmM4IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmFsaWduZWRfc3RydWN0dXJlcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmFsaWduZWRfc3RydWN0dXJlcy5weQpAQCAtMjgsMTggKzI4LDE4IEBACiAgICAgZGVmIHRlc3RfbmF0aXZlKHNlbGYpOgogICAgICAgICBmb3IgdHlwIGluIHN0cnVjdHVyZXM6CiAjIyAgICAgICAgICAgIHByaW50IHR5cC52YWx1ZQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwLnZhbHVlLm9mZnNldCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwLnZhbHVlLm9mZnNldCwgMSkKICAgICAgICAgICAgIG8gPSB0eXAoKQogICAgICAgICAgICAgby52YWx1ZSA9IDQKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG8udmFsdWUsIDQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8udmFsdWUsIDQpCiAKICAgICBkZWYgdGVzdF9zd2FwcGVkKHNlbGYpOgogICAgICAgICBmb3IgdHlwIGluIGJ5dGVzd2FwcGVkX3N0cnVjdHVyZXM6CiAjIyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIHR5cC52YWx1ZQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwLnZhbHVlLm9mZnNldCwgMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwLnZhbHVlLm9mZnNldCwgMSkKICAgICAgICAgICAgIG8gPSB0eXAoKQogICAgICAgICAgICAgby52YWx1ZSA9IDQKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG8udmFsdWUsIDQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8udmFsdWUsIDQpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdW5pY29kZS5weQppbmRleCA4OGQwNzczLi42NTU3NDc5IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF91bmljb2RlLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3VuaWNvZGUucHkKQEAgLTIzLDU1ICsyMyw1NSBAQAogICAgICAgICBkZWYgdGVzdF9hc2NpaV9zdHJpY3Qoc2VsZik6CiAgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKICAgICAgICAgICAgICMgbm8gY29udmVyc2lvbnMgdGFrZSBwbGFjZSB3aXRoIHVuaWNvZGUgYXJndW1lbnRzCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbih1ImFiXHUyMDcwIiksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQogICAgICAgICAgICAgIyBzdHJpbmcgYXJncyBhcmUgY29udmVydGVkCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKGN0eXBlcy5Bcmd1bWVudEVycm9yLCB3Y3NsZW4sICJhYuQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoY3R5cGVzLkFyZ3VtZW50RXJyb3IsIHdjc2xlbiwgImFi5CIpCiAKICAgICAgICAgZGVmIHRlc3RfYXNjaWlfcmVwbGFjZShzZWxmKToKICAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbigiYWJjIiksIDMpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Y3NsZW4oImFi5CIpLCAzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYmMiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYuQiKSwgMykKIAogICAgICAgICBkZWYgdGVzdF9hc2NpaV9pZ25vcmUoc2VsZik6CiAgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAiaWdub3JlIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbih1ImFiYyIpLCAzKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbih1ImFiXHUyMDcwIiksIDMpCiAgICAgICAgICAgICAjIGlnbm9yZSBlcnJvciBtb2RlIHNraXBzIG5vbi1hc2NpaSBjaGFyYWN0ZXJzCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Y3NsZW4oImFiYyIpLCAzKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2NzbGVuKCLk9vzfIiksIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigiYWJjIiksIDMpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdjc2xlbigi5Pb83yIpLCAwKQogCiAgICAgICAgIGRlZiB0ZXN0X2xhdGluMV9zdHJpY3Qoc2VsZik6CiAgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgibGF0aW4tMSIsICJzdHJpY3QiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2NzbGVuKHUiYWJjIiksIDMpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Y3NsZW4odSJhYlx1MjA3MCIpLCAzKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwod2NzbGVuKCJhYmMiKSwgMykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdjc2xlbigi5Pb83yIpLCA0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Y3NsZW4odSJhYmMiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKHUiYWJcdTIwNzAiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCJhYmMiKSwgMykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod2NzbGVuKCLk9vzfIiksIDQpCiAKICAgICAgICAgZGVmIHRlc3RfYnVmZmVycyhzZWxmKToKICAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJzdHJpY3QiKQogICAgICAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV91bmljb2RlX2J1ZmZlcigiYWJjIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihidWYpLCAzKzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihidWYpLCAzKzEpCiAKICAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKICAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfdW5pY29kZV9idWZmZXIoImFi5Pb8IikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6XSwgdSJhYlx1RkZGRFx1RkZGRFx1RkZGRFwwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6Ol0sIHUiYWJcdUZGRkRcdUZGRkRcdUZGRkRcMCIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOjotMV0sIHUiXDBcdUZGRkRcdUZGRkRcdUZGRkRiYSIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOjoyXSwgdSJhXHVGRkZEXHVGRkZEIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls2OjU6LTFdLCB1IiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6XSwgdSJhYlx1RkZGRFx1RkZGRFx1RkZGRFwwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgdSJhYlx1RkZGRFx1RkZGRFx1RkZGRFwwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6LTFdLCB1IlwwXHVGRkZEXHVGRkZEXHVGRkZEYmEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjoyXSwgdSJhXHVGRkZEXHVGRkZEIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzY6NTotMV0sIHUiIikKIAogICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgImlnbm9yZSIpCiAgICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3VuaWNvZGVfYnVmZmVyKCJhYuT2/CIpCiAgICAgICAgICAgICAjIGlzIHRoYXQgY29ycmVjdD8gbm90IHN1cmUuICBCdXQgd2l0aCAnaWdub3JlJywgeW91IGdldCB3aGF0IHlvdSBwYXkgZm9yLi4KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6XSwgdSJhYlwwXDBcMFwwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6Ol0sIHUiYWJcMFwwXDBcMCIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOjotMV0sIHUiXDBcMFwwXDBiYSIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOjoyXSwgdSJhXDBcMCIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbNjo1Oi0xXSwgdSIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sIHUiYWJcMFwwXDBcMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Ol0sIHUiYWJcMFwwXDBcMCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJ1Zls6Oi0xXSwgdSJcMFwwXDBcMGJhIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6Ml0sIHUiYVwwXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbNjo1Oi0xXSwgdSIiKQogCiAgICAgaW1wb3J0IF9jdHlwZXNfdGVzdAogICAgIGZ1bmMgPSBjdHlwZXMuQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pLl90ZXN0ZnVuY19wX3AKQEAgLTg5LDQxICs4OSw0MSBAQAogCiAgICAgICAgIGRlZiB0ZXN0X2FzY2lpX3JlcGxhY2Uoc2VsZik6CiAgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGZ1bmModSJhYmMiKSwgImFiYyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1ImFiYyIpLCAiYWJjIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGN0eXBlcy5Bcmd1bWVudEVycm9yLCBmdW5jLCB1ImFi5CIpCiAKICAgICAgICAgZGVmIHRlc3RfYXNjaWlfaWdub3JlKHNlbGYpOgogICAgICAgICAgICAgY3R5cGVzLnNldF9jb252ZXJzaW9uX21vZGUoImFzY2lpIiwgImlnbm9yZSIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKCJhYmMiKSwgImFiYyIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKHUiYWJjIiksICJhYmMiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZnVuYyh1IuT2/N8iKSwgIiIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1ImFiYyIpLCAiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1IuT2/N8iKSwgIiIpCiAKICAgICAgICAgZGVmIHRlc3RfYXNjaWlfcmVwbGFjZShzZWxmKToKICAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJyZXBsYWNlIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGZ1bmModSJhYmMiKSwgImFiYyIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmdW5jKHUi5Pb83yIpLCAiPz8/PyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZ1bmMoImFiYyIpLCAiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1ImFiYyIpLCAiYWJjIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYyh1IuT2/N8iKSwgIj8/Pz8iKQogCiAgICAgICAgIGRlZiB0ZXN0X2J1ZmZlcnMoc2VsZik6CiAgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAic3RyaWN0IikKICAgICAgICAgICAgIGJ1ZiA9IGN0eXBlcy5jcmVhdGVfc3RyaW5nX2J1ZmZlcih1ImFiYyIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oYnVmKSwgMysxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYnVmKSwgMysxKQogCiAgICAgICAgICAgICBjdHlwZXMuc2V0X2NvbnZlcnNpb25fbW9kZSgiYXNjaWkiLCAicmVwbGFjZSIpCiAgICAgICAgICAgICBidWYgPSBjdHlwZXMuY3JlYXRlX3N0cmluZ19idWZmZXIodSJhYuT2/CIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOl0sICJhYj8/P1wwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6Ol0sICJhYj8/P1wwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6Oi0xXSwgIlwwPz8/YmEiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYnVmWzo6Ml0sICJhPz8iKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYnVmWzY6NTotMV0sICIiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sICJhYj8/P1wwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgImFiPz8/XDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjotMV0sICJcMD8/P2JhIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6Ml0sICJhPz8iKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbNjo1Oi0xXSwgIiIpCiAKICAgICAgICAgICAgIGN0eXBlcy5zZXRfY29udmVyc2lvbl9tb2RlKCJhc2NpaSIsICJpZ25vcmUiKQogICAgICAgICAgICAgYnVmID0gY3R5cGVzLmNyZWF0ZV9zdHJpbmdfYnVmZmVyKHUiYWLk9vwiKQogICAgICAgICAgICAgIyBpcyB0aGF0IGNvcnJlY3Q/IG5vdCBzdXJlLiAgQnV0IHdpdGggJ2lnbm9yZScsIHlvdSBnZXQgd2hhdCB5b3UgcGF5IGZvci4uCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChidWZbOl0sICJhYlwwXDBcMFwwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6Ol0sICJhYlwwXDBcMFwwIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJ1Zls6Oi0xXSwgIlwwXDBcMFwwYmEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOl0sICJhYlwwXDBcMFwwIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnVmWzo6XSwgImFiXDBcMFwwXDAiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChidWZbOjotMV0sICJcMFwwXDBcMGJhIikKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3ZhbHVlcy5weQppbmRleCA3YmEzZTIxLi40Y2JmZDRiIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YWx1ZXMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFsdWVzLnB5CkBAIC0xMyw5ICsxMyw5IEBACiAgICAgICAgIGN0ZGxsID0gQ0RMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAgICAgICAgIGFuX2ludGVnZXIgPSBjX2ludC5pbl9kbGwoY3RkbGwsICJhbl9pbnRlZ2VyIikKICAgICAgICAgeCA9IGFuX2ludGVnZXIudmFsdWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeCwgY3RkbGwuZ2V0X2FuX2ludGVnZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCBjdGRsbC5nZXRfYW5faW50ZWdlcigpKQogICAgICAgICBhbl9pbnRlZ2VyLnZhbHVlICo9IDIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeCoyLCBjdGRsbC5nZXRfYW5faW50ZWdlcigpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgqMiwgY3RkbGwuZ2V0X2FuX2ludGVnZXIoKSkKIAogICAgIGRlZiB0ZXN0X3VuZGVmaW5lZChzZWxmKToKICAgICAgICAgY3RkbGwgPSBDRExMKF9jdHlwZXNfdGVzdC5fX2ZpbGVfXykKQEAgLTM0LDExICszNCwxMSBAQAogICAgICAgICAgICAgIyBkb2NzdHJpbmdzIGFyZSBhbHNvIHJlbW92ZWQgaW4gdGhlIGxhdHRlciBjYXNlLgogICAgICAgICAgICAgb3B0ID0gY19pbnQuaW5fZGxsKHB5ZGxsLCAiUHlfT3B0aW1pemVGbGFnIikudmFsdWUKICAgICAgICAgICAgIGlmIF9fZGVidWdfXzoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvcHQsIDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQsIDApCiAgICAgICAgICAgICBlbGlmIFZhbHVlc1Rlc3RDYXNlLl9fZG9jX18gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3B0LCAxKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0LCAxKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvcHQsIDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHQsIDIpCiAKICAgICAgICAgZGVmIHRlc3RfZnJvemVudGFibGUoc2VsZik6CiAgICAgICAgICAgICAjIFB5dGhvbiBleHBvcnRzIGEgUHlJbXBvcnRfRnJvemVuTW9kdWxlcyBzeW1ib2wuIFRoaXMgaXMgYQpAQCAtNzAsNyArNzAsNyBAQAogICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gWygiX19oZWxsb19fIiwgMTA0KSwgKCJfX3BoZWxsb19fIiwgLTEwNCksICgiX19waGVsbG9fXy5zcGFtIiwgMTA0KV0KICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBbKCJfX2hlbGxvX18iLCAxMDApLCAoIl9fcGhlbGxvX18iLCAtMTAwKSwgKCJfX3BoZWxsb19fLnNwYW0iLCAxMDApXQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaXRlbXMsIGV4cGVjdGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtcywgZXhwZWN0ZWQpCiAKICAgICAgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBfcG9pbnRlcl90eXBlX2NhY2hlCiAgICAgICAgICAgICBkZWwgX3BvaW50ZXJfdHlwZV9jYWNoZVtzdHJ1Y3RfZnJvemVuXQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdmFyc2l6ZV9zdHJ1Y3QucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YXJzaXplX3N0cnVjdC5weQppbmRleCAwNmQyMzIzLi5mNDA5NTAwIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YXJzaXplX3N0cnVjdC5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF92YXJzaXplX3N0cnVjdC5weQpAQCAtNyw0NCArNyw0NCBAQAogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJpdGVtIiwgY19pbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJhcnJheSIsIGNfaW50ICogMSldCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKFgpLCBzaXplb2YoY19pbnQpICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoWCksIHNpemVvZihjX2ludCkgKiAyKQogICAgICAgICB4ID0gWCgpCiAgICAgICAgIHguaXRlbSA9IDQyCiAgICAgICAgIHguYXJyYXlbMF0gPSAxMDAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKHgpLCBzaXplb2YoY19pbnQpICogMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoeCksIHNpemVvZihjX2ludCkgKiAyKQogCiAgICAgICAgICMgbWFrZSByb29tIGZvciBvbmUgYWRkaXRpb25hbCBpdGVtCiAgICAgICAgIG5ld19zaXplID0gc2l6ZW9mKFgpICsgc2l6ZW9mKGNfaW50KSAqIDEKICAgICAgICAgcmVzaXplKHgsIG5ld19zaXplKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2YoeCksIG5ld19zaXplKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgoeC5pdGVtLCB4LmFycmF5WzBdKSwgKDQyLCAxMDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNpemVvZih4KSwgbmV3X3NpemUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHguaXRlbSwgeC5hcnJheVswXSksICg0MiwgMTAwKSkKIAogICAgICAgICAjIG1ha2Ugcm9vbSBmb3IgMTAgYWRkaXRpb25hbCBpdGVtcwogICAgICAgICBuZXdfc2l6ZSA9IHNpemVvZihYKSArIHNpemVvZihjX2ludCkgKiA5CiAgICAgICAgIHJlc2l6ZSh4LCBuZXdfc2l6ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKHgpLCBuZXdfc2l6ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoKHguaXRlbSwgeC5hcnJheVswXSksICg0MiwgMTAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2YoeCksIG5ld19zaXplKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCh4Lml0ZW0sIHguYXJyYXlbMF0pLCAoNDIsIDEwMCkpCiAKICAgICAgICAgIyBtYWtlIHJvb20gZm9yIG9uZSBhZGRpdGlvbmFsIGl0ZW0KICAgICAgICAgbmV3X3NpemUgPSBzaXplb2YoWCkgKyBzaXplb2YoY19pbnQpICogMQogICAgICAgICByZXNpemUoeCwgbmV3X3NpemUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZih4KSwgbmV3X3NpemUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKCh4Lml0ZW0sIHguYXJyYXlbMF0pLCAoNDIsIDEwMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKHgpLCBuZXdfc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoeC5pdGVtLCB4LmFycmF5WzBdKSwgKDQyLCAxMDApKQogCiAgICAgZGVmIHRlc3RfYXJyYXlfaW52YWxpZF9sZW5ndGgoc2VsZik6CiAgICAgICAgICMgY2Fubm90IGNyZWF0ZSBhcnJheXMgd2l0aCBub24tcG9zaXRpdmUgc2l6ZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBjX2ludCAqIC0xKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiBjX2ludCAqIC0zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IGNfaW50ICogLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogY19pbnQgKiAtMykKIAogICAgIGRlZiB0ZXN0X3plcm9zaXplZF9hcnJheShzZWxmKToKICAgICAgICAgYXJyYXkgPSAoY19pbnQgKiAwKSgpCiAgICAgICAgICMgYWNjZXNzaW5nIGVsZW1lbnRzIG9mIHplcm8tc2l6ZWQgYXJyYXlzIHJhaXNlIEluZGV4RXJyb3IKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fc2V0aXRlbV9fLCAwLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19nZXRpdGVtX18sIDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX3NldGl0ZW1fXywgMSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fZ2V0aXRlbV9fLCAxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19zZXRpdGVtX18sIC0xLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19nZXRpdGVtX18sIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX3NldGl0ZW1fXywgMCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19nZXRpdGVtX18sIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIGFycmF5Ll9fc2V0aXRlbV9fLCAxLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX2dldGl0ZW1fXywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgYXJyYXkuX19zZXRpdGVtX18sIC0xLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBhcnJheS5fX2dldGl0ZW1fXywgLTEpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF93aW4zMi5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5CmluZGV4IDUwNjdiNjAuLjVkZWRkOWYgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3dpbjMyLnB5CkBAIC0xOCw3ICsxOCw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBJc1dpbmRvdykKIAogICAgICAgICAgICAgIyBUaGlzIG9uZSBzaG91bGQgc3VjY2VlZWQuLi4KLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIElzV2luZG93KDApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBJc1dpbmRvdygwKSkKIAogICAgICAgICAgICAgIyBWYWx1ZUVycm9yOiBQcm9jZWR1cmUgcHJvYmFibHkgY2FsbGVkIHdpdGggdG9vIG1hbnkgYXJndW1lbnRzICg4IGJ5dGVzIGluIGV4Y2VzcykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIElzV2luZG93LCAwLCAwLCAwKQpAQCAtNDksMTMgKzQ5LDEzIEBACiAgICAgY2xhc3MgVGVzdFdpbnR5cGVzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAgICAgZGVmIHRlc3RfSFdORChzZWxmKToKICAgICAgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCB3aW50eXBlcwotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKHdpbnR5cGVzLkhXTkQpLCBzaXplb2YoY192b2lkX3ApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2Yod2ludHlwZXMuSFdORCksIHNpemVvZihjX3ZvaWRfcCkpCiAKICAgICAgICAgZGVmIHRlc3RfUEFSQU0oc2VsZik6CiAgICAgICAgICAgICBmcm9tIGN0eXBlcyBpbXBvcnQgd2ludHlwZXMKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNpemVvZih3aW50eXBlcy5XUEFSQU0pLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzaXplb2Yod2ludHlwZXMuV1BBUkFNKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihjX3ZvaWRfcCkpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzaXplb2Yod2ludHlwZXMuTFBBUkFNKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2l6ZW9mKHdpbnR5cGVzLkxQQVJBTSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY192b2lkX3ApKQogCiAgICAgICAgIGRlZiB0ZXN0X0NPTUVycm9yKHNlbGYpOgpAQCAtODQsNyArODQsNyBAQAogCiAgICAgICAgIHB0ID0gUE9JTlQoMTAsIDEwKQogICAgICAgICByZWN0ID0gUkVDVCgwLCAwLCAyMCwgMjApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDEsIGRsbC5Qb2ludEluUmVjdChieXJlZihyZWN0KSwgcHQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGRsbC5Qb2ludEluUmVjdChieXJlZihyZWN0KSwgcHQpKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2FyY2hpdmVfdXRpbC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9hcmNoaXZlX3V0aWwucHkKaW5kZXggMjljZDI3MS4uOTFiYzRlMyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2FyY2hpdmVfdXRpbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYXJjaGl2ZV91dGlsLnB5CkBAIC00Nyw3ICs0Nyw3IEBACiAKICAgICAgICAgIyBjaGVjayBpZiB0aGUgY29tcHJlc3NlZCB0YXJiYWxsIHdhcyBjcmVhdGVkCiAgICAgICAgIHRhcmJhbGwgPSBiYXNlX25hbWUgKyAnLnRhci5neicKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCiAKICAgICAgICAgIyB0cnlpbmcgYW4gdW5jb21wcmVzc2VkIG9uZQogICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgJ2FyY2hpdmUnKQpAQCAtNTgsNyArNTgsNyBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKICAgICAgICAgdGFyYmFsbCA9IGJhc2VfbmFtZSArICcudGFyJwotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHModGFyYmFsbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsKSkKIAogICAgIGRlZiBfdGFyaW5mbyhzZWxmLCBwYXRoKToKICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHBhdGgpCkBAIC05Niw3ICs5Niw3IEBACiAKICAgICAgICAgIyBjaGVjayBpZiB0aGUgY29tcHJlc3NlZCB0YXJiYWxsIHdhcyBjcmVhdGVkCiAgICAgICAgIHRhcmJhbGwgPSBiYXNlX25hbWUgKyAnLnRhci5neicKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCiAKICAgICAgICAgIyBub3cgY3JlYXRlIGFub3RoZXIgdGFyYmFsbCB1c2luZyBgdGFyYAogICAgICAgICB0YXJiYWxsMiA9IG9zLnBhdGguam9pbih0bXBkaXIsICdhcmNoaXZlMi50YXIuZ3onKQpAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyh0YXJiYWxsMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsMikpCiAgICAgICAgICMgbGV0J3MgY29tcGFyZSBib3RoIHRhcmJhbGxzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuX3RhcmluZm8odGFyYmFsbCksIHNlbGYuX3RhcmluZm8odGFyYmFsbDIpKQogCkBAIC0xMjMsNyArMTIzLDcgQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCiAgICAgICAgIHRhcmJhbGwgPSBiYXNlX25hbWUgKyAnLnRhcicKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHModGFyYmFsbCkpCiAKICAgICAgICAgIyBub3cgZm9yIGEgZHJ5X3J1bgogICAgICAgICBiYXNlX25hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyMiwgJ2FyY2hpdmUnKQpAQCAtMTM0LDcgKzEzNCw3IEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBvcy5jaGRpcihvbGRfZGlyKQogICAgICAgICB0YXJiYWxsID0gYmFzZV9uYW1lICsgJy50YXInCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyh0YXJiYWxsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHRhcmJhbGwpKQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoZmluZF9leGVjdXRhYmxlKCdjb21wcmVzcycpLAogICAgICAgICAgICAgICAgICAgICAgICAgICdUaGUgY29tcHJlc3MgcHJvZ3JhbSBpcyByZXF1aXJlZCcpCkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCiAgICAgICAgIHRhcmJhbGwgPSBiYXNlX25hbWUgKyAnLnRhci5aJwotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHModGFyYmFsbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyh0YXJiYWxsKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHcud2FybmluZ3MpLCAxKQogCiAgICAgICAgICMgc2FtZSB0ZXN0IHdpdGggZHJ5X3J1bgpAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyeV9ydW49VHJ1ZSkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLmNoZGlyKG9sZF9kaXIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgb3MucGF0aC5leGlzdHModGFyYmFsbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgb3MucGF0aC5leGlzdHModGFyYmFsbCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbih3Lndhcm5pbmdzKSwgMSkKIAogICAgIEB1bml0dGVzdC5za2lwVW5sZXNzKFpJUF9TVVBQT1JULCAnTmVlZCB6aXAgc3VwcG9ydCB0byBydW4nKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF9ycG0ucHkKaW5kZXggMmQ4NDAwNy4uYzI3MTU2NyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2JkaXN0X3JwbS5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3RfcnBtLnB5CkBAIC03NCw3ICs3NCw3IEBACiAgICAgICAgIGNtZC5ydW4oKQogCiAgICAgICAgIGRpc3RfY3JlYXRlZCA9IG9zLmxpc3RkaXIob3MucGF0aC5qb2luKHBrZ19kaXIsICdkaXN0JykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnZm9vLTAuMS0xLm5vYXJjaC5ycG0nIGluIGRpc3RfY3JlYXRlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdmb28tMC4xLTEubm9hcmNoLnJwbScgaW4gZGlzdF9jcmVhdGVkKQogCiAgICAgZGVmIHRlc3Rfbm9fb3B0aW1pemVfZmxhZyhzZWxmKToKIApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgIGNtZC5ydW4oKQogCiAgICAgICAgIGRpc3RfY3JlYXRlZCA9IG9zLmxpc3RkaXIob3MucGF0aC5qb2luKHBrZ19kaXIsICdkaXN0JykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnZm9vLTAuMS0xLm5vYXJjaC5ycG0nIGluIGRpc3RfY3JlYXRlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdmb28tMC4xLTEubm9hcmNoLnJwbScgaW4gZGlzdF9jcmVhdGVkKQogICAgICAgICBvcy5yZW1vdmUob3MucGF0aC5qb2luKHBrZ19kaXIsICdkaXN0JywgJ2Zvby0wLjEtMS5ub2FyY2gucnBtJykpCiAKIGRlZiB0ZXN0X3N1aXRlKCk6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYmRpc3Rfd2luaW5zdC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF93aW5pbnN0LnB5CmluZGV4IGYyY2I0ZmQuLjliMWJhNmQgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF93aW5pbnN0LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9iZGlzdF93aW5pbnN0LnB5CkBAIC0yMSw3ICsyMSw3IEBACiAgICAgICAgICMgYW5kIG1ha2Ugc3VyZSBpdCBmaW5kcyBpdCBhbmQgcmV0dXJucyBpdHMgY29udGVudAogICAgICAgICAjIG5vIG1hdHRlciB3aGF0IHBsYXRmb3JtIHdlIGhhdmUKICAgICAgICAgZXhlX2ZpbGUgPSBjbWQuZ2V0X2V4ZV9ieXRlcygpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZXhlX2ZpbGUpID4gMTApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZXhlX2ZpbGUpID4gMTApCiAKIGRlZiB0ZXN0X3N1aXRlKCk6CiAgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShCdWlsZFdpbkluc3RUZXN0Q2FzZSkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9jbGliLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2NsaWIucHkKaW5kZXggNDdkODVjZC4uNTM2Y2Q2NyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2NsaWIucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2NsaWIucHkKQEAgLTEzNSw3ICsxMzUsNyBAQAogICAgICAgICBjbWQucnVuKCkKIAogICAgICAgICAjIGxldCdzIGNoZWNrIHRoZSByZXN1bHQKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdsaWJmb28uYScgaW4gb3MubGlzdGRpcihidWlsZF90ZW1wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdsaWJmb28uYScgaW4gb3MubGlzdGRpcihidWlsZF90ZW1wKSkKIAogZGVmIHRlc3Rfc3VpdGUoKToKICAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEJ1aWxkQ0xpYlRlc3RDYXNlKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9leHQucHkKaW5kZXggNWYyOGI3OS4uNDY3ZTkwZCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX2V4dC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfZXh0LnB5CkBAIC03MywxNSArNzMsMTUgQEAKICAgICAgICAgaW1wb3J0IHh4CiAKICAgICAgICAgZm9yIGF0dHIgaW4gKCdlcnJvcicsICdmb28nLCAnbmV3JywgJ3JvaicpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoeHgsIGF0dHIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoeHgsIGF0dHIpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHh4LmZvbygyLCA1KSwgNykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeHguZm9vKDEzLDE1KSwgMjgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHh4Lm5ldygpLmRlbW8oKSwgTm9uZSkKICAgICAgICAgZG9jID0gJ1RoaXMgaXMgYSB0ZW1wbGF0ZSBtb2R1bGUganVzdCBmb3IgaW5zdHJ1Y3Rpb24uJwogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4eC5fX2RvY19fLCBkb2MpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHh4Lk51bGwoKSwgeHguTnVsbCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHh4LlN0cigpLCB4eC5TdHIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh4eC5OdWxsKCksIHh4Lk51bGwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh4eC5TdHIoKSwgeHguU3RyKSkKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgIyBHZXQgZXZlcnl0aGluZyBiYWNrIHRvIG5vcm1hbApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzWydQeV9FTkFCTEVfU0hBUkVEJ10gPSBvbGRfdmFyCiAKICAgICAgICAgIyBtYWtlIHN1cmUgd2UgZ2V0IHNvbWUgbGlicmFyeSBkaXJzIHVuZGVyIHNvbGFyaXMKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihjbWQubGlicmFyeV9kaXJzKSA+IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oY21kLmxpYnJhcnlfZGlycykgPiAwKQogCiAgICAgZGVmIHRlc3RfdXNlcl9zaXRlKHNlbGYpOgogICAgICAgICAjIHNpdGUuVVNFUl9TSVRFIHdhcyBpbnRyb2R1Y2VkIGluIDIuNgpAQCAtMTI4LDcgKzEyOCw3IEBACiAgICAgICAgICMgbWFraW5nIHN1cmUgdGhlIHVzZXIgb3B0aW9uIGlzIHRoZXJlCiAgICAgICAgIG9wdGlvbnMgPSBbbmFtZSBmb3IgbmFtZSwgc2hvcnQsIGxhYmxlIGluCiAgICAgICAgICAgICAgICAgICAgY21kLnVzZXJfb3B0aW9uc10KLSAgICAgICAgc2VsZi5hc3NlcnRfKCd1c2VyJyBpbiBvcHRpb25zKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3VzZXInIGluIG9wdGlvbnMpCiAKICAgICAgICAgIyBzZXR0aW5nIGEgdmFsdWUKICAgICAgICAgY21kLnVzZXIgPSAxCkBAIC0xNDQsOSArMTQ0LDkgQEAKIAogICAgICAgICAjIHNlZSBpZiBpbmNsdWRlX2RpcnMgYW5kIGxpYnJhcnlfZGlycwogICAgICAgICAjIHdlcmUgc2V0Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhsaWIgaW4gY21kLmxpYnJhcnlfZGlycykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxpYiBpbiBjbWQucnBhdGgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhpbmNsIGluIGNtZC5pbmNsdWRlX2RpcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsaWIgaW4gY21kLmxpYnJhcnlfZGlycykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpYiBpbiBjbWQucnBhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbmNsIGluIGNtZC5pbmNsdWRlX2RpcnMpCiAKICAgICBkZWYgdGVzdF9vcHRpb25hbF9leHRlbnNpb24oc2VsZik6CiAKQEAgLTE3NSwxMCArMTc1LDEwIEBACiAKICAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZwogICAgICAgICBweV9pbmNsdWRlID0gc3lzY29uZmlnLmdldF9weXRob25faW5jKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHB5X2luY2x1ZGUgaW4gY21kLmluY2x1ZGVfZGlycykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHB5X2luY2x1ZGUgaW4gY21kLmluY2x1ZGVfZGlycykKIAogICAgICAgICBwbGF0X3B5X2luY2x1ZGUgPSBzeXNjb25maWcuZ2V0X3B5dGhvbl9pbmMocGxhdF9zcGVjaWZpYz0xKQotICAgICAgICBzZWxmLmFzc2VydF8ocGxhdF9weV9pbmNsdWRlIGluIGNtZC5pbmNsdWRlX2RpcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwbGF0X3B5X2luY2x1ZGUgaW4gY21kLmluY2x1ZGVfZGlycykKIAogICAgICAgICAjIG1ha2Ugc3VyZSBjbWQubGlicmFyaWVzIGlzIHR1cm5lZCBpbnRvIGEgbGlzdAogICAgICAgICAjIGlmIGl0J3MgYSBzdHJpbmcKQEAgLTE5Miw3ICsxOTIsNyBAQAogICAgICAgICBjbWQgPSBidWlsZF9leHQoZGlzdCkKICAgICAgICAgY21kLmxpYnJhcnlfZGlycyA9ICdteV9saWJfZGlyJwogICAgICAgICBjbWQuZmluYWxpemVfb3B0aW9ucygpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnbXlfbGliX2RpcicgaW4gY21kLmxpYnJhcnlfZGlycykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdteV9saWJfZGlyJyBpbiBjbWQubGlicmFyeV9kaXJzKQogCiAgICAgICAgICMgbWFrZSBzdXJlIHJwYXRoIGlzIHR1cm5lZCBpbnRvIGEgbGlzdAogICAgICAgICAjIGlmIGl0J3MgYSBsaXN0IG9mIG9zLnBhdGhzZXAncyBwYXRocwpAQCAtMjU3LDEzICsyNTcsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NvbWUnOiAnYmFyJ30pXQogICAgICAgICBjbWQuY2hlY2tfZXh0ZW5zaW9uc19saXN0KGV4dHMpCiAgICAgICAgIGV4dCA9IGV4dHNbMF0KLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoZXh0LCBFeHRlbnNpb24pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShleHQsIEV4dGVuc2lvbikpCiAKICAgICAgICAgIyBjaGVja19leHRlbnNpb25zX2xpc3QgYWRkcyBpbiBleHQgdGhlIHZhbHVlcyBwYXNzZWQKICAgICAgICAgIyB3aGVuIHRoZXkgYXJlIGluICgnaW5jbHVkZV9kaXJzJywgJ2xpYnJhcnlfZGlycycsICdsaWJyYXJpZXMnCiAgICAgICAgICMgJ2V4dHJhX29iamVjdHMnLCAnZXh0cmFfY29tcGlsZV9hcmdzJywgJ2V4dHJhX2xpbmtfYXJncycpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGV4dC5saWJyYXJpZXMsICdmb28nKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGhhc2F0dHIoZXh0LCAnc29tZScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIoZXh0LCAnc29tZScpKQogCiAgICAgICAgICMgJ21hY3JvcycgZWxlbWVudCBvZiBidWlsZCBpbmZvIGRpY3QgbXVzdCBiZSAxLSBvciAyLXR1cGxlCiAgICAgICAgIGV4dHMgPSBbKCdmb28uYmFyJywgeydzb3VyY2VzJzogWycnXSwgJ2xpYnJhcmllcyc6ICdmb28nLApAQCAtMzIxLDcgKzMyMSw3IEBACiAgICAgICAgICAgICBzb19maWxlID0gY21kLmdldF9vdXRwdXRzKClbMF0KICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9zLmNoZGlyKG9sZF93ZCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKHNvX2ZpbGUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc29fZmlsZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9zLnBhdGguc3BsaXRleHQoc29fZmlsZSlbLTFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNjb25maWcuZ2V0X2NvbmZpZ192YXIoJ1NPJykpCiAgICAgICAgIHNvX2RpciA9IG9zLnBhdGguZGlybmFtZShzb19maWxlKQpAQCAtMzMwLDcgKzMzMCw3IEBACiAgICAgICAgIGNtZC5pbnBsYWNlID0gMAogICAgICAgICBjbWQucnVuKCkKICAgICAgICAgc29fZmlsZSA9IGNtZC5nZXRfb3V0cHV0cygpWzBdCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhzb19maWxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHNvX2ZpbGUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhvcy5wYXRoLnNwbGl0ZXh0KHNvX2ZpbGUpWy0xXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdTTycpKQogICAgICAgICBzb19kaXIgPSBvcy5wYXRoLmRpcm5hbWUoc29fZmlsZSkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9weS5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9weS5weQppbmRleCA1NGE0ZWQ4Li5jODE1ZDgxIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfcHkucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2J1aWxkX3B5LnB5CkBAIC01Miw5ICs1Miw5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGNtZC5nZXRfb3V0cHV0cygpKSwgMykKICAgICAgICAgcGtnZGVzdCA9IG9zLnBhdGguam9pbihkZXN0aW5hdGlvbiwgInBrZyIpCiAgICAgICAgIGZpbGVzID0gb3MubGlzdGRpcihwa2dkZXN0KQotICAgICAgICBzZWxmLmFzc2VydF8oIl9faW5pdF9fLnB5IiBpbiBmaWxlcykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJfX2luaXRfXy5weWMiIGluIGZpbGVzKQotICAgICAgICBzZWxmLmFzc2VydF8oIlJFQURNRS50eHQiIGluIGZpbGVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIl9faW5pdF9fLnB5IiBpbiBmaWxlcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJfX2luaXRfXy5weWMiIGluIGZpbGVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIlJFQURNRS50eHQiIGluIGZpbGVzKQogCiAgICAgZGVmIHRlc3RfZW1wdHlfcGFja2FnZV9kaXIgKHNlbGYpOgogICAgICAgICAjIFNlZSBTRiAxNjY4NTk2LzE3MjA4OTcuCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfYnVpbGRfc2NyaXB0cy5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9zY3JpcHRzLnB5CmluZGV4IGI1NWViNTguLmIxZDJkMDcgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9zY3JpcHRzLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9idWlsZF9zY3JpcHRzLnB5CkBAIC0xNiwxMiArMTYsMTIgQEAKIAogICAgIGRlZiB0ZXN0X2RlZmF1bHRfc2V0dGluZ3Moc2VsZik6CiAgICAgICAgIGNtZCA9IHNlbGYuZ2V0X2J1aWxkX3NjcmlwdHNfY21kKCIvZm9vL2JhciIsIFtdKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGNtZC5mb3JjZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNtZC5idWlsZF9kaXIgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjbWQuZm9yY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWQuYnVpbGRfZGlyIGlzIE5vbmUpCiAKICAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhjbWQuZm9yY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWQuZm9yY2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmJ1aWxkX2RpciwgIi9mb28vYmFyIikKIAogICAgIGRlZiB0ZXN0X2J1aWxkKHNlbGYpOgpAQCAtMzcsNyArMzcsNyBAQAogCiAgICAgICAgIGJ1aWx0ID0gb3MubGlzdGRpcih0YXJnZXQpCiAgICAgICAgIGZvciBuYW1lIGluIGV4cGVjdGVkOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5hbWUgaW4gYnVpbHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobmFtZSBpbiBidWlsdCkKIAogICAgIGRlZiBnZXRfYnVpbGRfc2NyaXB0c19jbWQoc2VsZiwgdGFyZ2V0LCBzY3JpcHRzKToKICAgICAgICAgaW1wb3J0IHN5cwpAQCAtMTAwLDcgKzEwMCw3IEBACiAKICAgICAgICAgYnVpbHQgPSBvcy5saXN0ZGlyKHRhcmdldCkKICAgICAgICAgZm9yIG5hbWUgaW4gZXhwZWN0ZWQ6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obmFtZSBpbiBidWlsdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYW1lIGluIGJ1aWx0KQogCiBkZWYgdGVzdF9zdWl0ZSgpOgogICAgIHJldHVybiB1bml0dGVzdC5tYWtlU3VpdGUoQnVpbGRTY3JpcHRzVGVzdENhc2UpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY2xlYW4ucHkKaW5kZXggMzAyNjAzMi4uZGJjNGVlMiAxMDA3NTUKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NsZWFuLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbGVhbi5weQpAQCAtMzUsNyArMzUsNyBAQAogCiAgICAgICAgICMgbWFrZSBzdXJlIHRoZSBmaWxlcyB3aGVyZSByZW1vdmVkCiAgICAgICAgIGZvciBuYW1lLCBwYXRoIGluIGRpcnM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IG9zLnBhdGguZXhpc3RzKHBhdGgpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMgd2FzIG5vdCByZW1vdmVkJyAlIHBhdGgpCiAKICAgICAgICAgIyBsZXQncyBydW4gdGhlIGNvbW1hbmQgYWdhaW4gKHNob3VsZCBzcGl0IHdhcm5pbmdzIGJ1dCBzdWNlZWQpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY21kLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NtZC5weQppbmRleCA4ZjJiMzZmLi5kNjQzOGI1IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY21kLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jbWQucHkKQEAgLTcwLDcgKzcwLDcgQEAKIAogICAgICAgICBjbWQub3B0aW9uMiA9IE5vbmUKICAgICAgICAgY21kLmVuc3VyZV9zdHJpbmcoJ29wdGlvbjInLCAneHh4JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoY21kLCAnb3B0aW9uMicpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihjbWQsICdvcHRpb24yJykpCiAKICAgICAgICAgY21kLm9wdGlvbjMgPSAxCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc09wdGlvbkVycm9yLCBjbWQuZW5zdXJlX3N0cmluZywgJ29wdGlvbjMnKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZy5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9jb25maWcucHkKaW5kZXggZmQ3NzhkMS4uNjk0NzI3NSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZy5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnLnB5CkBAIC0xMDUsOSArMTA1LDkgQEAKICAgICBkZWYgdGVzdF9zZXJ2ZXJfZW1wdHlfcmVnaXN0cmF0aW9uKHNlbGYpOgogICAgICAgICBjbWQgPSBzZWxmLl9jbWQoc2VsZi5kaXN0KQogICAgICAgICByYyA9IGNtZC5fZ2V0X3JjX2ZpbGUoKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IG9zLnBhdGguZXhpc3RzKHJjKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhyYykpCiAgICAgICAgIGNtZC5fc3RvcmVfcHlwaXJjKCd0YXJlaycsICd4eHgnKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMocmMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMocmMpKQogICAgICAgICBjb250ZW50ID0gb3BlbihyYykucmVhZCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvbnRlbnQsIFdBTlRFRCkKIApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2NvbmZpZ19jbWQucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnX2NtZC5weQppbmRleCBiYWNmMTNhLi5lZjJlN2JjIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnX2NtZC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfY29uZmlnX2NtZC5weQpAQCAtNzMsMTQgKzczLDE0IEBACiAgICAgICAgIHNlbGYud3JpdGVfZmlsZShmMiwgJ3h4eCcpCiAKICAgICAgICAgZm9yIGYgaW4gKGYxLCBmMik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMoZikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZikpCiAKICAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQogICAgICAgICBjbWQgPSBjb25maWcoZGlzdCkKICAgICAgICAgY21kLl9jbGVhbihmMSwgZjIpCiAKICAgICAgICAgZm9yIGYgaW4gKGYxLCBmMik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IG9zLnBhdGguZXhpc3RzKGYpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhmKSkKIAogZGVmIHRlc3Rfc3VpdGUoKToKICAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKENvbmZpZ1Rlc3RDYXNlKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2Rpc3QucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weQppbmRleCA3Y2NkZDUzLi4wN2YzOTJjIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfZGlzdC5weQpAQCAtNzMsNyArNzMsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0X2NvbW1hbmRfcGFja2FnZXMoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBbImRpc3R1dGlscy5jb21tYW5kIiwgImZvby5iYXIiLCAiZGlzdHV0aWxzLnRlc3RzIl0pCiAgICAgICAgIGNtZCA9IGQuZ2V0X2NvbW1hbmRfb2JqKCJ0ZXN0X2Rpc3QiKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShjbWQsIHRlc3RfZGlzdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGNtZCwgdGVzdF9kaXN0KSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbWQuc2FtcGxlX29wdGlvbiwgInNvbWV0ZXh0IikKIAogICAgIGRlZiB0ZXN0X2NvbW1hbmRfcGFja2FnZXNfY29uZmlnZmlsZShzZWxmKToKQEAgLTIwNCwxMCArMjA0LDEwIEBACiAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIjogIjEuMCJ9CiAgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oYXR0cnMpCiAgICAgICAgIG1ldGEgPSBzZWxmLmZvcm1hdF9tZXRhZGF0YShkaXN0KQotICAgICAgICBzZWxmLmFzc2VydF8oIk1ldGFkYXRhLVZlcnNpb246IDEuMCIgaW4gbWV0YSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJwcm92aWRlczoiIG5vdCBpbiBtZXRhLmxvd2VyKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygicmVxdWlyZXM6IiBub3QgaW4gbWV0YS5sb3dlcigpKQotICAgICAgICBzZWxmLmFzc2VydF8oIm9ic29sZXRlczoiIG5vdCBpbiBtZXRhLmxvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiTWV0YWRhdGEtVmVyc2lvbjogMS4wIiBpbiBtZXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInByb3ZpZGVzOiIgbm90IGluIG1ldGEubG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJyZXF1aXJlczoiIG5vdCBpbiBtZXRhLmxvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgib2Jzb2xldGVzOiIgbm90IGluIG1ldGEubG93ZXIoKSkKIAogICAgIGRlZiB0ZXN0X3Byb3ZpZGVzKHNlbGYpOgogICAgICAgICBhdHRycyA9IHsibmFtZSI6ICJwYWNrYWdlIiwKQEAgLTIxOSw5ICsyMTksOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QuZ2V0X3Byb3ZpZGVzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgWyJwYWNrYWdlIiwgInBhY2thZ2Uuc3ViIl0pCiAgICAgICAgIG1ldGEgPSBzZWxmLmZvcm1hdF9tZXRhZGF0YShkaXN0KQotICAgICAgICBzZWxmLmFzc2VydF8oIk1ldGFkYXRhLVZlcnNpb246IDEuMSIgaW4gbWV0YSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJyZXF1aXJlczoiIG5vdCBpbiBtZXRhLmxvd2VyKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xygib2Jzb2xldGVzOiIgbm90IGluIG1ldGEubG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJNZXRhZGF0YS1WZXJzaW9uOiAxLjEiIGluIG1ldGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgicmVxdWlyZXM6IiBub3QgaW4gbWV0YS5sb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIm9ic29sZXRlczoiIG5vdCBpbiBtZXRhLmxvd2VyKCkpCiAKICAgICBkZWYgdGVzdF9wcm92aWRlc19pbGxlZ2FsKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBEaXN0cmlidXRpb24sCkBAIC0yMzksMTEgKzIzOSwxMSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QuZ2V0X3JlcXVpcmVzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgWyJvdGhlciIsICJhbm90aGVyICg9PTEuMCkiXSkKICAgICAgICAgbWV0YSA9IHNlbGYuZm9ybWF0X21ldGFkYXRhKGRpc3QpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiTWV0YWRhdGEtVmVyc2lvbjogMS4xIiBpbiBtZXRhKQotICAgICAgICBzZWxmLmFzc2VydF8oInByb3ZpZGVzOiIgbm90IGluIG1ldGEubG93ZXIoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJSZXF1aXJlczogb3RoZXIiIGluIG1ldGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiUmVxdWlyZXM6IGFub3RoZXIgKD09MS4wKSIgaW4gbWV0YSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJvYnNvbGV0ZXM6IiBub3QgaW4gbWV0YS5sb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIk1ldGFkYXRhLVZlcnNpb246IDEuMSIgaW4gbWV0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJwcm92aWRlczoiIG5vdCBpbiBtZXRhLmxvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiUmVxdWlyZXM6IG90aGVyIiBpbiBtZXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIlJlcXVpcmVzOiBhbm90aGVyICg9PTEuMCkiIGluIG1ldGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgib2Jzb2xldGVzOiIgbm90IGluIG1ldGEubG93ZXIoKSkKIAogICAgIGRlZiB0ZXN0X3JlcXVpcmVzX2lsbGVnYWwoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIERpc3RyaWJ1dGlvbiwKQEAgLTI2MSwxMSArMjYxLDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5nZXRfb2Jzb2xldGVzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgWyJvdGhlciIsICJhbm90aGVyICg8MS4wKSJdKQogICAgICAgICBtZXRhID0gc2VsZi5mb3JtYXRfbWV0YWRhdGEoZGlzdCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJNZXRhZGF0YS1WZXJzaW9uOiAxLjEiIGluIG1ldGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygicHJvdmlkZXM6IiBub3QgaW4gbWV0YS5sb3dlcigpKQotICAgICAgICBzZWxmLmFzc2VydF8oInJlcXVpcmVzOiIgbm90IGluIG1ldGEubG93ZXIoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJPYnNvbGV0ZXM6IG90aGVyIiBpbiBtZXRhKQotICAgICAgICBzZWxmLmFzc2VydF8oIk9ic29sZXRlczogYW5vdGhlciAoPDEuMCkiIGluIG1ldGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiTWV0YWRhdGEtVmVyc2lvbjogMS4xIiBpbiBtZXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInByb3ZpZGVzOiIgbm90IGluIG1ldGEubG93ZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJyZXF1aXJlczoiIG5vdCBpbiBtZXRhLmxvd2VyKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiT2Jzb2xldGVzOiBvdGhlciIgaW4gbWV0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJPYnNvbGV0ZXM6IGFub3RoZXIgKDwxLjApIiBpbiBtZXRhKQogCiAgICAgZGVmIHRlc3Rfb2Jzb2xldGVzX2lsbGVnYWwoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIERpc3RyaWJ1dGlvbiwKQEAgLTI5OSwxNCArMjk5LDE0IEBACiAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gaW4gKCdsaW51eCcsICdkYXJ3aW4nKToKICAgICAgICAgICAgICAgICBzZWxmLmVudmlyb25bJ0hPTUUnXSA9IHRlbXBfZGlyCiAgICAgICAgICAgICAgICAgZmlsZXMgPSBkaXN0LmZpbmRfY29uZmlnX2ZpbGVzKCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9maWxlbmFtZSBpbiBmaWxlcykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9maWxlbmFtZSBpbiBmaWxlcykKIAogICAgICAgICAgICAgIyB3aW4zMi1zdHlsZQogICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICd3aW4zMic6CiAgICAgICAgICAgICAgICAgIyBob21lIGRyaXZlIHNob3VsZCBiZSBmb3VuZAogICAgICAgICAgICAgICAgIHNlbGYuZW52aXJvblsnSE9NRSddID0gdGVtcF9kaXIKICAgICAgICAgICAgICAgICBmaWxlcyA9IGRpc3QuZmluZF9jb25maWdfZmlsZXMoKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2ZpbGVuYW1lIGluIGZpbGVzLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2VyX2ZpbGVuYW1lIGluIGZpbGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXIgbm90IGZvdW5kIGluICVyJyAlICh1c2VyX2ZpbGVuYW1lLCBmaWxlcykpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBvcy5yZW1vdmUodXNlcl9maWxlbmFtZSkKQEAgLTMzMiw3ICszMzIsNyBAQAogCiAgICAgICAgIG91dHB1dCA9IFtsaW5lIGZvciBsaW5lIGluIHMuZ2V0dmFsdWUoKS5zcGxpdCgnXG4nKQogICAgICAgICAgICAgICAgICAgaWYgbGluZS5zdHJpcCgpICE9ICcnXQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKG91dHB1dCkgPiAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKG91dHB1dCkgPiAwKQogCiBkZWYgdGVzdF9zdWl0ZSgpOgogICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGwucHkKaW5kZXggOGQ3ZTk3Mi4uZDBhZDVjZSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGwucHkKKysrIGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGwucHkKQEAgLTg4LDcgKzg4LDcgQEAKIAogICAgIGRlZiBfdGVzdF91c2VyX3NpdGUoc2VsZik6CiAgICAgICAgIGZvciBrZXkgaW4gKCdudF91c2VyJywgJ3VuaXhfdXNlcicsICdvczJfaG9tZScpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGtleSBpbiBJTlNUQUxMX1NDSEVNRVMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoa2V5IGluIElOU1RBTExfU0NIRU1FUykKIAogICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHsnbmFtZSc6ICd4eCd9KQogICAgICAgICBjbWQgPSBpbnN0YWxsKGRpc3QpCkBAIC05NiwyNCArOTYsMjQgQEAKICAgICAgICAgIyBtYWtpbmcgc3VyZSB0aGUgdXNlciBvcHRpb24gaXMgdGhlcmUKICAgICAgICAgb3B0aW9ucyA9IFtuYW1lIGZvciBuYW1lLCBzaG9ydCwgbGFibGUgaW4KICAgICAgICAgICAgICAgICAgICBjbWQudXNlcl9vcHRpb25zXQotICAgICAgICBzZWxmLmFzc2VydF8oJ3VzZXInIGluIG9wdGlvbnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgndXNlcicgaW4gb3B0aW9ucykKIAogICAgICAgICAjIHNldHRpbmcgYSB2YWx1ZQogICAgICAgICBjbWQudXNlciA9IDEKIAogICAgICAgICAjIHVzZXIgYmFzZSBhbmQgc2l0ZSBzaG91bGRuJ3QgYmUgY3JlYXRlZCB5ZXQKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfYmFzZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgb3MucGF0aC5leGlzdHMoc2VsZi51c2VyX3NpdGUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHNlbGYudXNlcl9iYXNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfc2l0ZSkpCiAKICAgICAgICAgIyBsZXQncyBydW4gZmluYWxpemUKICAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKQogCiAgICAgICAgICMgbm93IHRoZXkgc2hvdWxkCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfYmFzZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfc2l0ZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfYmFzZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzZWxmLnVzZXJfc2l0ZSkpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKCd1c2VyYmFzZScgaW4gY21kLmNvbmZpZ192YXJzKQotICAgICAgICBzZWxmLmFzc2VydF8oJ3VzZXJzaXRlJyBpbiBjbWQuY29uZmlnX3ZhcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgndXNlcmJhc2UnIGluIGNtZC5jb25maWdfdmFycykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCd1c2Vyc2l0ZScgaW4gY21kLmNvbmZpZ192YXJzKQogCiAgICAgZGVmIHRlc3RfaGFuZGxlX2V4dHJhX3BhdGgoc2VsZik6CiAgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24oeyduYW1lJzogJ3h4JywgJ2V4dHJhX3BhdGgnOiAncGF0aCxkaXJzJ30pCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9kYXRhLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfZGF0YS5weQppbmRleCA3M2M0MDM3Li43MDcyMTM2IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9kYXRhLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2RhdGEucHkKQEAgLTM1LDkgKzM1LDkgQEAKICAgICAgICAgIyBsZXQncyBjaGVjayB0aGUgcmVzdWx0CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjbWQuZ2V0X291dHB1dHMoKSksIDIpCiAgICAgICAgIHJ0d28gPSBvcy5wYXRoLnNwbGl0KHR3bylbLTFdCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oaW5zdDIsIHJ0d28pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0MiwgcnR3bykpKQogICAgICAgICByb25lID0gb3MucGF0aC5zcGxpdChvbmUpWy0xXQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGluc3QsIHJvbmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0LCByb25lKSkpCiAgICAgICAgIGNtZC5vdXRmaWxlcyA9IFtdCiAKICAgICAgICAgIyBsZXQncyB0cnkgd2l0aCB3YXJuX2RpciBvbmUKQEAgLTQ3LDggKzQ3LDggQEAKIAogICAgICAgICAjIGxldCdzIGNoZWNrIHRoZSByZXN1bHQKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGNtZC5nZXRfb3V0cHV0cygpKSwgMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0MiwgcnR3bykpKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGluc3QsIHJvbmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0MiwgcnR3bykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGluc3QsIHJvbmUpKSkKICAgICAgICAgY21kLm91dGZpbGVzID0gW10KIAogICAgICAgICAjIG5vdyB1c2luZyByb290IGFuZCBlbXB0eSBkaXIKQEAgLTY1LDggKzY1LDggQEAKIAogICAgICAgICAjIGxldCdzIGNoZWNrIHRoZSByZXN1bHQKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGNtZC5nZXRfb3V0cHV0cygpKSwgNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0MiwgcnR3bykpKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGluc3QsIHJvbmUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihpbnN0MiwgcnR3bykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGluc3QsIHJvbmUpKSkKIAogZGVmIHRlc3Rfc3VpdGUoKToKICAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKEluc3RhbGxEYXRhVGVzdENhc2UpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9saWIucHkKaW5kZXggZDc2ODE2Ni4uNzkzYjk1YyAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfbGliLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX2xpYi5weQpAQCAtMzksOCArMzksOCBAQAogICAgICAgICBmID0gb3MucGF0aC5qb2luKHBrZ19kaXIsICdmb28ucHknKQogICAgICAgICBzZWxmLndyaXRlX2ZpbGUoZiwgJyMgcHl0aG9uIGZpbGUnKQogICAgICAgICBjbWQuYnl0ZV9jb21waWxlKFtmXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZm9vLnB5YycpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZm9vLnB5bycpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZm9vLnB5YycpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihwa2dfZGlyLCAnZm9vLnB5bycpKSkKIAogICAgIGRlZiB0ZXN0X2dldF9vdXRwdXRzKHNlbGYpOgogICAgICAgICBwa2dfZGlyLCBkaXN0ID0gc2VsZi5jcmVhdGVfZGlzdCgpCkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgICAgIGNtZC5kaXN0cmlidXRpb24uc2NyaXB0X25hbWUgPSAnc2V0dXAucHknCiAKICAgICAgICAgIyBnZXRfb3V0cHV0IHNob3VsZCByZXR1cm4gNCBlbGVtZW50cwotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGNtZC5nZXRfb3V0cHV0cygpKSA+PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGNtZC5nZXRfb3V0cHV0cygpKSA+PSAyKQogCiAgICAgZGVmIHRlc3RfZ2V0X2lucHV0cyhzZWxmKToKICAgICAgICAgcGtnX2RpciwgZGlzdCA9IHNlbGYuY3JlYXRlX2Rpc3QoKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfc2NyaXB0cy5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9pbnN0YWxsX3NjcmlwdHMucHkKaW5kZXggZmZmYTZlZi4uYjdlYjYyNSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X2luc3RhbGxfc2NyaXB0cy5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfaW5zdGFsbF9zY3JpcHRzLnB5CkBAIC0yMywxNSArMjMsMTUgQEAKICAgICAgICAgICAgIHNraXBfYnVpbGQ9MSwKICAgICAgICAgICAgICkKICAgICAgICAgY21kID0gaW5zdGFsbF9zY3JpcHRzKGRpc3QpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgY21kLmZvcmNlKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGNtZC5za2lwX2J1aWxkKQotICAgICAgICBzZWxmLmFzc2VydF8oY21kLmJ1aWxkX2RpciBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oY21kLmluc3RhbGxfZGlyIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY21kLmZvcmNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNtZC5za2lwX2J1aWxkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21kLmJ1aWxkX2RpciBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21kLmluc3RhbGxfZGlyIGlzIE5vbmUpCiAKICAgICAgICAgY21kLmZpbmFsaXplX29wdGlvbnMoKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhjbWQuZm9yY2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhjbWQuc2tpcF9idWlsZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtZC5mb3JjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtZC5za2lwX2J1aWxkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtZC5idWlsZF9kaXIsICIvZm9vL2JhciIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21kLmluc3RhbGxfZGlyLCAiL3NwbGF0L2Z1bmsiKQogCkBAIC02OSw3ICs2OSw3IEBACiAKICAgICAgICAgaW5zdGFsbGVkID0gb3MubGlzdGRpcih0YXJnZXQpCiAgICAgICAgIGZvciBuYW1lIGluIGV4cGVjdGVkOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5hbWUgaW4gaW5zdGFsbGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5hbWUgaW4gaW5zdGFsbGVkKQogCiAKIGRlZiB0ZXN0X3N1aXRlKCk6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfbXN2Yzljb21waWxlci5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9tc3ZjOWNvbXBpbGVyLnB5CmluZGV4IDc4Y2UzYjcuLjIxMjQyYTggMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9tc3ZjOWNvbXBpbGVyLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9tc3ZjOWNvbXBpbGVyLnB5CkBAIC00Niw3ICs0Niw3IEBACiAgICAgICAgICMgd2luZG93cyByZWdpc3RlcmllcyB2ZXJzaW9ucy4KICAgICAgICAgcGF0aCA9IHInU29mdHdhcmVcTWljcm9zb2Z0XE5vdGVwYWQnCiAgICAgICAgIHYgPSBSZWcuZ2V0X3ZhbHVlKHBhdGgsIHUibGZpdGFsaWMiKQotICAgICAgICBzZWxmLmFzc2VydF8odiBpbiAoMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGluICgwLCAxKSkKIAogICAgICAgICBpbXBvcnQgX3dpbnJlZwogICAgICAgICBIS0NVID0gX3dpbnJlZy5IS0VZX0NVUlJFTlRfVVNFUgpAQCAtNTQsNyArNTQsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhrZXlzLCBOb25lKQogCiAgICAgICAgIGtleXMgPSBSZWcucmVhZF9rZXlzKEhLQ1UsIHInU29mdHdhcmVcTWljcm9zb2Z0JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdOb3RlcGFkJyBpbiBrZXlzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ05vdGVwYWQnIGluIGtleXMpCiAKIGRlZiB0ZXN0X3N1aXRlKCk6CiAgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShtc3ZjOWNvbXBpbGVyVGVzdENhc2UpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfcmVnaXN0ZXIucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfcmVnaXN0ZXIucHkKaW5kZXggMGM2YmY2Ni4uYWRhNzdhMCAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3JlZ2lzdGVyLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9yZWdpc3Rlci5weQpAQCAtOTYsNyArOTYsNyBAQAogICAgICAgICBjbWQgPSBzZWxmLl9nZXRfY21kKCkKIAogICAgICAgICAjIHdlIHNob3VsZG4ndCBoYXZlIGEgLnB5cGlyYyBmaWxlIHlldAotICAgICAgICBzZWxmLmFzc2VydF8obm90IG9zLnBhdGguZXhpc3RzKHNlbGYucmMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHNlbGYucmMpKQogCiAgICAgICAgICMgcGF0Y2hpbmcgcmF3X2lucHV0IGFuZCBnZXRwYXNzLmdldHBhc3MKICAgICAgICAgIyBzbyByZWdpc3RlciBnZXRzIGhhcHB5CkBAIC0xMTUsNyArMTE1LDcgQEAKICAgICAgICAgICAgIGRlbCByZWdpc3Rlcl9tb2R1bGUucmF3X2lucHV0CiAKICAgICAgICAgIyB3ZSBzaG91bGQgaGF2ZSBhIGJyYW5kIG5ldyAucHlwaXJjIGZpbGUKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKHNlbGYucmMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoc2VsZi5yYykpCiAKICAgICAgICAgIyB3aXRoIHRoZSBjb250ZW50IHNpbWlsYXIgdG8gV0FOVEVEX1BZUElSQwogICAgICAgICBjb250ZW50ID0gb3BlbihzZWxmLnJjKS5yZWFkKCkKQEAgLTEzMywxMyArMTMzLDEzIEBACiAKICAgICAgICAgIyBsZXQncyBzZWUgd2hhdCB0aGUgc2VydmVyIHJlY2VpdmVkIDogd2Ugc2hvdWxkCiAgICAgICAgICMgaGF2ZSAyIHNpbWlsYXIgcmVxdWVzdHMKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuY29ubi5yZXFzLCAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5jb25uLnJlcXMsIDIpCiAgICAgICAgIHJlcTEgPSBkaWN0KHNlbGYuY29ubi5yZXFzWzBdLmhlYWRlcnMpCiAgICAgICAgIHJlcTIgPSBkaWN0KHNlbGYuY29ubi5yZXFzWzFdLmhlYWRlcnMpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVxMVsnQ29udGVudC1sZW5ndGgnXSwgJzEzNzQnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXEyWydDb250ZW50LWxlbmd0aCddLCAnMTM3NCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygneHh4JyBpbiBzZWxmLmNvbm4ucmVxc1sxXS5kYXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3h4eCcgaW4gc2VsZi5jb25uLnJlcXNbMV0uZGF0YSkKIAogICAgIGRlZiB0ZXN0X3Bhc3N3b3JkX25vdF9pbl9maWxlKHNlbGYpOgogCkBAIC0xNjUsMTEgKzE2NSwxMSBAQAogICAgICAgICAgICAgZGVsIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQKIAogICAgICAgICAjIHdlIHNob3VsZCBoYXZlIHNlbmQgYSByZXF1ZXN0Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLmNvbm4ucmVxcywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuY29ubi5yZXFzLCAxKQogICAgICAgICByZXEgPSBzZWxmLmNvbm4ucmVxc1swXQogICAgICAgICBoZWFkZXJzID0gZGljdChyZXEuaGVhZGVycykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaGVhZGVyc1snQ29udGVudC1sZW5ndGgnXSwgJzYwOCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygndGFyZWsnIGluIHJlcS5kYXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3RhcmVrJyBpbiByZXEuZGF0YSkKIAogICAgIGRlZiB0ZXN0X3Bhc3N3b3JkX3Jlc2V0KHNlbGYpOgogICAgICAgICAjIHRoaXMgdGVzdCBydW5zIGNob2ljZSAzCkBAIC0xODMsMTEgKzE4MywxMSBAQAogICAgICAgICAgICAgZGVsIHJlZ2lzdGVyX21vZHVsZS5yYXdfaW5wdXQKIAogICAgICAgICAjIHdlIHNob3VsZCBoYXZlIHNlbmQgYSByZXF1ZXN0Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLmNvbm4ucmVxcywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuY29ubi5yZXFzLCAxKQogICAgICAgICByZXEgPSBzZWxmLmNvbm4ucmVxc1swXQogICAgICAgICBoZWFkZXJzID0gZGljdChyZXEuaGVhZGVycykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaGVhZGVyc1snQ29udGVudC1sZW5ndGgnXSwgJzI5MCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygndGFyZWsnIGluIHJlcS5kYXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3RhcmVrJyBpbiByZXEuZGF0YSkKIAogICAgIGRlZiB0ZXN0X3N0cmljdChzZWxmKToKICAgICAgICAgIyB0ZXN0aW5nIHRoZSBzY3JpcHQgb3B0aW9uCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3lzY29uZmlnLnB5IGIvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3N5c2NvbmZpZy5weQppbmRleCA4NTM0ODgxLi5lZGM4ZmQ4IDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3Rfc3lzY29uZmlnLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF9zeXNjb25maWcucHkKQEAgLTIxLDEyICsyMSwxMiBAQAogCiAgICAgZGVmIHRlc3RfZ2V0X2NvbmZpZ19oX2ZpbGVuYW1lKHNlbGYpOgogICAgICAgICBjb25maWdfaCA9IHN5c2NvbmZpZy5nZXRfY29uZmlnX2hfZmlsZW5hbWUoKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5pc2ZpbGUoY29uZmlnX2gpLCBjb25maWdfaCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKGNvbmZpZ19oKSwgY29uZmlnX2gpCiAKICAgICBkZWYgdGVzdF9nZXRfcHl0aG9uX2xpYihzZWxmKToKICAgICAgICAgbGliX2RpciA9IHN5c2NvbmZpZy5nZXRfcHl0aG9uX2xpYigpCiAgICAgICAgICMgWFhYIGRvZXNuJ3Qgd29yayBvbiBMaW51eCB3aGVuIFB5dGhvbiB3YXMgbmV2ZXIgaW5zdGFsbGVkIGJlZm9yZQotICAgICAgICAjc2VsZi5hc3NlcnRfKG9zLnBhdGguaXNkaXIobGliX2RpciksIGxpYl9kaXIpCisgICAgICAgICNzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2RpcihsaWJfZGlyKSwgbGliX2RpcikKICAgICAgICAgIyB0ZXN0IGZvciBweXRob254eC5saWI/CiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc3lzY29uZmlnLmdldF9weXRob25fbGliKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzY29uZmlnLmdldF9weXRob25fbGliKHByZWZpeD1URVNURk4pKQpAQCAtMzYsMTQgKzM2LDE0IEBACiAgICAgICAgICMgVGhpcyBpcyBub3QgbXVjaCBvZiBhIHRlc3QuICBXZSBtYWtlIHN1cmUgUHl0aG9uLmggZXhpc3RzCiAgICAgICAgICMgaW4gdGhlIGRpcmVjdG9yeSByZXR1cm5lZCBieSBnZXRfcHl0aG9uX2luYygpIGJ1dCB3ZSBkb24ndCBrbm93CiAgICAgICAgICMgaXQgaXMgdGhlIGNvcnJlY3QgZmlsZS4KLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguaXNkaXIoaW5jX2RpciksIGluY19kaXIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZGlyKGluY19kaXIpLCBpbmNfZGlyKQogICAgICAgICBweXRob25faCA9IG9zLnBhdGguam9pbihpbmNfZGlyLCAiUHl0aG9uLmgiKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5pc2ZpbGUocHl0aG9uX2gpLCBweXRob25faCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKHB5dGhvbl9oKSwgcHl0aG9uX2gpCiAKICAgICBkZWYgdGVzdF9nZXRfY29uZmlnX3ZhcnMoc2VsZik6CiAgICAgICAgIGN2YXJzID0gc3lzY29uZmlnLmdldF9jb25maWdfdmFycygpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGN2YXJzLCBkaWN0KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGN2YXJzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShjdmFycywgZGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjdmFycykKIAogICAgIGRlZiB0ZXN0X2N1c3RvbWl6ZV9jb21waWxlcihzZWxmKToKIApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VwbG9hZC5weSBiL0xpYi9kaXN0dXRpbHMvdGVzdHMvdGVzdF91cGxvYWQucHkKaW5kZXggYmJjZDgwZC4uMGQ5NWEwOSAxMDA2NDQKLS0tIGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3VwbG9hZC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXBsb2FkLnB5CkBAIC05NiwxMSArOTYsMTEgQEAKICAgICAgICAgIyB3aGF0IGRpZCB3ZSBzZW5kID8KICAgICAgICAgaGVhZGVycyA9IGRpY3Qoc2VsZi5sYXN0X29wZW4ucmVxLmhlYWRlcnMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGhlYWRlcnNbJ0NvbnRlbnQtbGVuZ3RoJ10sICcyMDg2JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhlYWRlcnNbJ0NvbnRlbnQtdHlwZSddLnN0YXJ0c3dpdGgoJ211bHRpcGFydC9mb3JtLWRhdGEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhlYWRlcnNbJ0NvbnRlbnQtdHlwZSddLnN0YXJ0c3dpdGgoJ211bHRpcGFydC9mb3JtLWRhdGEnKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc2VsZi5sYXN0X29wZW4ucmVxLmdldF9tZXRob2QoKSwgJ1BPU1QnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzZWxmLmxhc3Rfb3Blbi5yZXEuZ2V0X2Z1bGxfdXJsKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdodHRwOi8vcHlwaS5weXRob24ub3JnL3B5cGknKQotICAgICAgICBzZWxmLmFzc2VydF8oJ3h4eCcgaW4gc2VsZi5sYXN0X29wZW4ucmVxLmRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgneHh4JyBpbiBzZWxmLmxhc3Rfb3Blbi5yZXEuZGF0YSkKIAogZGVmIHRlc3Rfc3VpdGUoKToKICAgICByZXR1cm4gdW5pdHRlc3QubWFrZVN1aXRlKHVwbG9hZFRlc3RDYXNlKQpkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy90ZXN0cy90ZXN0X3V0aWwucHkgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXRpbC5weQppbmRleCBjZWU3ZDUyLi5jMGFjZjVmIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXRpbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL3Rlc3RzL3Rlc3RfdXRpbC5weQpAQCAtMjI1LDEwICsyMjUsMTAgQEAKICAgICAgICAgbm8gPSAoJ24nLCAnbm8nLCAnZicsICdmYWxzZScsICdvZmYnLCAnMCcsICdPZmYnLCAnTm8nLCAnTicpCiAKICAgICAgICAgZm9yIHkgaW4geWVzOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHN0cnRvYm9vbCh5KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJ0b2Jvb2woeSkpCiAKICAgICAgICAgZm9yIG4gaW4gbm86Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IHN0cnRvYm9vbChuKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgc3RydG9ib29sKG4pKQogCiAgICAgZGVmIHRlc3RfcmZjODIyX2VzY2FwZShzZWxmKToKICAgICAgICAgaGVhZGVyID0gJ0kgYW0gYVxucG9vclxubG9uZXNvbWVcbmhlYWRlclxuJwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weSBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkKaW5kZXggZjljYzZmMC4uNTBkM2ZiNiAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weQorKysgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5CkBAIC01MCw3ICs1MCw3IEBACiAjIEJhc2UgdGVzdCBjbGFzcwogY2xhc3MgVGVzdEVtYWlsQmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIG5kaWZmQXNzZXJ0RXF1YWwoc2VsZiwgZmlyc3QsIHNlY29uZCk6Ci0gICAgICAgICIiIkxpa2UgZmFpbFVubGVzc0VxdWFsIGV4Y2VwdCB1c2UgbmRpZmYgZm9yIHJlYWRhYmxlIG91dHB1dC4iIiIKKyAgICAgICAgIiIiTGlrZSBhc3NlcnRFcXVhbCBleGNlcHQgdXNlIG5kaWZmIGZvciByZWFkYWJsZSBvdXRwdXQuIiIiCiAgICAgICAgIGlmIGZpcnN0IDw+IHNlY29uZDoKICAgICAgICAgICAgIHNmaXJzdCA9IHN0cihmaXJzdCkKICAgICAgICAgICAgIHNzZWNvbmQgPSBzdHIoc2Vjb25kKQpAQCAtMjM5LDEyICsyMzksMTIgQEAKICAgICAgICAgbXNnWydGcm9tJ10gPSAnTWUnCiAgICAgICAgIG1zZ1sndG8nXSA9ICdZb3UnCiAgICAgICAgICMgQ2hlY2sgZm9yIGNhc2UgaW5zZW5zaXRpdml0eQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ2Zyb20nIGluIG1zZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdGcm9tJyBpbiBtc2cpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygnRlJPTScgaW4gbXNnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ3RvJyBpbiBtc2cpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygnVG8nIGluIG1zZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdUTycgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2Zyb20nIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdGcm9tJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnRlJPTScgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3RvJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnVG8nIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdUTycgaW4gbXNnKQogCiAgICAgZGVmIHRlc3RfYXNfc3RyaW5nKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTI2Niw3ICsyNjYsNyBAQAogICAgICAgICBlcSh0ZXh0LCBtc2cuYXNfc3RyaW5nKCkpCiAgICAgICAgIGZ1bGxyZXByID0gc3RyKG1zZykKICAgICAgICAgbGluZXMgPSBmdWxscmVwci5zcGxpdCgnXG4nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobGluZXNbMF0uc3RhcnRzd2l0aCgnRnJvbSAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzWzBdLnN0YXJ0c3dpdGgoJ0Zyb20gJykpCiAgICAgICAgIGVxKHRleHQsIE5MLmpvaW4obGluZXNbMTpdKSkKIAogICAgIGRlZiB0ZXN0X2JhZF9wYXJhbShzZWxmKToKQEAgLTMzNywxMCArMzM3LDEwIEBACiAKICAgICBkZWYgdGVzdF9oYXNfa2V5KHNlbGYpOgogICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCdIZWFkZXI6IGV4aXN0cycpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnaGVhZGVyJykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnSGVhZGVyJykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnSEVBREVSJykpCi0gICAgICAgIHNlbGYuZmFpbElmKG1zZy5oYXNfa2V5KCdoZWFkZXJpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnaGVhZGVyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnSGVhZGVyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnSEVBREVSJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLmhhc19rZXkoJ2hlYWRlcmknKSkKIAogICAgIGRlZiB0ZXN0X3NldF9wYXJhbShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC05MzEsNyArOTMxLDcgQEAKIAogICAgIGRlZiB0ZXN0X2FkZF9oZWFkZXIoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHNlbGYuX2F1LmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2F1ZGlvdGVzdC5hdScpCiAgICAgICAgIGVxKHNlbGYuX2F1Wydjb250ZW50LWRpc3Bvc2l0aW9uJ10sCkBAIC05NzQsNyArOTc0LDcgQEAKIAogICAgIGRlZiB0ZXN0X2FkZF9oZWFkZXIoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHNlbGYuX2ltLmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2Rpbmd1c2Zpc2guZ2lmJykKICAgICAgICAgZXEoc2VsZi5faW1bJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSwKQEAgLTEwMDEsNyArMTAwMSw3IEBACiAKICAgICBkZWYgdGVzdF90eXBlcyhzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgZXEoc2VsZi5fbXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBlcShzZWxmLl9tc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JyksICd1cy1hc2NpaScpCiAgICAgICAgIG1pc3NpbmcgPSBbXQpAQCAtMTAxMSw3ICsxMDExLDcgQEAKIAogICAgIGRlZiB0ZXN0X3BheWxvYWQoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fbXNnLmdldF9wYXlsb2FkKCksICdoZWxsbyB0aGVyZScpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3Qgc2VsZi5fbXNnLmlzX211bHRpcGFydCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYuX21zZy5pc19tdWx0aXBhcnQoKSkKIAogICAgIGRlZiB0ZXN0X2NoYXJzZXQoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtMTA2Niw3ICsxMDY2LDcgQEAKICAgICBkZWYgdGVzdF9oaWVyYXJjaHkoc2VsZik6CiAgICAgICAgICMgY29udmVuaWVuY2UKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgcmFpc2VzID0gc2VsZi5hc3NlcnRSYWlzZXMKICAgICAgICAgIyB0ZXN0cwogICAgICAgICBtID0gc2VsZi5fbXNnCkBAIC0xMzgwLDcgKzEzODAsNyBAQAogCiAtLSAgICBYWFhYLS0KICcnJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5pc19tdWx0aXBhcnQoKSkKICAgICAgICAgZXEobXNnLmdldF9ib3VuZGFyeSgpLCAnICAgIFhYWFgnKQogICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQogCkBAIC0xNDEwLDcgKzE0MTAsNyBAQAogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQogCiAgICAgZGVmIHRlc3Rfc2FtZV9ib3VuZGFyeV9pbm5lcl9vdXRlcihzZWxmKToKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xNS50eHQnKQogICAgICAgICAjIFhYWCBXZSBjYW4gcHJvYmFibHkgZXZlbnR1YWxseSBkbyBiZXR0ZXIKICAgICAgICAgaW5uZXIgPSBtc2cuZ2V0X3BheWxvYWQoMCkKQEAgLTE0MjAsNyArMTQyMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy5TdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QpKQogCiAgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X25vX2JvdW5kYXJ5KHNlbGYpOgotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzI1LnR4dCcpCiAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKG1zZy5nZXRfcGF5bG9hZCgpLCBzdHIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtc2cuZGVmZWN0cyksIDIpCkBAIC0xNDc4LDcgKzE0NzgsNyBAQAogIiIiKQogCiAgICAgZGVmIHRlc3RfbHlpbmdfbXVsdGlwYXJ0KHNlbGYpOgotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzQxLnR4dCcpCiAgICAgICAgIHVubGVzcyhoYXNhdHRyKG1zZywgJ2RlZmVjdHMnKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obXNnLmRlZmVjdHMpLCAyKQpAQCAtMTQ5OCw3ICsxNDk4LDcgQEAKICAgICAgICAgIyBbKl0gVGhpcyBtZXNzYWdlIGlzIG1pc3NpbmcgaXRzIHN0YXJ0IGJvdW5kYXJ5CiAgICAgICAgIGJhZCA9IG91dGVyLmdldF9wYXlsb2FkKDEpLmdldF9wYXlsb2FkKDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJhZC5kZWZlY3RzKSwgMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoYmFkLmRlZmVjdHNbMF0sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGJhZC5kZWZlY3RzWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMuU3RhcnRCb3VuZGFyeU5vdEZvdW5kRGVmZWN0KSkKIAogICAgIGRlZiB0ZXN0X2ZpcnN0X2xpbmVfaXNfY29udGludWF0aW9uX2hlYWRlcihzZWxmKToKQEAgLTE1MDgsNyArMTUwOCw3IEBACiAgICAgICAgIGVxKG1zZy5rZXlzKCksIFtdKQogICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJ0xpbmUgMlxuTGluZSAzJykKICAgICAgICAgZXEobGVuKG1zZy5kZWZlY3RzKSwgMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMuRmlyc3RIZWFkZXJMaW5lSXNDb250aW51YXRpb25EZWZlY3QpKQogICAgICAgICBlcShtc2cuZGVmZWN0c1swXS5saW5lLCAnIExpbmUgMVxuJykKIApAQCAtMTU3Niw3ICsxNTc2LDcgQEAKIAogICAgIGRlZiB0ZXN0X3ZhbGlkX2FyZ3VtZW50KHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBzdWJqZWN0ID0gJ0Egc3ViLW1lc3NhZ2UnCiAgICAgICAgIG0gPSBNZXNzYWdlKCkKICAgICAgICAgbVsnU3ViamVjdCddID0gc3ViamVjdApAQCAtMTYyMCwyMCArMTYyMCwyMCBAQAogCiAgICAgZGVmIHRlc3RfcGFyc2VfbWVzc2FnZV9yZmM4MjIoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzExLnR4dCcpCiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIHBheWxvYWQgPSBtc2cuZ2V0X3BheWxvYWQoKQogICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKICAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQogICAgICAgICBzdWJtc2cgPSBwYXlsb2FkWzBdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHN1Ym1zZywgTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN1Ym1zZywgTWVzc2FnZSkpCiAgICAgICAgIGVxKHN1Ym1zZ1snc3ViamVjdCddLCAnQW4gZW5jbG9zZWQgbWVzc2FnZScpCiAgICAgICAgIGVxKHN1Ym1zZy5nZXRfcGF5bG9hZCgpLCAnSGVyZSBpcyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS5cbicpCiAKICAgICBkZWYgdGVzdF9kc24oc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgICMgbXNnIDE2IGlzIGEgRGVsaXZlcnkgU3RhdHVzIE5vdGlmaWNhdGlvbiwgc2VlIFJGQyAxODk0CiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE2LnR4dCcpCiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvcmVwb3J0JykKQEAgLTE5ODMsNyArMTk4Myw3IEBACiAKICAgICBkZWYgdGVzdF9jb250ZW50X3R5cGUoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbHMKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICAjIEdldCBhIG1lc3NhZ2Ugb2JqZWN0IGFuZCByZXNldCB0aGUgc2VlayBwb2ludGVyIGZvciBvdGhlciB0ZXN0cwogICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCkBAIC0yMDA1LDcgKzIwMDUsNyBAQAogICAgICAgICBlcShtc2cyLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKICAgICAgICAgbXNnMyA9IG1zZy5nZXRfcGF5bG9hZCgyKQogICAgICAgICBlcShtc2czLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UobXNnMywgTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZzMsIE1lc3NhZ2UpKQogICAgICAgICBwYXlsb2FkID0gbXNnMy5nZXRfcGF5bG9hZCgpCiAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQogICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCkBAIC0yMDE1LDcgKzIwMTUsNyBAQAogCiAgICAgZGVmIHRlc3RfcGFyc2VyKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCi0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDYudHh0JykKICAgICAgICAgIyBDaGVjayBzb21lIG9mIHRoZSBvdXRlciBoZWFkZXJzCiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCkBAIC0yMDI1LDkgKzIwMjUsOSBAQAogICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKICAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQogICAgICAgICBtc2cxID0gcGF5bG9hZFswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShtc2cxLCBNZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMSwgTWVzc2FnZSkpCiAgICAgICAgIGVxKG1zZzEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZzEuZ2V0X3BheWxvYWQoKSwgc3RyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMS5nZXRfcGF5bG9hZCgpLCBzdHIpKQogICAgICAgICBlcShtc2cxLmdldF9wYXlsb2FkKCksICdcbicpCiAKIApAQCAtMjA2NCw3ICsyMDY0LDcgQEAKICAgICAgICAgICAgIGZwLmNsb3NlKCkKIAogICAgIGRlZiB0ZXN0X21lc3NhZ2VfZnJvbV9zdHJpbmdfd2l0aF9jbGFzcyhzZWxmKToKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDEudHh0JykKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgdGV4dCA9IGZwLnJlYWQoKQpAQCAtMjA4Nyw3ICsyMDg3LDcgQEAKICAgICAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHN1YnBhcnQsIE15TWVzc2FnZSkpCiAKICAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fZmlsZV93aXRoX2NsYXNzKHNlbGYpOgotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgICMgQ3JlYXRlIGEgc3ViY2xhc3MKICAgICAgICAgY2xhc3MgTXlNZXNzYWdlKE1lc3NhZ2UpOgogICAgICAgICAgICAgcGFzcwpAQCAtMjIyOSw3ICsyMjI5LDcgQEAKIAogICAgIGRlZiB0ZXN0X2NoYXJzZXRfcmljaGNvbXBhcmlzb25zKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgbmUgPSBzZWxmLmZhaWxJZkVxdWFsCisgICAgICAgIG5lID0gc2VsZi5hc3NlcnROb3RFcXVhbAogICAgICAgICBjc2V0MSA9IENoYXJzZXQoKQogICAgICAgICBjc2V0MiA9IENoYXJzZXQoKQogICAgICAgICBlcShjc2V0MSwgJ3VzLWFzY2lpJykKQEAgLTI0MjgsOCArMjQyOCw4IEBACiAgICAgICAgIGVxKG1zZ1snZnJvbSddLCAncHBwLXJlcXVlc3RAenp6Lm9yZycpCiAgICAgICAgIGVxKG1zZ1sndG8nXSwgJ3BwcEB6enoub3JnJykKICAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9taXhlZCcpCi0gICAgICAgIHNlbGYuZmFpbElmKG1zZy5pc19tdWx0aXBhcnQoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UobXNnLmdldF9wYXlsb2FkKCksIHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLmlzX211bHRpcGFydCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2cuZ2V0X3BheWxvYWQoKSwgc3RyKSkKIAogICAgIGRlZiB0ZXN0X3doaXRlc3BhY2VfY29udGludWF0aW9uKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTI2NDgsMTUgKzI2NDgsMTUgQEAKIAogICAgIGRlZiB0ZXN0X2hlYWRlcl9xdW9wcmlfY2hlY2soc2VsZik6CiAgICAgICAgIGZvciBjIGluIHNlbGYuaGxpdDoKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKHF1b3ByaU1JTUUuaGVhZGVyX3F1b3ByaV9jaGVjayhjKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocXVvcHJpTUlNRS5oZWFkZXJfcXVvcHJpX2NoZWNrKGMpKQogICAgICAgICBmb3IgYyBpbiBzZWxmLmhub246Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MocXVvcHJpTUlNRS5oZWFkZXJfcXVvcHJpX2NoZWNrKGMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHF1b3ByaU1JTUUuaGVhZGVyX3F1b3ByaV9jaGVjayhjKSkKIAogICAgIGRlZiB0ZXN0X2JvZHlfcXVvcHJpX2NoZWNrKHNlbGYpOgogICAgICAgICBmb3IgYyBpbiBzZWxmLmJsaXQ6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihxdW9wcmlNSU1FLmJvZHlfcXVvcHJpX2NoZWNrKGMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxdW9wcmlNSU1FLmJvZHlfcXVvcHJpX2NoZWNrKGMpKQogICAgICAgICBmb3IgYyBpbiBzZWxmLmJub246Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MocXVvcHJpTUlNRS5ib2R5X3F1b3ByaV9jaGVjayhjKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmlNSU1FLmJvZHlfcXVvcHJpX2NoZWNrKGMpKQogCiAgICAgZGVmIHRlc3RfaGVhZGVyX3F1b3ByaV9sZW4oc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtMjgyNSw3ICsyODI1LDcgQEAKICAgICAgICAgaCA9IEhlYWRlcigiSSBhbSB0aGUgdmVyeSBtb2RlbCBvZiBhIG1vZGVybiBNYWpvci1HZW5lcmFsOyBJJ3ZlIGluZm9ybWF0aW9uIHZlZ2V0YWJsZSwgYW5pbWFsLCBhbmQgbWluZXJhbDsgSSBrbm93IHRoZSBraW5ncyBvZiBFbmdsYW5kLCBhbmQgSSBxdW90ZSB0aGUgZmlnaHRzIGhpc3RvcmljYWwgZnJvbSBNYXJhdGhvbiB0byBXYXRlcmxvbywgaW4gb3JkZXIgY2F0ZWdvcmljYWw7IEknbSB2ZXJ5IHdlbGwgYWNxdWFpbnRlZCwgdG9vLCB3aXRoIG1hdHRlcnMgbWF0aGVtYXRpY2FsOyBJIHVuZGVyc3RhbmQgZXF1YXRpb25zLCBib3RoIHRoZSBzaW1wbGUgYW5kIHF1YWRyYXRpY2FsOyBhYm91dCBiaW5vbWlhbCB0aGVvcmVtIEknbSB0ZWVtaW5nIHdpdGggYSBsb3QgbycgbmV3cywgd2l0aCBtYW55IGNoZWVyZnVsIGZhY3RzIGFib3V0IHRoZSBzcXVhcmUgb2YgdGhlIGh5cG90ZW51c2UuIiwKICAgICAgICAgICAgICAgICAgICBtYXhsaW5lbGVuPTc2KQogICAgICAgICBmb3IgbCBpbiBoLmVuY29kZShzcGxpdGNoYXJzPScgJykuc3BsaXQoJ1xuICcpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxlbihsKSA8PSA3NikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obCkgPD0gNzYpCiAKICAgICBkZWYgdGVzdF9tdWx0aWxpbmd1YWwoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCkBAIC0zMDU1LDcgKzMwNTUsNyBAQAogJycnCiAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKICAgICAgICAgcGFyYW0gPSBtc2cuZ2V0X3BhcmFtKCdOQU1FJykKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIHBhcmFtLAogICAgICAgICAgICAgJ2ZpbGVfX19fQ19fRE9DVU1FTlRTXzIwQU5EXzIwU0VUVElOR1NfRkFCSUVOX0xPQ0FMXzIwU0VUVElOR1NfVEVNUF9uc21haWwuaHRtJykKQEAgLTMyMDgsNyArMzIwOCw3IEBACiAiIiIKICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQogICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQotICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmFtLCAiRnJhbmsncyBEb2N1bWVudCIpCiAKICAgICBkZWYgdGVzdF9yZmMyMjMxX3RpY2tfYXR0YWNrX2V4dGVuZGVkKHNlbGYpOgpAQCAtMzIzMiw3ICszMjMyLDcgQEAKICIiIgogICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCiAgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnbmFtZScpCi0gICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyYW0sICJ1cy1hc2NpaSdlbi11cydGcmFuaydzIERvY3VtZW50IikKIAogICAgIGRlZiB0ZXN0X3JmYzIyMzFfbm9fZXh0ZW5kZWRfdmFsdWVzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5IGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5CmluZGV4IDYxZmUyNmUuLjkyOGQyNTEgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfcmVuYW1lZC5weQorKysgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHkKQEAgLTUxLDcgKzUxLDcgQEAKICMgQmFzZSB0ZXN0IGNsYXNzCiBjbGFzcyBUZXN0RW1haWxCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgbmRpZmZBc3NlcnRFcXVhbChzZWxmLCBmaXJzdCwgc2Vjb25kKToKLSAgICAgICAgIiIiTGlrZSBmYWlsVW5sZXNzRXF1YWwgZXhjZXB0IHVzZSBuZGlmZiBmb3IgcmVhZGFibGUgb3V0cHV0LiIiIgorICAgICAgICAiIiJMaWtlIGFzc2VydEVxdWFsIGV4Y2VwdCB1c2UgbmRpZmYgZm9yIHJlYWRhYmxlIG91dHB1dC4iIiIKICAgICAgICAgaWYgZmlyc3QgPD4gc2Vjb25kOgogICAgICAgICAgICAgc2ZpcnN0ID0gc3RyKGZpcnN0KQogICAgICAgICAgICAgc3NlY29uZCA9IHN0cihzZWNvbmQpCkBAIC0yMjcsMTIgKzIyNywxMiBAQAogICAgICAgICBtc2dbJ0Zyb20nXSA9ICdNZScKICAgICAgICAgbXNnWyd0byddID0gJ1lvdScKICAgICAgICAgIyBDaGVjayBmb3IgY2FzZSBpbnNlbnNpdGl2aXR5Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcygnZnJvbScgaW4gbXNnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ0Zyb20nIGluIG1zZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdGUk9NJyBpbiBtc2cpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygndG8nIGluIG1zZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdUbycgaW4gbXNnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ1RPJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZnJvbScgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0Zyb20nIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdGUk9NJyBpbiBtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgndG8nIGluIG1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdUbycgaW4gbXNnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1RPJyBpbiBtc2cpCiAKICAgICBkZWYgdGVzdF9hc19zdHJpbmcoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtMjU0LDcgKzI1NCw3IEBACiAgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbCh0ZXh0LCBtc2cuYXNfc3RyaW5nKCkpCiAgICAgICAgIGZ1bGxyZXByID0gc3RyKG1zZykKICAgICAgICAgbGluZXMgPSBmdWxscmVwci5zcGxpdCgnXG4nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobGluZXNbMF0uc3RhcnRzd2l0aCgnRnJvbSAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzWzBdLnN0YXJ0c3dpdGgoJ0Zyb20gJykpCiAgICAgICAgIGVxKHRleHQsIE5MLmpvaW4obGluZXNbMTpdKSkKIAogICAgIGRlZiB0ZXN0X2JhZF9wYXJhbShzZWxmKToKQEAgLTMyNSwxMCArMzI1LDEwIEBACiAKICAgICBkZWYgdGVzdF9oYXNfa2V5KHNlbGYpOgogICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCdIZWFkZXI6IGV4aXN0cycpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnaGVhZGVyJykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnSGVhZGVyJykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnSEVBREVSJykpCi0gICAgICAgIHNlbGYuZmFpbElmKG1zZy5oYXNfa2V5KCdoZWFkZXJpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnaGVhZGVyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnSGVhZGVyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaGFzX2tleSgnSEVBREVSJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLmhhc19rZXkoJ2hlYWRlcmknKSkKIAogICAgIGRlZiB0ZXN0X3NldF9wYXJhbShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC05MTIsNyArOTEyLDcgQEAKIAogICAgIGRlZiB0ZXN0X2FkZF9oZWFkZXIoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHNlbGYuX2F1LmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2F1ZGlvdGVzdC5hdScpCiAgICAgICAgIGVxKHNlbGYuX2F1Wydjb250ZW50LWRpc3Bvc2l0aW9uJ10sCkBAIC05NTUsNyArOTU1LDcgQEAKIAogICAgIGRlZiB0ZXN0X2FkZF9oZWFkZXIoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHNlbGYuX2ltLmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU9J2Rpbmd1c2Zpc2guZ2lmJykKICAgICAgICAgZXEoc2VsZi5faW1bJ2NvbnRlbnQtZGlzcG9zaXRpb24nXSwKQEAgLTk5OSw3ICs5OTksNyBAQAogCiAgICAgZGVmIHRlc3RfdHlwZXMoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIGVxKHNlbGYuX21zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgZXEoc2VsZi5fbXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCAndXMtYXNjaWknKQogICAgICAgICBtaXNzaW5nID0gW10KQEAgLTEwMDksNyArMTAwOSw3IEBACiAKICAgICBkZWYgdGVzdF9wYXlsb2FkKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX21zZy5nZXRfcGF5bG9hZCgpLCAnaGVsbG8gdGhlcmUnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHNlbGYuX21zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLl9tc2cuaXNfbXVsdGlwYXJ0KCkpCiAKICAgICBkZWYgdGVzdF9jaGFyc2V0KHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTEwNjQsNyArMTA2NCw3IEBACiAgICAgZGVmIHRlc3RfaGllcmFyY2h5KHNlbGYpOgogICAgICAgICAjIGNvbnZlbmllbmNlCiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCiAgICAgICAgICMgdGVzdHMKICAgICAgICAgbSA9IHNlbGYuX21zZwpAQCAtMTM3OCw3ICsxMzc4LDcgQEAKIAogLS0gICAgWFhYWC0tCiAnJycpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaXNfbXVsdGlwYXJ0KCkpCiAgICAgICAgIGVxKG1zZy5nZXRfYm91bmRhcnkoKSwgJyAgICBYWFhYJykKICAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKIApAQCAtMTQwOCw3ICsxNDA4LDcgQEAKICAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKIAogICAgIGRlZiB0ZXN0X3NhbWVfYm91bmRhcnlfaW5uZXJfb3V0ZXIoc2VsZik6Ci0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTUudHh0JykKICAgICAgICAgIyBYWFggV2UgY2FuIHByb2JhYmx5IGV2ZW50dWFsbHkgZG8gYmV0dGVyCiAgICAgICAgIGlubmVyID0gbXNnLmdldF9wYXlsb2FkKDApCkBAIC0xNDE4LDcgKzE0MTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMuU3RhcnRCb3VuZGFyeU5vdEZvdW5kRGVmZWN0KSkKIAogICAgIGRlZiB0ZXN0X211bHRpcGFydF9ub19ib3VuZGFyeShzZWxmKToKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18yNS50eHQnKQogICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZ2V0X3BheWxvYWQoKSwgc3RyKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obXNnLmRlZmVjdHMpLCAyKQpAQCAtMTQ3Niw3ICsxNDc2LDcgQEAKICIiIikKIAogICAgIGRlZiB0ZXN0X2x5aW5nX211bHRpcGFydChzZWxmKToKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ180MS50eHQnKQogICAgICAgICB1bmxlc3MoaGFzYXR0cihtc2csICdkZWZlY3RzJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5kZWZlY3RzKSwgMikKQEAgLTE0OTYsNyArMTQ5Niw3IEBACiAgICAgICAgICMgWypdIFRoaXMgbWVzc2FnZSBpcyBtaXNzaW5nIGl0cyBzdGFydCBib3VuZGFyeQogICAgICAgICBiYWQgPSBvdXRlci5nZXRfcGF5bG9hZCgxKS5nZXRfcGF5bG9hZCgwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihiYWQuZGVmZWN0cyksIDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKGJhZC5kZWZlY3RzWzBdLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShiYWQuZGVmZWN0c1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLlN0YXJ0Qm91bmRhcnlOb3RGb3VuZERlZmVjdCkpCiAKICAgICBkZWYgdGVzdF9maXJzdF9saW5lX2lzX2NvbnRpbnVhdGlvbl9oZWFkZXIoc2VsZik6CkBAIC0xNTA2LDcgKzE1MDYsNyBAQAogICAgICAgICBlcShtc2cua2V5cygpLCBbXSkKICAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdMaW5lIDJcbkxpbmUgMycpCiAgICAgICAgIGVxKGxlbihtc2cuZGVmZWN0cyksIDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZy5kZWZlY3RzWzBdLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1swXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLkZpcnN0SGVhZGVyTGluZUlzQ29udGludWF0aW9uRGVmZWN0KSkKICAgICAgICAgZXEobXNnLmRlZmVjdHNbMF0ubGluZSwgJyBMaW5lIDFcbicpCiAKQEAgLTE1NzMsNyArMTU3Myw3IEBACiAKICAgICBkZWYgdGVzdF92YWxpZF9hcmd1bWVudChzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgc3ViamVjdCA9ICdBIHN1Yi1tZXNzYWdlJwogICAgICAgICBtID0gTWVzc2FnZSgpCiAgICAgICAgIG1bJ1N1YmplY3QnXSA9IHN1YmplY3QKQEAgLTE2MTcsMjAgKzE2MTcsMjAgQEAKIAogICAgIGRlZiB0ZXN0X3BhcnNlX21lc3NhZ2VfcmZjODIyKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xMS50eHQnKQogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBwYXlsb2FkID0gbXNnLmdldF9wYXlsb2FkKCkKICAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCiAgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKICAgICAgICAgc3VibXNnID0gcGF5bG9hZFswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzdWJtc2csIE1lc3NhZ2UpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzdWJtc2csIE1lc3NhZ2UpKQogICAgICAgICBlcShzdWJtc2dbJ3N1YmplY3QnXSwgJ0FuIGVuY2xvc2VkIG1lc3NhZ2UnKQogICAgICAgICBlcShzdWJtc2cuZ2V0X3BheWxvYWQoKSwgJ0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuXG4nKQogCiAgICAgZGVmIHRlc3RfZHNuKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICAjIG1zZyAxNiBpcyBhIERlbGl2ZXJ5IFN0YXR1cyBOb3RpZmljYXRpb24sIHNlZSBSRkMgMTg5NAogICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xNi50eHQnKQogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCkBAIC0xOTc3LDcgKzE5NzcsNyBAQAogCiAgICAgZGVmIHRlc3RfY29udGVudF90eXBlKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCi0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgIyBHZXQgYSBtZXNzYWdlIG9iamVjdCBhbmQgcmVzZXQgdGhlIHNlZWsgcG9pbnRlciBmb3Igb3RoZXIgdGVzdHMKICAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDUudHh0JykKICAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9yZXBvcnQnKQpAQCAtMTk5OSw3ICsxOTk5LDcgQEAKICAgICAgICAgZXEobXNnMi5nZXRfcGF5bG9hZCgpLCAnWWFkZGEgeWFkZGEgeWFkZGFcbicpCiAgICAgICAgIG1zZzMgPSBtc2cuZ2V0X3BheWxvYWQoMikKICAgICAgICAgZXEobXNnMy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZzMsIE1lc3NhZ2UpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2czLCBNZXNzYWdlKSkKICAgICAgICAgcGF5bG9hZCA9IG1zZzMuZ2V0X3BheWxvYWQoKQogICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKICAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQpAQCAtMjAwOSw3ICsyMDA5LDcgQEAKIAogICAgIGRlZiB0ZXN0X3BhcnNlcihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFscwotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA2LnR4dCcpCiAgICAgICAgICMgQ2hlY2sgc29tZSBvZiB0aGUgb3V0ZXIgaGVhZGVycwogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQpAQCAtMjAxOSw5ICsyMDE5LDkgQEAKICAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCiAgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKICAgICAgICAgbXNnMSA9IHBheWxvYWRbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UobXNnMSwgTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZzEsIE1lc3NhZ2UpKQogICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShtc2cxLmdldF9wYXlsb2FkKCksIHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZzEuZ2V0X3BheWxvYWQoKSwgc3RyKSkKICAgICAgICAgZXEobXNnMS5nZXRfcGF5bG9hZCgpLCAnXG4nKQogCiAKQEAgLTIwNTgsNyArMjA1OCw3IEBACiAgICAgICAgICAgICBmcC5jbG9zZSgpCiAKICAgICBkZWYgdGVzdF9tZXNzYWdlX2Zyb21fc3RyaW5nX3dpdGhfY2xhc3Moc2VsZik6Ci0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKQEAgLTIwODEsNyArMjA4MSw3IEBACiAgICAgICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShzdWJwYXJ0LCBNeU1lc3NhZ2UpKQogCiAgICAgZGVmIHRlc3RfbWVzc2FnZV9mcm9tX2ZpbGVfd2l0aF9jbGFzcyhzZWxmKToKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICAjIENyZWF0ZSBhIHN1YmNsYXNzCiAgICAgICAgIGNsYXNzIE15TWVzc2FnZShNZXNzYWdlKToKICAgICAgICAgICAgIHBhc3MKQEAgLTIyMjQsNyArMjIyNCw3IEBACiAKICAgICBkZWYgdGVzdF9jaGFyc2V0X3JpY2hjb21wYXJpc29ucyhzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIG5lID0gc2VsZi5mYWlsSWZFcXVhbAorICAgICAgICBuZSA9IHNlbGYuYXNzZXJ0Tm90RXF1YWwKICAgICAgICAgY3NldDEgPSBDaGFyc2V0KCkKICAgICAgICAgY3NldDIgPSBDaGFyc2V0KCkKICAgICAgICAgZXEoY3NldDEsICd1cy1hc2NpaScpCkBAIC0yNDIzLDggKzI0MjMsOCBAQAogICAgICAgICBlcShtc2dbJ2Zyb20nXSwgJ3BwcC1yZXF1ZXN0QHp6ei5vcmcnKQogICAgICAgICBlcShtc2dbJ3RvJ10sICdwcHBAenp6Lm9yZycpCiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvbWl4ZWQnKQotICAgICAgICBzZWxmLmZhaWxJZihtc2cuaXNfbXVsdGlwYXJ0KCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZy5nZXRfcGF5bG9hZCgpLCBzdHIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnLmdldF9wYXlsb2FkKCksIHN0cikpCiAKICAgICBkZWYgdGVzdF93aGl0ZXNwYWNlX2NvbnRpbnVhdGlvbihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC0yNjQzLDE1ICsyNjQzLDE1IEBACiAKICAgICBkZWYgdGVzdF9oZWFkZXJfcXVvcHJpX2NoZWNrKHNlbGYpOgogICAgICAgICBmb3IgYyBpbiBzZWxmLmhsaXQ6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihxdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfY2hlY2soYykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9jaGVjayhjKSkKICAgICAgICAgZm9yIGMgaW4gc2VsZi5obm9uOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9jaGVjayhjKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfY2hlY2soYykpCiAKICAgICBkZWYgdGVzdF9ib2R5X3F1b3ByaV9jaGVjayhzZWxmKToKICAgICAgICAgZm9yIGMgaW4gc2VsZi5ibGl0OgotICAgICAgICAgICAgc2VsZi5mYWlsSWYocXVvcHJpbWltZS5ib2R5X3F1b3ByaV9jaGVjayhjKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocXVvcHJpbWltZS5ib2R5X3F1b3ByaV9jaGVjayhjKSkKICAgICAgICAgZm9yIGMgaW4gc2VsZi5ibm9uOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHF1b3ByaW1pbWUuYm9keV9xdW9wcmlfY2hlY2soYykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocXVvcHJpbWltZS5ib2R5X3F1b3ByaV9jaGVjayhjKSkKIAogICAgIGRlZiB0ZXN0X2hlYWRlcl9xdW9wcmlfbGVuKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTI4MjAsNyArMjgyMCw3IEBACiAgICAgICAgIGggPSBIZWFkZXIoIkkgYW0gdGhlIHZlcnkgbW9kZWwgb2YgYSBtb2Rlcm4gTWFqb3ItR2VuZXJhbDsgSSd2ZSBpbmZvcm1hdGlvbiB2ZWdldGFibGUsIGFuaW1hbCwgYW5kIG1pbmVyYWw7IEkga25vdyB0aGUga2luZ3Mgb2YgRW5nbGFuZCwgYW5kIEkgcXVvdGUgdGhlIGZpZ2h0cyBoaXN0b3JpY2FsIGZyb20gTWFyYXRob24gdG8gV2F0ZXJsb28sIGluIG9yZGVyIGNhdGVnb3JpY2FsOyBJJ20gdmVyeSB3ZWxsIGFjcXVhaW50ZWQsIHRvbywgd2l0aCBtYXR0ZXJzIG1hdGhlbWF0aWNhbDsgSSB1bmRlcnN0YW5kIGVxdWF0aW9ucywgYm90aCB0aGUgc2ltcGxlIGFuZCBxdWFkcmF0aWNhbDsgYWJvdXQgYmlub21pYWwgdGhlb3JlbSBJJ20gdGVlbWluZyB3aXRoIGEgbG90IG8nIG5ld3MsIHdpdGggbWFueSBjaGVlcmZ1bCBmYWN0cyBhYm91dCB0aGUgc3F1YXJlIG9mIHRoZSBoeXBvdGVudXNlLiIsCiAgICAgICAgICAgICAgICAgICAgbWF4bGluZWxlbj03NikKICAgICAgICAgZm9yIGwgaW4gaC5lbmNvZGUoc3BsaXRjaGFycz0nICcpLnNwbGl0KCdcbiAnKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhsZW4obCkgPD0gNzYpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGwpIDw9IDc2KQogCiAgICAgZGVmIHRlc3RfbXVsdGlsaW5ndWFsKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbApAQCAtMzA1MCw3ICszMDUwLDcgQEAKICcnJwogICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCiAgICAgICAgIHBhcmFtID0gbXNnLmdldF9wYXJhbSgnTkFNRScpCi0gICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBwYXJhbSwKICAgICAgICAgICAgICdmaWxlX19fX0NfX0RPQ1VNRU5UU18yMEFORF8yMFNFVFRJTkdTX0ZBQklFTl9MT0NBTF8yMFNFVFRJTkdTX1RFTVBfbnNtYWlsLmh0bScpCkBAIC0zMjAzLDcgKzMyMDMsNyBAQAogIiIiCiAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKICAgICAgICAgcGFyYW0gPSBtc2cuZ2V0X3BhcmFtKCduYW1lJykKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UocGFyYW0sIHR1cGxlKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwYXJhbSwgIkZyYW5rJ3MgRG9jdW1lbnQiKQogCiAgICAgZGVmIHRlc3RfcmZjMjIzMV90aWNrX2F0dGFja19leHRlbmRlZChzZWxmKToKQEAgLTMyMjcsNyArMzIyNyw3IEBACiAiIiIKICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQogICAgICAgICBwYXJhbSA9IG1zZy5nZXRfcGFyYW0oJ25hbWUnKQotICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKHBhcmFtLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShwYXJhbSwgdHVwbGUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhcmFtLCAidXMtYXNjaWknZW4tdXMnRnJhbmsncyBEb2N1bWVudCIpCiAKICAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2V4dGVuZGVkX3ZhbHVlcyhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi9qc29uL3Rlc3RzL3Rlc3RfZGVjb2RlLnB5IGIvTGliL2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHkKaW5kZXggNzEwOTUyNy4uY2E4ZjdiMyAxMDA2NDQKLS0tIGEvTGliL2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHkKKysrIGIvTGliL2pzb24vdGVzdHMvdGVzdF9kZWNvZGUucHkKQEAgLTgsMTIgKzgsMTIgQEAKIGNsYXNzIFRlc3REZWNvZGUoVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2RlY2ltYWwoc2VsZik6CiAgICAgICAgIHJ2YWwgPSBqc29uLmxvYWRzKCcxLjEnLCBwYXJzZV9mbG9hdD1kZWNpbWFsLkRlY2ltYWwpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHJ2YWwsIGRlY2ltYWwuRGVjaW1hbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHJ2YWwsIGRlY2ltYWwuRGVjaW1hbCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJ2YWwsIGRlY2ltYWwuRGVjaW1hbCgnMS4xJykpCiAKICAgICBkZWYgdGVzdF9mbG9hdChzZWxmKToKICAgICAgICAgcnZhbCA9IGpzb24ubG9hZHMoJzEnLCBwYXJzZV9pbnQ9ZmxvYXQpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHJ2YWwsIGZsb2F0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocnZhbCwgZmxvYXQpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhydmFsLCAxLjApCiAKICAgICBkZWYgdGVzdF9kZWNvZGVyX29wdGltaXphdGlvbnMoc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvanNvbi90ZXN0cy90ZXN0X3NwZWVkdXBzLnB5IGIvTGliL2pzb24vdGVzdHMvdGVzdF9zcGVlZHVwcy5weQppbmRleCA4ZmY5YTM4Li4zYTg0ZGRmIDEwMDY0NAotLS0gYS9MaWIvanNvbi90ZXN0cy90ZXN0X3NwZWVkdXBzLnB5CisrKyBiL0xpYi9qc29uL3Rlc3RzL3Rlc3Rfc3BlZWR1cHMucHkKQEAgLTcsOSArNyw5IEBACiBjbGFzcyBUZXN0U3BlZWR1cHMoVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X3NjYW5zdHJpbmcoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlY29kZXIuc2NhbnN0cmluZy5fX21vZHVsZV9fLCAiX2pzb24iKQotICAgICAgICBzZWxmLmFzc2VydF8oZGVjb2Rlci5zY2Fuc3RyaW5nIGlzIGRlY29kZXIuY19zY2Fuc3RyaW5nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGVjb2Rlci5zY2Fuc3RyaW5nIGlzIGRlY29kZXIuY19zY2Fuc3RyaW5nKQogCiAgICAgZGVmIHRlc3RfZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVuY29kZXIuZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkuX19tb2R1bGVfXywgIl9qc29uIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGVuY29kZXIuZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkgaXMKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVuY29kZXIuZW5jb2RlX2Jhc2VzdHJpbmdfYXNjaWkgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5jX2VuY29kZV9iYXNlc3RyaW5nX2FzY2lpKQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90ZXN0L3Rlc3RfdGtpbnRlci90ZXN0X3RleHQucHkgYi9MaWIvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdGV4dC5weQppbmRleCAwMDliOGRlLi5lNmMwOGJlIDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdGV4dC5weQorKysgYi9MaWIvbGliLXRrL3Rlc3QvdGVzdF90a2ludGVyL3Rlc3RfdGV4dC5weQpAQCAtMTksMTggKzE5LDE4IEBACiAgICAgICAgIHRleHQgPSBzZWxmLnRleHQKIAogICAgICAgICAjIHBhdHRlcm4gYW5kIGluZGV4IGFyZSBvYmxpZ2F0b3J5IGFyZ3VtZW50cy4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHRleHQuc2VhcmNoLCBOb25lLCAnMS4wJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHRleHQuc2VhcmNoLCAnYScsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCB0ZXh0LnNlYXJjaCwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgdGV4dC5zZWFyY2gsIE5vbmUsICcxLjAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCB0ZXh0LnNlYXJjaCwgJ2EnLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCB0ZXh0LnNlYXJjaCwgTm9uZSwgTm9uZSkKIAogICAgICAgICAjIEludmFsaWQgdGV4dCBpbmRleC4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHRleHQuc2VhcmNoLCAnJywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgdGV4dC5zZWFyY2gsICcnLCAwKQogCiAgICAgICAgICMgQ2hlY2sgaWYgd2UgYXJlIGdldHRpbmcgdGhlIGluZGljZXMgYXMgc3RyaW5ncyAtLSB5b3UgYXJlIGxpa2VseQogICAgICAgICAjIHRvIGdldCBUY2xfT2JqIHVuZGVyIFRrIDguNSBpZiBUa2ludGVyIGRvZXNuJ3QgY29udmVydCBpdC4KICAgICAgICAgdGV4dC5pbnNlcnQoJzEuMCcsICdoaS10ZXN0JykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodGV4dC5zZWFyY2goJy10ZXN0JywgJzEuMCcsICdlbmQnKSwgJzEuMicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRleHQuc2VhcmNoKCd0ZXN0JywgJzEuMCcsICdlbmQnKSwgJzEuMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5zZWFyY2goJy10ZXN0JywgJzEuMCcsICdlbmQnKSwgJzEuMicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dC5zZWFyY2goJ3Rlc3QnLCAnMS4wJywgJ2VuZCcpLCAnMS4zJykKIAogCiB0ZXN0c19ndWkgPSAoVGV4dFRlc3QsICkKZGlmZiAtLWdpdCBhL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2V4dGVuc2lvbnMucHkgYi9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9leHRlbnNpb25zLnB5CmluZGV4IDQxM2QyMjUuLjZlNDZjYmMgMTAwNjQ0Ci0tLSBhL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2V4dGVuc2lvbnMucHkKKysrIGIvTGliL2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZXh0ZW5zaW9ucy5weQpAQCAtMjIsMTYgKzIyLDE2IEBACiAgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKCkKICAgICAgICAgdmFyID0geC5fdmFyaWFibGUuX25hbWUKICAgICAgICAgeC5kZXN0cm95KCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHgudGsuZ2xvYmFsZ2V0dmFyLCB2YXIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHgudGsuZ2xvYmFsZ2V0dmFyLCB2YXIpCiAKICAgICAgICAgIyBtYW51YWxseSBjcmVhdGVkIHZhcmlhYmxlCiAgICAgICAgIG15dmFyID0gVGtpbnRlci5Eb3VibGVWYXIoKQogICAgICAgICBuYW1lID0gbXl2YXIuX25hbWUKICAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUodmFyaWFibGU9bXl2YXIpCiAgICAgICAgIHguZGVzdHJveSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHgudGsuZ2xvYmFsZ2V0dmFyKG5hbWUpLCBteXZhci5nZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnRrLmdsb2JhbGdldHZhcihuYW1lKSwgbXl2YXIuZ2V0KCkpCiAgICAgICAgIGRlbCBteXZhcgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgeC50ay5nbG9iYWxnZXR2YXIsIG5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHgudGsuZ2xvYmFsZ2V0dmFyLCBuYW1lKQogCiAgICAgICAgICMgY2hlY2tpbmcgdGhhdCB0aGUgdHJhY2luZyBjYWxsYmFjayBpcyBwcm9wZXJseSByZW1vdmVkCiAgICAgICAgIG15dmFyID0gVGtpbnRlci5JbnRWYXIoKQpAQCAtNDUsMTcgKzQ1LDE3IEBACiAgICAgICAgICMgaXQgdHJpZXMgY2FsbGluZyBpbnN0YW5jZSBhdHRyaWJ1dGVzIG5vdCB5ZXQgZGVmaW5lZC4KICAgICAgICAgdHRrLkxhYmVsZWRTY2FsZSh2YXJpYWJsZT1teXZhcikKICAgICAgICAgaWYgaGFzYXR0cihzeXMsICdsYXN0X3R5cGUnKToKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKHN5cy5sYXN0X3R5cGUgPT0gVGtpbnRlci5UY2xFcnJvcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3lzLmxhc3RfdHlwZSA9PSBUa2ludGVyLlRjbEVycm9yKQogCiAKICAgICBkZWYgdGVzdF9pbml0aWFsaXphdGlvbihzZWxmKToKICAgICAgICAgIyBtYXN0ZXIgcGFzc2luZwogICAgICAgICB4ID0gdHRrLkxhYmVsZWRTY2FsZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHgubWFzdGVyLCBUa2ludGVyLl9kZWZhdWx0X3Jvb3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5tYXN0ZXIsIFRraW50ZXIuX2RlZmF1bHRfcm9vdCkKICAgICAgICAgeC5kZXN0cm95KCkKICAgICAgICAgbWFzdGVyID0gVGtpbnRlci5GcmFtZSgpCiAgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKG1hc3RlcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5tYXN0ZXIsIG1hc3RlcikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4Lm1hc3RlciwgbWFzdGVyKQogICAgICAgICB4LmRlc3Ryb3koKQogCiAgICAgICAgICMgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24vcGFzc2luZwpAQCAtNjMsMjkgKzYzLDI5IEBACiAgICAgICAgICAgICAoLTEsIC0xKSwgKHN5cy5tYXhpbnQgKyAxLCBzeXMubWF4aW50ICsgMSkpCiAgICAgICAgIGZvciBwYWlyIGluIHBhc3NlZF9leHBlY3RlZDoKICAgICAgICAgICAgIHggPSB0dGsuTGFiZWxlZFNjYWxlKGZyb21fPXBhaXJbMF0pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4LnZhbHVlLCBwYWlyWzFdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnZhbHVlLCBwYWlyWzFdKQogICAgICAgICAgICAgeC5kZXN0cm95KCkKICAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoZnJvbV89JzIuNScpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhWYWx1ZUVycm9yLCB4Ll92YXJpYWJsZS5nZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHguX3ZhcmlhYmxlLmdldCkKICAgICAgICAgeC5kZXN0cm95KCkKICAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoZnJvbV89Tm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFZhbHVlRXJyb3IsIHguX3ZhcmlhYmxlLmdldCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgeC5fdmFyaWFibGUuZ2V0KQogICAgICAgICB4LmRlc3Ryb3koKQogICAgICAgICAjIHZhcmlhYmxlIHNob3VsZCBoYXZlIGl0cyBkZWZhdWx0IHZhbHVlIHNldCB0byB0aGUgZnJvbV8gdmFsdWUKICAgICAgICAgbXl2YXIgPSBUa2ludGVyLkRvdWJsZVZhcih2YWx1ZT0yMCkKICAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUodmFyaWFibGU9bXl2YXIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHgudmFsdWUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC52YWx1ZSwgMCkKICAgICAgICAgeC5kZXN0cm95KCkKICAgICAgICAgIyBjaGVjayB0aGF0IGl0IGlzIHJlYWxseSB1c2luZyBhIERvdWJsZVZhcgogICAgICAgICB4ID0gdHRrLkxhYmVsZWRTY2FsZSh2YXJpYWJsZT1teXZhciwgZnJvbV89MC41KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4LnZhbHVlLCAwLjUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHguX3ZhcmlhYmxlLl9uYW1lLCBteXZhci5fbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnZhbHVlLCAwLjUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5fdmFyaWFibGUuX25hbWUsIG15dmFyLl9uYW1lKQogICAgICAgICB4LmRlc3Ryb3koKQogCiAgICAgICAgICMgd2lkZ2V0IHBvc2l0aW9ubWVudAogICAgICAgICBkZWYgY2hlY2tfcG9zaXRpb25zKHNjYWxlLCBzY2FsZV9wb3MsIGxhYmVsLCBsYWJlbF9wb3MpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2NhbGUucGFja19pbmZvKClbJ3NpZGUnXSwgc2NhbGVfcG9zKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGFiZWwucGxhY2VfaW5mbygpWydhbmNob3InXSwgbGFiZWxfcG9zKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzY2FsZS5wYWNrX2luZm8oKVsnc2lkZSddLCBzY2FsZV9wb3MpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxhYmVsLnBsYWNlX2luZm8oKVsnYW5jaG9yJ10sIGxhYmVsX3BvcykKICAgICAgICAgeCA9IHR0ay5MYWJlbGVkU2NhbGUoY29tcG91bmQ9J3RvcCcpCiAgICAgICAgIGNoZWNrX3Bvc2l0aW9ucyh4LnNjYWxlLCAnYm90dG9tJywgeC5sYWJlbCwgJ24nKQogICAgICAgICB4LmRlc3Ryb3koKQpAQCAtMTAwLDcgKzEwMCw3IEBACiAgICAgICAgIHguZGVzdHJveSgpCiAKICAgICAgICAgIyBleHRyYSwgYW5kIGludmFsaWQsIGt3YXJncwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgdHRrLkxhYmVsZWRTY2FsZSwgYT0nYicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHR0ay5MYWJlbGVkU2NhbGUsIGE9J2InKQogCiAKICAgICBkZWYgdGVzdF9ob3Jpem9udGFsX3JhbmdlKHNlbGYpOgpAQCAtMTExLDcgKzExMSw3IEBACiAKICAgICAgICAgbGluZm9fMSA9IGxzY2FsZS5sYWJlbC5wbGFjZV9pbmZvKCkKICAgICAgICAgcHJldl94Y29vcmQgPSBsc2NhbGUuc2NhbGUuY29vcmRzKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocHJldl94Y29vcmQsIGludChsaW5mb18xWyd4J10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByZXZfeGNvb3JkLCBpbnQobGluZm9fMVsneCddKSkKICAgICAgICAgIyBjaGFuZ2UgcmFuZ2UgdG86IGZyb20gLTUgdG8gNS4gVGhpcyBzaG91bGQgY2hhbmdlIHRoZSB4IGNvb3JkIG9mCiAgICAgICAgICMgdGhlIHNjYWxlIHdpZGdldCwgc2luY2UgMCBpcyBhdCB0aGUgbWlkZGxlIG9mIHRoZSBuZXcKICAgICAgICAgIyByYW5nZS4KQEAgLTEyMCwxNSArMTIwLDE1IEBACiAgICAgICAgICMgYXQgdGhlIHNhbWUgdGltZSB0aGlzIHNob3VsZG4ndCBhZmZlY3QgdGVzdCBvdXRjb21lCiAgICAgICAgIGxzY2FsZS51cGRhdGUoKQogICAgICAgICBjdXJyX3hjb29yZCA9IGxzY2FsZS5zY2FsZS5jb29yZHMoKVswXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocHJldl94Y29vcmQgIT0gY3Vycl94Y29vcmQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcmV2X3hjb29yZCAhPSBjdXJyX3hjb29yZCkKICAgICAgICAgIyB0aGUgbGFiZWwgd2lkZ2V0IHNob3VsZCBoYXZlIGJlZW4gcmVwb3NpdGlvbmVkIHRvbwogICAgICAgICBsaW5mb18yID0gbHNjYWxlLmxhYmVsLnBsYWNlX2luZm8oKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsc2NhbGUubGFiZWxbJ3RleHQnXSwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY3Vycl94Y29vcmQsIGludChsaW5mb18yWyd4J10pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxzY2FsZS5sYWJlbFsndGV4dCddLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1cnJfeGNvb3JkLCBpbnQobGluZm9fMlsneCddKSkKICAgICAgICAgIyBjaGFuZ2UgdGhlIHJhbmdlIGJhY2sKICAgICAgICAgbHNjYWxlLnNjYWxlLmNvbmZpZ3VyZShmcm9tXz0wLCB0bz0xMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHByZXZfeGNvb3JkICE9IGN1cnJfeGNvb3JkKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwcmV2X3hjb29yZCwgaW50KGxpbmZvXzFbJ3gnXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcmV2X3hjb29yZCAhPSBjdXJyX3hjb29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwcmV2X3hjb29yZCwgaW50KGxpbmZvXzFbJ3gnXSkpCiAKICAgICAgICAgbHNjYWxlLmRlc3Ryb3koKQogCkBAIC0xNDUsMTYgKzE0NSwxNiBAQAogICAgICAgICAjIFRoZSBmb2xsb3dpbmcgdXBkYXRlIGlzIG5lZWRlZCBzaW5jZSB0aGUgdGVzdCBkb2Vzbid0IHVzZSBtYWlubG9vcCwKICAgICAgICAgIyBhdCB0aGUgc2FtZSB0aW1lIHRoaXMgc2hvdWxkbid0IGFmZmVjdCB0ZXN0IG91dGNvbWUKICAgICAgICAgeC51cGRhdGUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4LmxhYmVsWyd0ZXh0J10sIG5ld3ZhbCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHguc2NhbGUuY29vcmRzKClbMF0gPiBjdXJyX3hjb29yZCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5zY2FsZS5jb29yZHMoKVswXSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmxhYmVsWyd0ZXh0J10sIG5ld3ZhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguc2NhbGUuY29vcmRzKClbMF0gPiBjdXJyX3hjb29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnNjYWxlLmNvb3JkcygpWzBdLAogICAgICAgICAgICAgaW50KHgubGFiZWwucGxhY2VfaW5mbygpWyd4J10pKQogCiAgICAgICAgICMgdmFsdWUgb3V0c2lkZSByYW5nZQogICAgICAgICB4LnZhbHVlID0geC5zY2FsZVsndG8nXSArIDEgIyBubyBjaGFuZ2VzIHNob3VsZG4ndCBoYXBwZW4KICAgICAgICAgeC51cGRhdGUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh4LmxhYmVsWyd0ZXh0J10sIG5ld3ZhbCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoeC5zY2FsZS5jb29yZHMoKVswXSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmxhYmVsWyd0ZXh0J10sIG5ld3ZhbCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LnNjYWxlLmNvb3JkcygpWzBdLAogICAgICAgICAgICAgaW50KHgubGFiZWwucGxhY2VfaW5mbygpWyd4J10pKQogCiAgICAgICAgIHguZGVzdHJveSgpCkBAIC0xNzIsNyArMTcyLDcgQEAKICAgICAgICAgeC52YWx1ZSA9IDMKICAgICAgICAgeC51cGRhdGUoKQogICAgICAgICB4Lm1hc3Rlci53bV9nZW9tZXRyeSgiJWR4JWQiICUgKHdpZHRoX25ldywgaGVpZ2h0X25ldykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGludCh4LmxhYmVsLnBsYWNlX2luZm8oKVsneCddKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoeC5sYWJlbC5wbGFjZV9pbmZvKClbJ3gnXSksCiAgICAgICAgICAgICB4LnNjYWxlLmNvb3JkcygpWzBdKQogCiAgICAgICAgICMgUmVzZXQgZ2VvbWV0cnkKQEAgLTE5NywyMCArMTk3LDIwIEBACiAgICAgICAgIG5hbWUgPSB2YXIuX25hbWUKICAgICAgICAgb3B0bWVudS51cGRhdGVfaWRsZXRhc2tzKCkKICAgICAgICAgb3B0bWVudS5kZXN0cm95KCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3B0bWVudS50ay5nbG9iYWxnZXR2YXIobmFtZSksIHZhci5nZXQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRtZW51LnRrLmdsb2JhbGdldHZhcihuYW1lKSwgdmFyLmdldCgpKQogICAgICAgICBkZWwgdmFyCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBvcHRtZW51LnRrLmdsb2JhbGdldHZhciwgbmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgb3B0bWVudS50ay5nbG9iYWxnZXR2YXIsIG5hbWUpCiAKIAogICAgIGRlZiB0ZXN0X2luaXRpYWxpemF0aW9uKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKICAgICAgICAgICAgIHR0ay5PcHRpb25NZW51LCBOb25lLCBzZWxmLnRleHR2YXIsIGludmFsaWQ9J3RoaW5nJykKIAogICAgICAgICBvcHRtZW51ID0gdHRrLk9wdGlvbk1lbnUoTm9uZSwgc2VsZi50ZXh0dmFyLCAnYicsICdhJywgJ2InKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvcHRtZW51Ll92YXJpYWJsZS5nZXQoKSwgJ2InKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdG1lbnUuX3ZhcmlhYmxlLmdldCgpLCAnYicpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wdG1lbnVbJ21lbnUnXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wdG1lbnVbJ3RleHR2YXJpYWJsZSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3B0bWVudVsnbWVudSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3B0bWVudVsndGV4dHZhcmlhYmxlJ10pCiAKICAgICAgICAgb3B0bWVudS5kZXN0cm95KCkKIApAQCAtMjIyLDEwICsyMjIsMTAgQEAKICAgICAgICAgZm91bmRfZGVmYXVsdCA9IEZhbHNlCiAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihpdGVtcykpOgogICAgICAgICAgICAgdmFsdWUgPSBvcHRtZW51WydtZW51J10uZW50cnljZ2V0KGksICd2YWx1ZScpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWx1ZSwgaXRlbXNbaV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlLCBpdGVtc1tpXSkKICAgICAgICAgICAgIGlmIHZhbHVlID09IGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgZm91bmRfZGVmYXVsdCA9IFRydWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGZvdW5kX2RlZmF1bHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3VuZF9kZWZhdWx0KQogICAgICAgICBvcHRtZW51LmRlc3Ryb3koKQogCiAgICAgICAgICMgZGVmYXVsdCBzaG91bGRuJ3QgYmUgaW4gbWVudSBpZiBpdCBpcyBub3QgcGFydCBvZiB2YWx1ZXMKQEAgLTIzOCwyNiArMjM4LDI2IEBACiAgICAgICAgICAgICBpZiBsYXN0ID09IGN1cnI6CiAgICAgICAgICAgICAgICAgIyBubyBtb3JlIG1lbnUgZW50cmllcwogICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihjdXJyID09IGRlZmF1bHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGN1cnIgPT0gZGVmYXVsdCkKICAgICAgICAgICAgIGkgKz0gMQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChpLCBsZW4oaXRlbXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGksIGxlbihpdGVtcykpCiAKICAgICAgICAgIyBjaGVjayB0aGF0IHZhcmlhYmxlIGlzIHVwZGF0ZWQgY29ycmVjdGx5CiAgICAgICAgIG9wdG1lbnUucGFjaygpCiAgICAgICAgIG9wdG1lbnUud2FpdF92aXNpYmlsaXR5KCkKICAgICAgICAgb3B0bWVudVsnbWVudSddLmludm9rZSgwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvcHRtZW51Ll92YXJpYWJsZS5nZXQoKSwgaXRlbXNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0bWVudS5fdmFyaWFibGUuZ2V0KCksIGl0ZW1zWzBdKQogCiAgICAgICAgICMgY2hhbmdpbmcgdG8gYW4gaW52YWxpZCBpbmRleCBzaG91bGRuJ3QgY2hhbmdlIHRoZSB2YXJpYWJsZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgb3B0bWVudVsnbWVudSddLmludm9rZSwgLTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG9wdG1lbnUuX3ZhcmlhYmxlLmdldCgpLCBpdGVtc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgb3B0bWVudVsnbWVudSddLmludm9rZSwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0bWVudS5fdmFyaWFibGUuZ2V0KCksIGl0ZW1zWzBdKQogCiAgICAgICAgIG9wdG1lbnUuZGVzdHJveSgpCiAKICAgICAgICAgIyBzcGVjaWZ5aW5nIGEgY2FsbGJhY2sKICAgICAgICAgc3VjY2VzcyA9IFtdCiAgICAgICAgIGRlZiBjYl90ZXN0KGl0ZW0pOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaXRlbSwgaXRlbXNbMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZW0sIGl0ZW1zWzFdKQogICAgICAgICAgICAgc3VjY2Vzcy5hcHBlbmQoVHJ1ZSkKICAgICAgICAgb3B0bWVudSA9IHR0ay5PcHRpb25NZW51KE5vbmUsIHNlbGYudGV4dHZhciwgJ2EnLCBjb21tYW5kPWNiX3Rlc3QsCiAgICAgICAgICAgICAqaXRlbXMpCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9mdW5jdGlvbnMucHkgYi9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9mdW5jdGlvbnMucHkKaW5kZXggYTFiMDg1NC4uZTUxNmZhNCAxMDA2NDQKLS0tIGEvTGliL2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3RfZnVuY3Rpb25zLnB5CisrKyBiL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X2Z1bmN0aW9ucy5weQpAQCAtMjgsMTIgKzI4LDEyIEBACiAgICAgZGVmIHRlc3RfZm9ybWF0X29wdGRpY3Qoc2VsZik6CiAgICAgICAgIGRlZiBjaGVja19hZ2FpbnN0KGZtdF9vcHRzLCByZXN1bHQpOgogICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGZtdF9vcHRzKSwgMik6Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LnBvcChmbXRfb3B0c1tpXSksIGZtdF9vcHRzW2kgKyAxXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5wb3AoZm10X29wdHNbaV0pLCBmbXRfb3B0c1tpICsgMV0pCiAgICAgICAgICAgICBpZiByZXN1bHQ6CiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJyZXN1bHQgc3RpbGwgZ290IGVsZW1lbnRzOiAlcyIgJSByZXN1bHQpCiAKICAgICAgICAgIyBwYXNzaW5nIGFuIGVtcHR5IGRpY3Qgc2hvdWxkIHJldHVybiBhbiBlbXB0eSBvYmplY3QgKHR1cGxlIGhlcmUpCi0gICAgICAgIHNlbGYuZmFpbElmKHR0ay5fZm9ybWF0X29wdGRpY3Qoe30pKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHR0ay5fZm9ybWF0X29wdGRpY3Qoe30pKQogCiAgICAgICAgICMgY2hlY2sgbGlzdCBmb3JtYXR0aW5nCiAgICAgICAgIGNoZWNrX2FnYWluc3QoCkBAIC02Myw3ICs2Myw3IEBACiAgICAgICAgICMgY2hlY2sgaWYgZ2l2aW5nIHVuaWNvZGUga2V5cyBpcyBmaW5lCiAgICAgICAgIGNoZWNrX2FnYWluc3QodHRrLl9mb3JtYXRfb3B0ZGljdChvcHRzKSwge3UnLc6xzrLOsyc6IFRydWUsIHUnLcOhJzogRmFsc2V9KQogICAgICAgICAjIG9wdHMgc2hvdWxkIHJlbWFpbiB1bmNoYW5nZWQKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3B0cywgb3JpZ19vcHRzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdHMsIG9yaWdfb3B0cykKIAogICAgICAgICAjIHBhc3NpbmcgdmFsdWVzIHdpdGggc3BhY2VzIGluc2lkZSBhIHR1cGxlL2xpc3QKICAgICAgICAgY2hlY2tfYWdhaW5zdCgKQEAgLTczLDExMyArNzMsMTEzIEBACiAKICAgICAgICAgIyBpZ25vcmUgYW4gb3B0aW9uCiAgICAgICAgIGFtb3VudF9vcHRzID0gbGVuKHR0ay5fZm9ybWF0X29wdGRpY3Qob3B0cywgaWdub3JlPSh1J8OhJykpKSAvIDIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYW1vdW50X29wdHMsIGxlbihvcHRzKSAtIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW1vdW50X29wdHMsIGxlbihvcHRzKSAtIDEpCiAKICAgICAgICAgIyBpZ25vcmUgbm9uLWV4aXN0aW5nIG9wdGlvbnMKICAgICAgICAgYW1vdW50X29wdHMgPSBsZW4odHRrLl9mb3JtYXRfb3B0ZGljdChvcHRzLCBpZ25vcmU9KHUnw6EnLCAnYicpKSkgLyAyCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFtb3VudF9vcHRzLCBsZW4ob3B0cykgLSAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFtb3VudF9vcHRzLCBsZW4ob3B0cykgLSAxKQogCiAgICAgICAgICMgaWdub3JlIGV2ZXJ5IG9wdGlvbgotICAgICAgICBzZWxmLmZhaWxJZih0dGsuX2Zvcm1hdF9vcHRkaWN0KG9wdHMsIGlnbm9yZT1vcHRzLmtleXMoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodHRrLl9mb3JtYXRfb3B0ZGljdChvcHRzLCBpZ25vcmU9b3B0cy5rZXlzKCkpKQogCiAKICAgICBkZWYgdGVzdF9mb3JtYXRfbWFwZGljdChzZWxmKToKICAgICAgICAgb3B0cyA9IHsnYSc6IFsoJ2InLCAnYycsICd2YWwnKSwgKCdkJywgJ290aGVydmFsJyksICgnJywgJ3NpbmdsZScpXX0KICAgICAgICAgcmVzdWx0ID0gdHRrLl9mb3JtYXRfbWFwZGljdChvcHRzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzdWx0KSwgbGVuKG9wdHMua2V5cygpKSAqIDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgKCctYScsICd7YiBjfSB2YWwgZCBvdGhlcnZhbCB7fSBzaW5nbGUnKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl9mb3JtYXRfbWFwZGljdChvcHRzLCBzY3JpcHQ9VHJ1ZSksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdCksIGxlbihvcHRzLmtleXMoKSkgKiAyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKCctYScsICd7YiBjfSB2YWwgZCBvdGhlcnZhbCB7fSBzaW5nbGUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9tYXBkaWN0KG9wdHMsIHNjcmlwdD1UcnVlKSwKICAgICAgICAgICAgICgnLWEnLCAne3tiIGN9IHZhbCBkIG90aGVydmFsIHt9IHNpbmdsZX0nKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2Zvcm1hdF9tYXBkaWN0KHsyOiBbXX0pLCAoJy0yJywgJycpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X21hcGRpY3QoezI6IFtdfSksICgnLTInLCAnJykpCiAKICAgICAgICAgb3B0cyA9IHt1J8O8w7HDrcSHw7Nkw6gnOiBbKHUnw6EnLCB1J3bDo2wnKV19CiAgICAgICAgIHJlc3VsdCA9IHR0ay5fZm9ybWF0X21hcGRpY3Qob3B0cykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzdWx0LCAodSctw7zDscOtxIfDs2TDqCcsIHUnw6EgdsOjbCcpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgKHUnLcO8w7HDrcSHw7Nkw6gnLCB1J8OhIHbDo2wnKSkKIAogICAgICAgICAjIGVtcHR5IHN0YXRlcwogICAgICAgICB2YWxpZCA9IHsnb3B0JzogWygnJywgdScnLCAnaGknKV19Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X21hcGRpY3QodmFsaWQpLCAoJy1vcHQnLCAneyB9IGhpJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfbWFwZGljdCh2YWxpZCksICgnLW9wdCcsICd7IH0gaGknKSkKIAogICAgICAgICAjIHdoZW4gcGFzc2luZyBtdWx0aXBsZSBzdGF0ZXMsIHRoZXkgYWxsIG11c3QgYmUgc3RyaW5ncwogICAgICAgICBpbnZhbGlkID0geydvcHQnOiBbKDEsIDIsICd2YWxpZCB2YWwnKV19Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIHR0ay5fZm9ybWF0X21hcGRpY3QsIGludmFsaWQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHRrLl9mb3JtYXRfbWFwZGljdCwgaW52YWxpZCkKICAgICAgICAgaW52YWxpZCA9IHsnb3B0JzogWyhbMV0sICcyJywgJ3ZhbGlkIHZhbCcpXX0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgdHRrLl9mb3JtYXRfbWFwZGljdCwgaW52YWxpZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0dGsuX2Zvcm1hdF9tYXBkaWN0LCBpbnZhbGlkKQogICAgICAgICAjIGJ1dCB3aGVuIHBhc3NpbmcgYSBzaW5nbGUgc3RhdGUsIGl0IGNhbiBiZSBhbnl0aGluZwogICAgICAgICB2YWxpZCA9IHsnb3B0JzogW1sxLCAndmFsdWUnXV19Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X21hcGRpY3QodmFsaWQpLCAoJy1vcHQnLCAnMSB2YWx1ZScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X21hcGRpY3QodmFsaWQpLCAoJy1vcHQnLCAnMSB2YWx1ZScpKQogICAgICAgICAjIHNwZWNpYWwgYXR0ZW50aW9uIHRvIHNpbmdsZSBzdGF0ZXMgd2hpY2ggZXZhbHV0ZSB0byBGYWxzZQogICAgICAgICBmb3Igc3RhdGV2YWwgaW4gKE5vbmUsIDAsIEZhbHNlLCAnJywgc2V0KCkpOiAjIGp1c3Qgc29tZSBzYW1wbGVzCiAgICAgICAgICAgICB2YWxpZCA9IHsnb3B0JzogWyhzdGF0ZXZhbCwgJ3ZhbHVlJyldfQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl9mb3JtYXRfbWFwZGljdCh2YWxpZCksCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X21hcGRpY3QodmFsaWQpLAogICAgICAgICAgICAgICAgICgnLW9wdCcsICd7fSB2YWx1ZScpKQogCiAgICAgICAgICMgdmFsdWVzIG11c3QgYmUgaXRlcmFibGUKICAgICAgICAgb3B0cyA9IHsnYSc6IE5vbmV9Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIHR0ay5fZm9ybWF0X21hcGRpY3QsIG9wdHMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdHRrLl9mb3JtYXRfbWFwZGljdCwgb3B0cykKIAogICAgICAgICAjIGl0ZW1zIGluIHRoZSB2YWx1ZSBtdXN0IGhhdmUgc2l6ZSA+PSAyCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhJbmRleEVycm9yLCB0dGsuX2Zvcm1hdF9tYXBkaWN0LAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB0dGsuX2Zvcm1hdF9tYXBkaWN0LAogICAgICAgICAgICAgeydhJzogWygnaW52YWxpZCcsICldfSkKIAogCiAgICAgZGVmIHRlc3RfZm9ybWF0X2VsZW1jcmVhdGUoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKE5vbmUpLCAoTm9uZSwgKCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZShOb25lKSwgKE5vbmUsICgpKSkKIAogICAgICAgICAjIyBUZXN0aW5nIHR5cGUgPSBpbWFnZQogICAgICAgICAjIGltYWdlIHR5cGUgZXhwZWN0cyBhdCBsZWFzdCBhbiBpbWFnZSBuYW1lLCBzbyB0aGlzIHNob3VsZCByYWlzZQogICAgICAgICAjIEluZGV4RXJyb3Igc2luY2UgaXQgdHJpZXMgdG8gYWNjZXNzIHRoZSBpbmRleCAwIG9mIGFuIGVtcHR5IHR1cGxlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhJbmRleEVycm9yLCB0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlLCAnaW1hZ2UnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCB0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlLCAnaW1hZ2UnKQogCiAgICAgICAgICMgZG9uJ3QgZm9ybWF0IHJldHVybmVkIHZhbHVlcyBhcyBhIHRjbCBzY3JpcHQKICAgICAgICAgIyBtaW5pbXVtIGFjY2VwdGFibGUgZm9yIGltYWdlIHR5cGUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnaW1hZ2UnLCBGYWxzZSwgJ3Rlc3QnKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdpbWFnZScsIEZhbHNlLCAndGVzdCcpLAogICAgICAgICAgICAgKCJ0ZXN0ICIsICgpKSkKICAgICAgICAgIyBzcGVjaWZpeW5nIGEgc3RhdGUgc3BlYwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdpbWFnZScsIEZhbHNlLCAndGVzdCcsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnaW1hZ2UnLCBGYWxzZSwgJ3Rlc3QnLAogICAgICAgICAgICAgKCcnLCAnYScpKSwgKCJ0ZXN0IHt9IGEiLCAoKSkpCiAgICAgICAgICMgc3RhdGUgc3BlYyB3aXRoIG11bHRpcGxlIHN0YXRlcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdpbWFnZScsIEZhbHNlLCAndGVzdCcsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnaW1hZ2UnLCBGYWxzZSwgJ3Rlc3QnLAogICAgICAgICAgICAgKCdhJywgJ2InLCAnYycpKSwgKCJ0ZXN0IHthIGJ9IGMiLCAoKSkpCiAgICAgICAgICMgc3RhdGUgc3BlYyBhbmQgb3B0aW9ucwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdpbWFnZScsIEZhbHNlLCAndGVzdCcsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnaW1hZ2UnLCBGYWxzZSwgJ3Rlc3QnLAogICAgICAgICAgICAgKCdhJywgJ2InKSwgYT0neCcsIGI9J3knKSwgKCJ0ZXN0IGEgYiIsICgiLWEiLCAieCIsICItYiIsICJ5IikpKQogICAgICAgICAjIGZvcm1hdCByZXR1cm5lZCB2YWx1ZXMgYXMgYSB0Y2wgc2NyaXB0CiAgICAgICAgICMgc3RhdGUgc3BlYyB3aXRoIG11bHRpcGxlIHN0YXRlcyBhbmQgYW4gb3B0aW9uIHdpdGggYSBtdWx0aXZhbHVlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2ltYWdlJywgVHJ1ZSwgJ3Rlc3QnLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2ltYWdlJywgVHJ1ZSwgJ3Rlc3QnLAogICAgICAgICAgICAgKCdhJywgJ2InLCAnYycsICdkJyksIHg9WzIsIDNdKSwgKCJ7dGVzdCB7YSBiIGN9IGR9IiwgIi14IHsyIDN9IikpCiAKICAgICAgICAgIyMgVGVzdGluZyB0eXBlID0gdnNhcGkKICAgICAgICAgIyB2c2FwaSB0eXBlIGV4cGVjdHMgYXQgbGVhc3QgYSBjbGFzcyBuYW1lIGFuZCBhIHBhcnRfaWQsIHNvIHRoaXMKICAgICAgICAgIyBzaG91bGQgcmFpc2UgYW4gVmFsdWVFcnJvciBzaW5jZSBpdCB0cmllcyB0byBnZXQgdHdvIGVsZW1lbnRzIGZyb20KICAgICAgICAgIyBhbiBlbXB0eSB0dXBsZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVmFsdWVFcnJvciwgdHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSwgJ3ZzYXBpJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSwgJ3ZzYXBpJykKIAogICAgICAgICAjIGRvbid0IGZvcm1hdCByZXR1cm5lZCB2YWx1ZXMgYXMgYSB0Y2wgc2NyaXB0CiAgICAgICAgICMgbWluaW11bSBhY2NlcHRhYmxlIGZvciB2c2FwaQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCd2c2FwaScsIEZhbHNlLCAnYScsICdiJyksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgndnNhcGknLCBGYWxzZSwgJ2EnLCAnYicpLAogICAgICAgICAgICAgKCJhIGIgIiwgKCkpKQogICAgICAgICAjIG5vdyB3aXRoIGEgc3RhdGUgc3BlYyB3aXRoIG11bHRpcGxlIHN0YXRlcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCd2c2FwaScsIEZhbHNlLCAnYScsICdiJywKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCd2c2FwaScsIEZhbHNlLCAnYScsICdiJywKICAgICAgICAgICAgICgnYScsICdiJywgJ2MnKSksICgiYSBiIHthIGJ9IGMiLCAoKSkpCiAgICAgICAgICMgc3RhdGUgc3BlYyBhbmQgb3B0aW9uCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ3ZzYXBpJywgRmFsc2UsICdhJywgJ2InLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ3ZzYXBpJywgRmFsc2UsICdhJywgJ2InLAogICAgICAgICAgICAgKCdhJywgJ2InKSwgb3B0PSd4JyksICgiYSBiIGEgYiIsICgiLW9wdCIsICJ4IikpKQogICAgICAgICAjIGZvcm1hdCByZXR1cm5lZCB2YWx1ZXMgYXMgYSB0Y2wgc2NyaXB0CiAgICAgICAgICMgc3RhdGUgc3BlYyB3aXRoIGEgbXVsdGl2YWx1ZSBhbmQgYW4gb3B0aW9uCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ3ZzYXBpJywgVHJ1ZSwgJ2EnLCAnYicsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgndnNhcGknLCBUcnVlLCAnYScsICdiJywKICAgICAgICAgICAgICgnYScsICdiJywgWzEsIDJdKSwgb3B0PSd4JyksICgie2EgYiB7YSBifSB7MSAyfX0iLCAiLW9wdCB4IikpCiAKICAgICAgICAgIyBUZXN0aW5nIHR5cGUgPSBmcm9tCiAgICAgICAgICMgZnJvbSB0eXBlIGV4cGVjdHMgYXQgbGVhc3QgYSB0eXBlIG5hbWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEluZGV4RXJyb3IsIHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUsICdmcm9tJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgdHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSwgJ2Zyb20nKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2Zyb20nLCBGYWxzZSwgJ2EnKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9lbGVtY3JlYXRlKCdmcm9tJywgRmFsc2UsICdhJyksCiAgICAgICAgICAgICAoJ2EnLCAoKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2Zyb20nLCBGYWxzZSwgJ2EnLCAnYicpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2Zyb20nLCBGYWxzZSwgJ2EnLCAnYicpLAogICAgICAgICAgICAgKCdhJywgKCdiJywgKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X2VsZW1jcmVhdGUoJ2Zyb20nLCBUcnVlLCAnYScsICdiJyksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9mb3JtYXRfZWxlbWNyZWF0ZSgnZnJvbScsIFRydWUsICdhJywgJ2InKSwKICAgICAgICAgICAgICgne2F9JywgJ2InKSkKIAogCkBAIC0yMDgsNzUgKzIwOCw3NSBAQAogICAgICAgICAgICAgICAgICAgICBzcGFjZXMoMiAqIGluZGVudF9zaXplKSwgc3BhY2VzKGluZGVudF9zaXplKSwgc3BhY2VzKCkpKQogCiAgICAgICAgICMgZW1wdHkgbGF5b3V0Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZm9ybWF0X2xheW91dGxpc3QoW10pWzBdLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2Zvcm1hdF9sYXlvdXRsaXN0KFtdKVswXSwgJycpCiAKICAgICAgICAgIyBzbWFsbGVzdCAoYWZ0ZXIgYW4gZW1wdHkgb25lKSBhY2NlcHRhYmxlIGxheW91dAogICAgICAgICBzbWFsbGVzdCA9IHR0ay5fZm9ybWF0X2xheW91dGxpc3QoWygnYScsIE5vbmUpXSwgaW5kZW50PTApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNtYWxsZXN0LAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtYWxsZXN0LAogICAgICAgICAgICAgdHRrLl9mb3JtYXRfbGF5b3V0bGlzdChbKCdhJywgJycpXSwgaW5kZW50PTApKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzbWFsbGVzdFswXSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNtYWxsZXN0WzBdLCAnYScpCiAKICAgICAgICAgIyB0ZXN0aW5nIGluZGVudGF0aW9uIGxldmVscwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzYW1wbGUoKSwgc2FtcGxlX2V4cGVjdGVkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FtcGxlKCksIHNhbXBsZV9leHBlY3RlZCgpKQogICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNhbXBsZShpKSwgc2FtcGxlX2V4cGVjdGVkKGkpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2FtcGxlKGksIGkpLCBzYW1wbGVfZXhwZWN0ZWQoaSwgaSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNhbXBsZShpKSwgc2FtcGxlX2V4cGVjdGVkKGkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYW1wbGUoaSwgaSksIHNhbXBsZV9leHBlY3RlZChpLCBpKSkKIAogICAgICAgICAjIGludmFsaWQgbGF5b3V0IGZvcm1hdCwgZGlmZmVyZW50IGtpbmQgb2YgZXhjZXB0aW9ucyB3aWxsIGJlCiAgICAgICAgICMgcmFpc2VkCiAKICAgICAgICAgIyBwbGFpbiB3cm9uZyBmb3JtYXQKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fZm9ybWF0X2xheW91dGxpc3QsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fZm9ybWF0X2xheW91dGxpc3QsCiAgICAgICAgICAgICBbJ2JhZCcsICdmb3JtYXQnXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgdHRrLl9mb3JtYXRfbGF5b3V0bGlzdCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0dGsuX2Zvcm1hdF9sYXlvdXRsaXN0LCBOb25lKQogICAgICAgICAjIF9mb3JtYXRfbGF5b3V0bGlzdCBhbHdheXMgZXhwZWN0cyB0aGUgc2Vjb25kIGl0ZW0gKGluIGV2ZXJ5IGl0ZW0pCiAgICAgICAgICMgdG8gYWN0IGxpa2UgYSBkaWN0IChleGNlcHQgd2hlbiB0aGUgdmFsdWUgZXZhbHV0ZXMgdG8gRmFsc2UpLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoQXR0cmlidXRlRXJyb3IsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLAogICAgICAgICAgICAgdHRrLl9mb3JtYXRfbGF5b3V0bGlzdCwgWygnYScsICdiJyldKQogICAgICAgICAjIGJhZCBjaGlsZHJlbiBmb3JtYXR0aW5nCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2Zvcm1hdF9sYXlvdXRsaXN0LAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2Zvcm1hdF9sYXlvdXRsaXN0LAogICAgICAgICAgICAgWygnbmFtZScsIHsnY2hpbGRyZW4nOiB7J2EnOiBOb25lfX0pXSkKIAogCiAgICAgZGVmIHRlc3Rfc2NyaXB0X2Zyb21fc2V0dGluZ3Moc2VsZik6CiAgICAgICAgICMgZW1wdHkgb3B0aW9ucwotICAgICAgICBzZWxmLmZhaWxJZih0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKHsnbmFtZSc6CisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodHRrLl9zY3JpcHRfZnJvbV9zZXR0aW5ncyh7J25hbWUnOgogICAgICAgICAgICAgeydjb25maWd1cmUnOiBOb25lLCAnbWFwJzogTm9uZSwgJ2VsZW1lbnQgY3JlYXRlJzogTm9uZX19KSkKIAogICAgICAgICAjIGVtcHR5IGxheW91dAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKICAgICAgICAgICAgIHR0ay5fc2NyaXB0X2Zyb21fc2V0dGluZ3MoeyduYW1lJzogeydsYXlvdXQnOiBOb25lfX0pLAogICAgICAgICAgICAgInR0azo6c3R5bGUgbGF5b3V0IG5hbWUge1xubnVsbFxufSIpCiAKICAgICAgICAgY29uZmlnZGljdCA9IHt1J86xzrLOsyc6IFRydWUsIHUnw6EnOiBGYWxzZX0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKAorICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgICB0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKHsnbmFtZSc6IHsnY29uZmlndXJlJzogY29uZmlnZGljdH19KSkKIAogICAgICAgICBtYXBkaWN0ID0ge3Unw7zDscOtxIfDs2TDqCc6IFsodSfDoScsIHUndsOjbCcpXX0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKAorICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgICB0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKHsnbmFtZSc6IHsnbWFwJzogbWFwZGljdH19KSkKIAogICAgICAgICAjIGludmFsaWQgaW1hZ2UgZWxlbWVudAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoSW5kZXhFcnJvciwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwKICAgICAgICAgICAgIHR0ay5fc2NyaXB0X2Zyb21fc2V0dGluZ3MsIHsnbmFtZSc6IHsnZWxlbWVudCBjcmVhdGUnOiBbJ2ltYWdlJ119fSkKIAogICAgICAgICAjIG1pbmltYWwgdmFsaWQgaW1hZ2UKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR0ay5fc2NyaXB0X2Zyb21fc2V0dGluZ3MoeyduYW1lJzoKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR0ay5fc2NyaXB0X2Zyb21fc2V0dGluZ3MoeyduYW1lJzoKICAgICAgICAgICAgIHsnZWxlbWVudCBjcmVhdGUnOiBbJ2ltYWdlJywgJ25hbWUnXX19KSkKIAogICAgICAgICBpbWFnZSA9IHsndGhpbmcnOiB7J2VsZW1lbnQgY3JlYXRlJzoKICAgICAgICAgICAgIFsnaW1hZ2UnLCAnbmFtZScsICgnc3RhdGUxJywgJ3N0YXRlMicsICd2YWwnKV19fQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKGltYWdlKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKGltYWdlKSwKICAgICAgICAgICAgICJ0dGs6OnN0eWxlIGVsZW1lbnQgY3JlYXRlIHRoaW5nIGltYWdlIHtuYW1lIHtzdGF0ZTEgc3RhdGUyfSB2YWx9ICIpCiAKICAgICAgICAgaW1hZ2VbJ3RoaW5nJ11bJ2VsZW1lbnQgY3JlYXRlJ10uYXBwZW5kKHsnb3B0JzogMzB9KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKGltYWdlKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKGltYWdlKSwKICAgICAgICAgICAgICJ0dGs6OnN0eWxlIGVsZW1lbnQgY3JlYXRlIHRoaW5nIGltYWdlIHtuYW1lIHtzdGF0ZTEgc3RhdGUyfSB2YWx9ICIKICAgICAgICAgICAgICItb3B0IDMwIikKIAogICAgICAgICBpbWFnZVsndGhpbmcnXVsnZWxlbWVudCBjcmVhdGUnXVstMV1bJ29wdCddID0gW01vY2tUY2xPYmooMyksCiAgICAgICAgICAgICBNb2NrVGNsT2JqKCcybScpXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKGltYWdlKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX3NjcmlwdF9mcm9tX3NldHRpbmdzKGltYWdlKSwKICAgICAgICAgICAgICJ0dGs6OnN0eWxlIGVsZW1lbnQgY3JlYXRlIHRoaW5nIGltYWdlIHtuYW1lIHtzdGF0ZTEgc3RhdGUyfSB2YWx9ICIKICAgICAgICAgICAgICItb3B0IHszIDJtfSIpCiAKQEAgLTI4NCwyOCArMjg0LDI4IEBACiAgICAgZGVmIHRlc3RfZGljdF9mcm9tX3RjbHR1cGxlKHNlbGYpOgogICAgICAgICBmYWtldHR1cGxlID0gKCctYScsICd7MSAyIDN9JywgJy1zb21ldGhpbmcnLCAnZm9vJykKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2RpY3RfZnJvbV90Y2x0dXBsZShmYWtldHR1cGxlLCBGYWxzZSksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoZmFrZXR0dXBsZSwgRmFsc2UpLAogICAgICAgICAgICAgeyctYSc6ICd7MSAyIDN9JywgJy1zb21ldGhpbmcnOiAnZm9vJ30pCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoZmFrZXR0dXBsZSksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoZmFrZXR0dXBsZSksCiAgICAgICAgICAgICB7J2EnOiAnezEgMiAzfScsICdzb21ldGhpbmcnOiAnZm9vJ30pCiAKICAgICAgICAgIyBwYXNzaW5nIGEgdHVwbGUgd2l0aCBhIHNpbmdsZSBpdGVtIHNob3VsZCByZXR1cm4gYW4gZW1wdHkgZGljdCwKICAgICAgICAgIyBzaW5jZSBpdCB0cmllcyB0byBicmVhayB0aGUgdHVwbGUgYnkgcGFpcnMuCi0gICAgICAgIHNlbGYuZmFpbElmKHR0ay5fZGljdF9mcm9tX3RjbHR1cGxlKCgnc2luZ2xlJywgKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoKCdzaW5nbGUnLCApKSkKIAogICAgICAgICBzc3BlYyA9IE1vY2tTdGF0ZVNwZWMoJ2EnLCAnYicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fZGljdF9mcm9tX3RjbHR1cGxlKCgnLWEnLCAoc3NwZWMsICd2YWwnKSkpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fZGljdF9mcm9tX3RjbHR1cGxlKCgnLWEnLCAoc3NwZWMsICd2YWwnKSkpLAogICAgICAgICAgICAgeydhJzogWygnYScsICdiJywgJ3ZhbCcpXX0pCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoKE1vY2tUY2xPYmooJy1wYWRkaW5nJyksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLl9kaWN0X2Zyb21fdGNsdHVwbGUoKE1vY2tUY2xPYmooJy1wYWRkaW5nJyksCiAgICAgICAgICAgICBbTW9ja1RjbE9iaignMScpLCAyLCBNb2NrVGNsT2JqKCczbScpXSkpLAogICAgICAgICAgICAgeydwYWRkaW5nJzogWzEsIDIsICczbSddfSkKIAogCiAgICAgZGVmIHRlc3RfbGlzdF9mcm9tX3N0YXRlc3BlYyhzZWxmKToKICAgICAgICAgZGVmIHRlc3RfaXQoc3NwZWMsIHZhbHVlLCByZXNfdmFsdWUsIHN0YXRlcyk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX2xpc3RfZnJvbV9zdGF0ZXNwZWMoCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fbGlzdF9mcm9tX3N0YXRlc3BlYygKICAgICAgICAgICAgICAgICAoc3NwZWMsIHZhbHVlKSksIFtzdGF0ZXMgKyAocmVzX3ZhbHVlLCApXSkKIAogICAgICAgICBzdGF0ZXNfZXZlbiA9IHR1cGxlKCdzdGF0ZSVkJyAlIGkgZm9yIGkgaW4gcmFuZ2UoNikpCkBAIC0zMjIsMTkgKzMyMiwxOSBAQAogCiAgICAgZGVmIHRlc3RfbGlzdF9mcm9tX2xheW91dHR1cGxlKHNlbGYpOgogICAgICAgICAjIGVtcHR5IGxheW91dCB0dXBsZQotICAgICAgICBzZWxmLmZhaWxJZih0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSgoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUoKCkpKQogCiAgICAgICAgICMgc2hvcnRlc3QgbGF5b3V0IHR1cGxlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKCgnbmFtZScsICkpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKCgnbmFtZScsICkpLAogICAgICAgICAgICAgWygnbmFtZScsIHt9KV0pCiAKICAgICAgICAgIyBub3Qgc28gaW50ZXJlc3RpbmcgbHR1cGxlCiAgICAgICAgIHNhbXBsZV9sdHVwbGUgPSAoJ25hbWUnLCAnLW9wdGlvbicsICd2YWx1ZScpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKHNhbXBsZV9sdHVwbGUpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKHNhbXBsZV9sdHVwbGUpLAogICAgICAgICAgICAgWygnbmFtZScsIHsnb3B0aW9uJzogJ3ZhbHVlJ30pXSkKIAogICAgICAgICAjIGVtcHR5IGNoaWxkcmVuCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlKAogICAgICAgICAgICAgKCdzb21ldGhpbmcnLCAnLWNoaWxkcmVuJywgKCkpKSwKICAgICAgICAgICAgIFsoJ3NvbWV0aGluZycsIHsnY2hpbGRyZW4nOiBbXX0pXQogICAgICAgICApCkBAIC0zNDcsNyArMzQ3LDcgQEAKICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICApCiAgICAgICAgICkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUobHR1cGxlKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZShsdHVwbGUpLAogICAgICAgICAgICAgWygnbmFtZScsIHsnb3B0aW9uJzogJ25pY2VvbmUnLCAnY2hpbGRyZW4nOgogICAgICAgICAgICAgICAgIFsoJ290aGVyb25lJywgeydvdGhlcm9wdCc6ICdvdGhlcnZhbHVlJywgJ2NoaWxkcmVuJzoKICAgICAgICAgICAgICAgICAgICAgWygnY2hpbGQnLCB7fSldCkBAIC0zNTYsMTMgKzM1NiwxMyBAQAogICAgICAgICApCiAKICAgICAgICAgIyBiYWQgdHVwbGVzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUsCiAgICAgICAgICAgICAoJ25hbWUnLCAnbm9fbWludXMnKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSwKICAgICAgICAgICAgICgnbmFtZScsICdub19taW51cycsICd2YWx1ZScpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVmFsdWVFcnJvciwgdHRrLl9saXN0X2Zyb21fbGF5b3V0dHVwbGUsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlLAogICAgICAgICAgICAgKCdzb21ldGhpbmcnLCAnLWNoaWxkcmVuJykpICMgbm8gY2hpbGRyZW4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFZhbHVlRXJyb3IsIHR0ay5fbGlzdF9mcm9tX2xheW91dHR1cGxlLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB0dGsuX2xpc3RfZnJvbV9sYXlvdXR0dXBsZSwKICAgICAgICAgICAgICgnc29tZXRoaW5nJywgJy1jaGlsZHJlbicsICd2YWx1ZScpKSAjIGludmFsaWQgY2hpbGRyZW4KIAogCkBAIC0zNzMsMTAgKzM3MywxMCBAQAogICAgICAgICAgICAgcmV0dXJuIChvcHQsIHZhbCkKIAogICAgICAgICBvcHRpb25zID0geyd0ZXN0JzogTm9uZX0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl92YWxfb3JfZGljdChvcHRpb25zLCBmdW5jKSwgInRlc3QgdmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsuX3ZhbF9vcl9kaWN0KG9wdGlvbnMsIGZ1bmMpLCAidGVzdCB2YWwiKQogCiAgICAgICAgIG9wdGlvbnMgPSB7J3Rlc3QnOiAzfQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsuX3ZhbF9vcl9kaWN0KG9wdGlvbnMsIGZ1bmMpLCBvcHRpb25zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fdmFsX29yX2RpY3Qob3B0aW9ucywgZnVuYyksIG9wdGlvbnMpCiAKIAogICAgIGRlZiB0ZXN0X2NvbnZlcnRfc3RyaW5ndmFsKHNlbGYpOgpAQCAtMzg1LDEwICszODUsMTAgQEAKICAgICAgICAgICAgIChOb25lLCAnTm9uZScpCiAgICAgICAgICkKICAgICAgICAgZm9yIG9yaWcsIGV4cGVjdGVkIGluIHRlc3RzOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLl9jb252ZXJ0X3N0cmluZ3ZhbChvcmlnKSwgZXhwZWN0ZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay5fY29udmVydF9zdHJpbmd2YWwob3JpZyksIGV4cGVjdGVkKQogCiAgICAgICAgIGlmIHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcoKSA9PSAnYXNjaWknOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVEZWNvZGVFcnJvciwKICAgICAgICAgICAgICAgICB0dGsuX2NvbnZlcnRfc3RyaW5ndmFsLCAnw6EnKQogCiAKQEAgLTM5NiwyNyArMzk2LDI3IEBACiAKICAgICBkZWYgdGVzdF91bmljb2RlKHNlbGYpOgogICAgICAgICBhZGljdCA9IHsnb3B0JzogdSd2w6Rsw7rDqCd9Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay50Y2xvYmpzX3RvX3B5KGFkaWN0KSwgeydvcHQnOiB1J3bDpGzDusOoJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLnRjbG9ianNfdG9fcHkoYWRpY3QpLCB7J29wdCc6IHUndsOkbMO6w6gnfSkKIAogICAgICAgICBhZGljdFsnb3B0J10gPSBNb2NrVGNsT2JqKGFkaWN0WydvcHQnXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHRrLnRjbG9ianNfdG9fcHkoYWRpY3QpLCB7J29wdCc6IHUndsOkbMO6w6gnfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsudGNsb2Jqc190b19weShhZGljdCksIHsnb3B0JzogdSd2w6Rsw7rDqCd9KQogCiAgICAgZGVmIHRlc3RfbXVsdGl2YWx1ZXMoc2VsZik6CiAgICAgICAgIGFkaWN0ID0geydvcHQnOiBbMSwgMiwgMywgNF19Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR0ay50Y2xvYmpzX3RvX3B5KGFkaWN0KSwgeydvcHQnOiBbMSwgMiwgMywgNF19KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay50Y2xvYmpzX3RvX3B5KGFkaWN0KSwgeydvcHQnOiBbMSwgMiwgMywgNF19KQogCiAgICAgICAgIGFkaWN0WydvcHQnXSA9IFsxLCAneG0nLCAzXQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsudGNsb2Jqc190b19weShhZGljdCksIHsnb3B0JzogWzEsICd4bScsIDNdfSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dGsudGNsb2Jqc190b19weShhZGljdCksIHsnb3B0JzogWzEsICd4bScsIDNdfSkKIAogICAgICAgICBhZGljdFsnb3B0J10gPSAoTW9ja1N0YXRlU3BlYygnYScsICdiJyksIHUndsOhbMWpw6gnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsudGNsb2Jqc190b19weShhZGljdCksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLnRjbG9ianNfdG9fcHkoYWRpY3QpLAogICAgICAgICAgICAgeydvcHQnOiBbKCdhJywgJ2InLCB1J3bDoWzFqcOoJyldfSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsudGNsb2Jqc190b19weSh7J3gnOiBbJ3kgeiddfSksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHRrLnRjbG9ianNfdG9fcHkoeyd4JzogWyd5IHonXX0pLAogICAgICAgICAgICAgeyd4JzogWyd5IHonXX0pCiAKICAgICBkZWYgdGVzdF9ub3NwbGl0KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0dGsudGNsb2Jqc190b19weSh7J3RleHQnOiAnc29tZSB0ZXh0J30pLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR0ay50Y2xvYmpzX3RvX3B5KHsndGV4dCc6ICdzb21lIHRleHQnfSksCiAgICAgICAgICAgICB7J3RleHQnOiAnc29tZSB0ZXh0J30pCiAKIHRlc3RzX25vZ3VpID0gKEludGVybmFsRnVuY3Rpb25zVGVzdCwgVGNsT2Jqc1RvUHlUZXN0KQpkaWZmIC0tZ2l0IGEvTGliL2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfc3R5bGUucHkgYi9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9zdHlsZS5weQppbmRleCBhYjM1NTRkLi42MzBlMDc1IDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9zdHlsZS5weQorKysgYi9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF9zdHlsZS5weQpAQCAtMTYsMTcgKzE2LDE3IEBACiAgICAgZGVmIHRlc3RfY29uZmlndXJlKHNlbGYpOgogICAgICAgICBzdHlsZSA9IHNlbGYuc3R5bGUKICAgICAgICAgc3R5bGUuY29uZmlndXJlKCdUQnV0dG9uJywgYmFja2dyb3VuZD0neWVsbG93JykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc3R5bGUuY29uZmlndXJlKCdUQnV0dG9uJywgJ2JhY2tncm91bmQnKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHlsZS5jb25maWd1cmUoJ1RCdXR0b24nLCAnYmFja2dyb3VuZCcpLAogICAgICAgICAgICAgJ3llbGxvdycpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHN0eWxlLmNvbmZpZ3VyZSgnVEJ1dHRvbicpLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3R5bGUuY29uZmlndXJlKCdUQnV0dG9uJyksIGRpY3QpKQogCiAKICAgICBkZWYgdGVzdF9tYXAoc2VsZik6CiAgICAgICAgIHN0eWxlID0gc2VsZi5zdHlsZQogICAgICAgICBzdHlsZS5tYXAoJ1RCdXR0b24nLCBiYWNrZ3JvdW5kPVsoJ2FjdGl2ZScsICdiYWNrZ3JvdW5kJywgJ2JsdWUnKV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0eWxlLm1hcCgnVEJ1dHRvbicsICdiYWNrZ3JvdW5kJyksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R5bGUubWFwKCdUQnV0dG9uJywgJ2JhY2tncm91bmQnKSwKICAgICAgICAgICAgIFsoJ2FjdGl2ZScsICdiYWNrZ3JvdW5kJywgJ2JsdWUnKV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHN0eWxlLm1hcCgnVEJ1dHRvbicpLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3R5bGUubWFwKCdUQnV0dG9uJyksIGRpY3QpKQogCiAKICAgICBkZWYgdGVzdF9sb29rdXAoc2VsZik6CkBAIC0zNCwzOCArMzQsMzggQEAKICAgICAgICAgc3R5bGUuY29uZmlndXJlKCdUQnV0dG9uJywgYmFja2dyb3VuZD0neWVsbG93JykKICAgICAgICAgc3R5bGUubWFwKCdUQnV0dG9uJywgYmFja2dyb3VuZD1bKCdhY3RpdmUnLCAnYmFja2dyb3VuZCcsICdibHVlJyldKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0eWxlLmxvb2t1cCgnVEJ1dHRvbicsICdiYWNrZ3JvdW5kJyksICd5ZWxsb3cnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHlsZS5sb29rdXAoJ1RCdXR0b24nLCAnYmFja2dyb3VuZCcsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R5bGUubG9va3VwKCdUQnV0dG9uJywgJ2JhY2tncm91bmQnKSwgJ3llbGxvdycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R5bGUubG9va3VwKCdUQnV0dG9uJywgJ2JhY2tncm91bmQnLAogICAgICAgICAgICAgWydhY3RpdmUnLCAnYmFja2dyb3VuZCddKSwgJ2JsdWUnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHlsZS5sb29rdXAoJ1RCdXR0b24nLCAnb3B0aW9ubm90ZGVmaW5lZCcsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R5bGUubG9va3VwKCdUQnV0dG9uJywgJ29wdGlvbm5vdGRlZmluZWQnLAogICAgICAgICAgICAgZGVmYXVsdD0naWtuZXdpdCcpLCAnaWtuZXdpdCcpCiAKIAogICAgIGRlZiB0ZXN0X2xheW91dChzZWxmKToKICAgICAgICAgc3R5bGUgPSBzZWxmLnN0eWxlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzdHlsZS5sYXlvdXQsICdOb3RBTGF5b3V0JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc3R5bGUubGF5b3V0LCAnTm90QUxheW91dCcpCiAgICAgICAgIHR2X3N0eWxlID0gc3R5bGUubGF5b3V0KCdUcmVldmlldycpCiAKICAgICAgICAgIyAiZXJhc2UiIFRyZWV2aWV3IGxheW91dAogICAgICAgICBzdHlsZS5sYXlvdXQoJ1RyZWV2aWV3JywgJycpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0eWxlLmxheW91dCgnVHJlZXZpZXcnKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHlsZS5sYXlvdXQoJ1RyZWV2aWV3JyksCiAgICAgICAgICAgICBbKCdudWxsJywgeydzdGlja3knOiAnbnN3ZSd9KV0KICAgICAgICAgKQogCiAgICAgICAgICMgcmVzdG9yZSBsYXlvdXQKICAgICAgICAgc3R5bGUubGF5b3V0KCdUcmVldmlldycsIHR2X3N0eWxlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHlsZS5sYXlvdXQoJ1RyZWV2aWV3JyksIHR2X3N0eWxlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0eWxlLmxheW91dCgnVHJlZXZpZXcnKSwgdHZfc3R5bGUpCiAKICAgICAgICAgIyBzaG91bGQgcmV0dXJuIGEgbGlzdAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzdHlsZS5sYXlvdXQoJ1RCdXR0b24nKSwgbGlzdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN0eWxlLmxheW91dCgnVEJ1dHRvbicpLCBsaXN0KSkKIAogICAgICAgICAjIGNvcnJlY3QgbGF5b3V0LCBidXQgIm9wdGlvbiIgZG9lc24ndCBleGlzdCBhcyBvcHRpb24KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHN0eWxlLmxheW91dCwgJ1RyZWV2aWV3JywKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc3R5bGUubGF5b3V0LCAnVHJlZXZpZXcnLAogICAgICAgICAgICAgWygnbmFtZScsIHsnb3B0aW9uJzogJ2luZXhpc3RlbnQnfSldKQogCiAKICAgICBkZWYgdGVzdF90aGVtZV91c2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnN0eWxlLnRoZW1lX3VzZSwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5zdHlsZS50aGVtZV91c2UsCiAgICAgICAgICAgICAnbm9uZXhpc3RpbmduYW1lJykKIAogICAgICAgICBjdXJyX3RoZW1lID0gc2VsZi5zdHlsZS50aGVtZV91c2UoKQpAQCAtNzksOCArNzksOCBAQAogICAgICAgICAgICAgIyBqdXN0IG9uZSB0aGVtZSBhdmFpbGFibGUsIGNhbid0IGdvIG9uIHdpdGggdGVzdHMKICAgICAgICAgICAgIHJldHVybgogCi0gICAgICAgIHNlbGYuZmFpbElmKGN1cnJfdGhlbWUgPT0gbmV3X3RoZW1lKQotICAgICAgICBzZWxmLmZhaWxJZihuZXdfdGhlbWUgIT0gc2VsZi5zdHlsZS50aGVtZV91c2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjdXJyX3RoZW1lID09IG5ld190aGVtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShuZXdfdGhlbWUgIT0gc2VsZi5zdHlsZS50aGVtZV91c2UoKSkKIAogICAgICAgICBzZWxmLnN0eWxlLnRoZW1lX3VzZShjdXJyX3RoZW1lKQogCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5IGIvTGliL2xpYi10ay90ZXN0L3Rlc3RfdHRrL3Rlc3Rfd2lkZ2V0cy5weQppbmRleCA0ZjZmNDRkLi42Y2YwNDBjIDEwMDY0NAotLS0gYS9MaWIvbGliLXRrL3Rlc3QvdGVzdF90dGsvdGVzdF93aWRnZXRzLnB5CisrKyBiL0xpYi9saWItdGsvdGVzdC90ZXN0X3R0ay90ZXN0X3dpZGdldHMucHkKQEAgLTI0LDQ4ICsyNCw0OCBAQAogCiAgICAgZGVmIHRlc3RfaWRlbnRpZnkoc2VsZik6CiAgICAgICAgIHNlbGYud2lkZ2V0LnVwZGF0ZV9pZGxldGFza3MoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLndpZGdldC5pZGVudGlmeSg1LCA1KSwgImxhYmVsIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi53aWRnZXQuaWRlbnRpZnkoLTEsIC0xKSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuaWRlbnRpZnkoNSwgNSksICJsYWJlbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuaWRlbnRpZnkoLTEsIC0xKSwgIiIpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYud2lkZ2V0LmlkZW50aWZ5LCBOb25lLCA1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi53aWRnZXQuaWRlbnRpZnksIDUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLndpZGdldC5pZGVudGlmeSwgNSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYud2lkZ2V0LmlkZW50aWZ5LCBOb25lLCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLndpZGdldC5pZGVudGlmeSwgNSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi53aWRnZXQuaWRlbnRpZnksIDUsICcnKQogCiAKICAgICBkZWYgdGVzdF93aWRnZXRfc3RhdGUoc2VsZik6CiAgICAgICAgICMgWFhYIG5vdCBzdXJlIGFib3V0IHRoZSBwb3J0YWJpbGl0eSBvZiBhbGwgdGhlc2UgdGVzdHMKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi53aWRnZXQuc3RhdGUoKSwgKCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYud2lkZ2V0Lmluc3RhdGUoWychZGlzYWJsZWQnXSksIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuc3RhdGUoKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuaW5zdGF0ZShbJyFkaXNhYmxlZCddKSwgVHJ1ZSkKIAogICAgICAgICAjIGNoYW5naW5nIGZyb20gIWRpc2FibGVkIHRvIGRpc2FibGVkCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYud2lkZ2V0LnN0YXRlKFsnZGlzYWJsZWQnXSksICgnIWRpc2FibGVkJywgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndpZGdldC5zdGF0ZShbJ2Rpc2FibGVkJ10pLCAoJyFkaXNhYmxlZCcsICkpCiAgICAgICAgICMgbm8gc3RhdGUgY2hhbmdlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYud2lkZ2V0LnN0YXRlKFsnZGlzYWJsZWQnXSksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYud2lkZ2V0LnN0YXRlKFsnZGlzYWJsZWQnXSksICgpKQogICAgICAgICAjIGNoYW5nZSBiYWNrIHRvICFkaXNhYmxlIGJ1dCBhbHNvIGFjdGl2ZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLndpZGdldC5zdGF0ZShbJyFkaXNhYmxlZCcsICdhY3RpdmUnXSksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi53aWRnZXQuc3RhdGUoWychZGlzYWJsZWQnLCAnYWN0aXZlJ10pLAogICAgICAgICAgICAgKCchYWN0aXZlJywgJ2Rpc2FibGVkJykpCiAgICAgICAgICMgbm8gc3RhdGUgY2hhbmdlcywgYWdhaW4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi53aWRnZXQuc3RhdGUoWychZGlzYWJsZWQnLCAnYWN0aXZlJ10pLCAoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi53aWRnZXQuc3RhdGUoWydhY3RpdmUnLCAnIWRpc2FibGVkJ10pLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndpZGdldC5zdGF0ZShbJyFkaXNhYmxlZCcsICdhY3RpdmUnXSksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYud2lkZ2V0LnN0YXRlKFsnYWN0aXZlJywgJyFkaXNhYmxlZCddKSwgKCkpCiAKICAgICAgICAgZGVmIHRlc3RfY2IoYXJnMSwgKiprdyk6CiAgICAgICAgICAgICByZXR1cm4gYXJnMSwga3cKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi53aWRnZXQuaW5zdGF0ZShbJyFkaXNhYmxlZCddLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYud2lkZ2V0Lmluc3RhdGUoWychZGlzYWJsZWQnXSwKICAgICAgICAgICAgIHRlc3RfY2IsICJoaSIsICoqeyJtc2ciOiAidGhlcmUifSksCiAgICAgICAgICAgICAoJ2hpJywgeydtc2cnOiAndGhlcmUnfSkpCiAKICAgICAgICAgIyBhdHRlbXB0IHRvIHNldCBpbnZhbGlkIHN0YXRlc3BlYwogICAgICAgICBjdXJyc3RhdGUgPSBzZWxmLndpZGdldC5zdGF0ZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLndpZGdldC5pbnN0YXRlLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLndpZGdldC5pbnN0YXRlLAogICAgICAgICAgICAgWydiYWRzdGF0ZSddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi53aWRnZXQuaW5zdGF0ZSwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi53aWRnZXQuaW5zdGF0ZSwKICAgICAgICAgICAgIFsnZGlzYWJsZWQnLCAnYmFkc3RhdGUnXSkKICAgICAgICAgIyB2ZXJpZnkgdGhhdCB3aWRnZXQgZGlkbid0IGNoYW5nZSBpdHMgc3RhdGUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoY3VycnN0YXRlLCBzZWxmLndpZGdldC5zdGF0ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1cnJzdGF0ZSwgc2VsZi53aWRnZXQuc3RhdGUoKSkKIAogICAgICAgICAjIGVuc3VyaW5nIHRoYXQgcGFzc2luZyBOb25lIGFzIHN0YXRlIGRvZXNuJ3QgbW9kaWZ5IGN1cnJlbnQgc3RhdGUKICAgICAgICAgc2VsZi53aWRnZXQuc3RhdGUoWydhY3RpdmUnLCAnIWRpc2FibGVkJ10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYud2lkZ2V0LnN0YXRlKCksICgnYWN0aXZlJywgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLndpZGdldC5zdGF0ZSgpLCAoJ2FjdGl2ZScsICkpCiAKIAogY2xhc3MgQnV0dG9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC03NCw3ICs3NCw3IEBACiAgICAgICAgIHN1Y2Nlc3MgPSBbXQogICAgICAgICBidG4gPSB0dGsuQnV0dG9uKGNvbW1hbmQ9bGFtYmRhOiBzdWNjZXNzLmFwcGVuZCgxKSkKICAgICAgICAgYnRuLmludm9rZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdWNjZXNzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3VjY2VzcykKIAogCiBjbGFzcyBDaGVja2J1dHRvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtODgsMjEgKzg4LDIxIEBACiAgICAgICAgIGNidG4gPSB0dGsuQ2hlY2tidXR0b24oY29tbWFuZD1jYl90ZXN0KQogICAgICAgICAjIHRoZSB2YXJpYWJsZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgdHRrLkNoZWNrYnV0dG9uIGlzIGFjdHVhbGx5CiAgICAgICAgICMgdW5kZWZpbmVkIHRpbGwgd2UgaW52b2tlIHRoZSBDaGVja2J1dHRvbgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjYnRuLnN0YXRlKCksICgnYWx0ZXJuYXRlJywgKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIGNidG4udGsuZ2xvYmFsZ2V0dmFyLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNidG4uc3RhdGUoKSwgKCdhbHRlcm5hdGUnLCApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBjYnRuLnRrLmdsb2JhbGdldHZhciwKICAgICAgICAgICAgIGNidG5bJ3ZhcmlhYmxlJ10pCiAKICAgICAgICAgcmVzID0gY2J0bi5pbnZva2UoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsICJjYiB0ZXN0IGNhbGxlZCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNidG5bJ29udmFsdWUnXSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsICJjYiB0ZXN0IGNhbGxlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2J0blsnb252YWx1ZSddLAogICAgICAgICAgICAgY2J0bi50ay5nbG9iYWxnZXR2YXIoY2J0blsndmFyaWFibGUnXSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdWNjZXNzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3VjY2VzcykKIAogICAgICAgICBjYnRuWydjb21tYW5kJ10gPSAnJwogICAgICAgICByZXMgPSBjYnRuLmludm9rZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcywgJycpCi0gICAgICAgIHNlbGYuZmFpbElmKGxlbihzdWNjZXNzKSA+IDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNidG5bJ29mZnZhbHVlJ10sCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsZW4oc3VjY2VzcykgPiAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNidG5bJ29mZnZhbHVlJ10sCiAgICAgICAgICAgICBjYnRuLnRrLmdsb2JhbGdldHZhcihjYnRuWyd2YXJpYWJsZSddKSkKIAogCkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICAgICAgc2VsZi5jb21iby5ldmVudF9nZW5lcmF0ZSgnPFJldHVybj4nKQogICAgICAgICBzZWxmLmNvbWJvLnVwZGF0ZSgpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN1Y2Nlc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdWNjZXNzKQogCiAKICAgICBkZWYgdGVzdF9wb3N0Y29tbWFuZChzZWxmKToKQEAgLTE0OSwxOCArMTQ5LDE4IEBACiAgICAgICAgIHNlbGYuY29tYm8ud2FpdF92aXNpYmlsaXR5KCkKIAogICAgICAgICBzZWxmLl9zaG93X2Ryb3BfZG93bl9saXN0Ym94KCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN1Y2Nlc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdWNjZXNzKQogCiAgICAgICAgICMgdGVzdGluZyBwb3N0Y29tbWFuZCByZW1vdmFsCiAgICAgICAgIHNlbGYuY29tYm9bJ3Bvc3Rjb21tYW5kJ10gPSAnJwogICAgICAgICBzZWxmLl9zaG93X2Ryb3BfZG93bl9saXN0Ym94KCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHN1Y2Nlc3MpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzdWNjZXNzKSwgMSkKIAogCiAgICAgZGVmIHRlc3RfdmFsdWVzKHNlbGYpOgogICAgICAgICBkZWYgY2hlY2tfZ2V0X2N1cnJlbnQoZ2V0dmFsLCBjdXJydmFsKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY29tYm8uZ2V0KCksIGdldHZhbCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY29tYm8uY3VycmVudCgpLCBjdXJydmFsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmNvbWJvLmdldCgpLCBnZXR2YWwpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tYm8uY3VycmVudCgpLCBjdXJydmFsKQogCiAgICAgICAgIGNoZWNrX2dldF9jdXJyZW50KCcnLCAtMSkKIApAQCAtMTgyLDE3ICsxODIsMTcgQEAKIAogICAgICAgICAjIHRlc3RpbmcgdmFsdWVzIHdpdGggZW1wdHkgc3RyaW5nIHNldCB0aHJvdWdoIGNvbmZpZ3VyZQogICAgICAgICBzZWxmLmNvbWJvLmNvbmZpZ3VyZSh2YWx1ZXM9WzEsICcnLCAyXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jb21ib1sndmFsdWVzJ10sICgnMScsICcnLCAnMicpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuY29tYm9bJ3ZhbHVlcyddLCAoJzEnLCAnJywgJzInKSkKIAogICAgICAgICAjIG91dCBvZiByYW5nZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5jb21iby5jdXJyZW50LAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmNvbWJvLmN1cnJlbnQsCiAgICAgICAgICAgICBsZW4oc2VsZi5jb21ib1sndmFsdWVzJ10pKQogICAgICAgICAjIGl0IGV4cGVjdHMgYW4gaW50ZWdlciAob3Igc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0byBpbnQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmNvbWJvLmN1cnJlbnQsICcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmNvbWJvLmN1cnJlbnQsICcnKQogCiAgICAgICAgICMgdGVzdGluZyBjcmVhdGluZyBjb21ib2JveCB3aXRoIGVtcHR5IHN0cmluZyBpbiB2YWx1ZXMKICAgICAgICAgY29tYm8yID0gdHRrLkNvbWJvYm94KHZhbHVlcz1bMSwgMiwgJyddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjb21ibzJbJ3ZhbHVlcyddLCAoJzEnLCAnMicsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjb21ibzJbJ3ZhbHVlcyddLCAoJzEnLCAnMicsICcnKSkKICAgICAgICAgY29tYm8yLmRlc3Ryb3koKQogCiAKQEAgLTIwOCwxMiArMjA4LDEyIEBACiAKIAogICAgIGRlZiB0ZXN0X2Jib3goc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihzZWxmLmVudHJ5LmJib3goMCkpLCA0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZWxmLmVudHJ5LmJib3goMCkpLCA0KQogICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLmVudHJ5LmJib3goMCk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShpdGVtLCBpbnQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoaXRlbSwgaW50KSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5lbnRyeS5iYm94LCAnbm9pbmRleCcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmJib3gsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuZW50cnkuYmJveCwgJ25vaW5kZXgnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmJib3gsIE5vbmUpCiAKIAogICAgIGRlZiB0ZXN0X2lkZW50aWZ5KHNlbGYpOgpAQCAtMjIxLDEyICsyMjEsMTIgQEAKICAgICAgICAgc2VsZi5lbnRyeS53YWl0X3Zpc2liaWxpdHkoKQogICAgICAgICBzZWxmLmVudHJ5LnVwZGF0ZV9pZGxldGFza3MoKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuZW50cnkuaWRlbnRpZnkoNSwgNSksICJ0ZXh0YXJlYSIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuZW50cnkuaWRlbnRpZnkoLTEsIC0xKSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnRyeS5pZGVudGlmeSg1LCA1KSwgInRleHRhcmVhIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LmlkZW50aWZ5KC0xLCAtMSksICIiKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmlkZW50aWZ5LCBOb25lLCA1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5lbnRyeS5pZGVudGlmeSwgNSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuZW50cnkuaWRlbnRpZnksIDUsICcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmlkZW50aWZ5LCBOb25lLCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmlkZW50aWZ5LCA1LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLmVudHJ5LmlkZW50aWZ5LCA1LCAnJykKIAogCiAgICAgZGVmIHRlc3RfdmFsaWRhdGlvbl9vcHRpb25zKHNlbGYpOgpAQCAtMjM4LDIzICsyMzgsMjMgQEAKIAogICAgICAgICBzZWxmLmVudHJ5WydpbnZhbGlkY29tbWFuZCddID0gdGVzdF9pbnZhbGlkCiAgICAgICAgIHNlbGYuZW50cnkudmFsaWRhdGUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3VjY2VzcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN1Y2Nlc3MpCiAKICAgICAgICAgc2VsZi5lbnRyeVsnaW52YWxpZGNvbW1hbmQnXSA9ICcnCiAgICAgICAgIHNlbGYuZW50cnkudmFsaWRhdGUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oc3VjY2VzcyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHN1Y2Nlc3MpLCAxKQogCiAgICAgICAgIHNlbGYuZW50cnlbJ2ludmFsaWRjb21tYW5kJ10gPSB0ZXN0X2ludmFsaWQKICAgICAgICAgc2VsZi5lbnRyeVsndmFsaWRhdGVjb21tYW5kJ10gPSBsYW1iZGE6IFRydWUKICAgICAgICAgc2VsZi5lbnRyeS52YWxpZGF0ZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihzdWNjZXNzKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc3VjY2VzcyksIDEpCiAKICAgICAgICAgc2VsZi5lbnRyeVsndmFsaWRhdGVjb21tYW5kJ10gPSAnJwogICAgICAgICBzZWxmLmVudHJ5LnZhbGlkYXRlKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHN1Y2Nlc3MpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzdWNjZXNzKSwgMSkKIAogICAgICAgICBzZWxmLmVudHJ5Wyd2YWxpZGF0ZWNvbW1hbmQnXSA9IFRydWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuZW50cnkudmFsaWRhdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuZW50cnkudmFsaWRhdGUpCiAKIAogICAgIGRlZiB0ZXN0X3ZhbGlkYXRpb24oc2VsZik6CkBAIC0yNzEsOCArMjcxLDggQEAKIAogICAgICAgICBzZWxmLmVudHJ5Lmluc2VydCgnZW5kJywgMSkKICAgICAgICAgc2VsZi5lbnRyeS5pbnNlcnQoJ2VuZCcsICdhJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsaWRhdGlvbiwgW0ZhbHNlLCBUcnVlXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5lbnRyeS5nZXQoKSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbGlkYXRpb24sIFtGYWxzZSwgVHJ1ZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnRyeS5nZXQoKSwgJ2EnKQogCiAKICAgICBkZWYgdGVzdF9yZXZhbGlkYXRpb24oc2VsZik6CkBAIC0yODUsMTkgKzI4NSwxOSBAQAogICAgICAgICBzZWxmLmVudHJ5Wyd2YWxpZGF0ZWNvbW1hbmQnXSA9IHNlbGYuZW50cnkucmVnaXN0ZXIodmFsaWRhdGUpLCAnJVAnCiAKICAgICAgICAgc2VsZi5lbnRyeS5pbnNlcnQoJ2VuZCcsICdhdm9jYWRvJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5lbnRyeS52YWxpZGF0ZSgpLCBUcnVlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmVudHJ5LnN0YXRlKCksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW50cnkudmFsaWRhdGUoKSwgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LnN0YXRlKCksICgpKQogCiAgICAgICAgIHNlbGYuZW50cnkuZGVsZXRlKDAsICdlbmQnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmVudHJ5LmdldCgpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LmdldCgpLCAnJykKIAogICAgICAgICBzZWxmLmVudHJ5Lmluc2VydCgnZW5kJywgJ2ExYicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuZW50cnkudmFsaWRhdGUoKSwgRmFsc2UpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuZW50cnkuc3RhdGUoKSwgKCdpbnZhbGlkJywgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVudHJ5LnZhbGlkYXRlKCksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW50cnkuc3RhdGUoKSwgKCdpbnZhbGlkJywgKSkKIAogICAgICAgICBzZWxmLmVudHJ5LmRlbGV0ZSgxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmVudHJ5LnZhbGlkYXRlKCksIFRydWUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuZW50cnkuc3RhdGUoKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbnRyeS52YWxpZGF0ZSgpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZW50cnkuc3RhdGUoKSwgKCkpCiAKIAogY2xhc3MgUGFuZWR3aW5kb3dUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTMxNSwxMDggKzMxNSwxMDggQEAKICAgICAgICAgIyBhdHRlbXB0IHRvIGFkZCBhIGNoaWxkIHRoYXQgaXMgbm90IGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBwYW5lZCB3aW5kb3cKICAgICAgICAgbGFiZWwgPSB0dGsuTGFiZWwoc2VsZi5wYW5lZCkKICAgICAgICAgY2hpbGQgPSB0dGsuTGFiZWwobGFiZWwpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmFkZCwgY2hpbGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuYWRkLCBjaGlsZCkKICAgICAgICAgbGFiZWwuZGVzdHJveSgpCiAgICAgICAgIGNoaWxkLmRlc3Ryb3koKQogICAgICAgICAjIGFub3RoZXIgYXR0ZW1wdAogICAgICAgICBsYWJlbCA9IHR0ay5MYWJlbCgpCiAgICAgICAgIGNoaWxkID0gdHRrLkxhYmVsKGxhYmVsKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5hZGQsIGNoaWxkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmFkZCwgY2hpbGQpCiAgICAgICAgIGNoaWxkLmRlc3Ryb3koKQogICAgICAgICBsYWJlbC5kZXN0cm95KCkKIAogICAgICAgICBnb29kX2NoaWxkID0gdHRrLkxhYmVsKCkKICAgICAgICAgc2VsZi5wYW5lZC5hZGQoZ29vZF9jaGlsZCkKICAgICAgICAgIyByZS1hZGRpbmcgYSBjaGlsZCBpcyBub3QgYWNjZXB0ZWQKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuYWRkLCBnb29kX2NoaWxkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmFkZCwgZ29vZF9jaGlsZCkKIAogICAgICAgICBvdGhlcl9jaGlsZCA9IHR0ay5MYWJlbChzZWxmLnBhbmVkKQogICAgICAgICBzZWxmLnBhbmVkLmFkZChvdGhlcl9jaGlsZCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5wYW5lZC5wYW5lKDApLCBzZWxmLnBhbmVkLnBhbmUoMSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLnBhbmUsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYW5lZC5wYW5lKDApLCBzZWxmLnBhbmVkLnBhbmUoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQucGFuZSwgMikKICAgICAgICAgZ29vZF9jaGlsZC5kZXN0cm95KCkKICAgICAgICAgb3RoZXJfY2hpbGQuZGVzdHJveSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLnBhbmUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQucGFuZSwgMCkKIAogCiAgICAgZGVmIHRlc3RfZm9yZ2V0KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5mb3JnZXQsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmZvcmdldCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5mb3JnZXQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuZm9yZ2V0LCAwKQogCiAgICAgICAgIHNlbGYucGFuZWQuYWRkKHR0ay5MYWJlbCgpKQogICAgICAgICBzZWxmLnBhbmVkLmZvcmdldCgwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5mb3JnZXQsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuZm9yZ2V0LCAwKQogCiAKICAgICBkZWYgdGVzdF9pbnNlcnQoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmluc2VydCwgTm9uZSwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuaW5zZXJ0LCAwLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5pbnNlcnQsIDAsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuaW5zZXJ0LCBOb25lLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmluc2VydCwgMCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5pbnNlcnQsIDAsIDApCiAKICAgICAgICAgY2hpbGQgPSB0dGsuTGFiZWwoKQogICAgICAgICBjaGlsZDIgPSB0dGsuTGFiZWwoKQogICAgICAgICBjaGlsZDMgPSB0dGsuTGFiZWwoKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLmluc2VydCwgMCwgY2hpbGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuaW5zZXJ0LCAwLCBjaGlsZCkKIAogICAgICAgICBzZWxmLnBhbmVkLmluc2VydCgnZW5kJywgY2hpbGQyKQogICAgICAgICBzZWxmLnBhbmVkLmluc2VydCgwLCBjaGlsZCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5wYW5lZC5wYW5lcygpLCAoc3RyKGNoaWxkKSwgc3RyKGNoaWxkMikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZXMoKSwgKHN0cihjaGlsZCksIHN0cihjaGlsZDIpKSkKIAogICAgICAgICBzZWxmLnBhbmVkLmluc2VydCgwLCBjaGlsZDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYucGFuZWQucGFuZXMoKSwgKHN0cihjaGlsZDIpLCBzdHIoY2hpbGQpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnBhbmVkLnBhbmVzKCksIChzdHIoY2hpbGQyKSwgc3RyKGNoaWxkKSkpCiAKICAgICAgICAgc2VsZi5wYW5lZC5pbnNlcnQoJ2VuZCcsIGNoaWxkMykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5wYW5lZC5wYW5lcygpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZXMoKSwKICAgICAgICAgICAgIChzdHIoY2hpbGQyKSwgc3RyKGNoaWxkKSwgc3RyKGNoaWxkMykpKQogCiAgICAgICAgICMgcmVpbnNlcnRpbmcgYSBjaGlsZCBzaG91bGQgbW92ZSBpdCB0byBpdHMgY3VycmVudCBwb3NpdGlvbgogICAgICAgICBwYW5lcyA9IHNlbGYucGFuZWQucGFuZXMoKQogICAgICAgICBzZWxmLnBhbmVkLmluc2VydCgnZW5kJywgY2hpbGQzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwYW5lcywgc2VsZi5wYW5lZC5wYW5lcygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBhbmVzLCBzZWxmLnBhbmVkLnBhbmVzKCkpCiAKICAgICAgICAgIyBtb3ZpbmcgY2hpbGQzIHRvIGNoaWxkMiBwb3NpdGlvbiBzaG91bGQgcmVzdWx0IGluIGNoaWxkMiBlbmRpbmcgdXAKICAgICAgICAgIyBpbiBwcmV2aW91cyBjaGlsZCBwb3NpdGlvbiBhbmQgY2hpbGQgZW5kaW5nIHVwIGluIHByZXZpb3VzIGNoaWxkMwogICAgICAgICAjIHBvc2l0aW9uCiAgICAgICAgIHNlbGYucGFuZWQuaW5zZXJ0KGNoaWxkMiwgY2hpbGQzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnBhbmVkLnBhbmVzKCksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYW5lZC5wYW5lcygpLAogICAgICAgICAgICAgKHN0cihjaGlsZDMpLCBzdHIoY2hpbGQyKSwgc3RyKGNoaWxkKSkpCiAKIAogICAgIGRlZiB0ZXN0X3BhbmUoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLnBhbmUsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQucGFuZSwgMCkKIAogICAgICAgICBjaGlsZCA9IHR0ay5MYWJlbCgpCiAgICAgICAgIHNlbGYucGFuZWQuYWRkKGNoaWxkKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzZWxmLnBhbmVkLnBhbmUoMCksIGRpY3QpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnBhbmVkLnBhbmUoMCwgd2VpZ2h0PU5vbmUpLCAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnBhbmVkLnBhbmUoMCksIGRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZSgwLCB3ZWlnaHQ9Tm9uZSksIDApCiAgICAgICAgICMgbmV3ZXIgZm9ybSBmb3IgcXVlcnlpbmcgYSBzaW5nbGUgb3B0aW9uCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYucGFuZWQucGFuZSgwLCAnd2VpZ2h0JyksIDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYucGFuZWQucGFuZSgwKSwgc2VsZi5wYW5lZC5wYW5lKHN0cihjaGlsZCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYucGFuZWQucGFuZSgwLCAnd2VpZ2h0JyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wYW5lZC5wYW5lKDApLCBzZWxmLnBhbmVkLnBhbmUoc3RyKGNoaWxkKSkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQucGFuZSwgMCwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5wYW5lLCAwLAogICAgICAgICAgICAgYmFkb3B0aW9uPSdzb21ldmFsdWUnKQogCiAKICAgICBkZWYgdGVzdF9zYXNocG9zKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5zYXNocG9zLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5zYXNocG9zLCAnJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuc2FzaHBvcywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5zYXNocG9zLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLnNhc2hwb3MsICcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnBhbmVkLnNhc2hwb3MsIDApCiAKICAgICAgICAgY2hpbGQgPSB0dGsuTGFiZWwoc2VsZi5wYW5lZCwgdGV4dD0nYScpCiAgICAgICAgIHNlbGYucGFuZWQuYWRkKGNoaWxkLCB3ZWlnaHQ9MSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuc2FzaHBvcywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5zYXNocG9zLCAwKQogICAgICAgICBjaGlsZDIgPSB0dGsuTGFiZWwoc2VsZi5wYW5lZCwgdGV4dD0nYicpCiAgICAgICAgIHNlbGYucGFuZWQuYWRkKGNoaWxkMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYucGFuZWQuc2FzaHBvcywgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5wYW5lZC5zYXNocG9zLCAxKQogCiAgICAgICAgIHNlbGYucGFuZWQucGFjayhleHBhbmQ9VHJ1ZSwgZmlsbD0nYm90aCcpCiAgICAgICAgIHNlbGYucGFuZWQud2FpdF92aXNpYmlsaXR5KCkKIAogICAgICAgICBjdXJyX3BvcyA9IHNlbGYucGFuZWQuc2FzaHBvcygwKQogICAgICAgICBzZWxmLnBhbmVkLnNhc2hwb3MoMCwgMTAwMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGN1cnJfcG9zICE9IHNlbGYucGFuZWQuc2FzaHBvcygwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc2VsZi5wYW5lZC5zYXNocG9zKDApLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY3Vycl9wb3MgIT0gc2VsZi5wYW5lZC5zYXNocG9zKDApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnBhbmVkLnNhc2hwb3MoMCksIGludCkpCiAKIAogY2xhc3MgUmFkaW9idXR0b25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTQzMiwyMSArNDMyLDIxIEBACiAgICAgICAgIGNidG4yID0gdHRrLlJhZGlvYnV0dG9uKGNvbW1hbmQ9Y2JfdGVzdCwgdmFyaWFibGU9bXl2YXIsIHZhbHVlPTEpCiAKICAgICAgICAgcmVzID0gY2J0bi5pbnZva2UoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsICJjYiB0ZXN0IGNhbGxlZCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNidG5bJ3ZhbHVlJ10sIG15dmFyLmdldCgpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChteXZhci5nZXQoKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXMsICJjYiB0ZXN0IGNhbGxlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2J0blsndmFsdWUnXSwgbXl2YXIuZ2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXl2YXIuZ2V0KCksCiAgICAgICAgICAgICBjYnRuLnRrLmdsb2JhbGdldHZhcihjYnRuWyd2YXJpYWJsZSddKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN1Y2Nlc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdWNjZXNzKQogCiAgICAgICAgIGNidG4yWydjb21tYW5kJ10gPSAnJwogICAgICAgICByZXMgPSBjYnRuMi5pbnZva2UoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsICcnKQotICAgICAgICBzZWxmLmZhaWxJZihsZW4oc3VjY2VzcykgPiAxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChjYnRuMlsndmFsdWUnXSwgbXl2YXIuZ2V0KCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG15dmFyLmdldCgpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcywgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobGVuKHN1Y2Nlc3MpID4gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYnRuMlsndmFsdWUnXSwgbXl2YXIuZ2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXl2YXIuZ2V0KCksCiAgICAgICAgICAgICBjYnRuLnRrLmdsb2JhbGdldHZhcihjYnRuWyd2YXJpYWJsZSddKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHIoY2J0blsndmFyaWFibGUnXSksIHN0cihjYnRuMlsndmFyaWFibGUnXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNidG5bJ3ZhcmlhYmxlJ10pLCBzdHIoY2J0bjJbJ3ZhcmlhYmxlJ10pKQogCiAKIApAQCAtNDcyLDI3ICs0NzIsMjcgQEAKICAgICAgICAgc2VsZi5zY2FsZVsnZnJvbV8nXSA9IDEwCiAgICAgICAgIHNlbGYuc2NhbGVbJ3RvJ10gPSAzCiAKLSAgICAgICAgc2VsZi5mYWlsSWYoZmFpbHVyZSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmYWlsdXJlKQogCiAgICAgICAgIGZhaWx1cmUgPSBbMSwgMSwgMV0KICAgICAgICAgc2VsZi5zY2FsZS5jb25maWd1cmUoZnJvbV89MiwgdG89NSkKICAgICAgICAgc2VsZi5zY2FsZS5jb25maWd1cmUoZnJvbV89MCwgdG89LTIpCiAgICAgICAgIHNlbGYuc2NhbGUuY29uZmlndXJlKHRvPTEwKQogCi0gICAgICAgIHNlbGYuZmFpbElmKGZhaWx1cmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmFpbHVyZSkKIAogCiAgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgogICAgICAgICBzY2FsZV93aWR0aCA9IHNlbGYuc2NhbGUud2luZm9fd2lkdGgoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnNjYWxlLmdldChzY2FsZV93aWR0aCwgMCksIHNlbGYuc2NhbGVbJ3RvJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoc2NhbGVfd2lkdGgsIDApLCBzZWxmLnNjYWxlWyd0byddKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuc2NhbGUuZ2V0KDAsIDApLCBzZWxmLnNjYWxlWydmcm9tJ10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIHNlbGYuc2NhbGVbJ3ZhbHVlJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoMCwgMCksIHNlbGYuc2NhbGVbJ2Zyb20nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBzZWxmLnNjYWxlWyd2YWx1ZSddKQogICAgICAgICBzZWxmLnNjYWxlWyd2YWx1ZSddID0gMzAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgc2VsZi5zY2FsZVsndmFsdWUnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBzZWxmLnNjYWxlWyd2YWx1ZSddKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnNjYWxlLmdldCwgJycsIDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnNjYWxlLmdldCwgMCwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuc2NhbGUuZ2V0LCAnJywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5zY2FsZS5nZXQsIDAsICcnKQogCiAKICAgICBkZWYgdGVzdF9zZXQoc2VsZik6CkBAIC01MDAsMzAgKzUwMCwzMCBAQAogICAgICAgICBtYXggPSBzZWxmLnNjYWxlWyd0byddCiAgICAgICAgIG5ld19tYXggPSBtYXggKyAxMAogICAgICAgICBzZWxmLnNjYWxlLnNldChuZXdfbWF4KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBtYXgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgbWF4KQogICAgICAgICBtaW4gPSBzZWxmLnNjYWxlWydmcm9tJ10KICAgICAgICAgc2VsZi5zY2FsZS5zZXQobWluIC0gMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgbWluKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIG1pbikKIAogICAgICAgICAjIGNoYW5naW5nIGRpcmVjdGx5IHRoZSB2YXJpYWJsZSBkb2Vzbid0IGltcG9zZSB0aGlzIGxpbWl0YXRpb24gdGhvCiAgICAgICAgIHZhciA9IFRraW50ZXIuRG91YmxlVmFyKCkKICAgICAgICAgc2VsZi5zY2FsZVsndmFyaWFibGUnXSA9IHZhcgogICAgICAgICB2YXIuc2V0KG1heCArIDUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIHZhci5nZXQoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgbWF4ICsgNSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldCgpLCB2YXIuZ2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoKSwgbWF4ICsgNSkKICAgICAgICAgZGVsIHZhcgogCiAgICAgICAgICMgdGhlIHNhbWUgaGFwcGVucyB3aXRoIHRoZSB2YWx1ZSBvcHRpb24KICAgICAgICAgc2VsZi5zY2FsZVsndmFsdWUnXSA9IG1heCArIDEwCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIG1heCArIDEwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnNjYWxlLmdldCgpLCBzZWxmLnNjYWxlWyd2YWx1ZSddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIG1heCArIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuc2NhbGUuZ2V0KCksIHNlbGYuc2NhbGVbJ3ZhbHVlJ10pCiAKICAgICAgICAgIyBuZXZlcnRoZWxlc3MsIG5vdGUgdGhhdCB0aGUgbWF4L21pbiB2YWx1ZXMgd2UgY2FuIGdldCBzcGVjaWZ5aW5nCiAgICAgICAgICMgeCwgeSBjb29yZHMgYXJlIHRoZSBvbmVzIGFjY29yZGluZyB0byB0aGUgY3VycmVudCByYW5nZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnNjYWxlLmdldCgwLCAwKSwgbWluKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnNjYWxlLmdldChzZWxmLnNjYWxlLndpbmZvX3dpZHRoKCksIDApLCBtYXgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zY2FsZS5nZXQoMCwgMCksIG1pbikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnNjYWxlLmdldChzZWxmLnNjYWxlLndpbmZvX3dpZHRoKCksIDApLCBtYXgpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYuc2NhbGUuc2V0LCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnNjYWxlLnNldCwgTm9uZSkKIAogCiBjbGFzcyBOb3RlYm9va1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNTQ2LDE4ICs1NDYsMTggQEAKICAgICBkZWYgdGVzdF90YWJfaWRlbnRpZmllcnMoc2VsZik6CiAgICAgICAgIHNlbGYubmIuZm9yZ2V0KDApCiAgICAgICAgIHNlbGYubmIuaGlkZShzZWxmLmNoaWxkMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIudGFiLCBzZWxmLmNoaWxkMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5uYi5pbmRleCgnZW5kJyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIudGFiLCBzZWxmLmNoaWxkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLmluZGV4KCdlbmQnKSwgMSkKICAgICAgICAgc2VsZi5uYi5hZGQoc2VsZi5jaGlsZDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIuaW5kZXgoJ2VuZCcpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoJ2VuZCcpLCAxKQogICAgICAgICBzZWxmLm5iLnNlbGVjdChzZWxmLmNoaWxkMikKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5uYi50YWIoJ2N1cnJlbnQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubmIudGFiKCdjdXJyZW50JykpCiAgICAgICAgIHNlbGYubmIuYWRkKHNlbGYuY2hpbGQxLCB0ZXh0PSdhJykKIAogICAgICAgICBzZWxmLm5iLnBhY2soKQogICAgICAgICBzZWxmLm5iLndhaXRfdmlzaWJpbGl0eSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIudGFiKCdANSw1JyksIHNlbGYubmIudGFiKCdjdXJyZW50JykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWIoJ0A1LDUnKSwgc2VsZi5uYi50YWIoJ2N1cnJlbnQnKSkKIAogICAgICAgICBmb3IgaSBpbiByYW5nZSg1LCAxMDAsIDUpOgogICAgICAgICAgICAgaWYgc2VsZi5uYi50YWIoJ0AlZCwgNScgJSBpLCB0ZXh0PU5vbmUpID09ICdhJzoKQEAgLTU2NywxNyArNTY3LDE3IEBACiAKIAogICAgIGRlZiB0ZXN0X2FkZF9hbmRfaGlkZGVuKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5oaWRlLCAtMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaGlkZSwgJ2hpJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaGlkZSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuYWRkLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5hZGQsIHR0ay5MYWJlbCgpLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmhpZGUsIC0xKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmhpZGUsICdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaGlkZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5hZGQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuYWRkLCB0dGsuTGFiZWwoKSwKICAgICAgICAgICAgIHVua25vd249J29wdGlvbicpCiAKICAgICAgICAgdGFicyA9IHNlbGYubmIudGFicygpCiAgICAgICAgIHNlbGYubmIuaGlkZShzZWxmLmNoaWxkMSkKICAgICAgICAgc2VsZi5uYi5hZGQoc2VsZi5jaGlsZDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIudGFicygpLCB0YWJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCB0YWJzKQogCiAgICAgICAgIGNoaWxkID0gdHRrLkxhYmVsKCkKICAgICAgICAgc2VsZi5uYi5hZGQoY2hpbGQsIHRleHQ9J2MnKQpAQCAtNTg4LDcwICs1ODgsNzAgQEAKICAgICAgICAgY2hpbGQyX2luZGV4ID0gc2VsZi5uYi5pbmRleChzZWxmLmNoaWxkMikKICAgICAgICAgc2VsZi5uYi5oaWRlKHNlbGYuY2hpbGQyKQogICAgICAgICBzZWxmLm5iLmFkZChzZWxmLmNoaWxkMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5uYi50YWJzKCksIHRhYnMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDIpLCBjaGlsZDJfaW5kZXgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHIoc2VsZi5jaGlsZDIpID09IHNlbGYubmIudGFicygpW2NoaWxkMl9pbmRleF0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWJzKCksIHRhYnMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5pbmRleChzZWxmLmNoaWxkMiksIGNoaWxkMl9pbmRleCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihzZWxmLmNoaWxkMikgPT0gc2VsZi5uYi50YWJzKClbY2hpbGQyX2luZGV4XSkKICAgICAgICAgIyBidXQgdGhlIHRhYiBuZXh0IHRvIGl0IChub3QgaGlkZGVuKSBpcyB0aGUgb25lIHNlbGVjdGVkIG5vdwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLmluZGV4KCdjdXJyZW50JyksIGN1cnIgKyAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoJ2N1cnJlbnQnKSwgY3VyciArIDEpCiAKIAogICAgIGRlZiB0ZXN0X2ZvcmdldChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuZm9yZ2V0LCAtMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuZm9yZ2V0LCAnaGknKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5mb3JnZXQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuZm9yZ2V0LCAtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5mb3JnZXQsICdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuZm9yZ2V0LCBOb25lKQogCiAgICAgICAgIHRhYnMgPSBzZWxmLm5iLnRhYnMoKQogICAgICAgICBjaGlsZDFfaW5kZXggPSBzZWxmLm5iLmluZGV4KHNlbGYuY2hpbGQxKQogICAgICAgICBzZWxmLm5iLmZvcmdldChzZWxmLmNoaWxkMSkKLSAgICAgICAgc2VsZi5mYWlsSWYoc3RyKHNlbGYuY2hpbGQxKSBpbiBzZWxmLm5iLnRhYnMoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHRhYnMpIC0gMSwgbGVuKHNlbGYubmIudGFicygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzdHIoc2VsZi5jaGlsZDEpIGluIHNlbGYubmIudGFicygpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih0YWJzKSAtIDEsIGxlbihzZWxmLm5iLnRhYnMoKSkpCiAKICAgICAgICAgc2VsZi5uYi5hZGQoc2VsZi5jaGlsZDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDEpLCAxKQotICAgICAgICBzZWxmLmZhaWxJZihjaGlsZDFfaW5kZXggPT0gc2VsZi5uYi5pbmRleChzZWxmLmNoaWxkMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5pbmRleChzZWxmLmNoaWxkMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY2hpbGQxX2luZGV4ID09IHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDEpKQogCiAKICAgICBkZWYgdGVzdF9pbmRleChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5kZXgsIC0xKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5pbmRleCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5pbmRleCwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5kZXgsIE5vbmUpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc2VsZi5uYi5pbmRleCgnZW5kJyksIGludCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDEpLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLmluZGV4KHNlbGYuY2hpbGQyKSwgMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5uYi5pbmRleCgnZW5kJyksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYubmIuaW5kZXgoJ2VuZCcpLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDEpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoc2VsZi5jaGlsZDIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuaW5kZXgoJ2VuZCcpLCAyKQogCiAKICAgICBkZWYgdGVzdF9pbnNlcnQoc2VsZik6CiAgICAgICAgICMgbW92aW5nIHRhYnMKICAgICAgICAgdGFicyA9IHNlbGYubmIudGFicygpCiAgICAgICAgIHNlbGYubmIuaW5zZXJ0KDEsIHRhYnNbMF0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIudGFicygpLCAodGFic1sxXSwgdGFic1swXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWJzKCksICh0YWJzWzFdLCB0YWJzWzBdKSkKICAgICAgICAgc2VsZi5uYi5pbnNlcnQoc2VsZi5jaGlsZDEsIHNlbGYuY2hpbGQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnRhYnMoKSwgdGFicykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYnMoKSwgdGFicykKICAgICAgICAgc2VsZi5uYi5pbnNlcnQoJ2VuZCcsIHNlbGYuY2hpbGQxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnRhYnMoKSwgKHRhYnNbMV0sIHRhYnNbMF0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCAodGFic1sxXSwgdGFic1swXSkpCiAgICAgICAgIHNlbGYubmIuaW5zZXJ0KCdlbmQnLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnRhYnMoKSwgdGFicykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYnMoKSwgdGFicykKICAgICAgICAgIyBiYWQgbW92ZXMKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5zZXJ0LCAyLCB0YWJzWzBdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5pbnNlcnQsIC0xLCB0YWJzWzBdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgMiwgdGFic1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5pbnNlcnQsIC0xLCB0YWJzWzBdKQogCiAgICAgICAgICMgbmV3IHRhYgogICAgICAgICBjaGlsZDMgPSB0dGsuTGFiZWwoKQogICAgICAgICBzZWxmLm5iLmluc2VydCgxLCBjaGlsZDMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIudGFicygpLCAodGFic1swXSwgc3RyKGNoaWxkMyksIHRhYnNbMV0pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCAodGFic1swXSwgc3RyKGNoaWxkMyksIHRhYnNbMV0pKQogICAgICAgICBzZWxmLm5iLmZvcmdldChjaGlsZDMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIudGFicygpLCB0YWJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCB0YWJzKQogICAgICAgICBzZWxmLm5iLmluc2VydChzZWxmLmNoaWxkMSwgY2hpbGQzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnRhYnMoKSwgKHN0cihjaGlsZDMpLCApICsgdGFicykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYnMoKSwgKHN0cihjaGlsZDMpLCApICsgdGFicykKICAgICAgICAgc2VsZi5uYi5mb3JnZXQoY2hpbGQzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi5uYi5pbnNlcnQsIDIsIGNoaWxkMykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5zZXJ0LCAtMSwgY2hpbGQzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgMiwgY2hpbGQzKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgLTEsIGNoaWxkMykKIAogICAgICAgICAjIGJhZCBpbnNlcnRzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgJ2VuZCcsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgTm9uZSwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5zZXJ0LCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgJ2VuZCcsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIuaW5zZXJ0LCBOb25lLCAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLmluc2VydCwgTm9uZSwgTm9uZSkKIAogCiAgICAgZGVmIHRlc3Rfc2VsZWN0KHNlbGYpOgpAQCAtNjY1LDM2ICs2NjUsMzYgQEAKICAgICAgICAgc2VsZi5uYi5iaW5kKCc8PE5vdGVib29rVGFiQ2hhbmdlZD4+JywKICAgICAgICAgICAgIGxhbWJkYSBldnQ6IHRhYl9jaGFuZ2VkLmFwcGVuZChUcnVlKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnNlbGVjdCgpLCBzdHIoc2VsZi5jaGlsZDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuc2VsZWN0KCksIHN0cihzZWxmLmNoaWxkMSkpCiAgICAgICAgIHNlbGYubmIuc2VsZWN0KHNlbGYuY2hpbGQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3VjY2VzcykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5uYi5zZWxlY3QoKSwgc3RyKHNlbGYuY2hpbGQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN1Y2Nlc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5zZWxlY3QoKSwgc3RyKHNlbGYuY2hpbGQyKSkKIAogICAgICAgICBzZWxmLm5iLnVwZGF0ZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0YWJfY2hhbmdlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhYl9jaGFuZ2VkKQogCiAKICAgICBkZWYgdGVzdF90YWIoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLnRhYiwgLTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLnRhYiwgJ25vdGFiJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIudGFiLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLnRhYiwgLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYubmIudGFiLCAnbm90YWInKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLm5iLnRhYiwgTm9uZSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSksIGRpY3QpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSwgdGV4dD1Ob25lKSwgJ2EnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSksIGRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFiKHNlbGYuY2hpbGQxLCB0ZXh0PU5vbmUpLCAnYScpCiAgICAgICAgICMgbmV3ZXIgZm9ybSBmb3IgcXVlcnlpbmcgYSBzaW5nbGUgb3B0aW9uCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIudGFiKHNlbGYuY2hpbGQxLCAndGV4dCcpLCAnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi50YWIoc2VsZi5jaGlsZDEsICd0ZXh0JyksICdhJykKICAgICAgICAgc2VsZi5uYi50YWIoc2VsZi5jaGlsZDEsIHRleHQ9J2FiYycpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIudGFiKHNlbGYuY2hpbGQxLCB0ZXh0PU5vbmUpLCAnYWJjJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5uYi50YWIoc2VsZi5jaGlsZDEsICd0ZXh0JyksICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFiKHNlbGYuY2hpbGQxLCB0ZXh0PU5vbmUpLCAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm5iLnRhYihzZWxmLmNoaWxkMSwgJ3RleHQnKSwgJ2FiYycpCiAKIAogICAgIGRlZiB0ZXN0X3RhYnMoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihzZWxmLm5iLnRhYnMoKSksIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlbGYubmIudGFicygpKSwgMikKIAogICAgICAgICBzZWxmLm5iLmZvcmdldChzZWxmLmNoaWxkMSkKICAgICAgICAgc2VsZi5uYi5mb3JnZXQoc2VsZi5jaGlsZDIpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5uYi50YWJzKCksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIudGFicygpLCAoKSkKIAogCiAgICAgZGVmIHRlc3RfdHJhdmVyc2FsKHNlbGYpOgpAQCAtNzA1LDE2ICs3MDUsMTYgQEAKIAogICAgICAgICBzdXBwb3J0LnNpbXVsYXRlX21vdXNlX2NsaWNrKHNlbGYubmIsIDUsIDUpCiAgICAgICAgIHNlbGYubmIuZXZlbnRfZ2VuZXJhdGUoJzxDb250cm9sLVRhYj4nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnNlbGVjdCgpLCBzdHIoc2VsZi5jaGlsZDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuc2VsZWN0KCksIHN0cihzZWxmLmNoaWxkMikpCiAgICAgICAgIHNlbGYubmIuZXZlbnRfZ2VuZXJhdGUoJzxTaGlmdC1Db250cm9sLVRhYj4nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnNlbGVjdCgpLCBzdHIoc2VsZi5jaGlsZDEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuc2VsZWN0KCksIHN0cihzZWxmLmNoaWxkMSkpCiAgICAgICAgIHNlbGYubmIuZXZlbnRfZ2VuZXJhdGUoJzxTaGlmdC1Db250cm9sLVRhYj4nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLm5iLnNlbGVjdCgpLCBzdHIoc2VsZi5jaGlsZDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubmIuc2VsZWN0KCksIHN0cihzZWxmLmNoaWxkMikpCiAKICAgICAgICAgc2VsZi5uYi50YWIoc2VsZi5jaGlsZDEsIHRleHQ9J2EnLCB1bmRlcmxpbmU9MCkKICAgICAgICAgc2VsZi5uYi5lbmFibGVfdHJhdmVyc2FsKCkKICAgICAgICAgc2VsZi5uYi5ldmVudF9nZW5lcmF0ZSgnPEFsdC1hPicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYubmIuc2VsZWN0KCksIHN0cihzZWxmLmNoaWxkMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5uYi5zZWxlY3QoKSwgc3RyKHNlbGYuY2hpbGQxKSkKIAogCiBjbGFzcyBUcmVldmlld1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNzMwLDE3ICs3MzAsMTcgQEAKIAogICAgIGRlZiB0ZXN0X2Jib3goc2VsZik6CiAgICAgICAgIHNlbGYudHYucGFjaygpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuYmJveCgnJyksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuYmJveCgnJyksICcnKQogICAgICAgICBzZWxmLnR2LndhaXRfdmlzaWJpbGl0eSgpCiAgICAgICAgIHNlbGYudHYudXBkYXRlKCkKIAogICAgICAgICBpdGVtX2lkID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnKQogICAgICAgICBjaGlsZHJlbiA9IHNlbGYudHYuZ2V0X2NoaWxkcmVuKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNoaWxkcmVuKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2hpbGRyZW4pCiAKICAgICAgICAgYmJveCA9IHNlbGYudHYuYmJveChjaGlsZHJlblswXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKGJib3gpLCA0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShiYm94LCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGJib3gpLCA0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShiYm94LCB0dXBsZSkpCiAgICAgICAgIGZvciBpdGVtIGluIGJib3g6CiAgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShpdGVtLCBpbnQpOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiSW52YWxpZCBib3VuZGluZyBib3g6ICVzIiAlIGJib3gpCkBAIC03NTEsODYgKzc1MSw4NiBAQAogICAgICAgICBzZWxmLnR2LmNvbHVtbigndGVzdCcsIHdpZHRoPTUwKQogICAgICAgICBiYm94X2NvbHVtbjAgPSBzZWxmLnR2LmJib3goY2hpbGRyZW5bMF0sIDApCiAgICAgICAgIHJvb3Rfd2lkdGggPSBzZWxmLnR2LmNvbHVtbignIzAnLCB3aWR0aD1Ob25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiYm94X2NvbHVtbjBbMF0sIGJib3hbMF0gKyByb290X3dpZHRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJib3hfY29sdW1uMFswXSwgYmJveFswXSArIHJvb3Rfd2lkdGgpCiAKICAgICAgICAgIyB2ZXJpZnkgdGhhdCBiYm94IG9mIGEgY2xvc2VkIGl0ZW0gaXMgdGhlIGVtcHR5IHN0cmluZwogICAgICAgICBjaGlsZDEgPSBzZWxmLnR2Lmluc2VydChpdGVtX2lkLCAnZW5kJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5iYm94KGNoaWxkMSksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuYmJveChjaGlsZDEpLCAnJykKIAogCiAgICAgZGVmIHRlc3RfY2hpbGRyZW4oc2VsZik6CiAgICAgICAgICMgbm8gY2hpbGRyZW4geWV0LCBzaG91bGQgZ2V0IGFuIGVtcHR5IHR1cGxlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksICgpKQogCiAgICAgICAgIGl0ZW1faWQgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksIHR1cGxlKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKVswXSwgaXRlbV9pZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKClbMF0sIGl0ZW1faWQpCiAKICAgICAgICAgIyBhZGQgaXRlbV9pZCBhbmQgY2hpbGQzIGFzIGNoaWxkcmVuIG9mIGNoaWxkMgogICAgICAgICBjaGlsZDIgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcpCiAgICAgICAgIGNoaWxkMyA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKICAgICAgICAgc2VsZi50di5zZXRfY2hpbGRyZW4oY2hpbGQyLCBpdGVtX2lkLCBjaGlsZDMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKGNoaWxkMiksIChpdGVtX2lkLCBjaGlsZDMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKGNoaWxkMiksIChpdGVtX2lkLCBjaGlsZDMpKQogCiAgICAgICAgICMgY2hpbGQzIGhhcyBjaGlsZDIgYXMgcGFyZW50LCB0aHVzIHRyeWluZyB0byBzZXQgY2hpbGQyIGFzIGEgY2hpbGRyZW4KICAgICAgICAgIyBvZiBjaGlsZDMgc2hvdWxkIHJlc3VsdCBpbiBhbiBlcnJvcgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKICAgICAgICAgICAgIHNlbGYudHYuc2V0X2NoaWxkcmVuLCBjaGlsZDMsIGNoaWxkMikKIAogICAgICAgICAjIHJlbW92ZSBjaGlsZDIgY2hpbGRyZW4KICAgICAgICAgc2VsZi50di5zZXRfY2hpbGRyZW4oY2hpbGQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihjaGlsZDIpLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihjaGlsZDIpLCAoKSkKIAogICAgICAgICAjIHJlbW92ZSByb290J3MgY2hpbGRyZW4KICAgICAgICAgc2VsZi50di5zZXRfY2hpbGRyZW4oJycpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksICgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksICgpKQogCiAKICAgICBkZWYgdGVzdF9jb2x1bW4oc2VsZik6CiAgICAgICAgICMgcmV0dXJuIGEgZGljdCB3aXRoIGFsbCBvcHRpb25zL3ZhbHVlcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzZWxmLnR2LmNvbHVtbignIzAnKSwgZGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYudHYuY29sdW1uKCcjMCcpLCBkaWN0KSkKICAgICAgICAgIyByZXR1cm4gYSBzaW5nbGUgdmFsdWUgb2YgdGhlIGdpdmVuIG9wdGlvbgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzZWxmLnR2LmNvbHVtbignIzAnLCB3aWR0aD1Ob25lKSwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50di5jb2x1bW4oJyMwJywgd2lkdGg9Tm9uZSksIGludCkpCiAgICAgICAgICMgc2V0IGEgbmV3IHZhbHVlIGZvciBhbiBvcHRpb24KICAgICAgICAgc2VsZi50di5jb2x1bW4oJyMwJywgd2lkdGg9MTApCiAgICAgICAgICMgdGVzdGluZyBuZXcgd2F5IHRvIGdldCBvcHRpb24gdmFsdWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5jb2x1bW4oJyMwJywgJ3dpZHRoJyksIDEwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmNvbHVtbignIzAnLCB3aWR0aD1Ob25lKSwgMTApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5jb2x1bW4oJyMwJywgJ3dpZHRoJyksIDEwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuY29sdW1uKCcjMCcsIHdpZHRoPU5vbmUpLCAxMCkKICAgICAgICAgIyBjaGVjayByZWFkLW9ubHkgb3B0aW9uCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmNvbHVtbiwgJyMwJywgaWQ9J1gnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmNvbHVtbiwgJyMwJywgaWQ9J1gnKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmNvbHVtbiwgJ2ludmFsaWQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmNvbHVtbiwgJ2ludmFsaWQnKQogICAgICAgICBpbnZhbGlkX2t3cyA9IFsKICAgICAgICAgICAgIHsndW5rbm93bl9vcHRpb24nOiAnc29tZSB2YWx1ZSd9LCAgeydzdHJldGNoJzogJ3dyb25nJ30sCiAgICAgICAgICAgICB7J2FuY2hvcic6ICd3cm9uZyd9LCB7J3dpZHRoJzogJ3dyb25nJ30sIHsnbWlud2lkdGgnOiAnd3JvbmcnfQogICAgICAgICBdCiAgICAgICAgIGZvciBrdyBpbiBpbnZhbGlkX2t3czoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmNvbHVtbiwgJyMwJywKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuY29sdW1uLCAnIzAnLAogICAgICAgICAgICAgICAgICoqa3cpCiAKIAogICAgIGRlZiB0ZXN0X2RlbGV0ZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuZGVsZXRlLCAnIzAnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmRlbGV0ZSwgJyMwJykKIAogICAgICAgICBpdGVtX2lkID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnKQogICAgICAgICBpdGVtMiA9IHNlbGYudHYuaW5zZXJ0KGl0ZW1faWQsICdlbmQnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoaXRlbV9pZCwgKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oaXRlbV9pZCksIChpdGVtMiwgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoaXRlbV9pZCwgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihpdGVtX2lkKSwgKGl0ZW0yLCApKQogCiAgICAgICAgIHNlbGYudHYuZGVsZXRlKGl0ZW1faWQpCi0gICAgICAgIHNlbGYuZmFpbElmKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi50di5nZXRfY2hpbGRyZW4oKSkKIAogICAgICAgICAjIHJlYXR0YWNoIHNob3VsZCBmYWlsCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLAogICAgICAgICAgICAgc2VsZi50di5yZWF0dGFjaCwgaXRlbV9pZCwgJycsICdlbmQnKQogCiAgICAgICAgICMgdGVzdCBtdWx0aXBsZSBpdGVtIGRlbGV0ZQogICAgICAgICBpdGVtMSA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKICAgICAgICAgaXRlbTIgPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksIChpdGVtMSwgaXRlbTIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKCksIChpdGVtMSwgaXRlbTIpKQogCiAgICAgICAgIHNlbGYudHYuZGVsZXRlKGl0ZW0xLCBpdGVtMikKLSAgICAgICAgc2VsZi5mYWlsSWYoc2VsZi50di5nZXRfY2hpbGRyZW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR2LmdldF9jaGlsZHJlbigpKQogCiAKICAgICBkZWYgdGVzdF9kZXRhY2hfcmVhdHRhY2goc2VsZik6CkBAIC04NDAsODEgKzg0MCw4MSBAQAogICAgICAgICAjIGNhbGxpbmcgZGV0YWNoIHdpdGhvdXQgaXRlbXMgaXMgdmFsaWQsIGFsdGhvdWdoIGl0IGRvZXMgbm90aGluZwogICAgICAgICBwcmV2ID0gc2VsZi50di5nZXRfY2hpbGRyZW4oKQogICAgICAgICBzZWxmLnR2LmRldGFjaCgpICMgdGhpcyBzaG91bGQgZG8gbm90aGluZwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChwcmV2LCBzZWxmLnR2LmdldF9jaGlsZHJlbigpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHByZXYsIHNlbGYudHYuZ2V0X2NoaWxkcmVuKCkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKGl0ZW1faWQsICkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKGl0ZW1faWQpLCAoaXRlbTIsICkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKGl0ZW1faWQsICkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oaXRlbV9pZCksIChpdGVtMiwgKSkKIAogICAgICAgICAjIGRldGFjaCBpdGVtIHdpdGggY2hpbGRyZW4KICAgICAgICAgc2VsZi50di5kZXRhY2goaXRlbV9pZCkKLSAgICAgICAgc2VsZi5mYWlsSWYoc2VsZi50di5nZXRfY2hpbGRyZW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR2LmdldF9jaGlsZHJlbigpKQogCiAgICAgICAgICMgcmVhdHRhY2ggaXRlbSB3aXRoIGNoaWxkcmVuCiAgICAgICAgIHNlbGYudHYucmVhdHRhY2goaXRlbV9pZCwgJycsICdlbmQnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoaXRlbV9pZCwgKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oaXRlbV9pZCksIChpdGVtMiwgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoaXRlbV9pZCwgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihpdGVtX2lkKSwgKGl0ZW0yLCApKQogCiAgICAgICAgICMgbW92ZSBhIGNoaWxkcmVuIHRvIHRoZSByb290CiAgICAgICAgIHNlbGYudHYubW92ZShpdGVtMiwgJycsICdlbmQnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoaXRlbV9pZCwgaXRlbTIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihpdGVtX2lkKSwgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKGl0ZW1faWQsIGl0ZW0yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihpdGVtX2lkKSwgKCkpCiAKICAgICAgICAgIyBiYWQgdmFsdWVzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLAogICAgICAgICAgICAgc2VsZi50di5yZWF0dGFjaCwgJ25vbmV4aXN0ZW50JywgJycsICdlbmQnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKICAgICAgICAgICAgIHNlbGYudHYuZGV0YWNoLCAnbm9uZXhpc3RlbnQnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwKICAgICAgICAgICAgIHNlbGYudHYucmVhdHRhY2gsIGl0ZW0yLCAnb3RoZXJwYXJlbnQnLCAnZW5kJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsCiAgICAgICAgICAgICBzZWxmLnR2LnJlYXR0YWNoLCBpdGVtMiwgJycsICdpbnZhbGlkJykKIAogICAgICAgICAjIG11bHRpcGxlIGRldGFjaAogICAgICAgICBzZWxmLnR2LmRldGFjaChpdGVtX2lkLCBpdGVtMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5nZXRfY2hpbGRyZW4oKSwgKCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuZ2V0X2NoaWxkcmVuKGl0ZW1faWQpLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbigpLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmdldF9jaGlsZHJlbihpdGVtX2lkKSwgKCkpCiAKIAogICAgIGRlZiB0ZXN0X2V4aXN0cyhzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5leGlzdHMoJ3NvbWV0aGluZycpLCBGYWxzZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5leGlzdHMoJycpLCBUcnVlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmV4aXN0cyh7fSksIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZXhpc3RzKCdzb21ldGhpbmcnKSwgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5leGlzdHMoJycpLCBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZXhpc3RzKHt9KSwgRmFsc2UpCiAKICAgICAgICAgIyB0aGUgZm9sbG93aW5nIHdpbGwgbWFrZSBhIHRrLmNhbGwgZXF1aXZhbGVudCB0bwogICAgICAgICAjIHRrLmNhbGwodHJlZXZpZXcsICJleGlzdHMiKSB3aGljaCBzaG91bGQgcmVzdWx0IGluIGFuIGVycm9yCiAgICAgICAgICMgaW4gdGhlIHRjbCBpbnRlcnByZXRlciBzaW5jZSB0ayByZXF1aXJlcyBhbiBpdGVtLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5leGlzdHMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuZXhpc3RzLCBOb25lKQogCiAKICAgICBkZWYgdGVzdF9mb2N1cyhzZWxmKToKICAgICAgICAgIyBub3RoaW5nIGlzIGZvY3VzZWQgcmlnaHQgbm93Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuZm9jdXMoKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5mb2N1cygpLCAnJykKIAogICAgICAgICBpdGVtMSA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKICAgICAgICAgc2VsZi50di5mb2N1cyhpdGVtMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5mb2N1cygpLCBpdGVtMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmZvY3VzKCksIGl0ZW0xKQogCiAgICAgICAgIHNlbGYudHYuZGVsZXRlKGl0ZW0xKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmZvY3VzKCksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuZm9jdXMoKSwgJycpCiAKICAgICAgICAgIyB0cnkgZm9jdXNpbmcgaW5leGlzdGVudCBpdGVtCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmZvY3VzLCAnaGknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmZvY3VzLCAnaGknKQogCiAKICAgICBkZWYgdGVzdF9oZWFkaW5nKHNlbGYpOgogICAgICAgICAjIGNoZWNrIGEgZGljdCBpcyByZXR1cm5lZAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzZWxmLnR2LmhlYWRpbmcoJyMwJyksIGRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnR2LmhlYWRpbmcoJyMwJyksIGRpY3QpKQogCiAgICAgICAgICMgY2hlY2sgYSB2YWx1ZSBpcyByZXR1cm5lZAogICAgICAgICBzZWxmLnR2LmhlYWRpbmcoJyMwJywgdGV4dD0naGknKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmhlYWRpbmcoJyMwJywgJ3RleHQnKSwgJ2hpJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5oZWFkaW5nKCcjMCcsIHRleHQ9Tm9uZSksICdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5oZWFkaW5nKCcjMCcsICd0ZXh0JyksICdoaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5oZWFkaW5nKCcjMCcsIHRleHQ9Tm9uZSksICdoaScpCiAKICAgICAgICAgIyBpbnZhbGlkIG9wdGlvbgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5oZWFkaW5nLCAnIzAnLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmhlYWRpbmcsICcjMCcsCiAgICAgICAgICAgICBiYWNrZ3JvdW5kPU5vbmUpCiAgICAgICAgICMgaW52YWxpZCB2YWx1ZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5oZWFkaW5nLCAnIzAnLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LmhlYWRpbmcsICcjMCcsCiAgICAgICAgICAgICBhbmNob3I9MSkKIAogCkBAIC05NDAsNyArOTQwLDcgQEAKICAgICAgICAgc3VjY2VzcyA9IFtdCiAgICAgICAgIGNvbW1hbmRzID0gc2VsZi50di5tYXN0ZXIuX3RjbENvbW1hbmRzCiAgICAgICAgIHNlbGYudHYuaGVhZGluZygnIzAnLCBjb21tYW5kPXN0cihzZWxmLnR2LmhlYWRpbmcoJyMwJywgY29tbWFuZD1Ob25lKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGNvbW1hbmRzLCBzZWxmLnR2Lm1hc3Rlci5fdGNsQ29tbWFuZHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29tbWFuZHMsIHNlbGYudHYubWFzdGVyLl90Y2xDb21tYW5kcykKICAgICAgICAgc2ltdWxhdGVfaGVhZGluZ19jbGljayg1LCA1KQogICAgICAgICBpZiBub3Qgc3VjY2VzczoKICAgICAgICAgICAgIHNlbGYuZmFpbCgiVGhlIGNvbW1hbmQgYXNzb2NpYXRlZCB0byB0aGUgdHJlZXZpZXcgaGVhZGluZyB3YXNuJ3QgIgpAQCAtOTU0LDkyICs5NTQsOTIgQEAKIAogICAgIGRlZiB0ZXN0X2luZGV4KHNlbGYpOgogICAgICAgICAjIGl0ZW0gJ3doYXQnIGRvZXNuJ3QgZXhpc3QKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5kZXgsICd3aGF0JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5pbmRleCwgJ3doYXQnKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuaW5kZXgoJycpLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaW5kZXgoJycpLCAwKQogCiAgICAgICAgIGl0ZW0xID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnKQogICAgICAgICBpdGVtMiA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJykKICAgICAgICAgYzEgPSBzZWxmLnR2Lmluc2VydChpdGVtMSwgJ2VuZCcpCiAgICAgICAgIGMyID0gc2VsZi50di5pbnNlcnQoaXRlbTEsICdlbmQnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmluZGV4KGl0ZW0xKSwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5pbmRleChjMSksIDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuaW5kZXgoYzIpLCAxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmluZGV4KGl0ZW0yKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmluZGV4KGl0ZW0xKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmluZGV4KGMxKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmluZGV4KGMyKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LmluZGV4KGl0ZW0yKSwgMSkKIAogICAgICAgICBzZWxmLnR2Lm1vdmUoaXRlbTIsICcnLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LmluZGV4KGl0ZW0yKSwgMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5pbmRleChpdGVtMSksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pbmRleChpdGVtMiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pbmRleChpdGVtMSksIDEpCiAKICAgICAgICAgIyBjaGVjayB0aGF0IGluZGV4IHN0aWxsIHdvcmtzIGV2ZW4gYWZ0ZXIgaXRzIHBhcmVudCBhbmQgc2libGluZ3MKICAgICAgICAgIyBoYXZlIGJlZW4gZGV0YWNoZWQKICAgICAgICAgc2VsZi50di5kZXRhY2goaXRlbTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuaW5kZXgoYzIpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaW5kZXgoYzIpLCAxKQogICAgICAgICBzZWxmLnR2LmRldGFjaChjMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5pbmRleChjMiksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pbmRleChjMiksIDApCiAKICAgICAgICAgIyBidXQgaXQgZmFpbHMgYWZ0ZXIgaXRlbSBoYXMgYmVlbiBkZWxldGVkCiAgICAgICAgIHNlbGYudHYuZGVsZXRlKGl0ZW0xKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5pbmRleCwgYzIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5kZXgsIGMyKQogCiAKICAgICBkZWYgdGVzdF9pbnNlcnRfaXRlbShzZWxmKToKICAgICAgICAgIyBwYXJlbnQgJ25vbmUnIGRvZXNuJ3QgZXhpc3QKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnbm9uZScsICdlbmQnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2Lmluc2VydCwgJ25vbmUnLCAnZW5kJykKIAogICAgICAgICAjIG9wZW4gdmFsdWVzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2Lmluc2VydCwgJycsICdlbmQnLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2Lmluc2VydCwgJycsICdlbmQnLAogICAgICAgICAgICAgb3Blbj0nJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnJywgJ2VuZCcsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnJywgJ2VuZCcsCiAgICAgICAgICAgICBvcGVuPSdwbGVhc2UnKQotICAgICAgICBzZWxmLmZhaWxJZihzZWxmLnR2LmRlbGV0ZShzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIG9wZW49VHJ1ZSkpKQotICAgICAgICBzZWxmLmZhaWxJZihzZWxmLnR2LmRlbGV0ZShzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIG9wZW49RmFsc2UpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR2LmRlbGV0ZShzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIG9wZW49VHJ1ZSkpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYudHYuZGVsZXRlKHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgb3Blbj1GYWxzZSkpKQogCiAgICAgICAgICMgaW52YWxpZCBpbmRleAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5pbnNlcnQsICcnLCAnbWlkZGxlJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5pbnNlcnQsICcnLCAnbWlkZGxlJykKIAogICAgICAgICAjIHRyeWluZyB0byBkdXBsaWNhdGUgaXRlbSBpZCBpcyBpbnZhbGlkCiAgICAgICAgIGl0ZW1pZCA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgJ2ZpcnN0LWl0ZW0nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChpdGVtaWQsICdmaXJzdC1pdGVtJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnJywgJ2VuZCcsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbWlkLCAnZmlyc3QtaXRlbScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuaW5zZXJ0LCAnJywgJ2VuZCcsCiAgICAgICAgICAgICAnZmlyc3QtaXRlbScpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2Lmluc2VydCwgJycsICdlbmQnLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2Lmluc2VydCwgJycsICdlbmQnLAogICAgICAgICAgICAgTW9ja1RjbE9iaignZmlyc3QtaXRlbScpKQogCiAgICAgICAgICMgdW5pY29kZSB2YWx1ZXMKICAgICAgICAgdmFsdWUgPSB1J1x4ZTFiYScKICAgICAgICAgaXRlbSA9IHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgdmFsdWVzPSh2YWx1ZSwgKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5pdGVtKGl0ZW0sICd2YWx1ZXMnKSwgKHZhbHVlLCApKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLCAodmFsdWUsICkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKGl0ZW0sICd2YWx1ZXMnKSwgKHZhbHVlLCApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICh2YWx1ZSwgKSkKIAogICAgICAgICBzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPWxpc3Qoc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1Ob25lKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICh2YWx1ZSwgKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLCAodmFsdWUsICkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc2VsZi50di5pdGVtKGl0ZW0pLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50di5pdGVtKGl0ZW0pLCBkaWN0KSkKIAogICAgICAgICAjIGVyYXNlIGl0ZW0gdmFsdWVzCiAgICAgICAgIHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9JycpCi0gICAgICAgIHNlbGYuZmFpbElmKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi50di5pdGVtKGl0ZW0sIHZhbHVlcz1Ob25lKSkKIAogICAgICAgICAjIGl0ZW0gdGFncwogICAgICAgICBpdGVtID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCB0YWdzPVsxLCAyLCB2YWx1ZV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB0YWdzPU5vbmUpLCAoJzEnLCAnMicsIHZhbHVlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz1Ob25lKSwgKCcxJywgJzInLCB2YWx1ZSkpCiAgICAgICAgIHNlbGYudHYuaXRlbShpdGVtLCB0YWdzPVtdKQotICAgICAgICBzZWxmLmZhaWxJZihzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz1Ob25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz1Ob25lKSkKICAgICAgICAgc2VsZi50di5pdGVtKGl0ZW0sIHRhZ3M9KDEsIDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz1Ob25lKSwgKCcxJywgJzInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdGFncz1Ob25lKSwgKCcxJywgJzInKSkKIAogICAgICAgICAjIHZhbHVlcyB3aXRoIHNwYWNlcwogICAgICAgICBpdGVtID0gc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCB2YWx1ZXM9KCdhIGIgYycsCiAgICAgICAgICAgICAnJXMgJXMnICUgKHZhbHVlLCB2YWx1ZSkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksCiAgICAgICAgICAgICAoJ2EgYiBjJywgJyVzICVzJyAlICh2YWx1ZSwgdmFsdWUpKSkKIAogICAgICAgICAjIHRleHQKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5pdGVtKAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbSgKICAgICAgICAgICAgIHNlbGYudHYuaW5zZXJ0KCcnLCAnZW5kJywgdGV4dD0iTGFiZWwgaGVyZSIpLCB0ZXh0PU5vbmUpLAogICAgICAgICAgICAgIkxhYmVsIGhlcmUiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2Lml0ZW0oCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5pdGVtKAogICAgICAgICAgICAgc2VsZi50di5pbnNlcnQoJycsICdlbmQnLCB0ZXh0PXZhbHVlKSwgdGV4dD1Ob25lKSwKICAgICAgICAgICAgIHZhbHVlKQogCkBAIC0xMDQ3LDI5ICsxMDQ3LDI5IEBACiAgICAgZGVmIHRlc3Rfc2V0KHNlbGYpOgogICAgICAgICBzZWxmLnR2Wydjb2x1bW5zJ10gPSBbJ0EnLCAnQiddCiAgICAgICAgIGl0ZW0gPSBzZWxmLnR2Lmluc2VydCgnJywgJ2VuZCcsIHZhbHVlcz1bJ2EnLCAnYiddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LnNldChpdGVtKSwgeydBJzogJ2EnLCAnQic6ICdiJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZXQoaXRlbSksIHsnQSc6ICdhJywgJ0InOiAnYid9KQogCiAgICAgICAgIHNlbGYudHYuc2V0KGl0ZW0sICdCJywgJ2EnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLCAoJ2EnLCAnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICgnYScsICdhJykpCiAKICAgICAgICAgc2VsZi50dlsnY29sdW1ucyddID0gWydCJ10KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di5zZXQoaXRlbSksIHsnQic6ICdhJ30pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZXQoaXRlbSksIHsnQic6ICdhJ30pCiAKICAgICAgICAgc2VsZi50di5zZXQoaXRlbSwgJ0InLCAnYicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuc2V0KGl0ZW0sIGNvbHVtbj0nQicpLCAnYicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICgnYicsICdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi50di5zZXQoaXRlbSwgY29sdW1uPSdCJyksICdiJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLCAoJ2InLCAnYScpKQogCiAgICAgICAgIHNlbGYudHYuc2V0KGl0ZW0sICdCJywgMTIzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LnNldChpdGVtLCAnQicpLCAxMjMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuaXRlbShpdGVtLCB2YWx1ZXM9Tm9uZSksICgxMjMsICdhJykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYudHYuc2V0KGl0ZW0pLCB7J0InOiAxMjN9KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2V0KGl0ZW0sICdCJyksIDEyMykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2Lml0ZW0oaXRlbSwgdmFsdWVzPU5vbmUpLCAoMTIzLCAnYScpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYuc2V0KGl0ZW0pLCB7J0InOiAxMjN9KQogCiAgICAgICAgICMgaW5leGlzdGVudCBjb2x1bW4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuc2V0LCBpdGVtLCAnQScpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUa2ludGVyLlRjbEVycm9yLCBzZWxmLnR2LnNldCwgaXRlbSwgJ0EnLCAnYicpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuc2V0LCBpdGVtLCAnQScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuc2V0LCBpdGVtLCAnQScsICdiJykKIAogICAgICAgICAjIGluZXhpc3RlbnQgaXRlbQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di5zZXQsICdub3RtZScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFRraW50ZXIuVGNsRXJyb3IsIHNlbGYudHYuc2V0LCAnbm90bWUnKQogCiAKICAgICBkZWYgdGVzdF90YWdfYmluZChzZWxmKToKQEAgLTEwOTUsMjggKzEwOTUsMjggQEAKICAgICAgICAgICAgICAgICBwb3NfeS5hZGQoaSkKICAgICAgICAgICAgICAgICBmb3VuZC5hZGQoaXRlbV9pZCkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocG9zX3kpLCAyKSAjIGl0ZW0xIGFuZCBpdGVtMiB5IHBvcworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwb3NfeSksIDIpICMgaXRlbTEgYW5kIGl0ZW0yIHkgcG9zCiAgICAgICAgIGZvciB5IGluIHBvc195OgogICAgICAgICAgICAgc3VwcG9ydC5zaW11bGF0ZV9tb3VzZV9jbGljayhzZWxmLnR2LCAwLCB5KQogCiAgICAgICAgICMgYnkgbm93IHRoZXJlIHNob3VsZCBiZSA0IHRoaW5ncyBpbiB0aGUgZXZlbnRzIGxpc3QsIHNpbmNlIGVhY2gKICAgICAgICAgIyBpdGVtIGhhZCBhIGJpbmQgZm9yIHR3byBldmVudHMgdGhhdCB3ZXJlIHNpbXVsYXRlZCBhYm92ZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4oZXZlbnRzKSwgNCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZXZlbnRzKSwgNCkKICAgICAgICAgZm9yIGV2dCBpbiB6aXAoZXZlbnRzWzo6Ml0sIGV2ZW50c1sxOjoyXSk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChldnQsICgxLCAyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZ0LCAoMSwgMikpCiAKIAogICAgIGRlZiB0ZXN0X3RhZ19jb25maWd1cmUoc2VsZik6CiAgICAgICAgICMgSnVzdCB0ZXN0aW5nIHBhcmFtZXRlciBwYXNzaW5nIGZvciBub3cKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgc2VsZi50di50YWdfY29uZmlndXJlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di50YWdfY29uZmlndXJlLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYudHYudGFnX2NvbmZpZ3VyZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVGtpbnRlci5UY2xFcnJvciwgc2VsZi50di50YWdfY29uZmlndXJlLAogICAgICAgICAgICAgJ3Rlc3QnLCBza3k9J2JsdWUnKQogICAgICAgICBzZWxmLnR2LnRhZ19jb25maWd1cmUoJ3Rlc3QnLCBmb3JlZ3JvdW5kPSdibHVlJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi50di50YWdfY29uZmlndXJlKCd0ZXN0JywgJ2ZvcmVncm91bmQnKSwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR2LnRhZ19jb25maWd1cmUoJ3Rlc3QnLCAnZm9yZWdyb3VuZCcpLAogICAgICAgICAgICAgJ2JsdWUnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLnR2LnRhZ19jb25maWd1cmUoJ3Rlc3QnLCBmb3JlZ3JvdW5kPU5vbmUpLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHYudGFnX2NvbmZpZ3VyZSgndGVzdCcsIGZvcmVncm91bmQ9Tm9uZSksCiAgICAgICAgICAgICAnYmx1ZScpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHNlbGYudHYudGFnX2NvbmZpZ3VyZSgndGVzdCcpLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50di50YWdfY29uZmlndXJlKCd0ZXN0JyksIGRpY3QpKQogCiAKIHRlc3RzX2d1aSA9ICgKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L21hcHBpbmdfdGVzdHMucHkgYi9MaWIvdGVzdC9tYXBwaW5nX3Rlc3RzLnB5CmluZGV4IGM2ODU3YWIuLjdlYzRiYjEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L21hcHBpbmdfdGVzdHMucHkKKysrIGIvTGliL3Rlc3QvbWFwcGluZ190ZXN0cy5weQpAQCAtNTAsMTcgKzUwLDE3IEBACiAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYucmVmZXJlbmNlLml0ZW1zKCk6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRba2V5XSwgdmFsdWUpCiAgICAgICAgIGtub3dua2V5ID0gc2VsZi5vdGhlci5rZXlzKClbMF0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEtleUVycm9yLCBsYW1iZGE6ZFtrbm93bmtleV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6ZFtrbm93bmtleV0pCiAgICAgICAgICNsZW4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocCksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGQpLCBsZW4oc2VsZi5yZWZlcmVuY2UpKQogICAgICAgICAjaGFzX2tleQogICAgICAgICBmb3IgayBpbiBzZWxmLnJlZmVyZW5jZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhkLmhhc19rZXkoaykpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oayBpbiBkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuaGFzX2tleShrKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrIGluIGQpCiAgICAgICAgIGZvciBrIGluIHNlbGYub3RoZXI6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihkLmhhc19rZXkoaykpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihrIGluIGQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGQuaGFzX2tleShrKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoayBpbiBkKQogICAgICAgICAjY21wCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHAscCksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKGQsZCksIDApCkBAIC03MSwxMCArNzEsMTAgQEAKICAgICAgICAgaWYgbm90IGQ6IHNlbGYuZmFpbCgiRnVsbCBtYXBwaW5nIG11c3QgY29tcGFyZSB0byBUcnVlIikKICAgICAgICAgIyBrZXlzKCksIGl0ZW1zKCksIGl0ZXJrZXlzKCkgLi4uCiAgICAgICAgIGRlZiBjaGVja19pdGVyYW5kbGlzdChpdGVyLCBsc3QsIHJlZik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihpdGVyLCAnbmV4dCcpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoaXRlciwgJ19faXRlcl9fJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihpdGVyLCAnbmV4dCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoaXRlciwgJ19faXRlcl9fJykpCiAgICAgICAgICAgICB4ID0gbGlzdChpdGVyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNldCh4KT09c2V0KGxzdCk9PXNldChyZWYpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldCh4KT09c2V0KGxzdCk9PXNldChyZWYpKQogICAgICAgICBjaGVja19pdGVyYW5kbGlzdChkLml0ZXJrZXlzKCksIGQua2V5cygpLCBzZWxmLnJlZmVyZW5jZS5rZXlzKCkpCiAgICAgICAgIGNoZWNrX2l0ZXJhbmRsaXN0KGl0ZXIoZCksIGQua2V5cygpLCBzZWxmLnJlZmVyZW5jZS5rZXlzKCkpCiAgICAgICAgIGNoZWNrX2l0ZXJhbmRsaXN0KGQuaXRlcnZhbHVlcygpLCBkLnZhbHVlcygpLCBzZWxmLnJlZmVyZW5jZS52YWx1ZXMoKSkKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAgICAga25vd25rZXksIGtub3dudmFsdWUgPSBzZWxmLm90aGVyLml0ZXJpdGVtcygpLm5leHQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KGtleSwga25vd252YWx1ZSksIHZhbHVlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KGtub3dua2V5LCBrbm93bnZhbHVlKSwga25vd252YWx1ZSkKLSAgICAgICAgc2VsZi5mYWlsSWYoa25vd25rZXkgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShrbm93bmtleSBpbiBkKQogCiAgICAgZGVmIHRlc3Rfd3JpdGUoc2VsZik6CiAgICAgICAgICMgVGVzdCBmb3Igd3JpdGUgb3BlcmF0aW9ucyBvbiBtYXBwaW5nCkBAIC05NSw3ICs5NSw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHBba2V5XSwgdmFsdWUpCiAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5yZWZlcmVuY2Uua2V5cygpOgogICAgICAgICAgICAgZGVsIHBba2V5XQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKEtleUVycm9yLCBsYW1iZGE6cFtrZXldKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTpwW2tleV0pCiAgICAgICAgIHAgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKICAgICAgICAgI3VwZGF0ZQogICAgICAgICBwLnVwZGF0ZShzZWxmLnJlZmVyZW5jZSkKQEAgLTExNCwxNiArMTE0LDE2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFtrbm93bmtleV0sIGtub3dudmFsdWUpCiAgICAgICAgICNwb3AKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBvcChrbm93bmtleSksIGtub3dudmFsdWUpCi0gICAgICAgIHNlbGYuZmFpbElmKGtub3dua2V5IGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoa25vd25rZXkgaW4gZCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGQucG9wLCBrbm93bmtleSkKICAgICAgICAgZGVmYXVsdCA9IDkwOQogICAgICAgICBkW2tub3dua2V5XSA9IGtub3dudmFsdWUKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBvcChrbm93bmtleSwgZGVmYXVsdCksIGtub3dudmFsdWUpCi0gICAgICAgIHNlbGYuZmFpbElmKGtub3dua2V5IGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoa25vd25rZXkgaW4gZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBvcChrbm93bmtleSwgZGVmYXVsdCksIGRlZmF1bHQpCiAgICAgICAgICNwb3BpdGVtCiAgICAgICAgIGtleSwgdmFsdWUgPSBkLnBvcGl0ZW0oKQotICAgICAgICBzZWxmLmZhaWxJZihrZXkgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShrZXkgaW4gZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgc2VsZi5yZWZlcmVuY2Vba2V5XSkKICAgICAgICAgcD1zZWxmLl9lbXB0eV9tYXBwaW5nKCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHAucG9waXRlbSkKQEAgLTEzMiwxNyArMTMyLDE3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fZW1wdHlfbWFwcGluZygpLCBzZWxmLl9lbXB0eV9tYXBwaW5nKCkpCiAKICAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8obm90IHNlbGYuX2VtcHR5X21hcHBpbmcoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYucmVmZXJlbmNlKQotICAgICAgICBzZWxmLmFzc2VydF8oYm9vbChzZWxmLl9lbXB0eV9tYXBwaW5nKCkpIGlzIEZhbHNlKQotICAgICAgICBzZWxmLmFzc2VydF8oYm9vbChzZWxmLnJlZmVyZW5jZSkgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLl9lbXB0eV9tYXBwaW5nKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnJlZmVyZW5jZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJvb2woc2VsZi5fZW1wdHlfbWFwcGluZygpKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJvb2woc2VsZi5yZWZlcmVuY2UpIGlzIFRydWUpCiAKICAgICBkZWYgdGVzdF9rZXlzKHNlbGYpOgogICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5rZXlzKCksIFtdKQogICAgICAgICBkID0gc2VsZi5yZWZlcmVuY2UKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuaW5tYXBwaW5nLmtleXMoKVswXSBpbiBkLmtleXMoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYub3RoZXIua2V5cygpWzBdIG5vdCBpbiBkLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuaW5tYXBwaW5nLmtleXMoKVswXSBpbiBkLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYub3RoZXIua2V5cygpWzBdIG5vdCBpbiBkLmtleXMoKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmtleXMsIE5vbmUpCiAKICAgICBkZWYgdGVzdF92YWx1ZXMoc2VsZik6CkBAIC0yNjgsMTAgKzI2OCwxMCBAQAogCiAgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgogICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkLmdldChzZWxmLm90aGVyLmtleXMoKVswXSkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZ2V0KHNlbGYub3RoZXIua2V5cygpWzBdKSBpcyBOb25lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KHNlbGYub3RoZXIua2V5cygpWzBdLCAzKSwgMykKICAgICAgICAgZCA9IHNlbGYucmVmZXJlbmNlCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkLmdldChzZWxmLm90aGVyLmtleXMoKVswXSkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZ2V0KHNlbGYub3RoZXIua2V5cygpWzBdKSBpcyBOb25lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KHNlbGYub3RoZXIua2V5cygpWzBdLCAzKSwgMykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChzZWxmLmlubWFwcGluZy5rZXlzKClbMF0pLCBzZWxmLmlubWFwcGluZy52YWx1ZXMoKVswXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChzZWxmLmlubWFwcGluZy5rZXlzKClbMF0sIDMpLCBzZWxmLmlubWFwcGluZy52YWx1ZXMoKVswXSkKQEAgLTMwMiwxNSArMzAyLDE1IEBACiBjbGFzcyBUZXN0TWFwcGluZ1Byb3RvY29sKEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbCk6CiAgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CiAgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X2NvbnN0cnVjdG9yKHNlbGYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9lbXB0eV9tYXBwaW5nKCkgaXMgbm90IHNlbGYuX2VtcHR5X21hcHBpbmcoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2VtcHR5X21hcHBpbmcoKSBpcyBub3Qgc2VsZi5fZW1wdHlfbWFwcGluZygpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYudHlwZTJ0ZXN0KHg9MSwgeT0yKSwgeyJ4IjogMSwgInkiOiAyfSkKIAogICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CiAgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X2Jvb2woc2VsZikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBzZWxmLl9lbXB0eV9tYXBwaW5nKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9mdWxsX21hcHBpbmcoeyJ4IjogInkifSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhib29sKHNlbGYuX2VtcHR5X21hcHBpbmcoKSkgaXMgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhib29sKHNlbGYuX2Z1bGxfbWFwcGluZyh7IngiOiAieSJ9KSkgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLl9lbXB0eV9tYXBwaW5nKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9mdWxsX21hcHBpbmcoeyJ4IjogInkifSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShib29sKHNlbGYuX2VtcHR5X21hcHBpbmcoKSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShib29sKHNlbGYuX2Z1bGxfbWFwcGluZyh7IngiOiAieSJ9KSkgaXMgVHJ1ZSkKIAogICAgIGRlZiB0ZXN0X2tleXMoc2VsZik6CiAgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X2tleXMoc2VsZikKQEAgLTMxOCw5ICszMTgsOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQua2V5cygpLCBbXSkKICAgICAgICAgZCA9IHNlbGYuX2Z1bGxfbWFwcGluZyh7J2EnOiAxLCAnYic6IDJ9KQogICAgICAgICBrID0gZC5rZXlzKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBpbiBrKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2InIGluIGspCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYycgbm90IGluIGspCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYScgaW4gaykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdiJyBpbiBrKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2MnIG5vdCBpbiBrKQogCiAgICAgZGVmIHRlc3RfdmFsdWVzKHNlbGYpOgogICAgICAgICBCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wudGVzdF92YWx1ZXMoc2VsZikKQEAgLTMzNSw3ICszMzUsNyBAQAogCiAgICAgZGVmIHRlc3RfaGFzX2tleShzZWxmKToKICAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGQuaGFzX2tleSgnYScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGQuaGFzX2tleSgnYScpKQogICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsnYSc6IDEsICdiJzogMn0pCiAgICAgICAgIGsgPSBkLmtleXMoKQogICAgICAgICBrLnNvcnQoKQpAQCAtMzQ1LDEyICszNDUsMTIgQEAKIAogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgogICAgICAgICBkID0gc2VsZi5fZW1wdHlfbWFwcGluZygpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKCdhJyBpbiBkKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBub3QgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoJ2EnIGluIGQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIG5vdCBpbiBkKQogICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsnYSc6IDEsICdiJzogMn0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYScgaW4gZCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdiJyBpbiBkKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2MnIG5vdCBpbiBkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYicgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdjJyBub3QgaW4gZCkKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuX19jb250YWluc19fKQogCkBAIC00MjksNyArNDI5LDcgQEAKICAgICBkZWYgdGVzdF9mcm9ta2V5cyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLnR5cGUydGVzdC5mcm9ta2V5cygnYWJjJyksIHsnYSc6Tm9uZSwgJ2InOk5vbmUsICdjJzpOb25lfSkKICAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQotICAgICAgICBzZWxmLmFzc2VydF8obm90KGQuZnJvbWtleXMoJ2FiYycpIGlzIGQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90KGQuZnJvbWtleXMoJ2FiYycpIGlzIGQpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZnJvbWtleXMoJ2FiYycpLCB7J2EnOk5vbmUsICdiJzpOb25lLCAnYyc6Tm9uZX0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mcm9ta2V5cygoNCw1KSwwKSwgezQ6MCwgNTowfSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZyb21rZXlzKFtdKSwge30pCkBAIC00NDAsMTcgKzQ0MCwxNyBAQAogICAgICAgICBjbGFzcyBkaWN0bGlrZShzZWxmLnR5cGUydGVzdCk6IHBhc3MKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaWN0bGlrZS5mcm9ta2V5cygnYScpLCB7J2EnOk5vbmV9KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3RsaWtlKCkuZnJvbWtleXMoJ2EnKSwgeydhJzpOb25lfSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRpY3RsaWtlLmZyb21rZXlzKCdhJykuX19jbGFzc19fIGlzIGRpY3RsaWtlKQotICAgICAgICBzZWxmLmFzc2VydF8oZGljdGxpa2UoKS5mcm9ta2V5cygnYScpLl9fY2xhc3NfXyBpcyBkaWN0bGlrZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpY3RsaWtlLmZyb21rZXlzKCdhJykuX19jbGFzc19fIGlzIGRpY3RsaWtlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGljdGxpa2UoKS5mcm9ta2V5cygnYScpLl9fY2xhc3NfXyBpcyBkaWN0bGlrZSkKICAgICAgICAgIyBGSVhNRTogdGhlIGZvbGxvd2luZyB3b24ndCB3b3JrIHdpdGggVXNlckRpY3QsIGJlY2F1c2UgaXQncyBhbiBvbGQgc3R5bGUgY2xhc3MKLSAgICAgICAgIyBzZWxmLmFzc2VydF8odHlwZShkaWN0bGlrZS5mcm9ta2V5cygnYScpKSBpcyBkaWN0bGlrZSkKKyAgICAgICAgIyBzZWxmLmFzc2VydFRydWUodHlwZShkaWN0bGlrZS5mcm9ta2V5cygnYScpKSBpcyBkaWN0bGlrZSkKICAgICAgICAgY2xhc3MgbXlkaWN0KHNlbGYudHlwZTJ0ZXN0KToKICAgICAgICAgICAgIGRlZiBfX25ld19fKGNscyk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIFVzZXJEaWN0LlVzZXJEaWN0KCkKICAgICAgICAgdWQgPSBteWRpY3QuZnJvbWtleXMoJ2FiJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1ZCwgeydhJzpOb25lLCAnYic6Tm9uZX0pCiAgICAgICAgICMgRklYTUU6IHRoZSBmb2xsb3dpbmcgd29uJ3Qgd29yayB3aXRoIFVzZXJEaWN0LCBiZWNhdXNlIGl0J3MgYW4gb2xkIHN0eWxlIGNsYXNzCi0gICAgICAgICMgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodWQsIFVzZXJEaWN0LlVzZXJEaWN0KSkKKyAgICAgICAgIyBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh1ZCwgVXNlckRpY3QuVXNlckRpY3QpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRpY3QuZnJvbWtleXMpCiAKICAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKQEAgLTQ4MCwxNiArNDgwLDE2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5jb3B5KCksIHsxOjEsIDI6MiwgMzozfSkKICAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuY29weSgpLCBkKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShkLmNvcHkoKSwgZC5fX2NsYXNzX18pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShkLmNvcHkoKSwgZC5fX2NsYXNzX18pKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGQuY29weSwgTm9uZSkKIAogICAgIGRlZiB0ZXN0X2dldChzZWxmKToKICAgICAgICAgQmFzaWNUZXN0TWFwcGluZ1Byb3RvY29sLnRlc3RfZ2V0KHNlbGYpCiAgICAgICAgIGQgPSBzZWxmLl9lbXB0eV9tYXBwaW5nKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGQuZ2V0KCdjJykgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZ2V0KCdjJykgaXMgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYycsIDMpLCAzKQogICAgICAgICBkID0gc2VsZi5fZnVsbF9tYXBwaW5nKHsnYScgOiAxLCAnYicgOiAyfSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGQuZ2V0KCdjJykgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuZ2V0KCdjJykgaXMgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYycsIDMpLCAzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdhJyksIDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2EnLCAzKSwgMSkKQEAgLTQ5Nyw5ICs0OTcsOSBAQAogICAgIGRlZiB0ZXN0X3NldGRlZmF1bHQoc2VsZik6CiAgICAgICAgIEJhc2ljVGVzdE1hcHBpbmdQcm90b2NvbC50ZXN0X3NldGRlZmF1bHQoc2VsZikKICAgICAgICAgZCA9IHNlbGYuX2VtcHR5X21hcHBpbmcoKQotICAgICAgICBzZWxmLmFzc2VydF8oZC5zZXRkZWZhdWx0KCdrZXkwJykgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuc2V0ZGVmYXVsdCgna2V5MCcpIGlzIE5vbmUpCiAgICAgICAgIGQuc2V0ZGVmYXVsdCgna2V5MCcsIFtdKQotICAgICAgICBzZWxmLmFzc2VydF8oZC5zZXRkZWZhdWx0KCdrZXkwJykgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuc2V0ZGVmYXVsdCgna2V5MCcpIGlzIE5vbmUpCiAgICAgICAgIGQuc2V0ZGVmYXVsdCgna2V5JywgW10pLmFwcGVuZCgzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbJ2tleSddWzBdLCAzKQogICAgICAgICBkLnNldGRlZmF1bHQoJ2tleScsIFtdKS5hcHBlbmQoNCkKQEAgLTUyNSw5ICs1MjUsOSBAQAogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhLCBpbnQoa2EpKQogICAgICAgICAgICAgICAgICAgICBrYiwgdmIgPSB0YiA9IGIucG9waXRlbSgpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmIsIGludChrYikpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QoY29weW1vZGUgPCAwIGFuZCB0YSAhPSB0YikpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBhKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgYikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdChjb3B5bW9kZSA8IDAgYW5kIHRhICE9IHRiKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGEpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBiKQogCiAgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgogICAgICAgICBCYXNpY1Rlc3RNYXBwaW5nUHJvdG9jb2wudGVzdF9wb3Aoc2VsZikKQEAgLTU4NSw3ICs1ODUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBVc2VyRGljdC5Vc2VyRGljdCgpCiAgICAgICAgIHVkID0gbXlkaWN0LmZyb21rZXlzKCdhYicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodWQsIHsnYSc6Tm9uZSwgJ2InOk5vbmV9KQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh1ZCwgVXNlckRpY3QuVXNlckRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh1ZCwgVXNlckRpY3QuVXNlckRpY3QpKQogCiAgICAgZGVmIHRlc3RfcG9wKHNlbGYpOgogICAgICAgICBUZXN0TWFwcGluZ1Byb3RvY29sLnRlc3RfcG9wKHNlbGYpCkBAIC02MzYsOCArNjM2LDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRXhjLCByZXByLCBkKQogCiAgICAgZGVmIHRlc3RfbGUoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKHNlbGYuX2VtcHR5X21hcHBpbmcoKSA8IHNlbGYuX2VtcHR5X21hcHBpbmcoKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKHNlbGYuX2Z1bGxfbWFwcGluZyh7MTogMn0pIDwgc2VsZi5fZnVsbF9tYXBwaW5nKHsxTDogMkx9KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHNlbGYuX2VtcHR5X21hcHBpbmcoKSA8IHNlbGYuX2VtcHR5X21hcHBpbmcoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHNlbGYuX2Z1bGxfbWFwcGluZyh7MTogMn0pIDwgc2VsZi5fZnVsbF9tYXBwaW5nKHsxTDogMkx9KSkpCiAKICAgICAgICAgY2xhc3MgRXhjKEV4Y2VwdGlvbik6IHBhc3MKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5IGIvTGliL3Rlc3QvcGlja2xldGVzdGVyLnB5CmluZGV4IGNlNDlmZGQuLjczMDZhYTggMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3BpY2tsZXRlc3Rlci5weQorKysgYi9MaWIvdGVzdC9waWNrbGV0ZXN0ZXIucHkKQEAgLTQ2MSw3ICs0NjEsNyBAQAogICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMobCwgcHJvdG8pCiAgICAgICAgICAgICB4ID0gc2VsZi5sb2FkcyhzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oeCksIDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyB4WzBdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgeFswXSkKIAogICAgIGRlZiB0ZXN0X3JlY3Vyc2l2ZV90dXBsZShzZWxmKToKICAgICAgICAgdCA9IChbXSwpCkBAIC00NzEsNyArNDcxLDcgQEAKICAgICAgICAgICAgIHggPSBzZWxmLmxvYWRzKHMpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih4KSwgMSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHhbMF0pLCAxKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHggaXMgeFswXVswXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIHhbMF1bMF0pCiAKICAgICBkZWYgdGVzdF9yZWN1cnNpdmVfZGljdChzZWxmKToKICAgICAgICAgZCA9IHt9CkBAIC00ODAsNyArNDgwLDcgQEAKICAgICAgICAgICAgIHMgPSBzZWxmLmR1bXBzKGQsIHByb3RvKQogICAgICAgICAgICAgeCA9IHNlbGYubG9hZHMocykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5rZXlzKCksIFsxXSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh4WzFdIGlzIHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeFsxXSBpcyB4KQogCiAgICAgZGVmIHRlc3RfcmVjdXJzaXZlX2luc3Qoc2VsZik6CiAgICAgICAgIGkgPSBDKCkKQEAgLTQ4OSw3ICs0ODksNyBAQAogICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoaSwgMikKICAgICAgICAgICAgIHggPSBzZWxmLmxvYWRzKHMpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcih4KSwgZGlyKGkpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHguYXR0ciBpcyB4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguYXR0ciBpcyB4KQogCiAgICAgZGVmIHRlc3RfcmVjdXJzaXZlX211bHRpKHNlbGYpOgogICAgICAgICBsID0gW10KQEAgLTUwMyw3ICs1MDMsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oeCksIDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcih4WzBdKSwgZGlyKGkpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4WzBdLmF0dHIua2V5cygpLCBbMV0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oeFswXS5hdHRyWzFdIGlzIHgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeFswXS5hdHRyWzFdIGlzIHgpCiAKICAgICBkZWYgdGVzdF9nYXJ5cChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc2VsZi5lcnJvciwgc2VsZi5sb2FkcywgJ2dhcnlwJykKQEAgLTY0NCw3ICs2NDQsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLmxvYWRzKGJhZHBpY2tsZSkKICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGRldGFpbDoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHIoZGV0YWlsKS5zdGFydHN3aXRoKAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihkZXRhaWwpLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bnN1cHBvcnRlZCBwaWNrbGUgcHJvdG9jb2wiKSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuZmFpbCgiZXhwZWN0ZWQgYmFkIHByb3RvY29sIG51bWJlciB0byByYWlzZSBWYWx1ZUVycm9yIikKQEAgLTcxNiw3ICs3MTYsNyBAQAogICAgICAgICAgICAgZm9yIHggaW4gTm9uZSwgRmFsc2UsIFRydWU6CiAgICAgICAgICAgICAgICAgcyA9IHNlbGYuZHVtcHMoeCwgcHJvdG8pCiAgICAgICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMocykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyB5LCAocHJvdG8sIHgsIHMsIHkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIHksIChwcm90bywgeCwgcywgeSkpCiAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBleHBlY3RlZF9vcGNvZGVbcHJvdG8sIHhdCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcGNvZGVfaW5fcGlja2xlKGV4cGVjdGVkLCBzKSwgVHJ1ZSkKIApAQCAtNzY2LDggKzc2Niw4IEBACiAKICAgICAgICAgICAgICMgRHVtcCB1c2luZyBwcm90b2NvbCAxIGZvciBjb21wYXJpc29uLgogICAgICAgICAgICAgczEgPSBzZWxmLmR1bXBzKHgsIDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oX19uYW1lX18gaW4gczEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oIk15TGlzdCIgaW4gczEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoX19uYW1lX18gaW4gczEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoIk15TGlzdCIgaW4gczEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wY29kZV9pbl9waWNrbGUob3Bjb2RlLCBzMSksIEZhbHNlKQogCiAgICAgICAgICAgICB5ID0gc2VsZi5sb2FkcyhzMSkKQEAgLTc3Niw4ICs3NzYsOCBAQAogCiAgICAgICAgICAgICAjIER1bXAgdXNpbmcgcHJvdG9jb2wgMiBmb3IgdGVzdC4KICAgICAgICAgICAgIHMyID0gc2VsZi5kdW1wcyh4LCAyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKF9fbmFtZV9fIG5vdCBpbiBzMikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygiTXlMaXN0IiBub3QgaW4gczIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoX19uYW1lX18gbm90IGluIHMyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJNeUxpc3QiIG5vdCBpbiBzMikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Bjb2RlX2luX3BpY2tsZShvcGNvZGUsIHMyKSwgVHJ1ZSkKIAogICAgICAgICAgICAgeSA9IHNlbGYubG9hZHMoczIpCkBAIC04MjEsNyArODIxLDcgQEAKICAgICAgICAgICAgIGlmIHByb3RvID09IDA6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudW1fYXBwZW5kcywgMCkKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG51bV9hcHBlbmRzID49IDIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG51bV9hcHBlbmRzID49IDIpCiAKICAgICBkZWYgdGVzdF9kaWN0X2NodW5raW5nKHNlbGYpOgogICAgICAgICBuID0gMTAgICMgdG9vIHNtYWxsIHRvIGNodW5rCkBAIC04NDMsNyArODQzLDcgQEAKICAgICAgICAgICAgIGlmIHByb3RvID09IDA6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudW1fc2V0aXRlbXMsIDApCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhudW1fc2V0aXRlbXMgPj0gMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobnVtX3NldGl0ZW1zID49IDIpCiAKICAgICBkZWYgdGVzdF9zaW1wbGVfbmV3b2JqKHNlbGYpOgogICAgICAgICB4ID0gb2JqZWN0Ll9fbmV3X18oU2ltcGxlTmV3T2JqKSAgIyBhdm9pZCBfX2luaXRfXwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9TdHJpbmdJTy5weSBiL0xpYi90ZXN0L3Rlc3RfU3RyaW5nSU8ucHkKaW5kZXggNThjYmVjMC4uZjVhMTc3ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9TdHJpbmdJTy5weQorKysgYi9MaWIvdGVzdC90ZXN0X1N0cmluZ0lPLnB5CkBAIC04NSw3ICs4NSw3IEBACiAKICAgICBkZWYgdGVzdF9pdGVyYXRvcihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCi0gICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICB1bmxlc3MgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgZXEoaXRlcihzZWxmLl9mcCksIHNlbGYuX2ZwKQogICAgICAgICAjIERvZXMgdGhpcyBvYmplY3Qgc3VwcG9ydCB0aGUgaXRlcmF0aW9uIHByb3RvY29sPwogICAgICAgICB1bmxlc3MoaGFzYXR0cihzZWxmLl9mcCwgJ19faXRlcl9fJykpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X19fYWxsX18ucHkgYi9MaWIvdGVzdC90ZXN0X19fYWxsX18ucHkKaW5kZXggMGE4YzVkNi4uNjIzY2U5NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9fX2FsbF9fLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfX19hbGxfXy5weQpAQCAtMTgsNyArMTgsNyBAQAogICAgICAgICAgICAgICAgICMgU2lsZW50IGZhaWwgaGVyZSBzZWVtcyB0aGUgYmVzdCByb3V0ZSBzaW5jZSBzb21lIG1vZHVsZXMKICAgICAgICAgICAgICAgICAjIG1heSBub3QgYmUgYXZhaWxhYmxlIGluIGFsbCBlbnZpcm9ubWVudHMuCiAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhoYXNhdHRyKHN5cy5tb2R1bGVzW21vZG5hbWVdLCAiX19hbGxfXyIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzeXMubW9kdWxlc1ttb2RuYW1lXSwgIl9fYWxsX18iKSwKICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBoYXMgbm8gX19hbGxfXyBhdHRyaWJ1dGUiICUgbW9kbmFtZSkKICAgICAgICAgbmFtZXMgPSB7fQogICAgICAgICBleGVjICJmcm9tICVzIGltcG9ydCAqIiAlIG1vZG5hbWUgaW4gbmFtZXMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfX19mdXR1cmVfXy5weSBiL0xpYi90ZXN0L3Rlc3RfX19mdXR1cmVfXy5weQppbmRleCA1MGEyYzc0Li5hOGM3YzJlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X19fZnV0dXJlX18ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9fX2Z1dHVyZV9fLnB5CkBAIC0xNSw3ICsxNSw3IEBACiAgICAgICAgIGZvciBuYW1lIGluIGRpcihfX2Z1dHVyZV9fKToKICAgICAgICAgICAgIG9iaiA9IGdldGF0dHIoX19mdXR1cmVfXywgbmFtZSwgTm9uZSkKICAgICAgICAgICAgIGlmIG9iaiBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZShvYmosIF9fZnV0dXJlX18uX0ZlYXR1cmUpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgICAgICAgICAgIG5hbWUgaW4gZ2l2ZW5fZmVhdHVyZV9uYW1lcywKICAgICAgICAgICAgICAgICAgICAgIiVyIHNob3VsZCBoYXZlIGJlZW4gaW4gYWxsX2ZlYXR1cmVfbmFtZXMiICUgbmFtZQogICAgICAgICAgICAgICAgICkKQEAgLTMwLDcgKzMwLDcgQEAKICAgICAgICAgICAgIG9wdGlvbmFsID0gdmFsdWUuZ2V0T3B0aW9uYWxSZWxlYXNlKCkKICAgICAgICAgICAgIG1hbmRhdG9yeSA9IHZhbHVlLmdldE1hbmRhdG9yeVJlbGVhc2UoKQogCi0gICAgICAgICAgICBhID0gc2VsZi5hc3NlcnRfCisgICAgICAgICAgICBhID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgICAgICBlID0gc2VsZi5hc3NlcnRFcXVhbAogICAgICAgICAgICAgZGVmIGNoZWNrKHQsIG5hbWUpOgogICAgICAgICAgICAgICAgIGEoaXNpbnN0YW5jZSh0LCB0dXBsZSksICIlcyBpc24ndCB0dXBsZSIgJSBuYW1lKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hYmMucHkgYi9MaWIvdGVzdC90ZXN0X2FiYy5weQppbmRleCAzZTA5NTVmLi43MThkOTAzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2FiYy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FiYy5weQpAQCAtNDQsMjMgKzQ0LDIzIEBACiAgICAgICAgICAgICAgICAgZGVmIGJhcihzZWxmKTogcGFzcyAgIyBjb25jcmV0ZQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLl9fYWJzdHJhY3RtZXRob2RzX18sIHNldChbImZvbyJdKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgQykgICMgYmVjYXVzZSBmb28gaXMgYWJzdHJhY3QKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2Fic3RyYWN0KEMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzYWJzdHJhY3QoQykpCiAgICAgICAgICAgICBjbGFzcyBEKEMpOgogICAgICAgICAgICAgICAgIGRlZiBiYXIoc2VsZik6IHBhc3MgICMgY29uY3JldGUgb3ZlcnJpZGUgb2YgY29uY3JldGUKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRC5fX2Fic3RyYWN0bWV0aG9kc19fLCBzZXQoWyJmb28iXSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEQpICAjIGJlY2F1c2UgZm9vIGlzIHN0aWxsIGFic3RyYWN0Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNhYnN0cmFjdChEKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2Fic3RyYWN0KEQpKQogICAgICAgICAgICAgY2xhc3MgRShEKToKICAgICAgICAgICAgICAgICBkZWYgZm9vKHNlbGYpOiBwYXNzCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEUuX19hYnN0cmFjdG1ldGhvZHNfXywgc2V0KCkpCiAgICAgICAgICAgICBFKCkgICMgbm93IGZvbyBpcyBjb25jcmV0ZSwgdG9vCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihpc2Fic3RyYWN0KEUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2Fic3RyYWN0KEUpKQogICAgICAgICAgICAgY2xhc3MgRihFKToKICAgICAgICAgICAgICAgICBAYWJzdHJhY3R0aGluZwogICAgICAgICAgICAgICAgIGRlZiBiYXIoc2VsZik6IHBhc3MgICMgYWJzdHJhY3Qgb3ZlcnJpZGUgb2YgY29uY3JldGUKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRi5fX2Fic3RyYWN0bWV0aG9kc19fLCBzZXQoWyJiYXIiXSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIEYpICAjIGJlY2F1c2UgYmFyIGlzIGFic3RyYWN0IG5vdwotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzYWJzdHJhY3QoRikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNhYnN0cmFjdChGKSkKIAogICAgIGRlZiB0ZXN0X3N1YmNsYXNzX29sZHN0eWxlX2NsYXNzKHNlbGYpOgogICAgICAgICBjbGFzcyBBOgpAQCAtMTUyLDQxICsxNTIsNDEgQEAKICAgICBkZWYgdGVzdF9yZWdpc3RyYXRpb25fdHJhbnNpdGl2ZW5lc3Moc2VsZik6CiAgICAgICAgIGNsYXNzIEE6CiAgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoQSwgQSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKEEsIChBLCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhBLCBBKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQSwgKEEsKSkpCiAgICAgICAgIGNsYXNzIEI6CiAgICAgICAgICAgICBfX21ldGFjbGFzc19fID0gYWJjLkFCQ01ldGEKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhBLCBCKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhBLCAoQiwpKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhCLCBBKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhCLCAoQSwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEEsIEIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQSwgKEIsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhCLCBBKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEIsIChBLCkpKQogICAgICAgICBjbGFzcyBDOgogICAgICAgICAgICAgX19tZXRhY2xhc3NfXyA9IGFiYy5BQkNNZXRhCiAgICAgICAgIEEucmVnaXN0ZXIoQikKICAgICAgICAgY2xhc3MgQjEoQik6CiAgICAgICAgICAgICBwYXNzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKEIxLCBBKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoQjEsIChBLCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhCMSwgQSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEIxLCAoQSwpKSkKICAgICAgICAgY2xhc3MgQzEoQyk6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIEIxLnJlZ2lzdGVyKEMxKQotICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKEMsIEIpKQotICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKEMsIChCLCkpKQotICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKEMsIEIxKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhDLCAoQjEsKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKEMxLCBBKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoQzEsIChBLCkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhDMSwgQikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKEMxLCAoQiwpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoQzEsIEIxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoQzEsIChCMSwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEMsIEIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoQywgKEIsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhDLCBCMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhDLCAoQjEsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEMxLCBBKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQzEsIChBLCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDMSwgQikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKEMxLCAoQiwpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQzEsIEIxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQzEsIChCMSwpKSkKICAgICAgICAgQzEucmVnaXN0ZXIoaW50KQogICAgICAgICBjbGFzcyBNeUludChpbnQpOgogICAgICAgICAgICAgcGFzcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhNeUludCwgQSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKE15SW50LCAoQSwpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoNDIsIEEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZSg0MiwgKEEsKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKE15SW50LCBBKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoTXlJbnQsIChBLCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSg0MiwgQSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKDQyLCAoQSwpKSkKIAogICAgIGRlZiB0ZXN0X2FsbF9uZXdfbWV0aG9kc19hcmVfY2FsbGVkKHNlbGYpOgogICAgICAgICBjbGFzcyBBOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hYnN0cmFjdF9udW1iZXJzLnB5IGIvTGliL3Rlc3QvdGVzdF9hYnN0cmFjdF9udW1iZXJzLnB5CmluZGV4IDAzNGZiNTIuLjhmMWZkZDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYWJzdHJhY3RfbnVtYmVycy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Fic3RyYWN0X251bWJlcnMucHkKQEAgLTksOCArOSw4IEBACiAKIGNsYXNzIFRlc3ROdW1iZXJzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9pbnQoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKGludCwgSW50ZWdyYWwpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhpbnQsIENvbXBsZXgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhpbnQsIEludGVncmFsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoaW50LCBDb21wbGV4KSkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDcsIGludCg3KS5yZWFsKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGludCg3KS5pbWFnKQpAQCAtMTksOCArMTksOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGludCg3KS5kZW5vbWluYXRvcikKIAogICAgIGRlZiB0ZXN0X2xvbmcoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKGxvbmcsIEludGVncmFsKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MobG9uZywgQ29tcGxleCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGxvbmcsIEludGVncmFsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MobG9uZywgQ29tcGxleCkpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg3LCBsb25nKDcpLnJlYWwpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbG9uZyg3KS5pbWFnKQpAQCAtMjksMTYgKzI5LDE2IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbG9uZyg3KS5kZW5vbWluYXRvcikKIAogICAgIGRlZiB0ZXN0X2Zsb2F0KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKGZsb2F0LCBSYXRpb25hbCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKGZsb2F0LCBSZWFsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKGZsb2F0LCBSYXRpb25hbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGZsb2F0LCBSZWFsKSkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDcuMywgZmxvYXQoNy4zKS5yZWFsKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGZsb2F0KDcuMykuaW1hZykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg3LjMsIGZsb2F0KDcuMykuY29uanVnYXRlKCkpCiAKICAgICBkZWYgdGVzdF9jb21wbGV4KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKGNvbXBsZXgsIFJlYWwpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhjb21wbGV4LCBDb21wbGV4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKGNvbXBsZXgsIFJlYWwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhjb21wbGV4LCBDb21wbGV4KSkKIAogICAgICAgICBjMSwgYzIgPSBjb21wbGV4KDMsIDIpLCBjb21wbGV4KDQsMSkKICAgICAgICAgIyBYWFg6IFRoaXMgaXMgbm90IGlkZWFsLCBidXQgc2VlIHRoZSBjb21tZW50IGluIG1hdGhfdHJ1bmMoKS4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkgYi9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CmluZGV4IDJjNGMyZmQuLjY0MzM5MzUgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hcnJheS5weQpAQCAtNDgsNyArNDgsNyBAQAogICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgogICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLnR5cGVjb2RlLCBzZWxmLnR5cGVjb2RlKQotICAgICAgICBzZWxmLmFzc2VydF8oYS5pdGVtc2l6ZT49c2VsZi5taW5pdGVtc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEuaXRlbXNpemU+PXNlbGYubWluaXRlbXNpemUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgYXJyYXkuYXJyYXksIHNlbGYudHlwZWNvZGUsIE5vbmUpCiAKICAgICBkZWYgdGVzdF9sZW4oc2VsZik6CkBAIC02MywxMCArNjMsMTAgQEAKICAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhLmJ1ZmZlcl9pbmZvLCA0MikKICAgICAgICAgYmkgPSBhLmJ1ZmZlcl9pbmZvKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoYmksIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoYmksIHR1cGxlKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYmkpLCAyKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShiaVswXSwgKGludCwgbG9uZykpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShiaVsxXSwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoYmlbMF0sIChpbnQsIGxvbmcpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoYmlbMV0sIGludCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmlbMV0sIGxlbihhKSkKIAogICAgIGRlZiB0ZXN0X2J5dGVzd2FwKHNlbGYpOgpAQCAtMjIyLDM5ICsyMjIsMzkgQEAKIAogICAgIGRlZiB0ZXN0X2NtcChzZWxmKToKICAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID09IDQyKSBpcyBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhICE9IDQyKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPT0gNDIpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgIT0gNDIpIGlzIFRydWUpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID09IGEpIGlzIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSAhPSBhKSBpcyBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhIDwgYSkgaXMgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSA8PSBhKSBpcyBUcnVlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgPiBhKSBpcyBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID49IGEpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA9PSBhKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgIT0gYSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8IGEpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPD0gYSkgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID4gYSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+PSBhKSBpcyBUcnVlKQogCiAgICAgICAgIGFsID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5zbWFsbGVyZXhhbXBsZSkKICAgICAgICAgYWIgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmJpZ2dlcmV4YW1wbGUpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID09IDIqYSkgaXMgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSAhPSAyKmEpIGlzIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSA8IDIqYSkgaXMgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhIDw9IDIqYSkgaXMgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID4gMiphKSBpcyBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID49IDIqYSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA9PSAyKmEpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgIT0gMiphKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPCAyKmEpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8PSAyKmEpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+IDIqYSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+PSAyKmEpIGlzIEZhbHNlKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSA9PSBhbCkgaXMgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSAhPSBhbCkgaXMgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhIDwgYWwpIGlzIEZhbHNlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgPD0gYWwpIGlzIEZhbHNlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgPiBhbCkgaXMgVHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID49IGFsKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPT0gYWwpIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgIT0gYWwpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8IGFsKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDw9IGFsKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID4gYWwpIGlzIFRydWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+PSBhbCkgaXMgVHJ1ZSkKIAotICAgICAgICBzZWxmLmFzc2VydF8oKGEgPT0gYWIpIGlzIEZhbHNlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgIT0gYWIpIGlzIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSA8IGFiKSBpcyBUcnVlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgPD0gYWIpIGlzIFRydWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSA+IGFiKSBpcyBGYWxzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID49IGFiKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhID09IGFiKSBpcyBGYWxzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICE9IGFiKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPCBhYikgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIDw9IGFiKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPiBhYikgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+PSBhYikgaXMgRmFsc2UpCiAKICAgICBkZWYgdGVzdF9hZGQoc2VsZik6CiAgICAgICAgIGEgPSBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlLCBzZWxmLmV4YW1wbGUpIFwKQEAgLTI3Myw3ICsyNzMsNyBAQAogICAgICAgICBhID0gYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgc2VsZi5leGFtcGxlWzo6LTFdKQogICAgICAgICBiID0gYQogICAgICAgICBhICs9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIDIqc2VsZi5leGFtcGxlKQotICAgICAgICBzZWxmLmFzc2VydF8oYSBpcyBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpcyBiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgYSwKICAgICAgICAgICAgIGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZVs6Oi0xXSsyKnNlbGYuZXhhbXBsZSkKQEAgLTMxNiwyMiArMzE2LDIyIEBACiAgICAgICAgIGIgPSBhCiAKICAgICAgICAgYSAqPSA1Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIGlzIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIGlzIGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICBhLAogICAgICAgICAgICAgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSwgNSpzZWxmLmV4YW1wbGUpCiAgICAgICAgICkKIAogICAgICAgICBhICo9IDAKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKSkKIAogICAgICAgICBhICo9IDEwMDAKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCBhcnJheS5hcnJheShzZWxmLnR5cGVjb2RlKSkKIAogICAgICAgICBhICo9IC0xCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIGlzIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIGlzIGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgYXJyYXkuYXJyYXkoc2VsZi50eXBlY29kZSkpCiAKICAgICAgICAgYSA9IGFycmF5LmFycmF5KHNlbGYudHlwZWNvZGUsIHNlbGYuZXhhbXBsZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXN0LnB5IGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKaW5kZXggODk4NTBmNi4uNGUzMTFlNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hc3QucHkKQEAgLTEyMiwyMCArMTIyLDIwIEBACiAKIGNsYXNzIEFTVF9UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKLSAgICBkZWYgX2Fzc2VydF9vcmRlcihzZWxmLCBhc3Rfbm9kZSwgcGFyZW50X3Bvcyk6CisgICAgZGVmIF9hc3NlcnRUcnVlb3JkZXIoc2VsZiwgYXN0X25vZGUsIHBhcmVudF9wb3MpOgogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShhc3Rfbm9kZSwgYXN0LkFTVCkgb3IgYXN0X25vZGUuX2ZpZWxkcyBpcyBOb25lOgogICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgIGlmIGlzaW5zdGFuY2UoYXN0X25vZGUsIChhc3QuZXhwciwgYXN0LnN0bXQsIGFzdC5leGNlcHRoYW5kbGVyKSk6CiAgICAgICAgICAgICBub2RlX3BvcyA9IChhc3Rfbm9kZS5saW5lbm8sIGFzdF9ub2RlLmNvbF9vZmZzZXQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm9kZV9wb3MgPj0gcGFyZW50X3BvcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub2RlX3BvcyA+PSBwYXJlbnRfcG9zKQogICAgICAgICAgICAgcGFyZW50X3BvcyA9IChhc3Rfbm9kZS5saW5lbm8sIGFzdF9ub2RlLmNvbF9vZmZzZXQpCiAgICAgICAgIGZvciBuYW1lIGluIGFzdF9ub2RlLl9maWVsZHM6CiAgICAgICAgICAgICB2YWx1ZSA9IGdldGF0dHIoYXN0X25vZGUsIG5hbWUpCiAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKICAgICAgICAgICAgICAgICBmb3IgY2hpbGQgaW4gdmFsdWU6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuX2Fzc2VydF9vcmRlcihjaGlsZCwgcGFyZW50X3BvcykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fYXNzZXJ0VHJ1ZW9yZGVyKGNoaWxkLCBwYXJlbnRfcG9zKQogICAgICAgICAgICAgZWxpZiB2YWx1ZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBzZWxmLl9hc3NlcnRfb3JkZXIodmFsdWUsIHBhcmVudF9wb3MpCisgICAgICAgICAgICAgICAgc2VsZi5fYXNzZXJ0VHJ1ZW9yZGVyKHZhbHVlLCBwYXJlbnRfcG9zKQogCiAgICAgZGVmIHRlc3Rfc25pcHBldHMoc2VsZik6CiAgICAgICAgIGZvciBpbnB1dCwgb3V0cHV0LCBraW5kIGluICgoZXhlY190ZXN0cywgZXhlY19yZXN1bHRzLCAiZXhlYyIpLApAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgICAgICAgICBmb3IgaSwgbyBpbiBpdGVydG9vbHMuaXppcChpbnB1dCwgb3V0cHV0KToKICAgICAgICAgICAgICAgICBhc3RfdHJlZSA9IGNvbXBpbGUoaSwgIj8iLCBraW5kLCBhc3QuUHlDRl9PTkxZX0FTVCkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0b190dXBsZShhc3RfdHJlZSksIG8pCi0gICAgICAgICAgICAgICAgc2VsZi5fYXNzZXJ0X29yZGVyKGFzdF90cmVlLCAoMCwgMCkpCisgICAgICAgICAgICAgICAgc2VsZi5fYXNzZXJ0VHJ1ZW9yZGVyKGFzdF90cmVlLCAoMCwgMCkpCiAKICAgICBkZWYgdGVzdF9zbGljZShzZWxmKToKICAgICAgICAgc2xjID0gYXN0LnBhcnNlKCJ4Wzo6XSIpLmJvZHlbMF0udmFsdWUuc2xpY2UKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5IGIvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKaW5kZXggZGJmNzFiYy4uMjRhYTJiNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9hdWdhc3NpZ24ucHkKQEAgLTcxLDcgKzcxLDcgQEAKICAgICAgICAgeVsxOjJdICs9IFsxXQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIFsxLCAyLCAxLCAyLCAzXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHggaXMgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgeSkKIAogICAgIGRlZiB0ZXN0Q3VzdG9tTWV0aG9kczEoc2VsZik6CiAKQEAgLTk2LDIzICs5NiwyMyBAQAogICAgICAgICB5ID0geAogICAgICAgICB4ICs9IDEwCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoeCwgYXVnX3Rlc3QpKQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeCwgYXVnX3Rlc3QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC52YWwsIDExKQogCiAgICAgICAgIHggPSBhdWdfdGVzdDIoMikKICAgICAgICAgeSA9IHgKICAgICAgICAgeCArPSAxMAogCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5IGlzIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgudmFsLCAxMikKIAogICAgICAgICB4ID0gYXVnX3Rlc3QzKDMpCiAgICAgICAgIHkgPSB4CiAgICAgICAgIHggKz0gMTAKIAotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh4LCBhdWdfdGVzdDMpKQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeCwgYXVnX3Rlc3QzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgudmFsLCAxMykKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2JpZ21lbS5weSBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CmluZGV4IDM2MGJjYjIuLmNiMWIyZjUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYmlnbWVtLnB5CkBAIC0xMzAsMTggKzEzMCwxOCBAQAogICAgICAgICBleGNlcHQgTWVtb3J5RXJyb3I6CiAgICAgICAgICAgICBwYXNzICMgYWNjZXB0YWJsZSBvbiAzMi1iaXQKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzID09IGV2YWwocikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocyA9PSBldmFsKHIpKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQogICAgIGRlZiB0ZXN0X2VuZHN3aXRoKHNlbGYsIHNpemUpOgogICAgICAgICBTVUJTVFIgPSAnIGFiYyBkZWYgZ2hpJwogICAgICAgICBzID0gJy0nICogc2l6ZSArIFNVQlNUUgotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5lbmRzd2l0aChTVUJTVFIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5lbmRzd2l0aChzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZW5kc3dpdGgoU1VCU1RSKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZW5kc3dpdGgocykpCiAgICAgICAgIHMyID0gJy4uLicgKyBzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzMi5lbmRzd2l0aChzKSkKLSAgICAgICAgc2VsZi5mYWlsSWYocy5lbmRzd2l0aCgnYScgKyBTVUJTVFIpKQotICAgICAgICBzZWxmLmZhaWxJZihTVUJTVFIuZW5kc3dpdGgocykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMi5lbmRzd2l0aChzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLmVuZHN3aXRoKCdhJyArIFNVQlNUUikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoU1VCU1RSLmVuZHN3aXRoKHMpKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTIpCiAgICAgZGVmIHRlc3RfZXhwYW5kdGFicyhzZWxmLCBzaXplKToKQEAgLTE5MSw2MiArMTkxLDYyIEBACiAgICAgZGVmIHRlc3RfaXNhbG51bShzZWxmLCBzaXplKToKICAgICAgICAgU1VCU1RSID0gJzEyMzQ1NicKICAgICAgICAgcyA9ICdhJyAqIHNpemUgKyBTVUJTVFIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuaXNhbG51bSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc2FsbnVtKCkpCiAgICAgICAgIHMgKz0gJy4nCi0gICAgICAgIHNlbGYuZmFpbElmKHMuaXNhbG51bSgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuaXNhbG51bSgpKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQogICAgIGRlZiB0ZXN0X2lzYWxwaGEoc2VsZiwgc2l6ZSk6CiAgICAgICAgIFNVQlNUUiA9ICd6enp6enp6JwogICAgICAgICBzID0gJ2EnICogc2l6ZSArIFNVQlNUUgotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5pc2FscGhhKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmlzYWxwaGEoKSkKICAgICAgICAgcyArPSAnLicKLSAgICAgICAgc2VsZi5mYWlsSWYocy5pc2FscGhhKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uocy5pc2FscGhhKCkpCiAKICAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRywgbWVtdXNlPTIpCiAgICAgZGVmIHRlc3RfaXNkaWdpdChzZWxmLCBzaXplKToKICAgICAgICAgU1VCU1RSID0gJzEyMzQ1NicKICAgICAgICAgcyA9ICc5JyAqIHNpemUgKyBTVUJTVFIKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuaXNkaWdpdCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc2RpZ2l0KCkpCiAgICAgICAgIHMgKz0gJ3onCi0gICAgICAgIHNlbGYuZmFpbElmKHMuaXNkaWdpdCgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuaXNkaWdpdCgpKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQogICAgIGRlZiB0ZXN0X2lzbG93ZXIoc2VsZiwgc2l6ZSk6CiAgICAgICAgIGNoYXJzID0gJycuam9pbihbIGNocihjKSBmb3IgYyBpbiByYW5nZSgyNTUpIGlmIG5vdCBjaHIoYykuaXN1cHBlcigpIF0pCiAgICAgICAgIHJlcGVhdHMgPSBzaXplIC8vIGxlbihjaGFycykgKyAyCiAgICAgICAgIHMgPSBjaGFycyAqIHJlcGVhdHMKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuaXNsb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc2xvd2VyKCkpCiAgICAgICAgIHMgKz0gJ0EnCi0gICAgICAgIHNlbGYuZmFpbElmKHMuaXNsb3dlcigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuaXNsb3dlcigpKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0yKQogICAgIGRlZiB0ZXN0X2lzc3BhY2Uoc2VsZiwgc2l6ZSk6CiAgICAgICAgIHdoaXRlc3BhY2UgPSAnIFxmXG5cclx0XHYnCiAgICAgICAgIHJlcGVhdHMgPSBzaXplIC8vIGxlbih3aGl0ZXNwYWNlKSArIDIKICAgICAgICAgcyA9IHdoaXRlc3BhY2UgKiByZXBlYXRzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLmlzc3BhY2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuaXNzcGFjZSgpKQogICAgICAgICBzICs9ICdqJwotICAgICAgICBzZWxmLmZhaWxJZihzLmlzc3BhY2UoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLmlzc3BhY2UoKSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKICAgICBkZWYgdGVzdF9pc3RpdGxlKHNlbGYsIHNpemUpOgogICAgICAgICBTVUJTVFIgPSAnMTIzNDU2JwogICAgICAgICBzID0gJycuam9pbihbJ0EnLCAnYScgKiBzaXplLCBTVUJTVFJdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5pc3RpdGxlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmlzdGl0bGUoKSkKICAgICAgICAgcyArPSAnQScKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuaXN0aXRsZSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5pc3RpdGxlKCkpCiAgICAgICAgIHMgKz0gJ2FBJwotICAgICAgICBzZWxmLmZhaWxJZihzLmlzdGl0bGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLmlzdGl0bGUoKSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKICAgICBkZWYgdGVzdF9pc3VwcGVyKHNlbGYsIHNpemUpOgogICAgICAgICBjaGFycyA9ICcnLmpvaW4oWyBjaHIoYykgZm9yIGMgaW4gcmFuZ2UoMjU1KSBpZiBub3QgY2hyKGMpLmlzbG93ZXIoKSBdKQogICAgICAgICByZXBlYXRzID0gc2l6ZSAvLyBsZW4oY2hhcnMpICsgMgogICAgICAgICBzID0gY2hhcnMgKiByZXBlYXRzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLmlzdXBwZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuaXN1cHBlcigpKQogICAgICAgICBzICs9ICdhJwotICAgICAgICBzZWxmLmZhaWxJZihzLmlzdXBwZXIoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzLmlzdXBwZXIoKSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKICAgICBkZWYgdGVzdF9qb2luKHNlbGYsIHNpemUpOgpAQCAtMjU0LDE0ICsyNTQsMTQgQEAKICAgICAgICAgeCA9IHMuam9pbihbJ2FhYWFhJywgJ2JiYmJiJ10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHguY291bnQoJ2EnKSwgNSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC5jb3VudCgnYicpLCA1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoeC5zdGFydHN3aXRoKCdhYWFhYUEnKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHguZW5kc3dpdGgoJ0FiYmJiYicpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5zdGFydHN3aXRoKCdhYWFhYUEnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguZW5kc3dpdGgoJ0FiYmJiYicpKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTEpCiAgICAgZGVmIHRlc3RfbGp1c3Qoc2VsZiwgc2l6ZSk6CiAgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCiAgICAgICAgIHMgPSBTVUJTVFIubGp1c3Qoc2l6ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuc3RhcnRzd2l0aChTVUJTVFIgKyAnICAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aChTVUJTVFIgKyAnICAnKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHMpLCBzaXplKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLnN0cmlwKCksIFNVQlNUUi5zdHJpcCgpKQogCkBAIC0yODIsNyArMjgyLDcgQEAKICAgICAgICAgcyA9IFNVQlNUUi5sanVzdChzaXplKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUpCiAgICAgICAgIHN0cmlwcGVkID0gcy5sc3RyaXAoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RyaXBwZWQgaXMgcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cmlwcGVkIGlzIHMpCiAKICAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MikKICAgICBkZWYgdGVzdF9yZXBsYWNlKHNlbGYsIHNpemUpOgpAQCAtMzMzLDcgKzMzMyw3IEBACiAgICAgZGVmIHRlc3Rfcmp1c3Qoc2VsZiwgc2l6ZSk6CiAgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCiAgICAgICAgIHMgPSBTVUJTVFIubGp1c3Qoc2l6ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuc3RhcnRzd2l0aChTVUJTVFIgKyAnICAnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aChTVUJTVFIgKyAnICAnKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKHMpLCBzaXplKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLnN0cmlwKCksIFNVQlNUUi5zdHJpcCgpKQogCkBAIC0zNDcsNyArMzQ3LDcgQEAKICAgICAgICAgcyA9IFNVQlNUUi5yanVzdChzaXplKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUpCiAgICAgICAgIHN0cmlwcGVkID0gcy5yc3RyaXAoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RyaXBwZWQgaXMgcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cmlwcGVkIGlzIHMpCiAKICAgICAjIFRoZSB0ZXN0IHRha2VzIGFib3V0IHNpemUgYnl0ZXMgdG8gYnVpbGQgYSBzdHJpbmcsIGFuZCB0aGVuIGFib3V0CiAgICAgIyBzcXJ0KHNpemUpIHN1YnN0cmluZ3Mgb2Ygc3FydChzaXplKSBpbiBzaXplIGFuZCBhIGxpc3QgdG8KQEAgLTM5OSw5ICszOTksOSBAQAogICAgIGRlZiB0ZXN0X3N0YXJ0c3dpdGgoc2VsZiwgc2l6ZSk6CiAgICAgICAgIFNVQlNUUiA9ICcgYWJjIGRlZiBnaGknCiAgICAgICAgIHMgPSAnLScgKiBzaXplICsgU1VCU1RSCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLnN0YXJ0c3dpdGgocykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLnN0YXJ0c3dpdGgoJy0nICogc2l6ZSkpCi0gICAgICAgIHNlbGYuZmFpbElmKHMuc3RhcnRzd2l0aChTVUJTVFIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKHMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKCctJyAqIHNpemUpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHMuc3RhcnRzd2l0aChTVUJTVFIpKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcsIG1lbXVzZT0xKQogICAgIGRlZiB0ZXN0X3N0cmlwKHNlbGYsIHNpemUpOgpAQCAtNDMwLDggKzQzMCw4IEBACiAgICAgICAgIFNVQlNUUiA9ICdTcGFhSEFhYUFhaGFtJwogICAgICAgICBzID0gU1VCU1RSICogKHNpemUgLy8gbGVuKFNVQlNUUikgKyAyKQogICAgICAgICBzID0gcy50aXRsZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLnN0YXJ0c3dpdGgoKFNVQlNUUiAqIDMpLnRpdGxlKCkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocy5lbmRzd2l0aChTVUJTVFIubG93ZXIoKSAqIDMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKChTVUJTVFIgKiAzKS50aXRsZSgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZW5kc3dpdGgoU1VCU1RSLmxvd2VyKCkgKiAzKSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHLCBtZW11c2U9MikKICAgICBkZWYgdGVzdF90cmFuc2xhdGUoc2VsZiwgc2l6ZSk6CkBAIC00NTksOCArNDU5LDggQEAKICAgICBkZWYgdGVzdF96ZmlsbChzZWxmLCBzaXplKToKICAgICAgICAgU1VCU1RSID0gJy01NjgzMjQ3MjM1OTgyMzQnCiAgICAgICAgIHMgPSBTVUJTVFIuemZpbGwoc2l6ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuZW5kc3dpdGgoJzAnICsgU1VCU1RSWzE6XSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLnN0YXJ0c3dpdGgoJy0wJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmVuZHN3aXRoKCcwJyArIFNVQlNUUlsxOl0pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKCctMCcpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4ocyksIHNpemUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMuY291bnQoJzAnKSwgc2l6ZSAtIGxlbihTVUJTVFIpKQogCkBAIC00NjgsMTIgKzQ2OCwxMiBAQAogICAgIGRlZiB0ZXN0X2Zvcm1hdChzZWxmLCBzaXplKToKICAgICAgICAgcyA9ICctJyAqIHNpemUKICAgICAgICAgc2YgPSAnJXMnICUgKHMsKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocyA9PSBzZikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMgPT0gc2YpCiAgICAgICAgIGRlbCBzZgogICAgICAgICBzZiA9ICcuLiVzLi4nICUgKHMsKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oc2YpLCBsZW4ocykgKyA0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2Yuc3RhcnRzd2l0aCgnLi4tJykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZi5lbmRzd2l0aCgnLS4uJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZi5zdGFydHN3aXRoKCcuLi0nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNmLmVuZHN3aXRoKCctLi4nKSkKICAgICAgICAgZGVsIHMsIHNmCiAKICAgICAgICAgc2l6ZSAvLz0gMgpAQCAtNTE5LDcgKzUxOSw3IEBACiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT0yKiozMiAvIDUsIG1lbXVzZT02KzIpCiAgICAgZGVmIHRlc3RfdW5pY29kZV9yZXByKHNlbGYsIHNpemUpOgogICAgICAgICBzID0gdSJcdUFBQUEiICogc2l6ZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobGVuKHJlcHIocykpID4gc2l6ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihyZXByKHMpKSA+IHNpemUpCiAKICAgICAjIFRoaXMgdGVzdCBpcyBtZWFuaW5nZnVsIGV2ZW4gd2l0aCBzaXplIDwgMkcsIGFzIGxvbmcgYXMgdGhlCiAgICAgIyBkb3VibGVkIHN0cmluZyBpcyA+IDJHIChidXQgaXQgdGVzdHMgbW9yZSBpZiBib3RoIGFyZSA+IDJHIDopCkBAIC01ODAsMjQgKzU4MCwyNCBAQAogICAgICAgICBlZGdlID0gJy0nICogKHNpemUgLy8gMikKICAgICAgICAgcyA9ICcnLmpvaW4oW2VkZ2UsIFNVQlNUUiwgZWRnZV0pCiAgICAgICAgIGRlbCBlZGdlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhTVUJTVFIgaW4gcykKLSAgICAgICAgc2VsZi5mYWlsSWYoU1VCU1RSICogMiBpbiBzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJy0nIGluIHMpCi0gICAgICAgIHNlbGYuZmFpbElmKCdhJyBpbiBzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoU1VCU1RSIGluIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoU1VCU1RSICogMiBpbiBzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJy0nIGluIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoJ2EnIGluIHMpCiAgICAgICAgIHMgKz0gJ2EnCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygnYScgaW4gcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBpbiBzKQogCiAgICAgQGJpZ21lbXRlc3QobWluc2l6ZT1fMkcgKyAxMCwgbWVtdXNlPTIpCiAgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmLCBzaXplKToKICAgICAgICAgczEgPSAnLScgKiBzaXplCiAgICAgICAgIHMyID0gJy0nICogc2l6ZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoczEgPT0gczIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMSA9PSBzMikKICAgICAgICAgZGVsIHMyCiAgICAgICAgIHMyID0gczEgKyAnYScKLSAgICAgICAgc2VsZi5mYWlsSWYoczEgPT0gczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoczEgPT0gczIpCiAgICAgICAgIGRlbCBzMgogICAgICAgICBzMiA9ICcuJyAqIHNpemUKLSAgICAgICAgc2VsZi5mYWlsSWYoczEgPT0gczIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoczEgPT0gczIpCiAKICAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyArIDEwLCBtZW11c2U9MSkKICAgICBkZWYgdGVzdF9oYXNoKHNlbGYsIHNpemUpOgpAQCAtNjExLDcgKzYxMSw3IEBACiAgICAgICAgIGgxID0gaGFzaChzKQogICAgICAgICBkZWwgcwogICAgICAgICBzID0gJ1x4MDAnICogKHNpemUgKyAxKQotICAgICAgICBzZWxmLmZhaWxJZihoMSA9PSBoYXNoKHMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGgxID09IGhhc2gocykpCiAKIGNsYXNzIFR1cGxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTYyOCwxMyArNjI4LDEzIEBACiAgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmLCBzaXplKToKICAgICAgICAgdDEgPSAodScnLCkgKiBzaXplCiAgICAgICAgIHQyID0gKHUnJywpICogc2l6ZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA9PSB0MikKICAgICAgICAgZGVsIHQyCiAgICAgICAgIHQyID0gKHUnJywpICogKHNpemUgKyAxKQotICAgICAgICBzZWxmLmZhaWxJZih0MSA9PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0MSA9PSB0MikKICAgICAgICAgZGVsIHQyCiAgICAgICAgIHQyID0gKDEsKSAqIHNpemUKLSAgICAgICAgc2VsZi5mYWlsSWYodDEgPT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDEgPT0gdDIpCiAKICAgICAjIFRlc3QgY29uY2F0ZW5hdGluZyBpbnRvIGEgc2luZ2xlIHR1cGxlIG9mIG1vcmUgdGhhbiAyRyBpbiBsZW5ndGgsCiAgICAgIyBhbmQgY29uY2F0ZW5hdGluZyBhIHR1cGxlIG9mIG1vcmUgdGhhbiAyRyBpbiBsZW5ndGggc2VwYXJhdGVseSwgc28KQEAgLTY1OSw5ICs2NTksOSBAQAogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYsIHNpemUpOgogICAgICAgICB0ID0gKDEsIDIsIDMsIDQsIDUpICogc2l6ZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4odCksIHNpemUgKiA1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoNSBpbiB0KQotICAgICAgICBzZWxmLmZhaWxJZigoMSwgMiwgMywgNCwgNSkgaW4gdCkKLSAgICAgICAgc2VsZi5mYWlsSWYoMCBpbiB0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoNSBpbiB0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCgxLCAyLCAzLCA0LCA1KSBpbiB0KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKDAgaW4gdCkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT04KQogICAgIGRlZiB0ZXN0X2hhc2goc2VsZiwgc2l6ZSk6CkBAIC02NjksNyArNjY5LDcgQEAKICAgICAgICAgaDEgPSBoYXNoKHQxKQogICAgICAgICBkZWwgdDEKICAgICAgICAgdDIgPSAoMCwpICogKHNpemUgKyAxKQotICAgICAgICBzZWxmLmZhaWxJZihoMSA9PSBoYXNoKHQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoMSA9PSBoYXNoKHQyKSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT04KQogICAgIGRlZiB0ZXN0X2luZGV4X2FuZF9zbGljZShzZWxmLCBzaXplKToKQEAgLTc2MiwxMyArNzYyLDEzIEBACiAgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmLCBzaXplKToKICAgICAgICAgbDEgPSBbdScnXSAqIHNpemUKICAgICAgICAgbDIgPSBbdScnXSAqIHNpemUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGwxID09IGwyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobDEgPT0gbDIpCiAgICAgICAgIGRlbCBsMgogICAgICAgICBsMiA9IFt1JyddICogKHNpemUgKyAxKQotICAgICAgICBzZWxmLmZhaWxJZihsMSA9PSBsMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsMSA9PSBsMikKICAgICAgICAgZGVsIGwyCiAgICAgICAgIGwyID0gWzJdICogc2l6ZQotICAgICAgICBzZWxmLmZhaWxJZihsMSA9PSBsMikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsMSA9PSBsMikKIAogICAgICMgVGVzdCBjb25jYXRlbmF0aW5nIGludG8gYSBzaW5nbGUgbGlzdCBvZiBtb3JlIHRoYW4gMkcgaW4gbGVuZ3RoLAogICAgICMgYW5kIGNvbmNhdGVuYXRpbmcgYSBsaXN0IG9mIG1vcmUgdGhhbiAyRyBpbiBsZW5ndGggc2VwYXJhdGVseSwgc28KQEAgLTc5Myw4ICs3OTMsOCBAQAogICAgICAgICBsID0gW3N5cy5zdGRvdXRdICogc2l6ZQogICAgICAgICBsICs9IGwKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplICogMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxbMF0gaXMgbFstMV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhsW3NpemUgLSAxXSBpcyBsW3NpemUgKyAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxbMF0gaXMgbFstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsW3NpemUgLSAxXSBpcyBsW3NpemUgKyAxXSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDIgKyAyLCBtZW11c2U9MjQpCiAgICAgZGVmIHRlc3RfaW5wbGFjZV9jb25jYXRfc21hbGwoc2VsZiwgc2l6ZSk6CkBAIC04MDgsMTQgKzgwOCwxNCBAQAogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYsIHNpemUpOgogICAgICAgICBsID0gWzEsIDIsIDMsIDQsIDVdICogc2l6ZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUgKiA1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoNSBpbiBsKQotICAgICAgICBzZWxmLmZhaWxJZihbMSwgMiwgMywgNCwgNV0gaW4gbCkKLSAgICAgICAgc2VsZi5mYWlsSWYoMCBpbiBsKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoNSBpbiBsKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKFsxLCAyLCAzLCA0LCA1XSBpbiBsKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKDAgaW4gbCkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT04KQogICAgIGRlZiB0ZXN0X2hhc2goc2VsZiwgc2l6ZSk6CiAgICAgICAgIGwgPSBbMF0gKiBzaXplCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIGwpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgbCkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHICsgMTAsIG1lbXVzZT04KQogICAgIGRlZiB0ZXN0X2luZGV4X2FuZF9zbGljZShzZWxmLCBzaXplKToKQEAgLTg3NSw3ICs4NzUsNyBAQAogICAgICMgTGlrZSB0ZXN0X2NvbmNhdCwgc3BsaXQgaW4gdHdvLgogICAgIGRlZiBiYXNpY190ZXN0X3JlcGVhdChzZWxmLCBzaXplKToKICAgICAgICAgbCA9IFtdICogc2l6ZQotICAgICAgICBzZWxmLmZhaWxJZihsKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGwpCiAgICAgICAgIGwgPSBbJyddICogc2l6ZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obCksIHNpemUpCiAgICAgICAgIGwgPSBsICogMgpAQCAtODkzLDEzICs4OTMsMTMgQEAKICAgICAgICAgbCA9IFsnJ10KICAgICAgICAgbCAqPSBzaXplCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihsKSwgc2l6ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxbMF0gaXMgbFstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsWzBdIGlzIGxbLTFdKQogICAgICAgICBkZWwgbAogCiAgICAgICAgIGwgPSBbJyddICogc2l6ZQogICAgICAgICBsICo9IDIKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplICogMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxbc2l6ZSAtIDFdIGlzIGxbLTFdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobFtzaXplIC0gMV0gaXMgbFstMV0pCiAKICAgICBAYmlnbWVtdGVzdChtaW5zaXplPV8yRyAvLyAyICsgMiwgbWVtdXNlPTE2KQogICAgIGRlZiB0ZXN0X2lucGxhY2VfcmVwZWF0X3NtYWxsKHNlbGYsIHNpemUpOgpAQCAtOTMzLDggKzkzMyw4IEBACiAgICAgICAgIGwgPSBbb2JqZWN0KCldICogc2l6ZQogICAgICAgICBsLmFwcGVuZChvYmplY3QoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplKzEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhsWy0zXSBpcyBsWy0yXSkKLSAgICAgICAgc2VsZi5mYWlsSWYobFstMl0gaXMgbFstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsWy0zXSBpcyBsWy0yXSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsWy0yXSBpcyBsWy0xXSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDUgKyAyLCBtZW11c2U9OCAqIDUpCiAgICAgZGVmIHRlc3RfY291bnQoc2VsZiwgc2l6ZSk6CkBAIC05NDYsOCArOTQ2LDggQEAKICAgICAgICAgbCA9IFtmaWxlXSAqIHNpemUKICAgICAgICAgbC5leHRlbmQobCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGwpLCBzaXplICogMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxbMF0gaXMgbFstMV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhsW3NpemUgLSAxXSBpcyBsW3NpemUgKyAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxbMF0gaXMgbFstMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsW3NpemUgLSAxXSBpcyBsW3NpemUgKyAxXSkKIAogICAgIEBiaWdtZW10ZXN0KG1pbnNpemU9XzJHIC8vIDIgKyAyLCBtZW11c2U9MTYpCiAgICAgZGVmIHRlc3RfZXh0ZW5kX3NtYWxsKHNlbGYsIHNpemUpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weSBiL0xpYi90ZXN0L3Rlc3RfYmluYXNjaWkucHkKaW5kZXggZWE4YmUzMS4uYzUzMWM2NSAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9iaW5hc2NpaS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2JpbmFzY2lpLnB5CkBAIC0xNCw4ICsxNCw4IEBACiAKICAgICBkZWYgdGVzdF9leGNlcHRpb25zKHNlbGYpOgogICAgICAgICAjIENoZWNrIG1vZHVsZSBleGNlcHRpb25zCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc3N1YmNsYXNzKGJpbmFzY2lpLkVycm9yLCBFeGNlcHRpb24pKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhiaW5hc2NpaS5JbmNvbXBsZXRlLCBFeGNlcHRpb24pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhiaW5hc2NpaS5FcnJvciwgRXhjZXB0aW9uKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoYmluYXNjaWkuSW5jb21wbGV0ZSwgRXhjZXB0aW9uKSkKIAogICAgIGRlZiB0ZXN0X2Z1bmN0aW9ucyhzZWxmKToKICAgICAgICAgIyBDaGVjayBwcmVzZW5jZSBvZiBhbGwgZnVuY3Rpb25zCkBAIC0yNiwxMCArMjYsMTAgQEAKICAgICAgICAgICAgICAgICBwcmVmaXhlcy5leHRlbmQoWyJjcmNfIiwgInJsZWNvZGVfIiwgInJsZWRlY29kZV8iXSkKICAgICAgICAgICAgIGZvciBwcmVmaXggaW4gcHJlZml4ZXM6CiAgICAgICAgICAgICAgICAgbmFtZSA9IHByZWZpeCArIHN1ZmZpeAotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjYWxsYWJsZShnZXRhdHRyKGJpbmFzY2lpLCBuYW1lKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNhbGxhYmxlKGdldGF0dHIoYmluYXNjaWksIG5hbWUpKSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGF0dHIoYmluYXNjaWksIG5hbWUpKQogICAgICAgICBmb3IgbmFtZSBpbiAoImhleGxpZnkiLCAidW5oZXhsaWZ5Iik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oY2FsbGFibGUoZ2V0YXR0cihiaW5hc2NpaSwgbmFtZSkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNhbGxhYmxlKGdldGF0dHIoYmluYXNjaWksIG5hbWUpKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXR0cihiaW5hc2NpaSwgbmFtZSkpCiAKICAgICBkZWYgdGVzdF9iYXNlNjR2YWxpZChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYmlub3AucHkgYi9MaWIvdGVzdC90ZXN0X2Jpbm9wLnB5CmluZGV4IGIzZDlhNjIuLjhhZThmNDIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYmlub3AucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iaW5vcC5weQpAQCAtMjIwLDEwICsyMjAsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnY2QoLTEwLCAtMiksIC0yKQogICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCAyMCk6CiAgICAgICAgICAgICBmb3IgaiBpbiByYW5nZSgxLCAyMCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGdjZChpLCBqKSA+IDApCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGdjZCgtaSwgaikgPCAwKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhnY2QoaSwgLWopID4gMCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZ2NkKC1pLCAtaikgPCAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnY2QoaSwgaikgPiAwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnY2QoLWksIGopIDwgMCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2NkKGksIC1qKSA+IDApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdjZCgtaSwgLWopIDwgMCkKIAogICAgIGRlZiB0ZXN0X2NvbnN0cnVjdG9yKHNlbGYpOgogICAgICAgICBhID0gUmF0KDEwLCAxNSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYmlzZWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9iaXNlY3QucHkKaW5kZXggNjZiYWU0OC4uOTM0YmE4YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9iaXNlY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9iaXNlY3QucHkKQEAgLTEzMCwxNCArMTMwLDE0IEBACiAgICAgICAgICAgICBlbGVtID0gcmFuZHJhbmdlKC0xLCBuKzEpCiAgICAgICAgICAgICBpcCA9IHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0KGRhdGEsIGVsZW0pCiAgICAgICAgICAgICBpZiBpcCA8IGxlbihkYXRhKToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZWxlbSA8PSBkYXRhW2lwXSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWxlbSA8PSBkYXRhW2lwXSkKICAgICAgICAgICAgIGlmIGlwID4gMDoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZGF0YVtpcC0xXSA8IGVsZW0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRhdGFbaXAtMV0gPCBlbGVtKQogICAgICAgICAgICAgaXAgPSBzZWxmLm1vZHVsZS5iaXNlY3RfcmlnaHQoZGF0YSwgZWxlbSkKICAgICAgICAgICAgIGlmIGlwIDwgbGVuKGRhdGEpOgotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhlbGVtIDwgZGF0YVtpcF0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsZW0gPCBkYXRhW2lwXSkKICAgICAgICAgICAgIGlmIGlwID4gMDoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZGF0YVtpcC0xXSA8PSBlbGVtKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhW2lwLTFdIDw9IGVsZW0pCiAKICAgICBkZWYgdGVzdF9vcHRpb25hbFNsaWNpbmcoc2VsZik6CiAgICAgICAgIGZvciBmdW5jLCBkYXRhLCBlbGVtLCBleHBlY3RlZCBpbiBzZWxmLnByZWNvbXB1dGVkQ2FzZXM6CkBAIC0xNDYsMTUgKzE0NiwxNSBAQAogICAgICAgICAgICAgICAgIGZvciBoaSBpbiB4cmFuZ2UoMyw4KToKICAgICAgICAgICAgICAgICAgICAgaGkgPSBtaW4obGVuKGRhdGEpLCBoaSkKICAgICAgICAgICAgICAgICAgICAgaXAgPSBmdW5jKGRhdGEsIGVsZW0sIGxvLCBoaSkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxvIDw9IGlwIDw9IGhpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobG8gPD0gaXAgPD0gaGkpCiAgICAgICAgICAgICAgICAgICAgIGlmIGZ1bmMgaXMgc2VsZi5tb2R1bGUuYmlzZWN0X2xlZnQgYW5kIGlwIDwgaGk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZWxlbSA8PSBkYXRhW2lwXSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbGVtIDw9IGRhdGFbaXBdKQogICAgICAgICAgICAgICAgICAgICBpZiBmdW5jIGlzIHNlbGYubW9kdWxlLmJpc2VjdF9sZWZ0IGFuZCBpcCA+IGxvOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRhdGFbaXAtMV0gPCBlbGVtKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRhdGFbaXAtMV0gPCBlbGVtKQogICAgICAgICAgICAgICAgICAgICBpZiBmdW5jIGlzIHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCBhbmQgaXAgPCBoaToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhlbGVtIDwgZGF0YVtpcF0pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWxlbSA8IGRhdGFbaXBdKQogICAgICAgICAgICAgICAgICAgICBpZiBmdW5jIGlzIHNlbGYubW9kdWxlLmJpc2VjdF9yaWdodCBhbmQgaXAgPiBsbzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhkYXRhW2lwLTFdIDw9IGVsZW0pCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZGF0YVtpcC0xXSA8PSBlbGVtKQogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGlwLCBtYXgobG8sIG1pbihoaSwgZXhwZWN0ZWQpKSkKIAogICAgIGRlZiB0ZXN0X2JhY2tjb21wYXRpYmlsaXR5KHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ib29sLnB5IGIvTGliL3Rlc3QvdGVzdF9ib29sLnB5CmluZGV4IDMzMTg1YTAuLjJhOWVmNWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYm9vbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Jvb2wucHkKQEAgLTgsMTAgKzgsMTAgQEAKIGNsYXNzIEJvb2xUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBhc3NlcnRJcyhzZWxmLCBhLCBiKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKIAogICAgIGRlZiBhc3NlcnRJc05vdChzZWxmLCBhLCBiKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgbm90IGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIGlzIG5vdCBiKQogCiAgICAgZGVmIHRlc3Rfc3ViY2xhc3Moc2VsZik6CiAgICAgICAgIHRyeToKQEAgLTIzMywxNSArMjMzLDE1IEBACiAKICAgICBkZWYgdGVzdF9ib29sZWFuKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUgJiAxLCAxKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGlzaW5zdGFuY2UoVHJ1ZSAmIDEsIGJvb2wpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGlzaW5zdGFuY2UoVHJ1ZSAmIDEsIGJvb2wpKQogICAgICAgICBzZWxmLmFzc2VydElzKFRydWUgJiBUcnVlLCBUcnVlKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSB8IDEsIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNpbnN0YW5jZShUcnVlIHwgMSwgYm9vbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNpbnN0YW5jZShUcnVlIHwgMSwgYm9vbCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0SXMoVHJ1ZSB8IFRydWUsIFRydWUpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlIF4gMSwgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc2luc3RhbmNlKFRydWUgXiAxLCBib29sKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc2luc3RhbmNlKFRydWUgXiAxLCBib29sKSkKICAgICAgICAgc2VsZi5hc3NlcnRJcyhUcnVlIF4gVHJ1ZSwgRmFsc2UpCiAKICAgICBkZWYgdGVzdF9maWxlY2xvc2VkKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ic2RkYi5weSBiL0xpYi90ZXN0L3Rlc3RfYnNkZGIucHkKaW5kZXggNTZkYWRlNC4uYTRhZjBmMyAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9ic2RkYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2JzZGRiLnB5CkBAIC00Myw4ICs0Myw4IEBACiAgICAgZGVmIHRlc3RfY2hhbmdlKHNlbGYpOgogICAgICAgICBzZWxmLmZbJ3InXSA9ICdkaXNjb3ZlcmVkJwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZlsnciddLCAnZGlzY292ZXJlZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygncicgaW4gc2VsZi5mLmtleXMoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdkaXNjb3ZlcmVkJyBpbiBzZWxmLmYudmFsdWVzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgncicgaW4gc2VsZi5mLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdkaXNjb3ZlcmVkJyBpbiBzZWxmLmYudmFsdWVzKCkpCiAKICAgICBkZWYgdGVzdF9jbG9zZV9hbmRfcmVvcGVuKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmZuYW1lIGlzIE5vbmU6CkBAIC0xNzYsNyArMTc2LDcgQEAKIAogICAgIGRlZiB0ZXN0X2ZpcnN0X3doaWxlX2RlbGV0aW5nKHNlbGYpOgogICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAxNzI1ODU2Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5kKSA+PSAyLCAidGVzdCByZXF1aXJlcyA+PTIgaXRlbXMiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuZCkgPj0gMiwgInRlc3QgcmVxdWlyZXMgPj0yIGl0ZW1zIikKICAgICAgICAgZm9yIF8gaW4gc2VsZi5kOgogICAgICAgICAgICAga2V5ID0gc2VsZi5mLmZpcnN0KClbMF0KICAgICAgICAgICAgIGRlbCBzZWxmLmZba2V5XQpAQCAtMTg0LDcgKzE4NCw3IEBACiAKICAgICBkZWYgdGVzdF9sYXN0X3doaWxlX2RlbGV0aW5nKHNlbGYpOgogICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAxNzI1ODU2J3MgZXZpbCB0d2luCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5kKSA+PSAyLCAidGVzdCByZXF1aXJlcyA+PTIgaXRlbXMiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuZCkgPj0gMiwgInRlc3QgcmVxdWlyZXMgPj0yIGl0ZW1zIikKICAgICAgICAgZm9yIF8gaW4gc2VsZi5kOgogICAgICAgICAgICAga2V5ID0gc2VsZi5mLmxhc3QoKVswXQogICAgICAgICAgICAgZGVsIHNlbGYuZltrZXldCkBAIC0xOTUsMTMgKzE5NSwxMyBAQAogCiAgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CiAgICAgICAgIGZvciBrIGluIHNlbGYuZDoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhrIGluIHNlbGYuZikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdub3QgaGVyZScgbm90IGluIHNlbGYuZikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrIGluIHNlbGYuZikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdub3QgaGVyZScgbm90IGluIHNlbGYuZikKIAogICAgIGRlZiB0ZXN0X2hhc19rZXkoc2VsZik6CiAgICAgICAgIGZvciBrIGluIHNlbGYuZDoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLmYuaGFzX2tleShrKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBzZWxmLmYuaGFzX2tleSgnbm90IGhlcmUnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmYuaGFzX2tleShrKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLmYuaGFzX2tleSgnbm90IGhlcmUnKSkKIAogICAgIGRlZiB0ZXN0X2NsZWFyKHNlbGYpOgogICAgICAgICBzZWxmLmYuY2xlYXIoKQpAQCAtMjUzLDExICsyNTMsMTEgQEAKICAgICAgICAgICAgIGlmIGRlYnVnOiBwcmludCAiSyIKIAogICAgICAgICAjIHRlc3QgdGhlIGxlZ2FjeSBjdXJzb3IgaW50ZXJmYWNlIG1peGVkIHdpdGggd3JpdGVzCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLmYuZmlyc3QoKVswXSBpbiBzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmYuZmlyc3QoKVswXSBpbiBzZWxmLmQpCiAgICAgICAgIGsgPSBzZWxmLmYubmV4dCgpWzBdCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhrIGluIHNlbGYuZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgaW4gc2VsZi5kKQogICAgICAgICBzZWxmLmZba10gPSAiYmUgZ29uZSB3aXRoIHllIGRlYWRsb2NrcyIKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuZltrXSwgImJlIGdvbmUgd2l0aCB5ZSBkZWFkbG9ja3MiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5mW2tdLCAiYmUgZ29uZSB3aXRoIHllIGRlYWRsb2NrcyIpCiAKICAgICBkZWYgdGVzdF9mb3JfY3Vyc29yX21lbWxlYWsoc2VsZik6CiAgICAgICAgICMgZG8gdGhlIGJzZGRiLl9EQldpdGhDdXJzb3IgaXRlcmF0b3IgaW50ZXJuYWxzIGxlYWsgY3Vyc29ycz8KQEAgLTI3NSwyMSArMjc1LDIxIEBACiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYzEsIG5jMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYzEsIG5jNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5jMyA9PSBuYzErMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5jMyA9PSBuYzErMSkKIAogICAgIGRlZiB0ZXN0X3BvcGl0ZW0oc2VsZik6CiAgICAgICAgIGssIHYgPSBzZWxmLmYucG9waXRlbSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhrIGluIHNlbGYuZCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHYgaW4gc2VsZi5kLnZhbHVlcygpKQotICAgICAgICBzZWxmLmFzc2VydF8oayBub3QgaW4gc2VsZi5mKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoayBpbiBzZWxmLmQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGluIHNlbGYuZC52YWx1ZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgbm90IGluIHNlbGYuZikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5kKS0xLCBsZW4oc2VsZi5mKSkKIAogICAgIGRlZiB0ZXN0X3BvcChzZWxmKToKICAgICAgICAgayA9ICd3JwogICAgICAgICB2ID0gc2VsZi5mLnBvcChrKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHYsIHNlbGYuZFtrXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGsgbm90IGluIHNlbGYuZikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHYgbm90IGluIHNlbGYuZi52YWx1ZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgbm90IGluIHNlbGYuZikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgbm90IGluIHNlbGYuZi52YWx1ZXMoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VsZi5kKS0xLCBsZW4oc2VsZi5mKSkKIAogICAgIGRlZiB0ZXN0X2dldChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnVmaW8ucHkgYi9MaWIvdGVzdC90ZXN0X2J1ZmlvLnB5CmluZGV4IDQ4Y2MwZjMuLjEwOGIxZTEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnVmaW8ucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9idWZpby5weQpAQCAtMzQsNyArMzQsNyBAQAogICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCBzKQogICAgICAgICAgICAgbGluZSA9IGYucmVhZGxpbmUoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBsaW5lKSAjIE11c3QgYmUgYXQgRU9GCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGxpbmUpICMgTXVzdCBiZSBhdCBFT0YKICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc3VwcG9ydC51bmxpbmsoc3VwcG9ydC5URVNURk4pCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkgYi9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKaW5kZXggMTljZTllYy4uODBlMWI4MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQpAQCAtMTIyLDcgKzEyMiw3IEBACiAKICAgICBkZWYgdGVzdF9uZWcoc2VsZik6CiAgICAgICAgIHggPSAtc3lzLm1heGludC0xCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHgsIGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHgsIGludCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoLXgsIHN5cy5tYXhpbnQrMSkKIAogICAgIGRlZiB0ZXN0X2FwcGx5KHNlbGYpOgpAQCAtMTUyLDE5ICsxNTIsMTkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBhcHBseSwgaWQsICg0MiwpLCA0MikKIAogICAgIGRlZiB0ZXN0X2NhbGxhYmxlKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oY2FsbGFibGUobGVuKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNhbGxhYmxlKGxlbikpCiAgICAgICAgIGRlZiBmKCk6IHBhc3MKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNhbGxhYmxlKGYpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2FsbGFibGUoZikpCiAgICAgICAgIGNsYXNzIEM6CiAgICAgICAgICAgICBkZWYgbWV0aChzZWxmKTogcGFzcwotICAgICAgICBzZWxmLmFzc2VydF8oY2FsbGFibGUoQykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjYWxsYWJsZShDKSkKICAgICAgICAgeCA9IEMoKQotICAgICAgICBzZWxmLmFzc2VydF8oY2FsbGFibGUoeC5tZXRoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjYWxsYWJsZSh4KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNhbGxhYmxlKHgubWV0aCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY2FsbGFibGUoeCkpCiAgICAgICAgIGNsYXNzIEQoQyk6CiAgICAgICAgICAgICBkZWYgX19jYWxsX18oc2VsZik6IHBhc3MKICAgICAgICAgeSA9IEQoKQotICAgICAgICBzZWxmLmFzc2VydF8oY2FsbGFibGUoeSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjYWxsYWJsZSh5KSkKICAgICAgICAgeSgpCiAKICAgICBkZWYgdGVzdF9jaHIoc2VsZik6CkBAIC0xOTMsOSArMTkzLDkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXApCiAKICAgICBkZWYgdGVzdF9jb2VyY2Uoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZmNtcChjb2VyY2UoMSwgMS4xKSwgKDEuMCwgMS4xKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZmNtcChjb2VyY2UoMSwgMS4xKSwgKDEuMCwgMS4xKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY29lcmNlKDEsIDFMKSwgKDFMLCAxTCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZmNtcChjb2VyY2UoMUwsIDEuMSksICgxLjAsIDEuMSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGZjbXAoY29lcmNlKDFMLCAxLjEpLCAoMS4wLCAxLjEpKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjb2VyY2UpCiAgICAgICAgIGNsYXNzIEJhZE51bWJlcjoKICAgICAgICAgICAgIGRlZiBfX2NvZXJjZV9fKHNlbGYsIG90aGVyKToKQEAgLTIzNCwxMSArMjM0LDExIEBACiAKICAgICAgICAgIyBkaXIoKSAtIGxvY2FsIHNjb3BlCiAgICAgICAgIGxvY2FsX3ZhciA9IDEKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdsb2NhbF92YXInIGluIGRpcigpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2xvY2FsX3ZhcicgaW4gZGlyKCkpCiAKICAgICAgICAgIyBkaXIobW9kdWxlKQogICAgICAgICBpbXBvcnQgc3lzCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnZXhpdCcgaW4gZGlyKHN5cykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZXhpdCcgaW4gZGlyKHN5cykpCiAKICAgICAgICAgIyBkaXIobW9kdWxlX3dpdGhfaW52YWxpZF9fZGljdF9fKQogICAgICAgICBpbXBvcnQgdHlwZXMKQEAgLTI0OCw4ICsyNDgsOCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGRpciwgZikKIAogICAgICAgICAjIGRpcih0eXBlKQotICAgICAgICBzZWxmLmFzc2VydF8oInN0cmlwIiBpbiBkaXIoc3RyKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJfX21yb19fIiBub3QgaW4gZGlyKHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgic3RyaXAiIGluIGRpcihzdHIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIl9fbXJvX18iIG5vdCBpbiBkaXIoc3RyKSkKIAogICAgICAgICAjIGRpcihvYmopCiAgICAgICAgIGNsYXNzIEZvbyhvYmplY3QpOgpAQCAtMjU4LDEzICsyNTgsMTMgQEAKICAgICAgICAgICAgICAgICBzZWxmLnkgPSA4CiAgICAgICAgICAgICAgICAgc2VsZi56ID0gOQogICAgICAgICBmID0gRm9vKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJ5IiBpbiBkaXIoZikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgieSIgaW4gZGlyKGYpKQogCiAgICAgICAgICMgZGlyKG9ial9ub19fZGljdF9fKQogICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFtdCiAgICAgICAgIGYgPSBGb28oKQotICAgICAgICBzZWxmLmFzc2VydF8oIl9fcmVwcl9fIiBpbiBkaXIoZikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiX19yZXByX18iIGluIGRpcihmKSkKIAogICAgICAgICAjIGRpcihvYmpfbm9fX2NsYXNzX193aXRoX19kaWN0X18pCiAgICAgICAgICMgKGFuIHVnbHkgdHJpY2sgdG8gY2F1c2UgZ2V0YXR0cihmLCAiX19jbGFzc19fIikgdG8gZmFpbCkKQEAgLTI3MywxNSArMjczLDE1IEBACiAgICAgICAgICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgICAgICAgICAgc2VsZi5iYXIgPSAid293IgogICAgICAgICBmID0gRm9vKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJfX3JlcHJfXyIgbm90IGluIGRpcihmKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJiYXIiIGluIGRpcihmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJfX3JlcHJfXyIgbm90IGluIGRpcihmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJiYXIiIGluIGRpcihmKSkKIAogICAgICAgICAjIGRpcihvYmpfdXNpbmcgX19kaXJfXykKICAgICAgICAgY2xhc3MgRm9vKG9iamVjdCk6CiAgICAgICAgICAgICBkZWYgX19kaXJfXyhzZWxmKToKICAgICAgICAgICAgICAgICByZXR1cm4gWyJrYW4iLCAiZ2EiLCAicm9vIl0KICAgICAgICAgZiA9IEZvbygpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkaXIoZikgPT0gWyJnYSIsICJrYW4iLCAicm9vIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaXIoZikgPT0gWyJnYSIsICJrYW4iLCAicm9vIl0pCiAKICAgICAgICAgIyBkaXIob2JqX19kaXJfX25vdF9saXN0KQogICAgICAgICBjbGFzcyBGb28ob2JqZWN0KToKQEAgLTMwOSwxMCArMzA5LDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGl2bW9kKC1zeXMubWF4aW50LTEsIC0xKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAoc3lzLm1heGludCsxLCAwKSkKIAotICAgICAgICBzZWxmLmFzc2VydF8obm90IGZjbXAoZGl2bW9kKDMuMjUsIDEuMCksICgzLjAsIDAuMjUpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBmY21wKGRpdm1vZCgtMy4yNSwgMS4wKSwgKC00LjAsIDAuNzUpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBmY21wKGRpdm1vZCgzLjI1LCAtMS4wKSwgKC00LjAsIC0wLjc1KSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZmNtcChkaXZtb2QoLTMuMjUsIC0xLjApLCAoMy4wLCAtMC4yNSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGZjbXAoZGl2bW9kKDMuMjUsIDEuMCksICgzLjAsIDAuMjUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmY21wKGRpdm1vZCgtMy4yNSwgMS4wKSwgKC00LjAsIDAuNzUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmY21wKGRpdm1vZCgzLjI1LCAtMS4wKSwgKC00LjAsIC0wLjc1KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZmNtcChkaXZtb2QoLTMuMjUsIC0xLjApLCAoMy4wLCAtMC4yNSkpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGl2bW9kKQogCkBAIC01NzEsMTEgKzU3MSwxMSBAQAogICAgICAgICAgICAgICAgIGZvciBmdW5jIGluIGZ1bmNzOgogICAgICAgICAgICAgICAgICAgICBvdXRwID0gZmlsdGVyKGZ1bmMsIGNscyhpbnApKQogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG91dHAsIGV4cCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc2luc3RhbmNlKG91dHAsIGNscykpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNpbnN0YW5jZShvdXRwLCBjbHMpKQogCiAgICAgZGVmIHRlc3RfZ2V0YXR0cihzZWxmKToKICAgICAgICAgaW1wb3J0IHN5cwotICAgICAgICBzZWxmLmFzc2VydF8oZ2V0YXR0cihzeXMsICdzdGRvdXQnKSBpcyBzeXMuc3Rkb3V0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2V0YXR0cihzeXMsICdzdGRvdXQnKSBpcyBzeXMuc3Rkb3V0KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGF0dHIsIHN5cywgMSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhdHRyLCBzeXMsIDEsICJmb28iKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGF0dHIpCkBAIC01ODQsNyArNTg0LDcgQEAKIAogICAgIGRlZiB0ZXN0X2hhc2F0dHIoc2VsZik6CiAgICAgICAgIGltcG9ydCBzeXMKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoc3lzLCAnc3Rkb3V0JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHN5cywgJ3N0ZG91dCcpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2F0dHIsIHN5cywgMSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNhdHRyKQogICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CkBAIC02NDcsOSArNjQ3LDkgQEAKICAgICBkZWYgdGVzdF9pbnRlcm4oc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW50ZXJuKQogICAgICAgICBzID0gIm5ldmVyIGludGVybmVkIGJlZm9yZSIKLSAgICAgICAgc2VsZi5hc3NlcnRfKGludGVybihzKSBpcyBzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50ZXJuKHMpIGlzIHMpCiAgICAgICAgIHMyID0gcy5zd2FwY2FzZSgpLnN3YXBjYXNlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGludGVybihzMikgaXMgcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludGVybihzMikgaXMgcykKIAogICAgICAgICAjIFN1YmNsYXNzZXMgb2Ygc3RyaW5nIGNhbid0IGJlIGludGVybmVkLCBiZWNhdXNlIHRoZXkKICAgICAgICAgIyBwcm92aWRlIHRvbyBtdWNoIG9wcG9ydHVuaXR5IGZvciBpbnNhbmUgdGhpbmdzIHRvIGhhcHBlbi4KQEAgLTY5MCwxMSArNjkwLDExIEBACiAgICAgICAgIGMgPSBDKCkKICAgICAgICAgZCA9IEQoKQogICAgICAgICBlID0gRSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGMsIEMpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShkLCBDKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc2luc3RhbmNlKGUsIEMpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGlzaW5zdGFuY2UoYywgRCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNpbnN0YW5jZSgnZm9vJywgRSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGMsIEMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShkLCBDKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc2luc3RhbmNlKGUsIEMpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGlzaW5zdGFuY2UoYywgRCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNpbnN0YW5jZSgnZm9vJywgRSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXNpbnN0YW5jZSwgRSwgJ2ZvbycpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaXNpbnN0YW5jZSkKIApAQCAtNzA4LDkgKzcwOCw5IEBACiAgICAgICAgIGMgPSBDKCkKICAgICAgICAgZCA9IEQoKQogICAgICAgICBlID0gRSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc3N1YmNsYXNzKEQsIEMpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhDLCBDKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc3N1YmNsYXNzKEMsIEQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhELCBDKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQywgQykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNzdWJjbGFzcyhDLCBEKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpc3N1YmNsYXNzLCAnZm9vJywgRSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpc3N1YmNsYXNzLCBFLCAnZm9vJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpc3N1YmNsYXNzKQpAQCAtMTA0MiwxOCArMTA0MiwxOCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJhbmdlKGErNCwgYSwgLTIpLCBbYSs0LCBhKzJdKQogCiAgICAgICAgIHNlcSA9IHJhbmdlKGEsIGIsIGMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIGluIHNlcSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGIgbm90IGluIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaW4gc2VxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiBub3QgaW4gc2VxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXEpLCAyKQogCiAgICAgICAgIHNlcSA9IHJhbmdlKGIsIGEsIC1jKQotICAgICAgICBzZWxmLmFzc2VydF8oYiBpbiBzZXEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIG5vdCBpbiBzZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIGluIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgbm90IGluIHNlcSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VxKSwgMikKIAogICAgICAgICBzZXEgPSByYW5nZSgtYSwgLWIsIC1jKQotICAgICAgICBzZWxmLmFzc2VydF8oLWEgaW4gc2VxKQotICAgICAgICBzZWxmLmFzc2VydF8oLWIgbm90IGluIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC1hIGluIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC1iIG5vdCBpbiBzZXEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlcSksIDIpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCByYW5nZSkKQEAgLTE0NTIsNyArMTQ1Miw3IEBACiAgICAgICAgICMgdGVzdHMgZm9yIG9iamVjdC5fX2Zvcm1hdF9fIHJlYWxseSBiZWxvbmcgZWxzZXdoZXJlLCBidXQKICAgICAgICAgIyAgdGhlcmUncyBubyBnb29kIHBsYWNlIHRvIHB1dCB0aGVtCiAgICAgICAgIHggPSBvYmplY3QoKS5fX2Zvcm1hdF9fKCcnKQotICAgICAgICBzZWxmLmFzc2VydF8oeC5zdGFydHN3aXRoKCc8b2JqZWN0IG9iamVjdCBhdCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5zdGFydHN3aXRoKCc8b2JqZWN0IG9iamVjdCBhdCcpKQogCiAgICAgICAgICMgZmlyc3QgYXJndW1lbnQgdG8gb2JqZWN0Ll9fZm9ybWF0X18gbXVzdCBiZSBzdHJpbmcKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvYmplY3QoKS5fX2Zvcm1hdF9fLCAzKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ieXRlcy5weSBiL0xpYi90ZXN0L3Rlc3RfYnl0ZXMucHkKaW5kZXggMDliNDk3Yi4uZWU0ODA0ZiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9ieXRlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2J5dGVzLnB5CkBAIC0xMDIsMjIgKzEwMiwyMiBAQAogICAgICAgICBiMyA9IHNlbGYudHlwZTJ0ZXN0KFsxLCAzXSkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIxLCBiMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGIyICE9IGIzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYjEgPD0gYjIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhiMSA8PSBiMykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGIxIDwgIGIzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYjEgPj0gYjIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhiMyA+PSBiMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGIzID4gIGIyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYjIgIT0gYjMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiMSA8PSBiMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIxIDw9IGIzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYjEgPCAgYjMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiMSA+PSBiMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIzID49IGIyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYjMgPiAgYjIpCiAKLSAgICAgICAgc2VsZi5mYWlsSWYoYjEgIT0gYjIpCi0gICAgICAgIHNlbGYuZmFpbElmKGIyID09IGIzKQotICAgICAgICBzZWxmLmZhaWxJZihiMSA+ICBiMikKLSAgICAgICAgc2VsZi5mYWlsSWYoYjEgPiAgYjMpCi0gICAgICAgIHNlbGYuZmFpbElmKGIxID49IGIzKQotICAgICAgICBzZWxmLmZhaWxJZihiMSA8ICBiMikKLSAgICAgICAgc2VsZi5mYWlsSWYoYjMgPCAgYjIpCi0gICAgICAgIHNlbGYuZmFpbElmKGIzIDw9IGIyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIxICE9IGIyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIyID09IGIzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIxID4gIGIyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIxID4gIGIzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIxID49IGIzKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIxIDwgIGIyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIzIDwgIGIyKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGIzIDw9IGIyKQogCiAgICAgZGVmIHRlc3RfY29tcGFyZV90b19zdHIoc2VsZik6CiAgICAgICAgIHdhcm5pbmdzLnNpbXBsZWZpbHRlcignaWdub3JlJywgQnl0ZXNXYXJuaW5nKQpAQCAtMjIwLDI3ICsyMjAsMjcgQEAKIAogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgogICAgICAgICBiID0gc2VsZi50eXBlMnRlc3QoYiJhYmMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3JkKCdhJykgaW4gYikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGludChvcmQoJ2EnKSkgaW4gYikKLSAgICAgICAgc2VsZi5mYWlsSWYoMjAwIGluIGIpCi0gICAgICAgIHNlbGYuZmFpbElmKDIwMCBpbiBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3JkKCdhJykgaW4gYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludChvcmQoJ2EnKSkgaW4gYikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgyMDAgaW4gYikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgyMDAgaW4gYikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiAzMDAgaW4gYikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGFtYmRhOiAtMSBpbiBiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogTm9uZSBpbiBiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogZmxvYXQob3JkKCdhJykpIGluIGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiB1ImEiIGluIGIpCiAgICAgICAgIGZvciBmIGluIGJ5dGVzLCBieXRlYXJyYXk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZihiIiIpIGluIGIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZihiImEiKSBpbiBiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGYoYiJiIikgaW4gYikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhmKGIiYyIpIGluIGIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZihiImFiIikgaW4gYikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhmKGIiYmMiKSBpbiBiKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGYoYiJhYmMiKSBpbiBiKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYoZihiImFjIikgaW4gYikKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGYoYiJkIikgaW4gYikKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGYoYiJkYWIiKSBpbiBiKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYoZihiImFiZCIpIGluIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZihiIiIpIGluIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZihiImEiKSBpbiBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYoYiJiIikgaW4gYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmKGIiYyIpIGluIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZihiImFiIikgaW4gYikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmKGIiYmMiKSBpbiBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYoYiJhYmMiKSBpbiBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmKGIiYWMiKSBpbiBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmKGIiZCIpIGluIGIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYoYiJkYWIiKSBpbiBiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmKGIiYWJkIikgaW4gYikKIAogICAgIGRlZiB0ZXN0X2Zyb21oZXgoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi50eXBlMnRlc3QuZnJvbWhleCkKQEAgLTYwMCw3ICs2MDAsNyBAQAogICAgICAgICBiICs9IGIiZGVmIgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiYWJjZGVmIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGIgaXMgYjEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIGlzIGIxKQogICAgICAgICBiICs9IGIieHl6IgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiYWJjZGVmeHl6IikKICAgICAgICAgdHJ5OgpAQCAtNjE2LDcgKzYxNiw3IEBACiAgICAgICAgIGIgKj0gMwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiYWJjYWJjYWJjIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGIgaXMgYjEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIGlzIGIxKQogCiAgICAgZGVmIHRlc3RfaXJlcGVhdF8xY2hhcihzZWxmKToKICAgICAgICAgYiA9IGJ5dGVhcnJheShiIngiKQpAQCAtNjI0LDE3ICs2MjQsMTcgQEAKICAgICAgICAgYiAqPSAxMDAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiIngiKjEwMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiLCBiMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGIgaXMgYjEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIGlzIGIxKQogCiAgICAgZGVmIHRlc3RfYWxsb2Moc2VsZik6CiAgICAgICAgIGIgPSBieXRlYXJyYXkoKQogICAgICAgICBhbGxvYyA9IGIuX19hbGxvY19fKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGFsbG9jID49IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGxvYyA+PSAwKQogICAgICAgICBzZXEgPSBbYWxsb2NdCiAgICAgICAgIGZvciBpIGluIHJhbmdlKDEwMCk6CiAgICAgICAgICAgICBiICs9IGIieCIKICAgICAgICAgICAgIGFsbG9jID0gYi5fX2FsbG9jX18oKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGFsbG9jID49IGxlbihiKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGxvYyA+PSBsZW4oYikpCiAgICAgICAgICAgICBpZiBhbGxvYyBub3QgaW4gc2VxOgogICAgICAgICAgICAgICAgIHNlcS5hcHBlbmQoYWxsb2MpCiAKQEAgLTczNCw3ICs3MzQsNyBAQAogICAgICAgICBhLCBiLCBjID0gYnl0ZWFycmF5KGIieCIpLnBhcnRpdGlvbihiInkiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiIiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhiIGlzIG5vdCBjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiBpcyBub3QgYykKICAgICAgICAgYiArPSBiIiEiCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYiIiKQogICAgICAgICBhLCBiLCBjID0gYnl0ZWFycmF5KGIieCIpLnBhcnRpdGlvbihiInkiKQpAQCAtNzQ0LDcgKzc0NCw3IEBACiAgICAgICAgIGIsIGMsIGEgPSBieXRlYXJyYXkoYiJ4IikucnBhcnRpdGlvbihiInkiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGIsIGIiIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBiIiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhiIGlzIG5vdCBjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiBpcyBub3QgYykKICAgICAgICAgYiArPSBiIiEiCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgYiIiKQogICAgICAgICBjLCBiLCBhID0gYnl0ZWFycmF5KGIieCIpLnJwYXJ0aXRpb24oYiJ5IikKQEAgLTgzNiwxMCArODM2LDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnl0ZXMoYiJhYmMiKSA8PSBiImFiIiwgRmFsc2UpCiAKICAgICBkZWYgdGVzdF9kb2Moc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhieXRlYXJyYXkuX19kb2NfXyAhPSBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYnl0ZWFycmF5Ll9fZG9jX18uc3RhcnRzd2l0aCgiYnl0ZWFycmF5KCIpLCBieXRlYXJyYXkuX19kb2NfXykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGJ5dGVzLl9fZG9jX18gIT0gTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGJ5dGVzLl9fZG9jX18uc3RhcnRzd2l0aCgiYnl0ZXMoIiksIGJ5dGVzLl9fZG9jX18pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShieXRlYXJyYXkuX19kb2NfXyAhPSBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYnl0ZWFycmF5Ll9fZG9jX18uc3RhcnRzd2l0aCgiYnl0ZWFycmF5KCIpLCBieXRlYXJyYXkuX19kb2NfXykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJ5dGVzLl9fZG9jX18gIT0gTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJ5dGVzLl9fZG9jX18uc3RhcnRzd2l0aCgiYnl0ZXMoIiksIGJ5dGVzLl9fZG9jX18pCiAKICAgICBkZWYgdGVzdF9mcm9tX2J5dGVhcnJheShzZWxmKToKICAgICAgICAgc2FtcGxlID0gYnl0ZXMoYiJIZWxsbyB3b3JsZFxuXHg4MFx4ODFceGZlXHhmZiIpCkBAIC05NTgsMjAgKzk1OCwyMCBAQAogY2xhc3MgQnl0ZUFycmF5U3ViY2xhc3NUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhCeXRlQXJyYXlTdWJjbGFzcywgYnl0ZWFycmF5KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoQnl0ZUFycmF5U3ViY2xhc3MoKSwgYnl0ZWFycmF5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQnl0ZUFycmF5U3ViY2xhc3MsIGJ5dGVhcnJheSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKEJ5dGVBcnJheVN1YmNsYXNzKCksIGJ5dGVhcnJheSkpCiAKICAgICAgICAgYSwgYiA9IGIiYWJjZCIsIGIiZWZnaCIKICAgICAgICAgX2EsIF9iID0gQnl0ZUFycmF5U3ViY2xhc3MoYSksIEJ5dGVBcnJheVN1YmNsYXNzKGIpCiAKICAgICAgICAgIyB0ZXN0IGNvbXBhcmlzb24gb3BlcmF0b3JzIHdpdGggc3ViY2xhc3MgaW5zdGFuY2VzCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhfYSA9PSBfYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKF9hICE9IF9iKQotICAgICAgICBzZWxmLmFzc2VydF8oX2EgPCBfYikKLSAgICAgICAgc2VsZi5hc3NlcnRfKF9hIDw9IF9iKQotICAgICAgICBzZWxmLmFzc2VydF8oX2IgPj0gX2EpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhfYiA+IF9hKQotICAgICAgICBzZWxmLmFzc2VydF8oX2EgaXMgbm90IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfYSA9PSBfYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9hICE9IF9iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2EgPCBfYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9hIDw9IF9iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2IgPj0gX2EpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfYiA+IF9hKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2EgaXMgbm90IGEpCiAKICAgICAgICAgIyB0ZXN0IGNvbmNhdCBvZiBzdWJjbGFzcyBpbnN0YW5jZXMKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICsgYiwgX2EgKyBfYikKQEAgLTk3OSw3ICs5NzksNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEgKyBiLCBfYSArIGIpCiAKICAgICAgICAgIyB0ZXN0IHJlcGVhdAotICAgICAgICBzZWxmLmFzc2VydF8oYSo1ID09IF9hKjUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhKjUgPT0gX2EqNSkKIAogICAgIGRlZiB0ZXN0X2pvaW4oc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIGpvaW4gcmV0dXJucyBhIE5FVyBvYmplY3QgZm9yIHNpbmdsZSBpdGVtIHNlcXVlbmNlcwpAQCAtOTg3LDEyICs5ODcsMTIgQEAKICAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCBpdCBpcyBvZiB0aGUgYXBwcm9wcmlhdGUgdHlwZS4KICAgICAgICAgczEgPSBCeXRlQXJyYXlTdWJjbGFzcyhiImFiY2QiKQogICAgICAgICBzMiA9IGJ5dGVhcnJheSgpLmpvaW4oW3MxXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHMxIGlzIG5vdCBzMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUoczIpIGlzIGJ5dGVhcnJheSwgdHlwZShzMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMSBpcyBub3QgczIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHMyKSBpcyBieXRlYXJyYXksIHR5cGUoczIpKQogCiAgICAgICAgICMgVGVzdCByZXZlcnNlLCBjYWxsaW5nIGpvaW4gb24gc3ViY2xhc3MKICAgICAgICAgczMgPSBzMS5qb2luKFtiImFiY2QiXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUoczMpIGlzIGJ5dGVhcnJheSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoczMpIGlzIGJ5dGVhcnJheSkKIAogICAgIGRlZiB0ZXN0X3BpY2tsZShzZWxmKToKICAgICAgICAgYSA9IEJ5dGVBcnJheVN1YmNsYXNzKGIiYWJjZCIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NhcGkucHkgYi9MaWIvdGVzdC90ZXN0X2NhcGkucHkKaW5kZXggODdmZTEzYy4uNGRjMzEwNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jYXBpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2FwaS5weQpAQCAtNDEsNyArNDEsNyBAQAogICAgICAgICAgICAgaWYgY29udGV4dCBhbmQgbm90IGNvbnRleHQuZXZlbnQuaXNfc2V0KCk6CiAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgIGNvdW50ICs9IDEKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjb3VudCA8IDEwMDAwLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvdW50IDwgMTAwMDAsCiAgICAgICAgICAgICAgICAgInRpbWVvdXQgd2FpdGluZyBmb3IgJWkgY2FsbGJhY2tzLCBnb3QgJWkiJShuLCBsZW4obCkpKQogICAgICAgICBpZiBGYWxzZSBhbmQgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CiAgICAgICAgICAgICBwcmludCAiKCVpKSIlKGxlbihsKSwpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NmZ3BhcnNlci5weSBiL0xpYi90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5CmluZGV4IGEwZDgwNTEuLmI5OWRkYzEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2ZncGFyc2VyLnB5CkBAIC04MSwxNiArODEsMTYgQEAKICAgICAgICAgZXEoY2YuZ2V0KCdTcGFjZXMnLCAna2V5IHdpdGggc3BhY2VzJyksICd2YWx1ZScpCiAgICAgICAgIGVxKGNmLmdldCgnU3BhY2VzJywgJ2Fub3RoZXIgd2l0aCBzcGFjZXMnKSwgJ3NwbGF0IScpCiAKLSAgICAgICAgc2VsZi5mYWlsSWYoJ19fbmFtZV9fJyBpbiBjZi5vcHRpb25zKCJGb28gQmFyIiksCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoJ19fbmFtZV9fJyBpbiBjZi5vcHRpb25zKCJGb28gQmFyIiksCiAgICAgICAgICAgICAgICAgICAgICdfX25hbWVfXyAib3B0aW9uIiBzaG91bGQgbm90IGJlIGV4cG9zZWQgYnkgdGhlIEFQSSEnKQogCiAgICAgICAgICMgTWFrZSBzdXJlIHRoZSByaWdodCB0aGluZ3MgaGFwcGVuIGZvciByZW1vdmVfb3B0aW9uKCk7CiAgICAgICAgICMgYWRkZWQgdG8gaW5jbHVkZSBjaGVjayBmb3IgU291cmNlRm9yZ2UgYnVnICMxMjMzMjQ6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhjZi5yZW1vdmVfb3B0aW9uKCdGb28gQmFyJywgJ2ZvbycpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2YucmVtb3ZlX29wdGlvbignRm9vIEJhcicsICdmb28nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmVfb3B0aW9uKCkgZmFpbGVkIHRvIHJlcG9ydCBleGlzdGVuY2Ugb2Ygb3B0aW9uIikKLSAgICAgICAgc2VsZi5mYWlsSWYoY2YuaGFzX29wdGlvbignRm9vIEJhcicsICdmb28nKSwKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjZi5oYXNfb3B0aW9uKCdGb28gQmFyJywgJ2ZvbycpLAogICAgICAgICAgICAgICAgICAgICAicmVtb3ZlX29wdGlvbigpIGZhaWxlZCB0byByZW1vdmUgb3B0aW9uIikKLSAgICAgICAgc2VsZi5mYWlsSWYoY2YucmVtb3ZlX29wdGlvbignRm9vIEJhcicsICdmb28nKSwKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjZi5yZW1vdmVfb3B0aW9uKCdGb28gQmFyJywgJ2ZvbycpLAogICAgICAgICAgICAgICAgICAgICAicmVtb3ZlX29wdGlvbigpIGZhaWxlZCB0byByZXBvcnQgbm9uLWV4aXN0ZW5jZSBvZiBvcHRpb24iCiAgICAgICAgICAgICAgICAgICAgICIgdGhhdCB3YXMgcmVtb3ZlZCIpCiAKQEAgLTExMiwxMCArMTEyLDEwIEBACiAgICAgICAgIGVxKGNmLm9wdGlvbnMoImEiKSwgWyJiIl0pCiAgICAgICAgIGVxKGNmLmdldCgiYSIsICJiIiksICJ2YWx1ZSIsCiAgICAgICAgICAgICJjb3VsZCBub3QgbG9jYXRlIG9wdGlvbiwgZXhwZWN0aW5nIGNhc2UtaW5zZW5zaXRpdmUgb3B0aW9uIG5hbWVzIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNmLmhhc19vcHRpb24oImEiLCAiYiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2YuaGFzX29wdGlvbigiYSIsICJiIikpCiAgICAgICAgIGNmLnNldCgiQSIsICJBLUIiLCAiQS1CIHZhbHVlIikKICAgICAgICAgZm9yIG9wdCBpbiAoImEtYiIsICJBLWIiLCAiYS1CIiwgIkEtQiIpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgICAgIGNmLmhhc19vcHRpb24oIkEiLCBvcHQpLAogICAgICAgICAgICAgICAgICJoYXNfb3B0aW9uKCkgcmV0dXJuZWQgZmFsc2UgZm9yIG9wdGlvbiB3aGljaCBzaG91bGQgZXhpc3QiKQogICAgICAgICBlcShjZi5vcHRpb25zKCJBIiksIFsiYS1iIl0pCkBAIC0xMzIsNyArMTMyLDcgQEAKICAgICAgICAgIyBTRiBidWcgIzU2MTgyMjoKICAgICAgICAgY2YgPSBzZWxmLmZyb21zdHJpbmcoIltzZWN0aW9uXVxubmVrZXk9bmV2YWx1ZVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdHM9eyJrZXkiOiJ2YWx1ZSJ9KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY2YuaGFzX29wdGlvbigic2VjdGlvbiIsICJLZXkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNmLmhhc19vcHRpb24oInNlY3Rpb24iLCAiS2V5IikpCiAKIAogICAgIGRlZiB0ZXN0X2RlZmF1bHRfY2FzZV9zZW5zaXRpdml0eShzZWxmKToKQEAgLTE2OCw3ICsxNjgsNyBAQAogICAgICAgICBjZiA9IHNlbGYubmV3Y29uZmlnKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjZi5zZWN0aW9ucygpLCBbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAibmV3IENvbmZpZ1BhcnNlciBzaG91bGQgaGF2ZSBubyBkZWZpbmVkIHNlY3Rpb25zIikKLSAgICAgICAgc2VsZi5mYWlsSWYoY2YuaGFzX3NlY3Rpb24oIkZvbyIpLAorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNmLmhhc19zZWN0aW9uKCJGb28iKSwKICAgICAgICAgICAgICAgICAgICAgIm5ldyBDb25maWdQYXJzZXIgc2hvdWxkIGhhdmUgbm8gYWNrbm93bGVkZ2VkIHNlY3Rpb25zIikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQ29uZmlnUGFyc2VyLk5vU2VjdGlvbkVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjZi5vcHRpb25zLCAiRm9vIikKQEAgLTIwNyw4ICsyMDcsOCBAQAogICAgICAgICAgICAgIkU1PUZBTFNFIEFORCBNT1JFIgogICAgICAgICAgICAgKQogICAgICAgICBmb3IgeCBpbiByYW5nZSgxLCA1KToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjZi5nZXRib29sZWFuKCdCT09MVEVTVCcsICd0JWQnICUgeCkpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihjZi5nZXRib29sZWFuKCdCT09MVEVTVCcsICdmJWQnICUgeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2YuZ2V0Ym9vbGVhbignQk9PTFRFU1QnLCAndCVkJyAlIHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjZi5nZXRib29sZWFuKCdCT09MVEVTVCcsICdmJWQnICUgeCkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2YuZ2V0Ym9vbGVhbiwgJ0JPT0xURVNUJywgJ2UlZCcgJSB4KQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NnaS5weSBiL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CmluZGV4IDgwMGY2MjkuLmFhMjZiYjYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY2dpLnB5CkBAIC0xNTEsMTAgKzE1MSwxMCBAQAogICAgICAgICAgICAgICAgICMgdGVzdCBpbmRpdmlkdWFsIGZpZWxkcwogICAgICAgICAgICAgICAgIGZvciBrZXkgaW4gZXhwZWN0LmtleXMoKToKICAgICAgICAgICAgICAgICAgICAgZXhwZWN0X3ZhbCA9IGV4cGVjdFtrZXldCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhmY2QuaGFzX2tleShrZXkpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZmNkLmhhc19rZXkoa2V5KSkKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtKGZjZFtrZXldKSwgbm9ybShleHBlY3Rba2V5XSkpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmNkLmdldChrZXksICJkZWZhdWx0IiksIGZjZFtrZXldKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZnMuaGFzX2tleShrZXkpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZnMuaGFzX2tleShrZXkpKQogICAgICAgICAgICAgICAgICAgICBpZiBsZW4oZXhwZWN0X3ZhbCkgPiAxOgogICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlX3ZhbHVlID0gMAogICAgICAgICAgICAgICAgICAgICBlbHNlOgpAQCAtMTYyLDEwICsxNjIsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gc2Rba2V5XQogICAgICAgICAgICAgICAgICAgICBleGNlcHQgSW5kZXhFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbElmKHNpbmdsZV92YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2luZ2xlX3ZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmcy5nZXR2YWx1ZShrZXkpLCBleHBlY3RfdmFsKQogICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNpbmdsZV92YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaW5nbGVfdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbCwgZXhwZWN0X3ZhbFswXSkKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnMuZ2V0dmFsdWUoa2V5KSwgZXhwZWN0X3ZhbFswXSkKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3JtKHNkLmdldGxpc3Qoa2V5KSksIG5vcm0oZXhwZWN0X3ZhbCkpCkBAIC0yMzEsNyArMjMxLDcgQEAKICAgICAgICAgIyBpZiB3ZSdyZSBub3QgY2h1bmtpbmcgcHJvcGVybHksIHJlYWRsaW5lIGlzIG9ubHkgY2FsbGVkIHR3aWNlCiAgICAgICAgICMgKGJ5IHJlYWRfYmluYXJ5KTsgaWYgd2UgYXJlIGNodW5raW5nIHByb3Blcmx5LCBpdCB3aWxsIGJlIGNhbGxlZCA1IHRpbWVzCiAgICAgICAgICMgYXMgbG9uZyBhcyB0aGUgY2h1bmtzaXplIGlzIDEgPDwgMTYuCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhmLm51bWNhbGxzID4gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYubnVtY2FsbHMgPiAyKQogCiAgICAgZGVmIHRlc3RfZmllbGRzdG9yYWdlX211bHRpcGFydChzZWxmKToKICAgICAgICAgI1Rlc3QgYmFzaWMgRmllbGRTdG9yYWdlIG11bHRpcGFydCBwYXJzaW5nCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NtYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9jbWF0aC5weQppbmRleCA1MjhmMzA3Li4yMGMxN2JkIDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X2NtYXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY21hdGgucHkKQEAgLTQxNiw3ICs0MTYsNyBAQAogCiAgICAgICAgICMgcmVhbCBvciBpbWFnaW5hcnkgcGFydCBOYU4KICAgICAgICAgZm9yIHogaW4gY29tcGxleF9uYW5zOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4ocGhhc2UoeikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4ocGhhc2UoeikpKQogCiAgICAgZGVmIHRlc3RfYWJzKHNlbGYpOgogICAgICAgICAjIHplcm9zCkBAIC00MjksMTggKzQyOSwxOCBAQAogCiAgICAgICAgICMgcmVhbCBvciBpbWFnaW5hcnkgcGFydCBOYU4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoY29tcGxleChOQU4sIC1JTkYpKSwgSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihhYnMoY29tcGxleChOQU4sIC0yLjMpKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKGFicyhjb21wbGV4KE5BTiwgLTAuMCkpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oYWJzKGNvbXBsZXgoTkFOLCAwLjApKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKGFicyhjb21wbGV4KE5BTiwgMi4zKSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihhYnMoY29tcGxleChOQU4sIC0yLjMpKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KE5BTiwgLTAuMCkpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oYWJzKGNvbXBsZXgoTkFOLCAwLjApKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KE5BTiwgMi4zKSkpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicyhjb21wbGV4KE5BTiwgSU5GKSksIElORikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhYnMoY29tcGxleCgtSU5GLCBOQU4pKSwgSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihhYnMoY29tcGxleCgtMi4zLCBOQU4pKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKGFicyhjb21wbGV4KC0wLjAsIE5BTikpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oYWJzKGNvbXBsZXgoMC4wLCBOQU4pKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKGFicyhjb21wbGV4KDIuMywgTkFOKSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihhYnMoY29tcGxleCgtMi4zLCBOQU4pKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KC0wLjAsIE5BTikpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4oYWJzKGNvbXBsZXgoMC4wLCBOQU4pKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KDIuMywgTkFOKSkpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFicyhjb21wbGV4KElORiwgTkFOKSksIElORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oYWJzKGNvbXBsZXgoTkFOLCBOQU4pKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGFicyhjb21wbGV4KE5BTiwgTkFOKSkpKQogCiAgICAgICAgICMgcmVzdWx0IG92ZXJmbG93cwogICAgICAgICBpZiBmbG9hdC5fX2dldGZvcm1hdF9fKCJkb3VibGUiKS5zdGFydHN3aXRoKCJJRUVFIik6CkBAIC00NTksMjYgKzQ1OSwyNiBAQAogICAgICAgICBzZWxmLmFzc2VydENFcXVhbChyZWN0KDEsIC1waS8yKSwgKDAsIC0xLikpCiAKICAgICBkZWYgdGVzdF9pc25hbihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsSWYoY21hdGguaXNuYW4oMSkpCi0gICAgICAgIHNlbGYuZmFpbElmKGNtYXRoLmlzbmFuKDFqKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoY21hdGguaXNuYW4oSU5GKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNtYXRoLmlzbmFuKE5BTikpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhjbWF0aC5pc25hbihjb21wbGV4KE5BTiwgMCkpKQotICAgICAgICBzZWxmLmFzc2VydF8oY21hdGguaXNuYW4oY29tcGxleCgwLCBOQU4pKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNtYXRoLmlzbmFuKGNvbXBsZXgoTkFOLCBOQU4pKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNtYXRoLmlzbmFuKGNvbXBsZXgoTkFOLCBJTkYpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNtYXRoLmlzbmFuKGNvbXBsZXgoSU5GLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbWF0aC5pc25hbigxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbWF0aC5pc25hbigxaikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoY21hdGguaXNuYW4oSU5GKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzbmFuKE5BTikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWF0aC5pc25hbihjb21wbGV4KE5BTiwgMCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNuYW4oY29tcGxleCgwLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzbmFuKGNvbXBsZXgoTkFOLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzbmFuKGNvbXBsZXgoTkFOLCBJTkYpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzbmFuKGNvbXBsZXgoSU5GLCBOQU4pKSkKIAogICAgIGRlZiB0ZXN0X2lzaW5mKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxJZihjbWF0aC5pc2luZigxKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoY21hdGguaXNpbmYoMWopKQotICAgICAgICBzZWxmLmZhaWxJZihjbWF0aC5pc2luZihOQU4pKQotICAgICAgICBzZWxmLmFzc2VydF8oY21hdGguaXNpbmYoSU5GKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNtYXRoLmlzaW5mKGNvbXBsZXgoSU5GLCAwKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhjbWF0aC5pc2luZihjb21wbGV4KDAsIElORikpKQotICAgICAgICBzZWxmLmFzc2VydF8oY21hdGguaXNpbmYoY29tcGxleChJTkYsIElORikpKQotICAgICAgICBzZWxmLmFzc2VydF8oY21hdGguaXNpbmYoY29tcGxleChOQU4sIElORikpKQotICAgICAgICBzZWxmLmFzc2VydF8oY21hdGguaXNpbmYoY29tcGxleChJTkYsIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNtYXRoLmlzaW5mKDEpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGNtYXRoLmlzaW5mKDFqKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjbWF0aC5pc2luZihOQU4pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNpbmYoSU5GKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNtYXRoLmlzaW5mKGNvbXBsZXgoSU5GLCAwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbWF0aC5pc2luZihjb21wbGV4KDAsIElORikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNpbmYoY29tcGxleChJTkYsIElORikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNpbmYoY29tcGxleChOQU4sIElORikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY21hdGguaXNpbmYoY29tcGxleChJTkYsIE5BTikpKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmVfc2NyaXB0LnB5IGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHkKaW5kZXggMjljOTJmYS4uY2VmYjlhZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZV9zY3JpcHQucHkKQEAgLTE1NCw5ICsxNTQsOSBAQAogICAgICAgICAgICAgcHJpbnQgcHJpbnRlZF9maWxlCiAgICAgICAgICAgICBwcmludCBwcmludGVkX3BhY2thZ2UKICAgICAgICAgICAgIHByaW50IHByaW50ZWRfYXJndjAKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByaW50ZWRfZmlsZSBpbiBkYXRhKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJpbnRlZF9wYWNrYWdlIGluIGRhdGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhwcmludGVkX2FyZ3YwIGluIGRhdGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcmludGVkX2ZpbGUgaW4gZGF0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByaW50ZWRfcGFja2FnZSBpbiBkYXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJpbnRlZF9hcmd2MCBpbiBkYXRhKQogCiAgICAgZGVmIF9jaGVja19pbXBvcnRfZXJyb3Ioc2VsZiwgc2NyaXB0X25hbWUsIGV4cGVjdGVkX21zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqY21kX2xpbmVfc3dpdGNoZXMpOgpAQCAtMTY2LDcgKzE2Niw3IEBACiAgICAgICAgICAgICBwcmludCAnT3V0cHV0IGZyb20gdGVzdCBzY3JpcHQgJXI6JyAlIHNjcmlwdF9uYW1lCiAgICAgICAgICAgICBwcmludCBkYXRhCiAgICAgICAgICAgICBwcmludCAnRXhwZWN0ZWQgb3V0cHV0OiAlcicgJSBleHBlY3RlZF9tc2cKLSAgICAgICAgc2VsZi5hc3NlcnRfKGV4cGVjdGVkX21zZyBpbiBkYXRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXhwZWN0ZWRfbXNnIGluIGRhdGEpCiAKICAgICBkZWYgdGVzdF9iYXNpY19zY3JpcHQoc2VsZik6CiAgICAgICAgIHdpdGggdGVtcF9kaXIoKSBhcyBzY3JpcHRfZGlyOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weQppbmRleCA1ZGY2ZmU1Li4wNmNhYjFjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVjcy5weQpAQCAtMjYzLDcgKzI2Myw3IEBACiAgICAgICAgIGYud3JpdGUodSJzcGFtIikKICAgICAgICAgZCA9IHMuZ2V0dmFsdWUoKQogICAgICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgZXhhY3RseSBvbmUgQk9NIGluIGl0Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhkID09IHNlbGYuc3BhbWxlIG9yIGQgPT0gc2VsZi5zcGFtYmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkID09IHNlbGYuc3BhbWxlIG9yIGQgPT0gc2VsZi5zcGFtYmUpCiAgICAgICAgICMgdHJ5IHRvIHJlYWQgaXQgYmFjawogICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oZCkKICAgICAgICAgZiA9IHJlYWRlcihzKQpAQCAtMzkwLDcgKzM5MCw3IEBACiAgICAgICAgIGYud3JpdGUodSJzcGFtIikKICAgICAgICAgZCA9IHMuZ2V0dmFsdWUoKQogICAgICAgICAjIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgZXhhY3RseSBvbmUgQk9NIGluIGl0Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhkID09IHNlbGYuc3BhbWxlIG9yIGQgPT0gc2VsZi5zcGFtYmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkID09IHNlbGYuc3BhbWxlIG9yIGQgPT0gc2VsZi5zcGFtYmUpCiAgICAgICAgICMgdHJ5IHRvIHJlYWQgaXQgYmFjawogICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oZCkKICAgICAgICAgZiA9IHJlYWRlcihzKQpAQCAtMTEyOSwxNCArMTEyOSwxNCBAQAogICAgICAgICByZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCJiYXNlNjRfY29kZWMiKShTdHJpbmdJTy5TdHJpbmdJTyhzaW4pKQogICAgICAgICBzb3V0ID0gcmVhZGVyLnJlYWQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvdXQsICJceDgwIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc291dCwgc3RyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc291dCwgc3RyKSkKIAogICAgIGRlZiB0ZXN0X3JlYWRsaW5lKHNlbGYpOgogICAgICAgICBzaW4gPSAiXHg4MCIuZW5jb2RlKCJiYXNlNjRfY29kZWMiKQogICAgICAgICByZWFkZXIgPSBjb2RlY3MuZ2V0cmVhZGVyKCJiYXNlNjRfY29kZWMiKShTdHJpbmdJTy5TdHJpbmdJTyhzaW4pKQogICAgICAgICBzb3V0ID0gcmVhZGVyLnJlYWRsaW5lKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb3V0LCAiXHg4MCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHNvdXQsIHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNvdXQsIHN0cikpCiAKIGFsbF91bmljb2RlX2VuY29kaW5ncyA9IFsKICAgICAiYXNjaWkiLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2Rlb3AucHkgYi9MaWIvdGVzdC90ZXN0X2NvZGVvcC5weQppbmRleCA1ZDA2ZjJjLi42OTAwNDA4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZGVvcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZGVvcC5weQpAQCAtMjMsNyArMjMsNyBAQAogICAgICAgICAnJydzdWNjZWVkIGlmZiBzdHIgaXMgYSB2YWxpZCBwaWVjZSBvZiBjb2RlJycnCiAgICAgICAgIGlmIGlzX2p5dGhvbjoKICAgICAgICAgICAgIGNvZGUgPSBjb21waWxlX2NvbW1hbmQoc3RyLCAiPGlucHV0PiIsIHN5bWJvbCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb2RlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvZGUpCiAgICAgICAgICAgICBpZiBzeW1ib2wgPT0gInNpbmdsZSI6CiAgICAgICAgICAgICAgICAgZCxyID0ge30se30KICAgICAgICAgICAgICAgICBzYXZlZF9zdGRvdXQgPSBzeXMuc3Rkb3V0CkBAIC01Miw5ICs1Miw5IEBACiAgICAgICAgICAgICBjb21waWxlX2NvbW1hbmQoc3RyLHN5bWJvbD1zeW1ib2wpCiAgICAgICAgICAgICBzZWxmLmZhaWwoIk5vIGV4Y2VwdGlvbiB0aHJvd24gZm9yIGludmFsaWQgY29kZSIpCiAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvcjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc19zeW50YXgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNfc3ludGF4KQogICAgICAgICBleGNlcHQgT3ZlcmZsb3dFcnJvcjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfc3ludGF4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19zeW50YXgpCiAKICAgICBkZWYgdGVzdF92YWxpZChzZWxmKToKICAgICAgICAgYXYgPSBzZWxmLmFzc2VydFZhbGlkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvZXJjaW9uLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2VyY2lvbi5weQppbmRleCBhNzBmODJkLi42N2QxOWE2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvZXJjaW9uLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29lcmNpb24ucHkKQEAgLTMwNywxNCArMzA3LDE0IEBACiAgICAgICAgICMgLi4uYnV0IHRoYXQgdGhpcyBzdGlsbCB3b3JrcwogICAgICAgICBjbGFzcyBXYWNreUNvbXBhcmVyKG9iamVjdCk6CiAgICAgICAgICAgICBkZWYgX19jbXBfXyhzbGYsIG90aGVyKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8ob3RoZXIgPT0gNDIsICdleHBlY3RlZCBldmlsX2NvZXJjZXIsIGdvdCAlcicgJSBvdGhlcikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3RoZXIgPT0gNDIsICdleHBlY3RlZCBldmlsX2NvZXJjZXIsIGdvdCAlcicgJSBvdGhlcikKICAgICAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICAgICAgX19oYXNoX18gPSBOb25lICMgSW52YWxpZCBjbXAgbWFrZXMgdGhpcyB1bmhhc2hhYmxlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNtcChXYWNreUNvbXBhcmVyKCksIGV2aWxfY29lcmNlciksIDApCiAgICAgICAgICMgLi4uYW5kIGNsYXNzaWMgY2xhc3NlcyB0b28sIHNpbmNlIHRoYXQgY29kZSBwYXRoIGlzIGEgbGl0dGxlIGRpZmZlcmVudAogICAgICAgICBjbGFzcyBDbGFzc2ljV2Fja3lDb21wYXJlcjoKICAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNsZiwgb3RoZXIpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvdGhlciA9PSA0MiwgJ2V4cGVjdGVkIGV2aWxfY29lcmNlciwgZ290ICVyJyAlIG90aGVyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvdGhlciA9PSA0MiwgJ2V4cGVjdGVkIGV2aWxfY29lcmNlciwgZ290ICVyJyAlIG90aGVyKQogICAgICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNtcChDbGFzc2ljV2Fja3lDb21wYXJlcigpLCBldmlsX2NvZXJjZXIpLCAwKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2xsZWN0aW9ucy5weQppbmRleCAxYzQ5ODc2Li5mYjI0ZDQzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbGxlY3Rpb25zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29sbGVjdGlvbnMucHkKQEAgLTQyLDkgKzQyLDkgQEAKICAgICAgICAgbmFtZWR0dXBsZSgnXycsICdhIGIgYycpICAgICAgICAjIFRlc3QgbGVhZGluZyB1bmRlcnNjb3JlcyBpbiBhIHR5cGVuYW1lCiAKICAgICAgICAgbnQgPSBuYW1lZHR1cGxlKCdudCcsIHUndGhlIHF1aWNrIGJyb3duIGZveCcpICAgICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIHVuaWNvZGUgaW5wdXQKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJ1JyIgbm90IGluIHJlcHIobnQuX2ZpZWxkcykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgidSciIG5vdCBpbiByZXByKG50Ll9maWVsZHMpKQogICAgICAgICBudCA9IG5hbWVkdHVwbGUoJ250JywgKHUndGhlJywgdSdxdWljaycpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgdW5pY29kZSBpbnB1dAotICAgICAgICBzZWxmLmFzc2VydF8oInUnIiBub3QgaW4gcmVwcihudC5fZmllbGRzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJ1JyIgbm90IGluIHJlcHIobnQuX2ZpZWxkcykpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBQb2ludC5fbWFrZSwgWzExXSkgICAgICAgICAgICAgICAgICAgICAjIGNhdGNoIHRvbyBmZXcgYXJncwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFBvaW50Ll9tYWtlLCBbMTEsIDIyLCAzM10pICAgICAgICAgICAgICMgY2F0Y2ggdG9vIG1hbnkgYXJncwpAQCAtNzMsOCArNzMsOCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsICdQb2ludChYWFg9MSwgeT0yKScsIGxvY2FscygpKSAgICMgd3Jvbmcga2V5d29yZCBhcmd1bWVudAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGV2YWwsICdQb2ludCh4PTEpJywgbG9jYWxzKCkpICAgICAgICAgICMgbWlzc2luZyBrZXl3b3JkIGFyZ3VtZW50CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihwKSwgJ1BvaW50KHg9MTEsIHk9MjIpJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdfX2RpY3RfXycgbm90IGluIGRpcihwKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHZlcmlmeSBpbnN0YW5jZSBoYXMgbm8gZGljdAotICAgICAgICBzZWxmLmFzc2VydF8oJ19fd2Vha3JlZl9fJyBub3QgaW4gZGlyKHApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ19fZGljdF9fJyBub3QgaW4gZGlyKHApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgdmVyaWZ5IGluc3RhbmNlIGhhcyBubyBkaWN0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnX193ZWFrcmVmX18nIG5vdCBpbiBkaXIocCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocCwgUG9pbnQuX21ha2UoWzExLCAyMl0pKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0IF9tYWtlIGNsYXNzbWV0aG9kCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5fZmllbGRzLCAoJ3gnLCAneScpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0IF9maWVsZHMgYXR0cmlidXRlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5fcmVwbGFjZSh4PTEpLCAoMSwgMjIpKSAgICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0IF9yZXBsYWNlIG1ldGhvZApAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgICAgIFBvaW50ID0gbmFtZWR0dXBsZSgnUG9pbnQnLCAneCB5JykKICAgICAgICAgcCA9IFBvaW50KDExLCAyMikKIAotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShwLCB0dXBsZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHAsIHR1cGxlKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLCAoMTEsIDIyKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1hdGNoZXMgYSByZWFsIHR1cGxlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUocCksICgxMSwgMjIpKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb2VyY2FibGUgdG8gYSByZWFsIHR1cGxlCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChwKSwgWzExLCAyMl0pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBjb2VyY2FibGUgdG8gYSBsaXN0CkBAIC0yMzMsOCArMjMzLDggQEAKICAgICAgICAgIyBDaGVjayBzb21lIG5vbi1oYXNoYWJsZXMKICAgICAgICAgbm9uX3NhbXBsZXMgPSBbbGlzdCgpLCBzZXQoKSwgZGljdCgpXQogICAgICAgICBmb3IgeCBpbiBub25fc2FtcGxlczoKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UoeCwgSGFzaGFibGUpLCByZXByKHgpKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyh0eXBlKHgpLCBIYXNoYWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UoeCwgSGFzaGFibGUpLCByZXByKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHR5cGUoeCksIEhhc2hhYmxlKSwgcmVwcih0eXBlKHgpKSkKICAgICAgICAgIyBDaGVjayBzb21lIGhhc2hhYmxlcwogICAgICAgICBzYW1wbGVzID0gW05vbmUsCiAgICAgICAgICAgICAgICAgICAgaW50KCksIGZsb2F0KCksIGNvbXBsZXgoKSwKQEAgLTI0Myw4ICsyNDMsOCBAQAogICAgICAgICAgICAgICAgICAgIGludCwgbGlzdCwgb2JqZWN0LCB0eXBlLAogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgZm9yIHggaW4gc2FtcGxlczoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHgsIEhhc2hhYmxlKSwgcmVwcih4KSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHR5cGUoeCksIEhhc2hhYmxlKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHgsIEhhc2hhYmxlKSwgcmVwcih4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHR5cGUoeCksIEhhc2hhYmxlKSwgcmVwcih0eXBlKHgpKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBIYXNoYWJsZSkKICAgICAgICAgIyBDaGVjayBkaXJlY3Qgc3ViY2xhc3NpbmcKICAgICAgICAgY2xhc3MgSChIYXNoYWJsZSk6CkBAIC0yNTIsMTUgKzI1MiwxNSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBzdXBlcihILCBzZWxmKS5fX2hhc2hfXygpCiAgICAgICAgICAgICBfX2VxX18gPSBIYXNoYWJsZS5fX2VxX18gIyBTaWxlbmNlIFB5M2sgd2FybmluZwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goSCgpKSwgMCkKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhpbnQsIEgpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoaW50LCBIKSkKICAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKEhhc2hhYmxlLCAnX19oYXNoX18nKQogCiAgICAgZGVmIHRlc3RfSXRlcmFibGUoc2VsZik6CiAgICAgICAgICMgQ2hlY2sgc29tZSBub24taXRlcmFibGVzCiAgICAgICAgIG5vbl9zYW1wbGVzID0gW05vbmUsIDQyLCAzLjE0LCAxal0KICAgICAgICAgZm9yIHggaW4gbm9uX3NhbXBsZXM6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKHgsIEl0ZXJhYmxlKSwgcmVwcih4KSkKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGlzc3ViY2xhc3ModHlwZSh4KSwgSXRlcmFibGUpLCByZXByKHR5cGUoeCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKHgsIEl0ZXJhYmxlKSwgcmVwcih4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyh0eXBlKHgpLCBJdGVyYWJsZSksIHJlcHIodHlwZSh4KSkpCiAgICAgICAgICMgQ2hlY2sgc29tZSBpdGVyYWJsZXMKICAgICAgICAgc2FtcGxlcyA9IFtzdHIoKSwKICAgICAgICAgICAgICAgICAgICB0dXBsZSgpLCBsaXN0KCksIHNldCgpLCBmcm96ZW5zZXQoKSwgZGljdCgpLApAQCAtMjY5LDIyICsyNjksMjIgQEAKICAgICAgICAgICAgICAgICAgICAoeCBmb3IgeCBpbiBbXSksCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICBmb3IgeCBpbiBzYW1wbGVzOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoeCwgSXRlcmFibGUpLCByZXByKHgpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3ModHlwZSh4KSwgSXRlcmFibGUpLCByZXByKHR5cGUoeCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeCwgSXRlcmFibGUpLCByZXByKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3ModHlwZSh4KSwgSXRlcmFibGUpLCByZXByKHR5cGUoeCkpKQogICAgICAgICAjIENoZWNrIGRpcmVjdCBzdWJjbGFzc2luZwogICAgICAgICBjbGFzcyBJKEl0ZXJhYmxlKToKICAgICAgICAgICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoSSwgc2VsZikuX19pdGVyX18oKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoSSgpKSwgW10pCi0gICAgICAgIHNlbGYuZmFpbElmKGlzc3ViY2xhc3Moc3RyLCBJKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHN0ciwgSSkpCiAgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhJdGVyYWJsZSwgJ19faXRlcl9fJykKIAogICAgIGRlZiB0ZXN0X0l0ZXJhdG9yKHNlbGYpOgogICAgICAgICBub25fc2FtcGxlcyA9IFtOb25lLCA0MiwgMy4xNCwgMWosICIiLmVuY29kZSgnYXNjaWknKSwgIiIsICgpLCBbXSwKICAgICAgICAgICAgIHt9LCBzZXQoKV0KICAgICAgICAgZm9yIHggaW4gbm9uX3NhbXBsZXM6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKHgsIEl0ZXJhdG9yKSwgcmVwcih4KSkKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGlzc3ViY2xhc3ModHlwZSh4KSwgSXRlcmF0b3IpLCByZXByKHR5cGUoeCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2luc3RhbmNlKHgsIEl0ZXJhdG9yKSwgcmVwcih4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyh0eXBlKHgpLCBJdGVyYXRvciksIHJlcHIodHlwZSh4KSkpCiAgICAgICAgIHNhbXBsZXMgPSBbaXRlcihzdHIoKSksCiAgICAgICAgICAgICAgICAgICAgaXRlcih0dXBsZSgpKSwgaXRlcihsaXN0KCkpLCBpdGVyKGRpY3QoKSksCiAgICAgICAgICAgICAgICAgICAgaXRlcihzZXQoKSksIGl0ZXIoZnJvemVuc2V0KCkpLApAQCAtMjk0LDggKzI5NCw4IEBACiAgICAgICAgICAgICAgICAgICAgKHggZm9yIHggaW4gW10pLAogICAgICAgICAgICAgICAgICAgIF0KICAgICAgICAgZm9yIHggaW4gc2FtcGxlczoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHgsIEl0ZXJhdG9yKSwgcmVwcih4KSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHR5cGUoeCksIEl0ZXJhdG9yKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHgsIEl0ZXJhdG9yKSwgcmVwcih4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHR5cGUoeCksIEl0ZXJhdG9yKSwgcmVwcih0eXBlKHgpKSkKICAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKEl0ZXJhdG9yLCAnbmV4dCcpCiAKICAgICBkZWYgdGVzdF9TaXplZChzZWxmKToKQEAgLTMwNCwxNSArMzA0LDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICh4IGZvciB4IGluIFtdKSwKICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICBmb3IgeCBpbiBub25fc2FtcGxlczoKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UoeCwgU2l6ZWQpLCByZXByKHgpKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyh0eXBlKHgpLCBTaXplZCksIHJlcHIodHlwZSh4KSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzaW5zdGFuY2UoeCwgU2l6ZWQpLCByZXByKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHR5cGUoeCksIFNpemVkKSwgcmVwcih0eXBlKHgpKSkKICAgICAgICAgc2FtcGxlcyA9IFtzdHIoKSwKICAgICAgICAgICAgICAgICAgICB0dXBsZSgpLCBsaXN0KCksIHNldCgpLCBmcm96ZW5zZXQoKSwgZGljdCgpLAogICAgICAgICAgICAgICAgICAgIGRpY3QoKS5rZXlzKCksIGRpY3QoKS5pdGVtcygpLCBkaWN0KCkudmFsdWVzKCksCiAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICBmb3IgeCBpbiBzYW1wbGVzOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoeCwgU2l6ZWQpLCByZXByKHgpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3ModHlwZSh4KSwgU2l6ZWQpLCByZXByKHR5cGUoeCkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeCwgU2l6ZWQpLCByZXByKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3ModHlwZSh4KSwgU2l6ZWQpLCByZXByKHR5cGUoeCkpKQogICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoU2l6ZWQsICdfX2xlbl9fJykKIAogICAgIGRlZiB0ZXN0X0NvbnRhaW5lcihzZWxmKToKQEAgLTMyMSwxNSArMzIxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICh4IGZvciB4IGluIFtdKSwKICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICAgICBmb3IgeCBpbiBub25fc2FtcGxlczoKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2UoeCwgQ29udGFpbmVyKSwgcmVwcih4KSkKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGlzc3ViY2xhc3ModHlwZSh4KSwgQ29udGFpbmVyKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZSh4LCBDb250YWluZXIpLCByZXByKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKHR5cGUoeCksIENvbnRhaW5lciksIHJlcHIodHlwZSh4KSkpCiAgICAgICAgIHNhbXBsZXMgPSBbc3RyKCksCiAgICAgICAgICAgICAgICAgICAgdHVwbGUoKSwgbGlzdCgpLCBzZXQoKSwgZnJvemVuc2V0KCksIGRpY3QoKSwKICAgICAgICAgICAgICAgICAgICBkaWN0KCkua2V5cygpLCBkaWN0KCkuaXRlbXMoKSwKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgIGZvciB4IGluIHNhbXBsZXM6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZSh4LCBDb250YWluZXIpLCByZXByKHgpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3ModHlwZSh4KSwgQ29udGFpbmVyKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHgsIENvbnRhaW5lciksIHJlcHIoeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyh0eXBlKHgpLCBDb250YWluZXIpLCByZXByKHR5cGUoeCkpKQogICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoQ29udGFpbmVyLCAnX19jb250YWluc19fJykKIAogICAgIGRlZiB0ZXN0X0NhbGxhYmxlKHNlbGYpOgpAQCAtMzM5LDMzICszMzksMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgKHggZm9yIHggaW4gW10pLAogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgIGZvciB4IGluIG5vbl9zYW1wbGVzOgotICAgICAgICAgICAgc2VsZi5mYWlsSWYoaXNpbnN0YW5jZSh4LCBDYWxsYWJsZSksIHJlcHIoeCkpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKHR5cGUoeCksIENhbGxhYmxlKSwgcmVwcih0eXBlKHgpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZSh4LCBDYWxsYWJsZSksIHJlcHIoeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModHlwZSh4KSwgQ2FsbGFibGUpLCByZXByKHR5cGUoeCkpKQogICAgICAgICBzYW1wbGVzID0gW2xhbWJkYTogTm9uZSwKICAgICAgICAgICAgICAgICAgICB0eXBlLCBpbnQsIG9iamVjdCwKICAgICAgICAgICAgICAgICAgICBsZW4sCiAgICAgICAgICAgICAgICAgICAgbGlzdC5hcHBlbmQsIFtdLmFwcGVuZCwKICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgIGZvciB4IGluIHNhbXBsZXM6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZSh4LCBDYWxsYWJsZSksIHJlcHIoeCkpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyh0eXBlKHgpLCBDYWxsYWJsZSksIHJlcHIodHlwZSh4KSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh4LCBDYWxsYWJsZSksIHJlcHIoeCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyh0eXBlKHgpLCBDYWxsYWJsZSksIHJlcHIodHlwZSh4KSkpCiAgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhDYWxsYWJsZSwgJ19fY2FsbF9fJykKIAogICAgIGRlZiB0ZXN0X2RpcmVjdF9zdWJjbGFzc2luZyhzZWxmKToKICAgICAgICAgZm9yIEIgaW4gSGFzaGFibGUsIEl0ZXJhYmxlLCBJdGVyYXRvciwgU2l6ZWQsIENvbnRhaW5lciwgQ2FsbGFibGU6CiAgICAgICAgICAgICBjbGFzcyBDKEIpOgogICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKEMsIEIpKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhpbnQsIEMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQywgQikpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoaW50LCBDKSkKIAogICAgIGRlZiB0ZXN0X3JlZ2lzdHJhdGlvbihzZWxmKToKICAgICAgICAgZm9yIEIgaW4gSGFzaGFibGUsIEl0ZXJhYmxlLCBJdGVyYXRvciwgU2l6ZWQsIENvbnRhaW5lciwgQ2FsbGFibGU6CiAgICAgICAgICAgICBjbGFzcyBDOgogICAgICAgICAgICAgICAgIF9fbWV0YWNsYXNzX18gPSB0eXBlCiAgICAgICAgICAgICAgICAgX19oYXNoX18gPSBOb25lICAjIE1ha2Ugc3VyZSBpdCBpc24ndCBoYXNoYWJsZSBieSBkZWZhdWx0Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKEMsIEIpLCBCLl9fbmFtZV9fKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc3N1YmNsYXNzKEMsIEIpLCBCLl9fbmFtZV9fKQogICAgICAgICAgICAgQi5yZWdpc3RlcihDKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoQywgQikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhDLCBCKSkKIAogY2xhc3MgV2l0aFNldChNdXRhYmxlU2V0KToKIApAQCAtMzk1LDggKzM5NSw4IEBACiAKICAgICBkZWYgdGVzdF9TZXQoc2VsZik6CiAgICAgICAgIGZvciBzYW1wbGUgaW4gW3NldCwgZnJvemVuc2V0XToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHNhbXBsZSgpLCBTZXQpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc2FtcGxlLCBTZXQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2FtcGxlKCksIFNldCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzYW1wbGUsIFNldCkpCiAgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhTZXQsICdfX2NvbnRhaW5zX18nLCAnX19pdGVyX18nLCAnX19sZW5fXycpCiAKICAgICBkZWYgdGVzdF9oYXNoX1NldChzZWxmKToKQEAgLTQxMiwxMyArNDEyLDEzIEBACiAgICAgICAgICAgICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2hhc2goKQogICAgICAgICBhLCBiID0gT25lVHdvVGhyZWVTZXQoKSwgT25lVHdvVGhyZWVTZXQoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaGFzaChhKSA9PSBoYXNoKGIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzaChhKSA9PSBoYXNoKGIpKQogCiAgICAgZGVmIHRlc3RfTXV0YWJsZVNldChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc2V0KCksIE11dGFibGVTZXQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzZXQsIE11dGFibGVTZXQpKQotICAgICAgICBzZWxmLmZhaWxJZihpc2luc3RhbmNlKGZyb3plbnNldCgpLCBNdXRhYmxlU2V0KSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaXNzdWJjbGFzcyhmcm96ZW5zZXQsIE11dGFibGVTZXQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZXQoKSwgTXV0YWJsZVNldCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNldCwgTXV0YWJsZVNldCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShmcm96ZW5zZXQoKSwgTXV0YWJsZVNldCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhmcm96ZW5zZXQsIE11dGFibGVTZXQpKQogICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoTXV0YWJsZVNldCwgJ19fY29udGFpbnNfXycsICdfX2l0ZXJfXycsICdfX2xlbl9fJywKICAgICAgICAgICAgICdhZGQnLCAnZGlzY2FyZCcpCiAKQEAgLTQ1NywzNyArNDU3LDM3IEBACiAKICAgICBkZWYgdGVzdF9NYXBwaW5nKHNlbGYpOgogICAgICAgICBmb3Igc2FtcGxlIGluIFtkaWN0XToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHNhbXBsZSgpLCBNYXBwaW5nKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHNhbXBsZSwgTWFwcGluZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzYW1wbGUoKSwgTWFwcGluZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzYW1wbGUsIE1hcHBpbmcpKQogICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoTWFwcGluZywgJ19fY29udGFpbnNfXycsICdfX2l0ZXJfXycsICdfX2xlbl9fJywKICAgICAgICAgICAgICdfX2dldGl0ZW1fXycpCiAKICAgICBkZWYgdGVzdF9NdXRhYmxlTWFwcGluZyhzZWxmKToKICAgICAgICAgZm9yIHNhbXBsZSBpbiBbZGljdF06Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzYW1wbGUoKSwgTXV0YWJsZU1hcHBpbmcpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc2FtcGxlLCBNdXRhYmxlTWFwcGluZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzYW1wbGUoKSwgTXV0YWJsZU1hcHBpbmcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc2FtcGxlLCBNdXRhYmxlTWFwcGluZykpCiAgICAgICAgIHNlbGYudmFsaWRhdGVfYWJzdHJhY3RfbWV0aG9kcyhNdXRhYmxlTWFwcGluZywgJ19fY29udGFpbnNfXycsICdfX2l0ZXJfXycsICdfX2xlbl9fJywKICAgICAgICAgICAgICdfX2dldGl0ZW1fXycsICdfX3NldGl0ZW1fXycsICdfX2RlbGl0ZW1fXycpCiAKICAgICBkZWYgdGVzdF9TZXF1ZW5jZShzZWxmKToKICAgICAgICAgZm9yIHNhbXBsZSBpbiBbdHVwbGUsIGxpc3QsIHN0cl06Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzYW1wbGUoKSwgU2VxdWVuY2UpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc2FtcGxlLCBTZXF1ZW5jZSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKGJhc2VzdHJpbmcsIFNlcXVlbmNlKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UocmFuZ2UoMTApLCBTZXF1ZW5jZSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHhyYW5nZSwgU2VxdWVuY2UpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzdHIsIFNlcXVlbmNlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNhbXBsZSgpLCBTZXF1ZW5jZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzYW1wbGUsIFNlcXVlbmNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoYmFzZXN0cmluZywgU2VxdWVuY2UpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShyYW5nZSgxMCksIFNlcXVlbmNlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoeHJhbmdlLCBTZXF1ZW5jZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHN0ciwgU2VxdWVuY2UpKQogICAgICAgICBzZWxmLnZhbGlkYXRlX2Fic3RyYWN0X21ldGhvZHMoU2VxdWVuY2UsICdfX2NvbnRhaW5zX18nLCAnX19pdGVyX18nLCAnX19sZW5fXycsCiAgICAgICAgICAgICAnX19nZXRpdGVtX18nKQogCiAgICAgZGVmIHRlc3RfTXV0YWJsZVNlcXVlbmNlKHNlbGYpOgogICAgICAgICBmb3Igc2FtcGxlIGluIFt0dXBsZSwgc3RyXToKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGlzaW5zdGFuY2Uoc2FtcGxlKCksIE11dGFibGVTZXF1ZW5jZSkpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihpc3N1YmNsYXNzKHNhbXBsZSwgTXV0YWJsZVNlcXVlbmNlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNpbnN0YW5jZShzYW1wbGUoKSwgTXV0YWJsZVNlcXVlbmNlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNzdWJjbGFzcyhzYW1wbGUsIE11dGFibGVTZXF1ZW5jZSkpCiAgICAgICAgIGZvciBzYW1wbGUgaW4gW2xpc3RdOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uoc2FtcGxlKCksIE11dGFibGVTZXF1ZW5jZSkpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzYW1wbGUsIE11dGFibGVTZXF1ZW5jZSkpCi0gICAgICAgIHNlbGYuZmFpbElmKGlzc3ViY2xhc3MoYmFzZXN0cmluZywgTXV0YWJsZVNlcXVlbmNlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNhbXBsZSgpLCBNdXRhYmxlU2VxdWVuY2UpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc2FtcGxlLCBNdXRhYmxlU2VxdWVuY2UpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3MoYmFzZXN0cmluZywgTXV0YWJsZVNlcXVlbmNlKSkKICAgICAgICAgc2VsZi52YWxpZGF0ZV9hYnN0cmFjdF9tZXRob2RzKE11dGFibGVTZXF1ZW5jZSwgJ19fY29udGFpbnNfXycsICdfX2l0ZXJfXycsCiAgICAgICAgICAgICAnX19sZW5fXycsICdfX2dldGl0ZW1fXycsICdfX3NldGl0ZW1fXycsICdfX2RlbGl0ZW1fXycsICdpbnNlcnQnKQogCkBAIC00OTcsMTAgKzQ5NywxMCBAQAogICAgICAgICBjID0gQ291bnRlcignYWJjYWJhJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLCBDb3VudGVyKHsnYSc6MyAsICdiJzogMiwgJ2MnOiAxfSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYywgQ291bnRlcihhPTMsIGI9MiwgYz0xKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoYywgZGljdCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGMsIE1hcHBpbmcpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhDb3VudGVyLCBkaWN0KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzc3ViY2xhc3MoQ291bnRlciwgTWFwcGluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGMsIGRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShjLCBNYXBwaW5nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQ291bnRlciwgZGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKENvdW50ZXIsIE1hcHBpbmcpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihjKSwgMykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdW0oYy52YWx1ZXMoKSksIDYpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKGMudmFsdWVzKCkpLCBbMSwgMiwgM10pCkBAIC01NzgsNyArNTc4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQ291bnRlcih3b3JkcyksCiAgICAgICAgICAgICAgICAgICAgIF0pOgogICAgICAgICAgICAgbXNnID0gKGksIGR1cCwgd29yZHMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZHVwIGlzIG5vdCB3b3JkcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkdXAgaXMgbm90IHdvcmRzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZHVwLCB3b3JkcykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihkdXApLCBsZW4od29yZHMpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModHlwZShkdXApLCB0eXBlKHdvcmRzKSkKQEAgLTU5NCw3ICs1OTQsNyBAQAogICAgIGRlZiB0ZXN0X2ludmFyaWFudF9mb3JfdGhlX2luX29wZXJhdG9yKHNlbGYpOgogICAgICAgICBjID0gQ291bnRlcihhPTEwLCBiPS0yLCBjPTApCiAgICAgICAgIGZvciBlbGVtIGluIGM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZWxlbSBpbiBjKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsZW0gaW4gYykKIAogICAgIGRlZiB0ZXN0X211bHRpc2V0X29wZXJhdGlvbnMoc2VsZik6CiAgICAgICAgICMgVmVyaWZ5IHRoYXQgYWRkaW5nIGEgemVybyBjb3VudGVyIHdpbGwgc3RyaXAgemVyb3MgYW5kIG5lZ2F0aXZlcwpAQCAtNjE5LDcgKzYxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobnVtYmVyb3AocFt4XSwgcVt4XSksIHJlc3VsdFt4XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY291bnRlcm9wLCB4LCBwLCBxKSkKICAgICAgICAgICAgICAgICAjIHZlcmlmeSB0aGF0IHJlc3VsdHMgZXhjbHVkZSBub24tcG9zaXRpdmUgY291bnRzCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHg+MCBmb3IgeCBpbiByZXN1bHQudmFsdWVzKCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHg+MCBmb3IgeCBpbiByZXN1bHQudmFsdWVzKCkpCiAKICAgICAgICAgZWxlbWVudHMgPSAnYWJjZGVmJwogICAgICAgICBmb3IgaSBpbiByYW5nZSgxMDApOgpAQCAtNjkzLDcgKzY5Myw3IEBACiAgICAgICAgIHBhaXJzID0gWygnYycsIDEpLCAoJ2InLCAyKSwgKCdhJywgMyksICgnZCcsIDQpLCAoJ2UnLCA1KSwgKCdmJywgNildCiAgICAgICAgIG9kID0gT3JkZXJlZERpY3QocGFpcnMpCiAgICAgICAgIGRlbCBvZFsnYSddCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYScgbm90IGluIG9kKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIG5vdCBpbiBvZCkKICAgICAgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6CiAgICAgICAgICAgICBkZWwgb2RbJ2EnXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3Qob2QuaXRlbXMoKSksIHBhaXJzWzoyXSArIHBhaXJzWzM6XSkKQEAgLTc3Niw3ICs3NzYsNyBAQAogICAgICAgICAgICAgICAgICAgICB1cGRhdGVfdGVzdCwKICAgICAgICAgICAgICAgICAgICAgT3JkZXJlZERpY3Qob2QpLAogICAgICAgICAgICAgICAgICAgICBdKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhkdXAgaXMgbm90IG9kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGR1cCBpcyBub3Qgb2QpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkdXAsIG9kKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGlzdChkdXAuaXRlbXMoKSksIGxpc3Qob2QuaXRlbXMoKSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oZHVwKSwgbGVuKG9kKSkKQEAgLTc4OSw3ICs3ODksNyBAQAogICAgICAgICBvZCA9IE9yZGVyZWREaWN0KHBhaXJzKQogICAgICAgICAjIHlhbWwuZHVtcChvZCkgLS0+CiAgICAgICAgICMgJyEhcHl0aG9uL29iamVjdC9hcHBseTpfX21haW5fXy5PcmRlcmVkRGljdFxuLSAtIFthLCAxXVxuICAtIFtiLCAyXVxuJwotICAgICAgICBzZWxmLmFzc2VydF8oYWxsKHR5cGUocGFpcik9PWxpc3QgZm9yIHBhaXIgaW4gb2QuX19yZWR1Y2VfXygpWzFdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbCh0eXBlKHBhaXIpPT1saXN0IGZvciBwYWlyIGluIG9kLl9fcmVkdWNlX18oKVsxXSkpCiAKICAgICBkZWYgdGVzdF9yZWR1Y2Vfbm90X3Rvb19mYXQoc2VsZik6CiAgICAgICAgICMgZG8gbm90IHNhdmUgaW5zdGFuY2UgZGljdGlvbmFyeSBpZiBub3QgbmVlZGVkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbW1hbmRzLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21tYW5kcy5weQppbmRleCAzNmMyYTYzLi5mY2ZhNjE2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbW1hbmRzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tbWFuZHMucHkKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgICAgICAgICAgIC9cLiAgICAgICAgICAjIGFuZCBlbmQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZmlsZS4KICAgICAgICAgICAgICAgICcnJwogCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZS5tYXRjaChwYXQsIGdldHN0YXR1cygiLy4iKSwgcmUuVkVSQk9TRSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaChwYXQsIGdldHN0YXR1cygiLy4iKSwgcmUuVkVSQk9TRSkpCiAKIAogZGVmIHRlc3RfbWFpbigpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5CmluZGV4IDZmZmQ2NGEuLjc1Yzk4M2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkKQEAgLTQyNCwxMCArNDI0LDEwIEBACiAgICAgICAgICAgICAgICAgaW1wb3J0IF9fbWFuZ2xlZF9tb2QKICAgICAgICAgICAgICAgICBpbXBvcnQgX19wYWNrYWdlX18ubW9kdWxlCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJfQV9fbWFuZ2xlZCIgaW4gQS5mLmZ1bmNfY29kZS5jb192YXJuYW1lcykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJfX25vdF9tYW5nbGVkX18iIGluIEEuZi5mdW5jX2NvZGUuY29fdmFybmFtZXMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiX0FfX21hbmdsZWRfbW9kIiBpbiBBLmYuZnVuY19jb2RlLmNvX3Zhcm5hbWVzKQotICAgICAgICBzZWxmLmFzc2VydF8oIl9fcGFja2FnZV9fIiBpbiBBLmYuZnVuY19jb2RlLmNvX3Zhcm5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIl9BX19tYW5nbGVkIiBpbiBBLmYuZnVuY19jb2RlLmNvX3Zhcm5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIl9fbm90X21hbmdsZWRfXyIgaW4gQS5mLmZ1bmNfY29kZS5jb192YXJuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJfQV9fbWFuZ2xlZF9tb2QiIGluIEEuZi5mdW5jX2NvZGUuY29fdmFybmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiX19wYWNrYWdlX18iIGluIEEuZi5mdW5jX2NvZGUuY29fdmFybmFtZXMpCiAKICAgICBkZWYgdGVzdF9jb21waWxlX2FzdChzZWxmKToKICAgICAgICAgZm5hbWUgPSBfX2ZpbGVfXwpAQCAtNDUwLDcgKzQ1MCw3IEBACiAgICAgICAgIGZvciBmbmFtZSwgY29kZSBpbiBzYW1wbGVfY29kZToKICAgICAgICAgICAgIGNvMSA9IGNvbXBpbGUoY29kZSwgJyVzMScgJSBmbmFtZSwgJ2V4ZWMnKQogICAgICAgICAgICAgYXN0ID0gY29tcGlsZShjb2RlLCAnJXMyJyAlIGZuYW1lLCAnZXhlYycsIF9hc3QuUHlDRl9PTkxZX0FTVCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKGFzdCkgPT0gX2FzdC5Nb2R1bGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShhc3QpID09IF9hc3QuTW9kdWxlKQogICAgICAgICAgICAgY28yID0gY29tcGlsZShhc3QsICclczMnICUgZm5hbWUsICdleGVjJykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY28xLCBjbzIpCiAgICAgICAgICAgICAjIHRoZSBjb2RlIG9iamVjdCdzIGZpbGVuYW1lIGNvbWVzIGZyb20gdGhlIHNlY29uZCBjb21waWxhdGlvbiBzdGVwCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9jb21waWxlci5weQppbmRleCBmMWZlZjc0Li4yNDkzMGY4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZXIucHkKQEAgLTg3LDcgKzg3LDcgQEAKIAogICAgIGRlZiB0ZXN0RG9jc3RyaW5ncyhzZWxmKToKICAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJyJkb2MiJywgJzxzdHJpbmc+JywgJ2V4ZWMnKQotICAgICAgICBzZWxmLmFzc2VydF8oJ19fZG9jX18nIGluIGMuY29fbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnX19kb2NfXycgaW4gYy5jb19uYW1lcykKICAgICAgICAgYyA9IGNvbXBpbGVyLmNvbXBpbGUoJ2RlZiBmKCk6XG4gImRvYyInLCAnPHN0cmluZz4nLCAnZXhlYycpCiAgICAgICAgIGcgPSB7fQogICAgICAgICBleGVjIGMgaW4gZwpAQCAtMTEwLDkgKzExMCw5IEBACiAKICAgICBkZWYgX2NoZWNrX2xpbmVubyhzZWxmLCBub2RlKToKICAgICAgICAgaWYgbm90IG5vZGUuX19jbGFzc19fIGluIE5PTElORU5POgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uobm9kZS5saW5lbm8sIGludCksCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShub2RlLmxpbmVubywgaW50KSwKICAgICAgICAgICAgICAgICAibGluZW5vPSVzIG9uICVzIiAlIChub2RlLmxpbmVubywgbm9kZS5fX2NsYXNzX18pKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vZGUubGluZW5vID4gMCwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub2RlLmxpbmVubyA+IDAsCiAgICAgICAgICAgICAgICAgImxpbmVubz0lcyBvbiAlcyIgJSAobm9kZS5saW5lbm8sIG5vZGUuX19jbGFzc19fKSkKICAgICAgICAgZm9yIGNoaWxkIGluIG5vZGUuZ2V0Q2hpbGROb2RlcygpOgogICAgICAgICAgICAgc2VsZi5jaGVja19saW5lbm8oY2hpbGQpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBsZXgucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBsZXgucHkKaW5kZXggNjBjNTI1Mi4uZjA3YTZiNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21wbGV4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGxleC5weQpAQCAtNDIsNyArNDIsNyBAQAogICAgICAgICBpZiB4ID09IDA6CiAgICAgICAgICAgICByZXR1cm4gYWJzKHkpIDwgZXBzCiAgICAgICAgICMgY2hlY2sgdGhhdCByZWxhdGl2ZSBkaWZmZXJlbmNlIDwgZXBzCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhYnMoKHgteSkveSkgPCBlcHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhYnMoKHgteSkveSkgPCBlcHMpCiAKICAgICBkZWYgYXNzZXJ0RmxvYXRzQXJlSWRlbnRpY2FsKHNlbGYsIHgsIHkpOgogICAgICAgICAiIiJhc3NlcnQgdGhhdCBmbG9hdHMgeCBhbmQgeSBhcmUgaWRlbnRpY2FsLCBpbiB0aGUgc2Vuc2UgdGhhdDoKQEAgLTczLDcgKzczLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRDbG9zZUFicyh4LmltYWcsIHkuaW1hZywgZXBzKQogCiAgICAgZGVmIGFzc2VydElzKHNlbGYsIGEsIGIpOgotICAgICAgICBzZWxmLmFzc2VydF8oYSBpcyBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpcyBiKQogCiAgICAgZGVmIGNoZWNrX2RpdihzZWxmLCB4LCB5KToKICAgICAgICAgIiIiQ29tcHV0ZSBjb21wbGV4IHo9eCp5LCBhbmQgY2hlY2sgdGhhdCB6L3g9PXkgYW5kIHoveT09eC4iIiIKQEAgLTE5Miw4ICsxOTIsOCBAQAogCiAgICAgZGVmIHRlc3RfYm9vbGNvbnRleHQoc2VsZik6CiAgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNvbXBsZXgocmFuZG9tKCkgKyAxZS02LCByYW5kb20oKSArIDFlLTYpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGNvbXBsZXgoMC4wLCAwLjApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbXBsZXgocmFuZG9tKCkgKyAxZS02LCByYW5kb20oKSArIDFlLTYpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNvbXBsZXgoMC4wLCAwLjApKQogCiAgICAgZGVmIHRlc3RfY29uanVnYXRlKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydENsb3NlKGNvbXBsZXgoNS4zLCA5LjgpLmNvbmp1Z2F0ZSgpLCA1LjMtOS44aikKQEAgLTI3NSw3ICsyNzUsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwbGl0X3plcm9zKGNvbXBsZXgoLTAuLCAxLikucmVhbCksIHNwbGl0X3plcm9zKC0wLikpCiAKICAgICAgICAgYyA9IDMuMTQgKyAxagotICAgICAgICBzZWxmLmFzc2VydF8oY29tcGxleChjKSBpcyBjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tcGxleChjKSBpcyBjKQogICAgICAgICBkZWwgYwogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY29tcGxleCwgIjEiLCAiMSIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbnRhaW5zLnB5IGIvTGliL3Rlc3QvdGVzdF9jb250YWlucy5weQppbmRleCAwZDU0MDk5Li43M2UwNjg1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbnRhaW5zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29udGFpbnMucHkKQEAgLTIwLDU3ICsyMCw1NyBAQAogICAgICAgICBhID0gYmFzZV9zZXQoMSkKICAgICAgICAgYiA9IHNldCgxKQogICAgICAgICBjID0gc2VxKDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygxIGluIGIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygwIG5vdCBpbiBiKQotICAgICAgICBzZWxmLmFzc2VydF8oMSBpbiBjKQotICAgICAgICBzZWxmLmFzc2VydF8oMCBub3QgaW4gYykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDEgaW4gYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgbm90IGluIGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgxIGluIGMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIG5vdCBpbiBjKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogMSBpbiBhKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogMSBub3QgaW4gYSkKIAogICAgICAgICAjIHRlc3QgY2hhciBpbiBzdHJpbmcKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdjJyBpbiAnYWJjJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdkJyBub3QgaW4gJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYycgaW4gJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZCcgbm90IGluICdhYmMnKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnJyBpbiAnJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCcnIGluICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJycgaW4gJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnJyBpbiAnYWJjJykKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogTm9uZSBpbiAnYWJjJykKIAogICAgIGlmIGhhdmVfdW5pY29kZToKICAgICAgICAgZGVmIHRlc3RfY2hhcl9pbl91bmljb2RlKHNlbGYpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCdjJyBpbiB1bmljb2RlKCdhYmMnKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnZCcgbm90IGluIHVuaWNvZGUoJ2FiYycpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdjJyBpbiB1bmljb2RlKCdhYmMnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZCcgbm90IGluIHVuaWNvZGUoJ2FiYycpKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oJycgaW4gdW5pY29kZSgnJykpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odW5pY29kZSgnJykgaW4gJycpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odW5pY29kZSgnJykgaW4gdW5pY29kZSgnJykpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oJycgaW4gdW5pY29kZSgnYWJjJykpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odW5pY29kZSgnJykgaW4gJ2FiYycpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odW5pY29kZSgnJykgaW4gdW5pY29kZSgnYWJjJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJycgaW4gdW5pY29kZSgnJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZSgnJykgaW4gJycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZSgnJykgaW4gdW5pY29kZSgnJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJycgaW4gdW5pY29kZSgnYWJjJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZSgnJykgaW4gJ2FiYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZSgnJykgaW4gdW5pY29kZSgnYWJjJykpCiAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiBOb25lIGluIHVuaWNvZGUoJ2FiYycpKQogCiAgICAgICAgICAgICAjIHRlc3QgVW5pY29kZSBjaGFyIGluIFVuaWNvZGUKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh1bmljb2RlKCdjJykgaW4gdW5pY29kZSgnYWJjJykpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odW5pY29kZSgnZCcpIG5vdCBpbiB1bmljb2RlKCdhYmMnKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bmljb2RlKCdjJykgaW4gdW5pY29kZSgnYWJjJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZSgnZCcpIG5vdCBpbiB1bmljb2RlKCdhYmMnKSkKIAogICAgICAgICAgICAgIyB0ZXN0IFVuaWNvZGUgY2hhciBpbiBzdHJpbmcKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh1bmljb2RlKCdjJykgaW4gJ2FiYycpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odW5pY29kZSgnZCcpIG5vdCBpbiAnYWJjJykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bmljb2RlKCdjJykgaW4gJ2FiYycpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZSgnZCcpIG5vdCBpbiAnYWJjJykKIAogICAgIGRlZiB0ZXN0X2J1aWx0aW5fc2VxdWVuY2VfdHlwZXMoc2VsZik6CiAgICAgICAgICMgYSBjb2xsZWN0aW9uIG9mIHRlc3RzIG9uIGJ1aWx0aW4gc2VxdWVuY2UgdHlwZXMKICAgICAgICAgYSA9IHJhbmdlKDEwKQogICAgICAgICBmb3IgaSBpbiBhOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGkgaW4gYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKDE2IG5vdCBpbiBhKQotICAgICAgICBzZWxmLmFzc2VydF8oYSBub3QgaW4gYSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpIGluIGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgxNiBub3QgaW4gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgbm90IGluIGEpCiAKICAgICAgICAgYSA9IHR1cGxlKGEpCiAgICAgICAgIGZvciBpIGluIGE6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaSBpbiBhKQotICAgICAgICBzZWxmLmFzc2VydF8oMTYgbm90IGluIGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIG5vdCBpbiBhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGkgaW4gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDE2IG5vdCBpbiBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBub3QgaW4gYSkKIAogICAgICAgICBjbGFzcyBEZXZpYW50MToKICAgICAgICAgICAgICIiIkJlaGF2ZXMgc3RyYW5nZWx5IHdoZW4gY29tcGFyZWQKQEAgLTg2LDcgKzg2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hTGlzdC5yZW1vdmUoMTQpCiAgICAgICAgICAgICAgICAgcmV0dXJuIDEKIAotICAgICAgICBzZWxmLmFzc2VydF8oRGV2aWFudDEoKSBub3QgaW4gRGV2aWFudDEuYUxpc3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShEZXZpYW50MSgpIG5vdCBpbiBEZXZpYW50MS5hTGlzdCkKIAogICAgICAgICBjbGFzcyBEZXZpYW50MjoKICAgICAgICAgICAgICIiIkJlaGF2ZXMgc3RyYW5nZWx5IHdoZW4gY29tcGFyZWQKQEAgLTk5LDcgKzk5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yLCAiZ290Y2hhIgogCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhEZXZpYW50MigpIG5vdCBpbiBhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKERldmlhbnQyKCkgbm90IGluIGEpCiAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weQppbmRleCAyNzRhZjNkLi44MGJhM2U4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5CkBAIC01NCw3ICs1NCw3IEBACiAgICAgICAgIGN0eCA9IHdoZWUoKQogICAgICAgICBjdHguX19lbnRlcl9fKCkKICAgICAgICAgIyBDYWxsaW5nIF9fZXhpdF9fIHNob3VsZCBub3QgcmVzdWx0IGluIGFuIGV4Y2VwdGlvbgotICAgICAgICBzZWxmLmZhaWxJZihjdHguX19leGl0X18oVHlwZUVycm9yLCBUeXBlRXJyb3IoImZvbyIpLCBOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShjdHguX19leGl0X18oVHlwZUVycm9yLCBUeXBlRXJyb3IoImZvbyIpLCBOb25lKSkKIAogICAgIGRlZiB0ZXN0X2NvbnRleHRtYW5hZ2VyX3RyYXBfeWllbGRfYWZ0ZXJfdGhyb3coc2VsZik6CiAgICAgICAgIEBjb250ZXh0bWFuYWdlcgpAQCAtMjYxLDE3ICsyNjEsMTcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZiA9IE5vbmUKICAgICAgICAgICAgIHdpdGggb3Blbih0Zm4sICJ3IikgYXMgZjoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxJZihmLmNsb3NlZCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuY2xvc2VkKQogICAgICAgICAgICAgICAgIGYud3JpdGUoIkJvb2hcbiIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZi5jbG9zZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCiAgICAgICAgICAgICBmID0gTm9uZQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHdpdGggb3Blbih0Zm4sICJyIikgYXMgZjoKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWlsSWYoZi5jbG9zZWQpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5jbG9zZWQpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksICJCb29oXG4iKQogICAgICAgICAgICAgICAgICAgICAxLzAKICAgICAgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZi5jbG9zZWQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuY2xvc2VkKQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCiAgICAgICAgIGZpbmFsbHk6CkBAIC0yODMsMTYgKzI4MywxNiBAQAogY2xhc3MgTG9ja0NvbnRleHRUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgYm9pbGVyUGxhdGUoc2VsZiwgbG9jaywgbG9ja2VkKToKLSAgICAgICAgc2VsZi5mYWlsSWYobG9ja2VkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9ja2VkKCkpCiAgICAgICAgIHdpdGggbG9jazoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhsb2NrZWQoKSkKLSAgICAgICAgc2VsZi5mYWlsSWYobG9ja2VkKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobG9ja2VkKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9ja2VkKCkpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHdpdGggbG9jazoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MobG9ja2VkKCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvY2tlZCgpKQogICAgICAgICAgICAgICAgIDEvMAogICAgICAgICBleGNlcHQgWmVyb0RpdmlzaW9uRXJyb3I6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihsb2NrZWQoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobG9ja2VkKCkpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCByYWlzZSBaZXJvRGl2aXNpb25FcnJvciIpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29va2llbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9jb29raWVsaWIucHkKaW5kZXggOTNkNjJmNy4uZTQzZDczNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb29raWVsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb29raWVsaWIucHkKQEAgLTIxLDcgKzIxLDcgQEAKICAgICAgICAgYXogPSB0aW1lMmlzb3ooKQogICAgICAgICBieiA9IHRpbWUyaXNveig1MDAwMDApCiAgICAgICAgIGZvciB0ZXh0IGluIChheiwgYnopOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaChyIl5cZHs0fS1cZFxkLVxkXGQgXGRcZDpcZFxkOlxkXGRaJCIsIHRleHQpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLnNlYXJjaChyIl5cZHs0fS1cZFxkLVxkXGQgXGRcZDpcZFxkOlxkXGRaJCIsIHRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICJiYWQgdGltZTJpc296IGZvcm1hdDogJXMgJXMiICUgKGF6LCBieikpCiAKICAgICBkZWYgdGVzdF9odHRwMnRpbWUoc2VsZik6CkBAIC03NCw3ICs3NCw3IEBACiAgICAgICAgICAgICB0MiA9IGh0dHAydGltZShzLmxvd2VyKCkpCiAgICAgICAgICAgICB0MyA9IGh0dHAydGltZShzLnVwcGVyKCkpCiAKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0ID09IHQyID09IHQzID09IHRlc3RfdCwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ID09IHQyID09IHQzID09IHRlc3RfdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyAgPT4gICVzLCAlcywgJXMgKCVzKSIgJSAocywgdCwgdDIsIHQzLCB0ZXN0X3QpKQogCiAgICAgZGVmIHRlc3RfaHR0cDJ0aW1lX2dhcmJhZ2Uoc2VsZik6CkBAIC05Miw3ICs5Miw3IEBACiAgICAgICAgICAgICAnMDEtMDEtMTk4MCAwMDo2MTowMCcsCiAgICAgICAgICAgICAnMDEtMDEtMTk4MCAwMDowMDo2MicsCiAgICAgICAgICAgICBdOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGh0dHAydGltZSh0ZXN0KSBpcyBOb25lLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGh0dHAydGltZSh0ZXN0KSBpcyBOb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwMnRpbWUoJXMpIGlzIG5vdCBOb25lXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHAydGltZSh0ZXN0KSAlcyIgJSAodGVzdCwgaHR0cDJ0aW1lKHRlc3QpKQogICAgICAgICAgICAgICAgICAgICAgICAgICkKQEAgLTM0OSw4ICszNDksOCBAQAogICAgICAgICAgICAgXToKICAgICAgICAgICAgIHJlcXVlc3QgPSB1cmxsaWIyLlJlcXVlc3QodXJsKQogICAgICAgICAgICAgciA9IHBvbC5kb21haW5fcmV0dXJuX29rKGRvbWFpbiwgcmVxdWVzdCkKLSAgICAgICAgICAgIGlmIG9rOiBzZWxmLmFzc2VydF8ocikKLSAgICAgICAgICAgIGVsc2U6IHNlbGYuYXNzZXJ0Xyhub3QgcikKKyAgICAgICAgICAgIGlmIG9rOiBzZWxmLmFzc2VydFRydWUocikKKyAgICAgICAgICAgIGVsc2U6IHNlbGYuYXNzZXJ0VHJ1ZShub3QgcikKIAogICAgIGRlZiB0ZXN0X21pc3NpbmdfdmFsdWUoc2VsZik6CiAgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBNb3ppbGxhQ29va2llSmFyLCBsd3BfY29va2llX3N0cgpAQCAtMzYyLDEwICszNjIsMTAgQEAKICAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ2VnZ3MnKQogICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnInNwYW0iOyBwYXRoPS9mb28vJykKICAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZWdncyJdCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUudmFsdWUgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvb2tpZS52YWx1ZSBpcyBOb25lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb29raWUubmFtZSwgImVnZ3MiKQogICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsnL2Zvby8nXVsnInNwYW0iJ10KLSAgICAgICAgc2VsZi5hc3NlcnRfKGNvb2tpZS52YWx1ZSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29va2llLnZhbHVlIGlzIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvb2tpZS5uYW1lLCAnInNwYW0iJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobHdwX2Nvb2tpZV9zdHIoY29va2llKSwgKAogICAgICAgICAgICAgcicic3BhbSI7IHBhdGg9Ii9mb28vIjsgZG9tYWluPSJ3d3cuYWNtZS5jb20iOyAnCkBAIC00MDksNyArNDA5LDcgQEAKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBjb29raWUgPSBjLl9jb29raWVzWyJ3d3cuZXhhbXBsZS5jb20iXVsiLyJdWyJuaSJdCiAgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHZlcnNpb24gaXMgTm9uZSkgICMgZGlkbid0IGV4cGVjdCBhIHN0b3JlZCBjb29raWUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmVyc2lvbiBpcyBOb25lKSAgIyBkaWRuJ3QgZXhwZWN0IGEgc3RvcmVkIGNvb2tpZQogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvb2tpZS52ZXJzaW9uLCB2ZXJzaW9uKQogICAgICAgICAgICAgICAgICMgMjk2NSBjb29raWVzIGFyZSB1bmFmZmVjdGVkCkBAIC00MzMsMjggKzQzMywyOCBAQAogCiAgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbIi5hY21lLmNvbSJdWyIvIl1bInNwYW0iXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjb29raWUuZG9tYWluLCAiLmFjbWUuY29tIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNvb2tpZS5kb21haW5fc3BlY2lmaWVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29va2llLmRvbWFpbl9zcGVjaWZpZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvb2tpZS5wb3J0LCBERUZBVUxUX0hUVFBfUE9SVCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjb29raWUucG9ydF9zcGVjaWZpZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY29va2llLnBvcnRfc3BlY2lmaWVkKQogICAgICAgICAjIGNhc2UgaXMgcHJlc2VydmVkCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUuaGFzX25vbnN0YW5kYXJkX2F0dHIoImJsQXJnaCIpIGFuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29va2llLmhhc19ub25zdGFuZGFyZF9hdHRyKCJibEFyZ2giKSBhbmQKICAgICAgICAgICAgICAgICAgICAgIG5vdCBjb29raWUuaGFzX25vbnN0YW5kYXJkX2F0dHIoImJsYXJnaCIpKQogCiAgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bIm5pIl0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29va2llLmRvbWFpbiwgInd3dy5hY21lLmNvbSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgY29va2llLmRvbWFpbl9zcGVjaWZpZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY29va2llLmRvbWFpbl9zcGVjaWZpZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvb2tpZS5wb3J0LCAiODAsODA4MCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUucG9ydF9zcGVjaWZpZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb29raWUucG9ydF9zcGVjaWZpZWQpCiAKICAgICAgICAgY29va2llID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsibmluaSJdCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb29raWUucG9ydCBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGNvb2tpZS5wb3J0X3NwZWNpZmllZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvb2tpZS5wb3J0IGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY29va2llLnBvcnRfc3BlY2lmaWVkKQogCiAgICAgICAgICMgaW52YWxpZCBleHBpcmVzIHNob3VsZCBub3QgY2F1c2UgY29va2llIHRvIGJlIGRyb3BwZWQKICAgICAgICAgZm9vID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZm9vIl0KICAgICAgICAgc3BhbSA9IGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdWyIvIl1bImZvbyJdCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhmb28uZXhwaXJlcyBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oc3BhbS5leHBpcmVzIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb28uZXhwaXJlcyBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BhbS5leHBpcmVzIGlzIE5vbmUpCiAKICAgICBkZWYgdGVzdF9uc19wYXJzZXJfc3BlY2lhbF9uYW1lcyhzZWxmKToKICAgICAgICAgIyBuYW1lcyBzdWNoIGFzICdleHBpcmVzJyBhcmUgbm90IHNwZWNpYWwgaW4gZmlyc3QgbmFtZT12YWx1ZSBwYWlyCkBAIC00NjYsOCArNDY2LDggQEAKICAgICAgICAgaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIiwgJ3ZlcnNpb249ZWdnczsgc3BhbT1lZ2dzJykKIAogICAgICAgICBjb29raWVzID0gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXQotICAgICAgICBzZWxmLmFzc2VydF8oJ2V4cGlyZXMnIGluIGNvb2tpZXMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygndmVyc2lvbicgaW4gY29va2llcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdleHBpcmVzJyBpbiBjb29raWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3ZlcnNpb24nIGluIGNvb2tpZXMpCiAKICAgICBkZWYgdGVzdF9leHBpcmVzKHNlbGYpOgogICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgdGltZTJuZXRzY2FwZSwgQ29va2llSmFyCkBAIC00ODQsNyArNDg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbm93KQogICAgICAgICBoID0gaW50ZXJhY3RfbmV0c2NhcGUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQotICAgICAgICBzZWxmLmFzc2VydF8oJ3NwYW09ImJhciInIGluIGggYW5kICJmb28iIG5vdCBpbiBoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3NwYW09ImJhciInIGluIGggYW5kICJmb28iIG5vdCBpbiBoKQogCiAgICAgICAgICMgbWF4LWFnZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgZXhwaXJlcywgYW5kIHplcm8gbWF4LWFnZSBpcyByZXF1ZXN0IHRvCiAgICAgICAgICMgZGVsZXRlIGJvdGggbmV3IGNvb2tpZSBhbmQgYW55IG9sZCBtYXRjaGluZyBjb29raWUKQEAgLTUwNSw3ICs1MDUsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCiAgICAgICAgIGMuY2xlYXJfc2Vzc2lvbl9jb29raWVzKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQotICAgICAgICBzZWxmLmFzc2VydF8oJ3NwYW09ImJhciInIGluIGgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnc3BhbT0iYmFyIicgaW4gaCkKIAogICAgICAgICAjIFhYWCBSRkMgMjk2NSBleHBpcnkgcnVsZXMgKHNvbWUgYXBwbHkgdG8gVjAgdG9vKQogCkBAIC01MTcsMzkgKzUxNywzOSBAQAogCiAgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgICBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tLyIsICdzcGFtPSJiYXIiOyBWZXJzaW9uPSIxIicpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCiAKICAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaCIsICdlZ2dzPSJiYXIiOyBWZXJzaW9uPSIxIicpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCiAKICAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgIGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYmxhaC9yaHViYXJiIiwKICAgICAgICAgICAgICAgICAgICAgICAnZWdncz0iYmFyIjsgVmVyc2lvbj0iMSInKQotICAgICAgICBzZWxmLmFzc2VydF8oIi9ibGFoLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiL2JsYWgvIiBpbiBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXSkKIAogICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoL3JodWJhcmIvIiwKICAgICAgICAgICAgICAgICAgICAgICAnZWdncz0iYmFyIjsgVmVyc2lvbj0iMSInKQotICAgICAgICBzZWxmLmFzc2VydF8oIi9ibGFoL3JodWJhcmIvIiBpbiBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCIvYmxhaC9yaHViYXJiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCiAKICAgICAgICAgIyBOZXRzY2FwZQogCiAgICAgICAgIGMgPSBDb29raWVKYXIoKQogICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS8iLCAnc3BhbT0iYmFyIicpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCiAKICAgICAgICAgYyA9IENvb2tpZUphcigpCiAgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgiLCAnZWdncz0iYmFyIicpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiLyIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCiAKICAgICAgICAgYyA9IENvb2tpZUphcigpCiAgICAgICAgIGludGVyYWN0X25ldHNjYXBlKGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2JsYWgvcmh1YmFyYiIsICdlZ2dzPSJiYXIiJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCIvYmxhaCIgaW4gYy5fY29va2llc1sid3d3LmFjbWUuY29tIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiL2JsYWgiIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQogCiAgICAgICAgIGMgPSBDb29raWVKYXIoKQogICAgICAgICBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9ibGFoL3JodWJhcmIvIiwgJ2VnZ3M9ImJhciInKQotICAgICAgICBzZWxmLmFzc2VydF8oIi9ibGFoL3JodWJhcmIiIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIi9ibGFoL3JodWJhcmIiIGluIGMuX2Nvb2tpZXNbInd3dy5hY21lLmNvbSJdKQogCiAgICAgZGVmIHRlc3RfZXNjYXBlX3BhdGgoc2VsZik6CiAgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBlc2NhcGVfcGF0aApAQCAtNjI3LDE0ICs2MjcsMTQgQEAKIAogICAgIGRlZiB0ZXN0X2lzX0hETihzZWxmKToKICAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IGlzX0hETgotICAgICAgICBzZWxmLmFzc2VydF8oaXNfSEROKCJmb28uYmFyLmNvbSIpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNfSEROKCIxZm9vMi4zYmFyNC41Y29tIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCIxOTIuMTY4LjEuMSIpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGlzX0hETigiIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCIuIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCIuZm9vLmJhci5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBpc19IRE4oIi4uZm9vIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNfSEROKCJmb28uIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc19IRE4oImZvby5iYXIuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc19IRE4oIjFmb28yLjNiYXI0LjVjb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oIjE5Mi4xNjguMS4xIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNfSEROKCIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oIi4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oIi5mb28uYmFyLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGlzX0hETigiLi5mb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBpc19IRE4oImZvby4iKSkKIAogICAgIGRlZiB0ZXN0X3JlYWNoKHNlbGYpOgogICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgcmVhY2gKQEAgLTY0OSw0MCArNjQ5LDQwIEBACiAKICAgICBkZWYgdGVzdF9kb21haW5fbWF0Y2goc2VsZik6CiAgICAgICAgIGZyb20gY29va2llbGliIGltcG9ydCBkb21haW5fbWF0Y2gsIHVzZXJfZG9tYWluX21hdGNoCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhkb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIjE5Mi4xNjguMS4xIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIuMTY4LjEuMSIpKQotICAgICAgICBzZWxmLmFzc2VydF8oZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgInguWS5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuWS5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBkb21haW5fbWF0Y2goIngueS5jb20iLCAiWS5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRvbWFpbl9tYXRjaCgiYS5iLmMuY29tIiwgIi5jLmNvbSIpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGRvbWFpbl9tYXRjaCgiLmMuY29tIiwgImEuYi5jLmNvbSIpKQotICAgICAgICBzZWxmLmFzc2VydF8oZG9tYWluX21hdGNoKCJleGFtcGxlLmxvY2FsIiwgIi5sb2NhbCIpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGRvbWFpbl9tYXRjaCgiYmxhaC5ibGFoIiwgIiIpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGRvbWFpbl9tYXRjaCgiIiwgIi5yaHViYXJiLnJodWJhcmIiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRvbWFpbl9tYXRjaCgiIiwgIiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIxOTIuMTY4LjEuMSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGRvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiLjE2OC4xLjEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRvbWFpbl9tYXRjaCgieC55LmNvbSIsICJ4LlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkb21haW5fbWF0Y2goIngueS5jb20iLCAiLlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkb21haW5fbWF0Y2goImEuYi5jLmNvbSIsICIuYy5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkb21haW5fbWF0Y2goIi5jLmNvbSIsICJhLmIuYy5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRvbWFpbl9tYXRjaCgiZXhhbXBsZS5sb2NhbCIsICIubG9jYWwiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkb21haW5fbWF0Y2goImJsYWguYmxhaCIsICIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBkb21haW5fbWF0Y2goIiIsICIucmh1YmFyYi5yaHViYXJiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkb21haW5fbWF0Y2goIiIsICIiKSkKIAotICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goImFjbWUuY29tIiwgImFjbWUuY29tIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goImFjbWUuY29tIiwgIi5hY21lLmNvbSIpKQotICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goInJodWJhcmIuYWNtZS5jb20iLCAiLmFjbWUuY29tIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgid3d3LnJodWJhcmIuYWNtZS5jb20iLCAiLmFjbWUuY29tIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJ4LlkuY29tIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuWS5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJZLmNvbSIpKQotICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goInkuY29tIiwgIlkuY29tIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIi55LmNvbSIsICJZLmNvbSIpKQotICAgICAgICBzZWxmLmFzc2VydF8odXNlcl9kb21haW5fbWF0Y2goIi55LmNvbSIsICIuWS5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHVzZXJfZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIi5jb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJjb20iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICJtIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLm0iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2VyX2RvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiMTkyLjE2OC4xLjEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVzZXJfZG9tYWluX21hdGNoKCJhY21lLmNvbSIsICJhY21lLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHVzZXJfZG9tYWluX21hdGNoKCJhY21lLmNvbSIsICIuYWNtZS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVzZXJfZG9tYWluX21hdGNoKCJyaHViYXJiLmFjbWUuY29tIiwgIi5hY21lLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goInd3dy5yaHViYXJiLmFjbWUuY29tIiwgIi5hY21lLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAieC5ZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiWS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVzZXJfZG9tYWluX21hdGNoKCJ5LmNvbSIsICJZLmNvbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHVzZXJfZG9tYWluX21hdGNoKCIueS5jb20iLCAiWS5jb20iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVzZXJfZG9tYWluX21hdGNoKCIueS5jb20iLCAiLlkuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1c2VyX2RvbWFpbl9tYXRjaCgieC55LmNvbSIsICIuY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiY29tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAibSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHVzZXJfZG9tYWluX21hdGNoKCJ4LnkuY29tIiwgIi5tIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIngueS5jb20iLCAiLiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIjE5Mi4xNjguMS4xIikpCiAgICAgICAgICMgbm90IGJvdGggSEROcywgc28gbXVzdCBzdHJpbmctY29tcGFyZSBlcXVhbCB0byBtYXRjaAotICAgICAgICBzZWxmLmFzc2VydF8obm90IHVzZXJfZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIuMTY4LjEuMSIpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IHVzZXJfZG9tYWluX21hdGNoKCIxOTIuMTY4LjEuMSIsICIuIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIi4xNjguMS4xIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIi4iKSkKICAgICAgICAgIyBlbXB0eSBzdHJpbmcgaXMgYSBzcGVjaWFsIGNhc2UKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCB1c2VyX2RvbWFpbl9tYXRjaCgiMTkyLjE2OC4xLjEiLCAiIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdXNlcl9kb21haW5fbWF0Y2goIjE5Mi4xNjguMS4xIiwgIiIpKQogCiAgICAgZGVmIHRlc3Rfd3JvbmdfZG9tYWluKHNlbGYpOgogICAgICAgICAjIENvb2tpZXMgd2hvc2UgZWZmZWN0aXZlIHJlcXVlc3QtaG9zdCBuYW1lIGRvZXMgbm90IGRvbWFpbi1tYXRjaCB0aGUKQEAgLTgzOSw3ICs4MzksNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYyksIDIpCiAgICAgICAgICMgLi4uIGFuZCBjaGVjayBpcyBkb2Vzbid0IGdldCByZXR1cm5lZAogICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCByZXEuaGFzX2hlYWRlcigiQ29va2llIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpKQogCiAgICAgZGVmIHRlc3RfZG9tYWluX2Jsb2NrKHNlbGYpOgogICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CkBAIC04NjYsNyArODY2LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAxKQogICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vd3d3LnJvYWRydW5uZXIubmV0LyIpCiAgICAgICAgIGMuYWRkX2Nvb2tpZV9oZWFkZXIocmVxKQotICAgICAgICBzZWxmLmFzc2VydF8oKHJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSBhbmQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChyZXEuaGFzX2hlYWRlcigiQ29va2llIikgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgcmVxLmhhc19oZWFkZXIoIkNvb2tpZTIiKSkpCiAKICAgICAgICAgYy5jbGVhcigpCkBAIC04ODIsNyArODgyLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQogICAgICAgICAjIC4uLiBhbmQgY2hlY2sgaXMgZG9lc24ndCBnZXQgcmV0dXJuZWQKICAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgcmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKIAogICAgIGRlZiB0ZXN0X3NlY3VyZShzZWxmKToKICAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQpAQCAtOTAyLDEwICs5MDIsMTAgQEAKICAgICAgICAgICAgICAgICB1cmwgPSAiaHR0cDovL3d3dy5hY21lLmNvbS8iCiAgICAgICAgICAgICAgICAgaW50KGMsIHVybCwgImZvbzE9YmFyJXMlcyIgJSAodnMsIHdoaXRlc3BhY2UpKQogICAgICAgICAgICAgICAgIGludChjLCB1cmwsICJmb28yPWJhciVzOyBzZWN1cmUlcyIgJSAgKHZzLCB3aGl0ZXNwYWNlKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgICAgICAgICBub3QgYy5fY29va2llc1sid3d3LmFjbWUuY29tIl1bIi8iXVsiZm9vMSJdLnNlY3VyZSwKICAgICAgICAgICAgICAgICAgICAgIm5vbi1zZWN1cmUgY29va2llIHJlZ2lzdGVyZWQgc2VjdXJlIikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgICAgICAgICBjLl9jb29raWVzWyJ3d3cuYWNtZS5jb20iXVsiLyJdWyJmb28yIl0uc2VjdXJlLAogICAgICAgICAgICAgICAgICAgICAic2VjdXJlIGNvb2tpZSByZWdpc3RlcmVkIG5vbi1zZWN1cmUiKQogCkBAIC05MjYsNyArOTI2LDcgQEAKICAgICAgICAgcmVxID0gUmVxdWVzdCh1cmwpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMSkKICAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZXEuaGFzX2hlYWRlcigiQ29va2llIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXEuaGFzX2hlYWRlcigiQ29va2llIikpCiAKICAgICBkZWYgdGVzdF9kb21haW5fbWlycm9yKHNlbGYpOgogICAgICAgICBmcm9tIGNvb2tpZWxpYiBpbXBvcnQgQ29va2llSmFyLCBEZWZhdWx0Q29va2llUG9saWN5CkBAIC05MzcsMjEgKzkzNywyMSBAQAogICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICJzcGFtPWVnZ3M7IFZlcnNpb249MSIpCiAgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJEb21haW4iIG5vdCBpbiBoLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoIkRvbWFpbiIgbm90IGluIGgsCiAgICAgICAgICAgICAgICAgICAgICAiYWJzZW50IGRvbWFpbiByZXR1cm5lZCB3aXRoIGRvbWFpbiBwcmVzZW50IikKIAogICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKICAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAnc3BhbT1lZ2dzOyBWZXJzaW9uPTE7IERvbWFpbj0uYmFyLmNvbScpCiAgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCckRG9tYWluPSIuYmFyLmNvbSInIGluIGgsICJkb21haW4gbm90IHJldHVybmVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCckRG9tYWluPSIuYmFyLmNvbSInIGluIGgsICJkb21haW4gbm90IHJldHVybmVkIikKIAogICAgICAgICBjID0gQ29va2llSmFyKHBvbCkKICAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgICMgbm90ZSBtaXNzaW5nIGluaXRpYWwgZG90IGluIERvbWFpbgogICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBEb21haW49YmFyLmNvbScpCiAgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCckRG9tYWluPSJiYXIuY29tIicgaW4gaCwgImRvbWFpbiBub3QgcmV0dXJuZWQiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJyREb21haW49ImJhci5jb20iJyBpbiBoLCAiZG9tYWluIG5vdCByZXR1cm5lZCIpCiAKICAgICBkZWYgdGVzdF9wYXRoX21pcnJvcihzZWxmKToKICAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQpAQCAtOTYyLDE0ICs5NjIsMTQgQEAKICAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAic3BhbT1lZ2dzOyBWZXJzaW9uPTEiKQogICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiUGF0aCIgbm90IGluIGgsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiUGF0aCIgbm90IGluIGgsCiAgICAgICAgICAgICAgICAgICAgICAiYWJzZW50IHBhdGggcmV0dXJuZWQgd2l0aCBwYXRoIHByZXNlbnQiKQogCiAgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICdzcGFtPWVnZ3M7IFZlcnNpb249MTsgUGF0aD0vJykKICAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQotICAgICAgICBzZWxmLmFzc2VydF8oJyRQYXRoPSIvIicgaW4gaCwgInBhdGggbm90IHJldHVybmVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCckUGF0aD0iLyInIGluIGgsICJwYXRoIG5vdCByZXR1cm5lZCIpCiAKICAgICBkZWYgdGVzdF9wb3J0X21pcnJvcihzZWxmKToKICAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQpAQCAtOTgwLDI4ICs5ODAsMjggQEAKICAgICAgICAgdXJsID0gImh0dHA6Ly9mb28uYmFyLmNvbS8iCiAgICAgICAgIGludGVyYWN0XzI5NjUoYywgdXJsLCAic3BhbT1lZ2dzOyBWZXJzaW9uPTEiKQogICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiUG9ydCIgbm90IGluIGgsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiUG9ydCIgbm90IGluIGgsCiAgICAgICAgICAgICAgICAgICAgICAiYWJzZW50IHBvcnQgcmV0dXJuZWQgd2l0aCBwb3J0IHByZXNlbnQiKQogCiAgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICJzcGFtPWVnZ3M7IFZlcnNpb249MTsgUG9ydCIpCiAgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaCgiXCRQb3J0KFtePV18JCkiLCBoKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLnNlYXJjaCgiXCRQb3J0KFtePV18JCkiLCBoKSwKICAgICAgICAgICAgICAgICAgICAgICJwb3J0IHdpdGggbm8gdmFsdWUgbm90IHJldHVybmVkIHdpdGggbm8gdmFsdWUiKQogCiAgICAgICAgIGMgPSBDb29raWVKYXIocG9sKQogICAgICAgICB1cmwgPSAiaHR0cDovL2Zvby5iYXIuY29tLyIKICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCB1cmwsICdzcGFtPWVnZ3M7IFZlcnNpb249MTsgUG9ydD0iODAiJykKICAgICAgICAgaCA9IGludGVyYWN0XzI5NjUoYywgdXJsKQotICAgICAgICBzZWxmLmFzc2VydF8oJyRQb3J0PSI4MCInIGluIGgsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnJFBvcnQ9IjgwIicgaW4gaCwKICAgICAgICAgICAgICAgICAgICAgICJwb3J0IHdpdGggc2luZ2xlIHZhbHVlIG5vdCByZXR1cm5lZCB3aXRoIHNpbmdsZSB2YWx1ZSIpCiAKICAgICAgICAgYyA9IENvb2tpZUphcihwb2wpCiAgICAgICAgIHVybCA9ICJodHRwOi8vZm9vLmJhci5jb20vIgogICAgICAgICBpbnRlcmFjdF8yOTY1KGMsIHVybCwgJ3NwYW09ZWdnczsgVmVyc2lvbj0xOyBQb3J0PSI4MCw4MDgwIicpCiAgICAgICAgIGggPSBpbnRlcmFjdF8yOTY1KGMsIHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCckUG9ydD0iODAsODA4MCInIGluIGgsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnJFBvcnQ9IjgwLDgwODAiJyBpbiBoLAogICAgICAgICAgICAgICAgICAgICAgInBvcnQgd2l0aCBtdWx0aXBsZSB2YWx1ZXMgbm90IHJldHVybmVkIHdpdGggbXVsdGlwbGUgIgogICAgICAgICAgICAgICAgICAgICAgInZhbHVlcyIpCiAKQEAgLTEwMTQsNyArMTAxNCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgJ0NvbW1lbnQ9ImRvZXMgYW55Ym9keSByZWFkIHRoZXNlPyI7ICcKICAgICAgICAgICAgICAgICAgICAgICAnQ29tbWVudFVSTD0iaHR0cDovL2Zvby5iYXIubmV0L2NvbW1lbnQuaHRtbCInKQogICAgICAgICBoID0gaW50ZXJhY3RfMjk2NShjLCB1cmwpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgIkNvbW1lbnQiIG5vdCBpbiBoLAogICAgICAgICAgICAgIkNvbW1lbnQgb3IgQ29tbWVudFVSTCBjb29raWUtYXR0cmlidXRlcyByZXR1cm5lZCB0byBzZXJ2ZXIiKQogCkBAIC0xMDQ1LDcgKzEwNDUsNyBAQAogICAgICAgICBmb3IgaSBpbiByYW5nZSg0KToKICAgICAgICAgICAgIGkgPSAwCiAgICAgICAgICAgICBmb3IgYyBpbiBjczoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShjLCBDb29raWUpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGMsIENvb2tpZSkpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYy52ZXJzaW9uLCB2ZXJzaW9uc1tpXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjLm5hbWUsIG5hbWVzW2ldKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGMuZG9tYWluLCBkb21haW5zW2ldKQpAQCAtMTEwMiw3ICsxMTAyLDcgQEAKICAgICAgICAgaGVhZGVycyA9IFsiU2V0LUNvb2tpZTogYz1mb287IGV4cGlyZXM9Rm9vIEJhciAxMiAzMzoyMjoxMSAyMDAwIl0KICAgICAgICAgYyA9IGNvb2tpZWphcl9mcm9tX2Nvb2tpZV9oZWFkZXJzKGhlYWRlcnMpCiAgICAgICAgIGNvb2tpZSA9IGMuX2Nvb2tpZXNbInd3dy5leGFtcGxlLmNvbSJdWyIvIl1bImMiXQotICAgICAgICBzZWxmLmFzc2VydF8oY29va2llLmV4cGlyZXMgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvb2tpZS5leHBpcmVzIGlzIE5vbmUpCiAKIAogY2xhc3MgTFdQQ29va2llVGVzdHMoVGVzdENhc2UpOgpAQCAtMTE3OSw3ICsxMTc5LDcgQEAKICAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCiAKICAgICAgICAgaCA9IHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKQotICAgICAgICBzZWxmLmFzc2VydF8oIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAogICAgICAgICAgICAgICAgICAgICAgIkNVU1RPTUVSPVdJTEVfRV9DT1lPVEUiIGluIGgpCiAKICAgICAgICAgaGVhZGVycy5hcHBlbmQoJ1NldC1Db29raWU6IFNISVBQSU5HPUZFREVYOyBwYXRoPS9mb28nKQpAQCAtMTE5MCw3ICsxMTkwLDcgQEAKICAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCiAKICAgICAgICAgaCA9IHJlcS5nZXRfaGVhZGVyKCJDb29raWUiKQotICAgICAgICBzZWxmLmFzc2VydF8oIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAogICAgICAgICAgICAgICAgICAgICAgIkNVU1RPTUVSPVdJTEVfRV9DT1lPVEUiIGluIGggYW5kCiAgICAgICAgICAgICAgICAgICAgICAiU0hJUFBJTkc9RkVERVgiIG5vdCBpbiBoKQogCkBAIC0xMTk4LDcgKzExOTgsNyBAQAogICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKIAogICAgICAgICBoID0gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoIlBBUlRfTlVNQkVSPVJPQ0tFVF9MQVVOQ0hFUl8wMDAxIiBpbiBoIGFuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCJQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMSIgaW4gaCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAiQ1VTVE9NRVI9V0lMRV9FX0NPWU9URSIgaW4gaCBhbmQKICAgICAgICAgICAgICAgICAgICAgICBoLnN0YXJ0c3dpdGgoIlNISVBQSU5HPUZFREVYOyIpKSkKIApAQCAtMTI1Miw3ICsxMjUyLDcgQEAKICAgICAgICAgcmVxID0gUmVxdWVzdCgiaHR0cDovL3d3dy5hY21lLmNvbS9hbW1vIikKICAgICAgICAgYy5hZGRfY29va2llX2hlYWRlcihyZXEpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaChyIlBBUlRfTlVNQkVSPVJJRElOR19ST0NLRVRfMDAyMztccyoiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5zZWFyY2gociJQQVJUX05VTUJFUj1SSURJTkdfUk9DS0VUXzAwMjM7XHMqIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQQVJUX05VTUJFUj1ST0NLRVRfTEFVTkNIRVJfMDAwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpKSkKIApAQCAtMTI4OCw3ICsxMjg4LDcgQEAKICAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NSgKICAgICAgICAgICAgIGMsICdodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvbG9naW4nLAogICAgICAgICAgICAgJ0N1c3RvbWVyPSJXSUxFX0VfQ09ZT1RFIjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgY29va2llKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNvb2tpZSkKIAogICAgICAgICAjCiAgICAgICAgICMgICAzLiAgVXNlciBBZ2VudCAtPiBTZXJ2ZXIKQEAgLTEzMTAsNyArMTMxMCw3IEBACiAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgJ2h0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9waWNraXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BhcnRfTnVtYmVyPSJSb2NrZXRfTGF1bmNoZXJfMDAwMSI7ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpOwotICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmUuc2VhcmNoKAogICAgICAgICAgICAgcideXCRWZXJzaW9uPSI/MSI/OyBDdXN0b21lcj0iP1dJTEVfRV9DT1lPVEUiPzsgXCRQYXRoPSIvYWNtZSIkJywKICAgICAgICAgICAgIGNvb2tpZSkpCiAKQEAgLTEzMzUsMTAgKzEzMzUsMTAgQEAKICAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9hY21lL3NoaXBwaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU2hpcHBpbmc9IkZlZEV4IjsgVmVyc2lvbj0iMSI7IFBhdGg9Ii9hY21lIicpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaChyJ15cJFZlcnNpb249Ij8xIj87JywgY29va2llKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlLnNlYXJjaChyJ1BhcnRfTnVtYmVyPSI/Um9ja2V0X0xhdW5jaGVyXzAwMDEiPzsnCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5zZWFyY2gocideXCRWZXJzaW9uPSI/MSI/OycsIGNvb2tpZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5zZWFyY2gocidQYXJ0X051bWJlcj0iP1JvY2tldF9MYXVuY2hlcl8wMDAxIj87JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdccypcJFBhdGg9IlwvYWNtZSInLCBjb29raWUpKQotICAgICAgICBzZWxmLmFzc2VydF8ocmUuc2VhcmNoKHInQ3VzdG9tZXI9Ij9XSUxFX0VfQ09ZT1RFIj87XHMqXCRQYXRoPSJcL2FjbWUiJywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLnNlYXJjaChyJ0N1c3RvbWVyPSI/V0lMRV9FX0NPWU9URSI/O1xzKlwkUGF0aD0iXC9hY21lIicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llKSkKIAogICAgICAgICAjCkBAIC0xMzYwLDcgKzEzNjAsNyBAQAogICAgICAgICAjICAgICAgIFRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlLgogCiAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9wcm9jZXNzIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgICByZS5zZWFyY2gocidTaGlwcGluZz0iP0ZlZEV4Ij87XHMqXCRQYXRoPSJcL2FjbWUiJywgY29va2llKSBhbmQKICAgICAgICAgICAgICJXSUxFX0VfQ09ZT1RFIiBpbiBjb29raWUpCiAKQEAgLTE0MTEsNyArMTQxMSw3IEBACiAgICAgICAgICMgdGhhbiBvbmNlLgogCiAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20vYWNtZS9hbW1vLy4uLiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgcmUuc2VhcmNoKHIiUmlkaW5nX1JvY2tldF8wMDIzLipSb2NrZXRfTGF1bmNoZXJfMDAwMSIsIGNvb2tpZSkpCiAKICAgICAgICAgIyBBIHN1YnNlcXVlbnQgcmVxdWVzdCBieSB0aGUgdXNlciBhZ2VudCB0byB0aGUgKHNhbWUpIHNlcnZlciBmb3IgYSBVUkwgb2YKQEAgLTE0MjQsNyArMTQyNCw3IEBACiAgICAgICAgICMgdGhlIHNlcnZlci4KIAogICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vd3d3LmFjbWUuY29tL2FjbWUvcGFydHMvIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJSb2NrZXRfTGF1bmNoZXJfMDAwMSIgaW4gY29va2llIGFuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoIlJvY2tldF9MYXVuY2hlcl8wMDAxIiBpbiBjb29raWUgYW5kCiAgICAgICAgICAgICAgICAgICAgICAiUmlkaW5nX1JvY2tldF8wMDIzIiBub3QgaW4gY29va2llKQogCiAgICAgZGVmIHRlc3RfcmVqZWN0aW9uKHNlbGYpOgpAQCAtMTQ0MCw3ICsxNDQwLDcgQEAKICAgICAgICAgIyBpbGxlZ2FsIGRvbWFpbiAobm8gZW1iZWRkZWQgZG90cykKICAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL3d3dy5hY21lLmNvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zvbz1iYXI7IGRvbWFpbj0iLmNvbSI7IHZlcnNpb249MScpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgYykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjKQogCiAgICAgICAgICMgbGVnYWwgZG9tYWluCiAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoYywgImh0dHA6Ly93d3cuYWNtZS5jb20iLApAQCAtMTUzMywxMSArMTUzMywxMSBAQAogICAgICAgICAgICAgYywgImh0dHA6Ly93d3cuYWNtZS5jb20vZm9vJTJmJTI1Lzw8JTBhbmV35S/m+OUiLAogICAgICAgICAgICAgJ2Jhcj1iYXo7IHBhdGg9Ii9mb28vIjsgdmVyc2lvbj0xJyk7CiAgICAgICAgIHZlcnNpb25fcmUgPSByZS5jb21waWxlKHInXlwkdmVyc2lvbj1cIj8xXCI/JywgcmUuSSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJmb289YmFyIiBpbiBjb29raWUgYW5kIHZlcnNpb25fcmUuc2VhcmNoKGNvb2tpZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiZm9vPWJhciIgaW4gY29va2llIGFuZCB2ZXJzaW9uX3JlLnNlYXJjaChjb29raWUpKQogCiAgICAgICAgIGNvb2tpZSA9IGludGVyYWN0XzI5NjUoCiAgICAgICAgICAgICBjLCAiaHR0cDovL3d3dy5hY21lLmNvbS9mb28vJTI1Lzw8JTBhbmV35S/m+OUiKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGNvb2tpZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjb29raWUpCiAKICAgICAgICAgIyB1bmljb2RlIFVSTCBkb2Vzbid0IHJhaXNlIGV4Y2VwdGlvbgogICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsIHUiaHR0cDovL3d3dy5hY21lLmNvbS9ceGZjIikKQEAgLTE1NzksMTEgKzE1NzksMTEgQEAKIAogICAgICAgICBuZXdfYyA9IHNhdmVfYW5kX3Jlc3RvcmUoYywgVHJ1ZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKG5ld19jKSwgNikgICMgbm9uZSBkaXNjYXJkZWQKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJuYW1lPSdmb28xJywgdmFsdWU9J2JhciciIGluIHJlcHIobmV3X2MpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIm5hbWU9J2ZvbzEnLCB2YWx1ZT0nYmFyJyIgaW4gcmVwcihuZXdfYykpCiAKICAgICAgICAgbmV3X2MgPSBzYXZlX2FuZF9yZXN0b3JlKGMsIEZhbHNlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obmV3X2MpLCA0KSAgIyAyIG9mIHRoZW0gZGlzY2FyZGVkIG9uIHNhdmUKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJuYW1lPSdmb28xJywgdmFsdWU9J2JhciciIGluIHJlcHIobmV3X2MpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIm5hbWU9J2ZvbzEnLCB2YWx1ZT0nYmFyJyIgaW4gcmVwcihuZXdfYykpCiAKICAgICBkZWYgdGVzdF9uZXRzY2FwZV9taXNjKHNlbGYpOgogICAgICAgICAjIFNvbWUgYWRkaXRpb25hbCBOZXRzY2FwZSBjb29raWVzIHRlc3RzLgpAQCAtMTYwOCw3ICsxNjA4LDcgQEAKIAogICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZm9vLmJhci5hY21lLmNvbS9mb28iKQogICAgICAgICBjLmFkZF9jb29raWVfaGVhZGVyKHJlcSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgICAiUEFSVF9OVU1CRVI9Myw0IiBpbiByZXEuZ2V0X2hlYWRlcigiQ29va2llIikgYW5kCiAgICAgICAgICAgICAiQ3VzdG9tZXI9V0lMRV9FX0NPWU9URSIgaW4gcmVxLmdldF9oZWFkZXIoIkNvb2tpZSIpKQogCkBAIC0xNjIxLDExICsxNjIxLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgImZvbzE9YmFyOyBQT1JUOyBEaXNjYXJkOyBWZXJzaW9uPTE7IikKICAgICAgICAgY29va2llID0gaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2V4YW1wbGUvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZm9vMj1iYXI7IGRvbWFpbj0iLmxvY2FsIjsgVmVyc2lvbj0xJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJmb28xPWJhciIgaW4gY29va2llKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImZvbzE9YmFyIiBpbiBjb29raWUpCiAKICAgICAgICAgaW50ZXJhY3RfMjk2NShjLCAiaHR0cDovL2V4YW1wbGUvIiwgJ2ZvbzM9YmFyOyBWZXJzaW9uPTEnKQogICAgICAgICBjb29raWUgPSBpbnRlcmFjdF8yOTY1KGMsICJodHRwOi8vZXhhbXBsZS8iKQotICAgICAgICBzZWxmLmFzc2VydF8oImZvbzI9YmFyIiBpbiBjb29raWUgYW5kIGxlbihjKSA9PSAzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImZvbzI9YmFyIiBpbiBjb29raWUgYW5kIGxlbihjKSA9PSAzKQogCiAgICAgZGVmIHRlc3RfaW50cmFuZXRfZG9tYWluc19ucyhzZWxmKToKICAgICAgICAgZnJvbSBjb29raWVsaWIgaW1wb3J0IENvb2tpZUphciwgRGVmYXVsdENvb2tpZVBvbGljeQpAQCAtMTYzNSwxMCArMTYzNSwxMCBAQAogICAgICAgICBjb29raWUgPSBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2V4YW1wbGUvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZvbzI9YmFyOyBkb21haW49LmxvY2FsJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGMpLCAyKQotICAgICAgICBzZWxmLmFzc2VydF8oImZvbzE9YmFyIiBpbiBjb29raWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiZm9vMT1iYXIiIGluIGNvb2tpZSkKIAogICAgICAgICBjb29raWUgPSBpbnRlcmFjdF9uZXRzY2FwZShjLCAiaHR0cDovL2V4YW1wbGUvIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJmb28yPWJhciIgaW4gY29va2llKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImZvbzI9YmFyIiBpbiBjb29raWUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihjKSwgMikKIAogICAgIGRlZiB0ZXN0X2VtcHR5X3BhdGgoc2VsZik6CkBAIC0xNzEzLDcgKzE3MTMsNyBAQAogICAgICAgICAgICAga2V5ID0gIiVzX2FmdGVyIiAlIGNvb2tpZS52YWx1ZQogICAgICAgICAgICAgY291bnRlcltrZXldID0gY291bnRlcltrZXldICsgMQogCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKAorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90ICgKICAgICAgICAgICAgICMgYSBwZXJtYW5lbnQgY29va2llIGdvdCBsb3N0IGFjY2lkZW50YWxseQogICAgICAgICAgICAgY291bnRlclsicGVybV9hZnRlciJdICE9IGNvdW50ZXJbInBlcm1fYmVmb3JlIl0gb3IKICAgICAgICAgICAgICMgYSBzZXNzaW9uIGNvb2tpZSBoYXNuJ3QgYmVlbiBjbGVhcmVkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvcHkucHkgYi9MaWIvdGVzdC90ZXN0X2NvcHkucHkKaW5kZXggYThiZTg4Ny4uY2NiZDIzMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb3B5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29weS5weQpAQCAtMTMsOCArMTMsOCBAQAogICAgICMgQXR0ZW1wdCBmdWxsIGxpbmUgY292ZXJhZ2Ugb2YgY29weS5weSBmcm9tIHRvcCB0byBib3R0b20KIAogICAgIGRlZiB0ZXN0X2V4Y2VwdGlvbnMoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb3B5LkVycm9yIGlzIGNvcHkuZXJyb3IpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc3N1YmNsYXNzKGNvcHkuRXJyb3IsIEV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb3B5LkVycm9yIGlzIGNvcHkuZXJyb3IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGNvcHkuRXJyb3IsIEV4Y2VwdGlvbikpCiAKICAgICAjIFRoZSBjb3B5KCkgbWV0aG9kCiAKQEAgLTU1LDcgKzU1LDcgQEAKICAgICAgICAgICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgInNob3VsZG4ndCBjYWxsIHRoaXMiCiAgICAgICAgIHggPSBDKCkKICAgICAgICAgeSA9IGNvcHkuY29weSh4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyB4KQogCiAgICAgZGVmIHRlc3RfY29weV9yZWR1Y2Uoc2VsZik6CiAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gIiIKICAgICAgICAgeCA9IEMoKQogICAgICAgICB5ID0gY29weS5jb3B5KHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5IGlzIHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIHgpCiAKICAgICBkZWYgdGVzdF9jb3B5X2NhbnQoc2VsZik6CiAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgICAgICAgICAgICAgImhlbGxvIiwgdSJoZWxsb1x1MTIzNCIsIGYuZnVuY19jb2RlLAogICAgICAgICAgICAgICAgICBOZXdTdHlsZSwgeHJhbmdlKDEwKSwgQ2xhc3NpYywgbWF4XQogICAgICAgICBmb3IgeCBpbiB0ZXN0czoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb3B5LmNvcHkoeCkgaXMgeCwgcmVwcih4KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb3B5LmNvcHkoeCkgaXMgeCwgcmVwcih4KSkKIAogICAgIGRlZiB0ZXN0X2NvcHlfbGlzdChzZWxmKToKICAgICAgICAgeCA9IFsxLCAyLCAzXQpAQCAtMTgxLDkgKzE4MSw5IEBACiAgICAgICAgIHggPSBbeCwgeF0KICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHlbMF0gaXMgbm90IHhbMF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5WzBdIGlzIHlbMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeVswXSBpcyBub3QgeFswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHlbMF0gaXMgeVsxXSkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2lzc3ViY2xhc3Moc2VsZik6CiAgICAgICAgICMgWFhYIE5vdGU6IHRoZXJlJ3Mgbm8gd2F5IHRvIHRlc3QgdGhlIFR5cGVFcnJvciBjb21pbmcgb3V0IG9mCkBAIC0yMjgsNyArMjI4LDcgQEAKICAgICAgICAgICAgICAgICByYWlzZSB0ZXN0X3N1cHBvcnQuVGVzdEZhaWxlZCwgInNob3VsZG4ndCBjYWxsIHRoaXMiCiAgICAgICAgIHggPSBDKCkKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgeCkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X3JlZHVjZShzZWxmKToKICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgpAQCAtMjM2LDcgKzIzNiw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgIHggPSBDKCkKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgeCkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2NhbnQoc2VsZik6CiAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKQEAgLTI2MCw2MSArMjYwLDYxIEBACiAgICAgICAgICAgICAgICAgICJoZWxsbyIsIHUiaGVsbG9cdTEyMzQiLCBmLmZ1bmNfY29kZSwKICAgICAgICAgICAgICAgICAgTmV3U3R5bGUsIHhyYW5nZSgxMCksIENsYXNzaWMsIG1heF0KICAgICAgICAgZm9yIHggaW4gdGVzdHM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oY29weS5kZWVwY29weSh4KSBpcyB4LCByZXByKHgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvcHkuZGVlcGNvcHkoeCkgaXMgeCwgcmVwcih4KSkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2xpc3Qoc2VsZik6CiAgICAgICAgIHggPSBbWzEsIDJdLCAzXQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh4IGlzIG5vdCB5KQotICAgICAgICBzZWxmLmFzc2VydF8oeFswXSBpcyBub3QgeVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgbm90IHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WzBdIGlzIG5vdCB5WzBdKQogCiAgICAgZGVmIHRlc3RfZGVlcGNvcHlfcmVmbGV4aXZlX2xpc3Qoc2VsZik6CiAgICAgICAgIHggPSBbXQogICAgICAgICB4LmFwcGVuZCh4KQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGNtcCwgeSwgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgbm90IHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5WzBdIGlzIHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeVswXSBpcyB5KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih5KSwgMSkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X3R1cGxlKHNlbGYpOgogICAgICAgICB4ID0gKFsxLCAyXSwgMykKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyBub3QgeSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHhbMF0gaXMgbm90IHlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIG5vdCB5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeFswXSBpcyBub3QgeVswXSkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X3JlZmxleGl2ZV90dXBsZShzZWxmKToKICAgICAgICAgeCA9IChbXSwpCiAgICAgICAgIHhbMF0uYXBwZW5kKHgpCiAgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgY21wLCB5LCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHlbMF0gaXMgbm90IHhbMF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5WzBdWzBdIGlzIHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeVswXSBpcyBub3QgeFswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHlbMF1bMF0gaXMgeSkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2RpY3Qoc2VsZik6CiAgICAgICAgIHggPSB7ImZvbyI6IFsxLCAyXSwgImJhciI6IDN9CiAgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHggaXMgbm90IHkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh4WyJmb28iXSBpcyBub3QgeVsiZm9vIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIG5vdCB5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeFsiZm9vIl0gaXMgbm90IHlbImZvbyJdKQogCiAgICAgZGVmIHRlc3RfZGVlcGNvcHlfcmVmbGV4aXZlX2RpY3Qoc2VsZik6CiAgICAgICAgIHggPSB7fQogICAgICAgICB4Wydmb28nXSA9IHgKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yLCBjbXAsIHksIHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5IGlzIG5vdCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeVsnZm9vJ10gaXMgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5Wydmb28nXSBpcyB5KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih5KSwgMSkKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2tlZXBhbGl2ZShzZWxmKToKICAgICAgICAgbWVtbyA9IHt9CiAgICAgICAgIHggPSA0MgogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4LCBtZW1vKQotICAgICAgICBzZWxmLmFzc2VydF8obWVtb1tpZCh4KV0gaXMgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1lbW9baWQoeCldIGlzIHgpCiAKICAgICBkZWYgdGVzdF9kZWVwY29weV9pbnN0X3ZhbmlsbGEoc2VsZik6CiAgICAgICAgIGNsYXNzIEM6CkBAIC0zMjUsNyArMzI1LDcgQEAKICAgICAgICAgeCA9IEMoWzQyXSkKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeS5mb28gaXMgbm90IHguZm9vKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5mb28gaXMgbm90IHguZm9vKQogCiAgICAgZGVmIHRlc3RfZGVlcGNvcHlfaW5zdF9kZWVwY29weShzZWxmKToKICAgICAgICAgY2xhc3MgQzoKQEAgLTMzOCw4ICszMzgsOCBAQAogICAgICAgICB4ID0gQyhbNDJdKQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5IGlzIG5vdCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeS5mb28gaXMgbm90IHguZm9vKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuZm9vIGlzIG5vdCB4LmZvbykKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2luc3RfZ2V0aW5pdGFyZ3Moc2VsZik6CiAgICAgICAgIGNsYXNzIEM6CkBAIC0zNTIsOCArMzUyLDggQEAKICAgICAgICAgeCA9IEMoWzQyXSkKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkuZm9vIGlzIG5vdCB4LmZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5LmZvbyBpcyBub3QgeC5mb28pCiAKICAgICBkZWYgdGVzdF9kZWVwY29weV9pbnN0X2dldHN0YXRlKHNlbGYpOgogICAgICAgICBjbGFzcyBDOgpAQCAtMzY2LDggKzM2Niw4IEBACiAgICAgICAgIHggPSBDKFs0Ml0pCiAgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgbm90IHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5LmZvbyBpcyBub3QgeC5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5mb28gaXMgbm90IHguZm9vKQogCiAgICAgZGVmIHRlc3RfZGVlcGNvcHlfaW5zdF9zZXRzdGF0ZShzZWxmKToKICAgICAgICAgY2xhc3MgQzoKQEAgLTM4MCw4ICszODAsOCBAQAogICAgICAgICB4ID0gQyhbNDJdKQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5IGlzIG5vdCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeS5mb28gaXMgbm90IHguZm9vKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuZm9vIGlzIG5vdCB4LmZvbykKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2luc3RfZ2V0c3RhdGVfc2V0c3RhdGUoc2VsZik6CiAgICAgICAgIGNsYXNzIEM6CkBAIC0zOTYsOCArMzk2LDggQEAKICAgICAgICAgeCA9IEMoWzQyXSkKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkuZm9vIGlzIG5vdCB4LmZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkgaXMgbm90IHgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5LmZvbyBpcyBub3QgeC5mb28pCiAKICAgICBkZWYgdGVzdF9kZWVwY29weV9yZWZsZXhpdmVfaW5zdChzZWxmKToKICAgICAgICAgY2xhc3MgQzoKQEAgLTQwNSw4ICs0MDUsOCBAQAogICAgICAgICB4ID0gQygpCiAgICAgICAgIHguZm9vID0geAogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkuZm9vIGlzIHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5mb28gaXMgeSkKIAogICAgICMgX3JlY29uc3RydWN0KCkKIApAQCAtNDE2LDkgKzQxNiw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuICIiCiAgICAgICAgIHggPSBDKCkKICAgICAgICAgeSA9IGNvcHkuY29weSh4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyB4KQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQotICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyB4KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyB4KQogCiAgICAgZGVmIHRlc3RfcmVjb25zdHJ1Y3Rfbm9zdGF0ZShzZWxmKToKICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgpAQCAtNDI3LDkgKzQyNyw5IEBACiAgICAgICAgIHggPSBDKCkKICAgICAgICAgeC5mb28gPSA0MgogICAgICAgICB5ID0gY29weS5jb3B5KHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5Ll9fY2xhc3NfXyBpcyB4Ll9fY2xhc3NfXykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuX19jbGFzc19fIGlzIHguX19jbGFzc19fKQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQotICAgICAgICBzZWxmLmFzc2VydF8oeS5fX2NsYXNzX18gaXMgeC5fX2NsYXNzX18pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5Ll9fY2xhc3NfXyBpcyB4Ll9fY2xhc3NfXykKIAogICAgIGRlZiB0ZXN0X3JlY29uc3RydWN0X3N0YXRlKHNlbGYpOgogICAgICAgICBjbGFzcyBDKG9iamVjdCk6CkBAIC00NDQsNyArNDQ0LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHksIHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5LmZvbyBpcyBub3QgeC5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5LmZvbyBpcyBub3QgeC5mb28pCiAKICAgICBkZWYgdGVzdF9yZWNvbnN0cnVjdF9zdGF0ZV9zZXRzdGF0ZShzZWxmKToKICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgpAQCAtNDYxLDcgKzQ2MSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeSwgeCkKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh5LCB4KQotICAgICAgICBzZWxmLmFzc2VydF8oeS5mb28gaXMgbm90IHguZm9vKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeS5mb28gaXMgbm90IHguZm9vKQogCiAgICAgZGVmIHRlc3RfcmVjb25zdHJ1Y3RfcmVmbGV4aXZlKHNlbGYpOgogICAgICAgICBjbGFzcyBDKG9iamVjdCk6CkBAIC00NjksOCArNDY5LDggQEAKICAgICAgICAgeCA9IEMoKQogICAgICAgICB4LmZvbyA9IHgKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgbm90IHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh5LmZvbyBpcyB5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHkuZm9vIGlzIHkpCiAKICAgICAjIEFkZGl0aW9ucyBmb3IgUHl0aG9uIDIuMyBhbmQgcGlja2xlIHByb3RvY29sIDIKIApAQCAtNDg1LDEyICs0ODUsMTIgQEAKICAgICAgICAgeCA9IEMoW1sxLCAyXSwgM10pCiAgICAgICAgIHkgPSBjb3B5LmNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQotICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyBub3QgeSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHhbMF0gaXMgeVswXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgbm90IHkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WzBdIGlzIHlbMF0pCiAgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeCwgeSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHggaXMgbm90IHkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh4WzBdIGlzIG5vdCB5WzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyBub3QgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHhbMF0gaXMgbm90IHlbMF0pCiAKICAgICBkZWYgdGVzdF9yZWR1Y2VfNXR1cGxlKHNlbGYpOgogICAgICAgICBjbGFzcyBDKGRpY3QpOgpAQCAtNTAzLDEyICs1MDMsMTIgQEAKICAgICAgICAgeCA9IEMoWygiZm9vIiwgWzEsIDJdKSwgKCJiYXIiLCAzKV0pCiAgICAgICAgIHkgPSBjb3B5LmNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LCB5KQotICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyBub3QgeSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHhbImZvbyJdIGlzIHlbImZvbyJdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyBub3QgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHhbImZvbyJdIGlzIHlbImZvbyJdKQogICAgICAgICB5ID0gY29weS5kZWVwY29weSh4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgsIHkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh4IGlzIG5vdCB5KQotICAgICAgICBzZWxmLmFzc2VydF8oeFsiZm9vIl0gaXMgbm90IHlbImZvbyJdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyBub3QgeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHhbImZvbyJdIGlzIG5vdCB5WyJmb28iXSkKIAogICAgIGRlZiB0ZXN0X2NvcHlfc2xvdHMoc2VsZik6CiAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKQEAgLTUxNiw3ICs1MTYsNyBAQAogICAgICAgICB4ID0gQygpCiAgICAgICAgIHguZm9vID0gWzQyXQogICAgICAgICB5ID0gY29weS5jb3B5KHgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh4LmZvbyBpcyB5LmZvbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguZm9vIGlzIHkuZm9vKQogCiAgICAgZGVmIHRlc3RfZGVlcGNvcHlfc2xvdHMoc2VsZik6CiAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKQEAgLTUyNSw3ICs1MjUsNyBAQAogICAgICAgICB4LmZvbyA9IFs0Ml0KICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmZvbywgeS5mb28pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh4LmZvbyBpcyBub3QgeS5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4LmZvbyBpcyBub3QgeS5mb28pCiAKICAgICBkZWYgdGVzdF9jb3B5X2xpc3Rfc3ViY2xhc3Moc2VsZik6CiAgICAgICAgIGNsYXNzIEMobGlzdCk6CkBAIC01MzUsOCArNTM1LDggQEAKICAgICAgICAgeSA9IGNvcHkuY29weSh4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoeCksIGxpc3QoeSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5mb28sIHkuZm9vKQotICAgICAgICBzZWxmLmFzc2VydF8oeFswXSBpcyB5WzBdKQotICAgICAgICBzZWxmLmFzc2VydF8oeC5mb28gaXMgeS5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WzBdIGlzIHlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4LmZvbyBpcyB5LmZvbykKIAogICAgIGRlZiB0ZXN0X2RlZXBjb3B5X2xpc3Rfc3ViY2xhc3Moc2VsZik6CiAgICAgICAgIGNsYXNzIEMobGlzdCk6CkBAIC01NDYsOCArNTQ2LDggQEAKICAgICAgICAgeSA9IGNvcHkuZGVlcGNvcHkoeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHgpLCBsaXN0KHkpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguZm9vLCB5LmZvbykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHhbMF0gaXMgbm90IHlbMF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh4LmZvbyBpcyBub3QgeS5mb28pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4WzBdIGlzIG5vdCB5WzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5mb28gaXMgbm90IHkuZm9vKQogCiAgICAgZGVmIHRlc3RfY29weV90dXBsZV9zdWJjbGFzcyhzZWxmKToKICAgICAgICAgY2xhc3MgQyh0dXBsZSk6CkBAIC01NjQsOCArNTY0LDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZSh4KSwgKFsxLCAyXSwgMykpCiAgICAgICAgIHkgPSBjb3B5LmRlZXBjb3B5KHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoeSksIChbMSwgMl0sIDMpKQotICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyBub3QgeSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHhbMF0gaXMgbm90IHlbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4IGlzIG5vdCB5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeFswXSBpcyBub3QgeVswXSkKIAogICAgIGRlZiB0ZXN0X2dldHN0YXRlX2V4YyhzZWxmKToKICAgICAgICAgY2xhc3MgRXZpbFN0YXRlKG9iamVjdCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvcHlfcmVnLnB5IGIvTGliL3Rlc3QvdGVzdF9jb3B5X3JlZy5weQppbmRleCBjM2QzOTY0Li5lZmUyYjRkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvcHlfcmVnLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29weV9yZWcucHkKQEAgLTUxLDEwICs1MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLCBmdW5jLCBjb2RlKQogICAgICAgICAgICAgY29weV9yZWcuYWRkX2V4dGVuc2lvbihtb2QsIGZ1bmMsIGNvZGUpCiAgICAgICAgICAgICAjIFNob3VsZCBiZSBpbiB0aGUgcmVnaXN0cnkuCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oY29weV9yZWcuX2V4dGVuc2lvbl9yZWdpc3RyeVttb2QsIGZ1bmNdID09IGNvZGUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oY29weV9yZWcuX2ludmVydGVkX3JlZ2lzdHJ5W2NvZGVdID09IChtb2QsIGZ1bmMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvcHlfcmVnLl9leHRlbnNpb25fcmVnaXN0cnlbbW9kLCBmdW5jXSA9PSBjb2RlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvcHlfcmVnLl9pbnZlcnRlZF9yZWdpc3RyeVtjb2RlXSA9PSAobW9kLCBmdW5jKSkKICAgICAgICAgICAgICMgU2hvdWxkbid0IGJlIGluIHRoZSBjYWNoZS4KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb2RlIG5vdCBpbiBjb3B5X3JlZy5fZXh0ZW5zaW9uX2NhY2hlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvZGUgbm90IGluIGNvcHlfcmVnLl9leHRlbnNpb25fY2FjaGUpCiAgICAgICAgICAgICAjIFJlZHVuZGFudCByZWdpc3RyYXRpb24gc2hvdWxkIGJlIE9LLgogICAgICAgICAgICAgY29weV9yZWcuYWRkX2V4dGVuc2lvbihtb2QsIGZ1bmMsIGNvZGUpICAjIHNob3VsZG4ndCBibG93IHVwCiAgICAgICAgICAgICAjIENvbmZsaWN0aW5nIGNvZGUuCkBAIC04MSw3ICs4MSw3IEBACiAgICAgICAgICAgICBlLnJlc3RvcmUoKQogCiAgICAgICAgICMgU2hvdWxkbid0IGJlIHRoZXJlIGFueW1vcmUuCi0gICAgICAgIHNlbGYuYXNzZXJ0XygobW9kLCBmdW5jKSBub3QgaW4gY29weV9yZWcuX2V4dGVuc2lvbl9yZWdpc3RyeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChtb2QsIGZ1bmMpIG5vdCBpbiBjb3B5X3JlZy5fZXh0ZW5zaW9uX3JlZ2lzdHJ5KQogICAgICAgICAjIFRoZSBjb2RlICptYXkqIGJlIGluIGNvcHlfcmVnLl9leHRlbnNpb25fcmVnaXN0cnksIHRob3VnaCwgaWYKICAgICAgICAgIyB3ZSBoYXBwZW5lZCB0byBwaWNrIG9uIGEgcmVnaXN0ZXJlZCBjb2RlLiAgU28gZG9uJ3QgY2hlY2sgZm9yCiAgICAgICAgICMgdGhhdC4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY3N2LnB5IGIvTGliL3Rlc3QvdGVzdF9jc3YucHkKaW5kZXggNTU0NDkwNC4uYWViNjhiYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jc3YucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jc3YucHkKQEAgLTMyNiw3ICszMjYsNyBAQAogICAgICAgICBleHBlY3RlZF9kaWFsZWN0cy5zb3J0KCkKICAgICAgICAgY3N2LnJlZ2lzdGVyX2RpYWxlY3QobmFtZSwgbXlleGNlbHRzdikKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNzdi5nZXRfZGlhbGVjdChuYW1lKS5kZWxpbWl0ZXIsICdcdCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY3N2LmdldF9kaWFsZWN0KG5hbWUpLmRlbGltaXRlciwgJ1x0JykKICAgICAgICAgICAgIGdvdF9kaWFsZWN0cyA9IGNzdi5saXN0X2RpYWxlY3RzKCkKICAgICAgICAgICAgIGdvdF9kaWFsZWN0cy5zb3J0KCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfZGlhbGVjdHMsIGdvdF9kaWFsZWN0cykKQEAgLTMzNyw4ICszMzcsOCBAQAogICAgICAgICBuYW1lID0gJ2ZlZGNiYScKICAgICAgICAgY3N2LnJlZ2lzdGVyX2RpYWxlY3QobmFtZSwgZGVsaW1pdGVyPSc7JykKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNzdi5nZXRfZGlhbGVjdChuYW1lKS5kZWxpbWl0ZXIsICdcdCcpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MobGlzdChjc3YucmVhZGVyKCdYO1k7WicsIG5hbWUpKSwgWydYJywgJ1knLCAnWiddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNzdi5nZXRfZGlhbGVjdChuYW1lKS5kZWxpbWl0ZXIsICdcdCcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobGlzdChjc3YucmVhZGVyKCdYO1k7WicsIG5hbWUpKSwgWydYJywgJ1knLCAnWiddKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgY3N2LnVucmVnaXN0ZXJfZGlhbGVjdChuYW1lKQogCkBAIC05MzUsNyArOTM1LDcgQEAKICAgICAgICAgIyBnaXZlbiB0aGF0IGFsbCB0aHJlZSBsaW5lcyBpbiBzYW1wbGUzIGFyZSBlcXVhbCwKICAgICAgICAgIyBJIHRoaW5rIHRoYXQgYW55IGNoYXJhY3RlciBjb3VsZCBoYXZlIGJlZW4gJ2d1ZXNzZWQnIGFzIHRoZQogICAgICAgICAjIGRlbGltaXRlciwgZGVwZW5kaW5nIG9uIGRpY3Rpb25hcnkgb3JkZXIKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRpYWxlY3QuZGVsaW1pdGVyIGluIHNlbGYuc2FtcGxlMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpYWxlY3QuZGVsaW1pdGVyIGluIHNlbGYuc2FtcGxlMykKICAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGUzLCBkZWxpbWl0ZXJzPSI/LCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlhbGVjdC5kZWxpbWl0ZXIsICI/IikKICAgICAgICAgZGlhbGVjdCA9IHNuaWZmZXIuc25pZmYoc2VsZi5zYW1wbGUzLCBkZWxpbWl0ZXJzPSIvLCIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5IGIvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weQppbmRleCAyNGVjODk1Li5hZDM2Mzk4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkKQEAgLTc5LDkgKzc5LDkgQEAKICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvZmZzZXQsIG5hbWUpOgogICAgICAgICAgICAgICAgIHNlbGYuX19vZmZzZXQgPSBvZmZzZXQKICAgICAgICAgICAgICAgICBzZWxmLl9fbmFtZSA9IG5hbWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoTm90RW5vdWdoLCB0emluZm8pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhOb3RFbm91Z2gsIHR6aW5mbykpCiAgICAgICAgIG5lID0gTm90RW5vdWdoKDMsICJOb3RCeUFMb25nU2hvdCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG5lLCB0emluZm8pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShuZSwgdHppbmZvKSkKIAogICAgICAgICBkdCA9IGRhdGV0aW1lLm5vdygpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE5vdEltcGxlbWVudGVkRXJyb3IsIG5lLnR6bmFtZSwgZHQpCkBAIC05MCw3ICs5MCw3IEBACiAKICAgICBkZWYgdGVzdF9ub3JtYWwoc2VsZik6CiAgICAgICAgIGZvID0gRml4ZWRPZmZzZXQoMywgIlRocmVlIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoZm8sIHR6aW5mbykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGZvLCB0emluZm8pKQogICAgICAgICBmb3IgZHQgaW4gZGF0ZXRpbWUubm93KCksIE5vbmU6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZvLnV0Y29mZnNldChkdCksIHRpbWVkZWx0YShtaW51dGVzPTMpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmby50em5hbWUoZHQpLCAiVGhyZWUiKQpAQCAtMTAxLDI1ICsxMDEsMjUgQEAKICAgICAgICAgIyBjYXJyeSBubyBkYXRhKSwgYnV0IHRoZXkgbmVlZCB0byBiZSBwaWNrbGFibGUgYW55d2F5IGVsc2UKICAgICAgICAgIyBjb25jcmV0ZSBzdWJjbGFzc2VzIGNhbid0IGJlIHBpY2tsZWQuCiAgICAgICAgIG9yaWcgPSB0emluZm8uX19uZXdfXyh0emluZm8pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKG9yaWcpIGlzIHR6aW5mbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUob3JpZykgaXMgdHppbmZvKQogICAgICAgICBmb3IgcGlja2xlciwgdW5waWNrbGVyLCBwcm90byBpbiBwaWNrbGVfY2hvaWNlczoKICAgICAgICAgICAgIGdyZWVuID0gcGlja2xlci5kdW1wcyhvcmlnLCBwcm90bykKICAgICAgICAgICAgIGRlcml2ZWQgPSB1bnBpY2tsZXIubG9hZHMoZ3JlZW4pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShkZXJpdmVkKSBpcyB0emluZm8pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShkZXJpdmVkKSBpcyB0emluZm8pCiAKICAgICBkZWYgdGVzdF9waWNrbGluZ19zdWJjbGFzcyhzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgd2UgY2FuIHBpY2tsZS91bnBpY2tsZSBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzLgogICAgICAgICBvZmZzZXQgPSB0aW1lZGVsdGEobWludXRlcz0tMzAwKQogICAgICAgICBvcmlnID0gUGlja2xhYmxlRml4ZWRPZmZzZXQob2Zmc2V0LCAnY29va2llJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uob3JpZywgdHppbmZvKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUob3JpZykgaXMgUGlja2xhYmxlRml4ZWRPZmZzZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG9yaWcsIHR6aW5mbykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKG9yaWcpIGlzIFBpY2tsYWJsZUZpeGVkT2Zmc2V0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWcudXRjb2Zmc2V0KE5vbmUpLCBvZmZzZXQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3JpZy50em5hbWUoTm9uZSksICdjb29raWUnKQogICAgICAgICBmb3IgcGlja2xlciwgdW5waWNrbGVyLCBwcm90byBpbiBwaWNrbGVfY2hvaWNlczoKICAgICAgICAgICAgIGdyZWVuID0gcGlja2xlci5kdW1wcyhvcmlnLCBwcm90bykKICAgICAgICAgICAgIGRlcml2ZWQgPSB1bnBpY2tsZXIubG9hZHMoZ3JlZW4pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShkZXJpdmVkLCB0emluZm8pKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoZGVyaXZlZCkgaXMgUGlja2xhYmxlRml4ZWRPZmZzZXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShkZXJpdmVkLCB0emluZm8pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoZGVyaXZlZCkgaXMgUGlja2xhYmxlRml4ZWRPZmZzZXQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlcml2ZWQudXRjb2Zmc2V0KE5vbmUpLCBvZmZzZXQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlcml2ZWQudHpuYW1lKE5vbmUpLCAnY29va2llJykKIApAQCAtMTM2LDE2ICsxMzYsMTYgQEAKICAgICBkZWYgdGVzdF9oYXJtbGVzc19taXhlZF9jb21wYXJpc29uKHNlbGYpOgogICAgICAgICBtZSA9IHNlbGYudGhlY2xhc3MoMSwgMSwgMSkKIAotICAgICAgICBzZWxmLmZhaWxJZihtZSA9PSAoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1lICE9ICgpKQotICAgICAgICBzZWxmLmZhaWxJZigoKSA9PSBtZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCgpICE9IG1lKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1lID09ICgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWUgIT0gKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoKCkgPT0gbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoKSAhPSBtZSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobWUgaW4gWzEsIDIwTCwgW10sIG1lXSkKLSAgICAgICAgc2VsZi5mYWlsSWYobWUgbm90IGluIFsxLCAyMEwsIFtdLCBtZV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZSBpbiBbMSwgMjBMLCBbXSwgbWVdKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG1lIG5vdCBpbiBbMSwgMjBMLCBbXSwgbWVdKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhbXSBpbiBbbWUsIDEsIDIwTCwgW11dKQotICAgICAgICBzZWxmLmZhaWxJZihbXSBub3QgaW4gW21lLCAxLCAyMEwsIFtdXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFtdIGluIFttZSwgMSwgMjBMLCBbXV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoW10gbm90IGluIFttZSwgMSwgMjBMLCBbXV0pCiAKICAgICBkZWYgdGVzdF9oYXJtZnVsX21peGVkX2NvbXBhcmlzb24oc2VsZik6CiAgICAgICAgIG1lID0gc2VsZi50aGVjbGFzcygxLCAxLCAxKQpAQCAtMzA3LDI5ICszMDcsMjkgQEAKICAgICBkZWYgdGVzdF9jb21wYXJlKHNlbGYpOgogICAgICAgICB0MSA9IHRpbWVkZWx0YSgyLCAzLCA0KQogICAgICAgICB0MiA9IHRpbWVkZWx0YSgyLCAzLCA0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPT0gdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA8PSB0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxID49IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxICE9IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxIDwgdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPiB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID09IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPD0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA+PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSAhPSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA8IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID4gdDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDApCiAKICAgICAgICAgZm9yIGFyZ3MgaW4gKDMsIDMsIDMpLCAoMiwgNCwgNCksICgyLCAzLCA1KToKICAgICAgICAgICAgIHQyID0gdGltZWRlbHRhKCphcmdzKSAgICMgdGhpcyBpcyBsYXJnZXIgdGhhbiB0MQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxIDwgdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDIgPiB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA8PSB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MiA+PSB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSAhPSB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MiAhPSB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPT0gdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQyID09IHQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA+IHQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MiA8IHQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA+PSB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDIgPD0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPCB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiA+IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDw9IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyID49IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxICE9IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyICE9IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA9PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPT0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID4gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyIDwgdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID49IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA8PSB0MSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIC0xKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDIsIHQxKSwgMSkKIApAQCAtMzc3LDcgKzM3Nyw3IEBACiAKICAgICAgICAgICAgICMgVmVyaWZ5IHRkIC0+IHN0cmluZyAtPiB0ZCBpZGVudGl0eS4KICAgICAgICAgICAgIHMgPSByZXByKHRkKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuc3RhcnRzd2l0aCgnZGF0ZXRpbWUuJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKCdkYXRldGltZS4nKSkKICAgICAgICAgICAgIHMgPSBzWzk6XQogICAgICAgICAgICAgdGQyID0gZXZhbChzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZCwgdGQyKQpAQCAtMzg3LDEwICszODcsMTAgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGQsIHRkMikKIAogICAgIGRlZiB0ZXN0X3Jlc29sdXRpb25faW5mbyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodGltZWRlbHRhLm1pbiwgdGltZWRlbHRhKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodGltZWRlbHRhLm1heCwgdGltZWRlbHRhKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodGltZWRlbHRhLnJlc29sdXRpb24sIHRpbWVkZWx0YSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0aW1lZGVsdGEubWF4ID4gdGltZWRlbHRhLm1pbikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodGltZWRlbHRhLm1pbiwgdGltZWRlbHRhKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodGltZWRlbHRhLm1heCwgdGltZWRlbHRhKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodGltZWRlbHRhLnJlc29sdXRpb24sIHRpbWVkZWx0YSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lZGVsdGEubWF4ID4gdGltZWRlbHRhLm1pbikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lZGVsdGEubWluLCB0aW1lZGVsdGEoLTk5OTk5OTk5OSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZWRlbHRhLm1heCwgdGltZWRlbHRhKDk5OTk5OTk5OSwgMjQqMzYwMC0xLCAxZTYtMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZWRlbHRhLnJlc29sdXRpb24sIHRpbWVkZWx0YSgwLCAwLCAxKSkKQEAgLTQzNywxMSArNDM3LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLCAyNCozNjAwLTEsIDk5OTk5OSkpCiAKICAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModGltZWRlbHRhKDEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModGltZWRlbHRhKDAsIDEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModGltZWRlbHRhKDAsIDAsIDEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0aW1lZGVsdGEoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lZGVsdGEoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lZGVsdGEoMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lZGVsdGEoMCwgMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lZGVsdGEobWljcm9zZWNvbmRzPTEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHRpbWVkZWx0YSgwKSkKIAogICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3RpbWVkZWx0YShzZWxmKToKIApAQCAtNDU3LDE3ICs0NTcsMTcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gcm91bmQoc3VtKQogCiAgICAgICAgIHQxID0gVChkYXlzPTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKHQxKSBpcyBUKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0MSkgaXMgVCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS5hc19ob3VycygpLCAyNCkKIAogICAgICAgICB0MiA9IFQoZGF5cz0tMSwgc2Vjb25kcz0tMzYwMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodDIpIGlzIFQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHQyKSBpcyBUKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQyLmFzX2hvdXJzKCksIC0yNSkKIAogICAgICAgICB0MyA9IHQxICsgdDIKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodDMpIGlzIHRpbWVkZWx0YSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodDMpIGlzIHRpbWVkZWx0YSkKICAgICAgICAgdDQgPSBULmZyb21fdGQodDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKHQ0KSBpcyBUKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0NCkgaXMgVCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My5kYXlzLCB0NC5kYXlzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLnNlY29uZHMsIHQ0LnNlY29uZHMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMubWljcm9zZWNvbmRzLCB0NC5taWNyb3NlY29uZHMpCkBAIC01MzAsNyArNTMwLDcgQEAKICAgICAgICAgICAgICAgICAgICBzZWxmLnRoZWNsYXNzLnRvZGF5KCkpOgogICAgICAgICAgICAgIyBWZXJpZnkgZHQgLT4gc3RyaW5nIC0+IGRhdGUgaWRlbnRpdHkuCiAgICAgICAgICAgICBzID0gcmVwcihkdCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLnN0YXJ0c3dpdGgoJ2RhdGV0aW1lLicpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aCgnZGF0ZXRpbWUuJykpCiAgICAgICAgICAgICBzID0gc1s5Ol0KICAgICAgICAgICAgIGR0MiA9IGV2YWwocykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHQsIGR0MikKQEAgLTc2NCw3ICs3NjQsNyBAQAogCiAgICAgICAgICMgSXQgd29ya2VkIG9yIGl0IGRpZG4ndC4gIElmIGl0IGRpZG4ndCwgYXNzdW1lIGl0J3MgcmVhc29uICMyLCBhbmQKICAgICAgICAgIyBsZXQgdGhlIHRlc3QgcGFzcyBpZiB0aGV5J3JlIHdpdGhpbiBoYWxmIGEgc2Vjb25kIG9mIGVhY2ggb3RoZXIuCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0b2RheSA9PSB0b2RheWFnYWluIG9yCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b2RheSA9PSB0b2RheWFnYWluIG9yCiAgICAgICAgICAgICAgICAgICAgICAgICBhYnModG9kYXlhZ2FpbiAtIHRvZGF5KSA8IHRpbWVkZWx0YShzZWNvbmRzPTAuNSkpCiAKICAgICBkZWYgdGVzdF93ZWVrZGF5KHNlbGYpOgpAQCAtOTAxLDEwICs5MDEsMTAgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYi5fX2Zvcm1hdF9fKGZtdCksICdCJykKIAogICAgIGRlZiB0ZXN0X3Jlc29sdXRpb25faW5mbyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc2VsZi50aGVjbGFzcy5taW4sIHNlbGYudGhlY2xhc3MpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzZWxmLnRoZWNsYXNzLm1heCwgc2VsZi50aGVjbGFzcykpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHNlbGYudGhlY2xhc3MucmVzb2x1dGlvbiwgdGltZWRlbHRhKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYudGhlY2xhc3MubWF4ID4gc2VsZi50aGVjbGFzcy5taW4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYudGhlY2xhc3MubWluLCBzZWxmLnRoZWNsYXNzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50aGVjbGFzcy5tYXgsIHNlbGYudGhlY2xhc3MpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnRoZWNsYXNzLnJlc29sdXRpb24sIHRpbWVkZWx0YSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRoZWNsYXNzLm1heCA+IHNlbGYudGhlY2xhc3MubWluKQogCiAgICAgZGVmIHRlc3RfZXh0cmVtZV90aW1lZGVsdGEoc2VsZik6CiAgICAgICAgIGJpZyA9IHNlbGYudGhlY2xhc3MubWF4IC0gc2VsZi50aGVjbGFzcy5taW4KQEAgLTk1MiwyOSArOTUyLDI5IEBACiAgICAgZGVmIHRlc3RfY29tcGFyZShzZWxmKToKICAgICAgICAgdDEgPSBzZWxmLnRoZWNsYXNzKDIsIDMsIDQpCiAgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcygyLCAzLCA0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPT0gdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA8PSB0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxID49IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxICE9IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxIDwgdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPiB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID09IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPD0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA+PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSAhPSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA8IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID4gdDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDApCiAKICAgICAgICAgZm9yIGFyZ3MgaW4gKDMsIDMsIDMpLCAoMiwgNCwgNCksICgyLCAzLCA1KToKICAgICAgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcygqYXJncykgICAjIHRoaXMgaXMgbGFyZ2VyIHRoYW4gdDEKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA8IHQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQyID4gdDEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPD0gdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDIgPj0gdDEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgIT0gdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDIgIT0gdDEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxID09IHQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MiA9PSB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPiB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDIgPCB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPj0gdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQyIDw9IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDwgdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPiB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiA+PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSAhPSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiAhPSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPT0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyID09IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA8IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPD0gdDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MSwgdDIpLCAtMSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQyLCB0MSksIDEpCiAKQEAgLTEwMjgsMTMgKzEwMjgsMTMgQEAKICAgICAgICAgdGhlaXIgPSBDb21wYXJhYmxlKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAob3VyLCB0aGVpciksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHRoZWlyLCBvdXIpLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3VyID09IHRoZWlyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModGhlaXIgPT0gb3VyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3VyID09IHRoZWlyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGhlaXIgPT0gb3VyKQogCiAgICAgZGVmIHRlc3RfYm9vbChzZWxmKToKICAgICAgICAgIyBBbGwgZGF0ZXMgYXJlIGNvbnNpZGVyZWQgdHJ1ZS4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYudGhlY2xhc3MubWluKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi50aGVjbGFzcy5tYXgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRoZWNsYXNzLm1pbikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudGhlY2xhc3MubWF4KQogCiAgICAgZGVmIHRlc3Rfc3RyZnRpbWVfb3V0X29mX3JhbmdlKHNlbGYpOgogICAgICAgICAjIEZvciBuYXN0eSB0ZWNobmljYWwgcmVhc29ucywgd2UgY2FuJ3QgaGFuZGxlIHllYXJzIGJlZm9yZSAxOTAwLgpAQCAtMTE1Nyw3ICsxMTU3LDcgQEAKICAgICAgICAgICAgICAgICAgICBzZWxmLnRoZWNsYXNzLm5vdygpKToKICAgICAgICAgICAgICMgVmVyaWZ5IGR0IC0+IHN0cmluZyAtPiBkYXRldGltZSBpZGVudGl0eS4KICAgICAgICAgICAgIHMgPSByZXByKGR0KQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuc3RhcnRzd2l0aCgnZGF0ZXRpbWUuJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocy5zdGFydHN3aXRoKCdkYXRldGltZS4nKSkKICAgICAgICAgICAgIHMgPSBzWzk6XQogICAgICAgICAgICAgZHQyID0gZXZhbChzKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkdCwgZHQyKQpAQCAtMTIzMCw3ICsxMjMwLDcgQEAKICAgICAgICAgZHQyID0gc2VsZi50aGVjbGFzcygyMDAyLCAzLCAxLCAxMCwgMCwgMCkKICAgICAgICAgZHQzID0gc2VsZi50aGVjbGFzcygyMDAyLCAzLCAxLCA5LCAwLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MSwgZHQzKQotICAgICAgICBzZWxmLmFzc2VydF8oZHQyID4gZHQzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZHQyID4gZHQzKQogCiAgICAgICAgICMgTWFrZSBzdXJlIGNvbXBhcmlzb24gZG9lc24ndCBmb3JnZXQgbWljcm9zZWNvbmRzLCBhbmQgaXNuJ3QgZG9uZQogICAgICAgICAjIHZpYSBjb21wYXJpbmcgYSBmbG9hdCB0aW1lc3RhbXAgKGFuIElFRUUgZG91YmxlIGRvZXNuJ3QgaGF2ZSBlbm91Z2gKQEAgLTEyNDEsNyArMTI0MSw3IEBACiAgICAgICAgIHVzID0gdGltZWRlbHRhKG1pY3Jvc2Vjb25kcz0xKQogICAgICAgICBkdDIgPSBkdDEgKyB1cwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MiAtIGR0MSwgdXMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkdDEgPCBkdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkdDEgPCBkdDIpCiAKICAgICBkZWYgdGVzdF9zdHJmdGltZV93aXRoX2JhZF90em5hbWVfcmVwbGFjZShzZWxmKToKICAgICAgICAgIyB2ZXJpZnkgb2sgaWYgdHppbmZvLnR6bmFtZSgpLnJlcGxhY2UoKSByZXR1cm5zIGEgbm9uLXN0cmluZwpAQCAtMTQyMSwxMiArMTQyMSwxMiBAQAogICAgICAgICBhcmdzID0gWzIwMDAsIDExLCAyOSwgMjAsIDU4LCAxNiwgOTk5OTk4XQogICAgICAgICB0MSA9IHNlbGYudGhlY2xhc3MoKmFyZ3MpCiAgICAgICAgIHQyID0gc2VsZi50aGVjbGFzcygqYXJncykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxID09IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPD0gdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA+PSB0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSAhPSB0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA8IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxID4gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA9PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDw9IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPj0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgIT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPCB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA+IHQyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MSwgdDIpLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MiwgdDEpLCAwKQogCkBAIC0xNDM0LDE4ICsxNDM0LDE4IEBACiAgICAgICAgICAgICBuZXdhcmdzID0gYXJnc1s6XQogICAgICAgICAgICAgbmV3YXJnc1tpXSA9IGFyZ3NbaV0gKyAxCiAgICAgICAgICAgICB0MiA9IHNlbGYudGhlY2xhc3MoKm5ld2FyZ3MpICAgIyB0aGlzIGlzIGxhcmdlciB0aGFuIHQxCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPCB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MiA+IHQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxIDw9IHQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQyID49IHQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxICE9IHQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQyICE9IHQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA9PSB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDIgPT0gdDEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxID4gdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQyIDwgdDEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQxID49IHQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MiA8PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyID4gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPD0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPj0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgIT0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgIT0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID09IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA9PSB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPiB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPCB0MSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPj0gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyIDw9IHQxKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDEsIHQyKSwgLTEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCh0MiwgdDEpLCAxKQogCkBAIC0xNTI2LDcgKzE1MjYsNyBAQAogICAgICAgICAgICAgaWYgYWJzKGZyb21fdGltZXN0YW1wIC0gZnJvbV9ub3cpIDw9IHRvbGVyYW5jZToKICAgICAgICAgICAgICAgICBicmVhawogICAgICAgICAgICAgIyBFbHNlIHRyeSBhZ2FpbiBhIGZldyB0aW1lcy4KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGFicyhmcm9tX3RpbWVzdGFtcCAtIGZyb21fbm93KSA8PSB0b2xlcmFuY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhYnMoZnJvbV90aW1lc3RhbXAgLSBmcm9tX25vdykgPD0gdG9sZXJhbmNlKQogCiAgICAgZGVmIHRlc3Rfc3RycHRpbWUoc2VsZik6CiAgICAgICAgIGltcG9ydCBfc3RycHRpbWUKQEAgLTE2OTUsNyArMTY5NSw3IEBACiAKICAgICAgICAgIyBWZXJpZnkgdCAtPiBzdHJpbmcgLT4gdGltZSBpZGVudGl0eS4KICAgICAgICAgcyA9IHJlcHIodCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuc3RhcnRzd2l0aCgnZGF0ZXRpbWUuJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoJ2RhdGV0aW1lLicpKQogICAgICAgICBzID0gc1s5Ol0KICAgICAgICAgdDIgPSBldmFsKHMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodCwgdDIpCkBAIC0xNzA5LDEyICsxNzA5LDEyIEBACiAgICAgICAgIGFyZ3MgPSBbMSwgMiwgMywgNF0KICAgICAgICAgdDEgPSBzZWxmLnRoZWNsYXNzKCphcmdzKQogICAgICAgICB0MiA9IHNlbGYudGhlY2xhc3MoKmFyZ3MpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA9PSB0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxIDw9IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPj0gdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgIT0gdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPCB0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA+IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPT0gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID49IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxICE9IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxIDwgdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDEgPiB0MikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDEsIHQyKSwgMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDIsIHQxKSwgMCkKIApAQCAtMTcyMiwxOCArMTcyMiwxOCBAQAogICAgICAgICAgICAgbmV3YXJncyA9IGFyZ3NbOl0KICAgICAgICAgICAgIG5ld2FyZ3NbaV0gPSBhcmdzW2ldICsgMQogICAgICAgICAgICAgdDIgPSBzZWxmLnRoZWNsYXNzKCpuZXdhcmdzKSAgICMgdGhpcyBpcyBsYXJnZXIgdGhhbiB0MQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxIDwgdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDIgPiB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA8PSB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MiA+PSB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSAhPSB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MiAhPSB0MSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDEgPT0gdDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQyID09IHQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA+IHQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MiA8IHQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCB0MSA+PSB0MikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdDIgPD0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPCB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiA+IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDw9IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyID49IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxICE9IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQyICE9IHQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MSA9PSB0MikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdDIgPT0gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID4gdDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQyIDwgdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHQxID49IHQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0MiA8PSB0MSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHQxLCB0MiksIC0xKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAodDIsIHQxKSwgMSkKIApAQCAtMTg4NiwxMCArMTg4NiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICIlcygyMywgMTUpIiAlIG5hbWUpCiAKICAgICBkZWYgdGVzdF9yZXNvbHV0aW9uX2luZm8oc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHNlbGYudGhlY2xhc3MubWluLCBzZWxmLnRoZWNsYXNzKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc2VsZi50aGVjbGFzcy5tYXgsIHNlbGYudGhlY2xhc3MpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzZWxmLnRoZWNsYXNzLnJlc29sdXRpb24sIHRpbWVkZWx0YSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLnRoZWNsYXNzLm1heCA+IHNlbGYudGhlY2xhc3MubWluKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzZWxmLnRoZWNsYXNzLm1pbiwgc2VsZi50aGVjbGFzcykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHNlbGYudGhlY2xhc3MubWF4LCBzZWxmLnRoZWNsYXNzKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi50aGVjbGFzcy5yZXNvbHV0aW9uLCB0aW1lZGVsdGEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50aGVjbGFzcy5tYXggPiBzZWxmLnRoZWNsYXNzLm1pbikKIAogICAgIGRlZiB0ZXN0X3BpY2tsaW5nKHNlbGYpOgogICAgICAgICBhcmdzID0gMjAsIDU5LCAxNiwgNjQqKjIKQEAgLTE5MDksMTIgKzE5MDksMTIgQEAKIAogICAgIGRlZiB0ZXN0X2Jvb2woc2VsZik6CiAgICAgICAgIGNscyA9IHNlbGYudGhlY2xhc3MKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNscygxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNscygwLCAxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNscygwLCAwLCAxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNscygwLCAwLCAwLCAxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCBjbHMoMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgY2xzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbHMoMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbHMoMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbHMoMCwgMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbHMoMCwgMCwgMCwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY2xzKDApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNscygpKQogCiAgICAgZGVmIHRlc3RfcmVwbGFjZShzZWxmKToKICAgICAgICAgY2xzID0gc2VsZi50aGVjbGFzcwpAQCAtMjAxMSw3ICsyMDExLDcgQEAKICAgICAgICAgICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOiBwYXNzCiAgICAgICAgIGIgPSBCZXR0ZXJUcnkoKQogICAgICAgICB0ID0gY2xzKDEsIDEsIDEsIHR6aW5mbz1iKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModC50emluZm8gaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQudHppbmZvIGlzIGIpCiAKICAgICBkZWYgdGVzdF91dGNfb2Zmc2V0X291dF9vZl9ib3VuZHMoc2VsZik6CiAgICAgICAgIGNsYXNzIEVkZ3kodHppbmZvKToKQEAgLTIwNTAsOSArMjA1MCw5IEBACiAgICAgICAgIGZvciB0IGluIChjbHMoMSwgMSwgMSksCiAgICAgICAgICAgICAgICAgICBjbHMoMSwgMSwgMSwgdHppbmZvPU5vbmUpLAogICAgICAgICAgICAgICAgICAgY2xzKDEsIDEsIDEsIHR6aW5mbz1DMSgpKSk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModC51dGNvZmZzZXQoKSBpcyBOb25lKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQuZHN0KCkgaXMgTm9uZSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0LnR6bmFtZSgpIGlzIE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodC51dGNvZmZzZXQoKSBpcyBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQuZHN0KCkgaXMgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0LnR6bmFtZSgpIGlzIE5vbmUpCiAKICAgICAgICAgY2xhc3MgQzModHppbmZvKToKICAgICAgICAgICAgIGRlZiB1dGNvZmZzZXQoc2VsZiwgZHQpOiByZXR1cm4gdGltZWRlbHRhKG1pbnV0ZXM9LTE0MzkpCkBAIC0yMTQ2LDcgKzIxNDYsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubWludXRlLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc2Vjb25kLCAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQubWljcm9zZWNvbmQsIDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0LnR6aW5mbyBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodC50emluZm8gaXMgTm9uZSkKIAogICAgIGRlZiB0ZXN0X3pvbmVzKHNlbGYpOgogICAgICAgICBlc3QgPSBGaXhlZE9mZnNldCgtMzAwLCAiRVNUIiwgMSkKQEAgLTIxNjEsMjUgKzIxNjEsMjUgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS50emluZm8sIGVzdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Mi50emluZm8sIHV0YykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My50emluZm8sIG1ldCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQ0LnR6aW5mbyBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDQudHppbmZvIGlzIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDUudHppbmZvLCB1dGMpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9LTMwMCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIudXRjb2Zmc2V0KCksIHRpbWVkZWx0YShtaW51dGVzPTApKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQzLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz02MCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0NC51dGNvZmZzZXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDQudXRjb2Zmc2V0KCkgaXMgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0MS51dGNvZmZzZXQsICJubyBhcmdzIikKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQxLnR6bmFtZSgpLCAiRVNUIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0Mi50em5hbWUoKSwgIlVUQyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDMudHpuYW1lKCksICJNRVQiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDQudHpuYW1lKCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQ0LnR6bmFtZSgpIGlzIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdDEudHpuYW1lLCAibm8gYXJncyIpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MS5kc3QoKSwgdGltZWRlbHRhKG1pbnV0ZXM9MSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodDIuZHN0KCksIHRpbWVkZWx0YShtaW51dGVzPS0yKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0My5kc3QoKSwgdGltZWRlbHRhKG1pbnV0ZXM9MykpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0NC5kc3QoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDQuZHN0KCkgaXMgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0MS5kc3QsICJubyBhcmdzIikKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2godDEpLCBoYXNoKHQyKSkKQEAgLTIyNTUsNyArMjI1NSw3IEBACiAgICAgICAgICAgICBncmVlbiA9IHBpY2tsZXIuZHVtcHMob3JpZywgcHJvdG8pCiAgICAgICAgICAgICBkZXJpdmVkID0gdW5waWNrbGVyLmxvYWRzKGdyZWVuKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcmlnLCBkZXJpdmVkKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoZGVyaXZlZC50emluZm8sIFBpY2tsYWJsZUZpeGVkT2Zmc2V0KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGRlcml2ZWQudHppbmZvLCBQaWNrbGFibGVGaXhlZE9mZnNldCkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlcml2ZWQudXRjb2Zmc2V0KCksIHRpbWVkZWx0YShtaW51dGVzPS0zMDApKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZXJpdmVkLnR6bmFtZSgpLCAnY29va2llJykKIApAQCAtMjI2NCwyMCArMjI2NCwyMCBAQAogICAgICAgICBjbHMgPSBzZWxmLnRoZWNsYXNzCiAKICAgICAgICAgdCA9IGNscygwLCB0emluZm89Rml4ZWRPZmZzZXQoLTMwMCwgIiIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQpCiAKICAgICAgICAgdCA9IGNscyg1LCB0emluZm89Rml4ZWRPZmZzZXQoLTMwMCwgIiIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQpCiAKICAgICAgICAgdCA9IGNscyg1LCB0emluZm89Rml4ZWRPZmZzZXQoMzAwLCAiIikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0KQogCiAgICAgICAgIHQgPSBjbHMoMjMsIDU5LCB0emluZm89Rml4ZWRPZmZzZXQoMjMqNjAgKyA1OSwgIiIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdCkKIAogICAgICAgICAjIE1vc3RseSBlbnN1cmluZyB0aGlzIGRvZXNuJ3Qgb3ZlcmZsb3cgaW50ZXJuYWxseS4KICAgICAgICAgdCA9IGNscygwLCB0emluZm89Rml4ZWRPZmZzZXQoMjMqNjAgKyA1OSwgIiIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQpCiAKICAgICAgICAgIyBCdXQgdGhpcyBzaG91bGQgeWllbGQgYSB2YWx1ZSBlcnJvciAtLSB0aGUgdXRjb2Zmc2V0IGlzIGJvZ3VzLgogICAgICAgICB0ID0gY2xzKDAsIHR6aW5mbz1GaXhlZE9mZnNldCgyNCo2MCwgIiIpKQpAQCAtMjMxMSwxMyArMjMxMSwxMyBAQAogICAgICAgICAjIEVuc3VyZSB3ZSBjYW4gZ2V0IHJpZCBvZiBhIHR6aW5mby4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLnR6bmFtZSgpLCAiKzEwMCIpCiAgICAgICAgIGJhc2UyID0gYmFzZS5yZXBsYWNlKHR6aW5mbz1Ob25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYmFzZTIudHppbmZvIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhiYXNlMi50em5hbWUoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmFzZTIudHppbmZvIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYXNlMi50em5hbWUoKSBpcyBOb25lKQogCiAgICAgICAgICMgRW5zdXJlIHdlIGNhbiBhZGQgb25lLgogICAgICAgICBiYXNlMyA9IGJhc2UyLnJlcGxhY2UodHppbmZvPXoxMDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZSwgYmFzZTMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhiYXNlLnR6aW5mbyBpcyBiYXNlMy50emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYXNlLnR6aW5mbyBpcyBiYXNlMy50emluZm8pCiAKICAgICAgICAgIyBPdXQgb2YgYm91bmRzLgogICAgICAgICBiYXNlID0gY2xzKDEpCkBAIC0yMzU0LDcgKzIzNTQsNyBAQAogCiAgICAgICAgICMgQnV0IGlmIHRoZXkncmUgbm90IGlkZW50aWNhbCwgaXQgaXNuJ3QgaWdub3JlZC4KICAgICAgICAgdDIgPSB0Mi5yZXBsYWNlKHR6aW5mbz1WYXJpZXMoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxIDwgdDIpICAjIHQxJ3Mgb2Zmc2V0IGNvdW50ZXIgc3RpbGwgZ29pbmcgdXAKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDwgdDIpICAjIHQxJ3Mgb2Zmc2V0IGNvdW50ZXIgc3RpbGwgZ29pbmcgdXAKIAogICAgIGRlZiB0ZXN0X3N1YmNsYXNzX3RpbWV0eihzZWxmKToKIApAQCAtMjQxMCwxMiArMjQxMCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHppbmZvPUZpeGVkT2Zmc2V0KC0xNDM5LCAiIikpCiAKICAgICAgICAgIyBNYWtlIHN1cmUgdGhvc2UgY29tcGFyZSBjb3JyZWN0bHksIGFuZCB3L28gb3ZlcmZsb3cuCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA8IHQyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgIT0gdDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MiA+IHQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPCB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxICE9IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPiB0MSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPT0gdDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MiA9PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID09IHQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDIgPT0gdDIpCiAKICAgICAgICAgIyBFcXVhbCBhZmVyIGFkanVzdG1lbnQuCiAgICAgICAgIHQxID0gc2VsZi50aGVjbGFzcygxLCAxMiwgMzEsIDIzLCA1OSwgdHppbmZvPUZpeGVkT2Zmc2V0KDEsICIiKSkKQEAgLTI0MjQsMjEgKzI0MjQsMjEgQEAKIAogICAgICAgICAjIENoYW5nZSB0MSBub3QgdG8gc3VidHJhY3QgYSBtaW51dGUsIGFuZCB0MSBzaG91bGQgYmUgbGFyZ2VyLgogICAgICAgICB0MSA9IHNlbGYudGhlY2xhc3MoMSwgMTIsIDMxLCAyMywgNTksIHR6aW5mbz1GaXhlZE9mZnNldCgwLCAiIikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0MSA+IHQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPiB0MikKIAogICAgICAgICAjIENoYW5nZSB0MSB0byBzdWJ0cmFjdCAyIG1pbnV0ZXMsIGFuZCB0MSBzaG91bGQgYmUgc21hbGxlci4KICAgICAgICAgdDEgPSBzZWxmLnRoZWNsYXNzKDEsIDEyLCAzMSwgMjMsIDU5LCB0emluZm89Rml4ZWRPZmZzZXQoMiwgIiIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPCB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxIDwgdDIpCiAKICAgICAgICAgIyBCYWNrIHRvIHRoZSBvcmlnaW5hbCB0MSwgYnV0IG1ha2Ugc2Vjb25kcyByZXNvbHZlIGl0LgogICAgICAgICB0MSA9IHNlbGYudGhlY2xhc3MoMSwgMTIsIDMxLCAyMywgNTksIHR6aW5mbz1GaXhlZE9mZnNldCgxLCAiIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQ9MSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHQxID4gdDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA+IHQyKQogCiAgICAgICAgICMgTGlrZXdpc2UsIGJ1dCBtYWtlIG1pY3Jvc2Vjb25kcyByZXNvbHZlIGl0LgogICAgICAgICB0MSA9IHNlbGYudGhlY2xhc3MoMSwgMTIsIDMxLCAyMywgNTksIHR6aW5mbz1GaXhlZE9mZnNldCgxLCAiIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyb3NlY29uZD0xKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPiB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQxID4gdDIpCiAKICAgICAgICAgIyBNYWtlIHQyIG5haXZlIGFuZCBpdCBzaG91bGQgZmFpbC4KICAgICAgICAgdDIgPSBzZWxmLnRoZWNsYXNzLm1pbgpAQCAtMjQ4Miw3ICsyNDgyLDcgQEAKICAgICAgICAgICAgIGdyZWVuID0gcGlja2xlci5kdW1wcyhvcmlnLCBwcm90bykKICAgICAgICAgICAgIGRlcml2ZWQgPSB1bnBpY2tsZXIubG9hZHMoZ3JlZW4pCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9yaWcsIGRlcml2ZWQpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShkZXJpdmVkLnR6aW5mbywKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGRlcml2ZWQudHppbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpY2tsYWJsZUZpeGVkT2Zmc2V0KSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVyaXZlZC51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9LTMwMCkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlcml2ZWQudHpuYW1lKCksICdjb29raWUnKQpAQCAtMjU1Myw3ICsyNTUzLDcgQEAKICAgICAgICAgdHo1NSA9IEZpeGVkT2Zmc2V0KC0zMzAsICJ3ZXN0IDU6MzAiKQogICAgICAgICB0aW1lYXdhcmUgPSBub3cudGltZSgpLnJlcGxhY2UodHppbmZvPXR6NTUpCiAgICAgICAgIG5vd2F3YXJlID0gc2VsZi50aGVjbGFzcy5jb21iaW5lKG5vdy5kYXRlKCksIHRpbWVhd2FyZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vd2F3YXJlLnR6aW5mbyBpcyB0ejU1KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm93YXdhcmUudHppbmZvIGlzIHR6NTUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm93YXdhcmUudGltZXR6KCksIHRpbWVhd2FyZSkKIAogICAgICAgICAjIENhbid0IG1peCBhd2FyZSBhbmQgbm9uLWF3YXJlLgpAQCAtMjU3MiwxNSArMjU3MiwxNSBAQAogICAgICAgICAjIEFkZGluZyBhIGRlbHRhIHNob3VsZCBwcmVzZXJ2ZSB0emluZm8uCiAgICAgICAgIGRlbHRhID0gdGltZWRlbHRhKHdlZWtzPTEsIG1pbnV0ZXM9MTIsIG1pY3Jvc2Vjb25kcz01Njc4KQogICAgICAgICBub3dhd2FyZXBsdXMgPSBub3dhd2FyZSArIGRlbHRhCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3dhd2FyZS50emluZm8gaXMgdHo1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vd2F3YXJlLnR6aW5mbyBpcyB0ejU1KQogICAgICAgICBub3dhd2FyZXBsdXMyID0gZGVsdGEgKyBub3dhd2FyZQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm93YXdhcmVwbHVzMi50emluZm8gaXMgdHo1NSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vd2F3YXJlcGx1czIudHppbmZvIGlzIHR6NTUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobm93YXdhcmVwbHVzLCBub3dhd2FyZXBsdXMyKQogCiAgICAgICAgICMgdGhhdCAtIGRlbHRhIHNob3VsZCBiZSB3aGF0IHdlIHN0YXJ0ZWQgd2l0aCwgYW5kIHRoYXQgLSB3aGF0IHdlCiAgICAgICAgICMgc3RhcnRlZCB3aXRoIHNob3VsZCBiZSBkZWx0YS4KICAgICAgICAgZGlmZiA9IG5vd2F3YXJlcGx1cyAtIGRlbHRhCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkaWZmLnR6aW5mbyBpcyB0ejU1KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGlmZi50emluZm8gaXMgdHo1NSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3dhd2FyZSwgZGlmZikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IGRlbHRhIC0gbm93YXdhcmVwbHVzKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vd2F3YXJlcGx1cyAtIG5vd2F3YXJlLCBkZWx0YSkKQEAgLTI1ODksNyArMjU4OSw3IEBACiAgICAgICAgIHR6ciA9IEZpeGVkT2Zmc2V0KHJhbmRvbS5yYW5kcmFuZ2UoLTE0MzksIDE0NDApLCAicmFuZG9tdGltZXpvbmUiKQogICAgICAgICAjIEF0dGFjaCBpdCB0byBub3dhd2FyZXBsdXMuCiAgICAgICAgIG5vd2F3YXJlcGx1cyA9IG5vd2F3YXJlcGx1cy5yZXBsYWNlKHR6aW5mbz10enIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3dhd2FyZXBsdXMudHppbmZvIGlzIHR6cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vd2F3YXJlcGx1cy50emluZm8gaXMgdHpyKQogICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgZGlmZmVyZW5jZSB0YWtlcyB0aGUgdGltZXpvbmUgYWRqdXN0bWVudHMgaW50byBhY2NvdW50LgogICAgICAgICBnb3QgPSBub3dhd2FyZSAtIG5vd2F3YXJlcGx1cwogICAgICAgICAjIEV4cGVjdGVkOiAgKG5vd2F3YXJlIGJhc2UgLSBub3dhd2FyZSBvZmZzZXQpIC0KQEAgLTI2MTYsNyArMjYxNiw3IEBACiAgICAgICAgIG9mZjQyID0gRml4ZWRPZmZzZXQoNDIsICI0MiIpCiAgICAgICAgIGFub3RoZXIgPSBtZXRoKG9mZjQyKQogICAgICAgICBhZ2FpbiA9IG1ldGgodHo9b2ZmNDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhhbm90aGVyLnR6aW5mbyBpcyBhZ2Fpbi50emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbm90aGVyLnR6aW5mbyBpcyBhZ2Fpbi50emluZm8pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYW5vdGhlci51dGNvZmZzZXQoKSwgdGltZWRlbHRhKG1pbnV0ZXM9NDIpKQogICAgICAgICAjIEJhZCBhcmd1bWVudCB3aXRoIGFuZCB3L28gbmFtaW5nIHRoZSBrZXl3b3JkLgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1ldGgsIDE2KQpAQCAtMjYzMyw3ICsyNjMzLDcgQEAKICAgICAgICAgdXRjID0gRml4ZWRPZmZzZXQoMCwgInV0YyIsIDApCiAgICAgICAgIGZvciBkdW1teSBpbiByYW5nZSgzKToKICAgICAgICAgICAgIG5vdyA9IGRhdGV0aW1lLm5vdyh3ZWlyZHR6KQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdy50emluZm8gaXMgd2VpcmR0eikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3cudHppbmZvIGlzIHdlaXJkdHopCiAgICAgICAgICAgICB1dGNub3cgPSBkYXRldGltZS51dGNub3coKS5yZXBsYWNlKHR6aW5mbz11dGMpCiAgICAgICAgICAgICBub3cyID0gdXRjbm93LmFzdGltZXpvbmUod2VpcmR0eikKICAgICAgICAgICAgIGlmIGFicyhub3cgLSBub3cyKSA8IHRpbWVkZWx0YShzZWNvbmRzPTMwKToKQEAgLTI2NTQsNyArMjY1NCw3IEBACiAgICAgICAgIG9mZjQyID0gRml4ZWRPZmZzZXQoNDIsICI0MiIpCiAgICAgICAgIGFub3RoZXIgPSBtZXRoKHRzLCBvZmY0MikKICAgICAgICAgYWdhaW4gPSBtZXRoKHRzLCB0ej1vZmY0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGFub3RoZXIudHppbmZvIGlzIGFnYWluLnR6aW5mbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFub3RoZXIudHppbmZvIGlzIGFnYWluLnR6aW5mbykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbm90aGVyLnV0Y29mZnNldCgpLCB0aW1lZGVsdGEobWludXRlcz00MikpCiAgICAgICAgICMgQmFkIGFyZ3VtZW50IHdpdGggYW5kIHcvbyBuYW1pbmcgdGhlIGtleXdvcmQuCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWV0aCwgdHMsIDE2KQpAQCAtMjg0OCwxMyArMjg0OCwxMyBAQAogICAgICAgICAjIEVuc3VyZSB3ZSBjYW4gZ2V0IHJpZCBvZiBhIHR6aW5mby4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLnR6bmFtZSgpLCAiKzEwMCIpCiAgICAgICAgIGJhc2UyID0gYmFzZS5yZXBsYWNlKHR6aW5mbz1Ob25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYmFzZTIudHppbmZvIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhiYXNlMi50em5hbWUoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmFzZTIudHppbmZvIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYXNlMi50em5hbWUoKSBpcyBOb25lKQogCiAgICAgICAgICMgRW5zdXJlIHdlIGNhbiBhZGQgb25lLgogICAgICAgICBiYXNlMyA9IGJhc2UyLnJlcGxhY2UodHppbmZvPXoxMDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZSwgYmFzZTMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhiYXNlLnR6aW5mbyBpcyBiYXNlMy50emluZm8pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiYXNlLnR6aW5mbyBpcyBiYXNlMy50emluZm8pCiAKICAgICAgICAgIyBPdXQgb2YgYm91bmRzLgogICAgICAgICBiYXNlID0gY2xzKDIwMDAsIDIsIDI5KQpAQCAtMjg2NywyMCArMjg2NywyMCBAQAogICAgICAgICBmbTVoID0gRml4ZWRPZmZzZXQoLXRpbWVkZWx0YShob3Vycz01KSwgIm0zMDAiKQogCiAgICAgICAgIGR0ID0gc2VsZi50aGVjbGFzcy5ub3codHo9ZjQ0bSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGR0LnR6aW5mbyBpcyBmNDRtKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZHQudHppbmZvIGlzIGY0NG0pCiAgICAgICAgICMgUmVwbGFjaW5nIHdpdGggZGVnZW5lcmF0ZSB0emluZm8gcmFpc2VzIGFuIGV4Y2VwdGlvbi4KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZHQuYXN0aW1lem9uZSwgZm5vbmUpCiAgICAgICAgICMgRGl0dG8gd2l0aCBOb25lIHR6LgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGR0LmFzdGltZXpvbmUsIE5vbmUpCiAgICAgICAgICMgUmVwbGFjaW5nIHdpdGggc2FtZSB0emluZm8gbWFrZXMgbm8gY2hhbmdlLgogICAgICAgICB4ID0gZHQuYXN0aW1lem9uZShkdC50emluZm8pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh4LnR6aW5mbyBpcyBmNDRtKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeC50emluZm8gaXMgZjQ0bSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4LmRhdGUoKSwgZHQuZGF0ZSgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHgudGltZSgpLCBkdC50aW1lKCkpCiAKICAgICAgICAgIyBSZXBsYWNpbmcgd2l0aCBkaWZmZXJlbnQgdHppbmZvIGRvZXMgYWRqdXN0LgogICAgICAgICBnb3QgPSBkdC5hc3RpbWV6b25lKGZtNWgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhnb3QudHppbmZvIGlzIGZtNWgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnb3QudHppbmZvIGlzIGZtNWgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LnV0Y29mZnNldCgpLCB0aW1lZGVsdGEoaG91cnM9LTUpKQogICAgICAgICBleHBlY3RlZCA9IGR0IC0gZHQudXRjb2Zmc2V0KCkgICMgaW4gZWZmZWN0LCBjb252ZXJ0IHRvIFVUQwogICAgICAgICBleHBlY3RlZCArPSBmbTVoLnV0Y29mZnNldChkdCkgICMgYW5kIGZyb20gdGhlcmUgdG8gbG9jYWwgdGltZQpAQCAtMjg4OCw3ICsyODg4LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChnb3QuZGF0ZSgpLCBleHBlY3RlZC5kYXRlKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ290LnRpbWUoKSwgZXhwZWN0ZWQudGltZSgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdC50aW1ldHooKSwgZXhwZWN0ZWQudGltZXR6KCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhnb3QudHppbmZvIGlzIGV4cGVjdGVkLnR6aW5mbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdvdC50emluZm8gaXMgZXhwZWN0ZWQudHppbmZvKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGdvdCwgZXhwZWN0ZWQpCiAKICAgICBkZWYgdGVzdF9hd2FyZV9zdWJ0cmFjdChzZWxmKToKQEAgLTI5NjMsNyArMjk2Myw3IEBACiAKICAgICAgICAgIyBCdXQgaWYgdGhleSdyZSBub3QgaWRlbnRpY2FsLCBpdCBpc24ndCBpZ25vcmVkLgogICAgICAgICB0MiA9IHQyLnJlcGxhY2UodHppbmZvPVZhcmllcygpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModDEgPCB0MikgICMgdDEncyBvZmZzZXQgY291bnRlciBzdGlsbCBnb2luZyB1cAorICAgICAgICBzZWxmLmFzc2VydFRydWUodDEgPCB0MikgICMgdDEncyBvZmZzZXQgY291bnRlciBzdGlsbCBnb2luZyB1cAogCiAgICAgZGVmIHRlc3Rfc3ViY2xhc3NfZGF0ZXRpbWV0eihzZWxmKToKIApAQCAtMzMxNCwxMCArMzMxNCwxMCBAQAogICAgICAgICAjIHR5cGUgY29tcGFyaXNvbiwgZGVzcGl0ZSB0aGF0IGRhdGV0aW1lIGlzIGEgc3ViY2xhc3Mgb2YgZGF0ZS4KICAgICAgICAgYXNfZGF0ZSA9IGRhdGUudG9kYXkoKQogICAgICAgICBhc19kYXRldGltZSA9IGRhdGV0aW1lLmNvbWJpbmUoYXNfZGF0ZSwgdGltZSgpKQotICAgICAgICBzZWxmLmFzc2VydF8oYXNfZGF0ZSAhPSBhc19kYXRldGltZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGFzX2RhdGV0aW1lICE9IGFzX2RhdGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgYXNfZGF0ZSA9PSBhc19kYXRldGltZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBhc19kYXRldGltZSA9PSBhc19kYXRlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXNfZGF0ZSAhPSBhc19kYXRldGltZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFzX2RhdGV0aW1lICE9IGFzX2RhdGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYXNfZGF0ZSA9PSBhc19kYXRldGltZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBhc19kYXRldGltZSA9PSBhc19kYXRlKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYXNfZGF0ZSA8IGFzX2RhdGV0aW1lKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYXNfZGF0ZXRpbWUgPCBhc19kYXRlKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGxhbWJkYTogYXNfZGF0ZSA8PSBhc19kYXRldGltZSkKQEAgLTMzMjksOSArMzMyOSw5IEBACiAKICAgICAgICAgIyBOZXZlcnRoZWxzcywgY29tcGFyaXNvbiBzaG91bGQgd29yayB3aXRoIHRoZSBiYXNlLWNsYXNzIChkYXRlKQogICAgICAgICAjIHByb2plY3Rpb24gaWYgdXNlIG9mIGEgZGF0ZSBtZXRob2QgaXMgZm9yY2VkLgotICAgICAgICBzZWxmLmFzc2VydF8oYXNfZGF0ZS5fX2VxX18oYXNfZGF0ZXRpbWUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXNfZGF0ZS5fX2VxX18oYXNfZGF0ZXRpbWUpKQogICAgICAgICBkaWZmZXJlbnRfZGF5ID0gKGFzX2RhdGUuZGF5ICsgMSkgJSAyMCArIDEKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBhc19kYXRlLl9fZXFfXyhhc19kYXRldGltZS5yZXBsYWNlKGRheT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBhc19kYXRlLl9fZXFfXyhhc19kYXRldGltZS5yZXBsYWNlKGRheT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50X2RheSkpKQogCiAgICAgICAgICMgQW5kIGRhdGUgc2hvdWxkIGNvbXBhcmUgd2l0aCBvdGhlciBzdWJjbGFzc2VzIG9mIGRhdGUuICBJZiBhCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RibS5weSBiL0xpYi90ZXN0L3Rlc3RfZGJtLnB5CmluZGV4IDE2MjdmZmYuLjQzZjhhNWIgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGJtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGJtLnB5CkBAIC0yMSw5ICsyMSw5IEBACiAgICAgICAgICAgICBzZWxmLmRba10gPSB2CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29ydGVkKHNlbGYuZC5rZXlzKCkpLCBzb3J0ZWQoayBmb3IgKGssIHYpIGluIGEpKQogICAgICAgICBmb3IgaywgdiBpbiBhOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGsgaW4gc2VsZi5kKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgaW4gc2VsZi5kKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRba10sIHYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygneHh4JyBub3QgaW4gc2VsZi5kKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ3h4eCcgbm90IGluIHNlbGYuZCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5kWyd4eHgnXSkKICAgICAgICAgc2VsZi5kLmNsb3NlKCkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5IGIvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CmluZGV4IDdmOTU5ODMuLjFjZTY1ZWMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKQEAgLTUxMyw3ICs1MTMsNyBAQAogCiAgICAgICAgICMgZnJvbSBpbnQKICAgICAgICAgZCA9IG5jLmNyZWF0ZV9kZWNpbWFsKDQ1NikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoZCwgRGVjaW1hbCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGQsIERlY2ltYWwpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5jLmNyZWF0ZV9kZWNpbWFsKDQ1Njc4KSwKICAgICAgICAgICAgICAgICAgICAgICAgICBuYy5jcmVhdGVfZGVjaW1hbCgnNDU3RSsyJykpCiAKQEAgLTEwNjEsMTIgKzEwNjEsMTIgQEAKICAgICAgICAgZiA9IERlY2ltYWwoJzInKQogICAgICAgICBmb3IgeCwgeSBpbiBbKG4sIG4pLCAobiwgaSksIChpLCBuKSwgKG4sIGYpLCAoZiwgbiksCiAgICAgICAgICAgICAgICAgICAgICAocywgbiksIChuLCBzKSwgKHMsIGkpLCAoaSwgcyksIChzLCBmKSwgKGYsIHMpLCAocywgcyldOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHggIT0geSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKHggPT0geSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90ICh4IDwgeSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90ICh4IDw9IHkpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCAoeCA+IHkpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCAoeCA+PSB5KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh4ICE9IHkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90ICh4ID09IHkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoeCA8IHkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoeCA8PSB5KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHggPiB5KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHggPj0geSkpCiAKICMgVGhlIGZvbGxvd2luZyBhcmUgdHdvIGZ1bmN0aW9ucyB1c2VkIHRvIHRlc3QgdGhyZWFkaW5nIGluIHRoZSBuZXh0IGNsYXNzCiAKQEAgLTExMzksMjIgKzExMzksMjIgQEAKICAgICAgICAgZGMgPSBEZWNpbWFsKCc0NScpCiAKICAgICAgICAgI3R3byBEZWNpbWFscwotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZGMgPiBkYSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRjID49IGRhKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZGEgPCBkYykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRhIDw9IGRjKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZGEgPT0gZGIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkYSAhPSBkYykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRhIDw9IGRiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZGEgPj0gZGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYyA+IGRhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGMgPj0gZGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYSA8IGRjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGEgPD0gZGMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYSA9PSBkYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRhICE9IGRjKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGEgPD0gZGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYSA+PSBkYikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZGMsZGEpLCAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChkYSxkYyksIC0xKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChkYSxkYiksIDApCiAKICAgICAgICAgI2EgRGVjaW1hbCBhbmQgYW4gaW50Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkYyA+IDIzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoMjMgPCBkYykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRjID09IDQ1KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGMgPiAyMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIzIDwgZGMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYyA9PSA0NSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZGMsMjMpLCAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcCgyMyxkYyksIC0xKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChkYyw0NSksIDApCkBAIC0xMjIxLDggKzEyMjEsOCBAQAogICAgICAgICAjdGhlIHNhbWUgaGFzaCB0aGF0IHRvIGFuIGludAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goRGVjaW1hbCgyMykpLCBoYXNoKDIzKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBoYXNoLCBEZWNpbWFsKCdOYU4nKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2goRGVjaW1hbCgnSW5mJykpKQotICAgICAgICBzZWxmLmFzc2VydF8oaGFzaChEZWNpbWFsKCctSW5mJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzaChEZWNpbWFsKCdJbmYnKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNoKERlY2ltYWwoJy1JbmYnKSkpCiAKICAgICAgICAgIyBjaGVjayB0aGF0IHRoZSB2YWx1ZSBvZiB0aGUgaGFzaCBkb2Vzbid0IGRlcGVuZCBvbiB0aGUKICAgICAgICAgIyBjdXJyZW50IGNvbnRleHQgKGlzc3VlICMxNzU3KQpAQCAtMTI0OSwyMiArMTI0OSwyMiBAQAogICAgICAgICBsMiA9IDI4CiAKICAgICAgICAgI2JldHdlZW4gRGVjaW1hbHMKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1pbihkMSxkMikgaXMgZDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtaW4oZDIsZDEpIGlzIGQxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobWF4KGQxLGQyKSBpcyBkMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1heChkMixkMSkgaXMgZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtaW4oZDEsZDIpIGlzIGQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWluKGQyLGQxKSBpcyBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1heChkMSxkMikgaXMgZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXgoZDIsZDEpIGlzIGQyKQogCiAgICAgICAgICNiZXR3ZWVuIERlY2ltYWwgYW5kIGxvbmcKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1pbihkMSxsMikgaXMgZDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtaW4obDIsZDEpIGlzIGQxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobWF4KGwxLGQyKSBpcyBkMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG1heChkMixsMSkgaXMgZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtaW4oZDEsbDIpIGlzIGQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWluKGwyLGQxKSBpcyBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1heChsMSxkMikgaXMgZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXgoZDIsbDEpIGlzIGQyKQogCiAgICAgZGVmIHRlc3RfYXNfbm9uemVybyhzZWxmKToKICAgICAgICAgI2FzIGZhbHNlCi0gICAgICAgIHNlbGYuZmFpbElmKERlY2ltYWwoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoRGVjaW1hbCgwKSkKICAgICAgICAgI2FzIHRydWUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKERlY2ltYWwoJzAuMzcyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShEZWNpbWFsKCcwLjM3MicpKQogCiAgICAgZGVmIHRlc3RfdG9zdHJpbmdfbWV0aG9kcyhzZWxmKToKICAgICAgICAgI1Rlc3Qgc3RyIGFuZCByZXByIG1ldGhvZHMuCkBAIC0xNDU5LDEwICsxNDU5LDEwIEBACiBjbGFzcyBEZWNpbWFsUHl0aG9uQVBJdGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfYWJjKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhEZWNpbWFsLCBudW1iZXJzLk51bWJlcikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNzdWJjbGFzcyhEZWNpbWFsLCBudW1iZXJzLlJlYWwpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShEZWNpbWFsKDApLCBudW1iZXJzLk51bWJlcikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNpbnN0YW5jZShEZWNpbWFsKDApLCBudW1iZXJzLlJlYWwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhEZWNpbWFsLCBudW1iZXJzLk51bWJlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNzdWJjbGFzcyhEZWNpbWFsLCBudW1iZXJzLlJlYWwpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShEZWNpbWFsKDApLCBudW1iZXJzLk51bWJlcikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNpbnN0YW5jZShEZWNpbWFsKDApLCBudW1iZXJzLlJlYWwpKQogCiAgICAgZGVmIHRlc3RfcGlja2xlKHNlbGYpOgogICAgICAgICBkID0gRGVjaW1hbCgnLTMuMTQxNTkwMDAwJykKQEAgLTE1MDEsOSArMTUwMSw5IEBACiAgICAgICAgICAgICAgICAgJzAuMTAwMDAwMDAwMDAwMDAwMDA1NTUxMTE1MTIzMTI1NzgyNzAyMTE4MTU4MzQwNDU0MTAxNTYyNScpCiAgICAgICAgIGJpZ2ludCA9IDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTXlEZWNpbWFsLmZyb21fZmxvYXQoYmlnaW50KSwgTXlEZWNpbWFsKGJpZ2ludCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhNeURlY2ltYWwuZnJvbV9mbG9hdChmbG9hdCgnbmFuJykpLmlzX3FuYW4oKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCdpbmYnKSkuaXNfaW5maW5pdGUoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCctaW5mJykpLmlzX2luZmluaXRlKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShNeURlY2ltYWwuZnJvbV9mbG9hdChmbG9hdCgnbmFuJykpLmlzX3FuYW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCdpbmYnKSkuaXNfaW5maW5pdGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCctaW5mJykpLmlzX2luZmluaXRlKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCduYW4nKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihEZWNpbWFsKCdOYU4nKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKE15RGVjaW1hbC5mcm9tX2Zsb2F0KGZsb2F0KCdpbmYnKSkpLApAQCAtMTU1MCw4ICsxNTUwLDggQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodjEsIHYyKQogCiAgICAgZGVmIHRlc3RfZXF1YWxpdHlfd2l0aF9vdGhlcl90eXBlcyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKERlY2ltYWwoMTApIGluIFsnYScsIDEuMCwgRGVjaW1hbCgxMCksICgxLDIpLCB7fV0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhEZWNpbWFsKDEwKSBub3QgaW4gWydhJywgMS4wLCAoMSwyKSwge31dKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoRGVjaW1hbCgxMCkgaW4gWydhJywgMS4wLCBEZWNpbWFsKDEwKSwgKDEsMiksIHt9XSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKERlY2ltYWwoMTApIG5vdCBpbiBbJ2EnLCAxLjAsICgxLDIpLCB7fV0pCiAKICAgICBkZWYgdGVzdF9jb3B5KHNlbGYpOgogICAgICAgICAjIEFsbCBjb3BpZXMgc2hvdWxkIGJlIGRlZXAKQEAgLTE1NzEsOSArMTU3MSw5IEBACiAgICAgICAgIHdpdGggbG9jYWxjb250ZXh0KCkgYXMgZW50ZXJfY3R4OgogICAgICAgICAgICAgc2V0X2N0eCA9IGdldGNvbnRleHQoKQogICAgICAgICBmaW5hbF9jdHggPSBnZXRjb250ZXh0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9yaWdfY3R4IGlzIGZpbmFsX2N0eCwgJ2RpZCBub3QgcmVzdG9yZSBjb250ZXh0IGNvcnJlY3RseScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhvcmlnX2N0eCBpcyBub3Qgc2V0X2N0eCwgJ2RpZCBub3QgY29weSB0aGUgY29udGV4dCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZXRfY3R4IGlzIGVudGVyX2N0eCwgJ19fZW50ZXJfXyByZXR1cm5lZCB3cm9uZyBjb250ZXh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9yaWdfY3R4IGlzIGZpbmFsX2N0eCwgJ2RpZCBub3QgcmVzdG9yZSBjb250ZXh0IGNvcnJlY3RseScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcmlnX2N0eCBpcyBub3Qgc2V0X2N0eCwgJ2RpZCBub3QgY29weSB0aGUgY29udGV4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXRfY3R4IGlzIGVudGVyX2N0eCwgJ19fZW50ZXJfXyByZXR1cm5lZCB3cm9uZyBjb250ZXh0JykKIAogICAgIGRlZiB0ZXN0X2xvY2FsY29udGV4dGFyZyhzZWxmKToKICAgICAgICAgIyBVc2UgYSBjb3B5IG9mIHRoZSBzdXBwbGllZCBjb250ZXh0IGluIHRoZSBibG9jawpAQCAtMTU4MiwxMCArMTU4MiwxMCBAQAogICAgICAgICB3aXRoIGxvY2FsY29udGV4dChuZXdfY3R4KSBhcyBlbnRlcl9jdHg6CiAgICAgICAgICAgICBzZXRfY3R4ID0gZ2V0Y29udGV4dCgpCiAgICAgICAgIGZpbmFsX2N0eCA9IGdldGNvbnRleHQoKQotICAgICAgICBzZWxmLmFzc2VydF8ob3JpZ19jdHggaXMgZmluYWxfY3R4LCAnZGlkIG5vdCByZXN0b3JlIGNvbnRleHQgY29ycmVjdGx5JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNldF9jdHgucHJlYyA9PSBuZXdfY3R4LnByZWMsICdkaWQgbm90IHNldCBjb3JyZWN0IGNvbnRleHQnKQotICAgICAgICBzZWxmLmFzc2VydF8obmV3X2N0eCBpcyBub3Qgc2V0X2N0eCwgJ2RpZCBub3QgY29weSB0aGUgY29udGV4dCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZXRfY3R4IGlzIGVudGVyX2N0eCwgJ19fZW50ZXJfXyByZXR1cm5lZCB3cm9uZyBjb250ZXh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9yaWdfY3R4IGlzIGZpbmFsX2N0eCwgJ2RpZCBub3QgcmVzdG9yZSBjb250ZXh0IGNvcnJlY3RseScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXRfY3R4LnByZWMgPT0gbmV3X2N0eC5wcmVjLCAnZGlkIG5vdCBzZXQgY29ycmVjdCBjb250ZXh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5ld19jdHggaXMgbm90IHNldF9jdHgsICdkaWQgbm90IGNvcHkgdGhlIGNvbnRleHQnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0X2N0eCBpcyBlbnRlcl9jdHgsICdfX2VudGVyX18gcmV0dXJuZWQgd3JvbmcgY29udGV4dCcpCiAKIGNsYXNzIENvbnRleHRGbGFncyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfZmxhZ3NfaXJyZWxldmFudChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHkgYi9MaWIvdGVzdC90ZXN0X2RlZmF1bHRkaWN0LnB5CmluZGV4IDU5MzVlMDUuLjcxZDY5YzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVmYXVsdGRpY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZWZhdWx0ZGljdC5weQpAQCAtMjQsMjEgKzI0LDIxIEBACiAgICAgICAgIGQxWzEzXQogICAgICAgICBkMVsxNF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMSwgezEyOiBbNDIsIDI0XSwgMTM6IFtdLCAxNDogW119KQotICAgICAgICBzZWxmLmFzc2VydF8oZDFbMTJdIGlzIG5vdCBkMVsxM10gaXMgbm90IGQxWzE0XSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQxWzEyXSBpcyBub3QgZDFbMTNdIGlzIG5vdCBkMVsxNF0pCiAgICAgICAgIGQyID0gZGVmYXVsdGRpY3QobGlzdCwgZm9vPTEsIGJhcj0yKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLmRlZmF1bHRfZmFjdG9yeSwgbGlzdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMiwgeyJmb28iOiAxLCAiYmFyIjogMn0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZDJbImZvbyJdLCAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyWyJiYXIiXSwgMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMls0Ml0sIFtdKQotICAgICAgICBzZWxmLmFzc2VydF8oImZvbyIgaW4gZDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiZm9vIiBpbiBkMi5rZXlzKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiYmFyIiBpbiBkMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJiYXIiIGluIGQyLmtleXMoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKDQyIGluIGQyKQotICAgICAgICBzZWxmLmFzc2VydF8oNDIgaW4gZDIua2V5cygpKQotICAgICAgICBzZWxmLmFzc2VydF8oMTIgbm90IGluIGQyKQotICAgICAgICBzZWxmLmFzc2VydF8oMTIgbm90IGluIGQyLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJmb28iIGluIGQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImZvbyIgaW4gZDIua2V5cygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImJhciIgaW4gZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiYmFyIiBpbiBkMi5rZXlzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSg0MiBpbiBkMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDQyIGluIGQyLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDEyIG5vdCBpbiBkMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDEyIG5vdCBpbiBkMi5rZXlzKCkpCiAgICAgICAgIGQyLmRlZmF1bHRfZmFjdG9yeSA9IE5vbmUKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5kZWZhdWx0X2ZhY3RvcnksIE5vbmUpCiAgICAgICAgIHRyeToKQEAgLTY3LDcgKzY3LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGQyKSwgImRlZmF1bHRkaWN0KDx0eXBlICdpbnQnPiwgezEyOiA0Mn0pIikKICAgICAgICAgZGVmIGZvbygpOiByZXR1cm4gNDMKICAgICAgICAgZDMgPSBkZWZhdWx0ZGljdChmb28pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkMy5kZWZhdWx0X2ZhY3RvcnkgaXMgZm9vKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZDMuZGVmYXVsdF9mYWN0b3J5IGlzIGZvbykKICAgICAgICAgZDNbMTNdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihkMyksICJkZWZhdWx0ZGljdCglcywgezEzOiA0M30pIiAlIHJlcHIoZm9vKSkKIApAQCAtMTI2LDcgKzEyNiw3IEBACiAgICAgICAgIGQyID0gY29weS5kZWVwY29weShkMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMi5kZWZhdWx0X2ZhY3RvcnksIGZvb2JhcikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkMiwgZDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkMVsxXSBpcyBub3QgZDJbMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMVsxXSBpcyBub3QgZDJbMV0pCiAgICAgICAgIGQxLmRlZmF1bHRfZmFjdG9yeSA9IGxpc3QKICAgICAgICAgZDIgPSBjb3B5LmRlZXBjb3B5KGQxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQyLmRlZmF1bHRfZmFjdG9yeSwgbGlzdCkKQEAgLTE0OSw3ICsxNDksNyBAQAogICAgICAgICAgICAgZGVmIF9mYWN0b3J5KHNlbGYpOgogICAgICAgICAgICAgICAgIHJldHVybiBbXQogICAgICAgICBkID0gc3ViKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlcHIoZCkuc3RhcnRzd2l0aCgKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoZCkuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICJkZWZhdWx0ZGljdCg8Ym91bmQgbWV0aG9kIHN1Yi5fZmFjdG9yeSBvZiBkZWZhdWx0ZGljdCguLi4iKSkKIAogICAgICAgICAjIE5PVEU6IHByaW50aW5nIGEgc3ViY2xhc3Mgb2YgYSBidWlsdGluIHR5cGUgZG9lcyBub3QgY2FsbCBpdHMKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkgYi9MaWIvdGVzdC90ZXN0X2RlcXVlLnB5CmluZGV4IGE2OGQwMTQuLjg2ODEwZjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGVxdWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kZXF1ZS5weQpAQCAtMTg4LDkgKzE4OCw5IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgbi1pKQogICAgICAgICAgICAgaiA9IHJhbmRvbS5yYW5kcmFuZ2UoLWxlbihkKSwgbGVuKGQpKQogICAgICAgICAgICAgdmFsID0gZFtqXQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHZhbCBpbiBkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbCBpbiBkKQogICAgICAgICAgICAgZGVsIGRbal0KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2YWwgbm90IGluIGQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsIG5vdCBpbiBkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkKSwgMCkKIAogICAgIGRlZiB0ZXN0X3JvdGF0ZShzZWxmKToKQEAgLTI5MSw3ICsyOTEsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIGQucmVtb3ZlLCAnYycpCiAgICAgICAgIGZvciB4LCB5IGluIHppcChkLCBlKToKICAgICAgICAgICAgICMgdmVyaWZ5IHRoYXQgb3JpZ2luYWwgb3JkZXIgYW5kIHZhbHVlcyBhcmUgcmV0YWluZWQuCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oeCBpcyB5KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHggaXMgeSkKIAogICAgICAgICAjIEhhbmRsZSBldmlsIG11dGF0b3IKICAgICAgICAgZm9yIG1hdGNoIGluIChUcnVlLCBGYWxzZSk6CkBAIC0zMDUsNyArMzA1LDcgQEAKICAgICAgICAgZSA9IGV2YWwocmVwcihkKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGQpLCBsaXN0KGUpKQogICAgICAgICBkLmFwcGVuZChkKQotICAgICAgICBzZWxmLmFzc2VydF8oJy4uLicgaW4gcmVwcihkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCcuLi4nIGluIHJlcHIoZCkpCiAKICAgICBkZWYgdGVzdF9wcmludChzZWxmKToKICAgICAgICAgZCA9IGRlcXVlKHhyYW5nZSgyMDApKQpAQCAtNDYwLDcgKzQ2MCw3IEBACiAgICAgICAgICAgICBvYmoueCA9IGl0ZXIoY29udGFpbmVyKQogICAgICAgICAgICAgZGVsIG9iaiwgY29udGFpbmVyCiAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhyZWYoKSBpcyBOb25lLCAiQ3ljbGUgd2FzIG5vdCBjb2xsZWN0ZWQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlZigpIGlzIE5vbmUsICJDeWNsZSB3YXMgbm90IGNvbGxlY3RlZCIpCiAKIGNsYXNzIFRlc3RWYXJpb3VzSXRlcmF0b3JBcmdzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weSBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKaW5kZXggZjE2MDI4Ni4uNmRjMjdiZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZXNjci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CkBAIC00MDksMTIgKzQwOSwxMiBAQAogCiAgICAgZGVmIHRlc3RfcHl0aG9uX2RpY3RzKHNlbGYpOgogICAgICAgICAjIFRlc3RpbmcgUHl0aG9uIHN1YmNsYXNzIG9mIGRpY3QuLi4KLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzc3ViY2xhc3MoZGljdCwgZGljdCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHt9LCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoZGljdCwgZGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHt9LCBkaWN0KSkKICAgICAgICAgZCA9IGRpY3QoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsIHt9KQotICAgICAgICBzZWxmLmFzc2VydF8oZC5fX2NsYXNzX18gaXMgZGljdCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoZCwgZGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLl9fY2xhc3NfXyBpcyBkaWN0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShkLCBkaWN0KSkKICAgICAgICAgY2xhc3MgQyhkaWN0KToKICAgICAgICAgICAgIHN0YXRlID0gLTEKICAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmX2xvY2FsLCAqYSwgKiprdyk6CkBAIC00MjcsMTMgKzQyNywxMyBAQAogICAgICAgICAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2V0KGtleSwgMCkKICAgICAgICAgICAgIGRlZiBfX3NldGl0ZW1fXyhzZWxmX2xvY2FsLCBrZXksIHZhbHVlKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShrZXksIHR5cGUoMCkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGtleSwgdHlwZSgwKSkpCiAgICAgICAgICAgICAgICAgZGljdC5fX3NldGl0ZW1fXyhzZWxmX2xvY2FsLCBrZXksIHZhbHVlKQogICAgICAgICAgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKICAgICAgICAgICAgICAgICBzZWxmLnN0YXRlID0gc3RhdGUKICAgICAgICAgICAgIGRlZiBnZXRzdGF0ZShzZWxmKToKICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5zdGF0ZQotICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhDLCBkaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoQywgZGljdCkpCiAgICAgICAgIGExID0gQygxMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhMS5zdGF0ZSwgMTIpCiAgICAgICAgIGEyID0gQyhmb289MSwgYmFyPTIpCkBAIC01MjcsNyArNTI3LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gNDIKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLm5hbWUsICdDJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLmJhc2VzLCAoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdzcGFtJyBpbiBDLmRpY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnc3BhbScgaW4gQy5kaWN0KQogICAgICAgICBjID0gQygpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYy5zcGFtKCksIDQyKQogCkBAIC01OTQsNyArNTk0LDcgQEAKICAgICAgICAgICAgIGRlZiBfc2V0X3goc2VsZiwgeCk6CiAgICAgICAgICAgICAgICAgc2VsZi5fX3ggPSAteAogICAgICAgICBhID0gQSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaGFzYXR0cihhLCAieCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIoYSwgIngiKSkKICAgICAgICAgYS54ID0gMTIKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLngsIDEyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX0FfX3gsIC0xMikKQEAgLTExNzEsNyArMTE3MSw3IEBACiAgICAgICAgIGNsYXNzIEQob2JqZWN0KToKICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFsiX19kaWN0X18iXQogICAgICAgICBhID0gRCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhoYXNhdHRyKGEsICJfX2RpY3RfXyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihhLCAiX19kaWN0X18iKSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJfX3dlYWtyZWZfXyIpKQogICAgICAgICBhLmZvbyA9IDQyCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2RpY3RfXywgeyJmb28iOiA0Mn0pCkBAIC0xMTc5LDcgKzExNzksNyBAQAogICAgICAgICBjbGFzcyBXKG9iamVjdCk6CiAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbIl9fd2Vha3JlZl9fIl0KICAgICAgICAgYSA9IFcoKQotICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihhLCAiX193ZWFrcmVmX18iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoYSwgIl9fd2Vha3JlZl9fIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihhLCAiX19kaWN0X18iKSkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgYS5mb28gPSA0MgpAQCAtMTE5MSwxNiArMTE5MSwxNiBAQAogICAgICAgICBjbGFzcyBDMShXLCBEKToKICAgICAgICAgICAgIF9fc2xvdHNfXyA9IFtdCiAgICAgICAgIGEgPSBDMSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhoYXNhdHRyKGEsICJfX2RpY3RfXyIpKQotICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihhLCAiX193ZWFrcmVmX18iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoYSwgIl9fZGljdF9fIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGEsICJfX3dlYWtyZWZfXyIpKQogICAgICAgICBhLmZvbyA9IDQyCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2RpY3RfXywgeyJmb28iOiA0Mn0pCiAKICAgICAgICAgY2xhc3MgQzIoRCwgVyk6CiAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbXQogICAgICAgICBhID0gQzIoKQotICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihhLCAiX19kaWN0X18iKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoYSwgIl9fd2Vha3JlZl9fIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGEsICJfX2RpY3RfXyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihhLCAiX193ZWFrcmVmX18iKSkKICAgICAgICAgYS5mb28gPSA0MgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEuX19kaWN0X18sIHsiZm9vIjogNDJ9KQogCkBAIC0xMjE3LDcgKzEyMTcsNyBAQAogICAgICAgICBNeUFCQy5yZWdpc3RlcihVbnJlbGF0ZWQpCiAKICAgICAgICAgdSA9IFVucmVsYXRlZCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHUsIE15QUJDKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodSwgTXlBQkMpKQogCiAgICAgICAgICMgVGhpcyB1c2VkIHRvIGNyYXNoCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTXlBQkMuYS5fX3NldF9fLCB1LCAzKQpAQCAtMTQ3Myw3ICsxNDczLDcgQEAKICAgICAgICAgY2xhc3MgRTogIyAqbm90KiBzdWJjbGFzc2luZyBmcm9tIEMKICAgICAgICAgICAgIGZvbyA9IEMuZm9vCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRSgpLmZvbywgQy5mb28pICMgaS5lLiwgdW5ib3VuZAotICAgICAgICBzZWxmLmFzc2VydF8ocmVwcihDLmZvby5fX2dldF9fKEMoKSkpLnN0YXJ0c3dpdGgoIjxib3VuZCBtZXRob2QgIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKEMuZm9vLl9fZ2V0X18oQygpKSkuc3RhcnRzd2l0aCgiPGJvdW5kIG1ldGhvZCAiKSkKIAogICAgIGRlZiB0ZXN0X2NvbXBhdHRyKHNlbGYpOgogICAgICAgICAjIFRlc3RpbmcgY29tcHV0ZWQgYXR0cmlidXRlcy4uLgpAQCAtMTY2NCw3ICsxNjY0LDcgQEAKICAgICAgICAgY2xhc3MgRShvYmplY3QpOgogICAgICAgICAgICAgZm9vID0gQy5mb28KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChFKCkuZm9vLCBDLmZvbykgIyBpLmUuLCB1bmJvdW5kCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZXByKEMuZm9vLl9fZ2V0X18oQygxKSkpLnN0YXJ0c3dpdGgoIjxib3VuZCBtZXRob2QgIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKEMuZm9vLl9fZ2V0X18oQygxKSkpLnN0YXJ0c3dpdGgoIjxib3VuZCBtZXRob2QgIikpCiAKICAgICBkZWYgdGVzdF9zcGVjaWFsX21ldGhvZF9sb29rdXAoc2VsZik6CiAgICAgICAgICMgVGhlIGxvb2t1cCBvZiBzcGVjaWFsIG1ldGhvZHMgYnlwYXNzZXMgX19nZXRhdHRyX18gYW5kCkBAIC0xNzc2LDIyICsxNzc2LDIyIEBACiAgICAgICAgICAgICAgICAgcmFpc2UgSW5kZXhFcnJvcgogICAgICAgICBjMSA9IEMoKQogICAgICAgICBjMiA9IEMoKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IG5vdCBjMSkgIyBXaGF0PworICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG5vdCBjMSkgIyBXaGF0PwogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGMxKSwgaWQoYzIpKQogICAgICAgICBoYXNoKGMxKQogICAgICAgICBoYXNoKGMyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChjMSwgYzIpLCBjbXAoaWQoYzEpLCBpZChjMikpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMxLCBjMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGMxICE9IGMyKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGMxICE9IGMxKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGMxID09IGMyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYzEgIT0gYzIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYzEgIT0gYzEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYzEgPT0gYzIpCiAgICAgICAgICMgTm90ZSB0aGF0IHRoZSBtb2R1bGUgbmFtZSBhcHBlYXJzIGluIHN0ci9yZXByLCBhbmQgdGhhdCB2YXJpZXMKICAgICAgICAgIyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGlzIHRlc3QgaXMgcnVuIHN0YW5kYWxvbmUgb3IgZnJvbSBhIGZyYW1ld29yay4KLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cihjMSkuZmluZCgnQyBvYmplY3QgYXQgJykgPj0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihjMSkuZmluZCgnQyBvYmplY3QgYXQgJykgPj0gMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoYzEpLCByZXByKGMxKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKC0xIG5vdCBpbiBjMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC0xIG5vdCBpbiBjMSkKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGkgaW4gYzEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaSBpbiBjMSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgxMCBpbiBjMSkKICAgICAgICAgIyBUZXN0IHRoZSBkZWZhdWx0IGJlaGF2aW9yIGZvciBkeW5hbWljIGNsYXNzZXMKICAgICAgICAgY2xhc3MgRChvYmplY3QpOgpAQCAtMTgwMCwyMiArMTgwMCwyMiBAQAogICAgICAgICAgICAgICAgIHJhaXNlIEluZGV4RXJyb3IKICAgICAgICAgZDEgPSBEKCkKICAgICAgICAgZDIgPSBEKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBub3QgZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgbm90IGQxKQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGlkKGQxKSwgaWQoZDIpKQogICAgICAgICBoYXNoKGQxKQogICAgICAgICBoYXNoKGQyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChkMSwgZDIpLCBjbXAoaWQoZDEpLCBpZChkMikpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQxLCBkMSkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChkMSwgZDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZDEgIT0gZDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZDEgPT0gZDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZDEgIT0gZDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZDEgPT0gZDIpCiAgICAgICAgICMgTm90ZSB0aGF0IHRoZSBtb2R1bGUgbmFtZSBhcHBlYXJzIGluIHN0ci9yZXByLCBhbmQgdGhhdCB2YXJpZXMKICAgICAgICAgIyBkZXBlbmRpbmcgb24gd2hldGhlciB0aGlzIHRlc3QgaXMgcnVuIHN0YW5kYWxvbmUgb3IgZnJvbSBhIGZyYW1ld29yay4KLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cihkMSkuZmluZCgnRCBvYmplY3QgYXQgJykgPj0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihkMSkuZmluZCgnRCBvYmplY3QgYXQgJykgPj0gMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoZDEpLCByZXByKGQxKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKC0xIG5vdCBpbiBkMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC0xIG5vdCBpbiBkMSkKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGkgaW4gZDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaSBpbiBkMSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgxMCBpbiBkMSkKICAgICAgICAgIyBUZXN0IG92ZXJyaWRkZW4gYmVoYXZpb3IgZm9yIHN0YXRpYyBjbGFzc2VzCiAgICAgICAgIGNsYXNzIFByb3h5KG9iamVjdCk6CkBAIC0xODQxLDExICsxODQxLDExIEBACiAgICAgICAgIHAxID0gUHJveHkoMSkKICAgICAgICAgcF8xID0gUHJveHkoLTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocDApCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgbm90IHAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG5vdCBwMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHAwKSwgaGFzaCgwKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwMCwgcDApCiAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocDAsIHAxKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IHAwICE9IHAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHAwICE9IHAwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG5vdCBwMCwgcDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKHAwLCBwMSksIC0xKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChwMCwgcDApLCAwKQpAQCAtMTg1NSw3ICsxODU1LDcgQEAKICAgICAgICAgcDEwID0gUHJveHkocmFuZ2UoMTApKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKC0xIGluIHAxMCkKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGkgaW4gcDEwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGkgaW4gcDEwKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKDEwIGluIHAxMCkKICAgICAgICAgIyBUZXN0IG92ZXJyaWRkZW4gYmVoYXZpb3IgZm9yIGR5bmFtaWMgY2xhc3NlcwogICAgICAgICBjbGFzcyBEUHJveHkob2JqZWN0KToKQEAgLTE4ODEsNyArMTg4MSw3IEBACiAgICAgICAgIHAxID0gRFByb3h5KDEpCiAgICAgICAgIHBfMSA9IERQcm94eSgtMSkKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShwMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBub3QgcDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgbm90IHAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2gocDApLCBoYXNoKDApKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAwLCBwMCkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChwMCwgcDEpCkBAIC0xODk1LDcgKzE4OTUsNyBAQAogICAgICAgICBwMTAgPSBEUHJveHkocmFuZ2UoMTApKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKC0xIGluIHAxMCkKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGkgaW4gcDEwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGkgaW4gcDEwKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKDEwIGluIHAxMCkKIAogICAgICAgICAjIFNhZmV0eSB0ZXN0IGZvciBfX2NtcF9fCkBAIC0xOTc1LDcgKzE5NzUsNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICB3ZWFrcmVmLnJlZihubykKICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgbXNnOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHN0cihtc2cpLmZpbmQoIndlYWsgcmVmZXJlbmNlIikgPj0gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIobXNnKS5maW5kKCJ3ZWFrIHJlZmVyZW5jZSIpID49IDApCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBzZWxmLmZhaWwoIndlYWtyZWYucmVmKG5vKSBzaG91bGQgYmUgaWxsZWdhbCIpCiAgICAgICAgIGNsYXNzIFdlYWsob2JqZWN0KToKQEAgLTIwMTIsMTggKzIwMTIsMTggQEAKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGEsICJ4IikpCiAKICAgICAgICAgcmF3ID0gQy5fX2RpY3RfX1sneCddCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHJhdywgcHJvcGVydHkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShyYXcsIHByb3BlcnR5KSkKIAogICAgICAgICBhdHRycyA9IGRpcihyYXcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiX19kb2NfXyIgaW4gYXR0cnMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiZmdldCIgaW4gYXR0cnMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiZnNldCIgaW4gYXR0cnMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiZmRlbCIgaW4gYXR0cnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiX19kb2NfXyIgaW4gYXR0cnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiZmdldCIgaW4gYXR0cnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiZnNldCIgaW4gYXR0cnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiZmRlbCIgaW4gYXR0cnMpCiAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyYXcuX19kb2NfXywgIkknbSB0aGUgeCBwcm9wZXJ0eS4iKQotICAgICAgICBzZWxmLmFzc2VydF8ocmF3LmZnZXQgaXMgQy5fX2RpY3RfX1snZ2V0eCddKQotICAgICAgICBzZWxmLmFzc2VydF8ocmF3LmZzZXQgaXMgQy5fX2RpY3RfX1snc2V0eCddKQotICAgICAgICBzZWxmLmFzc2VydF8ocmF3LmZkZWwgaXMgQy5fX2RpY3RfX1snZGVseCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmF3LmZnZXQgaXMgQy5fX2RpY3RfX1snZ2V0eCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmF3LmZzZXQgaXMgQy5fX2RpY3RfX1snc2V0eCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmF3LmZkZWwgaXMgQy5fX2RpY3RfX1snZGVseCddKQogCiAgICAgICAgIGZvciBhdHRyIGluICJfX2RvY19fIiwgImZnZXQiLCAiZnNldCIsICJmZGVsIjoKICAgICAgICAgICAgIHRyeToKQEAgLTIwODUsNyArMjA4NSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoQy5mb28uX19kb2NfXywgImhlbGxvIikKICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKGMsICJmb28iKSkKICAgICAgICAgYy5mb28gPSAtNDIKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoYywgJ19mb28nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoYywgJ19mb28nKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjLl9mb28sIDQyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMuZm9vLCA0MikKICAgICAgICAgZGVsIGMuZm9vCkBAIC0yMjM2LDcgKzIyMzYsNyBAQAogCiAgICAgICAgIGNzdHVmZiA9IFsnQ2RhdGEnLCAnQ21ldGhvZCcsICdfX2RvY19fJywgJ19fbW9kdWxlX18nXQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcihDKSwgY3N0dWZmKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2ltX3NlbGYnIGluIGRpcihDLkNtZXRob2QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2ltX3NlbGYnIGluIGRpcihDLkNtZXRob2QpKQogCiAgICAgICAgIGMgPSBDKCkgICMgYy5fX2RvY19fIGlzIGFuIG9kZCB0aGluZyB0byBzZWUgaGVyZTsgZGl0dG8gYy5fX21vZHVsZV9fLgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcihjKSwgY3N0dWZmKQpAQCAtMjI0NCw3ICsyMjQ0LDcgQEAKICAgICAgICAgYy5jZGF0YSA9IDIKICAgICAgICAgYy5jbWV0aG9kID0gbGFtYmRhIHNlbGY6IDAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXIoYyksIGNzdHVmZiArIFsnY2RhdGEnLCAnY21ldGhvZCddKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2ltX3NlbGYnIGluIGRpcihjLkNtZXRob2QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2ltX3NlbGYnIGluIGRpcihjLkNtZXRob2QpKQogCiAgICAgICAgIGNsYXNzIEEoQyk6CiAgICAgICAgICAgICBBZGF0YSA9IDEKQEAgLTIyNTIsMTAgKzIyNTIsMTAgQEAKIAogICAgICAgICBhc3R1ZmYgPSBbJ0FkYXRhJywgJ0FtZXRob2QnXSArIGNzdHVmZgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcihBKSwgYXN0dWZmKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2ltX3NlbGYnIGluIGRpcihBLkFtZXRob2QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2ltX3NlbGYnIGluIGRpcihBLkFtZXRob2QpKQogICAgICAgICBhID0gQSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlyKGEpLCBhc3R1ZmYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnaW1fc2VsZicgaW4gZGlyKGEuQW1ldGhvZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnaW1fc2VsZicgaW4gZGlyKGEuQW1ldGhvZCkpCiAgICAgICAgIGEuYWRhdGEgPSA0MgogICAgICAgICBhLmFtZXRob2QgPSBsYW1iZGEgc2VsZjogMwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpcihhKSwgYXN0dWZmICsgWydhZGF0YScsICdhbWV0aG9kJ10pCkBAIC0yMjc0LDEyICsyMjc0LDEyIEBACiAKICAgICAgICAgYyA9IEMoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyZXN0aW5nKGRpcihjKSksIGNzdHVmZikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdpbV9zZWxmJyBpbiBkaXIoQy5DbWV0aG9kKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdpbV9zZWxmJyBpbiBkaXIoQy5DbWV0aG9kKSkKIAogICAgICAgICBjLmNkYXRhID0gMgogICAgICAgICBjLmNtZXRob2QgPSBsYW1iZGEgc2VsZjogMAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyZXN0aW5nKGRpcihjKSksIGNzdHVmZiArIFsnY2RhdGEnLCAnY21ldGhvZCddKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2ltX3NlbGYnIGluIGRpcihjLkNtZXRob2QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2ltX3NlbGYnIGluIGRpcihjLkNtZXRob2QpKQogCiAgICAgICAgIGNsYXNzIEEoQyk6CiAgICAgICAgICAgICBBZGF0YSA9IDEKQEAgLTIyODcsMTMgKzIyODcsMTMgQEAKIAogICAgICAgICBhc3R1ZmYgPSBbJ0FkYXRhJywgJ0FtZXRob2QnXSArIGNzdHVmZgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyZXN0aW5nKGRpcihBKSksIGFzdHVmZikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdpbV9zZWxmJyBpbiBkaXIoQS5BbWV0aG9kKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdpbV9zZWxmJyBpbiBkaXIoQS5BbWV0aG9kKSkKICAgICAgICAgYSA9IEEoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludGVyZXN0aW5nKGRpcihhKSksIGFzdHVmZikKICAgICAgICAgYS5hZGF0YSA9IDQyCiAgICAgICAgIGEuYW1ldGhvZCA9IGxhbWJkYSBzZWxmOiAzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50ZXJlc3RpbmcoZGlyKGEpKSwgYXN0dWZmICsgWydhZGF0YScsICdhbWV0aG9kJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnaW1fc2VsZicgaW4gZGlyKGEuQW1ldGhvZCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnaW1fc2VsZicgaW4gZGlyKGEuQW1ldGhvZCkpCiAKICAgICAgICAgIyBUcnkgYSBtb2R1bGUgc3ViY2xhc3MuCiAgICAgICAgIGltcG9ydCBzeXMKQEAgLTI0NzcsMTMgKzI0NzcsMTMgQEAKICAgICAgICAgYSA9IGhleGludCgxMjM0NSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhLCAxMjM0NSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbnQoYSksIDEyMzQ1KQotICAgICAgICBzZWxmLmFzc2VydF8oaW50KGEpLl9fY2xhc3NfXyBpcyBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnQoYSkuX19jbGFzc19fIGlzIGludCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGEpLCBoYXNoKDEyMzQ1KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgrYSkuX19jbGFzc19fIGlzIGludCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID4+IDApLl9fY2xhc3NfXyBpcyBpbnQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSA8PCAwKS5fX2NsYXNzX18gaXMgaW50KQotICAgICAgICBzZWxmLmFzc2VydF8oKGhleGludCgwKSA8PCAxMikuX19jbGFzc19fIGlzIGludCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChoZXhpbnQoMCkgPj4gMTIpLl9fY2xhc3NfXyBpcyBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoK2EpLl9fY2xhc3NfXyBpcyBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA+PiAwKS5fX2NsYXNzX18gaXMgaW50KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPDwgMCkuX19jbGFzc19fIGlzIGludCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChoZXhpbnQoMCkgPDwgMTIpLl9fY2xhc3NfXyBpcyBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoaGV4aW50KDApID4+IDEyKS5fX2NsYXNzX18gaXMgaW50KQogCiAgICAgICAgIGNsYXNzIG9jdGxvbmcobG9uZyk6CiAgICAgICAgICAgICBfX3Nsb3RzX18gPSBbXQpAQCAtMjUwMywzNiArMjUwMywzNiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIDEyMzQ1TCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb25nKGEpLCAxMjM0NUwpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChhKSwgaGFzaCgxMjM0NUwpKQotICAgICAgICBzZWxmLmFzc2VydF8obG9uZyhhKS5fX2NsYXNzX18gaXMgbG9uZykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgrYSkuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoLWEpLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydF8oKC1vY3Rsb25nKDApKS5fX2NsYXNzX18gaXMgbG9uZykKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhID4+IDApLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgPDwgMCkuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSAtIDApLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgKiAxKS5fX2NsYXNzX18gaXMgbG9uZykKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhICoqIDEpLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgLy8gMSkuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoMSAqIGEpLl9fY2xhc3NfXyBpcyBsb25nKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgfCAwKS5fX2NsYXNzX18gaXMgbG9uZykKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhIF4gMCkuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSAmIC0xTCkuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xygob2N0bG9uZygwKSA8PCAxMikuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xygob2N0bG9uZygwKSA+PiAxMikuX19jbGFzc19fIGlzIGxvbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhYnMob2N0bG9uZygwKSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb25nKGEpLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCthKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgtYSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoLW9jdGxvbmcoMCkpLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgPj4gMCkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSA8PCAwKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhIC0gMCkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAqIDEpLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKiogMSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAvLyAxKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgxICogYSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSB8IDApLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgXiAwKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICYgLTFMKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChvY3Rsb25nKDApIDw8IDEyKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChvY3Rsb25nKDApID4+IDEyKS5fX2NsYXNzX18gaXMgbG9uZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFicyhvY3Rsb25nKDApKS5fX2NsYXNzX18gaXMgbG9uZykKIAogICAgICAgICAjIEJlY2F1c2Ugb2N0bG9uZyBvdmVycmlkZXMgX19hZGRfXywgd2UgY2FuJ3QgY2hlY2sgdGhlIGFic2VuY2Ugb2YgKzAKICAgICAgICAgIyBvcHRpbWl6YXRpb25zIHVzaW5nIG9jdGxvbmcuCiAgICAgICAgIGNsYXNzIGxvbmdjbG9uZShsb25nKToKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgYSA9IGxvbmdjbG9uZSgxKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgKyAwKS5fX2NsYXNzX18gaXMgbG9uZykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgwICsgYSkuX19jbGFzc19fIGlzIGxvbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSArIDApLl9fY2xhc3NfXyBpcyBsb25nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKDAgKyBhKS5fX2NsYXNzX18gaXMgbG9uZykKIAogICAgICAgICAjIENoZWNrIHRoYXQgbmVnYXRpdmUgY2xvbmVzIGRvbid0IHNlZ2ZhdWx0CiAgICAgICAgIGEgPSBsb25nY2xvbmUoLTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYS5fX2RpY3RfXywge30pCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9uZyhhKSwgLTEpICAjIHNlbGYuYXNzZXJ0XyBQeU51bWJlcl9Mb25nKCkgY29waWVzIHRoZSBzaWduIGJpdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxvbmcoYSksIC0xKSAgIyBzZWxmLmFzc2VydFRydWUgUHlOdW1iZXJfTG9uZygpIGNvcGllcyB0aGUgc2lnbiBiaXQKIAogICAgICAgICBjbGFzcyBwcmVjZmxvYXQoZmxvYXQpOgogICAgICAgICAgICAgX19zbG90c19fID0gWydwcmVjJ10KQEAgLTI1NDQsOSArMjU0NCw5IEBACiAgICAgICAgIGEgPSBwcmVjZmxvYXQoMTIzNDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYSwgMTIzNDUuMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmbG9hdChhKSwgMTIzNDUuMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGZsb2F0KGEpLl9fY2xhc3NfXyBpcyBmbG9hdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZsb2F0KGEpLl9fY2xhc3NfXyBpcyBmbG9hdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKGEpLCBoYXNoKDEyMzQ1LjApKQotICAgICAgICBzZWxmLmFzc2VydF8oKCthKS5fX2NsYXNzX18gaXMgZmxvYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoK2EpLl9fY2xhc3NfXyBpcyBmbG9hdCkKIAogICAgICAgICBjbGFzcyBtYWRjb21wbGV4KGNvbXBsZXgpOgogICAgICAgICAgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgpAQCAtMjU5NCwyMCArMjU5NCwyMCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2LCB0KQogICAgICAgICBhID0gbWFkdHVwbGUoKDEsMiwzLDQsNSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoYSksICgxLDIsMyw0LDUpKQotICAgICAgICBzZWxmLmFzc2VydF8odHVwbGUoYSkuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHVwbGUoYSkuX19jbGFzc19fIGlzIHR1cGxlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2goYSksIGhhc2goKDEsMiwzLDQsNSkpKQotICAgICAgICBzZWxmLmFzc2VydF8oYVs6XS5fX2NsYXNzX18gaXMgdHVwbGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSAqIDEpLl9fY2xhc3NfXyBpcyB0dXBsZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhICogMCkuX19jbGFzc19fIGlzIHR1cGxlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgKyAoKSkuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYVs6XS5fX2NsYXNzX18gaXMgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAqIDEpLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICogMCkuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKyAoKSkuX19jbGFzc19fIGlzIHR1cGxlKQogICAgICAgICBhID0gbWFkdHVwbGUoKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHVwbGUoYSksICgpKQotICAgICAgICBzZWxmLmFzc2VydF8odHVwbGUoYSkuX19jbGFzc19fIGlzIHR1cGxlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgKyBhKS5fX2NsYXNzX18gaXMgdHVwbGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoYSAqIDApLl9fY2xhc3NfXyBpcyB0dXBsZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChhICogMSkuX19jbGFzc19fIGlzIHR1cGxlKQotICAgICAgICBzZWxmLmFzc2VydF8oKGEgKiAyKS5fX2NsYXNzX18gaXMgdHVwbGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhWzpdLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR1cGxlKGEpLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICsgYSkuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGEgKiAwKS5fX2NsYXNzX18gaXMgdHVwbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYSAqIDEpLl9fY2xhc3NfXyBpcyB0dXBsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChhICogMikuX19jbGFzc19fIGlzIHR1cGxlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYVs6XS5fX2NsYXNzX18gaXMgdHVwbGUpCiAKICAgICAgICAgY2xhc3MgbWFkc3RyaW5nKHN0cik6CiAgICAgICAgICAgICBfcmV2ID0gTm9uZQpAQCAtMjYyOSw1MSArMjYyOSw1MSBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LCBzKQogICAgICAgICBzID0gbWFkc3RyaW5nKCIxMjM0NSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHMpLCAiMTIzNDUiKQotICAgICAgICBzZWxmLmFzc2VydF8oc3RyKHMpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIocykuX19jbGFzc19fIGlzIHN0cikKIAogICAgICAgICBiYXNlID0gIlx4MDAiICogNQogICAgICAgICBzID0gbWFkc3RyaW5nKGJhc2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocywgYmFzZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIocyksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHIocykuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihzKS5fX2NsYXNzX18gaXMgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGhhc2gocyksIGhhc2goYmFzZSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoe3M6IDF9W2Jhc2VdLCAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHtiYXNlOiAxfVtzXSwgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChzICsgIiIpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgocyArICIiKS5fX2NsYXNzX18gaXMgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMgKyAiIiwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgiIiArIHMpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoIiIgKyBzKS5fX2NsYXNzX18gaXMgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCIiICsgcywgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChzICogMCkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChzICogMCkuX19jbGFzc19fIGlzIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzICogMCwgIiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygocyAqIDEpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgocyAqIDEpLl9fY2xhc3NfXyBpcyBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocyAqIDEsIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygocyAqIDIpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgocyAqIDIpLl9fY2xhc3NfXyBpcyBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocyAqIDIsIGJhc2UgKyBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8oc1s6XS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc1s6XS5fX2NsYXNzX18gaXMgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbOl0sIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzWzA6MF0uX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNbMDowXS5fX2NsYXNzX18gaXMgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNbMDowXSwgIiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzLnN0cmlwKCkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RyaXAoKS5fX2NsYXNzX18gaXMgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuc3RyaXAoKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHMubHN0cmlwKCkuX19jbGFzc19fIGlzIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMubHN0cmlwKCkuX19jbGFzc19fIGlzIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmxzdHJpcCgpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8ocy5yc3RyaXAoKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5yc3RyaXAoKS5fX2NsYXNzX18gaXMgc3RyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucnN0cmlwKCksIGJhc2UpCiAgICAgICAgIGlkZW50aXR5dGFiID0gJycuam9pbihbY2hyKGkpIGZvciBpIGluIHJhbmdlKDI1NildKQotICAgICAgICBzZWxmLmFzc2VydF8ocy50cmFuc2xhdGUoaWRlbnRpdHl0YWIpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnRyYW5zbGF0ZShpZGVudGl0eXRhYikuX19jbGFzc19fIGlzIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnRyYW5zbGF0ZShpZGVudGl0eXRhYiksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzLnRyYW5zbGF0ZShpZGVudGl0eXRhYiwgIngiKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy50cmFuc2xhdGUoaWRlbnRpdHl0YWIsICJ4IikuX19jbGFzc19fIGlzIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnRyYW5zbGF0ZShpZGVudGl0eXRhYiwgIngiKSwgYmFzZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnRyYW5zbGF0ZShpZGVudGl0eXRhYiwgIlx4MDAiKSwgIiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzLnJlcGxhY2UoIngiLCAieCIpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnJlcGxhY2UoIngiLCAieCIpLl9fY2xhc3NfXyBpcyBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5yZXBsYWNlKCJ4IiwgIngiKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHMubGp1c3QobGVuKHMpKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5sanVzdChsZW4ocykpLl9fY2xhc3NfXyBpcyBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5sanVzdChsZW4ocykpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8ocy5yanVzdChsZW4ocykpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnJqdXN0KGxlbihzKSkuX19jbGFzc19fIGlzIHN0cikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLnJqdXN0KGxlbihzKSksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzLmNlbnRlcihsZW4ocykpLl9fY2xhc3NfXyBpcyBzdHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmNlbnRlcihsZW4ocykpLl9fY2xhc3NfXyBpcyBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5jZW50ZXIobGVuKHMpKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHMubG93ZXIoKS5fX2NsYXNzX18gaXMgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5sb3dlcigpLl9fY2xhc3NfXyBpcyBzdHIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5sb3dlcigpLCBiYXNlKQogCiAgICAgICAgIGNsYXNzIG1hZHVuaWNvZGUodW5pY29kZSk6CkBAIC0yNjkyLDQ3ICsyNjkyLDQ3IEBACiAgICAgICAgIGJhc2UgPSB1IjEyMzQ1IgogICAgICAgICB1ID0gbWFkdW5pY29kZShiYXNlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUodSksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1bmljb2RlKHUpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZSh1KS5fX2NsYXNzX18gaXMgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChoYXNoKHUpLCBoYXNoKGJhc2UpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHt1OiAxfVtiYXNlXSwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh7YmFzZTogMX1bdV0sIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1LnN0cmlwKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LnN0cmlwKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5zdHJpcCgpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8odS5sc3RyaXAoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUubHN0cmlwKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5sc3RyaXAoKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUucnN0cmlwKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LnJzdHJpcCgpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUucnN0cmlwKCksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1LnJlcGxhY2UodSJ4IiwgdSJ4IikuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LnJlcGxhY2UodSJ4IiwgdSJ4IikuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5yZXBsYWNlKHUieCIsIHUieCIpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8odS5yZXBsYWNlKHUieHkiLCB1Inh5IikuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LnJlcGxhY2UodSJ4eSIsIHUieHkiKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LnJlcGxhY2UodSJ4eSIsIHUieHkiKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUuY2VudGVyKGxlbih1KSkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LmNlbnRlcihsZW4odSkpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUuY2VudGVyKGxlbih1KSksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1LmxqdXN0KGxlbih1KSkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LmxqdXN0KGxlbih1KSkuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS5sanVzdChsZW4odSkpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8odS5yanVzdChsZW4odSkpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodS5yanVzdChsZW4odSkpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUucmp1c3QobGVuKHUpKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUubG93ZXIoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUubG93ZXIoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1Lmxvd2VyKCksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1LnVwcGVyKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LnVwcGVyKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodS51cHBlcigpLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8odS5jYXBpdGFsaXplKCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1LmNhcGl0YWxpemUoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LmNhcGl0YWxpemUoKSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUudGl0bGUoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUudGl0bGUoKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1LnRpdGxlKCksIGJhc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygodSArIHUiIikuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgodSArIHUiIikuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSArIHUiIiwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCh1IiIgKyB1KS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCh1IiIgKyB1KS5fX2NsYXNzX18gaXMgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1IiIgKyB1LCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8oKHUgKiAwKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCh1ICogMCkuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSAqIDAsIHUiIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCh1ICogMSkuX19jbGFzc19fIGlzIHVuaWNvZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgodSAqIDEpLl9fY2xhc3NfXyBpcyB1bmljb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUgKiAxLCBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8oKHUgKiAyKS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCh1ICogMikuX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSAqIDIsIGJhc2UgKyBiYXNlKQotICAgICAgICBzZWxmLmFzc2VydF8odVs6XS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVbOl0uX19jbGFzc19fIGlzIHVuaWNvZGUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodVs6XSwgYmFzZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHVbMDowXS5fX2NsYXNzX18gaXMgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVbMDowXS5fX2NsYXNzX18gaXMgdW5pY29kZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1WzA6MF0sIHUiIikKIAogICAgICAgICBjbGFzcyBzdWJsaXN0KGxpc3QpOgpAQCAtMjg1MSw3ICsyODUxLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkW2Npc3RyKCdvbmUnKV0sIDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFtjaXN0cigndFdvJyldLCAyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbY2lzdHIoJ1RIckVFJyldLCAzKQotICAgICAgICBzZWxmLmFzc2VydF8oY2lzdHIoJ09OZScpIGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjaXN0cignT05lJykgaW4gZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldChjaXN0cigndGhyRUUnKSksIDMpCiAKICAgICBkZWYgdGVzdF9jbGFzc2ljX2NvbXBhcmlzb25zKHNlbGYpOgpAQCAtMjg3OCwxMiArMjg3OCwxMiBAQAogICAgICAgICAgICAgYyA9IHsxOiBjMSwgMjogYzIsIDM6IGMzfQogICAgICAgICAgICAgZm9yIHggaW4gMSwgMiwgMzoKICAgICAgICAgICAgICAgICBmb3IgeSBpbiAxLCAyLCAzOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oY21wKGNbeF0sIGNbeV0pID09IGNtcCh4LCB5KSwgIng9JWQsIHk9JWQiICUgKHgsIHkpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY21wKGNbeF0sIGNbeV0pID09IGNtcCh4LCB5KSwgIng9JWQsIHk9JWQiICUgKHgsIHkpKQogICAgICAgICAgICAgICAgICAgICBmb3Igb3AgaW4gIjwiLCAiPD0iLCAiPT0iLCAiIT0iLCAiPiIsICI+PSI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZXZhbCgiY1t4XSAlcyBjW3ldIiAlIG9wKSA9PSBldmFsKCJ4ICVzIHkiICUgb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoImNbeF0gJXMgY1t5XSIgJSBvcCkgPT0gZXZhbCgieCAlcyB5IiAlIG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjbXAoY1t4XSwgeSkgPT0gY21wKHgsIHkpLCAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjbXAoeCwgY1t5XSkgPT0gY21wKHgsIHkpLCAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbXAoY1t4XSwgeSkgPT0gY21wKHgsIHkpLCAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbXAoeCwgY1t5XSkgPT0gY21wKHgsIHkpLCAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCiAKICAgICBkZWYgdGVzdF9yaWNoX2NvbXBhcmlzb25zKHNlbGYpOgogICAgICAgICAjIFRlc3RpbmcgcmljaCBjb21wYXJpc29ucy4uLgpAQCAtMjk1NiwxMSArMjk1NiwxMSBAQAogICAgICAgICAgICAgZm9yIHggaW4gMSwgMiwgMzoKICAgICAgICAgICAgICAgICBmb3IgeSBpbiAxLCAyLCAzOgogICAgICAgICAgICAgICAgICAgICBmb3Igb3AgaW4gIjwiLCAiPD0iLCAiPT0iLCAiIT0iLCAiPiIsICI+PSI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZXZhbCgiY1t4XSAlcyBjW3ldIiAlIG9wKSA9PSBldmFsKCJ4ICVzIHkiICUgb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoImNbeF0gJXMgY1t5XSIgJSBvcCkgPT0gZXZhbCgieCAlcyB5IiAlIG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZXZhbCgiY1t4XSAlcyB5IiAlIG9wKSA9PSBldmFsKCJ4ICVzIHkiICUgb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoImNbeF0gJXMgeSIgJSBvcCkgPT0gZXZhbCgieCAlcyB5IiAlIG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZXZhbCgieCAlcyBjW3ldIiAlIG9wKSA9PSBldmFsKCJ4ICVzIHkiICUgb3ApLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoInggJXMgY1t5XSIgJSBvcCkgPT0gZXZhbCgieCAlcyB5IiAlIG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieD0lZCwgeT0lZCIgJSAoeCwgeSkpCiAKICAgICBkZWYgdGVzdF9jb2VyY2lvbnMoc2VsZik6CkBAIC0zMDI2LDkgKzMwMjYsOSBAQAogICAgICAgICAgICAgZm9yIGNsczIgaW4gQywgRCwgRSwgRjoKICAgICAgICAgICAgICAgICB4ID0gY2xzKCkKICAgICAgICAgICAgICAgICB4Ll9fY2xhc3NfXyA9IGNsczIKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oeC5fX2NsYXNzX18gaXMgY2xzMikKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5fX2NsYXNzX18gaXMgY2xzMikKICAgICAgICAgICAgICAgICB4Ll9fY2xhc3NfXyA9IGNscwotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh4Ll9fY2xhc3NfXyBpcyBjbHMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHguX19jbGFzc19fIGlzIGNscykKICAgICAgICAgZGVmIGNhbnQoeCwgQyk6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgeC5fX2NsYXNzX18gPSBDCkBAIC0zMDkwLDExICszMDkwLDExIEBACiAgICAgICAgICAgICB4ID0gY2xzKCkKICAgICAgICAgICAgIHguYSA9IDEKICAgICAgICAgICAgIHguX19jbGFzc19fID0gY2xzMgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHguX19jbGFzc19fIGlzIGNsczIsCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5fX2NsYXNzX18gaXMgY2xzMiwKICAgICAgICAgICAgICAgICAgICAiYXNzaWduaW5nICVyIGFzIF9fY2xhc3NfXyBmb3IgJXIgc2lsZW50bHkgZmFpbGVkIiAlIChjbHMyLCB4KSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoeC5hLCAxKQogICAgICAgICAgICAgeC5fX2NsYXNzX18gPSBjbHMKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh4Ll9fY2xhc3NfXyBpcyBjbHMsCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeC5fX2NsYXNzX18gaXMgY2xzLAogICAgICAgICAgICAgICAgICAgICJhc3NpZ25pbmcgJXIgYXMgX19jbGFzc19fIGZvciAlciBzaWxlbnRseSBmYWlsZWQiICUgKGNscywgeCkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHguYSwgMSkKICAgICAgICAgZm9yIGNscyBpbiBHLCBKLCBLLCBMLCBNLCBOLCBQLCBSLCBsaXN0LCBJbnQ6CkBAIC0zMjY0LDcgKzMyNjQsNyBAQAogICAgICAgICAgICAgICAgIGZvciBjbHMgaW4gQywgQzEsIEMyOgogICAgICAgICAgICAgICAgICAgICBzID0gcC5kdW1wcyhjbHMsIGJpbikKICAgICAgICAgICAgICAgICAgICAgY2xzMiA9IHAubG9hZHMocykKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNsczIgaXMgY2xzKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xzMiBpcyBjbHMpCiAKICAgICAgICAgICAgICAgICBhID0gQzEoMSwgMik7IGEuYXBwZW5kKDQyKTsgYS5hcHBlbmQoMjQpCiAgICAgICAgICAgICAgICAgYiA9IEMyKCJoZWxsbyIsICJ3b3JsZCIsIDQyKQpAQCAtMzI5NCw3ICszMjk0LDcgQEAKICAgICAgICAgaW1wb3J0IGNvcHkKICAgICAgICAgZm9yIGNscyBpbiBDLCBDMSwgQzI6CiAgICAgICAgICAgICBjbHMyID0gY29weS5kZWVwY29weShjbHMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oY2xzMiBpcyBjbHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xzMiBpcyBjbHMpCiAKICAgICAgICAgYSA9IEMxKDEsIDIpOyBhLmFwcGVuZCg0Mik7IGEuYXBwZW5kKDI0KQogICAgICAgICBiID0gQzIoImhlbGxvIiwgIndvcmxkIiwgNDIpCkBAIC0zODY2LDggKzM4NjYsOCBAQAogICAgICAgICAgICAgX19zbG90c19fPSgpCiAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC5jaGVja19pbXBsX2RldGFpbCgpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChDLl9fYmFzaWNzaXplX18sIEIuX19iYXNpY3NpemVfXykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoQywgJ19fZGljdF9fJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhoYXNhdHRyKEMsICdfX3dlYWtyZWZfXycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihDLCAnX19kaWN0X18nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoQywgJ19fd2Vha3JlZl9fJykpCiAgICAgICAgIEMoKS54ID0gMgogCiAgICAgZGVmIHRlc3Rfcm11bChzZWxmKToKQEAgLTQyMjQsMjkgKzQyMjQsMjkgQEAKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgYSA9IEMoKQogICAgICAgICBwYSA9IFByb3h5KGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGEsIEMpKSAgIyBCYXNlbGluZQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShwYSwgQykpICMgVGVzdAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShhLCBDKSkgICMgQmFzZWxpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocGEsIEMpKSAjIFRlc3QKICAgICAgICAgIyBUZXN0IHdpdGggYSBjbGFzc2ljIHN1YmNsYXNzCiAgICAgICAgIGNsYXNzIEQoQyk6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGEgPSBEKCkKICAgICAgICAgcGEgPSBQcm94eShhKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShhLCBDKSkgICMgQmFzZWxpbmUKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UocGEsIEMpKSAjIFRlc3QKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoYSwgQykpICAjIEJhc2VsaW5lCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHBhLCBDKSkgIyBUZXN0CiAgICAgICAgICMgVGVzdCB3aXRoIGEgbmV3LXN0eWxlIGNsYXNzCiAgICAgICAgIGNsYXNzIEMob2JqZWN0KToKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgYSA9IEMoKQogICAgICAgICBwYSA9IFByb3h5KGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGEsIEMpKSAgIyBCYXNlbGluZQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShwYSwgQykpICMgVGVzdAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShhLCBDKSkgICMgQmFzZWxpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocGEsIEMpKSAjIFRlc3QKICAgICAgICAgIyBUZXN0IHdpdGggYSBuZXctc3R5bGUgc3ViY2xhc3MKICAgICAgICAgY2xhc3MgRChDKToKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgYSA9IEQoKQogICAgICAgICBwYSA9IFByb3h5KGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGEsIEMpKSAgIyBCYXNlbGluZQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShwYSwgQykpICMgVGVzdAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShhLCBDKSkgICMgQmFzZWxpbmUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocGEsIEMpKSAjIFRlc3QKIAogICAgIGRlZiB0ZXN0X3Byb3h5X3N1cGVyKHNlbGYpOgogICAgICAgICAjIFRlc3Rpbmcgc3VwZXIoKSBmb3IgYSBwcm94eSBvYmplY3QuLi4KQEAgLTQzNzMsMTcgKzQzNzMsMTcgQEAKICAgICAgICAgbCA9IFtdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobC5fX2FkZF9fLCBsLl9fYWRkX18pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobC5fX2FkZF9fLCBbXS5fX2FkZF9fKQotICAgICAgICBzZWxmLmFzc2VydF8obC5fX2FkZF9fICE9IFs1XS5fX2FkZF9fKQotICAgICAgICBzZWxmLmFzc2VydF8obC5fX2FkZF9fICE9IGwuX19tdWxfXykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGwuX19hZGRfXy5fX25hbWVfXyA9PSAnX19hZGRfXycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsLl9fYWRkX18gIT0gWzVdLl9fYWRkX18pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsLl9fYWRkX18gIT0gbC5fX211bF9fKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobC5fX2FkZF9fLl9fbmFtZV9fID09ICdfX2FkZF9fJykKICAgICAgICAgaWYgaGFzYXR0cihsLl9fYWRkX18sICdfX3NlbGZfXycpOgogICAgICAgICAgICAgIyBDUHl0aG9uCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obC5fX2FkZF9fLl9fc2VsZl9fIGlzIGwpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obC5fX2FkZF9fLl9fb2JqY2xhc3NfXyBpcyBsaXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwuX19hZGRfXy5fX3NlbGZfXyBpcyBsKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwuX19hZGRfXy5fX29iamNsYXNzX18gaXMgbGlzdCkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgICMgUHl0aG9uIGltcGxlbWVudGF0aW9ucyB3aGVyZSBbXS5fX2FkZF9fIGlzIGEgbm9ybWFsIGJvdW5kIG1ldGhvZAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGwuX19hZGRfXy5pbV9zZWxmIGlzIGwpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obC5fX2FkZF9fLmltX2NsYXNzIGlzIGxpc3QpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobC5fX2FkZF9fLmltX3NlbGYgaXMgbCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsLl9fYWRkX18uaW1fY2xhc3MgaXMgbGlzdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsLl9fYWRkX18uX19kb2NfXywgbGlzdC5fX2FkZF9fLl9fZG9jX18pCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGhhc2gobC5fX2FkZF9fKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kaWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9kaWN0LnB5CmluZGV4IGI3M2E1M2YuLjA3NWY5ZGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZGljdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RpY3QucHkKQEAgLTksNyArOSw3IEBACiAgICAgZGVmIHRlc3RfY29uc3RydWN0b3Ioc2VsZik6CiAgICAgICAgICMgY2FsbGluZyBidWlsdC1pbiB0eXBlcyB3aXRob3V0IGFyZ3VtZW50IG11c3QgcmV0dXJuIGVtcHR5CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdCgpLCB7fSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRpY3QoKSBpcyBub3Qge30pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWN0KCkgaXMgbm90IHt9KQogCiAgICAgZGVmIHRlc3RfbGl0ZXJhbF9jb25zdHJ1Y3RvcihzZWxmKToKICAgICAgICAgIyBjaGVjayBsaXRlcmFsIGNvbnN0cnVjdG9yIGZvciBkaWZmZXJlbnQgc2l6ZWQgZGljdHMgKHRvIGV4ZXJjaXNlIHRoZSBCVUlMRF9NQVAgb3BhcmcKQEAgLTIzLDE4ICsyMywxOCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChldmFsKGRpY3RsaXRlcmFsKSwgZGljdChpdGVtcykpCiAKICAgICBkZWYgdGVzdF9ib29sKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8obm90IHt9KQotICAgICAgICBzZWxmLmFzc2VydF8oezE6IDJ9KQotICAgICAgICBzZWxmLmFzc2VydF8oYm9vbCh7fSkgaXMgRmFsc2UpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhib29sKHsxOiAyfSkgaXMgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHsxOiAyfSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJvb2woe30pIGlzIEZhbHNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYm9vbCh7MTogMn0pIGlzIFRydWUpCiAKICAgICBkZWYgdGVzdF9rZXlzKHNlbGYpOgogICAgICAgICBkID0ge30KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmtleXMoKSwgW10pCiAgICAgICAgIGQgPSB7J2EnOiAxLCAnYic6IDJ9CiAgICAgICAgIGsgPSBkLmtleXMoKQotICAgICAgICBzZWxmLmFzc2VydF8oZC5oYXNfa2V5KCdhJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkLmhhc19rZXkoJ2InKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuaGFzX2tleSgnYScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5oYXNfa2V5KCdiJykpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBkLmtleXMsIE5vbmUpCiAKQEAgLTU3LDcgKzU3LDcgQEAKIAogICAgIGRlZiB0ZXN0X2hhc19rZXkoc2VsZik6CiAgICAgICAgIGQgPSB7fQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGQuaGFzX2tleSgnYScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGQuaGFzX2tleSgnYScpKQogICAgICAgICBkID0geydhJzogMSwgJ2InOiAyfQogICAgICAgICBrID0gZC5rZXlzKCkKICAgICAgICAgay5zb3J0KCkKQEAgLTY3LDEyICs2NywxMiBAQAogCiAgICAgZGVmIHRlc3RfY29udGFpbnMoc2VsZik6CiAgICAgICAgIGQgPSB7fQotICAgICAgICBzZWxmLmFzc2VydF8obm90ICgnYScgaW4gZCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYScgbm90IGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKCdhJyBpbiBkKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBub3QgaW4gZCkKICAgICAgICAgZCA9IHsnYSc6IDEsICdiJzogMn0KLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBpbiBkKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2InIGluIGQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYycgbm90IGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYScgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdiJyBpbiBkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2MnIG5vdCBpbiBkKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZC5fX2NvbnRhaW5zX18pCiAKQEAgLTIwNiw3ICsyMDYsNyBAQAogICAgIGRlZiB0ZXN0X2Zyb21rZXlzKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3QuZnJvbWtleXMoJ2FiYycpLCB7J2EnOk5vbmUsICdiJzpOb25lLCAnYyc6Tm9uZX0pCiAgICAgICAgIGQgPSB7fQotICAgICAgICBzZWxmLmFzc2VydF8obm90KGQuZnJvbWtleXMoJ2FiYycpIGlzIGQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90KGQuZnJvbWtleXMoJ2FiYycpIGlzIGQpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZnJvbWtleXMoJ2FiYycpLCB7J2EnOk5vbmUsICdiJzpOb25lLCAnYyc6Tm9uZX0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5mcm9ta2V5cygoNCw1KSwwKSwgezQ6MCwgNTowfSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmZyb21rZXlzKFtdKSwge30pCkBAIC0yMTcsMTQgKzIxNywxNCBAQAogICAgICAgICBjbGFzcyBkaWN0bGlrZShkaWN0KTogcGFzcwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpY3RsaWtlLmZyb21rZXlzKCdhJyksIHsnYSc6Tm9uZX0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGljdGxpa2UoKS5mcm9ta2V5cygnYScpLCB7J2EnOk5vbmV9KQotICAgICAgICBzZWxmLmFzc2VydF8odHlwZShkaWN0bGlrZS5mcm9ta2V5cygnYScpKSBpcyBkaWN0bGlrZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUoZGljdGxpa2UoKS5mcm9ta2V5cygnYScpKSBpcyBkaWN0bGlrZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoZGljdGxpa2UuZnJvbWtleXMoJ2EnKSkgaXMgZGljdGxpa2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKGRpY3RsaWtlKCkuZnJvbWtleXMoJ2EnKSkgaXMgZGljdGxpa2UpCiAgICAgICAgIGNsYXNzIG15ZGljdChkaWN0KToKICAgICAgICAgICAgIGRlZiBfX25ld19fKGNscyk6CiAgICAgICAgICAgICAgICAgcmV0dXJuIFVzZXJEaWN0LlVzZXJEaWN0KCkKICAgICAgICAgdWQgPSBteWRpY3QuZnJvbWtleXMoJ2FiJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1ZCwgeydhJzpOb25lLCAnYic6Tm9uZX0pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHVkLCBVc2VyRGljdC5Vc2VyRGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHVkLCBVc2VyRGljdC5Vc2VyRGljdCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZGljdC5mcm9ta2V5cykKIAogICAgICAgICBjbGFzcyBFeGMoRXhjZXB0aW9uKTogcGFzcwpAQCAtMjYxLDEwICsyNjEsMTAgQEAKIAogICAgIGRlZiB0ZXN0X2dldChzZWxmKToKICAgICAgICAgZCA9IHt9Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhkLmdldCgnYycpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmdldCgnYycpIGlzIE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2MnLCAzKSwgMykKICAgICAgICAgZCA9IHsnYScgOiAxLCAnYicgOiAyfQotICAgICAgICBzZWxmLmFzc2VydF8oZC5nZXQoJ2MnKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5nZXQoJ2MnKSBpcyBOb25lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQuZ2V0KCdjJywgMyksIDMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5nZXQoJ2EnKSwgMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLmdldCgnYScsIDMpLCAxKQpAQCAtMjc0LDkgKzI3NCw5IEBACiAgICAgZGVmIHRlc3Rfc2V0ZGVmYXVsdChzZWxmKToKICAgICAgICAgIyBkaWN0LnNldGRlZmF1bHQoKQogICAgICAgICBkID0ge30KLSAgICAgICAgc2VsZi5hc3NlcnRfKGQuc2V0ZGVmYXVsdCgna2V5MCcpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLnNldGRlZmF1bHQoJ2tleTAnKSBpcyBOb25lKQogICAgICAgICBkLnNldGRlZmF1bHQoJ2tleTAnLCBbXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGQuc2V0ZGVmYXVsdCgna2V5MCcpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLnNldGRlZmF1bHQoJ2tleTAnKSBpcyBOb25lKQogICAgICAgICBkLnNldGRlZmF1bHQoJ2tleScsIFtdKS5hcHBlbmQoMykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWydrZXknXVswXSwgMykKICAgICAgICAgZC5zZXRkZWZhdWx0KCdrZXknLCBbXSkuYXBwZW5kKDQpCkBAIC0zMTgsOSArMzE4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YSwgaW50KGthKSkKICAgICAgICAgICAgICAgICAgICAga2IsIHZiID0gdGIgPSBiLnBvcGl0ZW0oKQogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZiLCBpbnQoa2IpKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obm90KGNvcHltb2RlIDwgMCBhbmQgdGEgIT0gdGIpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgYSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IGIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QoY29weW1vZGUgPCAwIGFuZCB0YSAhPSB0YikpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBhKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgYikKIAogICAgICAgICBkID0ge30KICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGQucG9waXRlbSkKQEAgLTM5NSw4ICszOTUsOCBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFeGMsIHJlcHIsIGQpCiAKICAgICBkZWYgdGVzdF9sZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCAoe30gPCB7fSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKHsxOiAyfSA8IHsxTDogMkx9KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAoe30gPCB7fSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKHsxOiAyfSA8IHsxTDogMkx9KSkKIAogICAgICAgICBjbGFzcyBFeGMoRXhjZXB0aW9uKTogcGFzcwogCkBAIC00MzAsOCArNDMwLDggQEAKICAgICAgICAgZCA9IEQoezE6IDIsIDM6IDR9KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbMV0sIDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFszXSwgNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKDIgbm90IGluIGQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygyIG5vdCBpbiBkLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIgbm90IGluIGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyIG5vdCBpbiBkLmtleXMoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzJdLCA0MikKICAgICAgICAgY2xhc3MgRShkaWN0KToKICAgICAgICAgICAgIGRlZiBfX21pc3NpbmdfXyhzZWxmLCBrZXkpOgpAQCAtNTY3LDcgKzU2Nyw3IEBACiAgICAgICAgICAgICBvYmoueCA9IGkoY29udGFpbmVyKQogICAgICAgICAgICAgZGVsIG9iaiwgY29udGFpbmVyCiAgICAgICAgICAgICBnYy5jb2xsZWN0KCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhyZWYoKSBpcyBOb25lLCAiQ3ljbGUgd2FzIG5vdCBjb2xsZWN0ZWQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlZigpIGlzIE5vbmUsICJDeWNsZSB3YXMgbm90IGNvbGxlY3RlZCIpCiAKICAgICBkZWYgX25vdF90cmFja2VkKHNlbGYsIHQpOgogICAgICAgICAjIE5lc3RlZCBjb250YWluZXJzIGNhbiB0YWtlIHNldmVyYWwgY29sbGVjdGlvbnMgdG8gdW50cmFjawpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9kaXJjYWNoZS5weSBiL0xpYi90ZXN0L3Rlc3RfZGlyY2FjaGUucHkKaW5kZXggMjc2YzUyYS4uNTY3OTlkYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kaXJjYWNoZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2RpcmNhY2hlLnB5CkBAIC0zOCw3ICszOCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVudHJpZXMsIFtdKQogCiAgICAgICAgICMgQ2hlY2sgdGhhdCBjYWNoZSBpcyBhY3R1YWxseSBjYWNoaW5nLCBub3QganVzdCBwYXNzaW5nIHRocm91Z2guCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkaXJjYWNoZS5saXN0ZGlyKHNlbGYudGVtcGRpcikgaXMgZW50cmllcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpcmNhY2hlLmxpc3RkaXIoc2VsZi50ZW1wZGlyKSBpcyBlbnRyaWVzKQogCiAgICAgICAgICMgRGlyZWN0b3JpZXMgYXJlbid0ICJmaWxlcyIgb24gV2luZG93cywgYW5kIGRpcmVjdG9yeSBtdGltZSBoYXMKICAgICAgICAgIyBub3RoaW5nIHRvIGRvIHdpdGggd2hlbiBmaWxlcyB1bmRlciBhIGRpcmVjdG9yeSBnZXQgY3JlYXRlZC4KQEAgLTUzLDcgKzUzLDcgQEAKICAgICAgICAgICAgIHNlbGYud3JpdGVUZW1wKCJ0ZXN0MSIpCiAgICAgICAgICAgICBlbnRyaWVzID0gZGlyY2FjaGUubGlzdGRpcihzZWxmLnRlbXBkaXIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhlbnRyaWVzLCBbJ3Rlc3QxJ10pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZGlyY2FjaGUubGlzdGRpcihzZWxmLnRlbXBkaXIpIGlzIGVudHJpZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZGlyY2FjaGUubGlzdGRpcihzZWxmLnRlbXBkaXIpIGlzIGVudHJpZXMpCiAKICAgICAgICAgIyMgVU5TVUNDRVNTRlVMIENBU0VTCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGRpcmNhY2hlLmxpc3RkaXIsIHNlbGYudGVtcGRpcisiX25vbmV4aXN0ZW50IikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZG9jeG1scnBjLnB5IGIvTGliL3Rlc3QvdGVzdF9kb2N4bWxycGMucHkKaW5kZXggNTc4MTNjOS4uMDFhZTQ2MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kb2N4bWxycGMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kb2N4bWxycGMucHkKQEAgLTEwNSw3ICsxMDUsNyBAQAogICAgICAgICBzZWxmLmNsaWVudC5yZXF1ZXN0KCJHRVQiLCAiLyIpCiAgICAgICAgIHJlc3BvbnNlID0gc2VsZi5jbGllbnQuZ2V0cmVzcG9uc2UoKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogIiIiPGRsPjxkdD48YSBuYW1lPSItJmx0O2xhbWJkYSZndDsiPjxzdHJvbmc+Jmx0O2xhbWJkYSZndDs8L3N0cm9uZz48L2E+KHgsIHkpPC9kdD48L2RsPiIiIgogICAgICAgICAgICAgaW4gcmVzcG9uc2UucmVhZCgpKQogCkBAIC0xMTksNyArMTE5LDcgQEAKICAgICAgICAgc2VsZi5jbGllbnQucmVxdWVzdCgiR0VUIiwgIi8iKQogICAgICAgICByZXNwb25zZSA9IHNlbGYuY2xpZW50LmdldHJlc3BvbnNlKCkKIAotICAgICAgICBzZWxmLmFzc2VydF8oICMgVGhpcyBpcyB1Z2x5IC4uLiBob3cgY2FuIGl0IGJlIG1hZGUgYmV0dGVyPworICAgICAgICBzZWxmLmFzc2VydFRydWUoICMgVGhpcyBpcyB1Z2x5IC4uLiBob3cgY2FuIGl0IGJlIG1hZGUgYmV0dGVyPwogIiIiPGRsPjxkdD48YSBuYW1lPSItYWRkIj48c3Ryb25nPmFkZDwvc3Ryb25nPjwvYT4oeCwgeSk8L2R0PjxkZD48dHQ+QWRkJm5ic3A7dHdvJm5ic3A7aW5zdGFuY2VzJm5ic3A7dG9nZXRoZXIuJm5ic3A7VGhpcyZuYnNwO2ZvbGxvd3MmbmJzcDs8YSBocmVmPSJodHRwOi8vd3d3LnB5dGhvbi5vcmcvZGV2L3BlcHMvcGVwLTAwMDgvIj5QRVAwMDg8L2E+LCZuYnNwO2J1dCZuYnNwO2hhcyZuYnNwO25vdGhpbmc8YnI+XG50byZuYnNwO2RvJm5ic3A7d2l0aCZuYnNwOzxhIGhyZWY9Imh0dHA6Ly93d3cucmZjLWVkaXRvci5vcmcvcmZjL3JmYzE5NTIudHh0Ij5SRkMxOTUyPC9hPi4mbmJzcDtDYXNlJm5ic3A7c2hvdWxkJm5ic3A7bWF0dGVyOiZuYnNwO3BFcDAwOCZuYnNwO2FuZCZuYnNwO3JGQzE5NTIuJm5ic3A7Jm5ic3A7VGhpbmdzPGJyPlxudGhhdCZuYnNwO3N0YXJ0Jm5ic3A7d2l0aCZuYnNwO2h0dHAmbmJzcDthbmQmbmJzcDtmdHAmbmJzcDtzaG91bGQmbmJzcDtiZSZuYnNwO2F1dG8tbGlua2VkLCZuYnNwO3Rvbzo8YnI+XG48YSBocmVmPSJodHRwOi8vZ29vZ2xlLmNvbSI+aHR0cDovL2dvb2dsZS5jb208L2E+LjwvdHQ+PC9kZD48L2RsPiIiIgogICAgICAgICAgIGluIHJlc3BvbnNlLnJlYWQoKSkKIApAQCAtMTMyLDcgKzEzMiw3IEBACiAgICAgICAgIHNlbGYuY2xpZW50LnJlcXVlc3QoIkdFVCIsICIvIikKICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmNsaWVudC5nZXRyZXNwb25zZSgpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAiIiI8ZGw+PGR0PjxhIG5hbWU9Ii1zeXN0ZW0ubGlzdE1ldGhvZHMiPjxzdHJvbmc+c3lzdGVtLmxpc3RNZXRob2RzPC9zdHJvbmc+PC9hPigpPC9kdD48ZGQ+PHR0PjxhIGhyZWY9IiMtc3lzdGVtLmxpc3RNZXRob2RzIj5zeXN0ZW0ubGlzdE1ldGhvZHM8L2E+KCkmbmJzcDs9Jmd0OyZuYnNwO1tcJ2FkZFwnLCZuYnNwO1wnc3VidHJhY3RcJywmbmJzcDtcJ211bHRpcGxlXCddPGJyPlxuJm5ic3A7PGJyPlxuUmV0dXJucyZuYnNwO2EmbmJzcDtsaXN0Jm5ic3A7b2YmbmJzcDt0aGUmbmJzcDttZXRob2RzJm5ic3A7c3VwcG9ydGVkJm5ic3A7YnkmbmJzcDt0aGUmbmJzcDtzZXJ2ZXIuPC90dD48L2RkPjwvZGw+XG4gPGRsPjxkdD48YSBuYW1lPSItc3lzdGVtLm1ldGhvZEhlbHAiPjxzdHJvbmc+c3lzdGVtLm1ldGhvZEhlbHA8L3N0cm9uZz48L2E+KG1ldGhvZF9uYW1lKTwvZHQ+PGRkPjx0dD48YSBocmVmPSIjLXN5c3RlbS5tZXRob2RIZWxwIj5zeXN0ZW0ubWV0aG9kSGVscDwvYT4oXCdhZGRcJykmbmJzcDs9Jmd0OyZuYnNwOyJBZGRzJm5ic3A7dHdvJm5ic3A7aW50ZWdlcnMmbmJzcDt0b2dldGhlciI8YnI+XG4mbmJzcDs8YnI+XG5SZXR1cm5zJm5ic3A7YSZuYnNwO3N0cmluZyZuYnNwO2NvbnRhaW5pbmcmbmJzcDtkb2N1bWVudGF0aW9uJm5ic3A7Zm9yJm5ic3A7dGhlJm5ic3A7c3BlY2lmaWVkJm5ic3A7bWV0aG9kLjwvdHQ+PC9kZD48L2RsPlxuIDxkbD48ZHQ+PGEgbmFtZT0iLXN5c3RlbS5tZXRob2RTaWduYXR1cmUiPjxzdHJvbmc+c3lzdGVtLm1ldGhvZFNpZ25hdHVyZTwvc3Ryb25nPjwvYT4obWV0aG9kX25hbWUpPC9kdD48ZGQ+PHR0PjxhIGhyZWY9IiMtc3lzdGVtLm1ldGhvZFNpZ25hdHVyZSI+c3lzdGVtLm1ldGhvZFNpZ25hdHVyZTwvYT4oXCdhZGRcJykmbmJzcDs9Jmd0OyZuYnNwO1tkb3VibGUsJm5ic3A7aW50LCZuYnNwO2ludF08YnI+XG4mbmJzcDs8YnI+XG5SZXR1cm5zJm5ic3A7YSZuYnNwO2xpc3QmbmJzcDtkZXNjcmliaW5nJm5ic3A7dGhlJm5ic3A7c2lnbmF0dXJlJm5ic3A7b2YmbmJzcDt0aGUmbmJzcDttZXRob2QuJm5ic3A7SW4mbmJzcDt0aGU8YnI+XG5hYm92ZSZuYnNwO2V4YW1wbGUsJm5ic3A7dGhlJm5ic3A7YWRkJm5ic3A7bWV0aG9kJm5ic3A7dGFrZXMmbmJzcDt0d28mbmJzcDtpbnRlZ2VycyZuYnNwO2FzJm5ic3A7YXJndW1lbnRzPGJyPlxuYW5kJm5ic3A7cmV0dXJucyZuYnNwO2EmbmJzcDtkb3VibGUmbmJzcDtyZXN1bHQuPGJyPlxuJm5ic3A7PGJyPlxuVGhpcyZuYnNwO3NlcnZlciZuYnNwO2RvZXMmbmJzcDtOT1QmbmJzcDtzdXBwb3J0Jm5ic3A7c3lzdGVtLm1ldGhvZFNpZ25hdHVyZS48L3R0PjwvZGQ+PC9kbD4iIiIKICAgICAgICAgICAgIGluIHJlc3BvbnNlLnJlYWQoKSkKIApAQCAtMTQyLDcgKzE0Miw3IEBACiAgICAgICAgIHNlbGYuY2xpZW50LnJlcXVlc3QoIkdFVCIsICIvIikKICAgICAgICAgcmVzcG9uc2UgPSBzZWxmLmNsaWVudC5nZXRyZXNwb25zZSgpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKCIiIlRyeSZuYnNwO3NlbGYuPHN0cm9uZz5hZGQ8L3N0cm9uZz4sJm5ic3A7dG9vLiIiIiBpbgorICAgICAgICBzZWxmLmFzc2VydFRydWUoIiIiVHJ5Jm5ic3A7c2VsZi48c3Ryb25nPmFkZDwvc3Ryb25nPiwmbmJzcDt0b28uIiIiIGluCiAgICAgICAgICAgICByZXNwb25zZS5yZWFkKCkpCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZHVtbXlfdGhyZWFkLnB5IGIvTGliL3Rlc3QvdGVzdF9kdW1teV90aHJlYWQucHkKaW5kZXggNThmYWViNC4uNzRkZTg2YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kdW1teV90aHJlYWQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9kdW1teV90aHJlYWQucHkKQEAgLTI0LDQzICsyNCw0MyBAQAogCiAgICAgZGVmIHRlc3RfaW5pdGxvY2soc2VsZik6CiAgICAgICAgICNNYWtlIHN1cmUgbG9ja3Mgc3RhcnQgbG9ja2VkCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3Qgc2VsZi5sb2NrLmxvY2tlZCgpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYubG9jay5sb2NrZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJMb2NrIG9iamVjdCBpcyBub3QgaW5pdGlhbGl6ZWQgdW5sb2NrZWQuIikKIAogICAgIGRlZiB0ZXN0X3JlbGVhc2Uoc2VsZik6CiAgICAgICAgICMgVGVzdCBzZWxmLmxvY2sucmVsZWFzZSgpCiAgICAgICAgIHNlbGYubG9jay5hY3F1aXJlKCkKICAgICAgICAgc2VsZi5sb2NrLnJlbGVhc2UoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHNlbGYubG9jay5sb2NrZWQoKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLmxvY2subG9ja2VkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAiTG9jayBvYmplY3QgZGlkIG5vdCByZWxlYXNlIHByb3Blcmx5LiIpCiAKICAgICBkZWYgdGVzdF9pbXByb3Blcl9yZWxlYXNlKHNlbGYpOgogICAgICAgICAjTWFrZSBzdXJlIHJlbGVhc2Ugb2YgYW4gdW5sb2NrZWQgdGhyZWFkIHJhaXNlcyBfdGhyZWFkLmVycm9yCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhfdGhyZWFkLmVycm9yLCBzZWxmLmxvY2sucmVsZWFzZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoX3RocmVhZC5lcnJvciwgc2VsZi5sb2NrLnJlbGVhc2UpCiAKICAgICBkZWYgdGVzdF9jb25kX2FjcXVpcmVfc3VjY2VzcyhzZWxmKToKICAgICAgICAgI01ha2Ugc3VyZSB0aGUgY29uZGl0aW9uYWwgYWNxdWlyaW5nIG9mIHRoZSBsb2NrIHdvcmtzLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5sb2NrLmFjcXVpcmUoMCksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmxvY2suYWNxdWlyZSgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJDb25kaXRpb25hbCBhY3F1aXJpbmcgb2YgdGhlIGxvY2sgZmFpbGVkLiIpCiAKICAgICBkZWYgdGVzdF9jb25kX2FjcXVpcmVfZmFpbChzZWxmKToKICAgICAgICAgI1Rlc3QgYWNxdWlyaW5nIGxvY2tlZCBsb2NrIHJldHVybnMgRmFsc2UKICAgICAgICAgc2VsZi5sb2NrLmFjcXVpcmUoMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCBzZWxmLmxvY2suYWNxdWlyZSgwKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLmxvY2suYWNxdWlyZSgwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJDb25kaXRpb25hbCBhY3F1aXJpbmcgb2YgYSBsb2NrZWQgbG9jayBpbmNvcnJlY3RseSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2NlZWRlZC4iKQogCiAgICAgZGVmIHRlc3RfdW5jb25kX2FjcXVpcmVfc3VjY2VzcyhzZWxmKToKICAgICAgICAgI01ha2Ugc3VyZSB1bmNvbmRpdGlvbmFsIGFjcXVpcmluZyBvZiBhIGxvY2sgd29ya3MuCiAgICAgICAgIHNlbGYubG9jay5hY3F1aXJlKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYubG9jay5sb2NrZWQoKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubG9jay5sb2NrZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJVbmNvbmRpb25hbCBsb2NraW5nIGZhaWxlZC4iKQogCiAgICAgZGVmIHRlc3RfdW5jb25kX2FjcXVpcmVfcmV0dXJuX3ZhbChzZWxmKToKICAgICAgICAgI01ha2Ugc3VyZSB0aGF0IGFuIHVuY29uZGl0aW9uYWwgbG9ja2luZyByZXR1cm5zIFRydWUuCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLmxvY2suYWNxdWlyZSgxKSBpcyBUcnVlLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5sb2NrLmFjcXVpcmUoMSkgaXMgVHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICJVbmNvbmRpdGlvbmFsIGxvY2tpbmcgZGlkIG5vdCByZXR1cm4gVHJ1ZS4iKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5sb2NrLmFjcXVpcmUoKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5sb2NrLmFjcXVpcmUoKSBpcyBUcnVlKQogCiAgICAgZGVmIHRlc3RfdW5jb25kX2FjcXVpcmVfYmxvY2tpbmcoc2VsZik6CiAgICAgICAgICNNYWtlIHN1cmUgdGhhdCB1bmNvbmRpdGlvbmFsIGFjcXVpcmluZyBvZiBhIGxvY2tlZCBsb2NrIGJsb2Nrcy4KQEAgLTgwLDcgKzgwLDcgQEAKICAgICAgICAgZW5kX3RpbWUgPSBpbnQodGltZS50aW1lKCkpCiAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgogICAgICAgICAgICAgcHJpbnQgImRvbmUiCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygoZW5kX3RpbWUgLSBzdGFydF90aW1lKSA+PSBERUxBWSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChlbmRfdGltZSAtIHN0YXJ0X3RpbWUpID49IERFTEFZLAogICAgICAgICAgICAgICAgICAgICAgICAgIkJsb2NraW5nIGJ5IHVuY29uZGl0aW9uYWwgYWNxdWlyaW5nIGZhaWxlZC4iKQogCiBjbGFzcyBNaXNjVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtODgsMTggKzg4LDE4IEBACiAKICAgICBkZWYgdGVzdF9leGl0KHNlbGYpOgogICAgICAgICAjTWFrZSBzdXJlIF90aHJlYWQuZXhpdCgpIHJhaXNlcyBTeXN0ZW1FeGl0Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhTeXN0ZW1FeGl0LCBfdGhyZWFkLmV4aXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQsIF90aHJlYWQuZXhpdCkKIAogICAgIGRlZiB0ZXN0X2lkZW50KHNlbGYpOgogICAgICAgICAjVGVzdCBzYW5pdHkgb2YgX3RocmVhZC5nZXRfaWRlbnQoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShfdGhyZWFkLmdldF9pZGVudCgpLCBpbnQpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShfdGhyZWFkLmdldF9pZGVudCgpLCBpbnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgIl90aHJlYWQuZ2V0X2lkZW50KCkgcmV0dXJuZWQgYSBub24taW50ZWdlciIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhfdGhyZWFkLmdldF9pZGVudCgpICE9IDAsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfdGhyZWFkLmdldF9pZGVudCgpICE9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAiX3RocmVhZC5nZXRfaWRlbnQoKSByZXR1cm5lZCAwIikKIAogICAgIGRlZiB0ZXN0X0xvY2tUeXBlKHNlbGYpOgogICAgICAgICAjTWFrZSBzdXJlIF90aHJlYWQuTG9ja1R5cGUgaXMgdGhlIHNhbWUgdHlwZSBhcyBfdGhyZWFkLmFsbG9jYXRlX2xvY2tlKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoX3RocmVhZC5hbGxvY2F0ZV9sb2NrKCksIF90aHJlYWQuTG9ja1R5cGUpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShfdGhyZWFkLmFsbG9jYXRlX2xvY2soKSwgX3RocmVhZC5Mb2NrVHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAiX3RocmVhZC5Mb2NrVHlwZSBpcyBub3QgYW4gaW5zdGFuY2Ugb2Ygd2hhdCBpcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybmVkIGJ5IF90aHJlYWQuYWxsb2NhdGVfbG9jaygpIikKIApAQCAtMTA4LDEzICsxMDgsMTMgQEAKICAgICAgICAgIyBzaG91bGQgcmFpc2UgS2V5Ym9hcmRJbnRlcnJ1cHQgdXBvbiBjb21wbGV0aW9uLgogICAgICAgICBkZWYgY2FsbF9pbnRlcnJ1cHQoKToKICAgICAgICAgICAgIF90aHJlYWQuaW50ZXJydXB0X21haW4oKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoS2V5Ym9hcmRJbnRlcnJ1cHQsIF90aHJlYWQuc3RhcnRfbmV3X3RocmVhZCwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5Ym9hcmRJbnRlcnJ1cHQsIF90aHJlYWQuc3RhcnRfbmV3X3RocmVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxfaW50ZXJydXB0LCB0dXBsZSgpKQogCiAgICAgZGVmIHRlc3RfaW50ZXJydXB0X2luX21haW4oc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIHRoYXQgaWYgaW50ZXJydXB0X21haW4gaXMgY2FsbGVkIGluIG1haW4gdGhyZWF0IHRoYXQKICAgICAgICAgIyBLZXlib2FyZEludGVycnVwdCBpcyByYWlzZWQgaW5zdGFudGx5LgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoS2V5Ym9hcmRJbnRlcnJ1cHQsIF90aHJlYWQuaW50ZXJydXB0X21haW4pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleWJvYXJkSW50ZXJydXB0LCBfdGhyZWFkLmludGVycnVwdF9tYWluKQogCiBjbGFzcyBUaHJlYWRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgIiIiVGVzdCB0aHJlYWQgY3JlYXRpb24uIiIiCkBAIC0xMjgsMTYgKzEyOCwxNiBAQAogICAgICAgICB0ZXN0aW5nX3F1ZXVlID0gUXVldWUuUXVldWUoMSkKICAgICAgICAgX3RocmVhZC5zdGFydF9uZXdfdGhyZWFkKGFyZ190ZXN0ZXIsICh0ZXN0aW5nX3F1ZXVlLCBUcnVlLCBUcnVlKSkKICAgICAgICAgcmVzdWx0ID0gdGVzdGluZ19xdWV1ZS5nZXQoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVzdWx0WzBdIGFuZCByZXN1bHRbMV0sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHRbMF0gYW5kIHJlc3VsdFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCBwYXNzaW5nIGZvciB0aHJlYWQgY3JlYXRpb24gdXNpbmcgdHVwbGUgZmFpbGVkIikKICAgICAgICAgX3RocmVhZC5zdGFydF9uZXdfdGhyZWFkKGFyZ190ZXN0ZXIsIHR1cGxlKCksIHsncXVldWUnOnRlc3RpbmdfcXVldWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyZzEnOlRydWUsICdhcmcyJzpUcnVlfSkKICAgICAgICAgcmVzdWx0ID0gdGVzdGluZ19xdWV1ZS5nZXQoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVzdWx0WzBdIGFuZCByZXN1bHRbMV0sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXN1bHRbMF0gYW5kIHJlc3VsdFsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCBwYXNzaW5nIGZvciB0aHJlYWQgY3JlYXRpb24gdXNpbmcga3dhcmdzIGZhaWxlZCIpCiAgICAgICAgIF90aHJlYWQuc3RhcnRfbmV3X3RocmVhZChhcmdfdGVzdGVyLCAodGVzdGluZ19xdWV1ZSwgVHJ1ZSksIHsnYXJnMic6VHJ1ZX0pCiAgICAgICAgIHJlc3VsdCA9IHRlc3RpbmdfcXVldWUuZ2V0KCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlc3VsdFswXSBhbmQgcmVzdWx0WzFdLAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0WzBdIGFuZCByZXN1bHRbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAiQXJndW1lbnQgcGFzc2luZyBmb3IgdGhyZWFkIGNyZWF0aW9uIHVzaW5nIGJvdGggdHVwbGUiCiAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBrd2FyZ3MgZmFpbGVkIikKIApAQCAtMTY0LDcgKzE2NCw3IEBACiAgICAgICAgIHRpbWUuc2xlZXAoREVMQVkpCiAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgogICAgICAgICAgICAgcHJpbnQgJ2RvbmUnCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0ZXN0aW5nX3F1ZXVlLnFzaXplKCkgPT0gdGhyZWFkX2NvdW50LAorICAgICAgICBzZWxmLmFzc2VydFRydWUodGVzdGluZ19xdWV1ZS5xc2l6ZSgpID09IHRocmVhZF9jb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICJOb3QgYWxsICVzIHRocmVhZHMgZXhlY3V0ZWQgcHJvcGVybHkgYWZ0ZXIgJXMgc2VjLiIgJQogICAgICAgICAgICAgICAgICAgICAgICAgKHRocmVhZF9jb3VudCwgREVMQVkpKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Vwb2xsLnB5IGIvTGliL3Rlc3QvdGVzdF9lcG9sbC5weQppbmRleCAxNWM5ODY5Li5iMTEzNTQ3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Vwb2xsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZXBvbGwucHkKQEAgLTcxLDEwICs3MSwxMCBAQAogICAgICAgICAgICAgZXAgPSBzZWxlY3QuZXBvbGwoMTYpCiAgICAgICAgIGV4Y2VwdCBPU0Vycm9yLCBlOgogICAgICAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3Ioc3RyKGUpKQotICAgICAgICBzZWxmLmFzc2VydF8oZXAuZmlsZW5vKCkgPiAwLCBlcC5maWxlbm8oKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBlcC5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcC5maWxlbm8oKSA+IDAsIGVwLmZpbGVubygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGVwLmNsb3NlZCkKICAgICAgICAgZXAuY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8oZXAuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXAuY2xvc2VkKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBlcC5maWxlbm8pCiAKICAgICBkZWYgdGVzdF9iYWRjcmVhdGUoc2VsZik6CkBAIC0xNDEsNyArMTQxLDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZXAyLnBvbGwoMSwgNCkKICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGU6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChlLmFyZ3NbMF0sIGVycm5vLkVCQURGLCBlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmFyZ3NbMF0sIGVycm5vLkVCQURGLCBlKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJlcG9sbCBvbiBjbG9zZWQgZmQgZGlkbid0IHJhaXNlIEVCQURGIikKIApAQCAtMTU3LDcgKzE1Nyw3IEBACiAgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCiAgICAgICAgIGV2ZW50cyA9IGVwLnBvbGwoMSwgNCkKICAgICAgICAgdGhlbiA9IHRpbWUudGltZSgpCi0gICAgICAgIHNlbGYuZmFpbElmKHRoZW4gLSBub3cgPiAwLjEsIHRoZW4gLSBub3cpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGhlbiAtIG5vdyA+IDAuMSwgdGhlbiAtIG5vdykKIAogICAgICAgICBldmVudHMuc29ydCgpCiAgICAgICAgIGV4cGVjdGVkID0gWyhjbGllbnQuZmlsZW5vKCksIHNlbGVjdC5FUE9MTE9VVCksCkBAIC0xNjUsMTIgKzE2NSwxMiBAQAogICAgICAgICBleHBlY3RlZC5zb3J0KCkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhldmVudHMsIGV4cGVjdGVkKQotICAgICAgICBzZWxmLmZhaWxJZih0aGVuIC0gbm93ID4gMC4wMSwgdGhlbiAtIG5vdykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0aGVuIC0gbm93ID4gMC4wMSwgdGhlbiAtIG5vdykKIAogICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQogICAgICAgICBldmVudHMgPSBlcC5wb2xsKHRpbWVvdXQ9Mi4xLCBtYXhldmVudHM9NCkKICAgICAgICAgdGhlbiA9IHRpbWUudGltZSgpCi0gICAgICAgIHNlbGYuZmFpbElmKGV2ZW50cykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShldmVudHMpCiAKICAgICAgICAgY2xpZW50LnNlbmQoIkhlbGxvISIpCiAgICAgICAgIHNlcnZlci5zZW5kKCJ3b3JsZCEhISIpCkBAIC0xNzgsNyArMTc4LDcgQEAKICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKICAgICAgICAgZXZlbnRzID0gZXAucG9sbCgxLCA0KQogICAgICAgICB0aGVuID0gdGltZS50aW1lKCkKLSAgICAgICAgc2VsZi5mYWlsSWYodGhlbiAtIG5vdyA+IDAuMDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGhlbiAtIG5vdyA+IDAuMDEpCiAKICAgICAgICAgZXZlbnRzLnNvcnQoKQogICAgICAgICBleHBlY3RlZCA9IFsoY2xpZW50LmZpbGVubygpLCBzZWxlY3QuRVBPTExJTiB8IHNlbGVjdC5FUE9MTE9VVCksCkBAIC0xOTIsNyArMTkyLDcgQEAKICAgICAgICAgbm93ID0gdGltZS50aW1lKCkKICAgICAgICAgZXZlbnRzID0gZXAucG9sbCgxLCA0KQogICAgICAgICB0aGVuID0gdGltZS50aW1lKCkKLSAgICAgICAgc2VsZi5mYWlsSWYodGhlbiAtIG5vdyA+IDAuMDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodGhlbiAtIG5vdyA+IDAuMDEpCiAKICAgICAgICAgZXhwZWN0ZWQgPSBbKHNlcnZlci5maWxlbm8oKSwgc2VsZWN0LkVQT0xMT1VUKV0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXZlbnRzLCBleHBlY3RlZCkKQEAgLTIxMSw3ICsyMTEsNyBAQAogICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQogICAgICAgICBldmVudHMgPSBlcC5wb2xsKDEsIDQpCiAgICAgICAgIHRoZW4gPSB0aW1lLnRpbWUoKQotICAgICAgICBzZWxmLmZhaWxJZih0aGVuIC0gbm93ID4gMC4wMSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0aGVuIC0gbm93ID4gMC4wMSkKIAogICAgICAgICBzZXJ2ZXIuY2xvc2UoKQogICAgICAgICBlcC51bnJlZ2lzdGVyKGZkKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lcnJuby5weSBiL0xpYi90ZXN0L3Rlc3RfZXJybm8ucHkKaW5kZXggOTUyMzkwNy4uNGFkYzFmMCAxMDA3NTUKLS0tIGEvTGliL3Rlc3QvdGVzdF9lcnJuby5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Vycm5vLnB5CkBAIC0xNCwxMyArMTQsMTMgQEAKICAgICBkZWYgdGVzdF9mb3JfaW1wcm9wZXJfYXR0cmlidXRlcyhzZWxmKToKICAgICAgICAgIyBObyB1bmV4cGVjdGVkIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIG9uIHRoZSBtb2R1bGUuCiAgICAgICAgIGZvciBlcnJvcl9jb2RlIGluIHN0ZF9jX2Vycm9yczoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhoYXNhdHRyKGVycm5vLCBlcnJvcl9jb2RlKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKGVycm5vLCBlcnJvcl9jb2RlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXJybm8gaXMgbWlzc2luZyAlcyIgJSBlcnJvcl9jb2RlKQogCiAgICAgZGVmIHRlc3RfdXNpbmdfZXJyb3Jjb2RlKHNlbGYpOgogICAgICAgICAjIEV2ZXJ5IGtleSB2YWx1ZSBpbiBlcnJuby5lcnJvcmNvZGUgc2hvdWxkIGJlIG9uIHRoZSBtb2R1bGUuCiAgICAgICAgIGZvciB2YWx1ZSBpbiBlcnJuby5lcnJvcmNvZGUuaXRlcnZhbHVlcygpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIoZXJybm8sIHZhbHVlKSwgJ25vICVzIGF0dHIgaW4gZXJybm8nICUgdmFsdWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihlcnJubywgdmFsdWUpLCAnbm8gJXMgYXR0ciBpbiBlcnJubycgJSB2YWx1ZSkKIAogCiBjbGFzcyBFcnJvcmNvZGVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0yOCw3ICsyOCw3IEBACiAgICAgZGVmIHRlc3RfYXR0cmlidXRlc19pbl9lcnJvcmNvZGUoc2VsZik6CiAgICAgICAgIGZvciBhdHRyaWJ1dGUgaW4gZXJybm8uX19kaWN0X18uaXRlcmtleXMoKToKICAgICAgICAgICAgIGlmIGF0dHJpYnV0ZS5pc3VwcGVyKCk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGdldGF0dHIoZXJybm8sIGF0dHJpYnV0ZSkgaW4gZXJybm8uZXJyb3Jjb2RlLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnZXRhdHRyKGVycm5vLCBhdHRyaWJ1dGUpIGluIGVycm5vLmVycm9yY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vICVzIGF0dHIgaW4gZXJybm8uZXJyb3Jjb2RlJyAlIGF0dHJpYnV0ZSkKIAogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkgYi9MaWIvdGVzdC90ZXN0X2V4Y2VwdGlvbnMucHkKaW5kZXggMDZhMjM3OC4uNmNmYmQwOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9leGNlcHRpb25zLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZXhjZXB0aW9ucy5weQpAQCAtMTYyLDcgKzE2Miw3IEBACiAgICAgICAgICAgICAgICAgZXhjLCBlcnIsIHRiID0gc3lzLmV4Y19pbmZvKCkKICAgICAgICAgICAgICAgICBjbyA9IHRiLnRiX2ZyYW1lLmZfY29kZQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvLmNvX25hbWUsICJ0ZXN0X2NhcGkxIikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oY28uY29fZmlsZW5hbWUuZW5kc3dpdGgoJ3Rlc3RfZXhjZXB0aW9ucycrb3MuZXh0c2VwKydweScpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjby5jb19maWxlbmFtZS5lbmRzd2l0aCgndGVzdF9leGNlcHRpb25zJytvcy5leHRzZXArJ3B5JykpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiRXhwZWN0ZWQgZXhjZXB0aW9uIikKIApAQCAtMTc0LDcgKzE3NCw3IEBACiAgICAgICAgICAgICAgICAgZXhjLCBlcnIsIHRiID0gc3lzLmV4Y19pbmZvKCkKICAgICAgICAgICAgICAgICBjbyA9IHRiLnRiX2ZyYW1lLmZfY29kZQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvLmNvX25hbWUsICJfX2luaXRfXyIpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNvLmNvX2ZpbGVuYW1lLmVuZHN3aXRoKCd0ZXN0X2V4Y2VwdGlvbnMnK29zLmV4dHNlcCsncHknKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY28uY29fZmlsZW5hbWUuZW5kc3dpdGgoJ3Rlc3RfZXhjZXB0aW9ucycrb3MuZXh0c2VwKydweScpKQogICAgICAgICAgICAgICAgIGNvMiA9IHRiLnRiX2ZyYW1lLmZfYmFjay5mX2NvZGUKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhjbzIuY29fbmFtZSwgInRlc3RfY2FwaTIiKQogICAgICAgICAgICAgZWxzZToKQEAgLTE5MCwxMiArMTkwLDEyIEBACiAgICAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHIoV2luZG93c0Vycm9yKDEwMDEpKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKFdpbmRvd3NFcnJvcigxMDAxKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMTAwMSIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHIoV2luZG93c0Vycm9yKDEwMDEsICJtZXNzYWdlIikpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoV2luZG93c0Vycm9yKDEwMDEsICJtZXNzYWdlIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIltFcnJvciAxMDAxXSBtZXNzYWdlIikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFdpbmRvd3NFcnJvcigxMDAxLCAibWVzc2FnZSIpLmVycm5vLCAyMikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFdpbmRvd3NFcnJvcigxMDAxLCAibWVzc2FnZSIpLndpbmVycm9yLCAxMDAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChXaW5kb3dzRXJyb3IoMTAwMSwgIm1lc3NhZ2UiKS5lcnJubywgMjIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFdpbmRvd3NFcnJvcigxMDAxLCAibWVzc2FnZSIpLndpbmVycm9yLCAxMDAxKQogCiAgICAgZGVmIHRlc3RBdHRyaWJ1dGVzKHNlbGYpOgogICAgICAgICAjIHRlc3QgdGhhdCBleGNlcHRpb24gYXR0cmlidXRlcyBhcmUgaGFwcHkKQEAgLTMwOCw3ICszMDgsNyBAQAogICAgICAgICAjIGdvaW5nIHRocm91Z2ggdGhlICdhcmdzJyBhdHRyaWJ1dGUuCiAgICAgICAgIGFyZ3MgPSAoMSwgMiwgMykKICAgICAgICAgZXhjID0gQmFzZUV4Y2VwdGlvbigqYXJncykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhjWzpdLCBhcmdzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4Y1s6XSwgYXJncykKIAogICAgIGRlZiB0ZXN0S2V5d29yZEFyZ3Moc2VsZik6CiAgICAgICAgICMgdGVzdCB0aGF0IGJ1aWx0aW4gZXhjZXB0aW9uIGRvbid0IHRha2Uga2V5d29yZCBhcmdzLApAQCAtMzUwLDExICszNTAsMTEgQEAKICAgICBkZWYgdGVzdFVuaWNvZGVTdHJVc2FnZShzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgYm90aCBpbnN0YW5jZXMgYW5kIGNsYXNzZXMgaGF2ZSBhIHN0ciBhbmQgdW5pY29kZQogICAgICAgICAjIHJlcHJlc2VudGF0aW9uLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RyKEV4Y2VwdGlvbikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh1bmljb2RlKEV4Y2VwdGlvbikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHIoRXhjZXB0aW9uKCdhJykpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModW5pY29kZShFeGNlcHRpb24odSdhJykpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModW5pY29kZShFeGNlcHRpb24odSdceGUxJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyKEV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bmljb2RlKEV4Y2VwdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHIoRXhjZXB0aW9uKCdhJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZShFeGNlcHRpb24odSdhJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZShFeGNlcHRpb24odSdceGUxJykpKQogCiAgICAgZGVmIHRlc3RfYmFkaXNpbnN0YW5jZShzZWxmKToKICAgICAgICAgIyBCdWcgIzI1NDI6IGlmIGlzc3ViY2xhc3MoZSwgTXlFeGNlcHRpb24pIHJhaXNlcyBhbiBleGNlcHRpb24sCkBAIC0zODYsOCArMzg2LDggQEAKICAgICAgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgogICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3lzLmV4Y19pbmZvKCkKICAgICAgICAgICAgIGUsIHYsIHRiID0gZygpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZSBpcyBSdW50aW1lRXJyb3IsIGUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oIm1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGV4Y2VlZGVkIiBpbiBzdHIodiksIHYpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZSBpcyBSdW50aW1lRXJyb3IsIGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoIm1heGltdW0gcmVjdXJzaW9uIGRlcHRoIGV4Y2VlZGVkIiBpbiBzdHIodiksIHYpCiAKIAogZGVmIHRlc3RfbWFpbigpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9maWxlLnB5IGIvTGliL3Rlc3QvdGVzdF9maWxlLnB5CmluZGV4IDE5NzRmNTYuLjdkM2U3MmQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKQEAgLTg4LDEzICs4OCwxMyBAQAogICAgIGRlZiB0ZXN0RXJyb3JzKHNlbGYpOgogICAgICAgICBmID0gc2VsZi5mCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGYubmFtZSwgVEVTVEZOKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGYuaXNhdHR5KCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZi5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZi5pc2F0dHkoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmLmNsb3NlZCkKIAogICAgICAgICBpZiBoYXNhdHRyKGYsICJyZWFkaW50byIpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoKElPRXJyb3IsIFR5cGVFcnJvciksIGYucmVhZGludG8sICIiKQogICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGYuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCiAKICAgICBkZWYgdGVzdE1ldGhvZHMoc2VsZik6CiAgICAgICAgIG1ldGhvZHMgPSBbKCdmaWxlbm8nLCAoKSksCkBAIC0xMTYsNyArMTE2LDcgQEAKIAogICAgICAgICAjIF9fZXhpdF9fIHNob3VsZCBjbG9zZSB0aGUgZmlsZQogICAgICAgICBzZWxmLmYuX19leGl0X18oTm9uZSwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuZi5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmYuY2xvc2VkKQogCiAgICAgICAgIGZvciBtZXRob2RuYW1lLCBhcmdzIGluIG1ldGhvZHM6CiAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYuZiwgbWV0aG9kbmFtZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmlsZTJrLnB5IGIvTGliL3Rlc3QvdGVzdF9maWxlMmsucHkKaW5kZXggYTEzNGE4OS4uNjUyMDI5MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9maWxlMmsucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9maWxlMmsucHkKQEAgLTgzLDE3ICs4MywxNyBAQAogCiAgICAgZGVmIHRlc3RSZXByKHNlbGYpOgogICAgICAgICAjIHZlcmlmeSByZXByIHdvcmtzCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZXByKHNlbGYuZikuc3RhcnRzd2l0aCgiPG9wZW4gZmlsZSAnIiArIFRFU1RGTikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKHNlbGYuZikuc3RhcnRzd2l0aCgiPG9wZW4gZmlsZSAnIiArIFRFU1RGTikpCiAKICAgICBkZWYgdGVzdEVycm9ycyhzZWxmKToKICAgICAgICAgZiA9IHNlbGYuZgogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmLm5hbWUsIFRFU1RGTikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBmLmlzYXR0eSgpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGYuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGYuaXNhdHR5KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZi5jbG9zZWQpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBmLnJlYWRpbnRvLCAiIikKICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhmLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuY2xvc2VkKQogCiAgICAgZGVmIHRlc3RNZXRob2RzKHNlbGYpOgogICAgICAgICBtZXRob2RzID0gWydmaWxlbm8nLCAnZmx1c2gnLCAnaXNhdHR5JywgJ25leHQnLCAncmVhZCcsICdyZWFkaW50bycsCkBAIC0xMDQsNyArMTA0LDcgQEAKIAogICAgICAgICAjIF9fZXhpdF9fIHNob3VsZCBjbG9zZSB0aGUgZmlsZQogICAgICAgICBzZWxmLmYuX19leGl0X18oTm9uZSwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuZi5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmYuY2xvc2VkKQogCiAgICAgICAgIGZvciBtZXRob2RuYW1lIGluIG1ldGhvZHM6CiAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYuZiwgbWV0aG9kbmFtZSkKQEAgLTE3Miw3ICsxNzIsNyBAQAogICAgIGRlZiB0ZXN0VW5pY29kZU9wZW4oc2VsZik6CiAgICAgICAgICMgdmVyaWZ5IHJlcHIgd29ya3MgZm9yIHVuaWNvZGUgdG9vCiAgICAgICAgIGYgPSBvcGVuKHVuaWNvZGUoVEVTVEZOKSwgInciKQotICAgICAgICBzZWxmLmFzc2VydF8ocmVwcihmKS5zdGFydHN3aXRoKCI8b3BlbiBmaWxlIHUnIiArIFRFU1RGTikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGYpLnN0YXJ0c3dpdGgoIjxvcGVuIGZpbGUgdSciICsgVEVTVEZOKSkKICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgIG9zLnVubGluayhURVNURk4pCiAKQEAgLTM2NSw3ICszNjUsNyBAQAogCiAgICAgICAgIHdpdGggQyhURVNURk4sICd3JykgYXMgZjoKICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGYuc3ViY2xhc3NfY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5zdWJjbGFzc19jbG9zZWQpCiAKIAogY2xhc3MgRmlsZVRocmVhZGluZ1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmlsZWNtcC5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZWNtcC5weQppbmRleCA1MDM1NjJiLi5mNzZiYTBiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZpbGVjbXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9maWxlY21wLnB5CkBAIC0yNSwxOSArMjUsMTkgQEAKICAgICAgICAgb3MudW5saW5rKHNlbGYubmFtZV9kaWZmKQogCiAgICAgZGVmIHRlc3RfbWF0Y2hpbmcoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYubmFtZV9zYW1lKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVjbXAuY21wKHNlbGYubmFtZSwgc2VsZi5uYW1lX3NhbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBhcmluZyBmaWxlIHRvIGl0c2VsZiBmYWlscyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYubmFtZV9zYW1lLCBzaGFsbG93PUZhbHNlKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVjbXAuY21wKHNlbGYubmFtZSwgc2VsZi5uYW1lX3NhbWUsIHNoYWxsb3c9RmFsc2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBhcmluZyBmaWxlIHRvIGl0c2VsZiBmYWlscyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYubmFtZSwgc2hhbGxvdz1GYWxzZSksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYubmFtZSwgc2hhbGxvdz1GYWxzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFyaW5nIGZpbGUgdG8gaWRlbnRpY2FsIGZpbGUgZmFpbHMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZmlsZWNtcC5jbXAoc2VsZi5uYW1lLCBzZWxmLm5hbWUpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmlsZWNtcC5jbXAoc2VsZi5uYW1lLCBzZWxmLm5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBhcmluZyBmaWxlIHRvIGlkZW50aWNhbCBmaWxlIGZhaWxzIikKIAogICAgIGRlZiB0ZXN0X2RpZmZlcmVudChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsSWYoZmlsZWNtcC5jbXAoc2VsZi5uYW1lLCBzZWxmLm5hbWVfZGlmZiksCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmlsZWNtcC5jbXAoc2VsZi5uYW1lLCBzZWxmLm5hbWVfZGlmZiksCiAgICAgICAgICAgICAgICAgICAgICJNaXNtYXRjaGVkIGZpbGVzIGNvbXBhcmUgYXMgZXF1YWwiKQotICAgICAgICBzZWxmLmZhaWxJZihmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYuZGlyKSwKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmaWxlY21wLmNtcChzZWxmLm5hbWUsIHNlbGYuZGlyKSwKICAgICAgICAgICAgICAgICAgICAgIkZpbGUgYW5kIGRpcmVjdG9yeSBjb21wYXJlIGFzIGVxdWFsIikKIAogY2xhc3MgRGlyQ29tcGFyZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKQEAgLTY5LDE5ICs2OSwxOSBAQAogICAgICAgICBzaHV0aWwucm10cmVlKHNlbGYuZGlyX2RpZmYpCiAKICAgICBkZWYgdGVzdF9jbXBmaWxlcyhzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGZpbGVjbXAuY21wZmlsZXMoc2VsZi5kaXIsIHNlbGYuZGlyLCBbJ2ZpbGUnXSkgPT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVjbXAuY21wZmlsZXMoc2VsZi5kaXIsIHNlbGYuZGlyLCBbJ2ZpbGUnXSkgPT0KICAgICAgICAgICAgICAgICAgICAgICAgIChbJ2ZpbGUnXSwgW10sIFtdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJDb21wYXJpbmcgZGlyZWN0b3J5IHRvIGl0c2VsZiBmYWlscyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmaWxlY21wLmNtcGZpbGVzKHNlbGYuZGlyLCBzZWxmLmRpcl9zYW1lLCBbJ2ZpbGUnXSkgPT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVjbXAuY21wZmlsZXMoc2VsZi5kaXIsIHNlbGYuZGlyX3NhbWUsIFsnZmlsZSddKSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgKFsnZmlsZSddLCBbXSwgW10pLAogICAgICAgICAgICAgICAgICAgICAgICAgIkNvbXBhcmluZyBkaXJlY3RvcnkgdG8gc2FtZSBmYWlscyIpCiAKICAgICAgICAgIyBUcnkgaXQgd2l0aCBzaGFsbG93PUZhbHNlCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmaWxlY21wLmNtcGZpbGVzKHNlbGYuZGlyLCBzZWxmLmRpciwgWydmaWxlJ10sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlY21wLmNtcGZpbGVzKHNlbGYuZGlyLCBzZWxmLmRpciwgWydmaWxlJ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWxsb3c9RmFsc2UpID09CiAgICAgICAgICAgICAgICAgICAgICAgICAoWydmaWxlJ10sIFtdLCBbXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFyaW5nIGRpcmVjdG9yeSB0byBpdHNlbGYgZmFpbHMiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZmlsZWNtcC5jbXBmaWxlcyhzZWxmLmRpciwgc2VsZi5kaXJfc2FtZSwgWydmaWxlJ10sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlY21wLmNtcGZpbGVzKHNlbGYuZGlyLCBzZWxmLmRpcl9zYW1lLCBbJ2ZpbGUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhbGxvdz1GYWxzZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ29tcGFyaW5nIGRpcmVjdG9yeSB0byBzYW1lIGZhaWxzIikKIApAQCAtOTAsNyArOTAsNyBAQAogICAgICAgICBvdXRwdXQud3JpdGUoJ0RpZmZlcmVudCBjb250ZW50cy5cbicpCiAgICAgICAgIG91dHB1dC5jbG9zZSgpCiAKLSAgICAgICAgc2VsZi5mYWlsSWYoZmlsZWNtcC5jbXBmaWxlcyhzZWxmLmRpciwgc2VsZi5kaXJfc2FtZSwKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmaWxlY21wLmNtcGZpbGVzKHNlbGYuZGlyLCBzZWxmLmRpcl9zYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsnZmlsZScsICdmaWxlMiddKSA9PQogICAgICAgICAgICAgICAgICAgICAoWydmaWxlJ10sIFsnZmlsZTInXSwgW10pLAogICAgICAgICAgICAgICAgICAgICAiQ29tcGFyaW5nIG1pc21hdGNoZWQgZGlyZWN0b3JpZXMgZmFpbHMiKQpAQCAtMTAzLDI4ICsxMDMsMjggQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2QubGVmdF9saXN0LCBkLnJpZ2h0X2xpc3RdLFtbJ2ZpbGUnXSwgWydGaUxlJ11dKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbZC5sZWZ0X2xpc3QsIGQucmlnaHRfbGlzdF0sW1snZmlsZSddLCBbJ2ZpbGUnXV0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkLmNvbW1vbiA9PSBbJ2ZpbGUnXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQubGVmdF9vbmx5ID09IGQucmlnaHRfb25seSA9PSBbXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQuc2FtZV9maWxlcyA9PSBbJ2ZpbGUnXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQuZGlmZl9maWxlcyA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuY29tbW9uID09IFsnZmlsZSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5sZWZ0X29ubHkgPT0gZC5yaWdodF9vbmx5ID09IFtdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5zYW1lX2ZpbGVzID09IFsnZmlsZSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5kaWZmX2ZpbGVzID09IFtdKQogCiAgICAgICAgICMgQ2hlY2sgYXR0cmlidXRlcyBmb3IgY29tcGFyaXNvbiBvZiB0d28gZGlmZmVyZW50IGRpcmVjdG9yaWVzCiAgICAgICAgIGQgPSBmaWxlY21wLmRpcmNtcChzZWxmLmRpciwgc2VsZi5kaXJfZGlmZikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQubGVmdF9saXN0ID09IFsnZmlsZSddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZC5yaWdodF9saXN0ID09IFsnZmlsZScsICdmaWxlMiddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZC5jb21tb24gPT0gWydmaWxlJ10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkLmxlZnRfb25seSA9PSBbXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQucmlnaHRfb25seSA9PSBbJ2ZpbGUyJ10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkLnNhbWVfZmlsZXMgPT0gWydmaWxlJ10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkLmRpZmZfZmlsZXMgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmxlZnRfbGlzdCA9PSBbJ2ZpbGUnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQucmlnaHRfbGlzdCA9PSBbJ2ZpbGUnLCAnZmlsZTInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQuY29tbW9uID09IFsnZmlsZSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5sZWZ0X29ubHkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLnJpZ2h0X29ubHkgPT0gWydmaWxlMiddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5zYW1lX2ZpbGVzID09IFsnZmlsZSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5kaWZmX2ZpbGVzID09IFtdKQogCiAgICAgICAgICMgQWRkIGRpZmZlcmVudCBmaWxlMgogICAgICAgICBvdXRwdXQgPSBvcGVuKG9zLnBhdGguam9pbihzZWxmLmRpciwgJ2ZpbGUyJyksICd3JykKICAgICAgICAgb3V0cHV0LndyaXRlKCdEaWZmZXJlbnQgY29udGVudHMuXG4nKQogICAgICAgICBvdXRwdXQuY2xvc2UoKQogICAgICAgICBkID0gZmlsZWNtcC5kaXJjbXAoc2VsZi5kaXIsIHNlbGYuZGlyX2RpZmYpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkLnNhbWVfZmlsZXMgPT0gWydmaWxlJ10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkLmRpZmZfZmlsZXMgPT0gWydmaWxlMiddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5zYW1lX2ZpbGVzID09IFsnZmlsZSddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5kaWZmX2ZpbGVzID09IFsnZmlsZTInXSkKIAogCiBkZWYgdGVzdF9tYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGVpbnB1dC5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CmluZGV4IDlmYjNlYTcuLjg0YWVkMWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5CkBAIC02NSw4ICs2NSw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZW5hbWUoKSwgdDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkubGluZW5vKCksIDIxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVsaW5lbm8oKSwgNikKLSAgICAgICAgc2VsZi5mYWlsSWYoZmkuaXNmaXJzdGxpbmUoKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoZmkuaXNzdGRpbigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGZpLmlzZmlyc3RsaW5lKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmkuaXNzdGRpbigpKQogCiAgICAgICAgIGlmIHZlcmJvc2U6CiAgICAgICAgICAgICBwcmludCAnJXMuIE5leHRmaWxlIChicz0lcyknICUgKHN0YXJ0KzIsIGJzKQpAQCAtMTM0LDcgKzEzNCw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVuYW1lKCksIHQzKQogCiAgICAgICAgICAgICBsaW5lID0gZmkucmVhZGxpbmUoKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYobGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobGluZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkubGluZW5vKCksIDEpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpLmZpbGVsaW5lbm8oKSwgMCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmkuZmlsZW5hbWUoKSwgdDQpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZpbGVpby5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlvLnB5CmluZGV4IGU4ZDYzNjIuLjg3YmYwMTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmlsZWlvLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZmlsZWlvLnB5CkBAIC04MiwxNyArODIsMTcgQEAKIAogICAgIGRlZiB0ZXN0RXJyb3JzKHNlbGYpOgogICAgICAgICBmID0gc2VsZi5mCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZi5pc2F0dHkoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBmLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmLmlzYXR0eSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGYuY2xvc2VkKQogICAgICAgICAjc2VsZi5hc3NlcnRFcXVhbHMoZi5uYW1lLCBURVNURk4pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGYucmVhZCwgMTApICMgT3BlbiBmb3IgcmVhZGluZwogICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGYuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCiAgICAgICAgIGYgPSBfRmlsZUlPKFRFU1RGTiwgJ3InKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGYucmVhZGludG8sICIiKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGYuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGYuY2xvc2VkKQogICAgICAgICBmLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGYuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCiAKICAgICBkZWYgdGVzdE1ldGhvZHMoc2VsZik6CiAgICAgICAgIG1ldGhvZHMgPSBbJ2ZpbGVubycsICdpc2F0dHknLCAncmVhZCcsICdyZWFkaW50bycsCkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICAgICAgICAgIG1ldGhvZHMucmVtb3ZlKCd0cnVuY2F0ZScpCiAKICAgICAgICAgc2VsZi5mLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuZi5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmYuY2xvc2VkKQogCiAgICAgICAgIGZvciBtZXRob2RuYW1lIGluIG1ldGhvZHM6CiAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYuZiwgbWV0aG9kbmFtZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmxvYXQucHkgYi9MaWIvdGVzdC90ZXN0X2Zsb2F0LnB5CmluZGV4IDM0NWE4MTUuLjg0NGE2NDkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZmxvYXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mbG9hdC5weQpAQCAtMTQ4LDkgKzE0OCw5IEBACiAgICAgICAgIGZsb2F0Ll9fc2V0Zm9ybWF0X18oJ2Zsb2F0Jywgc2VsZi5zYXZlX2Zvcm1hdHNbJ2Zsb2F0J10pCiAKICAgICBkZWYgdGVzdF9nZXRmb3JtYXQoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhmbG9hdC5fX2dldGZvcm1hdF9fKCdkb3VibGUnKSBpbgorICAgICAgICBzZWxmLmFzc2VydFRydWUoZmxvYXQuX19nZXRmb3JtYXRfXygnZG91YmxlJykgaW4KICAgICAgICAgICAgICAgICAgICAgIFsndW5rbm93bicsICdJRUVFLCBiaWctZW5kaWFuJywgJ0lFRUUsIGxpdHRsZS1lbmRpYW4nXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGZsb2F0Ll9fZ2V0Zm9ybWF0X18oJ2Zsb2F0JykgaW4KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZsb2F0Ll9fZ2V0Zm9ybWF0X18oJ2Zsb2F0JykgaW4KICAgICAgICAgICAgICAgICAgICAgIFsndW5rbm93bicsICdJRUVFLCBiaWctZW5kaWFuJywgJ0lFRUUsIGxpdHRsZS1lbmRpYW4nXSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgZmxvYXQuX19nZXRmb3JtYXRfXywgJ2NoaWNrZW4nKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGZsb2F0Ll9fZ2V0Zm9ybWF0X18sIDEpCkBAIC0zNDAsMTIgKzM0MCwxMiBAQAogIyB3YXlzIHRvIGNyZWF0ZSBhbmQgcmVwcmVzZW50IGluZiBhbmQgbmFuCiBjbGFzcyBJbmZOYW5UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF9pbmZfZnJvbV9zdHIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luZihmbG9hdCgiaW5mIikpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbmYoZmxvYXQoIitpbmYiKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luZihmbG9hdCgiLWluZiIpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5mKGZsb2F0KCJpbmZpbml0eSIpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5mKGZsb2F0KCIraW5maW5pdHkiKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luZihmbG9hdCgiLWluZmluaXR5IikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYoZmxvYXQoImluZiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5mKGZsb2F0KCIraW5mIikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYoZmxvYXQoIi1pbmYiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luZihmbG9hdCgiaW5maW5pdHkiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luZihmbG9hdCgiK2luZmluaXR5IikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYoZmxvYXQoIi1pbmZpbml0eSIpKSkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIoZmxvYXQoImluZiIpKSwgImluZiIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmbG9hdCgiK2luZiIpKSwgImluZiIpCkBAIC0zODcsOSArMzg3LDkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoLTFlMzAwICogMWUzMDApLCAiLWluZiIpCiAKICAgICBkZWYgdGVzdF9uYW5fZnJvbV9zdHIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc25hbihmbG9hdCgibmFuIikpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNuYW4oZmxvYXQoIituYW4iKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc25hbihmbG9hdCgiLW5hbiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKGZsb2F0KCJuYW4iKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihmbG9hdCgiK25hbiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKGZsb2F0KCItbmFuIikpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihmbG9hdCgibmFuIikpLCAibmFuIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXByKGZsb2F0KCIrbmFuIikpLCAibmFuIikKQEAgLTQxOCwxNCArNDE4LDE0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKC0xZTMwMCAqIDFlMzAwICogMCksICJuYW4iKQogCiAgICAgZGVmIG5vdGVzdF9mbG9hdF9uYW4oc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhOQU4uaXNfbmFuKCkpCi0gICAgICAgIHNlbGYuZmFpbElmKElORi5pc19uYW4oKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoKDAuKS5pc19uYW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKE5BTi5pc19uYW4oKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShJTkYuaXNfbmFuKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoKDAuKS5pc19uYW4oKSkKIAogICAgIGRlZiBub3Rlc3RfZmxvYXRfaW5mKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oSU5GLmlzX2luZigpKQotICAgICAgICBzZWxmLmZhaWxJZihOQU4uaXNfaW5mKCkpCi0gICAgICAgIHNlbGYuZmFpbElmKCgwLikuaXNfaW5mKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShJTkYuaXNfaW5mKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoTkFOLmlzX2luZigpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCgwLikuaXNfaW5mKCkpCiAKIGZyb21IZXggPSBmbG9hdC5mcm9taGV4CiB0b0hleCA9IGZsb2F0LmhleApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mbm1hdGNoLnB5IGIvTGliL3Rlc3QvdGVzdF9mbm1hdGNoLnB5CmluZGV4IDlhYmNiZDYuLmU2MTczZWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZm5tYXRjaC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ZubWF0Y2gucHkKQEAgLTksMTEgKzksMTEgQEAKIGNsYXNzIEZubWF0Y2hUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIGNoZWNrX21hdGNoKHNlbGYsIGZpbGVuYW1lLCBwYXR0ZXJuLCBzaG91bGRfbWF0Y2g9MSk6CiAgICAgICAgIGlmIHNob3VsZF9tYXRjaDoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhmbm1hdGNoKGZpbGVuYW1lLCBwYXR0ZXJuKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmbm1hdGNoKGZpbGVuYW1lLCBwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJXIgdG8gbWF0Y2ggcGF0dGVybiAlciIKICAgICAgICAgICAgICAgICAgICAgICAgICAlIChmaWxlbmFtZSwgcGF0dGVybikpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IGZubWF0Y2goZmlsZW5hbWUsIHBhdHRlcm4pLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBmbm1hdGNoKGZpbGVuYW1lLCBwYXR0ZXJuKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJXIgbm90IHRvIG1hdGNoIHBhdHRlcm4gJXIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoZmlsZW5hbWUsIHBhdHRlcm4pKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Z0cGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfZnRwbGliLnB5CmluZGV4IGM0ODQ5N2QuLjhiMGJiMDcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZnRwbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZnRwbGliLnB5CkBAIC00MzgsNyArNDM4LDcgQEAKIAogICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CiAgICAgICAgICMgZGVmYXVsdCAtLSB1c2UgZ2xvYmFsIHNvY2tldCB0aW1lb3V0Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmdHAgPSBmdHBsaWIuRlRQKCJsb2NhbGhvc3QiKQpAQCAtNDUwLDcgKzQ1MCw3IEBACiAKICAgICBkZWYgdGVzdFRpbWVvdXROb25lKHNlbGYpOgogICAgICAgICAjIG5vIHRpbWVvdXQgLS0gZG8gbm90IHVzZSBnbG9iYWwgc29ja2V0IHRpbWVvdXQKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQogICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoMzApCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGZ0cCA9IGZ0cGxpYi5GVFAoImxvY2FsaG9zdCIsIHRpbWVvdXQ9Tm9uZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnVuY2F0dHJzLnB5IGIvTGliL3Rlc3QvdGVzdF9mdW5jYXR0cnMucHkKaW5kZXggMjk2MWNkMi4uNjM1MGFhZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mdW5jYXR0cnMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mdW5jYXR0cnMucHkKQEAgLTMxLDE0ICszMSwxNCBAQAogCiAgICAgZGVmIHRlc3RfZGlyX2luY2x1ZGVzX2NvcnJlY3RfYXR0cnMoc2VsZik6CiAgICAgICAgIHNlbGYuYi5rbm93bl9hdHRyID0gNwotICAgICAgICBzZWxmLmFzc2VydF8oJ2tub3duX2F0dHInIGluIGRpcihzZWxmLmIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2tub3duX2F0dHInIGluIGRpcihzZWxmLmIpLAogICAgICAgICAgICAgInNldCBhdHRyaWJ1dGVzIG5vdCBpbiBkaXIgbGlzdGluZyBvZiBtZXRob2QiKQogICAgICAgICAjIFRlc3Qgb24gdW5kZXJseWluZyBmdW5jdGlvbiBvYmplY3Qgb2YgbWV0aG9kCiAgICAgICAgIHNlbGYuZi5hLmltX2Z1bmMua25vd25fYXR0ciA9IDcKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdrbm93bl9hdHRyJyBpbiBkaXIoc2VsZi5mLmEpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2tub3duX2F0dHInIGluIGRpcihzZWxmLmYuYSksCiAgICAgICAgICAgICAic2V0IGF0dHJpYnV0ZSBvbiB1bmJvdW5kIG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBpbiBjbGFzcyBub3QgaW4gIgogICAgICAgICAgICAgICAgICAgICAgImRpciIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xygna25vd25fYXR0cicgaW4gZGlyKHNlbGYuZmkuYSksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgna25vd25fYXR0cicgaW4gZGlyKHNlbGYuZmkuYSksCiAgICAgICAgICAgICAic2V0IGF0dHJpYnV0ZSBvbiB1bmJvdW5kIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMsIHNob3VsZCBzaG93IHVwIgogICAgICAgICAgICAgICAgICAgICAgIiBpbiBuZXh0IGRpciIpCiAKQEAgLTI3OSwxMCArMjc5LDEwIEBACiAgICAgICAgICAgICBwYXNzCiAKICAgICAgICAgYyA9IGNsYXNzbWV0aG9kKGYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhjLl9fZnVuY19fIGlzIGYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjLl9fZnVuY19fIGlzIGYpCiAKICAgICAgICAgcyA9IHN0YXRpY21ldGhvZChmKQotICAgICAgICBzZWxmLmFzc2VydF8ocy5fX2Z1bmNfXyBpcyBmKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5fX2Z1bmNfXyBpcyBmKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZnVuY3Rvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKaW5kZXggY2Q2NDVkMy4uYWI1YmFjMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9mdW5jdG9vbHMucHkKQEAgLTk2LDcgKzk2LDcgQEAKICAgICAgICAgICAgIHAgPSBzZWxmLnRoZXR5cGUoY2FwdHVyZSwgKmFyZ3MpCiAgICAgICAgICAgICBleHBlY3RlZCA9IGFyZ3MgKyAoJ3gnLCkKICAgICAgICAgICAgIGdvdCwgZW1wdHkgPSBwKCd4JykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhleHBlY3RlZCA9PSBnb3QgYW5kIGVtcHR5ID09IHt9KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4cGVjdGVkID09IGdvdCBhbmQgZW1wdHkgPT0ge30pCiAKICAgICBkZWYgdGVzdF9rZXl3b3JkKHNlbGYpOgogICAgICAgICAjIG1ha2Ugc3VyZSBrZXl3b3JkIGFyZ3VtZW50cyBhcmUgY2FwdHVyZWQgY29ycmVjdGx5CkBAIC0xMDQsMTUgKzEwNCwxNSBAQAogICAgICAgICAgICAgcCA9IHNlbGYudGhldHlwZShjYXB0dXJlLCBhPWEpCiAgICAgICAgICAgICBleHBlY3RlZCA9IHsnYSc6YSwneCc6Tm9uZX0KICAgICAgICAgICAgIGVtcHR5LCBnb3QgPSBwKHg9Tm9uZSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhleHBlY3RlZCA9PSBnb3QgYW5kIGVtcHR5ID09ICgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4cGVjdGVkID09IGdvdCBhbmQgZW1wdHkgPT0gKCkpCiAKICAgICBkZWYgdGVzdF9ub19zaWRlX2VmZmVjdHMoc2VsZik6CiAgICAgICAgICMgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBzaWRlIGVmZmVjdHMgdGhhdCBhZmZlY3Qgc3Vic2VxdWVudCBjYWxscwogICAgICAgICBwID0gc2VsZi50aGV0eXBlKGNhcHR1cmUsIDAsIGE9MSkKICAgICAgICAgYXJnczEsIGt3MSA9IHAoMSwgYj0yKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoYXJnczEgPT0gKDAsMSkgYW5kIGt3MSA9PSB7J2EnOjEsJ2InOjJ9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYXJnczEgPT0gKDAsMSkgYW5kIGt3MSA9PSB7J2EnOjEsJ2InOjJ9KQogICAgICAgICBhcmdzMiwga3cyID0gcCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhhcmdzMiA9PSAoMCwpIGFuZCBrdzIgPT0geydhJzoxfSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFyZ3MyID09ICgwLCkgYW5kIGt3MiA9PSB7J2EnOjF9KQogCiAgICAgZGVmIHRlc3RfZXJyb3JfcHJvcGFnYXRpb24oc2VsZik6CiAgICAgICAgIGRlZiBmKHgsIHkpOgpAQCAtMTcyLDEzICsxNzIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkPWZ1bmN0b29scy5XUkFQUEVSX1VQREFURVMpOgogICAgICAgICAjIENoZWNrIGF0dHJpYnV0ZXMgd2VyZSBhc3NpZ25lZAogICAgICAgICBmb3IgbmFtZSBpbiBhc3NpZ25lZDoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhnZXRhdHRyKHdyYXBwZXIsIG5hbWUpIGlzIGdldGF0dHIod3JhcHBlZCwgbmFtZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2V0YXR0cih3cmFwcGVyLCBuYW1lKSBpcyBnZXRhdHRyKHdyYXBwZWQsIG5hbWUpKQogICAgICAgICAjIENoZWNrIGF0dHJpYnV0ZXMgd2VyZSB1cGRhdGVkCiAgICAgICAgIGZvciBuYW1lIGluIHVwZGF0ZWQ6CiAgICAgICAgICAgICB3cmFwcGVyX2F0dHIgPSBnZXRhdHRyKHdyYXBwZXIsIG5hbWUpCiAgICAgICAgICAgICB3cmFwcGVkX2F0dHIgPSBnZXRhdHRyKHdyYXBwZWQsIG5hbWUpCiAgICAgICAgICAgICBmb3Iga2V5IGluIHdyYXBwZWRfYXR0cjoKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mod3JhcHBlZF9hdHRyW2tleV0gaXMgd3JhcHBlcl9hdHRyW2tleV0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdyYXBwZWRfYXR0cltrZXldIGlzIHdyYXBwZXJfYXR0cltrZXldKQogCiAgICAgZGVmIHRlc3RfZGVmYXVsdF91cGRhdGUoc2VsZik6CiAgICAgICAgIGRlZiBmKCk6CkBAIC0yMDQsNyArMjA0LDcgQEAKICAgICAgICAgc2VsZi5jaGVja193cmFwcGVyKHdyYXBwZXIsIGYsICgpLCAoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLl9fbmFtZV9fLCAnd3JhcHBlcicpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwod3JhcHBlci5fX2RvY19fLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxJZihoYXNhdHRyKHdyYXBwZXIsICdhdHRyJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cih3cmFwcGVyLCAnYXR0cicpKQogCiAgICAgZGVmIHRlc3Rfc2VsZWN0aXZlX3VwZGF0ZShzZWxmKToKICAgICAgICAgZGVmIGYoKToKQEAgLTIyOSw3ICsyMjksNyBAQAogICAgICAgICAgICAgcGFzcwogICAgICAgICBmdW5jdG9vbHMudXBkYXRlX3dyYXBwZXIod3JhcHBlciwgbWF4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19uYW1lX18sICdtYXgnKQotICAgICAgICBzZWxmLmFzc2VydF8od3JhcHBlci5fX2RvY19fLnN0YXJ0c3dpdGgoJ21heCgnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdyYXBwZXIuX19kb2NfXy5zdGFydHN3aXRoKCdtYXgoJykpCiAKIGNsYXNzIFRlc3RXcmFwcyhUZXN0VXBkYXRlV3JhcHBlcik6CiAKQEAgLTI1Nyw3ICsyNTcsNyBAQAogICAgICAgICBzZWxmLmNoZWNrX3dyYXBwZXIod3JhcHBlciwgZiwgKCksICgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdyYXBwZXIuX19uYW1lX18sICd3cmFwcGVyJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3cmFwcGVyLl9fZG9jX18sIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbElmKGhhc2F0dHIod3JhcHBlciwgJ2F0dHInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHdyYXBwZXIsICdhdHRyJykpCiAKICAgICBkZWYgdGVzdF9zZWxlY3RpdmVfdXBkYXRlKHNlbGYpOgogICAgICAgICBkZWYgZigpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9mdXR1cmU0LnB5IGIvTGliL3Rlc3QvdGVzdF9mdXR1cmU0LnB5CmluZGV4IDI1ODBjNTUuLjUzZjhhZGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZnV0dXJlNC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2Z1dHVyZTQucHkKQEAgLTUsNyArNSw3IEBACiAKIGNsYXNzIFRlc3RGdXR1cmUodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiBhc3NlcnRUeXBlKHNlbGYsIG9iaiwgdHlwKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUob2JqKSBpcyB0eXAsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKG9iaikgaXMgdHlwLAogICAgICAgICAgICAgInR5cGUoJXIpIGlzICVyLCBub3QgJXIiICUgKG9iaiwgdHlwZShvYmopLCB0eXApKQogCiAgICAgZGVmIHRlc3RfdW5pY29kZV9zdHJpbmdzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZGJtLnB5IGIvTGliL3Rlc3QvdGVzdF9nZGJtLnB5CmluZGV4IDEzMWQyMmIuLmU3NmNjMDMgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2RibS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dkYm0ucHkKQEAgLTI0LDEwICsyNCwxMCBAQAogICAgICAgICBzZWxmLmdbJzEyMzQ1Njc4OTEwJ10gPSAnMDE5MjM3NDEwOTgyMzQwOTEyODQwMTk4MjQyJwogICAgICAgICBrZXlfc2V0ID0gc2V0KHNlbGYuZy5rZXlzKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2V5X3NldCwgZnJvemVuc2V0KFsnYScsICcxMjM0NTY3ODkxMCddKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuZy5oYXNfa2V5KCdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmcuaGFzX2tleSgnYScpKQogICAgICAgICBrZXkgPSBzZWxmLmcuZmlyc3RrZXkoKQogICAgICAgICB3aGlsZSBrZXk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oa2V5IGluIGtleV9zZXQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoa2V5IGluIGtleV9zZXQpCiAgICAgICAgICAgICBrZXlfc2V0LnJlbW92ZShrZXkpCiAgICAgICAgICAgICBrZXkgPSBzZWxmLmcubmV4dGtleShrZXkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuZ1sneHh4J10pCkBAIC02NSw3ICs2NSw3IEBACiAKICAgICAgICAgc2VsZi5nWyd4J10gPSAneCcgKiAxMDAwMAogICAgICAgICBzaXplMSA9IG9zLnBhdGguZ2V0c2l6ZShmaWxlbmFtZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNpemUwIDwgc2l6ZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaXplMCA8IHNpemUxKQogCiAgICAgICAgIGRlbCBzZWxmLmdbJ3gnXQogICAgICAgICAjICdzaXplJyBpcyBzdXBwb3NlZCB0byBiZSB0aGUgc2FtZSBldmVuIGFmdGVyIGRlbGV0aW5nIGFuIGVudHJ5LgpAQCAtNzMsNyArNzMsNyBAQAogCiAgICAgICAgIHNlbGYuZy5yZW9yZ2FuaXplKCkKICAgICAgICAgc2l6ZTIgPSBvcy5wYXRoLmdldHNpemUoZmlsZW5hbWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzaXplMSA+IHNpemUyID49IHNpemUwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2l6ZTEgPiBzaXplMiA+PSBzaXplMCkKIAogCiBkZWYgdGVzdF9tYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9nZW5lcmljcGF0aC5weQppbmRleCA1M2M0NjA3Li5jOGYzNTlkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dlbmVyaWNwYXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXJpY3BhdGgucHkKQEAgLTYsNyArNiw3IEBACiBjbGFzcyBBbGxDb21tb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiBhc3NlcnRJcyhzZWxmLCBhLCBiKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKIAogICAgIGRlZiB0ZXN0X2NvbW1vbnByZWZpeChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCAiZm9vYmFyIikKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgICAgIGdlbmVyaWNwYXRoLmdldGN0aW1lKHRlc3Rfc3VwcG9ydC5URVNURk4pIDw9CiAgICAgICAgICAgICAgICAgZ2VuZXJpY3BhdGguZ2V0bXRpbWUodGVzdF9zdXBwb3J0LlRFU1RGTikKICAgICAgICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkgYi9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CmluZGV4IDliOTBhNjkuLmQ3ODY2Y2EgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weQpAQCAtNjcsNjkgKzY3LDY5IEBACiAgICAgZGVmIHRlc3RfYihzZWxmKToKICAgICAgICAgZnJvbSBfdGVzdGNhcGkgaW1wb3J0IGdldGFyZ3NfYgogICAgICAgICAjIGIgcmV0dXJucyAndW5zaWduZWQgY2hhcicsIGFuZCBkb2VzIHJhbmdlIGNoZWNraW5nICgwIC4uLiBVQ0hBUl9NQVgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDMsIGdldGFyZ3NfYigzLjE0KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoOTksIGdldGFyZ3NfYihMb25nKCkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg5OSwgZ2V0YXJnc19iKEludCgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBnZXRhcmdzX2IoMy4xNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfYihMb25nKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX2IoSW50KCkpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfYiwgLTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIGdldGFyZ3NfYigwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVUNIQVJfTUFYLCBnZXRhcmdzX2IoVUNIQVJfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnZXRhcmdzX2IoMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVUNIQVJfTUFYLCBnZXRhcmdzX2IoVUNIQVJfTUFYKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19iLCBVQ0hBUl9NQVggKyAxKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX2IoNDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0MiwgZ2V0YXJnc19iKDQyTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfYig0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfYig0MkwpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2IsIFZFUllfTEFSR0UpCiAKICAgICBkZWYgdGVzdF9CKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19CCiAgICAgICAgICMgQiByZXR1cm5zICd1bnNpZ25lZCBjaGFyJywgbm8gcmFuZ2UgY2hlY2tpbmcKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMywgZ2V0YXJnc19CKDMuMTQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg5OSwgZ2V0YXJnc19CKExvbmcoKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDk5LCBnZXRhcmdzX0IoSW50KCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGdldGFyZ3NfQigzLjE0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19CKExvbmcoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfQihJbnQoKSkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVUNIQVJfTUFYLCBnZXRhcmdzX0IoLTEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChVQ0hBUl9NQVgsIGdldGFyZ3NfQigtMUwpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgwLCBnZXRhcmdzX0IoMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFVDSEFSX01BWCwgZ2V0YXJnc19CKFVDSEFSX01BWCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIGdldGFyZ3NfQihVQ0hBUl9NQVgrMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVUNIQVJfTUFYLCBnZXRhcmdzX0IoLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVDSEFSX01BWCwgZ2V0YXJnc19CKC0xTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19CKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVDSEFSX01BWCwgZ2V0YXJnc19CKFVDSEFSX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19CKFVDSEFSX01BWCsxKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0MiwgZ2V0YXJnc19CKDQyKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3NfQig0MkwpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChVQ0hBUl9NQVggJiBWRVJZX0xBUkdFLCBnZXRhcmdzX0IoVkVSWV9MQVJHRSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfQig0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfQig0MkwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVDSEFSX01BWCAmIFZFUllfTEFSR0UsIGdldGFyZ3NfQihWRVJZX0xBUkdFKSkKIAogICAgIGRlZiB0ZXN0X0goc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX0gKICAgICAgICAgIyBIIHJldHVybnMgJ3Vuc2lnbmVkIHNob3J0Jywgbm8gcmFuZ2UgY2hlY2tpbmcKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMywgZ2V0YXJnc19IKDMuMTQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg5OSwgZ2V0YXJnc19IKExvbmcoKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDk5LCBnZXRhcmdzX0goSW50KCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGdldGFyZ3NfSCgzLjE0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19IKExvbmcoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfSChJbnQoKSkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVVNIUlRfTUFYLCBnZXRhcmdzX0goLTEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgwLCBnZXRhcmdzX0goMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFVTSFJUX01BWCwgZ2V0YXJnc19IKFVTSFJUX01BWCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIGdldGFyZ3NfSChVU0hSVF9NQVgrMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVVNIUlRfTUFYLCBnZXRhcmdzX0goLTEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGFyZ3NfSCgwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVU0hSVF9NQVgsIGdldGFyZ3NfSChVU0hSVF9NQVgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGFyZ3NfSChVU0hSVF9NQVgrMSkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3NfSCg0MikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX0goNDJMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19IKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19IKDQyTCkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVkVSWV9MQVJHRSAmIFVTSFJUX01BWCwgZ2V0YXJnc19IKFZFUllfTEFSR0UpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFZFUllfTEFSR0UgJiBVU0hSVF9NQVgsIGdldGFyZ3NfSChWRVJZX0xBUkdFKSkKIAogICAgIGRlZiB0ZXN0X0koc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX0kKICAgICAgICAgIyBJIHJldHVybnMgJ3Vuc2lnbmVkIGludCcsIG5vIHJhbmdlIGNoZWNraW5nCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDMsIGdldGFyZ3NfSSgzLjE0KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoOTksIGdldGFyZ3NfSShMb25nKCkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg5OSwgZ2V0YXJnc19JKEludCgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBnZXRhcmdzX0koMy4xNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfSShMb25nKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX0koSW50KCkpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFVJTlRfTUFYLCBnZXRhcmdzX0koLTEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgwLCBnZXRhcmdzX0koMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFVJTlRfTUFYLCBnZXRhcmdzX0koVUlOVF9NQVgpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgwLCBnZXRhcmdzX0koVUlOVF9NQVgrMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVUlOVF9NQVgsIGdldGFyZ3NfSSgtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19JKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVJTlRfTUFYLCBnZXRhcmdzX0koVUlOVF9NQVgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGFyZ3NfSShVSU5UX01BWCsxKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0MiwgZ2V0YXJnc19JKDQyKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3NfSSg0MkwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX0koNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX0koNDJMKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChWRVJZX0xBUkdFICYgVUlOVF9NQVgsIGdldGFyZ3NfSShWRVJZX0xBUkdFKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChWRVJZX0xBUkdFICYgVUlOVF9NQVgsIGdldGFyZ3NfSShWRVJZX0xBUkdFKSkKIAogICAgIGRlZiB0ZXN0X2soc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX2sKQEAgLTEzOSw2NCArMTM5LDY0IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19rLCBMb25nKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19rLCBJbnQoKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChVTE9OR19NQVgsIGdldGFyZ3NfaygtMSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIGdldGFyZ3NfaygwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVUxPTkdfTUFYLCBnZXRhcmdzX2soVUxPTkdfTUFYKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMCwgZ2V0YXJnc19rKFVMT05HX01BWCsxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChVTE9OR19NQVgsIGdldGFyZ3NfaygtMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19rKDApKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVMT05HX01BWCwgZ2V0YXJnc19rKFVMT05HX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19rKFVMT05HX01BWCsxKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0MiwgZ2V0YXJnc19rKDQyKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3Nfayg0MkwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX2soNDIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBnZXRhcmdzX2soNDJMKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChWRVJZX0xBUkdFICYgVUxPTkdfTUFYLCBnZXRhcmdzX2soVkVSWV9MQVJHRSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVkVSWV9MQVJHRSAmIFVMT05HX01BWCwgZ2V0YXJnc19rKFZFUllfTEFSR0UpKQogCiBjbGFzcyBTaWduZWRfVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2koc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX2kKICAgICAgICAgIyBpIHJldHVybnMgJ2ludCcsIGFuZCBkb2VzIHJhbmdlIGNoZWNraW5nIChJTlRfTUlOIC4uLiBJTlRfTUFYKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgzLCBnZXRhcmdzX2koMy4xNCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDk5LCBnZXRhcmdzX2koTG9uZygpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoOTksIGdldGFyZ3NfaShJbnQoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgZ2V0YXJnc19pKDMuMTQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX2koTG9uZygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19pKEludCgpKSkKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2ksIElOVF9NSU4tMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoSU5UX01JTiwgZ2V0YXJnc19pKElOVF9NSU4pKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChJTlRfTUFYLCBnZXRhcmdzX2koSU5UX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSU5UX01JTiwgZ2V0YXJnc19pKElOVF9NSU4pKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKElOVF9NQVgsIGdldGFyZ3NfaShJTlRfTUFYKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19pLCBJTlRfTUFYKzEpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3NfaSg0MikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX2koNDJMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19pKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19pKDQyTCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfaSwgVkVSWV9MQVJHRSkKIAogICAgIGRlZiB0ZXN0X2woc2VsZik6CiAgICAgICAgIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBnZXRhcmdzX2wKICAgICAgICAgIyBsIHJldHVybnMgJ2xvbmcnLCBhbmQgZG9lcyByYW5nZSBjaGVja2luZyAoTE9OR19NSU4gLi4uIExPTkdfTUFYKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgzLCBnZXRhcmdzX2woMy4xNCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDk5LCBnZXRhcmdzX2woTG9uZygpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoOTksIGdldGFyZ3NfbChJbnQoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgZ2V0YXJnc19sKDMuMTQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX2woTG9uZygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19sKEludCgpKSkKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2wsIExPTkdfTUlOLTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKExPTkdfTUlOLCBnZXRhcmdzX2woTE9OR19NSU4pKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChMT05HX01BWCwgZ2V0YXJnc19sKExPTkdfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMT05HX01JTiwgZ2V0YXJnc19sKExPTkdfTUlOKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMT05HX01BWCwgZ2V0YXJnc19sKExPTkdfTUFYKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19sLCBMT05HX01BWCsxKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX2woNDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0MiwgZ2V0YXJnc19sKDQyTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfbCg0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfbCg0MkwpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2wsIFZFUllfTEFSR0UpCiAKICAgICBkZWYgdGVzdF9uKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19uCiAgICAgICAgICMgbiByZXR1cm5zICdQeV9zc2l6ZV90JywgYW5kIGRvZXMgcmFuZ2UgY2hlY2tpbmcKICAgICAgICAgIyAoUFlfU1NJWkVfVF9NSU4gLi4uIFBZX1NTSVpFX1RfTUFYKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgzLCBnZXRhcmdzX24oMy4xNCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDk5LCBnZXRhcmdzX24oTG9uZygpKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoOTksIGdldGFyZ3NfbihJbnQoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgZ2V0YXJnc19uKDMuMTQpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX24oTG9uZygpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg5OSwgZ2V0YXJnc19uKEludCgpKSkKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX24sIFBZX1NTSVpFX1RfTUlOLTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKFBZX1NTSVpFX1RfTUlOLCBnZXRhcmdzX24oUFlfU1NJWkVfVF9NSU4pKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChQWV9TU0laRV9UX01BWCwgZ2V0YXJnc19uKFBZX1NTSVpFX1RfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQWV9TU0laRV9UX01JTiwgZ2V0YXJnc19uKFBZX1NTSVpFX1RfTUlOKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChQWV9TU0laRV9UX01BWCwgZ2V0YXJnc19uKFBZX1NTSVpFX1RfTUFYKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19uLCBQWV9TU0laRV9UX01BWCsxKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX24oNDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0MiwgZ2V0YXJnc19uKDQyTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3Nfbig0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3Nfbig0MkwpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX24sIFZFUllfTEFSR0UpCiAKIApAQCAtMjA0LDE4ICsyMDQsMTggQEAKICAgICBkZWYgdGVzdF9MKHNlbGYpOgogICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19MCiAgICAgICAgICMgTCByZXR1cm5zICdsb25nIGxvbmcnLCBhbmQgZG9lcyByYW5nZSBjaGVja2luZyAoTExPTkdfTUlOIC4uLiBMTE9OR19NQVgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfTCwgIkhlbGxvIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoMywgZ2V0YXJnc19MKDMuMTQpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg5OSwgZ2V0YXJnc19MKExvbmcoKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDk5LCBnZXRhcmdzX0woSW50KCkpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGdldGFyZ3NfTCwgIkhlbGxvIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBnZXRhcmdzX0woMy4xNCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIGdldGFyZ3NfTChMb25nKCkpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKDk5LCBnZXRhcmdzX0woSW50KCkpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfTCwgTExPTkdfTUlOLTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKExMT05HX01JTiwgZ2V0YXJnc19MKExMT05HX01JTikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKExMT05HX01BWCwgZ2V0YXJnc19MKExMT05HX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoTExPTkdfTUlOLCBnZXRhcmdzX0woTExPTkdfTUlOKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMTE9OR19NQVgsIGdldGFyZ3NfTChMTE9OR19NQVgpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX0wsIExMT05HX01BWCsxKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX0woNDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0MiwgZ2V0YXJnc19MKDQyTCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfTCg0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGdldGFyZ3NfTCg0MkwpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX0wsIFZFUllfTEFSR0UpCiAKICAgICBkZWYgdGVzdF9LKHNlbGYpOgpAQCAtMjI0LDE0ICsyMjQsMTQgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBnZXRhcmdzX0ssIDMuMTQpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19LLCBMb25nKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZ2V0YXJnc19LLCBJbnQoKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVUxMT05HX01BWCwgZ2V0YXJnc19LKFVMTE9OR19NQVgpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgwLCBnZXRhcmdzX0soMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDAsIGdldGFyZ3NfSyhVTExPTkdfTUFYKzEpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVMTE9OR19NQVgsIGdldGFyZ3NfSyhVTExPTkdfTUFYKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnZXRhcmdzX0soMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZ2V0YXJnc19LKFVMTE9OR19NQVgrMSkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3NfSyg0MikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDQyLCBnZXRhcmdzX0soNDJMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19LKDQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZ2V0YXJnc19LKDQyTCkpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoVkVSWV9MQVJHRSAmIFVMTE9OR19NQVgsIGdldGFyZ3NfSyhWRVJZX0xBUkdFKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChWRVJZX0xBUkdFICYgVUxMT05HX01BWCwgZ2V0YXJnc19LKFZFUllfTEFSR0UpKQogCiAKIGNsYXNzIFR1cGxlX1Rlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2V0b3B0LnB5IGIvTGliL3Rlc3QvdGVzdF9nZXRvcHQucHkKaW5kZXggOTAzMTA1OC4uNDcyOTMwMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZXRvcHQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZXRvcHQucHkKQEAgLTIzLDIxICsyMywyMSBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhnZXRvcHQuR2V0b3B0RXJyb3IsICphcmdzLCAqKmt3YXJncykKIAogICAgIGRlZiB0ZXN0X3Nob3J0X2hhc19hcmcoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhnZXRvcHQuc2hvcnRfaGFzX2FyZygnYScsICdhOicpKQotICAgICAgICBzZWxmLmZhaWxJZihnZXRvcHQuc2hvcnRfaGFzX2FyZygnYScsICdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShnZXRvcHQuc2hvcnRfaGFzX2FyZygnYScsICdhOicpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGdldG9wdC5zaG9ydF9oYXNfYXJnKCdhJywgJ2EnKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcnJvcihnZXRvcHQuc2hvcnRfaGFzX2FyZywgJ2EnLCAnYicpCiAKICAgICBkZWYgdGVzdF9sb25nX2hhc19hcmdzKHNlbGYpOgogICAgICAgICBoYXNfYXJnLCBvcHRpb24gPSBnZXRvcHQubG9uZ19oYXNfYXJncygnYWJjJywgWydhYmM9J10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhoYXNfYXJnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzX2FyZykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRpb24sICdhYmMnKQogCiAgICAgICAgIGhhc19hcmcsIG9wdGlvbiA9IGdldG9wdC5sb25nX2hhc19hcmdzKCdhYmMnLCBbJ2FiYyddKQotICAgICAgICBzZWxmLmZhaWxJZihoYXNfYXJnKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGhhc19hcmcpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0aW9uLCAnYWJjJykKIAogICAgICAgICBoYXNfYXJnLCBvcHRpb24gPSBnZXRvcHQubG9uZ19oYXNfYXJncygnYWJjJywgWydhYmNkJ10pCi0gICAgICAgIHNlbGYuZmFpbElmKGhhc19hcmcpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzX2FyZykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRpb24sICdhYmNkJykKIAogICAgICAgICBzZWxmLmFzc2VydEVycm9yKGdldG9wdC5sb25nX2hhc19hcmdzLCAnYWJjJywgWydkZWYnXSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ2V0dGV4dC5weSBiL0xpYi90ZXN0L3Rlc3RfZ2V0dGV4dC5weQppbmRleCBkY2E5OWNiLi5kNjBlY2U3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dldHRleHQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9nZXR0ZXh0LnB5CkBAIC0zMDYsNyArMzA2LDcgQEAKICAgICAgICAgc2VsZi5fID0gc2VsZi50LnVnZXR0ZXh0CiAKICAgICBkZWYgdGVzdF91bmljb2RlX21zZ2lkKHNlbGYpOgotICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgdW5sZXNzID0gc2VsZi5hc3NlcnRUcnVlCiAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHNlbGYuXygnJyksIHVuaWNvZGUpKQogICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShzZWxmLl8odScnKSwgdW5pY29kZSkpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weSBiL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQppbmRleCAxN2Y5ZjRjLi4yNzk2NmVkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CkBAIC0zNiw4ICszNiw4IEBACiAgICAgICAgIGlmIG1heGludCA9PSAyMTQ3NDgzNjQ3OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoLTIxNDc0ODM2NDctMSwgLTAyMDAwMDAwMDAwMCkKICAgICAgICAgICAgICMgWFhYIC0yMTQ3NDgzNjQ4Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oMDM3Nzc3Nzc3Nzc3ID4gMCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygweGZmZmZmZmZmID4gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwMzc3Nzc3Nzc3NzcgPiAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDB4ZmZmZmZmZmYgPiAwKQogICAgICAgICAgICAgZm9yIHMgaW4gJzIxNDc0ODM2NDgnLCAnMDQwMDAwMDAwMDAwJywgJzB4MTAwMDAwMDAwJzoKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIHggPSBldmFsKHMpCkBAIC00NSw4ICs0NSw4IEBACiAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgiT3ZlcmZsb3dFcnJvciBvbiBodWdlIGludGVnZXIgbGl0ZXJhbCAlciIgJSBzKQogICAgICAgICBlbGlmIG1heGludCA9PSA5MjIzMzcyMDM2ODU0Nzc1ODA3OgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoLTkyMjMzNzIwMzY4NTQ3NzU4MDctMSwgLTAxMDAwMDAwMDAwMDAwMDAwMDAwMDAwKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDAxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3ID4gMCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygweGZmZmZmZmZmZmZmZmZmZmYgPiAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAxNzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3ID4gMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgweGZmZmZmZmZmZmZmZmZmZmYgPiAwKQogICAgICAgICAgICAgZm9yIHMgaW4gJzkyMjMzNzIwMzY4NTQ3NzU4MDgnLCAnMDIwMDAwMDAwMDAwMDAwMDAwMDAwMDAnLCBcCiAgICAgICAgICAgICAgICAgICAgICAnMHgxMDAwMDAwMDAwMDAwMDAwMCc6CiAgICAgICAgICAgICAgICAgdHJ5OgpAQCAtODEsMTUgKzgxLDE1IEBACiAgICAgICAgIHggPSAzLjFlNAogCiAgICAgZGVmIHRlc3RTdHJpbmdMaXRlcmFscyhzZWxmKToKLSAgICAgICAgeCA9ICcnOyB5ID0gIiI7IHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMCBhbmQgeCA9PSB5KQotICAgICAgICB4ID0gJ1wnJzsgeSA9ICInIjsgc2VsZi5hc3NlcnRfKGxlbih4KSA9PSAxIGFuZCB4ID09IHkgYW5kIG9yZCh4KSA9PSAzOSkKLSAgICAgICAgeCA9ICciJzsgeSA9ICJcIiI7IHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMSBhbmQgeCA9PSB5IGFuZCBvcmQoeCkgPT0gMzQpCisgICAgICAgIHggPSAnJzsgeSA9ICIiOyBzZWxmLmFzc2VydFRydWUobGVuKHgpID09IDAgYW5kIHggPT0geSkKKyAgICAgICAgeCA9ICdcJyc7IHkgPSAiJyI7IHNlbGYuYXNzZXJ0VHJ1ZShsZW4oeCkgPT0gMSBhbmQgeCA9PSB5IGFuZCBvcmQoeCkgPT0gMzkpCisgICAgICAgIHggPSAnIic7IHkgPSAiXCIiOyBzZWxmLmFzc2VydFRydWUobGVuKHgpID09IDEgYW5kIHggPT0geSBhbmQgb3JkKHgpID09IDM0KQogICAgICAgICB4ID0gImRvZXNuJ3QgXCJzaHJpbmtcIiBkb2VzIGl0IgogICAgICAgICB5ID0gJ2RvZXNuXCd0ICJzaHJpbmsiIGRvZXMgaXQnCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMjQgYW5kIHggPT0geSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih4KSA9PSAyNCBhbmQgeCA9PSB5KQogICAgICAgICB4ID0gImRvZXMgXCJzaHJpbmtcIiBkb2Vzbid0IGl0IgogICAgICAgICB5ID0gJ2RvZXMgInNocmluayIgZG9lc25cJ3QgaXQnCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oeCkgPT0gMjQgYW5kIHggPT0geSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih4KSA9PSAyNCBhbmQgeCA9PSB5KQogICAgICAgICB4ID0gIiIiCiBUaGUgInF1aWNrIgogYnJvd24gZm94CkBAIC01NTAsNyArNTUwLDcgQEAKICAgICAgICAgICAgIHNlbGYuZmFpbCgnZXhlYyAuLi4gaW4gZyAoJXMpLCBsICglcyknICUoZyxsKSkKIAogICAgIGRlZiB0ZXN0QXNzZXJ0KHNlbGYpOgotICAgICAgICAjIGFzc2VydF9zdG10OiAnYXNzZXJ0JyB0ZXN0IFsnLCcgdGVzdF0KKyAgICAgICAgIyBhc3NlcnRUcnVlc3RtdDogJ2Fzc2VydCcgdGVzdCBbJywnIHRlc3RdCiAgICAgICAgIGFzc2VydCAxCiAgICAgICAgIGFzc2VydCAxLCAxCiAgICAgICAgIGFzc2VydCBsYW1iZGEgeDp4CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dycC5weSBiL0xpYi90ZXN0L3Rlc3RfZ3JwLnB5CmluZGV4IGIzOGI5NGMuLjgyOWUxNWIgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ3JwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ3JwLnB5CkBAIC0xMiwxMyArMTIsMTMgQEAKICAgICAgICAgIyBhdHRyaWJ1dGVzIHByb21pc2VkIGJ5IHRoZSBkb2NzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlKSwgNCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZVswXSwgdmFsdWUuZ3JfbmFtZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodmFsdWUuZ3JfbmFtZSwgYmFzZXN0cmluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZhbHVlLmdyX25hbWUsIGJhc2VzdHJpbmcpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlWzFdLCB2YWx1ZS5ncl9wYXNzd2QpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHZhbHVlLmdyX3Bhc3N3ZCwgYmFzZXN0cmluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZhbHVlLmdyX3Bhc3N3ZCwgYmFzZXN0cmluZykpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVbMl0sIHZhbHVlLmdyX2dpZCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodmFsdWUuZ3JfZ2lkLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2YWx1ZS5ncl9naWQsIGludCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVbM10sIHZhbHVlLmdyX21lbSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodmFsdWUuZ3JfbWVtLCBsaXN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmFsdWUuZ3JfbWVtLCBsaXN0KSkKIAogICAgIGRlZiB0ZXN0X3ZhbHVlcyhzZWxmKToKICAgICAgICAgZW50cmllcyA9IGdycC5nZXRncmFsbCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2d6aXAucHkgYi9MaWIvdGVzdC90ZXN0X2d6aXAucHkKaW5kZXggYjcyNTBkYi4uOGFlMzFiMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nemlwLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ3ppcC5weQpAQCAtOTEsNyArOTEsNyBAQAogICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgTCA9IGYucmVhZGxpbmUobGluZV9sZW5ndGgpCiAgICAgICAgICAgICBpZiBMID09ICIiIGFuZCBsaW5lX2xlbmd0aCAhPSAwOiBicmVhawotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihMKSA8PSBsaW5lX2xlbmd0aCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oTCkgPD0gbGluZV9sZW5ndGgpCiAgICAgICAgICAgICBsaW5lX2xlbmd0aCA9IChsaW5lX2xlbmd0aCArIDEpICUgNTAKICAgICAgICAgZi5jbG9zZSgpCiAKQEAgLTE1Nyw3ICsxNTcsNyBAQAogICAgIGRlZiB0ZXN0XzE2NDc0ODQoc2VsZik6CiAgICAgICAgIGZvciBtb2RlIGluICgnd2InLCAncmInKToKICAgICAgICAgICAgIGYgPSBnemlwLkd6aXBGaWxlKHNlbGYuZmlsZW5hbWUsIG1vZGUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihmLCAibmFtZSIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoZiwgIm5hbWUiKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5uYW1lLCBzZWxmLmZpbGVuYW1lKQogICAgICAgICAgICAgZi5jbG9zZSgpCiAKQEAgLTE2OSw3ICsxNjksNyBAQAogICAgICAgICBmUmVhZCA9IGd6aXAuR3ppcEZpbGUoc2VsZi5maWxlbmFtZSkKICAgICAgICAgZGF0YVJlYWQgPSBmUmVhZC5yZWFkKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhUmVhZCwgZGF0YTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhoYXNhdHRyKGZSZWFkLCAnbXRpbWUnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoZlJlYWQsICdtdGltZScpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZSZWFkLm10aW1lLCBtdGltZSkKICAgICAgICAgZlJlYWQuY2xvc2UoKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2hhc2gucHkgYi9MaWIvdGVzdC90ZXN0X2hhc2gucHkKaW5kZXggZmEwZmIyMy4uMThlYzA0ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9oYXNoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaGFzaC5weQpAQCAtMTA1LDcgKzEwNSw3IEBACiAgICAgICAgIG9iamVjdHMgPSAoc2VsZi5kZWZhdWx0X2V4cGVjdGVkICsKICAgICAgICAgICAgICAgICAgICBzZWxmLmZpeGVkX2V4cGVjdGVkKQogICAgICAgICBmb3Igb2JqIGluIG9iamVjdHM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShvYmosIEhhc2hhYmxlKSwgcmVwcihvYmopKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uob2JqLCBIYXNoYWJsZSksIHJlcHIob2JqKSkKIAogICAgIGRlZiB0ZXN0X25vdF9oYXNoYWJsZShzZWxmKToKICAgICAgICAgZm9yIG9iaiBpbiBzZWxmLmVycm9yX2V4cGVjdGVkOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9oYXNobGliLnB5IGIvTGliL3Rlc3QvdGVzdF9oYXNobGliLnB5CmluZGV4IGU3N2IyNDYuLjAxODM3MTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaGFzaGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2hhc2hsaWIucHkKQEAgLTM3LDEyICszNywxMiBAQAogICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwID09ICJoYXNobGliIGRpZG4ndCByZWplY3QgYm9ndXMgaGFzaCBuYW1lIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwID09ICJoYXNobGliIGRpZG4ndCByZWplY3QgYm9ndXMgaGFzaCBuYW1lIikKIAogICAgIGRlZiB0ZXN0X2hleGRpZ2VzdChzZWxmKToKICAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5zdXBwb3J0ZWRfaGFzaF9uYW1lczoKICAgICAgICAgICAgIGggPSBoYXNobGliLm5ldyhuYW1lKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhleHN0cihoLmRpZ2VzdCgpKSA9PSBoLmhleGRpZ2VzdCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhleHN0cihoLmRpZ2VzdCgpKSA9PSBoLmhleGRpZ2VzdCgpKQogCiAgICAgZGVmIHRlc3RfbGFyZ2VfdXBkYXRlKHNlbGYpOgogICAgICAgICBhYXMgPSAnYScgKiAxMjgKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkgYi9MaWIvdGVzdC90ZXN0X2hlYXBxLnB5CmluZGV4IDdlM2M3YTEuLmUzNzczODQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaGVhcHEucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9oZWFwcS5weQpAQCAtNDYsNyArNDYsNyBAQAogICAgICAgICBmb3IgcG9zLCBpdGVtIGluIGVudW1lcmF0ZShoZWFwKToKICAgICAgICAgICAgIGlmIHBvczogIyBwb3MgMCBoYXMgbm8gcGFyZW50CiAgICAgICAgICAgICAgICAgcGFyZW50cG9zID0gKHBvcy0xKSA+PiAxCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGhlYXBbcGFyZW50cG9zXSA8PSBpdGVtKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoZWFwW3BhcmVudHBvc10gPD0gaXRlbSkKIAogICAgIGRlZiB0ZXN0X2hlYXBpZnkoc2VsZik6CiAgICAgICAgIGZvciBzaXplIGluIHJhbmdlKDMwKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaG1hYy5weSBiL0xpYi90ZXN0L3Rlc3RfaG1hYy5weQppbmRleCBkOTc1ODNmLi4zMGJiNGZlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2htYWMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9obWFjLnB5CkBAIC0yNjAsNyArMjYwLDcgQEAKICAgICAgICAgIyBUZXN0aW5nIGlmIEhNQUMgZGVmYXVsdHMgdG8gTUQ1IGFsZ29yaXRobS4KICAgICAgICAgIyBOT1RFOiB0aGlzIHdoaXRlYm94IHRlc3QgZGVwZW5kcyBvbiB0aGUgaG1hYyBjbGFzcyBpbnRlcm5hbHMKICAgICAgICAgaCA9IGhtYWMuSE1BQygia2V5IikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGguZGlnZXN0X2NvbnMgPT0gaGFzaGxpYi5tZDUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoLmRpZ2VzdF9jb25zID09IGhhc2hsaWIubWQ1KQogCiAgICAgZGVmIHRlc3RfZXhlcmNpc2VfYWxsX21ldGhvZHMoc2VsZik6CiAgICAgICAgICMgRXhlcmNpc2luZyBhbGwgbWV0aG9kcyBvbmNlLgpAQCAtMjgwLDExICsyODAsMTEgQEAKICAgICAgICAgIyBUZXN0aW5nIGlmIGF0dHJpYnV0ZXMgYXJlIG9mIHNhbWUgdHlwZS4KICAgICAgICAgaDEgPSBobWFjLkhNQUMoImtleSIpCiAgICAgICAgIGgyID0gaDEuY29weSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhoMS5kaWdlc3RfY29ucyA9PSBoMi5kaWdlc3RfY29ucywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGgxLmRpZ2VzdF9jb25zID09IGgyLmRpZ2VzdF9jb25zLAogICAgICAgICAgICAgImRpZ2VzdCBjb25zdHJ1Y3RvcnMgZG9uJ3QgbWF0Y2guIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoaDEuaW5uZXIpID09IHR5cGUoaDIuaW5uZXIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShoMS5pbm5lcikgPT0gdHlwZShoMi5pbm5lciksCiAgICAgICAgICAgICAiVHlwZXMgb2YgaW5uZXIgZG9uJ3QgbWF0Y2guIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHR5cGUoaDEub3V0ZXIpID09IHR5cGUoaDIub3V0ZXIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShoMS5vdXRlcikgPT0gdHlwZShoMi5vdXRlciksCiAgICAgICAgICAgICAiVHlwZXMgb2Ygb3V0ZXIgZG9uJ3QgbWF0Y2guIikKIAogICAgIGRlZiB0ZXN0X3JlYWxjb3B5KHNlbGYpOgpAQCAtMjkyLDEwICsyOTIsMTAgQEAKICAgICAgICAgaDEgPSBobWFjLkhNQUMoImtleSIpCiAgICAgICAgIGgyID0gaDEuY29weSgpCiAgICAgICAgICMgVXNpbmcgaWQoKSBpbiBjYXNlIHNvbWVib2R5IGhhcyBvdmVycmlkZGVuIF9fY21wX18uCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpZChoMSkgIT0gaWQoaDIpLCAiTm8gcmVhbCBjb3B5IG9mIHRoZSBITUFDIGluc3RhbmNlLiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpZChoMS5pbm5lcikgIT0gaWQoaDIuaW5uZXIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaWQoaDEpICE9IGlkKGgyKSwgIk5vIHJlYWwgY29weSBvZiB0aGUgSE1BQyBpbnN0YW5jZS4iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaWQoaDEuaW5uZXIpICE9IGlkKGgyLmlubmVyKSwKICAgICAgICAgICAgICJObyByZWFsIGNvcHkgb2YgdGhlIGF0dHJpYnV0ZSAnaW5uZXInLiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpZChoMS5vdXRlcikgIT0gaWQoaDIub3V0ZXIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaWQoaDEub3V0ZXIpICE9IGlkKGgyLm91dGVyKSwKICAgICAgICAgICAgICJObyByZWFsIGNvcHkgb2YgdGhlIGF0dHJpYnV0ZSAnb3V0ZXInLiIpCiAKICAgICBkZWYgdGVzdF9lcXVhbGl0eShzZWxmKToKQEAgLTMwMyw5ICszMDMsOSBAQAogICAgICAgICBoMSA9IGhtYWMuSE1BQygia2V5IikKICAgICAgICAgaDEudXBkYXRlKCJzb21lIHJhbmRvbSB0ZXh0IikKICAgICAgICAgaDIgPSBoMS5jb3B5KCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGgxLmRpZ2VzdCgpID09IGgyLmRpZ2VzdCgpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaDEuZGlnZXN0KCkgPT0gaDIuZGlnZXN0KCksCiAgICAgICAgICAgICAiRGlnZXN0IG9mIGNvcHkgZG9lc24ndCBtYXRjaCBvcmlnaW5hbCBkaWdlc3QuIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGgxLmhleGRpZ2VzdCgpID09IGgyLmhleGRpZ2VzdCgpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaDEuaGV4ZGlnZXN0KCkgPT0gaDIuaGV4ZGlnZXN0KCksCiAgICAgICAgICAgICAiSGV4ZGlnZXN0IG9mIGNvcHkgZG9lc24ndCBtYXRjaCBvcmlnaW5hbCBoZXhkaWdlc3QuIikKIAogZGVmIHRlc3RfbWFpbigpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ob3RzaG90LnB5IGIvTGliL3Rlc3QvdGVzdF9ob3RzaG90LnB5CmluZGV4IGZhNmIyZjEuLjM4YThkZGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaG90c2hvdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2hvdHNob3QucHkKQEAgLTY0LDExICs2NCwxMSBAQAogICAgIGRlZiBydW5fdGVzdChzZWxmLCBjYWxsYWJsZSwgZXZlbnRzLCBwcm9maWxlcj1Ob25lKToKICAgICAgICAgaWYgcHJvZmlsZXIgaXMgTm9uZToKICAgICAgICAgICAgIHByb2ZpbGVyID0gc2VsZi5uZXdfcHJvZmlsZXIoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IHByb2ZpbGVyLl9wcm9mLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm9maWxlci5fcHJvZi5jbG9zZWQpCiAgICAgICAgIHByb2ZpbGVyLnJ1bmNhbGwoY2FsbGFibGUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgcHJvZmlsZXIuX3Byb2YuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHByb2ZpbGVyLl9wcm9mLmNsb3NlZCkKICAgICAgICAgcHJvZmlsZXIuY2xvc2UoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocHJvZmlsZXIuX3Byb2YuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJvZmlsZXIuX3Byb2YuY2xvc2VkKQogICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cyhldmVudHMpCiAKICAgICBkZWYgdGVzdF9hZGRpbmZvKHNlbGYpOgpAQCAtODAsNyArODAsNyBAQAogICAgICAgICBsb2cgPSBzZWxmLmdldF9sb2dyZWFkZXIoKQogICAgICAgICBpbmZvID0gbG9nLl9pbmZvCiAgICAgICAgIGxpc3QobG9nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5mb1sidGVzdC1rZXkiXSA9PSBbInRlc3QtdmFsdWUiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluZm9bInRlc3Qta2V5Il0gPT0gWyJ0ZXN0LXZhbHVlIl0pCiAKICAgICBkZWYgdGVzdF9saW5lX251bWJlcnMoc2VsZik6CiAgICAgICAgIGRlZiBmKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2h0dHBsaWIucHkKaW5kZXggNTRhMmIwZS4uNzdlOTg4NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9odHRwbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaHR0cGxpYi5weQpAQCAtMjM5LDcgKzIzOSw3IEBACiAgICAgICAgIEhUVFBDb25uZWN0aW9uIGFuZCBpbnRvIHRoZSBzb2NrZXQuCiAgICAgICAgICcnJwogICAgICAgICAjIGRlZmF1bHQgLS0gdXNlIGdsb2JhbCBzb2NrZXQgdGltZW91dAotICAgICAgICBzZWxmLmFzc2VydF8oc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCiAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaHR0cENvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKEhPU1QsIFRpbWVvdXRUZXN0LlBPUlQpCkBAIC0yNTAsNyArMjUwLDcgQEAKICAgICAgICAgaHR0cENvbm4uY2xvc2UoKQogCiAgICAgICAgICMgbm8gdGltZW91dCAtLSBkbyBub3QgdXNlIGdsb2JhbCBzb2NrZXQgZGVmYXVsdAotICAgICAgICBzZWxmLmFzc2VydF8oc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCiAgICAgICAgIHNvY2tldC5zZXRkZWZhdWx0dGltZW91dCgzMCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaHR0cENvbm4gPSBodHRwbGliLkhUVFBDb25uZWN0aW9uKEhPU1QsIFRpbWVvdXRUZXN0LlBPUlQsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5IGIvTGliL3Rlc3QvdGVzdF9odHRwc2VydmVycy5weQppbmRleCA2ZWRjN2QzLi4yMjhkODJiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2h0dHBzZXJ2ZXJzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaHR0cHNlcnZlcnMucHkKQEAgLTIxNiw5ICsyMTYsOSBAQAogCiAgICAgZGVmIGNoZWNrX3N0YXR1c19hbmRfcmVhc29uKHNlbGYsIHJlc3BvbnNlLCBzdGF0dXMsIGRhdGE9Tm9uZSk6CiAgICAgICAgIGJvZHkgPSByZXNwb25zZS5yZWFkKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlc3BvbnNlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzcG9uc2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLnN0YXR1cywgc3RhdHVzKQotICAgICAgICBzZWxmLmFzc2VydF8ocmVzcG9uc2UucmVhc29uICE9IE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXNwb25zZS5yZWFzb24gIT0gTm9uZSkKICAgICAgICAgaWYgZGF0YToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgYm9keSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXAucHkgYi9MaWIvdGVzdC90ZXN0X2ltcC5weQppbmRleCBjOTY4MmFiLi5mNGExNjQ5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcC5weQpAQCAtOCw3ICs4LDcgQEAKICAgICAiIiJWZXJ5IGJhc2ljIHRlc3Qgb2YgaW1wb3J0IGxvY2sgZnVuY3Rpb25zLiIiIgogCiAgICAgZGVmIHZlcmlmeV9sb2NrX3N0YXRlKHNlbGYsIGV4cGVjdGVkKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaW1wLmxvY2tfaGVsZCgpLCBleHBlY3RlZCwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbXAubG9ja19oZWxkKCksIGV4cGVjdGVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgaW1wLmxvY2tfaGVsZCgpIHRvIGJlICVyIiAlIGV4cGVjdGVkKQogICAgIGRlZiB0ZXN0TG9jayhzZWxmKToKICAgICAgICAgTE9PUFMgPSA1MApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbXBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydC5weQppbmRleCBlMTA3OTMxLi45Yjc1YjA0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ltcG9ydC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydC5weQpAQCAtMTYxLDcgKzE2MSw3IEBACiAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18oVEVTVEZOKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKFRFU1RGTiBpbiBzeXMubW9kdWxlcywgImV4cGVjdGVkIG1vZHVsZSBpbiBzeXMubW9kdWxlcyIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoVEVTVEZOIGluIHN5cy5tb2R1bGVzLCAiZXhwZWN0ZWQgbW9kdWxlIGluIHN5cy5tb2R1bGVzIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1vZC5hLCAxLCAibW9kdWxlIGhhcyB3cm9uZyBhdHRyaWJ1dGUgdmFsdWVzIikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1vZC5iLCAyLCAibW9kdWxlIGhhcyB3cm9uZyBhdHRyaWJ1dGUgdmFsdWVzIikKIApAQCAtMTgxLDcgKzE4MSw3IEBACiAKICAgICAgICAgICAgICMgQnV0IHdlIHN0aWxsIGV4cGVjdCB0aGUgbW9kdWxlIHRvIGJlIGluIHN5cy5tb2R1bGVzLgogICAgICAgICAgICAgbW9kID0gc3lzLm1vZHVsZXMuZ2V0KFRFU1RGTikKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKG1vZCBpcyBOb25lLCAiZXhwZWN0ZWQgbW9kdWxlIHRvIHN0aWxsIGJlIGluIHN5cy5tb2R1bGVzIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobW9kIGlzIE5vbmUsICJleHBlY3RlZCBtb2R1bGUgdG8gc3RpbGwgYmUgaW4gc3lzLm1vZHVsZXMiKQogCiAgICAgICAgICAgICAjIFdlIHNob3VsZCBoYXZlIHJlcGxhY2VkIGEgdy8gMTAsIGJ1dCB0aGUgb2xkIGIgdmFsdWUgc2hvdWxkCiAgICAgICAgICAgICAjIHN0aWNrLgpAQCAtMjA4LDEyICsyMDgsMTIgQEAKICAgICAgICAgIyBpbXBvcnQgeC55LnogYmluZHMgeCBpbiB0aGUgY3VycmVudCBuYW1lc3BhY2UKICAgICAgICAgaW1wb3J0IHRlc3QgYXMgeAogICAgICAgICBpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKLSAgICAgICAgc2VsZi5hc3NlcnRfKHggaXMgdGVzdCwgeC5fX25hbWVfXykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIodGVzdC50ZXN0X3N1cHBvcnQsICJfX2ZpbGVfXyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoeCBpcyB0ZXN0LCB4Ll9fbmFtZV9fKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cih0ZXN0LnRlc3Rfc3VwcG9ydCwgIl9fZmlsZV9fIikpCiAKICAgICAgICAgIyBpbXBvcnQgeC55LnogYXMgdyBiaW5kcyB6IGFzIHcKICAgICAgICAgaW1wb3J0IHRlc3QudGVzdF9zdXBwb3J0IGFzIHkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHkgaXMgdGVzdC50ZXN0X3N1cHBvcnQsIHkuX19uYW1lX18pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh5IGlzIHRlc3QudGVzdF9zdXBwb3J0LCB5Ll9fbmFtZV9fKQogCiAgICAgZGVmIHRlc3RfaW1wb3J0X2luaXRsZXNzX2RpcmVjdG9yeV93YXJuaW5nKHNlbGYpOgogICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CkBAIC0zOTQsMTQgKzM5NCwxNCBAQAogICAgICAgICBucyA9IGRpY3QoX19wYWNrYWdlX189J2ZvbycsIF9fbmFtZV9fPSd0ZXN0Lm5vdGFyZWFsbW9kdWxlJykKICAgICAgICAgd2l0aCBjaGVja193YXJuaW5ncygpIGFzIHc6CiAgICAgICAgICAgICBjaGVja19hYnNvbHV0ZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oJ2ZvbycgaW4gc3RyKHcubWVzc2FnZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2ZvbycgaW4gc3RyKHcubWVzc2FnZSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHcuY2F0ZWdvcnksIFJ1bnRpbWVXYXJuaW5nKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeXN0ZW1FcnJvciwgY2hlY2tfcmVsYXRpdmUpCiAgICAgICAgICMgQ2hlY2sgcmVsYXRpdmUgZmFpbHMgd2l0aCBfX3BhY2thZ2VfXyBhbmQgX19uYW1lX18gd3JvbmcKICAgICAgICAgbnMgPSBkaWN0KF9fcGFja2FnZV9fPSdmb28nLCBfX25hbWVfXz0nbm90YXJlYWxwa2cubm90YXJlYWxtb2R1bGUnKQogICAgICAgICB3aXRoIGNoZWNrX3dhcm5pbmdzKCkgYXMgdzoKICAgICAgICAgICAgIGNoZWNrX2Fic29sdXRlKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnZm9vJyBpbiBzdHIody5tZXNzYWdlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnZm9vJyBpbiBzdHIody5tZXNzYWdlKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwody5jYXRlZ29yeSwgUnVudGltZVdhcm5pbmcpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUVycm9yLCBjaGVja19yZWxhdGl2ZSkKICAgICAgICAgIyBDaGVjayBib3RoIGZhaWwgd2l0aCBwYWNrYWdlIHNldCB0byBhIG5vbi1zdHJpbmcKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0aG9va3MucHkgYi9MaWIvdGVzdC90ZXN0X2ltcG9ydGhvb2tzLnB5CmluZGV4IDY0M2VjY2UuLjdmZDhjNjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW1wb3J0aG9va3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbXBvcnRob29rcy5weQpAQCAtMTc3LDExICsxNzcsMTEgQEAKIAogICAgICAgICBUZXN0SW1wb3J0ZXIubW9kdWxlc1sncmVsb2FkbW9kdWxlJ10gPSAoRmFsc2UsIHRlc3RfY28pCiAgICAgICAgIGltcG9ydCByZWxvYWRtb2R1bGUKLSAgICAgICAgc2VsZi5mYWlsSWYoaGFzYXR0cihyZWxvYWRtb2R1bGUsJ3JlbG9hZGVkJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaGFzYXR0cihyZWxvYWRtb2R1bGUsJ3JlbG9hZGVkJykpCiAKICAgICAgICAgVGVzdEltcG9ydGVyLm1vZHVsZXNbJ3JlbG9hZG1vZHVsZSddID0gKEZhbHNlLCByZWxvYWRfY28pCiAgICAgICAgIHJlbG9hZChyZWxvYWRtb2R1bGUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhoYXNhdHRyKHJlbG9hZG1vZHVsZSwncmVsb2FkZWQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIocmVsb2FkbW9kdWxlLCdyZWxvYWRlZCcpKQogCiAgICAgICAgIGltcG9ydCBob29rdGVzdHBhY2thZ2Uub2xkYWJzCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaG9va3Rlc3RwYWNrYWdlLm9sZGFicy5nZXRfbmFtZSgpLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbmRleC5weSBiL0xpYi90ZXN0L3Rlc3RfaW5kZXgucHkKaW5kZXggNzVmMjQzNC4uMmU5OTdjNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pbmRleC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2luZGV4LnB5CkBAIC02MCwxMCArNjAsMTAgQEAKICAgICBkZWYgdGVzdF9lcnJvcihzZWxmKToKICAgICAgICAgc2VsZi5vLmluZCA9ICdkdW1iJwogICAgICAgICBzZWxmLm4uaW5kID0gJ2JhZCcKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXgsIHNlbGYubykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXgsIHNlbGYubikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgc2xpY2Uoc2VsZi5vKS5pbmRpY2VzLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBzbGljZShzZWxmLm4pLmluZGljZXMsIDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXgsIHNlbGYubykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbmRleCwgc2VsZi5uKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNsaWNlKHNlbGYubykuaW5kaWNlcywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzbGljZShzZWxmLm4pLmluZGljZXMsIDApCiAKIAogY2xhc3MgU2VxVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMTE1LDExICsxMTUsMTEgQEAKICAgICAgICAgc2VsZi5vLmluZCA9ICdkdW1iJwogICAgICAgICBzZWxmLm4uaW5kID0gJ2JhZCcKICAgICAgICAgaW5kZXhvYmogPSBsYW1iZGEgeCwgb2JqOiBvYmouc2VxW3hdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIGluZGV4b2JqLCBzZWxmLm8sIHNlbGYpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIGluZGV4b2JqLCBzZWxmLm4sIHNlbGYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW5kZXhvYmosIHNlbGYubywgc2VsZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBpbmRleG9iaiwgc2VsZi5uLCBzZWxmKQogICAgICAgICBzbGljZW9iaiA9IGxhbWJkYSB4LCBvYmo6IG9iai5zZXFbeDpdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIHNsaWNlb2JqLCBzZWxmLm8sIHNlbGYpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIHNsaWNlb2JqLCBzZWxmLm4sIHNlbGYpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2xpY2VvYmosIHNlbGYubywgc2VsZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzbGljZW9iaiwgc2VsZi5uLCBzZWxmKQogCiAKIGNsYXNzIExpc3RUZXN0Q2FzZShTZXFUZXN0Q2FzZSk6CkBAIC0xNTIsNyArMTUyLDcgQEAKIAogICAgICAgICBsc3QgPSBbNSwgNiwgNywgOCwgOSwgMTFdCiAgICAgICAgIGwyID0gbHN0Ll9faW11bF9fKHNlbGYubikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGwyIGlzIGxzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwyIGlzIGxzdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsc3QsIFs1LCA2LCA3LCA4LCA5LCAxMV0gKiAzKQogCiAKQEAgLTIwNiw4ICsyMDYsOCBAQAogICAgICAgICBzZWxmLl9nZXRpdGVtX2hlbHBlcihFbXB0eSkKIAogICAgIGRlZiB0ZXN0X3NlcXVlbmNlX3JlcGVhdChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKE92ZXJmbG93RXJyb3IsIGxhbWJkYTogImEiICogc2VsZi5wb3MpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhPdmVyZmxvd0Vycm9yLCBsYW1iZGE6ICJhIiAqIHNlbGYubmVnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBsYW1iZGE6ICJhIiAqIHNlbGYucG9zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBsYW1iZGE6ICJhIiAqIHNlbGYubmVnKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weSBiL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQppbmRleCAxNDRmODljLi5lNGM0ZWU4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CkBAIC00MywxMyArNDMsMTMgQEAKIAogICAgIGRlZiBpc3Rlc3Qoc2VsZiwgcHJlZGljYXRlLCBleHApOgogICAgICAgICBvYmogPSBldmFsKGV4cCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHByZWRpY2F0ZShvYmopLCAnJXMoJXMpJyAlIChwcmVkaWNhdGUuX19uYW1lX18sIGV4cCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcmVkaWNhdGUob2JqKSwgJyVzKCVzKScgJSAocHJlZGljYXRlLl9fbmFtZV9fLCBleHApKQogCiAgICAgICAgIGZvciBvdGhlciBpbiBzZWxmLnByZWRpY2F0ZXMgLSBzZXQoW3ByZWRpY2F0ZV0pOgogICAgICAgICAgICAgaWYgcHJlZGljYXRlID09IGluc3BlY3QuaXNnZW5lcmF0b3JmdW5jdGlvbiBhbmRcCiAgICAgICAgICAgICAgICBvdGhlciA9PSBpbnNwZWN0LmlzZnVuY3Rpb246CiAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKG90aGVyKG9iaiksICdub3QgJXMoJXMpJyAlIChvdGhlci5fX25hbWVfXywgZXhwKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3RoZXIob2JqKSwgJ25vdCAlcyglcyknICUgKG90aGVyLl9fbmFtZV9fLCBleHApKQogCiBkZWYgZ2VuZXJhdG9yX2Z1bmN0aW9uX2V4YW1wbGUoc2VsZik6CiAgICAgZm9yIGkgaW4geHJhbmdlKDIpOgpAQCAtODMsMTUgKzgzLDE1IEBACiAgICAgICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzZ2V0c2V0ZGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlKHRiLnRiX2ZyYW1lKS5mX2xvY2FscycpCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihpbnNwZWN0LmlzZ2V0c2V0ZGVzY3JpcHRvcih0eXBlKHRiLnRiX2ZyYW1lKS5mX2xvY2FscykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluc3BlY3QuaXNnZXRzZXRkZXNjcmlwdG9yKHR5cGUodGIudGJfZnJhbWUpLmZfbG9jYWxzKSkKICAgICAgICAgaWYgaGFzYXR0cih0eXBlcywgJ01lbWJlckRlc2NyaXB0b3JUeXBlJyk6CiAgICAgICAgICAgICBzZWxmLmlzdGVzdChpbnNwZWN0LmlzbWVtYmVyZGVzY3JpcHRvciwgJ2RhdGV0aW1lLnRpbWVkZWx0YS5kYXlzJykKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGluc3BlY3QuaXNtZW1iZXJkZXNjcmlwdG9yKGRhdGV0aW1lLnRpbWVkZWx0YS5kYXlzKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5zcGVjdC5pc21lbWJlcmRlc2NyaXB0b3IoZGF0ZXRpbWUudGltZWRlbHRhLmRheXMpKQogCiAgICAgZGVmIHRlc3RfaXNyb3V0aW5lKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oaW5zcGVjdC5pc3JvdXRpbmUobW9kLnNwYW0pKQotICAgICAgICBzZWxmLmFzc2VydF8oaW5zcGVjdC5pc3JvdXRpbmUoW10uY291bnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5zcGVjdC5pc3JvdXRpbmUobW9kLnNwYW0pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5zcGVjdC5pc3JvdXRpbmUoW10uY291bnQpKQogCiAgICAgZGVmIHRlc3RfaXNjbGFzcyhzZWxmKToKICAgICAgICAgc2VsZi5pc3Rlc3QoaW5zcGVjdC5pc2NsYXNzLCAnbW9kLlN0dXBpZEdpdCcpCkBAIC0xMTIsOCArMTEyLDggQEAKICAgICAgICAgeCA9IEMoKQogICAgICAgICB4LmEgPSA0MgogICAgICAgICBtZW1iZXJzID0gZGljdChpbnNwZWN0LmdldG1lbWJlcnMoeCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYScgaW4gbWVtYmVycykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdiJyBub3QgaW4gbWVtYmVycykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBpbiBtZW1iZXJzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2InIG5vdCBpbiBtZW1iZXJzKQogCiAKIGNsYXNzIFRlc3RJbnRlcnByZXRlclN0YWNrKElzVGVzdEJhc2UpOgpAQCAtMTI3LDcgKzEyNyw3IEBACiAgICAgICAgIHNlbGYuaXN0ZXN0KGluc3BlY3QuaXNmcmFtZSwgJ21vZC5mcicpCiAKICAgICBkZWYgdGVzdF9zdGFjayhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihtb2Quc3QpID49IDUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obW9kLnN0KSA+PSA1KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1vZC5zdFswXVsxOl0sCiAgICAgICAgICAgICAgKG1vZGZpbGUsIDE2LCAnZWdncycsIFsnICAgIHN0ID0gaW5zcGVjdC5zdGFjaygpXG4nXSwgMCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9kLnN0WzFdWzE6XSwKQEAgLTQxOSwyMyArNDE5LDIzIEBACiAgICAgICAgICAgICBkYXRhYmxvYiA9ICcxJwogCiAgICAgICAgIGF0dHJzID0gYXR0cnNfd29fb2JqcyhBKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdzJywgJ3N0YXRpYyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3Npbmcgc3RhdGljIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ2MnLCAnY2xhc3MgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGNsYXNzIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ3AnLCAncHJvcGVydHknLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcHJvcGVydHknKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdtJywgJ21ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdtMScsICdtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnZGF0YWJsb2InLCAnZGF0YScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBkYXRhJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHN0YXRpYyBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdjJywgJ2NsYXNzIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBjbGFzcyBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdwJywgJ3Byb3BlcnR5JywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHByb3BlcnR5JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnbScsICdtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnbTEnLCAnbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgZGF0YScpCiAKICAgICAgICAgY2xhc3MgQihBKToKICAgICAgICAgICAgIGRlZiBtKHNlbGYpOiBwYXNzCiAKICAgICAgICAgYXR0cnMgPSBhdHRyc193b19vYmpzKEIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ3MnLCAnc3RhdGljIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBzdGF0aWMgbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnYycsICdjbGFzcyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgY2xhc3MgbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgncCcsICdwcm9wZXJ0eScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwcm9wZXJ0eScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ20nLCAnbWV0aG9kJywgQikgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ20xJywgJ21ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdkYXRhYmxvYicsICdkYXRhJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGRhdGEnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdzJywgJ3N0YXRpYyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3Npbmcgc3RhdGljIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ2MnLCAnY2xhc3MgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGNsYXNzIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ3AnLCAncHJvcGVydHknLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcHJvcGVydHknKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdtJywgJ21ldGhvZCcsIEIpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdtMScsICdtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnZGF0YWJsb2InLCAnZGF0YScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBkYXRhJykKIAogCiAgICAgICAgIGNsYXNzIEMoQSk6CkBAIC00NDMsMjMgKzQ0MywyMyBAQAogICAgICAgICAgICAgZGVmIGMoc2VsZik6IHBhc3MKIAogICAgICAgICBhdHRycyA9IGF0dHJzX3dvX29ianMoQykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHN0YXRpYyBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdjJywgJ21ldGhvZCcsIEMpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdwJywgJ3Byb3BlcnR5JywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHByb3BlcnR5JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnbScsICdtZXRob2QnLCBDKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnbTEnLCAnbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgZGF0YScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ3MnLCAnc3RhdGljIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBzdGF0aWMgbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnYycsICdtZXRob2QnLCBDKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgncCcsICdwcm9wZXJ0eScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwcm9wZXJ0eScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ20nLCAnbWV0aG9kJywgQykgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ20xJywgJ21ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdkYXRhYmxvYicsICdkYXRhJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGRhdGEnKQogCiAgICAgICAgIGNsYXNzIEQoQiwgQyk6CiAgICAgICAgICAgICBkZWYgbTEoc2VsZik6IHBhc3MKIAogICAgICAgICBhdHRycyA9IGF0dHJzX3dvX29ianMoRCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHN0YXRpYyBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdjJywgJ2NsYXNzIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBjbGFzcyBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdwJywgJ3Byb3BlcnR5JywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHByb3BlcnR5JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnbScsICdtZXRob2QnLCBCKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnbTEnLCAnbWV0aG9kJywgRCkgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgZGF0YScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ3MnLCAnc3RhdGljIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBzdGF0aWMgbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnYycsICdjbGFzcyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgY2xhc3MgbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgncCcsICdwcm9wZXJ0eScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwcm9wZXJ0eScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ20nLCAnbWV0aG9kJywgQikgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ20xJywgJ21ldGhvZCcsIEQpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdkYXRhYmxvYicsICdkYXRhJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGRhdGEnKQogCiAgICAgIyBSZXBlYXQgYWxsIHRoYXQsIGJ1dCB3LyBuZXctc3R5bGUgY2xhc3Nlcy4KICAgICBkZWYgdGVzdF9jbGFzc2lmeV9uZXdzdHlsZShzZWxmKToKQEAgLTQ4MSwyNCArNDgxLDI0IEBACiAgICAgICAgICAgICBkYXRhYmxvYiA9ICcxJwogCiAgICAgICAgIGF0dHJzID0gYXR0cnNfd29fb2JqcyhBKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdzJywgJ3N0YXRpYyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3Npbmcgc3RhdGljIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ2MnLCAnY2xhc3MgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGNsYXNzIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ3AnLCAncHJvcGVydHknLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcHJvcGVydHknKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdtJywgJ21ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdtMScsICdtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnZGF0YWJsb2InLCAnZGF0YScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBkYXRhJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHN0YXRpYyBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdjJywgJ2NsYXNzIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBjbGFzcyBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdwJywgJ3Byb3BlcnR5JywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHByb3BlcnR5JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnbScsICdtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnbTEnLCAnbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgZGF0YScpCiAKICAgICAgICAgY2xhc3MgQihBKToKIAogICAgICAgICAgICAgZGVmIG0oc2VsZik6IHBhc3MKIAogICAgICAgICBhdHRycyA9IGF0dHJzX3dvX29ianMoQikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHN0YXRpYyBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdjJywgJ2NsYXNzIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBjbGFzcyBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdwJywgJ3Byb3BlcnR5JywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHByb3BlcnR5JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnbScsICdtZXRob2QnLCBCKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnbTEnLCAnbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgZGF0YScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ3MnLCAnc3RhdGljIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBzdGF0aWMgbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnYycsICdjbGFzcyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgY2xhc3MgbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgncCcsICdwcm9wZXJ0eScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwcm9wZXJ0eScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ20nLCAnbWV0aG9kJywgQikgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ20xJywgJ21ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdkYXRhYmxvYicsICdkYXRhJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGRhdGEnKQogCiAKICAgICAgICAgY2xhc3MgQyhBKToKQEAgLTUwNywyNCArNTA3LDI0IEBACiAgICAgICAgICAgICBkZWYgYyhzZWxmKTogcGFzcwogCiAgICAgICAgIGF0dHJzID0gYXR0cnNfd29fb2JqcyhDKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdzJywgJ3N0YXRpYyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3Npbmcgc3RhdGljIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ2MnLCAnbWV0aG9kJywgQykgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ3AnLCAncHJvcGVydHknLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcHJvcGVydHknKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdtJywgJ21ldGhvZCcsIEMpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdtMScsICdtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnZGF0YWJsb2InLCAnZGF0YScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBkYXRhJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgncycsICdzdGF0aWMgbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHN0YXRpYyBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdjJywgJ21ldGhvZCcsIEMpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdwJywgJ3Byb3BlcnR5JywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHByb3BlcnR5JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnbScsICdtZXRob2QnLCBDKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnbTEnLCAnbWV0aG9kJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ2RhdGFibG9iJywgJ2RhdGEnLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgZGF0YScpCiAKICAgICAgICAgY2xhc3MgRChCLCBDKToKIAogICAgICAgICAgICAgZGVmIG0xKHNlbGYpOiBwYXNzCiAKICAgICAgICAgYXR0cnMgPSBhdHRyc193b19vYmpzKEQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ3MnLCAnc3RhdGljIG1ldGhvZCcsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBzdGF0aWMgbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgnYycsICdtZXRob2QnLCBDKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCgncCcsICdwcm9wZXJ0eScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBwcm9wZXJ0eScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ20nLCAnbWV0aG9kJywgQikgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoJ20xJywgJ21ldGhvZCcsIEQpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oKCdkYXRhYmxvYicsICdkYXRhJywgQSkgaW4gYXR0cnMsICdtaXNzaW5nIGRhdGEnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdzJywgJ3N0YXRpYyBtZXRob2QnLCBBKSBpbiBhdHRycywgJ21pc3Npbmcgc3RhdGljIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ2MnLCAnbWV0aG9kJywgQykgaW4gYXR0cnMsICdtaXNzaW5nIHBsYWluIG1ldGhvZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoJ3AnLCAncHJvcGVydHknLCBBKSBpbiBhdHRycywgJ21pc3NpbmcgcHJvcGVydHknKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdtJywgJ21ldGhvZCcsIEIpIGluIGF0dHJzLCAnbWlzc2luZyBwbGFpbiBtZXRob2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKCdtMScsICdtZXRob2QnLCBEKSBpbiBhdHRycywgJ21pc3NpbmcgcGxhaW4gbWV0aG9kJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCgnZGF0YWJsb2InLCAnZGF0YScsIEEpIGluIGF0dHJzLCAnbWlzc2luZyBkYXRhJykKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHJ1bl91bml0dGVzdChUZXN0RGVjb3JhdG9ycywgVGVzdFJldHJpZXZpbmdTb3VyY2VDb2RlLCBUZXN0T25lbGluZXJzLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbnQucHkgYi9MaWIvdGVzdC90ZXN0X2ludC5weQppbmRleCA1MTRhOThlLi5lNGNhYzBjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ludC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2ludC5weQpAQCAtNzYsMTUgKzc2LDE1IEBACiAgICAgICAgIHMgPSByZXByKC0xLXN5cy5tYXhpbnQpCiAgICAgICAgIHggPSBpbnQocykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh4KzEsIC1zeXMubWF4aW50KQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh4LCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh4LCBpbnQpKQogICAgICAgICAjIHNob3VsZCByZXR1cm4gbG9uZwogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGludChzWzE6XSksIHN5cy5tYXhpbnQrMSkKIAogICAgICAgICAjIHNob3VsZCByZXR1cm4gbG9uZwogICAgICAgICB4ID0gaW50KDFlMTAwKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh4LCBsb25nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeCwgbG9uZykpCiAgICAgICAgIHggPSBpbnQoLTFlMTAwKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh4LCBsb25nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeCwgbG9uZykpCiAKIAogICAgICAgICAjIFNGIGJ1ZyA0MzQxODY6ICAweDgwMDAwMDAwLzIgIT0gMHg4MDAwMDAwMD4+MS4KQEAgLTEwMiwxMSArMTAyLDExIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGludCwgJzEyM1x4MDAgMjQ1JywgMjApCiAKICAgICAgICAgeCA9IGludCgnMScgKiA2MDApCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHgsIGxvbmcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh4LCBsb25nKSkKIAogICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CiAgICAgICAgICAgICB4ID0gaW50KHVuaWNocigweDY2MSkgKiA2MDApCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh4LCBsb25nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHgsIGxvbmcpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaW50LCAxLCAxMikKIApAQCAtMjQ5LDcgKzI0OSw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGssIGxlbihiaW4oeCkubHN0cmlwKCctMGInKSkpCiAgICAgICAgICAgICAjIEJlaGF2aW91ciBhcyBzcGVjaWZpZWQgaW4gdGhlIGRvY3MKICAgICAgICAgICAgIGlmIHggIT0gMDoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oMioqKGstMSkgPD0gYWJzKHgpIDwgMioqaykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMioqKGstMSkgPD0gYWJzKHgpIDwgMioqaykKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCAwKQogICAgICAgICAgICAgIyBBbHRlcm5hdGl2ZSBkZWZpbml0aW9uOiB4LmJpdF9sZW5ndGgoKSA9PSAxICsgZmxvb3IobG9nXzIoeCkpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2lvLnB5IGIvTGliL3Rlc3QvdGVzdF9pby5weQppbmRleCAzNzUxZTZmLi43NmNlMzQ3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2lvLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaW8ucHkKQEAgLTM5Niw3ICszOTYsNyBAQAogICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgImFiIikgYXMgZjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi50ZWxsKCksIDMpCiAgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAiYSIpIGFzIGY6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZi50ZWxsKCkgPiAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYudGVsbCgpID4gMCkKIAogICAgIGRlZiB0ZXN0X2Rlc3RydWN0b3Ioc2VsZik6CiAgICAgICAgIHJlY29yZCA9IFtdCkBAIC01MTQsNyArNTE0LDcgQEAKICAgICAgICAgd3IgPSB3ZWFrcmVmLnJlZihmKQogICAgICAgICBkZWwgZgogICAgICAgICBzdXBwb3J0LmdjX2NvbGxlY3QoKQotICAgICAgICBzZWxmLmFzc2VydF8od3IoKSBpcyBOb25lLCB3cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdyKCkgaXMgTm9uZSwgd3IpCiAgICAgICAgIHdpdGggc2VsZi5vcGVuKHN1cHBvcnQuVEVTVEZOLCAicmIiKSBhcyBmOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmLnJlYWQoKSwgYiJhYmN4eHgiKQogCkBAIC02MjIsOCArNjIyLDggQEAKICAgICAgICAgaWYgczoKICAgICAgICAgICAgICMgVGhlIGRlc3RydWN0b3IgKm1heSogaGF2ZSBwcmludGVkIGFuIHVucmFpc2FibGUgZXJyb3IsIGNoZWNrIGl0CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzLnNwbGl0bGluZXMoKSksIDEpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocy5zdGFydHN3aXRoKCJFeGNlcHRpb24gSU9FcnJvcjogIiksIHMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocy5lbmRzd2l0aCgiIGlnbm9yZWQiKSwgcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0YXJ0c3dpdGgoIkV4Y2VwdGlvbiBJT0Vycm9yOiAiKSwgcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmVuZHN3aXRoKCIgaWdub3JlZCIpLCBzKQogCiAgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKICAgICAgICAgcmF3ID0gc2VsZi5Nb2NrUmF3SU8oKQpAQCAtNzIwLDcgKzcyMCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGIiZSIsIGJ1ZmlvLnJlYWQoMSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGIiZmciLCBidWZpby5yZWFkKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGIiIiwgYnVmaW8ucGVlaygxKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKE5vbmUgaXMgYnVmaW8ucmVhZCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoTm9uZSBpcyBidWZpby5yZWFkKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGIiIiwgYnVmaW8ucmVhZCgpKQogCiAgICAgZGVmIHRlc3RfcmVhZF9wYXN0X2VvZihzZWxmKToKQEAgLTgyMiw3ICs4MjIsNyBAQAogICAgICAgICB3ciA9IHdlYWtyZWYucmVmKGYpCiAgICAgICAgIGRlbCBmCiAgICAgICAgIHN1cHBvcnQuZ2NfY29sbGVjdCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3cigpIGlzIE5vbmUsIHdyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod3IoKSBpcyBOb25lLCB3cikKIAogY2xhc3MgUHlCdWZmZXJlZFJlYWRlclRlc3QoQnVmZmVyZWRSZWFkZXJUZXN0KToKICAgICB0cCA9IHB5aW8uQnVmZmVyZWRSZWFkZXIKQEAgLTg3MSw3ICs4NzEsNyBAQAogICAgICAgICBmbHVzaGVkID0gYiIiLmpvaW4od3JpdGVyLl93cml0ZV9zdGFjaykKICAgICAgICAgIyBBdCBsZWFzdCAodG90YWwgLSA4KSBieXRlcyB3ZXJlIGltcGxpY2l0bHkgZmx1c2hlZCwgcGVyaGFwcyBtb3JlCiAgICAgICAgICMgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgc2VsZi5hc3NlcnRfKGZsdXNoZWQuc3RhcnRzd2l0aChjb250ZW50c1s6LThdKSwgZmx1c2hlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZsdXNoZWQuc3RhcnRzd2l0aChjb250ZW50c1s6LThdKSwgZmx1c2hlZCkKIAogICAgIGRlZiBjaGVja193cml0ZXMoc2VsZiwgaW50ZXJtZWRpYXRlX2Z1bmMpOgogICAgICAgICAjIExvdHMgb2Ygd3JpdGVzLCB0ZXN0IHRoZSBmbHVzaGVkIG91dHB1dCBpcyBhcyBleHBlY3RlZC4KQEAgLTEwODMsNyArMTA4Myw3IEBACiAgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoZikKICAgICAgICAgZGVsIGYKICAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdyKCkgaXMgTm9uZSwgd3IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3cigpIGlzIE5vbmUsIHdyKQogICAgICAgICB3aXRoIHNlbGYub3BlbihzdXBwb3J0LlRFU1RGTiwgInJiIikgYXMgZjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZi5yZWFkKCksIGIiMTIzeHh4IikKIApAQCAtMTU3Myw3ICsxNTczLDcgQEAKICAgICAgICAgdCA9IHNlbGYuVGV4dElPV3JhcHBlcihiLCBlbmNvZGluZz0idXRmOCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5lbmNvZGluZywgInV0ZjgiKQogICAgICAgICB0ID0gc2VsZi5UZXh0SU9XcmFwcGVyKGIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0LmVuY29kaW5nIGlzIG5vdCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodC5lbmNvZGluZyBpcyBub3QgTm9uZSkKICAgICAgICAgY29kZWNzLmxvb2t1cCh0LmVuY29kaW5nKQogCiAgICAgZGVmIHRlc3RfZW5jb2RpbmdfZXJyb3JzX3JlYWRpbmcoc2VsZik6CkBAIC0xNzQzLDggKzE3NDMsOCBAQAogICAgICAgICBpZiBzOgogICAgICAgICAgICAgIyBUaGUgZGVzdHJ1Y3RvciAqbWF5KiBoYXZlIHByaW50ZWQgYW4gdW5yYWlzYWJsZSBlcnJvciwgY2hlY2sgaXQKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHMuc3BsaXRsaW5lcygpKSwgMSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzLnN0YXJ0c3dpdGgoIkV4Y2VwdGlvbiBJT0Vycm9yOiAiKSwgcykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzLmVuZHN3aXRoKCIgaWdub3JlZCIpLCBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aCgiRXhjZXB0aW9uIElPRXJyb3I6ICIpLCBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuZW5kc3dpdGgoIiBpZ25vcmVkIiksIHMpCiAKICAgICAjIFN5c3RlbWF0aWMgdGVzdHMgb2YgdGhlIHRleHQgSS9PIEFQSQogCkBAIC0yMDY0LDcgKzIwNjQsNyBAQAogICAgICAgICB3ciA9IHdlYWtyZWYucmVmKHQpCiAgICAgICAgIGRlbCB0CiAgICAgICAgIHN1cHBvcnQuZ2NfY29sbGVjdCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3cigpIGlzIE5vbmUsIHdyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod3IoKSBpcyBOb25lLCB3cikKICAgICAgICAgd2l0aCBzZWxmLm9wZW4oc3VwcG9ydC5URVNURk4sICJyYiIpIGFzIGY6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLCBiIjQ1NmRlZiIpCiAKQEAgLTIyODgsNyArMjI4OCw3IEBACiAgICAgICAgIHdyID0gd2Vha3JlZi5yZWYoYykKICAgICAgICAgZGVsIGMsIGIKICAgICAgICAgc3VwcG9ydC5nY19jb2xsZWN0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdyKCkgaXMgTm9uZSwgd3IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3cigpIGlzIE5vbmUsIHdyKQogCiAgICAgZGVmIHRlc3RfYWJjcyhzZWxmKToKICAgICAgICAgIyBUZXN0IHRoZSB2aXNpYmxlIGJhc2UgY2xhc3NlcyBhcmUgQUJDcy4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW9jdGwucHkgYi9MaWIvdGVzdC90ZXN0X2lvY3RsLnB5CmluZGV4IDgyM2Q5NTQuLmI5OTYyMTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW9jdGwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pb2N0bC5weQpAQCAtMjQsNyArMjQsNyBAQAogICAgICAgICB0dHkgPSBvcGVuKCIvZGV2L3R0eSIsICJyIikKICAgICAgICAgciA9IGZjbnRsLmlvY3RsKHR0eSwgdGVybWlvcy5USU9DR1BHUlAsICIgICAgIikKICAgICAgICAgcnBncnAgPSBzdHJ1Y3QudW5wYWNrKCJpIiwgcilbMF0KLSAgICAgICAgc2VsZi5hc3NlcnRfKHJwZ3JwIGluIGlkcywgIiVzIG5vdCBpbiAlcyIgJSAocnBncnAsIGlkcykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShycGdycCBpbiBpZHMsICIlcyBub3QgaW4gJXMiICUgKHJwZ3JwLCBpZHMpKQogCiAgICAgZGVmIHRlc3RfaW9jdGxfbXV0YXRlKHNlbGYpOgogICAgICAgICBpbXBvcnQgYXJyYXkKQEAgLTM0LDcgKzM0LDcgQEAKICAgICAgICAgciA9IGZjbnRsLmlvY3RsKHR0eSwgdGVybWlvcy5USU9DR1BHUlAsIGJ1ZiwgMSkKICAgICAgICAgcnBncnAgPSBidWZbMF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMociwgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJwZ3JwIGluIGlkcywgIiVzIG5vdCBpbiAlcyIgJSAocnBncnAsIGlkcykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShycGdycCBpbiBpZHMsICIlcyBub3QgaW4gJXMiICUgKHJwZ3JwLCBpZHMpKQogCiAgICAgZGVmIHRlc3RfaW9jdGxfc2lnbmVkX3Vuc2lnbmVkX2NvZGVfcGFyYW0oc2VsZik6CiAgICAgICAgIGlmIG5vdCBwdHk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2l0ZXIucHkgYi9MaWIvdGVzdC90ZXN0X2l0ZXIucHkKaW5kZXggZTg0NzAxOC4uZjVkNmU2OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9pdGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaXRlci5weQpAQCAtNzUsNyArNzUsNyBAQAogICAgICAgICBzZXEgPSByYW5nZSgxMCkKICAgICAgICAgaXQgPSBpdGVyKHNlcSkKICAgICAgICAgaXQyID0gaXRlcihpdCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGl0IGlzIGl0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGl0IGlzIGl0MikKIAogICAgICMgVGVzdCB0aGF0IGZvciBsb29wcyBvdmVyIGl0ZXJhdG9ycyB3b3JrCiAgICAgZGVmIHRlc3RfaXRlcl9mb3JfbG9vcChzZWxmKToKQEAgLTU2NiwyMyArNTY2LDIzIEBACiAgICAgZGVmIHRlc3RfaW5fYW5kX25vdF9pbihzZWxmKToKICAgICAgICAgZm9yIHNjNSBpbiBJdGVyYXRpbmdTZXF1ZW5jZUNsYXNzKDUpLCBTZXF1ZW5jZUNsYXNzKDUpOgogICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoNSk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGkgaW4gc2M1KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpIGluIHNjNSkKICAgICAgICAgICAgIGZvciBpIGluICJhYmMiLCAtMSwgNSwgNDIuNDIsICgzLCA0KSwgW10sIHsxOiAxfSwgMy0xMmosIHNjNToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaSBub3QgaW4gc2M1KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpIG5vdCBpbiBzYzUpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IDMgaW4gMTIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbGFtYmRhOiAzIG5vdCBpbiBtYXApCiAKICAgICAgICAgZCA9IHsib25lIjogMSwgInR3byI6IDIsICJ0aHJlZSI6IDMsIDFqOiAyan0KICAgICAgICAgZm9yIGsgaW4gZDoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhrIGluIGQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oayBub3QgaW4gZC5pdGVydmFsdWVzKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoayBpbiBkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgbm90IGluIGQuaXRlcnZhbHVlcygpKQogICAgICAgICBmb3IgdiBpbiBkLnZhbHVlcygpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHYgaW4gZC5pdGVydmFsdWVzKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odiBub3QgaW4gZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGluIGQuaXRlcnZhbHVlcygpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgbm90IGluIGQpCiAgICAgICAgIGZvciBrLCB2IGluIGQuaXRlcml0ZW1zKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oKGssIHYpIGluIGQuaXRlcml0ZW1zKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oKHYsIGspIG5vdCBpbiBkLml0ZXJpdGVtcygpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKChrLCB2KSBpbiBkLml0ZXJpdGVtcygpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCh2LCBrKSBub3QgaW4gZC5pdGVyaXRlbXMoKSkKIAogICAgICAgICBmID0gb3BlbihURVNURk4sICJ3IikKICAgICAgICAgdHJ5OgpAQCAtNTkzLDkgKzU5Myw5IEBACiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGZvciBjaHVuayBpbiAiYWJjIjoKICAgICAgICAgICAgICAgICBmLnNlZWsoMCwgMCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oY2h1bmsgbm90IGluIGYpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNodW5rIG5vdCBpbiBmKQogICAgICAgICAgICAgICAgIGYuc2VlaygwLCAwKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygoY2h1bmsgKyAiXG4iKSBpbiBmKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoY2h1bmsgKyAiXG4iKSBpbiBmKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICB0cnk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2l0ZXJ0b29scy5weSBiL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CmluZGV4IDMxZDEwZGMuLmY4OGIwOTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfaXRlcnRvb2xzLnB5CkBAIC0xMjcsNyArMTI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIHIpICAgICAgICAgICAgICAgICAgICAgICAgICMgci1sZW5ndGggY29tYmluYXRpb25zCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNldChjKSksIHIpICAgICAgICAgICAgICAgICAgICAjIG5vIGR1cGxpY2F0ZSBlbGVtZW50cwogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYyksIHNvcnRlZChjKSkgICAgICAgICAgICAgICAgIyBrZWVwIG9yaWdpbmFsIG9yZGVyaW5nCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhhbGwoZSBpbiB2YWx1ZXMgZm9yIGUgaW4gYykpICAgICAgICAgICAjIGVsZW1lbnRzIHRha2VuIGZyb20gaW5wdXQgaXRlcmFibGUKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFsbChlIGluIHZhbHVlcyBmb3IgZSBpbiBjKSkgICAgICAgICAgICMgZWxlbWVudHMgdGFrZW4gZnJvbSBpbnB1dCBpdGVyYWJsZQogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2UgZm9yIGUgaW4gdmFsdWVzIGlmIGUgaW4gY10pICAgICAgIyBjb21iIGlzIGEgc3Vic2VxdWVuY2Ugb2YgdGhlIGlucHV0IGl0ZXJhYmxlCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGxpc3QoY29tYmluYXRpb25zMSh2YWx1ZXMsIHIpKSkgIyBtYXRjaGVzIGZpcnN0IHB1cmUgcHl0aG9uIHZlcnNpb24KQEAgLTE5MSwxNCArMTkxLDE0IEBACiAgICAgICAgICAgICAgICAgaWYgbiA9PSAwIG9yIHIgPD0gMToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LCByZWd1bGFyX2NvbWJzKSAgICAgICAgICAgICMgY2FzZXMgdGhhdCBzaG91bGQgYmUgaWRlbnRpY2FsCiAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNldChyZXN1bHQpID49IHNldChyZWd1bGFyX2NvbWJzKSkgICAgICMgcmVzdCBzaG91bGQgYmUgc3VwZXJzZXRzIG9mIHJlZ3VsYXIgY29tYnMKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChyZXN1bHQpID49IHNldChyZWd1bGFyX2NvbWJzKSkgICAgICMgcmVzdCBzaG91bGQgYmUgc3VwZXJzZXRzIG9mIHJlZ3VsYXIgY29tYnMKIAogICAgICAgICAgICAgICAgIGZvciBjIGluIHJlc3VsdDoKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYyksIHIpICAgICAgICAgICAgICAgICAgICAgICAgICMgci1sZW5ndGggY29tYmluYXRpb25zCiAgICAgICAgICAgICAgICAgICAgIG5vcnVucyA9IFtrIGZvciBrLHYgaW4gZ3JvdXBieShjKV0gICAgICAgICAgICAgICAgICAjIGNvbWJvIHdpdGhvdXQgY29uc2VjdXRpdmUgcmVwZWF0cwogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihub3J1bnMpLCBsZW4oc2V0KG5vcnVucykpKSAgICAgIyBubyByZXBlYXRzIG90aGVyIHRoYW4gY29uc2VjdXRpdmUKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KGMpLCBzb3J0ZWQoYykpICAgICAgICAgICAgICAgICMga2VlcCBvcmlnaW5hbCBvcmRlcmluZwotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYWxsKGUgaW4gdmFsdWVzIGZvciBlIGluIGMpKSAgICAgICAgICAgIyBlbGVtZW50cyB0YWtlbiBmcm9tIGlucHV0IGl0ZXJhYmxlCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbGwoZSBpbiB2YWx1ZXMgZm9yIGUgaW4gYykpICAgICAgICAgICAjIGVsZW1lbnRzIHRha2VuIGZyb20gaW5wdXQgaXRlcmFibGUKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChub3J1bnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2UgZm9yIGUgaW4gdmFsdWVzIGlmIGUgaW4gY10pICAgICAjIGNvbWIgaXMgYSBzdWJzZXF1ZW5jZSBvZiB0aGUgaW5wdXQgaXRlcmFibGUKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgbGlzdChjd3IxKHZhbHVlcywgcikpKSAgICAgICAgICMgbWF0Y2hlcyBmaXJzdCBwdXJlIHB5dGhvbiB2ZXJzaW9uCkBAIC0yNjEsNyArMjYxLDcgQEAKICAgICAgICAgICAgICAgICBmb3IgcCBpbiByZXN1bHQ6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHApLCByKSAgICAgICAgICAgICAgICAgICAgICAgICAjIHItbGVuZ3RoIHBlcm11dGF0aW9ucwogICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXQocCkpLCByKSAgICAgICAgICAgICAgICAgICAgIyBubyBkdXBsaWNhdGUgZWxlbWVudHMKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGFsbChlIGluIHZhbHVlcyBmb3IgZSBpbiBwKSkgICAgICAgICAgICMgZWxlbWVudHMgdGFrZW4gZnJvbSBpbnB1dCBpdGVyYWJsZQorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWxsKGUgaW4gdmFsdWVzIGZvciBlIGluIHApKSAgICAgICAgICAgIyBlbGVtZW50cyB0YWtlbiBmcm9tIGlucHV0IGl0ZXJhYmxlCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIGxpc3QocGVybXV0YXRpb25zMSh2YWx1ZXMsIHIpKSkgIyBtYXRjaGVzIGZpcnN0IHB1cmUgcHl0aG9uIHZlcnNpb24KICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgbGlzdChwZXJtdXRhdGlvbnMyKHZhbHVlcywgcikpKSAjIG1hdGNoZXMgc2Vjb25kIHB1cmUgcHl0aG9uIHZlcnNpb24KICAgICAgICAgICAgICAgICBpZiByID09IG46CkBAIC04MjEsNyArODIxLDcgQEAKICAgICAgICAgIyB0ZWUgcGFzcy10aHJvdWdoIHRvIGNvcHlhYmxlIGl0ZXJhdG9yCiAgICAgICAgIGEsIGIgPSB0ZWUoJ2FiYycpCiAgICAgICAgIGMsIGQgPSB0ZWUoYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgYykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYykKIAogICAgICAgICAjIHRlc3QgdGVlX25ldwogICAgICAgICB0MSwgdDIgPSB0ZWUoJ2FiYycpCkBAIC04MjksNyArODI5LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB0bmV3KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHRuZXcsIDEwKQogICAgICAgICB0MyA9IHRuZXcodDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsaXN0KHQxKSA9PSBsaXN0KHQyKSA9PSBsaXN0KHQzKSA9PSBsaXN0KCdhYmMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpc3QodDEpID09IGxpc3QodDIpID09IGxpc3QodDMpID09IGxpc3QoJ2FiYycpKQogCiAgICAgICAgICMgdGVzdCB0aGF0IHRlZSBvYmplY3RzIGFyZSB3ZWFrIHJlZmVyZW5jYWJsZQogICAgICAgICBhLCBiID0gdGVlKHhyYW5nZSgxMCkpCkBAIC0xMzM2LDcgKzEzMzYsNyBAQAogICAgICAgICAgICAgICAgIFN1YmNsYXNzKG5ld2FyZz0xKQogICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvciwgZXJyOgogICAgICAgICAgICAgICAgICMgd2UgZXhwZWN0IHR5cGUgZXJyb3JzIGJlY2F1c2Ugb2Ygd3JvbmcgYXJndW1lbnQgY291bnQKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxJZigiZG9lcyBub3QgdGFrZSBrZXl3b3JkIGFyZ3VtZW50cyIgaW4gZXJyLmFyZ3NbMF0pCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgiZG9lcyBub3QgdGFrZSBrZXl3b3JkIGFyZ3VtZW50cyIgaW4gZXJyLmFyZ3NbMF0pCiAKIAogbGlicmVmdGVzdCA9ICIiIiBEb2N0ZXN0IGZvciBleGFtcGxlcyBpbiB0aGUgbGlicmFyeSByZWZlcmVuY2U6IGxpYml0ZXJ0b29scy50ZXgKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfa3F1ZXVlLnB5IGIvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkKaW5kZXggNjIxNjg1MC4uOTAxMjk1YiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9rcXVldWUucHkKQEAgLTE1LDEwICsxNSwxMCBAQAogY2xhc3MgVGVzdEtRdWV1ZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3RfY3JlYXRlX3F1ZXVlKHNlbGYpOgogICAgICAgICBrcSA9IHNlbGVjdC5rcXVldWUoKQotICAgICAgICBzZWxmLmFzc2VydF8oa3EuZmlsZW5vKCkgPiAwLCBrcS5maWxlbm8oKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBrcS5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrcS5maWxlbm8oKSA+IDAsIGtxLmZpbGVubygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGtxLmNsb3NlZCkKICAgICAgICAga3EuY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8oa3EuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoa3EuY2xvc2VkKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBrcS5maWxlbm8pCiAKICAgICBkZWYgdGVzdF9jcmVhdGVfZXZlbnQoc2VsZik6CkBAIC0zNCw4ICszNCw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXYsIGV2KQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGV2LCBvdGhlcikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChjbXAoZXYsIG90aGVyKSwgLTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhldiA8IG90aGVyKQotICAgICAgICBzZWxmLmFzc2VydF8ob3RoZXIgPj0gZXYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShldiA8IG90aGVyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3RoZXIgPj0gZXYpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgY21wLCBldiwgTm9uZSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBjbXAsIGV2LCAxKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGNtcCwgZXYsICJldiIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2xhcmdlZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfbGFyZ2VmaWxlLnB5CmluZGV4IGRkYmNjMDYuLmM0ZmFlYWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbGFyZ2VmaWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbGFyZ2VmaWxlLnB5CkBAIC0xNDUsNyArMTQ1LDcgQEAKICAgICAgICAgZm9yIHBvcyBpbiAoMioqMzEtMSwgMioqMzEsIDIqKjMxKzEpOgogICAgICAgICAgICAgd2l0aCBzZWxmLm9wZW4oVEVTVEZOLCAncmInKSBhcyBmOgogICAgICAgICAgICAgICAgIGYuc2Vlayhwb3MpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGYuc2Vla2FibGUoKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5zZWVrYWJsZSgpKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbGlzdC5weSBiL0xpYi90ZXN0L3Rlc3RfbGlzdC5weQppbmRleCAxNjcyOTNhLi42ZTA4MGRjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xpc3QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9saXN0LnB5CkBAIC05LDcgKzksNyBAQAogICAgICAgICBsMF8zID0gWzAsIDEsIDIsIDNdCiAgICAgICAgIGwwXzNfYmlzID0gbGlzdChsMF8zKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGwwXzMsIGwwXzNfYmlzKQotICAgICAgICBzZWxmLmFzc2VydF8obDBfMyBpcyBub3QgbDBfM19iaXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsMF8zIGlzIG5vdCBsMF8zX2JpcykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KCgpKSwgW10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCgoMCwgMSwgMiwgMykpLCBbMCwgMSwgMiwgM10pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCgnJyksIFtdKQpAQCAtMzksMTEgKzM5LDExIEBACiAKICAgICBkZWYgdGVzdF90cnV0aChzZWxmKToKICAgICAgICAgc3VwZXIoTGlzdFRlc3QsIHNlbGYpLnRlc3RfdHJ1dGgoKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IFtdKQotICAgICAgICBzZWxmLmFzc2VydF8oWzQyXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFs0Ml0pCiAKICAgICBkZWYgdGVzdF9pZGVudGl0eShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKFtdIGlzIG5vdCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFtdIGlzIG5vdCBbXSkKIAogICAgIGRlZiB0ZXN0X2xlbihzZWxmKToKICAgICAgICAgc3VwZXIoTGlzdFRlc3QsIHNlbGYpLnRlc3RfbGVuKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weSBiL0xpYi90ZXN0L3Rlc3RfbG9nZ2luZy5weQppbmRleCAxZTgxNTY4Li45ZTg2NmI3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xvZ2dpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9sb2dnaW5nLnB5CkBAIC05OSw3ICs5OSw3IEBACiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBsb2dnaW5nLl9yZWxlYXNlTG9jaygpCiAKLSAgICBkZWYgYXNzZXJ0X2xvZ19saW5lcyhzZWxmLCBleHBlY3RlZF92YWx1ZXMsIHN0cmVhbT1Ob25lKToKKyAgICBkZWYgYXNzZXJ0VHJ1ZWxvZ19saW5lcyhzZWxmLCBleHBlY3RlZF92YWx1ZXMsIHN0cmVhbT1Ob25lKToKICAgICAgICAgIiIiTWF0Y2ggdGhlIGNvbGxlY3RlZCBsb2cgbGluZXMgYWdhaW5zdCB0aGUgcmVndWxhciBleHByZXNzaW9uCiAgICAgICAgIHNlbGYuZXhwZWN0ZWRfbG9nX3BhdCwgYW5kIGNvbXBhcmUgdGhlIGV4dHJhY3RlZCBncm91cCB2YWx1ZXMgdG8KICAgICAgICAgdGhlIGV4cGVjdGVkX3ZhbHVlcyBsaXN0IG9mIHR1cGxlcy4iIiIKQEAgLTE2NSw3ICsxNjUsNyBAQAogCiAgICAgICAgIElORi5kZWJ1ZyhtKCkpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFsKICAgICAgICAgICAgICgnRVJSJywgJ0NSSVRJQ0FMJywgJzEnKSwKICAgICAgICAgICAgICgnRVJSJywgJ0VSUk9SJywgJzInKSwKICAgICAgICAgICAgICgnSU5GJywgJ0NSSVRJQ0FMJywgJzMnKSwKQEAgLTE5Nyw3ICsxOTcsNyBAQAogICAgICAgICBJTkZfRVJSLmluZm8obSgpKQogICAgICAgICBJTkZfRVJSLmRlYnVnKG0oKSkKIAotICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICBzZWxmLmFzc2VydFRydWVsb2dfbGluZXMoWwogICAgICAgICAgICAgKCdJTkYuRVJSJywgJ0NSSVRJQ0FMJywgJzEnKSwKICAgICAgICAgICAgICgnSU5GLkVSUicsICdFUlJPUicsICcyJyksCiAgICAgICAgIF0pCkBAIC0yMjgsNyArMjI4LDcgQEAKICAgICAgICAgSU5GX0VSUl9VTkRFRi5pbmZvKG0oKSkKICAgICAgICAgSU5GX0VSUl9VTkRFRi5kZWJ1ZyhtKCkpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFsKICAgICAgICAgICAgICgnSU5GLlVOREVGJywgJ0NSSVRJQ0FMJywgJzEnKSwKICAgICAgICAgICAgICgnSU5GLlVOREVGJywgJ0VSUk9SJywgJzInKSwKICAgICAgICAgICAgICgnSU5GLlVOREVGJywgJ1dBUk5JTkcnLCAnMycpLApAQCAtMjU2LDcgKzI1Niw3IEBACiAgICAgICAgIEdSQU5EQ0hJTEQuZGVidWcobSgpKQogICAgICAgICBDSElMRC5kZWJ1ZyhtKCkpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFsKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFsKICAgICAgICAgICAgICgnSU5GLkJBRFBBUkVOVC5VTkRFRicsICdDUklUSUNBTCcsICcxJyksCiAgICAgICAgICAgICAoJ0lORi5CQURQQVJFTlQuVU5ERUYnLCAnSU5GTycsICcyJyksCiAgICAgICAgICAgICAoJ0lORi5CQURQQVJFTlQnLCAnQ1JJVElDQUwnLCAnMycpLApAQCAtMjg1LDcgKzI4NSw3IEBACiAgICAgICAgICAgICBzcGFtX2VnZ3NfZmlzaC5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpICAjIEdvb2QuCiAgICAgICAgICAgICBzcGFtX2Jha2VkYmVhbnMuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFsKICAgICAgICAgICAgICAgICAoJ3NwYW0uZWdncycsICdJTkZPJywgJzInKSwKICAgICAgICAgICAgICAgICAoJ3NwYW0uZWdncy5maXNoJywgJ0lORk8nLCAnMycpLAogICAgICAgICAgICAgXSkKQEAgLTM2Nyw3ICszNjcsNyBAQAogICAgICAgICBzZWxmLnJvb3RfbG9nZ2VyLnNldExldmVsKFZFUkJPU0UpCiAgICAgICAgICMgTGV2ZWxzID49ICdWZXJib3NlJyBhcmUgZ29vZC4KICAgICAgICAgc2VsZi5sb2dfYXRfYWxsX2xldmVscyhzZWxmLnJvb3RfbG9nZ2VyKQotICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICBzZWxmLmFzc2VydFRydWVsb2dfbGluZXMoWwogICAgICAgICAgICAgKCdWZXJib3NlJywgJzUnKSwKICAgICAgICAgICAgICgnU29jaWFibGUnLCAnNicpLAogICAgICAgICAgICAgKCdFZmZ1c2l2ZScsICc3JyksCkBAIC0zODIsNyArMzgyLDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgIyBMZXZlbHMgPj0gJ1NvY2lhYmxlJyBhcmUgZ29vZC4KICAgICAgICAgICAgIHNlbGYubG9nX2F0X2FsbF9sZXZlbHMoc2VsZi5yb290X2xvZ2dlcikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWVsb2dfbGluZXMoWwogICAgICAgICAgICAgICAgICgnU29jaWFibGUnLCAnNicpLAogICAgICAgICAgICAgICAgICgnRWZmdXNpdmUnLCAnNycpLAogICAgICAgICAgICAgICAgICgnVGVyc2UnLCAnOCcpLApAQCAtNDEzLDEyICs0MTMsMTIgQEAKICAgICAgICAgICAgICAgICAoJ1RhY2l0dXJuJywgJzknKSwKICAgICAgICAgICAgICAgICAoJ1NpbGVudCcsICcxMCcpLAogICAgICAgICAgICAgXQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKGZpcnN0X2xpbmVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKGZpcnN0X2xpbmVzKQogCiAgICAgICAgICAgICBzcGVjaWZpY19maWx0ZXIgPSBWZXJ5U3BlY2lmaWNGaWx0ZXIoKQogICAgICAgICAgICAgc2VsZi5yb290X2xvZ2dlci5hZGRGaWx0ZXIoc3BlY2lmaWNfZmlsdGVyKQogICAgICAgICAgICAgc2VsZi5sb2dfYXRfYWxsX2xldmVscyhzZWxmLnJvb3RfbG9nZ2VyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKGZpcnN0X2xpbmVzICsgWworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKGZpcnN0X2xpbmVzICsgWwogICAgICAgICAgICAgICAgICMgTm90IG9ubHkgJ0dhcnJ1bG91cycgaXMgc3RpbGwgbWlzc2luZywgYnV0IGFsc28gJ1NvY2lhYmxlJwogICAgICAgICAgICAgICAgICMgYW5kICdUYWNpdHVybicKICAgICAgICAgICAgICAgICAoJ0JvcmluZycsICcxMScpLApAQCAtNDU4LDkgKzQ1OCw5IEBACiAgICAgICAgICMgVGhlIG1lbW9yeSBoYW5kbGVyIGZsdXNoZXMgdG8gaXRzIHRhcmdldCBoYW5kbGVyIGJhc2VkIG9uIHNwZWNpZmljCiAgICAgICAgICMgIGNyaXRlcmlhIChtZXNzYWdlIGNvdW50IGFuZCBtZXNzYWdlIGxldmVsKS4KICAgICAgICAgc2VsZi5tZW1fbG9nZ2VyLmRlYnVnKHNlbGYubmV4dF9tZXNzYWdlKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFtdKQogICAgICAgICBzZWxmLm1lbV9sb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQotICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZWxvZ19saW5lcyhbXSkKICAgICAgICAgIyBUaGlzIHdpbGwgZmx1c2ggYmVjYXVzZSB0aGUgbGV2ZWwgaXMgPj0gbG9nZ2luZy5XQVJOSU5HCiAgICAgICAgIHNlbGYubWVtX2xvZ2dlci53YXJuKHNlbGYubmV4dF9tZXNzYWdlKCkpCiAgICAgICAgIGxpbmVzID0gWwpAQCAtNDY4LDE5ICs0NjgsMTkgQEAKICAgICAgICAgICAgICgnSU5GTycsICcyJyksCiAgICAgICAgICAgICAoJ1dBUk5JTkcnLCAnMycpLAogICAgICAgICBdCi0gICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhsaW5lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKGxpbmVzKQogICAgICAgICBmb3IgbiBpbiAoNCwgMTQpOgogICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoOSk6CiAgICAgICAgICAgICAgICAgc2VsZi5tZW1fbG9nZ2VyLmRlYnVnKHNlbGYubmV4dF9tZXNzYWdlKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMobGluZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWVsb2dfbGluZXMobGluZXMpCiAgICAgICAgICAgICAjIFRoaXMgd2lsbCBmbHVzaCBiZWNhdXNlIGl0J3MgdGhlIDEwdGggbWVzc2FnZSBzaW5jZSB0aGUgbGFzdAogICAgICAgICAgICAgIyAgZmx1c2guCiAgICAgICAgICAgICBzZWxmLm1lbV9sb2dnZXIuZGVidWcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKICAgICAgICAgICAgIGxpbmVzID0gbGluZXMgKyBbKCdERUJVRycsIHN0cihpKSkgZm9yIGkgaW4gcmFuZ2UobiwgbiArIDEwKV0KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhsaW5lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZWxvZ19saW5lcyhsaW5lcykKIAogICAgICAgICBzZWxmLm1lbV9sb2dnZXIuZGVidWcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKGxpbmVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWVsb2dfbGluZXMobGluZXMpCiAKIAogY2xhc3MgRXhjZXB0aW9uRm9ybWF0dGVyKGxvZ2dpbmcuRm9ybWF0dGVyKToKQEAgLTY1MCwxMSArNjUwLDExIEBACiAgICAgICAgICAgICBsb2dnZXIuaW5mbyhzZWxmLm5leHRfbWVzc2FnZSgpKQogICAgICAgICAgICAgIyBPdXRwdXRzIGEgbWVzc2FnZQogICAgICAgICAgICAgbG9nZ2VyLmVycm9yKHNlbGYubmV4dF9tZXNzYWdlKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoWworICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFsKICAgICAgICAgICAgICAgICAoJ0VSUk9SJywgJzInKSwKICAgICAgICAgICAgIF0sIHN0cmVhbT1vdXRwdXQpCiAgICAgICAgICAgICAjIE9yaWdpbmFsIGxvZ2dlciBvdXRwdXQgaXMgZW1wdHkuCi0gICAgICAgICAgICBzZWxmLmFzc2VydF9sb2dfbGluZXMoW10pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWVsb2dfbGluZXMoW10pCiAKICAgICBkZWYgdGVzdF9jb25maWcxX29rKHNlbGYsIGNvbmZpZz1jb25maWcxKToKICAgICAgICAgIyBBIGNvbmZpZyBmaWxlIGRlZmluaW5nIGEgc3ViLXBhcnNlciBhcyB3ZWxsLgpAQCAtNjY0LDEyICs2NjQsMTIgQEAKICAgICAgICAgICAgICMgQm90aCB3aWxsIG91dHB1dCBhIG1lc3NhZ2UKICAgICAgICAgICAgIGxvZ2dlci5pbmZvKHNlbGYubmV4dF9tZXNzYWdlKCkpCiAgICAgICAgICAgICBsb2dnZXIuZXJyb3Ioc2VsZi5uZXh0X21lc3NhZ2UoKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWVsb2dfbGluZXMoWwogICAgICAgICAgICAgICAgICgnSU5GTycsICcxJyksCiAgICAgICAgICAgICAgICAgKCdFUlJPUicsICcyJyksCiAgICAgICAgICAgICBdLCBzdHJlYW09b3V0cHV0KQogICAgICAgICAgICAgIyBPcmlnaW5hbCBsb2dnZXIgb3V0cHV0IGlzIGVtcHR5LgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFtdKQogCiAgICAgZGVmIHRlc3RfY29uZmlnMl9mYWlsdXJlKHNlbGYpOgogICAgICAgICAjIEEgc2ltcGxlIGNvbmZpZyBmaWxlIHdoaWNoIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBzZXR0aW5ncy4KQEAgLTY5Miw3ICs2OTIsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMob3V0cHV0LmdldHZhbHVlKCksCiAgICAgICAgICAgICAgICAgIkVSUk9SOnJvb3Q6anVzdCB0ZXN0aW5nXG5Hb3QgYSBbUnVudGltZUVycm9yXVxuIikKICAgICAgICAgICAgICMgT3JpZ2luYWwgbG9nZ2VyIG91dHB1dCBpcyBlbXB0eQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfbG9nX2xpbmVzKFtdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlbG9nX2xpbmVzKFtdKQogCiAgICAgZGVmIHRlc3RfY29uZmlnNV9vayhzZWxmKToKICAgICAgICAgc2VsZi50ZXN0X2NvbmZpZzFfb2soY29uZmlnPXNlbGYuY29uZmlnNSkKQEAgLTgyNiw3ICs4MjYsNyBAQAogICAgICAgICAgICAga2V5ID0gaWQob2JqKSwgcmVwcihvYmopCiAgICAgICAgICAgICBzZWxmLl9zdXJ2aXZvcnNba2V5XSA9IHdlYWtyZWYucmVmKG9iaikKIAotICAgIGRlZiBfYXNzZXJ0X3N1cnZpdmFsKHNlbGYpOgorICAgIGRlZiBfYXNzZXJ0VHJ1ZXN1cnZpdmFsKHNlbGYpOgogICAgICAgICAiIiJBc3NlcnQgdGhhdCBhbGwgb2JqZWN0cyB3YXRjaGVkIGZvciBzdXJ2aXZhbCBoYXZlIHN1cnZpdmVkLiIiIgogICAgICAgICAjIFRyaWdnZXIgY3ljbGUgYnJlYWtpbmcuCiAgICAgICAgIGdjLmNvbGxlY3QoKQpAQCAtODQ3LDE2ICs4NDcsMTYgQEAKICAgICAgICAgZm9vLnNldExldmVsKGxvZ2dpbmcuREVCVUcpCiAgICAgICAgIHNlbGYucm9vdF9sb2dnZXIuZGVidWcoc2VsZi5uZXh0X21lc3NhZ2UoKSkKICAgICAgICAgZm9vLmRlYnVnKHNlbGYubmV4dF9tZXNzYWdlKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZWxvZ19saW5lcyhbCiAgICAgICAgICAgICAoJ2ZvbycsICdERUJVRycsICcyJyksCiAgICAgICAgIF0pCiAgICAgICAgIGRlbCBmb28KICAgICAgICAgIyBmb28gaGFzIHN1cnZpdmVkLgotICAgICAgICBzZWxmLl9hc3NlcnRfc3Vydml2YWwoKQorICAgICAgICBzZWxmLl9hc3NlcnRUcnVlc3Vydml2YWwoKQogICAgICAgICAjIGZvbyBoYXMgcmV0YWluZWQgaXRzIHNldHRpbmdzLgogICAgICAgICBiYXIgPSBsb2dnaW5nLmdldExvZ2dlcigiZm9vIikKICAgICAgICAgYmFyLmRlYnVnKHNlbGYubmV4dF9tZXNzYWdlKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0X2xvZ19saW5lcyhbCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZWxvZ19saW5lcyhbCiAgICAgICAgICAgICAoJ2ZvbycsICdERUJVRycsICcyJyksCiAgICAgICAgICAgICAoJ2ZvbycsICdERUJVRycsICczJyksCiAgICAgICAgIF0pCkBAIC04ODEsNyArODgxLDcgQEAKICAgICAgICAgICAgICMgY2hlY2sgd2Ugd3JvdGUgZXhhY3RseSB0aG9zZSBieXRlcywgaWdub3JpbmcgdHJhaWxpbmcgXG4gZXRjCiAgICAgICAgICAgICBmID0gb3BlbihmbikKICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmLnJlYWQoKS5yc3RyaXAoKSwgZGF0YSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGYucmVhZCgpLnJzdHJpcCgpLCBkYXRhKQogICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgZmluYWxseToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbG9uZy5weSBiL0xpYi90ZXN0L3Rlc3RfbG9uZy5weQppbmRleCBhMjBjM2ZjLi4xOTQzNTE4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2xvbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9sb25nLnB5CkBAIC04OCw3ICs4OCw3IEBACiAgICAgIyBUaGUgc2lnbiBvZiB0aGUgbnVtYmVyIGlzIGFsc28gcmFuZG9tLgogCiAgICAgZGVmIGdldHJhbihzZWxmLCBuZGlnaXRzKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5kaWdpdHMgPiAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobmRpZ2l0cyA+IDApCiAgICAgICAgIG5iaXRzX2hpID0gbmRpZ2l0cyAqIFNISUZUCiAgICAgICAgIG5iaXRzX2xvID0gbmJpdHNfaGkgLSBTSElGVCArIDEKICAgICAgICAgYW5zd2VyID0gMEwKQEAgLTk3LDEzICs5NywxMyBAQAogICAgICAgICB3aGlsZSBuYml0cyA8IG5iaXRzX2xvOgogICAgICAgICAgICAgYml0cyA9IChyID4+IDEpICsgMQogICAgICAgICAgICAgYml0cyA9IG1pbihiaXRzLCBuYml0c19oaSAtIG5iaXRzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDEgPD0gYml0cyA8PSBTSElGVCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgxIDw9IGJpdHMgPD0gU0hJRlQpCiAgICAgICAgICAgICBuYml0cyA9IG5iaXRzICsgYml0cwogICAgICAgICAgICAgYW5zd2VyID0gYW5zd2VyIDw8IGJpdHMKICAgICAgICAgICAgIGlmIHIgJiAxOgogICAgICAgICAgICAgICAgIGFuc3dlciA9IGFuc3dlciB8ICgoMSA8PCBiaXRzKSAtIDEpCiAgICAgICAgICAgICByID0gaW50KHJhbmRvbS5yYW5kb20oKSAqIChTSElGVCAqIDIpKQotICAgICAgICBzZWxmLmFzc2VydF8obmJpdHNfbG8gPD0gbmJpdHMgPD0gbmJpdHNfaGkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShuYml0c19sbyA8PSBuYml0cyA8PSBuYml0c19oaSkKICAgICAgICAgaWYgcmFuZG9tLnJhbmRvbSgpIDwgMC41OgogICAgICAgICAgICAgYW5zd2VyID0gLWFuc3dlcgogICAgICAgICByZXR1cm4gYW5zd2VyCkBAIC0xMjksOSArMTI5LDkgQEAKICAgICAgICAgZXEociwgcjIsIEZybSgiZGl2bW9kIHJldHVybnMgZGlmZmVyZW50IG1vZCB0aGFuICUlIGZvciAlciBhbmQgJXIiLCB4LCB5KSkKICAgICAgICAgZXEoeCwgcSp5ICsgciwgRnJtKCJ4ICE9IHEqeSArIHIgYWZ0ZXIgZGl2bW9kIG9uIHg9JXIsIHk9JXIiLCB4LCB5KSkKICAgICAgICAgaWYgeSA+IDA6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oMCA8PSByIDwgeSwgRnJtKCJiYWQgbW9kIGZyb20gZGl2bW9kIG9uICVyIGFuZCAlciIsIHgsIHkpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPD0gciA8IHksIEZybSgiYmFkIG1vZCBmcm9tIGRpdm1vZCBvbiAlciBhbmQgJXIiLCB4LCB5KSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh5IDwgciA8PSAwLCBGcm0oImJhZCBtb2QgZnJvbSBkaXZtb2Qgb24gJXIgYW5kICVyIiwgeCwgeSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoeSA8IHIgPD0gMCwgRnJtKCJiYWQgbW9kIGZyb20gZGl2bW9kIG9uICVyIGFuZCAlciIsIHgsIHkpKQogCiAgICAgZGVmIHRlc3RfZGl2aXNpb24oc2VsZik6CiAgICAgICAgIGRpZ2l0cyA9IHJhbmdlKDEsIE1BWERJR0lUUysxKSArIHJhbmdlKEtBUkFUU1VCQV9DVVRPRkYsCkBAIC01NTIsNyArNTUyLDcgQEAKICAgICAgICAgICAgIHkgPSBpbnQoeCkKICAgICAgICAgZXhjZXB0IE92ZXJmbG93RXJyb3I6CiAgICAgICAgICAgICBzZWxmLmZhaWwoImludChsb25nKHN5cy5tYXhpbnQpICsgMSkgbXVzdG4ndCBvdmVyZmxvdyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHksIGxvbmcpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh5LCBsb25nKSwKICAgICAgICAgICAgICJpbnQobG9uZyhzeXMubWF4aW50KSArIDEpIHNob3VsZCBoYXZlIHJldHVybmVkIGxvbmciKQogCiAgICAgICAgIHggPSBodWdlbmVnX2FzbG9uZyAtIDEKQEAgLTU2MCwxNCArNTYwLDE0IEBACiAgICAgICAgICAgICB5ID0gaW50KHgpCiAgICAgICAgIGV4Y2VwdCBPdmVyZmxvd0Vycm9yOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJpbnQobG9uZygtc3lzLm1heGludC0xKSAtIDEpIG11c3RuJ3Qgb3ZlcmZsb3ciKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh5LCBsb25nKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoeSwgbG9uZyksCiAgICAgICAgICAgICAgICAiaW50KGxvbmcoLXN5cy5tYXhpbnQtMSkgLSAxKSBzaG91bGQgaGF2ZSByZXR1cm5lZCBsb25nIikKIAogICAgICAgICBjbGFzcyBsb25nMihsb25nKToKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgeCA9IGxvbmcyKDFMPDwxMDApCiAgICAgICAgIHkgPSBpbnQoeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUoeSkgaXMgbG9uZywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoeSkgaXMgbG9uZywKICAgICAgICAgICAgICJvdmVyZmxvd2luZyBpbnQgY29udmVyc2lvbiBtdXN0IHJldHVybiBsb25nIG5vdCBsb25nIHN1YnR5cGUiKQogCiAgICAgICAgICMgbG9uZyAtPiBQeV9zc2l6ZV90IGNvbnZlcnNpb24KQEAgLTg1MCw3ICs4NTAsNyBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBsZW4oYmluKHgpLmxzdHJpcCgnLTBiJykpKQogICAgICAgICAgICAgIyBCZWhhdmlvdXIgYXMgc3BlY2lmaWVkIGluIHRoZSBkb2NzCiAgICAgICAgICAgICBpZiB4ICE9IDA6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDIqKihrLTEpIDw9IGFicyh4KSA8IDIqKmspCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIqKihrLTEpIDw9IGFicyh4KSA8IDIqKmspCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaywgMCkKICAgICAgICAgICAgICMgQWx0ZXJuYXRpdmUgZGVmaW5pdGlvbjogeC5iaXRfbGVuZ3RoKCkgPT0gMSArIGZsb29yKGxvZ18yKHgpKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tYWNwYXRoLnB5IGIvTGliL3Rlc3QvdGVzdF9tYWNwYXRoLnB5CmluZGV4IDI0NDliMGEuLjQ1NDFlYjkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWFjcGF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X21hY3BhdGgucHkKQEAgLTYsMjYgKzYsMjYgQEAKIGNsYXNzIE1hY1BhdGhUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9hYnNwYXRoKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8obWFjcGF0aC5hYnNwYXRoKCJ4eDp5eSIpID09ICJ4eDp5eSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWNwYXRoLmFic3BhdGgoInh4Onl5IikgPT0gInh4Onl5IikKIAogICAgIGRlZiB0ZXN0X2lzYWJzKHNlbGYpOgogICAgICAgICBpc2FicyA9IG1hY3BhdGguaXNhYnMKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzYWJzKCJ4eDp5eSIpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNhYnMoInh4Onl5OiIpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNhYnMoInh4OiIpKQotICAgICAgICBzZWxmLmZhaWxJZihpc2FicygiZm9vIikpCi0gICAgICAgIHNlbGYuZmFpbElmKGlzYWJzKCI6Zm9vIikpCi0gICAgICAgIHNlbGYuZmFpbElmKGlzYWJzKCI6Zm9vOmJhciIpKQotICAgICAgICBzZWxmLmZhaWxJZihpc2FicygiOmZvbzpiYXI6IikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2FicygieHg6eXkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzYWJzKCJ4eDp5eToiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzYWJzKCJ4eDoiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2FicygiZm9vIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaXNhYnMoIjpmb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2FicygiOmZvbzpiYXIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpc2FicygiOmZvbzpiYXI6IikpCiAKIAogICAgIGRlZiB0ZXN0X2NvbW1vbnByZWZpeChzZWxmKToKICAgICAgICAgY29tbW9ucHJlZml4ID0gbWFjcGF0aC5jb21tb25wcmVmaXgKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNvbW1vbnByZWZpeChbImhvbWU6c3dlbnNvbjpzcGFtIiwgImhvbWU6c3dlbjpzcGFtIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21tb25wcmVmaXgoWyJob21lOnN3ZW5zb246c3BhbSIsICJob21lOnN3ZW46c3BhbSJdKQogICAgICAgICAgICAgICAgICAgICAgPT0gImhvbWU6c3dlbiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb21tb25wcmVmaXgoWyI6aG9tZTpzd2VuOnNwYW0iLCAiOmhvbWU6c3dlbjplZ2dzIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21tb25wcmVmaXgoWyI6aG9tZTpzd2VuOnNwYW0iLCAiOmhvbWU6c3dlbjplZ2dzIl0pCiAgICAgICAgICAgICAgICAgICAgICA9PSAiOmhvbWU6c3dlbjoiKQotICAgICAgICBzZWxmLmFzc2VydF8oY29tbW9ucHJlZml4KFsiOmhvbWU6c3dlbjpzcGFtIiwgIjpob21lOnN3ZW46c3BhbSJdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY29tbW9ucHJlZml4KFsiOmhvbWU6c3dlbjpzcGFtIiwgIjpob21lOnN3ZW46c3BhbSJdKQogICAgICAgICAgICAgICAgICAgICAgPT0gIjpob21lOnN3ZW46c3BhbSIpCiAKICAgICBkZWYgdGVzdF9zcGxpdChzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weSBiL0xpYi90ZXN0L3Rlc3RfbWFpbGJveC5weQppbmRleCA2MzQyNjc2Li4yNjc1OGEzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21haWxib3gucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYWlsYm94LnB5CkBAIC0yMiwxNyArMjIsMTcgQEAKIAogICAgIGRlZiBfY2hlY2tfc2FtcGxlKHNlbGYsIG1zZyk6CiAgICAgICAgICMgSW5zcGVjdCBhIG1haWxib3guTWVzc2FnZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgc2FtcGxlIG1lc3NhZ2UKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UobXNnLCBlbWFpbC5tZXNzYWdlLk1lc3NhZ2UpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShtc2csIG1haWxib3guTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZywgZW1haWwubWVzc2FnZS5NZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnLCBtYWlsYm94Lk1lc3NhZ2UpKQogICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBfc2FtcGxlX2hlYWRlcnMuaXRlcml0ZW1zKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8odmFsdWUgaW4gbXNnLmdldF9hbGwoa2V5KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5pc19tdWx0aXBhcnQoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihtc2cuZ2V0X3BheWxvYWQoKSkgPT0gbGVuKF9zYW1wbGVfcGF5bG9hZHMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbHVlIGluIG1zZy5nZXRfYWxsKGtleSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4obXNnLmdldF9wYXlsb2FkKCkpID09IGxlbihfc2FtcGxlX3BheWxvYWRzKSkKICAgICAgICAgZm9yIGksIHBheWxvYWQgaW4gZW51bWVyYXRlKF9zYW1wbGVfcGF5bG9hZHMpOgogICAgICAgICAgICAgcGFydCA9IG1zZy5nZXRfcGF5bG9hZChpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UocGFydCwgZW1haWwubWVzc2FnZS5NZXNzYWdlKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaXNpbnN0YW5jZShwYXJ0LCBtYWlsYm94Lk1lc3NhZ2UpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHBhcnQuZ2V0X3BheWxvYWQoKSA9PSBwYXlsb2FkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocGFydCwgZW1haWwubWVzc2FnZS5NZXNzYWdlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaXNpbnN0YW5jZShwYXJ0LCBtYWlsYm94Lk1lc3NhZ2UpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhcnQuZ2V0X3BheWxvYWQoKSA9PSBwYXlsb2FkKQogCiAgICAgZGVmIF9kZWxldGVfcmVjdXJzaXZlbHkoc2VsZiwgdGFyZ2V0KToKICAgICAgICAgIyBEZWxldGUgYSBmaWxlIG9yIGRlbGV0ZSBhIGRpcmVjdG9yeSByZWN1cnNpdmVseQpAQCAtNjUsMTYgKzY1LDE2IEBACiAgICAgICAgICMgQWRkIGNvcGllcyBvZiBhIHNhbXBsZSBtZXNzYWdlCiAgICAgICAgIGtleXMgPSBbXQogICAgICAgICBrZXlzLmFwcGVuZChzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveCkgPT0gMSkKICAgICAgICAga2V5cy5hcHBlbmQoc2VsZi5fYm94LmFkZChtYWlsYm94Lk1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveCkgPT0gMikKICAgICAgICAga2V5cy5hcHBlbmQoc2VsZi5fYm94LmFkZChlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKF9zYW1wbGVfbWVzc2FnZSkpKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gpID09IDMpCiAgICAgICAgIGtleXMuYXBwZW5kKHNlbGYuX2JveC5hZGQoU3RyaW5nSU8uU3RyaW5nSU8oX3NhbXBsZV9tZXNzYWdlKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSA0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveCkgPT0gNCkKICAgICAgICAga2V5cy5hcHBlbmQoc2VsZi5fYm94LmFkZChfc2FtcGxlX21lc3NhZ2UpKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gNSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleXNbMF0pID09IHNlbGYuX3RlbXBsYXRlICUgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gpID09IDUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXlzWzBdKSA9PSBzZWxmLl90ZW1wbGF0ZSAlIDApCiAgICAgICAgIGZvciBpIGluICgxLCAyLCAzLCA0KToKICAgICAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3hba2V5c1tpXV0pCiAKQEAgLTkwLDIzICs5MCwyMyBAQAogICAgICAgICAjIChVc2VkIGJ5IHRlc3RfcmVtb3ZlKCkgYW5kIHRlc3RfZGVsaXRlbSgpLikKICAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQogICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveCkgPT0gMikKICAgICAgICAgbWV0aG9kKGtleTApCiAgICAgICAgIGwgPSBsZW4oc2VsZi5fYm94KQotICAgICAgICBzZWxmLmFzc2VydF8obCA9PSAxLCAiYWN0dWFsIGw6ICVzIiAlIGwpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsID09IDEsICJhY3R1YWwgbDogJXMiICUgbCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94W2tleTBdKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBtZXRob2Qoa2V5MCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PSBzZWxmLl90ZW1wbGF0ZSAlIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PSBzZWxmLl90ZW1wbGF0ZSAlIDEpCiAgICAgICAgIGtleTIgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSAyKQogICAgICAgICBtZXRob2Qoa2V5MikKICAgICAgICAgbCA9IGxlbihzZWxmLl9ib3gpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsID09IDEsICJhY3R1YWwgbDogJXMiICUgbCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGwgPT0gMSwgImFjdHVhbCBsOiAlcyIgJSBsKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5Ml0pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IG1ldGhvZChrZXkyKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTEpID09IHNlbGYuX3RlbXBsYXRlICUgMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTEpID09IHNlbGYuX3RlbXBsYXRlICUgMSkKICAgICAgICAgbWV0aG9kKGtleTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveCkgPT0gMCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94W2tleTFdKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBtZXRob2Qoa2V5MSkpCiAKQEAgLTExNCwzNSArMTE0LDM1IEBACiAgICAgICAgICMgRGlzY2FyZCBtZXNzYWdlcwogICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCiAgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSAyKQogICAgICAgICBzZWxmLl9ib3guZGlzY2FyZChrZXkwKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gpID09IDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveFtrZXkwXSkKICAgICAgICAgc2VsZi5fYm94LmRpc2NhcmQoa2V5MCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSAxKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5MF0pCiAKICAgICBkZWYgdGVzdF9nZXQoc2VsZik6CiAgICAgICAgICMgUmV0cmlldmUgbWVzc2FnZXMgdXNpbmcgZ2V0KCkKICAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQogICAgICAgICBtc2cgPSBzZWxmLl9ib3guZ2V0KGtleTApCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dbJ2Zyb20nXSA9PSAnZm9vJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfcGF5bG9hZCgpID09ICcwJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXQoJ2ZvbycpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0KCdmb28nLCBGYWxzZSkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2dbJ2Zyb20nXSA9PSAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfcGF5bG9hZCgpID09ICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXQoJ2ZvbycpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0KCdmb28nLCBGYWxzZSkgaXMgRmFsc2UpCiAgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCiAgICAgICAgIHNlbGYuX2JveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCwgZmFjdG9yeT1yZmM4MjIuTWVzc2FnZSkKICAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQogICAgICAgICBtc2cgPSBzZWxmLl9ib3guZ2V0KGtleTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dbJ2Zyb20nXSA9PSAnZm9vJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5mcC5yZWFkKCkgPT0gJzEnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnWydmcm9tJ10gPT0gJ2ZvbycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZnAucmVhZCgpID09ICcxJykKIAogICAgIGRlZiB0ZXN0X2dldGl0ZW0oc2VsZik6CiAgICAgICAgICMgUmV0cmlldmUgbWVzc2FnZSB1c2luZyBfX2dldGl0ZW1fXygpCiAgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKICAgICAgICAgbXNnID0gc2VsZi5fYm94W2tleTBdCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dbJ2Zyb20nXSA9PSAnZm9vJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfcGF5bG9hZCgpID09ICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZ1snZnJvbSddID09ICdmb28nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9wYXlsb2FkKCkgPT0gJzAnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hbJ2ZvbyddKQogICAgICAgICBzZWxmLl9ib3guZGlzY2FyZChrZXkwKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5MF0pCkBAIC0xNTIsMjUgKzE1MiwyNSBAQAogICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCiAgICAgICAgIGtleTEgPSBzZWxmLl9ib3guYWRkKF9zYW1wbGVfbWVzc2FnZSkKICAgICAgICAgbXNnMCA9IHNlbGYuX2JveC5nZXRfbWVzc2FnZShrZXkwKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShtc2cwLCBtYWlsYm94Lk1lc3NhZ2UpKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnMFsnZnJvbSddID09ICdmb28nKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnMC5nZXRfcGF5bG9hZCgpID09ICcwJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMCwgbWFpbGJveC5NZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZzBbJ2Zyb20nXSA9PSAnZm9vJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZzAuZ2V0X3BheWxvYWQoKSA9PSAnMCcpCiAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5MSkpCiAKICAgICBkZWYgdGVzdF9nZXRfc3RyaW5nKHNlbGYpOgogICAgICAgICAjIEdldCBzdHJpbmcgcmVwcmVzZW50YXRpb25zIG9mIG1lc3NhZ2VzCiAgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKICAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoX3NhbXBsZV9tZXNzYWdlKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0gc2VsZi5fdGVtcGxhdGUgJSAwKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSkgPT0gX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0gc2VsZi5fdGVtcGxhdGUgJSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSkgPT0gX3NhbXBsZV9tZXNzYWdlKQogCiAgICAgZGVmIHRlc3RfZ2V0X2ZpbGUoc2VsZik6CiAgICAgICAgICMgR2V0IGZpbGUgcmVwcmVzZW50YXRpb25zIG9mIG1lc3NhZ2VzCiAgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKICAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoX3NhbXBsZV9tZXNzYWdlKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9maWxlKGtleTApLnJlYWQoKS5yZXBsYWNlKG9zLmxpbmVzZXAsICdcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X2ZpbGUoa2V5MCkucmVhZCgpLnJlcGxhY2Uob3MubGluZXNlcCwgJ1xuJykKICAgICAgICAgICAgICAgICAgICAgID09IHNlbGYuX3RlbXBsYXRlICUgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfZmlsZShrZXkxKS5yZWFkKCkucmVwbGFjZShvcy5saW5lc2VwLCAnXG4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9maWxlKGtleTEpLnJlYWQoKS5yZXBsYWNlKG9zLmxpbmVzZXAsICdcbicpCiAgICAgICAgICAgICAgICAgICAgICA9PSBfc2FtcGxlX21lc3NhZ2UpCiAKICAgICBkZWYgdGVzdF9pdGVya2V5cyhzZWxmKToKQEAgLTIyMSwxNSArMjIxLDE1IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuZWRfa2V5cy5hcHBlbmQoa2V5KQogICAgICAgICAgICAgICAgIHJldHVybmVkX3ZhbHVlcy5hcHBlbmQodmFsdWUpCiAgICAgICAgIGlmIGRvX2tleXM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obGVuKGtleXMpID09IGxlbihyZXR1cm5lZF9rZXlzKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzZXQoa2V5cykgPT0gc2V0KHJldHVybmVkX2tleXMpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihrZXlzKSA9PSBsZW4ocmV0dXJuZWRfa2V5cykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KGtleXMpID09IHNldChyZXR1cm5lZF9rZXlzKSkKICAgICAgICAgaWYgZG9fdmFsdWVzOgogICAgICAgICAgICAgY291bnQgPSAwCiAgICAgICAgICAgICBmb3IgdmFsdWUgaW4gcmV0dXJuZWRfdmFsdWVzOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2YWx1ZVsnZnJvbSddID09ICdmb28nKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhpbnQodmFsdWUuZ2V0X3BheWxvYWQoKSkgPCByZXBldGl0aW9ucykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsdWVbJ2Zyb20nXSA9PSAnZm9vJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50KHZhbHVlLmdldF9wYXlsb2FkKCkpIDwgcmVwZXRpdGlvbnMpCiAgICAgICAgICAgICAgICAgY291bnQgKz0gMQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbih2YWx1ZXMpID09IGNvdW50KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih2YWx1ZXMpID09IGNvdW50KQogCiAgICAgZGVmIHRlc3RfaGFzX2tleShzZWxmKToKICAgICAgICAgIyBDaGVjayBleGlzdGVuY2Ugb2Yga2V5cyB1c2luZyBoYXNfa2V5KCkKQEAgLTI0MSw2MSArMjQxLDYxIEBACiAKICAgICBkZWYgX3Rlc3RfaGFzX2tleV9vcl9jb250YWlucyhzZWxmLCBtZXRob2QpOgogICAgICAgICAjIChVc2VkIGJ5IHRlc3RfaGFzX2tleSgpIGFuZCB0ZXN0X2NvbnRhaW5zKCkuKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IG1ldGhvZCgnZm9vJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgbWV0aG9kKCdmb28nKSkKICAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQotICAgICAgICBzZWxmLmFzc2VydF8obWV0aG9kKGtleTApKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IG1ldGhvZCgnZm9vJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXRob2Qoa2V5MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgbWV0aG9kKCdmb28nKSkKICAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQotICAgICAgICBzZWxmLmFzc2VydF8obWV0aG9kKGtleTEpKQotICAgICAgICBzZWxmLmFzc2VydF8obWV0aG9kKGtleTApKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IG1ldGhvZCgnZm9vJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXRob2Qoa2V5MSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXRob2Qoa2V5MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgbWV0aG9kKCdmb28nKSkKICAgICAgICAgc2VsZi5fYm94LnJlbW92ZShrZXkwKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IG1ldGhvZChrZXkwKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1ldGhvZChrZXkxKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBtZXRob2QoJ2ZvbycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG1ldGhvZChrZXkwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1ldGhvZChrZXkxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBtZXRob2QoJ2ZvbycpKQogICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgbWV0aG9kKGtleTEpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IG1ldGhvZChrZXkwKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBtZXRob2QoJ2ZvbycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG1ldGhvZChrZXkxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBtZXRob2Qoa2V5MCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgbWV0aG9kKCdmb28nKSkKIAogICAgIGRlZiB0ZXN0X2xlbihzZWxmLCByZXBldGl0aW9ucz0xMCk6CiAgICAgICAgICMgR2V0IG1lc3NhZ2UgY291bnQKICAgICAgICAga2V5cyA9IFtdCiAgICAgICAgIGZvciBpIGluIHhyYW5nZShyZXBldGl0aW9ucyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSBpKQogICAgICAgICAgICAga2V5cy5hcHBlbmQoc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIGkpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IGkgKyAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gpID09IGkgKyAxKQogICAgICAgICBmb3IgaSBpbiB4cmFuZ2UocmVwZXRpdGlvbnMpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IHJlcGV0aXRpb25zIC0gaSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSByZXBldGl0aW9ucyAtIGkpCiAgICAgICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleXNbaV0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gcmVwZXRpdGlvbnMgLSBpIC0gMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSByZXBldGl0aW9ucyAtIGkgLSAxKQogCiAgICAgZGVmIHRlc3Rfc2V0X2l0ZW0oc2VsZik6CiAgICAgICAgICMgTW9kaWZ5IG1lc3NhZ2VzIHVzaW5nIF9fc2V0aXRlbV9fKCkKICAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSA9PSBcCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSA9PSBcCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAwJykKICAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PSBcCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PSBcCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAxJykKICAgICAgICAgc2VsZi5fYm94W2tleTBdID0gc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAwJwotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0gXAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0gXAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAwJykKICAgICAgICAgc2VsZi5fYm94W2tleTFdID0gc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAxJwotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSkgPT0gXAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSkgPT0gXAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAxJykKICAgICAgICAgc2VsZi5fYm94W2tleTBdID0gX3NhbXBsZV9tZXNzYWdlCiAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3hba2V5MF0pCiAgICAgICAgIHNlbGYuX2JveFtrZXkxXSA9IHNlbGYuX2JveFtrZXkwXQogICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUoc2VsZi5fYm94W2tleTFdKQogICAgICAgICBzZWxmLl9ib3hba2V5MF0gPSBzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAwJwotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTApID09CiAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAwJykKICAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKHNlbGYuX2JveFtrZXkxXSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTogc2VsZi5fYm94Ll9fc2V0aXRlbV9fKCdmb28nLCAnYmFyJykpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveFsnZm9vJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveCkgPT0gMikKIAogICAgIGRlZiB0ZXN0X2NsZWFyKHNlbGYsIGl0ZXJhdGlvbnM9MTApOgogICAgICAgICAjIFJlbW92ZSBhbGwgbWVzc2FnZXMgdXNpbmcgY2xlYXIoKQpAQCAtMzAzLDI5ICszMDMsMjkgQEAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGl0ZXJhdGlvbnMpOgogICAgICAgICAgICAgc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIGkpCiAgICAgICAgIGZvciBpLCBrZXkgaW4gZW51bWVyYXRlKGtleXMpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSkgPT0gc2VsZi5fdGVtcGxhdGUgJSBpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSkgPT0gc2VsZi5fdGVtcGxhdGUgJSBpKQogICAgICAgICBzZWxmLl9ib3guY2xlYXIoKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gpID09IDApCiAgICAgICAgIGZvciBpLCBrZXkgaW4gZW51bWVyYXRlKGtleXMpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5KSkKIAogICAgIGRlZiB0ZXN0X3BvcChzZWxmKToKICAgICAgICAgIyBHZXQgYW5kIHJlbW92ZSBhIG1lc3NhZ2UgdXNpbmcgcG9wKCkKICAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAwKQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MCBpbiBzZWxmLl9ib3gpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrZXkwIGluIHNlbGYuX2JveCkKICAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MSBpbiBzZWxmLl9ib3gpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3gucG9wKGtleTApLmdldF9wYXlsb2FkKCkgPT0gJzAnKQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MCBub3QgaW4gc2VsZi5fYm94KQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MSBpbiBzZWxmLl9ib3gpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrZXkxIGluIHNlbGYuX2JveCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5wb3Aoa2V5MCkuZ2V0X3BheWxvYWQoKSA9PSAnMCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrZXkwIG5vdCBpbiBzZWxmLl9ib3gpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrZXkxIGluIHNlbGYuX2JveCkKICAgICAgICAga2V5MiA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAyKQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MiBpbiBzZWxmLl9ib3gpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3gucG9wKGtleTIpLmdldF9wYXlsb2FkKCkgPT0gJzInKQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MiBub3QgaW4gc2VsZi5fYm94KQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MSBpbiBzZWxmLl9ib3gpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3gucG9wKGtleTEpLmdldF9wYXlsb2FkKCkgPT0gJzEnKQotICAgICAgICBzZWxmLmFzc2VydF8oa2V5MSBub3QgaW4gc2VsZi5fYm94KQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGtleTIgaW4gc2VsZi5fYm94KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LnBvcChrZXkyKS5nZXRfcGF5bG9hZCgpID09ICcyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGtleTIgbm90IGluIHNlbGYuX2JveCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGtleTEgaW4gc2VsZi5fYm94KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LnBvcChrZXkxKS5nZXRfcGF5bG9hZCgpID09ICcxJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGtleTEgbm90IGluIHNlbGYuX2JveCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gpID09IDApCiAKICAgICBkZWYgdGVzdF9wb3BpdGVtKHNlbGYsIGl0ZXJhdGlvbnM9MTApOgogICAgICAgICAjIEdldCBhbmQgcmVtb3ZlIGFuIGFyYml0cmFyeSAoa2V5LCBtZXNzYWdlKSB1c2luZyBwb3BpdGVtKCkKQEAgLTMzNSwxMSArMzM1LDExIEBACiAgICAgICAgIHNlZW4gPSBbXQogICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTApOgogICAgICAgICAgICAga2V5LCBtc2cgPSBzZWxmLl9ib3gucG9waXRlbSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oa2V5IGluIGtleXMpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oa2V5IG5vdCBpbiBzZWVuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGtleSBpbiBrZXlzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGtleSBub3QgaW4gc2VlbikKICAgICAgICAgICAgIHNlZW4uYXBwZW5kKGtleSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhpbnQobXNnLmdldF9wYXlsb2FkKCkpID09IGtleXMuaW5kZXgoa2V5KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDApCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50KG1zZy5nZXRfcGF5bG9hZCgpKSA9PSBrZXlzLmluZGV4KGtleSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSAwKQogICAgICAgICBmb3Iga2V5IGluIGtleXM6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgbGFtYmRhOiBzZWxmLl9ib3hba2V5XSkKIApAQCAtMzUwLDMxICszNTAsMzEgQEAKICAgICAgICAga2V5MiA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMicpCiAgICAgICAgIHNlbGYuX2JveC51cGRhdGUoe2tleTA6IHNlbGYuX3RlbXBsYXRlICUgJ2NoYW5nZWQgMCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTI6IF9zYW1wbGVfbWVzc2FnZX0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94KSA9PSAzKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gpID09IDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSA9PQogICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAwJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTEpID09CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PQogICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMScpCiAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShzZWxmLl9ib3hba2V5Ml0pCiAgICAgICAgIHNlbGYuX2JveC51cGRhdGUoWyhrZXkyLCBzZWxmLl90ZW1wbGF0ZSAlICdjaGFuZ2VkIDInKSwKICAgICAgICAgICAgICAgICAgICAgKGtleTEsIHNlbGYuX3RlbXBsYXRlICUgJ2NoYW5nZWQgMScpLAogICAgICAgICAgICAgICAgICAgICAoa2V5MCwgc2VsZi5fdGVtcGxhdGUgJSAnb3JpZ2luYWwgMCcpXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkwKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveCkgPT0gMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTApID09CiAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdvcmlnaW5hbCAwJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTEpID09CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PQogICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAxJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTIpID09CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkyKSA9PQogICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnY2hhbmdlZCAyJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTogc2VsZi5fYm94LnVwZGF0ZSh7J2Zvbyc6ICdiYXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5MDogc2VsZi5fdGVtcGxhdGUgJSAiY2hhbmdlZCAwIn0pKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveCkgPT0gMykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleTApID09CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSAzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MCkgPT0KICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgImNoYW5nZWQgMCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkxKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MSkgPT0KICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgImNoYW5nZWQgMSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3N0cmluZyhrZXkyKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5MikgPT0KICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3RlbXBsYXRlICUgImNoYW5nZWQgMiIpCiAKICAgICBkZWYgdGVzdF9mbHVzaChzZWxmKToKQEAgLTM4MywxMSArMzgzLDExIEBACiAKICAgICBkZWYgdGVzdF9sb2NrX3VubG9jayhzZWxmKToKICAgICAgICAgIyBMb2NrIGFuZCB1bmxvY2sgdGhlIG1haWxib3gKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLl9nZXRfbG9ja19wYXRoKCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHNlbGYuX2dldF9sb2NrX3BhdGgoKSkpCiAgICAgICAgIHNlbGYuX2JveC5sb2NrKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKHNlbGYuX2dldF9sb2NrX3BhdGgoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzZWxmLl9nZXRfbG9ja19wYXRoKCkpKQogICAgICAgICBzZWxmLl9ib3gudW5sb2NrKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLl9nZXRfbG9ja19wYXRoKCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHNlbGYuX2dldF9sb2NrX3BhdGgoKSkpCiAKICAgICBkZWYgdGVzdF9jbG9zZShzZWxmKToKICAgICAgICAgIyBDbG9zZSBtYWlsYm94IGFuZCBmbHVzaCBjaGFuZ2VzIHRvIGRpc2sKQEAgLTQwMyw5ICs0MDMsOSBAQAogICAgICAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKICAgICAgICAgc2VsZi5fYm94ID0gc2VsZi5fZmFjdG9yeShzZWxmLl9wYXRoKQogICAgICAgICBrZXlzID0gc2VsZi5fYm94LmtleXMoKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGtleXMpID09IDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oa2V5cykgPT0gMykKICAgICAgICAgZm9yIGtleSBpbiBrZXlzOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSkgaW4gY29udGVudHMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zdHJpbmcoa2V5KSBpbiBjb250ZW50cykKIAogICAgIGRlZiB0ZXN0X2R1bXBfbWVzc2FnZShzZWxmKToKICAgICAgICAgIyBXcml0ZSBtZXNzYWdlIHJlcHJlc2VudGF0aW9ucyB0byBkaXNrCkBAIC00MTMsNyArNDEzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBfc2FtcGxlX21lc3NhZ2UsIFN0cmluZ0lPLlN0cmluZ0lPKF9zYW1wbGVfbWVzc2FnZSkpOgogICAgICAgICAgICAgb3V0cHV0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQogICAgICAgICAgICAgc2VsZi5fYm94Ll9kdW1wX21lc3NhZ2UoaW5wdXQsIG91dHB1dCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvdXRwdXQuZ2V0dmFsdWUoKSA9PQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG91dHB1dC5nZXR2YWx1ZSgpID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgX3NhbXBsZV9tZXNzYWdlLnJlcGxhY2UoJ1xuJywgb3MubGluZXNlcCkpCiAgICAgICAgIG91dHB1dCA9IFN0cmluZ0lPLlN0cmluZ0lPKCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLApAQCAtNDc0LDcgKzQ3NCw3IEBACiAgICAgICAgIG1zZy5zZXRfc3ViZGlyKCdjdXInKQogICAgICAgICBtc2cuc2V0X2luZm8oJ2ZvbycpCiAgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQobXNnKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICdjdXInLCAnJXMlc2ZvbycgJQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICdjdXInLCAnJXMlc2ZvbycgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrZXksIHNlbGYuX2JveC5jb2xvbikpKSkKIAogICAgIGRlZiB0ZXN0X2dldF9NTShzZWxmKToKQEAgLTQ4NCw5ICs0ODQsOSBAQAogICAgICAgICBtc2cuc2V0X2ZsYWdzKCdSRicpCiAgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQobXNnKQogICAgICAgICBtc2dfcmV0dXJuZWQgPSBzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5KQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShtc2dfcmV0dXJuZWQsIG1haWxib3guTWFpbGRpck1lc3NhZ2UpKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnX3JldHVybmVkLmdldF9zdWJkaXIoKSA9PSAnY3VyJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZ19yZXR1cm5lZC5nZXRfZmxhZ3MoKSA9PSAnRlInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2dfcmV0dXJuZWQsIG1haWxib3guTWFpbGRpck1lc3NhZ2UpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnX3JldHVybmVkLmdldF9zdWJkaXIoKSA9PSAnY3VyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZ19yZXR1cm5lZC5nZXRfZmxhZ3MoKSA9PSAnRlInKQogCiAgICAgZGVmIHRlc3Rfc2V0X01NKHNlbGYpOgogICAgICAgICAjIFNldCB3aXRoIGEgTWFpbGRpck1lc3NhZ2UgaW5zdGFuY2UKQEAgLTQ5NCwyMiArNDk0LDIyIEBACiAgICAgICAgIG1zZzAuc2V0X2ZsYWdzKCdUUCcpCiAgICAgICAgIGtleSA9IHNlbGYuX2JveC5hZGQobXNnMCkKICAgICAgICAgbXNnX3JldHVybmVkID0gc2VsZi5fYm94LmdldF9tZXNzYWdlKGtleSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZ19yZXR1cm5lZC5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dfcmV0dXJuZWQuZ2V0X2ZsYWdzKCkgPT0gJ1BUJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZ19yZXR1cm5lZC5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2dfcmV0dXJuZWQuZ2V0X2ZsYWdzKCkgPT0gJ1BUJykKICAgICAgICAgbXNnMSA9IG1haWxib3guTWFpbGRpck1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAxKQogICAgICAgICBzZWxmLl9ib3hba2V5XSA9IG1zZzEKICAgICAgICAgbXNnX3JldHVybmVkID0gc2VsZi5fYm94LmdldF9tZXNzYWdlKGtleSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZ19yZXR1cm5lZC5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dfcmV0dXJuZWQuZ2V0X2ZsYWdzKCkgPT0gJycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dfcmV0dXJuZWQuZ2V0X3BheWxvYWQoKSA9PSAnMScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2dfcmV0dXJuZWQuZ2V0X3N1YmRpcigpID09ICduZXcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnX3JldHVybmVkLmdldF9mbGFncygpID09ICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnX3JldHVybmVkLmdldF9wYXlsb2FkKCkgPT0gJzEnKQogICAgICAgICBtc2cyID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDIpCiAgICAgICAgIG1zZzIuc2V0X2luZm8oJzIsUycpCiAgICAgICAgIHNlbGYuX2JveFtrZXldID0gbXNnMgogICAgICAgICBzZWxmLl9ib3hba2V5XSA9IHNlbGYuX3RlbXBsYXRlICUgMwogICAgICAgICBtc2dfcmV0dXJuZWQgPSBzZWxmLl9ib3guZ2V0X21lc3NhZ2Uoa2V5KQotICAgICAgICBzZWxmLmFzc2VydF8obXNnX3JldHVybmVkLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZ19yZXR1cm5lZC5nZXRfZmxhZ3MoKSA9PSAnUycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dfcmV0dXJuZWQuZ2V0X3BheWxvYWQoKSA9PSAnMycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2dfcmV0dXJuZWQuZ2V0X3N1YmRpcigpID09ICduZXcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnX3JldHVybmVkLmdldF9mbGFncygpID09ICdTJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZ19yZXR1cm5lZC5nZXRfcGF5bG9hZCgpID09ICczJykKIAogICAgIGRlZiB0ZXN0X2NvbnNpc3RlbnRfZmFjdG9yeShzZWxmKToKICAgICAgICAgIyBBZGQgYSBtZXNzYWdlLgpAQCAtNTI0LDcgKzUyNCw3IEBACiAgICAgICAgIGJveCA9IG1haWxib3guTWFpbGRpcihzZWxmLl9wYXRoLCBmYWN0b3J5PUZha2VNZXNzYWdlKQogICAgICAgICBib3guY29sb24gPSBzZWxmLl9ib3guY29sb24KICAgICAgICAgbXNnMiA9IGJveC5nZXRfbWVzc2FnZShrZXkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKG1zZzIsIEZha2VNZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnMiwgRmFrZU1lc3NhZ2UpKQogCiAgICAgZGVmIHRlc3RfaW5pdGlhbGl6ZV9uZXcoc2VsZik6CiAgICAgICAgICMgSW5pdGlhbGl6ZSBhIG5vbi1leGlzdGVudCBtYWlsYm94CkBAIC01NTIsMTUgKzU1MiwxNSBAQAogICAgICAgICBmb3Igc3ViZGlyIGluICcnLCAndG1wJywgJ25ldycsICdjdXInOgogICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCBzdWJkaXIpCiAgICAgICAgICAgICBtb2RlID0gb3Muc3RhdChwYXRoKVtzdGF0LlNUX01PREVdCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oc3RhdC5TX0lTRElSKG1vZGUpLCAiTm90IGEgZGlyZWN0b3J5OiAnJXMnIiAlIHBhdGgpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RhdC5TX0lTRElSKG1vZGUpLCAiTm90IGEgZGlyZWN0b3J5OiAnJXMnIiAlIHBhdGgpCiAKICAgICBkZWYgdGVzdF9saXN0X2ZvbGRlcnMoc2VsZik6CiAgICAgICAgICMgTGlzdCBmb2xkZXJzCiAgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCdvbmUnKQogICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcigndHdvJykKICAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ3RocmVlJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09CiAgICAgICAgICAgICAgICAgICAgICBzZXQoKCdvbmUnLCAndHdvJywgJ3RocmVlJykpKQogCiAgICAgZGVmIHRlc3RfZ2V0X2ZvbGRlcihzZWxmKToKQEAgLTU2OCwyOSArNTY4LDI5IEBACiAgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCdmb28uYmFyJykKICAgICAgICAgZm9sZGVyMCA9IHNlbGYuX2JveC5nZXRfZm9sZGVyKCdmb28uYmFyJykKICAgICAgICAgZm9sZGVyMC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnYmFyJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcuZm9vLmJhcicpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICcuZm9vLmJhcicpKSkKICAgICAgICAgZm9sZGVyMSA9IHNlbGYuX2JveC5nZXRfZm9sZGVyKCdmb28uYmFyJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGZvbGRlcjEuZ2V0X3N0cmluZyhmb2xkZXIxLmtleXMoKVswXSkgPT0gXAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9sZGVyMS5nZXRfc3RyaW5nKGZvbGRlcjEua2V5cygpWzBdKSA9PSBcCiAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90ZW1wbGF0ZSAlICdiYXInKQogCiAgICAgZGVmIHRlc3RfYWRkX2FuZF9yZW1vdmVfZm9sZGVycyhzZWxmKToKICAgICAgICAgIyBEZWxldGUgZm9sZGVycwogICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcignb25lJykKICAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ3R3bycpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAyKQotICAgICAgICBzZWxmLmFzc2VydF8oc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gc2V0KCgnb25lJywgJ3R3bycpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSBzZXQoKCdvbmUnLCAndHdvJykpKQogICAgICAgICBzZWxmLl9ib3gucmVtb3ZlX2ZvbGRlcignb25lJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSBzZXQoKCd0d28nLCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ3R3bycsKSkpCiAgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0aHJlZScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAyKQotICAgICAgICBzZWxmLmFzc2VydF8oc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gc2V0KCgndHdvJywgJ3RocmVlJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ3R3bycsICd0aHJlZScpKSkKICAgICAgICAgc2VsZi5fYm94LnJlbW92ZV9mb2xkZXIoJ3RocmVlJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSBzZXQoKCd0d28nLCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ3R3bycsKSkpCiAgICAgICAgIHNlbGYuX2JveC5yZW1vdmVfZm9sZGVyKCd0d28nKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkgPT0gW10pCiAKICAgICBkZWYgdGVzdF9jbGVhbihzZWxmKToKICAgICAgICAgIyBSZW1vdmUgb2xkIGZpbGVzIGZyb20gJ3RtcCcKQEAgLTYwMywxNCArNjAzLDE0IEBACiAgICAgICAgIGYud3JpdGUoIkAiKQogICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgc2VsZi5fYm94LmNsZWFuKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKGZvb19wYXRoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKGJhcl9wYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGZvb19wYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGJhcl9wYXRoKSkKICAgICAgICAgZm9vX3N0YXQgPSBvcy5zdGF0KGZvb19wYXRoKQogICAgICAgICBvcy51dGltZShmb29fcGF0aCwgKHRpbWUudGltZSgpIC0gMTI5NjAwIC0gMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb29fc3RhdC5zdF9tdGltZSkpCiAgICAgICAgIHNlbGYuX2JveC5jbGVhbigpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgb3MucGF0aC5leGlzdHMoZm9vX3BhdGgpKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5leGlzdHMoYmFyX3BhdGgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKGZvb19wYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGJhcl9wYXRoKSkKIAogICAgIGRlZiB0ZXN0X2NyZWF0ZV90bXAoc2VsZiwgcmVwZXRpdGlvbnM9MTApOgogICAgICAgICAjIENyZWF0ZSBmaWxlcyBpbiB0bXAgZGlyZWN0b3J5CkBAIC02MzAsNDkgKzYzMCw0OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0bXAiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGaWxlIGluIHdyb25nIGxvY2F0aW9uOiAnJXMnIiAlIGhlYWQpCiAgICAgICAgICAgICBtYXRjaCA9IHBhdHRlcm4ubWF0Y2godGFpbCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRjaCBpcyBub3QgTm9uZSwgIkludmFsaWQgZmlsZSBuYW1lOiAnJXMnIiAlIHRhaWwpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0Y2ggaXMgbm90IE5vbmUsICJJbnZhbGlkIGZpbGUgbmFtZTogJyVzJyIgJSB0YWlsKQogICAgICAgICAgICAgZ3JvdXBzID0gbWF0Y2guZ3JvdXBzKCkKICAgICAgICAgICAgIGlmIHByZXZpb3VzX2dyb3VwcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaW50KGdyb3Vwc1swXSA+PSBwcmV2aW91c19ncm91cHNbMF0pLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnQoZ3JvdXBzWzBdID49IHByZXZpb3VzX2dyb3Vwc1swXSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOb24tbW9ub3RvbmljIHNlY29uZHM6ICclcycgYmVmb3JlICclcyciICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXZpb3VzX2dyb3Vwc1swXSwgZ3JvdXBzWzBdKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaW50KGdyb3Vwc1sxXSA+PSBwcmV2aW91c19ncm91cHNbMV0pIG9yCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGludChncm91cHNbMV0gPj0gcHJldmlvdXNfZ3JvdXBzWzFdKSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHNbMF0gIT0gZ3JvdXBzWzFdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLW1vbm90b25pYyBtaWxsaXNlY29uZHM6ICclcycgYmVmb3JlICclcyciICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZXZpb3VzX2dyb3Vwc1sxXSwgZ3JvdXBzWzFdKSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaW50KGdyb3Vwc1syXSkgPT0gcGlkLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnQoZ3JvdXBzWzJdKSA9PSBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm9jZXNzIElEIG1pc21hdGNoOiAnJXMnIHNob3VsZCBiZSAnJXMnIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChncm91cHNbMl0sIHBpZCkpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGludChncm91cHNbM10pID09IGludChwcmV2aW91c19ncm91cHNbM10pICsgMSwKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaW50KGdyb3Vwc1szXSkgPT0gaW50KHByZXZpb3VzX2dyb3Vwc1szXSkgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm9uLXNlcXVlbnRpYWwgY291bnRlcjogJyVzJyBiZWZvcmUgJyVzJyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJldmlvdXNfZ3JvdXBzWzNdLCBncm91cHNbM10pKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhncm91cHNbNF0gPT0gaG9zdG5hbWUsCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGdyb3Vwc1s0XSA9PSBob3N0bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvc3QgbmFtZSBtaXNtYXRjaDogJyVzJyBzaG91bGQgYmUgJyVzJyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ3JvdXBzWzRdLCBob3N0bmFtZSkpCiAgICAgICAgICAgICBwcmV2aW91c19ncm91cHMgPSBncm91cHMKICAgICAgICAgICAgIHRtcF9maWxlLndyaXRlKF9zYW1wbGVfbWVzc2FnZSkKICAgICAgICAgICAgIHRtcF9maWxlLnNlZWsoMCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0bXBfZmlsZS5yZWFkKCkgPT0gX3NhbXBsZV9tZXNzYWdlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRtcF9maWxlLnJlYWQoKSA9PSBfc2FtcGxlX21lc3NhZ2UpCiAgICAgICAgICAgICB0bXBfZmlsZS5jbG9zZSgpCiAgICAgICAgIGZpbGVfY291bnQgPSBsZW4ob3MubGlzdGRpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgInRtcCIpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGZpbGVfY291bnQgPT0gcmVwZXRpdGlvbnMsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWxlX2NvdW50ID09IHJlcGV0aXRpb25zLAogICAgICAgICAgICAgICAgICAgICAgIldyb25nIGZpbGUgY291bnQ6ICclcycgc2hvdWxkIGJlICclcyciICUKICAgICAgICAgICAgICAgICAgICAgIChmaWxlX2NvdW50LCByZXBldGl0aW9ucykpCiAKICAgICBkZWYgdGVzdF9yZWZyZXNoKHNlbGYpOgogICAgICAgICAjIFVwZGF0ZSB0aGUgdGFibGUgb2YgY29udGVudHMKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5fdG9jID09IHt9KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94Ll90b2MgPT0ge30pCiAgICAgICAgIGtleTAgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMCkKICAgICAgICAga2V5MSA9IHNlbGYuX2JveC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAxKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94Ll90b2MgPT0ge30pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guX3RvYyA9PSB7fSkKICAgICAgICAgc2VsZi5fYm94Ll9yZWZyZXNoKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5fdG9jID09IHtrZXkwOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94Ll90b2MgPT0ge2tleTA6IG9zLnBhdGguam9pbignbmV3Jywga2V5MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5MTogb3MucGF0aC5qb2luKCduZXcnLCBrZXkxKX0pCiAgICAgICAgIGtleTIgPSBzZWxmLl9ib3guYWRkKHNlbGYuX3RlbXBsYXRlICUgMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5fdG9jID09IHtrZXkwOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94Ll90b2MgPT0ge2tleTA6IG9zLnBhdGguam9pbignbmV3Jywga2V5MCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5MTogb3MucGF0aC5qb2luKCduZXcnLCBrZXkxKX0pCiAgICAgICAgIHNlbGYuX2JveC5fcmVmcmVzaCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guX3RvYyA9PSB7a2V5MDogb3MucGF0aC5qb2luKCduZXcnLCBrZXkwKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5fdG9jID09IHtrZXkwOiBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTE6IG9zLnBhdGguam9pbignbmV3Jywga2V5MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5Mjogb3MucGF0aC5qb2luKCduZXcnLCBrZXkyKX0pCiAKQEAgLTY4MCwxMSArNjgwLDExIEBACiAgICAgICAgICMgTG9vayB1cCBtZXNzYWdlIHN1YnBhdGhzIGluIHRoZSBUT0MKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGxhbWJkYTogc2VsZi5fYm94Ll9sb29rdXAoJ2ZvbycpKQogICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChzZWxmLl90ZW1wbGF0ZSAlIDApCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guX2xvb2t1cChrZXkwKSA9PSBvcy5wYXRoLmpvaW4oJ25ldycsIGtleTApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94Ll9sb29rdXAoa2V5MCkgPT0gb3MucGF0aC5qb2luKCduZXcnLCBrZXkwKSkKICAgICAgICAgb3MucmVtb3ZlKG9zLnBhdGguam9pbihzZWxmLl9wYXRoLCAnbmV3Jywga2V5MCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guX3RvYyA9PSB7a2V5MDogb3MucGF0aC5qb2luKCduZXcnLCBrZXkwKX0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guX3RvYyA9PSB7a2V5MDogb3MucGF0aC5qb2luKCduZXcnLCBrZXkwKX0pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBsYW1iZGE6IHNlbGYuX2JveC5fbG9va3VwKGtleTApKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94Ll90b2MgPT0ge30pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guX3RvYyA9PSB7fSkKIAogICAgIGRlZiB0ZXN0X2xvY2tfdW5sb2NrKHNlbGYpOgogICAgICAgICAjIExvY2sgYW5kIHVubG9jayB0aGUgbWFpbGJveC4gRm9yIE1haWxkaXIsIHRoaXMgZG9lcyBub3RoaW5nLgpAQCAtNjk4LDEwICs2OTgsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBOb25lCiAgICAgICAgIGJveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCwgZmFjdG9yeT1kdW1teV9mYWN0b3J5KQogICAgICAgICBmb2xkZXIgPSBib3guYWRkX2ZvbGRlcignZm9sZGVyMScpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2xkZXIuX2ZhY3RvcnkgaXMgZHVtbXlfZmFjdG9yeSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvbGRlci5fZmFjdG9yeSBpcyBkdW1teV9mYWN0b3J5KQogCiAgICAgICAgIGZvbGRlcjFfYWxpYXMgPSBib3guZ2V0X2ZvbGRlcignZm9sZGVyMScpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2xkZXIxX2FsaWFzLl9mYWN0b3J5IGlzIGR1bW15X2ZhY3RvcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb2xkZXIxX2FsaWFzLl9mYWN0b3J5IGlzIGR1bW15X2ZhY3RvcnkpCiAKICAgICBkZWYgdGVzdF9kaXJlY3RvcnlfaW5fZm9sZGVyIChzZWxmKToKICAgICAgICAgIyBUZXN0IHRoYXQgbWFpbGJveGVzIHN0aWxsIHdvcmsgaWYgdGhlcmUncyBhIHN0cmF5IGV4dHJhIGRpcmVjdG9yeQpAQCAtNzI4LDcgKzcyOCw3IEBACiAgICAgICAgICAgICBvcy51bWFzayhvcmlnX3VtYXNrKQogICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHNlbGYuX3BhdGgsIHNlbGYuX2JveC5fbG9va3VwKGtleSkpCiAgICAgICAgIG1vZGUgPSBvcy5zdGF0KHBhdGgpLnN0X21vZGUKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1vZGUgJiAwMTExID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2RlICYgMDExMSA9PSAwKQogCiAgICAgZGVmIHRlc3RfZm9sZGVyX2ZpbGVfcGVybXMoc2VsZik6CiAgICAgICAgICMgRnJvbSBidWcgIzMyMjgsIHdlIHdhbnQgdG8gdmVyaWZ5IHRoYXQgdGhlIGZpbGUgY3JlYXRlZCBpbnNpZGUgYSBNYWlsZGlyCkBAIC03OTAsOCArNzkwLDggQEAKICAgICBkZWYgdGVzdF9hZGRfZnJvbV9zdHJpbmcoc2VsZik6CiAgICAgICAgICMgQWRkIGEgc3RyaW5nIHN0YXJ0aW5nIHdpdGggJ0Zyb20gJyB0byB0aGUgbWFpbGJveAogICAgICAgICBrZXkgPSBzZWxmLl9ib3guYWRkKCdGcm9tIGZvb0BiYXIgYmxhaFxuRnJvbTogZm9vXG5cbjAnKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94W2tleV0uZ2V0X2Zyb20oKSA9PSAnZm9vQGJhciBibGFoJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveFtrZXldLmdldF9wYXlsb2FkKCkgPT0gJzAnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94W2tleV0uZ2V0X2Zyb20oKSA9PSAnZm9vQGJhciBibGFoJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveFtrZXldLmdldF9wYXlsb2FkKCkgPT0gJzAnKQogCiAgICAgZGVmIHRlc3RfYWRkX21ib3hfb3JfbW1kZl9tZXNzYWdlKHNlbGYpOgogICAgICAgICAjIEFkZCBhbiBtYm94TWVzc2FnZSBvciBNTURGTWVzc2FnZQpAQCAtODA3LDExICs4MDcsMTEgQEAKICAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKICAgICAgICAgbXRpbWUgPSBvcy5wYXRoLmdldG10aW1lKHNlbGYuX3BhdGgpCiAgICAgICAgIHNlbGYuX2JveCA9IHNlbGYuX2ZhY3Rvcnkoc2VsZi5fcGF0aCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gpID09IDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94KSA9PSAzKQogICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2JveC5pdGVya2V5cygpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSkgaW4gdmFsdWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc3RyaW5nKGtleSkgaW4gdmFsdWVzKQogICAgICAgICBzZWxmLl9ib3guY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8obXRpbWUgPT0gb3MucGF0aC5nZXRtdGltZShzZWxmLl9wYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG10aW1lID09IG9zLnBhdGguZ2V0bXRpbWUoc2VsZi5fcGF0aCkpCiAKICAgICBkZWYgdGVzdF9hZGRfYW5kX2Nsb3NlKHNlbGYpOgogICAgICAgICAjIFZlcmlmeWluZyB0aGF0IGNsb3NpbmcgYSBtYWlsYm94IGRvZXNuJ3QgY2hhbmdlIGFkZGVkIGl0ZW1zCkBAIC04MjMsNyArODIzLDcgQEAKICAgICAgICAgc2VsZi5fYm94Ll9maWxlLnNlZWsoMCkKICAgICAgICAgY29udGVudHMgPSBzZWxmLl9ib3guX2ZpbGUucmVhZCgpCiAgICAgICAgIHNlbGYuX2JveC5jbG9zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb250ZW50cyA9PSBvcGVuKHNlbGYuX3BhdGgsICdyYicpLnJlYWQoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbnRlbnRzID09IG9wZW4oc2VsZi5fcGF0aCwgJ3JiJykucmVhZCgpKQogICAgICAgICBzZWxmLl9ib3ggPSBzZWxmLl9mYWN0b3J5KHNlbGYuX3BhdGgpCiAKICAgICBkZWYgdGVzdF9sb2NrX2NvbmZsaWN0KHNlbGYpOgpAQCAtODY0LDcgKzg2NCw3IEBACiAgICAgICAgIHNlbGYuX2JveC5sb2NrKCkKICAgICAgICAga2V5MiA9IHNlbGYuX2JveC5hZGQobXNnKQogICAgICAgICBzZWxmLl9ib3guZmx1c2goKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94Ll9sb2NrZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guX2xvY2tlZCkKICAgICAgICAgc2VsZi5fYm94LmNsb3NlKCkKIAogCkBAIC05MDUsOCArOTA1LDggQEAKICAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ29uZScpCiAgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0d28nKQogICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcigndGhyZWUnKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0KICAgICAgICAgICAgICAgICAgICAgIHNldCgoJ29uZScsICd0d28nLCAndGhyZWUnKSkpCiAKICAgICBkZWYgdGVzdF9nZXRfZm9sZGVyKHNlbGYpOgpAQCAtOTE4LDU0ICs5MTgsNTQgQEAKICAgICAgICAgbmV3X2ZvbGRlciA9IHNlbGYuX2JveC5hZGRfZm9sZGVyKCdmb28uYmFyJykKICAgICAgICAgZm9sZGVyMCA9IHNlbGYuX2JveC5nZXRfZm9sZGVyKCdmb28uYmFyJykKICAgICAgICAgZm9sZGVyMC5hZGQoc2VsZi5fdGVtcGxhdGUgJSAnYmFyJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguaXNkaXIob3MucGF0aC5qb2luKHNlbGYuX3BhdGgsICdmb28uYmFyJykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2Rpcihvcy5wYXRoLmpvaW4oc2VsZi5fcGF0aCwgJ2Zvby5iYXInKSkpCiAgICAgICAgIGZvbGRlcjEgPSBzZWxmLl9ib3guZ2V0X2ZvbGRlcignZm9vLmJhcicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2xkZXIxLmdldF9zdHJpbmcoZm9sZGVyMS5rZXlzKClbMF0pID09IFwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvbGRlcjEuZ2V0X3N0cmluZyhmb2xkZXIxLmtleXMoKVswXSkgPT0gXAogICAgICAgICAgICAgICAgICAgICAgc2VsZi5fdGVtcGxhdGUgJSAnYmFyJykKIAogICAgICAgICAjIFRlc3QgZm9yIGJ1ZyAjMTU2OTc5MDogdmVyaWZ5IHRoYXQgZm9sZGVycyByZXR1cm5lZCBieSAuZ2V0X2ZvbGRlcigpCiAgICAgICAgICMgdXNlIHRoZSBzYW1lIGZhY3RvcnkgZnVuY3Rpb24uCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhuZXdfZm9sZGVyLl9mYWN0b3J5IGlzIHNlbGYuX2JveC5fZmFjdG9yeSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGZvbGRlcjAuX2ZhY3RvcnkgaXMgc2VsZi5fYm94Ll9mYWN0b3J5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobmV3X2ZvbGRlci5fZmFjdG9yeSBpcyBzZWxmLl9ib3guX2ZhY3RvcnkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb2xkZXIwLl9mYWN0b3J5IGlzIHNlbGYuX2JveC5fZmFjdG9yeSkKIAogICAgIGRlZiB0ZXN0X2FkZF9hbmRfcmVtb3ZlX2ZvbGRlcnMoc2VsZik6CiAgICAgICAgICMgRGVsZXRlIGZvbGRlcnMKICAgICAgICAgc2VsZi5fYm94LmFkZF9mb2xkZXIoJ29uZScpCiAgICAgICAgIHNlbGYuX2JveC5hZGRfZm9sZGVyKCd0d28nKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ29uZScsICd0d28nKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gc2V0KCgnb25lJywgJ3R3bycpKSkKICAgICAgICAgc2VsZi5fYm94LnJlbW92ZV9mb2xkZXIoJ29uZScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAxKQotICAgICAgICBzZWxmLmFzc2VydF8oc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gc2V0KCgndHdvJywpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSBzZXQoKCd0d28nLCkpKQogICAgICAgICBzZWxmLl9ib3guYWRkX2ZvbGRlcigndGhyZWUnKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNldChzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IHNldCgoJ3R3bycsICd0aHJlZScpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSBzZXQoKCd0d28nLCAndGhyZWUnKSkpCiAgICAgICAgIHNlbGYuX2JveC5yZW1vdmVfZm9sZGVyKCd0aHJlZScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAxKQotICAgICAgICBzZWxmLmFzc2VydF8oc2V0KHNlbGYuX2JveC5saXN0X2ZvbGRlcnMoKSkgPT0gc2V0KCgndHdvJywpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSBzZXQoKCd0d28nLCkpKQogICAgICAgICBzZWxmLl9ib3gucmVtb3ZlX2ZvbGRlcigndHdvJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkpID09IDApCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3gubGlzdF9mb2xkZXJzKCkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpKSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94Lmxpc3RfZm9sZGVycygpID09IFtdKQogCiAgICAgZGVmIHRlc3Rfc2VxdWVuY2VzKHNlbGYpOgogICAgICAgICAjIEdldCBhbmQgc2V0IHNlcXVlbmNlcwotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PSB7fSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0ge30pCiAgICAgICAgIG1zZzAgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDApCiAgICAgICAgIG1zZzAuYWRkX3NlcXVlbmNlKCdmb28nKQogICAgICAgICBrZXkwID0gc2VsZi5fYm94LmFkZChtc2cwKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PSB7J2Zvbyc6W2tleTBdfSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0geydmb28nOltrZXkwXX0pCiAgICAgICAgIG1zZzEgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDEpCiAgICAgICAgIG1zZzEuc2V0X3NlcXVlbmNlcyhbJ2JhcicsICdyZXBsaWVkJywgJ2ZvbyddKQogICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChtc2cxKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQogICAgICAgICAgICAgICAgICAgICAgeydmb28nOltrZXkwLCBrZXkxXSwgJ2Jhcic6W2tleTFdLCAncmVwbGllZCc6W2tleTFdfSkKICAgICAgICAgbXNnMC5zZXRfc2VxdWVuY2VzKFsnZmxhZ2dlZCddKQogICAgICAgICBzZWxmLl9ib3hba2V5MF0gPSBtc2cwCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLl9ib3guZ2V0X3NlcXVlbmNlcygpID09CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X3NlcXVlbmNlcygpID09CiAgICAgICAgICAgICAgICAgICAgICB7J2Zvbyc6W2tleTFdLCAnYmFyJzpba2V5MV0sICdyZXBsaWVkJzpba2V5MV0sCiAgICAgICAgICAgICAgICAgICAgICAgJ2ZsYWdnZWQnOltrZXkwXX0pCiAgICAgICAgIHNlbGYuX2JveC5yZW1vdmUoa2V5MSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0geydmbGFnZ2VkJzpba2V5MF19KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PSB7J2ZsYWdnZWQnOltrZXkwXX0pCiAKICAgICBkZWYgdGVzdF9pc3N1ZTI2MjUoc2VsZik6CiAgICAgICAgIG1zZzAgPSBtYWlsYm94Lk1ITWVzc2FnZShzZWxmLl90ZW1wbGF0ZSAlIDApCkBAIC05ODcsMTkgKzk4NywxOSBAQAogICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChtc2cxKQogICAgICAgICBrZXkyID0gc2VsZi5fYm94LmFkZChtc2cyKQogICAgICAgICBrZXkzID0gc2VsZi5fYm94LmFkZChtc2czKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQogICAgICAgICAgICAgICAgICAgICAgeydmb28nOltrZXkwLGtleTEsa2V5MixrZXkzXSwgJ3Vuc2Vlbic6W2tleTBdLAogICAgICAgICAgICAgICAgICAgICAgICdmbGFnZ2VkJzpba2V5Ml0sICdiYXInOltrZXkzXSwgJ3JlcGxpZWQnOltrZXkzXX0pCiAgICAgICAgIHNlbGYuX2JveC5yZW1vdmUoa2V5MikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfc2VxdWVuY2VzKCkgPT0KICAgICAgICAgICAgICAgICAgICAgIHsnZm9vJzpba2V5MCxrZXkxLGtleTNdLCAndW5zZWVuJzpba2V5MF0sICdiYXInOltrZXkzXSwKICAgICAgICAgICAgICAgICAgICAgICAncmVwbGllZCc6W2tleTNdfSkKICAgICAgICAgc2VsZi5fYm94LnBhY2soKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmtleXMoKSA9PSBbMSwgMiwgM10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3gua2V5cygpID09IFsxLCAyLCAzXSkKICAgICAgICAga2V5MCA9IGtleTAKICAgICAgICAga2V5MSA9IGtleTAgKyAxCiAgICAgICAgIGtleTIgPSBrZXkxICsgMQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQogICAgICAgICAgICAgICAgICAgICAgeydmb28nOlsxLCAyLCAzXSwgJ3Vuc2Vlbic6WzFdLCAnYmFyJzpbM10sICdyZXBsaWVkJzpbM119KQogCiAgICAgICAgICMgVGVzdCBjYXNlIGZvciBwYWNraW5nIHdoaWxlIGhvbGRpbmcgdGhlIG1haWxib3ggbG9ja2VkLgpAQCAtMTAxMyw3ICsxMDEzLDcgQEAKICAgICAgICAgc2VsZi5fYm94LmxvY2soKQogICAgICAgICBzZWxmLl9ib3gucGFjaygpCiAgICAgICAgIHNlbGYuX2JveC51bmxvY2soKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fYm94LmdldF9zZXF1ZW5jZXMoKSA9PQogICAgICAgICAgICAgICAgICAgICAgeydmb28nOlsxLCAyLCAzLCA0LCA1XSwKICAgICAgICAgICAgICAgICAgICAgICAndW5zZWVuJzpbMV0sICdiYXInOlszXSwgJ3JlcGxpZWQnOlszXX0pCiAKQEAgLTEwMzMsMjEgKzEwMzMsMjEgQEAKIAogICAgIGRlZiB0ZXN0X2xhYmVscyhzZWxmKToKICAgICAgICAgIyBHZXQgbGFiZWxzIGZyb20gdGhlIG1haWxib3gKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfbGFiZWxzKCkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLl9ib3guZ2V0X2xhYmVscygpID09IFtdKQogICAgICAgICBtc2cwID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2Uoc2VsZi5fdGVtcGxhdGUgJSAwKQogICAgICAgICBtc2cwLmFkZF9sYWJlbCgnZm9vJykKICAgICAgICAga2V5MCA9IHNlbGYuX2JveC5hZGQobXNnMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2JveC5nZXRfbGFiZWxzKCkgPT0gWydmb28nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2JveC5nZXRfbGFiZWxzKCkgPT0gWydmb28nXSkKICAgICAgICAgbXNnMSA9IG1haWxib3guQmFieWxNZXNzYWdlKHNlbGYuX3RlbXBsYXRlICUgMSkKICAgICAgICAgbXNnMS5zZXRfbGFiZWxzKFsnYmFyJywgJ2Fuc3dlcmVkJywgJ2ZvbyddKQogICAgICAgICBrZXkxID0gc2VsZi5fYm94LmFkZChtc2cxKQotICAgICAgICBzZWxmLmFzc2VydF8oc2V0KHNlbGYuX2JveC5nZXRfbGFiZWxzKCkpID09IHNldChbJ2ZvbycsICdiYXInXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoc2VsZi5fYm94LmdldF9sYWJlbHMoKSkgPT0gc2V0KFsnZm9vJywgJ2JhciddKSkKICAgICAgICAgbXNnMC5zZXRfbGFiZWxzKFsnYmxhaCcsICdmaWxlZCddKQogICAgICAgICBzZWxmLl9ib3hba2V5MF0gPSBtc2cwCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZXQoc2VsZi5fYm94LmdldF9sYWJlbHMoKSkgPT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChzZWxmLl9ib3guZ2V0X2xhYmVscygpKSA9PQogICAgICAgICAgICAgICAgICAgICAgc2V0KFsnZm9vJywgJ2JhcicsICdibGFoJ10pKQogICAgICAgICBzZWxmLl9ib3gucmVtb3ZlKGtleTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZXQoc2VsZi5fYm94LmdldF9sYWJlbHMoKSkgPT0gc2V0KFsnYmxhaCddKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNldChzZWxmLl9ib3guZ2V0X2xhYmVscygpKSA9PSBzZXQoWydibGFoJ10pKQogCiAKIGNsYXNzIFRlc3RNZXNzYWdlKFRlc3RCYXNlKToKQEAgLTEwODcsMTIgKzEwODcsMTIgQEAKICAgICAgICAgIyBJbml0aWFsaXplIHdpdGhvdXQgYXJndW1lbnRzCiAgICAgICAgIG1zZyA9IHNlbGYuX2ZhY3RvcnkoKQogICAgICAgICBzZWxmLl9wb3N0X2luaXRpYWxpemVfaG9vayhtc2cpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKG1zZywgZW1haWwubWVzc2FnZS5NZXNzYWdlKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UobXNnLCBtYWlsYm94Lk1lc3NhZ2UpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShtc2csIHNlbGYuX2ZhY3RvcnkpKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmtleXMoKSA9PSBbXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBtc2cuaXNfbXVsdGlwYXJ0KCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3BheWxvYWQoKSA9PSBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShtc2csIGVtYWlsLm1lc3NhZ2UuTWVzc2FnZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZywgbWFpbGJveC5NZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnLCBzZWxmLl9mYWN0b3J5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5rZXlzKCkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgbXNnLmlzX211bHRpcGFydCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9wYXlsb2FkKCkgPT0gTm9uZSkKIAogICAgIGRlZiB0ZXN0X2luaXRpYWxpemVfaW5jb3JyZWN0bHkoc2VsZik6CiAgICAgICAgICMgSW5pdGlhbGl6ZSB3aXRoIGludmFsaWQgYXJndW1lbnQKQEAgLTExMjcsNzIgKzExMjcsNzIgQEAKICAgICBfZmFjdG9yeSA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UKIAogICAgIGRlZiBfcG9zdF9pbml0aWFsaXplX2hvb2soc2VsZiwgbXNnKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5fc3ViZGlyID09ICduZXcnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLl9pbmZvID09ICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLl9zdWJkaXIgPT0gJ25ldycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuX2luZm8gPT0gJycpCiAKICAgICBkZWYgdGVzdF9zdWJkaXIoc2VsZik6CiAgICAgICAgICMgVXNlIGdldF9zdWJkaXIoKSBhbmQgc2V0X3N1YmRpcigpCiAgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCiAgICAgICAgIG1zZy5zZXRfc3ViZGlyKCdjdXInKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnY3VyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ2N1cicpCiAgICAgICAgIG1zZy5zZXRfc3ViZGlyKCduZXcnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGxhbWJkYTogbXNnLnNldF9zdWJkaXIoJ3RtcCcpKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCiAgICAgICAgIG1zZy5zZXRfc3ViZGlyKCduZXcnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCiAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2cpCiAKICAgICBkZWYgdGVzdF9mbGFncyhzZWxmKToKICAgICAgICAgIyBVc2UgZ2V0X2ZsYWdzKCksIHNldF9mbGFncygpLCBhZGRfZmxhZygpLCByZW1vdmVfZmxhZygpCiAgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09ICcnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfZmxhZ3MoKSA9PSAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ25ldycpCiAgICAgICAgIG1zZy5zZXRfZmxhZ3MoJ0YnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zdWJkaXIoKSA9PSAnbmV3JykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfZmxhZ3MoKSA9PSAnRicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X3N1YmRpcigpID09ICduZXcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09ICdGJykKICAgICAgICAgbXNnLnNldF9mbGFncygnU0RUUCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ0RQU1QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09ICdEUFNUJykKICAgICAgICAgbXNnLmFkZF9mbGFnKCdGVCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ0RGUFNUJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfZmxhZ3MoKSA9PSAnREZQU1QnKQogICAgICAgICBtc2cucmVtb3ZlX2ZsYWcoJ1REUlAnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09ICdGUycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3N1YmRpcigpID09ICduZXcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09ICdGUycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X3N1YmRpcigpID09ICduZXcnKQogICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQogCiAgICAgZGVmIHRlc3RfZGF0ZShzZWxmKToKICAgICAgICAgIyBVc2UgZ2V0X2RhdGUoKSBhbmQgc2V0X2RhdGUoKQogICAgICAgICBtc2cgPSBtYWlsYm94Lk1haWxkaXJNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGFicyhtc2cuZ2V0X2RhdGUoKSAtIHRpbWUudGltZSgpKSA8IDYwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYWJzKG1zZy5nZXRfZGF0ZSgpIC0gdGltZS50aW1lKCkpIDwgNjApCiAgICAgICAgIG1zZy5zZXRfZGF0ZSgwLjApCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2RhdGUoKSA9PSAwLjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2RhdGUoKSA9PSAwLjApCiAKICAgICBkZWYgdGVzdF9pbmZvKHNlbGYpOgogICAgICAgICAjIFVzZSBnZXRfaW5mbygpIGFuZCBzZXRfaW5mbygpCiAgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9pbmZvKCkgPT0gJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2luZm8oKSA9PSAnJykKICAgICAgICAgbXNnLnNldF9pbmZvKCcxLGZvbz1iYXInKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9pbmZvKCkgPT0gJzEsZm9vPWJhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2luZm8oKSA9PSAnMSxmb289YmFyJykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBsYW1iZGE6IG1zZy5zZXRfaW5mbyhOb25lKSkKICAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKG1zZykKIAogICAgIGRlZiB0ZXN0X2luZm9fYW5kX2ZsYWdzKHNlbGYpOgogICAgICAgICAjIFRlc3QgaW50ZXJhY3Rpb24gb2YgaW5mbyBhbmQgZmxhZyBtZXRob2RzCiAgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9pbmZvKCkgPT0gJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2luZm8oKSA9PSAnJykKICAgICAgICAgbXNnLnNldF9mbGFncygnU0YnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09ICdGUycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2luZm8oKSA9PSAnMixGUycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2ZsYWdzKCkgPT0gJ0ZTJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfaW5mbygpID09ICcyLEZTJykKICAgICAgICAgbXNnLnNldF9pbmZvKCcxLCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2luZm8oKSA9PSAnMSwnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09ICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9pbmZvKCkgPT0gJzEsJykKICAgICAgICAgbXNnLnJlbW92ZV9mbGFnKCdSUFQnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09ICcnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9pbmZvKCkgPT0gJzEsJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfZmxhZ3MoKSA9PSAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfaW5mbygpID09ICcxLCcpCiAgICAgICAgIG1zZy5hZGRfZmxhZygnRCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ0QnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9pbmZvKCkgPT0gJzIsRCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2ZsYWdzKCkgPT0gJ0QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9pbmZvKCkgPT0gJzIsRCcpCiAgICAgICAgIHNlbGYuX2NoZWNrX3NhbXBsZShtc2cpCiAKIApAQCAtMTIwOCwxNCArMTIwOCwxNCBAQAogICAgICAgICBtc2cgPSBtYWlsYm94Lk1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQogICAgICAgICBtc2cuc2V0X3VuaXhmcm9tKCdGcm9tIGZvb0BiYXIgYmxhaCcpCiAgICAgICAgIG1zZyA9IG1haWxib3gubWJveE1lc3NhZ2UobXNnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mcm9tKCkgPT0gJ2Zvb0BiYXIgYmxhaCcsIG1zZy5nZXRfZnJvbSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mcm9tKCkgPT0gJ2Zvb0BiYXIgYmxhaCcsIG1zZy5nZXRfZnJvbSgpKQogCiAgICAgZGVmIHRlc3RfZnJvbShzZWxmKToKICAgICAgICAgIyBHZXQgYW5kIHNldCAiRnJvbSAiIGxpbmUKICAgICAgICAgbXNnID0gbWFpbGJveC5tYm94TWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCiAgICAgICAgIHNlbGYuX2NoZWNrX2Zyb20obXNnKQogICAgICAgICBtc2cuc2V0X2Zyb20oJ2ZvbyBiYXInKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mcm9tKCkgPT0gJ2ZvbyBiYXInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mcm9tKCkgPT0gJ2ZvbyBiYXInKQogICAgICAgICBtc2cuc2V0X2Zyb20oJ2Zvb0BiYXInLCBUcnVlKQogICAgICAgICBzZWxmLl9jaGVja19mcm9tKG1zZywgJ2Zvb0BiYXInKQogICAgICAgICBtc2cuc2V0X2Zyb20oJ2JsYWhAdGVtcCcsIHRpbWUubG9jYWx0aW1lKCkpCkBAIC0xMjI0LDIyICsxMjI0LDIyIEBACiAgICAgZGVmIHRlc3RfZmxhZ3Moc2VsZik6CiAgICAgICAgICMgVXNlIGdldF9mbGFncygpLCBzZXRfZmxhZ3MoKSwgYWRkX2ZsYWcoKSwgcmVtb3ZlX2ZsYWcoKQogICAgICAgICBtc2cgPSBtYWlsYm94Lm1ib3hNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfZmxhZ3MoKSA9PSAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfZmxhZ3MoKSA9PSAnJykKICAgICAgICAgbXNnLnNldF9mbGFncygnRicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ0YnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09ICdGJykKICAgICAgICAgbXNnLnNldF9mbGFncygnWE9EUicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ1JPRFgnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09ICdST0RYJykKICAgICAgICAgbXNnLmFkZF9mbGFnKCdGQScpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ1JPREZBWCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2ZsYWdzKCkgPT0gJ1JPREZBWCcpCiAgICAgICAgIG1zZy5yZW1vdmVfZmxhZygnRkRYQScpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gJ1JPJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfZmxhZ3MoKSA9PSAnUk8nKQogICAgICAgICBzZWxmLl9jaGVja19zYW1wbGUobXNnKQogCiAgICAgZGVmIF9jaGVja19mcm9tKHNlbGYsIG1zZywgc2VuZGVyPU5vbmUpOgogICAgICAgICAjIENoZWNrIGNvbnRlbnRzIG9mICJGcm9tICIgbGluZQogICAgICAgICBpZiBzZW5kZXIgaXMgTm9uZToKICAgICAgICAgICAgIHNlbmRlciA9ICJNQUlMRVItREFFTU9OIgotICAgICAgICBzZWxmLmFzc2VydF8ocmUubWF0Y2goc2VuZGVyICsgciIgXHd7M30gXHd7M30gW1xkIF1cZCBbXGQgXVxkOlxkezJ9OiIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHNlbmRlciArIHIiIFx3ezN9IFx3ezN9IFtcZCBdXGQgW1xkIF1cZDpcZHsyfToiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByIlxkezJ9IFxkezR9IiwgbXNnLmdldF9mcm9tKCkpIGlzIG5vdCBOb25lKQogCiAKQEAgLTEyNTMsMzAgKzEyNTMsMzAgQEAKICAgICBfZmFjdG9yeSA9IG1haWxib3guTUhNZXNzYWdlCiAKICAgICBkZWYgX3Bvc3RfaW5pdGlhbGl6ZV9ob29rKHNlbGYsIG1zZyk6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuX3NlcXVlbmNlcyA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5fc2VxdWVuY2VzID09IFtdKQogCiAgICAgZGVmIHRlc3Rfc2VxdWVuY2VzKHNlbGYpOgogICAgICAgICAjIEdldCwgc2V0LCBqb2luLCBhbmQgbGVhdmUgc2VxdWVuY2VzCiAgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X3NlcXVlbmNlcygpID09IFtdKQogICAgICAgICBtc2cuc2V0X3NlcXVlbmNlcyhbJ2Zvb2JhciddKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ2Zvb2JhciddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ2Zvb2JhciddKQogICAgICAgICBtc2cuc2V0X3NlcXVlbmNlcyhbXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X3NlcXVlbmNlcygpID09IFtdKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ3Vuc2VlbiddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ3Vuc2VlbiddKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdmbGFnZ2VkJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gWyd1bnNlZW4nLCAnZmxhZ2dlZCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ3Vuc2VlbicsICdmbGFnZ2VkJ10pCiAgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ2ZsYWdnZWQnKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ3Vuc2VlbicsICdmbGFnZ2VkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X3NlcXVlbmNlcygpID09IFsndW5zZWVuJywgJ2ZsYWdnZWQnXSkKICAgICAgICAgbXNnLnJlbW92ZV9zZXF1ZW5jZSgndW5zZWVuJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gWydmbGFnZ2VkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X3NlcXVlbmNlcygpID09IFsnZmxhZ2dlZCddKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdmb29iYXInKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9zZXF1ZW5jZXMoKSA9PSBbJ2ZsYWdnZWQnLCAnZm9vYmFyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X3NlcXVlbmNlcygpID09IFsnZmxhZ2dlZCcsICdmb29iYXInXSkKICAgICAgICAgbXNnLnJlbW92ZV9zZXF1ZW5jZSgncmVwbGllZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3NlcXVlbmNlcygpID09IFsnZmxhZ2dlZCcsICdmb29iYXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gWydmbGFnZ2VkJywgJ2Zvb2JhciddKQogICAgICAgICBtc2cuc2V0X3NlcXVlbmNlcyhbJ2Zvb2JhcicsICdyZXBsaWVkJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3NlcXVlbmNlcygpID09IFsnZm9vYmFyJywgJ3JlcGxpZWQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfc2VxdWVuY2VzKCkgPT0gWydmb29iYXInLCAncmVwbGllZCddKQogCiAKIGNsYXNzIFRlc3RCYWJ5bE1lc3NhZ2UoVGVzdE1lc3NhZ2UpOgpAQCAtMTI4NCw1NCArMTI4NCw1NCBAQAogICAgIF9mYWN0b3J5ID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UKIAogICAgIGRlZiBfcG9zdF9pbml0aWFsaXplX2hvb2soc2VsZiwgbXNnKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5fbGFiZWxzID09IFtdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLl9sYWJlbHMgPT0gW10pCiAKICAgICBkZWYgdGVzdF9sYWJlbHMoc2VsZik6CiAgICAgICAgICMgR2V0LCBzZXQsIGpvaW4sIGFuZCBsZWF2ZSBsYWJlbHMKICAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9sYWJlbHMoKSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfbGFiZWxzKCkgPT0gW10pCiAgICAgICAgIG1zZy5zZXRfbGFiZWxzKFsnZm9vYmFyJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2xhYmVscygpID09IFsnZm9vYmFyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2xhYmVscygpID09IFsnZm9vYmFyJ10pCiAgICAgICAgIG1zZy5zZXRfbGFiZWxzKFtdKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9sYWJlbHMoKSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfbGFiZWxzKCkgPT0gW10pCiAgICAgICAgIG1zZy5hZGRfbGFiZWwoJ2ZpbGVkJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfbGFiZWxzKCkgPT0gWydmaWxlZCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9sYWJlbHMoKSA9PSBbJ2ZpbGVkJ10pCiAgICAgICAgIG1zZy5hZGRfbGFiZWwoJ3Jlc2VudCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2xhYmVscygpID09IFsnZmlsZWQnLCAncmVzZW50J10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2xhYmVscygpID09IFsnZmlsZWQnLCAncmVzZW50J10pCiAgICAgICAgIG1zZy5hZGRfbGFiZWwoJ3Jlc2VudCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2xhYmVscygpID09IFsnZmlsZWQnLCAncmVzZW50J10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2xhYmVscygpID09IFsnZmlsZWQnLCAncmVzZW50J10pCiAgICAgICAgIG1zZy5yZW1vdmVfbGFiZWwoJ2ZpbGVkJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfbGFiZWxzKCkgPT0gWydyZXNlbnQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfbGFiZWxzKCkgPT0gWydyZXNlbnQnXSkKICAgICAgICAgbXNnLmFkZF9sYWJlbCgnZm9vYmFyJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfbGFiZWxzKCkgPT0gWydyZXNlbnQnLCAnZm9vYmFyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2xhYmVscygpID09IFsncmVzZW50JywgJ2Zvb2JhciddKQogICAgICAgICBtc2cucmVtb3ZlX2xhYmVsKCd1bnNlZW4nKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9sYWJlbHMoKSA9PSBbJ3Jlc2VudCcsICdmb29iYXInXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfbGFiZWxzKCkgPT0gWydyZXNlbnQnLCAnZm9vYmFyJ10pCiAgICAgICAgIG1zZy5zZXRfbGFiZWxzKFsnZm9vYmFyJywgJ2Fuc3dlcmVkJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2xhYmVscygpID09IFsnZm9vYmFyJywgJ2Fuc3dlcmVkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2xhYmVscygpID09IFsnZm9vYmFyJywgJ2Fuc3dlcmVkJ10pCiAKICAgICBkZWYgdGVzdF92aXNpYmxlKHNlbGYpOgogICAgICAgICAjIEdldCwgc2V0LCBhbmQgdXBkYXRlIHZpc2libGUgaGVhZGVycwogICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCiAgICAgICAgIHZpc2libGUgPSBtc2cuZ2V0X3Zpc2libGUoKQotICAgICAgICBzZWxmLmFzc2VydF8odmlzaWJsZS5rZXlzKCkgPT0gW10pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh2aXNpYmxlLmdldF9wYXlsb2FkKCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZpc2libGUua2V5cygpID09IFtdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodmlzaWJsZS5nZXRfcGF5bG9hZCgpIGlzIE5vbmUpCiAgICAgICAgIHZpc2libGVbJ1VzZXItQWdlbnQnXSA9ICdGb29CYXIgMS4wJwogICAgICAgICB2aXNpYmxlWydYLVdoYXRldmVyJ10gPSAnQmxhaCcKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfdmlzaWJsZSgpLmtleXMoKSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfdmlzaWJsZSgpLmtleXMoKSA9PSBbXSkKICAgICAgICAgbXNnLnNldF92aXNpYmxlKHZpc2libGUpCiAgICAgICAgIHZpc2libGUgPSBtc2cuZ2V0X3Zpc2libGUoKQotICAgICAgICBzZWxmLmFzc2VydF8odmlzaWJsZS5rZXlzKCkgPT0gWydVc2VyLUFnZW50JywgJ1gtV2hhdGV2ZXInXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHZpc2libGVbJ1VzZXItQWdlbnQnXSA9PSAnRm9vQmFyIDEuMCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh2aXNpYmxlWydYLVdoYXRldmVyJ10gPT0gJ0JsYWgnKQotICAgICAgICBzZWxmLmFzc2VydF8odmlzaWJsZS5nZXRfcGF5bG9hZCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2aXNpYmxlLmtleXMoKSA9PSBbJ1VzZXItQWdlbnQnLCAnWC1XaGF0ZXZlciddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodmlzaWJsZVsnVXNlci1BZ2VudCddID09ICdGb29CYXIgMS4wJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZpc2libGVbJ1gtV2hhdGV2ZXInXSA9PSAnQmxhaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2aXNpYmxlLmdldF9wYXlsb2FkKCkgaXMgTm9uZSkKICAgICAgICAgbXNnLnVwZGF0ZV92aXNpYmxlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHZpc2libGUua2V5cygpID09IFsnVXNlci1BZ2VudCcsICdYLVdoYXRldmVyJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh2aXNpYmxlLmdldF9wYXlsb2FkKCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZpc2libGUua2V5cygpID09IFsnVXNlci1BZ2VudCcsICdYLVdoYXRldmVyJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2aXNpYmxlLmdldF9wYXlsb2FkKCkgaXMgTm9uZSkKICAgICAgICAgdmlzaWJsZSA9IG1zZy5nZXRfdmlzaWJsZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh2aXNpYmxlLmtleXMoKSA9PSBbJ1VzZXItQWdlbnQnLCAnRGF0ZScsICdGcm9tJywgJ1RvJywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZpc2libGUua2V5cygpID09IFsnVXNlci1BZ2VudCcsICdEYXRlJywgJ0Zyb20nLCAnVG8nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTdWJqZWN0J10pCiAgICAgICAgIGZvciBoZWFkZXIgaW4gKCdVc2VyLUFnZW50JywgJ0RhdGUnLCAnRnJvbScsICdUbycsICdTdWJqZWN0Jyk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8odmlzaWJsZVtoZWFkZXJdID09IG1zZ1toZWFkZXJdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZpc2libGVbaGVhZGVyXSA9PSBtc2dbaGVhZGVyXSkKIAogCiBjbGFzcyBUZXN0TU1ERk1lc3NhZ2UoX1Rlc3RNYm94TU1ERk1lc3NhZ2UpOgpAQCAtMTM3NCw5ICsxMzc0LDkgQEAKICAgICAgICAgZGF0ZSA9IG1zZ19tYWlsZGlyLmdldF9kYXRlKCkKICAgICAgICAgbXNnID0gbWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2dfbWFpbGRpcikKICAgICAgICAgc2VsZi5fY2hlY2tfc2FtcGxlKG1zZykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfZmxhZ3MoKSA9PSAnREZQUlNUJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXRfc3ViZGlyKCkgPT0gJ2N1cicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2RhdGUoKSA9PSBkYXRlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09ICdERlBSU1QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9zdWJkaXIoKSA9PSAnY3VyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfZGF0ZSgpID09IGRhdGUpCiAKICAgICBkZWYgdGVzdF9tYWlsZGlyX3RvX21ib3htbWRmKHNlbGYpOgogICAgICAgICAjIENvbnZlcnQgTWFpbGRpck1lc3NhZ2UgdG8gbWJveG1lc3NhZ2UgYW5kIE1NREZNZXNzYWdlCkBAIC0xMzg4LDExICsxMzg4LDExIEBACiAgICAgICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgogICAgICAgICAgICAgICAgIG1zZ19tYWlsZGlyLnNldF9mbGFncyhzZXR0aW5nKQogICAgICAgICAgICAgICAgIG1zZyA9IGNsYXNzXyhtc2dfbWFpbGRpcikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mbGFncygpID09IHJlc3VsdCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldF9mcm9tKCkgPT0gJ01BSUxFUi1EQUVNT04gJXMnICUKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mbGFncygpID09IHJlc3VsdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldF9mcm9tKCkgPT0gJ01BSUxFUi1EQUVNT04gJXMnICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZS5hc2N0aW1lKHRpbWUuZ210aW1lKDAuMCkpKQogICAgICAgICAgICAgbXNnX21haWxkaXIuc2V0X3N1YmRpcignY3VyJykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjbGFzc18obXNnX21haWxkaXIpLmdldF9mbGFncygpID09ICdST0RGQScpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xhc3NfKG1zZ19tYWlsZGlyKS5nZXRfZmxhZ3MoKSA9PSAnUk9ERkEnKQogCiAgICAgZGVmIHRlc3RfbWFpbGRpcl90b19taChzZWxmKToKICAgICAgICAgIyBDb252ZXJ0IE1haWxkaXJNZXNzYWdlIHRvIE1ITWVzc2FnZQpAQCAtMTQwMiw3ICsxNDAyLDcgQEAKICAgICAgICAgICAgICAgICAgKCdUJywgWyd1bnNlZW4nXSksICgnREZQUlNUJywgWydyZXBsaWVkJywgJ2ZsYWdnZWQnXSkpCiAgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CiAgICAgICAgICAgICBtc2dfbWFpbGRpci5zZXRfZmxhZ3Moc2V0dGluZykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94Lk1ITWVzc2FnZShtc2dfbWFpbGRpcikuZ2V0X3NlcXVlbmNlcygpID09IFwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWlsYm94Lk1ITWVzc2FnZShtc2dfbWFpbGRpcikuZ2V0X3NlcXVlbmNlcygpID09IFwKICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQpCiAKICAgICBkZWYgdGVzdF9tYWlsZGlyX3RvX2JhYnlsKHNlbGYpOgpAQCAtMTQxNCw3ICsxNDE0LDcgQEAKICAgICAgICAgICAgICAgICAgKCdERlBSU1QnLCBbJ2RlbGV0ZWQnLCAnYW5zd2VyZWQnLCAnZm9yd2FyZGVkJ10pKQogICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgogICAgICAgICAgICAgbXNnX21haWxkaXIuc2V0X2ZsYWdzKHNldHRpbmcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnX21haWxkaXIpLmdldF9sYWJlbHMoKSA9PSBcCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnX21haWxkaXIpLmdldF9sYWJlbHMoKSA9PSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KQogCiAgICAgZGVmIHRlc3RfbWJveG1tZGZfdG9fbWFpbGRpcihzZWxmKToKQEAgLTE0MjcsMTAgKzE0MjcsMTAgQEAKICAgICAgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CiAgICAgICAgICAgICAgICAgbXNnX21ib3hNTURGLnNldF9mbGFncyhzZXR0aW5nKQogICAgICAgICAgICAgICAgIG1zZyA9IG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnX21ib3hNTURGKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2ZsYWdzKCkgPT0gcmVzdWx0KQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X2RhdGUoKSA9PSAwLjAsIG1zZy5nZXRfZGF0ZSgpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2ZsYWdzKCkgPT0gcmVzdWx0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0X2RhdGUoKSA9PSAwLjAsIG1zZy5nZXRfZGF0ZSgpKQogICAgICAgICAgICAgbXNnX21ib3hNTURGLnNldF9mbGFncygnTycpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2dfbWJveE1NREYpLmdldF9zdWJkaXIoKSA9PSBcCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2dfbWJveE1NREYpLmdldF9zdWJkaXIoKSA9PSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2N1cicpCiAKICAgICBkZWYgdGVzdF9tYm94bW1kZl90b19tYm94bW1kZihzZWxmKToKQEAgLTE0NDEsOCArMTQ0MSw4IEBACiAgICAgICAgICAgICBtc2dfbWJveE1NREYuc2V0X2Zyb20oJ2Zvb0BiYXInKQogICAgICAgICAgICAgZm9yIGNsYXNzMl8gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgogICAgICAgICAgICAgICAgIG1zZzIgPSBjbGFzczJfKG1zZ19tYm94TU1ERikKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obXNnMi5nZXRfZmxhZ3MoKSA9PSAnUk9ERkEnKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cyLmdldF9mcm9tKCkgPT0gJ2Zvb0BiYXInKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cyLmdldF9mbGFncygpID09ICdST0RGQScpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZzIuZ2V0X2Zyb20oKSA9PSAnZm9vQGJhcicpCiAKICAgICBkZWYgdGVzdF9tYm94bW1kZl90b19taChzZWxmKToKICAgICAgICAgIyBDb252ZXJ0IG1ib3hNZXNzYWdlIGFuZCBNTURGTWVzc2FnZSB0byBNSE1lc3NhZ2UKQEAgLTE0NTQsNyArMTQ1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAoJ1JPREZBJywgWydyZXBsaWVkJywgJ2ZsYWdnZWQnXSkpCiAgICAgICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgogICAgICAgICAgICAgICAgIG1zZ19tYm94TU1ERi5zZXRfZmxhZ3Moc2V0dGluZykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NSE1lc3NhZ2UobXNnX21ib3hNTURGKS5nZXRfc2VxdWVuY2VzKCkgXAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWlsYm94Lk1ITWVzc2FnZShtc2dfbWJveE1NREYpLmdldF9zZXF1ZW5jZXMoKSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IHJlc3VsdCkKIAogICAgIGRlZiB0ZXN0X21ib3htbWRmX3RvX2JhYnlsKHNlbGYpOgpAQCAtMTQ2Nyw3ICsxNDY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICgnUk9ERkEnLCBbJ2RlbGV0ZWQnLCAnYW5zd2VyZWQnXSkpCiAgICAgICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgogICAgICAgICAgICAgICAgIG1zZy5zZXRfZmxhZ3Moc2V0dGluZykKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnKS5nZXRfbGFiZWxzKCkgPT0gcmVzdWx0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWlsYm94LkJhYnlsTWVzc2FnZShtc2cpLmdldF9sYWJlbHMoKSA9PSByZXN1bHQpCiAKICAgICBkZWYgdGVzdF9taF90b19tYWlsZGlyKHNlbGYpOgogICAgICAgICAjIENvbnZlcnQgTUhNZXNzYWdlIHRvIE1haWxkaXJNZXNzYWdlCkBAIC0xNDc1LDE0ICsxNDc1LDE0IEBACiAgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CiAgICAgICAgICAgICBtc2cgPSBtYWlsYm94Lk1ITWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCiAgICAgICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKHNldHRpbmcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9mbGFncygpID09IHJlc3VsdCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X3N1YmRpcigpID09ICdjdXInKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfZmxhZ3MoKSA9PSByZXN1bHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9zdWJkaXIoKSA9PSAnY3VyJykKICAgICAgICAgbXNnID0gbWFpbGJveC5NSE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdyZXBsaWVkJykKICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgnZmxhZ2dlZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X2ZsYWdzKCkgPT0gJ0ZSJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfc3ViZGlyKCkgPT0gJ2N1cicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X2ZsYWdzKCkgPT0gJ0ZSJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfc3ViZGlyKCkgPT0gJ2N1cicpCiAKICAgICBkZWYgdGVzdF9taF90b19tYm94bW1kZihzZWxmKToKICAgICAgICAgIyBDb252ZXJ0IE1ITWVzc2FnZSB0byBtYm94TWVzc2FnZSBhbmQgTU1ERk1lc3NhZ2UKQEAgLTE0OTEsMTMgKzE0OTEsMTMgQEAKICAgICAgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKICAgICAgICAgICAgIG1zZy5hZGRfc2VxdWVuY2Uoc2V0dGluZykKICAgICAgICAgICAgIGZvciBjbGFzc18gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhjbGFzc18obXNnKS5nZXRfZmxhZ3MoKSA9PSByZXN1bHQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNsYXNzXyhtc2cpLmdldF9mbGFncygpID09IHJlc3VsdCkKICAgICAgICAgbXNnID0gbWFpbGJveC5NSE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdyZXBsaWVkJykKICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgnZmxhZ2dlZCcpCiAgICAgICAgIGZvciBjbGFzc18gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNsYXNzXyhtc2cpLmdldF9mbGFncygpID09ICdPRkEnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNsYXNzXyhtc2cpLmdldF9mbGFncygpID09ICdPRkEnKQogCiAgICAgZGVmIHRlc3RfbWhfdG9fbWgoc2VsZik6CiAgICAgICAgICMgQ29udmVydCBNSE1lc3NhZ2UgdG8gTUhNZXNzYWdlCkBAIC0xNTA1LDcgKzE1MDUsNyBAQAogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCd1bnNlZW4nKQogICAgICAgICBtc2cuYWRkX3NlcXVlbmNlKCdyZXBsaWVkJykKICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgnZmxhZ2dlZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94Lk1ITWVzc2FnZShtc2cpLmdldF9zZXF1ZW5jZXMoKSA9PSBcCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWlsYm94Lk1ITWVzc2FnZShtc2cpLmdldF9zZXF1ZW5jZXMoKSA9PSBcCiAgICAgICAgICAgICAgICAgICAgICBbJ3Vuc2VlbicsICdyZXBsaWVkJywgJ2ZsYWdnZWQnXSkKIAogICAgIGRlZiB0ZXN0X21oX3RvX2JhYnlsKHNlbGYpOgpAQCAtMTUxNSwxMiArMTUxNSwxMiBAQAogICAgICAgICBmb3Igc2V0dGluZywgcmVzdWx0IGluIHBhaXJzOgogICAgICAgICAgICAgbXNnID0gbWFpbGJveC5NSE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQogICAgICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZShzZXR0aW5nKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1haWxib3guQmFieWxNZXNzYWdlKG1zZykuZ2V0X2xhYmVscygpID09IHJlc3VsdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYWlsYm94LkJhYnlsTWVzc2FnZShtc2cpLmdldF9sYWJlbHMoKSA9PSByZXN1bHQpCiAgICAgICAgIG1zZyA9IG1haWxib3guTUhNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgndW5zZWVuJykKICAgICAgICAgbXNnLmFkZF9zZXF1ZW5jZSgncmVwbGllZCcpCiAgICAgICAgIG1zZy5hZGRfc2VxdWVuY2UoJ2ZsYWdnZWQnKQotICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnKS5nZXRfbGFiZWxzKCkgPT0gXAorICAgICAgICBzZWxmLmFzc2VydFRydWUobWFpbGJveC5CYWJ5bE1lc3NhZ2UobXNnKS5nZXRfbGFiZWxzKCkgPT0gXAogICAgICAgICAgICAgICAgICAgICAgWyd1bnNlZW4nLCAnYW5zd2VyZWQnXSkKIAogICAgIGRlZiB0ZXN0X2JhYnlsX3RvX21haWxkaXIoc2VsZik6CkBAIC0xNTMxLDE0ICsxNTMxLDE0IEBACiAgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CiAgICAgICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCiAgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKHNldHRpbmcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9mbGFncygpID09IHJlc3VsdCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYWlsYm94Lk1haWxkaXJNZXNzYWdlKG1zZykuZ2V0X3N1YmRpcigpID09ICdjdXInKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfZmxhZ3MoKSA9PSByZXN1bHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9zdWJkaXIoKSA9PSAnY3VyJykKICAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQogICAgICAgICBmb3IgbGFiZWwgaW4gKCd1bnNlZW4nLCAnZGVsZXRlZCcsICdmaWxlZCcsICdhbnN3ZXJlZCcsICdmb3J3YXJkZWQnLAogICAgICAgICAgICAgICAgICAgICAgICdlZGl0ZWQnLCAncmVzZW50Jyk6CiAgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKGxhYmVsKQotICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9mbGFncygpID09ICdQUlQnKQotICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NYWlsZGlyTWVzc2FnZShtc2cpLmdldF9zdWJkaXIoKSA9PSAnY3VyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfZmxhZ3MoKSA9PSAnUFJUJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1haWxib3guTWFpbGRpck1lc3NhZ2UobXNnKS5nZXRfc3ViZGlyKCkgPT0gJ2N1cicpCiAKICAgICBkZWYgdGVzdF9iYWJ5bF90b19tYm94bW1kZihzZWxmKToKICAgICAgICAgIyBDb252ZXJ0IEJhYnlsTWVzc2FnZSB0byBtYm94TWVzc2FnZSBhbmQgTU1ERk1lc3NhZ2UKQEAgLTE1NDksMTMgKzE1NDksMTMgQEAKICAgICAgICAgICAgIGZvciBjbGFzc18gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgogICAgICAgICAgICAgICAgIG1zZyA9IG1haWxib3guQmFieWxNZXNzYWdlKF9zYW1wbGVfbWVzc2FnZSkKICAgICAgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKHNldHRpbmcpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNsYXNzXyhtc2cpLmdldF9mbGFncygpID09IHJlc3VsdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoY2xhc3NfKG1zZykuZ2V0X2ZsYWdzKCkgPT0gcmVzdWx0KQogICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCiAgICAgICAgIGZvciBsYWJlbCBpbiAoJ3Vuc2VlbicsICdkZWxldGVkJywgJ2ZpbGVkJywgJ2Fuc3dlcmVkJywgJ2ZvcndhcmRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgJ2VkaXRlZCcsICdyZXNlbnQnKToKICAgICAgICAgICAgIG1zZy5hZGRfbGFiZWwobGFiZWwpCiAgICAgICAgIGZvciBjbGFzc18gaW4gKG1haWxib3gubWJveE1lc3NhZ2UsIG1haWxib3guTU1ERk1lc3NhZ2UpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNsYXNzXyhtc2cpLmdldF9mbGFncygpID09ICdPREEnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNsYXNzXyhtc2cpLmdldF9mbGFncygpID09ICdPREEnKQogCiAgICAgZGVmIHRlc3RfYmFieWxfdG9fbWgoc2VsZik6CiAgICAgICAgICMgQ29udmVydCBCYWJ5bE1lc3NhZ2UgdG8gTUhNZXNzYWdlCkBAIC0xNTY1LDEyICsxNTY1LDEyIEBACiAgICAgICAgIGZvciBzZXR0aW5nLCByZXN1bHQgaW4gcGFpcnM6CiAgICAgICAgICAgICBtc2cgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShfc2FtcGxlX21lc3NhZ2UpCiAgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKHNldHRpbmcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NSE1lc3NhZ2UobXNnKS5nZXRfc2VxdWVuY2VzKCkgPT0gcmVzdWx0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1haWxib3guTUhNZXNzYWdlKG1zZykuZ2V0X3NlcXVlbmNlcygpID09IHJlc3VsdCkKICAgICAgICAgbXNnID0gbWFpbGJveC5CYWJ5bE1lc3NhZ2UoX3NhbXBsZV9tZXNzYWdlKQogICAgICAgICBmb3IgbGFiZWwgaW4gKCd1bnNlZW4nLCAnZGVsZXRlZCcsICdmaWxlZCcsICdhbnN3ZXJlZCcsICdmb3J3YXJkZWQnLAogICAgICAgICAgICAgICAgICAgICAgICdlZGl0ZWQnLCAncmVzZW50Jyk6CiAgICAgICAgICAgICBtc2cuYWRkX2xhYmVsKGxhYmVsKQotICAgICAgICBzZWxmLmFzc2VydF8obWFpbGJveC5NSE1lc3NhZ2UobXNnKS5nZXRfc2VxdWVuY2VzKCkgPT0gXAorICAgICAgICBzZWxmLmFzc2VydFRydWUobWFpbGJveC5NSE1lc3NhZ2UobXNnKS5nZXRfc2VxdWVuY2VzKCkgPT0gXAogICAgICAgICAgICAgICAgICAgICAgWyd1bnNlZW4nLCAncmVwbGllZCddKQogCiAgICAgZGVmIHRlc3RfYmFieWxfdG9fYmFieWwoc2VsZik6CkBAIC0xNTgxLDEyICsxNTgxLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgJ2VkaXRlZCcsICdyZXNlbnQnKToKICAgICAgICAgICAgIG1zZy5hZGRfbGFiZWwobGFiZWwpCiAgICAgICAgIG1zZzIgPSBtYWlsYm94LkJhYnlsTWVzc2FnZShtc2cpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cyLmdldF9sYWJlbHMoKSA9PSBbJ3Vuc2VlbicsICdkZWxldGVkJywgJ2ZpbGVkJywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZzIuZ2V0X2xhYmVscygpID09IFsndW5zZWVuJywgJ2RlbGV0ZWQnLCAnZmlsZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhbnN3ZXJlZCcsICdmb3J3YXJkZWQnLCAnZWRpdGVkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVzZW50J10pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3Zpc2libGUoKS5rZXlzKCkgPT0gbXNnMi5nZXRfdmlzaWJsZSgpLmtleXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfdmlzaWJsZSgpLmtleXMoKSA9PSBtc2cyLmdldF92aXNpYmxlKCkua2V5cygpKQogICAgICAgICBmb3Iga2V5IGluIG1zZy5nZXRfdmlzaWJsZSgpLmtleXMoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0X3Zpc2libGUoKVtrZXldID09IG1zZzIuZ2V0X3Zpc2libGUoKVtrZXldKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXRfdmlzaWJsZSgpW2tleV0gPT0gbXNnMi5nZXRfdmlzaWJsZSgpW2tleV0pCiAKIAogY2xhc3MgVGVzdFByb3h5RmlsZUJhc2UoVGVzdEJhc2UpOgpAQCAtMTU5NCw2OSArMTU5NCw2OSBAQAogICAgIGRlZiBfdGVzdF9yZWFkKHNlbGYsIHByb3h5KToKICAgICAgICAgIyBSZWFkIGJ5IGJ5dGUKICAgICAgICAgcHJveHkuc2VlaygwKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZCgpID09ICdiYXInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZCgpID09ICdiYXInKQogICAgICAgICBwcm94eS5zZWVrKDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5yZWFkKCkgPT0gJ2FyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LnJlYWQoKSA9PSAnYXInKQogICAgICAgICBwcm94eS5zZWVrKDApCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5yZWFkKDIpID09ICdiYScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm94eS5yZWFkKDIpID09ICdiYScpCiAgICAgICAgIHByb3h5LnNlZWsoMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWQoLTEpID09ICdhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm94eS5yZWFkKC0xKSA9PSAnYXInKQogICAgICAgICBwcm94eS5zZWVrKDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5yZWFkKDEwMDApID09ICdyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LnJlYWQoMTAwMCkgPT0gJ3InKQogCiAgICAgZGVmIF90ZXN0X3JlYWRsaW5lKHNlbGYsIHByb3h5KToKICAgICAgICAgIyBSZWFkIGJ5IGxpbmUKICAgICAgICAgcHJveHkuc2VlaygwKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmUoKSA9PSAnZm9vJyArIG9zLmxpbmVzZXApCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5yZWFkbGluZSgpID09ICdiYXInICsgb3MubGluZXNlcCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWRsaW5lKCkgPT0gJ2ZyZWQnICsgb3MubGluZXNlcCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWRsaW5lKCkgPT0gJ2JvYicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm94eS5yZWFkbGluZSgpID09ICdmb28nICsgb3MubGluZXNlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LnJlYWRsaW5lKCkgPT0gJ2JhcicgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZGxpbmUoKSA9PSAnZnJlZCcgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZGxpbmUoKSA9PSAnYm9iJykKICAgICAgICAgcHJveHkuc2VlaygyKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmUoKSA9PSAnbycgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZGxpbmUoKSA9PSAnbycgKyBvcy5saW5lc2VwKQogICAgICAgICBwcm94eS5zZWVrKDYgKyAyICogbGVuKG9zLmxpbmVzZXApKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmUoKSA9PSAnZnJlZCcgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZGxpbmUoKSA9PSAnZnJlZCcgKyBvcy5saW5lc2VwKQogICAgICAgICBwcm94eS5zZWVrKDYgKyAyICogbGVuKG9zLmxpbmVzZXApKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmUoMikgPT0gJ2ZyJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWRsaW5lKC0xMCkgPT0gJ2VkJyArIG9zLmxpbmVzZXApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm94eS5yZWFkbGluZSgyKSA9PSAnZnInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZGxpbmUoLTEwKSA9PSAnZWQnICsgb3MubGluZXNlcCkKIAogICAgIGRlZiBfdGVzdF9yZWFkbGluZXMoc2VsZiwgcHJveHkpOgogICAgICAgICAjIFJlYWQgbXVsdGlwbGUgbGluZXMKICAgICAgICAgcHJveHkuc2VlaygwKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmVzKCkgPT0gWydmb28nICsgb3MubGluZXNlcCwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LnJlYWRsaW5lcygpID09IFsnZm9vJyArIG9zLmxpbmVzZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JhcicgKyBvcy5saW5lc2VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcmVkJyArIG9zLmxpbmVzZXAsICdib2InXSkKICAgICAgICAgcHJveHkuc2VlaygwKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZGxpbmVzKDIpID09IFsnZm9vJyArIG9zLmxpbmVzZXBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZGxpbmVzKDIpID09IFsnZm9vJyArIG9zLmxpbmVzZXBdKQogICAgICAgICBwcm94eS5zZWVrKDMgKyBsZW4ob3MubGluZXNlcCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5yZWFkbGluZXMoNCArIGxlbihvcy5saW5lc2VwKSkgPT0KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LnJlYWRsaW5lcyg0ICsgbGVuKG9zLmxpbmVzZXApKSA9PQogICAgICAgICAgICAgICAgICAgICAgWydiYXInICsgb3MubGluZXNlcCwgJ2ZyZWQnICsgb3MubGluZXNlcF0pCiAgICAgICAgIHByb3h5LnNlZWsoMykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWRsaW5lcygxMDAwKSA9PSBbb3MubGluZXNlcCwgJ2JhcicgKyBvcy5saW5lc2VwLAorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZGxpbmVzKDEwMDApID09IFtvcy5saW5lc2VwLCAnYmFyJyArIG9zLmxpbmVzZXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcmVkJyArIG9zLmxpbmVzZXAsICdib2InXSkKIAogICAgIGRlZiBfdGVzdF9pdGVyYXRpb24oc2VsZiwgcHJveHkpOgogICAgICAgICAjIEl0ZXJhdGUgYnkgbGluZQogICAgICAgICBwcm94eS5zZWVrKDApCiAgICAgICAgIGl0ZXJhdG9yID0gaXRlcihwcm94eSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGl0ZXJhdG9yLm5leHQoKSA9PSAnZm9vJyArIG9zLmxpbmVzZXApCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhpdGVyYXRvci5uZXh0KCkgPT0gJ2JhcicgKyBvcy5saW5lc2VwKQotICAgICAgICBzZWxmLmFzc2VydF8oaXRlcmF0b3IubmV4dCgpID09ICdmcmVkJyArIG9zLmxpbmVzZXApCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhpdGVyYXRvci5uZXh0KCkgPT0gJ2JvYicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpdGVyYXRvci5uZXh0KCkgPT0gJ2ZvbycgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXRlcmF0b3IubmV4dCgpID09ICdiYXInICsgb3MubGluZXNlcCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGl0ZXJhdG9yLm5leHQoKSA9PSAnZnJlZCcgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXRlcmF0b3IubmV4dCgpID09ICdib2InKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBsYW1iZGE6IGl0ZXJhdG9yLm5leHQoKSkKIAogICAgIGRlZiBfdGVzdF9zZWVrX2FuZF90ZWxsKHNlbGYsIHByb3h5KToKICAgICAgICAgIyBTZWVrIGFuZCB1c2UgdGVsbCB0byBjaGVjayBwb3NpdGlvbgogICAgICAgICBwcm94eS5zZWVrKDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS50ZWxsKCkgPT0gMykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWQobGVuKG9zLmxpbmVzZXApKSA9PSBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkudGVsbCgpID09IDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm94eS5yZWFkKGxlbihvcy5saW5lc2VwKSkgPT0gb3MubGluZXNlcCkKICAgICAgICAgcHJveHkuc2VlaygyLCAxKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZCgxICsgbGVuKG9zLmxpbmVzZXApKSA9PSAncicgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZCgxICsgbGVuKG9zLmxpbmVzZXApKSA9PSAncicgKyBvcy5saW5lc2VwKQogICAgICAgICBwcm94eS5zZWVrKC0zIC0gbGVuKG9zLmxpbmVzZXApLCAyKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZCgzKSA9PSAnYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LnJlYWQoMykgPT0gJ2JhcicpCiAgICAgICAgIHByb3h5LnNlZWsoMiwgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5LnJlYWQoKSA9PSAnbycgKyBvcy5saW5lc2VwICsgJ2JhcicgKyBvcy5saW5lc2VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZCgpID09ICdvJyArIG9zLmxpbmVzZXAgKyAnYmFyJyArIG9zLmxpbmVzZXApCiAgICAgICAgIHByb3h5LnNlZWsoMTAwKQotICAgICAgICBzZWxmLmFzc2VydF8ocHJveHkucmVhZCgpID09ICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkucmVhZCgpID09ICcnKQogCiAgICAgZGVmIF90ZXN0X2Nsb3NlKHNlbGYsIHByb3h5KToKICAgICAgICAgIyBDbG9zZSBhIGZpbGUKQEAgLTE2NzksMTEgKzE2NzksMTEgQEAKICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnZm9vJykKICAgICAgICAgcG9zID0gc2VsZi5fZmlsZS50ZWxsKCkKICAgICAgICAgcHJveHkwID0gbWFpbGJveC5fUHJveHlGaWxlKHNlbGYuX2ZpbGUpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eTAudGVsbCgpID09IHBvcykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2ZpbGUudGVsbCgpID09IHBvcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5MC50ZWxsKCkgPT0gcG9zKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fZmlsZS50ZWxsKCkgPT0gcG9zKQogICAgICAgICBwcm94eTEgPSBtYWlsYm94Ll9Qcm94eUZpbGUoc2VsZi5fZmlsZSwgMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHByb3h5MS50ZWxsKCkgPT0gMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2ZpbGUudGVsbCgpID09IHBvcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5MS50ZWxsKCkgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuX2ZpbGUudGVsbCgpID09IHBvcykKIAogICAgIGRlZiB0ZXN0X3JlYWQoc2VsZik6CiAgICAgICAgIHNlbGYuX2ZpbGUud3JpdGUoJ2JhcicpCkBAIC0xNzI4LDggKzE3MjgsOCBAQAogICAgICAgICBzZWxmLl9maWxlLndyaXRlKCdmb28nICsgb3MubGluZXNlcCArICdiYXInKQogICAgICAgICBwb3MgPSBzZWxmLl9maWxlLnRlbGwoKQogICAgICAgICBwcm94eSA9IG1haWxib3guX1BhcnRpYWxGaWxlKHNlbGYuX2ZpbGUsIDIsIDUpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS50ZWxsKCkgPT0gMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYuX2ZpbGUudGVsbCgpID09IHBvcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LnRlbGwoKSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5fZmlsZS50ZWxsKCkgPT0gcG9zKQogCiAgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKICAgICAgICAgc2VsZi5fZmlsZS53cml0ZSgnKioqYmFyKioqJykKQEAgLTE4MjEsMzYgKzE4MjEsMzYgQEAKICAgICAgICAgIyBUZXN0IGZvciByZWdyZXNzaW9uIG9uIGJ1ZyAjMTE3NDkwOgogICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgYm94ZXMgYXR0cmlidXRlIGFjdHVhbGx5IGdldHMgc2V0LgogICAgICAgICBzZWxmLm1ib3ggPSBtYWlsYm94Lk1haWxkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKLSAgICAgICAgI3NlbGYuYXNzZXJ0XyhoYXNhdHRyKHNlbGYubWJveCwgImJveGVzIikpCi0gICAgICAgICNzZWxmLmFzc2VydF8obGVuKHNlbGYubWJveC5ib3hlcykgPT0gMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKyAgICAgICAgI3NlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHNlbGYubWJveCwgImJveGVzIikpCisgICAgICAgICNzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveC5ib3hlcykgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKIAogICAgIGRlZiB0ZXN0X25vbmVtcHR5X21haWxkaXJfY3VyKHNlbGYpOgogICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoImN1ciIpCiAgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQotICAgICAgICAjc2VsZi5hc3NlcnRfKGxlbihzZWxmLm1ib3guYm94ZXMpID09IDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIG5vdCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICAjc2VsZi5hc3NlcnRUcnVlKGxlbihzZWxmLm1ib3guYm94ZXMpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIG5vdCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQogCiAgICAgZGVmIHRlc3Rfbm9uZW1wdHlfbWFpbGRpcl9uZXcoc2VsZik6CiAgICAgICAgIHNlbGYuY3JlYXRlTWVzc2FnZSgibmV3IikKICAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCi0gICAgICAgICNzZWxmLmFzc2VydF8obGVuKHNlbGYubWJveC5ib3hlcykgPT0gMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisgICAgICAgICNzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveC5ib3hlcykgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCiAKICAgICBkZWYgdGVzdF9ub25lbXB0eV9tYWlsZGlyX2JvdGgoc2VsZik6CiAgICAgICAgIHNlbGYuY3JlYXRlTWVzc2FnZSgiY3VyIikKICAgICAgICAgc2VsZi5jcmVhdGVNZXNzYWdlKCJuZXciKQogICAgICAgICBzZWxmLm1ib3ggPSBtYWlsYm94Lk1haWxkaXIodGVzdF9zdXBwb3J0LlRFU1RGTikKLSAgICAgICAgI3NlbGYuYXNzZXJ0XyhsZW4oc2VsZi5tYm94LmJveGVzKSA9PSAyKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBub3QgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisgICAgICAgICNzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveC5ib3hlcykgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIG5vdCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQogCiAgICAgZGVmIHRlc3RfdW5peF9tYm94KHNlbGYpOgogICAgICAgICAjIyMgc2hvdWxkIGJlIGJldHRlciEKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weSBiL0xpYi90ZXN0L3Rlc3RfbWFyc2hhbC5weQppbmRleCA5NDNhYTU1Li4wY2Q0NmEyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21hcnNoYWwucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tYXJzaGFsLnB5CkBAIC0xODksNyArMTg5LDcgQEAKICAgICAgICAgICAgIHQgPSBjb25zdHJ1Y3RvcihzZWxmLmQua2V5cygpKQogICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkcyhtYXJzaGFsLmR1bXBzKHQpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBuZXcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShuZXcsIGNvbnN0cnVjdG9yKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG5ldywgY29uc3RydWN0b3IpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZCh0KSwgaWQobmV3KSkKICAgICAgICAgICAgIG1hcnNoYWwuZHVtcCh0LCBmaWxlKHRlc3Rfc3VwcG9ydC5URVNURk4sICJ3YiIpKQogICAgICAgICAgICAgbmV3ID0gbWFyc2hhbC5sb2FkKGZpbGUodGVzdF9zdXBwb3J0LlRFU1RGTiwgInJiIikpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21hdGgucHkgYi9MaWIvdGVzdC90ZXN0X21hdGgucHkKaW5kZXggMDEwOGQ0OS4uM2FiYjg0YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tYXRoLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWF0aC5weQpAQCAtNzIsNyArNzIsNyBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdhY29zKDEpJywgbWF0aC5hY29zKDEpLCAwKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFjb3MsIElORikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hY29zLCBOSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmFjb3MoTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYWNvcyhOQU4pKSkKIAogICAgIGRlZiB0ZXN0QWNvc2goc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5hY29zaCkKQEAgLTgyLDcgKzgyLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hY29zaCwgLTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguYWNvc2goSU5GKSwgSU5GKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFjb3NoLCBOSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmFjb3NoKE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmFjb3NoKE5BTikpKQogCiAgICAgZGVmIHRlc3RBc2luKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguYXNpbikKQEAgLTkxLDcgKzkxLDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnYXNpbigxKScsIG1hdGguYXNpbigxKSwgbWF0aC5waS8yKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmFzaW4sIElORikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hc2luLCBOSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmFzaW4oTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXNpbihOQU4pKSkKIAogICAgIGRlZiB0ZXN0QXNpbmgoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5hc2luaCkKQEAgLTEwMCw3ICsxMDAsNyBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdhc2luaCgtMSknLCBtYXRoLmFzaW5oKC0xKSwgLTAuODgxMzczNTg3MDE5NTQzMDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguYXNpbmgoSU5GKSwgSU5GKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmFzaW5oKE5JTkYpLCBOSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmFzaW5oKE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmFzaW5oKE5BTikpKQogCiAgICAgZGVmIHRlc3RBdGFuKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguYXRhbikKQEAgLTEwOSw3ICsxMDksNyBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuKDEpJywgbWF0aC5hdGFuKDEpLCBtYXRoLnBpLzQpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4oaW5mKScsIG1hdGguYXRhbihJTkYpLCBtYXRoLnBpLzIpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4oLWluZiknLCBtYXRoLmF0YW4oTklORiksIC1tYXRoLnBpLzIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguYXRhbihOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuKE5BTikpKQogCiAgICAgZGVmIHRlc3RBdGFuaChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmF0YW4pCkBAIC0xMjAsNyArMTIwLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hdGFuaCwgLTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguYXRhbmgsIElORikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5hdGFuaCwgTklORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuaChOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuaChOQU4pKSkKIAogICAgIGRlZiB0ZXN0QXRhbjIoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5hdGFuMikKQEAgLTEzNyw3ICsxMzcsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguYXRhbjIoMC4sIDAuKSwgMC4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5hdGFuMigwLiwgMi4zKSwgMC4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5hdGFuMigwLiwgSU5GKSwgMC4pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguYXRhbjIoMC4sIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKDAuLCBOQU4pKSkKICAgICAgICAgIyBtYXRoLmF0YW4yKC0wLCB4KQogICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtMC4sIC1pbmYpJywgbWF0aC5hdGFuMigtMC4sIE5JTkYpLCAtbWF0aC5waSkKICAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLTAuLCAtMi4zKScsIG1hdGguYXRhbjIoLTAuLCAtMi4zKSwgLW1hdGgucGkpCkBAIC0xNDUsNyArMTQ1LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmF0YW4yKC0wLiwgMC4pLCAtMC4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5hdGFuMigtMC4sIDIuMyksIC0wLikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmF0YW4yKC0wLiwgSU5GKSwgLTAuKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmF0YW4yKC0wLiwgTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoLTAuLCBOQU4pKSkKICAgICAgICAgIyBtYXRoLmF0YW4yKElORiwgeCkKICAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoaW5mLCAtaW5mKScsIG1hdGguYXRhbjIoSU5GLCBOSU5GKSwgbWF0aC5waSozLzQpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKGluZiwgLTIuMyknLCBtYXRoLmF0YW4yKElORiwgLTIuMyksIG1hdGgucGkvMikKQEAgLTE1Myw3ICsxNTMsNyBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMihpbmYsIDAuKScsIG1hdGguYXRhbjIoSU5GLCAwLjApLCBtYXRoLnBpLzIpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKGluZiwgMi4zKScsIG1hdGguYXRhbjIoSU5GLCAyLjMpLCBtYXRoLnBpLzIpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKGluZiwgaW5mKScsIG1hdGguYXRhbjIoSU5GLCBJTkYpLCBtYXRoLnBpLzQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguYXRhbjIoSU5GLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihJTkYsIE5BTikpKQogICAgICAgICAjIG1hdGguYXRhbjIoTklORiwgeCkKICAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLWluZiwgLWluZiknLCBtYXRoLmF0YW4yKE5JTkYsIE5JTkYpLCAtbWF0aC5waSozLzQpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC1pbmYsIC0yLjMpJywgbWF0aC5hdGFuMihOSU5GLCAtMi4zKSwgLW1hdGgucGkvMikKQEAgLTE2MSwyNyArMTYxLDI3IEBACiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKC1pbmYsIDAuKScsIG1hdGguYXRhbjIoTklORiwgMC4wKSwgLW1hdGgucGkvMikKICAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLWluZiwgMi4zKScsIG1hdGguYXRhbjIoTklORiwgMi4zKSwgLW1hdGgucGkvMikKICAgICAgICAgc2VsZi5mdGVzdCgnYXRhbjIoLWluZiwgaW5mKScsIG1hdGguYXRhbjIoTklORiwgSU5GKSwgLW1hdGgucGkvNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuMihOSU5GLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihOSU5GLCBOQU4pKSkKICAgICAgICAgIyBtYXRoLmF0YW4yKCtmaW5pdGUsIHgpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDIuMywgLWluZiknLCBtYXRoLmF0YW4yKDIuMywgTklORiksIG1hdGgucGkpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDIuMywgLTAuKScsIG1hdGguYXRhbjIoMi4zLCAtMC4pLCBtYXRoLnBpLzIpCiAgICAgICAgIHNlbGYuZnRlc3QoJ2F0YW4yKDIuMywgMC4pJywgbWF0aC5hdGFuMigyLjMsIDAuKSwgbWF0aC5waS8yKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGguYXRhbjIoMi4zLCBJTkYpLCAwLikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuMigyLjMsIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKDIuMywgTkFOKSkpCiAgICAgICAgICMgbWF0aC5hdGFuMigtZmluaXRlLCB4KQogICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtMi4zLCAtaW5mKScsIG1hdGguYXRhbjIoLTIuMywgTklORiksIC1tYXRoLnBpKQogICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtMi4zLCAtMC4pJywgbWF0aC5hdGFuMigtMi4zLCAtMC4pLCAtbWF0aC5waS8yKQogICAgICAgICBzZWxmLmZ0ZXN0KCdhdGFuMigtMi4zLCAwLiknLCBtYXRoLmF0YW4yKC0yLjMsIDAuKSwgLW1hdGgucGkvMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmF0YW4yKC0yLjMsIElORiksIC0wLikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuMigtMi4zLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMigtMi4zLCBOQU4pKSkKICAgICAgICAgIyBtYXRoLmF0YW4yKE5BTiwgeCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIE5JTkYpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIC0yLjMpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIC0wLikpKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmF0YW4yKE5BTiwgMC4pKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIDIuMykpKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmF0YW4yKE5BTiwgSU5GKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguYXRhbjIoTkFOLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIE5JTkYpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIC0yLjMpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIC0wLikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKE5BTiwgMC4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5hdGFuMihOQU4sIDIuMykpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmF0YW4yKE5BTiwgSU5GKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguYXRhbjIoTkFOLCBOQU4pKSkKIAogICAgIGRlZiB0ZXN0Q2VpbChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmNlaWwpCkBAIC0xOTcsNyArMTk3LDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnY2VpbCgtMS41KScsIG1hdGguY2VpbCgtMS41KSwgLTEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguY2VpbChJTkYpLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguY2VpbChOSU5GKSwgTklORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5jZWlsKE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmNlaWwoTkFOKSkpCiAKICAgICAgICAgY2xhc3MgVGVzdENlaWwob2JqZWN0KToKICAgICAgICAgICAgIGRlZiBfX2Zsb2F0X18oc2VsZik6CkBAIC0yMjksMTQgKzIyOSwxNCBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29weXNpZ24oSU5GLCBOSU5GKSwgTklORikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvcHlzaWduKE5JTkYsIElORiksIElORikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvcHlzaWduKE5JTkYsIE5JTkYpLCBOSU5GKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oY29weXNpZ24oTkFOLCAxLikpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oY29weXNpZ24oTkFOLCBJTkYpKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKGNvcHlzaWduKE5BTiwgTklORikpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oY29weXNpZ24oTkFOLCBOQU4pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGNvcHlzaWduKE5BTiwgMS4pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGNvcHlzaWduKE5BTiwgSU5GKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihjb3B5c2lnbihOQU4sIE5JTkYpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKGNvcHlzaWduKE5BTiwgTkFOKSkpCiAgICAgICAgICAgICAjIGNvcHlzaWduKElORiwgTkFOKSBtYXkgYmUgSU5GIG9yIGl0IG1heSBiZSBOSU5GLCBzaW5jZQogICAgICAgICAgICAgIyB3ZSBkb24ndCBrbm93IHdoZXRoZXIgdGhlIHNpZ24gYml0IG9mIE5BTiBpcyBzZXQgb24gYW55CiAgICAgICAgICAgICAjIGdpdmVuIHBsYXRmb3JtLgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNpbmYoY29weXNpZ24oSU5GLCBOQU4pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzaW5mKGNvcHlzaWduKElORiwgTkFOKSkpCiAgICAgICAgICAgICAjIHNpbWlsYXJseSwgY29weXNpZ24oMi4sIE5BTikgY291bGQgYmUgMi4gb3IgLTIuCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhYnMoY29weXNpZ24oMi4sIE5BTikpLCAyLikKIApAQCAtMjQ3LDEyICsyNDcsMTIgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnY29zKHBpLzIpJywgbWF0aC5jb3MobWF0aC5waS8yKSwgMCkKICAgICAgICAgc2VsZi5mdGVzdCgnY29zKHBpKScsIG1hdGguY29zKG1hdGgucGkpLCAtMSkKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5jb3MoSU5GKSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmNvcyhOSU5GKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmNvcyhJTkYpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguY29zKE5JTkYpKSkKICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLmNvcywgSU5GKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5jb3MsIE5JTkYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguY29zKE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmNvcyhOQU4pKSkKIAogICAgIGRlZiB0ZXN0Q29zaChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmNvc2gpCkBAIC0yNjAsNyArMjYwLDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnY29zaCgyKS0yKmNvc2goMSkqKjInLCBtYXRoLmNvc2goMiktMiptYXRoLmNvc2goMSkqKjIsIC0xKSAjIFRoYW5rcyB0byBMYW1iZXJ0CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguY29zaChJTkYpLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguY29zaChOSU5GKSwgSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmNvc2goTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguY29zaChOQU4pKSkKIAogICAgIGRlZiB0ZXN0RGVncmVlcyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmRlZ3JlZXMpCkBAIC0yNzUsNyArMjc1LDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnZXhwKDEpJywgbWF0aC5leHAoMSksIG1hdGguZSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobWF0aC5leHAoSU5GKSwgSU5GKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmV4cChOSU5GKSwgMC4pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguZXhwKE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmV4cChOQU4pKSkKIAogICAgIGRlZiB0ZXN0RmFicyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmZhYnMpCkBAIC0zMTUsNyArMzE1LDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnZmxvb3IoLTEuMjNlMTY3KScsIG1hdGguZmxvb3IoLTEuMjNlMTY3KSwgLTEuMjNlMTY3KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmNlaWwoSU5GKSwgSU5GKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmNlaWwoTklORiksIE5JTkYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguZmxvb3IoTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguZmxvb3IoTkFOKSkpCiAKICAgICAgICAgY2xhc3MgVGVzdEZsb29yKG9iamVjdCk6CiAgICAgICAgICAgICBkZWYgX19mbG9hdF9fKHNlbGYpOgpAQCAtMzM4LDkgKzMzOCw5IEBACiAgICAgICAgIHNlbGYuZnRlc3QoJ2Ztb2QoLTEwLDEpJywgbWF0aC5mbW9kKC0xMCwxKSwgMCkKICAgICAgICAgc2VsZi5mdGVzdCgnZm1vZCgtMTAsMC41KScsIG1hdGguZm1vZCgtMTAsMC41KSwgMCkKICAgICAgICAgc2VsZi5mdGVzdCgnZm1vZCgtMTAsMS41KScsIG1hdGguZm1vZCgtMTAsMS41KSwgLTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguZm1vZChOQU4sIDEuKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguZm1vZCgxLiwgTkFOKSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguZm1vZChOQU4sIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmZtb2QoTkFOLCAxLikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmZtb2QoMS4sIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmZtb2QoTkFOLCBOQU4pKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5mbW9kLCAxLiwgMC4pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguZm1vZCwgSU5GLCAxLikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5mbW9kLCBOSU5GLCAxLikKQEAgLTM2Nyw3ICszNjcsNyBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguZnJleHAoSU5GKVswXSwgSU5GKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmZyZXhwKE5JTkYpWzBdLCBOSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmZyZXhwKE5BTilbMF0pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmZyZXhwKE5BTilbMF0pKQogCiAgICAgQHVuaXR0ZXN0LnNraXBVbmxlc3MoZmxvYXQuX19nZXRmb3JtYXRfXygiZG91YmxlIikuc3RhcnRzd2l0aCgiSUVFRSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IHJlcXVpcmVzIElFRUUgNzU0IGRvdWJsZXMiKQpAQCAtNDY5LDggKzQ2OSw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5oeXBvdChJTkYsIE5BTiksIElORikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmh5cG90KE5BTiwgTklORiksIElORikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmh5cG90KE5JTkYsIE5BTiksIElORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5oeXBvdCgxLjAsIE5BTikpKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmh5cG90KE5BTiwgLTIuMCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmh5cG90KDEuMCwgTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguaHlwb3QoTkFOLCAtMi4wKSkpCiAKICAgICBkZWYgdGVzdExkZXhwKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgubGRleHApCkBAIC00ODQsNyArNDg0LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobWF0aC5sZGV4cCgtMS4sIC0xMDAwMDAwKSwgLTAuKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmxkZXhwKElORiwgMzApLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGgubGRleHAoTklORiwgLTIxMyksIE5JTkYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgubGRleHAoTkFOLCAwKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgubGRleHAoTkFOLCAwKSkpCiAKICAgICAgICAgIyBsYXJnZSBzZWNvbmQgYXJndW1lbnQKICAgICAgICAgZm9yIG4gaW4gWzEwKio1LCAxMEwqKjUsIDEwKioxMCwgMTBMKioxMCwgMTAqKjIwLCAxMCoqNDBdOgpAQCAtNDk0LDcgKzQ5NCw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmxkZXhwKC0xLiwgLW4pLCAtMC4pCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmxkZXhwKDAuLCAtbiksIDAuKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobWF0aC5sZGV4cCgtMC4sIC1uKSwgLTAuKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5sZGV4cChOQU4sIC1uKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLmxkZXhwKE5BTiwgLW4pKSkKIAogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgbWF0aC5sZGV4cCwgMS4sIG4pCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBtYXRoLmxkZXhwLCAtMS4sIG4pCkBAIC01MDIsNyArNTAyLDcgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGgubGRleHAoLTAuLCBuKSwgLTAuKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobWF0aC5sZGV4cChJTkYsIG4pLCBJTkYpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmxkZXhwKE5JTkYsIG4pLCBOSU5GKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5sZGV4cChOQU4sIG4pKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgubGRleHAoTkFOLCBuKSkpCiAKICAgICBkZWYgdGVzdExvZyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLmxvZykKQEAgLTUxNCw3ICs1MTQsNyBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdsb2coMTAqKjQwLCAxMCoqMjApJywgbWF0aC5sb2coMTAqKjQwLCAxMCoqMjApLCAyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtYXRoLmxvZyhJTkYpLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgubG9nLCBOSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLmxvZyhOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5sb2coTkFOKSkpCiAKICAgICBkZWYgdGVzdExvZzFwKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgubG9nMXApCkBAIC01MjQsNyArNTI0LDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnbG9nMXAoMSknLCBtYXRoLmxvZzFwKDEpLCBtYXRoLmxvZygyKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobWF0aC5sb2cxcChJTkYpLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgubG9nMXAsIE5JTkYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgubG9nMXAoTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgubG9nMXAoTkFOKSkpCiAgICAgICAgIG49IDIqKjkwCiAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWxzKG1hdGgubG9nMXAobiksIDYyLjM4MzI0NjI1MDM5NTA3NSkKICAgICAgICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbHMobWF0aC5sb2cxcChuKSwgbWF0aC5sb2cxcChmbG9hdChuKSkpCkBAIC01MzYsNyArNTM2LDcgQEAKICAgICAgICAgc2VsZi5mdGVzdCgnbG9nMTAoMTApJywgbWF0aC5sb2cxMCgxMCksIDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGgubG9nKElORiksIElORikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5sb2cxMCwgTklORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5sb2cxMChOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5sb2cxMChOQU4pKSkKIAogICAgIGRlZiB0ZXN0TW9kZihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLm1vZGYpCkBAIC01NTMsOCArNTUzLDggQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobWF0aC5tb2RmKE5JTkYpLCAoLTAuMCwgTklORikpCiAKICAgICAgICAgbW9kZl9uYW4gPSBtYXRoLm1vZGYoTkFOKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtb2RmX25hblswXSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1vZGZfbmFuWzFdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obW9kZl9uYW5bMF0pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtb2RmX25hblsxXSkpCiAKICAgICBkZWYgdGVzdFBvdyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnBvdykKQEAgLTU2Niw5ICs1NjYsOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KE5JTkYsIDEpLCBOSU5GKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChtYXRoLnBvdygxLCBJTkYpKSwgMS4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKG1hdGgucG93KDEsIE5JTkYpKSwgMS4pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgucG93KE5BTiwgMSkpKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLnBvdygyLCBOQU4pKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5wb3coMCwgTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgucG93KE5BTiwgMSkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnBvdygyLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5wb3coMCwgTkFOKSkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coMSwgTkFOKSwgMSkKIAogICAgICAgICAjIHBvdygwLiwgeCkKQEAgLTU4Miw3ICs1ODIsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnBvdywgMC4sIC0yLjMpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgucG93LCAwLiwgLTMuKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnBvdywgMC4sIE5JTkYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgucG93KDAuLCBOQU4pKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5wb3coMC4sIE5BTikpKQogCiAgICAgICAgICMgcG93KElORiwgeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhJTkYsIElORiksIElORikKQEAgLTU5NSw3ICs1OTUsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KElORiwgLTIuMyksIDAuKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KElORiwgLTMuKSwgMC4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coSU5GLCBOSU5GKSwgMC4pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgucG93KElORiwgTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgucG93KElORiwgTkFOKSkpCiAKICAgICAgICAgIyBwb3coLTAuLCB4KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KC0wLiwgSU5GKSwgMC4pCkBAIC02MDgsNyArNjA4LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5wb3csIC0wLiwgLTIuMykKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbWF0aC5wb3csIC0wLiwgLTMuKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnBvdywgLTAuLCBOSU5GKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLnBvdygtMC4sIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnBvdygtMC4sIE5BTikpKQogCiAgICAgICAgICMgcG93KE5JTkYsIHgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coTklORiwgSU5GKSwgSU5GKQpAQCAtNjIxLDcgKzYyMSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coTklORiwgLTIuMyksIDAuKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1hdGgucG93KE5JTkYsIC0zLiksIC0wLikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdyhOSU5GLCBOSU5GKSwgMC4pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgucG93KE5JTkYsIE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnBvdyhOSU5GLCBOQU4pKSkKIAogICAgICAgICAjIHBvdygtMSwgeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygtMS4sIElORiksIDEuKQpAQCAtNjM0LDcgKzYzNCw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgucG93LCAtMS4sIC0yLjMpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTEuLCAtMy4pLCAtMS4pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobWF0aC5wb3coLTEuLCBOSU5GKSwgMS4pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgucG93KC0xLiwgTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgucG93KC0xLiwgTkFOKSkpCiAKICAgICAgICAgIyBwb3coMSwgeCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnBvdygxLiwgSU5GKSwgMS4pCkBAIC03MTcsMTIgKzcxNywxMiBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdzaW4ocGkvMiknLCBtYXRoLnNpbihtYXRoLnBpLzIpLCAxKQogICAgICAgICBzZWxmLmZ0ZXN0KCdzaW4oLXBpLzIpJywgbWF0aC5zaW4oLW1hdGgucGkvMiksIC0xKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc25hbihtYXRoLnNpbihJTkYpKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGguc2luKE5JTkYpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguc2luKElORikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC5zaW4oTklORikpKQogICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguc2luLCBJTkYpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnNpbiwgTklORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5zaW4oTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGguc2luKE5BTikpKQogCiAgICAgZGVmIHRlc3RTaW5oKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGguc2luaCkKQEAgLTczMSw3ICs3MzEsNyBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCdzaW5oKDEpK3NpbmgoLTEpJywgbWF0aC5zaW5oKDEpK21hdGguc2luaCgtMSksIDApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguc2luaChJTkYpLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguc2luaChOSU5GKSwgTklORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5zaW5oKE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnNpbmgoTkFOKSkpCiAKICAgICBkZWYgdGVzdFNxcnQoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWF0aC5zcXJ0KQpAQCAtNzQwLDcgKzc0MCw3IEBACiAgICAgICAgIHNlbGYuZnRlc3QoJ3NxcnQoNCknLCBtYXRoLnNxcnQoNCksIDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hdGguc3FydChJTkYpLCBJTkYpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGguc3FydCwgTklORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC5zcXJ0KE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnNxcnQoTkFOKSkpCiAKICAgICBkZWYgdGVzdFRhbihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtYXRoLnRhbikKQEAgLTc0OCwxMiArNzQ4LDEyIEBACiAgICAgICAgIHNlbGYuZnRlc3QoJ3RhbihwaS80KScsIG1hdGgudGFuKG1hdGgucGkvNCksIDEpCiAgICAgICAgIHNlbGYuZnRlc3QoJ3RhbigtcGkvNCknLCBtYXRoLnRhbigtbWF0aC5waS80KSwgLTEpCiAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtYXRoLmlzbmFuKG1hdGgudGFuKElORikpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC50YW4oTklORikpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4obWF0aC50YW4oSU5GKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnRhbihOSU5GKSkpCiAgICAgICAgIGV4Y2VwdDoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1hdGgudGFuLCBJTkYpCiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtYXRoLnRhbiwgTklORikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC50YW4oTkFOKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzbmFuKG1hdGgudGFuKE5BTikpKQogCiAgICAgZGVmIHRlc3RUYW5oKHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG1hdGgudGFuaCkKQEAgLTc2MSw3ICs3NjEsNyBAQAogICAgICAgICBzZWxmLmZ0ZXN0KCd0YW5oKDEpK3RhbmgoLTEpJywgbWF0aC50YW5oKDEpK21hdGgudGFuaCgtMSksIDApCiAgICAgICAgIHNlbGYuZnRlc3QoJ3RhbmgoaW5mKScsIG1hdGgudGFuaChJTkYpLCAxKQogICAgICAgICBzZWxmLmZ0ZXN0KCd0YW5oKC1pbmYpJywgbWF0aC50YW5oKE5JTkYpLCAtMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4obWF0aC50YW5oKE5BTikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihtYXRoLnRhbmgoTkFOKSkpCiAgICAgICAgICMgY2hlY2sgdGhhdCB0YW5oKC0wLikgPT0gLTAuIG9uIElFRUUgNzU0IHN5c3RlbXMKICAgICAgICAgaWYgZmxvYXQuX19nZXRmb3JtYXRfXygiZG91YmxlIikuc3RhcnRzd2l0aCgiSUVFRSIpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLnRhbmgoLTAuKSwgLTAuKQpAQCAtODA3LDIwICs4MDcsMjAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtYXRoLmNvcHlzaWduKDQuLCAtMC4pLCAtNC4wKQogCiAgICAgZGVmIHRlc3RJc25hbihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oZmxvYXQoIm5hbiIpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNuYW4oZmxvYXQoImluZiIpKiAwLikpCi0gICAgICAgIHNlbGYuZmFpbElmKG1hdGguaXNuYW4oZmxvYXQoImluZiIpKSkKLSAgICAgICAgc2VsZi5mYWlsSWYobWF0aC5pc25hbigwLikpCi0gICAgICAgIHNlbGYuZmFpbElmKG1hdGguaXNuYW4oMS4pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihmbG9hdCgibmFuIikpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWF0aC5pc25hbihmbG9hdCgiaW5mIikqIDAuKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtYXRoLmlzbmFuKGZsb2F0KCJpbmYiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF0aC5pc25hbigwLikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF0aC5pc25hbigxLikpCiAKICAgICBkZWYgdGVzdElzaW5mKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc2luZihmbG9hdCgiaW5mIikpKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc2luZihmbG9hdCgiLWluZiIpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1hdGguaXNpbmYoMUU0MDApKQotICAgICAgICBzZWxmLmFzc2VydF8obWF0aC5pc2luZigtMUU0MDApKQotICAgICAgICBzZWxmLmZhaWxJZihtYXRoLmlzaW5mKGZsb2F0KCJuYW4iKSkpCi0gICAgICAgIHNlbGYuZmFpbElmKG1hdGguaXNpbmYoMC4pKQotICAgICAgICBzZWxmLmZhaWxJZihtYXRoLmlzaW5mKDEuKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNpbmYoZmxvYXQoImluZiIpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNpbmYoZmxvYXQoIi1pbmYiKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXRoLmlzaW5mKDFFNDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNpbmYoLTFFNDAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtYXRoLmlzaW5mKGZsb2F0KCJuYW4iKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF0aC5pc2luZigwLikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF0aC5pc2luZigxLikpCiAKICAgICAjIFJFRF9GTEFHIDE2LU9jdC0yMDAwIFRpbQogICAgICMgV2hpbGUgMi4wIGlzIG1vcmUgY29uc2lzdGVudCBhYm91dCBleGNlcHRpb25zIHRoYW4gcHJldmlvdXMgcmVsZWFzZXMsIGl0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21lbW9yeWlvLnB5IGIvTGliL3Rlc3QvdGVzdF9tZW1vcnlpby5weQppbmRleCBkMTI4MWI0Li5hNjljYWFlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21lbW9yeWlvLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWVtb3J5aW8ucHkKQEAgLTIyNSw4ICsyMjUsOCBAQAogICAgICAgICBtZW1pbyA9IHNlbGYuaW9jbGFzcyhidWYgKiAxMCkKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGl0ZXIobWVtaW8pLCBtZW1pbykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGhhc2F0dHIobWVtaW8sICdfX2l0ZXJfXycpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaGFzYXR0cihtZW1pbywgJ25leHQnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIobWVtaW8sICdfX2l0ZXJfXycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihtZW1pbywgJ25leHQnKSkKICAgICAgICAgaSA9IDAKICAgICAgICAgZm9yIGxpbmUgaW4gbWVtaW86CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpbmUsIGJ1ZikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWVtb3J5dmlldy5weSBiL0xpYi90ZXN0L3Rlc3RfbWVtb3J5dmlldy5weQppbmRleCA3MDViMmNlLi41NzE0ODFlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21lbW9yeXZpZXcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tZW1vcnl2aWV3LnB5CkBAIC0yOCw3ICsyOCw3IEBACiAgICAgICAgIG9sZHJlZmNvdW50ID0gc3lzLmdldHJlZmNvdW50KGIpCiAgICAgICAgIG0gPSBzZWxmLl92aWV3KGIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1bMF0sIGl0ZW0oYiJhIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKG1bMF0sIGJ5dGVzKSwgdHlwZShtWzBdKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobVswXSwgYnl0ZXMpLCB0eXBlKG1bMF0pKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtWzVdLCBpdGVtKGIiZiIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhtWy0xXSwgaXRlbShiImYiKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobVstNl0sIGl0ZW0oYiJhIikpCkBAIC0xMTksNyArMTE5LDcgQEAKICAgICAgICAgICAgIGV4cGVjdGVkID0gYiIiLmpvaW4oCiAgICAgICAgICAgICAgICAgc2VsZi5nZXRpdGVtX3R5cGUoYykgZm9yIGMgaW4gYiJhYmNkZWYiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYiwgZXhwZWN0ZWQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShiLCBieXRlcyksIHR5cGUoYikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShiLCBieXRlcyksIHR5cGUoYikpCiAKICAgICBkZWYgdGVzdF90b2xpc3Qoc2VsZik6CiAgICAgICAgIGZvciB0cCBpbiBzZWxmLl90eXBlczoKQEAgLTIxMiw3ICsyMTIsNyBAQAogICAgICAgICAgICAgYiA9IG0gPSBvID0gTm9uZQogICAgICAgICAgICAgIyBUaGUgY3ljbGUgbXVzdCBiZSBicm9rZW4KICAgICAgICAgICAgIGdjLmNvbGxlY3QoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHdyKCkgaXMgTm9uZSwgd3IoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3cigpIGlzIE5vbmUsIHdyKCkpCiAKIAogIyBWYXJpYXRpb25zIG9uIHNvdXJjZSBvYmplY3RzIGZvciB0aGUgYnVmZmVyOiBieXRlcy1saWtlIG9iamVjdHMsIHRoZW4gYXJyYXlzCkBAIC0yOTEsOCArMjkxLDggQEAKICAgICBkZWYgdGVzdF9jb25zdHJ1Y3RvcihzZWxmKToKICAgICAgICAgZm9yIHRwIGluIHNlbGYuX3R5cGVzOgogICAgICAgICAgICAgb2IgPSB0cChzZWxmLl9zb3VyY2UpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWVtb3J5dmlldyhvYikpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWVtb3J5dmlldyhvYmplY3Q9b2IpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1lbW9yeXZpZXcob2IpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1lbW9yeXZpZXcob2JqZWN0PW9iKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtb3J5dmlldykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgbWVtb3J5dmlldywgb2IsIG9iKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBtZW1vcnl2aWV3LCBhcmd1bWVudD1vYikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbWhsaWIucHkgYi9MaWIvdGVzdC90ZXN0X21obGliLnB5CmluZGV4IGYxYWZhNjcuLmQxM2ZlYmUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWhsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9taGxpYi5weQpAQCAtMjU2LDkgKzI1Niw5IEBACiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbHMKIAogICAgICAgICBtaC5tYWtlZm9sZGVyKCJkdW1teTEiKQotICAgICAgICBzZWxmLmFzc2VydF8oImR1bW15MSIgaW4gbWgubGlzdGZvbGRlcnMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJkdW1teTEiIGluIG1oLmxpc3Rmb2xkZXJzKCkpCiAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oX21ocGF0aCwgImR1bW15MSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhwYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKHBhdGgpKQogCiAgICAgICAgIGYgPSBtaC5vcGVuZm9sZGVyKCdkdW1teTEnKQogICAgICAgICBkZWYgY3JlYXRlKG4pOgpAQCAtMzEwLDggKzMxMCw4IEBACiAKICAgICAgICAgbWguZGVsZXRlZm9sZGVyKCdkdW1teTEnKQogICAgICAgICBtaC5kZWxldGVmb2xkZXIoJ2R1bW15MicpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnZHVtbXkxJyBub3QgaW4gbWgubGlzdGZvbGRlcnMoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdkdW1teTEnIG5vdCBpbiBtaC5saXN0Zm9sZGVycygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHBhdGgpKQogCiAgICAgZGVmIHRlc3RfcmVhZChzZWxmKToKICAgICAgICAgbWggPSBnZXRNSCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21pbWV0b29scy5weSBiL0xpYi90ZXN0L3Rlc3RfbWltZXRvb2xzLnB5CmluZGV4IGVkMDFlZGUuLjlmNWJmNzcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWltZXRvb2xzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWltZXRvb2xzLnB5CkBAIC0zMSw3ICszMSw3IEBACiAgICAgICAgIHMgPSBzZXQoWyIiXSkKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKDEwMCk6CiAgICAgICAgICAgICBuYiA9IG1pbWV0b29scy5jaG9vc2VfYm91bmRhcnkoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5iIG5vdCBpbiBzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5iIG5vdCBpbiBzKQogICAgICAgICAgICAgcy5hZGQobmIpCiAKICAgICBkZWYgdGVzdF9tZXNzYWdlKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9taW1ldHlwZXMucHkgYi9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQppbmRleCAwMTkwYzJmLi5jYzE3OTBlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weQpAQCAtNDcsNyArNDcsNyBAQAogCiAgICAgZGVmIHRlc3RfZ3Vlc3NfYWxsX3R5cGVzKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKLSAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHVubGVzcyA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICAjIEZpcnN0IHRyeSBzdHJpY3QuICBVc2UgYSBzZXQgaGVyZSBmb3IgdGVzdGluZyB0aGUgcmVzdWx0cyBiZWNhdXNlIGlmCiAgICAgICAgICMgdGVzdF91cmxsaWIyIGlzIHJ1biBiZWZvcmUgdGVzdF9taW1ldHlwZXMsIGdsb2JhbCBzdGF0ZSBpcyBtb2RpZmllZAogICAgICAgICAjIHN1Y2ggdGhhdCB0aGUgJ2FsbCcgc2V0IHdpbGwgaGF2ZSBtb3JlIGl0ZW1zIGluIGl0LgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9taW5pZG9tLnB5IGIvTGliL3Rlc3QvdGVzdF9taW5pZG9tLnB5CmluZGV4IGMyZjY3NDMuLmI5NTQzOGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWluaWRvbS5weQorKysgYi9MaWIvdGVzdC90ZXN0X21pbmlkb20ucHkKQEAgLTczNCw3ICs3MzQsNyBAQAogICAgIGRlZiBjaGVja19jbG9uZV9hdHRyaWJ1dGUoc2VsZiwgZGVlcCwgdGVzdE5hbWUpOgogICAgICAgICBkb2MgPSBwYXJzZVN0cmluZygiPGRvYyBhdHRyPSd2YWx1ZScvPiIpCiAgICAgICAgIGF0dHIgPSBkb2MuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZU5vZGUoImF0dHIiKQotICAgICAgICBzZWxmLmZhaWxJZkVxdWFsKGF0dHIsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoYXR0ciwgTm9uZSkKICAgICAgICAgY2xvbmUgPSBhdHRyLmNsb25lTm9kZShkZWVwKQogICAgICAgICBzZWxmLmNvbmZpcm0obm90IGNsb25lLmlzU2FtZU5vZGUoYXR0cikpCiAgICAgICAgIHNlbGYuY29uZmlybShub3QgYXR0ci5pc1NhbWVOb2RlKGNsb25lKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbW1hcC5weSBiL0xpYi90ZXN0L3Rlc3RfbW1hcC5weQppbmRleCA5ZTI4YjM0Li42N2NlZTdhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X21tYXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9tbWFwLnB5CkBAIC01MDEsOCArNTAxLDggQEAKICAgICAgICAgZi5jbG9zZSgpCiAKICAgICBkZWYgdGVzdF9lcnJvcihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzc3ViY2xhc3MobW1hcC5lcnJvciwgRW52aXJvbm1lbnRFcnJvcikpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygibW1hcC5lcnJvciIgaW4gc3RyKG1tYXAuZXJyb3IpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhtbWFwLmVycm9yLCBFbnZpcm9ubWVudEVycm9yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJtbWFwLmVycm9yIiBpbiBzdHIobW1hcC5lcnJvcikpCiAKICAgICBkZWYgdGVzdF9pb19tZXRob2RzKHNlbGYpOgogICAgICAgICBkYXRhID0gIjAxMjM0NTY3ODkiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21vZHVsZS5weSBiL0xpYi90ZXN0L3Rlc3RfbW9kdWxlLnB5CmluZGV4IGUwYzdlYzMuLjViYzMzZDQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbW9kdWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbW9kdWxlLnB5CkBAIC0xMCw3ICsxMCw3IEBACiAgICAgICAgICMgQW4gdW5pbml0aWFsaXplZCBtb2R1bGUgaGFzIG5vIF9fZGljdF9fIG9yIF9fbmFtZV9fLAogICAgICAgICAjIGFuZCBfX2RvY19fIGlzIE5vbmUKICAgICAgICAgZm9vID0gTW9kdWxlVHlwZS5fX25ld19fKE1vZHVsZVR5cGUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmb28uX19kaWN0X18gaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvby5fX2RpY3RfXyBpcyBOb25lKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzID0gZm9vLl9fbmFtZV9fCiAgICAgICAgICAgICBzZWxmLmZhaWwoIl9fbmFtZV9fID0gJXMiICUgcmVwcihzKSkKQEAgLTUyLDcgKzUyLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uYmFyLCA0MikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChmb28uX19kaWN0X18sCiAgICAgICAgICAgICAgIHsiX19uYW1lX18iOiAiZm9vIiwgIl9fZG9jX18iOiAiZm9vZG9jIiwgImJhciI6IDQyfSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGZvby5fX2RpY3RfXyBpcyBkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9vLl9fZGljdF9fIGlzIGQpCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICBydW5fdW5pdHRlc3QoTW9kdWxlVGVzdHMpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21vZHVsZWZpbmRlci5weSBiL0xpYi90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5CmluZGV4IDlkN2Y3NmEuLjhjNzY5NzcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbW9kdWxlZmluZGVyLnB5CkBAIC0yNDAsMTIgKzI0MCwxMiBAQAogICAgICAgICAgICAgbW9yZSA9IGxpc3QoZm91bmQgLSBtb2R1bGVzKQogICAgICAgICAgICAgbGVzcyA9IGxpc3QobW9kdWxlcyAtIGZvdW5kKQogICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSBmb3VuZCB3aGF0IHdlIGV4cGVjdGVkLCBub3QgbW9yZSwgbm90IGxlc3MKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKChtb3JlLCBsZXNzKSwgKFtdLCBbXSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKChtb3JlLCBsZXNzKSwgKFtdLCBbXSkpCiAKICAgICAgICAgICAgICMgY2hlY2sgZm9yIG1pc3NpbmcgYW5kIG1heWJlIG1pc3NpbmcgbW9kdWxlcwogICAgICAgICAgICAgYmFkLCBtYXliZSA9IG1mLmFueV9taXNzaW5nX21heWJlKCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJhZCwgbWlzc2luZykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG1heWJlLCBtYXliZV9taXNzaW5nKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYWQsIG1pc3NpbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1heWJlLCBtYXliZV9taXNzaW5nKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgZGlzdHV0aWxzLmRpcl91dGlsLnJlbW92ZV90cmVlKFRFU1RfRElSKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5IGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQppbmRleCAwOTAzNzRjLi5mMjNlNmUwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKQEAgLTIyMiwxMCArMjIyLDEwIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXNvMjAyMmpwMi5kZWNvZGUoJ2lzbzIwMjItanAtMicpLCB1bmkpCiAKICAgICBkZWYgdGVzdF9pc28yMDIyX2pwX2cwKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxJZignXHgwZScgaW4gdSdcTntTT0ZUIEhZUEhFTn0nLmVuY29kZSgnaXNvLTIwMjItanAtMicpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKCdceDBlJyBpbiB1J1xOe1NPRlQgSFlQSEVOfScuZW5jb2RlKCdpc28tMjAyMi1qcC0yJykpCiAgICAgICAgIGZvciBlbmNvZGluZyBpbiAoJ2lzby0yMDIyLWpwLTIwMDQnLCAnaXNvLTIwMjItanAtMycpOgogICAgICAgICAgICAgZSA9IHUnXHUzNDA2Jy5lbmNvZGUoZW5jb2RpbmcpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihmaWx0ZXIobGFtYmRhIHg6IHggPj0gJ1x4ODAnLCBlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZmlsdGVyKGxhbWJkYSB4OiB4ID49ICdceDgwJywgZSkpCiAKICAgICBkZWYgdGVzdF9idWcxNTcyODMyKHNlbGYpOgogICAgICAgICBpZiBzeXMubWF4dW5pY29kZSA+PSAweDEwMDAwOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdXRleC5weSBiL0xpYi90ZXN0L3Rlc3RfbXV0ZXgucHkKaW5kZXggNGUzZjdjZC4uMjg4MjIxMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tdXRleC5weQorKysgYi9MaWIvdGVzdC90ZXN0X211dGV4LnB5CkBAIC05LDE0ICs5LDE0IEBACiAKICAgICAgICAgZGVmIGNhbGxlZF9ieV9tdXRleChzb21lX2RhdGEpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzb21lX2RhdGEsICJzcGFtIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhtLnRlc3QoKSwgIm11dGV4IG5vdCBoZWxkIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLnRlc3QoKSwgIm11dGV4IG5vdCBoZWxkIikKICAgICAgICAgICAgICMgTmVzdGVkIGxvY2tpbmcKICAgICAgICAgICAgIG0ubG9jayhjYWxsZWRfYnlfbXV0ZXgyLCAiZWdncyIpCiAKICAgICAgICAgZGVmIGNhbGxlZF9ieV9tdXRleDIoc29tZV9kYXRhKToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNvbWVfZGF0YSwgImVnZ3MiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG0udGVzdCgpLCAibXV0ZXggbm90IGhlbGQiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHJlYWR5X2Zvcl8yLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG0udGVzdCgpLCAibXV0ZXggbm90IGhlbGQiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlYWR5X2Zvcl8yLAogICAgICAgICAgICAgICAgICAgICAgICAgICJjYWxsZWRfYnlfbXV0ZXgyIGNhbGxlZCB0b28gc29vbiIpCiAKICAgICAgICAgbSA9IG11dGV4Lm11dGV4KCkKQEAgLTI2LDcgKzI2LDcgQEAKICAgICAgICAgIyB1bmxvY2sgYm90aCBsb2NrcwogICAgICAgICBtLnVubG9jaygpCiAgICAgICAgIG0udW5sb2NrKCkKLSAgICAgICAgc2VsZi5mYWlsSWYobS50ZXN0KCksICJtdXRleCBzdGlsbCBoZWxkIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtLnRlc3QoKSwgIm11dGV4IHN0aWxsIGhlbGQiKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KE11dGV4VGVzdCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfbmV0cmMucHkgYi9MaWIvdGVzdC90ZXN0X25ldHJjLnB5CmluZGV4IGI1MzYyNTUuLjUwYWZlNzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbmV0cmMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9uZXRyYy5weQpAQCAtMzUsMTEgKzM1LDExIEBACiAgICAgICAgIG9zLnVubGluayh0ZW1wX2ZpbGVuYW1lKQogCiAgICAgZGVmIHRlc3RfY2FzZV8xKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5uZXRyYy5tYWNyb3MgPT0geydtYWNybzEnOlsnbGluZTFcbicsICdsaW5lMlxuJ10sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm5ldHJjLm1hY3JvcyA9PSB7J21hY3JvMSc6WydsaW5lMVxuJywgJ2xpbmUyXG4nXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbWFjcm8yJzpbJ2xpbmUzXG4nLCAnbGluZTRcbiddfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubmV0cmMuaG9zdHNbJ2ZvbyddID09ICgnbG9nMScsICdhY2N0MScsICdwYXNzMScpKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5uZXRyYy5ob3N0c1snZGVmYXVsdCddID09ICgnbG9nMicsIE5vbmUsICdwYXNzMicpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5uZXRyYy5ob3N0c1snZm9vJ10gPT0gKCdsb2cxJywgJ2FjY3QxJywgJ3Bhc3MxJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm5ldHJjLmhvc3RzWydkZWZhdWx0J10gPT0gKCdsb2cyJywgTm9uZSwgJ3Bhc3MyJykpCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KE5ldHJjVGVzdENhc2UpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X25ldy5weSBiL0xpYi90ZXN0L3Rlc3RfbmV3LnB5CmluZGV4IDIzMWY0YmIuLmE4NGIzZDEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbmV3LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbmV3LnB5CkBAIC0xNTQsNyArMTU0LDcgQEAKICAgICAgICAgICAgIGQgPSBuZXcuY29kZShhcmdjb3VudCwgbmxvY2Fscywgc3RhY2tzaXplLCBmbGFncywgY29kZXN0cmluZywKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdGFudHMsIHQsIHZhcm5hbWVzLCBmaWxlbmFtZSwgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdGxpbmVubywgbG5vdGFiKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodFswXSkgaXMgUywgImVlaywgdHVwbGUgY2hhbmdlZCB1bmRlciB1cyEiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodFswXSkgaXMgUywgImVlaywgdHVwbGUgY2hhbmdlZCB1bmRlciB1cyEiKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChOZXdUZXN0KQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5IGIvTGliL3Rlc3QvdGVzdF9ub3JtYWxpemF0aW9uLnB5CmluZGV4IGU5MDU2Y2QuLjBlZWE0YmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfbm9ybWFsaXphdGlvbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X25vcm1hbGl6YXRpb24ucHkKQEAgLTY3LDE0ICs2NywxNCBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAKICAgICAgICAgICAgICMgUGVyZm9ybSB0ZXN0cwotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGMyID09ICBORkMoYzEpID09ICBORkMoYzIpID09ICBORkMoYzMpLCBsaW5lKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGM0ID09ICBORkMoYzQpID09ICBORkMoYzUpLCBsaW5lKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGMzID09ICBORkQoYzEpID09ICBORkQoYzIpID09ICBORkQoYzMpLCBsaW5lKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGM1ID09ICBORkQoYzQpID09ICBORkQoYzUpLCBsaW5lKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGM0ID09IE5GS0MoYzEpID09IE5GS0MoYzIpID09IFwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjMiA9PSAgTkZDKGMxKSA9PSAgTkZDKGMyKSA9PSAgTkZDKGMzKSwgbGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjNCA9PSAgTkZDKGM0KSA9PSAgTkZDKGM1KSwgbGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjMyA9PSAgTkZEKGMxKSA9PSAgTkZEKGMyKSA9PSAgTkZEKGMzKSwgbGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjNSA9PSAgTkZEKGM0KSA9PSAgTkZEKGM1KSwgbGluZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjNCA9PSBORktDKGMxKSA9PSBORktDKGMyKSA9PSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkZLQyhjMykgPT0gTkZLQyhjNCkgPT0gTkZLQyhjNSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjNSA9PSBORktEKGMxKSA9PSBORktEKGMyKSA9PSBcCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYzUgPT0gTkZLRChjMSkgPT0gTkZLRChjMikgPT0gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5GS0QoYzMpID09IE5GS0QoYzQpID09IE5GS0QoYzUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUpCiAKQEAgLTg3LDcgKzg3LDcgQEAKICAgICAgICAgICAgIFggPSB1bmljaHIoYykKICAgICAgICAgICAgIGlmIFggaW4gcGFydDFfZGF0YToKICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKFggPT0gTkZDKFgpID09IE5GRChYKSA9PSBORktDKFgpID09IE5GS0QoWCksIGMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoWCA9PSBORkMoWCkgPT0gTkZEKFgpID09IE5GS0MoWCkgPT0gTkZLRChYKSwgYykKIAogICAgIGRlZiB0ZXN0X2J1Z184MzQ2NzYoc2VsZik6CiAgICAgICAgICMgQ2hlY2sgZm9yIGJ1ZyA4MzQ2NzYKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb2xkX21haWxib3gucHkgYi9MaWIvdGVzdC90ZXN0X29sZF9tYWlsYm94LnB5CmluZGV4IDdiZDU1NTcuLmU2MWIxOWYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb2xkX21haWxib3gucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vbGRfbWFpbGJveC5weQpAQCAtNjcsMzUgKzY3LDM1IEBACiAgICAgICAgICIiIlRlc3QgYW4gZW1wdHkgbWFpbGRpciBtYWlsYm94IiIiCiAgICAgICAgICMgVGVzdCBmb3IgcmVncmVzc2lvbiBvbiBidWcgIzExNzQ5MDoKICAgICAgICAgc2VsZi5tYm94ID0gbWFpbGJveC5NYWlsZGlyKHRlc3Rfc3VwcG9ydC5URVNURk4pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oc2VsZi5tYm94KSA9PSAwKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveCkgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKIAogICAgIGRlZiB0ZXN0X25vbmVtcHR5X21haWxkaXJfY3VyKHNlbGYpOgogICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoImN1ciIpCiAgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYubWJveCkgPT0gMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5tYm94KSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBub3QgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKIAogICAgIGRlZiB0ZXN0X25vbmVtcHR5X21haWxkaXJfbmV3KHNlbGYpOgogICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoIm5ldyIpCiAgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYubWJveCkgPT0gMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oc2VsZi5tYm94KSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBub3QgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgTm9uZSkKIAogICAgIGRlZiB0ZXN0X25vbmVtcHR5X21haWxkaXJfYm90aChzZWxmKToKICAgICAgICAgc2VsZi5jcmVhdGVNZXNzYWdlKCJjdXIiKQogICAgICAgICBzZWxmLmNyZWF0ZU1lc3NhZ2UoIm5ldyIpCiAgICAgICAgIHNlbGYubWJveCA9IG1haWxib3guTWFpbGRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKHNlbGYubWJveCkgPT0gMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLm1ib3gubmV4dCgpIGlzIG5vdCBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHNlbGYubWJveCkgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYubWJveC5uZXh0KCkgaXMgbm90IE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLm1ib3gubmV4dCgpIGlzIG5vdCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5tYm94Lm5leHQoKSBpcyBOb25lKQogCiAgICAgZGVmIHRlc3RfdW5peF9tYm94KHNlbGYpOgogICAgICAgICAjIyMgc2hvdWxkIGJlIGJldHRlciEKQEAgLTEzOSw3ICsxMzksNyBAQAogIiIiKQogICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgYm94ID0gbWFpbGJveC5Vbml4TWFpbGJveChvcGVuKHNlbGYuX3BhdGgsICdyJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4obGlzdChpdGVyKGJveCkpKSA9PSA0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGxpc3QoaXRlcihib3gpKSkgPT0gNCkKIAogCiAgICAgIyBYWFggV2Ugc3RpbGwgbmVlZCBtb3JlIHRlc3RzIQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vcGNvZGVzLnB5IGIvTGliL3Rlc3QvdGVzdF9vcGNvZGVzLnB5CmluZGV4IDc5ODViZjYuLmMwM2NhMWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3Bjb2Rlcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X29wY29kZXMucHkKQEAgLTY0LDcgKzY0LDcgQEAKIAogICAgICAgICB0cnk6ICByYWlzZSBEQ2xhc3MsIGEKICAgICAgICAgZXhjZXB0IERDbGFzcywgdjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHYsIERDbGFzcykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2LCBEQ2xhc3MpKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5mYWlsKCJubyBleGNlcHRpb24iKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29wZXJhdG9yLnB5IGIvTGliL3Rlc3QvdGVzdF9vcGVyYXRvci5weQppbmRleCA5YmMwYTRlLi4yNzU4ODU2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29wZXJhdG9yLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3BlcmF0b3IucHkKQEAgLTM0LDMzMiArMzQsMzMyIEBACiAKIGNsYXNzIE9wZXJhdG9yVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2x0KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sdCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubHQsIDFqLCAyaikKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IubHQoMSwgMCkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmx0KDEsIDAuMCkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmx0KDEsIDEpKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5sdCgxLCAxLjApKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubHQoMSwgMikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5sdCgxLCAyLjApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmx0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmx0LCAxaiwgMmopCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IubHQoMSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IubHQoMSwgMC4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5sdCgxLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5sdCgxLCAxLjApKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubHQoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5sdCgxLCAyLjApKQogCiAgICAgZGVmIHRlc3RfbGUoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmxlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sZSwgMWosIDJqKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5sZSgxLCAwKSkKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IubGUoMSwgMC4wKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmxlKDEsIDEpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubGUoMSwgMS4wKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmxlKDEsIDIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubGUoMSwgMi4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sZSwgMWosIDJqKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmxlKDEsIDApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmxlKDEsIDAuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5sZSgxLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmxlKDEsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5sZSgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmxlKDEsIDIuMCkpCiAKICAgICBkZWYgdGVzdF9lcShzZWxmKToKICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgogICAgICAgICAgICAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IKICAgICAgICAgICAgIF9faGFzaF9fID0gTm9uZSAjIFNpbGVuY2UgUHkzayB3YXJuaW5nCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmVxKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoU3ludGF4RXJyb3IsIG9wZXJhdG9yLmVxLCBDKCksIEMoKSkKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IuZXEoMSwgMCkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmVxKDEsIDAuMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5lcSgxLCAxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmVxKDEsIDEuMCkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmVxKDEsIDIpKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5lcSgxLCAyLjApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmVxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgb3BlcmF0b3IuZXEsIEMoKSwgQygpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmVxKDEsIDApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmVxKDEsIDAuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5lcSgxLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmVxKDEsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZXEoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZXEoMSwgMi4wKSkKIAogICAgIGRlZiB0ZXN0X25lKHNlbGYpOgogICAgICAgICBjbGFzcyBDKG9iamVjdCk6CiAgICAgICAgICAgICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICAgICAgICAgICAgICByYWlzZSBTeW50YXhFcnJvcgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFN5bnRheEVycm9yLCBvcGVyYXRvci5uZSwgQygpLCBDKCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5uZSgxLCAwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLm5lKDEsIDAuMCkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLm5lKDEsIDEpKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5uZSgxLCAxLjApKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubmUoMSwgMikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5uZSgxLCAyLjApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm5lKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgb3BlcmF0b3IubmUsIEMoKSwgQygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubmUoMSwgMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5uZSgxLCAwLjApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLm5lKDEsIDEpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLm5lKDEsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5uZSgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm5lKDEsIDIuMCkpCiAKICAgICBkZWYgdGVzdF9nZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2UpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdlLCAxaiwgMmopCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5nZSgxLCAwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmdlKDEsIDAuMCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5nZSgxLCAxKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmdlKDEsIDEuMCkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmdlKDEsIDIpKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5nZSgxLCAyLjApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdlLCAxaiwgMmopCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZSgxLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmdlKDEsIDAuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZSgxLCAxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmdlKDEsIDEuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZ2UoMSwgMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZ2UoMSwgMi4wKSkKIAogICAgIGRlZiB0ZXN0X2d0KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5ndCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ3QsIDFqLCAyaikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmd0KDEsIDApKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuZ3QoMSwgMC4wKSkKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IuZ3QoMSwgMSkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmd0KDEsIDEuMCkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmd0KDEsIDIpKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5ndCgxLCAyLjApKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmd0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmd0LCAxaiwgMmopCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5ndCgxLCAwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmd0KDEsIDAuMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZ3QoMSwgMSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuZ3QoMSwgMS4wKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5ndCgxLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5ndCgxLCAyLjApKQogCiAgICAgZGVmIHRlc3RfYWJzKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hYnMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFicywgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmFicygtMSkgPT0gMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmFicygxKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFicykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hYnMsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5hYnMoLTEpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5hYnMoMSkgPT0gMSkKIAogICAgIGRlZiB0ZXN0X2FkZChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYWRkKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hZGQsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5hZGQoMywgNCkgPT0gNykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hZGQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYWRkLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuYWRkKDMsIDQpID09IDcpCiAKICAgICBkZWYgdGVzdF9iaXR3aXNlX2FuZChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYW5kXykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuYW5kXywgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmFuZF8oMHhmLCAweGEpID09IDB4YSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5hbmRfKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmFuZF8sIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5hbmRfKDB4ZiwgMHhhKSA9PSAweGEpCiAKICAgICBkZWYgdGVzdF9jb25jYXQoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbmNhdCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY29uY2F0LCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuY29uY2F0KCdweScsICd0aG9uJykgPT0gJ3B5dGhvbicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5jb25jYXQoWzEsIDJdLCBbMywgNF0pID09IFsxLCAyLCAzLCA0XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmNvbmNhdChTZXExKFs1LCA2XSksIFNlcTEoWzddKSkgPT0gWzUsIDYsIDddKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuY29uY2F0KFNlcTIoWzUsIDZdKSwgU2VxMihbN10pKSA9PSBbNSwgNiwgN10pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbmNhdCwgMTMsIDI5KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvbmNhdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb25jYXQsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb25jYXQoJ3B5JywgJ3Rob24nKSA9PSAncHl0aG9uJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbmNhdChbMSwgMl0sIFszLCA0XSkgPT0gWzEsIDIsIDMsIDRdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY29uY2F0KFNlcTEoWzUsIDZdKSwgU2VxMShbN10pKSA9PSBbNSwgNiwgN10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5jb25jYXQoU2VxMihbNSwgNl0pLCBTZXEyKFs3XSkpID09IFs1LCA2LCA3XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb25jYXQsIDEzLCAyOSkKIAogICAgIGRlZiB0ZXN0X2NvdW50T2Yoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvdW50T2YpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvdW50T2YsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5jb3VudE9mKFsxLCAyLCAxLCAzLCAxLCA0XSwgMykgPT0gMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmNvdW50T2YoWzEsIDIsIDEsIDMsIDEsIDRdLCA1KSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmNvdW50T2YpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY291bnRPZiwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvdW50T2YoWzEsIDIsIDEsIDMsIDEsIDRdLCAzKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuY291bnRPZihbMSwgMiwgMSwgMywgMSwgNF0sIDUpID09IDApCiAKICAgICBkZWYgdGVzdF9kZWxpdGVtKHNlbGYpOgogICAgICAgICBhID0gWzQsIDMsIDIsIDFdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRlbGl0ZW0sIGEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRlbGl0ZW0sIGEsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5kZWxpdGVtKGEsIDEpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhID09IFs0LCAyLCAxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kZWxpdGVtLCBhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRlbGl0ZW0sIGEsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5kZWxpdGVtKGEsIDEpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IFs0LCAyLCAxXSkKIAogICAgIGRlZiB0ZXN0X2RlbHNsaWNlKHNlbGYpOgogICAgICAgICBhID0gcmFuZ2UoMTApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRlbHNsaWNlLCBhKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kZWxzbGljZSwgYSwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmRlbHNsaWNlKGEsIDIsIDgpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhID09IFswLCAxLCA4LCA5XSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kZWxzbGljZSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kZWxzbGljZSwgYSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmRlbHNsaWNlKGEsIDIsIDgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhID09IFswLCAxLCA4LCA5XSkKICAgICAgICAgb3BlcmF0b3IuZGVsc2xpY2UoYSwgMCwgdGVzdF9zdXBwb3J0Lk1BWF9QeV9zc2l6ZV90KQotICAgICAgICBzZWxmLmFzc2VydF8oYSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPT0gW10pCiAKICAgICBkZWYgdGVzdF9kaXYoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmRpdiwgNSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZGl2LCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuZmxvb3JkaXYoNSwgMikgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5kaXYsIDUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZGl2LCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZmxvb3JkaXYoNSwgMikgPT0gMikKIAogICAgIGRlZiB0ZXN0X2Zsb29yZGl2KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5mbG9vcmRpdiwgNSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZmxvb3JkaXYsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5mbG9vcmRpdig1LCAyKSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmZsb29yZGl2LCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmZsb29yZGl2LCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuZmxvb3JkaXYoNSwgMikgPT0gMikKIAogICAgIGRlZiB0ZXN0X3RydWVkaXYoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnRydWVkaXYsIDUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnRydWVkaXYsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci50cnVlZGl2KDUsIDIpID09IDIuNSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci50cnVlZGl2LCA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnRydWVkaXYsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci50cnVlZGl2KDUsIDIpID09IDIuNSkKIAogICAgIGRlZiB0ZXN0X2dldGl0ZW0oc2VsZik6CiAgICAgICAgIGEgPSByYW5nZSgxMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSwgYSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmdldGl0ZW0oYSwgMikgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5nZXRpdGVtKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmdldGl0ZW0sIGEsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZXRpdGVtKGEsIDIpID09IDIpCiAKICAgICBkZWYgdGVzdF9nZXRzbGljZShzZWxmKToKICAgICAgICAgYSA9IHJhbmdlKDEwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5nZXRzbGljZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0c2xpY2UsIGEsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5nZXRzbGljZShhLCA0LCA2KSA9PSBbNCwgNV0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0c2xpY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0c2xpY2UsIGEsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5nZXRzbGljZShhLCA0LCA2KSA9PSBbNCwgNV0pCiAgICAgICAgIGIgPSBvcGVyYXRvci5nZXRzbGljZShhLCAwLCB0ZXN0X3N1cHBvcnQuTUFYX1B5X3NzaXplX3QpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhiID09IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiID09IGEpCiAKICAgICBkZWYgdGVzdF9pbmRleE9mKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbmRleE9mKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbmRleE9mLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuaW5kZXhPZihbNCwgMywgMiwgMV0sIDMpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXhPZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbmRleE9mLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaW5kZXhPZihbNCwgMywgMiwgMV0sIDMpID09IDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG9wZXJhdG9yLmluZGV4T2YsIFs0LCAzLCAyLCAxXSwgMCkKIAogICAgIGRlZiB0ZXN0X2ludmVydChzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW52ZXJ0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pbnZlcnQsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5pbnYoNCkgPT0gLTUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW52ZXJ0KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmludmVydCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmludig0KSA9PSAtNSkKIAogICAgIGRlZiB0ZXN0X2lzQ2FsbGFibGUoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmlzQ2FsbGFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXNDYWxsYWJsZSkKICAgICAgICAgY2xhc3MgQzoKICAgICAgICAgICAgIHBhc3MKICAgICAgICAgZGVmIGNoZWNrKHNlbGYsIG8sIHYpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG9wZXJhdG9yLmlzQ2FsbGFibGUobykgPT0gY2FsbGFibGUobykgPT0gdikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc0NhbGxhYmxlKG8pID09IGNhbGxhYmxlKG8pID09IHYpCiAgICAgICAgIGNoZWNrKHNlbGYsIDQsIDApCiAgICAgICAgIGNoZWNrKHNlbGYsIG9wZXJhdG9yLmlzQ2FsbGFibGUsIDEpCiAgICAgICAgIGNoZWNrKHNlbGYsIEMsIDEpCiAgICAgICAgIGNoZWNrKHNlbGYsIEMoKSwgMCkKIAogICAgIGRlZiB0ZXN0X2lzTWFwcGluZ1R5cGUoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUoMSkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUob3BlcmF0b3IuaXNNYXBwaW5nVHlwZSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5pc01hcHBpbmdUeXBlKG9wZXJhdG9yLl9fZGljdF9fKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUoe30pKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3BlcmF0b3IuaXNNYXBwaW5nVHlwZSgxKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5pc01hcHBpbmdUeXBlKG9wZXJhdG9yLmlzTWFwcGluZ1R5cGUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaXNNYXBwaW5nVHlwZShvcGVyYXRvci5fX2RpY3RfXykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc01hcHBpbmdUeXBlKHt9KSkKIAogICAgIGRlZiB0ZXN0X2lzTnVtYmVyVHlwZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXNOdW1iZXJUeXBlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuaXNOdW1iZXJUeXBlKDgpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuaXNOdW1iZXJUeXBlKDhqKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmlzTnVtYmVyVHlwZSg4TCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5pc051bWJlclR5cGUoOC4zKSkKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IuaXNOdW1iZXJUeXBlKGRpcigpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5pc051bWJlclR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc051bWJlclR5cGUoOCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc051bWJlclR5cGUoOGopKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaXNOdW1iZXJUeXBlKDhMKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmlzTnVtYmVyVHlwZSg4LjMpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmlzTnVtYmVyVHlwZShkaXIoKSkpCiAKICAgICBkZWYgdGVzdF9pc1NlcXVlbmNlVHlwZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5pc1NlcXVlbmNlVHlwZShkaXIoKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5pc1NlcXVlbmNlVHlwZSgoKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5pc1NlcXVlbmNlVHlwZSh4cmFuZ2UoMTApKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmlzU2VxdWVuY2VUeXBlKCd5ZWFoYnVkZHknKSkKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUoMykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc1NlcXVlbmNlVHlwZShkaXIoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc1NlcXVlbmNlVHlwZSgoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5pc1NlcXVlbmNlVHlwZSh4cmFuZ2UoMTApKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmlzU2VxdWVuY2VUeXBlKCd5ZWFoYnVkZHknKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5pc1NlcXVlbmNlVHlwZSgzKSkKICAgICAgICAgY2xhc3MgRGljdChkaWN0KTogcGFzcwotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5pc1NlcXVlbmNlVHlwZShEaWN0KCkpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmlzU2VxdWVuY2VUeXBlKERpY3QoKSkpCiAKICAgICBkZWYgdGVzdF9sc2hpZnQoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmxzaGlmdCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubHNoaWZ0LCBOb25lLCA0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmxzaGlmdCg1LCAxKSA9PSAxMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmxzaGlmdCg1LCAwKSA9PSA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmxzaGlmdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5sc2hpZnQsIE5vbmUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubHNoaWZ0KDUsIDEpID09IDEwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubHNoaWZ0KDUsIDApID09IDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG9wZXJhdG9yLmxzaGlmdCwgMiwgLTEpCiAKICAgICBkZWYgdGVzdF9tb2Qoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm1vZCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubW9kLCBOb25lLCA0MikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLm1vZCg1LCAyKSA9PSAxKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm1vZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5tb2QsIE5vbmUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubW9kKDUsIDIpID09IDEpCiAKICAgICBkZWYgdGVzdF9tdWwoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm11bCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubXVsLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubXVsKDUsIDIpID09IDEwKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm11bCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5tdWwsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5tdWwoNSwgMikgPT0gMTApCiAKICAgICBkZWYgdGVzdF9uZWcoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm5lZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubmVnLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubmVnKDUpID09IC01KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubmVnKC01KSA9PSA1KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IubmVnKDApID09IDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5uZWcoLTApID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IubmVnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLm5lZywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm5lZyg1KSA9PSAtNSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm5lZygtNSkgPT0gNSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLm5lZygwKSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IubmVnKC0wKSA9PSAwKQogCiAgICAgZGVmIHRlc3RfYml0d2lzZV9vcihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iub3JfKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5vcl8sIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5vcl8oMHhhLCAweDUpID09IDB4ZikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5vcl8pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iub3JfLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iub3JfKDB4YSwgMHg1KSA9PSAweGYpCiAKICAgICBkZWYgdGVzdF9wb3Moc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnBvcykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucG9zLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IucG9zKDUpID09IDUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5wb3MoLTUpID09IC01KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IucG9zKDApID09IDApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5wb3MoLTApID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucG9zKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnBvcywgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnBvcyg1KSA9PSA1KQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucG9zKC01KSA9PSAtNSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnBvcygwKSA9PSAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucG9zKC0wKSA9PSAwKQogCiAgICAgZGVmIHRlc3RfcG93KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5wb3cpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnBvdywgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnBvdygzLDUpID09IDMqKjUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5fX3Bvd19fKDMsNSkgPT0gMyoqNSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5wb3cpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucG93LCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucG93KDMsNSkgPT0gMyoqNSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLl9fcG93X18oMyw1KSA9PSAzKio1KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnBvdywgMSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5wb3csIDEsIDIsIDMpCiAKICAgICBkZWYgdGVzdF9yZXBlYXQoc2VsZik6CiAgICAgICAgIGEgPSByYW5nZSgzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yZXBlYXQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnJlcGVhdCwgYSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnJlcGVhdChhLCAyKSA9PSBhK2EpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5yZXBlYXQoYSwgMSkgPT0gYSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnJlcGVhdChhLCAwKSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yZXBlYXQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucmVwZWF0LCBhLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDIpID09IGErYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAxKSA9PSBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDApID09IFtdKQogICAgICAgICBhID0gKDEsIDIsIDMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5yZXBlYXQoYSwgMikgPT0gYSthKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IucmVwZWF0KGEsIDEpID09IGEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5yZXBlYXQoYSwgMCkgPT0gKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMikgPT0gYSthKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDEpID09IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMCkgPT0gKCkpCiAgICAgICAgIGEgPSAnMTIzJwotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IucmVwZWF0KGEsIDIpID09IGErYSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnJlcGVhdChhLCAxKSA9PSBhKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IucmVwZWF0KGEsIDApID09ICcnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDIpID09IGErYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAxKSA9PSBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDApID09ICcnKQogICAgICAgICBhID0gU2VxMShbNCwgNSwgNl0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5yZXBlYXQoYSwgMikgPT0gWzQsIDUsIDYsIDQsIDUsIDZdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IucmVwZWF0KGEsIDEpID09IFs0LCA1LCA2XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnJlcGVhdChhLCAwKSA9PSBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAyKSA9PSBbNCwgNSwgNiwgNCwgNSwgNl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMSkgPT0gWzQsIDUsIDZdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDApID09IFtdKQogICAgICAgICBhID0gU2VxMihbNCwgNSwgNl0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5yZXBlYXQoYSwgMikgPT0gWzQsIDUsIDYsIDQsIDUsIDZdKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IucmVwZWF0KGEsIDEpID09IFs0LCA1LCA2XSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnJlcGVhdChhLCAwKSA9PSBbXSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucmVwZWF0LCA2LCA3KQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucmVwZWF0KGEsIDIpID09IFs0LCA1LCA2LCA0LCA1LCA2XSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLnJlcGVhdChhLCAxKSA9PSBbNCwgNSwgNl0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yZXBlYXQoYSwgMCkgPT0gW10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IucmVwZWF0LCA2LCA3KQogCiAgICAgZGVmIHRlc3RfcnNoaWZ0KHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yc2hpZnQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnJzaGlmdCwgTm9uZSwgNDIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5yc2hpZnQoNSwgMSkgPT0gMikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnJzaGlmdCg1LCAwKSA9PSA1KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnJzaGlmdCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5yc2hpZnQsIE5vbmUsIDQyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IucnNoaWZ0KDUsIDEpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5yc2hpZnQoNSwgMCkgPT0gNSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgb3BlcmF0b3IucnNoaWZ0LCAyLCAtMSkKIAogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb250YWlucykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuY29udGFpbnMsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5jb250YWlucyhyYW5nZSg0KSwgMikpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLmNvbnRhaW5zKHJhbmdlKDQpLCA1KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnNlcXVlbmNlSW5jbHVkZXMocmFuZ2UoNCksIDIpKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci5zZXF1ZW5jZUluY2x1ZGVzKHJhbmdlKDQpLCA1KSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb250YWlucykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5jb250YWlucywgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmNvbnRhaW5zKHJhbmdlKDQpLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5jb250YWlucyhyYW5nZSg0KSwgNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci5zZXF1ZW5jZUluY2x1ZGVzKHJhbmdlKDQpLCAyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcGVyYXRvci5zZXF1ZW5jZUluY2x1ZGVzKHJhbmdlKDQpLCA1KSkKIAogICAgIGRlZiB0ZXN0X3NldGl0ZW0oc2VsZik6CiAgICAgICAgIGEgPSByYW5nZSgzKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhLCBOb25lLCBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3Iuc2V0aXRlbShhLCAwLCAyKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oYSA9PSBbMiwgMSwgMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgYSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBhLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc2V0aXRlbShhLCAwLCAyKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA9PSBbMiwgMSwgMl0pCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sIGEsIDQsIDIpCiAKICAgICBkZWYgdGVzdF9zZXRzbGljZShzZWxmKToKICAgICAgICAgYSA9IHJhbmdlKDQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldHNsaWNlLCBhKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRzbGljZSwgYSwgTm9uZSwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnNldHNsaWNlKGEsIDEsIDMsIFsyLCAxXSkgaXMgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgPT0gWzAsIDIsIDEsIDNdKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldHNsaWNlLCBhKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldHNsaWNlLCBhLCBOb25lLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc2V0c2xpY2UoYSwgMSwgMywgWzIsIDFdKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA9PSBbMCwgMiwgMSwgM10pCiAgICAgICAgIG9wZXJhdG9yLnNldHNsaWNlKGEsIDAsIHRlc3Rfc3VwcG9ydC5NQVhfUHlfc3NpemVfdCwgW10pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhID09IFtdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA9PSBbXSkKIAogICAgIGRlZiB0ZXN0X3N1YihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc3ViKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zdWIsIE5vbmUsIE5vbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci5zdWIoNSwgMikgPT0gMykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zdWIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc3ViLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3Iuc3ViKDUsIDIpID09IDMpCiAKICAgICBkZWYgdGVzdF90cnV0aChzZWxmKToKICAgICAgICAgY2xhc3MgQyhvYmplY3QpOgogICAgICAgICAgICAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgogICAgICAgICAgICAgICAgIHJhaXNlIFN5bnRheEVycm9yCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnRydXRoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoU3ludGF4RXJyb3IsIG9wZXJhdG9yLnRydXRoLCBDKCkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcGVyYXRvci50cnV0aCg1KSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnRydXRoKFswXSkpCi0gICAgICAgIHNlbGYuZmFpbElmKG9wZXJhdG9yLnRydXRoKDApKQotICAgICAgICBzZWxmLmZhaWxJZihvcGVyYXRvci50cnV0aChbXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IudHJ1dGgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFN5bnRheEVycm9yLCBvcGVyYXRvci50cnV0aCwgQygpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IudHJ1dGgoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci50cnV0aChbMF0pKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLnRydXRoKDApKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLnRydXRoKFtdKSkKIAogICAgIGRlZiB0ZXN0X2JpdHdpc2VfeG9yKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci54b3IpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnhvciwgTm9uZSwgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLnhvcigweGIsIDB4YykgPT0gMHg3KQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnhvcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci54b3IsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVyYXRvci54b3IoMHhiLCAweGMpID09IDB4NykKIAogICAgIGRlZiB0ZXN0X2lzKHNlbGYpOgogICAgICAgICBhID0gYiA9ICd4eXpwZHEnCiAgICAgICAgIGMgPSBhWzozXSArIGJbMzpdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmlzXykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wZXJhdG9yLmlzXyhhLCBiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IuaXNfKGEsYykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXNfKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3BlcmF0b3IuaXNfKGEsIGIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmlzXyhhLGMpKQogCiAgICAgZGVmIHRlc3RfaXNfbm90KHNlbGYpOgogICAgICAgICBhID0gYiA9ICd4eXpwZHEnCiAgICAgICAgIGMgPSBhWzozXSArIGJbMzpdCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLmlzX25vdCkKLSAgICAgICAgc2VsZi5mYWlsSWYob3BlcmF0b3IuaXNfbm90KGEsIGIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3BlcmF0b3IuaXNfbm90KGEsYykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaXNfbm90KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG9wZXJhdG9yLmlzX25vdChhLCBiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZXJhdG9yLmlzX25vdChhLGMpKQogCiAgICAgZGVmIHRlc3RfYXR0cmdldHRlcihzZWxmKToKICAgICAgICAgY2xhc3MgQToKQEAgLTM4NSw3ICszODUsNyBAQAogICAgICAgICBjbGFzcyBDKG9iamVjdCk6CiAgICAgICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFN5bnRheEVycm9yLCBvcGVyYXRvci5hdHRyZ2V0dGVyKCdmb28nKSwgQygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgb3BlcmF0b3IuYXR0cmdldHRlcignZm9vJyksIEMoKSkKIAogICAgICAgICAjIHJlY3Vyc2l2ZSBnZXRzCiAgICAgICAgIGEgPSBBKCkKQEAgLTQxNyw3ICs0MTcsNyBAQAogICAgICAgICBjbGFzcyBDKG9iamVjdCk6CiAgICAgICAgICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgbmFtZSk6CiAgICAgICAgICAgICAgICAgcmFpc2UgU3ludGF4RXJyb3IKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFN5bnRheEVycm9yLCBvcGVyYXRvci5pdGVtZ2V0dGVyKDQyKSwgQygpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTeW50YXhFcnJvciwgb3BlcmF0b3IuaXRlbWdldHRlcig0MiksIEMoKSkKIAogICAgICAgICBmID0gb3BlcmF0b3IuaXRlbWdldHRlcignbmFtZScpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgZiwgYSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkgYi9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CmluZGV4IDc0ODNmZTcuLmIxMWI4YzkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQpAQCAtMTE2LDcgKzExNiw3IEBACiAgICAgICAgIGV4Y2VwdCBleHBlY3RlZF9leGNlcHRpb24sIGVycjoKICAgICAgICAgICAgIGFjdHVhbF9tZXNzYWdlID0gc3RyKGVycikKICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXhwZWN0ZWRfbWVzc2FnZSwgcmV0eXBlKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZXhwZWN0ZWRfbWVzc2FnZS5zZWFyY2goYWN0dWFsX21lc3NhZ2UpLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHBlY3RlZF9tZXNzYWdlLnNlYXJjaChhY3R1YWxfbWVzc2FnZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIiIlwKIGV4cGVjdGVkIGV4Y2VwdGlvbiBtZXNzYWdlIHBhdHRlcm46CiAvJXMvCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZV9zdGRvdXQKIAogICAgICAgICBleGNlcHQgSW50ZXJjZXB0ZWRFcnJvciwgZXJyOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgICAgIHR5cGUob3V0cHV0KSBpcyB0eXBlcy5TdHJpbmdUeXBlLAogICAgICAgICAgICAgICAgICJleHBlY3RlZCBvdXRwdXQgdG8gYmUgYW4gb3JkaW5hcnkgc3RyaW5nLCBub3QgJXIiCiAgICAgICAgICAgICAgICAgJSB0eXBlKG91dHB1dCkpCkBAIC0zNDgsNyArMzQ4LDcgQEAKIAogICAgIGRlZiB0ZXN0X2dldF9vcHRpb24oc2VsZik6CiAgICAgICAgIG9wdDEgPSBzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItdiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKG9wdDEsIE9wdGlvbikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG9wdDEsIE9wdGlvbikpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0MS5fc2hvcnRfb3B0cywgWyItdiIsICItbiJdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdDEuX2xvbmdfb3B0cywgWyItLXZlcmJvc2UiLCAiLS1ub2lzeSJdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdDEuYWN0aW9uLCAic3RvcmVfdHJ1ZSIpCkBAIC0zNTksMzMgKzM1OSwzMyBAQAogICAgICAgICBvcHQyID0gc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLS12ZXJib3NlIikKICAgICAgICAgb3B0MyA9IHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi1uIikKICAgICAgICAgb3B0NCA9IHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi0tbm9pc3kiKQotICAgICAgICBzZWxmLmFzc2VydF8ob3B0MSBpcyBvcHQyIGlzIG9wdDMgaXMgb3B0NCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wdDEgaXMgb3B0MiBpcyBvcHQzIGlzIG9wdDQpCiAKICAgICBkZWYgdGVzdF9oYXNfb3B0aW9uKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLXYiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYucGFyc2VyLmhhc19vcHRpb24oIi0tdmVyYm9zZSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLXYiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmhhc19vcHRpb24oIi0tdmVyYm9zZSIpKQogCi0gICAgZGVmIGFzc2VydF9yZW1vdmVkKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLXYiKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLS12ZXJib3NlIikgaXMgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi1uIikgaXMgTm9uZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi0tbm9pc3kiKSBpcyBOb25lKQorICAgIGRlZiBhc3NlcnRUcnVlcmVtb3ZlZChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi12IikgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi0tdmVyYm9zZSIpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItbiIpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnBhcnNlci5nZXRfb3B0aW9uKCItLW5vaXN5IikgaXMgTm9uZSkKIAotICAgICAgICBzZWxmLmZhaWxJZihzZWxmLnBhcnNlci5oYXNfb3B0aW9uKCItdiIpKQotICAgICAgICBzZWxmLmZhaWxJZihzZWxmLnBhcnNlci5oYXNfb3B0aW9uKCItLXZlcmJvc2UiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLW4iKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLS1ub2lzeSIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYucGFyc2VyLmhhc19vcHRpb24oIi12IikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLS12ZXJib3NlIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLW4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnBhcnNlci5oYXNfb3B0aW9uKCItLW5vaXN5IikpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYucGFyc2VyLmhhc19vcHRpb24oIi1xIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLnBhcnNlci5oYXNfb3B0aW9uKCItLXNpbGVudCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXJzZXIuaGFzX29wdGlvbigiLXEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYucGFyc2VyLmhhc19vcHRpb24oIi0tc2lsZW50IikpCiAKICAgICBkZWYgdGVzdF9yZW1vdmVfc2hvcnRfb3B0KHNlbGYpOgogICAgICAgICBzZWxmLnBhcnNlci5yZW1vdmVfb3B0aW9uKCItbiIpCi0gICAgICAgIHNlbGYuYXNzZXJ0X3JlbW92ZWQoKQorICAgICAgICBzZWxmLmFzc2VydFRydWVyZW1vdmVkKCkKIAogICAgIGRlZiB0ZXN0X3JlbW92ZV9sb25nX29wdChzZWxmKToKICAgICAgICAgc2VsZi5wYXJzZXIucmVtb3ZlX29wdGlvbigiLS12ZXJib3NlIikKLSAgICAgICAgc2VsZi5hc3NlcnRfcmVtb3ZlZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZXJlbW92ZWQoKQogCiAgICAgZGVmIHRlc3RfcmVtb3ZlX25vbmV4aXN0ZW50KHNlbGYpOgogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzZWxmLnBhcnNlci5yZW1vdmVfb3B0aW9uLCAoJ2ZvbycsKSwgTm9uZSwKQEAgLTc5NSwxNCArNzk1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7J3ZlcmJvc2UnOiAwfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKQogICAgICAgICBpZiBoYXNhdHRyKF9fYnVpbHRpbnNfXywgJ0ZhbHNlJyk6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3B0aW9ucy52ZXJib3NlIGlzIEZhbHNlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wdGlvbnMudmVyYm9zZSBpcyBGYWxzZSkKIAogICAgIGRlZiB0ZXN0X2Jvb2xfdHJ1ZShzZWxmKToKICAgICAgICAgKG9wdGlvbnMsIGFyZ3MpID0gc2VsZi5hc3NlcnRQYXJzZU9LKFsiLXYiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsndmVyYm9zZSc6IDF9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10pCiAgICAgICAgIGlmIGhhc2F0dHIoX19idWlsdGluc19fLCAnVHJ1ZScpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9wdGlvbnMudmVyYm9zZSBpcyBUcnVlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wdGlvbnMudmVyYm9zZSBpcyBUcnVlKQogCiAgICAgZGVmIHRlc3RfYm9vbF9mbGlja2VyX29uX2FuZF9vZmYoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0UGFyc2VPSyhbIi1xdnEiLCAiLXEiLCAiLXYiXSwKQEAgLTEwMDgsNyArMTAwOCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbj0iU29tZSBtb3JlIG9wdGlvbnMiKQogICAgICAgICBncm91cC5zZXRfdGl0bGUoIkJhY29uIikKICAgICAgICAgZ3JvdXAuYWRkX29wdGlvbigiLS1iYWNvbiIsIHR5cGU9ImludCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLnBhcnNlci5nZXRfb3B0aW9uX2dyb3VwKCItLWJhY29uIiksIGdyb3VwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXJzZXIuZ2V0X29wdGlvbl9ncm91cCgiLS1iYWNvbiIpLCBncm91cCkKIAogIyAtLSBUZXN0IGV4dGVuZGluZyBhbmQgcGFyc2VyLnBhcnNlX2FyZ3MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTExMDQsMTUgKzExMDQsMTUgQEAKICAgICAgICAgaWYgb3B0ID09ICIteCI6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9wdGlvbi5fc2hvcnRfb3B0cywgWyIteCJdKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRpb24uX2xvbmdfb3B0cywgW10pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocGFyc2VyXyBpcyBzZWxmLnBhcnNlcikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2YWx1ZSBpcyBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhcnNlcl8gaXMgc2VsZi5wYXJzZXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsdWUgaXMgTm9uZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFycyhwYXJzZXJfLnZhbHVlcyksIHsnZmlsZW5hbWUnOiBOb25lfSkKIAogICAgICAgICAgICAgcGFyc2VyXy52YWx1ZXMueCA9IDQyCiAgICAgICAgIGVsaWYgb3B0ID09ICItLWZpbGUiOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvcHRpb24uX3Nob3J0X29wdHMsIFsiLWYiXSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3B0aW9uLl9sb25nX29wdHMsIFsiLS1maWxlIl0pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocGFyc2VyXyBpcyBzZWxmLnBhcnNlcikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXJzZXJfIGlzIHNlbGYucGFyc2VyKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgImZvbyIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZhcnMocGFyc2VyXy52YWx1ZXMpLCB7J2ZpbGVuYW1lJzogTm9uZSwgJ3gnOiA0Mn0pCiAKQEAgLTExNTAsNyArMTE1MCw3IEBACiAKICAgICBkZWYgcHJvY2Vzc190dXBsZShzZWxmLCBvcHRpb24sIG9wdCwgdmFsdWUsIHBhcnNlcl8sIGxlbiwgdHlwZSk6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuLCAzKQotICAgICAgICBzZWxmLmFzc2VydF8odHlwZSBpcyBpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlIGlzIGludCkKIAogICAgICAgICBpZiBvcHQgPT0gIi1wIjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsICIxLDIsMyIpCkBAIC0xMjQxLDcgKzEyNDEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fbGlzdD1vcHRpb25zKQogCiAgICAgZGVmIHZhcmlhYmxlX2FyZ3Moc2VsZiwgb3B0aW9uLCBvcHQsIHZhbHVlLCBwYXJzZXIpOgotICAgICAgICBzZWxmLmFzc2VydF8odmFsdWUgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbHVlIGlzIE5vbmUpCiAgICAgICAgIGRvbmUgPSAwCiAgICAgICAgIHZhbHVlID0gW10KICAgICAgICAgcmFyZ3MgPSBwYXJzZXIucmFyZ3MKQEAgLTEyOTcsNyArMTI5Nyw3IEBACiAKIGNsYXNzIFRlc3RDb25mbGljdChDb25mbGljdEJhc2UpOgogICAgICIiIlVzZSB0aGUgZGVmYXVsdCBjb25mbGljdCByZXNvbHV0aW9uIGZvciBPcHRpayAxLjI6IGVycm9yLiIiIgotICAgIGRlZiBhc3NlcnRfY29uZmxpY3RfZXJyb3Ioc2VsZiwgZnVuYyk6CisgICAgZGVmIGFzc2VydFRydWVjb25mbGljdF9lcnJvcihzZWxmLCBmdW5jKToKICAgICAgICAgZXJyID0gc2VsZi5hc3NlcnRSYWlzZXMoCiAgICAgICAgICAgICBmdW5jLCAoIi12IiwgIi0tdmVyc2lvbiIpLCB7J2FjdGlvbicgOiAiY2FsbGJhY2siLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjYWxsYmFjaycgOiBzZWxmLnNob3dfdmVyc2lvbiwKQEAgLTEzMDksMTEgKzEzMDksMTEgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcnIub3B0aW9uX2lkLCAiLXYvLS12ZXJzaW9uIikKIAogICAgIGRlZiB0ZXN0X2NvbmZsaWN0X2Vycm9yKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF9jb25mbGljdF9lcnJvcihzZWxmLnBhcnNlci5hZGRfb3B0aW9uKQorICAgICAgICBzZWxmLmFzc2VydFRydWVjb25mbGljdF9lcnJvcihzZWxmLnBhcnNlci5hZGRfb3B0aW9uKQogCiAgICAgZGVmIHRlc3RfY29uZmxpY3RfZXJyb3JfZ3JvdXAoc2VsZik6CiAgICAgICAgIGdyb3VwID0gT3B0aW9uR3JvdXAoc2VsZi5wYXJzZXIsICJHcm91cCAxIikKLSAgICAgICAgc2VsZi5hc3NlcnRfY29uZmxpY3RfZXJyb3IoZ3JvdXAuYWRkX29wdGlvbikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlY29uZmxpY3RfZXJyb3IoZ3JvdXAuYWRkX29wdGlvbikKIAogICAgIGRlZiB0ZXN0X25vX3N1Y2hfY29uZmxpY3RfaGFuZGxlcihzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCkBAIC0xMzMzLDggKzEzMzMsOCBAQAogICAgICAgICB2ZXJib3NlX29wdCA9IHNlbGYucGFyc2VyLmdldF9vcHRpb24oIi0tdmVyYm9zZSIpCiAgICAgICAgIHZlcnNpb25fb3B0ID0gc2VsZi5wYXJzZXIuZ2V0X29wdGlvbigiLS12ZXJzaW9uIikKIAotICAgICAgICBzZWxmLmFzc2VydF8odl9vcHQgaXMgdmVyc2lvbl9vcHQpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh2X29wdCBpcyBub3QgdmVyYm9zZV9vcHQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2X29wdCBpcyB2ZXJzaW9uX29wdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZfb3B0IGlzIG5vdCB2ZXJib3NlX29wdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2X29wdC5fbG9uZ19vcHRzLCBbIi0tdmVyc2lvbiJdKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZlcnNpb25fb3B0Ll9zaG9ydF9vcHRzLCBbIi12Il0pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmVyc2lvbl9vcHQuX2xvbmdfb3B0cywgWyItLXZlcnNpb24iXSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkgYi9MaWIvdGVzdC90ZXN0X29zLnB5CmluZGV4IDQyNzE2ZmUuLmZhODJhNzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfb3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9vcy5weQpAQCAtMjIsNyArMjIsNyBAQAogICAgIGRlZiB0ZXN0X2FjY2VzcyhzZWxmKToKICAgICAgICAgZiA9IG9zLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgb3MuT19DUkVBVHxvcy5PX1JEV1IpCiAgICAgICAgIG9zLmNsb3NlKGYpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5hY2Nlc3ModGVzdF9zdXBwb3J0LlRFU1RGTiwgb3MuV19PSykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5hY2Nlc3ModGVzdF9zdXBwb3J0LlRFU1RGTiwgb3MuV19PSykpCiAKICAgICBkZWYgdGVzdF9jbG9zZXJhbmdlKHNlbGYpOgogICAgICAgICBmaXJzdCA9IG9zLm9wZW4odGVzdF9zdXBwb3J0LlRFU1RGTiwgb3MuT19DUkVBVHxvcy5PX1JEV1IpCkBAIC02NSw3ICs2NSw3IEBACiAKICAgICBkZWYgY2hlY2tfdGVtcGZpbGUoc2VsZiwgbmFtZSk6CiAgICAgICAgICMgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdDoKLSAgICAgICAgc2VsZi5mYWlsSWYob3MucGF0aC5leGlzdHMobmFtZSksCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMobmFtZSksCiAgICAgICAgICAgICAgICAgICAgICJmaWxlIGFscmVhZHkgZXhpc3RzIGZvciB0ZW1wb3JhcnkgZmlsZSIpCiAgICAgICAgICMgbWFrZSBzdXJlIHdlIGNhbiBjcmVhdGUgdGhlIGZpbGUKICAgICAgICAgb3BlbihuYW1lLCAidyIpCkBAIC04Miw3ICs4Miw3IEBACiAgICAgICAgIHNlbGYuY2hlY2tfdGVtcGZpbGUobmFtZSkKIAogICAgICAgICBuYW1lID0gb3MudGVtcG5hbSh0ZXN0X3N1cHBvcnQuVEVTVEZOLCAicGZ4IikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguYmFzZW5hbWUobmFtZSlbOjNdID09ICJwZngiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5iYXNlbmFtZShuYW1lKVs6M10gPT0gInBmeCIpCiAgICAgICAgIHNlbGYuY2hlY2tfdGVtcGZpbGUobmFtZSkKIAogICAgIGRlZiB0ZXN0X3RtcGZpbGUoc2VsZik6CkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAgICAgZnAuc2VlaygwLDApCiAgICAgICAgIHMgPSBmcC5yZWFkKCkKICAgICAgICAgZnAuY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8ocyA9PSAiZm9vYmFyIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMgPT0gImZvb2JhciIpCiAKICAgICBkZWYgdGVzdF90bXBuYW0oc2VsZik6CiAgICAgICAgIGltcG9ydCBzeXMKQEAgLTE1Niw3ICsxNTYsNyBAQAogICAgICAgICAgICAgIyB0aGUgcm9vdCBvZiB0aGUgY3VycmVudCBkcml2ZS4gIFRoYXQncyBhIHRlcnJpYmxlIHBsYWNlIHRvCiAgICAgICAgICAgICAjIHB1dCB0ZW1wIGZpbGVzLCBhbmQsIGRlcGVuZGluZyBvbiBwcml2aWxlZ2VzLCB0aGUgdXNlcgogICAgICAgICAgICAgIyBtYXkgbm90IGV2ZW4gYmUgYWJsZSB0byBvcGVuIGEgZmlsZSBpbiB0aGUgcm9vdCBkaXJlY3RvcnkuCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihvcy5wYXRoLmV4aXN0cyhuYW1lKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMobmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZSBhbHJlYWR5IGV4aXN0cyBmb3IgdGVtcG9yYXJ5IGZpbGUiKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5jaGVja190ZW1wZmlsZShuYW1lKQpAQCAtMTk4LDcgKzE5OCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGRlZiB0cnVuYyh4KTogcmV0dXJuIHgKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh0cnVuYyhnZXRhdHRyKHJlc3VsdCwgYXR0cikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFtnZXRhdHRyKHN0YXQsIG5hbWUpXSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYXR0ciBpbiBtZW1iZXJzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhdHRyIGluIG1lbWJlcnMpCiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcmVzdWx0WzIwMF0KQEAgLTQ2NCw3ICs0NjQsNyBAQAogICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQogCiAgICAgICAgICMgVHJ5IHBhdGhzIHdpdGggYSAnLicgaW4gdGhlbQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoT1NFcnJvciwgb3MubWFrZWRpcnMsIG9zLmN1cmRpcikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgb3MubWFrZWRpcnMsIG9zLmN1cmRpcikKICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihiYXNlLCAnZGlyMScsICdkaXIyJywgJ2RpcjMnLCAnZGlyNCcsICdkaXI1Jywgb3MuY3VyZGlyKQogICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQogICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2UsICdkaXIxJywgb3MuY3VyZGlyLCAnZGlyMicsICdkaXIzJywgJ2RpcjQnLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9vc3NhdWRpb2Rldi5weSBiL0xpYi90ZXN0L3Rlc3Rfb3NzYXVkaW9kZXYucHkKaW5kZXggMzQ4OTNmMS4uZGYwNDcwNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9vc3NhdWRpb2Rldi5weQorKysgYi9MaWIvdGVzdC90ZXN0X29zc2F1ZGlvZGV2LnB5CkBAIC01Nyw3ICs1Nyw3IEBACiAgICAgICAgIGRzcC5maWxlbm8oKQogCiAgICAgICAgICMgTWFrZSBzdXJlIHRoZSByZWFkLW9ubHkgYXR0cmlidXRlcyB3b3JrLgotICAgICAgICBzZWxmLmZhaWxJZihkc3AuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGRzcC5jbG9zZWQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHNwLm5hbWUsICIvZGV2L2RzcCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZHNwLm1vZGUsICJ3IiwgImJhZCBkc3AubW9kZTogJXIiICUgZHNwLm1vZGUpCiAKQEAgLTgzLDcgKzgzLDcgQEAKICAgICAgICAgZWxhcHNlZF90aW1lID0gdDIgLSB0MQogCiAgICAgICAgIHBlcmNlbnRfZGlmZiA9IChhYnMoZWxhcHNlZF90aW1lIC0gZXhwZWN0ZWRfdGltZSkgLyBleHBlY3RlZF90aW1lKSAqIDEwMAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocGVyY2VudF9kaWZmIDw9IDEwLjAsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwZXJjZW50X2RpZmYgPD0gMTAuMCwKICAgICAgICAgICAgICAgICAgICAgICAgICJlbGFwc2VkIHRpbWUgPiAxMCUgb2ZmIG9mIGV4cGVjdGVkIHRpbWUiKQogCiAgICAgZGVmIHNldF9wYXJhbWV0ZXJzKHNlbGYsIGRzcCk6CkBAIC0xMzEsNyArMTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICBdOgogICAgICAgICAgICAgKGZtdCwgY2hhbm5lbHMsIHJhdGUpID0gY29uZmlnCiAgICAgICAgICAgICByZXN1bHQgPSBkc3Auc2V0cGFyYW1ldGVycyhmbXQsIGNoYW5uZWxzLCByYXRlLCBGYWxzZSkKLSAgICAgICAgICAgIHNlbGYuZmFpbElmRXF1YWwocmVzdWx0LCBjb25maWcsCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHJlc3VsdCwgY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZGx5IGdvdCByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbiIpCiAKICAgICAgICAgICAgIHRyeToKQEAgLTE1NSw3ICsxNTUsNyBAQAogICAgICAgICAgICAgI3NlbGYuc2V0X2JhZF9wYXJhbWV0ZXJzKGRzcCkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIGRzcC5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZHNwLmNsb3NlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkc3AuY2xvc2VkKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVlcGhvbGVyLnB5IGIvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKaW5kZXggNjYzOGE1YS4uMWY2ZWZiNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZWVwaG9sZXIucHkKQEAgLTI1LDggKzI1LDggQEAKICAgICAgICAgICAgICAgICBkZWwgeAogICAgICAgICBhc20gPSBkaXNhc3NlbWJsZSh1bm90KQogICAgICAgICBmb3IgZWxlbSBpbiAoJ1VOQVJZX05PVCcsICdQT1BfSlVNUF9JRl9GQUxTRScpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGVsZW0gbm90IGluIGFzbSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdQT1BfSlVNUF9JRl9UUlVFJyBpbiBhc20pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWxlbSBub3QgaW4gYXNtKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1BPUF9KVU1QX0lGX1RSVUUnIGluIGFzbSkKIAogICAgIGRlZiB0ZXN0X2VsaW1faW52ZXJzaW9uX29mX2lzX29yX2luKHNlbGYpOgogICAgICAgICBmb3IgbGluZSwgZWxlbSBpbiAoCkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgICAgICAoJ25vdCBhIG5vdCBpbiBiJywgJyhpbiknLCksCiAgICAgICAgICAgICApOgogICAgICAgICAgICAgYXNtID0gZGlzX3NpbmdsZShsaW5lKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGVsZW0gaW4gYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsZW0gaW4gYXNtKQogCiAgICAgZGVmIHRlc3Rfbm9uZV9hc19jb25zdGFudChzZWxmKToKICAgICAgICAgIyBMT0FEX0dMT0JBTCBOb25lICAtLT4gIExPQURfQ09OU1QgTm9uZQpAQCAtNDUsMTQgKzQ1LDE0IEBACiAgICAgICAgICAgICByZXR1cm4geAogICAgICAgICBhc20gPSBkaXNhc3NlbWJsZShmKQogICAgICAgICBmb3IgZWxlbSBpbiAoJ0xPQURfR0xPQkFMJywpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGVsZW0gbm90IGluIGFzbSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbGVtIG5vdCBpbiBhc20pCiAgICAgICAgIGZvciBlbGVtIGluICgnTE9BRF9DT05TVCcsICcoTm9uZSknKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhlbGVtIGluIGFzbSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbGVtIGluIGFzbSkKICAgICAgICAgZGVmIGYoKToKICAgICAgICAgICAgICdBZGRpbmcgYSBkb2NzdHJpbmcgbWFkZSB0aGlzIHRlc3QgZmFpbCBpbiBQeTIuNS4wJwogICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdMT0FEX0NPTlNUJyBpbiBkaXNhc3NlbWJsZShmKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdMT0FEX0dMT0JBTCcgbm90IGluIGRpc2Fzc2VtYmxlKGYpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0xPQURfQ09OU1QnIGluIGRpc2Fzc2VtYmxlKGYpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0xPQURfR0xPQkFMJyBub3QgaW4gZGlzYXNzZW1ibGUoZikpCiAKICAgICBkZWYgdGVzdF93aGlsZV9vbmUoc2VsZik6CiAgICAgICAgICMgU2tpcCBvdmVyOiAgTE9BRF9DT05TVCB0cnVlY29uc3QgIFBPUF9KVU1QX0lGX0ZBTFNFIHh4CkBAIC02Miw5ICs2Miw5IEBACiAgICAgICAgICAgICByZXR1cm4gbGlzdAogICAgICAgICBhc20gPSBkaXNhc3NlbWJsZShmKQogICAgICAgICBmb3IgZWxlbSBpbiAoJ0xPQURfQ09OU1QnLCAnUE9QX0pVTVBfSUZfRkFMU0UnKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhlbGVtIG5vdCBpbiBhc20pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWxlbSBub3QgaW4gYXNtKQogICAgICAgICBmb3IgZWxlbSBpbiAoJ0pVTVBfQUJTT0xVVEUnLCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZWxlbSBpbiBhc20pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWxlbSBpbiBhc20pCiAKICAgICBkZWYgdGVzdF9wYWNrX3VucGFjayhzZWxmKToKICAgICAgICAgZm9yIGxpbmUsIGVsZW0gaW4gKApAQCAtNzMsOSArNzMsOSBAQAogICAgICAgICAgICAgKCdhLCBiLCBjID0gYSwgYiwgYycsICdST1RfVEhSRUUnLCksCiAgICAgICAgICAgICApOgogICAgICAgICAgICAgYXNtID0gZGlzX3NpbmdsZShsaW5lKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGVsZW0gaW4gYXNtKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCdCVUlMRF9UVVBMRScgbm90IGluIGFzbSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnVU5QQUNLX1RVUExFJyBub3QgaW4gYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsZW0gaW4gYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdCVUlMRF9UVVBMRScgbm90IGluIGFzbSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnVU5QQUNLX1RVUExFJyBub3QgaW4gYXNtKQogCiAgICAgZGVmIHRlc3RfZm9sZGluZ19vZl90dXBsZXNfb2ZfY29uc3RhbnRzKHNlbGYpOgogICAgICAgICBmb3IgbGluZSwgZWxlbSBpbiAoCkBAIC04Niw4ICs4Niw4IEBACiAgICAgICAgICAgICAoJygoMSwgMiksIDMsIDQpJywgJygoKDEsIDIpLCAzLCA0KSknKSwKICAgICAgICAgICAgICk6CiAgICAgICAgICAgICBhc20gPSBkaXNfc2luZ2xlKGxpbmUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZWxlbSBpbiBhc20pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oJ0JVSUxEX1RVUExFJyBub3QgaW4gYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsZW0gaW4gYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdCVUlMRF9UVVBMRScgbm90IGluIGFzbSkKIAogICAgICAgICAjIEJ1ZyAxMDUzODE5OiAgVHVwbGUgb2YgY29uc3RhbnRzIG1pc2lkZW50aWZpZWQgd2hlbiBwcmVzZW50ZWQgd2l0aDoKICAgICAgICAgIyAuIC4gLiBvcGNvZGVfd2l0aF9hcmcgMTAwICAgdW5hcnlfb3Bjb2RlICAgQlVJTERfVFVQTEUgMSAgLiAuIC4KQEAgLTEyNSwxNyArMTI1LDE3IEBACiAgICAgICAgICAgICAoJ2EgPSAxMyB8IDcnLCAnKDE1KScpLCAgICAgICAgICAgICAgICAgIyBiaW5hcnkgb3IKICAgICAgICAgICAgICk6CiAgICAgICAgICAgICBhc20gPSBkaXNfc2luZ2xlKGxpbmUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZWxlbSBpbiBhc20sIGFzbSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnQklOQVJZXycgbm90IGluIGFzbSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbGVtIGluIGFzbSwgYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdCSU5BUllfJyBub3QgaW4gYXNtKQogCiAgICAgICAgICMgVmVyaWZ5IHRoYXQgdW5mb2xkYWJsZXMgYXJlIHNraXBwZWQKICAgICAgICAgYXNtID0gZGlzX3NpbmdsZSgnYT0yKyJiIicpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnKDIpJyBpbiBhc20pCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiKCdiJykiIGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCcoMiknIGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCIoJ2InKSIgaW4gYXNtKQogCiAgICAgICAgICMgVmVyaWZ5IHRoYXQgbGFyZ2Ugc2VxdWVuY2VzIGRvIG5vdCByZXN1bHQgZnJvbSBmb2xkaW5nCiAgICAgICAgIGFzbSA9IGRpc19zaW5nbGUoJ2E9IngiKjEwMDAnKQotICAgICAgICBzZWxmLmFzc2VydF8oJygxMDAwKScgaW4gYXNtKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJygxMDAwKScgaW4gYXNtKQogCiAgICAgZGVmIHRlc3RfZm9sZGluZ19vZl91bmFyeW9wc19vbl9jb25zdGFudHMoc2VsZik6CiAgICAgICAgIGZvciBsaW5lLCBlbGVtIGluICgKQEAgLTE0NCw4ICsxNDQsOCBAQAogICAgICAgICAgICAgKCd+LTInLCAnKDEpJyksICAgICAgICAgICAgICAgICAgICAgICAgICMgdW5hcnkgaW52ZXJ0CiAgICAgICAgICk6CiAgICAgICAgICAgICBhc20gPSBkaXNfc2luZ2xlKGxpbmUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZWxlbSBpbiBhc20sIGFzbSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnVU5BUllfJyBub3QgaW4gYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVsZW0gaW4gYXNtLCBhc20pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1VOQVJZXycgbm90IGluIGFzbSkKIAogICAgICAgICAjIFZlcmlmeSB0aGF0IHVuZm9sZGFibGVzIGFyZSBza2lwcGVkCiAgICAgICAgIGZvciBsaW5lLCBlbGVtIGluICgKQEAgLTE1MywxNiArMTUzLDE2IEBACiAgICAgICAgICAgICAoJ34iYWJjIicsICIoJ2FiYycpIiksICAgICAgICAgICAgICAgICAgIyB1bmFyeSBpbnZlcnQKICAgICAgICAgKToKICAgICAgICAgICAgIGFzbSA9IGRpc19zaW5nbGUobGluZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhlbGVtIGluIGFzbSwgYXNtKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCdVTkFSWV8nIGluIGFzbSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbGVtIGluIGFzbSwgYXNtKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdVTkFSWV8nIGluIGFzbSkKIAogICAgIGRlZiB0ZXN0X2VsaW1fZXh0cmFfcmV0dXJuKHNlbGYpOgogICAgICAgICAjIFJFVFVSTiBMT0FEX0NPTlNUIE5vbmUgUkVUVVJOICAtLT4gIFJFVFVSTgogICAgICAgICBkZWYgZih4KToKICAgICAgICAgICAgIHJldHVybiB4CiAgICAgICAgIGFzbSA9IGRpc2Fzc2VtYmxlKGYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnTE9BRF9DT05TVCcgbm90IGluIGFzbSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCcoTm9uZSknIG5vdCBpbiBhc20pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnTE9BRF9DT05TVCcgbm90IGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCcoTm9uZSknIG5vdCBpbiBhc20pCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXNtLnNwbGl0KCkuY291bnQoJ1JFVFVSTl9WQUxVRScpLCAxKQogCiAgICAgZGVmIHRlc3RfZWxpbV9qdW1wX3RvX3JldHVybihzZWxmKToKQEAgLTE3MCw4ICsxNzAsOCBAQAogICAgICAgICBkZWYgZihjb25kLCB0cnVlX3ZhbHVlLCBmYWxzZV92YWx1ZSk6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZV92YWx1ZSBpZiBjb25kIGVsc2UgZmFsc2VfdmFsdWUKICAgICAgICAgYXNtID0gZGlzYXNzZW1ibGUoZikKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdKVU1QX0ZPUldBUkQnIG5vdCBpbiBhc20pCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnSlVNUF9BQlNPTFVURScgbm90IGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdKVU1QX0ZPUldBUkQnIG5vdCBpbiBhc20pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnSlVNUF9BQlNPTFVURScgbm90IGluIGFzbSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc20uc3BsaXQoKS5jb3VudCgnUkVUVVJOX1ZBTFVFJyksIDIpCiAKICAgICBkZWYgdGVzdF9lbGltX2p1bXBfYWZ0ZXJfcmV0dXJuMShzZWxmKToKQEAgLTE4Niw4ICsxODYsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiA1CiAgICAgICAgICAgICByZXR1cm4gNgogICAgICAgICBhc20gPSBkaXNhc3NlbWJsZShmKQotICAgICAgICBzZWxmLmFzc2VydF8oJ0pVTVBfRk9SV0FSRCcgbm90IGluIGFzbSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdKVU1QX0FCU09MVVRFJyBub3QgaW4gYXNtKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0pVTVBfRk9SV0FSRCcgbm90IGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdKVU1QX0FCU09MVVRFJyBub3QgaW4gYXNtKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzbS5zcGxpdCgpLmNvdW50KCdSRVRVUk5fVkFMVUUnKSwgNikKIAogICAgIGRlZiB0ZXN0X2VsaW1fanVtcF9hZnRlcl9yZXR1cm4yKHNlbGYpOgpAQCAtMTk2LDcgKzE5Niw3IEBACiAgICAgICAgICAgICB3aGlsZSAxOgogICAgICAgICAgICAgICAgIGlmIGNvbmQxOiByZXR1cm4gNAogICAgICAgICBhc20gPSBkaXNhc3NlbWJsZShmKQotICAgICAgICBzZWxmLmFzc2VydF8oJ0pVTVBfRk9SV0FSRCcgbm90IGluIGFzbSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdKVU1QX0ZPUldBUkQnIG5vdCBpbiBhc20pCiAgICAgICAgICMgVGhlcmUgc2hvdWxkIGJlIG9uZSBqdW1wIGZvciB0aGUgd2hpbGUgbG9vcC4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhc20uc3BsaXQoKS5jb3VudCgnSlVNUF9BQlNPTFVURScpLCAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFzbS5zcGxpdCgpLmNvdW50KCdSRVRVUk5fVkFMVUUnKSwgMikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVwMjQ3LnB5IGIvTGliL3Rlc3QvdGVzdF9wZXAyNDcucHkKaW5kZXggNjkxYzg1YS4uN2Q3NDI1ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZXAyNDcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZXAyNDcucHkKQEAgLTE5LDggKzE5LDggQEAKIGNsYXNzIFBlcDI0N1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIGNoZWNrX21vZHVsZShzZWxmLCBtb2R1bGUsIGtleT1Ob25lKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIobW9kdWxlLCAnZGlnZXN0X3NpemUnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1vZHVsZS5kaWdlc3Rfc2l6ZSBpcyBOb25lIG9yIG1vZHVsZS5kaWdlc3Rfc2l6ZSA+IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG1vZHVsZSwgJ2RpZ2VzdF9zaXplJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtb2R1bGUuZGlnZXN0X3NpemUgaXMgTm9uZSBvciBtb2R1bGUuZGlnZXN0X3NpemUgPiAwKQogCiAgICAgICAgIGlmIG5vdCBrZXkgaXMgTm9uZToKICAgICAgICAgICAgIG9iajEgPSBtb2R1bGUubmV3KGtleSkKQEAgLTQxLDcgKzQxLDcgQEAKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhoMSwgaDIpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKGhhc2F0dHIob2JqMSwgJ2RpZ2VzdF9zaXplJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKG9iajEsICdkaWdlc3Rfc2l6ZScpKQogCiAgICAgICAgIGlmIG5vdCBtb2R1bGUuZGlnZXN0X3NpemUgaXMgTm9uZToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG9iajEuZGlnZXN0X3NpemUsIG1vZHVsZS5kaWdlc3Rfc2l6ZSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcGVwMjc3LnB5IGIvTGliL3Rlc3QvdGVzdF9wZXAyNzcucHkKaW5kZXggYTYxYmNkZi4uNDY5NWUwYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wZXAyNzcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wZXAyNzcucHkKQEAgLTgyLDggKzgyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKSkKICAgICAgICAgc2YyID0gc2V0KHUiXFwiLmpvaW4oKHVuaWNvZGUodGVzdF9zdXBwb3J0LlRFU1RGTiksIGYpKQogICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gZjIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihmMSksIGxlbihzZWxmLmZpbGVzKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2YyLCBzZXQoc2VsZi5maWxlcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGYxKSwgbGVuKHNlbGYuZmlsZXMpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNmMiwgc2V0KHNlbGYuZmlsZXMpKQogCiAgICAgZGVmIHRlc3RfcmVuYW1lKHNlbGYpOgogICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLmZpbGVzOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wZXAzNTIucHkgYi9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQppbmRleCA1ZjU3OGQyLi5kMjQyOWViIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BlcDM1Mi5weQpAQCAtMTksNyArMTksNyBAQAogICAgIGluaGVyaXRhbmNlIGhpZXJhcmNoeSkiIiIKIAogICAgIGRlZiB0ZXN0X2J1aWx0aW5zX25ld19zdHlsZShzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoRXhjZXB0aW9uLCBvYmplY3QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhFeGNlcHRpb24sIG9iamVjdCkpCiAKICAgICBkZWYgdmVyaWZ5X2luc3RhbmNlX2ludGVyZmFjZShzZWxmLCBpbnMpOgogICAgICAgICB3aXRoIHdhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKCk6CkBAIC00MSw3ICs0MSw3IEBACiAgICAgICAgICAgICAgICAgbGFzdF9leGMgPSBnZXRhdHRyKF9fYnVpbHRpbl9fLCBzdXBlcmNsYXNzX25hbWUpCiAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJiYXNlIGNsYXNzICVzIG5vdCBhIGJ1aWx0LWluIiAlIHN1cGVyY2xhc3NfbmFtZSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdXBlcmNsYXNzX25hbWUgaW4gZXhjX3NldCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdXBlcmNsYXNzX25hbWUgaW4gZXhjX3NldCkKICAgICAgICAgICAgIGV4Y19zZXQuZGlzY2FyZChzdXBlcmNsYXNzX25hbWUpCiAgICAgICAgICAgICBzdXBlcmNsYXNzZXMgPSBbXSAgIyBMb29wIHdpbGwgaW5zZXJ0IGJhc2UgZXhjZXB0aW9uCiAgICAgICAgICAgICBsYXN0X2RlcHRoID0gMApAQCAtNjgsMjAgKzY4LDIwIEBACiAgICAgICAgICAgICAgICAgZWxpZiBsYXN0X2RlcHRoID4gZGVwdGg6CiAgICAgICAgICAgICAgICAgICAgIHdoaWxlIHN1cGVyY2xhc3Nlc1stMV1bMF0gPj0gZGVwdGg6CiAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcmNsYXNzZXMucG9wKCkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhleGMsIHN1cGVyY2xhc3Nlc1stMV1bMV0pLAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGV4Yywgc3VwZXJjbGFzc2VzWy0xXVsxXSksCiAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YmNsYXNzIG9mICVzIiAlIChleGMuX19uYW1lX18sCiAgICAgICAgICAgICAgICAgICAgIHN1cGVyY2xhc3Nlc1stMV1bMV0uX19uYW1lX18pKQogICAgICAgICAgICAgICAgIHRyeTogICMgU29tZSBleGNlcHRpb25zIHJlcXVpcmUgYXJndW1lbnRzOyBqdXN0IHNraXAgdGhlbQogICAgICAgICAgICAgICAgICAgICBzZWxmLnZlcmlmeV9pbnN0YW5jZV9pbnRlcmZhY2UoZXhjKCkpCiAgICAgICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhleGNfbmFtZSBpbiBleGNfc2V0KQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShleGNfbmFtZSBpbiBleGNfc2V0KQogICAgICAgICAgICAgICAgIGV4Y19zZXQuZGlzY2FyZChleGNfbmFtZSkKICAgICAgICAgICAgICAgICBsYXN0X2V4YyA9IGV4YwogICAgICAgICAgICAgICAgIGxhc3RfZGVwdGggPSBkZXB0aAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgaW5oZXJpdGFuY2VfdHJlZS5jbG9zZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihleGNfc2V0KSwgMCwgIiVzIG5vdCBhY2NvdW50ZWQgZm9yIiAlIGV4Y19zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGV4Y19zZXQpLCAwLCAiJXMgbm90IGFjY291bnRlZCBmb3IiICUgZXhjX3NldCkKIAogICAgIGludGVyZmFjZV90ZXN0cyA9ICgibGVuZ3RoIiwgImFyZ3MiLCAibWVzc2FnZSIsICJzdHIiLCAidW5pY29kZSIsICJyZXByIiwKICAgICAgICAgICAgICJpbmRleGluZyIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BrZy5weSBiL0xpYi90ZXN0L3Rlc3RfcGtnLnB5CmluZGV4IDNhOTU0Y2EuLmUzYjg2ZTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGtnLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGtnLnB5CkBAIC0xMjYsNyArMTI2LDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWJzdWIuX19uYW1lX18sICJ0Mi5zdWIuc3Vic3ViIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdWIuc3Vic3ViLl9fbmFtZV9fLCAidDIuc3ViLnN1YnN1YiIpCiAgICAgICAgIGZvciBuYW1lIGluIFsnc3BhbScsICdzdWInLCAnc3Vic3ViJywgJ3QyJ106Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MobG9jYWxzKClbIm5hbWUiXSwgIkZhaWxlZCB0byBpbXBvcnQgJXMiICUgbmFtZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsb2NhbHMoKVsibmFtZSJdLCAiRmFpbGVkIHRvIGltcG9ydCAlcyIgJSBuYW1lKQogCiAgICAgICAgIGltcG9ydCB0Mi5zdWIKICAgICAgICAgaW1wb3J0IHQyLnN1Yi5zdWJzdWIKQEAgLTEzNiw3ICsxMzYsNyBAQAogCiAgICAgICAgIHMgPSAiIiIKICAgICAgICAgICAgIGZyb20gdDIgaW1wb3J0ICoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhkaXIoKSwgWydzZWxmJywgJ3N1YiddKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpcigpLCBbJ3NlbGYnLCAnc3ViJ10pCiAgICAgICAgICAgICAiIiIKICAgICAgICAgc2VsZi5ydW5fY29kZShzKQogCkBAIC0yNTQsMjUgKzI1NCwyNSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpeGRpcihkaXIodGFzKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgWydfX2RvY19fJywgJ19fZmlsZV9fJywgJ19fbmFtZV9fJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19fcGFja2FnZV9fJywgJ19fcGF0aF9fJ10pCi0gICAgICAgIHNlbGYuZmFpbElmKHQ3KQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQ3KQogICAgICAgICBmcm9tIHQ3IGltcG9ydCBzdWIgYXMgc3VicGFyCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZml4ZGlyKGRpcihzdWJwYXIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBbJ19fZG9jX18nLCAnX19maWxlX18nLCAnX19uYW1lX18nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnX19wYWNrYWdlX18nLCAnX19wYXRoX18nXSkKLSAgICAgICAgc2VsZi5mYWlsSWYodDcpCi0gICAgICAgIHNlbGYuZmFpbElmKHN1YikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0NykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzdWIpCiAgICAgICAgIGZyb20gdDcuc3ViIGltcG9ydCBzdWJzdWIgYXMgc3Vic3Vic3ViCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZml4ZGlyKGRpcihzdWJzdWJzdWIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBbJ19fZG9jX18nLCAnX19maWxlX18nLCAnX19uYW1lX18nLAogICAgICAgICAgICAgICAgICAgICAgICAgICdfX3BhY2thZ2VfXycsICdfX3BhdGhfXycsICdzcGFtJ10pCi0gICAgICAgIHNlbGYuZmFpbElmKHQ3KQotICAgICAgICBzZWxmLmZhaWxJZihzdWIpCi0gICAgICAgIHNlbGYuZmFpbElmKHN1YnN1YikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSh0NykKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzdWIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3Vic3ViKQogICAgICAgICBmcm9tIHQ3LnN1Yi5zdWJzdWIgaW1wb3J0IHNwYW0gYXMgaGFtCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFtLCAxKQotICAgICAgICBzZWxmLmZhaWxJZih0NykKLSAgICAgICAgc2VsZi5mYWlsSWYoc3ViKQotICAgICAgICBzZWxmLmZhaWxJZihzdWJzdWIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UodDcpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc3ViKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHN1YnN1YikKIAogCiBkZWYgdGVzdF9tYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BrZ2ltcG9ydC5weSBiL0xpYi90ZXN0L3Rlc3RfcGtnaW1wb3J0LnB5CmluZGV4IGM4N2MzNDIuLjhhYTIyNGEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcGtnaW1wb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGtnaW1wb3J0LnB5CkBAIC01Miw3ICs1Miw3IEBACiAgICAgICAgIHRyeTogX19pbXBvcnRfXyhzZWxmLm1vZHVsZV9uYW1lKQogICAgICAgICBleGNlcHQgU3ludGF4RXJyb3I6IHBhc3MKICAgICAgICAgZWxzZTogcmFpc2UgUnVudGltZUVycm9yLCAnRmFpbGVkIHRvIGluZHVjZSBTeW50YXhFcnJvcicKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBzeXMubW9kdWxlcy5oYXNfa2V5KHNlbGYubW9kdWxlX25hbWUpIGFuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHN5cy5tb2R1bGVzLmhhc19rZXkoc2VsZi5tb2R1bGVfbmFtZSkgYW5kCiAgICAgICAgICAgICAgICAgICAgICBub3QgaGFzYXR0cihzeXMubW9kdWxlc1tzZWxmLnBhY2thZ2VfbmFtZV0sICdmb28nKSkKIAogICAgICAgICAjIC4uLm1ha2UgdXAgYSB2YXJpYWJsZSBuYW1lIHRoYXQgaXNuJ3QgYm91bmQgaW4gX19idWlsdGluc19fCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BsYXRmb3JtLnB5IGIvTGliL3Rlc3QvdGVzdF9wbGF0Zm9ybS5weQppbmRleCAwY2E3NjFjLi42M2Q1ZGEyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BsYXRmb3JtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGxhdGZvcm0ucHkKQEAgLTEyNSwxMiArMTI1LDEyIEBACiAKICAgICBkZWYgdGVzdF91bmFtZShzZWxmKToKICAgICAgICAgcmVzID0gcGxhdGZvcm0udW5hbWUoKQotICAgICAgICBzZWxmLmFzc2VydF8oYW55KHJlcykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhbnkocmVzKSkKIAogICAgIGRlZiB0ZXN0X2phdmFfdmVyKHNlbGYpOgogICAgICAgICByZXMgPSBwbGF0Zm9ybS5qYXZhX3ZlcigpCiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnamF2YSc6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oYWxsKHJlcykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYWxsKHJlcykpCiAKICAgICBkZWYgdGVzdF93aW4zMl92ZXIoc2VsZik6CiAgICAgICAgIHJlcyA9IHBsYXRmb3JtLndpbjMyX3ZlcigpCkBAIC0xNTUsNyArMTU1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmVhbF92ZXIgPSBsbi5zdHJpcCgpLnNwbGl0KClbLTFdCiAgICAgICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgICAgICBmZC5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihyZWFsX3ZlciBpcyBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZWFsX3ZlciBpcyBOb25lKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzWzBdLCByZWFsX3ZlcikKIAogICAgICAgICAgICAgIyByZXNbMV0gY2xhaW1zIHRvIGNvbnRhaW4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcG9wbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9wb3BsaWIucHkKaW5kZXggYWQ0YjhkMy4uNTA2ZDE4MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wb3BsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wb3BsaWIucHkKQEAgLTI0Niw3ICsyNDYsNyBAQAogICAgICAgICAgICAgc2VsZi5jbGllbnQgPSBwb3BsaWIuUE9QM19TU0woc2VsZi5zZXJ2ZXIuaG9zdCwgc2VsZi5zZXJ2ZXIucG9ydCkKIAogICAgICAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oJ1BPUDNfU1NMJyBpbiBwb3BsaWIuX19hbGxfXykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnUE9QM19TU0wnIGluIHBvcGxpYi5fX2FsbF9fKQogCiAKIGNsYXNzIFRlc3RUaW1lb3V0cyhUZXN0Q2FzZSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5IGIvTGliL3Rlc3QvdGVzdF9wb3NpeC5weQppbmRleCAzMmNiYTEzLi5hOTYzMDlkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcG9zaXgucHkKQEAgLTQzLDEzICs0MywxMyBAQAogCiAgICAgZGVmIHRlc3Rfc3RhdHZmcyhzZWxmKToKICAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ3N0YXR2ZnMnKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhwb3NpeC5zdGF0dmZzKG9zLmN1cmRpcikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXguc3RhdHZmcyhvcy5jdXJkaXIpKQogCiAgICAgZGVmIHRlc3RfZnN0YXR2ZnMoc2VsZik6CiAgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdmc3RhdHZmcycpOgogICAgICAgICAgICAgZnAgPSBvcGVuKHRlc3Rfc3VwcG9ydC5URVNURk4pCiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHBvc2l4LmZzdGF0dmZzKGZwLmZpbGVubygpKSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXguZnN0YXR2ZnMoZnAuZmlsZW5vKCkpKQogICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCiAKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGZkID0gcG9zaXguZHVwKGZwLmZpbGVubygpKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGZkLCBpbnQpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGZkLCBpbnQpKQogICAgICAgICAgICAgICAgIG9zLmNsb3NlKGZkKQogICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCkBAIC0xMzUsMTMgKzEzNSwxMyBAQAogICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnZnN0YXQnKToKICAgICAgICAgICAgIGZwID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOKQogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhwb3NpeC5mc3RhdChmcC5maWxlbm8oKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LmZzdGF0KGZwLmZpbGVubygpKSkKICAgICAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQogCiAgICAgZGVmIHRlc3Rfc3RhdChzZWxmKToKICAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ3N0YXQnKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhwb3NpeC5zdGF0KHRlc3Rfc3VwcG9ydC5URVNURk4pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnN0YXQodGVzdF9zdXBwb3J0LlRFU1RGTikpCiAKICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnY2hvd24nKToKICAgICAgICAgZGVmIHRlc3RfY2hvd24oc2VsZik6CkBAIC0xNzcsMjEgKzE3NywyMSBAQAogCiAgICAgZGVmIHRlc3RfbHNkaXIoc2VsZik6CiAgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdsc2RpcicpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHRlc3Rfc3VwcG9ydC5URVNURk4gaW4gcG9zaXgubHNkaXIob3MuY3VyZGlyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ZXN0X3N1cHBvcnQuVEVTVEZOIGluIHBvc2l4LmxzZGlyKG9zLmN1cmRpcikpCiAKICAgICBkZWYgdGVzdF9hY2Nlc3Moc2VsZik6CiAgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdhY2Nlc3MnKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhwb3NpeC5hY2Nlc3ModGVzdF9zdXBwb3J0LlRFU1RGTiwgb3MuUl9PSykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXguYWNjZXNzKHRlc3Rfc3VwcG9ydC5URVNURk4sIG9zLlJfT0spKQogCiAgICAgZGVmIHRlc3RfdW1hc2soc2VsZik6CiAgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICd1bWFzaycpOgogICAgICAgICAgICAgb2xkX21hc2sgPSBwb3NpeC51bWFzaygwKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uob2xkX21hc2ssIGludCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShvbGRfbWFzaywgaW50KSkKICAgICAgICAgICAgIHBvc2l4LnVtYXNrKG9sZF9tYXNrKQogCiAgICAgZGVmIHRlc3Rfc3RyZXJyb3Ioc2VsZik6CiAgICAgICAgIGlmIGhhc2F0dHIocG9zaXgsICdzdHJlcnJvcicpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHBvc2l4LnN0cmVycm9yKDApKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnN0cmVycm9yKDApKQogCiAgICAgZGVmIHRlc3RfcGlwZShzZWxmKToKICAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ3BpcGUnKToKQEAgLTIwMSw5ICsyMDEsOSBAQAogCiAgICAgZGVmIHRlc3RfdGVtcG5hbShzZWxmKToKICAgICAgICAgaWYgaGFzYXR0cihwb3NpeCwgJ3RlbXBuYW0nKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhwb3NpeC50ZW1wbmFtKCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocG9zaXgudGVtcG5hbShvcy5jdXJkaXIpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHBvc2l4LnRlbXBuYW0ob3MuY3VyZGlyLCAnYmxhaCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBvc2l4LnRlbXBuYW0oKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwb3NpeC50ZW1wbmFtKG9zLmN1cmRpcikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocG9zaXgudGVtcG5hbShvcy5jdXJkaXIsICdibGFoJykpCiAKICAgICBkZWYgdGVzdF90bXBmaWxlKHNlbGYpOgogICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAndG1wZmlsZScpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wb3NpeHBhdGgucHkgYi9MaWIvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weQppbmRleCAwYTBhNDhiLi4zZThmZmE5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Bvc2l4cGF0aC5weQpAQCAtMjYsNyArMjYsNyBAQAogICAgICAgICAgICAgc2FmZV9ybWRpcih0ZXN0X3N1cHBvcnQuVEVTVEZOICsgc3VmZml4KQogCiAgICAgZGVmIGFzc2VydElzKHNlbGYsIGEsIGIpOgotICAgICAgICBzZWxmLmFzc2VydF8oYSBpcyBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpcyBiKQogCiAgICAgZGVmIHRlc3Rfbm9ybWNhc2Uoc2VsZik6CiAgICAgICAgICMgQ2hlY2sgdGhhdCBub3JtY2FzZSgpIGlzIGlkZW1wb3RlbnQKQEAgLTEzNCw4ICsxMzQsOCBAQAogICAgICAgICBmb3IgczEgaW4gdGVzdGxpc3Q6CiAgICAgICAgICAgICBmb3IgczIgaW4gdGVzdGxpc3Q6CiAgICAgICAgICAgICAgICAgcCA9IHBvc2l4cGF0aC5jb21tb25wcmVmaXgoW3MxLCBzMl0pCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHMxLnN0YXJ0c3dpdGgocCkpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHMyLnN0YXJ0c3dpdGgocCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMxLnN0YXJ0c3dpdGgocCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMyLnN0YXJ0c3dpdGgocCkpCiAgICAgICAgICAgICAgICAgaWYgczEgIT0gczI6CiAgICAgICAgICAgICAgICAgICAgIG4gPSBsZW4ocCkKICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzMVtuOm4rMV0sIHMyW246bisxXSkKQEAgLTE2Myw3ICsxNjMsNyBAQAogICAgICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQsICJmb29iYXIiKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgICAgICAgcG9zaXhwYXRoLmdldGN0aW1lKHRlc3Rfc3VwcG9ydC5URVNURk4pIDw9CiAgICAgICAgICAgICAgICAgcG9zaXhwYXRoLmdldG10aW1lKHRlc3Rfc3VwcG9ydC5URVNURk4pCiAgICAgICAgICAgICApCkBAIC0zMzUsMTUgKzMzNSwxNSBAQAogICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShwb3NpeHBhdGguZXhwYW5kdXNlcigifi8iKSwgYmFzZXN0cmluZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShwb3NpeHBhdGguZXhwYW5kdXNlcigifi8iKSwgYmFzZXN0cmluZykpCiAgICAgICAgICAgICAjIGlmIGhvbWUgZGlyZWN0b3J5ID09IHJvb3QgZGlyZWN0b3J5LCB0aGlzIHRlc3QgbWFrZXMgbm8gc2Vuc2UKICAgICAgICAgICAgIGlmIHBvc2l4cGF0aC5leHBhbmR1c2VyKCJ+IikgIT0gJy8nOgogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCiAgICAgICAgICAgICAgICAgICAgIHBvc2l4cGF0aC5leHBhbmR1c2VyKCJ+IikgKyAiLyIsCiAgICAgICAgICAgICAgICAgICAgIHBvc2l4cGF0aC5leHBhbmR1c2VyKCJ+LyIpCiAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UocG9zaXhwYXRoLmV4cGFuZHVzZXIoIn5yb290LyIpLCBiYXNlc3RyaW5nKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHBvc2l4cGF0aC5leHBhbmR1c2VyKCJ+Zm9vLyIpLCBiYXNlc3RyaW5nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHBvc2l4cGF0aC5leHBhbmR1c2VyKCJ+cm9vdC8iKSwgYmFzZXN0cmluZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShwb3NpeHBhdGguZXhwYW5kdXNlcigifmZvby8iKSwgYmFzZXN0cmluZykpCiAKICAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LkVudmlyb25tZW50VmFyR3VhcmQoKSBhcyBlbnY6CiAgICAgICAgICAgICAgICAgZW52WydIT01FJ10gPSAnLycKQEAgLTM4NCwxMiArMzg0LDEyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcG9zaXhwYXRoLm5vcm1wYXRoKQogCiAgICAgZGVmIHRlc3RfYWJzcGF0aChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJmb28iIGluIHBvc2l4cGF0aC5hYnNwYXRoKCJmb28iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJmb28iIGluIHBvc2l4cGF0aC5hYnNwYXRoKCJmb28iKSkKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHBvc2l4cGF0aC5hYnNwYXRoKQogCiAgICAgZGVmIHRlc3RfcmVhbHBhdGgoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XygiZm9vIiBpbiByZWFscGF0aCgiZm9vIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiZm9vIiBpbiByZWFscGF0aCgiZm9vIikpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcG9zaXhwYXRoLnJlYWxwYXRoKQogCiAgICAgaWYgaGFzYXR0cihvcywgInN5bWxpbmsiKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHByaW50LnB5IGIvTGliL3Rlc3QvdGVzdF9wcHJpbnQucHkKaW5kZXggM2YyOTAzOC4uNzFiOTA0YyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wcHJpbnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wcHJpbnQucHkKQEAgLTQwLDcgKzQwLDcgQEAKIAogICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgogICAgICAgICAjIFZlcmlmeSAuaXNyZWN1cnNpdmUoKSBhbmQgLmlzcmVhZGFibGUoKSB3L28gcmVjdXJzaW9uCi0gICAgICAgIHZlcmlmeSA9IHNlbGYuYXNzZXJ0XworICAgICAgICB2ZXJpZnkgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgcHAgPSBwcHJpbnQuUHJldHR5UHJpbnRlcigpCiAgICAgICAgIGZvciBzYWZlIGluICgyLCAyLjAsIDJqLCAiYWJjIiwgWzNdLCAoMiwyKSwgezM6IDN9LCB1bmkoInlhZGRheWFkZGEiKSwKICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYSwgc2VsZi5iKToKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgc2VsZi5kID0ge30KICAgICAgICAgc2VsZi5kWzBdID0gc2VsZi5kWzFdID0gc2VsZi5kWzJdID0gc2VsZi5kCiAKLSAgICAgICAgdmVyaWZ5ID0gc2VsZi5hc3NlcnRfCisgICAgICAgIHZlcmlmeSA9IHNlbGYuYXNzZXJ0VHJ1ZQogICAgICAgICBwcCA9IHBwcmludC5QcmV0dHlQcmludGVyKCkKIAogICAgICAgICBmb3IgaWNreSBpbiBzZWxmLmEsIHNlbGYuYiwgc2VsZi5kLCAoc2VsZi5kLCBzZWxmLmQpOgpAQCAtOTEsNyArOTEsNyBAQAogCiAgICAgZGVmIHRlc3RfdW5yZWFkYWJsZShzZWxmKToKICAgICAgICAgIyBOb3QgcmVjdXJzaXZlIGJ1dCBub3QgcmVhZGFibGUgYW55d2F5Ci0gICAgICAgIHZlcmlmeSA9IHNlbGYuYXNzZXJ0XworICAgICAgICB2ZXJpZnkgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgcHAgPSBwcHJpbnQuUHJldHR5UHJpbnRlcigpCiAgICAgICAgIGZvciB1bnJlYWRhYmxlIGluIHR5cGUoMyksIHBwcmludCwgcHByaW50LmlzcmVjdXJzaXZlOgogICAgICAgICAgICAgIyBtb2R1bGUtbGV2ZWwgY29udmVuaWVuY2UgZnVuY3Rpb25zCkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICAgICAgIyBpdCBzb3J0ZWQgYSBkaWN0IGRpc3BsYXkgaWYgYW5kIG9ubHkgaWYgdGhlIGRpc3BsYXkgcmVxdWlyZWQKICAgICAgICAgIyBtdWx0aXBsZSBsaW5lcy4gIEZvciB0aGF0IHJlYXNvbiwgZGljdHMgd2l0aCBtb3JlIHRoYW4gb25lIGVsZW1lbnQKICAgICAgICAgIyBhcmVuJ3QgdGVzdGVkIGhlcmUuCi0gICAgICAgIHZlcmlmeSA9IHNlbGYuYXNzZXJ0XworICAgICAgICB2ZXJpZnkgPSBzZWxmLmFzc2VydFRydWUKICAgICAgICAgZm9yIHNpbXBsZSBpbiAoMCwgMEwsIDArMGosIDAuMCwgIiIsIHVuaSgiIiksCiAgICAgICAgICAgICAgICAgICAgICAgICgpLCB0dXBsZTIoKSwgdHVwbGUzKCksCiAgICAgICAgICAgICAgICAgICAgICAgIFtdLCBsaXN0MigpLCBsaXN0MygpLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wcm9wZXJ0eS5weSBiL0xpYi90ZXN0L3Rlc3RfcHJvcGVydHkucHkKaW5kZXggN2E4MDAzZi4uNjg0ZjhmZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wcm9wZXJ0eS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Byb3BlcnR5LnB5CkBAIC04Niw4ICs4Niw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZS5zcGFtLCAxMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLl9zcGFtLCAxMCkKICAgICAgICAgZGVsYXR0cihiYXNlLCAic3BhbSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaGFzYXR0cihiYXNlLCAic3BhbSIpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGhhc2F0dHIoYmFzZSwgIl9zcGFtIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihiYXNlLCAic3BhbSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIoYmFzZSwgIl9zcGFtIikpCiAgICAgICAgIGJhc2Uuc3BhbSA9IDIwCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZS5zcGFtLCAyMCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXNlLl9zcGFtLCAyMCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHdkLnB5IGIvTGliL3Rlc3QvdGVzdF9wd2QucHkKaW5kZXggZGU0MDg0ZS4uZmRjNzRiNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wd2QucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9wd2QucHkKQEAgLTEzLDE5ICsxMywxOSBAQAogICAgICAgICBmb3IgZSBpbiBlbnRyaWVzOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZSksIDcpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVbMF0sIGUucHdfbmFtZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGUucHdfbmFtZSwgYmFzZXN0cmluZykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShlLnB3X25hbWUsIGJhc2VzdHJpbmcpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlWzFdLCBlLnB3X3Bhc3N3ZCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGUucHdfcGFzc3dkLCBiYXNlc3RyaW5nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGUucHdfcGFzc3dkLCBiYXNlc3RyaW5nKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZVsyXSwgZS5wd191aWQpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShlLnB3X3VpZCwgaW50KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGUucHdfdWlkLCBpbnQpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlWzNdLCBlLnB3X2dpZCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGUucHdfZ2lkLCBpbnQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZS5wd19naWQsIGludCkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVbNF0sIGUucHdfZ2Vjb3MpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShlLnB3X2dlY29zLCBiYXNlc3RyaW5nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGUucHdfZ2Vjb3MsIGJhc2VzdHJpbmcpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlWzVdLCBlLnB3X2RpcikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGUucHdfZGlyLCBiYXNlc3RyaW5nKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGUucHdfZGlyLCBiYXNlc3RyaW5nKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZVs2XSwgZS5wd19zaGVsbCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGUucHdfc2hlbGwsIGJhc2VzdHJpbmcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZS5wd19zaGVsbCwgYmFzZXN0cmluZykpCiAKICAgICAgICAgICAgICMgVGhlIGZvbGxvd2luZyB3b24ndCB3b3JrLCBiZWNhdXNlIG9mIGR1cGxpY2F0ZSBlbnRyaWVzCiAgICAgICAgICAgICAjIGZvciBvbmUgdWlkCkBAIC00Myw4ICs0Myw4IEBACiAgICAgICAgIGZvciBlIGluIGVudHJpZXM6CiAgICAgICAgICAgICBpZiBub3QgZVswXSBvciBlWzBdID09ICcrJzoKICAgICAgICAgICAgICAgICBjb250aW51ZSAjIHNraXAgTklTIGVudHJpZXMgZXRjLgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHB3ZC5nZXRwd25hbShlLnB3X25hbWUpIGluIGVudHJpZXNieW5hbWVbZS5wd19uYW1lXSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhwd2QuZ2V0cHd1aWQoZS5wd191aWQpIGluIGVudHJpZXNieXVpZFtlLnB3X3VpZF0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocHdkLmdldHB3bmFtKGUucHdfbmFtZSkgaW4gZW50cmllc2J5bmFtZVtlLnB3X25hbWVdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHB3ZC5nZXRwd3VpZChlLnB3X3VpZCkgaW4gZW50cmllc2J5dWlkW2UucHdfdWlkXSkKIAogICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwd2QuZ2V0cHd1aWQpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B5M2t3YXJuLnB5IGIvTGliL3Rlc3QvdGVzdF9weTNrd2Fybi5weQppbmRleCA3YzI1OTgwLi4zNmM5ODhmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B5M2t3YXJuLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHkza3dhcm4ucHkKQEAgLTMxNyw3ICszMTcsNyBAQAogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIF9faW1wb3J0X18obW9kdWxlX25hbWUsIGxldmVsPTApCiAgICAgICAgICAgICBleGNlcHQgRGVwcmVjYXRpb25XYXJuaW5nIGFzIGV4YzoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8obW9kdWxlX25hbWUgaW4gZXhjLmFyZ3NbMF0sCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1vZHVsZV9uYW1lIGluIGV4Yy5hcmdzWzBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgd2FybmluZyBkaWRuJ3QgY29udGFpbiBtb2R1bGUgbmFtZSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJSBtb2R1bGVfbmFtZSkKICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcHljbGJyLnB5IGIvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKaW5kZXggNWZiZTc1ZC4uNzFkZGEyMiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkKQEAgLTM1LDcgKzM1LDcgQEAKICAgICAgICAgJycnIHN1Y2NlZWQgaWZmIGhhc2F0dHIob2JqLGF0dHIpIG9yIGF0dHIgaW4gaWdub3JlLiAnJycKICAgICAgICAgaWYgYXR0ciBpbiBpZ25vcmU6IHJldHVybgogICAgICAgICBpZiBub3QgaGFzYXR0cihvYmosIGF0dHIpOiBwcmludCAiPz8/IiwgYXR0cgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaGFzYXR0cihvYmosIGF0dHIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihvYmosIGF0dHIpLAogICAgICAgICAgICAgICAgICAgICAgICAgJ2V4cGVjdGVkIGhhc2F0dHIoJXIsICVyKScgJSAob2JqLCBhdHRyKSkKIAogCkBAIC00NCw3ICs0NCw3IEBACiAgICAgICAgIGlmIGtleSBpbiBpZ25vcmU6IHJldHVybgogICAgICAgICBpZiBub3Qgb2JqLmhhc19rZXkoa2V5KToKICAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIioqKiIsa2V5Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvYmouaGFzX2tleShrZXkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob2JqLmhhc19rZXkoa2V5KSkKIAogICAgIGRlZiBhc3NlcnRFcXVhbHNPcklnbm9yZWQoc2VsZiwgYSwgYiwgaWdub3JlKToKICAgICAgICAgJycnIHN1Y2NlZWQgaWZmIGEgPT0gYiBvciBhIGluIGlnbm9yZSBvciBiIGluIGlnbm9yZSAnJycKQEAgLTkyLDEyICs5MiwxMiBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRIYXNhdHRyKG1vZHVsZSwgbmFtZSwgaWdub3JlKQogICAgICAgICAgICAgcHlfaXRlbSA9IGdldGF0dHIobW9kdWxlLCBuYW1lKQogICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgcHljbGJyLkZ1bmN0aW9uKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShweV9pdGVtLCAoRnVuY3Rpb25UeXBlLCBCdWlsdGluRnVuY3Rpb25UeXBlKSkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocHlfaXRlbSwgKEZ1bmN0aW9uVHlwZSwgQnVpbHRpbkZ1bmN0aW9uVHlwZSkpKQogICAgICAgICAgICAgICAgIGlmIHB5X2l0ZW0uX19tb2R1bGVfXyAhPSBtb2R1bGVOYW1lOgogICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAgICMgc2tpcCBmdW5jdGlvbnMgdGhhdCBjYW1lIGZyb20gc29tZXdoZXJlIGVsc2UKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhweV9pdGVtLl9fbW9kdWxlX18sIHZhbHVlLm1vZHVsZSkKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UocHlfaXRlbSwgKENsYXNzVHlwZSwgdHlwZSkpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHB5X2l0ZW0sIChDbGFzc1R5cGUsIHR5cGUpKSkKICAgICAgICAgICAgICAgICBpZiBweV9pdGVtLl9fbW9kdWxlX18gIT0gbW9kdWxlTmFtZToKICAgICAgICAgICAgICAgICAgICAgY29udGludWUgICAjIHNraXAgY2xhc3NlcyB0aGF0IGNhbWUgZnJvbSBzb21ld2hlcmUgZWxzZQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3B5ZG9jLnB5IGIvTGliL3Rlc3QvdGVzdF9weWRvYy5weQppbmRleCBjMWMxOWY2Li4wZmFmNGExIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B5ZG9jLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcHlkb2MucHkKQEAgLTI5NCw3ICsyOTQsNyBAQAogICAgICAgICAjIENoZWNrIHRoYXQgcHlkb2Nmb2RkZXIgbW9kdWxlIGNhbiBiZSBkZXNjcmliZWQKICAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCBweWRvY2ZvZGRlcgogICAgICAgICBkb2MgPSBweWRvYy5yZW5kZXJfZG9jKHB5ZG9jZm9kZGVyKQotICAgICAgICBzZWxmLmFzc2VydF8oInB5ZG9jZm9kZGVyIiBpbiBkb2MpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgicHlkb2Nmb2RkZXIiIGluIGRvYykKIAogICAgIGRlZiB0ZXN0X2NsYXNzaWNfY2xhc3Moc2VsZik6CiAgICAgICAgIGNsYXNzIEM6ICJDbGFzc2ljIGNsYXNzIgpAQCAtMzAyLDcgKzMwMiw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHlkb2MuZGVzY3JpYmUoQyksICdjbGFzcyBDJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChweWRvYy5kZXNjcmliZShjKSwgJ2luc3RhbmNlIG9mIEMnKQogICAgICAgICBleHBlY3RlZCA9ICdpbnN0YW5jZSBvZiBDIGluIG1vZHVsZSAlcycgJSBfX25hbWVfXwotICAgICAgICBzZWxmLmFzc2VydF8oZXhwZWN0ZWQgaW4gcHlkb2MucmVuZGVyX2RvYyhjKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4cGVjdGVkIGluIHB5ZG9jLnJlbmRlcl9kb2MoYykpCiAKICAgICBkZWYgdGVzdF9jbGFzcyhzZWxmKToKICAgICAgICAgY2xhc3MgQyhvYmplY3QpOiAiTmV3LXN0eWxlIGNsYXNzIgpAQCAtMzExLDcgKzMxMSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocHlkb2MuZGVzY3JpYmUoQyksICdjbGFzcyBDJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChweWRvYy5kZXNjcmliZShjKSwgJ0MnKQogICAgICAgICBleHBlY3RlZCA9ICdDIGluIG1vZHVsZSAlcyBvYmplY3QnICUgX19uYW1lX18KLSAgICAgICAgc2VsZi5hc3NlcnRfKGV4cGVjdGVkIGluIHB5ZG9jLnJlbmRlcl9kb2MoYykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHBlY3RlZCBpbiBweWRvYy5yZW5kZXJfZG9jKGMpKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcXVldWUucHkgYi9MaWIvdGVzdC90ZXN0X3F1ZXVlLnB5CmluZGV4IGUwZWI4ZjQuLjJmYTM2YjcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcXVldWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9xdWV1ZS5weQpAQCAtMTAwLDEwICsxMDAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIkRpZG4ndCBzZWVtIHRvIHF1ZXVlIHRoZSBjb3JyZWN0IGRhdGEhIikKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoUVVFVUVfU0laRS0xKToKICAgICAgICAgICAgIHEucHV0KGkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBub3QgYmUgZW1wdHkiKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IHEuZnVsbCgpLCAiUXVldWUgc2hvdWxkIG5vdCBiZSBmdWxsIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIG5vdCBiZSBlbXB0eSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcS5mdWxsKCksICJRdWV1ZSBzaG91bGQgbm90IGJlIGZ1bGwiKQogICAgICAgICBxLnB1dCgibGFzdCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhxLmZ1bGwoKSwgIlF1ZXVlIHNob3VsZCBiZSBmdWxsIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEuZnVsbCgpLCAiUXVldWUgc2hvdWxkIGJlIGZ1bGwiKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBxLnB1dCgiZnVsbCIsIGJsb2NrPTApCiAgICAgICAgICAgICBzZWxmLmZhaWwoIkRpZG4ndCBhcHBlYXIgdG8gYmxvY2sgd2l0aCBhIGZ1bGwgcXVldWUiKQpAQCAtMTIwLDcgKzEyMCw3IEBACiAgICAgICAgICMgRW1wdHkgaXQKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoUVVFVUVfU0laRSk6CiAgICAgICAgICAgICBxLmdldCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhxLmVtcHR5KCksICJRdWV1ZSBzaG91bGQgYmUgZW1wdHkiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIGJlIGVtcHR5IikKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgcS5nZXQoYmxvY2s9MCkKICAgICAgICAgICAgIHNlbGYuZmFpbCgiRGlkbid0IGFwcGVhciB0byBibG9jayB3aXRoIGFuIGVtcHR5IHF1ZXVlIikKQEAgLTI0Miw3ICsyNDIsNyBAQAogICAgICAgICBleGNlcHQgRmFpbGluZ1F1ZXVlRXhjZXB0aW9uOgogICAgICAgICAgICAgcGFzcwogICAgICAgICBxLnB1dCgibGFzdCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhxLmZ1bGwoKSwgIlF1ZXVlIHNob3VsZCBiZSBmdWxsIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEuZnVsbCgpLCAiUXVldWUgc2hvdWxkIGJlIGZ1bGwiKQogICAgICAgICAjIFRlc3QgYSBmYWlsaW5nIGJsb2NraW5nIHB1dAogICAgICAgICBxLmZhaWxfbmV4dF9wdXQgPSBUcnVlCiAgICAgICAgIHRyeToKQEAgLTI2NCwxNyArMjY0LDE3IEBACiAgICAgICAgICMgQ2hlY2sgdGhlIFF1ZXVlIGlzbid0IGRhbWFnZWQuCiAgICAgICAgICMgcHV0IGZhaWxlZCwgYnV0IGdldCBzdWNjZWVkZWQgLSByZS1hZGQKICAgICAgICAgcS5wdXQoImxhc3QiKQotICAgICAgICBzZWxmLmFzc2VydF8ocS5mdWxsKCksICJRdWV1ZSBzaG91bGQgYmUgZnVsbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxLmZ1bGwoKSwgIlF1ZXVlIHNob3VsZCBiZSBmdWxsIikKICAgICAgICAgcS5nZXQoKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IHEuZnVsbCgpLCAiUXVldWUgc2hvdWxkIG5vdCBiZSBmdWxsIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBxLmZ1bGwoKSwgIlF1ZXVlIHNob3VsZCBub3QgYmUgZnVsbCIpCiAgICAgICAgIHEucHV0KCJsYXN0IikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHEuZnVsbCgpLCAiUXVldWUgc2hvdWxkIGJlIGZ1bGwiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocS5mdWxsKCksICJRdWV1ZSBzaG91bGQgYmUgZnVsbCIpCiAgICAgICAgICMgVGVzdCBhIGJsb2NraW5nIHB1dAogICAgICAgICBzZWxmLmRvX2Jsb2NraW5nX3Rlc3QocS5wdXQsICgiZnVsbCIsKSwgcS5nZXQsICgpKQogICAgICAgICAjIEVtcHR5IGl0CiAgICAgICAgIGZvciBpIGluIHJhbmdlKFFVRVVFX1NJWkUpOgogICAgICAgICAgICAgcS5nZXQoKQotICAgICAgICBzZWxmLmFzc2VydF8ocS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIGJlIGVtcHR5IikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBiZSBlbXB0eSIpCiAgICAgICAgIHEucHV0KCJmaXJzdCIpCiAgICAgICAgIHEuZmFpbF9uZXh0X2dldCA9IFRydWUKICAgICAgICAgdHJ5OgpAQCAtMjgyLDE2ICsyODIsMTYgQEAKICAgICAgICAgICAgIHNlbGYuZmFpbCgiVGhlIHF1ZXVlIGRpZG4ndCBmYWlsIHdoZW4gaXQgc2hvdWxkIGhhdmUiKQogICAgICAgICBleGNlcHQgRmFpbGluZ1F1ZXVlRXhjZXB0aW9uOgogICAgICAgICAgICAgcGFzcwotICAgICAgICBzZWxmLmFzc2VydF8obm90IHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBub3QgYmUgZW1wdHkiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBub3QgYmUgZW1wdHkiKQogICAgICAgICBxLmZhaWxfbmV4dF9nZXQgPSBUcnVlCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHEuZ2V0KHRpbWVvdXQ9MC4xKQogICAgICAgICAgICAgc2VsZi5mYWlsKCJUaGUgcXVldWUgZGlkbid0IGZhaWwgd2hlbiBpdCBzaG91bGQgaGF2ZSIpCiAgICAgICAgIGV4Y2VwdCBGYWlsaW5nUXVldWVFeGNlcHRpb246CiAgICAgICAgICAgICBwYXNzCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgcS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIG5vdCBiZSBlbXB0eSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIG5vdCBiZSBlbXB0eSIpCiAgICAgICAgIHEuZ2V0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBiZSBlbXB0eSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxLmVtcHR5KCksICJRdWV1ZSBzaG91bGQgYmUgZW1wdHkiKQogICAgICAgICBxLmZhaWxfbmV4dF9nZXQgPSBUcnVlCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuZG9fZXhjZXB0aW9uYWxfYmxvY2tpbmdfdGVzdChxLmdldCwgKCksIHEucHV0LCAoJ2VtcHR5JywpLApAQCAtMzAwLDkgKzMwMCw5IEBACiAgICAgICAgIGV4Y2VwdCBGYWlsaW5nUXVldWVFeGNlcHRpb246CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgICMgcHV0IHN1Y2NlZWRlZCwgYnV0IGdldCBmYWlsZWQuCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgcS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIG5vdCBiZSBlbXB0eSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcS5lbXB0eSgpLCAiUXVldWUgc2hvdWxkIG5vdCBiZSBlbXB0eSIpCiAgICAgICAgIHEuZ2V0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHEuZW1wdHkoKSwgIlF1ZXVlIHNob3VsZCBiZSBlbXB0eSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxLmVtcHR5KCksICJRdWV1ZSBzaG91bGQgYmUgZW1wdHkiKQogCiAgICAgZGVmIHRlc3RfZmFpbGluZ19xdWV1ZShzZWxmKToKICAgICAgICAgIyBUZXN0IHRvIG1ha2Ugc3VyZSBhIHF1ZXVlIGlzIGZ1bmN0aW9uaW5nIGNvcnJlY3RseS4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcXVvcHJpLnB5IGIvTGliL3Rlc3QvdGVzdF9xdW9wcmkucHkKaW5kZXggNTZhNzkzYy4uNDA2ZTVmYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9xdW9wcmkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9xdW9wcmkucHkKQEAgLTEzMCwxNyArMTMwLDE3IEBACiAgICAgQHdpdGhweXRob25pbXBsZW1lbnRhdGlvbgogICAgIGRlZiB0ZXN0X2VuY29kZXN0cmluZyhzZWxmKToKICAgICAgICAgZm9yIHAsIGUgaW4gc2VsZi5TVFJJTkdTOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHF1b3ByaS5lbmNvZGVzdHJpbmcocCkgPT0gZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmkuZW5jb2Rlc3RyaW5nKHApID09IGUpCiAKICAgICBAd2l0aHB5dGhvbmltcGxlbWVudGF0aW9uCiAgICAgZGVmIHRlc3RfZGVjb2Rlc3RyaW5nKHNlbGYpOgogICAgICAgICBmb3IgcCwgZSBpbiBzZWxmLlNUUklOR1M6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocXVvcHJpLmRlY29kZXN0cmluZyhlKSA9PSBwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHF1b3ByaS5kZWNvZGVzdHJpbmcoZSkgPT0gcCkKIAogICAgIEB3aXRocHl0aG9uaW1wbGVtZW50YXRpb24KICAgICBkZWYgdGVzdF9pZGVtcG90ZW50X3N0cmluZyhzZWxmKToKICAgICAgICAgZm9yIHAsIGUgaW4gc2VsZi5TVFJJTkdTOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHF1b3ByaS5kZWNvZGVzdHJpbmcocXVvcHJpLmVuY29kZXN0cmluZyhlKSkgPT0gZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmkuZGVjb2Rlc3RyaW5nKHF1b3ByaS5lbmNvZGVzdHJpbmcoZSkpID09IGUpCiAKICAgICBAd2l0aHB5dGhvbmltcGxlbWVudGF0aW9uCiAgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYpOgpAQCAtMTQ4LDcgKzE0OCw3IEBACiAgICAgICAgICAgICBpbmZwID0gY1N0cmluZ0lPLlN0cmluZ0lPKHApCiAgICAgICAgICAgICBvdXRmcCA9IGNTdHJpbmdJTy5TdHJpbmdJTygpCiAgICAgICAgICAgICBxdW9wcmkuZW5jb2RlKGluZnAsIG91dGZwLCBxdW90ZXRhYnM9RmFsc2UpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ob3V0ZnAuZ2V0dmFsdWUoKSA9PSBlKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG91dGZwLmdldHZhbHVlKCkgPT0gZSkKIAogICAgIEB3aXRocHl0aG9uaW1wbGVtZW50YXRpb24KICAgICBkZWYgdGVzdF9kZWNvZGUoc2VsZik6CkBAIC0xNTYsMjMgKzE1NiwyMyBAQAogICAgICAgICAgICAgaW5mcCA9IGNTdHJpbmdJTy5TdHJpbmdJTyhlKQogICAgICAgICAgICAgb3V0ZnAgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQogICAgICAgICAgICAgcXVvcHJpLmRlY29kZShpbmZwLCBvdXRmcCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvdXRmcC5nZXR2YWx1ZSgpID09IHApCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob3V0ZnAuZ2V0dmFsdWUoKSA9PSBwKQogCiAgICAgQHdpdGhweXRob25pbXBsZW1lbnRhdGlvbgogICAgIGRlZiB0ZXN0X2VtYmVkZGVkX3dzKHNlbGYpOgogICAgICAgICBmb3IgcCwgZSBpbiBzZWxmLkVTVFJJTkdTOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHF1b3ByaS5lbmNvZGVzdHJpbmcocCwgcXVvdGV0YWJzPVRydWUpID09IGUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocXVvcHJpLmRlY29kZXN0cmluZyhlKSA9PSBwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHF1b3ByaS5lbmNvZGVzdHJpbmcocCwgcXVvdGV0YWJzPVRydWUpID09IGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocXVvcHJpLmRlY29kZXN0cmluZyhlKSA9PSBwKQogCiAgICAgQHdpdGhweXRob25pbXBsZW1lbnRhdGlvbgogICAgIGRlZiB0ZXN0X2VuY29kZV9oZWFkZXIoc2VsZik6CiAgICAgICAgIGZvciBwLCBlIGluIHNlbGYuSFNUUklOR1M6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocXVvcHJpLmVuY29kZXN0cmluZyhwLCBoZWFkZXI9VHJ1ZSkgPT0gZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmkuZW5jb2Rlc3RyaW5nKHAsIGhlYWRlcj1UcnVlKSA9PSBlKQogCiAgICAgQHdpdGhweXRob25pbXBsZW1lbnRhdGlvbgogICAgIGRlZiB0ZXN0X2RlY29kZV9oZWFkZXIoc2VsZik6CiAgICAgICAgIGZvciBwLCBlIGluIHNlbGYuSFNUUklOR1M6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocXVvcHJpLmRlY29kZXN0cmluZyhlLCBoZWFkZXI9VHJ1ZSkgPT0gcCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShxdW9wcmkuZGVjb2Rlc3RyaW5nKGUsIGhlYWRlcj1UcnVlKSA9PSBwKQogCiAgICAgZGVmIHRlc3Rfc2NyaXB0ZW5jb2RlKHNlbGYpOgogICAgICAgICAocCwgZSkgPSBzZWxmLlNUUklOR1NbLTFdCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3JhbmRvbS5weSBiL0xpYi90ZXN0L3Rlc3RfcmFuZG9tLnB5CmluZGV4IDhlNDYzOWUuLjMwYmQzMzAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmFuZG9tLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcmFuZG9tLnB5CkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzKSwgaykKICAgICAgICAgICAgIHVuaXEgPSBzZXQocykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHVuaXEpLCBrKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHVuaXEgPD0gc2V0KHBvcHVsYXRpb24pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVuaXEgPD0gc2V0KHBvcHVsYXRpb24pKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZ2VuLnNhbXBsZShbXSwgMCksIFtdKSAgIyB0ZXN0IGVkZ2UgY2FzZSBOPT1rPT0wCiAKICAgICBkZWYgdGVzdF9zYW1wbGVfZGlzdHJpYnV0aW9uKHNlbGYpOgpAQCAtMTEyLDcgKzExMiw3IEBACiAgICAgICAgICAgICBzYW1wID0gc2VsZi5nZW4uc2FtcGxlKGQsIGspCiAgICAgICAgICAgICAjIFZlcmlmeSB0aGF0IHdlIGdvdCBpbnRzIGJhY2sgKGtleXMpOyB0aGUgdmFsdWVzIGFyZSBjb21wbGV4LgogICAgICAgICAgICAgZm9yIHggaW4gc2FtcDoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8odHlwZSh4KSBpcyBpbnQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoeCkgaXMgaW50KQogICAgICAgICBzYW1wLnNvcnQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNhbXAsIHJhbmdlKE4pKQogCkBAIC0yMzcsNyArMjM3LDcgQEAKICAgICAgICAgY3VtID0gMAogICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoMTAwKToKICAgICAgICAgICAgIHIgPSBzZWxmLmdlbi5yYW5kcmFuZ2Uoc3BhbikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygwIDw9IHIgPCBzcGFuKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPD0gciA8IHNwYW4pCiAgICAgICAgICAgICBjdW0gfD0gcgogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGN1bSwgc3Bhbi0xKQogCkBAIC0yNDcsNyArMjQ3LDcgQEAKICAgICAgICAgICAgIHN0b3AgPSBzZWxmLmdlbi5yYW5kcmFuZ2UoMiAqKiAoaS0yKSkKICAgICAgICAgICAgIGlmIHN0b3AgPD0gc3RhcnQ6CiAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oc3RhcnQgPD0gc2VsZi5nZW4ucmFuZHJhbmdlKHN0YXJ0LCBzdG9wKSA8IHN0b3ApCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RhcnQgPD0gc2VsZi5nZW4ucmFuZHJhbmdlKHN0YXJ0LCBzdG9wKSA8IHN0b3ApCiAKICAgICBkZWYgdGVzdF9yYW5nZWxpbWl0cyhzZWxmKToKICAgICAgICAgZm9yIHN0YXJ0LCBzdG9wIGluIFsoLTIsMCksICgtKDIqKjYwKS0yLC0oMioqNjApKSwgKDIqKjYwLDIqKjYwKzIpXToKQEAgLTI1Nyw3ICsyNTcsNyBAQAogICAgIGRlZiB0ZXN0X2dlbnJhbmRiaXRzKHNlbGYpOgogICAgICAgICAjIFZlcmlmeSByYW5nZXMKICAgICAgICAgZm9yIGsgaW4geHJhbmdlKDEsIDEwMDApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDAgPD0gc2VsZi5nZW4uZ2V0cmFuZGJpdHMoaykgPCAyKiprKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPD0gc2VsZi5nZW4uZ2V0cmFuZGJpdHMoaykgPCAyKiprKQogCiAgICAgICAgICMgVmVyaWZ5IGFsbCBiaXRzIGFjdGl2ZQogICAgICAgICBnZXRiaXRzID0gc2VsZi5nZW4uZ2V0cmFuZGJpdHMKQEAgLTI4MywxNyArMjgzLDE3IEBACiAgICAgICAgICAgICBudW1iaXRzID0gaSsxCiAgICAgICAgICAgICBrID0gaW50KDEuMDAwMDEgKyBfbG9nKG4sIDIpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBudW1iaXRzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG4gPT0gMioqKGstMSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobiA9PSAyKiooay0xKSkKIAogICAgICAgICAgICAgbiArPSBuIC0gMSAgICAgICMgY2hlY2sgMSBiZWxvdyB0aGUgbmV4dCBwb3dlciBvZiB0d28KICAgICAgICAgICAgIGsgPSBpbnQoMS4wMDAwMSArIF9sb2cobiwgMikpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oayBpbiBbbnVtYml0cywgbnVtYml0cysxXSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygyKiprID4gbiA+IDIqKihrLTIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgaW4gW251bWJpdHMsIG51bWJpdHMrMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMioqayA+IG4gPiAyKiooay0yKSkKIAogICAgICAgICAgICAgbiAtPSBuID4+IDE1ICAgICAjIGNoZWNrIGEgbGl0dGxlIGZhcnRoZXIgYmVsb3cgdGhlIG5leHQgcG93ZXIgb2YgdHdvCiAgICAgICAgICAgICBrID0gaW50KDEuMDAwMDEgKyBfbG9nKG4sIDIpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBudW1iaXRzKSAgICAgICAgIyBub3RlIHRoZSBzdHJvbmdlciBhc3NlcnRpb24KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygyKiprID4gbiA+IDIqKihrLTEpKSAgICMgbm90ZSB0aGUgc3Ryb25nZXIgYXNzZXJ0aW9uCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMioqayA+IG4gPiAyKiooay0xKSkgICAjIG5vdGUgdGhlIHN0cm9uZ2VyIGFzc2VydGlvbgogCiAKIGNsYXNzIE1lcnNlbm5lVHdpc3Rlcl9UZXN0QmFzaWNPcHMoVGVzdEJhc2ljT3BzKToKQEAgLTM4OSw3ICszODksNyBAQAogICAgICAgICBjdW0gPSAwCiAgICAgICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgogICAgICAgICAgICAgciA9IHNlbGYuZ2VuLnJhbmRyYW5nZShzcGFuKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDAgPD0gciA8IHNwYW4pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSByIDwgc3BhbikKICAgICAgICAgICAgIGN1bSB8PSByCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY3VtLCBzcGFuLTEpCiAKQEAgLTM5OSw3ICszOTksNyBAQAogICAgICAgICAgICAgc3RvcCA9IHNlbGYuZ2VuLnJhbmRyYW5nZSgyICoqIChpLTIpKQogICAgICAgICAgICAgaWYgc3RvcCA8PSBzdGFydDoKICAgICAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzdGFydCA8PSBzZWxmLmdlbi5yYW5kcmFuZ2Uoc3RhcnQsIHN0b3ApIDwgc3RvcCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdGFydCA8PSBzZWxmLmdlbi5yYW5kcmFuZ2Uoc3RhcnQsIHN0b3ApIDwgc3RvcCkKIAogICAgIGRlZiB0ZXN0X3JhbmdlbGltaXRzKHNlbGYpOgogICAgICAgICBmb3Igc3RhcnQsIHN0b3AgaW4gWygtMiwwKSwgKC0oMioqNjApLTIsLSgyKio2MCkpLCAoMioqNjAsMioqNjArMildOgpAQCAtNDEzLDcgKzQxMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgOTc5MDQ4NDU3NzczNDM1MTA0MDQ3MTg5NTYxMTVMKQogICAgICAgICAjIFZlcmlmeSByYW5nZXMKICAgICAgICAgZm9yIGsgaW4geHJhbmdlKDEsIDEwMDApOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKDAgPD0gc2VsZi5nZW4uZ2V0cmFuZGJpdHMoaykgPCAyKiprKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgPD0gc2VsZi5nZW4uZ2V0cmFuZGJpdHMoaykgPCAyKiprKQogCiAgICAgICAgICMgVmVyaWZ5IGFsbCBiaXRzIGFjdGl2ZQogICAgICAgICBnZXRiaXRzID0gc2VsZi5nZW4uZ2V0cmFuZGJpdHMKQEAgLTQzOSwyNCArNDM5LDI0IEBACiAgICAgICAgICAgICBudW1iaXRzID0gaSsxCiAgICAgICAgICAgICBrID0gaW50KDEuMDAwMDEgKyBfbG9nKG4sIDIpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBudW1iaXRzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG4gPT0gMioqKGstMSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobiA9PSAyKiooay0xKSkKIAogICAgICAgICAgICAgbiArPSBuIC0gMSAgICAgICMgY2hlY2sgMSBiZWxvdyB0aGUgbmV4dCBwb3dlciBvZiB0d28KICAgICAgICAgICAgIGsgPSBpbnQoMS4wMDAwMSArIF9sb2cobiwgMikpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oayBpbiBbbnVtYml0cywgbnVtYml0cysxXSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygyKiprID4gbiA+IDIqKihrLTIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGsgaW4gW251bWJpdHMsIG51bWJpdHMrMV0pCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMioqayA+IG4gPiAyKiooay0yKSkKIAogICAgICAgICAgICAgbiAtPSBuID4+IDE1ICAgICAjIGNoZWNrIGEgbGl0dGxlIGZhcnRoZXIgYmVsb3cgdGhlIG5leHQgcG93ZXIgb2YgdHdvCiAgICAgICAgICAgICBrID0gaW50KDEuMDAwMDEgKyBfbG9nKG4sIDIpKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChrLCBudW1iaXRzKSAgICAgICAgIyBub3RlIHRoZSBzdHJvbmdlciBhc3NlcnRpb24KLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygyKiprID4gbiA+IDIqKihrLTEpKSAgICMgbm90ZSB0aGUgc3Ryb25nZXIgYXNzZXJ0aW9uCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoMioqayA+IG4gPiAyKiooay0xKSkgICAjIG5vdGUgdGhlIHN0cm9uZ2VyIGFzc2VydGlvbgogCiAgICAgZGVmIHRlc3RfcmFuZHJhbmdlX2J1Z18xNTkwODkxKHNlbGYpOgogICAgICAgICBzdGFydCA9IDEwMDAwMDAwMDAwMDAKICAgICAgICAgc3RvcCA9IC0xMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgICAgICAgc3RlcCA9IC0yMDAKICAgICAgICAgeCA9IHNlbGYuZ2VuLnJhbmRyYW5nZShzdGFydCwgc3RvcCwgc3RlcCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0b3AgPCB4IDw9IHN0YXJ0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RvcCA8IHggPD0gc3RhcnQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKHgrc3RvcCklc3RlcCwgMCkKIAogZGVmIGdhbW1hKHosIHNxcnQycGk9KDIuMCpwaSkqKjAuNSk6CkBAIC01MzQsNyArNTM0LDcgQEAKIAogICAgIGRlZiB0ZXN0X19hbGxfXyhzZWxmKToKICAgICAgICAgIyB0ZXN0cyB2YWxpZGl0eSBidXQgbm90IGNvbXBsZXRlbmVzcyBvZiB0aGUgX19hbGxfXyBsaXN0Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZXQocmFuZG9tLl9fYWxsX18pIDw9IHNldChkaXIocmFuZG9tKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQocmFuZG9tLl9fYWxsX18pIDw9IHNldChkaXIocmFuZG9tKSkpCiAKICAgICBkZWYgdGVzdF9yYW5kb21fc3ViY2xhc3Nfd2l0aF9rd2FyZ3Moc2VsZik6CiAgICAgICAgICMgU0YgYnVnICMxNDg2NjYzIC0tIHRoaXMgdXNlZCB0byBlcnJvbmVvdXNseSByYWlzZSBhIFR5cGVFcnJvcgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yZS5weSBiL0xpYi90ZXN0L3Rlc3RfcmUucHkKaW5kZXggZmViNzE2MC4uNGY1NDNkOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JlLnB5CkBAIC02MDksNyArNjA5LDcgQEAKICAgICAgICAgICAgIHVuaWNvZGUKICAgICAgICAgZXhjZXB0IE5hbWVFcnJvcjoKICAgICAgICAgICAgIHJldHVybiAjIG5vIHByb2JsZW0gaWYgd2UgaGF2ZSBubyB1bmljb2RlCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZS5jb21waWxlKCdidWdfOTI2MDc1JykgaXMgbm90CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5jb21waWxlKCdidWdfOTI2MDc1JykgaXMgbm90CiAgICAgICAgICAgICAgICAgICAgICByZS5jb21waWxlKGV2YWwoInUnYnVnXzkyNjA3NSciKSkpCiAKICAgICBkZWYgdGVzdF9idWdfOTMxODQ4KHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yZXByLnB5IGIvTGliL3Rlc3QvdGVzdF9yZXByLnB5CmluZGV4IDEwOTQ4MTYuLjQ5NGE3YzMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcmVwci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JlcHIucHkKQEAgLTEyMywyMCArMTIzLDIwIEBACiAgICAgICAgIGVxKHIoaTMpLCAoIjxDbGFzc1dpdGhGYWlsaW5nUmVwciBpbnN0YW5jZSBhdCAleD4iJWlkKGkzKSkpCiAKICAgICAgICAgcyA9IHIoQ2xhc3NXaXRoRmFpbGluZ1JlcHIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLnN0YXJ0c3dpdGgoIjxjbGFzcyAiKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuZW5kc3dpdGgoIj4iKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHMuZmluZCgiLi4uIikgPT0gOCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuc3RhcnRzd2l0aCgiPGNsYXNzICIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5lbmRzd2l0aCgiPiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocy5maW5kKCIuLi4iKSA9PSA4KQogCiAgICAgZGVmIHRlc3RfZmlsZShzZWxmKToKICAgICAgICAgZnAgPSBvcGVuKHVuaXR0ZXN0Ll9fZmlsZV9fKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVwcihmcCkuc3RhcnRzd2l0aCgKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoZnApLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAiPG9wZW4gZmlsZSAnJXMnLCBtb2RlICdyJyBhdCAweCIgJSB1bml0dGVzdC5fX2ZpbGVfXykpCiAgICAgICAgIGZwLmNsb3NlKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcHIoZnApLnN0YXJ0c3dpdGgoCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGZwKS5zdGFydHN3aXRoKAogICAgICAgICAgICAgIjxjbG9zZWQgZmlsZSAnJXMnLCBtb2RlICdyJyBhdCAweCIgJSB1bml0dGVzdC5fX2ZpbGVfXykpCiAKICAgICBkZWYgdGVzdF9sYW1iZGEoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXByKGxhbWJkYSB4OiB4KS5zdGFydHN3aXRoKAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihsYW1iZGEgeDogeCkuc3RhcnRzd2l0aCgKICAgICAgICAgICAgICI8ZnVuY3Rpb24gPGxhbWJkYSIpKQogICAgICAgICAjIFhYWCBhbm9ueW1vdXMgZnVuY3Rpb25zPyAgc2VlIGZ1bmNfcmVwcgogCkBAIC0xNDUsNyArMTQ1LDcgQEAKICAgICAgICAgIyBGdW5jdGlvbnMKICAgICAgICAgZXEocmVwcihoYXNoKSwgJzxidWlsdC1pbiBmdW5jdGlvbiBoYXNoPicpCiAgICAgICAgICMgTWV0aG9kcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVwcignJy5zcGxpdCkuc3RhcnRzd2l0aCgKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoJycuc3BsaXQpLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAnPGJ1aWx0LWluIG1ldGhvZCBzcGxpdCBvZiBzdHIgb2JqZWN0IGF0IDB4JykpCiAKICAgICBkZWYgdGVzdF94cmFuZ2Uoc2VsZik6CkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICAgICAgIyBYWFggZG9lc24ndCB0ZXN0IGJ1ZmZlcnMgd2l0aCBubyBiX2Jhc2Ugb3IgcmVhZC13cml0ZSBidWZmZXJzIChzZWUKICAgICAgICAgIyBidWZmZXJvYmplY3QuYykuICBUaGUgdGVzdCBpcyBmYWlybHkgaW5jb21wbGV0ZSB0b28uICBTaWdoLgogICAgICAgICB4ID0gYnVmZmVyKCdmb28nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVwcih4KS5zdGFydHN3aXRoKCc8cmVhZC1vbmx5IGJ1ZmZlciBmb3IgMHgnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIoeCkuc3RhcnRzd2l0aCgnPHJlYWQtb25seSBidWZmZXIgZm9yIDB4JykpCiAKICAgICBkZWYgdGVzdF9jZWxsKHNlbGYpOgogICAgICAgICAjIFhYWCBIbW0/IEhvdyB0byBnZXQgYXQgYSBjZWxsIG9iamVjdD8KQEAgLTE5Miw5ICsxOTIsOSBAQAogICAgICAgICBjbGFzcyBDOgogICAgICAgICAgICAgZGVmIGZvbyhjbHMpOiBwYXNzCiAgICAgICAgIHggPSBzdGF0aWNtZXRob2QoQy5mb28pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXByKHgpLnN0YXJ0c3dpdGgoJzxzdGF0aWNtZXRob2Qgb2JqZWN0IGF0IDB4JykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKHgpLnN0YXJ0c3dpdGgoJzxzdGF0aWNtZXRob2Qgb2JqZWN0IGF0IDB4JykpCiAgICAgICAgIHggPSBjbGFzc21ldGhvZChDLmZvbykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcHIoeCkuc3RhcnRzd2l0aCgnPGNsYXNzbWV0aG9kIG9iamVjdCBhdCAweCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcih4KS5zdGFydHN3aXRoKCc8Y2xhc3NtZXRob2Qgb2JqZWN0IGF0IDB4JykpCiAKICAgICBkZWYgdGVzdF91bnNvcnRhYmxlKHNlbGYpOgogICAgICAgICAjIFJlcHIucmVwcigpIHVzZWQgdG8gY2FsbCBzb3J0ZWQoKSBvbiBzZXRzLCBmcm96ZW5zZXRzIGFuZCBkaWN0cwpAQCAtMjcyLDcgKzI3Miw3IEBACiAnJycpCiAgICAgICAgIGZyb20gYXJlYWxseWxvbmdwYWNrYWdlYW5kbW9kdWxlbmFtZXRvdGVzdHJlcHJ0cnVuY2F0aW9uLmFyZWFsbHlsb25ncGFja2FnZWFuZG1vZHVsZW5hbWV0b3Rlc3RyZXBydHJ1bmNhdGlvbiBpbXBvcnQgYmFyCiAgICAgICAgICMgTW9kdWxlIG5hbWUgbWF5IGJlIHByZWZpeGVkIHdpdGggInRlc3QuIiwgZGVwZW5kaW5nIG9uIGhvdyBydW4uCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXByKGJhci5iYXIpLnN0YXJ0c3dpdGgoCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKGJhci5iYXIpLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAiPGNsYXNzICVzLmJhciBhdCAweCIgJSBiYXIuX19uYW1lX18pKQogCiAgICAgZGVmIHRlc3RfaW5zdGFuY2Uoc2VsZik6CkBAIC0yODIsNyArMjgyLDcgQEAKICcnJykKICAgICAgICAgZnJvbSBhcmVhbGx5bG9uZ3BhY2thZ2VhbmRtb2R1bGVuYW1ldG90ZXN0cmVwcnRydW5jYXRpb24uYXJlYWxseWxvbmdwYWNrYWdlYW5kbW9kdWxlbmFtZXRvdGVzdHJlcHJ0cnVuY2F0aW9uIGltcG9ydCBiYXoKICAgICAgICAgaWJheiA9IGJhei5iYXooKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVwcihpYmF6KS5zdGFydHN3aXRoKAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihpYmF6KS5zdGFydHN3aXRoKAogICAgICAgICAgICAgIjwlcy5iYXogaW5zdGFuY2UgYXQgMHgiICUgYmF6Ll9fbmFtZV9fKSkKIAogICAgIGRlZiB0ZXN0X21ldGhvZChzZWxmKToKQEAgLTI5Nyw3ICsyOTcsNyBAQAogICAgICAgICAnPHVuYm91bmQgbWV0aG9kIGFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhLmFtZXRob2Q+JykKICAgICAgICAgIyBCb3VuZCBtZXRob2QgbmV4dAogICAgICAgICBpcXV4ID0gcXV4LmFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlcHIoaXF1eC5hbWV0aG9kKS5zdGFydHN3aXRoKAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVwcihpcXV4LmFtZXRob2QpLnN0YXJ0c3dpdGgoCiAgICAgICAgICAgICAnPGJvdW5kIG1ldGhvZCBhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYS5hbWV0aG9kIG9mIDwlcy5hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYSBpbnN0YW5jZSBhdCAweCcgXAogICAgICAgICAgICAgJSAocXV4Ll9fbmFtZV9fLCkgKSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yZmM4MjIucHkgYi9MaWIvdGVzdC90ZXN0X3JmYzgyMi5weQppbmRleCBhZmJjOTg0Li44YzJiMmM2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JmYzgyMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JmYzgyMi5weQpAQCAtMTYsMjMgKzE2LDIzIEBACiAgICAgZGVmIHRlc3RfZ2V0KHNlbGYpOgogICAgICAgICBtc2cgPSBzZWxmLmNyZWF0ZV9tZXNzYWdlKAogICAgICAgICAgICAgJ1RvOiAibGFzdCwgZmlyc3QiIDx1c2VyaWRAZm9vLm5ldD5cblxudGVzdFxuJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5nZXQoInRvIikgPT0gJyJsYXN0LCBmaXJzdCIgPHVzZXJpZEBmb28ubmV0PicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuZ2V0KCJUTyIpID09ICcibGFzdCwgZmlyc3QiIDx1c2VyaWRAZm9vLm5ldD4nKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldCgiTm8tU3VjaC1IZWFkZXIiKSBpcyBOb25lKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLmdldCgiTm8tU3VjaC1IZWFkZXIiLCAiTm8tU3VjaC1WYWx1ZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuZ2V0KCJ0byIpID09ICcibGFzdCwgZmlyc3QiIDx1c2VyaWRAZm9vLm5ldD4nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLmdldCgiVE8iKSA9PSAnImxhc3QsIGZpcnN0IiA8dXNlcmlkQGZvby5uZXQ+JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXQoIk5vLVN1Y2gtSGVhZGVyIikgaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5nZXQoIk5vLVN1Y2gtSGVhZGVyIiwgIk5vLVN1Y2gtVmFsdWUiKQogICAgICAgICAgICAgICAgICAgICAgPT0gIk5vLVN1Y2gtVmFsdWUiKQogCiAgICAgZGVmIHRlc3Rfc2V0ZGVmYXVsdChzZWxmKToKICAgICAgICAgbXNnID0gc2VsZi5jcmVhdGVfbWVzc2FnZSgKICAgICAgICAgICAgICdUbzogImxhc3QsIGZpcnN0IiA8dXNlcmlkQGZvby5uZXQ+XG5cbnRlc3RcbicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgbXNnLmhhc19rZXkoIk5ldy1IZWFkZXIiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZy5zZXRkZWZhdWx0KCJOZXctSGVhZGVyIiwgIk5ldy1WYWx1ZSIpID09ICJOZXctVmFsdWUiKQotICAgICAgICBzZWxmLmFzc2VydF8obXNnLnNldGRlZmF1bHQoIk5ldy1IZWFkZXIiLCAiRGlmZmVyZW50LVZhbHVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBtc2cuaGFzX2tleSgiTmV3LUhlYWRlciIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnLnNldGRlZmF1bHQoIk5ldy1IZWFkZXIiLCAiTmV3LVZhbHVlIikgPT0gIk5ldy1WYWx1ZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuc2V0ZGVmYXVsdCgiTmV3LUhlYWRlciIsICJEaWZmZXJlbnQtVmFsdWUiKQogICAgICAgICAgICAgICAgICAgICAgPT0gIk5ldy1WYWx1ZSIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2dbIm5ldy1oZWFkZXIiXSA9PSAiTmV3LVZhbHVlIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZ1sibmV3LWhlYWRlciJdID09ICJOZXctVmFsdWUiKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtc2cuc2V0ZGVmYXVsdCgiQW5vdGhlci1IZWFkZXIiKSA9PSAiIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1zZ1siYW5vdGhlci1oZWFkZXIiXSA9PSAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1zZy5zZXRkZWZhdWx0KCJBbm90aGVyLUhlYWRlciIpID09ICIiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobXNnWyJhbm90aGVyLWhlYWRlciJdID09ICIiKQogCiAgICAgZGVmIGNoZWNrKHNlbGYsIG1zZywgcmVzdWx0cyk6CiAgICAgICAgICIiIkNoZWNrIGFkZHJlc3NlcyBhbmQgdGhlIGRhdGUuIiIiCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3JpY2hjbXAucHkgYi9MaWIvdGVzdC90ZXN0X3JpY2hjbXAucHkKaW5kZXggYWQ2ODM4Ni4uZWQwYjQ5NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yaWNoY21wLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcmljaGNtcC5weQpAQCAtMTA2LDcgKzEwNiw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZWFscmVzKSwgbGVuKGV4cHJlcykpCiAgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UobGVuKHJlYWxyZXMpKToKICAgICAgICAgICAgICAgICAjIHJlc3VsdHMgYXJlIGJvb2wsIHNvIHdlIGNhbiB1c2UgImlzIiBoZXJlCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHJlYWxyZXNbaV0gaXMgZXhwcmVzW2ldKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWFscmVzW2ldIGlzIGV4cHJlc1tpXSkKIAogICAgIGRlZiB0ZXN0X21peGVkKHNlbGYpOgogICAgICAgICAjIGNoZWNrIHRoYXQgY29tcGFyaXNvbnMgaW52b2x2aW5nIFZlY3RvciBvYmplY3RzCkBAIC0xNjMsNyArMTYzLDcgQEAKICAgICAgICAgICAgICAgICBmb3Igb3AgaW4gb3BtYXBbb3BuYW1lXToKICAgICAgICAgICAgICAgICAgICAgcmVhbHJlcyA9IG9wKHRhLCB0YikKICAgICAgICAgICAgICAgICAgICAgcmVhbHJlcyA9IGdldGF0dHIocmVhbHJlcywgIngiLCByZWFscmVzKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8ocmVhbHJlcyBpcyBleHByZXMpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWFscmVzIGlzIGV4cHJlcykKIAogICAgIGRlZiB0ZXN0X3ZhbHVlcyhzZWxmKToKICAgICAgICAgIyBjaGVjayBhbGwgb3BlcmF0b3JzIGFuZCBhbGwgY29tcGFyaXNvbiByZXN1bHRzCkBAIC0yMzksOCArMjM5LDggQEAKICAgICAgICAgYi5hcHBlbmQoMTcpCiAgICAgICAgICMgRXZlbiByZWN1cnNpdmUgbGlzdHMgb2YgZGlmZmVyZW50IGxlbmd0aHMgYXJlIGRpZmZlcmVudCwKICAgICAgICAgIyBidXQgdGhleSBjYW5ub3QgYmUgb3JkZXJlZAotICAgICAgICBzZWxmLmFzc2VydF8obm90IChhID09IGIpKQotICAgICAgICBzZWxmLmFzc2VydF8oYSAhPSBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IChhID09IGIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAhPSBiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG9wZXJhdG9yLmx0LCBhLCBiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG9wZXJhdG9yLmxlLCBhLCBiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhSdW50aW1lRXJyb3IsIG9wZXJhdG9yLmd0LCBhLCBiKQpAQCAtMjUwLDkgKzI1MCw5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvciwgb3BlcmF0b3IubmUsIGEsIGIpCiAgICAgICAgIGEuaW5zZXJ0KDAsIDExKQogICAgICAgICBiLmluc2VydCgwLCAxMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCAoYSA9PSBiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgIT0gYikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgPCBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IChhID09IGIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAhPSBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSA8IGIpCiAKIGNsYXNzIERpY3RUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtMjcxLDEwICsyNzEsMTAgQEAKICAgICAgICAgICAgIGltYWcxYltrXSA9IHYKICAgICAgICAgaW1hZzIgPSBpbWFnMWIuY29weSgpCiAgICAgICAgIGltYWcyW2tdID0gdiArIDEuMAotICAgICAgICBzZWxmLmFzc2VydF8oaW1hZzFhID09IGltYWcxYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGltYWcxYSA9PSBpbWFnMWIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhpbWFnMiA9PSBpbWFnMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGltYWcxYSAhPSBpbWFnMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGltYWcxYSA9PSBpbWFnMWEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbWFnMWEgPT0gaW1hZzFiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW1hZzIgPT0gaW1hZzIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbWFnMWEgIT0gaW1hZzIpCiAgICAgICAgIGZvciBvcG5hbWUgaW4gKCJsdCIsICJsZSIsICJndCIsICJnZSIpOgogICAgICAgICAgICAgZm9yIG9wIGluIG9wbWFwW29wbmFtZV06CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcCwgaW1hZzFhLCBpbWFnMikKQEAgLTI4Miw3ICsyODIsNyBAQAogY2xhc3MgTGlzdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIGFzc2VydElzKHNlbGYsIGEsIGIpOgotICAgICAgICBzZWxmLmFzc2VydF8oYSBpcyBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpcyBiKQogCiAgICAgZGVmIHRlc3RfY292ZXJhZ2Uoc2VsZik6CiAgICAgICAgICMgZXhlcmNpc2UgYWxsIGNvbXBhcmlzb25zIGZvciBsaXN0cwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weSBiL0xpYi90ZXN0L3Rlc3Rfcm9ib3RwYXJzZXIucHkKaW5kZXggNDMxYjhmZi4uMjZmYjI5MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9yb2JvdHBhcnNlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JvYm90cGFyc2VyLnB5CkBAIC0yMCw5ICsyMCw5IEBACiAgICAgICAgICAgICB1cmwgPSBzZWxmLnVybAogICAgICAgICAgICAgYWdlbnQgPSBzZWxmLmFnZW50CiAgICAgICAgIGlmIHNlbGYuZ29vZDoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLnBhcnNlci5jYW5fZmV0Y2goYWdlbnQsIHVybCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5wYXJzZXIuY2FuX2ZldGNoKGFnZW50LCB1cmwpKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5mYWlsSWYoc2VsZi5wYXJzZXIuY2FuX2ZldGNoKGFnZW50LCB1cmwpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZWxmLnBhcnNlci5jYW5fZmV0Y2goYWdlbnQsIHVybCkpCiAKICAgICBkZWYgX19zdHJfXyhzZWxmKToKICAgICAgICAgcmV0dXJuIHNlbGYuc3RyCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3J1bnB5LnB5IGIvTGliL3Rlc3QvdGVzdF9ydW5weS5weQppbmRleCAxNjVjYjYzLi5mYTVkOWI3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3J1bnB5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcnVucHkucHkKQEAgLTM3LDE0ICszNywxNCBAQAogICAgIGRlZiB0ZXN0X3J1bl9jb2RlKHNlbGYpOgogICAgICAgICBzYXZlZF9hcmd2MCA9IHN5cy5hcmd2WzBdCiAgICAgICAgIGQgPSBfcnVuX2NvZGUoc2VsZi50ZXN0X3NvdXJjZSwge30pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkWyJyZXN1bHQiXSA9PSBzZWxmLmV4cGVjdGVkX3Jlc3VsdCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRbIl9fbmFtZV9fIl0gaXMgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRbIl9fZmlsZV9fIl0gaXMgTm9uZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGRbIl9fbG9hZGVyX18iXSBpcyBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZFsiX19wYWNrYWdlX18iXSBpcyBOb25lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZFsicnVuX2FyZ3YwIl0gaXMgc2F2ZWRfYXJndjApCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcygicnVuX25hbWUiIG5vdCBpbiBkKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3lzLmFyZ3ZbMF0gaXMgc2F2ZWRfYXJndjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkWyJyZXN1bHQiXSA9PSBzZWxmLmV4cGVjdGVkX3Jlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRbIl9fbmFtZV9fIl0gaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRbIl9fZmlsZV9fIl0gaXMgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRbIl9fbG9hZGVyX18iXSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZFsiX19wYWNrYWdlX18iXSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZFsicnVuX2FyZ3YwIl0gaXMgc2F2ZWRfYXJndjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgicnVuX25hbWUiIG5vdCBpbiBkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3lzLmFyZ3ZbMF0gaXMgc2F2ZWRfYXJndjApCiAKICAgICBkZWYgdGVzdF9ydW5fbW9kdWxlX2NvZGUoc2VsZik6CiAgICAgICAgIGluaXRpYWwgPSBvYmplY3QoKQpAQCAtNjAsMTkgKzYwLDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCJyZXN1bHQiIG5vdCBpbiBkMSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQyWyJpbml0aWFsIl0gaXMgaW5pdGlhbCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQyWyJyZXN1bHQiXSA9PSBzZWxmLmV4cGVjdGVkX3Jlc3VsdCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQyWyJuZXN0ZWQiXVsieCJdID09IDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkMlsiX19uYW1lX18iXSBpcyBuYW1lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZDJbInJ1bl9uYW1lX2luX3N5c19tb2R1bGVzIl0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkMlsibW9kdWxlX2luX3N5c19tb2R1bGVzIl0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkMlsiX19maWxlX18iXSBpcyBmaWxlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZDJbInJ1bl9hcmd2MCJdIGlzIGZpbGUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhkMlsiX19sb2FkZXJfXyJdIGlzIGxvYWRlcikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQyWyJfX3BhY2thZ2VfXyJdIGlzIHBhY2thZ2UpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzeXMuYXJndlswXSBpcyBzYXZlZF9hcmd2MCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5hbWUgbm90IGluIHN5cy5tb2R1bGVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInJlc3VsdCIgbm90IGluIGQxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZDJbImluaXRpYWwiXSBpcyBpbml0aWFsKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZDJbInJlc3VsdCJdID09IHNlbGYuZXhwZWN0ZWRfcmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZDJbIm5lc3RlZCJdWyJ4Il0gPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQyWyJfX25hbWVfXyJdIGlzIG5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMlsicnVuX25hbWVfaW5fc3lzX21vZHVsZXMiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQyWyJtb2R1bGVfaW5fc3lzX21vZHVsZXMiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQyWyJfX2ZpbGVfXyJdIGlzIGZpbGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMlsicnVuX2FyZ3YwIl0gaXMgZmlsZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGQyWyJfX2xvYWRlcl9fIl0gaXMgbG9hZGVyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZDJbIl9fcGFja2FnZV9fIl0gaXMgcGFja2FnZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN5cy5hcmd2WzBdIGlzIHNhdmVkX2FyZ3YwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobmFtZSBub3QgaW4gc3lzLm1vZHVsZXMpCiAKIAogY2xhc3MgUnVuTW9kdWxlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0xNTksMTUgKzE1OSwxNSBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiUnVubmluZyBmcm9tIHNvdXJjZToiLCBtb2RfbmFtZQogICAgICAgICAgICAgZDEgPSBydW5fbW9kdWxlKG1vZF9uYW1lKSAjIFJlYWQgZnJvbSBzb3VyY2UKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcygieCIgaW4gZDEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZDFbIngiXSA9PSAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJ4IiBpbiBkMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMVsieCJdID09IDEpCiAgICAgICAgICAgICBkZWwgZDEgIyBFbnN1cmUgX19sb2FkZXJfXyBlbnRyeSBkb2Vzbid0IGtlZXAgZmlsZSBvcGVuCiAgICAgICAgICAgICBfX2ltcG9ydF9fKG1vZF9uYW1lKQogICAgICAgICAgICAgb3MucmVtb3ZlKG1vZF9mbmFtZSkKICAgICAgICAgICAgIGlmIHZlcmJvc2U6IHByaW50ICJSdW5uaW5nIGZyb20gY29tcGlsZWQ6IiwgbW9kX25hbWUKICAgICAgICAgICAgIGQyID0gcnVuX21vZHVsZShtb2RfbmFtZSkgIyBSZWFkIGZyb20gYnl0ZWNvZGUKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcygieCIgaW4gZDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZDJbIngiXSA9PSAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJ4IiBpbiBkMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkMlsieCJdID09IDEpCiAgICAgICAgICAgICBkZWwgZDIgIyBFbnN1cmUgX19sb2FkZXJfXyBlbnRyeSBkb2Vzbid0IGtlZXAgZmlsZSBvcGVuCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBzZWxmLl9kZWxfcGtnKHBrZ19kaXIsIGRlcHRoLCBtb2RfbmFtZSkKQEAgLTIxMSwxOSArMjExLDE5IEBACiAgICAgICAgICAgICBwa2dfbmFtZSA9IG1vZF9uYW1lLnJwYXJ0aXRpb24oJy4nKVswXQogICAgICAgICAgICAgaWYgdmVyYm9zZTogcHJpbnQgIlJ1bm5pbmcgZnJvbSBzb3VyY2U6IiwgbW9kX25hbWUKICAgICAgICAgICAgIGQxID0gcnVuX21vZHVsZShtb2RfbmFtZSwgcnVuX25hbWU9cnVuX25hbWUpICMgUmVhZCBmcm9tIHNvdXJjZQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCJfX3BhY2thZ2VfXyIgaW4gZDEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZDFbIl9fcGFja2FnZV9fIl0gPT0gcGtnX25hbWUpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoInNpYmxpbmciIGluIGQxKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCJuZXBoZXciIGluIGQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJfX3BhY2thZ2VfXyIgaW4gZDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZDFbIl9fcGFja2FnZV9fIl0gPT0gcGtnX25hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoInNpYmxpbmciIGluIGQxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJuZXBoZXciIGluIGQxKQogICAgICAgICAgICAgZGVsIGQxICMgRW5zdXJlIF9fbG9hZGVyX18gZW50cnkgZG9lc24ndCBrZWVwIGZpbGUgb3BlbgogICAgICAgICAgICAgX19pbXBvcnRfXyhtb2RfbmFtZSkKICAgICAgICAgICAgIG9zLnJlbW92ZShtb2RfZm5hbWUpCiAgICAgICAgICAgICBpZiB2ZXJib3NlOiBwcmludCAiUnVubmluZyBmcm9tIGNvbXBpbGVkOiIsIG1vZF9uYW1lCiAgICAgICAgICAgICBkMiA9IHJ1bl9tb2R1bGUobW9kX25hbWUsIHJ1bl9uYW1lPXJ1bl9uYW1lKSAjIFJlYWQgZnJvbSBieXRlY29kZQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCJfX3BhY2thZ2VfXyIgaW4gZDIpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZDJbIl9fcGFja2FnZV9fIl0gPT0gcGtnX25hbWUpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoInNpYmxpbmciIGluIGQyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCJuZXBoZXciIGluIGQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJfX3BhY2thZ2VfXyIgaW4gZDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZDJbIl9fcGFja2FnZV9fIl0gPT0gcGtnX25hbWUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoInNpYmxpbmciIGluIGQyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJuZXBoZXciIGluIGQyKQogICAgICAgICAgICAgZGVsIGQyICMgRW5zdXJlIF9fbG9hZGVyX18gZW50cnkgZG9lc24ndCBrZWVwIGZpbGUgb3BlbgogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc2VsZi5fZGVsX3BrZyhwa2dfZGlyLCBkZXB0aCwgbW9kX25hbWUpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Njb3BlLnB5IGIvTGliL3Rlc3QvdGVzdF9zY29wZS5weQppbmRleCAzNjE3N2VhLi5iNjhlOGY1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Njb3BlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2NvcGUucHkKQEAgLTQ2Nyw3ICs0NjcsNyBAQAogICAgIGxvY2FscygpWydsb29rZWRfdXBfYnlfbG9hZF9uYW1lJ10gPSBUcnVlCiAgICAgcGFzc2VkID0gbG9va2VkX3VwX2J5X2xvYWRfbmFtZQogCi1zZWxmLmFzc2VydF8oWC5wYXNzZWQpCitzZWxmLmFzc2VydFRydWUoWC5wYXNzZWQpCiAiIiIKIAogICAgIGRlZiB0ZXN0TG9jYWxzRnVuY3Rpb24oc2VsZik6CkBAIC00ODIsNyArNDgyLDcgQEAKICAgICAgICAgICAgIHJldHVybiBnCiAKICAgICAgICAgZCA9IGYoMikoNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGQuaGFzX2tleSgnaCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZC5oYXNfa2V5KCdoJykpCiAgICAgICAgIGRlbCBkWydoJ10KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLCB7J3gnOiAyLCAneSc6IDcsICd3JzogNn0pCiAKQEAgLTUxNiw4ICs1MTYsOCBAQAogICAgICAgICAgICAgcmV0dXJuIEMKIAogICAgICAgICB2YXJuYW1lcyA9IGYoMSkuegotICAgICAgICBzZWxmLmFzc2VydF8oIngiIG5vdCBpbiB2YXJuYW1lcykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJ5IiBpbiB2YXJuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJ4IiBub3QgaW4gdmFybmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgieSIgaW4gdmFybmFtZXMpCiAKICAgICBkZWYgdGVzdExvY2Fsc0NsYXNzX1dpdGhUcmFjZShzZWxmKToKICAgICAgICAgIyBJc3N1ZTIzNzI4OiBhZnRlciB0aGUgdHJhY2UgZnVuY3Rpb24gcmV0dXJucywgdGhlIGxvY2FscygpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CmluZGV4IDg4NmM0YjguLjg3MmU5ZWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CkBAIC02NCw3ICs2NCw3IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGMgaW4gc2VsZi5zLCBjIGluIHNlbGYuZCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuX19jb250YWluc19fLCBbW11dKQogICAgICAgICBzID0gc2VsZi50aGV0eXBlKFtmcm96ZW5zZXQoc2VsZi5sZXR0ZXJzKV0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLnRoZXR5cGUoc2VsZi5sZXR0ZXJzKSBpbiBzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50aGV0eXBlKHNlbGYubGV0dGVycykgaW4gcykKIAogICAgIGRlZiB0ZXN0X3VuaW9uKHNlbGYpOgogICAgICAgICB1ID0gc2VsZi5zLnVuaW9uKHNlbGYub3RoZXJ3b3JkKQpAQCAtMTI0LDcgKzEyNCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGFjdHVhbCA9IHMxLmlzZGlzam9pbnQoczIpCiAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkID0gZihzMSwgczIpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGFjdHVhbCBpcyBUcnVlIG9yIGFjdHVhbCBpcyBGYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFjdHVhbCBpcyBUcnVlIG9yIGFjdHVhbCBpcyBGYWxzZSkKIAogICAgIGRlZiB0ZXN0X2FuZChzZWxmKToKICAgICAgICAgaSA9IHNlbGYucy5pbnRlcnNlY3Rpb24oc2VsZi5vdGhlcndvcmQpCkBAIC0yMDcsMTkgKzIwNywxOSBAQAogCiAgICAgZGVmIHRlc3Rfc3ViX2FuZF9zdXBlcihzZWxmKToKICAgICAgICAgcCwgcSwgciA9IG1hcChzZWxmLnRoZXR5cGUsIFsnYWInLCAnYWJjZGUnLCAnZGVmJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhwIDwgcSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHAgPD0gcSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHEgPD0gcSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHEgPiBwKQotICAgICAgICBzZWxmLmFzc2VydF8ocSA+PSBwKQotICAgICAgICBzZWxmLmZhaWxJZihxIDwgcikKLSAgICAgICAgc2VsZi5mYWlsSWYocSA8PSByKQotICAgICAgICBzZWxmLmZhaWxJZihxID4gcikKLSAgICAgICAgc2VsZi5mYWlsSWYocSA+PSByKQotICAgICAgICBzZWxmLmFzc2VydF8oc2V0KCdhJykuaXNzdWJzZXQoJ2FiYycpKQotICAgICAgICBzZWxmLmFzc2VydF8oc2V0KCdhYmMnKS5pc3N1cGVyc2V0KCdhJykpCi0gICAgICAgIHNlbGYuZmFpbElmKHNldCgnYScpLmlzc3Vic2V0KCdjYnMnKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoc2V0KCdjYnMnKS5pc3N1cGVyc2V0KCdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwIDwgcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAgPD0gcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEgPD0gcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHEgPiBwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocSA+PSBwKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHEgPCByKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHEgPD0gcikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxID4gcikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShxID49IHIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoJ2EnKS5pc3N1YnNldCgnYWJjJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoJ2FiYycpLmlzc3VwZXJzZXQoJ2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzZXQoJ2EnKS5pc3N1YnNldCgnY2JzJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2V0KCdjYnMnKS5pc3N1cGVyc2V0KCdhJykpCiAKICAgICBkZWYgdGVzdF9waWNrbGluZyhzZWxmKToKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UocGlja2xlLkhJR0hFU1RfUFJPVE9DT0wgKyAxKToKQEAgLTI2Nyw3ICsyNjcsNyBAQAogICAgICAgICBzPUgoKQogICAgICAgICBmPXNldCgpCiAgICAgICAgIGYuYWRkKHMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzIGluIGYpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzIGluIGYpCiAgICAgICAgIGYucmVtb3ZlKHMpCiAgICAgICAgIGYuYWRkKHMpCiAgICAgICAgIGYuZGlzY2FyZChzKQpAQCAtMzMzLDcgKzMzMyw3IEBACiAgICAgICAgIG9iai54ID0gaXRlcihjb250YWluZXIpCiAgICAgICAgIGRlbCBvYmosIGNvbnRhaW5lcgogICAgICAgICBnYy5jb2xsZWN0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlZigpIGlzIE5vbmUsICJDeWNsZSB3YXMgbm90IGNvbGxlY3RlZCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYoKSBpcyBOb25lLCAiQ3ljbGUgd2FzIG5vdCBjb2xsZWN0ZWQiKQogCiBjbGFzcyBUZXN0U2V0KFRlc3RKb2ludE9wcyk6CiAgICAgdGhldHlwZSA9IHNldApAQCAtMzY3LDcgKzM2Nyw3IEBACiAKICAgICBkZWYgdGVzdF9hZGQoc2VsZik6CiAgICAgICAgIHNlbGYucy5hZGQoJ1EnKQotICAgICAgICBzZWxmLmFzc2VydF8oJ1EnIGluIHNlbGYucykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdRJyBpbiBzZWxmLnMpCiAgICAgICAgIGR1cCA9IHNlbGYucy5jb3B5KCkKICAgICAgICAgc2VsZi5zLmFkZCgnUScpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5zLCBkdXApCkBAIC0zNzUsMTMgKzM3NSwxMyBAQAogCiAgICAgZGVmIHRlc3RfcmVtb3ZlKHNlbGYpOgogICAgICAgICBzZWxmLnMucmVtb3ZlKCdhJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBub3QgaW4gc2VsZi5zKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIG5vdCBpbiBzZWxmLnMpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBzZWxmLnMucmVtb3ZlLCAnUScpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5zLnJlbW92ZSwgW10pCiAgICAgICAgIHMgPSBzZWxmLnRoZXR5cGUoW2Zyb3plbnNldChzZWxmLndvcmQpXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYudGhldHlwZShzZWxmLndvcmQpIGluIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSBpbiBzKQogICAgICAgICBzLnJlbW92ZShzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYudGhldHlwZShzZWxmLndvcmQpIG5vdCBpbiBzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50aGV0eXBlKHNlbGYud29yZCkgbm90IGluIHMpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBzZWxmLnMucmVtb3ZlLCBzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSkKIAogICAgIGRlZiB0ZXN0X3JlbW92ZV9rZXllcnJvcl91bnBhY2tpbmcoc2VsZik6CkBAIC00MDAsNyArNDAwLDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc2VsZi5zLnJlbW92ZShrZXkpCiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvciBhcyBlOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGUuYXJnc1swXSBpcyBrZXksCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZS5hcmdzWzBdIGlzIGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAiS2V5RXJyb3Igc2hvdWxkIGJlIHswfSwgbm90IHsxfSIuZm9ybWF0KGtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuYXJnc1swXSkpCiAgICAgICAgIGVsc2U6CkBAIC00MDgsMjYgKzQwOCwyNiBAQAogCiAgICAgZGVmIHRlc3RfZGlzY2FyZChzZWxmKToKICAgICAgICAgc2VsZi5zLmRpc2NhcmQoJ2EnKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2EnIG5vdCBpbiBzZWxmLnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYScgbm90IGluIHNlbGYucykKICAgICAgICAgc2VsZi5zLmRpc2NhcmQoJ1EnKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5kaXNjYXJkLCBbXSkKICAgICAgICAgcyA9IHNlbGYudGhldHlwZShbZnJvemVuc2V0KHNlbGYud29yZCldKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi50aGV0eXBlKHNlbGYud29yZCkgaW4gcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudGhldHlwZShzZWxmLndvcmQpIGluIHMpCiAgICAgICAgIHMuZGlzY2FyZChzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYudGhldHlwZShzZWxmLndvcmQpIG5vdCBpbiBzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50aGV0eXBlKHNlbGYud29yZCkgbm90IGluIHMpCiAgICAgICAgIHMuZGlzY2FyZChzZWxmLnRoZXR5cGUoc2VsZi53b3JkKSkKIAogICAgIGRlZiB0ZXN0X3BvcChzZWxmKToKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbihzZWxmLnMpKToKICAgICAgICAgICAgIGVsZW0gPSBzZWxmLnMucG9wKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhlbGVtIG5vdCBpbiBzZWxmLnMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZWxlbSBub3QgaW4gc2VsZi5zKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgc2VsZi5zLnBvcCkKIAogICAgIGRlZiB0ZXN0X3VwZGF0ZShzZWxmKToKICAgICAgICAgcmV0dmFsID0gc2VsZi5zLnVwZGF0ZShzZWxmLm90aGVyd29yZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXR2YWwsIE5vbmUpCiAgICAgICAgIGZvciBjIGluIChzZWxmLndvcmQgKyBzZWxmLm90aGVyd29yZCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oYyBpbiBzZWxmLnMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYyBpbiBzZWxmLnMpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFBhc3NUaHJ1LCBzZWxmLnMudXBkYXRlLCBjaGVja19wYXNzX3RocnUoKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMudXBkYXRlLCBbW11dKQogICAgICAgICBmb3IgcCwgcSBpbiAoKCdjZGMnLCAnYWJjZCcpLCAoJ2VmZ2ZlJywgJ2FiY2VmZycpLCAoJ2NjYicsICdhYmMnKSwgKCdlZicsICdhYmNlZicpKToKQEAgLTQ0NSwxNiArNDQ1LDE2IEBACiAgICAgZGVmIHRlc3RfaW9yKHNlbGYpOgogICAgICAgICBzZWxmLnMgfD0gc2V0KHNlbGYub3RoZXJ3b3JkKQogICAgICAgICBmb3IgYyBpbiAoc2VsZi53b3JkICsgc2VsZi5vdGhlcndvcmQpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGMgaW4gc2VsZi5zKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMgaW4gc2VsZi5zKQogCiAgICAgZGVmIHRlc3RfaW50ZXJzZWN0aW9uX3VwZGF0ZShzZWxmKToKICAgICAgICAgcmV0dmFsID0gc2VsZi5zLmludGVyc2VjdGlvbl91cGRhdGUoc2VsZi5vdGhlcndvcmQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0dmFsLCBOb25lKQogICAgICAgICBmb3IgYyBpbiAoc2VsZi53b3JkICsgc2VsZi5vdGhlcndvcmQpOgogICAgICAgICAgICAgaWYgYyBpbiBzZWxmLm90aGVyd29yZCBhbmQgYyBpbiBzZWxmLndvcmQ6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGMgaW4gc2VsZi5zKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjIGluIHNlbGYucykKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGMgbm90IGluIHNlbGYucykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoYyBub3QgaW4gc2VsZi5zKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhQYXNzVGhydSwgc2VsZi5zLmludGVyc2VjdGlvbl91cGRhdGUsIGNoZWNrX3Bhc3NfdGhydSgpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5pbnRlcnNlY3Rpb25fdXBkYXRlLCBbW11dKQogICAgICAgICBmb3IgcCwgcSBpbiAoKCdjZGMnLCAnYycpLCAoJ2VmZ2ZlJywgJycpLCAoJ2NjYicsICdiYycpLCAoJ2VmJywgJycpKToKQEAgLTQ3MiwxOCArNDcyLDE4IEBACiAgICAgICAgIHNlbGYucyAmPSBzZXQoc2VsZi5vdGhlcndvcmQpCiAgICAgICAgIGZvciBjIGluIChzZWxmLndvcmQgKyBzZWxmLm90aGVyd29yZCk6CiAgICAgICAgICAgICBpZiBjIGluIHNlbGYub3RoZXJ3b3JkIGFuZCBjIGluIHNlbGYud29yZDoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYyBpbiBzZWxmLnMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMgaW4gc2VsZi5zKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYyBub3QgaW4gc2VsZi5zKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjIG5vdCBpbiBzZWxmLnMpCiAKICAgICBkZWYgdGVzdF9kaWZmZXJlbmNlX3VwZGF0ZShzZWxmKToKICAgICAgICAgcmV0dmFsID0gc2VsZi5zLmRpZmZlcmVuY2VfdXBkYXRlKHNlbGYub3RoZXJ3b3JkKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJldHZhbCwgTm9uZSkKICAgICAgICAgZm9yIGMgaW4gKHNlbGYud29yZCArIHNlbGYub3RoZXJ3b3JkKToKICAgICAgICAgICAgIGlmIGMgaW4gc2VsZi53b3JkIGFuZCBjIG5vdCBpbiBzZWxmLm90aGVyd29yZDoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYyBpbiBzZWxmLnMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMgaW4gc2VsZi5zKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYyBub3QgaW4gc2VsZi5zKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjIG5vdCBpbiBzZWxmLnMpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFBhc3NUaHJ1LCBzZWxmLnMuZGlmZmVyZW5jZV91cGRhdGUsIGNoZWNrX3Bhc3NfdGhydSgpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYucy5kaWZmZXJlbmNlX3VwZGF0ZSwgW1tdXSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlLCBbW11dKQpAQCAtNTA5LDE4ICs1MDksMTggQEAKICAgICAgICAgc2VsZi5zIC09IHNldChzZWxmLm90aGVyd29yZCkKICAgICAgICAgZm9yIGMgaW4gKHNlbGYud29yZCArIHNlbGYub3RoZXJ3b3JkKToKICAgICAgICAgICAgIGlmIGMgaW4gc2VsZi53b3JkIGFuZCBjIG5vdCBpbiBzZWxmLm90aGVyd29yZDoKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYyBpbiBzZWxmLnMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMgaW4gc2VsZi5zKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYyBub3QgaW4gc2VsZi5zKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjIG5vdCBpbiBzZWxmLnMpCiAKICAgICBkZWYgdGVzdF9zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoc2VsZik6CiAgICAgICAgIHJldHZhbCA9IHNlbGYucy5zeW1tZXRyaWNfZGlmZmVyZW5jZV91cGRhdGUoc2VsZi5vdGhlcndvcmQpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmV0dmFsLCBOb25lKQogICAgICAgICBmb3IgYyBpbiAoc2VsZi53b3JkICsgc2VsZi5vdGhlcndvcmQpOgogICAgICAgICAgICAgaWYgKGMgaW4gc2VsZi53b3JkKSBeIChjIGluIHNlbGYub3RoZXJ3b3JkKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYyBpbiBzZWxmLnMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMgaW4gc2VsZi5zKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYyBub3QgaW4gc2VsZi5zKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjIG5vdCBpbiBzZWxmLnMpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFBhc3NUaHJ1LCBzZWxmLnMuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlLCBjaGVja19wYXNzX3RocnUoKSkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZWxmLnMuc3ltbWV0cmljX2RpZmZlcmVuY2VfdXBkYXRlLCBbW11dKQogICAgICAgICBmb3IgcCwgcSBpbiAoKCdjZGMnLCAnYWJkJyksICgnZWZnZmUnLCAnYWJjZWZnJyksICgnY2NiJywgJ2EnKSwgKCdlZicsICdhYmNlZicpKToKQEAgLTUzMyw5ICs1MzMsOSBAQAogICAgICAgICBzZWxmLnMgXj0gc2V0KHNlbGYub3RoZXJ3b3JkKQogICAgICAgICBmb3IgYyBpbiAoc2VsZi53b3JkICsgc2VsZi5vdGhlcndvcmQpOgogICAgICAgICAgICAgaWYgKGMgaW4gc2VsZi53b3JkKSBeIChjIGluIHNlbGYub3RoZXJ3b3JkKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYyBpbiBzZWxmLnMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGMgaW4gc2VsZi5zKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYyBub3QgaW4gc2VsZi5zKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjIG5vdCBpbiBzZWxmLnMpCiAKICAgICBkZWYgdGVzdF9pbnBsYWNlX29uX3NlbGYoc2VsZik6CiAgICAgICAgIHQgPSBzZWxmLnMuY29weSgpCkBAIC03NjMsNyArNzYzLDcgQEAKIAogICAgIGRlZiB0ZXN0X2l0ZXJhdGlvbihzZWxmKToKICAgICAgICAgZm9yIHYgaW4gc2VsZi5zZXQ6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8odiBpbiBzZWxmLnZhbHVlcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGluIHNlbGYudmFsdWVzKQogICAgICAgICBzZXRpdGVyID0gaXRlcihzZWxmLnNldCkKICAgICAgICAgIyBub3RlOiBfX2xlbmd0aF9oaW50X18gaXMgYW4gaW50ZXJuYWwgdW5kb2N1bWVudGVkIEFQSSwKICAgICAgICAgIyBkb24ndCByZWx5IG9uIGl0IGluIHlvdXIgb3duIHByb2dyYW1zCkBAIC03OTgsMTAgKzc5OCwxMCBAQAogICAgICAgICBzZWxmLnJlcHIgICA9ICJzZXQoWzNdKSIKIAogICAgIGRlZiB0ZXN0X2luKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoMyBpbiBzZWxmLnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDMgaW4gc2VsZi5zZXQpCiAKICAgICBkZWYgdGVzdF9ub3RfaW4oc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcygyIG5vdCBpbiBzZWxmLnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIgbm90IGluIHNlbGYuc2V0KQogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTgxNSwxMCArODE1LDEwIEBACiAgICAgICAgIHNlbGYucmVwciAgID0gInNldChbKDAsICd6ZXJvJyldKSIKIAogICAgIGRlZiB0ZXN0X2luKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoKDAsICJ6ZXJvIikgaW4gc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoMCwgInplcm8iKSBpbiBzZWxmLnNldCkKIAogICAgIGRlZiB0ZXN0X25vdF9pbihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKDkgbm90IGluIHNlbGYuc2V0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoOSBub3QgaW4gc2VsZi5zZXQpCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMTExMCw3ICsxMTEwLDcgQEAKICAgICAgICAgICAgIHBvcHBlZFtzZWxmLnNldC5wb3AoKV0gPSBOb25lCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBvcHBlZCksIGxlbihzZWxmLnZhbHVlcykpCiAgICAgICAgIGZvciB2IGluIHNlbGYudmFsdWVzOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHYgaW4gcG9wcGVkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgaW4gcG9wcGVkKQogCiAgICAgZGVmIHRlc3RfdXBkYXRlX2VtcHR5X3R1cGxlKHNlbGYpOgogICAgICAgICBzZWxmLnNldC51cGRhdGUoKCkpCkBAIC0xMzc5LDcgKzEzNzksNyBAQAogICAgICAgICBzZXRfbGlzdCA9IGxpc3Qoc2VsZi5zZXQpOyBzZXRfbGlzdC5zb3J0KCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZHVwX2xpc3QpLCBsZW4oc2V0X2xpc3QpKQogICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oZHVwX2xpc3QpKToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhkdXBfbGlzdFtpXSBpcyBzZXRfbGlzdFtpXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkdXBfbGlzdFtpXSBpcyBzZXRfbGlzdFtpXSkKIAogICAgIGRlZiB0ZXN0X2RlZXBfY29weShzZWxmKToKICAgICAgICAgZHVwID0gY29weS5kZWVwY29weShzZWxmLnNldCkKQEAgLTE0MjksMTMgKzE0MjksMTMgQEAKIAogICAgIGRlZiB0ZXN0X2Jpbm9wc1ZzU3Vic2V0cyhzZWxmKToKICAgICAgICAgYSwgYiA9IHNlbGYuYSwgc2VsZi5iCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIC0gYiA8IGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhiIC0gYSA8IGIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhICYgYiA8IGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhICYgYiA8IGIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIHwgYiA+IGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIHwgYiA+IGIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIF4gYiA8IGEgfCBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAtIGIgPCBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYiAtIGEgPCBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAmIGIgPCBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAmIGIgPCBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSB8IGIgPiBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSB8IGIgPiBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBeIGIgPCBhIHwgYikKIAogICAgIGRlZiB0ZXN0X2NvbW11dGF0aXZpdHkoc2VsZik6CiAgICAgICAgIGEsIGIgPSBzZWxmLmEsIHNlbGYuYgpAQCAtMTY4NCw3ICsxNjg0LDcgQEAKICAgICAgICAgICAgIGVkZ2UgPSB2ZXJ0ZXggICAgICAgICAgICAgICAgICAgICAgICMgQ3Vib2N0YWhlZHJvbiB2ZXJ0aWNlcyBhcmUgZWRnZXMgaW4gQ3ViZQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZWRnZSksIDIpICAgICAgIyBUd28gY3ViZSB2ZXJ0aWNlcyBkZWZpbmUgYW4gZWRnZQogICAgICAgICAgICAgZm9yIGN1YmV2ZXJ0IGluIGVkZ2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGN1YmV2ZXJ0IGluIGcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGN1YmV2ZXJ0IGluIGcpCiAKIAogIz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZXRzLnB5IGIvTGliL3Rlc3QvdGVzdF9zZXRzLnB5CmluZGV4IGVmYTM4OGYuLjljNTk4MzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2V0cy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NldHMucHkKQEAgLTc2LDcgKzc2LDcgQEAKIAogICAgIGRlZiB0ZXN0X2l0ZXJhdGlvbihzZWxmKToKICAgICAgICAgZm9yIHYgaW4gc2VsZi5zZXQ6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8odiBpbiBzZWxmLnZhbHVlcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGluIHNlbGYudmFsdWVzKQogCiAgICAgZGVmIHRlc3RfcGlja2xpbmcoc2VsZik6CiAgICAgICAgIHAgPSBwaWNrbGUuZHVtcHMoc2VsZi5zZXQpCkBAIC0xMDcsMTAgKzEwNywxMCBAQAogICAgICAgICBzZWxmLnJlcHIgICA9ICJTZXQoWzNdKSIKIAogICAgIGRlZiB0ZXN0X2luKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoMyBpbiBzZWxmLnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDMgaW4gc2VsZi5zZXQpCiAKICAgICBkZWYgdGVzdF9ub3RfaW4oc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcygyIG5vdCBpbiBzZWxmLnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIgbm90IGluIHNlbGYuc2V0KQogCiAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTEyNCwxMCArMTI0LDEwIEBACiAgICAgICAgIHNlbGYucmVwciAgID0gIlNldChbKDAsICd6ZXJvJyldKSIKIAogICAgIGRlZiB0ZXN0X2luKHNlbGYpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoKDAsICJ6ZXJvIikgaW4gc2VsZi5zZXQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoMCwgInplcm8iKSBpbiBzZWxmLnNldCkKIAogICAgIGRlZiB0ZXN0X25vdF9pbihzZWxmKToKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKDkgbm90IGluIHNlbGYuc2V0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoOSBub3QgaW4gc2VsZi5zZXQpCiAKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNDA2LDcgKzQwNiw3IEBACiAgICAgICAgICAgICBwb3BwZWRbc2VsZi5zZXQucG9wKCldID0gTm9uZQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwb3BwZWQpLCBsZW4oc2VsZi52YWx1ZXMpKQogICAgICAgICBmb3IgdiBpbiBzZWxmLnZhbHVlczoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh2IGluIHBvcHBlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGluIHBvcHBlZCkKIAogICAgIGRlZiB0ZXN0X3VwZGF0ZV9lbXB0eV90dXBsZShzZWxmKToKICAgICAgICAgc2VsZi5zZXQudW5pb25fdXBkYXRlKCgpKQpAQCAtNjgzLDcgKzY4Myw3IEBACiAgICAgICAgIHNldF9saXN0ID0gbGlzdChzZWxmLnNldCk7IHNldF9saXN0LnNvcnQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihkdXBfbGlzdCksIGxlbihzZXRfbGlzdCkpCiAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihkdXBfbGlzdCkpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGR1cF9saXN0W2ldIGlzIHNldF9saXN0W2ldKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGR1cF9saXN0W2ldIGlzIHNldF9saXN0W2ldKQogCiAgICAgZGVmIHRlc3RfZGVlcF9jb3B5KHNlbGYpOgogICAgICAgICBkdXAgPSBjb3B5LmRlZXBjb3B5KHNlbGYuc2V0KQpAQCAtNzMzLDEzICs3MzMsMTMgQEAKIAogICAgIGRlZiB0ZXN0X2Jpbm9wc1ZzU3Vic2V0cyhzZWxmKToKICAgICAgICAgYSwgYiA9IHNlbGYuYSwgc2VsZi5iCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIC0gYiA8PSBhKQotICAgICAgICBzZWxmLmFzc2VydF8oYiAtIGEgPD0gYikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgJiBiIDw9IGEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhICYgYiA8PSBiKQotICAgICAgICBzZWxmLmFzc2VydF8oYSB8IGIgPj0gYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgfCBiID49IGIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhIF4gYiA8PSBhIHwgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgLSBiIDw9IGEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShiIC0gYSA8PSBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSAmIGIgPD0gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgJiBiIDw9IGIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIHwgYiA+PSBhKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSB8IGIgPj0gYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgXiBiIDw9IGEgfCBiKQogCiAgICAgZGVmIHRlc3RfY29tbXV0YXRpdml0eShzZWxmKToKICAgICAgICAgYSwgYiA9IHNlbGYuYSwgc2VsZi5iCkBAIC03NTUsOSArNzU1LDkgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIC0gYSwgemVybykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhIHwgYSwgYSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhICYgYSwgYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgPD0gYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgPj0gYSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgPT0gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPD0gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPj0gYSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgPT0gYSkKIAogICAgIGRlZiB0ZXN0X3N1bW1hdGlvbnMoc2VsZik6CiAgICAgICAgICMgY2hlY2sgdGhhdCBzdW1zIG9mIHBhcnRzIGVxdWFsIHRoZSB3aG9sZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zaGEucHkgYi9MaWIvdGVzdC90ZXN0X3NoYS5weQppbmRleCAwNjQ3ZGIzLi42YjM4NDM1IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NoYS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NoYS5weQpAQCAtMTgsMTkgKzE4LDE5IEBACiAgICAgICAgICMgQ2hlY2sgZGlnZXN0IG1hdGNoZXMgdGhlIGV4cGVjdGVkIHZhbHVlCiAgICAgICAgIG9iaiA9IHNoYS5uZXcoZGF0YSkKICAgICAgICAgY29tcHV0ZWQgPSBvYmouaGV4ZGlnZXN0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNvbXB1dGVkID09IGRpZ2VzdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbXB1dGVkID09IGRpZ2VzdCkKIAogICAgICAgICAjIFZlcmlmeSB0aGF0IHRoZSB2YWx1ZSBkb2Vzbid0IGNoYW5nZSBiZXR3ZWVuIHR3byBjb25zZWN1dGl2ZQogICAgICAgICAjIGRpZ2VzdCBvcGVyYXRpb25zLgogICAgICAgICBjb21wdXRlZF9hZ2FpbiA9IG9iai5oZXhkaWdlc3QoKQotICAgICAgICBzZWxmLmFzc2VydF8oY29tcHV0ZWQgPT0gY29tcHV0ZWRfYWdhaW4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21wdXRlZCA9PSBjb21wdXRlZF9hZ2FpbikKIAogICAgICAgICAjIENoZWNrIGhleGRpZ2VzdCgpIG91dHB1dCBtYXRjaGVzIGRpZ2VzdCgpJ3Mgb3V0cHV0CiAgICAgICAgIGRpZ2VzdCA9IG9iai5kaWdlc3QoKQogICAgICAgICBoZXhkID0gIiIKICAgICAgICAgZm9yIGMgaW4gZGlnZXN0OgogICAgICAgICAgICAgaGV4ZCArPSAnJTAyeCcgJSBvcmQoYykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNvbXB1dGVkID09IGhleGQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21wdXRlZCA9PSBoZXhkKQogCiAgICAgZGVmIHRlc3RfY2FzZV8xKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrKCJhYmMiLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zaHV0aWwucHkgYi9MaWIvdGVzdC90ZXN0X3NodXRpbC5weQppbmRleCA2MjI2ZjliLi4xN2QzY2FiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3NodXRpbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NodXRpbC5weQpAQCAtNjMsMTIgKzYzLDEyIEBACiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRJcyhmdW5jLCBvcy5saXN0ZGlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZ1bmMgbXVzdCBiZSBlaXRoZXIgb3MucmVtb3ZlIG9yIG9zLmxpc3RkaXIiKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXJnLCBURVNURk4pCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhleGNbMF0sIE9TRXJyb3IpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3MoZXhjWzBdLCBPU0Vycm9yKSkKICAgICAgICAgICAgIHNlbGYuZXJyb3JTdGF0ZSA9IDEKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuYywgb3Mucm1kaXIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFyZywgVEVTVEZOKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3MoZXhjWzBdLCBPU0Vycm9yKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKGV4Y1swXSwgT1NFcnJvcikpCiAgICAgICAgICAgICBzZWxmLmVycm9yU3RhdGUgPSAyCiAKICAgICBkZWYgdGVzdF9ybXRyZWVfZG9udF9kZWxldGVfZmlsZShzZWxmKToKQEAgLTE1OCw5ICsxNTgsOSBAQAogICAgICAgICAgICAgcGF0dGVybnMgPSBzaHV0aWwuaWdub3JlX3BhdHRlcm5zKCcqLnRtcCcsICd0ZXN0X2RpcjInKQogICAgICAgICAgICAgc2h1dGlsLmNvcHl0cmVlKHNyY19kaXIsIGRzdF9kaXIsIGlnbm9yZT1wYXR0ZXJucykKICAgICAgICAgICAgICMgY2hlY2tpbmcgdGhlIHJlc3VsdDogc29tZSBlbGVtZW50cyBzaG91bGQgbm90IGJlIGNvcGllZAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGV4aXN0cyhqb2luKGRzdF9kaXIsICd0ZXN0LnR4dCcpKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3QudG1wJykpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdF9kaXIyJykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4aXN0cyhqb2luKGRzdF9kaXIsICd0ZXN0LnR4dCcpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3QudG1wJykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdF9kaXIyJykpKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoZHN0X2Rpcik6CiAgICAgICAgICAgICAgICAgc2h1dGlsLnJtdHJlZShkc3RfZGlyKQpAQCAtMTY4LDkgKzE2OCw5IEBACiAgICAgICAgICAgICBwYXR0ZXJucyA9IHNodXRpbC5pZ25vcmVfcGF0dGVybnMoJyoudG1wJywgJ3N1YmRpcionKQogICAgICAgICAgICAgc2h1dGlsLmNvcHl0cmVlKHNyY19kaXIsIGRzdF9kaXIsIGlnbm9yZT1wYXR0ZXJucykKICAgICAgICAgICAgICMgY2hlY2tpbmcgdGhlIHJlc3VsdDogc29tZSBlbGVtZW50cyBzaG91bGQgbm90IGJlIGNvcGllZAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdC50bXAnKSkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IGV4aXN0cyhqb2luKGRzdF9kaXIsICd0ZXN0X2RpcjInLCAnc3ViZGlyMicpKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyMicsICdzdWJkaXInKSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGV4aXN0cyhqb2luKGRzdF9kaXIsICd0ZXN0LnRtcCcpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyMicsICdzdWJkaXIyJykpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdF9kaXIyJywgJ3N1YmRpcicpKSkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRzdF9kaXIpOgogICAgICAgICAgICAgICAgIHNodXRpbC5ybXRyZWUoZHN0X2RpcikKQEAgLTE5Miw5ICsxOTIsOSBAQAogICAgICAgICAgICAgc2h1dGlsLmNvcHl0cmVlKHNyY19kaXIsIGRzdF9kaXIsIGlnbm9yZT1fZmlsdGVyKQogCiAgICAgICAgICAgICAjIGNoZWNraW5nIHRoZSByZXN1bHQ6IHNvbWUgZWxlbWVudHMgc2hvdWxkIG5vdCBiZSBjb3BpZWQKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyMicsICdzdWJkaXIyJywKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyMicsICdzdWJkaXIyJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LnB5JykpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBleGlzdHMoam9pbihkc3RfZGlyLCAndGVzdF9kaXIyJywgJ3N1YmRpcicpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXhpc3RzKGpvaW4oZHN0X2RpciwgJ3Rlc3RfZGlyMicsICdzdWJkaXInKSkpCiAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGRzdF9kaXIpOgpAQCAtMzkzLDcgKzM5Myw3IEBACiAgICAgICAgICAgICBmb3Igc3JjLCBkc3QgaW4gWygnc3JjZGlyJywgJ3NyY2Rpci9kZXN0JyldOgogICAgICAgICAgICAgICAgIHNyYyA9IG9zLnBhdGguam9pbihURVNURk4sIHNyYykKICAgICAgICAgICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oVEVTVEZOLCBkc3QpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHNodXRpbC5fZGVzdGluc3JjKHNyYywgZHN0KSwKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoc2h1dGlsLl9kZXN0aW5zcmMoc3JjLCBkc3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2c9J19kZXN0aW5zcmMoKSB3cm9uZ2x5IGNvbmNsdWRlZCB0aGF0ICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RzdCAoJXMpIGlzIG5vdCBpbiBzcmMgKCVzKScgJSAoZHN0LCBzcmMpKQogICAgICAgICBmaW5hbGx5OgpAQCAtNDA1LDcgKzQwNSw3IEBACiAgICAgICAgICAgICBmb3Igc3JjLCBkc3QgaW4gWygnc3JjZGlyJywgJ3NyYy9kZXN0JyksICgnc3JjZGlyJywgJ3NyY2Rpci5uZXcnKV06CiAgICAgICAgICAgICAgICAgc3JjID0gb3MucGF0aC5qb2luKFRFU1RGTiwgc3JjKQogICAgICAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihURVNURk4sIGRzdCkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxJZihzaHV0aWwuX2Rlc3RpbnNyYyhzcmMsIGRzdCksCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzaHV0aWwuX2Rlc3RpbnNyYyhzcmMsIGRzdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNnPSdfZGVzdGluc3JjKCkgd3JvbmdseSBjb25jbHVkZWQgdGhhdCAnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RzdCAoJXMpIGlzIGluIHNyYyAoJXMpJyAlIChkc3QsIHNyYykpCiAgICAgICAgIGZpbmFsbHk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NpZ25hbC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2lnbmFsLnB5CmluZGV4IDIxNTc3ZGIuLjQzNjgzNzUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2lnbmFsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2lnbmFsLnB5CkBAIC0yMTcsMTAgKzIxNywxMCBAQAogICAgICAgICAjIGJlZm9yZSBzZWxlY3QgaXMgY2FsbGVkCiAgICAgICAgIHRpbWUuc2xlZXAoc2VsZi5USU1FT1VUX0ZVTEwpCiAgICAgICAgIG1pZF90aW1lID0gdGltZS50aW1lKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1pZF90aW1lIC0gYmVmb3JlX3RpbWUgPCBzZWxmLlRJTUVPVVRfSEFMRikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1pZF90aW1lIC0gYmVmb3JlX3RpbWUgPCBzZWxmLlRJTUVPVVRfSEFMRikKICAgICAgICAgc2VsZWN0LnNlbGVjdChbc2VsZi5yZWFkXSwgW10sIFtdLCBzZWxmLlRJTUVPVVRfRlVMTCkKICAgICAgICAgYWZ0ZXJfdGltZSA9IHRpbWUudGltZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhhZnRlcl90aW1lIC0gbWlkX3RpbWUgPCBzZWxmLlRJTUVPVVRfSEFMRikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFmdGVyX3RpbWUgLSBtaWRfdGltZSA8IHNlbGYuVElNRU9VVF9IQUxGKQogCiAgICAgZGVmIHRlc3Rfd2FrZXVwX2ZkX2R1cmluZyhzZWxmKToKICAgICAgICAgaW1wb3J0IHNlbGVjdApAQCAtMjMxLDcgKzIzMSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNlbGVjdC5lcnJvciwgc2VsZWN0LnNlbGVjdCwKICAgICAgICAgICAgIFtzZWxmLnJlYWRdLCBbXSwgW10sIHNlbGYuVElNRU9VVF9GVUxMKQogICAgICAgICBhZnRlcl90aW1lID0gdGltZS50aW1lKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGFmdGVyX3RpbWUgLSBiZWZvcmVfdGltZSA8IHNlbGYuVElNRU9VVF9IQUxGKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYWZ0ZXJfdGltZSAtIGJlZm9yZV90aW1lIDwgc2VsZi5USU1FT1VUX0hBTEYpCiAKICAgICBkZWYgc2V0VXAoc2VsZik6CiAgICAgICAgIGltcG9ydCBmY250bApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zaXRlLnB5IGIvTGliL3Rlc3QvdGVzdF9zaXRlLnB5CmluZGV4IDAzZjZkODAuLjJiOTNkMDQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2l0ZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NpdGUucHkKQEAgLTQ3LDI2ICs0NywyNiBAQAogICAgICAgICBwYXRoX3BhcnRzID0gKCJCZWdpbm5pbmciLCAiRW5kIikKICAgICAgICAgb3JpZ2luYWxfZGlyID0gb3MucGF0aC5qb2luKCpwYXRoX3BhcnRzKQogICAgICAgICBhYnNfZGlyLCBub3JtX2RpciA9IHNpdGUubWFrZXBhdGgoKnBhdGhfcGFydHMpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG9zLnBhdGguYWJzcGF0aChvcmlnaW5hbF9kaXIpLCBhYnNfZGlyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguYWJzcGF0aChvcmlnaW5hbF9kaXIpLCBhYnNfZGlyKQogICAgICAgICBpZiBvcmlnaW5hbF9kaXIgPT0gb3MucGF0aC5ub3JtY2FzZShvcmlnaW5hbF9kaXIpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoYWJzX2Rpciwgbm9ybV9kaXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFic19kaXIsIG5vcm1fZGlyKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3MucGF0aC5ub3JtY2FzZShhYnNfZGlyKSwgbm9ybV9kaXIpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGgubm9ybWNhc2UoYWJzX2RpciksIG5vcm1fZGlyKQogCiAgICAgZGVmIHRlc3RfaW5pdF9wYXRoaW5mbyhzZWxmKToKICAgICAgICAgZGlyX3NldCA9IHNpdGUuX2luaXRfcGF0aGluZm8oKQogICAgICAgICBmb3IgZW50cnkgaW4gW3NpdGUubWFrZXBhdGgocGF0aClbMV0gZm9yIHBhdGggaW4gc3lzLnBhdGgKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBhdGggYW5kIG9zLnBhdGguaXNkaXIocGF0aCldOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGVudHJ5IGluIGRpcl9zZXQsCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZW50cnkgaW4gZGlyX3NldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgZnJvbSBzeXMucGF0aCBub3QgZm91bmQgaW4gc2V0IHJldHVybmVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnkgX2luaXRfcGF0aGluZm8oKTogJXMiICUgKGVudHJ5LCBkaXJfc2V0KSkKIAogICAgIGRlZiBwdGhfZmlsZV90ZXN0cyhzZWxmLCBwdGhfZmlsZSk6CiAgICAgICAgICIiIkNvbnRhaW4gY29tbW9uIGNvZGUgZm9yIHRlc3RpbmcgcmVzdWx0cyBvZiByZWFkaW5nIGEgLnB0aCBmaWxlIiIiCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhwdGhfZmlsZS5pbXBvcnRlZCBpbiBzeXMubW9kdWxlcywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHB0aF9maWxlLmltcG9ydGVkIGluIHN5cy5tb2R1bGVzLAogICAgICAgICAgICAgICAgICIlcyBub3QgaW4gc3lzLnBhdGgiICUgcHRoX2ZpbGUuaW1wb3J0ZWQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzaXRlLm1ha2VwYXRoKHB0aF9maWxlLmdvb2RfZGlyX3BhdGgpWzBdIGluIHN5cy5wYXRoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IG9zLnBhdGguZXhpc3RzKHB0aF9maWxlLmJhZF9kaXJfcGF0aCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzaXRlLm1ha2VwYXRoKHB0aF9maWxlLmdvb2RfZGlyX3BhdGgpWzBdIGluIHN5cy5wYXRoKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IG9zLnBhdGguZXhpc3RzKHB0aF9maWxlLmJhZF9kaXJfcGF0aCkpCiAKICAgICBkZWYgdGVzdF9hZGRwYWNrYWdlKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSBhZGRwYWNrYWdlKCkgaW1wb3J0cyBpZiB0aGUgbGluZSBzdGFydHMgd2l0aCAnaW1wb3J0JywKQEAgLTk4LDcgKzk4LDcgQEAKIAogICAgIGRlZiB0ZXN0X3Nfb3B0aW9uKHNlbGYpOgogICAgICAgICB1c2Vyc2l0ZSA9IHNpdGUuVVNFUl9TSVRFCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1c2Vyc2l0ZSBpbiBzeXMucGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHVzZXJzaXRlIGluIHN5cy5wYXRoKQogCiAgICAgICAgIHJjID0gc3VicHJvY2Vzcy5jYWxsKFtzeXMuZXhlY3V0YWJsZSwgJy1jJywKICAgICAgICAgICAgICdpbXBvcnQgc3lzOyBzeXMuZXhpdCglciBpbiBzeXMucGF0aCknICUgdXNlcnNpdGVdKQpAQCAtMTk3LDcgKzE5Nyw3IEBACiAgICAgICAgIHNpdGUuYWJzX19maWxlX18oKQogICAgICAgICBmb3IgbW9kdWxlIGluIChzeXMsIG9zLCBfX2J1aWx0aW5fXyk6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9zLnBhdGguaXNhYnMobW9kdWxlLl9fZmlsZV9fKSwgYG1vZHVsZWApCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNhYnMobW9kdWxlLl9fZmlsZV9fKSwgYG1vZHVsZWApCiAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgIyBXZSBjb3VsZCB0cnkgZXZlcnl0aGluZyBpbiBzeXMubW9kdWxlczsgaG93ZXZlciwgd2hlbiByZWdydGVzdC5weQpAQCAtMjEwLDcgKzIxMCw3IEBACiAgICAgICAgIHNpdGUucmVtb3ZlZHVwcGF0aHMoKQogICAgICAgICBzZWVuX3BhdGhzID0gc2V0KCkKICAgICAgICAgZm9yIHBhdGggaW4gc3lzLnBhdGg6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MocGF0aCBub3QgaW4gc2Vlbl9wYXRocykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXRoIG5vdCBpbiBzZWVuX3BhdGhzKQogICAgICAgICAgICAgc2Vlbl9wYXRocy5hZGQocGF0aCkKIAogICAgIGRlZiB0ZXN0X2FkZF9idWlsZF9kaXIoc2VsZik6CkBAIC0yMjEsMTcgKzIyMSwxNyBAQAogCiAgICAgZGVmIHRlc3Rfc2V0dGluZ19xdWl0KHNlbGYpOgogICAgICAgICAjICdxdWl0JyBhbmQgJ2V4aXQnIHNob3VsZCBiZSBpbmplY3RlZCBpbnRvIF9fYnVpbHRpbl9fCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhoYXNhdHRyKF9fYnVpbHRpbl9fLCAicXVpdCIpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaGFzYXR0cihfX2J1aWx0aW5fXywgImV4aXQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoX19idWlsdGluX18sICJxdWl0IikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKF9fYnVpbHRpbl9fLCAiZXhpdCIpKQogCiAgICAgZGVmIHRlc3Rfc2V0dGluZ19jb3B5cmlnaHQoc2VsZik6CiAgICAgICAgICMgJ2NvcHlyaWdodCcgYW5kICdjcmVkaXRzJyBzaG91bGQgYmUgaW4gX19idWlsdGluX18KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGhhc2F0dHIoX19idWlsdGluX18sICJjb3B5cmlnaHQiKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGhhc2F0dHIoX19idWlsdGluX18sICJjcmVkaXRzIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKF9fYnVpbHRpbl9fLCAiY29weXJpZ2h0IikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKF9fYnVpbHRpbl9fLCAiY3JlZGl0cyIpKQogCiAgICAgZGVmIHRlc3Rfc2V0dGluZ19oZWxwKHNlbGYpOgogICAgICAgICAjICdoZWxwJyBzaG91bGQgYmUgc2V0IGluIF9fYnVpbHRpbl9fCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhoYXNhdHRyKF9fYnVpbHRpbl9fLCAiaGVscCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihfX2J1aWx0aW5fXywgImhlbHAiKSkKIAogICAgIGRlZiB0ZXN0X2FsaWFzaW5nX21iY3Moc2VsZik6CiAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAid2luMzIiOgpAQCAtMjQ1LDcgKzI0NSw3IEBACiAKICAgICBkZWYgdGVzdF9zZXRkZWZhdWx0ZW5jb2RpbmdfcmVtb3ZlZChzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgc3lzLnNldGRlZmF1bHRlbmNvZGluZyBpcyBnb25lCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3QgaGFzYXR0cihzeXMsICJzZXRkZWZhdWx0ZW5jb2RpbmciKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoYXNhdHRyKHN5cywgInNldGRlZmF1bHRlbmNvZGluZyIpKQogCiAgICAgZGVmIHRlc3Rfc2l0ZWN1c3RvbWl6ZV9leGVjdXRlZChzZWxmKToKICAgICAgICAgIyBJZiBzaXRlY3VzdG9taXplIGlzIGF2YWlsYWJsZSwgaXQgc2hvdWxkIGhhdmUgYmVlbiBpbXBvcnRlZC4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2xpY2UucHkgYi9MaWIvdGVzdC90ZXN0X3NsaWNlLnB5CmluZGV4IDg1NDgwNWIuLjA4ZGU4ZTMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2xpY2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zbGljZS5weQpAQCAtNzEsNyArNzEsNyBAQAogCiAgICAgICAgIG9iaiA9IEFueUNsYXNzKCkKICAgICAgICAgcyA9IHNsaWNlKG9iaikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHMuc3RvcCBpcyBvYmopCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLnN0b3AgaXMgb2JqKQogCiAgICAgZGVmIHRlc3RfaW5kaWNlcyhzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzbGljZShOb25lICAgICAgICAgICApLmluZGljZXMoMTApLCAoMCwgMTAsICAxKSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5IGIvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkKaW5kZXggNWM5MDZkNy4uYTIyNjVkZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkKQEAgLTIzNywxMSArMjM3LDExIEBACiAgICAgICAgICAgICByYWlzZSBzb2NrZXQuaGVycm9yCiAgICAgICAgIGRlZiByYWlzZV9nYWllcnJvcigqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICAgcmFpc2Ugc29ja2V0LmdhaWVycm9yCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhzb2NrZXQuZXJyb3IsIHJhaXNlX2Vycm9yLAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHJhaXNlX2Vycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJhaXNpbmcgc29ja2V0IGV4Y2VwdGlvbi4iKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoc29ja2V0LmVycm9yLCByYWlzZV9oZXJyb3IsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgcmFpc2VfaGVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJhaXNpbmcgc29ja2V0IGV4Y2VwdGlvbi4iKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoc29ja2V0LmVycm9yLCByYWlzZV9nYWllcnJvciwKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCByYWlzZV9nYWllcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciByYWlzaW5nIHNvY2tldCBleGNlcHRpb24uIikKIAogICAgIGRlZiB0ZXN0Q3J1Y2lhbENvbnN0YW50cyhzZWxmKToKQEAgLTI2Myw3ICsyNjMsNyBAQAogICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgogICAgICAgICAgICAgIyBQcm9iYWJseSBuYW1lIGxvb2t1cCB3YXNuJ3Qgc2V0IHVwIHJpZ2h0OyBza2lwIHRoaXMgdGVzdAogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhpcC5maW5kKCcuJykgPj0gMCwgIkVycm9yIHJlc29sdmluZyBob3N0IHRvIGlwLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpcC5maW5kKCcuJykgPj0gMCwgIkVycm9yIHJlc29sdmluZyBob3N0IHRvIGlwLiIpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGhuYW1lLCBhbGlhc2VzLCBpcGFkZHJzID0gc29ja2V0LmdldGhvc3RieWFkZHIoaXApCiAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CkBAIC00OTEsNyArNDkxLDcgQEAKICAgICAgICAgIyBpdCByZWFzb25hYmxlIHRvIGdldCB0aGUgaG9zdCdzIGFkZHIgaW4gYWRkaXRpb24gdG8gMC4wLjAuMC4KICAgICAgICAgIyBBdCBsZWFzdCBmb3IgZUNvcy4gIFRoaXMgaXMgcmVxdWlyZWQgZm9yIHRoZSBTLzM5MCB0byBwYXNzLgogICAgICAgICBteV9pcF9hZGRyID0gc29ja2V0LmdldGhvc3RieW5hbWUoc29ja2V0LmdldGhvc3RuYW1lKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhuYW1lWzBdIGluICgiMC4wLjAuMCIsIG15X2lwX2FkZHIpLCAnJXMgaW52YWxpZCcgJSBuYW1lWzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobmFtZVswXSBpbiAoIjAuMC4wLjAiLCBteV9pcF9hZGRyKSwgJyVzIGludmFsaWQnICUgbmFtZVswXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lWzFdLCBwb3J0KQogCiAgICAgZGVmIHRlc3RHZXRTb2NrT3B0KHNlbGYpOgpAQCAtNDk5LDE0ICs0OTksMTQgQEAKICAgICAgICAgIyBXZSBrbm93IGEgc29ja2V0IHNob3VsZCBzdGFydCB3aXRob3V0IHJldXNlPT0wCiAgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCiAgICAgICAgIHJldXNlID0gc29jay5nZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSKQotICAgICAgICBzZWxmLmZhaWxJZihyZXVzZSAhPSAwLCAiaW5pdGlhbCBtb2RlIGlzIHJldXNlIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXVzZSAhPSAwLCAiaW5pdGlhbCBtb2RlIGlzIHJldXNlIikKIAogICAgIGRlZiB0ZXN0U2V0U29ja09wdChzZWxmKToKICAgICAgICAgIyBUZXN0aW5nIHNldHNvY2tvcHQoKQogICAgICAgICBzb2NrID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQogICAgICAgICBzb2NrLnNldHNvY2tvcHQoc29ja2V0LlNPTF9TT0NLRVQsIHNvY2tldC5TT19SRVVTRUFERFIsIDEpCiAgICAgICAgIHJldXNlID0gc29jay5nZXRzb2Nrb3B0KHNvY2tldC5TT0xfU09DS0VULCBzb2NrZXQuU09fUkVVU0VBRERSKQotICAgICAgICBzZWxmLmZhaWxJZihyZXVzZSA9PSAwLCAiZmFpbGVkIHRvIHNldCByZXVzZSBtb2RlIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyZXVzZSA9PSAwLCAiZmFpbGVkIHRvIHNldCByZXVzZSBtb2RlIikKIAogICAgIGRlZiB0ZXN0U2VuZEFmdGVyQ2xvc2Uoc2VsZik6CiAgICAgICAgICMgdGVzdGluZyBzZW5kKCkgYWZ0ZXIgY2xvc2UoKSB3aXRoIHRpbWVvdXQKQEAgLTUzOSwxMCArNTM5LDEwIEBACiAgICAgZGVmIHRlc3Rfc29ja19pb2N0bChzZWxmKToKICAgICAgICAgaWYgb3MubmFtZSAhPSAibnQiOgogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhoYXNhdHRyKHNvY2tldC5zb2NrZXQsICdpb2N0bCcpKQotICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihzb2NrZXQsICdTSU9fUkNWQUxMJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhoYXNhdHRyKHNvY2tldCwgJ1JDVkFMTF9PTicpKQotICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihzb2NrZXQsICdSQ1ZBTExfT0ZGJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHNvY2tldC5zb2NrZXQsICdpb2N0bCcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzb2NrZXQsICdTSU9fUkNWQUxMJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHNvY2tldCwgJ1JDVkFMTF9PTicpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzb2NrZXQsICdSQ1ZBTExfT0ZGJykpCiAKIAogY2xhc3MgQmFzaWNUQ1BUZXN0KFNvY2tldENvbm5lY3RlZFRlc3QpOgpAQCAtNzAxLDcgKzcwMSw3IEBACiAgICAgICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGVuZCA9IHRpbWUudGltZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoZW5kIC0gc3RhcnQpIDwgMS4wLCAiRXJyb3Igc2V0dGluZyBub24tYmxvY2tpbmcgbW9kZS4iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGVuZCAtIHN0YXJ0KSA8IDEuMCwgIkVycm9yIHNldHRpbmcgbm9uLWJsb2NraW5nIG1vZGUuIikKIAogICAgIGRlZiBfdGVzdFNldEJsb2NraW5nKHNlbGYpOgogICAgICAgICBwYXNzCkBAIC03NjgsNyArNzY4LDcgQEAKIAogICAgIGRlZiB0ZWFyRG93bihzZWxmKToKICAgICAgICAgc2VsZi5zZXJ2X2ZpbGUuY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5zZXJ2X2ZpbGUuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5zZXJ2X2ZpbGUuY2xvc2VkKQogICAgICAgICBzZWxmLnNlcnZfZmlsZSA9IE5vbmUKICAgICAgICAgU29ja2V0Q29ubmVjdGVkVGVzdC50ZWFyRG93bihzZWxmKQogCkBAIC03NzgsNyArNzc4LDcgQEAKIAogICAgIGRlZiBjbGllbnRUZWFyRG93bihzZWxmKToKICAgICAgICAgc2VsZi5jbGlfZmlsZS5jbG9zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLmNsaV9maWxlLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuY2xpX2ZpbGUuY2xvc2VkKQogICAgICAgICBzZWxmLmNsaV9maWxlID0gTm9uZQogICAgICAgICBTb2NrZXRDb25uZWN0ZWRUZXN0LmNsaWVudFRlYXJEb3duKHNlbGYpCiAKQEAgLTg1MywxMCArODUzLDEwIEBACiAgICAgICAgIHNlbGYuY2xpX2ZpbGUud3JpdGUoIkVuZCBPZiBMaW5lIikKIAogICAgIGRlZiB0ZXN0Q2xvc2VkQXR0cihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBzZWxmLnNlcnZfZmlsZS5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgc2VsZi5zZXJ2X2ZpbGUuY2xvc2VkKQogCiAgICAgZGVmIF90ZXN0Q2xvc2VkQXR0cihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBzZWxmLmNsaV9maWxlLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBzZWxmLmNsaV9maWxlLmNsb3NlZCkKIAogY2xhc3MgVW5idWZmZXJlZEZpbGVPYmplY3RDbGFzc1Rlc3RDYXNlKEZpbGVPYmplY3RDbGFzc1Rlc3RDYXNlKToKIApAQCAtOTA4LDcgKzkwOCw3IEBACiBjbGFzcyBOZXR3b3JrQ29ubmVjdGlvbk5vU2VydmVyKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdFdpdGhvdXRTZXJ2ZXIoc2VsZik6CiAgICAgICAgIHBvcnQgPSB0ZXN0X3N1cHBvcnQuZmluZF91bnVzZWRfcG9ydCgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcygKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCiAgICAgICAgICAgICBzb2NrZXQuZXJyb3IsCiAgICAgICAgICAgICBsYW1iZGE6IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoSE9TVCwgcG9ydCkpCiAgICAgICAgICkKQEAgLTkzOCw3ICs5MzgsNyBAQAogICAgIHRlc3RUaW1lb3V0RGVmYXVsdCA9IF9qdXN0QWNjZXB0CiAgICAgZGVmIF90ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CiAgICAgICAgICMgcGFzc2luZyBubyBleHBsaWNpdCB0aW1lb3V0IHVzZXMgc29ja2V0J3MgZ2xvYmFsIGRlZmF1bHQKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQogICAgICAgICBzb2NrZXQuc2V0ZGVmYXVsdHRpbWVvdXQoNDIpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHNlbGYuY2xpID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChIT1NULCBzZWxmLnBvcnQpKQpAQCAtOTQ5LDcgKzk0OSw3IEBACiAgICAgdGVzdFRpbWVvdXROb25lID0gX2p1c3RBY2NlcHQKICAgICBkZWYgX3Rlc3RUaW1lb3V0Tm9uZShzZWxmKToKICAgICAgICAgIyBOb25lIHRpbWVvdXQgbWVhbnMgdGhlIHNhbWUgYXMgc29jay5zZXR0aW1lb3V0KE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhzb2NrZXQuZ2V0ZGVmYXVsdHRpbWVvdXQoKSBpcyBOb25lKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc29ja2V0LmdldGRlZmF1bHR0aW1lb3V0KCkgaXMgTm9uZSkKICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBzZWxmLmNsaSA9IHNvY2tldC5jcmVhdGVfY29ubmVjdGlvbigoSE9TVCwgc2VsZi5wb3J0KSwgdGltZW91dD1Ob25lKQpAQCAtOTk0LDcgKzk5NCw3IEBACiAKICAgICBkZWYgX3Rlc3RPdXRzaWRlVGltZW91dChzZWxmKToKICAgICAgICAgc2VsZi5jbGkgPSBzb2NrID0gc29ja2V0LmNyZWF0ZV9jb25uZWN0aW9uKChIT1NULCBzZWxmLnBvcnQpLCB0aW1lb3V0PTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhzb2NrZXQudGltZW91dCwgbGFtYmRhOiBzb2NrLnJlY3YoNSkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC50aW1lb3V0LCBsYW1iZGE6IHNvY2sucmVjdig1KSkKIAogCiBjbGFzcyBVcmxsaWIyRmlsZW9iamVjdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtMTAxNCwxMiArMTAxNCwxMiBAQAogICAgICAgICBzID0gTW9ja1NvY2tldCgpCiAgICAgICAgIGYgPSBzb2NrZXQuX2ZpbGVvYmplY3QocykKICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgcy5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgcy5jbG9zZWQpCiAKICAgICAgICAgcyA9IE1vY2tTb2NrZXQoKQogICAgICAgICBmID0gc29ja2V0Ll9maWxlb2JqZWN0KHMsIGNsb3NlPVRydWUpCiAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8ocy5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmNsb3NlZCkKIAogY2xhc3MgVENQVGltZW91dFRlc3QoU29ja2V0VENQVGVzdCk6CiAKQEAgLTEwMjcsNyArMTAyNyw3IEBACiAgICAgICAgIGRlZiByYWlzZV90aW1lb3V0KCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgICBzZWxmLnNlcnYuc2V0dGltZW91dCgxLjApCiAgICAgICAgICAgICBzZWxmLnNlcnYuYWNjZXB0KCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKHNvY2tldC50aW1lb3V0LCByYWlzZV90aW1lb3V0LAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQudGltZW91dCwgcmFpc2VfdGltZW91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBnZW5lcmF0aW5nIGEgdGltZW91dCBleGNlcHRpb24gKFRDUCkiKQogCiAgICAgZGVmIHRlc3RUaW1lb3V0WmVybyhzZWxmKToKQEAgLTEwODQsNyArMTA4NCw3IEBACiAgICAgICAgIGRlZiByYWlzZV90aW1lb3V0KCphcmdzLCAqKmt3YXJncyk6CiAgICAgICAgICAgICBzZWxmLnNlcnYuc2V0dGltZW91dCgxLjApCiAgICAgICAgICAgICBzZWxmLnNlcnYucmVjdigxMDI0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoc29ja2V0LnRpbWVvdXQsIHJhaXNlX3RpbWVvdXQsCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC50aW1lb3V0LCByYWlzZV90aW1lb3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGdlbmVyYXRpbmcgYSB0aW1lb3V0IGV4Y2VwdGlvbiAoVURQKSIpCiAKICAgICBkZWYgdGVzdFRpbWVvdXRaZXJvKHNlbGYpOgpAQCAtMTEwNCwxMCArMTEwNCwxMCBAQAogY2xhc3MgVGVzdEV4Y2VwdGlvbnModW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RFeGNlcHRpb25UcmVlKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhzb2NrZXQuZXJyb3IsIEV4Y2VwdGlvbikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc3N1YmNsYXNzKHNvY2tldC5oZXJyb3IsIHNvY2tldC5lcnJvcikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc3N1YmNsYXNzKHNvY2tldC5nYWllcnJvciwgc29ja2V0LmVycm9yKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzc3ViY2xhc3Moc29ja2V0LnRpbWVvdXQsIHNvY2tldC5lcnJvcikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc3N1YmNsYXNzKHNvY2tldC5lcnJvciwgRXhjZXB0aW9uKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc29ja2V0LmhlcnJvciwgc29ja2V0LmVycm9yKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzc3ViY2xhc3Moc29ja2V0LmdhaWVycm9yLCBzb2NrZXQuZXJyb3IpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNzdWJjbGFzcyhzb2NrZXQudGltZW91dCwgc29ja2V0LmVycm9yKSkKIAogY2xhc3MgVGVzdExpbnV4QWJzdHJhY3ROYW1lc3BhY2UodW5pdHRlc3QuVGVzdENhc2UpOgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0ci5weSBiL0xpYi90ZXN0L3Rlc3Rfc3RyLnB5CmluZGV4IDUzNDFhZjIuLmM1NDYxNTQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3RyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RyLnB5CkBAIC04Niw3ICs4Niw3IEBACiAgICAgICAgICAgICBkZWYgX191bmljb2RlX18oc2VsZik6CiAgICAgICAgICAgICAgICAgcmV0dXJuICJub3QgdW5pY29kZSIKIAotICAgICAgICBzZWxmLmFzc2VydF8oc3RyKEZvbzAoKSkuc3RhcnRzd2l0aCgiPCIpKSAjIHRoaXMgaXMgZGlmZmVyZW50IGZyb20gX191bmljb2RlX18KKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cihGb28wKCkpLnN0YXJ0c3dpdGgoIjwiKSkgIyB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIF9fdW5pY29kZV9fCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKEZvbzEoKSksICJmb28iKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihGb28yKCkpLCAiZm9vIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoRm9vMygpKSwgImZvbyIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0cmluZy5weSBiL0xpYi90ZXN0L3Rlc3Rfc3RyaW5nLnB5CmluZGV4IDIwY2ZmMGEuLjM1YWIxMTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3RyaW5nLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RyaW5nLnB5CkBAIC0xOTksMTMgKzE5OSwxMyBAQAogY2xhc3MgQnl0ZXNBbGlhc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfYnVpbHRpbihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0ciBpcyBieXRlcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0ciBpcyBieXRlcykKIAogICAgIGRlZiB0ZXN0X3N5bnRheChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiInNwYW0iLCAic3BhbSIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYnIiZWdnXGZvbyIsICJlZ2dcXGZvbyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKGIiIiksIHN0cikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUoYnIiIiksIHN0cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoYiIiKSwgc3RyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShiciIiKSwgc3RyKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChTdHJpbmdUZXN0LCBNb2R1bGVUZXN0LCBCeXRlc0FsaWFzVGVzdCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3RyaW5ncHJlcC5weSBiL0xpYi90ZXN0L3Rlc3Rfc3RyaW5ncHJlcC5weQppbmRleCA2MDQyNWRkLi4xNWJkZjg3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cmluZ3ByZXAucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdHJpbmdwcmVwLnB5CkBAIC04LDY2ICs4LDY2IEBACiAKIGNsYXNzIFN0cmluZ3ByZXBUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHRlc3Qoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9hMSh1Ilx1MDIyMSIpKQotICAgICAgICBzZWxmLmZhaWxJZihpbl90YWJsZV9hMSh1Ilx1MDIyMiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYTEodSJcdTAyMjEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9hMSh1Ilx1MDIyMiIpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9iMSh1Ilx1MDBhZCIpKQotICAgICAgICBzZWxmLmZhaWxJZihpbl90YWJsZV9iMSh1Ilx1MDBhZSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYjEodSJcdTAwYWQiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9iMSh1Ilx1MDBhZSIpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtYXBfdGFibGVfYjIodSJcdTAwNDEiKSwgdSJcdTAwNjEiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobWFwX3RhYmxlX2IyKHUiXHUwMDYxIiksIHUiXHUwMDYxIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hcF90YWJsZV9iMih1Ilx1MDA0MSIpLCB1Ilx1MDA2MSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXBfdGFibGVfYjIodSJcdTAwNjEiKSwgdSJcdTAwNjEiKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhtYXBfdGFibGVfYjModSJcdTAwNDEiKSwgdSJcdTAwNjEiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MobWFwX3RhYmxlX2IzKHUiXHUwMDYxIiksIHUiXHUwMDYxIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1hcF90YWJsZV9iMyh1Ilx1MDA0MSIpLCB1Ilx1MDA2MSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtYXBfdGFibGVfYjModSJcdTAwNjEiKSwgdSJcdTAwNjEiKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9jMTEodSJcdTAwMjAiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaW5fdGFibGVfYzExKHUiXHUwMDIxIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jMTEodSJcdTAwMjAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jMTEodSJcdTAwMjEiKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5fdGFibGVfYzEyKHUiXHUwMGEwIikpCi0gICAgICAgIHNlbGYuZmFpbElmKGluX3RhYmxlX2MxMih1Ilx1MDBhMSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzEyKHUiXHUwMGEwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzEyKHUiXHUwMGExIikpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGluX3RhYmxlX2MxMih1Ilx1MDBhMCIpKQotICAgICAgICBzZWxmLmZhaWxJZihpbl90YWJsZV9jMTIodSJcdTAwYTEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2MxMih1Ilx1MDBhMCIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2MxMih1Ilx1MDBhMSIpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9jMTFfYzEyKHUiXHUwMGEwIikpCi0gICAgICAgIHNlbGYuZmFpbElmKGluX3RhYmxlX2MxMV9jMTIodSJcdTAwYTEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2MxMV9jMTIodSJcdTAwYTAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jMTFfYzEyKHUiXHUwMGExIikpCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGluX3RhYmxlX2MyMSh1Ilx1MDAxZiIpKQotICAgICAgICBzZWxmLmZhaWxJZihpbl90YWJsZV9jMjEodSJcdTAwMjAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGluX3RhYmxlX2MyMSh1Ilx1MDAxZiIpKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2MyMSh1Ilx1MDAyMCIpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9jMjIodSJcdTAwOWYiKSkKLSAgICAgICAgc2VsZi5mYWlsSWYoaW5fdGFibGVfYzIyKHUiXHUwMGEwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jMjIodSJcdTAwOWYiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jMjIodSJcdTAwYTAiKSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaW5fdGFibGVfYzIxX2MyMih1Ilx1MDA5ZiIpKQotICAgICAgICBzZWxmLmZhaWxJZihpbl90YWJsZV9jMjFfYzIyKHUiXHUwMGEwIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jMjFfYzIyKHUiXHUwMDlmIikpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoaW5fdGFibGVfYzIxX2MyMih1Ilx1MDBhMCIpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9jMyh1Ilx1ZTAwMCIpKQotICAgICAgICBzZWxmLmZhaWxJZihpbl90YWJsZV9jMyh1Ilx1ZjkwMCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzModSJcdWUwMDAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jMyh1Ilx1ZjkwMCIpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9jNCh1Ilx1ZmZmZiIpKQotICAgICAgICBzZWxmLmZhaWxJZihpbl90YWJsZV9jNCh1Ilx1MDAwMCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzQodSJcdWZmZmYiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jNCh1Ilx1MDAwMCIpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9jNSh1Ilx1ZDgwMCIpKQotICAgICAgICBzZWxmLmZhaWxJZihpbl90YWJsZV9jNSh1Ilx1ZDdmZiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzUodSJcdWQ4MDAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jNSh1Ilx1ZDdmZiIpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9jNih1Ilx1ZmZmOSIpKQotICAgICAgICBzZWxmLmZhaWxJZihpbl90YWJsZV9jNih1Ilx1ZmZmZSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzYodSJcdWZmZjkiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jNih1Ilx1ZmZmZSIpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9jNyh1Ilx1MmZmMCIpKQotICAgICAgICBzZWxmLmZhaWxJZihpbl90YWJsZV9jNyh1Ilx1MmZmYyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzcodSJcdTJmZjAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jNyh1Ilx1MmZmYyIpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9jOCh1Ilx1MDM0MCIpKQotICAgICAgICBzZWxmLmZhaWxJZihpbl90YWJsZV9jOCh1Ilx1MDM0MiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfYzgodSJcdTAzNDAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9jOCh1Ilx1MDM0MiIpKQogCiAgICAgICAgICMgQy45IGlzIG5vdCBpbiB0aGUgYm1wCi0gICAgICAgICMgc2VsZi5mYWlsVW5sZXNzKGluX3RhYmxlX2M5KHUiXFUwMDBFMDAwMSIpKQotICAgICAgICAjIHNlbGYuZmFpbElmKGluX3RhYmxlX2M4KHUiXFUwMDBFMDAwMiIpKQorICAgICAgICAjIHNlbGYuYXNzZXJ0VHJ1ZShpbl90YWJsZV9jOSh1IlxVMDAwRTAwMDEiKSkKKyAgICAgICAgIyBzZWxmLmFzc2VydEZhbHNlKGluX3RhYmxlX2M4KHUiXFUwMDBFMDAwMiIpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9kMSh1Ilx1MDViZSIpKQotICAgICAgICBzZWxmLmZhaWxJZihpbl90YWJsZV9kMSh1Ilx1MDViZiIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfZDEodSJcdTA1YmUiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9kMSh1Ilx1MDViZiIpKQogCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpbl90YWJsZV9kMih1Ilx1MDA0MSIpKQotICAgICAgICBzZWxmLmZhaWxJZihpbl90YWJsZV9kMih1Ilx1MDA0MCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaW5fdGFibGVfZDIodSJcdTAwNDEiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpbl90YWJsZV9kMih1Ilx1MDA0MCIpKQogCiAgICAgICAgICMgVGhpcyB3b3VsZCBnZW5lcmF0ZSBhIGhhc2ggb2YgYWxsIHByZWRpY2F0ZXMuIEhvd2V2ZXIsIHJ1bm5pbmcKICAgICAgICAgIyBpdCBpcyBxdWl0ZSBleHBlbnNpdmUsIGFuZCBvbmx5IHNlcnZlcyB0byBkZXRlY3QgY2hhbmdlcyBpbiB0aGUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3Ryb3AucHkgYi9MaWIvdGVzdC90ZXN0X3N0cm9wLnB5CmluZGV4IDdjZGE4M2YuLjAxNzI5NTcgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3Ryb3AucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdHJvcC5weQpAQCAtMTAsMTA0ICsxMCwxMDQgQEAKIGNsYXNzIFN0cm9wRnVuY3Rpb25UZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9hdG9pKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3AuYXRvaSgiIDEgIikgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmF0b2koIiAxICIpID09IDEpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cm9wLmF0b2ksICIgMXgiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJvcC5hdG9pLCAiIHgxICIpCiAKICAgICBkZWYgdGVzdF9hdG9sKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3AuYXRvbCgiIDEgIikgPT0gMUwpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5hdG9sKCIgMSAiKSA9PSAxTCkKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc3Ryb3AuYXRvbCwgIiAxeCIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cm9wLmF0b2wsICIgeDEgIikKIAogICAgIGRlZiB0ZXN0X2F0b2Yoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC5hdG9mKCIgMSAiKSA9PSAxLjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5hdG9mKCIgMSAiKSA9PSAxLjApCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN0cm9wLmF0b2YsICIgMXgiKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJvcC5hdG9mLCAiIHgxICIpCiAKICAgICBkZWYgdGVzdF9jYXBpdGFsaXplKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3AuY2FwaXRhbGl6ZSgiIGhlbGxvICIpID09ICIgaGVsbG8gIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cm9wLmNhcGl0YWxpemUoImhlbGxvICIpID09ICJIZWxsbyAiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AuY2FwaXRhbGl6ZSgiIGhlbGxvICIpID09ICIgaGVsbG8gIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmNhcGl0YWxpemUoImhlbGxvICIpID09ICJIZWxsbyAiKQogCiAgICAgZGVmIHRlc3RfZmluZChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cm9wLmZpbmQoImFiY2RlZmdoaWFiYyIsICJhYmMiKSA9PSAwKQotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3AuZmluZCgiYWJjZGVmZ2hpYWJjIiwgImFiYyIsIDEpID09IDkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC5maW5kKCJhYmNkZWZnaGlhYmMiLCAiZGVmIiwgNCkgPT0gLTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5maW5kKCJhYmNkZWZnaGlhYmMiLCAiYWJjIikgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLmZpbmQoImFiY2RlZmdoaWFiYyIsICJhYmMiLCAxKSA9PSA5KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AuZmluZCgiYWJjZGVmZ2hpYWJjIiwgImRlZiIsIDQpID09IC0xKQogCiAgICAgZGVmIHRlc3RfcmZpbmQoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC5yZmluZCgiYWJjZGVmZ2hpYWJjIiwgImFiYyIpID09IDkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5yZmluZCgiYWJjZGVmZ2hpYWJjIiwgImFiYyIpID09IDkpCiAKICAgICBkZWYgdGVzdF9sb3dlcihzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cm9wLmxvd2VyKCJIZUxMbyIpID09ICJoZWxsbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5sb3dlcigiSGVMTG8iKSA9PSAiaGVsbG8iKQogCiAgICAgZGVmIHRlc3RfdXBwZXIoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC51cHBlcigiSGVMTG8iKSA9PSAiSEVMTE8iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AudXBwZXIoIkhlTExvIikgPT0gIkhFTExPIikKIAogICAgIGRlZiB0ZXN0X3N3YXBjYXNlKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3Auc3dhcGNhc2UoIkhlTExvIGNPbXBVdGVScyIpID09ICJoRWxsTyBDb01QdVRFclMiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3Auc3dhcGNhc2UoIkhlTExvIGNPbXBVdGVScyIpID09ICJoRWxsTyBDb01QdVRFclMiKQogCiAgICAgZGVmIHRlc3Rfc3RyaXAoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC5zdHJpcCgiIFx0XG4gaGVsbG8gXHRcbiAiKSA9PSAiaGVsbG8iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3Auc3RyaXAoIiBcdFxuIGhlbGxvIFx0XG4gIikgPT0gImhlbGxvIikKIAogICAgIGRlZiB0ZXN0X2xzdHJpcChzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cm9wLmxzdHJpcCgiIFx0XG4gaGVsbG8gXHRcbiAiKSA9PSAiaGVsbG8gXHRcbiAiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AubHN0cmlwKCIgXHRcbiBoZWxsbyBcdFxuICIpID09ICJoZWxsbyBcdFxuICIpCiAKICAgICBkZWYgdGVzdF9yc3RyaXAoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC5yc3RyaXAoIiBcdFxuIGhlbGxvIFx0XG4gIikgPT0gIiBcdFxuIGhlbGxvIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cm9wLnJzdHJpcCgiIFx0XG4gaGVsbG8gXHRcbiAiKSA9PSAiIFx0XG4gaGVsbG8iKQogCiAgICAgZGVmIHRlc3RfcmVwbGFjZShzZWxmKToKICAgICAgICAgcmVwbGFjZSA9IHN0cm9wLnJlcGxhY2UKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJyEnLCAnQCcsIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICchJywgJ0AnLCAxKQogICAgICAgICAgICAgICAgICAgICAgPT0gIm9uZUB0d28hdGhyZWUhIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJyEnLCAnQCcsIDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICchJywgJ0AnLCAyKQogICAgICAgICAgICAgICAgICAgICAgPT0gIm9uZUB0d29AdGhyZWUhIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJyEnLCAnQCcsIDMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICchJywgJ0AnLCAzKQogICAgICAgICAgICAgICAgICAgICAgPT0gIm9uZUB0d29AdGhyZWVAIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJyEnLCAnQCcsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXBsYWNlKCJvbmUhdHdvIXRocmVlISIsICchJywgJ0AnLCA0KQogICAgICAgICAgICAgICAgICAgICAgPT0gIm9uZUB0d29AdGhyZWVAIikKIAogICAgICAgICAjIENBVVRJT046IGEgcmVwbGFjZSBjb3VudCBvZiAwIG1lYW5zIGluZmluaXR5IG9ubHkgdG8gc3Ryb3AsCiAgICAgICAgICMgbm90IHRvIHRoZSBzdHJpbmcgLnJlcGxhY2UoKSBtZXRob2Qgb3IgdG8gdGhlCiAgICAgICAgICMgc3RyaW5nLnJlcGxhY2UoKSBmdW5jdGlvbi4KIAotICAgICAgICBzZWxmLmFzc2VydF8ocmVwbGFjZSgib25lIXR3byF0aHJlZSEiLCAnIScsICdAJywgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJyEnLCAnQCcsIDApCiAgICAgICAgICAgICAgICAgICAgICA9PSAib25lQHR3b0B0aHJlZUAiKQotICAgICAgICBzZWxmLmFzc2VydF8ocmVwbGFjZSgib25lIXR3byF0aHJlZSEiLCAnIScsICdAJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJyEnLCAnQCcpCiAgICAgICAgICAgICAgICAgICAgICA9PSAib25lQHR3b0B0aHJlZUAiKQotICAgICAgICBzZWxmLmFzc2VydF8ocmVwbGFjZSgib25lIXR3byF0aHJlZSEiLCAneCcsICdAJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJ3gnLCAnQCcpCiAgICAgICAgICAgICAgICAgICAgICA9PSAib25lIXR3byF0aHJlZSEiKQotICAgICAgICBzZWxmLmFzc2VydF8ocmVwbGFjZSgib25lIXR3byF0aHJlZSEiLCAneCcsICdAJywgMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcGxhY2UoIm9uZSF0d28hdGhyZWUhIiwgJ3gnLCAnQCcsIDIpCiAgICAgICAgICAgICAgICAgICAgICA9PSAib25lIXR3byF0aHJlZSEiKQogCiAgICAgZGVmIHRlc3Rfc3BsaXQoc2VsZik6CiAgICAgICAgIHNwbGl0ID0gc3Ryb3Auc3BsaXQKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNwbGl0KCJ0aGlzIGlzIHRoZSBzcGxpdCBmdW5jdGlvbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcGxpdCgidGhpcyBpcyB0aGUgc3BsaXQgZnVuY3Rpb24iKQogICAgICAgICAgICAgICAgICAgICAgPT0gWyd0aGlzJywgJ2lzJywgJ3RoZScsICdzcGxpdCcsICdmdW5jdGlvbiddKQotICAgICAgICBzZWxmLmFzc2VydF8oc3BsaXQoImF8YnxjfGQiLCAnfCcpID09IFsnYScsICdiJywgJ2MnLCAnZCddKQotICAgICAgICBzZWxmLmFzc2VydF8oc3BsaXQoImF8YnxjfGQiLCAnfCcsIDIpID09IFsnYScsICdiJywgJ2N8ZCddKQotICAgICAgICBzZWxmLmFzc2VydF8oc3BsaXQoImEgYiBjIGQiLCBOb25lLCAxKSA9PSBbJ2EnLCAnYiBjIGQnXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNwbGl0KCJhIGIgYyBkIiwgTm9uZSwgMikgPT0gWydhJywgJ2InLCAnYyBkJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzcGxpdCgiYSBiIGMgZCIsIE5vbmUsIDMpID09IFsnYScsICdiJywgJ2MnLCAnZCddKQotICAgICAgICBzZWxmLmFzc2VydF8oc3BsaXQoImEgYiBjIGQiLCBOb25lLCA0KSA9PSBbJ2EnLCAnYicsICdjJywgJ2QnXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNwbGl0KCJhIGIgYyBkIiwgTm9uZSwgMCkgPT0gWydhJywgJ2InLCAnYycsICdkJ10pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzcGxpdCgiYSAgYiAgYyAgZCIsIE5vbmUsIDIpID09ICBbJ2EnLCAnYicsICdjICBkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcGxpdCgiYXxifGN8ZCIsICd8JykgPT0gWydhJywgJ2InLCAnYycsICdkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcGxpdCgiYXxifGN8ZCIsICd8JywgMikgPT0gWydhJywgJ2InLCAnY3xkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcGxpdCgiYSBiIGMgZCIsIE5vbmUsIDEpID09IFsnYScsICdiIGMgZCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BsaXQoImEgYiBjIGQiLCBOb25lLCAyKSA9PSBbJ2EnLCAnYicsICdjIGQnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNwbGl0KCJhIGIgYyBkIiwgTm9uZSwgMykgPT0gWydhJywgJ2InLCAnYycsICdkJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzcGxpdCgiYSBiIGMgZCIsIE5vbmUsIDQpID09IFsnYScsICdiJywgJ2MnLCAnZCddKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3BsaXQoImEgYiBjIGQiLCBOb25lLCAwKSA9PSBbJ2EnLCAnYicsICdjJywgJ2QnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNwbGl0KCJhICBiICBjICBkIiwgTm9uZSwgMikgPT0gIFsnYScsICdiJywgJ2MgIGQnXSkKIAogICAgIGRlZiB0ZXN0X2pvaW4oc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC5qb2luKFsnYScsICdiJywgJ2MnLCAnZCddKSA9PSAnYSBiIGMgZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC5qb2luKCgnYScsICdiJywgJ2MnLCAnZCcpLCAnJykgPT0gJ2FiY2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oc3Ryb3Auam9pbihTZXF1ZW5jZSgpKSA9PSAndyB4IHkgeicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5qb2luKFsnYScsICdiJywgJ2MnLCAnZCddKSA9PSAnYSBiIGMgZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5qb2luKCgnYScsICdiJywgJ2MnLCAnZCcpLCAnJykgPT0gJ2FiY2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3Auam9pbihTZXF1ZW5jZSgpKSA9PSAndyB4IHkgeicpCiAKICAgICAgICAgIyB0cnkgYSBmZXcgbG9uZyBvbmVzCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC5qb2luKFsneCcgKiAxMDBdICogMTAwLCAnOicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5qb2luKFsneCcgKiAxMDBdICogMTAwLCAnOicpCiAgICAgICAgICAgICAgICAgICAgICA9PSAoKCd4JyAqIDEwMCkgKyAiOiIpICogOTkgKyAieCIgKiAxMDApCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC5qb2luKCgneCcgKiAxMDAsKSAqIDEwMCwgJzonKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3Auam9pbigoJ3gnICogMTAwLCkgKiAxMDAsICc6JykKICAgICAgICAgICAgICAgICAgICAgID09ICgoJ3gnICogMTAwKSArICI6IikgKiA5OSArICJ4IiAqIDEwMCkKIAogICAgIGRlZiB0ZXN0X21ha2V0cmFucyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKHN0cm9wLm1ha2V0cmFucygiYWJjIiwgInh5eiIpID09IHRyYW5zdGFibGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJvcC5tYWtldHJhbnMoImFiYyIsICJ4eXoiKSA9PSB0cmFuc3RhYmxlKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzdHJvcC5tYWtldHJhbnMsICJhYmMiLCAieHl6cSIpCiAKICAgICBkZWYgdGVzdF90cmFuc2xhdGUoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhzdHJvcC50cmFuc2xhdGUoInh5emFiY2RlZiIsIHRyYW5zdGFibGUsICJkZWYiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3Ryb3AudHJhbnNsYXRlKCJ4eXphYmNkZWYiLCB0cmFuc3RhYmxlLCAiZGVmIikKICAgICAgICAgICAgICAgICAgICAgID09ICJ4eXp4eXoiKQogCiAgICAgZGVmIHRlc3RfZGF0YV9hdHRyaWJ1dGVzKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHJwdGltZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc3RycHRpbWUucHkKaW5kZXggMmFhNGJjOS4uMTY4MjYzYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdHJwdGltZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0cnB0aW1lLnB5CkBAIC0xMyw3ICsxMyw3IEBACiBjbGFzcyBnZXRsYW5nX1Rlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAiIiJUZXN0IF9nZXRsYW5nIiIiCiAgICAgZGVmIHRlc3RfYmFzaWMoc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKF9zdHJwdGltZS5fZ2V0bGFuZygpLCBsb2NhbGUuZ2V0bG9jYWxlKGxvY2FsZS5MQ19USU1FKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfc3RycHRpbWUuX2dldGxhbmcoKSwgbG9jYWxlLmdldGxvY2FsZShsb2NhbGUuTENfVElNRSkpCiAKIGNsYXNzIExvY2FsZVRpbWVfVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgogICAgICIiIlRlc3RzIGZvciBfc3RycHRpbWUuTG9jYWxlVGltZS4KQEAgLTM2LDkgKzM2LDkgQEAKICAgICAgICAgIiIiCiAgICAgICAgIHN0cmZ0aW1lX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoZGlyZWN0aXZlLCBzZWxmLnRpbWVfdHVwbGUpLmxvd2VyKCkKICAgICAgICAgY29tcGFyaXNvbiA9IHRlc3Rpbmdbc2VsZi50aW1lX3R1cGxlW3R1cGxlX3Bvc2l0aW9uXV0KLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN0cmZ0aW1lX291dHB1dCBpbiB0ZXN0aW5nLCAiJXM6IG5vdCBmb3VuZCBpbiB0dXBsZSIgJQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyZnRpbWVfb3V0cHV0IGluIHRlc3RpbmcsICIlczogbm90IGZvdW5kIGluIHR1cGxlIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfbXNnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY29tcGFyaXNvbiA9PSBzdHJmdGltZV9vdXRwdXQsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb21wYXJpc29uID09IHN0cmZ0aW1lX291dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICIlczogcG9zaXRpb24gd2l0aGluIHR1cGxlIGluY29ycmVjdDsgJXMgIT0gJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgIChlcnJvcl9tc2csIGNvbXBhcmlzb24sIHN0cmZ0aW1lX291dHB1dCkpCiAKQEAgLTYxLDE4ICs2MSwxOCBAQAogICAgIGRlZiB0ZXN0X2FtX3BtKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSBBTS9QTSByZXByZXNlbnRhdGlvbiBkb25lIHByb3Blcmx5CiAgICAgICAgIHN0cmZ0aW1lX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoIiVwIiwgc2VsZi50aW1lX3R1cGxlKS5sb3dlcigpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHJmdGltZV9vdXRwdXQgaW4gc2VsZi5MVF9pbnMuYW1fcG0sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJmdGltZV9vdXRwdXQgaW4gc2VsZi5MVF9pbnMuYW1fcG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAiQU0vUE0gcmVwcmVzZW50YXRpb24gbm90IGluIHR1cGxlIikKICAgICAgICAgaWYgc2VsZi50aW1lX3R1cGxlWzNdIDwgMTI6IHBvc2l0aW9uID0gMAogICAgICAgICBlbHNlOiBwb3NpdGlvbiA9IDEKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN0cmZ0aW1lX291dHB1dCA9PSBzZWxmLkxUX2lucy5hbV9wbVtwb3NpdGlvbl0sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJmdGltZV9vdXRwdXQgPT0gc2VsZi5MVF9pbnMuYW1fcG1bcG9zaXRpb25dLAogICAgICAgICAgICAgICAgICAgICAgICAgIkFNL1BNIHJlcHJlc2VudGF0aW9uIGluIHRoZSB3cm9uZyBwb3NpdGlvbiB3aXRoaW4gdGhlIHR1cGxlIikKIAogICAgIGRlZiB0ZXN0X3RpbWV6b25lKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSB0aW1lem9uZSBpcyBjb3JyZWN0CiAgICAgICAgIHRpbWV6b25lID0gdGltZS5zdHJmdGltZSgiJVoiLCBzZWxmLnRpbWVfdHVwbGUpLmxvd2VyKCkKICAgICAgICAgaWYgdGltZXpvbmU6Ci0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModGltZXpvbmUgaW4gc2VsZi5MVF9pbnMudGltZXpvbmVbMF0gb3IgXAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWV6b25lIGluIHNlbGYuTFRfaW5zLnRpbWV6b25lWzBdIG9yIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lem9uZSBpbiBzZWxmLkxUX2lucy50aW1lem9uZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGltZXpvbmUgJXMgbm90IGZvdW5kIGluICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWV6b25lLCBzZWxmLkxUX2lucy50aW1lem9uZSkpCkBAIC04NiwyNiArODYsMjYgQEAKICAgICAgICAgIyAgb3V0cHV0LgogICAgICAgICBtYWdpY19kYXRlID0gKDE5OTksIDMsIDE3LCAyMiwgNDQsIDU1LCAyLCA3NiwgMCkKICAgICAgICAgc3RyZnRpbWVfb3V0cHV0ID0gdGltZS5zdHJmdGltZSgiJWMiLCBtYWdpY19kYXRlKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RyZnRpbWVfb3V0cHV0ID09IHRpbWUuc3RyZnRpbWUoc2VsZi5MVF9pbnMuTENfZGF0ZV90aW1lLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyZnRpbWVfb3V0cHV0ID09IHRpbWUuc3RyZnRpbWUoc2VsZi5MVF9pbnMuTENfZGF0ZV90aW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnaWNfZGF0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAiTENfZGF0ZV90aW1lIGluY29ycmVjdCIpCiAgICAgICAgIHN0cmZ0aW1lX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoIiV4IiwgbWFnaWNfZGF0ZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN0cmZ0aW1lX291dHB1dCA9PSB0aW1lLnN0cmZ0aW1lKHNlbGYuTFRfaW5zLkxDX2RhdGUsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJmdGltZV9vdXRwdXQgPT0gdGltZS5zdHJmdGltZShzZWxmLkxUX2lucy5MQ19kYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFnaWNfZGF0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAiTENfZGF0ZSBpbmNvcnJlY3QiKQogICAgICAgICBzdHJmdGltZV9vdXRwdXQgPSB0aW1lLnN0cmZ0aW1lKCIlWCIsIG1hZ2ljX2RhdGUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHJmdGltZV9vdXRwdXQgPT0gdGltZS5zdHJmdGltZShzZWxmLkxUX2lucy5MQ190aW1lLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RyZnRpbWVfb3V0cHV0ID09IHRpbWUuc3RyZnRpbWUoc2VsZi5MVF9pbnMuTENfdGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hZ2ljX2RhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIkxDX3RpbWUgaW5jb3JyZWN0IikKICAgICAgICAgTFQgPSBfc3RycHRpbWUuTG9jYWxlVGltZSgpCiAgICAgICAgIExULmFtX3BtID0gKCcnLCAnJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKExULkxDX3RpbWUsICJMb2NhbGVUaW1lJ3MgTEMgZGlyZWN0aXZlcyBjYW5ub3QgaGFuZGxlICIKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKExULkxDX3RpbWUsICJMb2NhbGVUaW1lJ3MgTEMgZGlyZWN0aXZlcyBjYW5ub3QgaGFuZGxlICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJlbXB0eSBzdHJpbmdzIikKIAogICAgIGRlZiB0ZXN0X2xhbmcoc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlIGxhbmcgaXMgc2V0IHRvIHdoYXQgX2dldGxhbmcoKSByZXR1cm5zCiAgICAgICAgICMgQXNzdW1pbmcgbG9jYWxlIGhhcyBub3QgY2hhbmdlZCBiZXR3ZWVuIG5vdyBhbmQgd2hlbiBzZWxmLkxUX2lucyB3YXMgY3JlYXRlZAotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLkxUX2lucy5sYW5nLCBfc3RycHRpbWUuX2dldGxhbmcoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLkxUX2lucy5sYW5nLCBfc3RycHRpbWUuX2dldGxhbmcoKSkKIAogCiBjbGFzcyBUaW1lUkVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0xMTksMTMgKzExOSwxMyBAQAogICAgIGRlZiB0ZXN0X3BhdHRlcm4oc2VsZik6CiAgICAgICAgICMgVGVzdCBUaW1lUkUucGF0dGVybgogICAgICAgICBwYXR0ZXJuX3N0cmluZyA9IHNlbGYudGltZV9yZS5wYXR0ZXJuKHIiJWEgJUEgJWQiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocGF0dGVybl9zdHJpbmcuZmluZChzZWxmLmxvY2FsZV90aW1lLmFfd2Vla2RheVsyXSkgIT0gLTEsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXR0ZXJuX3N0cmluZy5maW5kKHNlbGYubG9jYWxlX3RpbWUuYV93ZWVrZGF5WzJdKSAhPSAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICJkaWQgbm90IGZpbmQgYWJicmV2aWF0ZWQgd2Vla2RheSBpbiBwYXR0ZXJuIHN0cmluZyAnJXMnIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybl9zdHJpbmcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhwYXR0ZXJuX3N0cmluZy5maW5kKHNlbGYubG9jYWxlX3RpbWUuZl93ZWVrZGF5WzRdKSAhPSAtMSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHBhdHRlcm5fc3RyaW5nLmZpbmQoc2VsZi5sb2NhbGVfdGltZS5mX3dlZWtkYXlbNF0pICE9IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgImRpZCBub3QgZmluZCBmdWxsIHdlZWtkYXkgaW4gcGF0dGVybiBzdHJpbmcgJyVzJyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5fc3RyaW5nKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocGF0dGVybl9zdHJpbmcuZmluZChzZWxmLnRpbWVfcmVbJ2QnXSkgIT0gLTEsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwYXR0ZXJuX3N0cmluZy5maW5kKHNlbGYudGltZV9yZVsnZCddKSAhPSAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICJkaWQgbm90IGZpbmQgJ2QnIGRpcmVjdGl2ZSBwYXR0ZXJuIHN0cmluZyAnJXMnIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybl9zdHJpbmcpCiAKQEAgLTEzMywyMyArMTMzLDIzIEBACiAgICAgICAgICMgTWFrZSBzdXJlIGFueSBjaGFyYWN0ZXJzIGluIHRoZSBmb3JtYXQgc3RyaW5nIHRoYXQgbWlnaHQgYmUgdGFrZW4gYXMKICAgICAgICAgIyByZWdleCBzeW50YXggaXMgZXNjYXBlZC4KICAgICAgICAgcGF0dGVybl9zdHJpbmcgPSBzZWxmLnRpbWVfcmUucGF0dGVybigiXGQrIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHIiXFxkXCsiIGluIHBhdHRlcm5fc3RyaW5nLAorICAgICAgICBzZWxmLmFzc2VydFRydWUociJcXGRcKyIgaW4gcGF0dGVybl9zdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgZG9lcyBub3QgaGF2ZSByZSBjaGFyYWN0ZXJzIGVzY2FwZWQgcHJvcGVybHkiICUKICAgICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm5fc3RyaW5nKQogCiAgICAgZGVmIHRlc3RfY29tcGlsZShzZWxmKToKICAgICAgICAgIyBDaGVjayB0aGF0IGNvbXBpbGVkIHJlZ2V4IGlzIGNvcnJlY3QKICAgICAgICAgZm91bmQgPSBzZWxmLnRpbWVfcmUuY29tcGlsZShyIiVBIikubWF0Y2goc2VsZi5sb2NhbGVfdGltZS5mX3dlZWtkYXlbNl0pCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmb3VuZCBhbmQgZm91bmQuZ3JvdXAoJ0EnKSA9PSBzZWxmLmxvY2FsZV90aW1lLmZfd2Vla2RheVs2XSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvdW5kIGFuZCBmb3VuZC5ncm91cCgnQScpID09IHNlbGYubG9jYWxlX3RpbWUuZl93ZWVrZGF5WzZdLAogICAgICAgICAgICAgICAgICAgICAgICAgInJlIG9iamVjdCBmb3IgJyVBJyBmYWlsZWQiKQogICAgICAgICBjb21waWxlZCA9IHNlbGYudGltZV9yZS5jb21waWxlKHIiJWEgJWIiKQogICAgICAgICBmb3VuZCA9IGNvbXBpbGVkLm1hdGNoKCIlcyAlcyIgJSAoc2VsZi5sb2NhbGVfdGltZS5hX3dlZWtkYXlbNF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5sb2NhbGVfdGltZS5hX21vbnRoWzRdKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGZvdW5kLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm91bmQsCiAgICAgICAgICAgICAiTWF0Y2ggZmFpbGVkIHdpdGggJyVzJyByZWdleCBhbmQgJyVzJyBzdHJpbmciICUKICAgICAgICAgICAgICAoY29tcGlsZWQucGF0dGVybiwgIiVzICVzIiAlIChzZWxmLmxvY2FsZV90aW1lLmFfd2Vla2RheVs0XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxvY2FsZV90aW1lLmFfbW9udGhbNF0pKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGZvdW5kLmdyb3VwKCdhJykgPT0gc2VsZi5sb2NhbGVfdGltZS5hX3dlZWtkYXlbNF0gYW5kCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3VuZC5ncm91cCgnYScpID09IHNlbGYubG9jYWxlX3RpbWUuYV93ZWVrZGF5WzRdIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kLmdyb3VwKCdiJykgPT0gc2VsZi5sb2NhbGVfdGltZS5hX21vbnRoWzRdLAogICAgICAgICAgICAgICAgICAgICAgICAgInJlIG9iamVjdCBjb3VsZG4ndCBmaW5kIHRoZSBhYmJyZXZpYXRlZCB3ZWVrZGF5IG1vbnRoIGluICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiJyVzJyB1c2luZyAnJXMnOyBncm91cCAnYScgPSAnJXMnLCBncm91cCAnYicgPSAlcyciICUKQEAgLTE1OSw3ICsxNTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAnVScsJ3cnLCdXJywneCcsJ1gnLCd5JywnWScsJ1onLCclJyk6CiAgICAgICAgICAgICBjb21waWxlZCA9IHNlbGYudGltZV9yZS5jb21waWxlKCIlIiArIGRpcmVjdGl2ZSkKICAgICAgICAgICAgIGZvdW5kID0gY29tcGlsZWQubWF0Y2godGltZS5zdHJmdGltZSgiJSIgKyBkaXJlY3RpdmUpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGZvdW5kLCAiTWF0Y2hpbmcgZmFpbGVkIG9uICclcycgdXNpbmcgJyVzJyByZWdleCIgJQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZvdW5kLCAiTWF0Y2hpbmcgZmFpbGVkIG9uICclcycgdXNpbmcgJyVzJyByZWdleCIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWUuc3RyZnRpbWUoIiUiICsgZGlyZWN0aXZlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZC5wYXR0ZXJuKSkKIApAQCAtMTY4LDE0ICsxNjgsMTQgQEAKICAgICAgICAgIyBGaXhlcyBidWcgIzY2MTM1NAogICAgICAgICB0ZXN0X2xvY2FsZSA9IF9zdHJwdGltZS5Mb2NhbGVUaW1lKCkKICAgICAgICAgdGVzdF9sb2NhbGUudGltZXpvbmUgPSAoZnJvemVuc2V0KCksIGZyb3plbnNldCgpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoX3N0cnB0aW1lLlRpbWVSRSh0ZXN0X2xvY2FsZSkucGF0dGVybigiJVoiKSA9PSAnJywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9zdHJwdGltZS5UaW1lUkUodGVzdF9sb2NhbGUpLnBhdHRlcm4oIiVaIikgPT0gJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCB0aW1lem9uZSA9PSAoJycsJycpLCBUaW1lUkUoKS5wYXR0ZXJuKCclWicpICE9ICcnIikKIAogICAgIGRlZiB0ZXN0X21hdGNoaW5nX3dpdGhfZXNjYXBlcyhzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgYSBmb3JtYXQgdGhhdCByZXF1aXJlcyBlc2NhcGluZyBvZiBjaGFyYWN0ZXJzIHdvcmtzCiAgICAgICAgIGNvbXBpbGVkX3JlID0gc2VsZi50aW1lX3JlLmNvbXBpbGUoIlx3KyAlbSIpCiAgICAgICAgIGZvdW5kID0gY29tcGlsZWRfcmUubWF0Y2goIlx3KyAxMCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmb3VuZCwgIkVzY2FwaW5nIGZhaWxlZCBvZiBmb3JtYXQgJ1x3KyAxMCciKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm91bmQsICJFc2NhcGluZyBmYWlsZWQgb2YgZm9ybWF0ICdcdysgMTAnIikKIAogICAgIGRlZiB0ZXN0X2xvY2FsZV9kYXRhX3dfcmVnZXhfbWV0YWNoYXJhY3RlcnMoc2VsZik6CiAgICAgICAgICMgQ2hlY2sgdGhhdCBpZiBsb2NhbGUgZGF0YSBjb250YWlucyByZWdleCBtZXRhY2hhcmFjdGVycyB0aGV5IGFyZQpAQCAtMTg2LDcgKzE4Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb2t5byAoc3RhbmRhcmQgdGltZSkiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb3plbnNldCgiVG9reW8gKGRheWxpZ2h0IHRpbWUpIikpCiAgICAgICAgIHRpbWVfcmUgPSBfc3RycHRpbWUuVGltZVJFKGxvY2FsZV90aW1lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3ModGltZV9yZS5jb21waWxlKCIlWiIpLm1hdGNoKCJUb2t5byAoc3RhbmRhcmQgdGltZSkiKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWVfcmUuY29tcGlsZSgiJVoiKS5tYXRjaCgiVG9reW8gKHN0YW5kYXJkIHRpbWUpIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAibG9jYWxlIGRhdGEgdGhhdCBjb250YWlucyByZWdleCBtZXRhY2hhcmFjdGVycyBpcyBub3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAiIHByb3Blcmx5IGVzY2FwZWQiKQogCkBAIC0xOTUsOCArMTk1LDggQEAKICAgICAgICAgIyBzbyBhcyB0byBub3QgYWxsb3cgdG8gc3VicGF0dGVybnMgdG8gZW5kIHVwIG5leHQgdG8gZWFjaCBvdGhlciBhbmQKICAgICAgICAgIyAic3RlYWwiIGNoYXJhY3RlcnMgZnJvbSBlYWNoIG90aGVyLgogICAgICAgICBwYXR0ZXJuID0gc2VsZi50aW1lX3JlLnBhdHRlcm4oJyVqICVIJykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG5vdCByZS5tYXRjaChwYXR0ZXJuLCAiMTgwIikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZS5tYXRjaChwYXR0ZXJuLCAiMTggMCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHJlLm1hdGNoKHBhdHRlcm4sICIxODAiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlLm1hdGNoKHBhdHRlcm4sICIxOCAwIikpCiAKIAogY2xhc3MgU3RycHRpbWVUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC0yMjksNyArMjI5LDcgQEAKICAgICAgICAgIiIiSGVscGVyIGZ4biBpbiB0ZXN0aW5nLiIiIgogICAgICAgICBzdHJmX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoIiUiICsgZGlyZWN0aXZlLCBzZWxmLnRpbWVfdHVwbGUpCiAgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cmZfb3V0cHV0LCAiJSIgKyBkaXJlY3RpdmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHJwX291dHB1dFtwb3NpdGlvbl0gPT0gc2VsZi50aW1lX3R1cGxlW3Bvc2l0aW9uXSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cnBfb3V0cHV0W3Bvc2l0aW9uXSA9PSBzZWxmLnRpbWVfdHVwbGVbcG9zaXRpb25dLAogICAgICAgICAgICAgICAgICAgICAgICAgInRlc3Rpbmcgb2YgJyVzJyBkaXJlY3RpdmUgZmFpbGVkOyAnJXMnIC0+ICVzICE9ICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZSwgc3RyZl9vdXRwdXQsIHN0cnBfb3V0cHV0W3Bvc2l0aW9uXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50aW1lX3R1cGxlW3Bvc2l0aW9uXSkpCkBAIC0yNDMsNyArMjQzLDcgQEAKICAgICAgICAgICAgIGZvciBib3VuZCBpbiBib3VuZHM6CiAgICAgICAgICAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoYm91bmQsICcleScpCiAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfcmVzdWx0ID0gY2VudHVyeSArIGludChib3VuZCkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RycF9vdXRwdXRbMF0gPT0gZXhwZWN0ZWRfcmVzdWx0LAorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dFswXSA9PSBleHBlY3RlZF9yZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIneScgdGVzdCBmYWlsZWQ7IHBhc3NlZCBpbiAnJXMnICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZCByZXR1cm5lZCAnJXMnIiAlIChib3VuZCwgc3RycF9vdXRwdXRbMF0pKQogCkBAIC0yNjEsNyArMjYxLDcgQEAKICAgICAgICAgc2VsZi5oZWxwZXIoJ0gnLCAzKQogICAgICAgICBzdHJmX291dHB1dCA9IHRpbWUuc3RyZnRpbWUoIiVJICVwIiwgc2VsZi50aW1lX3R1cGxlKQogICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJmX291dHB1dCwgIiVJICVwIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN0cnBfb3V0cHV0WzNdID09IHNlbGYudGltZV90dXBsZVszXSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cnBfb3V0cHV0WzNdID09IHNlbGYudGltZV90dXBsZVszXSwKICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0aW5nIG9mICclJUkgJSVwJyBkaXJlY3RpdmUgZmFpbGVkOyAnJXMnIC0+ICVzICE9ICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmZfb3V0cHV0LCBzdHJwX291dHB1dFszXSwgc2VsZi50aW1lX3R1cGxlWzNdKSkKIApAQCAtMjk0LDkgKzI5NCw5IEBACiAgICAgICAgICMgQ2hlY2sgZm9yIGVxdWFsIHRpbWV6b25lIG5hbWVzIGRlYWxzIHdpdGggYmFkIGxvY2FsZSBpbmZvIHdoZW4gdGhpcwogICAgICAgICAjIG9jY3VyczsgZmlyc3QgZm91bmQgaW4gRnJlZUJTRCA0LjQuCiAgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKCJVVEMiLCAiJVoiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzdHJwX291dHB1dC50bV9pc2RzdCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJwX291dHB1dC50bV9pc2RzdCwgMCkKICAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoIkdNVCIsICIlWiIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHN0cnBfb3V0cHV0LnRtX2lzZHN0LCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cnBfb3V0cHV0LnRtX2lzZHN0LCAwKQogICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gIm1hYyI6CiAgICAgICAgICAgICAjIFRpbWV6b25lcyBkb24ndCByZWFsbHkgd29yayBvbiBNYWNPUzkKICAgICAgICAgICAgIHJldHVybgpAQCAtMzA1LDExICszMDUsMTEgQEAKICAgICAgICAgc3RycF9vdXRwdXQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RyZl9vdXRwdXQsICIlWiIpCiAgICAgICAgIGxvY2FsZV90aW1lID0gX3N0cnB0aW1lLkxvY2FsZVRpbWUoKQogICAgICAgICBpZiB0aW1lLnR6bmFtZVswXSAhPSB0aW1lLnR6bmFtZVsxXSBvciBub3QgdGltZS5kYXlsaWdodDoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHJwX291dHB1dFs4XSA9PSB0aW1lX3R1cGxlWzhdLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cnBfb3V0cHV0WzhdID09IHRpbWVfdHVwbGVbOF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWV6b25lIGNoZWNrIGZhaWxlZDsgJyVzJyAtPiAlcyAhPSAlcyIgJQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyZl9vdXRwdXQsIHN0cnBfb3V0cHV0WzhdLCB0aW1lX3R1cGxlWzhdKSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHJwX291dHB1dFs4XSA9PSAtMSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJwX291dHB1dFs4XSA9PSAtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTG9jYWxlVGltZSgpLnRpbWV6b25lIGhhcyBkdXBsaWNhdGUgdmFsdWVzIGFuZCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lLmRheWxpZ2h0IGJ1dCB0aW1lem9uZSB2YWx1ZSBub3Qgc2V0IHRvIC0xIikKIApAQCAtMzI3LDcgKzMyNyw3IEBACiAgICAgICAgICAgICB0aW1lLnR6bmFtZSA9ICh0el9uYW1lLCB0el9uYW1lKQogICAgICAgICAgICAgdGltZS5kYXlsaWdodCA9IDEKICAgICAgICAgICAgIHR6X3ZhbHVlID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHR6X25hbWUsICIlWiIpWzhdCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0el92YWx1ZSwgLTEsCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR6X3ZhbHVlLCAtMSwKICAgICAgICAgICAgICAgICAgICAgIiVzIGxlYWQgdG8gYSB0aW1lem9uZSB2YWx1ZSBvZiAlcyBpbnN0ZWFkIG9mIC0xIHdoZW4gIgogICAgICAgICAgICAgICAgICAgICAidGltZS5kYXlsaWdodCBzZXQgdG8gJXMgYW5kIHBhc3NpbmcgaW4gJXMiICUKICAgICAgICAgICAgICAgICAgICAgKHRpbWUudHpuYW1lLCB0el92YWx1ZSwgdGltZS5kYXlsaWdodCwgdHpfbmFtZSkpCkBAIC0zNTQsMjUgKzM1NCwyNSBAQAogICAgICAgICAjIE1ha2Ugc3VyZSAlIHNpZ25zIGFyZSBoYW5kbGVkIHByb3Blcmx5CiAgICAgICAgIHN0cmZfb3V0cHV0ID0gdGltZS5zdHJmdGltZSgiJW0gJSUgJVkiLCBzZWxmLnRpbWVfdHVwbGUpCiAgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cmZfb3V0cHV0LCAiJW0gJSUgJVkiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc3RycF9vdXRwdXRbMF0gPT0gc2VsZi50aW1lX3R1cGxlWzBdIGFuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3RycF9vdXRwdXRbMF0gPT0gc2VsZi50aW1lX3R1cGxlWzBdIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0WzFdID09IHNlbGYudGltZV90dXBsZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kbGluZyBvZiBwZXJjZW50IHNpZ24gZmFpbGVkIikKIAogICAgIGRlZiB0ZXN0X2Nhc2VpbnNlbnNpdGl2ZShzZWxmKToKICAgICAgICAgIyBTaG91bGQgaGFuZGxlIG5hbWVzIGNhc2UtaW5zZW5zaXRpdmVseS4KICAgICAgICAgc3RyZl9vdXRwdXQgPSB0aW1lLnN0cmZ0aW1lKCIlQiIsIHNlbGYudGltZV90dXBsZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJmX291dHB1dC51cHBlcigpLCAiJUIiKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKF9zdHJwdGltZS5fc3RycHRpbWVfdGltZShzdHJmX291dHB1dC51cHBlcigpLCAiJUIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJwdGltZSBkb2VzIG5vdCBoYW5kbGUgQUxMLUNBUFMgbmFtZXMgcHJvcGVybHkiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cmZfb3V0cHV0Lmxvd2VyKCksICIlQiIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cmZfb3V0cHV0Lmxvd2VyKCksICIlQiIpLAogICAgICAgICAgICAgICAgICAgICAgICAgInN0cnB0aW1lIGRvZXMgbm90IGhhbmRsZSBsb3dlcmNhc2UgbmFtZXMgcHJvcGVybHkiKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cmZfb3V0cHV0LmNhcGl0YWxpemUoKSwgIiVCIiksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoc3RyZl9vdXRwdXQuY2FwaXRhbGl6ZSgpLCAiJUIiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJwdGltZSBkb2VzIG5vdCBoYW5kbGUgY2Fwd29yZCBuYW1lcyBwcm9wZXJseSIpCiAKICAgICBkZWYgdGVzdF9kZWZhdWx0cyhzZWxmKToKICAgICAgICAgIyBEZWZhdWx0IHJldHVybiB2YWx1ZSBzaG91bGQgYmUgKDE5MDAsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIDApCiAgICAgICAgIGRlZmF1bHRzID0gKDE5MDAsIDEsIDEsIDAsIDAsIDAsIDAsIDEsIC0xKQogICAgICAgICBzdHJwX291dHB1dCA9IF9zdHJwdGltZS5fc3RycHRpbWVfdGltZSgnMScsICclbScpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzdHJwX291dHB1dCA9PSBkZWZhdWx0cywKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cnBfb3V0cHV0ID09IGRlZmF1bHRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIkRlZmF1bHQgdmFsdWVzIGZvciBzdHJwdGltZSgpIGFyZSBpbmNvcnJlY3Q7IgogICAgICAgICAgICAgICAgICAgICAgICAgIiAlcyAhPSAlcyIgJSAoc3RycF9vdXRwdXQsIGRlZmF1bHRzKSkKIApAQCAtMzgzLDcgKzM4Myw3IEBACiAgICAgICAgICMgZXNjYXBlZC4KICAgICAgICAgIyBUZXN0IGluc3RpZ2F0ZWQgYnkgYnVnICM3OTYxNDkgLgogICAgICAgICBuZWVkX2VzY2FwaW5nID0gIi5eJCorP3t9XFtdfCkoIgotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKG5lZWRfZXNjYXBpbmcsIG5lZWRfZXNjYXBpbmcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKG5lZWRfZXNjYXBpbmcsIG5lZWRfZXNjYXBpbmcpKQogCiBjbGFzcyBTdHJwdGltZTEyQU1QTVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAiIiJUZXN0IGEgX3N0cnB0aW1lIHJlZ3Jlc3Npb24gaW4gJyVJICVwJyBhdCAxMiBub29uICgxMiBQTSkiIiIKQEAgLTQxNiw3ICs0MTYsNyBAQAogICAgICAgICBmb3JtYXRfc3RyaW5nID0gIiVZICVtICVkICVIICVNICVTICV3ICVaIgogICAgICAgICByZXN1bHQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUodGltZS5zdHJmdGltZShmb3JtYXRfc3RyaW5nLCBzZWxmLnRpbWVfdHVwbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3N0cmluZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlc3VsdC50bV95ZGF5ID09IHNlbGYudGltZV90dXBsZS50bV95ZGF5LAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0LnRtX3lkYXkgPT0gc2VsZi50aW1lX3R1cGxlLnRtX3lkYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FsY3VsYXRpb24gb2YgdG1feWRheSBmYWlsZWQ7ICVzICE9ICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc3VsdC50bV95ZGF5LCBzZWxmLnRpbWVfdHVwbGUudG1feWRheSkpCiAKQEAgLTQyNSw3ICs0MjUsNyBAQAogICAgICAgICBmb3JtYXRfc3RyaW5nID0gIiVZICVIICVNICVTICV3ICVqICVaIgogICAgICAgICByZXN1bHQgPSBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUodGltZS5zdHJmdGltZShmb3JtYXRfc3RyaW5nLCBzZWxmLnRpbWVfdHVwbGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3N0cmluZykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJlc3VsdC50bV95ZWFyID09IHNlbGYudGltZV90dXBsZS50bV95ZWFyIGFuZAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVzdWx0LnRtX3llYXIgPT0gc2VsZi50aW1lX3R1cGxlLnRtX3llYXIgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnRtX21vbiA9PSBzZWxmLnRpbWVfdHVwbGUudG1fbW9uIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC50bV9tZGF5ID09IHNlbGYudGltZV90dXBsZS50bV9tZGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGN1bGF0aW9uIG9mIEdyZWdvcmlhbiBkYXRlIGZhaWxlZDsiCkBAIC00MzksNyArNDM5LDcgQEAKICAgICAgICAgZm9ybWF0X3N0cmluZyA9ICIlWSAlbSAlZCAlSCAlUyAlaiAlWiIKICAgICAgICAgcmVzdWx0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHRpbWUuc3RyZnRpbWUoZm9ybWF0X3N0cmluZywgc2VsZi50aW1lX3R1cGxlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9zdHJpbmcpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXN1bHQudG1fd2RheSA9PSBzZWxmLnRpbWVfdHVwbGUudG1fd2RheSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc3VsdC50bV93ZGF5ID09IHNlbGYudGltZV90dXBsZS50bV93ZGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgIkNhbGN1bGF0aW9uIG9mIGRheSBvZiB0aGUgd2VlayBmYWlsZWQ7IgogICAgICAgICAgICAgICAgICAgICAgICAgICIlcyAhPSAlcyIgJSAocmVzdWx0LnRtX3dkYXksIHNlbGYudGltZV90dXBsZS50bV93ZGF5KSkKIApAQCAtNDUyLDcgKzQ1Miw3IEBACiAgICAgICAgICAgICAgICAgZHRfZGF0ZSA9IGRhdGV0aW1lX2RhdGUoKnltZF90dXBsZSkKICAgICAgICAgICAgICAgICBzdHJwX2lucHV0ID0gZHRfZGF0ZS5zdHJmdGltZShmb3JtYXRfc3RyaW5nKQogICAgICAgICAgICAgICAgIHN0cnBfb3V0cHV0ID0gX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKHN0cnBfaW5wdXQsIGZvcm1hdF9zdHJpbmcpCi0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHN0cnBfb3V0cHV0WzozXSA9PSB5bWRfdHVwbGUsCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN0cnBfb3V0cHV0WzozXSA9PSB5bWRfdHVwbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJXMpIHRlc3QgZmFpbGVkIHcvICclcyc6ICVzICE9ICVzICglcyAhPSAlcykiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGVzdF9yZWFzb24sIGRpcmVjdGl2ZSwgc3RycF9pbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RycF9vdXRwdXRbOjNdLCB5bWRfdHVwbGUsCkBAIC00OTUsOCArNDk1LDggQEAKICAgICAgICAgX3N0cnB0aW1lLl9UaW1lUkVfY2FjaGUubG9jYWxlX3RpbWUubGFuZyA9ICJOaSIKICAgICAgICAgb3JpZ2luYWxfdGltZV9yZSA9IGlkKF9zdHJwdGltZS5fVGltZVJFX2NhY2hlKQogICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoIjEwIiwgIiVkIikKLSAgICAgICAgc2VsZi5mYWlsSWZFcXVhbChvcmlnaW5hbF90aW1lX3JlLCBpZChfc3RycHRpbWUuX1RpbWVSRV9jYWNoZSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihfc3RycHRpbWUuX3JlZ2V4X2NhY2hlKSwgMSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChvcmlnaW5hbF90aW1lX3JlLCBpZChfc3RycHRpbWUuX1RpbWVSRV9jYWNoZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKF9zdHJwdGltZS5fcmVnZXhfY2FjaGUpLCAxKQogCiAgICAgZGVmIHRlc3RfcmVnZXhfY2xlYW51cChzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgY2FjaGVkIHJlZ2V4ZXMgYXJlIGRpc2NhcmRlZCB3aGVuIGNhY2hlIGJlY29tZXMgImZ1bGwiLgpAQCAtNTA5LDcgKzUwOSw3IEBACiAgICAgICAgICAgICBfc3RycHRpbWUuX3JlZ2V4X2NhY2hlW2JvZ3VzX2tleV0gPSBOb25lCiAgICAgICAgICAgICBib2d1c19rZXkgKz0gMQogICAgICAgICBfc3RycHRpbWUuX3N0cnB0aW1lX3RpbWUoIjEwIiwgIiVkIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKF9zdHJwdGltZS5fcmVnZXhfY2FjaGUpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihfc3RycHRpbWUuX3JlZ2V4X2NhY2hlKSwgMSkKIAogICAgIGRlZiB0ZXN0X25ld19sb2NhbGV0aW1lKHNlbGYpOgogICAgICAgICAjIEEgbmV3IExvY2FsZVRpbWUgaW5zdGFuY2Ugc2hvdWxkIGJlIGNyZWF0ZWQgd2hlbiBhIG5ldyBUaW1lUkUgb2JqZWN0CkBAIC01MTcsNyArNTE3LDcgQEAKICAgICAgICAgbG9jYWxlX3RpbWVfaWQgPSBpZChfc3RycHRpbWUuX1RpbWVSRV9jYWNoZS5sb2NhbGVfdGltZSkKICAgICAgICAgX3N0cnB0aW1lLl9UaW1lUkVfY2FjaGUubG9jYWxlX3RpbWUubGFuZyA9ICJOaSIKICAgICAgICAgX3N0cnB0aW1lLl9zdHJwdGltZV90aW1lKCIxMCIsICIlZCIpCi0gICAgICAgIHNlbGYuZmFpbElmRXF1YWwobG9jYWxlX3RpbWVfaWQsCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwobG9jYWxlX3RpbWVfaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQoX3N0cnB0aW1lLl9UaW1lUkVfY2FjaGUubG9jYWxlX3RpbWUpKQogCiAgICAgZGVmIHRlc3RfVGltZVJFX3JlY3JlYXRpb24oc2VsZik6CkBAIC01MzgsNyArNTM4LDcgQEAKICAgICAgICAgICAgICAgICAjIEdldCB0aGUgbmV3IGNhY2hlIG9iamVjdCdzIGlkLgogICAgICAgICAgICAgICAgIHNlY29uZF90aW1lX3JlX2lkID0gaWQoX3N0cnB0aW1lLl9UaW1lUkVfY2FjaGUpCiAgICAgICAgICAgICAgICAgIyBUaGV5IHNob3VsZCBub3QgYmUgZXF1YWwuCi0gICAgICAgICAgICAgICAgc2VsZi5mYWlsSWZFcXVhbChmaXJzdF90aW1lX3JlX2lkLCBzZWNvbmRfdGltZV9yZV9pZCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGZpcnN0X3RpbWVfcmVfaWQsIHNlY29uZF90aW1lX3JlX2lkKQogICAgICAgICAgICAgIyBQb3NzaWJsZSB0ZXN0IGxvY2FsZSBpcyBub3Qgc3VwcG9ydGVkIHdoaWxlIGluaXRpYWwgbG9jYWxlIGlzLgogICAgICAgICAgICAgIyBJZiB0aGlzIGlzIHRoZSBjYXNlIGp1c3Qgc3VwcHJlc3MgdGhlIGV4Y2VwdGlvbiBhbmQgZmFsbC10aHJvdWdoCiAgICAgICAgICAgICAjIHRvIHRoZSByZXNldGluZyB0byB0aGUgb3JpZ2luYWwgbG9jYWxlLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdHJ1Y3QucHkgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQppbmRleCAxY2YzNDg0Li5lZjA1ZTNjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N0cnVjdC5weQpAQCAtMTgxLDcgKzE4MSw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHJ1Y3QuY2FsY3NpemUoeGZtdCksIGxlbihyZXMpKQogICAgICAgICAgICAgICAgIHJldiA9IHN0cnVjdC51bnBhY2soeGZtdCwgcmVzKVswXQogICAgICAgICAgICAgICAgIGlmIHJldiAhPSBhcmc6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhhc3kpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhc3kpCiAKICAgICBkZWYgdGVzdF9uYXRpdmVfcVEoc2VsZik6CiAgICAgICAgICMgY2FuJ3QgcGFjayAtMSBhcyB1bnNpZ25lZCByZWdhcmRsZXNzCkBAIC0yNTIsNyArMjUyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBsb25nKHgpCiAgICAgICAgICAgICAgICAgICAgIGlmIHggPCAwOgogICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgKz0gMUwgPDwgc2VsZi5iaXRzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oZXhwZWN0ZWQgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV4cGVjdGVkID4gMCkKICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQgPSBoZXgoZXhwZWN0ZWQpWzI6LTFdICMgY2hvcCAiMHgiIGFuZCB0cmFpbGluZyAnTCcKICAgICAgICAgICAgICAgICAgICAgaWYgbGVuKGV4cGVjdGVkKSAmIDE6CiAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9ICIwIiArIGV4cGVjdGVkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0cnVjdHNlcS5weSBiL0xpYi90ZXN0L3Rlc3Rfc3RydWN0c2VxLnB5CmluZGV4IDgzYzdjY2YuLjU3ODNjY2IgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3RydWN0c2VxLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3RydWN0c2VxLnB5CkBAIC0yOCw3ICsyOCw3IEBACiAKICAgICBkZWYgdGVzdF9yZXByKHNlbGYpOgogICAgICAgICB0ID0gdGltZS5nbXRpbWUoKQotICAgICAgICBzZWxmLmFzc2VydF8ocmVwcih0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlcHIodCkpCiAgICAgICAgIHQgPSB0aW1lLmdtdGltZSgwKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcHIodCksCiAgICAgICAgICAgICAidGltZS5zdHJ1Y3RfdGltZSh0bV95ZWFyPTE5NzAsIHRtX21vbj0xLCB0bV9tZGF5PTEsIHRtX2hvdXI9MCwgIgpAQCAtNTAsOCArNTAsOCBAQAogICAgIGRlZiB0ZXN0X2NvbnRhaW5zKHNlbGYpOgogICAgICAgICB0MSA9IHRpbWUuZ210aW1lKCkKICAgICAgICAgZm9yIGl0ZW0gaW4gdDE6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXRlbSBpbiB0MSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKC00MiBub3QgaW4gdDEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXRlbSBpbiB0MSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC00MiBub3QgaW4gdDEpCiAKICAgICBkZWYgdGVzdF9oYXNoKHNlbGYpOgogICAgICAgICB0MSA9IHRpbWUuZ210aW1lKCkKQEAgLTYxLDExICs2MSwxMSBAQAogICAgICAgICB0MSA9IHRpbWUuZ210aW1lKCkKICAgICAgICAgdDIgPSB0eXBlKHQxKSh0MSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0MSwgdDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKHQxIDwgdDIpKQotICAgICAgICBzZWxmLmFzc2VydF8odDEgPD0gdDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKHQxID4gdDIpKQotICAgICAgICBzZWxmLmFzc2VydF8odDEgPj0gdDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKHQxICE9IHQyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAodDEgPCB0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA8PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAodDEgPiB0MikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MSA+PSB0MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCAodDEgIT0gdDIpKQogCiAgICAgZGVmIHRlc3RfZmllbGRzKHNlbGYpOgogICAgICAgICB0ID0gdGltZS5nbXRpbWUoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5IGIvTGliL3Rlc3QvdGVzdF9zdWJwcm9jZXNzLnB5CmluZGV4IDBkZGFjM2QuLmM0NDFjZGMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc3VicHJvY2Vzcy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N1YnByb2Nlc3MucHkKQEAgLTQ5Nyw3ICs0OTcsNyBAQAogICAgICAgICAjIGJ1dCwgYmFzZWQgb24gc3lzdGVtIHNjaGVkdWxpbmcgd2UgY2FuJ3QgY29udHJvbCwgaXQncyBwb3NzaWJsZQogICAgICAgICAjIHBvbGwoKSBuZXZlciByZXR1cm5lZCBOb25lLiAgSXQgInNob3VsZCBiZSIgdmVyeSByYXJlIHRoYXQgaXQKICAgICAgICAgIyBkaWRuJ3QgZ28gYXJvdW5kIGF0IGxlYXN0IHR3aWNlLgotICAgICAgICBzZWxmLmFzc2VydF8oY291bnQgPj0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvdW50ID49IDIpCiAgICAgICAgICMgU3Vic2VxdWVudCBpbnZvY2F0aW9ucyBzaG91bGQganVzdCByZXR1cm4gdGhlIHJldHVybmNvZGUKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvbGwoKSwgMCkKIApAQCAtNjUyLDcgKzY1Miw3IEBACiAgICAgICAgICAgICBwID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLWMiLCAiaW5wdXQoKSJdKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocC5wb2xsKCkgaXMgTm9uZSwgcC5wb2xsKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocC5wb2xsKCkgaXMgTm9uZSwgcC5wb2xsKCkpCiAgICAgICAgICAgICBwLnNlbmRfc2lnbmFsKHNpZ25hbC5TSUdJTlQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHAud2FpdCgpLCAwKQogCkBAIC02NjAsNyArNjYwLDcgQEAKICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLWMiLCAiaW5wdXQoKSJdKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocC5wb2xsKCkgaXMgTm9uZSwgcC5wb2xsKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocC5wb2xsKCkgaXMgTm9uZSwgcC5wb2xsKCkpCiAgICAgICAgICAgICBwLmtpbGwoKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLndhaXQoKSwgLXNpZ25hbC5TSUdLSUxMKQogCkBAIC02NjgsNyArNjY4LDcgQEAKICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLWMiLCAiaW5wdXQoKSJdKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocC5wb2xsKCkgaXMgTm9uZSwgcC5wb2xsKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocC5wb2xsKCkgaXMgTm9uZSwgcC5wb2xsKCkpCiAgICAgICAgICAgICBwLnRlcm1pbmF0ZSgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAud2FpdCgpLCAtc2lnbmFsLlNJR1RFUk0pCiAKQEAgLTc0Niw3ICs3NDYsNyBAQAogICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1jIiwgImlucHV0KCkiXSkKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHAucG9sbCgpIGlzIE5vbmUsIHAucG9sbCgpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAucG9sbCgpIGlzIE5vbmUsIHAucG9sbCgpKQogICAgICAgICAgICAgcC5zZW5kX3NpZ25hbChzaWduYWwuU0lHVEVSTSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwocC53YWl0KCksIDApCiAKQEAgLTc1NCw3ICs3NTQsNyBAQAogICAgICAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICItYyIsICJpbnB1dCgpIl0pCiAKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhwLnBvbGwoKSBpcyBOb25lLCBwLnBvbGwoKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwLnBvbGwoKSBpcyBOb25lLCBwLnBvbGwoKSkKICAgICAgICAgICAgIHAua2lsbCgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHAud2FpdCgpLCAwKQogCkBAIC03NjIsNyArNzYyLDcgQEAKICAgICAgICAgICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKFtzeXMuZXhlY3V0YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLWMiLCAiaW5wdXQoKSJdKQogCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocC5wb2xsKCkgaXMgTm9uZSwgcC5wb2xsKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUocC5wb2xsKCkgaXMgTm9uZSwgcC5wb2xsKCkpCiAgICAgICAgICAgICBwLnRlcm1pbmF0ZSgpCiAgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHAud2FpdCgpLCAwKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X3N1cHBvcnQucHkKaW5kZXggZGQxZjAwNS4uNGIxNGMzYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3VwcG9ydC5weQpAQCAtNzQxLDcgKzc0MSw3IEBACiAgICAgICAgICAgICAgICAgIyB0byBtYWtlIHN1cmUgdGhleSB3b3JrLiBXZSBzdGlsbCB3YW50IHRvIGF2b2lkIHVzaW5nCiAgICAgICAgICAgICAgICAgIyB0b28gbXVjaCBtZW1vcnksIHRob3VnaCwgYnV0IHdlIGRvIHRoYXQgbm9pc2lseS4KICAgICAgICAgICAgICAgICBtYXhzaXplID0gNTE0NwotICAgICAgICAgICAgICAgIHNlbGYuZmFpbElmKG1heHNpemUgKiBtZW11c2UgKyBvdmVyaGVhZCA+IDIwICogXzFNKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobWF4c2l6ZSAqIG1lbXVzZSArIG92ZXJoZWFkID4gMjAgKiBfMU0pCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIG1heHNpemUgPSBpbnQoKG1heF9tZW11c2UgLSBvdmVyaGVhZCkgLyBtZW11c2UpCiAgICAgICAgICAgICAgICAgaWYgbWF4c2l6ZSA8IG1pbnNpemU6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N5bXRhYmxlLnB5IGIvTGliL3Rlc3QvdGVzdF9zeW10YWJsZS5weQppbmRleCAyZGUzMGFlLi5jOWQyMDU0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N5bXRhYmxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc3ltdGFibGUucHkKQEAgLTEzMiw3ICsxMzIsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50b3AubG9va3VwKCJuYW1lc3BhY2VfdGVzdCIpLmlzX25hbWVzcGFjZSgpKQogICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHNlbGYuc3BhbS5sb29rdXAoIngiKS5pc19uYW1lc3BhY2UoKSkKIAotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi50b3AubG9va3VwKCJzcGFtIikuZ2V0X25hbWVzcGFjZSgpIGlzIHNlbGYuc3BhbSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYudG9wLmxvb2t1cCgic3BhbSIpLmdldF9uYW1lc3BhY2UoKSBpcyBzZWxmLnNwYW0pCiAgICAgICAgIG5zX3Rlc3QgPSBzZWxmLnRvcC5sb29rdXAoIm5hbWVzcGFjZV90ZXN0IikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obnNfdGVzdC5nZXRfbmFtZXNwYWNlcygpKSwgMikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbnNfdGVzdC5nZXRfbmFtZXNwYWNlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zeXMucHkgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQppbmRleCAzNDkzZmQxLi4wZTM2NGFmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N5cy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQpAQCAtMTksNyArMTksNyBAQAogCiAgICAgICAgIGRoKE5vbmUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LmdldHZhbHVlKCksICIiKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGhhc2F0dHIoX19idWlsdGluX18sICJfIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihfX2J1aWx0aW5fXywgIl8iKSkKICAgICAgICAgZGgoNDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3V0LmdldHZhbHVlKCksICI0MlxuIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChfX2J1aWx0aW5fXy5fLCA0MikKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgICAgICAgIGVoKCpzeXMuZXhjX2luZm8oKSkKIAogICAgICAgICBzeXMuc3RkZXJyID0gc2F2ZXN0ZGVycgotICAgICAgICBzZWxmLmFzc2VydF8oZXJyLmdldHZhbHVlKCkuZW5kc3dpdGgoIlZhbHVlRXJyb3I6IDQyXG4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVyci5nZXR2YWx1ZSgpLmVuZHN3aXRoKCJWYWx1ZUVycm9yOiA0MlxuIikpCiAKICAgICAjIEZJWE1FOiB0ZXN0aW5nIHRoZSBjb2RlIGZvciBhIGxvc3Qgb3IgcmVwbGFjZWQgZXhjZXB0aG9vayBpbgogICAgICMgUHl0aG9uL3B5dGhvbnJ1bi5jOjpQeUVycl9QcmludEV4KCkgaXMgdHJpY2t5LgpAQCAtNzEsMTYgKzcxLDE2IEBACiAgICAgICAgICMgY2hlY2sgdGhhdCBpdCB3b3JrZWQuCiAgICAgICAgIGRlZiBjbGVhcl9jaGVjayhleGMpOgogICAgICAgICAgICAgdHlwLCB2YWx1ZSwgdHJhY2ViYWNrID0gc3lzLmV4Y19pbmZvKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXAgaXMgbm90IE5vbmUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odmFsdWUgaXMgZXhjKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHRyYWNlYmFjayBpcyBub3QgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXAgaXMgbm90IE5vbmUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsdWUgaXMgZXhjKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRyYWNlYmFjayBpcyBub3QgTm9uZSkKIAogICAgICAgICAgICAgc3lzLmV4Y19jbGVhcigpCiAKICAgICAgICAgICAgIHR5cCwgdmFsdWUsIHRyYWNlYmFjayA9IHN5cy5leGNfaW5mbygpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odHlwIGlzIE5vbmUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odmFsdWUgaXMgTm9uZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0cmFjZWJhY2sgaXMgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXAgaXMgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWx1ZSBpcyBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRyYWNlYmFjayBpcyBOb25lKQogCiAgICAgICAgIGRlZiBjbGVhcigpOgogICAgICAgICAgICAgdHJ5OgpAQCAtMTAwLDEwICsxMDAsMTAgQEAKICAgICAgICAgICAgIGNsZWFyKCkKICAgICAgICAgICAgIHR5cDIsIHZhbHVlMiwgdHJhY2ViYWNrMiA9IHN5cy5leGNfaW5mbygpCiAKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXAxIGlzIHR5cDIpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odmFsdWUxIGlzIGV4YykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2YWx1ZTEgaXMgdmFsdWUyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHRyYWNlYmFjazEgaXMgdHJhY2ViYWNrMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXAxIGlzIHR5cDIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodmFsdWUxIGlzIGV4YykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2YWx1ZTEgaXMgdmFsdWUyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRyYWNlYmFjazEgaXMgdHJhY2ViYWNrMikKIAogICAgICAgICAjIENoZWNrIHRoYXQgYW4gZXhjZXB0aW9uIGNhbiBiZSBjbGVhcmVkIG91dHNpZGUgb2YgYW4gZXhjZXB0IGJsb2NrCiAgICAgICAgIGNsZWFyX2NoZWNrKGV4YykKQEAgLTE3OCw3ICsxNzgsNyBAQAogICAgICAgICBpZiB0ZXN0LnRlc3Rfc3VwcG9ydC5oYXZlX3VuaWNvZGU6CiAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHN5cy5nZXRkZWZhdWx0ZW5jb2RpbmcsIDQyKQogICAgICAgICAgICAgIyBjYW4ndCBjaGVjayBtb3JlIHRoYW4gdGhlIHR5cGUsIGFzIHRoZSB1c2VyIG1pZ2h0IGhhdmUgY2hhbmdlZCBpdAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc3lzLmdldGRlZmF1bHRlbmNvZGluZygpLCBzdHIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3lzLmdldGRlZmF1bHRlbmNvZGluZygpLCBzdHIpKQogCiAgICAgIyB0ZXN0aW5nIHN5cy5zZXR0cmFjZSgpIGlzIGRvbmUgaW4gdGVzdF90cmFjZS5weQogICAgICMgdGVzdGluZyBzeXMuc2V0cHJvZmlsZSgpIGlzIGRvbmUgaW4gdGVzdF9wcm9maWxlLnB5CkBAIC0yMDIsMTcgKzIwMiwxNyBAQAogICAgIGRlZiB0ZXN0X2dldHdpbmRvd3N2ZXJzaW9uKHNlbGYpOgogICAgICAgICBpZiBoYXNhdHRyKHN5cywgImdldHdpbmRvd3N2ZXJzaW9uIik6CiAgICAgICAgICAgICB2ID0gc3lzLmdldHdpbmRvd3N2ZXJzaW9uKCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHYsIHR1cGxlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHYsIHR1cGxlKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHYpLCA1KQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodlswXSwgaW50KSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHZbMV0sIGludCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh2WzJdLCBpbnQpKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodlszXSwgaW50KSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHZbNF0sIHN0cikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2WzBdLCBpbnQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodlsxXSwgaW50KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZbMl0sIGludCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2WzNdLCBpbnQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uodls0XSwgc3RyKSkKIAogICAgIGRlZiB0ZXN0X2Rsb3BlbmZsYWdzKHNlbGYpOgogICAgICAgICBpZiBoYXNhdHRyKHN5cywgInNldGRsb3BlbmZsYWdzIik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihzeXMsICJnZXRkbG9wZW5mbGFncyIpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc3lzLCAiZ2V0ZGxvcGVuZmxhZ3MiKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLmdldGRsb3BlbmZsYWdzLCA0MikKICAgICAgICAgICAgIG9sZGZsYWdzID0gc3lzLmdldGRsb3BlbmZsYWdzKCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc3lzLnNldGRsb3BlbmZsYWdzKQpAQCAtMjMzLDEyICsyMzMsMTIgQEAKICAgICAgICAgZGVsIG4KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuZ2V0cmVmY291bnQoTm9uZSksIGMpCiAgICAgICAgIGlmIGhhc2F0dHIoc3lzLCAiZ2V0dG90YWxyZWZjb3VudCIpOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc3lzLmdldHRvdGFscmVmY291bnQoKSwgaW50KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN5cy5nZXR0b3RhbHJlZmNvdW50KCksIGludCkpCiAKICAgICBkZWYgdGVzdF9nZXRmcmFtZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzeXMuX2dldGZyYW1lLCA0MiwgNDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHN5cy5fZ2V0ZnJhbWUsIDIwMDAwMDAwMDApCi0gICAgICAgIHNlbGYuYXNzZXJ0XygKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKAogICAgICAgICAgICAgU3lzTW9kdWxlVGVzdC50ZXN0X2dldGZyYW1lLmltX2Z1bmMuZnVuY19jb2RlIFwKICAgICAgICAgICAgIGlzIHN5cy5fZ2V0ZnJhbWUoKS5mX2NvZGUKICAgICAgICAgKQpAQCAtMjg5LDEyICsyODksMTIgQEAKICAgICAgICAgZCA9IHN5cy5fY3VycmVudF9mcmFtZXMoKQogCiAgICAgICAgIG1haW5faWQgPSB0aHJlYWQuZ2V0X2lkZW50KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1haW5faWQgaW4gZCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRocmVhZF9pZCBpbiBkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobWFpbl9pZCBpbiBkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGhyZWFkX2lkIGluIGQpCiAKICAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgY2FwdHVyZWQgbWFpbi10aHJlYWQgZnJhbWUgaXMgX3RoaXNfIGZyYW1lLgogICAgICAgICBmcmFtZSA9IGQucG9wKG1haW5faWQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhmcmFtZSBpcyBzeXMuX2dldGZyYW1lKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmcmFtZSBpcyBzeXMuX2dldGZyYW1lKCkpCiAKICAgICAgICAgIyBWZXJpZnkgdGhhdCB0aGUgY2FwdHVyZWQgdGhyZWFkIGZyYW1lIGlzIGJsb2NrZWQgaW4gZzQ1NiwgY2FsbGVkCiAgICAgICAgICMgZnJvbSBmMTIzLiAgVGhpcyBpcyBhIGxpdHRlIHRyaWNreSwgc2luY2UgdmFyaW91cyBiaXRzIG9mCkBAIC0zMTIsNyArMzEyLDcgQEAKICAgICAgICAgIyBBbmQgdGhlIG5leHQgcmVjb3JkIG11c3QgYmUgZm9yIGc0NTYoKS4KICAgICAgICAgZmlsZW5hbWUsIGxpbmVubywgZnVuY25hbWUsIHNvdXJjZWxpbmUgPSBzdGFja1tpKzFdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZnVuY25hbWUsICJnNDU2IikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNvdXJjZWxpbmUgaW4gWyJsZWF2ZV9nLndhaXQoKSIsICJlbnRlcmVkX2cuc2V0KCkiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvdXJjZWxpbmUgaW4gWyJsZWF2ZV9nLndhaXQoKSIsICJlbnRlcmVkX2cuc2V0KCkiXSkKIAogICAgICAgICAjIFJlYXAgdGhlIHNwYXduZWQgdGhyZWFkLgogICAgICAgICBsZWF2ZV9nLnNldCgpCkBAIC0zMjQsNjcgKzMyNCw2NyBAQAogICAgICAgICAjICJ0aHJlYWQgaWQiIDAuCiAgICAgICAgIGQgPSBzeXMuX2N1cnJlbnRfZnJhbWVzKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oZCksIDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygwIGluIGQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkWzBdIGlzIHN5cy5fZ2V0ZnJhbWUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDAgaW4gZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRbMF0gaXMgc3lzLl9nZXRmcmFtZSgpKQogCiAgICAgZGVmIHRlc3RfYXR0cmlidXRlcyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc3lzLmFwaV92ZXJzaW9uLCBpbnQpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzeXMuYXJndiwgbGlzdCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzeXMuYnl0ZW9yZGVyIGluICgibGl0dGxlIiwgImJpZyIpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMsIHR1cGxlKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc3lzLmNvcHlyaWdodCwgYmFzZXN0cmluZykpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHN5cy5leGVjX3ByZWZpeCwgYmFzZXN0cmluZykpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHN5cy5leGVjdXRhYmxlLCBiYXNlc3RyaW5nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3lzLmFwaV92ZXJzaW9uLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzeXMuYXJndiwgbGlzdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzeXMuYnl0ZW9yZGVyIGluICgibGl0dGxlIiwgImJpZyIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXMsIHR1cGxlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3lzLmNvcHlyaWdodCwgYmFzZXN0cmluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN5cy5leGVjX3ByZWZpeCwgYmFzZXN0cmluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN5cy5leGVjdXRhYmxlLCBiYXNlc3RyaW5nKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc3lzLmZsb2F0X2luZm8pLCAxMSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzeXMuZmxvYXRfaW5mby5yYWRpeCwgMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc3lzLmxvbmdfaW5mbyksIDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzeXMubG9uZ19pbmZvLmJpdHNfcGVyX2RpZ2l0ICUgNSA9PSAwKQotICAgICAgICBzZWxmLmFzc2VydF8oc3lzLmxvbmdfaW5mby5zaXplb2ZfZGlnaXQgPj0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHN5cy5sb25nX2luZm8uYml0c19wZXJfZGlnaXQgJSA1ID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzeXMubG9uZ19pbmZvLnNpemVvZl9kaWdpdCA+PSAxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR5cGUoc3lzLmxvbmdfaW5mby5iaXRzX3Blcl9kaWdpdCksIGludCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHN5cy5sb25nX2luZm8uc2l6ZW9mX2RpZ2l0KSwgaW50KQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzeXMuaGV4dmVyc2lvbiwgaW50KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc3lzLm1heGludCwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3lzLmhleHZlcnNpb24sIGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN5cy5tYXhpbnQsIGludCkpCiAgICAgICAgIGlmIHRlc3QudGVzdF9zdXBwb3J0LmhhdmVfdW5pY29kZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHN5cy5tYXh1bmljb2RlLCBpbnQpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzeXMucGxhdGZvcm0sIGJhc2VzdHJpbmcpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzeXMucHJlZml4LCBiYXNlc3RyaW5nKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uoc3lzLnZlcnNpb24sIGJhc2VzdHJpbmcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc3lzLm1heHVuaWNvZGUsIGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN5cy5wbGF0Zm9ybSwgYmFzZXN0cmluZykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN5cy5wcmVmaXgsIGJhc2VzdHJpbmcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzeXMudmVyc2lvbiwgYmFzZXN0cmluZykpCiAgICAgICAgIHZpID0gc3lzLnZlcnNpb25faW5mbwotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh2aVs6XSwgdHVwbGUpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2aVs6XSwgdHVwbGUpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2aSksIDUpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHZpWzBdLCBpbnQpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh2aVsxXSwgaW50KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodmlbMl0sIGludCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh2aVszXSBpbiAoImFscGhhIiwgImJldGEiLCAiY2FuZGlkYXRlIiwgImZpbmFsIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHZpWzRdLCBpbnQpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh2aS5tYWpvciwgaW50KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodmkubWlub3IsIGludCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHZpLm1pY3JvLCBpbnQpKQotICAgICAgICBzZWxmLmFzc2VydF8odmkucmVsZWFzZWxldmVsIGluCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZpWzBdLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2aVsxXSwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmlbMl0sIGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2aVszXSBpbiAoImFscGhhIiwgImJldGEiLCAiY2FuZGlkYXRlIiwgImZpbmFsIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZpWzRdLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh2aS5tYWpvciwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodmkubWlub3IsIGludCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHZpLm1pY3JvLCBpbnQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodmkucmVsZWFzZWxldmVsIGluCiAgICAgICAgICAgICAgICAgICAgICAoImFscGhhIiwgImJldGEiLCAiY2FuZGlkYXRlIiwgImZpbmFsIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHZpLnNlcmlhbCwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uodmkuc2VyaWFsLCBpbnQpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZpWzBdLCB2aS5tYWpvcikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2aVsxXSwgdmkubWlub3IpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmlbMl0sIHZpLm1pY3JvKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHZpWzNdLCB2aS5yZWxlYXNlbGV2ZWwpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmlbNF0sIHZpLnNlcmlhbCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHZpID4gKDEsMCwwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZpID4gKDEsMCwwKSkKIAogICAgIGRlZiB0ZXN0XzQzNTgxKHNlbGYpOgogICAgICAgICAjIENhbid0IHVzZSBzeXMuc3Rkb3V0LCBhcyB0aGlzIGlzIGEgY1N0cmluZ0lPIG9iamVjdCB3aGVuCiAgICAgICAgICMgdGhlIHRlc3QgcnVucyB1bmRlciByZWdydGVzdC4KLSAgICAgICAgc2VsZi5hc3NlcnRfKHN5cy5fX3N0ZG91dF9fLmVuY29kaW5nID09IHN5cy5fX3N0ZGVycl9fLmVuY29kaW5nKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc3lzLl9fc3Rkb3V0X18uZW5jb2RpbmcgPT0gc3lzLl9fc3RkZXJyX18uZW5jb2RpbmcpCiAKICAgICBkZWYgdGVzdF9zeXNfZmxhZ3Moc2VsZik6Ci0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhzeXMuZmxhZ3MpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzeXMuZmxhZ3MpCiAgICAgICAgIGF0dHJzID0gKCJkZWJ1ZyIsICJweTNrX3dhcm5pbmciLCAiZGl2aXNpb25fd2FybmluZyIsICJkaXZpc2lvbl9uZXciLAogICAgICAgICAgICAgICAgICAiaW5zcGVjdCIsICJpbnRlcmFjdGl2ZSIsICJvcHRpbWl6ZSIsICJkb250X3dyaXRlX2J5dGVjb2RlIiwKICAgICAgICAgICAgICAgICAgIm5vX3NpdGUiLCAiaWdub3JlX2Vudmlyb25tZW50IiwgInRhYmNoZWNrIiwgInZlcmJvc2UiLAogICAgICAgICAgICAgICAgICAidW5pY29kZSIsICJieXRlc193YXJuaW5nIikKICAgICAgICAgZm9yIGF0dHIgaW4gYXR0cnM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihzeXMuZmxhZ3MsIGF0dHIpLCBhdHRyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIoc3lzLmZsYWdzLCBhdHRyKSwgYXR0cikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShnZXRhdHRyKHN5cy5mbGFncywgYXR0cikpLCBpbnQsIGF0dHIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyZXByKHN5cy5mbGFncykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZXByKHN5cy5mbGFncykpCiAKICAgICBkZWYgdGVzdF9jbGVhcl90eXBlX2NhY2hlKHNlbGYpOgogICAgICAgICBzeXMuX2NsZWFyX3R5cGVfY2FjaGUoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5IGIvTGliL3Rlc3QvdGVzdF90YXJmaWxlLnB5CmluZGV4IGVlNjgxMTguLmFiYTIxOGQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdGFyZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RhcmZpbGUucHkKQEAgLTU4LDcgKzU4LDcgQEAKICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigidXN0YXIvcmVndHlwZSIpCiAgICAgICAgIGZvYmogPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQogICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChsZW4oZGF0YSksIG1kNXN1bShkYXRhKSkgPT0gKHRhcmluZm8uc2l6ZSwgbWQ1X3JlZ3R5cGUpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGxlbihkYXRhKSwgbWQ1c3VtKGRhdGEpKSA9PSAodGFyaW5mby5zaXplLCBtZDVfcmVndHlwZSksCiAgICAgICAgICAgICAgICAgInJlZ3VsYXIgZmlsZSBleHRyYWN0aW9uIGZhaWxlZCIpCiAKICAgICBkZWYgdGVzdF9maWxlb2JqX3JlYWRsaW5lcyhzZWxmKToKQEAgLTY5LDExICs2OSwxMSBAQAogCiAgICAgICAgIGxpbmVzMSA9IGZvYmoxLnJlYWRsaW5lcygpCiAgICAgICAgIGxpbmVzMiA9IGZvYmoyLnJlYWRsaW5lcygpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsaW5lczEgPT0gbGluZXMyLAorICAgICAgICBzZWxmLmFzc2VydFRydWUobGluZXMxID09IGxpbmVzMiwKICAgICAgICAgICAgICAgICAiZmlsZW9iai5yZWFkbGluZXMoKSBmYWlsZWQiKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGxpbmVzMikgPT0gMTE0LAorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGxpbmVzMikgPT0gMTE0LAogICAgICAgICAgICAgICAgICJmaWxlb2JqLnJlYWRsaW5lcygpIGZhaWxlZCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsaW5lczJbODNdID09IFwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzMls4M10gPT0gXAogICAgICAgICAgICAgICAgICJJIHdpbGwgZ2xhZGx5IGFkbWl0IHRoYXQgUHl0aG9uIGlzIG5vdCB0aGUgZmFzdGVzdCBydW5uaW5nIHNjcmlwdGluZyBsYW5ndWFnZS5cbiIsCiAgICAgICAgICAgICAgICAgImZpbGVvYmoucmVhZGxpbmVzKCkgZmFpbGVkIikKIApAQCAtODQsNyArODQsNyBAQAogICAgICAgICBmb2JqMiA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8pCiAgICAgICAgIGxpbmVzMSA9IGZvYmoxLnJlYWRsaW5lcygpCiAgICAgICAgIGxpbmVzMiA9IFtsaW5lIGZvciBsaW5lIGluIGZvYmoyXQotICAgICAgICBzZWxmLmFzc2VydF8obGluZXMxID09IGxpbmVzMiwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxpbmVzMSA9PSBsaW5lczIsCiAgICAgICAgICAgICAgICAgICAgICAiZmlsZW9iai5fX2l0ZXJfXygpIGZhaWxlZCIpCiAKICAgICBkZWYgdGVzdF9maWxlb2JqX3NlZWsoc2VsZik6CkBAIC05OCw0MyArOTgsNDMgQEAKIAogICAgICAgICB0ZXh0ID0gZm9iai5yZWFkKCkKICAgICAgICAgZm9iai5zZWVrKDApCi0gICAgICAgIHNlbGYuYXNzZXJ0XygwID09IGZvYmoudGVsbCgpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA9PSBmb2JqLnRlbGwoKSwKICAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gZmlsZSdzIHN0YXJ0IGZhaWxlZCIpCiAgICAgICAgIGZvYmouc2VlaygyMDQ4LCAwKQotICAgICAgICBzZWxmLmFzc2VydF8oMjA0OCA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIwNDggPT0gZm9iai50ZWxsKCksCiAgICAgICAgICAgICAgICAgICAgICAic2VlaygpIHRvIGFic29sdXRlIHBvc2l0aW9uIGZhaWxlZCIpCiAgICAgICAgIGZvYmouc2VlaygtMTAyNCwgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKDEwMjQgPT0gZm9iai50ZWxsKCksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgxMDI0ID09IGZvYmoudGVsbCgpLAogICAgICAgICAgICAgICAgICAgICAgInNlZWsoKSB0byBuZWdhdGl2ZSByZWxhdGl2ZSBwb3NpdGlvbiBmYWlsZWQiKQogICAgICAgICBmb2JqLnNlZWsoMTAyNCwgMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKDIwNDggPT0gZm9iai50ZWxsKCksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyMDQ4ID09IGZvYmoudGVsbCgpLAogICAgICAgICAgICAgICAgICAgICAgInNlZWsoKSB0byBwb3NpdGl2ZSByZWxhdGl2ZSBwb3NpdGlvbiBmYWlsZWQiKQogICAgICAgICBzID0gZm9iai5yZWFkKDEwKQotICAgICAgICBzZWxmLmFzc2VydF8ocyA9PSBkYXRhWzIwNDg6MjA1OF0sCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzID09IGRhdGFbMjA0ODoyMDU4XSwKICAgICAgICAgICAgICAgICAgICAgICJyZWFkKCkgYWZ0ZXIgc2VlayBmYWlsZWQiKQogICAgICAgICBmb2JqLnNlZWsoMCwgMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8uc2l6ZSA9PSBmb2JqLnRlbGwoKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8uc2l6ZSA9PSBmb2JqLnRlbGwoKSwKICAgICAgICAgICAgICAgICAgICAgICJzZWVrKCkgdG8gZmlsZSdzIGVuZCBmYWlsZWQiKQotICAgICAgICBzZWxmLmFzc2VydF8oZm9iai5yZWFkKCkgPT0gIiIsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb2JqLnJlYWQoKSA9PSAiIiwKICAgICAgICAgICAgICAgICAgICAgICJyZWFkKCkgYXQgZmlsZSdzIGVuZCBkaWQgbm90IHJldHVybiBlbXB0eSBzdHJpbmciKQogICAgICAgICBmb2JqLnNlZWsoLXRhcmluZm8uc2l6ZSwgMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKDAgPT0gZm9iai50ZWxsKCksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwID09IGZvYmoudGVsbCgpLAogICAgICAgICAgICAgICAgICAgICAgInJlbGF0aXZlIHNlZWsoKSB0byBmaWxlJ3Mgc3RhcnQgZmFpbGVkIikKICAgICAgICAgZm9iai5zZWVrKDUxMikKICAgICAgICAgczEgPSBmb2JqLnJlYWRsaW5lcygpCiAgICAgICAgIGZvYmouc2Vlayg1MTIpCiAgICAgICAgIHMyID0gZm9iai5yZWFkbGluZXMoKQotICAgICAgICBzZWxmLmFzc2VydF8oczEgPT0gczIsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzMSA9PSBzMiwKICAgICAgICAgICAgICAgICAgICAgICJyZWFkbGluZXMoKSBhZnRlciBzZWVrIGZhaWxlZCIpCiAgICAgICAgIGZvYmouc2VlaygwKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGZvYmoucmVhZGxpbmUoKSkgPT0gZm9iai50ZWxsKCksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZm9iai5yZWFkbGluZSgpKSA9PSBmb2JqLnRlbGwoKSwKICAgICAgICAgICAgICAgICAgICAgICJ0ZWxsKCkgYWZ0ZXIgcmVhZGxpbmUoKSBmYWlsZWQiKQogICAgICAgICBmb2JqLnNlZWsoNTEyKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGZvYmoucmVhZGxpbmUoKSkgKyA1MTIgPT0gZm9iai50ZWxsKCksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZm9iai5yZWFkbGluZSgpKSArIDUxMiA9PSBmb2JqLnRlbGwoKSwKICAgICAgICAgICAgICAgICAgICAgICJ0ZWxsKCkgYWZ0ZXIgc2VlaygpIGFuZCByZWFkbGluZSgpIGZhaWxlZCIpCiAgICAgICAgIGZvYmouc2VlaygwKQogICAgICAgICBsaW5lID0gZm9iai5yZWFkbGluZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2JqLnJlYWQoKSA9PSBkYXRhW2xlbihsaW5lKTpdLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9iai5yZWFkKCkgPT0gZGF0YVtsZW4obGluZSk6XSwKICAgICAgICAgICAgICAgICAgICAgICJyZWFkKCkgYWZ0ZXIgcmVhZGxpbmUoKSBmYWlsZWQiKQogICAgICAgICBmb2JqLmNsb3NlKCkKIApAQCAtMjA1LDcgKzIwNSw3IEBACiAgICAgICAgICMgT2xkIFY3IHRhcnMgY3JlYXRlIGRpcmVjdG9yeSBtZW1iZXJzIHVzaW5nIGFuIEFSRUdUWVBFCiAgICAgICAgICMgaGVhZGVyIHdpdGggYSAiLyIgYXBwZW5kZWQgdG8gdGhlIGZpbGVuYW1lIGZpZWxkLgogICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKCJtaXNjL2RpcnR5cGUtb2xkLXY3IikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8udHlwZSA9PSB0YXJmaWxlLkRJUlRZUEUsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5ESVJUWVBFLAogICAgICAgICAgICAgICAgICJ2NyBkaXJ0eXBlIGZhaWxlZCIpCiAKICAgICBkZWYgdGVzdF94c3Rhcl90eXBlKHNlbGYpOgpAQCAtMjE5LDE1ICsyMTksMTUgQEAKIAogICAgIGRlZiB0ZXN0X2NoZWNrX21lbWJlcnMoc2VsZik6CiAgICAgICAgIGZvciB0YXJpbmZvIGluIHNlbGYudGFyOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGludCh0YXJpbmZvLm10aW1lKSA9PSAwNzYwNjEzNjYxNywKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpbnQodGFyaW5mby5tdGltZSkgPT0gMDc2MDYxMzY2MTcsCiAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBtdGltZSBmb3IgJXMiICUgdGFyaW5mby5uYW1lKQogICAgICAgICAgICAgaWYgbm90IHRhcmluZm8ubmFtZS5zdGFydHN3aXRoKCJ1c3Rhci8iKToKICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8udW5hbWUgPT0gInRhcmZpbGUiLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8udW5hbWUgPT0gInRhcmZpbGUiLAogICAgICAgICAgICAgICAgICAgICAid3JvbmcgdW5hbWUgZm9yICVzIiAlIHRhcmluZm8ubmFtZSkKIAogICAgIGRlZiB0ZXN0X2ZpbmRfbWVtYmVycyhzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNlbGYudGFyLmdldG1lbWJlcnMoKVstMV0ubmFtZSA9PSAibWlzYy9lb2YiLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi50YXIuZ2V0bWVtYmVycygpWy0xXS5uYW1lID09ICJtaXNjL2VvZiIsCiAgICAgICAgICAgICAgICAgImNvdWxkIG5vdCBmaW5kIGFsbCBtZW1iZXJzIikKIAogICAgIGRlZiB0ZXN0X2V4dHJhY3RfaGFyZGxpbmsoc2VsZik6CkBAIC0yNzYsNyArMjc2LDcgQEAKICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLm5leHQoKSAjIGdldCAicmVndHlwZSIgKGNhbid0IHVzZSBnZXRtZW1iZXIpCiAgICAgICAgIGZvYmogPSBzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKQogICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKChsZW4oZGF0YSksIG1kNXN1bShkYXRhKSkgPT0gKHRhcmluZm8uc2l6ZSwgbWQ1X3JlZ3R5cGUpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoKGxlbihkYXRhKSwgbWQ1c3VtKGRhdGEpKSA9PSAodGFyaW5mby5zaXplLCBtZDVfcmVndHlwZSksCiAgICAgICAgICAgICAgICAgInJlZ3VsYXIgZmlsZSBleHRyYWN0aW9uIGZhaWxlZCIpCiAKICAgICBkZWYgdGVzdF9wcm92b2tlX3N0cmVhbV9lcnJvcihzZWxmKToKQEAgLTI5Myw3ICsyOTMsNyBAQAogICAgICAgICAgICAgdDIgPSB0YXIyLm5leHQoKQogICAgICAgICAgICAgaWYgdDEgaXMgTm9uZToKICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHQyIGlzIG5vdCBOb25lLCAic3RyZWFtLm5leHQoKSBmYWlsZWQuIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0MiBpcyBub3QgTm9uZSwgInN0cmVhbS5uZXh0KCkgZmFpbGVkLiIpCiAKICAgICAgICAgICAgIGlmIHQyLmlzbG5rKCkgb3IgdDIuaXNzeW0oKToKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh0YXJmaWxlLlN0cmVhbUVycm9yLCB0YXIyLmV4dHJhY3RmaWxlLCB0MikKQEAgLTMwMyw4ICszMDMsOCBAQAogICAgICAgICAgICAgdjIgPSB0YXIyLmV4dHJhY3RmaWxlKHQyKQogICAgICAgICAgICAgaWYgdjEgaXMgTm9uZToKICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHYyIGlzIG5vdCBOb25lLCAic3RyZWFtLmV4dHJhY3RmaWxlKCkgZmFpbGVkIikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2MS5yZWFkKCkgPT0gdjIucmVhZCgpLCAic3RyZWFtIGV4dHJhY3Rpb24gZmFpbGVkIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2MiBpcyBub3QgTm9uZSwgInN0cmVhbS5leHRyYWN0ZmlsZSgpIGZhaWxlZCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodjEucmVhZCgpID09IHYyLnJlYWQoKSwgInN0cmVhbSBleHRyYWN0aW9uIGZhaWxlZCIpCiAKICAgICAgICAgdGFyMS5jbG9zZSgpCiAKQEAgLTM2NSw3ICszNjUsNyBAQAogCiAgICAgZGVmIF90ZXN0X21lbWJlcihzZWxmLCB0YXJpbmZvLCBjaGtzdW09Tm9uZSwgKiprd2FyZ3MpOgogICAgICAgICBpZiBjaGtzdW0gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8obWQ1c3VtKHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8pLnJlYWQoKSkgPT0gY2hrc3VtLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1kNXN1bShzZWxmLnRhci5leHRyYWN0ZmlsZSh0YXJpbmZvKS5yZWFkKCkpID09IGNoa3N1bSwKICAgICAgICAgICAgICAgICAgICAgIndyb25nIG1kNXN1bSBmb3IgJXMiICUgdGFyaW5mby5uYW1lKQogCiAgICAgICAgIGt3YXJnc1sibXRpbWUiXSA9IDA3NjA2MTM2NjE3CkBAIC0zNzYsNyArMzc2LDcgQEAKICAgICAgICAgICAgIGt3YXJnc1sidW5hbWUiXSA9ICJ0YXJmaWxlIgogICAgICAgICAgICAga3dhcmdzWyJnbmFtZSJdID0gInRhcmZpbGUiCiAgICAgICAgIGZvciBrLCB2IGluIGt3YXJncy5pdGVyaXRlbXMoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhnZXRhdHRyKHRhcmluZm8sIGspID09IHYsCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZ2V0YXR0cih0YXJpbmZvLCBrKSA9PSB2LAogICAgICAgICAgICAgICAgICAgICAid3JvbmcgdmFsdWUgaW4gJXMgZmllbGQgb2YgJXMiICUgKGssIHRhcmluZm8ubmFtZSkpCiAKICAgICBkZWYgdGVzdF9maW5kX3JlZ3R5cGUoc2VsZik6CkBAIC00MjUsNyArNDI1LDcgQEAKIAogICAgIGRlZiB0ZXN0X2ZpbmRfdXN0YXJfbG9uZ25hbWUoc2VsZik6CiAgICAgICAgIG5hbWUgPSAidXN0YXIvIiArICIxMjM0NS8iICogMzkgKyAiMTIzNDU2Ny9sb25nbmFtZSIKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5hbWUgaW4gc2VsZi50YXIuZ2V0bmFtZXMoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5hbWUgaW4gc2VsZi50YXIuZ2V0bmFtZXMoKSkKIAogICAgIGRlZiB0ZXN0X2ZpbmRfcmVndHlwZV9vbGR2NyhzZWxmKToKICAgICAgICAgdGFyaW5mbyA9IHNlbGYudGFyLmdldG1lbWJlcigibWlzYy9yZWd0eXBlLW9sZC12NyIpCkBAIC00NDYsNyArNDQ2LDcgQEAKICAgICAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXRtZW1iZXIobG9uZ25hbWUpCiAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICAgICAgIHNlbGYuZmFpbCgibG9uZ25hbWUgbm90IGZvdW5kIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8udHlwZSAhPSB0YXJmaWxlLkRJUlRZUEUsICJyZWFkIGxvbmduYW1lIGFzIGRpcnR5cGUiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby50eXBlICE9IHRhcmZpbGUuRElSVFlQRSwgInJlYWQgbG9uZ25hbWUgYXMgZGlydHlwZSIpCiAKICAgICBkZWYgdGVzdF9yZWFkX2xvbmdsaW5rKHNlbGYpOgogICAgICAgICBsb25nbmFtZSA9IHNlbGYuc3ViZGlyICsgIi8iICsgIjEyMy8iICogMTI1ICsgImxvbmduYW1lIgpAQCAtNDU1LDcgKzQ1NSw3IEBACiAgICAgICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0bWVtYmVyKGxvbmdsaW5rKQogICAgICAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgICAgICBzZWxmLmZhaWwoImxvbmdsaW5rIG5vdCBmb3VuZCIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLmxpbmtuYW1lID09IGxvbmduYW1lLCAibGlua25hbWUgd3JvbmciKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyaW5mby5saW5rbmFtZSA9PSBsb25nbmFtZSwgImxpbmtuYW1lIHdyb25nIikKIAogICAgIGRlZiB0ZXN0X3RydW5jYXRlZF9sb25nbmFtZShzZWxmKToKICAgICAgICAgbG9uZ25hbWUgPSBzZWxmLnN1YmRpciArICIvIiArICIxMjMvIiAqIDEyNSArICJsb25nbmFtZSIKQEAgLTQ4Niw3ICs0ODYsNyBAQAogICAgICAgICBmb2JqMSA9IHNlbGYudGFyLmV4dHJhY3RmaWxlKHRhcmluZm8xKQogICAgICAgICB0YXJpbmZvMiA9IHNlbGYudGFyLmdldG1lbWJlcigiZ251L3NwYXJzZSIpCiAgICAgICAgIGZvYmoyID0gc2VsZi50YXIuZXh0cmFjdGZpbGUodGFyaW5mbzIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhmb2JqMS5yZWFkKCkgPT0gZm9iajIucmVhZCgpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9iajEucmVhZCgpID09IGZvYmoyLnJlYWQoKSwKICAgICAgICAgICAgICAgICAic3BhcnNlIGZpbGUgZXh0cmFjdGlvbiBmYWlsZWQiKQogCiAKQEAgLTUzNSw3ICs1MzUsNyBAQAogICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4oZmlsZW9iaj1mb2JqLCBtb2RlPXNlbGYubW9kZSkKICAgICAgICAgdGFyLmFkZGZpbGUodGFyZmlsZS5UYXJJbmZvKCJmb28iKSkKICAgICAgICAgdGFyLmNsb3NlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGZvYmouY2xvc2VkIGlzIEZhbHNlLCAiZXh0ZXJuYWwgZmlsZW9ianMgbXVzdCBuZXZlciBjbG9zZWQiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZm9iai5jbG9zZWQgaXMgRmFsc2UsICJleHRlcm5hbCBmaWxlb2JqcyBtdXN0IG5ldmVyIGNsb3NlZCIpCiAKIAogY2xhc3MgV3JpdGVUZXN0KFdyaXRlVGVzdEJhc2UpOgpAQCAtNTU0LDcgKzU1NCw3IEBACiAgICAgICAgIHRhci5jbG9zZSgpCiAKICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXIuZ2V0bmFtZXMoKVswXSA9PSBuYW1lLAorICAgICAgICBzZWxmLmFzc2VydFRydWUodGFyLmdldG5hbWVzKClbMF0gPT0gbmFtZSwKICAgICAgICAgICAgICAgICAiZmFpbGVkIHRvIHN0b3JlIDEwMCBjaGFyIGZpbGVuYW1lIikKICAgICAgICAgdGFyLmNsb3NlKCkKIApAQCAtNTY3LDcgKzU2Nyw3IEBACiAgICAgICAgIGZvYmouY2xvc2UoKQogICAgICAgICB0YXIuYWRkKHBhdGgpCiAgICAgICAgIHRhci5jbG9zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmdldHNpemUodG1wbmFtZSkgPiAwLAorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5nZXRzaXplKHRtcG5hbWUpID4gMCwKICAgICAgICAgICAgICAgICAidGFyZmlsZSBpcyBlbXB0eSIpCiAKICAgICAjIFRoZSB0ZXN0Xypfc2l6ZSB0ZXN0cyB0ZXN0IGZvciBidWcgIzExNjcxMjguCkBAIC02MjgsMTYgKzYyOCwxNiBAQAogICAgICAgICBkc3RuYW1lID0gb3MucGF0aC5hYnNwYXRoKHRtcG5hbWUpCiAKICAgICAgICAgdGFyID0gdGFyZmlsZS5vcGVuKHRtcG5hbWUsIHNlbGYubW9kZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRhci5uYW1lID09IGRzdG5hbWUsICJhcmNoaXZlIG5hbWUgbXVzdCBiZSBhYnNvbHV0ZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXIubmFtZSA9PSBkc3RuYW1lLCAiYXJjaGl2ZSBuYW1lIG11c3QgYmUgYWJzb2x1dGUiKQogCiAgICAgICAgIHRhci5hZGQoZHN0bmFtZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRhci5nZXRuYW1lcygpID09IFtdLCAiYWRkZWQgdGhlIGFyY2hpdmUgdG8gaXRzZWxmIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5nZXRuYW1lcygpID09IFtdLCAiYWRkZWQgdGhlIGFyY2hpdmUgdG8gaXRzZWxmIikKIAogICAgICAgICBjd2QgPSBvcy5nZXRjd2QoKQogICAgICAgICBvcy5jaGRpcihURU1QRElSKQogICAgICAgICB0YXIuYWRkKGRzdG5hbWUpCiAgICAgICAgIG9zLmNoZGlyKGN3ZCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRhci5nZXRuYW1lcygpID09IFtdLCAiYWRkZWQgdGhlIGFyY2hpdmUgdG8gaXRzZWxmIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhci5nZXRuYW1lcygpID09IFtdLCAiYWRkZWQgdGhlIGFyY2hpdmUgdG8gaXRzZWxmIikKIAogICAgIGRlZiB0ZXN0X2V4Y2x1ZGUoc2VsZik6CiAgICAgICAgIHRlbXBkaXIgPSBvcy5wYXRoLmpvaW4oVEVNUERJUiwgImV4Y2x1ZGUiKQpAQCAtNjc4LDE0ICs2NzgsMTQgQEAKICAgICAgICAgICAgIGRlYyA9IGJ6Mi5CWjJEZWNvbXByZXNzb3IoKQogICAgICAgICAgICAgZGF0YSA9IG9wZW4odG1wbmFtZSwgInJiIikucmVhZCgpCiAgICAgICAgICAgICBkYXRhID0gZGVjLmRlY29tcHJlc3MoZGF0YSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZGVjLnVudXNlZF9kYXRhKSA9PSAwLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihkZWMudW51c2VkX2RhdGEpID09IDAsCiAgICAgICAgICAgICAgICAgICAgICJmb3VuZCB0cmFpbGluZyBkYXRhIikKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGZvYmogPSBvcGVuKHRtcG5hbWUsICJyYiIpCiAgICAgICAgICAgICBkYXRhID0gZm9iai5yZWFkKCkKICAgICAgICAgICAgIGZvYmouY2xvc2UoKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkYXRhLmNvdW50KCJcMCIpID09IHRhcmZpbGUuUkVDT1JEU0laRSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRhdGEuY291bnQoIlwwIikgPT0gdGFyZmlsZS5SRUNPUkRTSVpFLAogICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvcnJlY3QgemVybyBwYWRkaW5nIikKIAogCkBAIC03MjUsMTQgKzcyNSwxNCBAQAogCiAgICAgICAgIHYxID0gc2VsZi5fY2FsY19zaXplKG5hbWUsIGxpbmspCiAgICAgICAgIHYyID0gdGFyLm9mZnNldAotICAgICAgICBzZWxmLmFzc2VydF8odjEgPT0gdjIsICJHTlUgbG9uZ25hbWUvbG9uZ2xpbmsgY3JlYXRpb24gZmFpbGVkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYxID09IHYyLCAiR05VIGxvbmduYW1lL2xvbmdsaW5rIGNyZWF0aW9uIGZhaWxlZCIpCiAKICAgICAgICAgdGFyLmNsb3NlKCkKIAogICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSkKICAgICAgICAgbWVtYmVyID0gdGFyLm5leHQoKQotICAgICAgICBzZWxmLmZhaWxJZihtZW1iZXIgaXMgTm9uZSwgInVuYWJsZSB0byByZWFkIGxvbmduYW1lIG1lbWJlciIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0YXJpbmZvLm5hbWUgPT0gbWVtYmVyLm5hbWUgYW5kIFwKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShtZW1iZXIgaXMgTm9uZSwgInVuYWJsZSB0byByZWFkIGxvbmduYW1lIG1lbWJlciIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLm5hbWUgPT0gbWVtYmVyLm5hbWUgYW5kIFwKICAgICAgICAgICAgICAgICAgICAgIHRhcmluZm8ubGlua25hbWUgPT0gbWVtYmVyLmxpbmtuYW1lLCBcCiAgICAgICAgICAgICAgICAgICAgICAidW5hYmxlIHRvIHJlYWQgbG9uZ25hbWUgbWVtYmVyIikKIApAQCAtNzkyLDE4ICs3OTIsMTggQEAKICAgICAgICAgIyBUaGUgc2FtZSBuYW1lIHdpbGwgYmUgYWRkZWQgYXMgYSBSRUdUWVBFIGV2ZXJ5CiAgICAgICAgICMgdGltZSByZWdhcmRsZXNzIG9mIHN0X25saW5rLgogICAgICAgICB0YXJpbmZvID0gc2VsZi50YXIuZ2V0dGFyaW5mbyhzZWxmLmZvbykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRhcmluZm8udHlwZSA9PSB0YXJmaWxlLlJFR1RZUEUsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0YXJpbmZvLnR5cGUgPT0gdGFyZmlsZS5SRUdUWVBFLAogICAgICAgICAgICAgICAgICJhZGQgZmlsZSBhcyByZWd1bGFyIGZhaWxlZCIpCiAKICAgICBkZWYgdGVzdF9hZGRfaGFyZGxpbmsoc2VsZik6CiAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXR0YXJpbmZvKHNlbGYuYmFyKQotICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mby50eXBlID09IHRhcmZpbGUuTE5LVFlQRSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8udHlwZSA9PSB0YXJmaWxlLkxOS1RZUEUsCiAgICAgICAgICAgICAgICAgImFkZCBmaWxlIGFzIGhhcmRsaW5rIGZhaWxlZCIpCiAKICAgICBkZWYgdGVzdF9kZXJlZmVyZW5jZV9oYXJkbGluayhzZWxmKToKICAgICAgICAgc2VsZi50YXIuZGVyZWZlcmVuY2UgPSBUcnVlCiAgICAgICAgIHRhcmluZm8gPSBzZWxmLnRhci5nZXR0YXJpbmZvKHNlbGYuYmFyKQotICAgICAgICBzZWxmLmFzc2VydF8odGFyaW5mby50eXBlID09IHRhcmZpbGUuUkVHVFlQRSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRhcmluZm8udHlwZSA9PSB0YXJmaWxlLlJFR1RZUEUsCiAgICAgICAgICAgICAgICAgImRlcmVmZXJlbmNpbmcgaGFyZGxpbmsgZmFpbGVkIikKIAogCkBAIC04MjMsMTAgKzgyMywxMCBAQAogICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSkKICAgICAgICAgaWYgbGluazoKICAgICAgICAgICAgIGwgPSB0YXIuZ2V0bWVtYmVycygpWzBdLmxpbmtuYW1lCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obGluayA9PSBsLCAiUEFYIGxvbmdsaW5rIGNyZWF0aW9uIGZhaWxlZCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobGluayA9PSBsLCAiUEFYIGxvbmdsaW5rIGNyZWF0aW9uIGZhaWxlZCIpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICBuID0gdGFyLmdldG1lbWJlcnMoKVswXS5uYW1lCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obmFtZSA9PSBuLCAiUEFYIGxvbmduYW1lIGNyZWF0aW9uIGZhaWxlZCIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobmFtZSA9PSBuLCAiUEFYIGxvbmduYW1lIGNyZWF0aW9uIGZhaWxlZCIpCiAKICAgICBkZWYgdGVzdF9wYXhfZ2xvYmFsX2hlYWRlcihzZWxmKToKICAgICAgICAgcGF4X2hlYWRlcnMgPSB7CkBAIC04NDgsOCArODQ4LDggQEAKIAogICAgICAgICAjIFRlc3QgaWYgYWxsIHRoZSBmaWVsZHMgYXJlIHVuaWNvZGUuCiAgICAgICAgIGZvciBrZXksIHZhbCBpbiB0YXIucGF4X2hlYWRlcnMuaXRlcml0ZW1zKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8odHlwZShrZXkpIGlzIHVuaWNvZGUpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odHlwZSh2YWwpIGlzIHVuaWNvZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZShrZXkpIGlzIHVuaWNvZGUpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh2YWwpIGlzIHVuaWNvZGUpCiAgICAgICAgICAgICBpZiBrZXkgaW4gdGFyZmlsZS5QQVhfTlVNQkVSX0ZJRUxEUzoKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIHRhcmZpbGUuUEFYX05VTUJFUl9GSUVMRFNba2V5XSh2YWwpCkBAIC04OTcsNyArODk3LDcgQEAKICAgICAgICAgdGFyLmNsb3NlKCkKIAogICAgICAgICB0YXIgPSB0YXJmaWxlLm9wZW4odG1wbmFtZSwgZW5jb2Rpbmc9ZW5jb2RpbmcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKHRhci5nZXRuYW1lcygpWzBdKSBpcyBub3QgdW5pY29kZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodGFyLmdldG5hbWVzKClbMF0pIGlzIG5vdCB1bmljb2RlKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRhci5nZXRtZW1iZXJzKClbMF0ubmFtZSwgbmFtZS5lbmNvZGUoZW5jb2RpbmcpKQogICAgICAgICB0YXIuY2xvc2UoKQogCkBAIC05MjEsMTAgKzkyMSwxMCBAQAogICAgIGRlZiB0ZXN0X3VuaWNvZGVfYXJndW1lbnQoc2VsZik6CiAgICAgICAgIHRhciA9IHRhcmZpbGUub3Blbih0YXJuYW1lLCAiciIsIGVuY29kaW5nPSJpc284ODU5LTEiLCBlcnJvcnM9InN0cmljdCIpCiAgICAgICAgIGZvciB0IGluIHRhcjoKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKHQubmFtZSkgaXMgc3RyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodC5saW5rbmFtZSkgaXMgc3RyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodC51bmFtZSkgaXMgc3RyKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUodC5nbmFtZSkgaXMgc3RyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodC5uYW1lKSBpcyBzdHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0LmxpbmtuYW1lKSBpcyBzdHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0LnVuYW1lKSBpcyBzdHIpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodHlwZSh0LmduYW1lKSBpcyBzdHIpCiAgICAgICAgIHRhci5jbG9zZSgpCiAKICAgICBkZWYgdGVzdF91bmFtZV91bmljb2RlKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90ZW1wZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGVtcGZpbGUucHkKaW5kZXggOGI4ODNiMC4uN2YwYjhiMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90ZW1wZmlsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RlbXBmaWxlLnB5CkBAIC01OSw3ICs1OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUgJyVzJyBkb2VzIG5vdCBlbmQgd2l0aCAnJXMnIiAlIChuYmFzZSwgc3VmKSkKIAogICAgICAgICBuYmFzZSA9IG5iYXNlW2xlbihwcmUpOmxlbihuYmFzZSktbGVuKHN1ZildCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhzZWxmLnN0cl9jaGVjay5tYXRjaChuYmFzZSksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLnN0cl9jaGVjay5tYXRjaChuYmFzZSksCiAgICAgICAgICAgICAgICAgICAgICAicmFuZG9tIHN0cmluZyAnJXMnIGRvZXMgbm90IG1hdGNoIC9eW2EtekEtWjAtOV8tXXs2fSQvIgogICAgICAgICAgICAgICAgICAgICAgJSBuYmFzZSkKIApAQCAtODgsNyArODgsNyBAQAogICAgICAgICBmb3Iga2V5IGluIGRpY3Q6CiAgICAgICAgICAgICBpZiBrZXlbMF0gIT0gJ18nIGFuZCBrZXkgbm90IGluIGV4cGVjdGVkOgogICAgICAgICAgICAgICAgIHVuZXhwLmFwcGVuZChrZXkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhsZW4odW5leHApID09IDAsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4odW5leHApID09IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAidW5leHBlY3RlZCBrZXlzOiAlcyIgJSB1bmV4cCkKIAogdGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X2V4cG9ydHMpCkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICAgICAgZm9yIGkgaW4geHJhbmdlKFRFU1RfRklMRVMpOgogICAgICAgICAgICAgcyA9IHIubmV4dCgpCiAgICAgICAgICAgICBzZWxmLm5hbWVDaGVjayhzLCAnJywgJycsICcnKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYocyBpbiBkaWN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShzIGluIGRpY3QpCiAgICAgICAgICAgICBkaWN0W3NdID0gMQogCiAgICAgZGVmIHRlc3Rfc3VwcG9ydHNfaXRlcihzZWxmKToKQEAgLTE0MCw5ICsxNDAsOSBAQAogCiAgICAgICAgIGNhbmQgPSB0ZW1wZmlsZS5fY2FuZGlkYXRlX3RlbXBkaXJfbGlzdCgpCiAKLSAgICAgICAgc2VsZi5mYWlsSWYobGVuKGNhbmQpID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobGVuKGNhbmQpID09IDApCiAgICAgICAgIGZvciBjIGluIGNhbmQ6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShjLCBiYXNlc3RyaW5nKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGMsIGJhc2VzdHJpbmcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBpcyBub3QgYSBzdHJpbmciICUgYykKIAogICAgIGRlZiB0ZXN0X3dhbnRlZF9kaXJzKHNlbGYpOgpAQCAtMTYwLDE0ICsxNjAsMTQgQEAKICAgICAgICAgICAgIGZvciBlbnZuYW1lIGluICdUTVBESVInLCAnVEVNUCcsICdUTVAnOgogICAgICAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5nZXRlbnYoZW52bmFtZSkKICAgICAgICAgICAgICAgICBpZiBub3QgZGlybmFtZTogcmFpc2UgVmFsdWVFcnJvcgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhkaXJuYW1lIGluIGNhbmQpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpcm5hbWUgaW4gY2FuZCkKIAogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5nZXRjd2QoKQogICAgICAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgb3MuZXJyb3IpOgogICAgICAgICAgICAgICAgIGRpcm5hbWUgPSBvcy5jdXJkaXIKIAotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGRpcm5hbWUgaW4gY2FuZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaXJuYW1lIGluIGNhbmQpCiAKICAgICAgICAgICAgICMgTm90IHByYWN0aWNhbCB0byB0cnkgdG8gdmVyaWZ5IHRoZSBwcmVzZW5jZSBvZiBPUy1zcGVjaWZpYwogICAgICAgICAgICAgIyBwYXRocyBpbiB0aGlzIGxpc3QuCkBAIC0xODQsMTQgKzE4NCwxNCBAQAogICAgIGRlZiB0ZXN0X3JldHZhbChzZWxmKToKICAgICAgICAgIyBfZ2V0X2NhbmRpZGF0ZV9uYW1lcyByZXR1cm5zIGEgX1JhbmRvbU5hbWVTZXF1ZW5jZSBvYmplY3QKICAgICAgICAgb2JqID0gdGVtcGZpbGUuX2dldF9jYW5kaWRhdGVfbmFtZXMoKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShvYmosIHRlbXBmaWxlLl9SYW5kb21OYW1lU2VxdWVuY2UpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShvYmosIHRlbXBmaWxlLl9SYW5kb21OYW1lU2VxdWVuY2UpKQogCiAgICAgZGVmIHRlc3Rfc2FtZV90aGluZyhzZWxmKToKICAgICAgICAgIyBfZ2V0X2NhbmRpZGF0ZV9uYW1lcyBhbHdheXMgcmV0dXJucyB0aGUgc2FtZSBvYmplY3QKICAgICAgICAgYSA9IHRlbXBmaWxlLl9nZXRfY2FuZGlkYXRlX25hbWVzKCkKICAgICAgICAgYiA9IHRlbXBmaWxlLl9nZXRfY2FuZGlkYXRlX25hbWVzKCkKIAotICAgICAgICBzZWxmLmFzc2VydF8oYSBpcyBiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBpcyBiKQogCiB0ZXN0X2NsYXNzZXMuYXBwZW5kKHRlc3RfX2dldF9jYW5kaWRhdGVfbmFtZXMpCiAKQEAgLTMwMCw5ICszMDAsOSBAQAogICAgICAgICAgICAgZGVjb3JhdGVkID0gc3lzLmV4ZWN1dGFibGUKIAogICAgICAgICByZXR2YWwgPSBvcy5zcGF3bmwob3MuUF9XQUlULCBzeXMuZXhlY3V0YWJsZSwgZGVjb3JhdGVkLCB0ZXN0ZXIsIHYsIGZkKQotICAgICAgICBzZWxmLmZhaWxJZihyZXR2YWwgPCAwLAorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHJldHZhbCA8IDAsCiAgICAgICAgICAgICAgICAgICAgICJjaGlsZCBwcm9jZXNzIGNhdWdodCBmYXRhbCBzaWduYWwgJWQiICUgLXJldHZhbCkKLSAgICAgICAgc2VsZi5mYWlsSWYocmV0dmFsID4gMCwgImNoaWxkIHByb2Nlc3MgcmVwb3J0cyBmYWlsdXJlICVkIiVyZXR2YWwpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmV0dmFsID4gMCwgImNoaWxkIHByb2Nlc3MgcmVwb3J0cyBmYWlsdXJlICVkIiVyZXR2YWwpCiAKICAgICBkZWYgdGVzdF90ZXh0bW9kZShzZWxmKToKICAgICAgICAgIyBfbWtzdGVtcF9pbm5lciBjYW4gY3JlYXRlIGZpbGVzIGluIHRleHQgbW9kZQpAQCAtMzIyLDggKzMyMiw4IEBACiAgICAgICAgICMgZ2V0dGVtcHByZWZpeCByZXR1cm5zIGEgbm9uZW1wdHkgcHJlZml4IHN0cmluZwogICAgICAgICBwID0gdGVtcGZpbGUuZ2V0dGVtcHByZWZpeCgpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UocCwgYmFzZXN0cmluZykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4ocCkgPiAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShwLCBiYXNlc3RyaW5nKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihwKSA+IDApCiAKICAgICBkZWYgdGVzdF91c2FibGVfdGVtcGxhdGUoc2VsZik6CiAgICAgICAgICMgZ2V0dGVtcHByZWZpeCByZXR1cm5zIGEgdXNhYmxlIHByZWZpeCBzdHJpbmcKQEAgLTM1NCw5ICszNTQsOSBAQAogICAgICAgICAjIGdldHRlbXBkaXIgcmV0dXJucyBhIGRpcmVjdG9yeSB3aGljaCBleGlzdHMKIAogICAgICAgICBkaXIgPSB0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguaXNhYnMoZGlyKSBvciBkaXIgPT0gb3MuY3VyZGlyLAorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2FicyhkaXIpIG9yIGRpciA9PSBvcy5jdXJkaXIsCiAgICAgICAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGFuIGFic29sdXRlIHBhdGgiICUgZGlyKQotICAgICAgICBzZWxmLmFzc2VydF8ob3MucGF0aC5pc2RpcihkaXIpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2RpcihkaXIpLAogICAgICAgICAgICAgICAgICAgICAgIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSIgJSBkaXIpCiAKICAgICBkZWYgdGVzdF9kaXJlY3Rvcnlfd3JpdGFibGUoc2VsZik6CkBAIC0zNzcsNyArMzc3LDcgQEAKICAgICAgICAgYSA9IHRlbXBmaWxlLmdldHRlbXBkaXIoKQogICAgICAgICBiID0gdGVtcGZpbGUuZ2V0dGVtcGRpcigpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgaXMgYikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGEgaXMgYikKIAogdGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X2dldHRlbXBkaXIpCiAKQEAgLTU4MCw3ICs1ODAsNyBAQAogICAgIGRlZiB0ZXN0X2NyZWF0ZXNfbmFtZWQoc2VsZik6CiAgICAgICAgICMgTmFtZWRUZW1wb3JhcnlGaWxlIGNyZWF0ZXMgZmlsZXMgd2l0aCBuYW1lcwogICAgICAgICBmID0gdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9zLnBhdGguZXhpc3RzKGYubmFtZSksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhmLm5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVkVGVtcG9yYXJ5RmlsZSAlcyBkb2VzIG5vdCBleGlzdCIgJSBmLm5hbWUpCiAKICAgICBkZWYgdGVzdF9kZWxfb25fY2xvc2Uoc2VsZik6CkBAIC01OTAsNyArNTkwLDcgQEAKICAgICAgICAgICAgIGYgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoZGlyPWRpcikKICAgICAgICAgICAgIGYud3JpdGUoJ2JsYXQnKQogICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihvcy5wYXRoLmV4aXN0cyhmLm5hbWUpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhmLm5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVkVGVtcG9yYXJ5RmlsZSAlcyBleGlzdHMgYWZ0ZXIgY2xvc2UiICUgZi5uYW1lKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3Mucm1kaXIoZGlyKQpAQCAtNjA0LDcgKzYwNCw3IEBACiAgICAgICAgICAgICB0bXAgPSBmLm5hbWUKICAgICAgICAgICAgIGYud3JpdGUoJ2JsYXQnKQogICAgICAgICAgICAgZi5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3MucGF0aC5leGlzdHMoZi5uYW1lKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhmLm5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgIk5hbWVkVGVtcG9yYXJ5RmlsZSAlcyBtaXNzaW5nIGFmdGVyIGNsb3NlIiAlIGYubmFtZSkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIGlmIHRtcCBpcyBub3QgTm9uZToKQEAgLTYyNSwxMiArNjI1LDEyIEBACiAgICAgZGVmIHRlc3RfY29udGV4dF9tYW5hZ2VyKHNlbGYpOgogICAgICAgICAjIEEgTmFtZWRUZW1wb3JhcnlGaWxlIGNhbiBiZSB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyCiAgICAgICAgIHdpdGggdGVtcGZpbGUuTmFtZWRUZW1wb3JhcnlGaWxlKCkgYXMgZjoKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcy5wYXRoLmV4aXN0cyhmLm5hbWUpKQotICAgICAgICBzZWxmLmZhaWxJZihvcy5wYXRoLmV4aXN0cyhmLm5hbWUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGYubmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2Uob3MucGF0aC5leGlzdHMoZi5uYW1lKSkKICAgICAgICAgZGVmIHVzZV9jbG9zZWQoKToKICAgICAgICAgICAgIHdpdGggZjoKICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhWYWx1ZUVycm9yLCB1c2VfY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1c2VfY2xvc2VkKQogCiAgICAgIyBIb3cgdG8gdGVzdCB0aGUgbW9kZSBhbmQgYnVmc2l6ZSBwYXJhbWV0ZXJzPwogCkBAIC02NTMsMjEgKzY1MywyMSBAQAogICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgogICAgICAgICAjIFNwb29sZWRUZW1wb3JhcnlGaWxlIGNhbiBjcmVhdGUgZmlsZXMKICAgICAgICAgZiA9IHNlbGYuZG9fY3JlYXRlKCkKLSAgICAgICAgc2VsZi5mYWlsSWYoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKICAgICAgICAgZiA9IHNlbGYuZG9fY3JlYXRlKG1heF9zaXplPTEwMCwgcHJlPSJhIiwgc3VmPSIudHh0IikKLSAgICAgICAgc2VsZi5mYWlsSWYoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKIAogICAgIGRlZiB0ZXN0X2RlbF9vbl9jbG9zZShzZWxmKToKICAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIGlzIGRlbGV0ZWQgd2hlbiBjbG9zZWQKICAgICAgICAgZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIGYgPSB0ZW1wZmlsZS5TcG9vbGVkVGVtcG9yYXJ5RmlsZShtYXhfc2l6ZT0xMCwgZGlyPWRpcikKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGYuX3JvbGxlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQogICAgICAgICAgICAgZi53cml0ZSgnYmxhdCAnICogNSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhmLl9yb2xsZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5fcm9sbGVkKQogICAgICAgICAgICAgZmlsZW5hbWUgPSBmLm5hbWUKICAgICAgICAgICAgIGYuY2xvc2UoKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYob3MucGF0aC5leGlzdHMoZmlsZW5hbWUpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAiU3Bvb2xlZFRlbXBvcmFyeUZpbGUgJXMgZXhpc3RzIGFmdGVyIGNsb3NlIiAlIGZpbGVuYW1lKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3Mucm1kaXIoZGlyKQpAQCAtNjc1LDQ2ICs2NzUsNDYgQEAKICAgICBkZWYgdGVzdF9yZXdyaXRlX3NtYWxsKHNlbGYpOgogICAgICAgICAjIEEgU3Bvb2xlZFRlbXBvcmFyeUZpbGUgY2FuIGJlIHdyaXR0ZW4gdG8gbXVsdGlwbGUgd2l0aGluIHRoZSBtYXhfc2l6ZQogICAgICAgICBmID0gc2VsZi5kb19jcmVhdGUobWF4X3NpemU9MzApCi0gICAgICAgIHNlbGYuZmFpbElmKGYuX3JvbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCiAgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgogICAgICAgICAgICAgZi5zZWVrKDAsIDApCiAgICAgICAgICAgICBmLndyaXRlKCd4JyAqIDIwKQotICAgICAgICBzZWxmLmZhaWxJZihmLl9yb2xsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQogCiAgICAgZGVmIHRlc3Rfd3JpdGVfc2VxdWVudGlhbChzZWxmKToKICAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIHNob3VsZCBob2xkIGV4YWN0bHkgbWF4X3NpemUgYnl0ZXMsIGFuZCByb2xsCiAgICAgICAgICMgb3ZlciBhZnRlcndhcmQKICAgICAgICAgZiA9IHNlbGYuZG9fY3JlYXRlKG1heF9zaXplPTMwKQotICAgICAgICBzZWxmLmZhaWxJZihmLl9yb2xsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQogICAgICAgICBmLndyaXRlKCd4JyAqIDIwKQotICAgICAgICBzZWxmLmZhaWxJZihmLl9yb2xsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQogICAgICAgICBmLndyaXRlKCd4JyAqIDEwKQotICAgICAgICBzZWxmLmZhaWxJZihmLl9yb2xsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQogICAgICAgICBmLndyaXRlKCd4JykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGYuX3JvbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuX3JvbGxlZCkKIAogICAgIGRlZiB0ZXN0X3NwYXJzZShzZWxmKToKICAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIHRoYXQgaXMgd3JpdHRlbiBsYXRlIGluIHRoZSBmaWxlIHdpbGwgZXh0ZW5kCiAgICAgICAgICMgd2hlbiB0aGF0IG9jY3VycwogICAgICAgICBmID0gc2VsZi5kb19jcmVhdGUobWF4X3NpemU9MzApCi0gICAgICAgIHNlbGYuZmFpbElmKGYuX3JvbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCiAgICAgICAgIGYuc2VlaygxMDAsIDApCi0gICAgICAgIHNlbGYuZmFpbElmKGYuX3JvbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLl9yb2xsZWQpCiAgICAgICAgIGYud3JpdGUoJ3gnKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5fcm9sbGVkKQogCiAgICAgZGVmIHRlc3RfZmlsZW5vKHNlbGYpOgogICAgICAgICAjIEEgU3Bvb2xlZFRlbXBvcmFyeUZpbGUgc2hvdWxkIHJvbGwgb3ZlciB0byBhIHJlYWwgZmlsZSBvbiBmaWxlbm8oKQogICAgICAgICBmID0gc2VsZi5kb19jcmVhdGUobWF4X3NpemU9MzApCi0gICAgICAgIHNlbGYuZmFpbElmKGYuX3JvbGxlZCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGYuZmlsZW5vKCkgPiAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuZmlsZW5vKCkgPiAwKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5fcm9sbGVkKQogCiAgICAgZGVmIHRlc3RfbXVsdGlwbGVfY2xvc2VfYmVmb3JlX3JvbGxvdmVyKHNlbGYpOgogICAgICAgICAjIEEgU3Bvb2xlZFRlbXBvcmFyeUZpbGUgY2FuIGJlIGNsb3NlZCBtYW55IHRpbWVzIHdpdGhvdXQgZXJyb3IKICAgICAgICAgZiA9IHRlbXBmaWxlLlNwb29sZWRUZW1wb3JhcnlGaWxlKCkKICAgICAgICAgZi53cml0ZSgnYWJjXG4nKQotICAgICAgICBzZWxmLmZhaWxJZihmLl9yb2xsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQogICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZi5jbG9zZSgpCkBAIC03MjYsNyArNzI2LDcgQEAKICAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIGNhbiBiZSBjbG9zZWQgbWFueSB0aW1lcyB3aXRob3V0IGVycm9yCiAgICAgICAgIGYgPSB0ZW1wZmlsZS5TcG9vbGVkVGVtcG9yYXJ5RmlsZShtYXhfc2l6ZT0xKQogICAgICAgICBmLndyaXRlKCdhYmNcbicpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmLl9yb2xsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLl9yb2xsZWQpCiAgICAgICAgIGYuY2xvc2UoKQogICAgICAgICB0cnk6CiAgICAgICAgICAgICBmLmNsb3NlKCkKQEAgLTc0Niw0NiArNzQ2LDQ2IEBACiAgICAgICAgIHdyaXRlKCJhIiAqIDM1KQogICAgICAgICB3cml0ZSgiYiIgKiAzNSkKICAgICAgICAgc2VlaygwLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVhZCg3MCkgPT0gJ2EnKjM1ICsgJ2InKjM1KQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVhZCg3MCkgPT0gJ2EnKjM1ICsgJ2InKjM1KQogCiAgICAgZGVmIHRlc3RfY29udGV4dF9tYW5hZ2VyX2JlZm9yZV9yb2xsb3ZlcihzZWxmKToKICAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIGNhbiBiZSB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyCiAgICAgICAgIHdpdGggdGVtcGZpbGUuU3Bvb2xlZFRlbXBvcmFyeUZpbGUobWF4X3NpemU9MSkgYXMgZjoKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGYuX3JvbGxlZCkKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGYuY2xvc2VkKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZi5jbG9zZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuX3JvbGxlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLmNsb3NlZCkKICAgICAgICAgZGVmIHVzZV9jbG9zZWQoKToKICAgICAgICAgICAgIHdpdGggZjoKICAgICAgICAgICAgICAgICBwYXNzCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhWYWx1ZUVycm9yLCB1c2VfY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCB1c2VfY2xvc2VkKQogCiAgICAgZGVmIHRlc3RfY29udGV4dF9tYW5hZ2VyX2R1cmluZ19yb2xsb3ZlcihzZWxmKToKICAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIGNhbiBiZSB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyCiAgICAgICAgIHdpdGggdGVtcGZpbGUuU3Bvb2xlZFRlbXBvcmFyeUZpbGUobWF4X3NpemU9MSkgYXMgZjoKLSAgICAgICAgICAgIHNlbGYuZmFpbElmKGYuX3JvbGxlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoZi5fcm9sbGVkKQogICAgICAgICAgICAgZi53cml0ZSgnYWJjXG4nKQogICAgICAgICAgICAgZi5mbHVzaCgpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZi5fcm9sbGVkKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYoZi5jbG9zZWQpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhmLmNsb3NlZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmLl9yb2xsZWQpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGYuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5jbG9zZWQpCiAgICAgICAgIGRlZiB1c2VfY2xvc2VkKCk6CiAgICAgICAgICAgICB3aXRoIGY6CiAgICAgICAgICAgICAgICAgcGFzcwotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVmFsdWVFcnJvciwgdXNlX2Nsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgdXNlX2Nsb3NlZCkKIAogICAgIGRlZiB0ZXN0X2NvbnRleHRfbWFuYWdlcl9hZnRlcl9yb2xsb3ZlcihzZWxmKToKICAgICAgICAgIyBBIFNwb29sZWRUZW1wb3JhcnlGaWxlIGNhbiBiZSB1c2VkIGFzIGEgY29udGV4dCBtYW5hZ2VyCiAgICAgICAgIGYgPSB0ZW1wZmlsZS5TcG9vbGVkVGVtcG9yYXJ5RmlsZShtYXhfc2l6ZT0xKQogICAgICAgICBmLndyaXRlKCdhYmNcbicpCiAgICAgICAgIGYuZmx1c2goKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZi5fcm9sbGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZi5fcm9sbGVkKQogICAgICAgICB3aXRoIGY6Ci0gICAgICAgICAgICBzZWxmLmZhaWxJZihmLmNsb3NlZCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGYuY2xvc2VkKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShmLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGYuY2xvc2VkKQogICAgICAgICBkZWYgdXNlX2Nsb3NlZCgpOgogICAgICAgICAgICAgd2l0aCBmOgogICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFZhbHVlRXJyb3IsIHVzZV9jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHVzZV9jbG9zZWQpCiAKIAogdGVzdF9jbGFzc2VzLmFwcGVuZCh0ZXN0X1Nwb29sZWRUZW1wb3JhcnlGaWxlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmcucHkgYi9MaWIvdGVzdC90ZXN0X3RocmVhZGluZy5weQppbmRleCA0NjNkMGQ4Li4yMzNjY2Y2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RocmVhZGluZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RocmVhZGluZy5weQpAQCAtNDEsNyArNDEsNyBAQAogICAgICAgICAgICAgICAgIHNlbGYubnJ1bm5pbmcuaW5jKCkKICAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgICAgICAgICBwcmludCBzZWxmLm5ydW5uaW5nLmdldCgpLCAndGFza3MgYXJlIHJ1bm5pbmcnCi0gICAgICAgICAgICAgICAgc2VsZi50ZXN0Y2FzZS5hc3NlcnRfKHNlbGYubnJ1bm5pbmcuZ2V0KCkgPD0gMykKKyAgICAgICAgICAgICAgICBzZWxmLnRlc3RjYXNlLmFzc2VydFRydWUoc2VsZi5ucnVubmluZy5nZXQoKSA8PSAzKQogCiAgICAgICAgICAgICB0aW1lLnNsZWVwKGRlbGF5KQogICAgICAgICAgICAgaWYgdmVyYm9zZToKQEAgLTQ5LDcgKzQ5LDcgQEAKIAogICAgICAgICAgICAgd2l0aCBzZWxmLm11dGV4OgogICAgICAgICAgICAgICAgIHNlbGYubnJ1bm5pbmcuZGVjKCkKLSAgICAgICAgICAgICAgICBzZWxmLnRlc3RjYXNlLmFzc2VydF8oc2VsZi5ucnVubmluZy5nZXQoKSA+PSAwKQorICAgICAgICAgICAgICAgIHNlbGYudGVzdGNhc2UuYXNzZXJ0VHJ1ZShzZWxmLm5ydW5uaW5nLmdldCgpID49IDApCiAgICAgICAgICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJyVzIGlzIGZpbmlzaGVkLiAlZCB0YXNrcyBhcmUgcnVubmluZycgJSAoCiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWUsIHNlbGYubnJ1bm5pbmcuZ2V0KCkpCkBAIC03MywxOCArNzMsMTggQEAKICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoTlVNVEFTS1MpOgogICAgICAgICAgICAgdCA9IFRlc3RUaHJlYWQoIjx0aHJlYWQgJWQ+IiVpLCBzZWxmLCBzZW1hLCBtdXRleCwgbnVtcnVubmluZykKICAgICAgICAgICAgIHRocmVhZHMuYXBwZW5kKHQpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0LmlkZW50LCBOb25lKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHJlLm1hdGNoKCc8VGVzdFRocmVhZFwoLiosIGluaXRpYWxcKT4nLCByZXByKHQpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodC5pZGVudCwgTm9uZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgnPFRlc3RUaHJlYWRcKC4qLCBpbml0aWFsXCk+JywgcmVwcih0KSkpCiAgICAgICAgICAgICB0LnN0YXJ0KCkKIAogICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgcHJpbnQgJ3dhaXRpbmcgZm9yIGFsbCB0YXNrcyB0byBjb21wbGV0ZScKICAgICAgICAgZm9yIHQgaW4gdGhyZWFkczoKICAgICAgICAgICAgIHQuam9pbihOVU1UQVNLUykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdC5pc19hbGl2ZSgpKQotICAgICAgICAgICAgc2VsZi5mYWlsSWZFcXVhbCh0LmlkZW50LCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0LmlzX2FsaXZlKCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHQuaWRlbnQsIDApCiAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHQuaWRlbnQgaXMgTm9uZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhyZS5tYXRjaCgnPFRlc3RUaHJlYWRcKC4qLCBcdysgLT9cZCtcKT4nLCByZXByKHQpKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZS5tYXRjaCgnPFRlc3RUaHJlYWRcKC4qLCBcdysgLT9cZCtcKT4nLCByZXByKHQpKSkKICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgIHByaW50ICdhbGwgdGFza3MgZG9uZScKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChudW1ydW5uaW5nLmdldCgpLCAwKQpAQCAtMTQyLDggKzE0Miw4IEBACiAgICAgICAgIHRpZCA9IHRocmVhZC5zdGFydF9uZXdfdGhyZWFkKGYsIChtdXRleCwpKQogICAgICAgICAjIFdhaXQgZm9yIHRoZSB0aHJlYWQgdG8gZmluaXNoLgogICAgICAgICBtdXRleC5hY3F1aXJlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRpZCBpbiB0aHJlYWRpbmcuX2FjdGl2ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodGhyZWFkaW5nLl9hY3RpdmVbdGlkXSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpZCBpbiB0aHJlYWRpbmcuX2FjdGl2ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodGhyZWFkaW5nLl9hY3RpdmVbdGlkXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkaW5nLl9EdW1teVRocmVhZCkpCiAgICAgICAgIGRlbCB0aHJlYWRpbmcuX2FjdGl2ZVt0aWRdCiAKQEAgLTIwMyw3ICsyMDMsNyBAQAogICAgICAgICBzZWxmLmFzc2VydFRydWUocmV0KQogICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgcHJpbnQgIiAgICB2ZXJpZnlpbmcgd29ya2VyIGhhc24ndCBleGl0ZWQiCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgdC5maW5pc2hlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0LmZpbmlzaGVkKQogICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgcHJpbnQgIiAgICBhdHRlbXB0aW5nIHRvIHJhaXNlIGFzeW5jaCBleGNlcHRpb24gaW4gd29ya2VyIgogICAgICAgICByZXN1bHQgPSBzZXRfYXN5bmNfZXhjKGN0eXBlcy5jX2xvbmcodC5pZCksIGV4Y2VwdGlvbikKQEAgLTIxMSw3ICsyMTEsNyBAQAogICAgICAgICBpZiB2ZXJib3NlOgogICAgICAgICAgICAgcHJpbnQgIiAgICB3YWl0aW5nIGZvciB3b3JrZXIgdG8gc2F5IGl0IGNhdWdodCB0aGUgZXhjZXB0aW9uIgogICAgICAgICB3b3JrZXJfc2F3X2V4Y2VwdGlvbi53YWl0KHRpbWVvdXQ9MTApCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0LmZpbmlzaGVkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodC5maW5pc2hlZCkKICAgICAgICAgaWYgdmVyYm9zZToKICAgICAgICAgICAgIHByaW50ICIgICAgYWxsIE9LIC0tIGpvaW5pbmcgd29ya2VyIgogICAgICAgICBpZiB0LmZpbmlzaGVkOgpAQCAtMjgyLDggKzI4Miw4IEBACiAKICAgICAgICAgICAgIHN5cy5zZXR0cmFjZShmdW5jKQogICAgICAgICAgICAgIiIiXSkKLSAgICAgICAgc2VsZi5mYWlsSWYocmMgPT0gMiwgImludGVycHJldGVkIHdhcyBibG9ja2VkIikKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHJjID09IDAsICJVbmV4cGVjdGVkIGVycm9yIikKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShyYyA9PSAyLCAiaW50ZXJwcmV0ZWQgd2FzIGJsb2NrZWQiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocmMgPT0gMCwgIlVuZXhwZWN0ZWQgZXJyb3IiKQogCiAKICAgICBkZWYgdGVzdF9lbnVtZXJhdGVfYWZ0ZXJfam9pbihzZWxmKToKQEAgLTM1NCw4ICszNTQsOCBAQAogICAgICAgICByYyA9IHAud2FpdCgpCiAgICAgICAgIGRhdGEgPSBwLnN0ZG91dC5yZWFkKCkucmVwbGFjZSgnXHInLCAnJykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkYXRhLCAiZW5kIG9mIG1haW5cbmVuZCBvZiB0aHJlYWRcbiIpCi0gICAgICAgIHNlbGYuZmFpbElmKHJjID09IDIsICJpbnRlcnByZXRlciB3YXMgYmxvY2tlZCIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhyYyA9PSAwLCAiVW5leHBlY3RlZCBlcnJvciIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocmMgPT0gMiwgImludGVycHJldGVyIHdhcyBibG9ja2VkIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJjID09IDAsICJVbmV4cGVjdGVkIGVycm9yIikKIAogICAgIGRlZiB0ZXN0XzFfam9pbl9vbl9zaHV0ZG93bihzZWxmKToKICAgICAgICAgIyBUaGUgdXN1YWwgY2FzZTogb24gZXhpdCwgd2FpdCBmb3IgYSBub24tZGFlbW9uIHRocmVhZApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF90aHJlYWRpbmdfbG9jYWwucHkgYi9MaWIvdGVzdC90ZXN0X3RocmVhZGluZ19sb2NhbC5weQppbmRleCA4NjQyMTQxLi5mYzJjMzQxIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RocmVhZGluZ19sb2NhbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3RocmVhZGluZ19sb2NhbC5weQpAQCAtNDAsNyArNDAsNyBAQAogICAgICAgICBsb2NhbC5zb21lb3RoZXJ2YXIgPSBOb25lCiAgICAgICAgIGdjLmNvbGxlY3QoKQogICAgICAgICBkZWFkbGlzdCA9IFt3ZWFrIGZvciB3ZWFrIGluIHdlYWtsaXN0IGlmIHdlYWsoKSBpcyBOb25lXQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGRlYWRsaXN0KSBpbiAobi0xLCBuKSwgKG4sIGxlbihkZWFkbGlzdCkpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGRlYWRsaXN0KSBpbiAobi0xLCBuKSwgKG4sIGxlbihkZWFkbGlzdCkpKQogCiAgICAgZGVmIHRlc3RfZGVyaXZlZChzZWxmKToKICAgICAgICAgIyBJc3N1ZSAzMDg4OiBpZiB0aGVyZSBpcyBhIHRocmVhZHMgc3dpdGNoIGluc2lkZSB0aGUgX19pbml0X18KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGltZS5weSBiL0xpYi90ZXN0L3Rlc3RfdGltZS5weQppbmRleCBiNTE1NWI0Li45NjVmN2UyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RpbWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aW1lLnB5CkBAIC0xOCw5ICsxOCw5IEBACiAgICAgICAgIHRpbWUuY2xvY2soKQogCiAgICAgZGVmIHRlc3RfY29udmVyc2lvbnMoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0aW1lLmN0aW1lKHNlbGYudCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRpbWUuY3RpbWUoc2VsZi50KQogICAgICAgICAgICAgICAgICAgICAgPT0gdGltZS5hc2N0aW1lKHRpbWUubG9jYWx0aW1lKHNlbGYudCkpKQotICAgICAgICBzZWxmLmFzc2VydF8obG9uZyh0aW1lLm1rdGltZSh0aW1lLmxvY2FsdGltZShzZWxmLnQpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxvbmcodGltZS5ta3RpbWUodGltZS5sb2NhbHRpbWUoc2VsZi50KSkpCiAgICAgICAgICAgICAgICAgICAgICA9PSBsb25nKHNlbGYudCkpCiAKICAgICBkZWYgdGVzdF9zbGVlcChzZWxmKToKQEAgLTE0OCwzNiArMTQ4LDM2IEBACiAgICAgICAgICAgICB0aW1lLnR6c2V0KCkKICAgICAgICAgICAgIGVudmlyb25bJ1RaJ10gPSB1dGMKICAgICAgICAgICAgIHRpbWUudHpzZXQoKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAogICAgICAgICAgICAgICAgIHRpbWUuZ210aW1lKHhtYXMyMDAyKSwgdGltZS5sb2NhbHRpbWUoeG1hczIwMDIpCiAgICAgICAgICAgICAgICAgKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodGltZS5kYXlsaWdodCwgMCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRpbWUudGltZXpvbmUsIDApCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0aW1lLmxvY2FsdGltZSh4bWFzMjAwMikudG1faXNkc3QsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUuZGF5bGlnaHQsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUudGltZXpvbmUsIDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUubG9jYWx0aW1lKHhtYXMyMDAyKS50bV9pc2RzdCwgMCkKIAogICAgICAgICAgICAgIyBNYWtlIHN1cmUgd2UgY2FuIHN3aXRjaCB0byBVUy9FYXN0ZXJuCiAgICAgICAgICAgICBlbnZpcm9uWydUWiddID0gZWFzdGVybgogICAgICAgICAgICAgdGltZS50enNldCgpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZkVxdWFsKHRpbWUuZ210aW1lKHhtYXMyMDAyKSwgdGltZS5sb2NhbHRpbWUoeG1hczIwMDIpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodGltZS50em5hbWUsICgnRVNUJywgJ0VEVCcpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHRpbWUudHpuYW1lKSwgMikKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRpbWUuZGF5bGlnaHQsIDEpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0aW1lLnRpbWV6b25lLCAxODAwMCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRpbWUuYWx0em9uZSwgMTQ0MDApCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0aW1lLmxvY2FsdGltZSh4bWFzMjAwMikudG1faXNkc3QsIDApCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4odGltZS50em5hbWUpLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh0aW1lLmdtdGltZSh4bWFzMjAwMiksIHRpbWUubG9jYWx0aW1lKHhtYXMyMDAyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS50em5hbWUsICgnRVNUJywgJ0VEVCcpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGltZS50em5hbWUpLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLmRheWxpZ2h0LCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLnRpbWV6b25lLCAxODAwMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS5hbHR6b25lLCAxNDQwMCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGltZS5sb2NhbHRpbWUoeG1hczIwMDIpLnRtX2lzZHN0LCAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGltZS50em5hbWUpLCAyKQogCiAgICAgICAgICAgICAjIE5vdyBnbyB0byB0aGUgc291dGhlcm4gaGVtaXNwaGVyZS4KICAgICAgICAgICAgIGVudmlyb25bJ1RaJ10gPSB2aWN0b3JpYQogICAgICAgICAgICAgdGltZS50enNldCgpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZkVxdWFsKHRpbWUuZ210aW1lKHhtYXMyMDAyKSwgdGltZS5sb2NhbHRpbWUoeG1hczIwMDIpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHRpbWUudHpuYW1lWzBdID09ICdBRVNUJywgc3RyKHRpbWUudHpuYW1lWzBdKSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0aW1lLnR6bmFtZVsxXSA9PSAnQUVEVCcsIHN0cih0aW1lLnR6bmFtZVsxXSkpCi0gICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4odGltZS50em5hbWUpLCAyKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodGltZS5kYXlsaWdodCwgMSkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRpbWUudGltZXpvbmUsIC0zNjAwMCkKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRpbWUuYWx0em9uZSwgLTM5NjAwKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodGltZS5sb2NhbHRpbWUoeG1hczIwMDIpLnRtX2lzZHN0LCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbCh0aW1lLmdtdGltZSh4bWFzMjAwMiksIHRpbWUubG9jYWx0aW1lKHhtYXMyMDAyKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aW1lLnR6bmFtZVswXSA9PSAnQUVTVCcsIHN0cih0aW1lLnR6bmFtZVswXSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodGltZS50em5hbWVbMV0gPT0gJ0FFRFQnLCBzdHIodGltZS50em5hbWVbMV0pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4odGltZS50em5hbWUpLCAyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLmRheWxpZ2h0LCAxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLnRpbWV6b25lLCAtMzYwMDApCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRpbWUuYWx0em9uZSwgLTM5NjAwKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0aW1lLmxvY2FsdGltZSh4bWFzMjAwMikudG1faXNkc3QsIDEpCiAKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICMgUmVwYWlyIFRaIGVudmlyb25tZW50IHZhcmlhYmxlIGluIGNhc2UgYW55IG90aGVyIHRlc3RzCkBAIC0yMDksMTQgKzIwOSwxNCBAQAogICAgICAgICBndDEgPSB0aW1lLmdtdGltZShOb25lKQogICAgICAgICB0MCA9IHRpbWUubWt0aW1lKGd0MCkKICAgICAgICAgdDEgPSB0aW1lLm1rdGltZShndDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygwIDw9ICh0MS10MCkgPCAwLjIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIDw9ICh0MS10MCkgPCAwLjIpCiAKICAgICBkZWYgdGVzdF9sb2NhbHRpbWVfd2l0aG91dF9hcmcoc2VsZik6CiAgICAgICAgIGx0MCA9IHRpbWUubG9jYWx0aW1lKCkKICAgICAgICAgbHQxID0gdGltZS5sb2NhbHRpbWUoTm9uZSkKICAgICAgICAgdDAgPSB0aW1lLm1rdGltZShsdDApCiAgICAgICAgIHQxID0gdGltZS5ta3RpbWUobHQxKQotICAgICAgICBzZWxmLmFzc2VydF8oMCA8PSAodDEtdDApIDwgMC4yKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSAodDEtdDApIDwgMC4yKQogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUaW1lVGVzdENhc2UpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RpbWVvdXQucHkgYi9MaWIvdGVzdC90ZXN0X3RpbWVvdXQucHkKaW5kZXggMDI2ODdiMC4uMDRjZmJlNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90aW1lb3V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdGltZW91dC5weQpAQCAtMTE5LDExICsxMTksMTEgQEAKICAgICAgICAgc2VsZi5zb2NrLnNldHRpbWVvdXQoX3RpbWVvdXQpCiAKICAgICAgICAgX3QxID0gdGltZS50aW1lKCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKHNvY2tldC5lcnJvciwgc2VsZi5zb2NrLmNvbm5lY3QsIGFkZHIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgc2VsZi5zb2NrLmNvbm5lY3QsIGFkZHIpCiAgICAgICAgIF90MiA9IHRpbWUudGltZSgpCiAKICAgICAgICAgX2RlbHRhID0gYWJzKF90MSAtIF90MikKLSAgICAgICAgc2VsZi5hc3NlcnRfKF9kZWx0YSA8IF90aW1lb3V0ICsgc2VsZi5mdXp6LAorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2RlbHRhIDwgX3RpbWVvdXQgKyBzZWxmLmZ1enosCiAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCAoJWcpIGlzIG1vcmUgdGhhbiAlZyBzZWNvbmRzIG1vcmUgdGhhbiBleHBlY3RlZCAoJWcpIgogICAgICAgICAgICAgICAgICAgICAgJShfZGVsdGEsIHNlbGYuZnV6eiwgX3RpbWVvdXQpKQogCkBAIC0xMzQsMTEgKzEzNCwxMSBAQAogICAgICAgICBzZWxmLnNvY2suc2V0dGltZW91dChfdGltZW91dCkKIAogICAgICAgICBfdDEgPSB0aW1lLnRpbWUoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoc29ja2V0LmVycm9yLCBzZWxmLnNvY2sucmVjdiwgMTAyNCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCBzZWxmLnNvY2sucmVjdiwgMTAyNCkKICAgICAgICAgX3QyID0gdGltZS50aW1lKCkKIAogICAgICAgICBfZGVsdGEgPSBhYnMoX3QxIC0gX3QyKQotICAgICAgICBzZWxmLmFzc2VydF8oX2RlbHRhIDwgX3RpbWVvdXQgKyBzZWxmLmZ1enosCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfZGVsdGEgPCBfdGltZW91dCArIHNlbGYuZnV6eiwKICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0ICglZykgaXMgJWcgc2Vjb25kcyBtb3JlIHRoYW4gZXhwZWN0ZWQgKCVnKSIKICAgICAgICAgICAgICAgICAgICAgICUoX2RlbHRhLCBzZWxmLmZ1enosIF90aW1lb3V0KSkKIApAQCAtMTUwLDExICsxNTAsMTEgQEAKICAgICAgICAgc2VsZi5zb2NrLmxpc3Rlbig1KQogCiAgICAgICAgIF90MSA9IHRpbWUudGltZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhzb2NrZXQuZXJyb3IsIHNlbGYuc29jay5hY2NlcHQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgc2VsZi5zb2NrLmFjY2VwdCkKICAgICAgICAgX3QyID0gdGltZS50aW1lKCkKIAogICAgICAgICBfZGVsdGEgPSBhYnMoX3QxIC0gX3QyKQotICAgICAgICBzZWxmLmFzc2VydF8oX2RlbHRhIDwgX3RpbWVvdXQgKyBzZWxmLmZ1enosCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShfZGVsdGEgPCBfdGltZW91dCArIHNlbGYuZnV6eiwKICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0ICglZykgaXMgJWcgc2Vjb25kcyBtb3JlIHRoYW4gZXhwZWN0ZWQgKCVnKSIKICAgICAgICAgICAgICAgICAgICAgICUoX2RlbHRhLCBzZWxmLmZ1enosIF90aW1lb3V0KSkKIApAQCAtMTY2LDExICsxNjYsMTEgQEAKICAgICAgICAgc2VsZi5zb2NrLmJpbmQoc2VsZi5hZGRyX2xvY2FsKQogCiAgICAgICAgIF90MSA9IHRpbWUudGltZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhzb2NrZXQuZXJyb3IsIHNlbGYuc29jay5yZWN2ZnJvbSwgODE5MikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoc29ja2V0LmVycm9yLCBzZWxmLnNvY2sucmVjdmZyb20sIDgxOTIpCiAgICAgICAgIF90MiA9IHRpbWUudGltZSgpCiAKICAgICAgICAgX2RlbHRhID0gYWJzKF90MSAtIF90MikKLSAgICAgICAgc2VsZi5hc3NlcnRfKF9kZWx0YSA8IF90aW1lb3V0ICsgc2VsZi5mdXp6LAorICAgICAgICBzZWxmLmFzc2VydFRydWUoX2RlbHRhIDwgX3RpbWVvdXQgKyBzZWxmLmZ1enosCiAgICAgICAgICAgICAgICAgICAgICAidGltZW91dCAoJWcpIGlzICVnIHNlY29uZHMgbW9yZSB0aGFuIGV4cGVjdGVkICglZykiCiAgICAgICAgICAgICAgICAgICAgICAlKF9kZWx0YSwgc2VsZi5mdXp6LCBfdGltZW91dCkpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5IGIvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKaW5kZXggMTE0MGE5NC4uYjI5ODY5YSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKQEAgLTM3LDE2ICszNywxNiBAQAogICAgIGRlZiB0ZXN0X2NhcmV0KHNlbGYpOgogICAgICAgICBlcnIgPSBzZWxmLmdldF9leGNlcHRpb25fZm9ybWF0KHNlbGYuc3ludGF4X2Vycm9yX3dpdGhfY2FyZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4RXJyb3IpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZXJyKSA9PSA0KQotICAgICAgICBzZWxmLmFzc2VydF8oZXJyWzFdLnN0cmlwKCkgPT0gInJldHVybiB4ISIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiXiIgaW4gZXJyWzJdKSAjIHRoaXJkIGxpbmUgaGFzIGNhcmV0Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhlcnJbMV0uZmluZCgiISIpID09IGVyclsyXS5maW5kKCJeIikpICMgaW4gdGhlIHJpZ2h0IHBsYWNlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZXJyKSA9PSA0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXJyWzFdLnN0cmlwKCkgPT0gInJldHVybiB4ISIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiXiIgaW4gZXJyWzJdKSAjIHRoaXJkIGxpbmUgaGFzIGNhcmV0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcnJbMV0uZmluZCgiISIpID09IGVyclsyXS5maW5kKCJeIikpICMgaW4gdGhlIHJpZ2h0IHBsYWNlCiAKICAgICAgICAgZXJyID0gc2VsZi5nZXRfZXhjZXB0aW9uX2Zvcm1hdChzZWxmLnN5bnRheF9lcnJvcl93aXRoX2NhcmV0XzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4RXJyb3IpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiXiIgaW4gZXJyWzJdKSAjIHRoaXJkIGxpbmUgaGFzIGNhcmV0Ci0gICAgICAgIHNlbGYuYXNzZXJ0XyhlcnJbMl0uY291bnQoJ1xuJykgPT0gMSkgIyBhbmQgbm8gYWRkaXRpb25hbCBuZXdsaW5lCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhlcnJbMV0uZmluZCgiKyIpID09IGVyclsyXS5maW5kKCJeIikpICMgaW4gdGhlIHJpZ2h0IHBsYWNlCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiXiIgaW4gZXJyWzJdKSAjIHRoaXJkIGxpbmUgaGFzIGNhcmV0CisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcnJbMl0uY291bnQoJ1xuJykgPT0gMSkgIyBhbmQgbm8gYWRkaXRpb25hbCBuZXdsaW5lCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcnJbMV0uZmluZCgiKyIpID09IGVyclsyXS5maW5kKCJeIikpICMgaW4gdGhlIHJpZ2h0IHBsYWNlCiAKICAgICBkZWYgdGVzdF9ub2NhcmV0KHNlbGYpOgogICAgICAgICBpZiBpc19qeXRob246CkBAIC01NCwxNiArNTQsMTYgQEAKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBlcnIgPSBzZWxmLmdldF9leGNlcHRpb25fZm9ybWF0KHNlbGYuc3ludGF4X2Vycm9yX3dpdGhvdXRfY2FyZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4RXJyb3IpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZXJyKSA9PSAzKQotICAgICAgICBzZWxmLmFzc2VydF8oZXJyWzFdLnN0cmlwKCkgPT0gIlt4IGZvciB4IGluIHhdID0geCIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZXJyKSA9PSAzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXJyWzFdLnN0cmlwKCkgPT0gIlt4IGZvciB4IGluIHhdID0geCIpCiAKICAgICBkZWYgdGVzdF9iYWRfaW5kZW50YXRpb24oc2VsZik6CiAgICAgICAgIGVyciA9IHNlbGYuZ2V0X2V4Y2VwdGlvbl9mb3JtYXQoc2VsZi5zeW50YXhfZXJyb3JfYmFkX2luZGVudGF0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGVudGF0aW9uRXJyb3IpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZXJyKSA9PSA0KQotICAgICAgICBzZWxmLmFzc2VydF8oZXJyWzFdLnN0cmlwKCkgPT0gInByaW50IDIiKQotICAgICAgICBzZWxmLmFzc2VydF8oIl4iIGluIGVyclsyXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGVyclsxXS5maW5kKCIyIikgPT0gZXJyWzJdLmZpbmQoIl4iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihlcnIpID09IDQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlcnJbMV0uc3RyaXAoKSA9PSAicHJpbnQgMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiXiIgaW4gZXJyWzJdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXJyWzFdLmZpbmQoIjIiKSA9PSBlcnJbMl0uZmluZCgiXiIpKQogCiAgICAgZGVmIHRlc3RfYnVnNzM3NDczKHNlbGYpOgogICAgICAgICBpbXBvcnQgc3lzLCBvcywgdGVtcGZpbGUsIHRpbWUKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgICAgICAgICAgICAgIHRlc3RfYnVnNzM3NDczLnRlc3QoKQogICAgICAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CiAgICAgICAgICAgICAgICAgc3JjID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIoc3lzLmV4Y190cmFjZWJhY2spWy0xXVstMV0KLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzcmMsICdyYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yJykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNyYywgJ3JhaXNlIE5vdEltcGxlbWVudGVkRXJyb3InKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc3lzLnBhdGhbOl0gPSBzYXZlZHBhdGgKICAgICAgICAgICAgIGZvciBmIGluIG9zLmxpc3RkaXIodGVzdGRpcik6CkBAIC0xODEsOSArMTgxLDkgQEAKICAgICAgICAgdGJfbGluZXMgPSBweXRob25fZm10LnNwbGl0bGluZXMoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4odGJfbGluZXMpLCAzKQogICAgICAgICBiYW5uZXIsIGxvY2F0aW9uLCBzb3VyY2VfbGluZSA9IHRiX2xpbmVzCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhiYW5uZXIuc3RhcnRzd2l0aCgnVHJhY2ViYWNrJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhsb2NhdGlvbi5zdGFydHN3aXRoKCcgIEZpbGUnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHNvdXJjZV9saW5lLnN0YXJ0c3dpdGgoJyAgICByYWlzZScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmFubmVyLnN0YXJ0c3dpdGgoJ1RyYWNlYmFjaycpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobG9jYXRpb24uc3RhcnRzd2l0aCgnICBGaWxlJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzb3VyY2VfbGluZS5zdGFydHN3aXRoKCcgICAgcmFpc2UnKSkKIAogCiBkZWYgdGVzdF9tYWluKCk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3R1cGxlLnB5IGIvTGliL3Rlc3QvdGVzdF90dXBsZS5weQppbmRleCA4OWNiZTFkLi42NDM2NDEyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3R1cGxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHVwbGUucHkKQEAgLTExLDcgKzExLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZSgpLCAoKSkKICAgICAgICAgdDBfMyA9ICgwLCAxLCAyLCAzKQogICAgICAgICB0MF8zX2JpcyA9IHR1cGxlKHQwXzMpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0MF8zIGlzIHQwXzNfYmlzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodDBfMyBpcyB0MF8zX2JpcykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZShbXSksICgpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHR1cGxlKFswLCAxLCAyLCAzXSksICgwLCAxLCAyLCAzKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0dXBsZSgnJyksICgpKQpAQCAtMTksOCArMTksOCBAQAogCiAgICAgZGVmIHRlc3RfdHJ1dGgoc2VsZik6CiAgICAgICAgIHN1cGVyKFR1cGxlVGVzdCwgc2VsZikudGVzdF90cnV0aCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgKCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygoNDIsICkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoNDIsICkpCiAKICAgICBkZWYgdGVzdF9sZW4oc2VsZik6CiAgICAgICAgIHN1cGVyKFR1cGxlVGVzdCwgc2VsZikudGVzdF9sZW4oKQpAQCAtMzMsMTQgKzMzLDE0IEBACiAgICAgICAgIHUgPSAoMCwgMSkKICAgICAgICAgdTIgPSB1CiAgICAgICAgIHUgKz0gKDIsIDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1IGlzIG5vdCB1MikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUgaXMgbm90IHUyKQogCiAgICAgZGVmIHRlc3RfaW11bChzZWxmKToKICAgICAgICAgc3VwZXIoVHVwbGVUZXN0LCBzZWxmKS50ZXN0X2ltdWwoKQogICAgICAgICB1ID0gKDAsIDEpCiAgICAgICAgIHUyID0gdQogICAgICAgICB1ICo9IDMKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUgaXMgbm90IHUyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSBpcyBub3QgdTIpCiAKICAgICBkZWYgdGVzdF90dXBsZXJlc2l6ZWJ1ZyhzZWxmKToKICAgICAgICAgIyBDaGVjayB0aGF0IGEgc3BlY2lmaWMgYnVnIGluIF9QeVR1cGxlX1Jlc2l6ZSgpIGlzIHNxdWFzaGVkLgpAQCAtNzEsNyArNzEsNyBAQAogICAgICAgICBpbnBzID0gYmFzZSArIFsoaSwgaikgZm9yIGkgaW4gYmFzZSBmb3IgaiBpbiB4cF0gKyBcCiAgICAgICAgICAgICAgICAgICAgICBbKGksIGopIGZvciBpIGluIHhwIGZvciBqIGluIGJhc2VdICsgeHAgKyB6aXAoYmFzZSkKICAgICAgICAgY29sbGlzaW9ucyA9IGxlbihpbnBzKSAtIGxlbihzZXQobWFwKGhhc2gsIGlucHMpKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNvbGxpc2lvbnMgPD0gMTUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb2xsaXNpb25zIDw9IDE1KQogCiAgICAgZGVmIHRlc3RfcmVwcihzZWxmKToKICAgICAgICAgbDAgPSB0dXBsZSgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VuYXJ5LnB5IGIvTGliL3Rlc3QvdGVzdF91bmFyeS5weQppbmRleCA5ODU0ZjY0Li41OThmY2E4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VuYXJ5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdW5hcnkucHkKQEAgLTYsMzIgKzYsMzIgQEAKIGNsYXNzIFVuYXJ5T3BUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdF9uZWdhdGl2ZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKC0yID09IDAgLSAyKQotICAgICAgICBzZWxmLmFzc2VydF8oLTAgPT0gMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKC0tMiA9PSAyKQotICAgICAgICBzZWxmLmFzc2VydF8oLTJMID09IDAgLSAyTCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKC0yLjAgPT0gMCAtIDIuMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKC0yaiA9PSAwIC0gMmopCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMiA9PSAwIC0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC0wID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtLTIgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC0yTCA9PSAwIC0gMkwpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMi4wID09IDAgLSAyLjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMmogPT0gMCAtIDJqKQogCiAgICAgZGVmIHRlc3RfcG9zaXRpdmUoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XygrMiA9PSAyKQotICAgICAgICBzZWxmLmFzc2VydF8oKzAgPT0gMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCsrMiA9PSAyKQotICAgICAgICBzZWxmLmFzc2VydF8oKzJMID09IDJMKQotICAgICAgICBzZWxmLmFzc2VydF8oKzIuMCA9PSAyLjApCi0gICAgICAgIHNlbGYuYXNzZXJ0XygrMmogPT0gMmopCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgrMiA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKzAgPT0gMCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCsrMiA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKzJMID09IDJMKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKzIuMCA9PSAyLjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgrMmogPT0gMmopCiAKICAgICBkZWYgdGVzdF9pbnZlcnQoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0XygtMiA9PSAwIC0gMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKC0wID09IDApCi0gICAgICAgIHNlbGYuYXNzZXJ0XygtLTIgPT0gMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKC0yTCA9PSAwIC0gMkwpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtMiA9PSAwIC0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC0wID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgtLTIgPT0gMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC0yTCA9PSAwIC0gMkwpCiAKICAgICBkZWYgdGVzdF9ub19vdmVyZmxvdyhzZWxmKToKICAgICAgICAgbmluZXMgPSAiOSIgKiAzMgotICAgICAgICBzZWxmLmFzc2VydF8oZXZhbCgiKyIgKyBuaW5lcykgPT0gZXZhbCgiKyIgKyBuaW5lcyArICJMIikpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhldmFsKCItIiArIG5pbmVzKSA9PSBldmFsKCItIiArIG5pbmVzICsgIkwiKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGV2YWwoIn4iICsgbmluZXMpID09IGV2YWwoIn4iICsgbmluZXMgKyAiTCIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXZhbCgiKyIgKyBuaW5lcykgPT0gZXZhbCgiKyIgKyBuaW5lcyArICJMIikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShldmFsKCItIiArIG5pbmVzKSA9PSBldmFsKCItIiArIG5pbmVzICsgIkwiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGV2YWwoIn4iICsgbmluZXMpID09IGV2YWwoIn4iICsgbmluZXMgKyAiTCIpKQogCiAgICAgZGVmIHRlc3RfbmVnYXRpb25fb2ZfZXhwb25lbnRpYXRpb24oc2VsZik6CiAgICAgICAgICMgTWFrZSBzdXJlICcqKicgZG9lcyB0aGUgcmlnaHQgdGhpbmc7IHRoZXNlIGZvcm0gYQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5IGIvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5CmluZGV4IDk5MTU1ZWMuLjQzODMwYjIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihvYmplY3QsIG1ldGhvZG5hbWUpCiAgICAgICAgIHJlYWxyZXN1bHQgPSBtZXRob2QoKmFyZ3MpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVhbHJlc3VsdCwgcmVzdWx0KQotICAgICAgICBzZWxmLmFzc2VydF8odHlwZShyZWFscmVzdWx0KSBpcyB0eXBlKHJlc3VsdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHJlYWxyZXN1bHQpIGlzIHR5cGUocmVzdWx0KSkKIAogICAgICAgICAjIGlmIHRoZSBvcmlnaW5hbCBpcyByZXR1cm5lZCBtYWtlIHN1cmUgdGhhdAogICAgICAgICAjIHRoaXMgZG9lc24ndCBoYXBwZW4gd2l0aCBzdWJjbGFzc2VzCkBAIC01MCw3ICs1MCw3IEBACiAgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKG9iamVjdCwgbWV0aG9kbmFtZSkKICAgICAgICAgICAgIHJlYWxyZXN1bHQgPSBtZXRob2QoKmFyZ3MpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlYWxyZXN1bHQsIHJlc3VsdCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvYmplY3QgaXMgbm90IHJlYWxyZXN1bHQpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob2JqZWN0IGlzIG5vdCByZWFscmVzdWx0KQogCiAgICAgZGVmIHRlc3RfbGl0ZXJhbHMoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdceGZmJywgdSdcdTAwZmYnKQpAQCAtMjAwLDI1ICsyMDAsMjUgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1J2FiYycsICdhYmMnKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmMnLCB1J2FiYycpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdhYmMnLCB1J2FiYycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J2FiY2QnID4gJ2FiYycpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYWJjZCcgPiB1J2FiYycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J2FiY2QnID4gdSdhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhYmMnIDwgJ2FiY2QnKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2FiYycgPCB1J2FiY2QnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhYmMnIDwgdSdhYmNkJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYWJjZCcgPiAnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhYmNkJyA+IHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYWJjZCcgPiB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2FiYycgPCAnYWJjZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYWJjJyA8IHUnYWJjZCcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2FiYycgPCB1J2FiY2QnKQogCiAgICAgICAgIGlmIDA6CiAgICAgICAgICAgICAjIE1vdmUgdGhlc2UgdGVzdHMgdG8gYSBVbmljb2RlIGNvbGxhdGlvbiBtb2R1bGUgdGVzdC4uLgogICAgICAgICAgICAgIyBUZXN0aW5nIFVURi0xNiBjb2RlIHBvaW50IG9yZGVyIGNvbXBhcmlzb25zLi4uCiAKICAgICAgICAgICAgICMgTm8gc3Vycm9nYXRlcywgbm8gZml4dXAgcmVxdWlyZWQuCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odSdcdTAwNjEnIDwgdSdcdTIwYWMnKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnXHUwMDYxJyA8IHUnXHUyMGFjJykKICAgICAgICAgICAgICMgTm9uIHN1cnJvZ2F0ZSBiZWxvdyBzdXJyb2dhdGUgdmFsdWUsIG5vIGZpeHVwIHJlcXVpcmVkCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odSdcdTAwNjEnIDwgdSdcdWQ4MDBcdWRjMDInKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnXHUwMDYxJyA8IHUnXHVkODAwXHVkYzAyJykKIAogICAgICAgICAgICAgIyBOb24gc3Vycm9nYXRlIGFib3ZlIHN1cnJvZ2F0ZSB2YWx1ZSwgZml4dXAgcmVxdWlyZWQKICAgICAgICAgICAgIGRlZiB0ZXN0X2xlY21wKHMsIHMyKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8ocyA8IHMyKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzIDwgczIpCiAKICAgICAgICAgICAgIGRlZiB0ZXN0X2ZpeHVwKHMpOgogICAgICAgICAgICAgICAgIHMyID0gdSdcdWQ4MDBcdWRjMDEnCkBAIC0yNTgsNyArMjU4LDcgQEAKICAgICAgICAgICAgICAgICB0ZXN0X2ZpeHVwKHUnXHVmZjYxJykKIAogICAgICAgICAjIFN1cnJvZ2F0ZXMgb24gYm90aCBzaWRlcywgbm8gZml4dXAgcmVxdWlyZWQKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnXHVkODAwXHVkYzAyJyA8IHUnXHVkODRkXHVkYzU2JykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnXHVkODAwXHVkYzAyJyA8IHUnXHVkODRkXHVkYzU2JykKIAogICAgIGRlZiB0ZXN0X2lzbG93ZXIoc2VsZik6CiAgICAgICAgIHN0cmluZ190ZXN0cy5NaXhpblN0clVuaWNvZGVVc2VyU3RyaW5nVGVzdC50ZXN0X2lzbG93ZXIoc2VsZikKQEAgLTMxNiw2MyArMzE2LDYzIEBACiAKICAgICBkZWYgdGVzdF9jb250YWlucyhzZWxmKToKICAgICAgICAgIyBUZXN0aW5nIFVuaWNvZGUgY29udGFpbnMgbWV0aG9kCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYScgaW4gdSdhYmRiJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBpbiB1J2JkYWInKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2EnIGluIHUnYmRhYmEnKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2EnIGluIHUnYmRiYScpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYScgaW4gdSdiZGJhJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYScgaW4gdSdiZGJhJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYScgbm90IGluIHUnYmRiJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYScgbm90IGluICdiZGInKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhJyBpbiAnYmRiYScpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J2EnIGluICgnYScsMSxOb25lKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYScgaW4gKDEsTm9uZSwnYScpKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhJyBpbiAoMSxOb25lLHUnYScpKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2EnIGluICgnYScsMSxOb25lKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBpbiAoMSxOb25lLCdhJykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYScgaW4gKDEsTm9uZSx1J2EnKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhJyBub3QgaW4gKCd4JywxLHUneScpKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2EnIG5vdCBpbiAoJ3gnLDEsTm9uZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J2FiY2QnIG5vdCBpbiB1J2FiY3h4eHgnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhYicgaW4gdSdhYmNkJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhYicgaW4gdSdhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhYicgaW4gJ2FiYycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J2FiJyBpbiAoMSxOb25lLHUnYWInKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnJyBpbiB1J2FiYycpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnJyBpbiB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYScgaW4gdSdhYmRiJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBpbiB1J2JkYWInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIGluIHUnYmRhYmEnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIGluIHUnYmRiYScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYScgaW4gdSdiZGJhJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYScgaW4gdSdiZGJhJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYScgbm90IGluIHUnYmRiJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYScgbm90IGluICdiZGInKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhJyBpbiAnYmRiYScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2EnIGluICgnYScsMSxOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYScgaW4gKDEsTm9uZSwnYScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhJyBpbiAoMSxOb25lLHUnYScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIGluICgnYScsMSxOb25lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBpbiAoMSxOb25lLCdhJykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYScgaW4gKDEsTm9uZSx1J2EnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhJyBub3QgaW4gKCd4JywxLHUneScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIG5vdCBpbiAoJ3gnLDEsTm9uZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2FiY2QnIG5vdCBpbiB1J2FiY3h4eHgnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhYicgaW4gdSdhYmNkJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhYicgaW4gdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhYicgaW4gJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2FiJyBpbiAoMSxOb25lLHUnYWInKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnJyBpbiB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnJyBpbiB1J2FiYycpCiAKICAgICAgICAgIyBJZiB0aGUgZm9sbG93aW5nIGZhaWxzIGVpdGhlcgogICAgICAgICAjIHRoZSBjb250YWlucyBvcGVyYXRvciBkb2VzIG5vdCBwcm9wYWdhdGUgVW5pY29kZUVycm9ycyBvcgogICAgICAgICAjIHNvbWVvbmUgaGFzIGNoYW5nZWQgdGhlIGRlZmF1bHQgZW5jb2RpbmcKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVycm9yLCAnZ1x4ZTJ0ZWF1Jy5fX2NvbnRhaW5zX18sIHUnXHhlMicpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnJyBpbiAnJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCcnIGluIHUnJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnJyBpbiB1JycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1JycgaW4gJ2FiYycpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnJyBpbiB1J2FiYycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1JycgaW4gdSdhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdcMCcgbm90IGluICdhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8oJ1wwJyBub3QgaW4gdSdhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdcMCcgbm90IGluIHUnYWJjJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnXDAnIGluICdcMGFiYycpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnXDAnIGluIHUnXDBhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdcMCcgaW4gdSdcMGFiYycpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J1wwJyBpbiAnYWJjXDAnKQotICAgICAgICBzZWxmLmFzc2VydF8oJ1wwJyBpbiB1J2FiY1wwJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnXDAnIGluIHUnYWJjXDAnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhJyBpbiAnXDBhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2EnIGluIHUnXDBhYmMnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhJyBpbiB1J1wwYWJjJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYXNkZicgaW4gJ2FzZGYnKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2FzZGYnIGluIHUnYXNkZicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J2FzZGYnIGluIHUnYXNkZicpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1J2FzZGYnIG5vdCBpbiAnYXNkJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdhc2RmJyBub3QgaW4gdSdhc2QnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhc2RmJyBub3QgaW4gdSdhc2QnKQotICAgICAgICBzZWxmLmFzc2VydF8odSdhc2RmJyBub3QgaW4gJycpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnYXNkZicgbm90IGluIHUnJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUnYXNkZicgbm90IGluIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnJyBpbiAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCcnIGluIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnJyBpbiB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1JycgaW4gJ2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnJyBpbiB1J2FiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1JycgaW4gdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdcMCcgbm90IGluICdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1wwJyBub3QgaW4gdSdhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdcMCcgbm90IGluIHUnYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnXDAnIGluICdcMGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnXDAnIGluIHUnXDBhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdcMCcgaW4gdSdcMGFiYycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J1wwJyBpbiAnYWJjXDAnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1wwJyBpbiB1J2FiY1wwJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnXDAnIGluIHUnYWJjXDAnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhJyBpbiAnXDBhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2EnIGluIHUnXDBhYmMnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhJyBpbiB1J1wwYWJjJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYXNkZicgaW4gJ2FzZGYnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2FzZGYnIGluIHUnYXNkZicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2FzZGYnIGluIHUnYXNkZicpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1J2FzZGYnIG5vdCBpbiAnYXNkJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdhc2RmJyBub3QgaW4gdSdhc2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhc2RmJyBub3QgaW4gdSdhc2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSdhc2RmJyBub3QgaW4gJycpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnYXNkZicgbm90IGluIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUnYXNkZicgbm90IGluIHUnJykKIAogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHUiYWJjIi5fX2NvbnRhaW5zX18pCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdW5pY29kZV9maWxlLnB5IGIvTGliL3Rlc3QvdGVzdF91bmljb2RlX2ZpbGUucHkKaW5kZXggNWMxZjQ1Yi4uMzI2MjAwYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91bmljb2RlX2ZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91bmljb2RlX2ZpbGUucHkKQEAgLTQyLDE5ICs0MiwxOSBAQAogICAgICMgRG8gYWxsIHRoZSB0ZXN0cyB3ZSBjYW4gZ2l2ZW4gb25seSBhIHNpbmdsZSBmaWxlbmFtZS4gIFRoZSBmaWxlIHNob3VsZAogICAgICMgZXhpc3QuCiAgICAgZGVmIF9kb19zaW5nbGUoc2VsZiwgZmlsZW5hbWUpOgotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3MucGF0aC5leGlzdHMoZmlsZW5hbWUpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3MuYWNjZXNzKGZpbGVuYW1lLCBvcy5SX09LKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG9zLnBhdGguZXhpc3RzKG9zLnBhdGguYWJzcGF0aChmaWxlbmFtZSkpKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3MucGF0aC5pc2ZpbGUob3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKSkpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcy5hY2Nlc3Mob3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKSwgb3MuUl9PSykpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShmaWxlbmFtZSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5hY2Nlc3MoZmlsZW5hbWUsIG9zLlJfT0spKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMob3MucGF0aC5hYnNwYXRoKGZpbGVuYW1lKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmlzZmlsZShvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLmFjY2Vzcyhvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpLCBvcy5SX09LKSkKICAgICAgICAgb3MuY2htb2QoZmlsZW5hbWUsIDA3NzcpCiAgICAgICAgIG9zLnV0aW1lKGZpbGVuYW1lLCBOb25lKQogICAgICAgICBvcy51dGltZShmaWxlbmFtZSwgKHRpbWUudGltZSgpLCB0aW1lLnRpbWUoKSkpCiAgICAgICAgICMgQ29weS9yZW5hbWUgZXRjIHRlc3RzIHVzaW5nIHRoZSBzYW1lIGZpbGVuYW1lCiAgICAgICAgIHNlbGYuX2RvX2NvcHlpc2goZmlsZW5hbWUsIGZpbGVuYW1lKQogICAgICAgICAjIEZpbGVuYW1lIHNob3VsZCBhcHBlYXIgaW4gZ2xvYiBvdXRwdXQKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKAorICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgICBvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpPT1vcy5wYXRoLmFic3BhdGgoZ2xvYi5nbG9iKGZpbGVuYW1lKVswXSkpCiAgICAgICAgICMgYmFzZW5hbWUgc2hvdWxkIGFwcGVhciBpbiBsaXN0ZGlyLgogICAgICAgICBwYXRoLCBiYXNlID0gb3MucGF0aC5zcGxpdChvcy5wYXRoLmFic3BhdGgoZmlsZW5hbWUpKQpAQCAtNzEsNyArNzEsNyBAQAogICAgICAgICBiYXNlID0gdW5pY29kZWRhdGEubm9ybWFsaXplKCJORkQiLCBiYXNlKQogICAgICAgICBmaWxlX2xpc3QgPSBbdW5pY29kZWRhdGEubm9ybWFsaXplKCJORkQiLCBmKSBmb3IgZiBpbiBmaWxlX2xpc3RdCiAKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGJhc2UgaW4gZmlsZV9saXN0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYmFzZSBpbiBmaWxlX2xpc3QpCiAKICAgICAjIERvIGFzIG1hbnkgImVxdWl2YWxhbmN5JyB0ZXN0cyBhcyB3ZSBjYW4gLSBpZSwgY2hlY2sgdGhhdCBhbHRob3VnaCB3ZQogICAgICMgaGF2ZSBkaWZmZXJlbnQgdHlwZXMgZm9yIHRoZSBmaWxlbmFtZSwgdGhleSByZWZlciB0byB0aGUgc2FtZSBmaWxlLgpAQCAtNzksMTIgKzc5LDEyIEBACiAgICAgICAgICMgTm90ZSB3ZSBvbmx5IGNoZWNrICJmaWxlbmFtZTEgYWdhaW5zdCBmaWxlbmFtZTIiIC0gd2UgZG9uJ3QgYm90aGVyCiAgICAgICAgICMgY2hlY2tpbmcgImZpbGVuYW1lMiBhZ2FpbnN0IDEiLCBhcyB3ZSBhc3N1bWUgd2UgYXJlIGNhbGxlZCBhZ2FpbiB3aXRoCiAgICAgICAgICMgdGhlIGFyZ3MgcmV2ZXJzZWQuCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKGZpbGVuYW1lMSkhPXR5cGUoZmlsZW5hbWUyKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUoZmlsZW5hbWUxKSE9dHlwZShmaWxlbmFtZTIpLAogICAgICAgICAgICAgICAgICAgICAiTm8gcG9pbnQgY2hlY2tpbmcgZXF1aXZhbGVudCBmaWxlbmFtZXMgb2YgdGhlIHNhbWUgdHlwZSIpCiAgICAgICAgICMgc3RhdCBhbmQgbHN0YXQgc2hvdWxkIHJldHVybiB0aGUgc2FtZSByZXN1bHRzLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvcy5zdGF0KGZpbGVuYW1lMSksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3Muc3RhdChmaWxlbmFtZTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcy5zdGF0KGZpbGVuYW1lMikpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG9zLmxzdGF0KGZpbGVuYW1lMSksCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob3MubHN0YXQoZmlsZW5hbWUxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MubHN0YXQoZmlsZW5hbWUyKSkKICAgICAgICAgIyBDb3B5L3JlbmFtZSBldGMgdGVzdHMgdXNpbmcgZXF1aXZhbGVudCBmaWxlbmFtZQogICAgICAgICBzZWxmLl9kb19jb3B5aXNoKGZpbGVuYW1lMSwgZmlsZW5hbWUyKQpAQCAtOTIsMTkgKzkyLDE5IEBACiAgICAgIyBUZXN0cyB0aGF0IGNvcHksIG1vdmUsIGV0YyBvbmUgZmlsZSB0byBhbm90aGVyLgogICAgIGRlZiBfZG9fY29weWlzaChzZWxmLCBmaWxlbmFtZTEsIGZpbGVuYW1lMik6CiAgICAgICAgICMgU2hvdWxkIGJlIGFibGUgdG8gcmVuYW1lIHRoZSBmaWxlIHVzaW5nIGVpdGhlciBuYW1lLgotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mob3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUxKSkgIyBtdXN0IGV4aXN0LgorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUxKSkgIyBtdXN0IGV4aXN0LgogICAgICAgICBvcy5yZW5hbWUoZmlsZW5hbWUxLCBmaWxlbmFtZTIgKyAiLm5ldyIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcy5wYXRoLmlzZmlsZShmaWxlbmFtZTErIi5uZXciKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguaXNmaWxlKGZpbGVuYW1lMSsiLm5ldyIpKQogICAgICAgICBvcy5yZW5hbWUoZmlsZW5hbWUxICsgIi5uZXciLCBmaWxlbmFtZTIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcy5wYXRoLmlzZmlsZShmaWxlbmFtZTIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5pc2ZpbGUoZmlsZW5hbWUyKSkKIAogICAgICAgICBzaHV0aWwuY29weShmaWxlbmFtZTEsIGZpbGVuYW1lMiArICIubmV3IikKICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lMSArICIubmV3IikgIyByZW1vdmUgdXNpbmcgZXF1aXYgbmFtZS4KICAgICAgICAgIyBBbmQgYSBjb3VwbGUgb2YgbW92ZXMsIG9uZSB1c2luZyBlYWNoIG5hbWUuCiAgICAgICAgIHNodXRpbC5tb3ZlKGZpbGVuYW1lMSwgZmlsZW5hbWUyICsgIi5uZXciKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lMikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUyKSkKICAgICAgICAgc2h1dGlsLm1vdmUoZmlsZW5hbWUxICsgIi5uZXciLCBmaWxlbmFtZTIpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZTEpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUob3MucGF0aC5leGlzdHMoZmlsZW5hbWUxKSkKICAgICAgICAgIyBOb3RlIC0gZHVlIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBzaHV0aWwubW92ZSwKICAgICAgICAgIyBpdCB0cmllcyBhIHJlbmFtZSBmaXJzdC4gIFRoaXMgb25seSBmYWlscyBvbiBXaW5kb3dzIHdoZW4gb24KICAgICAgICAgIyBkaWZmZXJlbnQgZmlsZSBzeXN0ZW1zIC0gYW5kIHRoaXMgdGVzdCBjYW4ndCBlbnN1cmUgdGhhdC4KQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgICAgICAgICAgICAgIGN3ZF9yZXN1bHQgPSB1bmljb2RlZGF0YS5ub3JtYWxpemUoIk5GRCIsIGN3ZF9yZXN1bHQpCiAgICAgICAgICAgICAgICAgbmFtZV9yZXN1bHQgPSB1bmljb2RlZGF0YS5ub3JtYWxpemUoIk5GRCIsIG5hbWVfcmVzdWx0KQogCi0gICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3MucGF0aC5iYXNlbmFtZShjd2RfcmVzdWx0KSxuYW1lX3Jlc3VsdCkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnBhdGguYmFzZW5hbWUoY3dkX3Jlc3VsdCksbmFtZV9yZXN1bHQpCiAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgIG9zLmNoZGlyKGN3ZCkKICAgICAgICAgZmluYWxseToKQEAgLTE0Nyw3ICsxNDcsNyBAQAogICAgICAgICAgICAgc2VsZi5fZG9fc2luZ2xlKGZpbGVuYW1lKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3Mobm90IG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSkpCiAgICAgICAgICMgYW5kIGFnYWluIHdpdGggb3Mub3Blbi4KICAgICAgICAgZiA9IG9zLm9wZW4oZmlsZW5hbWUsIG9zLk9fQ1JFQVQpCiAgICAgICAgIG9zLmNsb3NlKGYpCkBAIC0xNTgsNyArMTU4LDcgQEAKIAogICAgIGRlZiBfdGVzdF9lcXVpdmFsZW50KHNlbGYsIGZpbGVuYW1lMSwgZmlsZW5hbWUyKToKICAgICAgICAgcmVtb3ZlX2lmX2V4aXN0cyhmaWxlbmFtZTEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3Qgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZTIpKQogICAgICAgICBmID0gZmlsZShmaWxlbmFtZTEsICJ3IikKICAgICAgICAgZi5jbG9zZSgpCiAgICAgICAgIHRyeToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdW5pY29kZWRhdGEucHkgYi9MaWIvdGVzdC90ZXN0X3VuaWNvZGVkYXRhLnB5CmluZGV4IGJhYTM2Y2IuLjlkNzEzM2IgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfdW5pY29kZWRhdGEucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91bmljb2RlZGF0YS5weQpAQCAtMjMwLDcgKzIzMCw3IEBACiAgICAgICAgICAgICBpZiBkZWMgIT0gLTE6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWMsIHNlbGYuZGIubnVtZXJpYyhjKSkKICAgICAgICAgICAgICAgICBjb3VudCArPSAxCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb3VudCA+PSAxMCkgIyBzaG91bGQgaGF2ZSB0ZXN0ZWQgYXQgbGVhc3QgdGhlIEFTQ0lJIGRpZ2l0cworICAgICAgICBzZWxmLmFzc2VydFRydWUoY291bnQgPj0gMTApICMgc2hvdWxkIGhhdmUgdGVzdGVkIGF0IGxlYXN0IHRoZSBBU0NJSSBkaWdpdHMKIAogICAgIGRlZiB0ZXN0X2RpZ2l0X251bWVyaWNfY29uc2lzdGVudChzZWxmKToKICAgICAgICAgIyBUZXN0IHRoYXQgZGlnaXQgYW5kIG51bWVyaWMgYXJlIGNvbnNpc3RlbnQsCkBAIC0yNDMsNyArMjQzLDcgQEAKICAgICAgICAgICAgIGlmIGRlYyAhPSAtMToKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlYywgc2VsZi5kYi5udW1lcmljKGMpKQogICAgICAgICAgICAgICAgIGNvdW50ICs9IDEKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNvdW50ID49IDEwKSAjIHNob3VsZCBoYXZlIHRlc3RlZCBhdCBsZWFzdCB0aGUgQVNDSUkgZGlnaXRzCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjb3VudCA+PSAxMCkgIyBzaG91bGQgaGF2ZSB0ZXN0ZWQgYXQgbGVhc3QgdGhlIEFTQ0lJIGRpZ2l0cwogCiAgICAgZGVmIHRlc3RfYnVnXzE3MDQ3OTMoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHNlbGYuZGIubG9va3VwKCJHT1RISUMgTEVUVEVSIEZBSUhVIiksIHUnXFUwMDAxMDM0NicpCkBAIC0yNTEsMTMgKzI1MSwxMyBAQAogICAgIGRlZiB0ZXN0X3VjZF81MTAoc2VsZik6CiAgICAgICAgIGltcG9ydCB1bmljb2RlZGF0YQogICAgICAgICAjIEluIFVDRCA1LjEuMCwgYSBtaXJyb3JlZCBwcm9wZXJ0eSBjaGFuZ2VkIHdydC4gVUNEIDMuMi4wCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1bmljb2RlZGF0YS5taXJyb3JlZCh1Ilx1MGYzYSIpKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IHVuaWNvZGVkYXRhLnVjZF8zXzJfMC5taXJyb3JlZCh1Ilx1MGYzYSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZWRhdGEubWlycm9yZWQodSJcdTBmM2EiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB1bmljb2RlZGF0YS51Y2RfM18yXzAubWlycm9yZWQodSJcdTBmM2EiKSkKICAgICAgICAgIyBBbHNvLCB3ZSBub3cgaGF2ZSB0d28gd2F5cyBvZiByZXByZXNlbnRpbmcKICAgICAgICAgIyB0aGUgdXBwZXItY2FzZSBtYXBwaW5nOiBhcyBkZWx0YSwgb3IgYXMgYWJzb2x1dGUgdmFsdWUKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUiYSIudXBwZXIoKT09dSdBJykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHUiXHUxZDc5Ii51cHBlcigpPT11J1x1YTc3ZCcpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh1Ii4iLnVwcGVyKCk9PXUiLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1ImEiLnVwcGVyKCk9PXUnQScpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1Ilx1MWQ3OSIudXBwZXIoKT09dSdcdWE3N2QnKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodSIuIi51cHBlcigpPT11Ii4iKQogCiAgICAgZGVmIHRlc3RfYnVnXzU4Mjgoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodSJcdTFkNzkiLmxvd2VyKCksIHUiXHUxZDc5IikKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliLnB5IGIvTGliL3Rlc3QvdGVzdF91cmxsaWIucHkKaW5kZXggZmZjMmYzMS4uOTMyMGM2MiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxsaWIucHkKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICAgICAgIyBNYWtlIHN1cmUgb2JqZWN0IHJldHVybmVkIGJ5IHVybG9wZW4oKSBoYXMgdGhlIHNwZWNpZmllZCBtZXRob2RzCiAgICAgICAgIGZvciBhdHRyIGluICgicmVhZCIsICJyZWFkbGluZSIsICJyZWFkbGluZXMiLCAiZmlsZW5vIiwKICAgICAgICAgICAgICAgICAgICAgICJjbG9zZSIsICJpbmZvIiwgImdldHVybCIsICJnZXRjb2RlIiwgIl9faXRlcl9fIik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihzZWxmLnJldHVybmVkX29iaiwgYXR0ciksCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihzZWxmLnJldHVybmVkX29iaiwgYXR0ciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCByZXR1cm5lZCBieSB1cmxvcGVuKCkgbGFja3MgJXMgYXR0cmlidXRlIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cikKIApAQCAtNjYsNyArNjYsNyBAQAogCiAgICAgZGVmIHRlc3RfZmlsZW5vKHNlbGYpOgogICAgICAgICBmaWxlX251bSA9IHNlbGYucmV0dXJuZWRfb2JqLmZpbGVubygpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGZpbGVfbnVtLCBpbnQpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShmaWxlX251bSwgaW50KSwKICAgICAgICAgICAgICAgICAgICAgICJmaWxlbm8oKSBkaWQgbm90IHJldHVybiBhbiBpbnQiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zLnJlYWQoZmlsZV9udW0sIGxlbihzZWxmLnRleHQpKSwgc2VsZi50ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICJSZWFkaW5nIG9uIHRoZSBmaWxlIGRlc2NyaXB0b3IgcmV0dXJuZWQgYnkgZmlsZW5vKCkgIgpAQCAtNzgsNyArNzgsNyBAQAogICAgICAgICBzZWxmLnJldHVybmVkX29iai5jbG9zZSgpCiAKICAgICBkZWYgdGVzdF9pbmZvKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShzZWxmLnJldHVybmVkX29iai5pbmZvKCksIG1pbWV0b29scy5NZXNzYWdlKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi5yZXR1cm5lZF9vYmouaW5mbygpLCBtaW1ldG9vbHMuTWVzc2FnZSkpCiAKICAgICBkZWYgdGVzdF9nZXR1cmwoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5yZXR1cm5lZF9vYmouZ2V0dXJsKCksIHNlbGYucGF0aG5hbWUpCkBAIC0yMjksNyArMjI5LDcgQEAKICAgICAgICAgIyBhIGhlYWRlcnMgdmFsdWUgaXMgcmV0dXJuZWQuCiAgICAgICAgIHJlc3VsdCA9IHVybGxpYi51cmxyZXRyaWV2ZSgiZmlsZTolcyIgJSB0ZXN0X3N1cHBvcnQuVEVTVEZOKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdFswXSwgdGVzdF9zdXBwb3J0LlRFU1RGTikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UocmVzdWx0WzFdLCBtaW1ldG9vbHMuTWVzc2FnZSksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHJlc3VsdFsxXSwgbWltZXRvb2xzLk1lc3NhZ2UpLAogICAgICAgICAgICAgICAgICAgICAgImRpZCBub3QgZ2V0IGEgbWltZXRvb2xzLk1lc3NhZ2UgaW5zdGFuY2UgYXMgc2Vjb25kICIKICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5lZCB2YWx1ZSIpCiAKQEAgLTI0MCw3ICsyNDAsNyBAQAogICAgICAgICByZXN1bHQgPSB1cmxsaWIudXJscmV0cmlldmUoc2VsZi5jb25zdHJ1Y3RMb2NhbEZpbGVVcmwoCiAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOKSwgc2Vjb25kX3RlbXApCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vjb25kX3RlbXAsIHJlc3VsdFswXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKHNlY29uZF90ZW1wKSwgImNvcHkgb2YgdGhlIGZpbGUgd2FzIG5vdCAiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhzZWNvbmRfdGVtcCksICJjb3B5IG9mIHRoZSBmaWxlIHdhcyBub3QgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFkZSIpCiAgICAgICAgIEZJTEUgPSBmaWxlKHNlY29uZF90ZW1wLCAncmInKQogICAgICAgICB0cnk6CkBAIC0yNTQsOSArMjU0LDkgQEAKICAgICBkZWYgdGVzdF9yZXBvcnRob29rKHNlbGYpOgogICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXBvcnRob29rIHdvcmtzLgogICAgICAgICBkZWYgaG9va3Rlc3Rlcihjb3VudCwgYmxvY2tfc2l6ZSwgdG90YWxfc2l6ZSwgY291bnRfaG9sZGVyPVswXSk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShjb3VudCwgaW50KSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGJsb2NrX3NpemUsIGludCkpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh0b3RhbF9zaXplLCBpbnQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoY291bnQsIGludCkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShibG9ja19zaXplLCBpbnQpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodG90YWxfc2l6ZSwgaW50KSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY291bnQsIGNvdW50X2hvbGRlclswXSkKICAgICAgICAgICAgIGNvdW50X2hvbGRlclswXSA9IGNvdW50X2hvbGRlclswXSArIDEKICAgICAgICAgc2Vjb25kX3RlbXAgPSAiJXMuMiIgJSB0ZXN0X3N1cHBvcnQuVEVTVEZOCkBAIC00ODcsNyArNDg3LDcgQEAKICAgICAgICAgZXhwZWN0X3NvbWV3aGVyZSA9IFsiMXN0PTEiLCAiMm5kPTIiLCAiM3JkPTMiXQogICAgICAgICByZXN1bHQgPSB1cmxsaWIudXJsZW5jb2RlKGdpdmVuKQogICAgICAgICBmb3IgZXhwZWN0ZWQgaW4gZXhwZWN0X3NvbWV3aGVyZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhleHBlY3RlZCBpbiByZXN1bHQsCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZXhwZWN0ZWQgaW4gcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0aW5nICVzOiAlcyBub3QgZm91bmQgaW4gJXMiICUKICAgICAgICAgICAgICAgICAgICAgICAgICAodGVzdF90eXBlLCBleHBlY3RlZCwgcmVzdWx0KSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY291bnQoJyYnKSwgMiwKQEAgLTQ5Niw3ICs0OTYsNyBAQAogICAgICAgICBhbXBfbG9jYXRpb24gPSByZXN1bHQuaW5kZXgoJyYnKQogICAgICAgICBvbl9hbXBfbGVmdCA9IHJlc3VsdFthbXBfbG9jYXRpb24gLSAxXQogICAgICAgICBvbl9hbXBfcmlnaHQgPSByZXN1bHRbYW1wX2xvY2F0aW9uICsgMV0KLSAgICAgICAgc2VsZi5hc3NlcnRfKG9uX2FtcF9sZWZ0LmlzZGlnaXQoKSBhbmQgb25fYW1wX3JpZ2h0LmlzZGlnaXQoKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9uX2FtcF9sZWZ0LmlzZGlnaXQoKSBhbmQgb25fYW1wX3JpZ2h0LmlzZGlnaXQoKSwKICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0aW5nICVzOiAnJicgbm90IGxvY2F0ZWQgaW4gcHJvcGVyIHBsYWNlIGluICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAodGVzdF90eXBlLCByZXN1bHQpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQpLCAoNSAqIDMpICsgMiwgIzUgY2hhcnMgcGVyIHRoaW5nIGFuZCBhbXBzCkBAIC01MzQsNyArNTM0LDcgQEAKICAgICAgICAgcmVzdWx0ID0gdXJsbGliLnVybGVuY29kZShnaXZlbiwgVHJ1ZSkKICAgICAgICAgZm9yIHZhbHVlIGluIGdpdmVuWyJzZXF1ZW5jZSJdOgogICAgICAgICAgICAgZXhwZWN0ID0gInNlcXVlbmNlPSVzIiAlIHZhbHVlCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZXhwZWN0IGluIHJlc3VsdCwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHBlY3QgaW4gcmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBub3QgZm91bmQgaW4gJXMiICUgKGV4cGVjdCwgcmVzdWx0KSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY291bnQoJyYnKSwgMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgMiAnJidzLCBnb3QgJXMiICUgcmVzdWx0LmNvdW50KCcmJykpCkBAIC02NjEsNyArNjYxLDcgQEAKICMgICAgIGRlZiB0ZXN0VGltZW91dE5vbmUoc2VsZik6CiAjICAgICAgICAgIyBnbG9iYWwgZGVmYXVsdCB0aW1lb3V0IGlzIGlnbm9yZWQKICMgICAgICAgICBpbXBvcnQgc29ja2V0Ci0jICAgICAgICAgc2VsZi5hc3NlcnRfKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisjICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCiAjICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQogIyAgICAgICAgIHRyeToKICMgICAgICAgICAgICAgZnRwID0gdXJsbGliLmZ0cHdyYXBwZXIoIm15dXNlciIsICJteXBhc3MiLCAibG9jYWxob3N0IiwgOTA5MywgW10pCkBAIC02NzMsNyArNjczLDcgQEAKICMgICAgIGRlZiB0ZXN0VGltZW91dERlZmF1bHQoc2VsZik6CiAjICAgICAgICAgIyBnbG9iYWwgZGVmYXVsdCB0aW1lb3V0IGlzIHVzZWQKICMgICAgICAgICBpbXBvcnQgc29ja2V0Ci0jICAgICAgICAgc2VsZi5hc3NlcnRfKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCisjICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNvY2tldC5nZXRkZWZhdWx0dGltZW91dCgpIGlzIE5vbmUpCiAjICAgICAgICAgc29ja2V0LnNldGRlZmF1bHR0aW1lb3V0KDMwKQogIyAgICAgICAgIHRyeToKICMgICAgICAgICAgICAgZnRwID0gdXJsbGliLmZ0cHdyYXBwZXIoIm15dXNlciIsICJteXBhc3MiLCAibG9jYWxob3N0IiwgOTA5MywgW10pCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkKaW5kZXggOWVkZDdjMi4uMWRjZDYxNiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weQpAQCAtNTIxLDE1ICs1MjEsMTUgQEAKICAgICAgICAgICAgICAgICAjICpfcmVxdWVzdAogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGhhbmRsZXIsIG5hbWUpLCBjYWxsc1tpXSkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihhcmdzKSwgMSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShhcmdzWzBdLCBSZXF1ZXN0KSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShhcmdzWzBdLCBSZXF1ZXN0KSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgIyAqX3Jlc3BvbnNlCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgoaGFuZGxlciwgbmFtZSksIGNhbGxzW2ldKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGFyZ3MpLCAyKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGFyZ3NbMF0sIFJlcXVlc3QpKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGFyZ3NbMF0sIFJlcXVlc3QpKQogICAgICAgICAgICAgICAgICMgcmVzcG9uc2UgZnJvbSBvcGVuZXIub3BlbiBpcyBOb25lLCBiZWNhdXNlIHRoZXJlJ3Mgbm8KICAgICAgICAgICAgICAgICAjIGhhbmRsZXIgdGhhdCBkZWZpbmVzIGh0dHBfb3BlbiB0byBoYW5kbGUgaXQKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oYXJnc1sxXSBpcyBOb25lIG9yCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGFyZ3NbMV0gaXMgTm9uZSBvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc2luc3RhbmNlKGFyZ3NbMV0sIE1vY2tSZXNwb25zZSkpCiAKIApAQCAtNTgwLDcgKzU4MCw3IEBACiAgICAgICAgICAgICByZXEudGltZW91dCA9IE5vbmUKICAgICAgICAgICAgIHIgPSBoLmZ0cF9vcGVuKHJlcSkKICAgICAgICAgICAgICMgZnRwIGF1dGhlbnRpY2F0aW9uIG5vdCB5ZXQgaW1wbGVtZW50ZWQgYnkgRlRQSGFuZGxlcgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGgudXNlciA9PSBoLnBhc3N3ZCA9PSAiIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoLnVzZXIgPT0gaC5wYXNzd2QgPT0gIiIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGguaG9zdCwgc29ja2V0LmdldGhvc3RieW5hbWUoaG9zdCkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGgucG9ydCwgcG9ydCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5kaXJzLCBkaXJzKQpAQCAtNjc0LDkgKzY3NCw5IEBACiAgICAgICAgICAgICAgICAgaC5maWxlX29wZW4ocmVxKQogICAgICAgICAgICAgIyBYWFhYIHJlbW92ZSBPU0Vycm9yIHdoZW4gYnVnIGZpeGVkCiAgICAgICAgICAgICBleGNlcHQgKHVybGxpYjIuVVJMRXJyb3IsIE9TRXJyb3IpOgotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgZnRwKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZnRwKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oby5yZXEgaXMgcmVxKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvLnJlcSBpcyByZXEpCiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEudHlwZSwgImZ0cCIpCiAKICAgICBkZWYgdGVzdF9odHRwKHNlbGYpOgpAQCAtNzUxLDggKzc1MSw4IEBACiAgICAgICAgICAgICByID0gTW9ja1Jlc3BvbnNlKDIwMCwgIk9LIiwge30sICIiKQogICAgICAgICAgICAgbmV3cmVxID0gaC5kb19yZXF1ZXN0XyhyZXEpCiAgICAgICAgICAgICBpZiBkYXRhIGlzIE5vbmU6ICAjIEdFVAotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygiQ29udGVudC1sZW5ndGgiIG5vdCBpbiByZXEudW5yZWRpcmVjdGVkX2hkcnMpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCJDb250ZW50LXR5cGUiIG5vdCBpbiByZXEudW5yZWRpcmVjdGVkX2hkcnMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJDb250ZW50LWxlbmd0aCIgbm90IGluIHJlcS51bnJlZGlyZWN0ZWRfaGRycykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoIkNvbnRlbnQtdHlwZSIgbm90IGluIHJlcS51bnJlZGlyZWN0ZWRfaGRycykKICAgICAgICAgICAgIGVsc2U6ICAjIFBPU1QKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS51bnJlZGlyZWN0ZWRfaGRyc1siQ29udGVudC1sZW5ndGgiXSwgIjAiKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLnVucmVkaXJlY3RlZF9oZHJzWyJDb250ZW50LXR5cGUiXSwKQEAgLTgwNywxOSArODA3LDE5IEBACiAgICAgICAgICMgYWxsIDJ4eCBhcmUgcGFzc2VkIHRocm91Z2gKICAgICAgICAgciA9IE1vY2tSZXNwb25zZSgyMDAsICJPSyIsIHt9LCAiIiwgdXJsKQogICAgICAgICBuZXdyID0gaC5odHRwX3Jlc3BvbnNlKHJlcSwgcikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHIgaXMgbmV3cikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBoYXNhdHRyKG8sICJwcm90byIpKSAgIyBvLmVycm9yIG5vdCBjYWxsZWQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIgaXMgbmV3cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoYXNhdHRyKG8sICJwcm90byIpKSAgIyBvLmVycm9yIG5vdCBjYWxsZWQKICAgICAgICAgciA9IE1vY2tSZXNwb25zZSgyMDIsICJBY2NlcHRlZCIsIHt9LCAiIiwgdXJsKQogICAgICAgICBuZXdyID0gaC5odHRwX3Jlc3BvbnNlKHJlcSwgcikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHIgaXMgbmV3cikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBoYXNhdHRyKG8sICJwcm90byIpKSAgIyBvLmVycm9yIG5vdCBjYWxsZWQKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIgaXMgbmV3cikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoYXNhdHRyKG8sICJwcm90byIpKSAgIyBvLmVycm9yIG5vdCBjYWxsZWQKICAgICAgICAgciA9IE1vY2tSZXNwb25zZSgyMDYsICJQYXJ0aWFsIGNvbnRlbnQiLCB7fSwgIiIsIHVybCkKICAgICAgICAgbmV3ciA9IGguaHR0cF9yZXNwb25zZShyZXEsIHIpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyIGlzIG5ld3IpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaGFzYXR0cihvLCAicHJvdG8iKSkgICMgby5lcnJvciBub3QgY2FsbGVkCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyIGlzIG5ld3IpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgaGFzYXR0cihvLCAicHJvdG8iKSkgICMgby5lcnJvciBub3QgY2FsbGVkCiAgICAgICAgICMgYW55dGhpbmcgZWxzZSBjYWxscyBvLmVycm9yIChhbmQgTW9ja09wZW5lciByZXR1cm5zIE5vbmUsIGhlcmUpCiAgICAgICAgIHIgPSBNb2NrUmVzcG9uc2UoNTAyLCAiQmFkIGdhdGV3YXkiLCB7fSwgIiIsIHVybCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGguaHR0cF9yZXNwb25zZShyZXEsIHIpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoLmh0dHBfcmVzcG9uc2UocmVxLCByKSBpcyBOb25lKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG8ucHJvdG8sICJodHRwIikgICMgby5lcnJvciBjYWxsZWQKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvLmFyZ3MsIChyZXEsIHIsIDUwMiwgIkJhZCBnYXRld2F5Iiwge30pKQogCkBAIC04MzEsMTIgKzgzMSwxMiBAQAogICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vZXhhbXBsZS5jb20vIikKICAgICAgICAgciA9IE1vY2tSZXNwb25zZSgyMDAsICJPSyIsIHt9LCAiIikKICAgICAgICAgbmV3cmVxID0gaC5odHRwX3JlcXVlc3QocmVxKQotICAgICAgICBzZWxmLmFzc2VydF8oY2ouYWNoX3JlcSBpcyByZXEgaXMgbmV3cmVxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2ouYWNoX3JlcSBpcyByZXEgaXMgbmV3cmVxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXEuZ2V0X29yaWdpbl9yZXFfaG9zdCgpLCAiZXhhbXBsZS5jb20iKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IHJlcS5pc191bnZlcmlmaWFibGUoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCByZXEuaXNfdW52ZXJpZmlhYmxlKCkpCiAgICAgICAgIG5ld3IgPSBoLmh0dHBfcmVzcG9uc2UocmVxLCByKQotICAgICAgICBzZWxmLmFzc2VydF8oY2ouZWNfcmVxIGlzIHJlcSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGNqLmVjX3IgaXMgciBpcyBuZXdyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2ouZWNfcmVxIGlzIHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNqLmVjX3IgaXMgciBpcyBuZXdyKQogCiAgICAgZGVmIHRlc3RfcmVkaXJlY3Qoc2VsZik6CiAgICAgICAgIGZyb21fdXJsID0gImh0dHA6Ly9leGFtcGxlLmNvbS9hLmh0bWwiCkBAIC04NTgsMTIgKzg1OCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9ja0hlYWRlcnMoeyJsb2NhdGlvbiI6IHRvX3VybH0pKQogICAgICAgICAgICAgICAgIGV4Y2VwdCB1cmxsaWIyLkhUVFBFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgIyAzMDcgaW4gcmVzcG9uc2UgdG8gUE9TVCByZXF1aXJlcyB1c2VyIE9LCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb2RlID09IDMwNyBhbmQgZGF0YSBpcyBub3QgTm9uZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvZGUgPT0gMzA3IGFuZCBkYXRhIGlzIG5vdCBOb25lKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5yZXEuZ2V0X2Z1bGxfdXJsKCksIHRvX3VybCkKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5yZXEuZ2V0X21ldGhvZCgpLCAiR0VUIikKICAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgby5yZXEuaGFzX2RhdGEoKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBvLnJlcS5oYXNfZGF0YSgpKQogCiAgICAgICAgICAgICAgICAgIyBub3cgaXQncyBhIEdFVCwgdGhlcmUgc2hvdWxkIG5vdCBiZSBoZWFkZXJzIHJlZ2FyZGluZyBjb250ZW50CiAgICAgICAgICAgICAgICAgIyAocG9zc2libHkgZHJhZ2dlZCBmcm9tIGJlZm9yZSBiZWluZyBhIFBPU1QpCkBAIC04NzMsOCArODczLDggQEAKIAogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoby5yZXEuaGVhZGVyc1siTm9uc2Vuc2UiXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWtpbmc9d2l0aGhvbGQiKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygiU3BhbSIgbm90IGluIG8ucmVxLmhlYWRlcnMpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCJTcGFtIiBub3QgaW4gby5yZXEudW5yZWRpcmVjdGVkX2hkcnMpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJTcGFtIiBub3QgaW4gby5yZXEuaGVhZGVycykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoIlNwYW0iIG5vdCBpbiBvLnJlcS51bnJlZGlyZWN0ZWRfaGRycykKIAogICAgICAgICAjIGxvb3AgZGV0ZWN0aW9uCiAgICAgICAgIHJlcSA9IFJlcXVlc3QoZnJvbV91cmwpCkBAIC05MjAsNyArOTIwLDcgQEAKICAgICAgICAgY3AgPSB1cmxsaWIyLkhUVFBDb29raWVQcm9jZXNzb3IoY2opCiAgICAgICAgIG8gPSBidWlsZF90ZXN0X29wZW5lcihoaCwgaGRlaCwgaHJoLCBjcCkKICAgICAgICAgby5vcGVuKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaGgucmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhoLnJlcS5oYXNfaGVhZGVyKCJDb29raWUiKSkKIAogICAgIGRlZiB0ZXN0X3Byb3h5KHNlbGYpOgogICAgICAgICBvID0gT3BlbmVyRGlyZWN0b3IoKQpAQCAtMTExNyw3ICsxMTE3LDcgQEAKICAgICAgICAgICAgIGlmIGguX19jbGFzc19fID09IGhhbmRsZXJfY2xhc3M6CiAgICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhGYWxzZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGYWxzZSkKIAogY2xhc3MgUmVxdWVzdFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKIApAQCAtMTEzMiwxMCArMTEzMiwxMCBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJHRVQiLCBzZWxmLmdldC5nZXRfbWV0aG9kKCkpCiAKICAgICBkZWYgdGVzdF9hZGRfZGF0YShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBzZWxmLmdldC5oYXNfZGF0YSgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IHNlbGYuZ2V0Lmhhc19kYXRhKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkdFVCIsIHNlbGYuZ2V0LmdldF9tZXRob2QoKSkKICAgICAgICAgc2VsZi5nZXQuYWRkX2RhdGEoInNwYW0iKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5nZXQuaGFzX2RhdGEoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNlbGYuZ2V0Lmhhc19kYXRhKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoIlBPU1QiLCBzZWxmLmdldC5nZXRfbWV0aG9kKCkpCiAKICAgICBkZWYgdGVzdF9nZXRfZnVsbF91cmwoc2VsZik6CkBAIC0xMTU4LDkgKzExNTgsOSBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCJ3d3cucHl0aG9uLm9yZyIsIHJlcS5nZXRfaG9zdCgpKQogCiAgICAgZGVmIHRlc3RfcHJveHkoc2VsZik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgc2VsZi5nZXQuaGFzX3Byb3h5KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgc2VsZi5nZXQuaGFzX3Byb3h5KCkpCiAgICAgICAgIHNlbGYuZ2V0LnNldF9wcm94eSgid3d3LnBlcmwub3JnIiwgImh0dHAiKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5nZXQuaGFzX3Byb3h5KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZWxmLmdldC5oYXNfcHJveHkoKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgid3d3LnB5dGhvbi5vcmciLCBzZWxmLmdldC5nZXRfb3JpZ2luX3JlcV9ob3N0KCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoInd3dy5wZXJsLm9yZyIsIHNlbGYuZ2V0LmdldF9ob3N0KCkpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weSBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMl9sb2NhbG5ldC5weQppbmRleCAwMDQ5OGVjLi4xNzI5ZDVmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VybGxpYjJfbG9jYWxuZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyX2xvY2FsbmV0LnB5CkBAIC00MzQsMTAgKzQzNCwxMCBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBvcGVuX3VybCA9IHVybGxpYjIudXJsb3BlbigiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCiAgICAgICAgICAgICBmb3IgYXR0ciBpbiAoInJlYWQiLCAiY2xvc2UiLCAiaW5mbyIsICJnZXR1cmwiKToKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihvcGVuX3VybCwgYXR0ciksICJvYmplY3QgcmV0dXJuZWQgZnJvbSAiCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGhhc2F0dHIob3Blbl91cmwsIGF0dHIpLCAib2JqZWN0IHJldHVybmVkIGZyb20gIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXJsb3BlbiBsYWNrcyB0aGUgJXMgYXR0cmlidXRlIiAlIGF0dHIpCiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG9wZW5fdXJsLnJlYWQoKSwgImNhbGxpbmcgJ3JlYWQnIGZhaWxlZCIpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9wZW5fdXJsLnJlYWQoKSwgImNhbGxpbmcgJ3JlYWQnIGZhaWxlZCIpCiAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgIG9wZW5fdXJsLmNsb3NlKCkKICAgICAgICAgZmluYWxseToKQEAgLTQ0OSw3ICs0NDksNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBvcGVuX3VybCA9IHVybGxpYjIudXJsb3BlbigiaHR0cDovL2xvY2FsaG9zdDolcyIgJSBoYW5kbGVyLnBvcnQpCiAgICAgICAgICAgICBpbmZvX29iaiA9IG9wZW5fdXJsLmluZm8oKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoaW5mb19vYmosIG1pbWV0b29scy5NZXNzYWdlKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGluZm9fb2JqLCBtaW1ldG9vbHMuTWVzc2FnZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCByZXR1cm5lZCBieSAnaW5mbycgaXMgbm90IGFuIGluc3RhbmNlIG9mICIKICAgICAgICAgICAgICAgICAgICAgICAgICAibWltZXRvb2xzLk1lc3NhZ2UiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbmZvX29iai5nZXRzdWJ0eXBlKCksICJwbGFpbiIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybGxpYjJuZXQucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYjJuZXQucHkKaW5kZXggYjRlNmFlNS4uOTc4ODY3NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91cmxsaWIybmV0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMm5ldC5weQpAQCAtODEsMTUgKzgxLDE1IEBACiAgICAgICAgICMgZGVsdmUgZGVlcCBpbnRvIHJlc3BvbnNlIHRvIGZldGNoIHNvY2tldC5fc29ja2V0b2JqZWN0CiAgICAgICAgIHJlc3BvbnNlID0gX3VybG9wZW5fd2l0aF9yZXRyeSgiaHR0cDovL3d3dy5weXRob24ub3JnLyIpCiAgICAgICAgIGFidXNlZF9maWxlb2JqZWN0ID0gcmVzcG9uc2UuZnAKLSAgICAgICAgc2VsZi5hc3NlcnRfKGFidXNlZF9maWxlb2JqZWN0Ll9fY2xhc3NfXyBpcyBzb2NrZXQuX2ZpbGVvYmplY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhYnVzZWRfZmlsZW9iamVjdC5fX2NsYXNzX18gaXMgc29ja2V0Ll9maWxlb2JqZWN0KQogICAgICAgICBodHRwcmVzcG9uc2UgPSBhYnVzZWRfZmlsZW9iamVjdC5fc29jawotICAgICAgICBzZWxmLmFzc2VydF8oaHR0cHJlc3BvbnNlLl9fY2xhc3NfXyBpcyBodHRwbGliLkhUVFBSZXNwb25zZSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGh0dHByZXNwb25zZS5fX2NsYXNzX18gaXMgaHR0cGxpYi5IVFRQUmVzcG9uc2UpCiAgICAgICAgIGZpbGVvYmplY3QgPSBodHRwcmVzcG9uc2UuZnAKLSAgICAgICAgc2VsZi5hc3NlcnRfKGZpbGVvYmplY3QuX19jbGFzc19fIGlzIHNvY2tldC5fZmlsZW9iamVjdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVvYmplY3QuX19jbGFzc19fIGlzIHNvY2tldC5fZmlsZW9iamVjdCkKIAotICAgICAgICBzZWxmLmFzc2VydF8obm90IGZpbGVvYmplY3QuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGZpbGVvYmplY3QuY2xvc2VkKQogICAgICAgICByZXNwb25zZS5jbG9zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhmaWxlb2JqZWN0LmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGZpbGVvYmplY3QuY2xvc2VkKQogCiBjbGFzcyBPdGhlck5ldHdvcmtUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgpAQCAtMTc2LDcgKzE3Niw3IEBACiAgICAgICAgICAgICAgICAgaWYgZXhwZWN0ZWRfZXJyOgogICAgICAgICAgICAgICAgICAgICBtc2cgPSAoIkRpZG4ndCBnZXQgZXhwZWN0ZWQgZXJyb3IocykgJXMgZm9yICVzICVzLCBnb3QgJXM6ICVzIiAlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhwZWN0ZWRfZXJyLCB1cmwsIHJlcSwgdHlwZShlcnIpLCBlcnIpKQotICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShlcnIsIGV4cGVjdGVkX2VyciksIG1zZykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZXJyLCBleHBlY3RlZF9lcnIpLCBtc2cpCiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHdpdGggdGVzdF9zdXBwb3J0LnRyYW5zaWVudF9pbnRlcm5ldCgpOgogICAgICAgICAgICAgICAgICAgICBidWYgPSBmLnJlYWQoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91cmxsaWJuZXQucHkgYi9MaWIvdGVzdC90ZXN0X3VybGxpYm5ldC5weQppbmRleCBmZmI4Yjk4Li43YWIyYWEyIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VybGxpYm5ldC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VybGxpYm5ldC5weQpAQCAtNjAsMTAgKzYwLDEwIEBACiAgICAgICAgIG9wZW5fdXJsID0gc2VsZi51cmxvcGVuKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIikKICAgICAgICAgZm9yIGF0dHIgaW4gKCJyZWFkIiwgInJlYWRsaW5lIiwgInJlYWRsaW5lcyIsICJmaWxlbm8iLCAiY2xvc2UiLAogICAgICAgICAgICAgICAgICAgICAgImluZm8iLCAiZ2V0dXJsIik6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaGFzYXR0cihvcGVuX3VybCwgYXR0ciksICJvYmplY3QgcmV0dXJuZWQgZnJvbSAiCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihvcGVuX3VybCwgYXR0ciksICJvYmplY3QgcmV0dXJuZWQgZnJvbSAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVybG9wZW4gbGFja3MgdGhlICVzIGF0dHJpYnV0ZSIgJSBhdHRyKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8ob3Blbl91cmwucmVhZCgpLCAiY2FsbGluZyAncmVhZCcgZmFpbGVkIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcGVuX3VybC5yZWFkKCksICJjYWxsaW5nICdyZWFkJyBmYWlsZWQiKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3Blbl91cmwuY2xvc2UoKQogCkBAIC03MSw5ICs3MSw5IEBACiAgICAgICAgICMgVGVzdCBib3RoIHJlYWRsaW5lIGFuZCByZWFkbGluZXMuCiAgICAgICAgIG9wZW5fdXJsID0gc2VsZi51cmxvcGVuKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIikKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uob3Blbl91cmwucmVhZGxpbmUoKSwgYmFzZXN0cmluZyksCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShvcGVuX3VybC5yZWFkbGluZSgpLCBiYXNlc3RyaW5nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZGxpbmUgZGlkIG5vdCByZXR1cm4gYSBzdHJpbmciKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uob3Blbl91cmwucmVhZGxpbmVzKCksIGxpc3QpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uob3Blbl91cmwucmVhZGxpbmVzKCksIGxpc3QpLAogICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFkbGluZXMgZGlkIG5vdCByZXR1cm4gYSBsaXN0IikKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIG9wZW5fdXJsLmNsb3NlKCkKQEAgLTg1LDcgKzg1LDcgQEAKICAgICAgICAgICAgIGluZm9fb2JqID0gb3Blbl91cmwuaW5mbygpCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBvcGVuX3VybC5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShpbmZvX29iaiwgbWltZXRvb2xzLk1lc3NhZ2UpLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoaW5mb19vYmosIG1pbWV0b29scy5NZXNzYWdlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IHJldHVybmVkIGJ5ICdpbmZvJyBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgIgogICAgICAgICAgICAgICAgICAgICAgICAgICJtaW1ldG9vbHMuTWVzc2FnZSIpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGluZm9fb2JqLmdldHN1YnR5cGUoKSwgImh0bWwiKQpAQCAtMTIxLDcgKzEyMSw3IEBACiAgICAgICAgIGZkID0gb3Blbl91cmwuZmlsZW5vKCkKICAgICAgICAgRklMRSA9IG9zLmZkb3BlbihmZCkKICAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKEZJTEUucmVhZCgpLCAicmVhZGluZyBmcm9tIGZpbGUgY3JlYXRlZCB1c2luZyBmZCAiCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoRklMRS5yZWFkKCksICJyZWFkaW5nIGZyb20gZmlsZSBjcmVhdGVkIHVzaW5nIGZkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybmVkIGJ5IGZpbGVubyBmYWlsZWQiKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgRklMRS5jbG9zZSgpCkBAIC0xNDgsMTEgKzE0OCwxMSBAQAogICAgIGRlZiB0ZXN0X2Jhc2ljKHNlbGYpOgogICAgICAgICAjIFRlc3QgYmFzaWMgZnVuY3Rpb25hbGl0eS4KICAgICAgICAgZmlsZV9sb2NhdGlvbixpbmZvID0gc2VsZi51cmxyZXRyaWV2ZSgiaHR0cDovL3d3dy5weXRob24ub3JnLyIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhmaWxlX2xvY2F0aW9uKSwgImZpbGUgbG9jYXRpb24gcmV0dXJuZWQgYnkiCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhmaWxlX2xvY2F0aW9uKSwgImZpbGUgbG9jYXRpb24gcmV0dXJuZWQgYnkiCiAgICAgICAgICAgICAgICAgICAgICAgICAiIHVybHJldHJpZXZlIGlzIG5vdCBhIHZhbGlkIHBhdGgiKQogICAgICAgICBGSUxFID0gZmlsZShmaWxlX2xvY2F0aW9uKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oRklMRS5yZWFkKCksICJyZWFkaW5nIGZyb20gdGhlIGZpbGUgbG9jYXRpb24gcmV0dXJuZWQiCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoRklMRS5yZWFkKCksICJyZWFkaW5nIGZyb20gdGhlIGZpbGUgbG9jYXRpb24gcmV0dXJuZWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiBieSB1cmxyZXRyaWV2ZSBmYWlsZWQiKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgRklMRS5jbG9zZSgpCkBAIC0xNjMsMTAgKzE2MywxMCBAQAogICAgICAgICBmaWxlX2xvY2F0aW9uLGluZm8gPSBzZWxmLnVybHJldHJpZXZlKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X3N1cHBvcnQuVEVTVEZOKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfbG9jYXRpb24sIHRlc3Rfc3VwcG9ydC5URVNURk4pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhvcy5wYXRoLmV4aXN0cyhmaWxlX2xvY2F0aW9uKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9zLnBhdGguZXhpc3RzKGZpbGVfbG9jYXRpb24pKQogICAgICAgICBGSUxFID0gZmlsZShmaWxlX2xvY2F0aW9uKQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oRklMRS5yZWFkKCksICJyZWFkaW5nIGZyb20gdGVtcG9yYXJ5IGZpbGUgZmFpbGVkIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGSUxFLnJlYWQoKSwgInJlYWRpbmcgZnJvbSB0ZW1wb3JhcnkgZmlsZSBmYWlsZWQiKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgRklMRS5jbG9zZSgpCiAgICAgICAgICAgICBvcy51bmxpbmsoZmlsZV9sb2NhdGlvbikKQEAgLTE3NSw3ICsxNzUsNyBAQAogICAgICAgICAjIE1ha2Ugc3VyZSBoZWFkZXIgcmV0dXJuZWQgYXMgMm5kIHZhbHVlIGZyb20gdXJscmV0cmlldmUgaXMgZ29vZC4KICAgICAgICAgZmlsZV9sb2NhdGlvbiwgaGVhZGVyID0gc2VsZi51cmxyZXRyaWV2ZSgiaHR0cDovL3d3dy5weXRob24ub3JnLyIpCiAgICAgICAgIG9zLnVubGluayhmaWxlX2xvY2F0aW9uKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShoZWFkZXIsIG1pbWV0b29scy5NZXNzYWdlKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoaGVhZGVyLCBtaW1ldG9vbHMuTWVzc2FnZSksCiAgICAgICAgICAgICAgICAgICAgICAiaGVhZGVyIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBtaW1ldG9vbHMuTWVzc2FnZSIpCiAKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weSBiL0xpYi90ZXN0L3Rlc3RfdXNlcmRpY3QucHkKaW5kZXggMDgxOGU5OC4uYzg2YTc3MyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91c2VyZGljdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3VzZXJkaWN0LnB5CkBAIC0zOCw5ICszOCw5IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXNlckRpY3QuVXNlckRpY3QoKS5mcm9ta2V5cygnb25lIHR3bycuc3BsaXQoKSksIGQ0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKFVzZXJEaWN0LlVzZXJEaWN0LmZyb21rZXlzKCdvbmUgdHdvJy5zcGxpdCgpLCAxKSwgZDUpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoVXNlckRpY3QuVXNlckRpY3QoKS5mcm9ta2V5cygnb25lIHR3bycuc3BsaXQoKSwgMSksIGQ1KQotICAgICAgICBzZWxmLmFzc2VydF8odTEuZnJvbWtleXMoJ29uZSB0d28nLnNwbGl0KCkpIGlzIG5vdCB1MSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UodTEuZnJvbWtleXMoJ29uZSB0d28nLnNwbGl0KCkpLCBVc2VyRGljdC5Vc2VyRGljdCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHUyLmZyb21rZXlzKCdvbmUgdHdvJy5zcGxpdCgpKSwgVXNlckRpY3QuSXRlcmFibGVVc2VyRGljdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1MS5mcm9ta2V5cygnb25lIHR3bycuc3BsaXQoKSkgaXMgbm90IHUxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZSh1MS5mcm9ta2V5cygnb25lIHR3bycuc3BsaXQoKSksIFVzZXJEaWN0LlVzZXJEaWN0KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UodTIuZnJvbWtleXMoJ29uZSB0d28nLnNwbGl0KCkpLCBVc2VyRGljdC5JdGVyYWJsZVVzZXJEaWN0KSkKIAogICAgICAgICAjIFRlc3QgX19yZXByX18KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIodTApLCBzdHIoZDApKQpAQCAtOTUsOCArOTUsOCBAQAogCiAgICAgICAgICMgVGVzdCBoYXNfa2V5IGFuZCAiaW4iLgogICAgICAgICBmb3IgaSBpbiB1Mi5rZXlzKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8odTIuaGFzX2tleShpKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhpIGluIHUyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHUyLmhhc19rZXkoaSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoaSBpbiB1MikKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTEuaGFzX2tleShpKSwgZDEuaGFzX2tleShpKSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaSBpbiB1MSwgaSBpbiBkMSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodTAuaGFzX2tleShpKSwgZDAuaGFzX2tleShpKSkKQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgICAgICAjIFRlc3Qgc2V0ZGVmYXVsdAogICAgICAgICB0ID0gVXNlckRpY3QuVXNlckRpY3QoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc2V0ZGVmYXVsdCgieCIsIDQyKSwgNDIpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0Lmhhc19rZXkoIngiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHQuaGFzX2tleSgieCIpKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQuc2V0ZGVmYXVsdCgieCIsIDIzKSwgNDIpCiAKICAgICAgICAgIyBUZXN0IHBvcApAQCAtMTYxLDggKzE2MSw4IEBACiAgICAgICAgIGQgPSBEKHsxOiAyLCAzOiA0fSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkWzFdLCAyKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRbM10sIDQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygyIG5vdCBpbiBkKQotICAgICAgICBzZWxmLmFzc2VydF8oMiBub3QgaW4gZC5rZXlzKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyIG5vdCBpbiBkKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMiBub3QgaW4gZC5rZXlzKCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZFsyXSwgNDIpCiAgICAgICAgIGNsYXNzIEUoVXNlckRpY3QuVXNlckRpY3QpOgogICAgICAgICAgICAgZGVmIF9fbWlzc2luZ19fKHNlbGYsIGtleSk6CkBAIC0yNjksMTIgKzI2OSwxMiBAQAogCiAgICAgICAgICMjIE5vdywgdGVzdCB0aGUgRGljdE1peGluIG1ldGhvZHMgb25lIGJ5IG9uZQogICAgICAgICAjIGhhc19rZXkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHMuaGFzX2tleSgxMCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3Qgcy5oYXNfa2V5KDIwKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHMuaGFzX2tleSgxMCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgcy5oYXNfa2V5KDIwKSkKIAogICAgICAgICAjIF9fY29udGFpbnNfXwotICAgICAgICBzZWxmLmFzc2VydF8oMTAgaW4gcykKLSAgICAgICAgc2VsZi5hc3NlcnRfKDIwIG5vdCBpbiBzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMTAgaW4gcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDIwIG5vdCBpbiBzKQogCiAgICAgICAgICMgX19pdGVyX18KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbayBmb3IgayBpbiBzXSwgWzEwLCAzMF0pCkBAIC0zMDksNyArMzA5LDcgQEAKIAogICAgICAgICAjIHBvcAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMucG9wKDEwKSwgJ3RlbicpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygxMCBub3QgaW4gcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKDEwIG5vdCBpbiBzKQogICAgICAgICBzWzEwXSA9ICd0ZW4nCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5wb3AoIngiLCAxKSwgMSkKICAgICAgICAgc1sieCJdID0gNDIKQEAgLTMxNyw3ICszMTcsNyBAQAogCiAgICAgICAgICMgcG9waXRlbQogICAgICAgICBrLCB2ID0gcy5wb3BpdGVtKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGsgbm90IGluIHMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShrIG5vdCBpbiBzKQogICAgICAgICBzW2tdID0gdgogCiAgICAgICAgICMgY2xlYXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXNlcnN0cmluZy5weSBiL0xpYi90ZXN0L3Rlc3RfdXNlcnN0cmluZy5weQppbmRleCA0YmIwYzQ1Li5iOTk1ODFkIDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X3VzZXJzdHJpbmcucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91c2Vyc3RyaW5nLnB5CkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICAgICAgcyA9IHNlbGYudHlwZTJ0ZXN0KCJmb29iYXIiKQogICAgICAgICBzMiA9IHMuaW1tdXRhYmxlKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLCBzMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoczIsIFVzZXJTdHJpbmcpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzMiwgVXNlclN0cmluZykpCiAKICAgICBkZWYgdGVzdF9pYWRkKHNlbGYpOgogICAgICAgICBzID0gc2VsZi50eXBlMnRlc3QoImZvbyIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3V1aWQucHkgYi9MaWIvdGVzdC90ZXN0X3V1aWQucHkKaW5kZXggYWI5MjZhZS4uZGMyOGIxZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91dWlkLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXVpZC5weQpAQCAtMjg4LDggKzI4OCw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdmVyc2FsX2xvY2FsX2JpdCwgMCwgbWVzc2FnZSkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChub2RlLCAwLCBtZXNzYWdlKQogICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKG5vZGUsIDB4ZmZmZmZmZmZmZmZmTCwgbWVzc2FnZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKDAgPD0gbm9kZSwgbWVzc2FnZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vZGUgPCAoMUwgPDwgNDgpLCBtZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoMCA8PSBub2RlLCBtZXNzYWdlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm9kZSA8ICgxTCA8PCA0OCksIG1lc3NhZ2UpCiAKICAgICAgICAgVGVzdFVVSUQuc291cmNlMm5vZGVbc291cmNlXSA9IG5vZGUKICAgICAgICAgaWYgVGVzdFVVSUQubGFzdF9ub2RlOgpAQCAtMzMxLDggKzMzMSw4IEBACiAKICAgICBkZWYgdGVzdF9yYW5kb21fZ2V0bm9kZShzZWxmKToKICAgICAgICAgbm9kZSA9IHV1aWQuX3JhbmRvbV9nZXRub2RlKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKDAgPD0gbm9kZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vZGUgPCAoMUwgPDw0OCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgwIDw9IG5vZGUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub2RlIDwgKDFMIDw8NDgpKQogCiAgICAgZGVmIHRlc3RfdW5peGRsbF9nZXRub2RlKHNlbGYpOgogICAgICAgICBpbXBvcnQgc3lzCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzLnB5IGIvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy5weQppbmRleCA5NzY0NzgzLi5jYTI3NTE5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MucHkKQEAgLTgzLDkgKzgzLDkgQEAKICAgICAgICAgICAgIHNlbGYubW9kdWxlLmZpbHRlcndhcm5pbmdzKCJhbHdheXMiLCBjYXRlZ29yeT1Vc2VyV2FybmluZykKICAgICAgICAgICAgIG1lc3NhZ2UgPSAiRmlsdGVyVGVzdHMudGVzdF9hbHdheXMiCiAgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKG1lc3NhZ2UsIFVzZXJXYXJuaW5nKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG1lc3NhZ2UsIHdbLTFdLm1lc3NhZ2UpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZSwgd1stMV0ubWVzc2FnZSkKICAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm4obWVzc2FnZSwgVXNlcldhcm5pbmcpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8od1stMV0ubWVzc2FnZSwgbWVzc2FnZSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3Wy0xXS5tZXNzYWdlLCBtZXNzYWdlKQogCiAgICAgZGVmIHRlc3RfZGVmYXVsdChzZWxmKToKICAgICAgICAgd2l0aCBvcmlnaW5hbF93YXJuaW5ncy5jYXRjaF93YXJuaW5ncyhyZWNvcmQ9VHJ1ZSwKQEAgLTE2NSw3ICsxNjUsNyBAQAogICAgICAgICAgICAgdGV4dCA9ICdoYW5kbGUgbm9ybWFsbHknCiAgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKHRleHQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih3Wy0xXS5tZXNzYWdlKSwgdGV4dCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh3Wy0xXS5jYXRlZ29yeSBpcyBVc2VyV2FybmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3Wy0xXS5jYXRlZ29yeSBpcyBVc2VyV2FybmluZykKIAogICAgICAgICAgICAgc2VsZi5tb2R1bGUuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIiLCBXYXJuaW5nLCAiIiwgMCkKICAgICAgICAgICAgIHRleHQgPSAnZmlsdGVyZWQgb3V0JwpAQCAtMTc4LDcgKzE3OCw3IEBACiAgICAgICAgICAgICB0ZXh0ID0gJ25vbm1hdGNoaW5nIHRleHQnCiAgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuKHRleHQpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih3Wy0xXS5tZXNzYWdlKSwgdGV4dCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh3Wy0xXS5jYXRlZ29yeSBpcyBVc2VyV2FybmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3Wy0xXS5jYXRlZ29yeSBpcyBVc2VyV2FybmluZykKIAogY2xhc3MgQ0ZpbHRlclRlc3RzKEJhc2VUZXN0LCBGaWx0ZXJUZXN0cyk6CiAgICAgbW9kdWxlID0gY193YXJuaW5ncwpAQCAtMTk4LDcgKzE5OCw3IEBACiAgICAgICAgICAgICAgICAgdGV4dCA9ICdtdWx0aSAlZCcgJWkgICMgRGlmZmVyZW50IHRleHQgb24gZWFjaCBjYWxsLgogICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm4odGV4dCkKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cih3Wy0xXS5tZXNzYWdlKSwgdGV4dCkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8od1stMV0uY2F0ZWdvcnkgaXMgVXNlcldhcm5pbmcpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdbLTFdLmNhdGVnb3J5IGlzIFVzZXJXYXJuaW5nKQogCiAgICAgZGVmIHRlc3RfZmlsZW5hbWUoc2VsZik6CiAgICAgICAgIHdpdGggd2FybmluZ3Nfc3RhdGUoc2VsZi5tb2R1bGUpOgpAQCAtMzk3LDcgKzM5Nyw3IEBACiAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUucmVzZXR3YXJuaW5ncygpCiAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUuZmlsdGVyd2FybmluZ3MoIm9uY2UiLCBjYXRlZ29yeT1Vc2VyV2FybmluZykKICAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS53YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIFVzZXJXYXJuaW5nLCAiZmlsZSIsIDQyKQotICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHdbLTFdLm1lc3NhZ2UsIG1lc3NhZ2UpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3Wy0xXS5tZXNzYWdlLCBtZXNzYWdlKQogICAgICAgICAgICAgICAgIGRlbCB3WzpdCiAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybl9leHBsaWNpdChtZXNzYWdlLCBVc2VyV2FybmluZywgImZpbGUiLCA0MikKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4odyksIDApCkBAIC00MDUsNyArNDA1LDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLm1vZHVsZS5vbmNlcmVnaXN0cnkgPSB7fQogICAgICAgICAgICAgICAgIF9fd2FybmluZ3JlZ2lzdHJ5X18gPSB7fQogICAgICAgICAgICAgICAgIHNlbGYubW9kdWxlLndhcm4oJ29uY2VyZWdpc3RyeSB0ZXN0JykKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3Wy0xXS5tZXNzYWdlLmFyZ3MsIG1lc3NhZ2UuYXJncykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdbLTFdLm1lc3NhZ2UuYXJncywgbWVzc2FnZS5hcmdzKQogICAgICAgICAgICAgICAgICMgUmVtb3ZhbCBvZiBvbmNlcmVnaXN0cnkgaXMgb2theS4KICAgICAgICAgICAgICAgICBkZWwgd1s6XQogICAgICAgICAgICAgICAgIGRlbCBzZWxmLm1vZHVsZS5vbmNlcmVnaXN0cnkKQEAgLTQ1OSw3ICs0NTksNyBAQAogICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2FwdHVyZWRfb3V0cHV0KCdzdGRlcnInKSBhcyBzdHJlYW06CiAgICAgICAgICAgICAgICAgc2VsZi5tb2R1bGUud2Fybih0ZXh0KQogICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0cmVhbS5nZXR2YWx1ZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyh0ZXh0IGluIHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHRleHQgaW4gcmVzdWx0KQogCiAgICAgZGVmIHRlc3Rfc2hvd3dhcm5pbmdfbm90X2NhbGxhYmxlKHNlbGYpOgogICAgICAgICB3aXRoIG9yaWdpbmFsX3dhcm5pbmdzLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT1zZWxmLm1vZHVsZSk6CkBAIC00ODAsMTkgKzQ4MCwxOSBAQAogICAgICAgICAgICAgd2l0aCB0ZXN0X3N1cHBvcnQuY2FwdHVyZWRfb3V0cHV0KCdzdGRlcnInKSBhcyBzdHJlYW06CiAgICAgICAgICAgICAgICAgd2FybmluZ190ZXN0cy5pbm5lcih0ZXh0KQogICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0cmVhbS5nZXR2YWx1ZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdC5jb3VudCgnXG4nKSwgMiwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuY291bnQoJ1xuJyksIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUb28gbWFueSBuZXdsaW5lcyBpbiAlciIgJSByZXN1bHQpCiAgICAgICAgIGZpcnN0X2xpbmUsIHNlY29uZF9saW5lID0gcmVzdWx0LnNwbGl0KCdcbicsIDEpCiAgICAgICAgIGV4cGVjdGVkX2ZpbGUgPSBvcy5wYXRoLnNwbGl0ZXh0KHdhcm5pbmdfdGVzdHMuX19maWxlX18pWzBdICsgJy5weScKICAgICAgICAgZmlyc3RfbGluZV9wYXJ0cyA9IGZpcnN0X2xpbmUucnNwbGl0KCc6JywgMykKICAgICAgICAgcGF0aCwgbGluZSwgd2FybmluZ19jbGFzcywgbWVzc2FnZSA9IGZpcnN0X2xpbmVfcGFydHMKICAgICAgICAgbGluZSA9IGludChsaW5lKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChleHBlY3RlZF9maWxlLCBwYXRoKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh3YXJuaW5nX2NsYXNzLCAnICcgKyBVc2VyV2FybmluZy5fX25hbWVfXykKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobWVzc2FnZSwgJyAnICsgdGV4dCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9maWxlLCBwYXRoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdhcm5pbmdfY2xhc3MsICcgJyArIFVzZXJXYXJuaW5nLl9fbmFtZV9fKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsICcgJyArIHRleHQpCiAgICAgICAgIGV4cGVjdGVkX2xpbmUgPSAnICAnICsgbGluZWNhY2hlLmdldGxpbmUocGF0aCwgbGluZSkuc3RyaXAoKSArICdcbicKICAgICAgICAgYXNzZXJ0IGV4cGVjdGVkX2xpbmUKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2Vjb25kX2xpbmUsIGV4cGVjdGVkX2xpbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2Vjb25kX2xpbmUsIGV4cGVjdGVkX2xpbmUpCiAKIAogY2xhc3MgV2FybmluZ3NEaXNwbGF5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgpAQCAtNTA5LDEzICs1MDksMTMgQEAKICAgICAgICAgZm9ybWF0ID0gIiVzOiVzOiAlczogJXNcbiAgJXNcbiIKICAgICAgICAgZXhwZWN0ID0gZm9ybWF0ICUgKGZpbGVfbmFtZSwgbGluZV9udW0sIGNhdGVnb3J5Ll9fbmFtZV9fLCBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfbGluZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0LCBzZWxmLm1vZHVsZS5mb3JtYXR3YXJuaW5nKG1lc3NhZ2UsCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0LCBzZWxmLm1vZHVsZS5mb3JtYXR3YXJuaW5nKG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeSwgZmlsZV9uYW1lLCBsaW5lX251bSkpCiAgICAgICAgICMgVGVzdCB0aGUgJ2xpbmUnIGFyZ3VtZW50LgogICAgICAgICBmaWxlX2xpbmUgKz0gIiBmb3IgdGhlIHdpbiEiCiAgICAgICAgIGV4cGVjdCA9IGZvcm1hdCAlIChmaWxlX25hbWUsIGxpbmVfbnVtLCBjYXRlZ29yeS5fX25hbWVfXywgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlX2xpbmUpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGV4cGVjdCwgc2VsZi5tb2R1bGUuZm9ybWF0d2FybmluZyhtZXNzYWdlLAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgc2VsZi5tb2R1bGUuZm9ybWF0d2FybmluZyhtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnksIGZpbGVfbmFtZSwgbGluZV9udW0sIGZpbGVfbGluZSkpCiAKICAgICBkZWYgdGVzdF9zaG93d2FybmluZyhzZWxmKToKQEAgLTUyOSw3ICs1MjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lX251bSkKICAgICAgICAgc2VsZi5tb2R1bGUuc2hvd3dhcm5pbmcobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVfbmFtZSwgbGluZV9udW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfb2JqZWN0KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChmaWxlX29iamVjdC5nZXR2YWx1ZSgpLCBleHBlY3QpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9vYmplY3QuZ2V0dmFsdWUoKSwgZXhwZWN0KQogICAgICAgICAjIFRlc3QgJ2xpbmUnIGFyZ3VtZW50LgogICAgICAgICBleHBlY3RlZF9maWxlX2xpbmUgKz0gImZvciB0aGUgd2luISIKICAgICAgICAgZXhwZWN0ID0gc2VsZi5tb2R1bGUuZm9ybWF0d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZV9uYW1lLApAQCAtNTM3LDcgKzUzNyw3IEBACiAgICAgICAgIGZpbGVfb2JqZWN0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQogICAgICAgICBzZWxmLm1vZHVsZS5zaG93d2FybmluZyhtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZV9uYW1lLCBsaW5lX251bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9vYmplY3QsIGV4cGVjdGVkX2ZpbGVfbGluZSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZXhwZWN0LCBmaWxlX29iamVjdC5nZXR2YWx1ZSgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdCwgZmlsZV9vYmplY3QuZ2V0dmFsdWUoKSkKIAogY2xhc3MgQ1dhcm5pbmdzRGlzcGxheVRlc3RzKEJhc2VUZXN0LCBXYXJuaW5nc0Rpc3BsYXlUZXN0cyk6CiAgICAgbW9kdWxlID0gY193YXJuaW5ncwpAQCAtNTU3LDIwICs1NTcsMjAgQEAKICAgICAgICAgIyBFbnN1cmUgYm90aCBzaG93d2FybmluZyBhbmQgZmlsdGVycyBhcmUgcmVzdG9yZWQgd2hlbiByZWNvcmRpbmcKICAgICAgICAgd2l0aCB3bW9kLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT13bW9kLCByZWNvcmQ9VHJ1ZSk6CiAgICAgICAgICAgICB3bW9kLmZpbHRlcnMgPSB3bW9kLnNob3d3YXJuaW5nID0gb2JqZWN0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdtb2QuZmlsdGVycyBpcyBvcmlnX2ZpbHRlcnMpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3bW9kLnNob3d3YXJuaW5nIGlzIG9yaWdfc2hvd3dhcm5pbmcpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3bW9kLmZpbHRlcnMgaXMgb3JpZ19maWx0ZXJzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUod21vZC5zaG93d2FybmluZyBpcyBvcmlnX3Nob3d3YXJuaW5nKQogICAgICAgICAjIFNhbWUgdGVzdCwgYnV0IHdpdGggcmVjb3JkaW5nIGRpc2FibGVkCiAgICAgICAgIHdpdGggd21vZC5jYXRjaF93YXJuaW5ncyhtb2R1bGU9d21vZCwgcmVjb3JkPUZhbHNlKToKICAgICAgICAgICAgIHdtb2QuZmlsdGVycyA9IHdtb2Quc2hvd3dhcm5pbmcgPSBvYmplY3QoKQotICAgICAgICBzZWxmLmFzc2VydF8od21vZC5maWx0ZXJzIGlzIG9yaWdfZmlsdGVycykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdtb2Quc2hvd3dhcm5pbmcgaXMgb3JpZ19zaG93d2FybmluZykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdtb2QuZmlsdGVycyBpcyBvcmlnX2ZpbHRlcnMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3bW9kLnNob3d3YXJuaW5nIGlzIG9yaWdfc2hvd3dhcm5pbmcpCiAKICAgICBkZWYgdGVzdF9jYXRjaF93YXJuaW5nc19yZWNvcmRpbmcoc2VsZik6CiAgICAgICAgIHdtb2QgPSBzZWxmLm1vZHVsZQogICAgICAgICAjIEVuc3VyZSB3YXJuaW5ncyBhcmUgcmVjb3JkZWQgd2hlbiByZXF1ZXN0ZWQKICAgICAgICAgd2l0aCB3bW9kLmNhdGNoX3dhcm5pbmdzKG1vZHVsZT13bW9kLCByZWNvcmQ9VHJ1ZSkgYXMgdzoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodywgW10pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odHlwZSh3KSBpcyBsaXN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHR5cGUodykgaXMgbGlzdCkKICAgICAgICAgICAgIHdtb2Quc2ltcGxlZmlsdGVyKCJhbHdheXMiKQogICAgICAgICAgICAgd21vZC53YXJuKCJmb28iKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIod1stMV0ubWVzc2FnZSksICJmb28iKQpAQCAtNTgzLDggKzU4Myw4IEBACiAgICAgICAgICMgRW5zdXJlIHdhcm5pbmdzIGFyZSBub3QgcmVjb3JkZWQgd2hlbiBub3QgcmVxdWVzdGVkCiAgICAgICAgIG9yaWdfc2hvd3dhcm5pbmcgPSB3bW9kLnNob3d3YXJuaW5nCiAgICAgICAgIHdpdGggd21vZC5jYXRjaF93YXJuaW5ncyhtb2R1bGU9d21vZCwgcmVjb3JkPUZhbHNlKSBhcyB3OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHcgaXMgTm9uZSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh3bW9kLnNob3d3YXJuaW5nIGlzIG9yaWdfc2hvd3dhcm5pbmcpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodyBpcyBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdtb2Quc2hvd3dhcm5pbmcgaXMgb3JpZ19zaG93d2FybmluZykKIAogICAgIGRlZiB0ZXN0X2NhdGNoX3dhcm5pbmdzX3JlZW50cnlfZ3VhcmQoc2VsZik6CiAgICAgICAgIHdtb2QgPSBzZWxmLm1vZHVsZQpAQCAtNjA1LDE3ICs2MDUsMTcgQEAKICAgICAgICAgb3JpZ19zaG93d2FybmluZyA9IHdtb2Quc2hvd3dhcm5pbmcKICAgICAgICAgIyBFbnN1cmUgZGVmYXVsdCBiZWhhdmlvdXIgaXMgbm90IHRvIHJlY29yZCB3YXJuaW5ncwogICAgICAgICB3aXRoIHdtb2QuY2F0Y2hfd2FybmluZ3MobW9kdWxlPXdtb2QpIGFzIHc6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8odyBpcyBOb25lKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHdtb2Quc2hvd3dhcm5pbmcgaXMgb3JpZ19zaG93d2FybmluZykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh3bW9kLmZpbHRlcnMgaXMgbm90IG9yaWdfZmlsdGVycykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdtb2QuZmlsdGVycyBpcyBvcmlnX2ZpbHRlcnMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodyBpcyBOb25lKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdtb2Quc2hvd3dhcm5pbmcgaXMgb3JpZ19zaG93d2FybmluZykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3bW9kLmZpbHRlcnMgaXMgbm90IG9yaWdfZmlsdGVycykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdtb2QuZmlsdGVycyBpcyBvcmlnX2ZpbHRlcnMpCiAgICAgICAgIGlmIHdtb2QgaXMgc3lzLm1vZHVsZXNbJ3dhcm5pbmdzJ106CiAgICAgICAgICAgICAjIEVuc3VyZSB0aGUgZGVmYXVsdCBtb2R1bGUgaXMgdGhpcyBvbmUKICAgICAgICAgICAgIHdpdGggd21vZC5jYXRjaF93YXJuaW5ncygpIGFzIHc6Ci0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHcgaXMgTm9uZSkKLSAgICAgICAgICAgICAgICBzZWxmLmFzc2VydF8od21vZC5zaG93d2FybmluZyBpcyBvcmlnX3Nob3d3YXJuaW5nKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh3bW9kLmZpbHRlcnMgaXMgbm90IG9yaWdfZmlsdGVycykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh3bW9kLmZpbHRlcnMgaXMgb3JpZ19maWx0ZXJzKQorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3IGlzIE5vbmUpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdtb2Quc2hvd3dhcm5pbmcgaXMgb3JpZ19zaG93d2FybmluZykKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod21vZC5maWx0ZXJzIGlzIG5vdCBvcmlnX2ZpbHRlcnMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod21vZC5maWx0ZXJzIGlzIG9yaWdfZmlsdGVycykKIAogICAgIGRlZiB0ZXN0X2NoZWNrX3dhcm5pbmdzKHNlbGYpOgogICAgICAgICAjIEV4cGxpY2l0IHRlc3RzIGZvciB0aGUgdGVzdF9zdXBwb3J0IGNvbnZlbmllbmNlIHdyYXBwZXIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2Vha3JlZi5weSBiL0xpYi90ZXN0L3Rlc3Rfd2Vha3JlZi5weQppbmRleCBhZWFmZGRhLi5lZDYzMTQ3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dlYWtyZWYucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93ZWFrcmVmLnB5CkBAIC03MCwxMSArNzAsMTEgQEAKICAgICAgICAgcmVmMSA9IHdlYWtyZWYucmVmKG8sIHNlbGYuY2FsbGJhY2spCiAgICAgICAgIHJlZjIgPSB3ZWFrcmVmLnJlZihvLCBzZWxmLmNhbGxiYWNrKQogICAgICAgICBkZWwgbwotICAgICAgICBzZWxmLmFzc2VydF8ocmVmMSgpIGlzIE5vbmUsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYxKCkgaXMgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCByZWZlcmVuY2UgdG8gYmUgaW52YWxpZGF0ZWQiKQotICAgICAgICBzZWxmLmFzc2VydF8ocmVmMigpIGlzIE5vbmUsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYyKCkgaXMgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICJleHBlY3RlZCByZWZlcmVuY2UgdG8gYmUgaW52YWxpZGF0ZWQiKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5jYmNhbGxlZCA9PSAyLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5jYmNhbGxlZCA9PSAyLAogICAgICAgICAgICAgICAgICAgICAgImNhbGxiYWNrIG5vdCBjYWxsZWQgdGhlIHJpZ2h0IG51bWJlciBvZiB0aW1lcyIpCiAKICAgICBkZWYgdGVzdF9tdWx0aXBsZV9zZWxmcmVmX2NhbGxiYWNrcyhzZWxmKToKQEAgLTEwOCwxNSArMTA4LDE1IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHdlYWtyZWYuUmVmZXJlbmNlRXJyb3IsIGNoZWNrLCByZWYxKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyh3ZWFrcmVmLlJlZmVyZW5jZUVycm9yLCBjaGVjaywgcmVmMikKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMod2Vha3JlZi5SZWZlcmVuY2VFcnJvciwgYm9vbCwgd2Vha3JlZi5wcm94eShDKCkpKQotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5jYmNhbGxlZCA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5jYmNhbGxlZCA9PSAyKQogCiAgICAgZGVmIGNoZWNrX2Jhc2ljX3JlZihzZWxmLCBmYWN0b3J5KToKICAgICAgICAgbyA9IGZhY3RvcnkoKQogICAgICAgICByZWYgPSB3ZWFrcmVmLnJlZihvKQotICAgICAgICBzZWxmLmFzc2VydF8ocmVmKCkgaXMgbm90IE5vbmUsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWYoKSBpcyBub3QgTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICJ3ZWFrIHJlZmVyZW5jZSB0byBsaXZlIG9iamVjdCBzaG91bGQgYmUgbGl2ZSIpCiAgICAgICAgIG8yID0gcmVmKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG8gaXMgbzIsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvIGlzIG8yLAogICAgICAgICAgICAgICAgICAgICAgIjxyZWY+KCkgc2hvdWxkIHJldHVybiBvcmlnaW5hbCBvYmplY3QgaWYgbGl2ZSIpCiAKICAgICBkZWYgY2hlY2tfYmFzaWNfY2FsbGJhY2soc2VsZiwgZmFjdG9yeSk6CkBAIC0xMjQsOSArMTI0LDkgQEAKICAgICAgICAgbyA9IGZhY3RvcnkoKQogICAgICAgICByZWYgPSB3ZWFrcmVmLnJlZihvLCBzZWxmLmNhbGxiYWNrKQogICAgICAgICBkZWwgbwotICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5jYmNhbGxlZCA9PSAxLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoc2VsZi5jYmNhbGxlZCA9PSAxLAogICAgICAgICAgICAgICAgICAgICAgImNhbGxiYWNrIGRpZCBub3QgcHJvcGVybHkgc2V0ICdjYmNhbGxlZCciKQotICAgICAgICBzZWxmLmFzc2VydF8ocmVmKCkgaXMgTm9uZSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlZigpIGlzIE5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAicmVmMiBzaG91bGQgYmUgZGVhZCBhZnRlciBkZWxldGluZyBvYmplY3QgcmVmZXJlbmNlIikKIAogICAgIGRlZiB0ZXN0X3JlZl9yZXVzZShzZWxmKToKQEAgLTEzNiwxOSArMTM2LDE5IEBACiAgICAgICAgICMgYmV0d2VlbiB0aGVzZSB0d287IGl0IHNob3VsZCBtYWtlIG5vIGRpZmZlcmVuY2UKICAgICAgICAgcHJveHkgPSB3ZWFrcmVmLnByb3h5KG8pCiAgICAgICAgIHJlZjIgPSB3ZWFrcmVmLnJlZihvKQotICAgICAgICBzZWxmLmFzc2VydF8ocmVmMSBpcyByZWYyLAorICAgICAgICBzZWxmLmFzc2VydFRydWUocmVmMSBpcyByZWYyLAogICAgICAgICAgICAgICAgICAgICAgInJlZmVyZW5jZSBvYmplY3Qgdy9vdXQgY2FsbGJhY2sgc2hvdWxkIGJlIHJlLXVzZWQiKQogCiAgICAgICAgIG8gPSBDKCkKICAgICAgICAgcHJveHkgPSB3ZWFrcmVmLnByb3h5KG8pCiAgICAgICAgIHJlZjEgPSB3ZWFrcmVmLnJlZihvKQogICAgICAgICByZWYyID0gd2Vha3JlZi5yZWYobykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHJlZjEgaXMgcmVmMiwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlZjEgaXMgcmVmMiwKICAgICAgICAgICAgICAgICAgICAgICJyZWZlcmVuY2Ugb2JqZWN0IHcvb3V0IGNhbGxiYWNrIHNob3VsZCBiZSByZS11c2VkIikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pID09IDIsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSA9PSAyLAogICAgICAgICAgICAgICAgICAgICAgIndyb25nIHdlYWsgcmVmIGNvdW50IGZvciBvYmplY3QiKQogICAgICAgICBkZWwgcHJveHkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pID09IDEsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSA9PSAxLAogICAgICAgICAgICAgICAgICAgICAgIndyb25nIHdlYWsgcmVmIGNvdW50IGZvciBvYmplY3QgYWZ0ZXIgZGVsZXRpbmcgcHJveHkiKQogCiAgICAgZGVmIHRlc3RfcHJveHlfcmV1c2Uoc2VsZik6CkBAIC0xNTYsNyArMTU2LDcgQEAKICAgICAgICAgcHJveHkxID0gd2Vha3JlZi5wcm94eShvKQogICAgICAgICByZWYgPSB3ZWFrcmVmLnJlZihvKQogICAgICAgICBwcm94eTIgPSB3ZWFrcmVmLnByb3h5KG8pCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eTEgaXMgcHJveHkyLAorICAgICAgICBzZWxmLmFzc2VydFRydWUocHJveHkxIGlzIHByb3h5MiwKICAgICAgICAgICAgICAgICAgICAgICJwcm94eSBvYmplY3Qgdy9vdXQgY2FsbGJhY2sgc2hvdWxkIGhhdmUgYmVlbiByZS11c2VkIikKIAogICAgIGRlZiB0ZXN0X2Jhc2ljX3Byb3h5KHNlbGYpOgpAQCAtMTY1LDE0ICsxNjUsMTQgQEAKIAogICAgICAgICBMID0gVXNlckxpc3QuVXNlckxpc3QoKQogICAgICAgICBwID0gd2Vha3JlZi5wcm94eShMKQotICAgICAgICBzZWxmLmZhaWxJZihwLCAicHJveHkgZm9yIGVtcHR5IFVzZXJMaXN0IHNob3VsZCBiZSBmYWxzZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UocCwgInByb3h5IGZvciBlbXB0eSBVc2VyTGlzdCBzaG91bGQgYmUgZmFsc2UiKQogICAgICAgICBwLmFwcGVuZCgxMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oTCksIDEpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhwLCAicHJveHkgZm9yIG5vbi1lbXB0eSBVc2VyTGlzdCBzaG91bGQgYmUgdHJ1ZSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwLCAicHJveHkgZm9yIG5vbi1lbXB0eSBVc2VyTGlzdCBzaG91bGQgYmUgdHJ1ZSIpCiAgICAgICAgIHBbOl0gPSBbMiwgM10KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oTCksIDIpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHApLCAyKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoMyBpbiBwLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoMyBpbiBwLAogICAgICAgICAgICAgICAgICAgICAgICAgInByb3h5IGRpZG4ndCBzdXBwb3J0IF9fY29udGFpbnNfXygpIHByb3Blcmx5IikKICAgICAgICAgcFsxXSA9IDUKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChMWzFdLCA1KQpAQCAtMjI2LDE5ICsyMjYsMTkgQEAKICAgICAgICAgbyA9IE9iamVjdCgxKQogICAgICAgICBwMSA9IG1ha2VyZWYobywgTm9uZSkKICAgICAgICAgcDIgPSBtYWtlcmVmKG8sIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhwMSBpcyBwMiwgImJvdGggY2FsbGJhY2tzIHdlcmUgTm9uZSBpbiB0aGUgQyBBUEkiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocDEgaXMgcDIsICJib3RoIGNhbGxiYWNrcyB3ZXJlIE5vbmUgaW4gdGhlIEMgQVBJIikKICAgICAgICAgZGVsIHAxLCBwMgogICAgICAgICBwMSA9IG1ha2VyZWYobykKICAgICAgICAgcDIgPSBtYWtlcmVmKG8sIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhwMSBpcyBwMiwgImNhbGxiYWNrcyB3ZXJlIE5VTEwsIE5vbmUgaW4gdGhlIEMgQVBJIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHAxIGlzIHAyLCAiY2FsbGJhY2tzIHdlcmUgTlVMTCwgTm9uZSBpbiB0aGUgQyBBUEkiKQogICAgICAgICBkZWwgcDEsIHAyCiAgICAgICAgIHAxID0gbWFrZXJlZihvKQogICAgICAgICBwMiA9IG1ha2VyZWYobykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHAxIGlzIHAyLCAiYm90aCBjYWxsYmFja3Mgd2VyZSBOVUxMIGluIHRoZSBDIEFQSSIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwMSBpcyBwMiwgImJvdGggY2FsbGJhY2tzIHdlcmUgTlVMTCBpbiB0aGUgQyBBUEkiKQogICAgICAgICBkZWwgcDEsIHAyCiAgICAgICAgIHAxID0gbWFrZXJlZihvLCBOb25lKQogICAgICAgICBwMiA9IG1ha2VyZWYobykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHAxIGlzIHAyLCAiY2FsbGJhY2tzIHdlcmUgTm9uZSwgTlVMTCBpbiB0aGUgQyBBUEkiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocDEgaXMgcDIsICJjYWxsYmFja3Mgd2VyZSBOb25lLCBOVUxMIGluIHRoZSBDIEFQSSIpCiAKICAgICBkZWYgdGVzdF9jYWxsYWJsZV9wcm94eShzZWxmKToKICAgICAgICAgbyA9IENhbGxhYmxlKCkKQEAgLTI0NiwxMyArMjQ2LDEzIEBACiAKICAgICAgICAgc2VsZi5jaGVja19wcm94eShvLCByZWYxKQogCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh0eXBlKHJlZjEpIGlzIHdlYWtyZWYuQ2FsbGFibGVQcm94eVR5cGUsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0eXBlKHJlZjEpIGlzIHdlYWtyZWYuQ2FsbGFibGVQcm94eVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAicHJveHkgaXMgbm90IG9mIGNhbGxhYmxlIHR5cGUiKQogICAgICAgICByZWYxKCd0d2lua2llcyEnKQotICAgICAgICBzZWxmLmFzc2VydF8oby5iYXIgPT0gJ3R3aW5raWVzIScsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvLmJhciA9PSAndHdpbmtpZXMhJywKICAgICAgICAgICAgICAgICAgICAgICJjYWxsIHRocm91Z2ggcHJveHkgbm90IHBhc3NlZCB0aHJvdWdoIHRvIG9yaWdpbmFsIikKICAgICAgICAgcmVmMSh4PSdTcGxhdC4nKQotICAgICAgICBzZWxmLmFzc2VydF8oby5iYXIgPT0gJ1NwbGF0LicsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvLmJhciA9PSAnU3BsYXQuJywKICAgICAgICAgICAgICAgICAgICAgICJjYWxsIHRocm91Z2ggcHJveHkgbm90IHBhc3NlZCB0aHJvdWdoIHRvIG9yaWdpbmFsIikKIAogICAgICAgICAjIGV4cGVjdCBkdWUgdG8gdG9vIGZldyBhcmdzCkBAIC0yNjMsMjQgKzI2MywyNCBAQAogCiAgICAgZGVmIGNoZWNrX3Byb3h5KHNlbGYsIG8sIHByb3h5KToKICAgICAgICAgby5mb28gPSAxCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5mb28gPT0gMSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LmZvbyA9PSAxLAogICAgICAgICAgICAgICAgICAgICAgInByb3h5IGRvZXMgbm90IHJlZmxlY3QgYXR0cmlidXRlIGFkZGl0aW9uIikKICAgICAgICAgby5mb28gPSAyCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhwcm94eS5mb28gPT0gMiwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHByb3h5LmZvbyA9PSAyLAogICAgICAgICAgICAgICAgICAgICAgInByb3h5IGRvZXMgbm90IHJlZmxlY3QgYXR0cmlidXRlIG1vZGlmaWNhdGlvbiIpCiAgICAgICAgIGRlbCBvLmZvbwotICAgICAgICBzZWxmLmFzc2VydF8obm90IGhhc2F0dHIocHJveHksICdmb28nKSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBoYXNhdHRyKHByb3h5LCAnZm9vJyksCiAgICAgICAgICAgICAgICAgICAgICAicHJveHkgZG9lcyBub3QgcmVmbGVjdCBhdHRyaWJ1dGUgcmVtb3ZhbCIpCiAKICAgICAgICAgcHJveHkuZm9vID0gMQotICAgICAgICBzZWxmLmFzc2VydF8oby5mb28gPT0gMSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG8uZm9vID09IDEsCiAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IGRvZXMgbm90IHJlZmxlY3QgYXR0cmlidXRlIGFkZGl0aW9uIHZpYSBwcm94eSIpCiAgICAgICAgIHByb3h5LmZvbyA9IDIKLSAgICAgICAgc2VsZi5hc3NlcnRfKAorICAgICAgICBzZWxmLmFzc2VydFRydWUoCiAgICAgICAgICAgICBvLmZvbyA9PSAyLAogICAgICAgICAgICAgIm9iamVjdCBkb2VzIG5vdCByZWZsZWN0IGF0dHJpYnV0ZSBtb2RpZmljYXRpb24gdmlhIHByb3h5IikKICAgICAgICAgZGVsIHByb3h5LmZvbwotICAgICAgICBzZWxmLmFzc2VydF8obm90IGhhc2F0dHIobywgJ2ZvbycpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGhhc2F0dHIobywgJ2ZvbycpLAogICAgICAgICAgICAgICAgICAgICAgIm9iamVjdCBkb2VzIG5vdCByZWZsZWN0IGF0dHJpYnV0ZSByZW1vdmFsIHZpYSBwcm94eSIpCiAKICAgICBkZWYgdGVzdF9wcm94eV9kZWxldGlvbihzZWxmKToKQEAgLTMwNCwyMSArMzA0LDIxIEBACiAgICAgICAgIG8gPSBDKCkKICAgICAgICAgcmVmMSA9IHdlYWtyZWYucmVmKG8pCiAgICAgICAgIHJlZjIgPSB3ZWFrcmVmLnJlZihvLCBzZWxmLmNhbGxiYWNrKQotICAgICAgICBzZWxmLmFzc2VydF8od2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMiwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pID09IDIsCiAgICAgICAgICAgICAgICAgICAgICAiZ290IHdyb25nIG51bWJlciBvZiB3ZWFrIHJlZmVyZW5jZSBvYmplY3RzIikKIAogICAgICAgICBwcm94eTEgPSB3ZWFrcmVmLnByb3h5KG8pCiAgICAgICAgIHByb3h5MiA9IHdlYWtyZWYucHJveHkobywgc2VsZi5jYWxsYmFjaykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pID09IDQsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSA9PSA0LAogICAgICAgICAgICAgICAgICAgICAgImdvdCB3cm9uZyBudW1iZXIgb2Ygd2VhayByZWZlcmVuY2Ugb2JqZWN0cyIpCiAKICAgICAgICAgZGVsIHJlZjEsIHJlZjIsIHByb3h5MSwgcHJveHkyCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSA9PSAwLAorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMCwKICAgICAgICAgICAgICAgICAgICAgICJ3ZWFrIHJlZmVyZW5jZSBvYmplY3RzIG5vdCB1bmxpbmtlZCBmcm9tIgogICAgICAgICAgICAgICAgICAgICAgIiByZWZlcmVudCB3aGVuIGRpc2NhcmRlZC4iKQogCiAgICAgICAgICMgYXNzdW1lcyBpbnRzIGRvIG5vdCBzdXBwb3J0IHdlYWtyZWZzCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudCgxKSA9PSAwLAorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQoMSkgPT0gMCwKICAgICAgICAgICAgICAgICAgICAgICJnb3Qgd3JvbmcgbnVtYmVyIG9mIHdlYWsgcmVmZXJlbmNlIG9iamVjdHMgZm9yIGludCIpCiAKICAgICBkZWYgdGVzdF9nZXR3ZWFrcmVmcyhzZWxmKToKQEAgLTMyNiwyMiArMzI2LDIyIEBACiAgICAgICAgIHJlZjEgPSB3ZWFrcmVmLnJlZihvLCBzZWxmLmNhbGxiYWNrKQogICAgICAgICByZWYyID0gd2Vha3JlZi5yZWYobywgc2VsZi5jYWxsYmFjaykKICAgICAgICAgZGVsIHJlZjEKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtyZWYuZ2V0d2Vha3JlZnMobykgPT0gW3JlZjJdLAorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmcyhvKSA9PSBbcmVmMl0sCiAgICAgICAgICAgICAgICAgICAgICAibGlzdCBvZiByZWZzIGRvZXMgbm90IG1hdGNoIikKIAogICAgICAgICBvID0gQygpCiAgICAgICAgIHJlZjEgPSB3ZWFrcmVmLnJlZihvLCBzZWxmLmNhbGxiYWNrKQogICAgICAgICByZWYyID0gd2Vha3JlZi5yZWYobywgc2VsZi5jYWxsYmFjaykKICAgICAgICAgZGVsIHJlZjIKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtyZWYuZ2V0d2Vha3JlZnMobykgPT0gW3JlZjFdLAorICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmcyhvKSA9PSBbcmVmMV0sCiAgICAgICAgICAgICAgICAgICAgICAibGlzdCBvZiByZWZzIGRvZXMgbm90IG1hdGNoIikKIAogICAgICAgICBkZWwgcmVmMQotICAgICAgICBzZWxmLmFzc2VydF8od2Vha3JlZi5nZXR3ZWFrcmVmcyhvKSA9PSBbXSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZnMobykgPT0gW10sCiAgICAgICAgICAgICAgICAgICAgICAibGlzdCBvZiByZWZzIG5vdCBjbGVhcmVkIikKIAogICAgICAgICAjIGFzc3VtZXMgaW50cyBkbyBub3Qgc3VwcG9ydCB3ZWFrcmVmcwotICAgICAgICBzZWxmLmFzc2VydF8od2Vha3JlZi5nZXR3ZWFrcmVmcygxKSA9PSBbXSwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtyZWYuZ2V0d2Vha3JlZnMoMSkgPT0gW10sCiAgICAgICAgICAgICAgICAgICAgICAibGlzdCBvZiByZWZzIGRvZXMgbm90IG1hdGNoIGZvciBpbnQiKQogCiAgICAgZGVmIHRlc3RfbmV3c3R5bGVfbnVtYmVyX29wcyhzZWxmKToKQEAgLTM0OSw4ICszNDksOCBAQAogICAgICAgICAgICAgcGFzcwogICAgICAgICBmID0gRigyLjApCiAgICAgICAgIHAgPSB3ZWFrcmVmLnByb3h5KGYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhwICsgMS4wID09IDMuMCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKDEuMCArIHAgPT0gMy4wKSAgIyB0aGlzIHVzZWQgdG8gU0VHVgorICAgICAgICBzZWxmLmFzc2VydFRydWUocCArIDEuMCA9PSAzLjApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgxLjAgKyBwID09IDMuMCkgICMgdGhpcyB1c2VkIHRvIFNFR1YKIAogICAgIGRlZiB0ZXN0X2NhbGxiYWNrc19wcm90ZWN0ZWQoc2VsZik6CiAgICAgICAgICMgQ2FsbGJhY2tzIHByb3RlY3RlZCBmcm9tIGFscmVhZHktc2V0IGV4Y2VwdGlvbnM/CkBAIC02MDMsNyArNjAzLDcgQEAKICAgICAgICAgYy53ciA9IHdlYWtyZWYucmVmKGQsIGNhbGxiYWNrKSAgICAgIyB0aGlzIHdvbid0IHRyaWdnZXIKICAgICAgICAgZC53ciA9IHdlYWtyZWYucmVmKGNhbGxiYWNrLCBkLmNiKSAgIyBkaXR0bwogICAgICAgICBleHRlcm5hbF93ciA9IHdlYWtyZWYucmVmKGNhbGxiYWNrLCBzYWZlX2NhbGxiYWNrKSAgIyBidXQgdGhpcyB3aWxsCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhleHRlcm5hbF93cigpIGlzIGNhbGxiYWNrKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZXh0ZXJuYWxfd3IoKSBpcyBjYWxsYmFjaykKIAogICAgICAgICAjIFRoZSB3ZWFrcmVmcyBhdHRhY2hlZCB0byBjIGFuZCBkIHNob3VsZCBnZXQgY2xlYXJlZCwgc28gdGhhdAogICAgICAgICAjIEMuY2IgaXMgbmV2ZXIgY2FsbGVkLiAgQnV0IGV4dGVybmFsX3dyIGlzbid0IHBhcnQgb2YgdGhlIGN5Y2xpYwpAQCAtNjg2LDEyICs2ODYsMTIgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIoTXlSZWYsIHNlbGYpLl9fY2FsbF9fKCkKICAgICAgICAgbyA9IE9iamVjdCgiZm9vIikKICAgICAgICAgbXIgPSBNeVJlZihvLCB2YWx1ZT0yNCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1yKCkgaXMgbykKLSAgICAgICAgc2VsZi5hc3NlcnRfKG1yLmNhbGxlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1yKCkgaXMgbykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG1yLmNhbGxlZCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtci52YWx1ZSwgMjQpCiAgICAgICAgIGRlbCBvCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhtcigpIGlzIE5vbmUpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhtci5jYWxsZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtcigpIGlzIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtci5jYWxsZWQpCiAKICAgICBkZWYgdGVzdF9zdWJjbGFzc19yZWZzX2RvbnRfcmVwbGFjZV9zdGFuZGFyZF9yZWZzKHNlbGYpOgogICAgICAgICBjbGFzcyBNeVJlZih3ZWFrcmVmLnJlZik6CkBAIC02OTksMTYgKzY5OSwxNiBAQAogICAgICAgICBvID0gT2JqZWN0KDQyKQogICAgICAgICByMSA9IE15UmVmKG8pCiAgICAgICAgIHIyID0gd2Vha3JlZi5yZWYobykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHIxIGlzIG5vdCByMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIxIGlzIG5vdCByMikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3ZWFrcmVmLmdldHdlYWtyZWZzKG8pLCBbcjIsIHIxXSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSwgMikKICAgICAgICAgcjMgPSBNeVJlZihvKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pLCAzKQogICAgICAgICByZWZzID0gd2Vha3JlZi5nZXR3ZWFrcmVmcyhvKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZWZzKSwgMykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHIyIGlzIHJlZnNbMF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyMSBpbiByZWZzWzE6XSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHIzIGluIHJlZnNbMTpdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocjIgaXMgcmVmc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIxIGluIHJlZnNbMTpdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocjMgaW4gcmVmc1sxOl0pCiAKICAgICBkZWYgdGVzdF9zdWJjbGFzc19yZWZzX2RvbnRfY29uZmxhdGVfY2FsbGJhY2tzKHNlbGYpOgogICAgICAgICBjbGFzcyBNeVJlZih3ZWFrcmVmLnJlZik6CkBAIC03MTYsMTAgKzcxNiwxMCBAQAogICAgICAgICBvID0gT2JqZWN0KDQyKQogICAgICAgICByMSA9IE15UmVmKG8sIGlkKQogICAgICAgICByMiA9IE15UmVmKG8sIHN0cikKLSAgICAgICAgc2VsZi5hc3NlcnRfKHIxIGlzIG5vdCByMikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIxIGlzIG5vdCByMikKICAgICAgICAgcmVmcyA9IHdlYWtyZWYuZ2V0d2Vha3JlZnMobykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHIxIGluIHJlZnMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhyMiBpbiByZWZzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUocjEgaW4gcmVmcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHIyIGluIHJlZnMpCiAKICAgICBkZWYgdGVzdF9zdWJjbGFzc19yZWZzX3dpdGhfc2xvdHMoc2VsZik6CiAgICAgICAgIGNsYXNzIE15UmVmKHdlYWtyZWYucmVmKToKQEAgLTczNiw3ICs3MzYsNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIuc2xvdDEsICJhYmMiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIuc2xvdDIsICJkZWYiKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIubWV0aCgpLCAiYWJjZGVmIikKLSAgICAgICAgc2VsZi5mYWlsSWYoaGFzYXR0cihyLCAiX19kaWN0X18iKSkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShoYXNhdHRyKHIsICJfX2RpY3RfXyIpKQogCiAgICAgZGVmIHRlc3Rfc3ViY2xhc3NfcmVmc193aXRoX2N5Y2xlKHNlbGYpOgogICAgICAgICAjIEJ1ZyAjMzExMApAQCAtNzk0LDIzICs3OTQsMjMgQEAKICAgICAgICAgIwogICAgICAgICBkaWN0LCBvYmplY3RzID0gc2VsZi5tYWtlX3dlYWtfdmFsdWVkX2RpY3QoKQogICAgICAgICBmb3IgbyBpbiBvYmplY3RzOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtyZWYuZ2V0d2Vha3JlZmNvdW50KG8pID09IDEsCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUod2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAid3JvbmcgbnVtYmVyIG9mIHdlYWsgcmVmZXJlbmNlcyB0byAlciEiICUgbykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvIGlzIGRpY3Rbby5hcmddLAorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG8gaXMgZGljdFtvLmFyZ10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIndyb25nIG9iamVjdCByZXR1cm5lZCBieSB3ZWFrIGRpY3QhIikKICAgICAgICAgaXRlbXMxID0gZGljdC5pdGVtcygpCiAgICAgICAgIGl0ZW1zMiA9IGRpY3QuY29weSgpLml0ZW1zKCkKICAgICAgICAgaXRlbXMxLnNvcnQoKQogICAgICAgICBpdGVtczIuc29ydCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhpdGVtczEgPT0gaXRlbXMyLAorICAgICAgICBzZWxmLmFzc2VydFRydWUoaXRlbXMxID09IGl0ZW1zMiwKICAgICAgICAgICAgICAgICAgICAgICJjbG9uaW5nIG9mIHdlYWstdmFsdWVkIGRpY3Rpb25hcnkgZGlkIG5vdCB3b3JrISIpCiAgICAgICAgIGRlbCBpdGVtczEsIGl0ZW1zMgotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGRpY3QpID09IHNlbGYuQ09VTlQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGljdCkgPT0gc2VsZi5DT1VOVCkKICAgICAgICAgZGVsIG9iamVjdHNbMF0KLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihkaWN0KSA9PSAoc2VsZi5DT1VOVCAtIDEpLAorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGRpY3QpID09IChzZWxmLkNPVU5UIC0gMSksCiAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRpbmcgb2JqZWN0IGRpZCBub3QgY2F1c2UgZGljdGlvbmFyeSB1cGRhdGUiKQogICAgICAgICBkZWwgb2JqZWN0cywgbwotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGRpY3QpID09IDAsCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGljdCkgPT0gMCwKICAgICAgICAgICAgICAgICAgICAgICJkZWxldGluZyB0aGUgdmFsdWVzIGRpZCBub3QgY2xlYXIgdGhlIGRpY3Rpb25hcnkiKQogICAgICAgICAjIHJlZ3Jlc3Npb24gb24gU0YgYnVnICM0NDcxNTI6CiAgICAgICAgIGRpY3QgPSB3ZWFrcmVmLldlYWtWYWx1ZURpY3Rpb25hcnkoKQpAQCAtODI1LDI2ICs4MjUsMjYgQEAKICAgICAgICAgIwogICAgICAgICBkaWN0LCBvYmplY3RzID0gc2VsZi5tYWtlX3dlYWtfa2V5ZWRfZGljdCgpCiAgICAgICAgIGZvciBvIGluIG9iamVjdHM6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8od2Vha3JlZi5nZXR3ZWFrcmVmY291bnQobykgPT0gMSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrcmVmLmdldHdlYWtyZWZjb3VudChvKSA9PSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICJ3cm9uZyBudW1iZXIgb2Ygd2VhayByZWZlcmVuY2VzIHRvICVyISIgJSBvKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKG8uYXJnIGlzIGRpY3Rbb10sCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoby5hcmcgaXMgZGljdFtvXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAid3Jvbmcgb2JqZWN0IHJldHVybmVkIGJ5IHdlYWsgZGljdCEiKQogICAgICAgICBpdGVtczEgPSBkaWN0Lml0ZW1zKCkKICAgICAgICAgaXRlbXMyID0gZGljdC5jb3B5KCkuaXRlbXMoKQotICAgICAgICBzZWxmLmFzc2VydF8oc2V0KGl0ZW1zMSkgPT0gc2V0KGl0ZW1zMiksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzZXQoaXRlbXMxKSA9PSBzZXQoaXRlbXMyKSwKICAgICAgICAgICAgICAgICAgICAgICJjbG9uaW5nIG9mIHdlYWsta2V5ZWQgZGljdGlvbmFyeSBkaWQgbm90IHdvcmshIikKICAgICAgICAgZGVsIGl0ZW1zMSwgaXRlbXMyCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZGljdCkgPT0gc2VsZi5DT1VOVCkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihkaWN0KSA9PSBzZWxmLkNPVU5UKQogICAgICAgICBkZWwgb2JqZWN0c1swXQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGRpY3QpID09IChzZWxmLkNPVU5UIC0gMSksCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4oZGljdCkgPT0gKHNlbGYuQ09VTlQgLSAxKSwKICAgICAgICAgICAgICAgICAgICAgICJkZWxldGluZyBvYmplY3QgZGlkIG5vdCBjYXVzZSBkaWN0aW9uYXJ5IHVwZGF0ZSIpCiAgICAgICAgIGRlbCBvYmplY3RzLCBvCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4oZGljdCkgPT0gMCwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihkaWN0KSA9PSAwLAogICAgICAgICAgICAgICAgICAgICAgImRlbGV0aW5nIHRoZSBrZXlzIGRpZCBub3QgY2xlYXIgdGhlIGRpY3Rpb25hcnkiKQogICAgICAgICBvID0gT2JqZWN0KDQyKQogICAgICAgICBkaWN0W29dID0gIldoYXQgaXMgdGhlIG1lYW5pbmcgb2YgdGhlIHVuaXZlcnNlPyIKLSAgICAgICAgc2VsZi5hc3NlcnRfKGRpY3QuaGFzX2tleShvKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBkaWN0Lmhhc19rZXkoMzQpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGljdC5oYXNfa2V5KG8pKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGRpY3QuaGFzX2tleSgzNCkpCiAKICAgICBkZWYgdGVzdF93ZWFrX2tleWVkX2l0ZXJzKHNlbGYpOgogICAgICAgICBkaWN0LCBvYmplY3RzID0gc2VsZi5tYWtlX3dlYWtfa2V5ZWRfZGljdCgpCkBAIC04NTYsOCArODU2LDggQEAKICAgICAgICAgb2JqZWN0czIgPSBsaXN0KG9iamVjdHMpCiAgICAgICAgIGZvciB3ciBpbiByZWZzOgogICAgICAgICAgICAgb2IgPSB3cigpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZGljdC5oYXNfa2V5KG9iKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvYiBpbiBkaWN0KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGRpY3QuaGFzX2tleShvYikpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUob2IgaW4gZGljdCkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwob2IuYXJnLCBkaWN0W29iXSkKICAgICAgICAgICAgIG9iamVjdHMyLnJlbW92ZShvYikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ob2JqZWN0czIpLCAwKQpAQCAtODY3LDggKzg2Nyw4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpc3QoZGljdC5pdGVya2V5cmVmcygpKSksIGxlbihvYmplY3RzKSkKICAgICAgICAgZm9yIHdyIGluIGRpY3QuaXRlcmtleXJlZnMoKToKICAgICAgICAgICAgIG9iID0gd3IoKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGRpY3QuaGFzX2tleShvYikpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ob2IgaW4gZGljdCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWN0Lmhhc19rZXkob2IpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG9iIGluIGRpY3QpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9iLmFyZywgZGljdFtvYl0pCiAgICAgICAgICAgICBvYmplY3RzMi5yZW1vdmUob2IpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG9iamVjdHMyKSwgMCkKQEAgLTkwMywzNyArOTAzLDM3IEBACiAgICAgICAgIGl0ZW1zID0gZGljdC5pdGVtcygpCiAgICAgICAgIGZvciBpdGVtIGluIGRpY3QuaXRlcml0ZW1zKCk6CiAgICAgICAgICAgICBpdGVtcy5yZW1vdmUoaXRlbSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihpdGVtcykgPT0gMCwgIml0ZXJpdGVtcygpIGRpZCBub3QgdG91Y2ggYWxsIGl0ZW1zIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihpdGVtcykgPT0gMCwgIml0ZXJpdGVtcygpIGRpZCBub3QgdG91Y2ggYWxsIGl0ZW1zIikKIAogICAgICAgICAjIGtleSBpdGVyYXRvciwgdmlhIF9faXRlcl9fKCk6CiAgICAgICAgIGtleXMgPSBkaWN0LmtleXMoKQogICAgICAgICBmb3IgayBpbiBkaWN0OgogICAgICAgICAgICAga2V5cy5yZW1vdmUoaykKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihrZXlzKSA9PSAwLCAiX19pdGVyX18oKSBkaWQgbm90IHRvdWNoIGFsbCBrZXlzIikKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbihrZXlzKSA9PSAwLCAiX19pdGVyX18oKSBkaWQgbm90IHRvdWNoIGFsbCBrZXlzIikKIAogICAgICAgICAjIGtleSBpdGVyYXRvciwgdmlhIGl0ZXJrZXlzKCk6CiAgICAgICAgIGtleXMgPSBkaWN0LmtleXMoKQogICAgICAgICBmb3IgayBpbiBkaWN0Lml0ZXJrZXlzKCk6CiAgICAgICAgICAgICBrZXlzLnJlbW92ZShrKQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGtleXMpID09IDAsICJpdGVya2V5cygpIGRpZCBub3QgdG91Y2ggYWxsIGtleXMiKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGtleXMpID09IDAsICJpdGVya2V5cygpIGRpZCBub3QgdG91Y2ggYWxsIGtleXMiKQogCiAgICAgICAgICMgdmFsdWUgaXRlcmF0b3I6CiAgICAgICAgIHZhbHVlcyA9IGRpY3QudmFsdWVzKCkKICAgICAgICAgZm9yIHYgaW4gZGljdC5pdGVydmFsdWVzKCk6CiAgICAgICAgICAgICB2YWx1ZXMucmVtb3ZlKHYpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4odmFsdWVzKSA9PSAwLAorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHZhbHVlcykgPT0gMCwKICAgICAgICAgICAgICAgICAgICAgICJpdGVydmFsdWVzKCkgZGlkIG5vdCB0b3VjaCBhbGwgdmFsdWVzIikKIAogICAgIGRlZiB0ZXN0X21ha2Vfd2Vha19rZXllZF9kaWN0X2Zyb21fZGljdChzZWxmKToKICAgICAgICAgbyA9IE9iamVjdCgzKQogICAgICAgICBkaWN0ID0gd2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeSh7bzozNjR9KQotICAgICAgICBzZWxmLmFzc2VydF8oZGljdFtvXSA9PSAzNjQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWN0W29dID09IDM2NCkKIAogICAgIGRlZiB0ZXN0X21ha2Vfd2Vha19rZXllZF9kaWN0X2Zyb21fd2Vha19rZXllZF9kaWN0KHNlbGYpOgogICAgICAgICBvID0gT2JqZWN0KDMpCiAgICAgICAgIGRpY3QgPSB3ZWFrcmVmLldlYWtLZXlEaWN0aW9uYXJ5KHtvOjM2NH0pCiAgICAgICAgIGRpY3QyID0gd2Vha3JlZi5XZWFrS2V5RGljdGlvbmFyeShkaWN0KQotICAgICAgICBzZWxmLmFzc2VydF8oZGljdFtvXSA9PSAzNjQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkaWN0W29dID09IDM2NCkKIAogICAgIGRlZiBtYWtlX3dlYWtfa2V5ZWRfZGljdChzZWxmKToKICAgICAgICAgZGljdCA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoKQpAQCAtOTUzLDE5ICs5NTMsMTkgQEAKICAgICAgICAgd2Vha2RpY3QgPSBrbGFzcygpCiAgICAgICAgIHdlYWtkaWN0W2tleTFdID0gdmFsdWUxCiAgICAgICAgIHdlYWtkaWN0W2tleTJdID0gdmFsdWUyCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4od2Vha2RpY3QpID09IDIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4od2Vha2RpY3QpID09IDIpCiAgICAgICAgIGssIHYgPSB3ZWFrZGljdC5wb3BpdGVtKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbih3ZWFrZGljdCkgPT0gMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGxlbih3ZWFrZGljdCkgPT0gMSkKICAgICAgICAgaWYgayBpcyBrZXkxOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHYgaXMgdmFsdWUxKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgaXMgdmFsdWUxKQogICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHYgaXMgdmFsdWUyKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgaXMgdmFsdWUyKQogICAgICAgICBrLCB2ID0gd2Vha2RpY3QucG9waXRlbSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhsZW4od2Vha2RpY3QpID09IDApCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShsZW4od2Vha2RpY3QpID09IDApCiAgICAgICAgIGlmIGsgaXMga2V5MToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2IGlzIHZhbHVlMSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGlzIHZhbHVlMSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2IGlzIHZhbHVlMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGlzIHZhbHVlMikKIAogICAgIGRlZiB0ZXN0X3dlYWtfdmFsdWVkX2RpY3RfcG9waXRlbShzZWxmKToKICAgICAgICAgc2VsZi5jaGVja19wb3BpdGVtKHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSwKQEAgLTk3NiwyMSArOTc2LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDKCksICJ2YWx1ZSAxIiwgQygpLCAidmFsdWUgMiIpCiAKICAgICBkZWYgY2hlY2tfc2V0ZGVmYXVsdChzZWxmLCBrbGFzcywga2V5LCB2YWx1ZTEsIHZhbHVlMik6Ci0gICAgICAgIHNlbGYuYXNzZXJ0Xyh2YWx1ZTEgaXMgbm90IHZhbHVlMiwKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHZhbHVlMSBpcyBub3QgdmFsdWUyLAogICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgdGVzdCIKICAgICAgICAgICAgICAgICAgICAgICIgLS0gdmFsdWUgcGFyYW1ldGVycyBtdXN0IGJlIGRpc3RpbmN0IG9iamVjdHMiKQogICAgICAgICB3ZWFrZGljdCA9IGtsYXNzKCkKICAgICAgICAgbyA9IHdlYWtkaWN0LnNldGRlZmF1bHQoa2V5LCB2YWx1ZTEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhvIGlzIHZhbHVlMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtkaWN0Lmhhc19rZXkoa2V5KSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtkaWN0LmdldChrZXkpIGlzIHZhbHVlMSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHdlYWtkaWN0W2tleV0gaXMgdmFsdWUxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobyBpcyB2YWx1ZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrZGljdC5oYXNfa2V5KGtleSkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrZGljdC5nZXQoa2V5KSBpcyB2YWx1ZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrZGljdFtrZXldIGlzIHZhbHVlMSkKIAogICAgICAgICBvID0gd2Vha2RpY3Quc2V0ZGVmYXVsdChrZXksIHZhbHVlMikKLSAgICAgICAgc2VsZi5hc3NlcnRfKG8gaXMgdmFsdWUxKQotICAgICAgICBzZWxmLmFzc2VydF8od2Vha2RpY3QuaGFzX2tleShrZXkpKQotICAgICAgICBzZWxmLmFzc2VydF8od2Vha2RpY3QuZ2V0KGtleSkgaXMgdmFsdWUxKQotICAgICAgICBzZWxmLmFzc2VydF8od2Vha2RpY3Rba2V5XSBpcyB2YWx1ZTEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvIGlzIHZhbHVlMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtkaWN0Lmhhc19rZXkoa2V5KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtkaWN0LmdldChrZXkpIGlzIHZhbHVlMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHdlYWtkaWN0W2tleV0gaXMgdmFsdWUxKQogCiAgICAgZGVmIHRlc3Rfd2Vha192YWx1ZWRfZGljdF9zZXRkZWZhdWx0KHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX3NldGRlZmF1bHQod2Vha3JlZi5XZWFrVmFsdWVEaWN0aW9uYXJ5LApAQCAtMTAwNywxOSArMTAwNywxOSBAQAogICAgICAgICAjCiAgICAgICAgIHdlYWtkaWN0ID0ga2xhc3MoKQogICAgICAgICB3ZWFrZGljdC51cGRhdGUoZGljdCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbih3ZWFrZGljdCkgPT0gbGVuKGRpY3QpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKHdlYWtkaWN0KSA9PSBsZW4oZGljdCkpCiAgICAgICAgIGZvciBrIGluIHdlYWtkaWN0LmtleXMoKToKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhkaWN0Lmhhc19rZXkoayksCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZGljdC5oYXNfa2V5KGspLAogICAgICAgICAgICAgICAgICAgICAgICAgICJteXN0ZXJpb3VzIG5ldyBrZXkgYXBwZWFyZWQgaW4gd2VhayBkaWN0IikKICAgICAgICAgICAgIHYgPSBkaWN0LmdldChrKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHYgaXMgd2Vha2RpY3Rba10pCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odiBpcyB3ZWFrZGljdC5nZXQoaykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUodiBpcyB3ZWFrZGljdFtrXSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGlzIHdlYWtkaWN0LmdldChrKSkKICAgICAgICAgZm9yIGsgaW4gZGljdC5rZXlzKCk6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8od2Vha2RpY3QuaGFzX2tleShrKSwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh3ZWFrZGljdC5oYXNfa2V5KGspLAogICAgICAgICAgICAgICAgICAgICAgICAgICJvcmlnaW5hbCBrZXkgZGlzYXBwZWFyZWQgaW4gd2VhayBkaWN0IikKICAgICAgICAgICAgIHYgPSBkaWN0W2tdCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8odiBpcyB3ZWFrZGljdFtrXSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyh2IGlzIHdlYWtkaWN0LmdldChrKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh2IGlzIHdlYWtkaWN0W2tdKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHYgaXMgd2Vha2RpY3QuZ2V0KGspKQogCiAgICAgZGVmIHRlc3Rfd2Vha192YWx1ZWRfZGljdF91cGRhdGUoc2VsZik6CiAgICAgICAgIHNlbGYuY2hlY2tfdXBkYXRlKHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSwKQEAgLTEwMzUsMTAgKzEwMzUsMTAgQEAKICAgICAgICAgbzIgPSBPYmplY3QoJzInKQogICAgICAgICBkW28xXSA9ICdzb21ldGhpbmcnCiAgICAgICAgIGRbbzJdID0gJ3NvbWV0aGluZycKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihkKSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGQpID09IDIpCiAgICAgICAgIGRlbCBkW28xXQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGQpID09IDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkLmtleXMoKSA9PSBbbzJdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGQpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLmtleXMoKSA9PSBbbzJdKQogCiAgICAgZGVmIHRlc3Rfd2Vha192YWx1ZWRfZGVsaXRlbShzZWxmKToKICAgICAgICAgZCA9IHdlYWtyZWYuV2Vha1ZhbHVlRGljdGlvbmFyeSgpCkBAIC0xMDQ2LDEwICsxMDQ2LDEwIEBACiAgICAgICAgIG8yID0gT2JqZWN0KCcyJykKICAgICAgICAgZFsnc29tZXRoaW5nJ10gPSBvMQogICAgICAgICBkWydzb21ldGhpbmcgZWxzZSddID0gbzIKLSAgICAgICAgc2VsZi5hc3NlcnRfKGxlbihkKSA9PSAyKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGQpID09IDIpCiAgICAgICAgIGRlbCBkWydzb21ldGhpbmcnXQotICAgICAgICBzZWxmLmFzc2VydF8obGVuKGQpID09IDEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkLml0ZW1zKCkgPT0gWygnc29tZXRoaW5nIGVsc2UnLCBvMildKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobGVuKGQpID09IDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkLml0ZW1zKCkgPT0gWygnc29tZXRoaW5nIGVsc2UnLCBvMildKQogCiAgICAgZGVmIHRlc3Rfd2Vha19rZXllZF9iYWRfZGVsaXRlbShzZWxmKToKICAgICAgICAgZCA9IHdlYWtyZWYuV2Vha0tleURpY3Rpb25hcnkoKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93c2dpcmVmLnB5IGIvTGliL3Rlc3QvdGVzdF93c2dpcmVmLnB5CmluZGV4IGI2ZDk5NGIuLmRiODIxMzkgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd3NnaXJlZi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dzZ2lyZWYucHkKQEAgLTE0OSw3ICsxNDksNyBAQAogICAgICAgICAgICAgc3RhcnRfcmVzcG9uc2UoIjIwMCBPSyIsICgnQ29udGVudC1UeXBlJywndGV4dC9wbGFpbicpKQogICAgICAgICAgICAgcmV0dXJuIFsiSGVsbG8sIHdvcmxkISJdCiAgICAgICAgIG91dCwgZXJyID0gcnVuX2Ftb2NrKHZhbGlkYXRvcihiYWRfYXBwKSkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG91dC5lbmRzd2l0aCgKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG91dC5lbmRzd2l0aCgKICAgICAgICAgICAgICJBIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gIFBsZWFzZSBjb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yLiIKICAgICAgICAgKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKQEAgLTE3OCwxNCArMTc4LDE0IEBACiAgICAgICAgIGVudiA9IHt9CiAgICAgICAgIHV0aWwuc2V0dXBfdGVzdGluZ19kZWZhdWx0cyhlbnYpCiAgICAgICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsU3RyaW5nSU8pOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoZW52W2tleV0sU3RyaW5nSU8pKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UoZW52W2tleV0sU3RyaW5nSU8pKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnZba2V5XSx2YWx1ZSkKIAogICAgICAgICAjIENoZWNrIGV4aXN0aW5nIHZhbHVlCiAgICAgICAgIGVudiA9IHtrZXk6YWx0fQogICAgICAgICB1dGlsLnNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoZW52KQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZW52W2tleV0gaXMgYWx0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZW52W2tleV0gaXMgYWx0KQogCiAgICAgZGVmIGNoZWNrQ3Jvc3NEZWZhdWx0KHNlbGYsa2V5LHZhbHVlLCoqa3cpOgogICAgICAgICB1dGlsLnNldHVwX3Rlc3RpbmdfZGVmYXVsdHMoa3cpCkBAIC0yMTIsMTUgKzIxMiwxNSBAQAogICAgICAgICBjb21wYXJlX2dlbmVyaWNfaXRlcihtYWtlX2l0LG1hdGNoKQogCiAgICAgICAgIGl0ID0gbWFrZV9pdCgpCi0gICAgICAgIHNlbGYuZmFpbElmKGl0LmZpbGVsaWtlLmNsb3NlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShpdC5maWxlbGlrZS5jbG9zZWQpCiAKICAgICAgICAgZm9yIGl0ZW0gaW4gaXQ6CiAgICAgICAgICAgICBwYXNzCiAKLSAgICAgICAgc2VsZi5mYWlsSWYoaXQuZmlsZWxpa2UuY2xvc2VkKQorICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGl0LmZpbGVsaWtlLmNsb3NlZCkKIAogICAgICAgICBpdC5jbG9zZSgpCi0gICAgICAgIHNlbGYuZmFpbFVubGVzcyhpdC5maWxlbGlrZS5jbG9zZWQpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpdC5maWxlbGlrZS5jbG9zZWQpCiAKIAogICAgIGRlZiB0ZXN0U2ltcGxlU2hpZnRzKHNlbGYpOgpAQCAtMzE4LDE0ICszMTgsMTQgQEAKICAgICAgICAgICAgICJURSBUcmFpbGVycyBUcmFuc2Zlci1FbmNvZGluZyBVcGdyYWRlIgogICAgICAgICApLnNwbGl0KCk6CiAgICAgICAgICAgICBmb3IgYWx0IGluIGhvcCwgaG9wLnRpdGxlKCksIGhvcC51cHBlcigpLCBob3AubG93ZXIoKToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3ModXRpbC5pc19ob3BfYnlfaG9wKGFsdCkpCisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHV0aWwuaXNfaG9wX2J5X2hvcChhbHQpKQogCiAgICAgICAgICMgTm90IGNvbXByZWhlbnNpdmUsIGp1c3QgYSBmZXcgcmFuZG9tIGhlYWRlciBuYW1lcwogICAgICAgICBmb3IgaG9wIGluICgKICAgICAgICAgICAgICJBY2NlcHQgQ2FjaGUtQ29udHJvbCBEYXRlIFByYWdtYSBUcmFpbGVyIFZpYSBXYXJuaW5nIgogICAgICAgICApLnNwbGl0KCk6CiAgICAgICAgICAgICBmb3IgYWx0IGluIGhvcCwgaG9wLnRpdGxlKCksIGhvcC51cHBlcigpLCBob3AubG93ZXIoKToKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxJZih1dGlsLmlzX2hvcF9ieV9ob3AoYWx0KSkKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKHV0aWwuaXNfaG9wX2J5X2hvcChhbHQpKQogCiBjbGFzcyBIZWFkZXJUZXN0cyhUZXN0Q2FzZSk6CiAKQEAgLTMzNiwxNyArMzM2LDE3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoSGVhZGVycyh0ZXN0WzpdKS5rZXlzKCksIFsneCddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEhlYWRlcnModGVzdFs6XSkudmFsdWVzKCksIFsneSddKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKEhlYWRlcnModGVzdFs6XSkuaXRlbXMoKSwgdGVzdCkKLSAgICAgICAgc2VsZi5mYWlsSWYoSGVhZGVycyh0ZXN0KS5pdGVtcygpIGlzIHRlc3QpICAjIG11c3QgYmUgY29weSEKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShIZWFkZXJzKHRlc3QpLml0ZW1zKCkgaXMgdGVzdCkgICMgbXVzdCBiZSBjb3B5IQogCiAgICAgICAgIGg9SGVhZGVycyhbXSkKICAgICAgICAgZGVsIGhbJ2ZvbyddICAgIyBzaG91bGQgbm90IHJhaXNlIGFuIGVycm9yCiAKICAgICAgICAgaFsnRm9vJ10gPSAnYmFyJwogICAgICAgICBmb3IgbSBpbiBoLmhhc19rZXksIGguX19jb250YWluc19fLCBoLmdldCwgaC5nZXRfYWxsLCBoLl9fZ2V0aXRlbV9fOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG0oJ2ZvbycpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG0oJ0ZvbycpKQotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKG0oJ0ZPTycpKQotICAgICAgICAgICAgc2VsZi5mYWlsSWYobSgnYmFyJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobSgnZm9vJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobSgnRm9vJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUobSgnRk9PJykpCisgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKG0oJ2JhcicpKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaFsnZm9vJ10sJ2JhcicpCiAgICAgICAgIGhbJ2ZvbyddID0gJ2JheicKQEAgLTQyOCw3ICs0MjgsNyBAQAogICAgICAgICAgICAgaWYgbm90IGVtcHR5Lmhhc19rZXkoayk6CiAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbnZba10sdikKICAgICAgICAgZm9yIGssdiBpbiBlbXB0eS5pdGVtcygpOgotICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGVudi5oYXNfa2V5KGspKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGVudi5oYXNfa2V5KGspKQogCiAgICAgZGVmIHRlc3RFbnZpcm9uKHNlbGYpOgogICAgICAgICBoID0gVGVzdEhhbmRsZXIoWD0iWSIpCkBAIC00NDEsNyArNDQxLDcgQEAKICAgICAgICAgaCA9IEJhc2VDR0lIYW5kbGVyKE5vbmUsTm9uZSxOb25lLHt9KQogICAgICAgICBoLnNldHVwX2Vudmlyb24oKQogICAgICAgICBmb3Iga2V5IGluICd3c2dpLnVybF9zY2hlbWUnLCAnd3NnaS5pbnB1dCcsICd3c2dpLmVycm9ycyc6Ci0gICAgICAgICAgICBzZWxmLmFzc2VydF8oaC5lbnZpcm9uLmhhc19rZXkoa2V5KSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShoLmVudmlyb24uaGFzX2tleShrZXkpKQogCiAgICAgZGVmIHRlc3RTY2hlbWUoc2VsZik6CiAgICAgICAgIGg9VGVzdEhhbmRsZXIoSFRUUFM9Im9uIik7IGguc2V0dXBfZW52aXJvbigpCkBAIC01MTYsNyArNTE2LDcgQEAKICAgICAgICAgICAgICJDb250ZW50LUxlbmd0aDogJWRcclxuIgogICAgICAgICAgICAgIlxyXG4lcyIgJSAoaC5lcnJvcl9zdGF0dXMsbGVuKGguZXJyb3JfYm9keSksaC5lcnJvcl9ib2R5KSkKIAotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaC5zdGRlcnIuZ2V0dmFsdWUoKS5maW5kKCJBc3NlcnRpb25FcnJvciIpPD4tMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGguc3RkZXJyLmdldHZhbHVlKCkuZmluZCgiQXNzZXJ0aW9uRXJyb3IiKTw+LTEpCiAKICAgICBkZWYgdGVzdEVycm9yQWZ0ZXJPdXRwdXQoc2VsZik6CiAgICAgICAgIE1TRyA9ICJTb21lIG91dHB1dCBoYXMgYmVlbiBzZW50IgpAQCAtNTI5LDcgKzUyOSw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zdGRvdXQuZ2V0dmFsdWUoKSwKICAgICAgICAgICAgICJTdGF0dXM6IDIwMCBPS1xyXG4iCiAgICAgICAgICAgICAiXHJcbiIrTVNHKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaC5zdGRlcnIuZ2V0dmFsdWUoKS5maW5kKCJBc3NlcnRpb25FcnJvciIpPD4tMSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGguc3RkZXJyLmdldHZhbHVlKCkuZmluZCgiQXNzZXJ0aW9uRXJyb3IiKTw+LTEpCiAKIAogICAgIGRlZiB0ZXN0SGVhZGVyRm9ybWF0cyhzZWxmKToKQEAgLTU2OCw3ICs1NjgsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiBwcm90bz09IkhUVFAvMC45IjoKICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaC5zdGRvdXQuZ2V0dmFsdWUoKSwiIikKICAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcygKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZS5tYXRjaChzdGRwYXQlKHZlcnNpb24sc3cpLCBoLnN0ZG91dC5nZXR2YWx1ZSgpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RkcGF0JSh2ZXJzaW9uLHN3KSwgaC5zdGRvdXQuZ2V0dmFsdWUoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeGRybGliLnB5IGIvTGliL3Rlc3QvdGVzdF94ZHJsaWIucHkKaW5kZXggOGZjODhhNS4uYWI2ZTQ2MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94ZHJsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94ZHJsaWIucHkKQEAgLTMwLDE1ICszMCwxNSBAQAogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXAudW5wYWNrX2ludCgpLCA0MikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1cC51bnBhY2tfdWludCgpLCA5KQotICAgICAgICBzZWxmLmFzc2VydF8odXAudW5wYWNrX2Jvb2woKSBpcyBUcnVlKQorICAgICAgICBzZWxmLmFzc2VydFRydWUodXAudW5wYWNrX2Jvb2woKSBpcyBUcnVlKQogCiAgICAgICAgICMgcmVtZW1iZXIgcG9zaXRpb24KICAgICAgICAgcG9zID0gdXAuZ2V0X3Bvc2l0aW9uKCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHVwLnVucGFja19ib29sKCkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1cC51bnBhY2tfYm9vbCgpIGlzIEZhbHNlKQogCiAgICAgICAgICMgcmV3aW5kIGFuZCB1bnBhY2sgYWdhaW4KICAgICAgICAgdXAuc2V0X3Bvc2l0aW9uKHBvcykKLSAgICAgICAgc2VsZi5hc3NlcnRfKHVwLnVucGFja19ib29sKCkgaXMgRmFsc2UpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1cC51bnBhY2tfYm9vbCgpIGlzIEZhbHNlKQogCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXAudW5wYWNrX3VoeXBlcigpLCA0NUwpCiAgICAgICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwodXAudW5wYWNrX2Zsb2F0KCksIDEuOSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeG1scnBjLnB5IGIvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKaW5kZXggY2U1NjFmNC4uZmYwZGVjOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94bWxycGMucHkKQEAgLTcxLDIxICs3MSwyMSBAQAogICAgIGRlZiB0ZXN0X2NtcF9kYXRldGltZV9EYXRlVGltZShzZWxmKToKICAgICAgICAgbm93ID0gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkKICAgICAgICAgZHQgPSB4bWxycGNsaWIuRGF0ZVRpbWUobm93LnRpbWV0dXBsZSgpKQotICAgICAgICBzZWxmLmFzc2VydF8oZHQgPT0gbm93KQotICAgICAgICBzZWxmLmFzc2VydF8obm93ID09IGR0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZHQgPT0gbm93KQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm93ID09IGR0KQogICAgICAgICB0aGVuID0gbm93ICsgZGF0ZXRpbWUudGltZWRlbHRhKHNlY29uZHM9NCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKHRoZW4gPj0gZHQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkdCA8IHRoZW4pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0aGVuID49IGR0KQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZHQgPCB0aGVuKQogCiAgICAgZGVmIHRlc3RfYnVnXzExNjQ5MTIgKHNlbGYpOgogICAgICAgICBkID0geG1scnBjbGliLkRhdGVUaW1lKCkKICAgICAgICAgKChuZXdfZCwpLCBkdW1teSkgPSB4bWxycGNsaWIubG9hZHMoeG1scnBjbGliLmR1bXBzKChkLCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHJlc3BvbnNlPVRydWUpKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShuZXdfZC52YWx1ZSwgc3RyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobmV3X2QudmFsdWUsIHN0cikpCiAKICAgICAgICAgIyBDaGVjayB0aGF0IHRoZSBvdXRwdXQgb2YgZHVtcHMoKSBpcyBzdGlsbCBhbiA4LWJpdCBzdHJpbmcKICAgICAgICAgcyA9IHhtbHJwY2xpYi5kdW1wcygobmV3X2QsKSwgbWV0aG9kcmVzcG9uc2U9VHJ1ZSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2Uocywgc3RyKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uocywgc3RyKSkKIAogICAgIGRlZiB0ZXN0X25ld3N0eWxlX2NsYXNzKHNlbGYpOgogICAgICAgICBjbGFzcyBUKG9iamVjdCk6CkBAIC0xNzUsMTAgKzE3NSwxMCBAQAogICAgICAgICBpdGVtcyA9IGQuaXRlbXMoKQogICAgICAgICBpZiBoYXZlX3VuaWNvZGU6CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhzLCB1ImFiYyBceDk1IikKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHMsIHVuaWNvZGUpKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UocywgdW5pY29kZSkpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpdGVtcywgWyh1ImRlZiBceDk2IiwgdSJnaGkgXHg5NyIpXSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGl0ZW1zWzBdWzBdLCB1bmljb2RlKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKGl0ZW1zWzBdWzFdLCB1bmljb2RlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGl0ZW1zWzBdWzBdLCB1bmljb2RlKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKGl0ZW1zWzBdWzFdLCB1bmljb2RlKSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHMsICJhYmMgXHhjMlx4OTUiKQogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaXRlbXMsIFsoImRlZiBceGMyXHg5NiIsICJnaGkgXHhjMlx4OTciKV0pCkBAIC01MTEsNyArNTExLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVhNTFJQQ1NlcnZlci5yZXNvbHZlX2RvdHRlZF9hdHRyaWJ1dGUsIHN0ciwgJ19fYWRkJykKIAotICAgICAgICBzZWxmLmFzc2VydF8oU2ltcGxlWE1MUlBDU2VydmVyLnJlc29sdmVfZG90dGVkX2F0dHJpYnV0ZShzdHIsICd0aXRsZScpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoU2ltcGxlWE1MUlBDU2VydmVyLnJlc29sdmVfZG90dGVkX2F0dHJpYnV0ZShzdHIsICd0aXRsZScpKQogICAgICAgICAjIEdldCB0aGUgdGVzdCB0byBydW4gZmFzdGVyIGJ5IHNlbmRpbmcgYSByZXF1ZXN0IHdpdGggdGVzdF9zaW1wbGUxLgogICAgICAgICAjIFRoaXMgYXZvaWRzIHdhaXRpbmcgZm9yIHRoZSBzb2NrZXQgdGltZW91dC4KICAgICAgICAgc2VsZi50ZXN0X3NpbXBsZTEoKQpAQCAtODM4LDcgKzgzOCw3IEBACiAgICAgICAgICAgICAgICAgY29ubi5wdXRoZWFkZXIoIlgtVGVzdCIsICJ0ZXN0X2N1c3RvbV91c2VyX2FnZW50IikKIAogICAgICAgICByZXEgPSBzZWxmLmlzc3VlX3JlcXVlc3QoVGVzdFRyYW5zcG9ydCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJYLVRlc3Q6IHRlc3RfY3VzdG9tX3VzZXJfYWdlbnRcclxuIiBpbiByZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiWC1UZXN0OiB0ZXN0X2N1c3RvbV91c2VyX2FnZW50XHJcbiIgaW4gcmVxKQogCiAgICAgZGVmIHRlc3Rfc2VuZF9ob3N0KHNlbGYpOgogICAgICAgICBjbGFzcyBUZXN0VHJhbnNwb3J0KEZha2VUcmFuc3BvcnQpOgpAQCAtODQ4LDcgKzg0OCw3IEBACiAgICAgICAgICAgICAgICAgY29ubi5wdXRoZWFkZXIoIlgtVGVzdCIsICJ0ZXN0X3NlbmRfaG9zdCIpCiAKICAgICAgICAgcmVxID0gc2VsZi5pc3N1ZV9yZXF1ZXN0KFRlc3RUcmFuc3BvcnQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiWC1UZXN0OiB0ZXN0X3NlbmRfaG9zdFxyXG4iIGluIHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJYLVRlc3Q6IHRlc3Rfc2VuZF9ob3N0XHJcbiIgaW4gcmVxKQogCiAgICAgZGVmIHRlc3Rfc2VuZF9yZXF1ZXN0KHNlbGYpOgogICAgICAgICBjbGFzcyBUZXN0VHJhbnNwb3J0KEZha2VUcmFuc3BvcnQpOgpAQCAtODU4LDcgKzg1OCw3IEBACiAgICAgICAgICAgICAgICAgY29ubi5wdXRoZWFkZXIoIlgtVGVzdCIsICJ0ZXN0X3NlbmRfcmVxdWVzdCIpCiAKICAgICAgICAgcmVxID0gc2VsZi5pc3N1ZV9yZXF1ZXN0KFRlc3RUcmFuc3BvcnQpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiWC1UZXN0OiB0ZXN0X3NlbmRfcmVxdWVzdFxyXG4iIGluIHJlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJYLVRlc3Q6IHRlc3Rfc2VuZF9yZXF1ZXN0XHJcbiIgaW4gcmVxKQogCiAgICAgZGVmIHRlc3Rfc2VuZF9jb250ZW50KHNlbGYpOgogICAgICAgICBjbGFzcyBUZXN0VHJhbnNwb3J0KEZha2VUcmFuc3BvcnQpOgpAQCAtODY4LDcgKzg2OCw3IEBACiAgICAgICAgICAgICAgICAgeG1scnBjbGliLlRyYW5zcG9ydC5zZW5kX2NvbnRlbnQoc2VsZiwgY29ubiwgYm9keSkKIAogICAgICAgICByZXEgPSBzZWxmLmlzc3VlX3JlcXVlc3QoVGVzdFRyYW5zcG9ydCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJYLVRlc3Q6IHRlc3Rfc2VuZF9jb250ZW50XHJcbiIgaW4gcmVxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoIlgtVGVzdDogdGVzdF9zZW5kX2NvbnRlbnRcclxuIiBpbiByZXEpCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB4bWxycGNfdGVzdHMgPSBbWE1MUlBDVGVzdENhc2UsIEhlbHBlclRlc3RDYXNlLCBEYXRlVGltZVRlc3RDYXNlLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF94cmFuZ2UucHkgYi9MaWIvdGVzdC90ZXN0X3hyYW5nZS5weQppbmRleCA3ZTJhMWEzLi5hMGI5NGZhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3hyYW5nZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3hyYW5nZS5weQpAQCAtMjYsMTggKzI2LDE4IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdCh4cmFuZ2UoYSs0LCBhLCAtMikpLCBbYSs0LCBhKzJdKQogCiAgICAgICAgIHNlcSA9IGxpc3QoeHJhbmdlKGEsIGIsIGMpKQotICAgICAgICBzZWxmLmFzc2VydF8oYSBpbiBzZXEpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhiIG5vdCBpbiBzZXEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShhIGluIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIgbm90IGluIHNlcSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VxKSwgMikKIAogICAgICAgICBzZXEgPSBsaXN0KHhyYW5nZShiLCBhLCAtYykpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhiIGluIHNlcSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGEgbm90IGluIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGIgaW4gc2VxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYSBub3QgaW4gc2VxKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihzZXEpLCAyKQogCiAgICAgICAgIHNlcSA9IGxpc3QoeHJhbmdlKC1hLCAtYiwgLWMpKQotICAgICAgICBzZWxmLmFzc2VydF8oLWEgaW4gc2VxKQotICAgICAgICBzZWxmLmFzc2VydF8oLWIgbm90IGluIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC1hIGluIHNlcSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKC1iIG5vdCBpbiBzZXEpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlcSksIDIpCiAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB4cmFuZ2UpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkgYi9MaWIvdGVzdC90ZXN0X3ppcGZpbGUucHkKaW5kZXggY2I4YmExMC4uMGIwNzI3ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF96aXBmaWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfemlwZmlsZS5weQpAQCAtNjQsOSArNjQsOSBAQAogICAgICAgICBsaW5lcyA9IGRpcmVjdG9yeS5zcGxpdGxpbmVzKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGxpbmVzKSwgNCkgIyBOdW1iZXIgb2YgZmlsZXMgKyBoZWFkZXIKIAotICAgICAgICBzZWxmLmFzc2VydF8oJ0ZpbGUgTmFtZScgaW4gbGluZXNbMF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnTW9kaWZpZWQnIGluIGxpbmVzWzBdKQotICAgICAgICBzZWxmLmFzc2VydF8oJ1NpemUnIGluIGxpbmVzWzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ0ZpbGUgTmFtZScgaW4gbGluZXNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnTW9kaWZpZWQnIGluIGxpbmVzWzBdKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ1NpemUnIGluIGxpbmVzWzBdKQogCiAgICAgICAgIGZuLCBkYXRlLCB0aW1lLCBzaXplID0gbGluZXNbMV0uc3BsaXQoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhmbiwgJ2Fub3RoZXIubmFtZScpCkBAIC03NiwxNyArNzYsMTcgQEAKICAgICAgICAgIyBDaGVjayB0aGUgbmFtZWxpc3QKICAgICAgICAgbmFtZXMgPSB6aXBmcC5uYW1lbGlzdCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihuYW1lcyksIDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhURVNURk4gaW4gbmFtZXMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIiBpbiBuYW1lcykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJzdHJmaWxlIiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFRFU1RGTiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInN0cmZpbGUiIGluIG5hbWVzKQogCiAgICAgICAgICMgQ2hlY2sgaW5mb2xpc3QKICAgICAgICAgaW5mb3MgPSB6aXBmcC5pbmZvbGlzdCgpCiAgICAgICAgIG5hbWVzID0gWyBpLmZpbGVuYW1lIGZvciBpIGluIGluZm9zIF0KICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKG5hbWVzKSwgMykKLSAgICAgICAgc2VsZi5hc3NlcnRfKFRFU1RGTiBpbiBuYW1lcykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiIGluIG5hbWVzKQotICAgICAgICBzZWxmLmFzc2VydF8oInN0cmZpbGUiIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoVEVTVEZOIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImFub3RoZXIiK29zLmV4dHNlcCsibmFtZSIgaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgic3RyZmlsZSIgaW4gbmFtZXMpCiAgICAgICAgIGZvciBpIGluIGluZm9zOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoaS5maWxlX3NpemUsIGxlbihzZWxmLmRhdGEpKQogCkBAIC0xNDUsMTEgKzE0NSwxMSBAQAogICAgICAgICBkYXRhID0gIiIKICAgICAgICAgZm9yIGluZm8gaW4gaW5mb3M6CiAgICAgICAgICAgICBkYXRhICs9IHppcGZwLm9wZW4oaW5mbykucmVhZCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhkYXRhID09ICJmb29iYXIiIG9yIGRhdGEgPT0gImJhcmZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhID09ICJmb29iYXIiIG9yIGRhdGEgPT0gImJhcmZvbyIpCiAgICAgICAgIGRhdGEgPSAiIgogICAgICAgICBmb3IgaW5mbyBpbiBpbmZvczoKICAgICAgICAgICAgIGRhdGEgKz0gemlwZnAucmVhZChpbmZvKQotICAgICAgICBzZWxmLmFzc2VydF8oZGF0YSA9PSAiZm9vYmFyIiBvciBkYXRhID09ICJiYXJmb28iKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoZGF0YSA9PSAiZm9vYmFyIiBvciBkYXRhID09ICJiYXJmb28iKQogICAgICAgICB6aXBmcC5jbG9zZSgpCiAKICAgICBkZWYgemlwUmFuZG9tT3BlblRlc3Qoc2VsZiwgZiwgY29tcHJlc3Npb24pOgpAQCAtNDUxLDkgKzQ1MSw5IEBACiAgICAgICAgIGxpbmVzID0gZGlyZWN0b3J5LnNwbGl0bGluZXMoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obGluZXMpLCA0KSAjIE51bWJlciBvZiBmaWxlcyArIGhlYWRlcgogCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnRmlsZSBOYW1lJyBpbiBsaW5lc1swXSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdNb2RpZmllZCcgaW4gbGluZXNbMF0pCi0gICAgICAgIHNlbGYuYXNzZXJ0XygnU2l6ZScgaW4gbGluZXNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnRmlsZSBOYW1lJyBpbiBsaW5lc1swXSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdNb2RpZmllZCcgaW4gbGluZXNbMF0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnU2l6ZScgaW4gbGluZXNbMF0pCiAKICAgICAgICAgZm4sIGRhdGUsIHRpbWUsIHNpemUgPSBsaW5lc1sxXS5zcGxpdCgpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGZuLCAnYW5vdGhlci5uYW1lJykKQEAgLTQ2MywxNyArNDYzLDE3IEBACiAgICAgICAgICMgQ2hlY2sgdGhlIG5hbWVsaXN0CiAgICAgICAgIG5hbWVzID0gemlwZnAubmFtZWxpc3QoKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4obmFtZXMpLCAzKQotICAgICAgICBzZWxmLmFzc2VydF8oVEVTVEZOIGluIG5hbWVzKQotICAgICAgICBzZWxmLmFzc2VydF8oImFub3RoZXIiK29zLmV4dHNlcCsibmFtZSIgaW4gbmFtZXMpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xygic3RyZmlsZSIgaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShURVNURk4gaW4gbmFtZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJzdHJmaWxlIiBpbiBuYW1lcykKIAogICAgICAgICAjIENoZWNrIGluZm9saXN0CiAgICAgICAgIGluZm9zID0gemlwZnAuaW5mb2xpc3QoKQogICAgICAgICBuYW1lcyA9IFsgaS5maWxlbmFtZSBmb3IgaSBpbiBpbmZvcyBdCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihuYW1lcyksIDMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhURVNURk4gaW4gbmFtZXMpCi0gICAgICAgIHNlbGYuYXNzZXJ0XygiYW5vdGhlciIrb3MuZXh0c2VwKyJuYW1lIiBpbiBuYW1lcykKLSAgICAgICAgc2VsZi5hc3NlcnRfKCJzdHJmaWxlIiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKFRFU1RGTiBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCJhbm90aGVyIitvcy5leHRzZXArIm5hbWUiIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoInN0cmZpbGUiIGluIG5hbWVzKQogICAgICAgICBmb3IgaSBpbiBpbmZvczoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGkuZmlsZV9zaXplLCBsZW4oc2VsZi5kYXRhKSkKIApAQCAtNTIzLDggKzUyMyw4IEBACiAgICAgICAgIHppcGZwLndyaXRlcHkoZm4pCiAKICAgICAgICAgYm4gPSBvcy5wYXRoLmJhc2VuYW1lKGZuKQotICAgICAgICBzZWxmLmFzc2VydF8oYm4gbm90IGluIHppcGZwLm5hbWVsaXN0KCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhibiArICdvJyBpbiB6aXBmcC5uYW1lbGlzdCgpIG9yIGJuICsgJ2MnIGluIHppcGZwLm5hbWVsaXN0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShibiBub3QgaW4gemlwZnAubmFtZWxpc3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJuICsgJ28nIGluIHppcGZwLm5hbWVsaXN0KCkgb3IgYm4gKyAnYycgaW4gemlwZnAubmFtZWxpc3QoKSkKICAgICAgICAgemlwZnAuY2xvc2UoKQogCiAKQEAgLTUzNiw4ICs1MzYsOCBAQAogICAgICAgICB6aXBmcC53cml0ZXB5KGZuLCAidGVzdHBhY2thZ2UiKQogCiAgICAgICAgIGJuID0gIiVzLyVzIiUoInRlc3RwYWNrYWdlIiwgb3MucGF0aC5iYXNlbmFtZShmbikpCi0gICAgICAgIHNlbGYuYXNzZXJ0XyhibiBub3QgaW4gemlwZnAubmFtZWxpc3QoKSkKLSAgICAgICAgc2VsZi5hc3NlcnRfKGJuICsgJ28nIGluIHppcGZwLm5hbWVsaXN0KCkgb3IgYm4gKyAnYycgaW4gemlwZnAubmFtZWxpc3QoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKGJuIG5vdCBpbiB6aXBmcC5uYW1lbGlzdCgpKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoYm4gKyAnbycgaW4gemlwZnAubmFtZWxpc3QoKSBvciBibiArICdjJyBpbiB6aXBmcC5uYW1lbGlzdCgpKQogICAgICAgICB6aXBmcC5jbG9zZSgpCiAKICAgICBkZWYgdGVzdFdyaXRlUHl0aG9uUGFja2FnZShzZWxmKToKQEAgLTU0OSw4ICs1NDksOCBAQAogCiAgICAgICAgICMgQ2hlY2sgZm9yIGEgY291cGxlIG9mIG1vZHVsZXMgYXQgZGlmZmVyZW50IGxldmVscyBvZiB0aGUgaGllYXJhcmNoeQogICAgICAgICBuYW1lcyA9IHppcGZwLm5hbWVsaXN0KCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKCdlbWFpbC9fX2luaXRfXy5weW8nIGluIG5hbWVzIG9yICdlbWFpbC9fX2luaXRfXy5weWMnIGluIG5hbWVzKQotICAgICAgICBzZWxmLmFzc2VydF8oJ2VtYWlsL21pbWUvdGV4dC5weW8nIGluIG5hbWVzIG9yICdlbWFpbC9taW1lL3RleHQucHljJyBpbiBuYW1lcykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdlbWFpbC9fX2luaXRfXy5weW8nIGluIG5hbWVzIG9yICdlbWFpbC9fX2luaXRfXy5weWMnIGluIG5hbWVzKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoJ2VtYWlsL21pbWUvdGV4dC5weW8nIGluIG5hbWVzIG9yICdlbWFpbC9taW1lL3RleHQucHljJyBpbiBuYW1lcykKIAogICAgIGRlZiB0ZXN0V3JpdGVQeXRob25EaXJlY3Rvcnkoc2VsZik6CiAgICAgICAgIG9zLm1rZGlyKFRFU1RGTjIpCkBAIC01NzEsOSArNTcxLDkgQEAKICAgICAgICAgICAgIHppcGZwLndyaXRlcHkoVEVTVEZOMikKIAogICAgICAgICAgICAgbmFtZXMgPSB6aXBmcC5uYW1lbGlzdCgpCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oJ21vZDEucHljJyBpbiBuYW1lcyBvciAnbW9kMS5weW8nIGluIG5hbWVzKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKCdtb2QyLnB5YycgaW4gbmFtZXMgb3IgJ21vZDIucHlvJyBpbiBuYW1lcykKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnbW9kMi50eHQnIG5vdCBpbiBuYW1lcykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnbW9kMS5weWMnIGluIG5hbWVzIG9yICdtb2QxLnB5bycgaW4gbmFtZXMpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoJ21vZDIucHljJyBpbiBuYW1lcyBvciAnbW9kMi5weW8nIGluIG5hbWVzKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKCdtb2QyLnR4dCcgbm90IGluIG5hbWVzKQogCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBzaHV0aWwucm10cmVlKFRFU1RGTjIpCkBAIC02MTEsNyArNjExLDcgQEAKICAgICAgICAgZXhjZXB0IElPRXJyb3IsIChlcnJubywgZXJybXNnKToKICAgICAgICAgICAgIHNlbGYuZmFpbCgnQ291bGQgbm90IGFwcGVuZCBkYXRhIHRvIGEgbm9uLWV4aXN0ZW50IHppcCBmaWxlLicpCiAKLSAgICAgICAgc2VsZi5hc3NlcnRfKG9zLnBhdGguZXhpc3RzKFRFU1RGTikpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvcy5wYXRoLmV4aXN0cyhURVNURk4pKQogCiAgICAgICAgIHpmID0gemlwZmlsZS5aaXBGaWxlKFRFU1RGTiwgJ3InKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHpmLnJlYWQoZmlsZW5hbWUpLCBjb250ZW50KQpAQCAtNjQwLDE5ICs2NDAsMTkgQEAKICAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgInciKSBhcyBmcDoKICAgICAgICAgICAgIGZwLndyaXRlKCJ0aGlzIGlzIG5vdCBhIGxlZ2FsIHppcCBmaWxlXG4iKQogICAgICAgICBjaGsgPSB6aXBmaWxlLmlzX3ppcGZpbGUoVEVTVEZOKQotICAgICAgICBzZWxmLmFzc2VydF8obm90IGNoaykKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjaGspCiAgICAgICAgICMgLSBwYXNzaW5nIGEgZmlsZSBvYmplY3QKICAgICAgICAgd2l0aCBvcGVuKFRFU1RGTiwgInJiIikgYXMgZnA6CiAgICAgICAgICAgICBjaGsgPSB6aXBmaWxlLmlzX3ppcGZpbGUoZnApCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8obm90IGNoaykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY2hrKQogICAgICAgICAjIC0gcGFzc2luZyBhIGZpbGUtbGlrZSBvYmplY3QKICAgICAgICAgZnAgPSBTdHJpbmdJTygpCiAgICAgICAgIGZwLndyaXRlKCJ0aGlzIGlzIG5vdCBhIGxlZ2FsIHppcCBmaWxlXG4iKQogICAgICAgICBjaGsgPSB6aXBmaWxlLmlzX3ppcGZpbGUoZnApCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgY2hrKQorICAgICAgICBzZWxmLmFzc2VydFRydWUobm90IGNoaykKICAgICAgICAgZnAuc2VlaygwLDApCiAgICAgICAgIGNoayA9IHppcGZpbGUuaXNfemlwZmlsZShmcCkKLSAgICAgICAgc2VsZi5hc3NlcnRfKG5vdCBjaGspCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY2hrKQogCiAgICAgZGVmIHRlc3RJc1ppcFZhbGlkRmlsZShzZWxmKToKICAgICAgICAgIyBUaGlzIHRlc3QgY2hlY2tzIHRoYXQgdGhlIGlzX3ppcGZpbGUgZnVuY3Rpb24gY29ycmVjdGx5IGlkZW50aWZpZXMKQEAgLTY2MywyMSArNjYzLDIxIEBACiAgICAgICAgIHppcGYud3JpdGVzdHIoImZvby50eHQiLCAiTywgZm9yIGEgTXVzZSBvZiBGaXJlISIpCiAgICAgICAgIHppcGYuY2xvc2UoKQogICAgICAgICBjaGsgPSB6aXBmaWxlLmlzX3ppcGZpbGUoVEVTVEZOKQotICAgICAgICBzZWxmLmFzc2VydF8oY2hrKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2hrKQogICAgICAgICAjIC0gcGFzc2luZyBhIGZpbGUgb2JqZWN0CiAgICAgICAgIHdpdGggb3BlbihURVNURk4sICJyYiIpIGFzIGZwOgogICAgICAgICAgICAgY2hrID0gemlwZmlsZS5pc196aXBmaWxlKGZwKQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGNoaykKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjaGspCiAgICAgICAgICAgICBmcC5zZWVrKDAsMCkKICAgICAgICAgICAgIHppcF9jb250ZW50cyA9IGZwLnJlYWQoKQogICAgICAgICAjIC0gcGFzc2luZyBhIGZpbGUtbGlrZSBvYmplY3QKICAgICAgICAgZnAgPSBTdHJpbmdJTygpCiAgICAgICAgIGZwLndyaXRlKHppcF9jb250ZW50cykKICAgICAgICAgY2hrID0gemlwZmlsZS5pc196aXBmaWxlKGZwKQotICAgICAgICBzZWxmLmFzc2VydF8oY2hrKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2hrKQogICAgICAgICBmcC5zZWVrKDAsMCkKICAgICAgICAgY2hrID0gemlwZmlsZS5pc196aXBmaWxlKGZwKQotICAgICAgICBzZWxmLmFzc2VydF8oY2hrKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoY2hrKQogCiAgICAgZGVmIHRlc3ROb25FeGlzdGVudEZpbGVSYWlzZXNJT0Vycm9yKHNlbGYpOgogICAgICAgICAjIG1ha2Ugc3VyZSB3ZSBkb24ndCByYWlzZSBhbiBBdHRyaWJ1dGVFcnJvciB3aGVuIGEgcGFydGlhbGx5LWNvbnN0cnVjdGVkCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydC5weSBiL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5CmluZGV4IDE1NDNiM2IuLjMwNzIyMzAgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5CkBAIC0yOTAsNyArMjkwLDcgQEAKICAgICAgICAgICAgIHouY2xvc2UoKQogICAgICAgICAgICAgemkgPSB6aXBpbXBvcnQuemlwaW1wb3J0ZXIoVEVNUF9aSVApCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkYXRhLCB6aS5nZXRfZGF0YShuYW1lKSkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XygnemlwaW1wb3J0ZXIgb2JqZWN0JyBpbiByZXByKHppKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnemlwaW1wb3J0ZXIgb2JqZWN0JyBpbiByZXByKHppKSkKICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgIHouY2xvc2UoKQogICAgICAgICAgICAgb3MucmVtb3ZlKFRFTVBfWklQKQpAQCAtMzcyLDcgKzM3Miw3IEBACiAKICAgICAgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCiAgICAgICAgICAgICBwcmludF90Yih0YiwgMSwgcykKLSAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLmdldHZhbHVlKCkuZW5kc3dpdGgocmFpc2Vfc3JjKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShzLmdldHZhbHVlKCkuZW5kc3dpdGgocmFpc2Vfc3JjKSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJUaGlzIG91Z2h0IHRvIGJlIGltcG9zc2libGUiKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnRfc3VwcG9ydC5weQppbmRleCBiNDE2YjgxLi4xZjAyNzg3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3ppcGltcG9ydF9zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0X3N1cHBvcnQucHkKQEAgLTE5MSw3ICsxOTEsNyBAQAogICAgICAgICAgICAgICAgIHByaW50ICJFeHBlY3RlZCBsaW5lIiwgZXhwZWN0ZWQKICAgICAgICAgICAgICAgICBwcmludCAiR290IHN0ZG91dDoiCiAgICAgICAgICAgICAgICAgcHJpbnQgZGF0YQotICAgICAgICAgICAgc2VsZi5hc3NlcnRfKGV4cGVjdGVkIGluIGRhdGEpCisgICAgICAgICAgICBzZWxmLmFzc2VydFRydWUoZXhwZWN0ZWQgaW4gZGF0YSkKICAgICAgICAgICAgIHppcF9uYW1lLCBydW5fbmFtZSA9IF9tYWtlX3Rlc3RfemlwKGQsICJ0ZXN0X3ppcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRfbmFtZSwgJ19fbWFpbl9fLnB5JykKICAgICAgICAgICAgIGV4aXRfY29kZSwgZGF0YSA9IF9ydW5fcHl0aG9uKHppcF9uYW1lKQpAQCAtMjAwLDcgKzIwMCw3IEBACiAgICAgICAgICAgICAgICAgcHJpbnQgIkV4cGVjdGVkIGxpbmUiLCBleHBlY3RlZAogICAgICAgICAgICAgICAgIHByaW50ICJHb3Qgc3Rkb3V0OiIKICAgICAgICAgICAgICAgICBwcmludCBkYXRhCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8oZXhwZWN0ZWQgaW4gZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHBlY3RlZCBpbiBkYXRhKQogCiAgICAgZGVmIHRlc3RfcGRiX2lzc3VlNDIwMShzZWxmKToKICAgICAgICAgdGVzdF9zcmMgPSB0ZXh0d3JhcC5kZWRlbnQoIiIiXApAQCAtMjE1LDEzICsyMTUsMTMgQEAKICAgICAgICAgICAgIHAgPSBfc3Bhd25fcHl0aG9uKHNjcmlwdF9uYW1lKQogICAgICAgICAgICAgcC5zdGRpbi53cml0ZSgnbFxuJykKICAgICAgICAgICAgIGRhdGEgPSBfa2lsbF9weXRob24ocCkKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhzY3JpcHRfbmFtZSBpbiBkYXRhKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHNjcmlwdF9uYW1lIGluIGRhdGEpCiAgICAgICAgICAgICB6aXBfbmFtZSwgcnVuX25hbWUgPSBfbWFrZV90ZXN0X3ppcChkLCAidGVzdF96aXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0X25hbWUsICdfX21haW5fXy5weScpCiAgICAgICAgICAgICBwID0gX3NwYXduX3B5dGhvbih6aXBfbmFtZSkKICAgICAgICAgICAgIHAuc3RkaW4ud3JpdGUoJ2xcbicpCiAgICAgICAgICAgICBkYXRhID0gX2tpbGxfcHl0aG9uKHApCi0gICAgICAgICAgICBzZWxmLmFzc2VydF8ocnVuX25hbWUgaW4gZGF0YSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydW5fbmFtZSBpbiBkYXRhKQogCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfemxpYi5weQppbmRleCBjYmY4NDRmLi5mMWY5ZDM4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3psaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF96bGliLnB5CkBAIC0xMCw3ICsxMCw3IEBACiAgICAgIyBjaGVja3N1bSB0ZXN0IGNhc2VzCiAgICAgZGVmIHRlc3RfY3JjMzJzdGFydChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmNyYzMyKCIiKSwgemxpYi5jcmMzMigiIiwgMCkpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyh6bGliLmNyYzMyKCJhYmMiLCAweGZmZmZmZmZmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHpsaWIuY3JjMzIoImFiYyIsIDB4ZmZmZmZmZmYpKQogCiAgICAgZGVmIHRlc3RfY3JjMzJlbXB0eShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmNyYzMyKCIiLCAwKSwgMCkKQEAgLTE5LDcgKzE5LDcgQEAKIAogICAgIGRlZiB0ZXN0X2FkbGVyMzJzdGFydChzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh6bGliLmFkbGVyMzIoIiIpLCB6bGliLmFkbGVyMzIoIiIsIDEpKQotICAgICAgICBzZWxmLmFzc2VydF8oemxpYi5hZGxlcjMyKCJhYmMiLCAweGZmZmZmZmZmKSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHpsaWIuYWRsZXIzMigiYWJjIiwgMHhmZmZmZmZmZikpCiAKICAgICBkZWYgdGVzdF9hZGxlcjMyZW1wdHkoc2VsZik6CiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoemxpYi5hZGxlcjMyKCIiLCAwKSwgMCkKQEAgLTIwOCw3ICsyMDgsNyBAQAogICAgICAgICB3aGlsZSBjYjoKICAgICAgICAgICAgICNtYXhfbGVuZ3RoID0gMSArIGxlbihjYikvLzEwCiAgICAgICAgICAgICBjaHVuayA9IGRjby5kZWNvbXByZXNzKGNiLCBkY3gpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihsZW4oY2h1bmspID4gZGN4LAorICAgICAgICAgICAgc2VsZi5hc3NlcnRGYWxzZShsZW4oY2h1bmspID4gZGN4LAogICAgICAgICAgICAgICAgICAgICAnY2h1bmsgdG9vIGJpZyAoJWQ+JWQpJyAlIChsZW4oY2h1bmspLCBkY3gpKQogICAgICAgICAgICAgYnVmcy5hcHBlbmQoY2h1bmspCiAgICAgICAgICAgICBjYiA9IGRjby51bmNvbnN1bWVkX3RhaWwKQEAgLTIzMyw3ICsyMzMsNyBAQAogICAgICAgICB3aGlsZSBjYjoKICAgICAgICAgICAgIG1heF9sZW5ndGggPSAxICsgbGVuKGNiKS8vMTAKICAgICAgICAgICAgIGNodW5rID0gZGNvLmRlY29tcHJlc3MoY2IsIG1heF9sZW5ndGgpCi0gICAgICAgICAgICBzZWxmLmZhaWxJZihsZW4oY2h1bmspID4gbWF4X2xlbmd0aCwKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UobGVuKGNodW5rKSA+IG1heF9sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAnY2h1bmsgdG9vIGJpZyAoJWQ+JWQpJyAlIChsZW4oY2h1bmspLG1heF9sZW5ndGgpKQogICAgICAgICAgICAgYnVmcy5hcHBlbmQoY2h1bmspCiAgICAgICAgICAgICBjYiA9IGRjby51bmNvbnN1bWVkX3RhaWwKQEAgLTI0Miw3ICsyNDIsNyBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgd2hpbGUgY2h1bms6CiAgICAgICAgICAgICAgICAgY2h1bmsgPSBkY28uZGVjb21wcmVzcygnJywgbWF4X2xlbmd0aCkKLSAgICAgICAgICAgICAgICBzZWxmLmZhaWxJZihsZW4oY2h1bmspID4gbWF4X2xlbmd0aCwKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEZhbHNlKGxlbihjaHVuaykgPiBtYXhfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjaHVuayB0b28gYmlnICglZD4lZCknICUgKGxlbihjaHVuayksbWF4X2xlbmd0aCkpCiAgICAgICAgICAgICAgICAgYnVmcy5hcHBlbmQoY2h1bmspCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGF0YSwgJycuam9pbihidWZzKSwgJ1dyb25nIGRhdGEgcmV0cmlldmVkJykKQEAgLTMxNiw3ICszMTYsNyBAQAogICAgICAgICAjIGNhdXNlZCBhIGNvcmUgZHVtcC4pCiAKICAgICAgICAgY28gPSB6bGliLmNvbXByZXNzb2JqKHpsaWIuWl9CRVNUX0NPTVBSRVNTSU9OKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY28uZmx1c2goKSkgICMgUmV0dXJucyBhIHpsaWIgaGVhZGVyCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShjby5mbHVzaCgpKSAgIyBSZXR1cm5zIGEgemxpYiBoZWFkZXIKICAgICAgICAgZGNvID0gemxpYi5kZWNvbXByZXNzb2JqKCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkY28uZmx1c2goKSwgIiIpICMgUmV0dXJucyBub3RoaW5nCiAK