ZGlmZiAtLWdpdCBhL0xpYi9RdWV1ZS5weSBiL0xpYi9RdWV1ZS5weQppbmRleCBjNmM2MDhiLi41MWFkMzU0IDEwMDY0NAotLS0gYS9MaWIvUXVldWUucHkKKysrIGIvTGliL1F1ZXVlLnB5CkBAIC0zNSw2ICszNSw1MSBAQAogICAgICAgICAjIE5vdGlmeSBub3RfZnVsbCB3aGVuZXZlciBhbiBpdGVtIGlzIHJlbW92ZWQgZnJvbSB0aGUgcXVldWU7CiAgICAgICAgICMgYSB0aHJlYWQgd2FpdGluZyB0byBwdXQgaXMgbm90aWZpZWQgdGhlbi4KICAgICAgICAgc2VsZi5ub3RfZnVsbCA9IHRocmVhZGluZy5Db25kaXRpb24oc2VsZi5tdXRleCkKKyAgICAgICAgIyBOb3RpZnkgYWxsX3Rhc2tzX2RvbmUgd2hlbmV2ZXIgdGhlIG51bWJlciBvZiB1bmZpbmlzaGVkIHRhc2tzCisgICAgICAgICMgZHJvcHMgdG8gemVybzsgdGhyZWFkIHdhaXRpbmcgdG8gam9pbigpIGlzIG5vdGlmaWVkIHRvIHJlc3VtZQorICAgICAgICBzZWxmLmFsbF90YXNrc19kb25lID0gdGhyZWFkaW5nLkNvbmRpdGlvbihzZWxmLm11dGV4KQorICAgICAgICBzZWxmLnVuZmluaXNoZWRfdGFza3MgPSAwCisKKyAgICBkZWYgdGFza19kb25lKHNlbGYpOgorICAgICAgICAiIiJJbmRpY2F0ZSB0aGF0IGEgZm9ybWVybHkgZW5xdWV1ZWQgdGFzayBpcyBjb21wbGV0ZS4KKworICAgICAgICBVc2VkIGJ5IFF1ZXVlIGNvbnN1bWVyIHRocmVhZHMuICBGb3IgZWFjaCBnZXQoKSB1c2VkIHRvIGZldGNoIGEgdGFzaywKKyAgICAgICAgYSBzdWJzZXF1ZW50IGNhbGwgdG8gdGFza19kb25lKCkgdGVsbHMgdGhlIHF1ZXVlIHRoYXQgdGhlIHByb2Nlc3NpbmcKKyAgICAgICAgb24gdGhlIHRhc2sgaXMgY29tcGxldGUuCisKKyAgICAgICAgSWYgYSBqb2luKCkgaXMgY3VycmVudGx5IGJsb2NraW5nLCBpdCB3aWxsIHJlc3VtZSB3aGVuIGFsbCBpdGVtcworICAgICAgICBoYXZlIGJlZW4gcHJvY2Vzc2VkIChtZWFuaW5nIHRoYXQgYSB0YXNrX2RvbmUoKSBjYWxsIHdhcyByZWNlaXZlZAorICAgICAgICBmb3IgZXZlcnkgaXRlbSB0aGF0IGhhZCBiZWVuIHB1dCgpIGludG8gdGhlIHF1ZXVlKS4KKworICAgICAgICBSYWlzZXMgYSBWYWx1ZUVycm9yIGlmIGNhbGxlZCBtb3JlIHRpbWVzIHRoYW4gdGhlcmUgd2VyZSBpdGVtcworICAgICAgICBwbGFjZWQgaW4gdGhlIHF1ZXVlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hbGxfdGFza3NfZG9uZS5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdW5maW5pc2hlZCA9IHNlbGYudW5maW5pc2hlZF90YXNrcyAtIDEKKyAgICAgICAgICAgIGlmIHVuZmluaXNoZWQgPD0gMDoKKyAgICAgICAgICAgICAgICBpZiB1bmZpbmlzaGVkIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigndGFza19kb25lKCkgY2FsbGVkIHRvbyBtYW55IHRpbWVzJykKKyAgICAgICAgICAgICAgICBzZWxmLmFsbF90YXNrc19kb25lLm5vdGlmeUFsbCgpCisgICAgICAgICAgICBzZWxmLnVuZmluaXNoZWRfdGFza3MgPSB1bmZpbmlzaGVkCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmFsbF90YXNrc19kb25lLnJlbGVhc2UoKQorCisgICAgZGVmIGpvaW4oc2VsZik6CisgICAgICAgICIiIkJsb2NrcyB1bnRpbCBhbGwgaXRlbXMgaW4gdGhlIFF1ZXVlIGhhdmUgYmVlbiBnb3R0ZW4gYW5kIHByb2Nlc3NlZC4KKworICAgICAgICBUaGUgY291bnQgb2YgdW5maW5pc2hlZCB0YXNrcyBnb2VzIHVwIHdoZW5ldmVyIGFuIGl0ZW0gaXMgYWRkZWQgdG8gdGhlCisgICAgICAgIHF1ZXVlLiBUaGUgY291bnQgZ29lcyBkb3duIHdoZW5ldmVyIGEgY29uc3VtZXIgdGhyZWFkIGNhbGxzIHRhc2tfZG9uZSgpCisgICAgICAgIHRvIGluZGljYXRlIHRoZSBpdGVtIHdhcyByZXRyaWV2ZWQgYW5kIGFsbCB3b3JrIG9uIGl0IGlzIGNvbXBsZXRlLgorCisgICAgICAgIFdoZW4gdGhlIGNvdW50IG9mIHVuZmluaXNoZWQgdGFza3MgZHJvcHMgdG8gemVybywgam9pbigpIHVuYmxvY2tzLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5hbGxfdGFza3NfZG9uZS5hY3F1aXJlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgd2hpbGUgc2VsZi51bmZpbmlzaGVkX3Rhc2tzOgorICAgICAgICAgICAgICAgIHNlbGYuYWxsX3Rhc2tzX2RvbmUud2FpdCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmFsbF90YXNrc19kb25lLnJlbGVhc2UoKQogCiAgICAgZGVmIHFzaXplKHNlbGYpOgogICAgICAgICAiIiJSZXR1cm4gdGhlIGFwcHJveGltYXRlIHNpemUgb2YgdGhlIHF1ZXVlIChub3QgcmVsaWFibGUhKS4iIiIKQEAgLTg2LDYgKzEzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBGdWxsCiAgICAgICAgICAgICAgICAgICAgIHNlbGYubm90X2Z1bGwud2FpdChyZW1haW5pbmcpCiAgICAgICAgICAgICBzZWxmLl9wdXQoaXRlbSkKKyAgICAgICAgICAgIHNlbGYudW5maW5pc2hlZF90YXNrcyArPSAxCiAgICAgICAgICAgICBzZWxmLm5vdF9lbXB0eS5ub3RpZnkoKQogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgc2VsZi5ub3RfZnVsbC5yZWxlYXNlKCkKZGlmZiAtLWdpdCBhL0xpYi9TaW1wbGVYTUxSUENTZXJ2ZXIucHkgYi9MaWIvU2ltcGxlWE1MUlBDU2VydmVyLnB5CmluZGV4IDE1NmMyYmEuLmEwYjQ0ZTEgMTAwNjQ0Ci0tLSBhL0xpYi9TaW1wbGVYTUxSUENTZXJ2ZXIucHkKKysrIGIvTGliL1NpbXBsZVhNTFJQQ1NlcnZlci5weQpAQCAtMTA0LDcgKzEwNCwxMSBAQAogaW1wb3J0IFNvY2tldFNlcnZlcgogaW1wb3J0IEJhc2VIVFRQU2VydmVyCiBpbXBvcnQgc3lzCi1pbXBvcnQgb3MsIGZjbnRsCitpbXBvcnQgb3MKK3RyeToKKyAgICBpbXBvcnQgZmNudGwKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmY250bCA9IE5vbmUKIAogZGVmIHJlc29sdmVfZG90dGVkX2F0dHJpYnV0ZShvYmosIGF0dHIsIGFsbG93X2RvdHRlZF9uYW1lcz1UcnVlKToKICAgICAiIiJyZXNvbHZlX2RvdHRlZF9hdHRyaWJ1dGUoYSwgJ2IuYy5kJykgPT4gYS5iLmMuZApAQCAtNDkzLDcgKzQ5Nyw3IEBACiAgICAgICAgICMgW0J1ZyAjMTIyMjc5MF0gSWYgcG9zc2libGUsIHNldCBjbG9zZS1vbi1leGVjIGZsYWc7IGlmIGEKICAgICAgICAgIyBtZXRob2Qgc3Bhd25zIGEgc3VicHJvY2VzcywgdGhlIHN1YnByb2Nlc3Mgc2hvdWxkbid0IGhhdmUKICAgICAgICAgIyB0aGUgbGlzdGVuaW5nIHNvY2tldCBvcGVuLgotICAgICAgICBpZiBoYXNhdHRyKGZjbnRsLCAnRkRfQ0xPRVhFQycpOgorICAgICAgICBpZiBmY250bCBpcyBub3QgTm9uZSBhbmQgaGFzYXR0cihmY250bCwgJ0ZEX0NMT0VYRUMnKToKICAgICAgICAgICAgIGZsYWdzID0gZmNudGwuZmNudGwoc2VsZi5maWxlbm8oKSwgZmNudGwuRl9HRVRGRCkKICAgICAgICAgICAgIGZsYWdzIHw9IGZjbnRsLkZEX0NMT0VYRUMKICAgICAgICAgICAgIGZjbnRsLmZjbnRsKHNlbGYuZmlsZW5vKCksIGZjbnRsLkZfU0VURkQsIGZsYWdzKQpkaWZmIC0tZ2l0IGEvTGliL19fZnV0dXJlX18ucHkgYi9MaWIvX19mdXR1cmVfXy5weQppbmRleCBkOTVjZTVmLi5kOGUxNGQxIDEwMDY0NAotLS0gYS9MaWIvX19mdXR1cmVfXy5weQorKysgYi9MaWIvX19mdXR1cmVfXy5weQpAQCAtNjQsNyArNjQsNyBAQAogQ09fTkVTVEVEICAgICAgICAgICAgPSAweDAwMTAgICAjIG5lc3RlZF9zY29wZXMKIENPX0dFTkVSQVRPUl9BTExPV0VEID0gMCAgICAgICAgIyBnZW5lcmF0b3JzIChvYnNvbGV0ZSwgd2FzIDB4MTAwMCkKIENPX0ZVVFVSRV9ESVZJU0lPTiAgID0gMHgyMDAwICAgIyBkaXZpc2lvbgotQ09fRlVUVVJFX0FCU0lNUE9SVCAgPSAweDQwMDAgICAjIGFic29sdXRlX2ltcG9ydAorQ09fRlVUVVJFX0FCU09MVVRFX0lNUE9SVCA9IDB4NDAwMCAjIHBlcmZvcm0gYWJzb2x1dGUgaW1wb3J0cyBieSBkZWZhdWx0CiBDT19GVVRVUkVfV0lUSF9TVEFURU1FTlQgID0gMHg4MDAwICAgIyB3aXRoIHN0YXRlbWVudAogCiBjbGFzcyBfRmVhdHVyZToKQEAgLTEwOSw3ICsxMDksNyBAQAogCiBhYnNvbHV0ZV9pbXBvcnQgPSBfRmVhdHVyZSgoMiwgNSwgMCwgImFscGhhIiwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgNywgMCwgImFscGhhIiwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDT19GVVRVUkVfQUJTSU1QT1JUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09fRlVUVVJFX0FCU09MVVRFX0lNUE9SVCkKIAogd2l0aF9zdGF0ZW1lbnQgPSBfRmVhdHVyZSgoMiwgNSwgMCwgImFscGhhIiwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICgyLCA2LCAwLCAiYWxwaGEiLCAwKSwKZGlmZiAtLWdpdCBhL0xpYi9fdGhyZWFkaW5nX2xvY2FsLnB5IGIvTGliL190aHJlYWRpbmdfbG9jYWwucHkKaW5kZXggOTA3MTdhOC4uZjBjZTg1NyAxMDA2NDQKLS0tIGEvTGliL190aHJlYWRpbmdfbG9jYWwucHkKKysrIGIvTGliL190aHJlYWRpbmdfbG9jYWwucHkKQEAgLTEsOSArMSw5IEBACi0iIiJUaHJlYWQtbG9jYWwgb2JqZWN0cworIiIiVGhyZWFkLWxvY2FsIG9iamVjdHMuCiAKLShOb3RlIHRoYXQgdGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBQeXRob24gdmVyc2lvbiBvZiB0aHJlYWQKLSB0aHJlYWRpbmcubG9jYWwgY2xhc3MuICBEZXBlbmRpbmcgb24gdGhlIHZlcnNpb24gb2YgUHl0aG9uIHlvdSdyZQotIHVzaW5nLCB0aGVyZSBtYXkgYmUgYSBmYXN0ZXIgb25lIGF2YWlsYWJsZS4gIFlvdSBzaG91bGQgYWx3YXlzIGltcG9ydAotIHRoZSBsb2NhbCBjbGFzcyBmcm9tIHRocmVhZGluZy4pCisoTm90ZSB0aGF0IHRoaXMgbW9kdWxlIHByb3ZpZGVzIGEgUHl0aG9uIHZlcnNpb24gb2YgdGhlIHRocmVhZGluZy5sb2NhbAorIGNsYXNzLiAgRGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uIG9mIFB5dGhvbiB5b3UncmUgdXNpbmcsIHRoZXJlIG1heSBiZSBhCisgZmFzdGVyIG9uZSBhdmFpbGFibGUuICBZb3Ugc2hvdWxkIGFsd2F5cyBpbXBvcnQgdGhlIGBsb2NhbGAgY2xhc3MgZnJvbQorIGB0aHJlYWRpbmdgLikKIAogVGhyZWFkLWxvY2FsIG9iamVjdHMgc3VwcG9ydCB0aGUgbWFuYWdlbWVudCBvZiB0aHJlYWQtbG9jYWwgZGF0YS4KIElmIHlvdSBoYXZlIGRhdGEgdGhhdCB5b3Ugd2FudCB0byBiZSBsb2NhbCB0byBhIHRocmVhZCwgc2ltcGx5IGNyZWF0ZQpAQCAtMTMzLDcgKzEzMywxNyBAQAogPj4+IGRlbCBteWRhdGEKICIiIgogCi0jIFRocmVhZGluZyBpbXBvcnQgaXMgYXQgZW5kCitfX2FsbF9fID0gWyJsb2NhbCJdCisKKyMgV2UgbmVlZCB0byB1c2Ugb2JqZWN0cyBmcm9tIHRoZSB0aHJlYWRpbmcgbW9kdWxlLCBidXQgdGhlIHRocmVhZGluZworIyBtb2R1bGUgbWF5IGFsc28gd2FudCB0byB1c2Ugb3VyIGBsb2NhbGAgY2xhc3MsIGlmIHN1cHBvcnQgZm9yIGxvY2FscworIyBpc24ndCBjb21waWxlZCBpbiB0byB0aGUgYHRocmVhZGAgbW9kdWxlLiAgVGhpcyBjcmVhdGVzIHBvdGVudGlhbCBwcm9ibGVtcworIyB3aXRoIGNpcmN1bGFyIGltcG9ydHMuICBGb3IgdGhhdCByZWFzb24sIHdlIGRvbid0IGltcG9ydCBgdGhyZWFkaW5nYAorIyB1bnRpbCB0aGUgYm90dG9tIG9mIHRoaXMgZmlsZSAoYSBoYWNrIHN1ZmZpY2llbnQgdG8gd29ybSBhcm91bmQgdGhlCisjIHBvdGVudGlhbCBwcm9ibGVtcykuICBOb3RlIHRoYXQgYWxtb3N0IGFsbCBwbGF0Zm9ybXMgZG8gaGF2ZSBzdXBwb3J0IGZvcgorIyBsb2NhbHMgaW4gdGhlIGB0aHJlYWRgIG1vZHVsZSwgYW5kIHRoZXJlIGlzIG5vIGNpcmN1bGFyIGltcG9ydCBwcm9ibGVtCisjIHRoZW4sIHNvIHByb2JsZW1zIGludHJvZHVjZWQgYnkgZmlkZGxpbmcgdGhlIG9yZGVyIG9mIGltcG9ydHMgaGVyZSB3b24ndAorIyBtYW5pZmVzdCBvbiBtb3N0IGJveGVzLgogCiBjbGFzcyBfbG9jYWxiYXNlKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gJ19sb2NhbF9fa2V5JywgJ19sb2NhbF9fYXJncycsICdfbG9jYWxfX2xvY2snCkBAIC0yMDIsMzYgKzIxMiwzMCBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgbG9jay5yZWxlYXNlKCkKIAorICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBpbXBvcnQgdGhyZWFkaW5nCiAKLSAgICBkZWYgX19kZWxfXygpOgotICAgICAgICB0aHJlYWRpbmdfZW51bWVyYXRlID0gZW51bWVyYXRlCi0gICAgICAgIF9fZ2V0YXR0cmlidXRlX18gPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXworICAgICAgICBrZXkgPSBvYmplY3QuX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnX2xvY2FsX19rZXknKQogCi0gICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgotICAgICAgICAgICAga2V5ID0gX19nZXRhdHRyaWJ1dGVfXyhzZWxmLCAnX2xvY2FsX19rZXknKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0aHJlYWRzID0gbGlzdCh0aHJlYWRpbmcuZW51bWVyYXRlKCkpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICMgSWYgZW51bWVyYXRlIGZhaWxzLCBhcyBpdCBzZWVtcyB0byBkbyBkdXJpbmcKKyAgICAgICAgICAgICMgc2h1dGRvd24sIHdlJ2xsIHNraXAgY2xlYW51cCB1bmRlciB0aGUgYXNzdW1wdGlvbgorICAgICAgICAgICAgIyB0aGF0IHRoZXJlIGlzIG5vdGhpbmcgdG8gY2xlYW4gdXAuCisgICAgICAgICAgICByZXR1cm4KIAorICAgICAgICBmb3IgdGhyZWFkIGluIHRocmVhZHM6CiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgdGhyZWFkcyA9IGxpc3QodGhyZWFkaW5nX2VudW1lcmF0ZSgpKQotICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgICMgaWYgZW51bWVyYXRlIGZhaWxzLCBhcyBpdCBzZWVtcyB0byBkbyBkdXJpbmcKLSAgICAgICAgICAgICAgICAjIHNodXRkb3duLCB3ZSdsbCBza2lwIGNsZWFudXAgdW5kZXIgdGhlIGFzc3VtcHRpb24KLSAgICAgICAgICAgICAgICAjIHRoYXQgdGhlcmUgaXMgbm90aGluZyB0byBjbGVhbiB1cAotICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIF9fZGljdF9fID0gdGhyZWFkLl9fZGljdF9fCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBUaHJlYWQgaXMgZHlpbmcsIHJlc3QgaW4gcGVhY2UuCisgICAgICAgICAgICAgICAgY29udGludWUKIAotICAgICAgICAgICAgZm9yIHRocmVhZCBpbiB0aHJlYWRzOgorICAgICAgICAgICAgaWYga2V5IGluIF9fZGljdF9fOgogICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgX19kaWN0X18gPSB0aHJlYWQuX19kaWN0X18KLSAgICAgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgICMgVGhyZWFkIGlzIGR5aW5nLCByZXN0IGluIHBlYWNlCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgIGRlbCBfX2RpY3RfX1trZXldCisgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgICAgICBwYXNzICMgZGlkbid0IGhhdmUgYW55dGhpbmcgaW4gdGhpcyB0aHJlYWQKIAotICAgICAgICAgICAgICAgIGlmIGtleSBpbiBfX2RpY3RfXzoKLSAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgZGVsIF9fZGljdF9fW2tleV0KLSAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyAjIGRpZG4ndCBoYXZlIGFueXRoaW5nIGluIHRoaXMgdGhyZWFkCi0KLSAgICAgICAgcmV0dXJuIF9fZGVsX18KLSAgICBfX2RlbF9fID0gX19kZWxfXygpCi0KLWZyb20gdGhyZWFkaW5nIGltcG9ydCBjdXJyZW50VGhyZWFkLCBlbnVtZXJhdGUsIFJMb2NrCitmcm9tIHRocmVhZGluZyBpbXBvcnQgY3VycmVudFRocmVhZCwgUkxvY2sKZGlmZiAtLWdpdCBhL0xpYi9iZGIucHkgYi9MaWIvYmRiLnB5CmluZGV4IDhmODA4Y2MuLjA4YjQ4YzMgMTAwNjQ0Ci0tLSBhL0xpYi9iZGIucHkKKysrIGIvTGliL2JkYi5weQpAQCAtNDc5LDEwICs0NzksMTAgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGRpc3AgPSAna2VlcCAnCiAgICAgICAgIGlmIHNlbGYuZW5hYmxlZDoKLSAgICAgICAgICAgIGRpc3AgPSBkaXNwICsgJ3llcycKKyAgICAgICAgICAgIGRpc3AgPSBkaXNwICsgJ3llcyAgJwogICAgICAgICBlbHNlOgotICAgICAgICAgICAgZGlzcCA9IGRpc3AgKyAnbm8gJwotICAgICAgICBwcmludCAnJS00ZGJyZWFrcG9pbnQgICAgJXMgYXQgJXM6JWQnICUgKHNlbGYubnVtYmVyLCBkaXNwLAorICAgICAgICAgICAgZGlzcCA9IGRpc3AgKyAnbm8gICAnCisgICAgICAgIHByaW50ICclLTRkYnJlYWtwb2ludCAgICVzIGF0ICVzOiVkJyAlIChzZWxmLm51bWJlciwgZGlzcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlLCBzZWxmLmxpbmUpCiAgICAgICAgIGlmIHNlbGYuY29uZDoKICAgICAgICAgICAgIHByaW50ICdcdHN0b3Agb25seSBpZiAlcycgJSAoc2VsZi5jb25kLCkKZGlmZiAtLWdpdCBhL0xpYi9ic2RkYi9fX2luaXRfXy5weSBiL0xpYi9ic2RkYi9fX2luaXRfXy5weQppbmRleCBkM2VlNzczLi5jMDA0YzA4IDEwMDY0NAotLS0gYS9MaWIvYnNkZGIvX19pbml0X18ucHkKKysrIGIvTGliL2JzZGRiL19faW5pdF9fLnB5CkBAIC0yODcsMTAgKzI4Nyw5IEBACiAgICAgICAgICAgICBjYWNoZXNpemU9Tm9uZSwgbG9yZGVyPU5vbmUsIGhmbGFncz0wKToKIAogICAgIGZsYWdzID0gX2NoZWNrZmxhZyhmbGFnLCBmaWxlKQotICAgIGUgPSBfb3BlbkRCRW52KCkKKyAgICBlID0gX29wZW5EQkVudihjYWNoZXNpemUpCiAgICAgZCA9IGRiLkRCKGUpCiAgICAgZC5zZXRfZmxhZ3MoaGZsYWdzKQotICAgIGlmIGNhY2hlc2l6ZSBpcyBub3QgTm9uZTogZC5zZXRfY2FjaGVzaXplKDAsIGNhY2hlc2l6ZSkKICAgICBpZiBwZ3NpemUgaXMgbm90IE5vbmU6ICAgIGQuc2V0X3BhZ2VzaXplKHBnc2l6ZSkKICAgICBpZiBsb3JkZXIgaXMgbm90IE5vbmU6ICAgIGQuc2V0X2xvcmRlcihsb3JkZXIpCiAgICAgaWYgZmZhY3RvciBpcyBub3QgTm9uZTogICBkLnNldF9oX2ZmYWN0b3IoZmZhY3RvcikKQEAgLTMwNSw5ICszMDQsOCBAQAogICAgICAgICAgICAgcGdzaXplPU5vbmUsIGxvcmRlcj1Ob25lKToKIAogICAgIGZsYWdzID0gX2NoZWNrZmxhZyhmbGFnLCBmaWxlKQotICAgIGUgPSBfb3BlbkRCRW52KCkKKyAgICBlID0gX29wZW5EQkVudihjYWNoZXNpemUpCiAgICAgZCA9IGRiLkRCKGUpCi0gICAgaWYgY2FjaGVzaXplIGlzIG5vdCBOb25lOiBkLnNldF9jYWNoZXNpemUoMCwgY2FjaGVzaXplKQogICAgIGlmIHBnc2l6ZSBpcyBub3QgTm9uZTogZC5zZXRfcGFnZXNpemUocGdzaXplKQogICAgIGlmIGxvcmRlciBpcyBub3QgTm9uZTogZC5zZXRfbG9yZGVyKGxvcmRlcikKICAgICBkLnNldF9mbGFncyhidGZsYWdzKQpAQCAtMzI0LDkgKzMyMiw4IEBACiAgICAgICAgICAgICBybGVuPU5vbmUsIGRlbGltPU5vbmUsIHNvdXJjZT1Ob25lLCBwYWQ9Tm9uZSk6CiAKICAgICBmbGFncyA9IF9jaGVja2ZsYWcoZmxhZywgZmlsZSkKLSAgICBlID0gX29wZW5EQkVudigpCisgICAgZSA9IF9vcGVuREJFbnYoY2FjaGVzaXplKQogICAgIGQgPSBkYi5EQihlKQotICAgIGlmIGNhY2hlc2l6ZSBpcyBub3QgTm9uZTogZC5zZXRfY2FjaGVzaXplKDAsIGNhY2hlc2l6ZSkKICAgICBpZiBwZ3NpemUgaXMgbm90IE5vbmU6IGQuc2V0X3BhZ2VzaXplKHBnc2l6ZSkKICAgICBpZiBsb3JkZXIgaXMgbm90IE5vbmU6IGQuc2V0X2xvcmRlcihsb3JkZXIpCiAgICAgZC5zZXRfZmxhZ3Mocm5mbGFncykKQEAgLTMzOSw4ICszMzYsMTMgQEAKIAogIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotZGVmIF9vcGVuREJFbnYoKToKK2RlZiBfb3BlbkRCRW52KGNhY2hlc2l6ZSk6CiAgICAgZSA9IGRiLkRCRW52KCkKKyAgICBpZiBjYWNoZXNpemUgaXMgbm90IE5vbmU6CisgICAgICAgIGlmIGNhY2hlc2l6ZSA+PSAyMDQ4MDoKKyAgICAgICAgICAgIGUuc2V0X2NhY2hlc2l6ZSgwLCBjYWNoZXNpemUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBlcnJvciwgImNhY2hlc2l6ZSBtdXN0IGJlID49IDIwNDgwIgogICAgIGUub3BlbignLicsIGRiLkRCX1BSSVZBVEUgfCBkYi5EQl9DUkVBVEUgfCBkYi5EQl9USFJFQUQgfCBkYi5EQl9JTklUX0xPQ0sgfCBkYi5EQl9JTklUX01QT09MKQogICAgIHJldHVybiBlCiAKQEAgLTM1OCw3ICszNjAsNyBAQAogICAgICAgICAjZmxhZ3MgPSBkYi5EQl9DUkVBVEUgfCBkYi5EQl9UUlVOQ0FURQogICAgICAgICAjIHdlIHVzZWQgZGIuREJfVFJVTkNBVEUgZmxhZyBmb3IgdGhpcyBiZWZvcmUgYnV0IEJlcmtlbGV5REIKICAgICAgICAgIyA0LjIuNTIgY2hhbmdlZCB0byBkaXNhbGxvd2VkIHRydW5jYXRlIHdpdGggdHhuIGVudmlyb25tZW50cy4KLSAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZmlsZSk6CisgICAgICAgIGlmIGZpbGUgaXMgbm90IE5vbmUgYW5kIG9zLnBhdGguaXNmaWxlKGZpbGUpOgogICAgICAgICAgICAgb3MudW5saW5rKGZpbGUpCiAgICAgZWxzZToKICAgICAgICAgcmFpc2UgZXJyb3IsICJmbGFncyBzaG91bGQgYmUgb25lIG9mICdyJywgJ3cnLCAnYycgb3IgJ24nIgpkaWZmIC0tZ2l0IGEvTGliL2JzZGRiL3Rlc3QvdGVzdF9hbGwucHkgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2FsbC5weQppbmRleCA5NzJjZDA2Li5hYmZhZjQ3IDEwMDY0NAotLS0gYS9MaWIvYnNkZGIvdGVzdC90ZXN0X2FsbC5weQorKysgYi9MaWIvYnNkZGIvdGVzdC90ZXN0X2FsbC5weQpAQCAtNjUsNiArNjUsNyBAQAogICAgICAgICAndGVzdF9qb2luJywKICAgICAgICAgJ3Rlc3RfbG9jaycsCiAgICAgICAgICd0ZXN0X21pc2MnLAorICAgICAgICAndGVzdF9waWNrbGUnLAogICAgICAgICAndGVzdF9xdWV1ZScsCiAgICAgICAgICd0ZXN0X3JlY25vJywKICAgICAgICAgJ3Rlc3RfdGhyZWFkJywKZGlmZiAtLWdpdCBhL0xpYi9ic2RkYi90ZXN0L3Rlc3RfcGlja2xlLnB5IGIvTGliL2JzZGRiL3Rlc3QvdGVzdF9waWNrbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxNmU1YwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9ic2RkYi90ZXN0L3Rlc3RfcGlja2xlLnB5CkBAIC0wLDAgKzEsNzUgQEAKKworaW1wb3J0IHN5cywgb3MsIHN0cmluZworaW1wb3J0IHBpY2tsZQordHJ5OgorICAgIGltcG9ydCBjUGlja2xlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgY1BpY2tsZSA9IE5vbmUKK2ltcG9ydCB1bml0dGVzdAoraW1wb3J0IGdsb2IKKwordHJ5OgorICAgICMgRm9yIFB5dGhvbnMgdy9kaXN0dXRpbHMgcHlic2RkYgorICAgIGZyb20gYnNkZGIzIGltcG9ydCBkYgorZXhjZXB0IEltcG9ydEVycm9yLCBlOgorICAgICMgRm9yIFB5dGhvbiAyLjMKKyAgICBmcm9tIGJzZGRiIGltcG9ydCBkYgorCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIHBpY2tsZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICAiIiJWZXJpZnkgdGhhdCBEQkVycm9yIGNhbiBiZSBwaWNrbGVkIGFuZCB1bnBpY2tsZWQiIiIKKyAgICBkYl9ob21lID0gJ2RiX2hvbWUnCisgICAgZGJfbmFtZSA9ICd0ZXN0LWRib2JqLmRiJworCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBob21lRGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShzeXMuYXJndlswXSksICdkYl9ob21lJykKKyAgICAgICAgc2VsZi5ob21lRGlyID0gaG9tZURpcgorICAgICAgICB0cnk6IG9zLm1rZGlyKGhvbWVEaXIpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjogcGFzcworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICdkYicpOgorICAgICAgICAgICAgZGVsIHNlbGYuZGIKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAnZW52Jyk6CisgICAgICAgICAgICBkZWwgc2VsZi5lbnYKKyAgICAgICAgZmlsZXMgPSBnbG9iLmdsb2Iob3MucGF0aC5qb2luKHNlbGYuaG9tZURpciwgJyonKSkKKyAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CisgICAgICAgICAgICBvcy5yZW1vdmUoZmlsZSkKKworICAgIGRlZiBfYmFzZV90ZXN0X3BpY2tsZV9EQkVycm9yKHNlbGYsIHBpY2tsZSk6CisgICAgICAgIHNlbGYuZW52ID0gZGIuREJFbnYoKQorICAgICAgICBzZWxmLmVudi5vcGVuKHNlbGYuaG9tZURpciwgZGIuREJfQ1JFQVRFIHwgZGIuREJfSU5JVF9NUE9PTCkKKyAgICAgICAgc2VsZi5kYiA9IGRiLkRCKHNlbGYuZW52KQorICAgICAgICBzZWxmLmRiLm9wZW4oc2VsZi5kYl9uYW1lLCBkYi5EQl9IQVNILCBkYi5EQl9DUkVBVEUpCisgICAgICAgIHNlbGYuZGIucHV0KCdzcGFtJywgJ2VnZ3MnKQorICAgICAgICBhc3NlcnQgc2VsZi5kYlsnc3BhbSddID09ICdlZ2dzJworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmRiLnB1dCgnc3BhbScsICdoYW0nLCBmbGFncz1kYi5EQl9OT09WRVJXUklURSkKKyAgICAgICAgZXhjZXB0IGRiLkRCRXJyb3IsIGVnZzoKKyAgICAgICAgICAgIHBpY2tsZWRFZ2cgPSBwaWNrbGUuZHVtcHMoZWdnKQorICAgICAgICAgICAgI3ByaW50IHJlcHIocGlja2xlZEVnZykKKyAgICAgICAgICAgIHJvdHRlbkVnZyA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkRWdnKQorICAgICAgICAgICAgaWYgcm90dGVuRWdnLmFyZ3MgIT0gZWdnLmFyZ3Mgb3IgdHlwZShyb3R0ZW5FZ2cpICE9IHR5cGUoZWdnKToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24sIChyb3R0ZW5FZ2csICchPScsIGVnZykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbiwgIndoZXJlJ3MgbXkgREJFcnJvciBleGNlcHRpb24/IT8iCisKKyAgICAgICAgc2VsZi5kYi5jbG9zZSgpCisgICAgICAgIHNlbGYuZW52LmNsb3NlKCkKKworICAgIGRlZiB0ZXN0MDFfcGlja2xlX0RCRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuX2Jhc2VfdGVzdF9waWNrbGVfREJFcnJvcihwaWNrbGU9cGlja2xlKQorCisgICAgaWYgY1BpY2tsZToKKyAgICAgICAgZGVmIHRlc3QwMl9jUGlja2xlX0RCRXJyb3Ioc2VsZik6CisgICAgICAgICAgICBzZWxmLl9iYXNlX3Rlc3RfcGlja2xlX0RCRXJyb3IocGlja2xlPWNQaWNrbGUpCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiB0ZXN0X3N1aXRlKCk6CisgICAgcmV0dXJuIHVuaXR0ZXN0Lm1ha2VTdWl0ZShwaWNrbGVUZXN0Q2FzZSkKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSd0ZXN0X3N1aXRlJykKZGlmZiAtLWdpdCBhL0xpYi9jYWxlbmRhci5weSBiL0xpYi9jYWxlbmRhci5weQppbmRleCAzZmZjZmY1Li43ODAwYWFlIDEwMDY0NAotLS0gYS9MaWIvY2FsZW5kYXIucHkKKysrIGIvTGliL2NhbGVuZGFyLnB5CkBAIC01LDE3ICs1LDMyIEBACiBTdW5kYXkgYXMgdGhlIGxhc3QgKHRoZSBFdXJvcGVhbiBjb252ZW50aW9uKS4gVXNlIHNldGZpcnN0d2Vla2RheSgpIHRvCiBzZXQgdGhlIGZpcnN0IGRheSBvZiB0aGUgd2VlayAoMD1Nb25kYXksIDY9U3VuZGF5KS4iIiIKIAotaW1wb3J0IGRhdGV0aW1lCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CitpbXBvcnQgc3lzLCBkYXRldGltZSwgbG9jYWxlCiAKLV9fYWxsX18gPSBbImVycm9yIiwic2V0Zmlyc3R3ZWVrZGF5IiwiZmlyc3R3ZWVrZGF5IiwiaXNsZWFwIiwKLSAgICAgICAgICAgImxlYXBkYXlzIiwid2Vla2RheSIsIm1vbnRocmFuZ2UiLCJtb250aGNhbGVuZGFyIiwKLSAgICAgICAgICAgInBybW9udGgiLCJtb250aCIsInByY2FsIiwiY2FsZW5kYXIiLCJ0aW1lZ20iLAotICAgICAgICAgICAibW9udGhfbmFtZSIsICJtb250aF9hYmJyIiwgImRheV9uYW1lIiwgImRheV9hYmJyIiwKLSAgICAgICAgICAgIndlZWtoZWFkZXIiXQorX19hbGxfXyA9IFsiSWxsZWdhbE1vbnRoRXJyb3IiLCAiSWxsZWdhbFdlZWtkYXlFcnJvciIsICJzZXRmaXJzdHdlZWtkYXkiLAorICAgICAgICAgICAiZmlyc3R3ZWVrZGF5IiwgImlzbGVhcCIsICJsZWFwZGF5cyIsICJ3ZWVrZGF5IiwgIm1vbnRocmFuZ2UiLAorICAgICAgICAgICAibW9udGhjYWxlbmRhciIsICJwcm1vbnRoIiwgIm1vbnRoIiwgInByY2FsIiwgImNhbGVuZGFyIiwKKyAgICAgICAgICAgInRpbWVnbSIsICJtb250aF9uYW1lIiwgIm1vbnRoX2FiYnIiLCAiZGF5X25hbWUiLCAiZGF5X2FiYnIiXQogCiAjIEV4Y2VwdGlvbiByYWlzZWQgZm9yIGJhZCBpbnB1dCAod2l0aCBzdHJpbmcgcGFyYW1ldGVyIGZvciBkZXRhaWxzKQogZXJyb3IgPSBWYWx1ZUVycm9yCiAKKyMgRXhjZXB0aW9ucyByYWlzZWQgZm9yIGJhZCBpbnB1dAorY2xhc3MgSWxsZWdhbE1vbnRoRXJyb3IoVmFsdWVFcnJvcik6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vbnRoKToKKyAgICAgICAgc2VsZi5tb250aCA9IG1vbnRoCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiYmFkIG1vbnRoIG51bWJlciAlcjsgbXVzdCBiZSAxLTEyIiAlIHNlbGYubW9udGgKKworCitjbGFzcyBJbGxlZ2FsV2Vla2RheUVycm9yKFZhbHVlRXJyb3IpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCB3ZWVrZGF5KToKKyAgICAgICAgc2VsZi53ZWVrZGF5ID0gd2Vla2RheQorICAgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gImJhZCB3ZWVrZGF5IG51bWJlciAlcjsgbXVzdCBiZSAwIChNb25kYXkpIHRvIDYgKFN1bmRheSkiICUgc2VsZi53ZWVrZGF5CisKKwogIyBDb25zdGFudHMgZm9yIG1vbnRocyByZWZlcmVuY2VkIGxhdGVyCiBKYW51YXJ5ID0gMQogRmVicnVhcnkgPSAyCkBAIC0zMCw3ICs0NSw3IEBACiAKIGNsYXNzIF9sb2NhbGl6ZWRfbW9udGg6CiAKLSAgICBfbW9udGhzID0gW2RhdGV0aW1lLmRhdGUoMjAwMSwgaSsxLCAxKS5zdHJmdGltZSBmb3IgaSBpbiByYW5nZSgxMildCisgICAgX21vbnRocyA9IFtkYXRldGltZS5kYXRlKDIwMDEsIGkrMSwgMSkuc3RyZnRpbWUgZm9yIGkgaW4geHJhbmdlKDEyKV0KICAgICBfbW9udGhzLmluc2VydCgwLCBsYW1iZGEgeDogIiIpCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9ybWF0KToKQEAgLTQ2LDEwICs2MSwxMSBAQAogICAgIGRlZiBfX2xlbl9fKHNlbGYpOgogICAgICAgICByZXR1cm4gMTMKIAorCiBjbGFzcyBfbG9jYWxpemVkX2RheToKIAogICAgICMgSmFudWFyeSAxLCAyMDAxLCB3YXMgYSBNb25kYXkuCi0gICAgX2RheXMgPSBbZGF0ZXRpbWUuZGF0ZSgyMDAxLCAxLCBpKzEpLnN0cmZ0aW1lIGZvciBpIGluIHJhbmdlKDcpXQorICAgIF9kYXlzID0gW2RhdGV0aW1lLmRhdGUoMjAwMSwgMSwgaSsxKS5zdHJmdGltZSBmb3IgaSBpbiB4cmFuZ2UoNyldCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgZm9ybWF0KToKICAgICAgICAgc2VsZi5mb3JtYXQgPSBmb3JtYXQKQEAgLTY0LDYgKzgwLDcgQEAKICAgICBkZWYgX19sZW5fXyhzZWxmKToKICAgICAgICAgcmV0dXJuIDcKIAorCiAjIEZ1bGwgYW5kIGFiYnJldmlhdGVkIG5hbWVzIG9mIHdlZWtkYXlzCiBkYXlfbmFtZSA9IF9sb2NhbGl6ZWRfZGF5KCclQScpCiBkYXlfYWJiciA9IF9sb2NhbGl6ZWRfZGF5KCclYScpCkBAIC03NSwyMyArOTIsMTIgQEAKICMgQ29uc3RhbnRzIGZvciB3ZWVrZGF5cwogKE1PTkRBWSwgVFVFU0RBWSwgV0VETkVTREFZLCBUSFVSU0RBWSwgRlJJREFZLCBTQVRVUkRBWSwgU1VOREFZKSA9IHJhbmdlKDcpCiAKLV9maXJzdHdlZWtkYXkgPSAwICAgICAgICAgICAgICAgICAgICAgICAjIDAgPSBNb25kYXksIDYgPSBTdW5kYXkKLQotZGVmIGZpcnN0d2Vla2RheSgpOgotICAgIHJldHVybiBfZmlyc3R3ZWVrZGF5Ci0KLWRlZiBzZXRmaXJzdHdlZWtkYXkod2Vla2RheSk6Ci0gICAgIiIiU2V0IHdlZWtkYXkgKE1vbmRheT0wLCBTdW5kYXk9NikgdG8gc3RhcnQgZWFjaCB3ZWVrLiIiIgotICAgIGdsb2JhbCBfZmlyc3R3ZWVrZGF5Ci0gICAgaWYgbm90IE1PTkRBWSA8PSB3ZWVrZGF5IDw9IFNVTkRBWToKLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgXAotICAgICAgICAgICAgICAnYmFkIHdlZWtkYXkgbnVtYmVyOyBtdXN0IGJlIDAgKE1vbmRheSkgdG8gNiAoU3VuZGF5KScKLSAgICBfZmlyc3R3ZWVrZGF5ID0gd2Vla2RheQogCiBkZWYgaXNsZWFwKHllYXIpOgogICAgICIiIlJldHVybiAxIGZvciBsZWFwIHllYXJzLCAwIGZvciBub24tbGVhcCB5ZWFycy4iIiIKICAgICByZXR1cm4geWVhciAlIDQgPT0gMCBhbmQgKHllYXIgJSAxMDAgIT0gMCBvciB5ZWFyICUgNDAwID09IDApCiAKKwogZGVmIGxlYXBkYXlzKHkxLCB5Mik6CiAgICAgIiIiUmV0dXJuIG51bWJlciBvZiBsZWFwIHllYXJzIGluIHJhbmdlIFt5MSwgeTIpLgogICAgICAgIEFzc3VtZSB5MSA8PSB5Mi4iIiIKQEAgLTk5LDEyOCArMTA1LDUwMSBAQAogICAgIHkyIC09IDEKICAgICByZXR1cm4gKHkyLy80IC0geTEvLzQpIC0gKHkyLy8xMDAgLSB5MS8vMTAwKSArICh5Mi8vNDAwIC0geTEvLzQwMCkKIAorCiBkZWYgd2Vla2RheSh5ZWFyLCBtb250aCwgZGF5KToKICAgICAiIiJSZXR1cm4gd2Vla2RheSAoMC02IH4gTW9uLVN1bikgZm9yIHllYXIgKDE5NzAtLi4uKSwgbW9udGggKDEtMTIpLAogICAgICAgIGRheSAoMS0zMSkuIiIiCiAgICAgcmV0dXJuIGRhdGV0aW1lLmRhdGUoeWVhciwgbW9udGgsIGRheSkud2Vla2RheSgpCiAKKwogZGVmIG1vbnRocmFuZ2UoeWVhciwgbW9udGgpOgogICAgICIiIlJldHVybiB3ZWVrZGF5ICgwLTYgfiBNb24tU3VuKSBhbmQgbnVtYmVyIG9mIGRheXMgKDI4LTMxKSBmb3IKICAgICAgICB5ZWFyLCBtb250aC4iIiIKICAgICBpZiBub3QgMSA8PSBtb250aCA8PSAxMjoKLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ2JhZCBtb250aCBudW1iZXInCisgICAgICAgIHJhaXNlIElsbGVnYWxNb250aEVycm9yKG1vbnRoKQogICAgIGRheTEgPSB3ZWVrZGF5KHllYXIsIG1vbnRoLCAxKQogICAgIG5kYXlzID0gbWRheXNbbW9udGhdICsgKG1vbnRoID09IEZlYnJ1YXJ5IGFuZCBpc2xlYXAoeWVhcikpCiAgICAgcmV0dXJuIGRheTEsIG5kYXlzCiAKLWRlZiBtb250aGNhbGVuZGFyKHllYXIsIG1vbnRoKToKLSAgICAiIiJSZXR1cm4gYSBtYXRyaXggcmVwcmVzZW50aW5nIGEgbW9udGgncyBjYWxlbmRhci4KLSAgICAgICBFYWNoIHJvdyByZXByZXNlbnRzIGEgd2VlazsgZGF5cyBvdXRzaWRlIHRoaXMgbW9udGggYXJlIHplcm8uIiIiCi0gICAgZGF5MSwgbmRheXMgPSBtb250aHJhbmdlKHllYXIsIG1vbnRoKQotICAgIHJvd3MgPSBbXQotICAgIHI3ID0gcmFuZ2UoNykKLSAgICBkYXkgPSAoX2ZpcnN0d2Vla2RheSAtIGRheTEgKyA2KSAlIDcgLSA1ICAgIyBmb3IgbGVhZGluZyAwJ3MgaW4gZmlyc3Qgd2VlawotICAgIHdoaWxlIGRheSA8PSBuZGF5czoKLSAgICAgICAgcm93ID0gWzAsIDAsIDAsIDAsIDAsIDAsIDBdCi0gICAgICAgIGZvciBpIGluIHI3OgotICAgICAgICAgICAgaWYgMSA8PSBkYXkgPD0gbmRheXM6IHJvd1tpXSA9IGRheQotICAgICAgICAgICAgZGF5ID0gZGF5ICsgMQotICAgICAgICByb3dzLmFwcGVuZChyb3cpCi0gICAgcmV0dXJuIHJvd3MKIAotZGVmIHByd2Vlayh0aGV3ZWVrLCB3aWR0aCk6Ci0gICAgIiIiUHJpbnQgYSBzaW5nbGUgd2VlayAobm8gbmV3bGluZSkuIiIiCi0gICAgcHJpbnQgd2Vlayh0aGV3ZWVrLCB3aWR0aCksCitjbGFzcyBDYWxlbmRhcihvYmplY3QpOgorICAgICIiIgorICAgIEJhc2UgY2FsZW5kYXIgY2xhc3MuIFRoaXMgY2xhc3MgZG9lc24ndCBkbyBhbnkgZm9ybWF0dGluZy4gSXQgc2ltcGx5CisgICAgcHJvdmlkZXMgZGF0YSB0byBzdWJjbGFzc2VzLgorICAgICIiIgogCi1kZWYgd2Vlayh0aGV3ZWVrLCB3aWR0aCk6Ci0gICAgIiIiUmV0dXJucyBhIHNpbmdsZSB3ZWVrIGluIGEgc3RyaW5nIChubyBuZXdsaW5lKS4iIiIKLSAgICBkYXlzID0gW10KLSAgICBmb3IgZGF5IGluIHRoZXdlZWs6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpcnN0d2Vla2RheT0wKToKKyAgICAgICAgc2VsZi5maXJzdHdlZWtkYXkgPSBmaXJzdHdlZWtkYXkgIyAwID0gTW9uZGF5LCA2ID0gU3VuZGF5CisKKyAgICBkZWYgZ2V0Zmlyc3R3ZWVrZGF5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZmlyc3R3ZWVrZGF5ICUgNworCisgICAgZGVmIHNldGZpcnN0d2Vla2RheShzZWxmLCBmaXJzdHdlZWtkYXkpOgorICAgICAgICBzZWxmLl9maXJzdHdlZWtkYXkgPSBmaXJzdHdlZWtkYXkKKworICAgIGZpcnN0d2Vla2RheSA9IHByb3BlcnR5KGdldGZpcnN0d2Vla2RheSwgc2V0Zmlyc3R3ZWVrZGF5KQorCisgICAgZGVmIGl0ZXJ3ZWVrZGF5cyhzZWxmKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGl0ZXJhdG9yIGZvciBvbmUgd2VlayBvZiB3ZWVrZGF5IG51bWJlcnMgc3RhcnRpbmcgd2l0aCB0aGUKKyAgICAgICAgY29uZmlndXJlZCBmaXJzdCBvbmUuCisgICAgICAgICIiIgorICAgICAgICBmb3IgaSBpbiB4cmFuZ2Uoc2VsZi5maXJzdHdlZWtkYXksIHNlbGYuZmlyc3R3ZWVrZGF5ICsgNyk6CisgICAgICAgICAgICB5aWVsZCBpJTcKKworICAgIGRlZiBpdGVybW9udGhkYXRlcyhzZWxmLCB5ZWFyLCBtb250aCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYW4gaXRlcmF0b3IgZm9yIG9uZSBtb250aC4gVGhlIGl0ZXJhdG9yIHdpbGwgeWllbGQgZGF0ZXRpbWUuZGF0ZQorICAgICAgICB2YWx1ZXMgYW5kIHdpbGwgYWx3YXlzIGl0ZXJhdGUgdGhyb3VnaCBjb21wbGV0ZSB3ZWVrcywgc28gaXQgd2lsbCB5aWVsZAorICAgICAgICBkYXRlcyBvdXRzaWRlIHRoZSBzcGVjaWZpZWQgbW9udGguCisgICAgICAgICIiIgorICAgICAgICBkYXRlID0gZGF0ZXRpbWUuZGF0ZSh5ZWFyLCBtb250aCwgMSkKKyAgICAgICAgIyBHbyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHdlZWsKKyAgICAgICAgZGF5cyA9IChkYXRlLndlZWtkYXkoKSAtIHNlbGYuZmlyc3R3ZWVrZGF5KSAlIDcKKyAgICAgICAgZGF0ZSAtPSBkYXRldGltZS50aW1lZGVsdGEoZGF5cz1kYXlzKQorICAgICAgICBvbmVkYXkgPSBkYXRldGltZS50aW1lZGVsdGEoZGF5cz0xKQorICAgICAgICB3aGlsZSBUcnVlOgorICAgICAgICAgICAgeWllbGQgZGF0ZQorICAgICAgICAgICAgZGF0ZSArPSBvbmVkYXkKKyAgICAgICAgICAgIGlmIGRhdGUubW9udGggIT0gbW9udGggYW5kIGRhdGUud2Vla2RheSgpID09IHNlbGYuZmlyc3R3ZWVrZGF5OgorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICBkZWYgaXRlcm1vbnRoZGF5czIoc2VsZiwgeWVhciwgbW9udGgpOgorICAgICAgICAiIiIKKyAgICAgICAgTGlrZSBpdGVybW9udGhkYXRlcygpLCBidXQgd2lsbCB5aWVsZCAoZGF5IG51bWJlciwgd2Vla2RheSBudW1iZXIpCisgICAgICAgIHR1cGxlcy4gRm9yIGRheXMgb3V0c2lkZSB0aGUgc3BlY2lmaWVkIG1vbnRoIHRoZSBkYXkgbnVtYmVyIGlzIDAuCisgICAgICAgICIiIgorICAgICAgICBmb3IgZGF0ZSBpbiBzZWxmLml0ZXJtb250aGRhdGVzKHllYXIsIG1vbnRoKToKKyAgICAgICAgICAgIGlmIGRhdGUubW9udGggIT0gbW9udGg6CisgICAgICAgICAgICAgICAgeWllbGQgKDAsIGRhdGUud2Vla2RheSgpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICB5aWVsZCAoZGF0ZS5kYXksIGRhdGUud2Vla2RheSgpKQorCisgICAgZGVmIGl0ZXJtb250aGRheXMoc2VsZiwgeWVhciwgbW9udGgpOgorICAgICAgICAiIiIKKyAgICAgICAgTGlrZSBpdGVybW9udGhkYXRlcygpLCBidXQgd2lsbCB5aWVsZCBkYXkgbnVtYmVycyB0dXBsZXMuIEZvciBkYXlzCisgICAgICAgIG91dHNpZGUgdGhlIHNwZWNpZmllZCBtb250aCB0aGUgZGF5IG51bWJlciBpcyAwLgorICAgICAgICAiIiIKKyAgICAgICAgZm9yIGRhdGUgaW4gc2VsZi5pdGVybW9udGhkYXRlcyh5ZWFyLCBtb250aCk6CisgICAgICAgICAgICBpZiBkYXRlLm1vbnRoICE9IG1vbnRoOgorICAgICAgICAgICAgICAgIHlpZWxkIDAKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgZGF0ZS5kYXkKKworICAgIGRlZiBtb250aGRhdGVzY2FsZW5kYXIoc2VsZiwgeWVhciwgbW9udGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbWF0cml4IChsaXN0IG9mIGxpc3RzKSByZXByZXNlbnRpbmcgYSBtb250aCdzIGNhbGVuZGFyLgorICAgICAgICBFYWNoIHJvdyByZXByZXNlbnRzIGEgd2Vlazsgd2VlayBlbnRyaWVzIGFyZSBkYXRldGltZS5kYXRlIHZhbHVlcy4KKyAgICAgICAgIiIiCisgICAgICAgIGRhdGVzID0gbGlzdChzZWxmLml0ZXJtb250aGRhdGVzKHllYXIsIG1vbnRoKSkKKyAgICAgICAgcmV0dXJuIFsgZGF0ZXNbaTppKzddIGZvciBpIGluIHhyYW5nZSgwLCBsZW4oZGF0ZXMpLCA3KSBdCisKKyAgICBkZWYgbW9udGhkYXlzMmNhbGVuZGFyKHNlbGYsIHllYXIsIG1vbnRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIG1hdHJpeCByZXByZXNlbnRpbmcgYSBtb250aCdzIGNhbGVuZGFyLgorICAgICAgICBFYWNoIHJvdyByZXByZXNlbnRzIGEgd2Vlazsgd2VlayBlbnRyaWVzIGFyZQorICAgICAgICAoZGF5IG51bWJlciwgd2Vla2RheSBudW1iZXIpIHR1cGxlcy4gRGF5IG51bWJlcnMgb3V0c2lkZSB0aGlzIG1vbnRoCisgICAgICAgIGFyZSB6ZXJvLgorICAgICAgICAiIiIKKyAgICAgICAgZGF5cyA9IGxpc3Qoc2VsZi5pdGVybW9udGhkYXlzMih5ZWFyLCBtb250aCkpCisgICAgICAgIHJldHVybiBbIGRheXNbaTppKzddIGZvciBpIGluIHhyYW5nZSgwLCBsZW4oZGF5cyksIDcpIF0KKworICAgIGRlZiBtb250aGRheXNjYWxlbmRhcihzZWxmLCB5ZWFyLCBtb250aCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBtYXRyaXggcmVwcmVzZW50aW5nIGEgbW9udGgncyBjYWxlbmRhci4KKyAgICAgICAgRWFjaCByb3cgcmVwcmVzZW50cyBhIHdlZWs7IGRheXMgb3V0c2lkZSB0aGlzIG1vbnRoIGFyZSB6ZXJvLgorICAgICAgICAiIiIKKyAgICAgICAgZGF5cyA9IGxpc3Qoc2VsZi5pdGVybW9udGhkYXlzKHllYXIsIG1vbnRoKSkKKyAgICAgICAgcmV0dXJuIFsgZGF5c1tpOmkrN10gZm9yIGkgaW4geHJhbmdlKDAsIGxlbihkYXlzKSwgNykgXQorCisgICAgZGVmIHllYXJkYXRlc2NhbGVuZGFyKHNlbGYsIHllYXIsIHdpZHRoPTMpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHllYXIgcmVhZHkgZm9yIGZvcm1hdHRpbmcuIFRoZSByZXR1cm4KKyAgICAgICAgdmFsdWUgaXMgYSBsaXN0IG9mIG1vbnRoIHJvd3MuIEVhY2ggbW9udGggcm93IGNvbnRhaW5zIHVwdG8gd2lkdGggbW9udGhzLgorICAgICAgICBFYWNoIG1vbnRoIGNvbnRhaW5zIGJldHdlZW4gNCBhbmQgNiB3ZWVrcyBhbmQgZWFjaCB3ZWVrIGNvbnRhaW5zIDEtNworICAgICAgICBkYXlzLiBEYXlzIGFyZSBkYXRldGltZS5kYXRlIG9iamVjdHMuCisgICAgICAgICIiIgorICAgICAgICBtb250aHMgPSBbCisgICAgICAgICAgICBzZWxmLm1vbnRoZGF0ZXNjYWxlbmRhcih5ZWFyLCBpKQorICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKEphbnVhcnksIEphbnVhcnkrMTIpCisgICAgICAgIF0KKyAgICAgICAgcmV0dXJuIFttb250aHNbaTppK3dpZHRoXSBmb3IgaSBpbiB4cmFuZ2UoMCwgbGVuKG1vbnRocyksIHdpZHRoKSBdCisKKyAgICBkZWYgeWVhcmRheXMyY2FsZW5kYXIoc2VsZiwgeWVhciwgd2lkdGg9Myk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gdGhlIGRhdGEgZm9yIHRoZSBzcGVjaWZpZWQgeWVhciByZWFkeSBmb3IgZm9ybWF0dGluZyAoc2ltaWxhciB0bworICAgICAgICB5ZWFyZGF0ZXNjYWxlbmRhcigpKS4gRW50cmllcyBpbiB0aGUgd2VlayBsaXN0cyBhcmUKKyAgICAgICAgKGRheSBudW1iZXIsIHdlZWtkYXkgbnVtYmVyKSB0dXBsZXMuIERheSBudW1iZXJzIG91dHNpZGUgdGhpcyBtb250aCBhcmUKKyAgICAgICAgemVyby4KKyAgICAgICAgIiIiCisgICAgICAgIG1vbnRocyA9IFsKKyAgICAgICAgICAgIHNlbGYubW9udGhkYXlzMmNhbGVuZGFyKHllYXIsIGkpCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoSmFudWFyeSwgSmFudWFyeSsxMikKKyAgICAgICAgXQorICAgICAgICByZXR1cm4gW21vbnRoc1tpOmkrd2lkdGhdIGZvciBpIGluIHhyYW5nZSgwLCBsZW4obW9udGhzKSwgd2lkdGgpIF0KKworICAgIGRlZiB5ZWFyZGF5c2NhbGVuZGFyKHNlbGYsIHllYXIsIHdpZHRoPTMpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIHRoZSBkYXRhIGZvciB0aGUgc3BlY2lmaWVkIHllYXIgcmVhZHkgZm9yIGZvcm1hdHRpbmcgKHNpbWlsYXIgdG8KKyAgICAgICAgeWVhcmRhdGVzY2FsZW5kYXIoKSkuIEVudHJpZXMgaW4gdGhlIHdlZWsgbGlzdHMgYXJlIGRheSBudW1iZXJzLgorICAgICAgICBEYXkgbnVtYmVycyBvdXRzaWRlIHRoaXMgbW9udGggYXJlIHplcm8uCisgICAgICAgICIiIgorICAgICAgICBtb250aHMgPSBbCisgICAgICAgICAgICBzZWxmLm1vbnRoZGF5c2NhbGVuZGFyKHllYXIsIGkpCisgICAgICAgICAgICBmb3IgaSBpbiB4cmFuZ2UoSmFudWFyeSwgSmFudWFyeSsxMikKKyAgICAgICAgXQorICAgICAgICByZXR1cm4gW21vbnRoc1tpOmkrd2lkdGhdIGZvciBpIGluIHhyYW5nZSgwLCBsZW4obW9udGhzKSwgd2lkdGgpIF0KKworCitjbGFzcyBUZXh0Q2FsZW5kYXIoQ2FsZW5kYXIpOgorICAgICIiIgorICAgIFN1YmNsYXNzIG9mIENhbGVuZGFyIHRoYXQgb3V0cHV0cyBhIGNhbGVuZGFyIGFzIGEgc2ltcGxlIHBsYWluIHRleHQKKyAgICBzaW1pbGFyIHRvIHRoZSBVTklYIHByb2dyYW0gY2FsLgorICAgICIiIgorCisgICAgZGVmIHByd2VlayhzZWxmLCB0aGV3ZWVrLCB3aWR0aCk6CisgICAgICAgICIiIgorICAgICAgICBQcmludCBhIHNpbmdsZSB3ZWVrIChubyBuZXdsaW5lKS4KKyAgICAgICAgIiIiCisgICAgICAgIHByaW50IHNlbGYud2Vlayh0aGV3ZWVrLCB3aWR0aCksCisKKyAgICBkZWYgZm9ybWF0ZGF5KHNlbGYsIGRheSwgd2Vla2RheSwgd2lkdGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyBhIGZvcm1hdHRlZCBkYXkuCisgICAgICAgICIiIgogICAgICAgICBpZiBkYXkgPT0gMDoKICAgICAgICAgICAgIHMgPSAnJwogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcyA9ICclMmknICUgZGF5ICAgICAgICAgICAgICMgcmlnaHQtYWxpZ24gc2luZ2xlLWRpZ2l0IGRheXMKLSAgICAgICAgZGF5cy5hcHBlbmQocy5jZW50ZXIod2lkdGgpKQotICAgIHJldHVybiAnICcuam9pbihkYXlzKQorICAgICAgICByZXR1cm4gcy5jZW50ZXIod2lkdGgpCiAKLWRlZiB3ZWVraGVhZGVyKHdpZHRoKToKLSAgICAiIiJSZXR1cm4gYSBoZWFkZXIgZm9yIGEgd2Vlay4iIiIKLSAgICBpZiB3aWR0aCA+PSA5OgotICAgICAgICBuYW1lcyA9IGRheV9uYW1lCi0gICAgZWxzZToKLSAgICAgICAgbmFtZXMgPSBkYXlfYWJicgotICAgIGRheXMgPSBbXQotICAgIGZvciBpIGluIHJhbmdlKF9maXJzdHdlZWtkYXksIF9maXJzdHdlZWtkYXkgKyA3KToKLSAgICAgICAgZGF5cy5hcHBlbmQobmFtZXNbaSU3XVs6d2lkdGhdLmNlbnRlcih3aWR0aCkpCi0gICAgcmV0dXJuICcgJy5qb2luKGRheXMpCisgICAgZGVmIGZvcm1hdHdlZWsoc2VsZiwgdGhld2Vlaywgd2lkdGgpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyBhIHNpbmdsZSB3ZWVrIGluIGEgc3RyaW5nIChubyBuZXdsaW5lKS4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAnICcuam9pbihzZWxmLmZvcm1hdGRheShkLCB3ZCwgd2lkdGgpIGZvciAoZCwgd2QpIGluIHRoZXdlZWspCiAKLWRlZiBwcm1vbnRoKHRoZXllYXIsIHRoZW1vbnRoLCB3PTAsIGw9MCk6Ci0gICAgIiIiUHJpbnQgYSBtb250aCdzIGNhbGVuZGFyLiIiIgotICAgIHByaW50IG1vbnRoKHRoZXllYXIsIHRoZW1vbnRoLCB3LCBsKSwKKyAgICBkZWYgZm9ybWF0d2Vla2RheShzZWxmLCBkYXksIHdpZHRoKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybnMgYSBmb3JtYXR0ZWQgd2VlayBkYXkgbmFtZS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHdpZHRoID49IDk6CisgICAgICAgICAgICBuYW1lcyA9IGRheV9uYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lcyA9IGRheV9hYmJyCisgICAgICAgIHJldHVybiBuYW1lc1tkYXldWzp3aWR0aF0uY2VudGVyKHdpZHRoKQogCi1kZWYgbW9udGgodGhleWVhciwgdGhlbW9udGgsIHc9MCwgbD0wKToKLSAgICAiIiJSZXR1cm4gYSBtb250aCdzIGNhbGVuZGFyIHN0cmluZyAobXVsdGktbGluZSkuIiIiCi0gICAgdyA9IG1heCgyLCB3KQotICAgIGwgPSBtYXgoMSwgbCkKLSAgICBzID0gKCIlcyAlciIgJSAobW9udGhfbmFtZVt0aGVtb250aF0sIHRoZXllYXIpKS5jZW50ZXIoCi0gICAgICAgICAgICAgICAgIDcgKiAodyArIDEpIC0gMSkucnN0cmlwKCkgKyBcCi0gICAgICAgICAnXG4nICogbCArIHdlZWtoZWFkZXIodykucnN0cmlwKCkgKyAnXG4nICogbAotICAgIGZvciBhd2VlayBpbiBtb250aGNhbGVuZGFyKHRoZXllYXIsIHRoZW1vbnRoKToKLSAgICAgICAgcyA9IHMgKyB3ZWVrKGF3ZWVrLCB3KS5yc3RyaXAoKSArICdcbicgKiBsCi0gICAgcmV0dXJuIHNbOi1sXSArICdcbicKKyAgICBkZWYgZm9ybWF0d2Vla2hlYWRlcihzZWxmLCB3aWR0aCk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBoZWFkZXIgZm9yIGEgd2Vlay4KKyAgICAgICAgIiIiCisgICAgICAgIHJldHVybiAnICcuam9pbihzZWxmLmZvcm1hdHdlZWtkYXkoaSwgd2lkdGgpIGZvciBpIGluIHNlbGYuaXRlcndlZWtkYXlzKCkpCiAKLSMgU3BhY2luZyBvZiBtb250aCBjb2x1bW5zIGZvciAzLWNvbHVtbiB5ZWFyIGNhbGVuZGFyCisgICAgZGVmIGZvcm1hdG1vbnRobmFtZShzZWxmLCB0aGV5ZWFyLCB0aGVtb250aCwgd2lkdGgsIHdpdGh5ZWFyPVRydWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgZm9ybWF0dGVkIG1vbnRoIG5hbWUuCisgICAgICAgICIiIgorICAgICAgICBzID0gbW9udGhfbmFtZVt0aGVtb250aF0KKyAgICAgICAgaWYgd2l0aHllYXI6CisgICAgICAgICAgICBzID0gIiVzICVyIiAlIChzLCB0aGV5ZWFyKQorICAgICAgICByZXR1cm4gcy5jZW50ZXIod2lkdGgpCisKKyAgICBkZWYgcHJtb250aChzZWxmLCB0aGV5ZWFyLCB0aGVtb250aCwgdz0wLCBsPTApOgorICAgICAgICAiIiIKKyAgICAgICAgUHJpbnQgYSBtb250aCdzIGNhbGVuZGFyLgorICAgICAgICAiIiIKKyAgICAgICAgcHJpbnQgc2VsZi5mb3JtYXRtb250aCh0aGV5ZWFyLCB0aGVtb250aCwgdywgbCksCisKKyAgICBkZWYgZm9ybWF0bW9udGgoc2VsZiwgdGhleWVhciwgdGhlbW9udGgsIHc9MCwgbD0wKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIG1vbnRoJ3MgY2FsZW5kYXIgc3RyaW5nIChtdWx0aS1saW5lKS4KKyAgICAgICAgIiIiCisgICAgICAgIHcgPSBtYXgoMiwgdykKKyAgICAgICAgbCA9IG1heCgxLCBsKQorICAgICAgICBzID0gc2VsZi5mb3JtYXRtb250aG5hbWUodGhleWVhciwgdGhlbW9udGgsIDcgKiAodyArIDEpIC0gMSkKKyAgICAgICAgcyA9IHMucnN0cmlwKCkKKyAgICAgICAgcyArPSAnXG4nICogbAorICAgICAgICBzICs9IHNlbGYuZm9ybWF0d2Vla2hlYWRlcih3KS5yc3RyaXAoKQorICAgICAgICBzICs9ICdcbicgKiBsCisgICAgICAgIGZvciB3ZWVrIGluIHNlbGYubW9udGhkYXlzMmNhbGVuZGFyKHRoZXllYXIsIHRoZW1vbnRoKToKKyAgICAgICAgICAgIHMgKz0gc2VsZi5mb3JtYXR3ZWVrKHdlZWssIHcpLnJzdHJpcCgpCisgICAgICAgICAgICBzICs9ICdcbicgKiBsCisgICAgICAgIHJldHVybiBzCisKKyAgICBkZWYgZm9ybWF0eWVhcihzZWxmLCB0aGV5ZWFyLCB3PTIsIGw9MSwgYz02LCBtPTMpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJucyBhIHllYXIncyBjYWxlbmRhciBhcyBhIG11bHRpLWxpbmUgc3RyaW5nLgorICAgICAgICAiIiIKKyAgICAgICAgdyA9IG1heCgyLCB3KQorICAgICAgICBsID0gbWF4KDEsIGwpCisgICAgICAgIGMgPSBtYXgoMiwgYykKKyAgICAgICAgY29sd2lkdGggPSAodyArIDEpICogNyAtIDEKKyAgICAgICAgdiA9IFtdCisgICAgICAgIGEgPSB2LmFwcGVuZAorICAgICAgICBhKHJlcHIodGhleWVhcikuY2VudGVyKGNvbHdpZHRoKm0rYyoobS0xKSkucnN0cmlwKCkpCisgICAgICAgIGEoJ1xuJypsKQorICAgICAgICBoZWFkZXIgPSBzZWxmLmZvcm1hdHdlZWtoZWFkZXIodykKKyAgICAgICAgZm9yIChpLCByb3cpIGluIGVudW1lcmF0ZShzZWxmLnllYXJkYXlzMmNhbGVuZGFyKHRoZXllYXIsIG0pKToKKyAgICAgICAgICAgICMgbW9udGhzIGluIHRoaXMgcm93CisgICAgICAgICAgICBtb250aHMgPSB4cmFuZ2UobSppKzEsIG1pbihtKihpKzEpKzEsIDEzKSkKKyAgICAgICAgICAgIGEoJ1xuJypsKQorICAgICAgICAgICAgbmFtZXMgPSAoc2VsZi5mb3JtYXRtb250aG5hbWUodGhleWVhciwgaywgY29sd2lkdGgsIEZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgZm9yIGsgaW4gbW9udGhzKQorICAgICAgICAgICAgYShmb3JtYXRzdHJpbmcobmFtZXMsIGNvbHdpZHRoLCBjKS5yc3RyaXAoKSkKKyAgICAgICAgICAgIGEoJ1xuJypsKQorICAgICAgICAgICAgaGVhZGVycyA9IChoZWFkZXIgZm9yIGsgaW4gbW9udGhzKQorICAgICAgICAgICAgYShmb3JtYXRzdHJpbmcoaGVhZGVycywgY29sd2lkdGgsIGMpLnJzdHJpcCgpKQorICAgICAgICAgICAgYSgnXG4nKmwpCisgICAgICAgICAgICAjIG1heCBudW1iZXIgb2Ygd2Vla3MgZm9yIHRoaXMgcm93CisgICAgICAgICAgICBoZWlnaHQgPSBtYXgobGVuKGNhbCkgZm9yIGNhbCBpbiByb3cpCisgICAgICAgICAgICBmb3IgaiBpbiB4cmFuZ2UoaGVpZ2h0KToKKyAgICAgICAgICAgICAgICB3ZWVrcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGNhbCBpbiByb3c6CisgICAgICAgICAgICAgICAgICAgIGlmIGogPj0gbGVuKGNhbCk6CisgICAgICAgICAgICAgICAgICAgICAgICB3ZWVrcy5hcHBlbmQoJycpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICB3ZWVrcy5hcHBlbmQoc2VsZi5mb3JtYXR3ZWVrKGNhbFtqXSwgdykpCisgICAgICAgICAgICAgICAgYShmb3JtYXRzdHJpbmcod2Vla3MsIGNvbHdpZHRoLCBjKS5yc3RyaXAoKSkKKyAgICAgICAgICAgICAgICBhKCdcbicgKiBsKQorICAgICAgICByZXR1cm4gJycuam9pbih2KQorCisgICAgZGVmIHByeWVhcihzZWxmLCB0aGV5ZWFyLCB3PTAsIGw9MCwgYz02LCBtPTMpOgorICAgICAgICAiIiJQcmludCBhIHllYXIncyBjYWxlbmRhci4iIiIKKyAgICAgICAgcHJpbnQgc2VsZi5mb3JtYXR5ZWFyKHRoZXllYXIsIHcsIGwsIGMsIG0pCisKKworY2xhc3MgSFRNTENhbGVuZGFyKENhbGVuZGFyKToKKyAgICAiIiIKKyAgICBUaGlzIGNhbGVuZGFyIHJldHVybnMgY29tcGxldGUgSFRNTCBwYWdlcy4KKyAgICAiIiIKKworICAgICMgQ1NTIGNsYXNzZXMgZm9yIHRoZSBkYXkgPHRkPnMKKyAgICBjc3NjbGFzc2VzID0gWyJtb24iLCAidHVlIiwgIndlZCIsICJ0aHUiLCAiZnJpIiwgInNhdCIsICJzdW4iXQorCisgICAgZGVmIGZvcm1hdGRheShzZWxmLCBkYXksIHdlZWtkYXkpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgZGF5IGFzIGEgdGFibGUgY2VsbC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGRheSA9PSAwOgorICAgICAgICAgICAgcmV0dXJuICc8dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPicgIyBkYXkgb3V0c2lkZSBtb250aAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuICc8dGQgY2xhc3M9IiVzIj4lZDwvdGQ+JyAlIChzZWxmLmNzc2NsYXNzZXNbd2Vla2RheV0sIGRheSkKKworICAgIGRlZiBmb3JtYXR3ZWVrKHNlbGYsIHRoZXdlZWspOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgY29tcGxldGUgd2VlayBhcyBhIHRhYmxlIHJvdy4KKyAgICAgICAgIiIiCisgICAgICAgIHMgPSAnJy5qb2luKHNlbGYuZm9ybWF0ZGF5KGQsIHdkKSBmb3IgKGQsIHdkKSBpbiB0aGV3ZWVrKQorICAgICAgICByZXR1cm4gJzx0cj4lczwvdHI+JyAlIHMKKworICAgIGRlZiBmb3JtYXR3ZWVrZGF5KHNlbGYsIGRheSk6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSB3ZWVrZGF5IG5hbWUgYXMgYSB0YWJsZSBoZWFkZXIuCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gJzx0aCBjbGFzcz0iJXMiPiVzPC90aD4nICUgKHNlbGYuY3NzY2xhc3Nlc1tkYXldLCBkYXlfYWJicltkYXldKQorCisgICAgZGVmIGZvcm1hdHdlZWtoZWFkZXIoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZXR1cm4gYSBoZWFkZXIgZm9yIGEgd2VlayBhcyBhIHRhYmxlIHJvdy4KKyAgICAgICAgIiIiCisgICAgICAgIHMgPSAnJy5qb2luKHNlbGYuZm9ybWF0d2Vla2RheShpKSBmb3IgaSBpbiBzZWxmLml0ZXJ3ZWVrZGF5cygpKQorICAgICAgICByZXR1cm4gJzx0cj4lczwvdHI+JyAlIHMKKworICAgIGRlZiBmb3JtYXRtb250aG5hbWUoc2VsZiwgdGhleWVhciwgdGhlbW9udGgsIHdpdGh5ZWFyPVRydWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgbW9udGggbmFtZSBhcyBhIHRhYmxlIHJvdy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHdpdGh5ZWFyOgorICAgICAgICAgICAgcyA9ICclcyAlcycgJSAobW9udGhfbmFtZVt0aGVtb250aF0sIHRoZXllYXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzID0gJyVzJyAlIG1vbnRoX25hbWVbdGhlbW9udGhdCisgICAgICAgIHJldHVybiAnPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPiVzPC90aD48L3RyPicgJSBzCisKKyAgICBkZWYgZm9ybWF0bW9udGgoc2VsZiwgdGhleWVhciwgdGhlbW9udGgsIHdpdGh5ZWFyPVRydWUpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgZm9ybWF0dGVkIG1vbnRoIGFzIGEgdGFibGUuCisgICAgICAgICIiIgorICAgICAgICB2ID0gW10KKyAgICAgICAgYSA9IHYuYXBwZW5kCisgICAgICAgIGEoJzx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4nKQorICAgICAgICBhKCdcbicpCisgICAgICAgIGEoc2VsZi5mb3JtYXRtb250aG5hbWUodGhleWVhciwgdGhlbW9udGgsIHdpdGh5ZWFyPXdpdGh5ZWFyKSkKKyAgICAgICAgYSgnXG4nKQorICAgICAgICBhKHNlbGYuZm9ybWF0d2Vla2hlYWRlcigpKQorICAgICAgICBhKCdcbicpCisgICAgICAgIGZvciB3ZWVrIGluIHNlbGYubW9udGhkYXlzMmNhbGVuZGFyKHRoZXllYXIsIHRoZW1vbnRoKToKKyAgICAgICAgICAgIGEoc2VsZi5mb3JtYXR3ZWVrKHdlZWspKQorICAgICAgICAgICAgYSgnXG4nKQorICAgICAgICBhKCc8L3RhYmxlPicpCisgICAgICAgIGEoJ1xuJykKKyAgICAgICAgcmV0dXJuICcnLmpvaW4odikKKworICAgIGRlZiBmb3JtYXR5ZWFyKHNlbGYsIHRoZXllYXIsIHdpZHRoPTMpOgorICAgICAgICAiIiIKKyAgICAgICAgUmV0dXJuIGEgZm9ybWF0dGVkIHllYXIgYXMgYSB0YWJsZSBvZiB0YWJsZXMuCisgICAgICAgICIiIgorICAgICAgICB2ID0gW10KKyAgICAgICAgYSA9IHYuYXBwZW5kCisgICAgICAgIHdpZHRoID0gbWF4KHdpZHRoLCAxKQorICAgICAgICBhKCc8dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJ5ZWFyIj4nKQorICAgICAgICBhKCdcbicpCisgICAgICAgIGEoJzx0cj48dGggY29sc3Bhbj0iJWQiIGNsYXNzPSJ5ZWFyIj4lczwvdGg+PC90cj4nICUgKHdpZHRoLCB0aGV5ZWFyKSkKKyAgICAgICAgZm9yIGkgaW4geHJhbmdlKEphbnVhcnksIEphbnVhcnkrMTIsIHdpZHRoKToKKyAgICAgICAgICAgICMgbW9udGhzIGluIHRoaXMgcm93CisgICAgICAgICAgICBtb250aHMgPSB4cmFuZ2UoaSwgbWluKGkrd2lkdGgsIDEzKSkKKyAgICAgICAgICAgIGEoJzx0cj4nKQorICAgICAgICAgICAgZm9yIG0gaW4gbW9udGhzOgorICAgICAgICAgICAgICAgIGEoJzx0ZD4nKQorICAgICAgICAgICAgICAgIGEoc2VsZi5mb3JtYXRtb250aCh0aGV5ZWFyLCBtLCB3aXRoeWVhcj1GYWxzZSkpCisgICAgICAgICAgICAgICAgYSgnPC90ZD4nKQorICAgICAgICAgICAgYSgnPC90cj4nKQorICAgICAgICBhKCc8L3RhYmxlPicpCisgICAgICAgIHJldHVybiAnJy5qb2luKHYpCisKKyAgICBkZWYgZm9ybWF0eWVhcnBhZ2Uoc2VsZiwgdGhleWVhciwgd2lkdGg9MywgY3NzPSdjYWxlbmRhci5jc3MnLCBlbmNvZGluZz1Ob25lKToKKyAgICAgICAgIiIiCisgICAgICAgIFJldHVybiBhIGZvcm1hdHRlZCB5ZWFyIGFzIGEgY29tcGxldGUgSFRNTCBwYWdlLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgZW5jb2RpbmcgaXMgTm9uZToKKyAgICAgICAgICAgIGVuY29kaW5nID0gc3lzLmdldGRlZmF1bHRlbmNvZGluZygpCisgICAgICAgIHYgPSBbXQorICAgICAgICBhID0gdi5hcHBlbmQKKyAgICAgICAgYSgnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iJXMiPz5cbicgJSBlbmNvZGluZykKKyAgICAgICAgYSgnPCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBYSFRNTCAxLjAgU3RyaWN0Ly9FTiIgImh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9EVEQveGh0bWwxLXN0cmljdC5kdGQiPlxuJykKKyAgICAgICAgYSgnPGh0bWw+XG4nKQorICAgICAgICBhKCc8aGVhZD5cbicpCisgICAgICAgIGEoJzxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PSVzIiAvPlxuJyAlIGVuY29kaW5nKQorICAgICAgICBpZiBjc3MgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhKCc8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIlcyIgLz5cbicgJSBjc3MpCisgICAgICAgIGEoJzx0aXRsZT5DYWxlbmRhciBmb3IgJWQ8L3RpdGxlXG4nICUgdGhleWVhcikKKyAgICAgICAgYSgnPC9oZWFkPlxuJykKKyAgICAgICAgYSgnPGJvZHk+XG4nKQorICAgICAgICBhKHNlbGYuZm9ybWF0eWVhcih0aGV5ZWFyLCB3aWR0aCkpCisgICAgICAgIGEoJzwvYm9keT5cbicpCisgICAgICAgIGEoJzwvaHRtbD5cbicpCisgICAgICAgIHJldHVybiAnJy5qb2luKHYpLmVuY29kZShlbmNvZGluZywgInhtbGNoYXJyZWZyZXBsYWNlIikKKworCitjbGFzcyBUaW1lRW5jb2Rpbmc6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGxvY2FsZSk6CisgICAgICAgIHNlbGYubG9jYWxlID0gbG9jYWxlCisKKyAgICBkZWYgX19jb250ZXh0X18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICBzZWxmLm9sZGxvY2FsZSA9IGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX1RJTUUsIHNlbGYubG9jYWxlKQorICAgICAgICByZXR1cm4gbG9jYWxlLmdldGxvY2FsZShsb2NhbGUuTENfVElNRSlbMV0KKworICAgIGRlZiBfX2V4aXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIGxvY2FsZS5zZXRsb2NhbGUobG9jYWxlLkxDX1RJTUUsIHNlbGYub2xkbG9jYWxlKQorCisKK2NsYXNzIExvY2FsZVRleHRDYWxlbmRhcihUZXh0Q2FsZW5kYXIpOgorICAgICIiIgorICAgIFRoaXMgY2xhc3MgY2FuIGJlIHBhc3NlZCBhIGxvY2FsZSBuYW1lIGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgd2lsbCByZXR1cm4KKyAgICBtb250aCBhbmQgd2Vla2RheSBuYW1lcyBpbiB0aGUgc3BlY2lmaWVkIGxvY2FsZS4gSWYgdGhpcyBsb2NhbGUgaW5jbHVkZXMKKyAgICBhbiBlbmNvZGluZyBhbGwgc3RyaW5ncyBjb250YWluaW5nIG1vbnRoIGFuZCB3ZWVrZGF5IG5hbWVzIHdpbGwgYmUgcmV0dXJuZWQKKyAgICBhcyB1bmljb2RlLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpcnN0d2Vla2RheT0wLCBsb2NhbGU9Tm9uZSk6CisgICAgICAgIFRleHRDYWxlbmRhci5fX2luaXRfXyhzZWxmLCBmaXJzdHdlZWtkYXkpCisgICAgICAgIGlmIGxvY2FsZSBpcyBOb25lOgorICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlLmdldGRlZmF1bHRsb2NhbGUoKQorICAgICAgICBzZWxmLmxvY2FsZSA9IGxvY2FsZQorCisgICAgZGVmIGZvcm1hdHdlZWtkYXkoc2VsZiwgZGF5LCB3aWR0aCk6CisgICAgICAgIHdpdGggVGltZUVuY29kaW5nKHNlbGYubG9jYWxlKSBhcyBlbmNvZGluZzoKKyAgICAgICAgICAgIGlmIHdpZHRoID49IDk6CisgICAgICAgICAgICAgICAgbmFtZXMgPSBkYXlfbmFtZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuYW1lcyA9IGRheV9hYmJyCisgICAgICAgICAgICBuYW1lID0gbmFtZXNbZGF5XQorICAgICAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuZGVjb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgcmV0dXJuIG5hbWVbOndpZHRoXS5jZW50ZXIod2lkdGgpCisKKyAgICBkZWYgZm9ybWF0bW9udGhuYW1lKHNlbGYsIHRoZXllYXIsIHRoZW1vbnRoLCB3aWR0aCwgd2l0aHllYXI9VHJ1ZSk6CisgICAgICAgIHdpdGggVGltZUVuY29kaW5nKHNlbGYubG9jYWxlKSBhcyBlbmNvZGluZzoKKyAgICAgICAgICAgIHMgPSBtb250aF9uYW1lW3RoZW1vbnRoXQorICAgICAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcyA9IHMuZGVjb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgaWYgd2l0aHllYXI6CisgICAgICAgICAgICAgICAgcyA9ICIlcyAlciIgJSAocywgdGhleWVhcikKKyAgICAgICAgICAgIHJldHVybiBzLmNlbnRlcih3aWR0aCkKKworCitjbGFzcyBMb2NhbGVIVE1MQ2FsZW5kYXIoSFRNTENhbGVuZGFyKToKKyAgICAiIiIKKyAgICBUaGlzIGNsYXNzIGNhbiBiZSBwYXNzZWQgYSBsb2NhbGUgbmFtZSBpbiB0aGUgY29uc3RydWN0b3IgYW5kIHdpbGwgcmV0dXJuCisgICAgbW9udGggYW5kIHdlZWtkYXkgbmFtZXMgaW4gdGhlIHNwZWNpZmllZCBsb2NhbGUuIElmIHRoaXMgbG9jYWxlIGluY2x1ZGVzCisgICAgYW4gZW5jb2RpbmcgYWxsIHN0cmluZ3MgY29udGFpbmluZyBtb250aCBhbmQgd2Vla2RheSBuYW1lcyB3aWxsIGJlIHJldHVybmVkCisgICAgYXMgdW5pY29kZS4KKyAgICAiIiIKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlyc3R3ZWVrZGF5PTAsIGxvY2FsZT1Ob25lKToKKyAgICAgICAgSFRNTENhbGVuZGFyLl9faW5pdF9fKHNlbGYsIGZpcnN0d2Vla2RheSkKKyAgICAgICAgaWYgbG9jYWxlIGlzIE5vbmU6CisgICAgICAgICAgICBsb2NhbGUgPSBsb2NhbGUuZ2V0ZGVmYXVsdGxvY2FsZSgpCisgICAgICAgIHNlbGYubG9jYWxlID0gbG9jYWxlCisKKyAgICBkZWYgZm9ybWF0d2Vla2RheShzZWxmLCBkYXkpOgorICAgICAgICB3aXRoIFRpbWVFbmNvZGluZyhzZWxmLmxvY2FsZSkgYXMgZW5jb2Rpbmc6CisgICAgICAgICAgICBzID0gZGF5X2FiYnJbZGF5XQorICAgICAgICAgICAgaWYgZW5jb2RpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgcyA9IHMuZGVjb2RlKGVuY29kaW5nKQorICAgICAgICAgICAgcmV0dXJuICc8dGggY2xhc3M9IiVzIj4lczwvdGg+JyAlIChzZWxmLmNzc2NsYXNzZXNbZGF5XSwgcykKKworICAgIGRlZiBmb3JtYXRtb250aG5hbWUoc2VsZiwgdGhleWVhciwgdGhlbW9udGgsIHdpdGh5ZWFyPVRydWUpOgorICAgICAgICB3aXRoIFRpbWVFbmNvZGluZyhzZWxmLmxvY2FsZSkgYXMgZW5jb2Rpbmc6CisgICAgICAgICAgICBzID0gbW9udGhfbmFtZVt0aGVtb250aF0KKyAgICAgICAgICAgIGlmIGVuY29kaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHMgPSBzLmRlY29kZShlbmNvZGluZykKKyAgICAgICAgICAgIGlmIHdpdGh5ZWFyOgorICAgICAgICAgICAgICAgIHMgPSAnJXMgJXMnICUgKHMsIHRoZXllYXIpCisgICAgICAgICAgICByZXR1cm4gJzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj4lczwvdGg+PC90cj4nICUgcworCisKKyMgU3VwcG9ydCBmb3Igb2xkIG1vZHVsZSBsZXZlbCBpbnRlcmZhY2UKK2MgPSBUZXh0Q2FsZW5kYXIoKQorCitmaXJzdHdlZWtkYXkgPSBjLmdldGZpcnN0d2Vla2RheQorCitkZWYgc2V0Zmlyc3R3ZWVrZGF5KGZpcnN0d2Vla2RheSk6CisgICAgaWYgbm90IE1PTkRBWSA8PSBmaXJzdHdlZWtkYXkgPD0gU1VOREFZOgorICAgICAgICByYWlzZSBJbGxlZ2FsV2Vla2RheUVycm9yKGZpcnN0d2Vla2RheSkKKyAgICBjLmZpcnN0d2Vla2RheSA9IGZpcnN0d2Vla2RheQorCittb250aGNhbGVuZGFyID0gYy5tb250aGRheXNjYWxlbmRhcgorcHJ3ZWVrID0gYy5wcndlZWsKK3dlZWsgPSBjLmZvcm1hdHdlZWsKK3dlZWtoZWFkZXIgPSBjLmZvcm1hdHdlZWtoZWFkZXIKK3BybW9udGggPSBjLnBybW9udGgKK21vbnRoID0gYy5mb3JtYXRtb250aAorY2FsZW5kYXIgPSBjLmZvcm1hdHllYXIKK3ByY2FsID0gYy5wcnllYXIKKworCisjIFNwYWNpbmcgb2YgbW9udGggY29sdW1ucyBmb3IgbXVsdGktY29sdW1uIHllYXIgY2FsZW5kYXIKIF9jb2x3aWR0aCA9IDcqMyAtIDEgICAgICAgICAjIEFtb3VudCBwcmludGVkIGJ5IHByd2VlaygpCiBfc3BhY2luZyA9IDYgICAgICAgICAgICAgICAgIyBOdW1iZXIgb2Ygc3BhY2VzIGJldHdlZW4gY29sdW1ucwogCi1kZWYgZm9ybWF0M2MoYSwgYiwgYywgY29sd2lkdGg9X2NvbHdpZHRoLCBzcGFjaW5nPV9zcGFjaW5nKToKLSAgICAiIiJQcmludHMgMy1jb2x1bW4gZm9ybWF0dGluZyBmb3IgeWVhciBjYWxlbmRhcnMiIiIKLSAgICBwcmludCBmb3JtYXQzY3N0cmluZyhhLCBiLCBjLCBjb2x3aWR0aCwgc3BhY2luZykKIAotZGVmIGZvcm1hdDNjc3RyaW5nKGEsIGIsIGMsIGNvbHdpZHRoPV9jb2x3aWR0aCwgc3BhY2luZz1fc3BhY2luZyk6Ci0gICAgIiIiUmV0dXJucyBhIHN0cmluZyBmb3JtYXR0ZWQgZnJvbSAzIHN0cmluZ3MsIGNlbnRlcmVkIHdpdGhpbiAzIGNvbHVtbnMuIiIiCi0gICAgcmV0dXJuIChhLmNlbnRlcihjb2x3aWR0aCkgKyAnICcgKiBzcGFjaW5nICsgYi5jZW50ZXIoY29sd2lkdGgpICsKLSAgICAgICAgICAgICcgJyAqIHNwYWNpbmcgKyBjLmNlbnRlcihjb2x3aWR0aCkpCitkZWYgZm9ybWF0KGNvbHMsIGNvbHdpZHRoPV9jb2x3aWR0aCwgc3BhY2luZz1fc3BhY2luZyk6CisgICAgIiIiUHJpbnRzIG11bHRpLWNvbHVtbiBmb3JtYXR0aW5nIGZvciB5ZWFyIGNhbGVuZGFycyIiIgorICAgIHByaW50IGZvcm1hdHN0cmluZyhjb2xzLCBjb2x3aWR0aCwgc3BhY2luZykKIAotZGVmIHByY2FsKHllYXIsIHc9MCwgbD0wLCBjPV9zcGFjaW5nKToKLSAgICAiIiJQcmludCBhIHllYXIncyBjYWxlbmRhci4iIiIKLSAgICBwcmludCBjYWxlbmRhcih5ZWFyLCB3LCBsLCBjKSwKIAotZGVmIGNhbGVuZGFyKHllYXIsIHc9MCwgbD0wLCBjPV9zcGFjaW5nKToKLSAgICAiIiJSZXR1cm5zIGEgeWVhcidzIGNhbGVuZGFyIGFzIGEgbXVsdGktbGluZSBzdHJpbmcuIiIiCi0gICAgdyA9IG1heCgyLCB3KQotICAgIGwgPSBtYXgoMSwgbCkKLSAgICBjID0gbWF4KDIsIGMpCi0gICAgY29sd2lkdGggPSAodyArIDEpICogNyAtIDEKLSAgICBzID0gcmVwcih5ZWFyKS5jZW50ZXIoY29sd2lkdGggKiAzICsgYyAqIDIpLnJzdHJpcCgpICsgJ1xuJyAqIGwKLSAgICBoZWFkZXIgPSB3ZWVraGVhZGVyKHcpCi0gICAgaGVhZGVyID0gZm9ybWF0M2NzdHJpbmcoaGVhZGVyLCBoZWFkZXIsIGhlYWRlciwgY29sd2lkdGgsIGMpLnJzdHJpcCgpCi0gICAgZm9yIHEgaW4gcmFuZ2UoSmFudWFyeSwgSmFudWFyeSsxMiwgMyk6Ci0gICAgICAgIHMgPSAocyArICdcbicgKiBsICsKLSAgICAgICAgICAgICBmb3JtYXQzY3N0cmluZyhtb250aF9uYW1lW3FdLCBtb250aF9uYW1lW3ErMV0sIG1vbnRoX25hbWVbcSsyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x3aWR0aCwgYykucnN0cmlwKCkgKwotICAgICAgICAgICAgICdcbicgKiBsICsgaGVhZGVyICsgJ1xuJyAqIGwpCi0gICAgICAgIGRhdGEgPSBbXQotICAgICAgICBoZWlnaHQgPSAwCi0gICAgICAgIGZvciBhbW9udGggaW4gcmFuZ2UocSwgcSArIDMpOgotICAgICAgICAgICAgY2FsID0gbW9udGhjYWxlbmRhcih5ZWFyLCBhbW9udGgpCi0gICAgICAgICAgICBpZiBsZW4oY2FsKSA+IGhlaWdodDoKLSAgICAgICAgICAgICAgICBoZWlnaHQgPSBsZW4oY2FsKQotICAgICAgICAgICAgZGF0YS5hcHBlbmQoY2FsKQotICAgICAgICBmb3IgaSBpbiByYW5nZShoZWlnaHQpOgotICAgICAgICAgICAgd2Vla3MgPSBbXQotICAgICAgICAgICAgZm9yIGNhbCBpbiBkYXRhOgotICAgICAgICAgICAgICAgIGlmIGkgPj0gbGVuKGNhbCk6Ci0gICAgICAgICAgICAgICAgICAgIHdlZWtzLmFwcGVuZCgnJykKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICB3ZWVrcy5hcHBlbmQod2VlayhjYWxbaV0sIHcpKQotICAgICAgICAgICAgcyA9IHMgKyBmb3JtYXQzY3N0cmluZyh3ZWVrc1swXSwgd2Vla3NbMV0sIHdlZWtzWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2x3aWR0aCwgYykucnN0cmlwKCkgKyAnXG4nICogbAotICAgIHJldHVybiBzWzotbF0gKyAnXG4nCitkZWYgZm9ybWF0c3RyaW5nKGNvbHMsIGNvbHdpZHRoPV9jb2x3aWR0aCwgc3BhY2luZz1fc3BhY2luZyk6CisgICAgIiIiUmV0dXJucyBhIHN0cmluZyBmb3JtYXR0ZWQgZnJvbSBuIHN0cmluZ3MsIGNlbnRlcmVkIHdpdGhpbiBuIGNvbHVtbnMuIiIiCisgICAgc3BhY2luZyAqPSAnICcKKyAgICByZXR1cm4gc3BhY2luZy5qb2luKGMuY2VudGVyKGNvbHdpZHRoKSBmb3IgYyBpbiBjb2xzKQorCiAKIEVQT0NIID0gMTk3MAogX0VQT0NIX09SRCA9IGRhdGV0aW1lLmRhdGUoRVBPQ0gsIDEsIDEpLnRvb3JkaW5hbCgpCiAKKwogZGVmIHRpbWVnbSh0dXBsZSk6CiAgICAgIiIiVW5yZWxhdGVkIGJ1dCBoYW5keSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgVW5peCB0aW1lc3RhbXAgZnJvbSBHTVQuIiIiCiAgICAgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQgPSB0dXBsZVs6Nl0KQEAgLTIyOSwzICs2MDgsOTcgQEAKICAgICBtaW51dGVzID0gaG91cnMqNjAgKyBtaW51dGUKICAgICBzZWNvbmRzID0gbWludXRlcyo2MCArIHNlY29uZAogICAgIHJldHVybiBzZWNvbmRzCisKKworZGVmIG1haW4oYXJncyk6CisgICAgaW1wb3J0IG9wdHBhcnNlCisgICAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKHVzYWdlPSJ1c2FnZTogJXByb2cgW29wdGlvbnNdIFt5ZWFyIFttb250aF1dIikKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgIi13IiwgIi0td2lkdGgiLAorICAgICAgICBkZXN0PSJ3aWR0aCIsIHR5cGU9ImludCIsIGRlZmF1bHQ9MiwKKyAgICAgICAgaGVscD0id2lkdGggb2YgZGF0ZSBjb2x1bW4gKGRlZmF1bHQgMiwgdGV4dCBvbmx5KSIKKyAgICApCisgICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICItbCIsICItLWxpbmVzIiwKKyAgICAgICAgZGVzdD0ibGluZXMiLCB0eXBlPSJpbnQiLCBkZWZhdWx0PTEsCisgICAgICAgIGhlbHA9Im51bWJlciBvZiBsaW5lcyBmb3IgZWFjaCB3ZWVrIChkZWZhdWx0IDEsIHRleHQgb25seSkiCisgICAgKQorICAgIHBhcnNlci5hZGRfb3B0aW9uKAorICAgICAgICAiLXMiLCAiLS1zcGFjaW5nIiwKKyAgICAgICAgZGVzdD0ic3BhY2luZyIsIHR5cGU9ImludCIsIGRlZmF1bHQ9NiwKKyAgICAgICAgaGVscD0ic3BhY2luZyBiZXR3ZWVuIG1vbnRocyAoZGVmYXVsdCA2LCB0ZXh0IG9ubHkpIgorICAgICkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgIi1tIiwgIi0tbW9udGhzIiwKKyAgICAgICAgZGVzdD0ibW9udGhzIiwgdHlwZT0iaW50IiwgZGVmYXVsdD0zLAorICAgICAgICBoZWxwPSJtb250aHMgcGVyIHJvdyAoZGVmYXVsdCAzLCB0ZXh0IG9ubHkpIgorICAgICkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgIi1jIiwgIi0tY3NzIiwKKyAgICAgICAgZGVzdD0iY3NzIiwgZGVmYXVsdD0iY2FsZW5kYXIuY3NzIiwKKyAgICAgICAgaGVscD0iQ1NTIHRvIHVzZSBmb3IgcGFnZSAoaHRtbCBvbmx5KSIKKyAgICApCisgICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICItTCIsICItLWxvY2FsZSIsCisgICAgICAgIGRlc3Q9ImxvY2FsZSIsIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgaGVscD0ibG9jYWxlIHRvIGJlIHVzZWQgZnJvbSBtb250aCBhbmQgd2Vla2RheSBuYW1lcyIKKyAgICApCisgICAgcGFyc2VyLmFkZF9vcHRpb24oCisgICAgICAgICItZSIsICItLWVuY29kaW5nIiwKKyAgICAgICAgZGVzdD0iZW5jb2RpbmciLCBkZWZhdWx0PU5vbmUsCisgICAgICAgIGhlbHA9IkVuY29kaW5nIHRvIHVzZSBmb3Igb3V0cHV0IgorICAgICkKKyAgICBwYXJzZXIuYWRkX29wdGlvbigKKyAgICAgICAgIi10IiwgIi0tdHlwZSIsCisgICAgICAgIGRlc3Q9InR5cGUiLCBkZWZhdWx0PSJ0ZXh0IiwKKyAgICAgICAgY2hvaWNlcz0oInRleHQiLCAiaHRtbCIpLAorICAgICAgICBoZWxwPSJvdXRwdXQgdHlwZSAodGV4dCBvciBodG1sKSIKKyAgICApCisKKyAgICAob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncyhhcmdzKQorCisgICAgaWYgb3B0aW9ucy5sb2NhbGUgYW5kIG5vdCBvcHRpb25zLmVuY29kaW5nOgorICAgICAgICBwYXJzZXIuZXJyb3IoImlmIC0tbG9jYWxlIGlzIHNwZWNpZmllZCAtLWVuY29kaW5nIGlzIHJlcXVpcmVkIikKKyAgICAgICAgc3lzLmV4aXQoMSkKKworICAgIGlmIG9wdGlvbnMudHlwZSA9PSAiaHRtbCI6CisgICAgICAgIGlmIG9wdGlvbnMubG9jYWxlOgorICAgICAgICAgICAgY2FsID0gTG9jYWxlSFRNTENhbGVuZGFyKGxvY2FsZT1vcHRpb25zLmxvY2FsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNhbCA9IEhUTUxDYWxlbmRhcigpCisgICAgICAgIGVuY29kaW5nID0gb3B0aW9ucy5lbmNvZGluZworICAgICAgICBpZiBlbmNvZGluZyBpcyBOb25lOgorICAgICAgICAgICAgZW5jb2RpbmcgPSBzeXMuZ2V0ZGVmYXVsdGVuY29kaW5nKCkKKyAgICAgICAgb3B0ZGljdCA9IGRpY3QoZW5jb2Rpbmc9ZW5jb2RpbmcsIGNzcz1vcHRpb25zLmNzcykKKyAgICAgICAgaWYgbGVuKGFyZ3MpID09IDE6CisgICAgICAgICAgICBwcmludCBjYWwuZm9ybWF0eWVhcnBhZ2UoZGF0ZXRpbWUuZGF0ZS50b2RheSgpLnllYXIsICoqb3B0ZGljdCkKKyAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMjoKKyAgICAgICAgICAgIHByaW50IGNhbC5mb3JtYXR5ZWFycGFnZShpbnQoYXJnc1sxXSksICoqb3B0ZGljdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhcnNlci5lcnJvcigiaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMiKQorICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBlbHNlOgorICAgICAgICBpZiBvcHRpb25zLmxvY2FsZToKKyAgICAgICAgICAgIGNhbCA9IExvY2FsZVRleHRDYWxlbmRhcihsb2NhbGU9b3B0aW9ucy5sb2NhbGUpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjYWwgPSBUZXh0Q2FsZW5kYXIoKQorICAgICAgICBvcHRkaWN0ID0gZGljdCh3PW9wdGlvbnMud2lkdGgsIGw9b3B0aW9ucy5saW5lcykKKyAgICAgICAgaWYgbGVuKGFyZ3MpICE9IDM6CisgICAgICAgICAgICBvcHRkaWN0WyJjIl0gPSBvcHRpb25zLnNwYWNpbmcKKyAgICAgICAgICAgIG9wdGRpY3RbIm0iXSA9IG9wdGlvbnMubW9udGhzCisgICAgICAgIGlmIGxlbihhcmdzKSA9PSAxOgorICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdHllYXIoZGF0ZXRpbWUuZGF0ZS50b2RheSgpLnllYXIsICoqb3B0ZGljdCkKKyAgICAgICAgZWxpZiBsZW4oYXJncykgPT0gMjoKKyAgICAgICAgICAgIHJlc3VsdCA9IGNhbC5mb3JtYXR5ZWFyKGludChhcmdzWzFdKSwgKipvcHRkaWN0KQorICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSAzOgorICAgICAgICAgICAgcmVzdWx0ID0gY2FsLmZvcm1hdG1vbnRoKGludChhcmdzWzFdKSwgaW50KGFyZ3NbMl0pLCAqKm9wdGRpY3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXJzZXIuZXJyb3IoImluY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzIikKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgICAgIGlmIG9wdGlvbnMuZW5jb2Rpbmc6CisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuZW5jb2RlKG9wdGlvbnMuZW5jb2RpbmcpCisgICAgICAgIHByaW50IHJlc3VsdAorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL0xpYi9jb2RlY3MucHkgYi9MaWIvY29kZWNzLnB5CmluZGV4IDI4ODU2YzcuLjE1MThkNzUgMTAwNjQ0Ci0tLSBhL0xpYi9jb2RlY3MucHkKKysrIGIvTGliL2NvZGVjcy5weQpAQCAtMTQsOCArMTQsNyBAQAogdHJ5OgogICAgIGZyb20gX2NvZGVjcyBpbXBvcnQgKgogZXhjZXB0IEltcG9ydEVycm9yLCB3aHk6Ci0gICAgcmFpc2UgU3lzdGVtRXJyb3IsXAotICAgICAgICAgICdGYWlsZWQgdG8gbG9hZCB0aGUgYnVpbHRpbiBjb2RlY3M6ICVzJyAlIHdoeQorICAgIHJhaXNlIFN5c3RlbUVycm9yKCdGYWlsZWQgdG8gbG9hZCB0aGUgYnVpbHRpbiBjb2RlY3M6ICVzJyAlIHdoeSkKIAogX19hbGxfXyA9IFsicmVnaXN0ZXIiLCAibG9va3VwIiwgIm9wZW4iLCAiRW5jb2RlZEZpbGUiLCAiQk9NIiwgIkJPTV9CRSIsCiAgICAgICAgICAgICJCT01fTEUiLCAiQk9NMzJfQkUiLCAiQk9NMzJfTEUiLCAiQk9NNjRfQkUiLCAiQk9NNjRfTEUiLApAQCAtMTU2LDEzICsxNTUsMTMgQEAKIAogY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG9iamVjdCk6CiAgICAgIiIiCi0gICAgQSBJbmNyZW1lbnRhbEVuY29kZXIgZW5jb2RlcyBhbiBpbnB1dCBpbiBtdWx0aXBsZSBzdGVwcy4gVGhlIGlucHV0IGNhbiBiZQorICAgIEFuIEluY3JlbWVudGFsRW5jb2RlciBlbmNvZGVzIGFuIGlucHV0IGluIG11bHRpcGxlIHN0ZXBzLiBUaGUgaW5wdXQgY2FuIGJlCiAgICAgcGFzc2VkIHBpZWNlIGJ5IHBpZWNlIHRvIHRoZSBlbmNvZGUoKSBtZXRob2QuIFRoZSBJbmNyZW1lbnRhbEVuY29kZXIgcmVtZW1iZXJzCiAgICAgdGhlIHN0YXRlIG9mIHRoZSBFbmNvZGluZyBwcm9jZXNzIGJldHdlZW4gY2FsbHMgdG8gZW5jb2RlKCkuCiAgICAgIiIiCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVycm9ycz0nc3RyaWN0Jyk6CiAgICAgICAgICIiIgotICAgICAgICBDcmVhdGVzIGEgSW5jcmVtZW50YWxFbmNvZGVyIGluc3RhbmNlLgorICAgICAgICBDcmVhdGVzIGFuIEluY3JlbWVudGFsRW5jb2RlciBpbnN0YW5jZS4KIAogICAgICAgICBUaGUgSW5jcmVtZW50YWxFbmNvZGVyIG1heSB1c2UgZGlmZmVyZW50IGVycm9yIGhhbmRsaW5nIHNjaGVtZXMgYnkKICAgICAgICAgcHJvdmlkaW5nIHRoZSBlcnJvcnMga2V5d29yZCBhcmd1bWVudC4gU2VlIHRoZSBtb2R1bGUgZG9jc3RyaW5nCkBAIC0xODIsNiArMTgxLDMzIEBACiAgICAgICAgIFJlc2V0cyB0aGUgZW5jb2RlciB0byB0aGUgaW5pdGlhbCBzdGF0ZS4KICAgICAgICAgIiIiCiAKK2NsYXNzIEJ1ZmZlcmVkSW5jcmVtZW50YWxFbmNvZGVyKEluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgIiIiCisgICAgVGhpcyBzdWJjbGFzcyBvZiBJbmNyZW1lbnRhbEVuY29kZXIgY2FuIGJlIHVzZWQgYXMgdGhlIGJhc2VjbGFzcyBmb3IgYW4KKyAgICBpbmNyZW1lbnRhbCBlbmNvZGVyIGlmIHRoZSBlbmNvZGVyIG11c3Qga2VlcCBzb21lIG9mIHRoZSBvdXRwdXQgaW4gYQorICAgIGJ1ZmZlciBiZXR3ZWVuIGNhbGxzIHRvIGVuY29kZSgpLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBlcnJvcnM9J3N0cmljdCcpOgorICAgICAgICBJbmNyZW1lbnRhbEVuY29kZXIuX19pbml0X18oc2VsZiwgZXJyb3JzKQorICAgICAgICBzZWxmLmJ1ZmZlciA9ICIiICMgdW5lbmNvZGVkIGlucHV0IHRoYXQgaXMga2VwdCBiZXR3ZWVuIGNhbGxzIHRvIGVuY29kZSgpCisKKyAgICBkZWYgX2J1ZmZlcl9lbmNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycywgZmluYWwpOgorICAgICAgICAjIE92ZXJ3cml0ZSB0aGlzIG1ldGhvZCBpbiBzdWJjbGFzc2VzOiBJdCBtdXN0IGVuY29kZSBpbnB1dAorICAgICAgICAjIGFuZCByZXR1cm4gYW4gKG91dHB1dCwgbGVuZ3RoIGNvbnN1bWVkKSB0dXBsZQorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCisKKyAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6CisgICAgICAgICMgZW5jb2RlIGlucHV0ICh0YWtpbmcgdGhlIGJ1ZmZlciBpbnRvIGFjY291bnQpCisgICAgICAgIGRhdGEgPSBzZWxmLmJ1ZmZlciArIGlucHV0CisgICAgICAgIChyZXN1bHQsIGNvbnN1bWVkKSA9IHNlbGYuX2J1ZmZlcl9lbmNvZGUoZGF0YSwgc2VsZi5lcnJvcnMsIGZpbmFsKQorICAgICAgICAjIGtlZXAgdW5lbmNvZGVkIGlucHV0IHVudGlsIHRoZSBuZXh0IGNhbGwKKyAgICAgICAgc2VsZi5idWZmZXIgPSBkYXRhW2NvbnN1bWVkOl0KKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBJbmNyZW1lbnRhbEVuY29kZXIucmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5idWZmZXIgPSAiIgorCiBjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIob2JqZWN0KToKICAgICAiIiIKICAgICBBbiBJbmNyZW1lbnRhbERlY29kZXIgZGVjb2RlcyBhbiBpbnB1dCBpbiBtdWx0aXBsZSBzdGVwcy4gVGhlIGlucHV0IGNhbiBiZQpAQCAtMjM0LDcgKzI2MCw3IEBACiAKICAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgIEluY3JlbWVudGFsRGVjb2Rlci5yZXNldChzZWxmKQotICAgICAgICBzZWxmLmJ5dGVidWZmZXIgPSAiIgorICAgICAgICBzZWxmLmJ1ZmZlciA9ICIiCiAKICMKICMgVGhlIFN0cmVhbVdyaXRlciBhbmQgU3RyZWFtUmVhZGVyIGNsYXNzIHByb3ZpZGUgZ2VuZXJpYyB3b3JraW5nCmRpZmYgLS1naXQgYS9MaWIvY29udGV4dGxpYi5weSBiL0xpYi9jb250ZXh0bGliLnB5CmluZGV4IDBhNWQ2MDguLmFhNTMzNWQgMTAwNjQ0Ci0tLSBhL0xpYi9jb250ZXh0bGliLnB5CisrKyBiL0xpYi9jb250ZXh0bGliLnB5CkBAIC0zMCw5ICszMCwyMiBAQAogICAgICAgICBlbHNlOgogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHNlbGYuZ2VuLnRocm93KHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgICAgICAgIGV4Y2VwdCBTdG9wSXRlcmF0aW9uOgotICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJnZW5lcmF0b3IgZGlkbid0IHN0b3AgYWZ0ZXIgdGhyb3coKSIpCisgICAgICAgICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbiwgZXhjOgorICAgICAgICAgICAgICAgICMgU3VwcHJlc3MgdGhlIGV4Y2VwdGlvbiAqdW5sZXNzKiBpdCdzIHRoZSBzYW1lIGV4Y2VwdGlvbiB0aGF0CisgICAgICAgICAgICAgICAgIyB3YXMgcGFzc2VkIHRvIHRocm93KCkuICBUaGlzIHByZXZlbnRzIGEgU3RvcEl0ZXJhdGlvbgorICAgICAgICAgICAgICAgICMgcmFpc2VkIGluc2lkZSB0aGUgIndpdGgiIHN0YXRlbWVudCBmcm9tIGJlaW5nIHN1cHByZXNzZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gZXhjIGlzIG5vdCB2YWx1ZQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICMgb25seSByZS1yYWlzZSBpZiBpdCdzICpub3QqIHRoZSBleGNlcHRpb24gdGhhdCB3YXMKKyAgICAgICAgICAgICAgICAjIHBhc3NlZCB0byB0aHJvdygpLCBiZWNhdXNlIF9fZXhpdF9fKCkgbXVzdCBub3QgcmFpc2UKKyAgICAgICAgICAgICAgICAjIGFuIGV4Y2VwdGlvbiB1bmxlc3MgX19leGl0X18oKSBpdHNlbGYgZmFpbGVkLiAgQnV0IHRocm93KCkKKyAgICAgICAgICAgICAgICAjIGhhcyB0byByYWlzZSB0aGUgZXhjZXB0aW9uIHRvIHNpZ25hbCBwcm9wYWdhdGlvbiwgc28gdGhpcworICAgICAgICAgICAgICAgICMgZml4ZXMgdGhlIGltcGVkYW5jZSBtaXNtYXRjaCBiZXR3ZWVuIHRoZSB0aHJvdygpIHByb3RvY29sCisgICAgICAgICAgICAgICAgIyBhbmQgdGhlIF9fZXhpdF9fKCkgcHJvdG9jb2wuCisgICAgICAgICAgICAgICAgIworICAgICAgICAgICAgICAgIGlmIHN5cy5leGNfaW5mbygpWzFdIGlzIG5vdCB2YWx1ZToKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UKIAogCiBkZWYgY29udGV4dG1hbmFnZXIoZnVuYyk6CkBAIC02OCw2ICs4MSw3IEBACiAgICAgdHJ5OgogICAgICAgICBoZWxwZXIuX19uYW1lX18gPSBmdW5jLl9fbmFtZV9fCiAgICAgICAgIGhlbHBlci5fX2RvY19fID0gZnVuYy5fX2RvY19fCisgICAgICAgIGhlbHBlci5fX2RpY3RfXyA9IGZ1bmMuX19kaWN0X18KICAgICBleGNlcHQ6CiAgICAgICAgIHBhc3MKICAgICByZXR1cm4gaGVscGVyCmRpZmYgLS1naXQgYS9MaWIvY29weV9yZWcucHkgYi9MaWIvY29weV9yZWcucHkKaW5kZXggMTY5NTIwZC4uZjQ2NjFlZCAxMDA2NDQKLS0tIGEvTGliL2NvcHlfcmVnLnB5CisrKyBiL0xpYi9jb3B5X3JlZy5weQpAQCAtMTExLDggKzExMSwxOSBAQAogICAgICAgICAjIFNsb3RzIGZvdW5kIC0tIGdhdGhlciBzbG90IG5hbWVzIGZyb20gYWxsIGJhc2UgY2xhc3NlcwogICAgICAgICBmb3IgYyBpbiBjbHMuX19tcm9fXzoKICAgICAgICAgICAgIGlmICJfX3Nsb3RzX18iIGluIGMuX19kaWN0X186Ci0gICAgICAgICAgICAgICAgbmFtZXMgKz0gW25hbWUgZm9yIG5hbWUgaW4gYy5fX2RpY3RfX1siX19zbG90c19fIl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiAoIl9fZGljdF9fIiwgIl9fd2Vha3JlZl9fIildCisgICAgICAgICAgICAgICAgc2xvdHMgPSBjLl9fZGljdF9fWydfX3Nsb3RzX18nXQorICAgICAgICAgICAgICAgICMgaWYgY2xhc3MgaGFzIGEgc2luZ2xlIHNsb3QsIGl0IGNhbiBiZSBnaXZlbiBhcyBhIHN0cmluZworICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2xvdHMsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgICAgICBzbG90cyA9IChzbG90cywpCisgICAgICAgICAgICAgICAgZm9yIG5hbWUgaW4gc2xvdHM6CisgICAgICAgICAgICAgICAgICAgICMgc3BlY2lhbCBkZXNjcmlwdG9ycworICAgICAgICAgICAgICAgICAgICBpZiBuYW1lIGluICgiX19kaWN0X18iLCAiX193ZWFrcmVmX18iKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICMgbWFuZ2xlZCBuYW1lcworICAgICAgICAgICAgICAgICAgICBlbGlmIG5hbWUuc3RhcnRzd2l0aCgnX18nKSBhbmQgbm90IG5hbWUuZW5kc3dpdGgoJ19fJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lcy5hcHBlbmQoJ18lcyVzJyAlIChjLl9fbmFtZV9fLCBuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzLmFwcGVuZChuYW1lKQogCiAgICAgIyBDYWNoZSB0aGUgb3V0Y29tZSBpbiB0aGUgY2xhc3MgaWYgYXQgYWxsIHBvc3NpYmxlCiAgICAgdHJ5OgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy9fX2luaXRfXy5weSBiL0xpYi9jdHlwZXMvX19pbml0X18ucHkKaW5kZXggZGQwZjY0MC4uMjhhYzE4MCAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy9fX2luaXRfXy5weQorKysgYi9MaWIvY3R5cGVzL19faW5pdF9fLnB5CkBAIC05LDExICs5LDcgQEAKIGZyb20gX2N0eXBlcyBpbXBvcnQgX1BvaW50ZXIKIGZyb20gX2N0eXBlcyBpbXBvcnQgQ0Z1bmNQdHIgYXMgX0NGdW5jUHRyCiBmcm9tIF9jdHlwZXMgaW1wb3J0IF9fdmVyc2lvbl9fIGFzIF9jdHlwZXNfdmVyc2lvbgotdHJ5OgotICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgUlRMRF9MT0NBTCwgUlRMRF9HTE9CQUwKLWV4Y2VwdCAoSW1wb3J0RXJyb3IsIEF0dHJpYnV0ZUVycm9yKToKLSAgICBSVExEX0dMT0JBTCA9IFJUTERfTE9DQUwgPSBOb25lCi0KK2Zyb20gX2N0eXBlcyBpbXBvcnQgUlRMRF9MT0NBTCwgUlRMRF9HTE9CQUwKIGZyb20gX2N0eXBlcyBpbXBvcnQgQXJndW1lbnRFcnJvcgogCiBmcm9tIHN0cnVjdCBpbXBvcnQgY2FsY3NpemUgYXMgX2NhbGNzaXplCkBAIC0zMDQsMTAgKzMwMCwxMSBAQAogICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsIG5hbWUKICAgICAgICAgcmV0dXJuIHNlbGYuX19nZXRpdGVtX18obmFtZSkKIAotICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuYW1lKToKLSAgICAgICAgZnVuYyA9IHNlbGYuX0Z1bmNQdHIobmFtZSwgc2VsZikKLSAgICAgICAgZnVuYy5fX25hbWVfXyA9IG5hbWUKLSAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBmdW5jKQorICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBuYW1lX29yX29yZGluYWwpOgorICAgICAgICBmdW5jID0gc2VsZi5fRnVuY1B0cigobmFtZV9vcl9vcmRpbmFsLCBzZWxmKSkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UobmFtZV9vcl9vcmRpbmFsLCAoaW50LCBsb25nKSk6CisgICAgICAgICAgICBmdW5jLl9fbmFtZV9fID0gbmFtZV9vcl9vcmRpbmFsCisgICAgICAgICAgICBzZXRhdHRyKHNlbGYsIG5hbWVfb3Jfb3JkaW5hbCwgZnVuYykKICAgICAgICAgcmV0dXJuIGZ1bmMKIAogY2xhc3MgUHlETEwoQ0RMTCk6CkBAIC0zODQsMjEgKzM4MSwyOSBAQAogCiBfcG9pbnRlcl90eXBlX2NhY2hlW05vbmVdID0gY192b2lkX3AKIAotIyBmdW5jdGlvbnMKLQotZnJvbSBfY3R5cGVzIGltcG9ydCBfbWVtbW92ZV9hZGRyLCBfbWVtc2V0X2FkZHIsIF9zdHJpbmdfYXRfYWRkciwgY2FzdAotCiBpZiBzaXplb2YoY191aW50KSA9PSBzaXplb2YoY192b2lkX3ApOgogICAgIGNfc2l6ZV90ID0gY191aW50CiBlbGlmIHNpemVvZihjX3Vsb25nKSA9PSBzaXplb2YoY192b2lkX3ApOgogICAgIGNfc2l6ZV90ID0gY191bG9uZwogCisjIGZ1bmN0aW9ucworCitmcm9tIF9jdHlwZXMgaW1wb3J0IF9tZW1tb3ZlX2FkZHIsIF9tZW1zZXRfYWRkciwgX3N0cmluZ19hdF9hZGRyLCBfY2FzdF9hZGRyCisKICMjIHZvaWQgKm1lbW1vdmUodm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CiBtZW1tb3ZlID0gQ0ZVTkNUWVBFKGNfdm9pZF9wLCBjX3ZvaWRfcCwgY192b2lkX3AsIGNfc2l6ZV90KShfbWVtbW92ZV9hZGRyKQogCiAjIyB2b2lkICptZW1zZXQodm9pZCAqLCBpbnQsIHNpemVfdCkKIG1lbXNldCA9IENGVU5DVFlQRShjX3ZvaWRfcCwgY192b2lkX3AsIGNfaW50LCBjX3NpemVfdCkoX21lbXNldF9hZGRyKQogCitkZWYgUFlGVU5DVFlQRShyZXN0eXBlLCAqYXJndHlwZXMpOgorICAgIGNsYXNzIENGdW5jdGlvblR5cGUoX0NGdW5jUHRyKToKKyAgICAgICAgX2FyZ3R5cGVzXyA9IGFyZ3R5cGVzCisgICAgICAgIF9yZXN0eXBlXyA9IHJlc3R5cGUKKyAgICAgICAgX2ZsYWdzXyA9IF9GVU5DRkxBR19DREVDTCB8IF9GVU5DRkxBR19QWVRIT05BUEkKKyAgICByZXR1cm4gQ0Z1bmN0aW9uVHlwZQorY2FzdCA9IFBZRlVOQ1RZUEUocHlfb2JqZWN0LCBjX3ZvaWRfcCwgcHlfb2JqZWN0KShfY2FzdF9hZGRyKQorCiBfc3RyaW5nX2F0ID0gQ0ZVTkNUWVBFKHB5X29iamVjdCwgY192b2lkX3AsIGNfaW50KShfc3RyaW5nX2F0X2FkZHIpCiBkZWYgc3RyaW5nX2F0KHB0ciwgc2l6ZT0wKToKICAgICAiIiJzdHJpbmdfYXQoYWRkclssIHNpemVdKSAtPiBzdHJpbmcKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvX2xvYWRlci5weSBiL0xpYi9jdHlwZXMvX2xvYWRlci5weQppbmRleCA3YmRlNmM2Li43YTQ4YzFjIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL19sb2FkZXIucHkKKysrIGIvTGliL2N0eXBlcy9fbG9hZGVyLnB5CkBAIC0xLDE0ICsxLDExIEBACi0jIFdPUksgSU4gUFJPR1JFU1MhICBETyBOT1QgKHlldCkgVVNFIQogaW1wb3J0IHN5cywgb3MKIGltcG9ydCBjdHlwZXMKIAotX19hbGxfXyA9IFsiTGlicmFyeUxvYWRlciIsICJSVExEX0xPQ0FMIiwgIlJUTERfR0xPQkFMIl0KLQogaWYgb3MubmFtZSBpbiAoIm50IiwgImNlIik6CiAgICAgZnJvbSBfY3R5cGVzIGltcG9ydCBMb2FkTGlicmFyeSBhcyBkbG9wZW4KLSAgICBSVExEX0xPQ0FMID0gUlRMRF9HTE9CQUwgPSBOb25lCiBlbHNlOgotICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgZGxvcGVuLCBSVExEX0xPQ0FMLCBSVExEX0dMT0JBTAorICAgIGZyb20gX2N0eXBlcyBpbXBvcnQgZGxvcGVuCitmcm9tIF9jdHlwZXMgaW1wb3J0IFJUTERfTE9DQUwsIFJUTERfR0xPQkFMCiAKICMgX2ZpbmRMaWIobmFtZSkgcmV0dXJucyBhbiBpdGVyYWJsZSBvZiBwb3NzaWJsZSBuYW1lcyBmb3IgYSBsaWJyYXJ5LgogaWYgb3MubmFtZSBpbiAoIm50IiwgImNlIik6CkBAIC01Niw3ICs1MywxMCBAQAogICAgICAgICBleHByID0gJy9bXlwoXClcc10qbGliJXNcLlteXChcKVxzXSonICUgbmFtZQogICAgICAgICByZXMgPSByZS5zZWFyY2goZXhwciwgb3MucG9wZW4oJy9zYmluL2xkY29uZmlnIC1wIDI+L2Rldi9udWxsJykucmVhZCgpKQogICAgICAgICBpZiBub3QgcmVzOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgICAgIGNtZCA9ICdsZGQgJXMgMj4vZGV2L251bGwnICUgc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgICAgIHJlcyA9IHJlLnNlYXJjaChleHByLCBvcy5wb3BlbihjbWQpLnJlYWQoKSkKKyAgICAgICAgICAgIGlmIG5vdCByZXM6CisgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgcmV0dXJuIHJlcy5ncm91cCgwKQogCiAgICAgZGVmIF9nZXRfc29uYW1lKGYpOgpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfYnl0ZXN3YXAucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weQppbmRleCAxYjMxZjkwLi5kMGFkYTQwIDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9ieXRlc3dhcC5weQpAQCAtMTQ5LDcgKzE0OSw3IEBACiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjX2NoYXIuX19jdHlwZV9sZV9fIGlzIGNfY2hhcikKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNfY2hhci5fX2N0eXBlX2JlX18gaXMgY19jaGFyKQogCi0gICAgZGVmIHRlc3Rfc3RydWN0X2ZpZWxkcyhzZWxmKToKKyAgICBkZWYgdGVzdF9zdHJ1Y3RfZmllbGRzXzEoc2VsZik6CiAgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CiAgICAgICAgICAgICBiYXNlID0gQmlnRW5kaWFuU3RydWN0dXJlCiAgICAgICAgIGVsc2U6CkBAIC0xOTgsMTcgKzE5OCwyMCBAQAogICAgICAgICAgICAgcGFzcwogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIFMsICJfZmllbGRzXyIsIFsoInMiLCBUKV0pCiAKLSAgICAjIGNyYXNoZXMgb24gc29sYXJpcyB3aXRoIGEgY29yZSBkdW1wLgotICAgIGRlZiBYX3Rlc3Rfc3RydWN0X2ZpZWxkcyhzZWxmKToKKyAgICBkZWYgdGVzdF9zdHJ1Y3RfZmllbGRzXzIoc2VsZik6CisgICAgICAgICMgc3RhbmRhcmQgcGFja2luZyBpbiBzdHJ1Y3QgdXNlcyBubyBhbGlnbm1lbnQuCisgICAgICAgICMgU28sIHdlIGhhdmUgdG8gYWxpZ24gdXNpbmcgcGFkIGJ5dGVzLgorICAgICAgICAjCisgICAgICAgICMgVW5hbGlnbmVkIGFjY2Vzc2VzIHdpbGwgY3Jhc2ggUHl0aG9uIChvbiB0aG9zZSBwbGF0Zm9ybXMgdGhhdAorICAgICAgICAjIGRvbid0IGFsbG93IGl0LCBsaWtlIHNwYXJjIHNvbGFyaXMpLgogICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgogICAgICAgICAgICAgYmFzZSA9IEJpZ0VuZGlhblN0cnVjdHVyZQotICAgICAgICAgICAgZm10ID0gIj5iaGlkIgorICAgICAgICAgICAgZm10ID0gIj5ieGhpZCIKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGJhc2UgPSBMaXR0bGVFbmRpYW5TdHJ1Y3R1cmUKLSAgICAgICAgICAgIGZtdCA9ICI8YmhpZCIKKyAgICAgICAgICAgIGZtdCA9ICI8YnhoaWQiCiAKICAgICAgICAgY2xhc3MgUyhiYXNlKToKLSAgICAgICAgICAgIF9wYWNrXyA9IDEgIyBzdHJ1Y3Qgd2l0aCAnPCcgb3IgJz4nIHVzZXMgc3RhbmRhcmQgYWxpZ25tZW50LgogICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJiIiwgY19ieXRlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgiaCIsIGNfc2hvcnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCJpIiwgY19pbnQpLApAQCAtMjE4LDUgKzIyMSw2MCBAQAogICAgICAgICBzMiA9IHN0cnVjdC5wYWNrKGZtdCwgMHgxMiwgMHgxMjM0LCAweDEyMzQ1Njc4LCAzLjE0KQogICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oczEpLCBiaW4oczIpKQogCisgICAgZGVmIHRlc3RfdW5hbGlnbmVkX25vbm5hdGl2ZV9zdHJ1Y3RfZmllbGRzKHNlbGYpOgorICAgICAgICBpZiBzeXMuYnl0ZW9yZGVyID09ICJsaXR0bGUiOgorICAgICAgICAgICAgYmFzZSA9IEJpZ0VuZGlhblN0cnVjdHVyZQorICAgICAgICAgICAgZm10ID0gIj5iIGggeGkgeGQiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiYXNlID0gTGl0dGxlRW5kaWFuU3RydWN0dXJlCisgICAgICAgICAgICBmbXQgPSAiPGIgaCB4aSB4ZCIKKworICAgICAgICBjbGFzcyBTKGJhc2UpOgorICAgICAgICAgICAgX3BhY2tfID0gMQorICAgICAgICAgICAgX2ZpZWxkc18gPSBbKCJiIiwgY19ieXRlKSwKKworICAgICAgICAgICAgICAgICAgICAgICAgKCJoIiwgY19zaG9ydCksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICgiXzEiLCBjX2J5dGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCJpIiwgY19pbnQpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAoIl8yIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiZCIsIGNfZG91YmxlKV0KKworICAgICAgICBzMSA9IFMoKQorICAgICAgICBzMS5iID0gMHgxMgorICAgICAgICBzMS5oID0gMHgxMjM0CisgICAgICAgIHMxLmkgPSAweDEyMzQ1Njc4CisgICAgICAgIHMxLmQgPSAzLjE0CisgICAgICAgIHMyID0gc3RydWN0LnBhY2soZm10LCAweDEyLCAweDEyMzQsIDB4MTIzNDU2NzgsIDMuMTQpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGJpbihzMSksIGJpbihzMikpCisKKyAgICBkZWYgdGVzdF91bmFsaWduZWRfbmF0aXZlX3N0cnVjdF9maWVsZHMoc2VsZik6CisgICAgICAgIGlmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgICAgICAgICBmbXQgPSAiPGIgaCB4aSB4ZCIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJhc2UgPSBMaXR0bGVFbmRpYW5TdHJ1Y3R1cmUKKyAgICAgICAgICAgIGZtdCA9ICI+YiBoIHhpIHhkIgorCisgICAgICAgIGNsYXNzIFMoU3RydWN0dXJlKToKKyAgICAgICAgICAgIF9wYWNrXyA9IDEKKyAgICAgICAgICAgIF9maWVsZHNfID0gWygiYiIsIGNfYnl0ZSksCisKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaCIsIGNfc2hvcnQpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAoIl8xIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiaSIsIGNfaW50KSwKKworICAgICAgICAgICAgICAgICAgICAgICAgKCJfMiIsIGNfYnl0ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAoImQiLCBjX2RvdWJsZSldCisKKyAgICAgICAgczEgPSBTKCkKKyAgICAgICAgczEuYiA9IDB4MTIKKyAgICAgICAgczEuaCA9IDB4MTIzNAorICAgICAgICBzMS5pID0gMHgxMjM0NTY3OAorICAgICAgICBzMS5kID0gMy4xNAorICAgICAgICBzMiA9IHN0cnVjdC5wYWNrKGZtdCwgMHgxMiwgMHgxMjM0LCAweDEyMzQ1Njc4LCAzLjE0KQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChiaW4oczEpLCBiaW4oczIpKQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfY2Z1bmNzLnB5CmluZGV4IDdjMmIyOGIuLjZlMDc5OGQgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2NmdW5jcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9jZnVuY3MucHkKQEAgLTE3OSw3ICsxNzksNyBAQAogICAgICAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CiAgICAgICAgICAgICBpZiBuYW1lWzoyXSA9PSAnX18nIGFuZCBuYW1lWy0yOl0gPT0gJ19fJzoKICAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgbmFtZQotICAgICAgICAgICAgZnVuYyA9IHNlbGYuX0Z1bmNQdHIoInNfIiArIG5hbWUsIHNlbGYpCisgICAgICAgICAgICBmdW5jID0gc2VsZi5fRnVuY1B0cigoInNfIiArIG5hbWUsIHNlbGYpKQogICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBmdW5jKQogICAgICAgICAgICAgcmV0dXJuIGZ1bmMKIApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3Rfa2VlcHJlZnMucHkgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9rZWVwcmVmcy5weQppbmRleCAzOWU3MGUzLi43MzE4ZjI5IDEwMDY0NAotLS0gYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9rZWVwcmVmcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9rZWVwcmVmcy5weQpAQCAtMTQwLDUgKzE0MCwxMCBAQAogICAgICAgICByLmFbMF0ueCA9IDQyCiAgICAgICAgIHIuYVswXS55ID0gOTkKIAorICAgICAgICAjIHRvIGF2b2lkIGxlYWtpbmcgd2hlbiB0ZXN0cyBhcmUgcnVuIHNldmVyYWwgdGltZXMKKyAgICAgICAgIyBjbGVhbiB1cCB0aGUgdHlwZXMgbGVmdCBpbiB0aGUgY2FjaGUuCisgICAgICAgIGZyb20gY3R5cGVzIGltcG9ydCBfcG9pbnRlcl90eXBlX2NhY2hlCisgICAgICAgIGRlbCBfcG9pbnRlcl90eXBlX2NhY2hlW1BPSU5UXQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X2xvYWRpbmcucHkKaW5kZXggODA1NjRiOC4uNDU1ODQxNyAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfbG9hZGluZy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9sb2FkaW5nLnB5CkBAIC0yLDQwICsyLDcyIEBACiBpbXBvcnQgc3lzLCB1bml0dGVzdAogaW1wb3J0IG9zLCBTdHJpbmdJTwogCitsaWJjX25hbWUgPSBOb25lCitpZiBvcy5uYW1lID09ICJudCI6CisgICAgbGliY19uYW1lID0gIm1zdmNydCIKK2VsaWYgb3MubmFtZSA9PSAiY2UiOgorICAgIGxpYmNfbmFtZSA9ICJjb3JlZGxsIgorZWxpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgbGliY19uYW1lID0gImxpYmMuZHlsaWIiCitlbGlmIHN5cy5wbGF0Zm9ybSA9PSAiY3lnd2luIjoKKyAgICBsaWJjX25hbWUgPSAiY3lnd2luMS5kbGwiCitlbHNlOgorICAgIGZvciBsaW5lIGluIG9zLnBvcGVuKCJsZGQgJXMiICUgc3lzLmV4ZWN1dGFibGUpOgorICAgICAgICBpZiAibGliYy5zbyIgaW4gbGluZToKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAib3BlbmJzZDMiOgorICAgICAgICAgICAgICAgIGxpYmNfbmFtZSA9IGxpbmUuc3BsaXQoKVs0XQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBsaWJjX25hbWUgPSBsaW5lLnNwbGl0KClbMl0KKyMjICAgICAgICAgICAgcHJpbnQgImxpYmNfbmFtZSBpcyIsIGxpYmNfbmFtZQorICAgICAgICAgICAgYnJlYWsKKwogY2xhc3MgTG9hZGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICB1bmtub3duZGxsID0gInh4cmFuZG9tbmFtZXh4IgogCi0gICAgZGVmIHRlc3RfbG9hZChzZWxmKToKLSAgICAgICAgaWYgb3MubmFtZSA9PSAibnQiOgotICAgICAgICAgICAgbmFtZSA9ICJtc3ZjcnQiCi0gICAgICAgIGVsaWYgb3MubmFtZSA9PSAiY2UiOgotICAgICAgICAgICAgbmFtZSA9ICJjb3JlZGxsIgotICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKLSAgICAgICAgICAgIG5hbWUgPSAibGliYy5keWxpYiIKLSAgICAgICAgZWxpZiBzeXMucGxhdGZvcm0uc3RhcnRzd2l0aCgiZnJlZWJzZCIpOgotICAgICAgICAgICAgbmFtZSA9ICJsaWJjLnNvIgotICAgICAgICBlbGlmIHN5cy5wbGF0Zm9ybSA9PSAic3Vub3M1IjoKLSAgICAgICAgICAgIG5hbWUgPSAibGliYy5zbyIKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG5hbWUgPSAibGliYy5zby42IgotICAgICAgICBjZGxsLmxvYWQobmFtZSkKLSAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgY2RsbC5sb2FkLCBzZWxmLnVua25vd25kbGwpCisgICAgaWYgbGliY19uYW1lIGlzIG5vdCBOb25lOgorICAgICAgICBkZWYgdGVzdF9sb2FkKHNlbGYpOgorICAgICAgICAgICAgY2RsbC5sb2FkKGxpYmNfbmFtZSkKKyAgICAgICAgICAgIGNkbGwubG9hZChvcy5wYXRoLmJhc2VuYW1lKGxpYmNfbmFtZSkpCisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjZGxsLmxvYWQsIHNlbGYudW5rbm93bmRsbCkKIAotICAgIGRlZiB0ZXN0X2xvYWRfdmVyc2lvbihzZWxmKToKLSAgICAgICAgdmVyc2lvbiA9ICI2IgotICAgICAgICBuYW1lID0gImMiCi0gICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAibGludXgyIjoKLSAgICAgICAgICAgIGNkbGwubG9hZF92ZXJzaW9uKG5hbWUsIHZlcnNpb24pCisgICAgaWYgbGliY19uYW1lIGlzIG5vdCBOb25lIGFuZCBvcy5wYXRoLmJhc2VuYW1lKGxpYmNfbmFtZSkgPT0gImxpYmMuc28uNiI6CisgICAgICAgIGRlZiB0ZXN0X2xvYWRfdmVyc2lvbihzZWxmKToKKyAgICAgICAgICAgIGNkbGwubG9hZF92ZXJzaW9uKCJjIiwgIjYiKQogICAgICAgICAgICAgIyBsaW51eCB1c2VzIHZlcnNpb24sIGxpYmMgOSBzaG91bGQgbm90IGV4aXN0Ci0gICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjZGxsLmxvYWRfdmVyc2lvbiwgbmFtZSwgIjkiKQotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPU0Vycm9yLCBjZGxsLmxvYWRfdmVyc2lvbiwgc2VsZi51bmtub3duZGxsLCAiIikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwubG9hZF92ZXJzaW9uLCAiYyIsICI5IikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwubG9hZF92ZXJzaW9uLCBzZWxmLnVua25vd25kbGwsICIiKQogCi0gICAgaWYgb3MubmFtZSA9PSAicG9zaXgiIGFuZCBzeXMucGxhdGZvcm0gIT0gInN1bm9zNSI6CiAgICAgICAgIGRlZiB0ZXN0X2ZpbmQoc2VsZik6CiAgICAgICAgICAgICBuYW1lID0gImMiCiAgICAgICAgICAgICBjZGxsLmZpbmQobmFtZSkKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIGNkbGwuZmluZCwgc2VsZi51bmtub3duZGxsKQogCisgICAgaWYgb3MubmFtZSBpbiAoIm50IiwgImNlIik6CisgICAgICAgIGRlZiB0ZXN0X2xvYWRfbGlicmFyeShzZWxmKToKKyAgICAgICAgICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKKyAgICAgICAgICAgICAgICB3aW5kbGwubG9hZF9saWJyYXJ5KCJrZXJuZWwzMiIpLkdldE1vZHVsZUhhbmRsZVcKKyAgICAgICAgICAgICAgICB3aW5kbGwuTG9hZExpYnJhcnkoImtlcm5lbDMyIikuR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgICAgIFdpbkRMTCgia2VybmVsMzIiKS5HZXRNb2R1bGVIYW5kbGVXCisgICAgICAgICAgICBlbGlmIG9zLm5hbWUgPT0gImNlIjoKKyAgICAgICAgICAgICAgICB3aW5kbGwubG9hZF9saWJyYXJ5KCJjb3JlZGxsIikuR2V0TW9kdWxlSGFuZGxlVworICAgICAgICAgICAgICAgIHdpbmRsbC5Mb2FkTGlicmFyeSgiY29yZWRsbCIpLkdldE1vZHVsZUhhbmRsZVcKKyAgICAgICAgICAgICAgICBXaW5ETEwoImNvcmVkbGwiKS5HZXRNb2R1bGVIYW5kbGVXCisKKyAgICAgICAgZGVmIHRlc3RfbG9hZF9vcmRpbmFsX2Z1bmN0aW9ucyhzZWxmKToKKyAgICAgICAgICAgIGltcG9ydCBfY3R5cGVzX3Rlc3QKKyAgICAgICAgICAgIGRsbCA9IFdpbkRMTChfY3R5cGVzX3Rlc3QuX19maWxlX18pCisgICAgICAgICAgICAjIFdlIGxvYWQgdGhlIHNhbWUgZnVuY3Rpb24gYm90aCB2aWEgb3JkaW5hbCBhbmQgbmFtZQorICAgICAgICAgICAgZnVuY19vcmQgPSBkbGxbMl0KKyAgICAgICAgICAgIGZ1bmNfbmFtZSA9IGRsbC5HZXRTdHJpbmcKKyAgICAgICAgICAgICMgYWRkcmVzc29mIGdldHMgdGhlIGFkZHJlc3Mgd2hlcmUgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaXMgc3RvcmVkCisgICAgICAgICAgICBhX29yZCA9IGFkZHJlc3NvZihmdW5jX29yZCkKKyAgICAgICAgICAgIGFfbmFtZSA9IGFkZHJlc3NvZihmdW5jX25hbWUpCisgICAgICAgICAgICBmX29yZF9hZGRyID0gY192b2lkX3AuZnJvbV9hZGRyZXNzKGFfb3JkKS52YWx1ZQorICAgICAgICAgICAgZl9uYW1lX2FkZHIgPSBjX3ZvaWRfcC5mcm9tX2FkZHJlc3MoYV9uYW1lKS52YWx1ZQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoaGV4KGZfb3JkX2FkZHIpLCBoZXgoZl9uYW1lX2FkZHIpKQorCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoQXR0cmlidXRlRXJyb3IsIGRsbC5fX2dldGl0ZW1fXywgMTIzNCkKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3BvaW50ZXJzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkKaW5kZXggNjE3MmFiYi4uM2EzMjRhNiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9pbnRlcnMucHkKQEAgLTE2Niw2ICsxNjYsMTggQEAKICAgICAgICAgcmVzdWx0ID0gZnVuYyggYnlyZWYoYXJnYyksIGFyZ3YgKQogICAgICAgICBhc3NlcnQgcmVzdWx0ID09ICd3b3JsZCcsIHJlc3VsdAogCisgICAgZGVmIHRlc3RfYnVnXzE0Njc4NTIoc2VsZik6CisgICAgICAgICMgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyLz9mdW5jPWRldGFpbCZhdGlkPTUzMjE1NCZhaWQ9MTQ2Nzg1MiZncm91cF9pZD03MTcwMgorICAgICAgICB4ID0gY19pbnQoNSkKKyAgICAgICAgZHVtbXkgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgzMjAwMCk6CisgICAgICAgICAgICBkdW1teS5hcHBlbmQoY19pbnQoaSkpCisgICAgICAgIHkgPSBjX2ludCg2KQorICAgICAgICBwID0gcG9pbnRlcih4KQorICAgICAgICBwcCA9IHBvaW50ZXIocCkKKyAgICAgICAgcSA9IHBvaW50ZXIoeSkKKyAgICAgICAgcHBbMF0gPSBxICAgICAgICAgIyA8PT0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocFswXSwgNikKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Bvc2l4LnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9zaXgucHkKaW5kZXggMmI0ZmRmZi4uZmUwYTQwYSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9zaXgucHkKKysrIGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcG9zaXgucHkKQEAgLTgsOCArOCwxMCBAQAogCiAgICAgY2xhc3MgVGVzdFJUTERfR0xPQkFMKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICAgICAgZGVmIHRlc3RfR0woc2VsZik6Ci0gICAgICAgICAgICBjZGxsLmxvYWQoJ2xpYkdMLnNvJywgbW9kZT1SVExEX0dMT0JBTCkKLSAgICAgICAgICAgIGNkbGwubG9hZCgnbGliR0xVLnNvJykKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKCcvdXNyL2xpYi9saWJHTC5zbycpOgorICAgICAgICAgICAgICAgIGNkbGwubG9hZCgnbGliR0wuc28nLCBtb2RlPVJUTERfR0xPQkFMKQorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoJy91c3IvbGliL2xpYkdMVS5zbycpOgorICAgICAgICAgICAgICAgIGNkbGwubG9hZCgnbGliR0xVLnNvJykKIAogIyNpZiBvcy5uYW1lID09ICJwb3NpeCIgYW5kIHN5cy5wbGF0Zm9ybSAhPSAiZGFyd2luIjoKIApkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3Byb3RvdHlwZXMucHkKaW5kZXggMmMzZDc1Yi4uNDdmNWRhMSAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcHJvdG90eXBlcy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9wcm90b3R5cGVzLnB5CkBAIC0yNCw2ICsyNCwxOSBAQAogaW1wb3J0IF9jdHlwZXNfdGVzdAogdGVzdGRsbCA9IGNkbGwubG9hZChfY3R5cGVzX3Rlc3QuX19maWxlX18pCiAKKyMgUmV0dXJuIG1hY2hpbmUgYWRkcmVzcyBgYWAgYXMgYSAocG9zc2libHkgbG9uZykgbm9uLW5lZ2F0aXZlIGludGVnZXIuCisjIFN0YXJ0aW5nIHdpdGggUHl0aG9uIDIuNSwgaWQoYW55dGhpbmcpIGlzIGFsd2F5cyBub24tbmVnYXRpdmUsIGFuZAorIyB0aGUgY3R5cGVzIGFkZHJlc3NvZigpIGluaGVyaXRzIHRoYXQgdmlhIFB5TG9uZ19Gcm9tVm9pZFB0cigpLgorZGVmIHBvc2l0aXZlX2FkZHJlc3MoYSk6CisgICAgaWYgYSA+PSAwOgorICAgICAgICByZXR1cm4gYQorICAgICMgVmlldyB0aGUgYml0cyBpbiBgYWAgYXMgdW5zaWduZWQgaW5zdGVhZC4KKyAgICBpbXBvcnQgc3RydWN0CisgICAgbnVtX2JpdHMgPSBzdHJ1Y3QuY2FsY3NpemUoIlAiKSAqIDggIyBudW0gYml0cyBpbiBuYXRpdmUgbWFjaGluZSBhZGRyZXNzCisgICAgYSArPSAxTCA8PCBudW1fYml0cworICAgIGFzc2VydCBhID49IDAKKyAgICByZXR1cm4gYQorCiBkZWYgY193YnVmZmVyKGluaXQpOgogICAgIG4gPSBsZW4oaW5pdCkgKyAxCiAgICAgcmV0dXJuIChjX3djaGFyICogbikoKmluaXQpCkBAIC00Myw3ICs1Niw4IEBACiAgICAgICAgIGNpID0gY19pbnQoMCkKIAogICAgICAgICBmdW5jLmFyZ3R5cGVzID0gUE9JTlRFUihjX2ludCksCi0gICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGFkZHJlc3NvZihjaSksIGZ1bmMoYnlyZWYoY2kpKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocG9zaXRpdmVfYWRkcmVzcyhhZGRyZXNzb2YoY2kpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfYWRkcmVzcyhmdW5jKGJ5cmVmKGNpKSkpKQogCiAgICAgICAgIGZ1bmMuYXJndHlwZXMgPSBjX2NoYXJfcCwKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoQXJndW1lbnRFcnJvciwgZnVuYywgYnlyZWYoY2kpKQpkaWZmIC0tZ2l0IGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3JhbmRvbV90aGluZ3MucHkKaW5kZXggY2Q1MGNhOC4uNzhhNjY1YiAxMDA2NDQKLS0tIGEvTGliL2N0eXBlcy90ZXN0L3Rlc3RfcmFuZG9tX3RoaW5ncy5weQorKysgYi9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9yYW5kb21fdGhpbmdzLnB5CkBAIC01MSwxNiArNTEsMTQgQEAKICAgICBkZWYgdGVzdF9JbnRlZ2VyRGl2aXNpb25FcnJvcihzZWxmKToKICAgICAgICAgY2IgPSBDRlVOQ1RZUEUoY19pbnQsIGNfaW50KShjYWxsYmFja19mdW5jKQogICAgICAgICBvdXQgPSBzZWxmLmNhcHR1cmVfc3RkZXJyKGNiLCAwKQotICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvdXQuc3BsaXRsaW5lcygpWy0xXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplcm9EaXZpc2lvbkVycm9yOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV1bOjE5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlplcm9EaXZpc2lvbkVycm9yOiAiKQogCiAgICAgZGVmIHRlc3RfRmxvYXREaXZpc2lvbkVycm9yKHNlbGYpOgogICAgICAgICBjYiA9IENGVU5DVFlQRShjX2ludCwgY19kb3VibGUpKGNhbGxiYWNrX2Z1bmMpCiAgICAgICAgIG91dCA9IHNlbGYuY2FwdHVyZV9zdGRlcnIoY2IsIDAuMCkKLSAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwob3V0LnNwbGl0bGluZXMoKVstMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJaZXJvRGl2aXNpb25FcnJvcjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmxvYXQgZGl2aXNpb24iKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChvdXQuc3BsaXRsaW5lcygpWy0xXVs6MTldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWmVyb0RpdmlzaW9uRXJyb3I6ICIpCiAKICAgICBkZWYgdGVzdF9UeXBlRXJyb3JEaXZpc2lvbkVycm9yKHNlbGYpOgogICAgICAgICBjYiA9IENGVU5DVFlQRShjX2ludCwgY19jaGFyX3ApKGNhbGxiYWNrX2Z1bmMpCmRpZmYgLS1naXQgYS9MaWIvY3R5cGVzL3Rlc3QvdGVzdF9zaXplcy5weSBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CmluZGV4IDZmYjljYTAuLjIwOGMwMGUgMTAwNjQ0Ci0tLSBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3NpemVzLnB5CkBAIC0yMCw1ICsyMCw4IEBACiAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDgsIHNpemVvZihjX2ludDY0KSkKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoOCwgc2l6ZW9mKGNfdWludDY0KSkKIAorICAgIGRlZiB0ZXN0X3NpemVfdChzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2l6ZW9mKGNfdm9pZF9wKSwgc2l6ZW9mKGNfc2l6ZV90KSkKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKICAgICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3VuYWxpZ25lZF9zdHJ1Y3R1cmVzLnB5IGIvTGliL2N0eXBlcy90ZXN0L3Rlc3RfdW5hbGlnbmVkX3N0cnVjdHVyZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzNDNiYQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9jdHlwZXMvdGVzdC90ZXN0X3VuYWxpZ25lZF9zdHJ1Y3R1cmVzLnB5CkBAIC0wLDAgKzEsNDUgQEAKK2ltcG9ydCBzeXMsIHVuaXR0ZXN0Citmcm9tIGN0eXBlcyBpbXBvcnQgKgorCitzdHJ1Y3R1cmVzID0gW10KK2J5dGVzd2FwcGVkX3N0cnVjdHVyZXMgPSBbXQorCisKK2lmIHN5cy5ieXRlb3JkZXIgPT0gImxpdHRsZSI6CisgICAgU3dhcHBlZFN0cnVjdHVyZSA9IEJpZ0VuZGlhblN0cnVjdHVyZQorZWxzZToKKyAgICBTd2FwcGVkU3RydWN0dXJlID0gTGl0dGxlRW5kaWFuU3RydWN0dXJlCisKK2ZvciB0eXAgaW4gW2Nfc2hvcnQsIGNfaW50LCBjX2xvbmcsIGNfbG9uZ2xvbmcsCisgICAgICAgICAgICBjX2Zsb2F0LCBjX2RvdWJsZSwKKyAgICAgICAgICAgIGNfdXNob3J0LCBjX3VpbnQsIGNfdWxvbmcsIGNfdWxvbmdsb25nXToKKyAgICBjbGFzcyBYKFN0cnVjdHVyZSk6CisgICAgICAgIF9wYWNrXyA9IDEKKyAgICAgICAgX2ZpZWxkc18gPSBbKCJwYWQiLCBjX2J5dGUpLAorICAgICAgICAgICAgICAgICAgICAoInZhbHVlIiwgdHlwKV0KKyAgICBjbGFzcyBZKFN3YXBwZWRTdHJ1Y3R1cmUpOgorICAgICAgICBfcGFja18gPSAxCisgICAgICAgIF9maWVsZHNfID0gWygicGFkIiwgY19ieXRlKSwKKyAgICAgICAgICAgICAgICAgICAgKCJ2YWx1ZSIsIHR5cCldCisgICAgc3RydWN0dXJlcy5hcHBlbmQoWCkKKyAgICBieXRlc3dhcHBlZF9zdHJ1Y3R1cmVzLmFwcGVuZChZKQorCitjbGFzcyBUZXN0U3RydWN0dXJlcyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbmF0aXZlKHNlbGYpOgorICAgICAgICBmb3IgdHlwIGluIHN0cnVjdHVyZXM6CisjIyAgICAgICAgICAgIHByaW50IHR5cC52YWx1ZQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwLnZhbHVlLm9mZnNldCwgMSkKKyAgICAgICAgICAgIG8gPSB0eXAoKQorICAgICAgICAgICAgby52YWx1ZSA9IDQKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG8udmFsdWUsIDQpCisKKyAgICBkZWYgdGVzdF9zd2FwcGVkKHNlbGYpOgorICAgICAgICBmb3IgdHlwIGluIGJ5dGVzd2FwcGVkX3N0cnVjdHVyZXM6CisjIyAgICAgICAgICAgIHByaW50ID4+IHN5cy5zdGRlcnIsIHR5cC52YWx1ZQorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwLnZhbHVlLm9mZnNldCwgMSkKKyAgICAgICAgICAgIG8gPSB0eXAoKQorICAgICAgICAgICAgby52YWx1ZSA9IDQKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKG8udmFsdWUsIDQpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfZXh0LnB5IGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL2J1aWxkX2V4dC5weQppbmRleCA2ZWE1ZDU3Li41NzcxMjUyIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvYnVpbGRfZXh0LnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9idWlsZF9leHQucHkKQEAgLTE4NSw3ICsxODUsOSBAQAogCiAgICAgICAgICMgZm9yIGV4dGVuc2lvbnMgdW5kZXIgQ3lnd2luIGFuZCBBdGhlT1MgUHl0aG9uJ3MgbGlicmFyeSBkaXJlY3RvcnkgbXVzdCBiZQogICAgICAgICAjIGFwcGVuZGVkIHRvIGxpYnJhcnlfZGlycwotICAgICAgICBpZiBzeXMucGxhdGZvcm1bOjZdID09ICdjeWd3aW4nIG9yIHN5cy5wbGF0Zm9ybVs6Nl0gPT0gJ2F0aGVvcyc6CisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybVs6Nl0gPT0gJ2N5Z3dpbicgb3Igc3lzLnBsYXRmb3JtWzo2XSA9PSAnYXRoZW9zJyBvciBcCisgICAgICAgICAgICAgICAoc3lzLnBsYXRmb3JtLnN0YXJ0c3dpdGgoJ2xpbnV4JykgYW5kCisgICAgICAgICAgICAgICAgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdQeV9FTkFCTEVfU0hBUkVEJykpOgogICAgICAgICAgICAgaWYgc3RyaW5nLmZpbmQoc3lzLmV4ZWN1dGFibGUsIHN5cy5leGVjX3ByZWZpeCkgIT0gLTE6CiAgICAgICAgICAgICAgICAgIyBidWlsZGluZyB0aGlyZCBwYXJ0eSBleHRlbnNpb25zCiAgICAgICAgICAgICAgICAgc2VsZi5saWJyYXJ5X2RpcnMuYXBwZW5kKG9zLnBhdGguam9pbihzeXMucHJlZml4LCAibGliIiwKQEAgLTY4OCw2ICs2OTAsMTMgQEAKICAgICAgICAgICAgICMgZXh0ZW5zaW9ucywgaXQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9yaWdpbmFsIGxpc3QKICAgICAgICAgICAgIHJldHVybiBleHQubGlicmFyaWVzICsgW3B5dGhvbmxpYiwgIm0iXSArIGV4dHJhCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gZXh0LmxpYnJhcmllcworICAgICAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IHN5c2NvbmZpZworICAgICAgICAgICAgaWYgc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdQeV9FTkFCTEVfU0hBUkVEJyk6CisgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSAicHl0aG9uJWQuJWQiCisgICAgICAgICAgICAgICAgcHl0aG9ubGliID0gKHRlbXBsYXRlICUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN5cy5oZXh2ZXJzaW9uID4+IDI0LCAoc3lzLmhleHZlcnNpb24gPj4gMTYpICYgMHhmZikpCisgICAgICAgICAgICAgICAgcmV0dXJuIGV4dC5saWJyYXJpZXMgKyBbcHl0aG9ubGliXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gZXh0LmxpYnJhcmllcwogCiAjIGNsYXNzIGJ1aWxkX2V4dApkaWZmIC0tZ2l0IGEvTGliL2Rpc3R1dGlscy9jb21tYW5kL2luc3RhbGwucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQppbmRleCA3NzIzNzYxLi40NTMxNTFkIDEwMDY0NAotLS0gYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbC5weQpAQCAtNjAxLDYgKzYwMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICgnaW5zdGFsbF9oZWFkZXJzJywgaGFzX2hlYWRlcnMpLAogICAgICAgICAgICAgICAgICAgICAoJ2luc3RhbGxfc2NyaXB0cycsIGhhc19zY3JpcHRzKSwKICAgICAgICAgICAgICAgICAgICAgKCdpbnN0YWxsX2RhdGEnLCAgICBoYXNfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICgnaW5zdGFsbF9lZ2dfaW5mbycsIGxhbWJkYSBzZWxmOlRydWUpLAogICAgICAgICAgICAgICAgICAgIF0KIAogIyBjbGFzcyBpbnN0YWxsCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weSBiL0xpYi9kaXN0dXRpbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMWFjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weQpAQCAtMCwwICsxLDc1IEBACisiIiJkaXN0dXRpbHMuY29tbWFuZC5pbnN0YWxsX2VnZ19pbmZvCisKK0ltcGxlbWVudHMgdGhlIERpc3R1dGlscyAnaW5zdGFsbF9lZ2dfaW5mbycgY29tbWFuZCwgZm9yIGluc3RhbGxpbmcKK2EgcGFja2FnZSdzIFBLRy1JTkZPIG1ldGFkYXRhLiIiIgorCisKK2Zyb20gZGlzdHV0aWxzLmNtZCBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZywgZGlyX3V0aWwKK2ltcG9ydCBvcywgc3lzLCByZQorCitjbGFzcyBpbnN0YWxsX2VnZ19pbmZvKENvbW1hbmQpOgorICAgICIiIkluc3RhbGwgYW4gLmVnZy1pbmZvIGZpbGUgZm9yIHRoZSBwYWNrYWdlIiIiCisKKyAgICBkZXNjcmlwdGlvbiA9ICJJbnN0YWxsIHBhY2thZ2UncyBQS0ctSU5GTyBtZXRhZGF0YSBhcyBhbiAuZWdnLWluZm8gZmlsZSIKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnaW5zdGFsbC1kaXI9JywgJ2QnLCAiZGlyZWN0b3J5IHRvIGluc3RhbGwgdG8iKSwKKyAgICBdCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsX2xpYicsKCdpbnN0YWxsX2RpcicsJ2luc3RhbGxfZGlyJykpCisgICAgICAgIGJhc2VuYW1lID0gIiVzLSVzLXB5JXMuZWdnLWluZm8iICUgKAorICAgICAgICAgICAgdG9fZmlsZW5hbWUoc2FmZV9uYW1lKHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCkpKSwKKyAgICAgICAgICAgIHRvX2ZpbGVuYW1lKHNhZmVfdmVyc2lvbihzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfdmVyc2lvbigpKSksCisgICAgICAgICAgICBzeXMudmVyc2lvbls6M10KKyAgICAgICAgKQorICAgICAgICBzZWxmLnRhcmdldCA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCBiYXNlbmFtZSkKKyAgICAgICAgc2VsZi5vdXRwdXRzID0gW3NlbGYudGFyZ2V0XQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgdGFyZ2V0ID0gc2VsZi50YXJnZXQKKyAgICAgICAgaWYgb3MucGF0aC5pc2Rpcih0YXJnZXQpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsodGFyZ2V0KToKKyAgICAgICAgICAgIGRpcl91dGlsLnJlbW92ZV90cmVlKHRhcmdldCwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHModGFyZ2V0KToKKyAgICAgICAgICAgIHNlbGYuZXhlY3V0ZShvcy51bmxpbmssKHNlbGYudGFyZ2V0LCksIlJlbW92aW5nICIrdGFyZ2V0KQorICAgICAgICBsb2cuaW5mbygiV3JpdGluZyAlcyIsIHRhcmdldCkKKyAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgIGYgPSBvcGVuKHRhcmdldCwgJ3cnKQorICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24ubWV0YWRhdGEud3JpdGVfcGtnX2ZpbGUoZikKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5vdXRwdXRzCisKKworIyBUaGUgZm9sbG93aW5nIHJvdXRpbmVzIGFyZSB0YWtlbiBmcm9tIHNldHVwdG9vbHMnIHBrZ19yZXNvdXJjZXMgbW9kdWxlIGFuZAorIyBjYW4gYmUgcmVwbGFjZWQgYnkgaW1wb3J0aW5nIHRoZW0gZnJvbSBwa2dfcmVzb3VyY2VzIG9uY2UgaXQgaXMgaW5jbHVkZWQKKyMgaW4gdGhlIHN0ZGxpYi4KKworZGVmIHNhZmVfbmFtZShuYW1lKToKKyAgICAiIiJDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCBkaXN0cmlidXRpb24gbmFtZQorCisgICAgQW55IHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpYy8uIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgJy0nLgorICAgICIiIgorICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Ll0rJywgJy0nLCBuYW1lKQorCisKK2RlZiBzYWZlX3ZlcnNpb24odmVyc2lvbik6CisgICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgdmVyc2lvbiBzdHJpbmcKKworICAgIFNwYWNlcyBiZWNvbWUgZG90cywgYW5kIGFsbCBvdGhlciBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYmVjb21lCisgICAgZGFzaGVzLCB3aXRoIHJ1bnMgb2YgbXVsdGlwbGUgZGFzaGVzIGNvbmRlbnNlZCB0byBhIHNpbmdsZSBkYXNoLgorICAgICIiIgorICAgIHZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoJyAnLCcuJykKKyAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICctJywgdmVyc2lvbikKKworCitkZWYgdG9fZmlsZW5hbWUobmFtZSk6CisgICAgIiIiQ29udmVydCBhIHByb2plY3Qgb3IgdmVyc2lvbiBuYW1lIHRvIGl0cyBmaWxlbmFtZS1lc2NhcGVkIGZvcm0KKworICAgIEFueSAnLScgY2hhcmFjdGVycyBhcmUgY3VycmVudGx5IHJlcGxhY2VkIHdpdGggJ18nLgorICAgICIiIgorICAgIHJldHVybiBuYW1lLnJlcGxhY2UoJy0nLCdfJykKZGlmZiAtLWdpdCBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHkgYi9MaWIvZGlzdHV0aWxzL2NvbW1hbmQvdXBsb2FkLnB5CmluZGV4IDYyNzY3YTMuLjZmNGNlODEgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvY29tbWFuZC91cGxvYWQucHkKKysrIGIvTGliL2Rpc3R1dGlscy9jb21tYW5kL3VwbG9hZC5weQpAQCAtMjksNiArMjksNyBAQAogICAgICAgICAgJ2Rpc3BsYXkgZnVsbCByZXNwb25zZSB0ZXh0IGZyb20gc2VydmVyJyksCiAgICAgICAgICgnc2lnbicsICdzJywKICAgICAgICAgICdzaWduIGZpbGVzIHRvIHVwbG9hZCB1c2luZyBncGcnKSwKKyAgICAgICAgKCdpZGVudGl0eT0nLCAnaScsICdHUEcgaWRlbnRpdHkgdXNlZCB0byBzaWduIGZpbGVzJyksCiAgICAgICAgIF0KICAgICBib29sZWFuX29wdGlvbnMgPSBbJ3Nob3ctcmVzcG9uc2UnLCAnc2lnbiddCiAKQEAgLTM4LDggKzM5LDEzIEBACiAgICAgICAgIHNlbGYucmVwb3NpdG9yeSA9ICcnCiAgICAgICAgIHNlbGYuc2hvd19yZXNwb25zZSA9IDAKICAgICAgICAgc2VsZi5zaWduID0gRmFsc2UKKyAgICAgICAgc2VsZi5pZGVudGl0eSA9IE5vbmUKIAogICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmlkZW50aXR5IGFuZCBub3Qgc2VsZi5zaWduOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIk11c3QgdXNlIC0tc2lnbiBmb3IgLS1pZGVudGl0eSB0byBoYXZlIG1lYW5pbmciCisgICAgICAgICAgICApCiAgICAgICAgIGlmIG9zLmVudmlyb24uaGFzX2tleSgnSE9NRScpOgogICAgICAgICAgICAgcmMgPSBvcy5wYXRoLmpvaW4ob3MuZW52aXJvblsnSE9NRSddLCAnLnB5cGlyYycpCiAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhyYyk6CkBAIC02Nyw3ICs3MywxMCBAQAogICAgIGRlZiB1cGxvYWRfZmlsZShzZWxmLCBjb21tYW5kLCBweXZlcnNpb24sIGZpbGVuYW1lKToKICAgICAgICAgIyBTaWduIGlmIHJlcXVlc3RlZAogICAgICAgICBpZiBzZWxmLnNpZ246Ci0gICAgICAgICAgICBzcGF3bigoImdwZyIsICItLWRldGFjaC1zaWduIiwgIi1hIiwgZmlsZW5hbWUpLAorICAgICAgICAgICAgZ3BnX2FyZ3MgPSBbImdwZyIsICItLWRldGFjaC1zaWduIiwgIi1hIiwgZmlsZW5hbWVdCisgICAgICAgICAgICBpZiBzZWxmLmlkZW50aXR5OgorICAgICAgICAgICAgICAgIGdwZ19hcmdzWzI6Ml0gPSBbIi0tbG9jYWwtdXNlciIsIHNlbGYuaWRlbnRpdHldCisgICAgICAgICAgICBzcGF3bihncGdfYXJncywKICAgICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuKQogCiAgICAgICAgICMgRmlsbCBpbiB0aGUgZGF0YSAtIHNlbmQgYWxsIHRoZSBtZXRhLWRhdGEgaW4gY2FzZSB3ZSBuZWVkIHRvCmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL2xvZy5weSBiL0xpYi9kaXN0dXRpbHMvbG9nLnB5CmluZGV4IGNmM2VlMTMuLjk1ZDRjMWMgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvbG9nLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvbG9nLnB5CkBAIC0yMCw3ICsyMCwxMiBAQAogCiAgICAgZGVmIF9sb2coc2VsZiwgbGV2ZWwsIG1zZywgYXJncyk6CiAgICAgICAgIGlmIGxldmVsID49IHNlbGYudGhyZXNob2xkOgotICAgICAgICAgICAgcHJpbnQgbXNnICUgYXJncworICAgICAgICAgICAgaWYgbm90IGFyZ3M6CisgICAgICAgICAgICAgICAgIyBtc2cgbWF5IGNvbnRhaW4gYSAnJScuIElmIGFyZ3MgaXMgZW1wdHksCisgICAgICAgICAgICAgICAgIyBkb24ndCBldmVuIHRyeSB0byBzdHJpbmctZm9ybWF0CisgICAgICAgICAgICAgICAgcHJpbnQgbXNnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByaW50IG1zZyAlIGFyZ3MKICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQogCiAgICAgZGVmIGxvZyhzZWxmLCBsZXZlbCwgbXNnLCAqYXJncyk6CmRpZmYgLS1naXQgYS9MaWIvZGlzdHV0aWxzL3N5c2NvbmZpZy5weSBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CmluZGV4IGRjNjAzYmUuLjQ5NTM2ZjAgMTAwNjQ0Ci0tLSBhL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CisrKyBiL0xpYi9kaXN0dXRpbHMvc3lzY29uZmlnLnB5CkBAIC0zMSw3ICszMSw3IEBACiAKIHB5dGhvbl9idWlsZCA9IG9zLnBhdGguaXNmaWxlKGxhbmRtYXJrKQogCi1kZWwgYXJndjBfcGF0aCwgbGFuZG1hcmsKK2RlbCBsYW5kbWFyawogCiAKIGRlZiBnZXRfcHl0aG9uX3ZlcnNpb24oKToKQEAgLTE4NSw3ICsxODUsNyBAQAogZGVmIGdldF9jb25maWdfaF9maWxlbmFtZSgpOgogICAgICIiIlJldHVybiBmdWxsIHBhdGhuYW1lIG9mIGluc3RhbGxlZCBweWNvbmZpZy5oIGZpbGUuIiIiCiAgICAgaWYgcHl0aG9uX2J1aWxkOgotICAgICAgICBpbmNfZGlyID0gb3MuY3VyZGlyCisgICAgICAgIGluY19kaXIgPSBhcmd2MF9wYXRoCiAgICAgZWxzZToKICAgICAgICAgaW5jX2RpciA9IGdldF9weXRob25faW5jKHBsYXRfc3BlY2lmaWM9MSkKICAgICBpZiBnZXRfcHl0aG9uX3ZlcnNpb24oKSA8ICcyLjInOgpAQCAtMjEzLDggKzIxMyw4IEBACiAgICAgIiIiCiAgICAgaWYgZyBpcyBOb25lOgogICAgICAgICBnID0ge30KLSAgICBkZWZpbmVfcnggPSByZS5jb21waWxlKCIjZGVmaW5lIChbQS1aXVtBLVowLTlfXSspICguKilcbiIpCi0gICAgdW5kZWZfcnggPSByZS5jb21waWxlKCIvWypdICN1bmRlZiAoW0EtWl1bQS1aMC05X10rKSBbKl0vXG4iKQorICAgIGRlZmluZV9yeCA9IHJlLmNvbXBpbGUoIiNkZWZpbmUgKFtBLVpdW0EtWmEtejAtOV9dKykgKC4qKVxuIikKKyAgICB1bmRlZl9yeCA9IHJlLmNvbXBpbGUoIi9bKl0gI3VuZGVmIChbQS1aXVtBLVphLXowLTlfXSspIFsqXS9cbiIpCiAgICAgIwogICAgIHdoaWxlIDE6CiAgICAgICAgIGxpbmUgPSBmcC5yZWFkbGluZSgpCkBAIC0zNTEsNiArMzUxLDE3IEBACiAKICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihteV9tc2cpCiAKKyAgICAjIGxvYWQgdGhlIGluc3RhbGxlZCBweWNvbmZpZy5oOgorICAgIHRyeToKKyAgICAgICAgZmlsZW5hbWUgPSBnZXRfY29uZmlnX2hfZmlsZW5hbWUoKQorICAgICAgICBwYXJzZV9jb25maWdfaChmaWxlKGZpbGVuYW1lKSwgZykKKyAgICBleGNlcHQgSU9FcnJvciwgbXNnOgorICAgICAgICBteV9tc2cgPSAiaW52YWxpZCBQeXRob24gaW5zdGFsbGF0aW9uOiB1bmFibGUgdG8gb3BlbiAlcyIgJSBmaWxlbmFtZQorICAgICAgICBpZiBoYXNhdHRyKG1zZywgInN0cmVycm9yIik6CisgICAgICAgICAgICBteV9tc2cgPSBteV9tc2cgKyAiICglcykiICUgbXNnLnN0cmVycm9yCisKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcihteV9tc2cpCisKICAgICAjIE9uIE1hY09TWCB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBzZXR0aW5nIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZQogICAgICMgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUOiBjb25maWd1cmUgYmFzZXMgc29tZSBjaG9pY2VzIG9uIGl0IHNvCiAgICAgIyBpdCBuZWVkcyB0byBiZSBjb21wYXRpYmxlLgpAQCAtMzYxLDcgKzM3Miw3IEBACiAgICAgICAgIGlmIGN1cl90YXJnZXQgPT0gJyc6CiAgICAgICAgICAgICBjdXJfdGFyZ2V0ID0gY2ZnX3RhcmdldAogICAgICAgICAgICAgb3MucHV0ZW52KCdNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQnLCBjZmdfdGFyZ2V0KQotICAgICAgICBpZiBjZmdfdGFyZ2V0ICE9IGN1cl90YXJnZXQ6CisgICAgICAgIGVsaWYgbWFwKGludCwgY2ZnX3RhcmdldC5zcGxpdCgnLicpKSA+IG1hcChpbnQsIGN1cl90YXJnZXQuc3BsaXQoJy4nKSk6CiAgICAgICAgICAgICBteV9tc2cgPSAoJyRNQUNPU1hfREVQTE9ZTUVOVF9UQVJHRVQgbWlzbWF0Y2g6IG5vdyAiJXMiIGJ1dCAiJXMiIGR1cmluZyBjb25maWd1cmUnCiAgICAgICAgICAgICAgICAgJSAoY3VyX3RhcmdldCwgY2ZnX3RhcmdldCkpCiAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yKG15X21zZykKZGlmZiAtLWdpdCBhL0xpYi9kb2N0ZXN0LnB5IGIvTGliL2RvY3Rlc3QucHkKaW5kZXggNjI0NGZhZS4uNzBjMzU1YSAxMDA2NDQKLS0tIGEvTGliL2RvY3Rlc3QucHkKKysrIGIvTGliL2RvY3Rlc3QucHkKQEAgLTIzNiw2ICsyMzYsMTUgQEAKICAgICBlbHNlOgogICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgbW9kdWxlLCBzdHJpbmcsIG9yIE5vbmUiKQogCitkZWYgX2xvYWRfdGVzdGZpbGUoZmlsZW5hbWUsIHBhY2thZ2UsIG1vZHVsZV9yZWxhdGl2ZSk6CisgICAgaWYgbW9kdWxlX3JlbGF0aXZlOgorICAgICAgICBwYWNrYWdlID0gX25vcm1hbGl6ZV9tb2R1bGUocGFja2FnZSwgMykKKyAgICAgICAgZmlsZW5hbWUgPSBfbW9kdWxlX3JlbGF0aXZlX3BhdGgocGFja2FnZSwgZmlsZW5hbWUpCisgICAgICAgIGlmIGhhc2F0dHIocGFja2FnZSwgJ19fbG9hZGVyX18nKToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIocGFja2FnZS5fX2xvYWRlcl9fLCAnZ2V0X2RhdGEnKToKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFja2FnZS5fX2xvYWRlcl9fLmdldF9kYXRhKGZpbGVuYW1lKSwgZmlsZW5hbWUKKyAgICByZXR1cm4gb3BlbihmaWxlbmFtZSkucmVhZCgpLCBmaWxlbmFtZQorCiBkZWYgX2luZGVudChzLCBpbmRlbnQ9NCk6CiAgICAgIiIiCiAgICAgQWRkIHRoZSBnaXZlbiBudW1iZXIgb2Ygc3BhY2UgY2hhcmFjdGVycyB0byB0aGUgYmVnaW5uaW5nIGV2ZXJ5CkBAIC0xMzE5LDEzICsxMzI4LDEzIEBACiAgICAgX19MSU5FQ0FDSEVfRklMRU5BTUVfUkUgPSByZS5jb21waWxlKHInPGRvY3Rlc3QgJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJyg/UDxuYW1lPltcd1wuXSspJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ1xbKD9QPGV4YW1wbGVudW0+XGQrKVxdPiQnKQotICAgIGRlZiBfX3BhdGNoZWRfbGluZWNhY2hlX2dldGxpbmVzKHNlbGYsIGZpbGVuYW1lKToKKyAgICBkZWYgX19wYXRjaGVkX2xpbmVjYWNoZV9nZXRsaW5lcyhzZWxmLCBmaWxlbmFtZSwgbW9kdWxlX2dsb2JhbHM9Tm9uZSk6CiAgICAgICAgIG0gPSBzZWxmLl9fTElORUNBQ0hFX0ZJTEVOQU1FX1JFLm1hdGNoKGZpbGVuYW1lKQogICAgICAgICBpZiBtIGFuZCBtLmdyb3VwKCduYW1lJykgPT0gc2VsZi50ZXN0Lm5hbWU6CiAgICAgICAgICAgICBleGFtcGxlID0gc2VsZi50ZXN0LmV4YW1wbGVzW2ludChtLmdyb3VwKCdleGFtcGxlbnVtJykpXQogICAgICAgICAgICAgcmV0dXJuIGV4YW1wbGUuc291cmNlLnNwbGl0bGluZXMoVHJ1ZSkKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLnNhdmVfbGluZWNhY2hlX2dldGxpbmVzKGZpbGVuYW1lKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2F2ZV9saW5lY2FjaGVfZ2V0bGluZXMoZmlsZW5hbWUsIG1vZHVsZV9nbG9iYWxzKQogCiAgICAgZGVmIHJ1bihzZWxmLCB0ZXN0LCBjb21waWxlZmxhZ3M9Tm9uZSwgb3V0PU5vbmUsIGNsZWFyX2dsb2JzPVRydWUpOgogICAgICAgICAiIiIKQEAgLTE5MzMsOSArMTk0Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbGF0aXZlIHBhdGhzLiIpCiAKICAgICAjIFJlbGF0aXZpemUgdGhlIHBhdGgKLSAgICBpZiBtb2R1bGVfcmVsYXRpdmU6Ci0gICAgICAgIHBhY2thZ2UgPSBfbm9ybWFsaXplX21vZHVsZShwYWNrYWdlKQotICAgICAgICBmaWxlbmFtZSA9IF9tb2R1bGVfcmVsYXRpdmVfcGF0aChwYWNrYWdlLCBmaWxlbmFtZSkKKyAgICB0ZXh0LCBmaWxlbmFtZSA9IF9sb2FkX3Rlc3RmaWxlKGZpbGVuYW1lLCBwYWNrYWdlLCBtb2R1bGVfcmVsYXRpdmUpCiAKICAgICAjIElmIG5vIG5hbWUgd2FzIGdpdmVuLCB0aGVuIHVzZSB0aGUgZmlsZSdzIG5hbWUuCiAgICAgaWYgbmFtZSBpcyBOb25lOgpAQCAtMTk1NSw4ICsxOTYyLDcgQEAKICAgICAgICAgcnVubmVyID0gRG9jVGVzdFJ1bm5lcih2ZXJib3NlPXZlcmJvc2UsIG9wdGlvbmZsYWdzPW9wdGlvbmZsYWdzKQogCiAgICAgIyBSZWFkIHRoZSBmaWxlLCBjb252ZXJ0IGl0IHRvIGEgdGVzdCwgYW5kIHJ1biBpdC4KLSAgICBzID0gb3BlbihmaWxlbmFtZSkucmVhZCgpCi0gICAgdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdChzLCBnbG9icywgbmFtZSwgZmlsZW5hbWUsIDApCisgICAgdGVzdCA9IHBhcnNlci5nZXRfZG9jdGVzdCh0ZXh0LCBnbG9icywgbmFtZSwgZmlsZW5hbWUsIDApCiAgICAgcnVubmVyLnJ1bih0ZXN0KQogCiAgICAgaWYgcmVwb3J0OgpAQCAtMjMzNiwxNSArMjM0MiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICJyZWxhdGl2ZSBwYXRocy4iKQogCiAgICAgIyBSZWxhdGl2aXplIHRoZSBwYXRoLgotICAgIGlmIG1vZHVsZV9yZWxhdGl2ZToKLSAgICAgICAgcGFja2FnZSA9IF9ub3JtYWxpemVfbW9kdWxlKHBhY2thZ2UpCi0gICAgICAgIHBhdGggPSBfbW9kdWxlX3JlbGF0aXZlX3BhdGgocGFja2FnZSwgcGF0aCkKKyAgICBkb2MsIHBhdGggPSBfbG9hZF90ZXN0ZmlsZShwYXRoLCBwYWNrYWdlLCBtb2R1bGVfcmVsYXRpdmUpCisKICAgICBpZiAiX19maWxlX18iIG5vdCBpbiBnbG9iczoKICAgICAgICAgZ2xvYnNbIl9fZmlsZV9fIl0gPSBwYXRoCiAKICAgICAjIEZpbmQgdGhlIGZpbGUgYW5kIHJlYWQgaXQuCiAgICAgbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKLSAgICBkb2MgPSBvcGVuKHBhdGgpLnJlYWQoKQogCiAgICAgIyBDb252ZXJ0IGl0IHRvIGEgdGVzdCwgYW5kIHdyYXAgaXQgaW4gYSBEb2NGaWxlQ2FzZS4KICAgICB0ZXN0ID0gcGFyc2VyLmdldF9kb2N0ZXN0KGRvYywgZ2xvYnMsIG5hbWUsIHBhdGgsIDApCmRpZmYgLS1naXQgYS9MaWIvZHVtbXlfdGhyZWFkLnB5IGIvTGliL2R1bW15X3RocmVhZC5weQppbmRleCBmYjNhYmJmLi5kNjlkODQwIDEwMDY0NAotLS0gYS9MaWIvZHVtbXlfdGhyZWFkLnB5CisrKyBiL0xpYi9kdW1teV90aHJlYWQucHkKQEAgLTExMyw2ICsxMTMsMTQgQEAKICAgICAgICAgICAgIHNlbGYubG9ja2VkX3N0YXR1cyA9IFRydWUKICAgICAgICAgICAgIHJldHVybiBUcnVlCiAKKyAgICBfX2VudGVyX18gPSBhY3F1aXJlCisKKyAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwLCB2YWwsIHRiKToKKyAgICAgICAgc2VsZi5yZWxlYXNlKCkKKworICAgIGRlZiBfX2NvbnRleHRfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYKKwogICAgIGRlZiByZWxlYXNlKHNlbGYpOgogICAgICAgICAiIiJSZWxlYXNlIHRoZSBkdW1teSBsb2NrLiIiIgogICAgICAgICAjIFhYWCBQZXJoYXBzIHNob3VsZG4ndCBhY3R1YWxseSBib3RoZXIgdG8gdGVzdD8gIENvdWxkIGxlYWQKZGlmZiAtLWdpdCBhL0xpYi9lYXN5X2luc3RhbGwucHkgYi9MaWIvZWFzeV9pbnN0YWxsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4N2U5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZWFzeV9pbnN0YWxsLnB5CkBAIC0wLDAgKzEsNSBAQAorIiIiUnVuIHRoZSBFYXN5SW5zdGFsbCBjb21tYW5kIiIiCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBtYWluCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvX19pbml0X18ucHkgYi9MaWIvZW1haWwvX19pbml0X18ucHkKaW5kZXggZTVjMGUyZS4uZjAxMjYwZiAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL19faW5pdF9fLnB5CisrKyBiL0xpYi9lbWFpbC9fX2luaXRfXy5weQpAQCAtNCw5ICs0LDEwIEBACiAKICIiIkEgcGFja2FnZSBmb3IgcGFyc2luZywgaGFuZGxpbmcsIGFuZCBnZW5lcmF0aW5nIGVtYWlsIG1lc3NhZ2VzLiIiIgogCi1fX3ZlcnNpb25fXyA9ICczLjAuMScKK19fdmVyc2lvbl9fID0gJzQuMGEyJwogCiBfX2FsbF9fID0gWworICAgICMgT2xkIG5hbWVzCiAgICAgJ2Jhc2U2NE1JTUUnLAogICAgICdDaGFyc2V0JywKICAgICAnRW5jb2RlcnMnLApAQCAtMjcsNiArMjgsMTkgQEAKICAgICAnVXRpbHMnLAogICAgICdtZXNzYWdlX2Zyb21fc3RyaW5nJywKICAgICAnbWVzc2FnZV9mcm9tX2ZpbGUnLAorICAgICMgbmV3IG5hbWVzCisgICAgJ2Jhc2U2NG1pbWUnLAorICAgICdjaGFyc2V0JywKKyAgICAnZW5jb2RlcnMnLAorICAgICdlcnJvcnMnLAorICAgICdnZW5lcmF0b3InLAorICAgICdoZWFkZXInLAorICAgICdpdGVyYXRvcnMnLAorICAgICdtZXNzYWdlJywKKyAgICAnbWltZScsCisgICAgJ3BhcnNlcicsCisgICAgJ3F1b3ByaW1pbWUnLAorICAgICd1dGlscycsCiAgICAgXQogCiAKQEAgLTM5LDcgKzUzLDcgQEAKIAogICAgIE9wdGlvbmFsIF9jbGFzcyBhbmQgc3RyaWN0IGFyZSBwYXNzZWQgdG8gdGhlIFBhcnNlciBjb25zdHJ1Y3Rvci4KICAgICAiIiIKLSAgICBmcm9tIGVtYWlsLlBhcnNlciBpbXBvcnQgUGFyc2VyCisgICAgZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IFBhcnNlcgogICAgIHJldHVybiBQYXJzZXIoKmFyZ3MsICoqa3dzKS5wYXJzZXN0cihzKQogCiAKQEAgLTQ4LDUgKzYyLDYyIEBACiAKICAgICBPcHRpb25hbCBfY2xhc3MgYW5kIHN0cmljdCBhcmUgcGFzc2VkIHRvIHRoZSBQYXJzZXIgY29uc3RydWN0b3IuCiAgICAgIiIiCi0gICAgZnJvbSBlbWFpbC5QYXJzZXIgaW1wb3J0IFBhcnNlcgorICAgIGZyb20gZW1haWwucGFyc2VyIGltcG9ydCBQYXJzZXIKICAgICByZXR1cm4gUGFyc2VyKCphcmdzLCAqKmt3cykucGFyc2UoZnApCisKKworDAorIyBMYXp5IGxvYWRpbmcgdG8gcHJvdmlkZSBuYW1lIG1hcHBpbmcgZnJvbSBuZXctc3R5bGUgbmFtZXMgKFBFUCA4IGNvbXBhdGlibGUKKyMgZW1haWwgNC4wIG1vZHVsZSBuYW1lcyksIHRvIG9sZC1zdHlsZSBuYW1lcyAoZW1haWwgMy4wIG1vZHVsZSBuYW1lcykuCitpbXBvcnQgc3lzCisKK2NsYXNzIExhenlJbXBvcnRlcihvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGVfbmFtZSk6CisgICAgICAgIHNlbGYuX19uYW1lX18gPSAnZW1haWwuJyArIG1vZHVsZV9uYW1lCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6CisgICAgICAgIF9faW1wb3J0X18oc2VsZi5fX25hbWVfXykKKyAgICAgICAgbW9kID0gc3lzLm1vZHVsZXNbc2VsZi5fX25hbWVfX10KKyAgICAgICAgc2VsZi5fX2RpY3RfXy51cGRhdGUobW9kLl9fZGljdF9fKQorICAgICAgICByZXR1cm4gZ2V0YXR0cihtb2QsIG5hbWUpCisKKworX0xPV0VSTkFNRVMgPSBbCisgICAgIyBlbWFpbC48b2xkIG5hbWU+IC0+IGVtYWlsLjxuZXcgbmFtZSBpcyBsb3dlcmNhc2VkIG9sZCBuYW1lPgorICAgICdDaGFyc2V0JywKKyAgICAnRW5jb2RlcnMnLAorICAgICdFcnJvcnMnLAorICAgICdGZWVkUGFyc2VyJywKKyAgICAnR2VuZXJhdG9yJywKKyAgICAnSGVhZGVyJywKKyAgICAnSXRlcmF0b3JzJywKKyAgICAnTWVzc2FnZScsCisgICAgJ1BhcnNlcicsCisgICAgJ1V0aWxzJywKKyAgICAnYmFzZTY0TUlNRScsCisgICAgJ3F1b3ByaU1JTUUnLAorICAgIF0KKworX01JTUVOQU1FUyA9IFsKKyAgICAjIGVtYWlsLk1JTUU8b2xkIG5hbWU+IC0+IGVtYWlsLm1pbWUuPG5ldyBuYW1lIGlzIGxvd2VyY2FzZWQgb2xkIG5hbWU+CisgICAgJ0F1ZGlvJywKKyAgICAnQmFzZScsCisgICAgJ0ltYWdlJywKKyAgICAnTWVzc2FnZScsCisgICAgJ011bHRpcGFydCcsCisgICAgJ05vbk11bHRpcGFydCcsCisgICAgJ1RleHQnLAorICAgIF0KKworZm9yIF9uYW1lIGluIF9MT1dFUk5BTUVTOgorICAgIGltcG9ydGVyID0gTGF6eUltcG9ydGVyKF9uYW1lLmxvd2VyKCkpCisgICAgc3lzLm1vZHVsZXNbJ2VtYWlsLicgKyBfbmFtZV0gPSBpbXBvcnRlcgorICAgIHNldGF0dHIoc3lzLm1vZHVsZXNbJ2VtYWlsJ10sIF9uYW1lLCBpbXBvcnRlcikKKworCitpbXBvcnQgZW1haWwubWltZQorZm9yIF9uYW1lIGluIF9NSU1FTkFNRVM6CisgICAgaW1wb3J0ZXIgPSBMYXp5SW1wb3J0ZXIoJ21pbWUuJyArIF9uYW1lLmxvd2VyKCkpCisgICAgc3lzLm1vZHVsZXNbJ2VtYWlsLk1JTUUnICsgX25hbWVdID0gaW1wb3J0ZXIKKyAgICBzZXRhdHRyKHN5cy5tb2R1bGVzWydlbWFpbCddLCAnTUlNRScgKyBfbmFtZSwgaW1wb3J0ZXIpCisgICAgc2V0YXR0cihzeXMubW9kdWxlc1snZW1haWwubWltZSddLCBfbmFtZSwgaW1wb3J0ZXIpCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvX3BhcnNlYWRkci5weSBiL0xpYi9lbWFpbC9fcGFyc2VhZGRyLnB5CmluZGV4IDdkNzU5ZWYuLjU4MjFkZGYgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9fcGFyc2VhZGRyLnB5CisrKyBiL0xpYi9lbWFpbC9fcGFyc2VhZGRyLnB5CkBAIC02LDYgKzYsMTMgQEAKIExpZnRlZCBkaXJlY3RseSBmcm9tIHJmYzgyMi5weS4gIFRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgYmUgcmV3cml0dGVuLgogIiIiCiAKK19fYWxsX18gPSBbCisgICAgJ21rdGltZV90eicsCisgICAgJ3BhcnNlZGF0ZScsCisgICAgJ3BhcnNlZGF0ZV90eicsCisgICAgJ3F1b3RlJywKKyAgICBdCisKIGltcG9ydCB0aW1lCiAKIFNQQUNFID0gJyAnCkBAIC0xMTcsNyArMTI0LDggQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHR6c2lnbiA9IDEKICAgICAgICAgdHpvZmZzZXQgPSB0enNpZ24gKiAoICh0em9mZnNldC8vMTAwKSozNjAwICsgKHR6b2Zmc2V0ICUgMTAwKSo2MCkKLSAgICByZXR1cm4geXksIG1tLCBkZCwgdGhoLCB0bW0sIHRzcywgMCwgMSwgMCwgdHpvZmZzZXQKKyAgICAjIERheWxpZ2h0IFNhdmluZyBUaW1lIGZsYWcgaXMgc2V0IHRvIC0xLCBzaW5jZSBEU1QgaXMgdW5rbm93bi4KKyAgICByZXR1cm4geXksIG1tLCBkZCwgdGhoLCB0bW0sIHRzcywgMCwgMSwgLTEsIHR6b2Zmc2V0CiAKIAogZGVmIHBhcnNlZGF0ZShkYXRhKToKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9iYXNlNjRNSU1FLnB5IGIvTGliL2VtYWlsL2Jhc2U2NG1pbWUucHkKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gTGliL2VtYWlsL2Jhc2U2NE1JTUUucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9iYXNlNjRtaW1lLnB5CmluZGV4IDZlZDFkNTMuLjAxMjlkOWQgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9iYXNlNjRNSU1FLnB5CisrKyBiL0xpYi9lbWFpbC9iYXNlNjRtaW1lLnB5CkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IEJlbiBHZXJ0emZpZWxkCiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKQEAgLTI0LDkgKzI0LDIxIEBACiBtb2R1bGUuCiAiIiIKIAorX19hbGxfXyA9IFsKKyAgICAnYmFzZTY0X2xlbicsCisgICAgJ2JvZHlfZGVjb2RlJywKKyAgICAnYm9keV9lbmNvZGUnLAorICAgICdkZWNvZGUnLAorICAgICdkZWNvZGVzdHJpbmcnLAorICAgICdlbmNvZGUnLAorICAgICdlbmNvZGVzdHJpbmcnLAorICAgICdoZWFkZXJfZW5jb2RlJywKKyAgICBdCisKIGltcG9ydCByZQorCiBmcm9tIGJpbmFzY2lpIGltcG9ydCBiMmFfYmFzZTY0LCBhMmJfYmFzZTY0Ci1mcm9tIGVtYWlsLlV0aWxzIGltcG9ydCBmaXhfZW9scworZnJvbSBlbWFpbC51dGlscyBpbXBvcnQgZml4X2VvbHMKIAogQ1JMRiA9ICdcclxuJwogTkwgPSAnXG4nCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvQ2hhcnNldC5weSBiL0xpYi9lbWFpbC9jaGFyc2V0LnB5CnNpbWlsYXJpdHkgaW5kZXggOTAlCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9DaGFyc2V0LnB5CnJlbmFtZSB0byBMaWIvZW1haWwvY2hhcnNldC5weQppbmRleCBmZDQwNDNiLi44ZjIxOGIyIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvQ2hhcnNldC5weQorKysgYi9MaWIvZW1haWwvY2hhcnNldC5weQpAQCAtMiw5ICsyLDE4IEBACiAjIEF1dGhvcjogQmVuIEdlcnR6ZmllbGQsIEJhcnJ5IFdhcnNhdwogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCi1pbXBvcnQgZW1haWwuYmFzZTY0TUlNRQotaW1wb3J0IGVtYWlsLnF1b3ByaU1JTUUKLWZyb20gZW1haWwuRW5jb2RlcnMgaW1wb3J0IGVuY29kZV83b3I4Yml0CitfX2FsbF9fID0gWworICAgICdDaGFyc2V0JywKKyAgICAnYWRkX2FsaWFzJywKKyAgICAnYWRkX2NoYXJzZXQnLAorICAgICdhZGRfY29kZWMnLAorICAgIF0KKworaW1wb3J0IGVtYWlsLmJhc2U2NG1pbWUKK2ltcG9ydCBlbWFpbC5xdW9wcmltaW1lCisKK2Zyb20gZW1haWwgaW1wb3J0IGVycm9ycworZnJvbSBlbWFpbC5lbmNvZGVycyBpbXBvcnQgZW5jb2RlXzdvcjhiaXQKIAogCiAMCkBAIC0xODYsOCArMTk1LDE3IEBACiAgICAgIiIiCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGlucHV0X2NoYXJzZXQ9REVGQVVMVF9DSEFSU0VUKToKICAgICAgICAgIyBSRkMgMjA0NiwgJDQuMS4yIHNheXMgY2hhcnNldHMgYXJlIG5vdCBjYXNlIHNlbnNpdGl2ZS4gIFdlIGNvZXJjZSB0bwotICAgICAgICAjIHVuaWNvZGUgYmVjYXVzZSBpdHMgLmxvd2VyKCkgaXMgbG9jYWxlIGluc2Vuc2l0aXZlLgotICAgICAgICBpbnB1dF9jaGFyc2V0ID0gdW5pY29kZShpbnB1dF9jaGFyc2V0LCAnYXNjaWknKS5sb3dlcigpCisgICAgICAgICMgdW5pY29kZSBiZWNhdXNlIGl0cyAubG93ZXIoKSBpcyBsb2NhbGUgaW5zZW5zaXRpdmUuICBJZiB0aGUgYXJndW1lbnQKKyAgICAgICAgIyBpcyBhbHJlYWR5IGEgdW5pY29kZSwgd2UgbGVhdmUgaXQgYXQgdGhhdCwgYnV0IGVuc3VyZSB0aGF0IHRoZQorICAgICAgICAjIGNoYXJzZXQgaXMgQVNDSUksIGFzIHRoZSBzdGFuZGFyZCAoUkZDIFhYWCkgcmVxdWlyZXMuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaW5wdXRfY2hhcnNldCwgdW5pY29kZSk6CisgICAgICAgICAgICAgICAgaW5wdXRfY2hhcnNldC5lbmNvZGUoJ2FzY2lpJykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaW5wdXRfY2hhcnNldCA9IHVuaWNvZGUoaW5wdXRfY2hhcnNldCwgJ2FzY2lpJykKKyAgICAgICAgZXhjZXB0IFVuaWNvZGVFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIGVycm9ycy5DaGFyc2V0RXJyb3IoaW5wdXRfY2hhcnNldCkKKyAgICAgICAgaW5wdXRfY2hhcnNldCA9IGlucHV0X2NoYXJzZXQubG93ZXIoKQogICAgICAgICAjIFNldCB0aGUgaW5wdXQgY2hhcnNldCBhZnRlciBmaWx0ZXJpbmcgdGhyb3VnaCB0aGUgYWxpYXNlcwogICAgICAgICBzZWxmLmlucHV0X2NoYXJzZXQgPSBBTElBU0VTLmdldChpbnB1dF9jaGFyc2V0LCBpbnB1dF9jaGFyc2V0KQogICAgICAgICAjIFdlIGNhbiB0cnkgdG8gZ3Vlc3Mgd2hpY2ggZW5jb2RpbmcgYW5kIGNvbnZlcnNpb24gdG8gdXNlIGJ5IHRoZQpAQCAtMzA3LDEyICszMjUsMTIgQEAKICAgICAgICAgY3NldCA9IHNlbGYuZ2V0X291dHB1dF9jaGFyc2V0KCkKICAgICAgICAgIyBUaGUgbGVuKHMpIG9mIGEgN2JpdCBlbmNvZGluZyBpcyBsZW4ocykKICAgICAgICAgaWYgc2VsZi5oZWFkZXJfZW5jb2RpbmcgPT0gQkFTRTY0OgotICAgICAgICAgICAgcmV0dXJuIGVtYWlsLmJhc2U2NE1JTUUuYmFzZTY0X2xlbihzKSArIGxlbihjc2V0KSArIE1JU0NfTEVOCisgICAgICAgICAgICByZXR1cm4gZW1haWwuYmFzZTY0bWltZS5iYXNlNjRfbGVuKHMpICsgbGVuKGNzZXQpICsgTUlTQ19MRU4KICAgICAgICAgZWxpZiBzZWxmLmhlYWRlcl9lbmNvZGluZyA9PSBRUDoKLSAgICAgICAgICAgIHJldHVybiBlbWFpbC5xdW9wcmlNSU1FLmhlYWRlcl9xdW9wcmlfbGVuKHMpICsgbGVuKGNzZXQpICsgTUlTQ19MRU4KKyAgICAgICAgICAgIHJldHVybiBlbWFpbC5xdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfbGVuKHMpICsgbGVuKGNzZXQpICsgTUlTQ19MRU4KICAgICAgICAgZWxpZiBzZWxmLmhlYWRlcl9lbmNvZGluZyA9PSBTSE9SVEVTVDoKLSAgICAgICAgICAgIGxlbmI2NCA9IGVtYWlsLmJhc2U2NE1JTUUuYmFzZTY0X2xlbihzKQotICAgICAgICAgICAgbGVucXAgPSBlbWFpbC5xdW9wcmlNSU1FLmhlYWRlcl9xdW9wcmlfbGVuKHMpCisgICAgICAgICAgICBsZW5iNjQgPSBlbWFpbC5iYXNlNjRtaW1lLmJhc2U2NF9sZW4ocykKKyAgICAgICAgICAgIGxlbnFwID0gZW1haWwucXVvcHJpbWltZS5oZWFkZXJfcXVvcHJpX2xlbihzKQogICAgICAgICAgICAgcmV0dXJuIG1pbihsZW5iNjQsIGxlbnFwKSArIGxlbihjc2V0KSArIE1JU0NfTEVOCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICByZXR1cm4gbGVuKHMpCkBAIC0zMzUsMTYgKzM1MywxNiBAQAogICAgICAgICAgICAgcyA9IHNlbGYuY29udmVydChzKQogICAgICAgICAjIDdiaXQvOGJpdCBlbmNvZGluZ3MgcmV0dXJuIHRoZSBzdHJpbmcgdW5jaGFuZ2VkIChtb2R1bG8gY29udmVyc2lvbnMpCiAgICAgICAgIGlmIHNlbGYuaGVhZGVyX2VuY29kaW5nID09IEJBU0U2NDoKLSAgICAgICAgICAgIHJldHVybiBlbWFpbC5iYXNlNjRNSU1FLmhlYWRlcl9lbmNvZGUocywgY3NldCkKKyAgICAgICAgICAgIHJldHVybiBlbWFpbC5iYXNlNjRtaW1lLmhlYWRlcl9lbmNvZGUocywgY3NldCkKICAgICAgICAgZWxpZiBzZWxmLmhlYWRlcl9lbmNvZGluZyA9PSBRUDoKLSAgICAgICAgICAgIHJldHVybiBlbWFpbC5xdW9wcmlNSU1FLmhlYWRlcl9lbmNvZGUocywgY3NldCwgbWF4bGluZWxlbj1Ob25lKQorICAgICAgICAgICAgcmV0dXJuIGVtYWlsLnF1b3ByaW1pbWUuaGVhZGVyX2VuY29kZShzLCBjc2V0LCBtYXhsaW5lbGVuPU5vbmUpCiAgICAgICAgIGVsaWYgc2VsZi5oZWFkZXJfZW5jb2RpbmcgPT0gU0hPUlRFU1Q6Ci0gICAgICAgICAgICBsZW5iNjQgPSBlbWFpbC5iYXNlNjRNSU1FLmJhc2U2NF9sZW4ocykKLSAgICAgICAgICAgIGxlbnFwID0gZW1haWwucXVvcHJpTUlNRS5oZWFkZXJfcXVvcHJpX2xlbihzKQorICAgICAgICAgICAgbGVuYjY0ID0gZW1haWwuYmFzZTY0bWltZS5iYXNlNjRfbGVuKHMpCisgICAgICAgICAgICBsZW5xcCA9IGVtYWlsLnF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9sZW4ocykKICAgICAgICAgICAgIGlmIGxlbmI2NCA8IGxlbnFwOgotICAgICAgICAgICAgICAgIHJldHVybiBlbWFpbC5iYXNlNjRNSU1FLmhlYWRlcl9lbmNvZGUocywgY3NldCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZW1haWwuYmFzZTY0bWltZS5oZWFkZXJfZW5jb2RlKHMsIGNzZXQpCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHJldHVybiBlbWFpbC5xdW9wcmlNSU1FLmhlYWRlcl9lbmNvZGUocywgY3NldCwgbWF4bGluZWxlbj1Ob25lKQorICAgICAgICAgICAgICAgIHJldHVybiBlbWFpbC5xdW9wcmltaW1lLmhlYWRlcl9lbmNvZGUocywgY3NldCwgbWF4bGluZWxlbj1Ob25lKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIHMKIApAQCAtMzYzLDggKzM4MSw4IEBACiAgICAgICAgICAgICBzID0gc2VsZi5jb252ZXJ0KHMpCiAgICAgICAgICMgN2JpdC84Yml0IGVuY29kaW5ncyByZXR1cm4gdGhlIHN0cmluZyB1bmNoYW5nZWQgKG1vZHVsZSBjb252ZXJzaW9ucykKICAgICAgICAgaWYgc2VsZi5ib2R5X2VuY29kaW5nIGlzIEJBU0U2NDoKLSAgICAgICAgICAgIHJldHVybiBlbWFpbC5iYXNlNjRNSU1FLmJvZHlfZW5jb2RlKHMpCisgICAgICAgICAgICByZXR1cm4gZW1haWwuYmFzZTY0bWltZS5ib2R5X2VuY29kZShzKQogICAgICAgICBlbGlmIHNlbGYuYm9keV9lbmNvZGluZyBpcyBRUDoKLSAgICAgICAgICAgIHJldHVybiBlbWFpbC5xdW9wcmlNSU1FLmJvZHlfZW5jb2RlKHMpCisgICAgICAgICAgICByZXR1cm4gZW1haWwucXVvcHJpbWltZS5ib2R5X2VuY29kZShzKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgcmV0dXJuIHMKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9FbmNvZGVycy5weSBiL0xpYi9lbWFpbC9lbmNvZGVycy5weQpzaW1pbGFyaXR5IGluZGV4IDkzJQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvRW5jb2RlcnMucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9lbmNvZGVycy5weQppbmRleCBiYWFjMmEzLi4wNjAxNmNkIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvRW5jb2RlcnMucHkKKysrIGIvTGliL2VtYWlsL2VuY29kZXJzLnB5CkBAIC0xLDEyICsxLDIyIEBACi0jIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQmFycnkgV2Fyc2F3CiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKICIiIkVuY29kaW5ncyBhbmQgcmVsYXRlZCBmdW5jdGlvbnMuIiIiCiAKK19fYWxsX18gPSBbCisgICAgJ2VuY29kZV83b3I4Yml0JywKKyAgICAnZW5jb2RlX2Jhc2U2NCcsCisgICAgJ2VuY29kZV9ub29wJywKKyAgICAnZW5jb2RlX3F1b3ByaScsCisgICAgXQorCiBpbXBvcnQgYmFzZTY0CisKIGZyb20gcXVvcHJpIGltcG9ydCBlbmNvZGVzdHJpbmcgYXMgX2VuY29kZXN0cmluZwogCisKKwwKIGRlZiBfcWVuY29kZShzKToKICAgICBlbmMgPSBfZW5jb2Rlc3RyaW5nKHMsIHF1b3RldGFicz1UcnVlKQogICAgICMgTXVzdCBlbmNvZGUgc3BhY2VzLCB3aGljaCBxdW9wcmkuZW5jb2Rlc3RyaW5nKCkgZG9lc24ndCBkbwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL0Vycm9ycy5weSBiL0xpYi9lbWFpbC9lcnJvcnMucHkKc2ltaWxhcml0eSBpbmRleCA5MiUKcmVuYW1lIGZyb20gTGliL2VtYWlsL0Vycm9ycy5weQpyZW5hbWUgdG8gTGliL2VtYWlsL2Vycm9ycy5weQppbmRleCBlMTNhMmM3Li5kNTJhNjI0IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvRXJyb3JzLnB5CisrKyBiL0xpYi9lbWFpbC9lcnJvcnMucHkKQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQmFycnkgV2Fyc2F3CiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKQEAgLTI2LDYgKzI2LDEwIEBACiAgICAgIiIiQ29udmVyc2lvbiB0byBhIG11bHRpcGFydCBpcyBwcm9oaWJpdGVkLiIiIgogCiAKK2NsYXNzIENoYXJzZXRFcnJvcihNZXNzYWdlRXJyb3IpOgorICAgICIiIkFuIGlsbGVnYWwgY2hhcnNldCB3YXMgZ2l2ZW4uIiIiCisKKwogDAogIyBUaGVzZSBhcmUgcGFyc2luZyBkZWZlY3RzIHdoaWNoIHRoZSBwYXJzZXIgd2FzIGFibGUgdG8gd29yayBhcm91bmQuCiBjbGFzcyBNZXNzYWdlRGVmZWN0OgpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL0ZlZWRQYXJzZXIucHkgYi9MaWIvZW1haWwvZmVlZHBhcnNlci5weQpzaW1pbGFyaXR5IGluZGV4IDk3JQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvRmVlZFBhcnNlci5weQpyZW5hbWUgdG8gTGliL2VtYWlsL2ZlZWRwYXJzZXIucHkKaW5kZXggYTIxMzBlMi4uYWZiMDJiMyAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL0ZlZWRQYXJzZXIucHkKKysrIGIvTGliL2VtYWlsL2ZlZWRwYXJzZXIucHkKQEAgLTE5LDkgKzE5LDEyIEBACiBvYmplY3QncyAuZGVmZWN0cyBhdHRyaWJ1dGUuCiAiIiIKIAorX19hbGxfXyA9IFsnRmVlZFBhcnNlciddCisKIGltcG9ydCByZQotZnJvbSBlbWFpbCBpbXBvcnQgRXJyb3JzCi1mcm9tIGVtYWlsIGltcG9ydCBNZXNzYWdlCisKK2Zyb20gZW1haWwgaW1wb3J0IGVycm9ycworZnJvbSBlbWFpbCBpbXBvcnQgbWVzc2FnZQogCiBOTENSRSA9IHJlLmNvbXBpbGUoJ1xyXG58XHJ8XG4nKQogTkxDUkVfYm9sID0gcmUuY29tcGlsZSgnKFxyXG58XHJ8XG4pJykKQEAgLTEzMCw3ICsxMzMsNyBAQAogY2xhc3MgRmVlZFBhcnNlcjoKICAgICAiIiJBIGZlZWQtc3R5bGUgcGFyc2VyIG9mIGVtYWlsLiIiIgogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIF9mYWN0b3J5PU1lc3NhZ2UuTWVzc2FnZSk6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9mYWN0b3J5PW1lc3NhZ2UuTWVzc2FnZSk6CiAgICAgICAgICIiIl9mYWN0b3J5IGlzIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cyB0byBjcmVhdGUgYSBuZXcgbWVzc2FnZSBvYmoiIiIKICAgICAgICAgc2VsZi5fZmFjdG9yeSA9IF9mYWN0b3J5CiAgICAgICAgIHNlbGYuX2lucHV0ID0gQnVmZmVyZWRTdWJGaWxlKCkKQEAgLTE2NCw3ICsxNjcsNyBAQAogICAgICAgICAjIExvb2sgZm9yIGZpbmFsIHNldCBvZiBkZWZlY3RzCiAgICAgICAgIGlmIHJvb3QuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSA9PSAnbXVsdGlwYXJ0JyBcCiAgICAgICAgICAgICAgICBhbmQgbm90IHJvb3QuaXNfbXVsdGlwYXJ0KCk6Ci0gICAgICAgICAgICByb290LmRlZmVjdHMuYXBwZW5kKEVycm9ycy5NdWx0aXBhcnRJbnZhcmlhbnRWaW9sYXRpb25EZWZlY3QoKSkKKyAgICAgICAgICAgIHJvb3QuZGVmZWN0cy5hcHBlbmQoZXJyb3JzLk11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCgpKQogICAgICAgICByZXR1cm4gcm9vdAogCiAgICAgZGVmIF9uZXdfbWVzc2FnZShzZWxmKToKQEAgLTI3Nyw3ICsyODAsNyBAQAogICAgICAgICAgICAgICAgICMgZGVmaW5lZCBhIGJvdW5kYXJ5LiAgVGhhdCdzIGEgcHJvYmxlbSB3aGljaCB3ZSdsbCBoYW5kbGUgYnkKICAgICAgICAgICAgICAgICAjIHJlYWRpbmcgZXZlcnl0aGluZyB1bnRpbCB0aGUgRU9GIGFuZCBtYXJraW5nIHRoZSBtZXNzYWdlIGFzCiAgICAgICAgICAgICAgICAgIyBkZWZlY3RpdmUuCi0gICAgICAgICAgICAgICAgc2VsZi5fY3VyLmRlZmVjdHMuYXBwZW5kKEVycm9ycy5Ob0JvdW5kYXJ5SW5NdWx0aXBhcnREZWZlY3QoKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9jdXIuZGVmZWN0cy5hcHBlbmQoZXJyb3JzLk5vQm91bmRhcnlJbk11bHRpcGFydERlZmVjdCgpKQogICAgICAgICAgICAgICAgIGxpbmVzID0gW10KICAgICAgICAgICAgICAgICBmb3IgbGluZSBpbiBzZWxmLl9pbnB1dDoKICAgICAgICAgICAgICAgICAgICAgaWYgbGluZSBpcyBOZWVkTW9yZURhdGE6CkBAIC0zODEsNyArMzg0LDcgQEAKICAgICAgICAgICAgICMgdGhhdCBhcyBhIGRlZmVjdCBhbmQgc3RvcmUgdGhlIGNhcHR1cmVkIHRleHQgYXMgdGhlIHBheWxvYWQuCiAgICAgICAgICAgICAjIEV2ZXJ5dGhpbmcgZnJvbSBoZXJlIHRvIHRoZSBFT0YgaXMgZXBpbG9ndWUuCiAgICAgICAgICAgICBpZiBjYXB0dXJpbmdfcHJlYW1ibGU6Ci0gICAgICAgICAgICAgICAgc2VsZi5fY3VyLmRlZmVjdHMuYXBwZW5kKEVycm9ycy5TdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QoKSkKKyAgICAgICAgICAgICAgICBzZWxmLl9jdXIuZGVmZWN0cy5hcHBlbmQoZXJyb3JzLlN0YXJ0Qm91bmRhcnlOb3RGb3VuZERlZmVjdCgpKQogICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5zZXRfcGF5bG9hZChFTVBUWVNUUklORy5qb2luKHByZWFtYmxlKSkKICAgICAgICAgICAgICAgICBlcGlsb2d1ZSA9IFtdCiAgICAgICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5faW5wdXQ6CkBAIC00MzIsNyArNDM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIyBUaGUgZmlyc3QgbGluZSBvZiB0aGUgaGVhZGVycyB3YXMgYSBjb250aW51YXRpb24uICBUaGlzCiAgICAgICAgICAgICAgICAgICAgICMgaXMgaWxsZWdhbCwgc28gbGV0J3Mgbm90ZSB0aGUgZGVmZWN0LCBzdG9yZSB0aGUgaWxsZWdhbAogICAgICAgICAgICAgICAgICAgICAjIGxpbmUsIGFuZCBpZ25vcmUgaXQgZm9yIHB1cnBvc2VzIG9mIGhlYWRlcnMuCi0gICAgICAgICAgICAgICAgICAgIGRlZmVjdCA9IEVycm9ycy5GaXJzdEhlYWRlckxpbmVJc0NvbnRpbnVhdGlvbkRlZmVjdChsaW5lKQorICAgICAgICAgICAgICAgICAgICBkZWZlY3QgPSBlcnJvcnMuRmlyc3RIZWFkZXJMaW5lSXNDb250aW51YXRpb25EZWZlY3QobGluZSkKICAgICAgICAgICAgICAgICAgICAgc2VsZi5fY3VyLmRlZmVjdHMuYXBwZW5kKGRlZmVjdCkKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICBsYXN0dmFsdWUuYXBwZW5kKGxpbmUpCkBAIC00NjAsMTMgKzQ2MywxMyBAQAogICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICMgV2VpcmRseSBwbGFjZWQgdW5peC1mcm9tIGxpbmUuICBOb3RlIHRoaXMgYXMgYSBkZWZlY3QKICAgICAgICAgICAgICAgICAgICAgIyBhbmQgaWdub3JlIGl0LgotICAgICAgICAgICAgICAgICAgICBkZWZlY3QgPSBFcnJvcnMuTWlzcGxhY2VkRW52ZWxvcGVIZWFkZXJEZWZlY3QobGluZSkKKyAgICAgICAgICAgICAgICAgICAgZGVmZWN0ID0gZXJyb3JzLk1pc3BsYWNlZEVudmVsb3BlSGVhZGVyRGVmZWN0KGxpbmUpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2N1ci5kZWZlY3RzLmFwcGVuZChkZWZlY3QpCiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAjIFNwbGl0IHRoZSBsaW5lIG9uIHRoZSBjb2xvbiBzZXBhcmF0aW5nIGZpZWxkIG5hbWUgZnJvbSB2YWx1ZS4KICAgICAgICAgICAgIGkgPSBsaW5lLmZpbmQoJzonKQogICAgICAgICAgICAgaWYgaSA8IDA6Ci0gICAgICAgICAgICAgICAgZGVmZWN0ID0gRXJyb3JzLk1hbGZvcm1lZEhlYWRlckRlZmVjdChsaW5lKQorICAgICAgICAgICAgICAgIGRlZmVjdCA9IGVycm9ycy5NYWxmb3JtZWRIZWFkZXJEZWZlY3QobGluZSkKICAgICAgICAgICAgICAgICBzZWxmLl9jdXIuZGVmZWN0cy5hcHBlbmQoZGVmZWN0KQogICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICBsYXN0aGVhZGVyID0gbGluZVs6aV0KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9HZW5lcmF0b3IucHkgYi9MaWIvZW1haWwvZ2VuZXJhdG9yLnB5CnNpbWlsYXJpdHkgaW5kZXggOTclCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9HZW5lcmF0b3IucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9nZW5lcmF0b3IucHkKaW5kZXggNzk2OTkxNi4uNmU3YTUxNSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL0dlbmVyYXRvci5weQorKysgYi9MaWIvZW1haWwvZ2VuZXJhdG9yLnB5CkBAIC00LDE0ICs0LDE2IEBACiAKICIiIkNsYXNzZXMgdG8gZ2VuZXJhdGUgcGxhaW4gdGV4dCBmcm9tIGEgbWVzc2FnZSBvYmplY3QgdHJlZS4iIiIKIAorX19hbGxfXyA9IFsnR2VuZXJhdG9yJywgJ0RlY29kZWRHZW5lcmF0b3InXQorCiBpbXBvcnQgcmUKIGltcG9ydCBzeXMKIGltcG9ydCB0aW1lCiBpbXBvcnQgcmFuZG9tCiBpbXBvcnQgd2FybmluZ3MKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogCi1mcm9tIGVtYWlsLkhlYWRlciBpbXBvcnQgSGVhZGVyCitmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KK2Zyb20gZW1haWwuaGVhZGVyIGltcG9ydCBIZWFkZXIKIAogVU5ERVJTQ09SRSA9ICdfJwogTkwgPSAnXG4nCkBAIC04MSwxMiArODMsNiBAQAogICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5fZnAsIHVmcm9tCiAgICAgICAgIHNlbGYuX3dyaXRlKG1zZykKIAotICAgICMgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgdGhpcyBpcyBzbG93ZXIKLSAgICBkZWYgX19jYWxsX18oc2VsZiwgbXNnLCB1bml4ZnJvbT1GYWxzZSk6Ci0gICAgICAgIHdhcm5pbmdzLndhcm4oJ19fY2FsbF9fKCkgZGVwcmVjYXRlZDsgdXNlIGZsYXR0ZW4oKScsCi0gICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQotICAgICAgICBzZWxmLmZsYXR0ZW4obXNnLCB1bml4ZnJvbSkKLQogICAgIGRlZiBjbG9uZShzZWxmLCBmcCk6CiAgICAgICAgICIiIkNsb25lIHRoaXMgZ2VuZXJhdG9yIHdpdGggdGhlIGV4YWN0IHNhbWUgb3B0aW9ucy4iIiIKICAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fKGZwLCBzZWxmLl9tYW5nbGVfZnJvbV8sIHNlbGYuX21heGhlYWRlcmxlbikKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9IZWFkZXIucHkgYi9MaWIvZW1haWwvaGVhZGVyLnB5CnNpbWlsYXJpdHkgaW5kZXggOTglCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9IZWFkZXIucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9oZWFkZXIucHkKaW5kZXggNWUyNGFmZS4uMTgzYzMzNyAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL0hlYWRlci5weQorKysgYi9MaWIvZW1haWwvaGVhZGVyLnB5CkBAIC0xLDE2ICsxLDIzIEBACi0jIENvcHlyaWdodCAoQykgMjAwMi0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQmVuIEdlcnR6ZmllbGQsIEJhcnJ5IFdhcnNhdwogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCiAiIiJIZWFkZXIgZW5jb2RpbmcgYW5kIGRlY29kaW5nIGZ1bmN0aW9uYWxpdHkuIiIiCiAKK19fYWxsX18gPSBbCisgICAgJ0hlYWRlcicsCisgICAgJ2RlY29kZV9oZWFkZXInLAorICAgICdtYWtlX2hlYWRlcicsCisgICAgXQorCiBpbXBvcnQgcmUKIGltcG9ydCBiaW5hc2NpaQogCi1pbXBvcnQgZW1haWwucXVvcHJpTUlNRQotaW1wb3J0IGVtYWlsLmJhc2U2NE1JTUUKLWZyb20gZW1haWwuRXJyb3JzIGltcG9ydCBIZWFkZXJQYXJzZUVycm9yCi1mcm9tIGVtYWlsLkNoYXJzZXQgaW1wb3J0IENoYXJzZXQKK2ltcG9ydCBlbWFpbC5xdW9wcmltaW1lCitpbXBvcnQgZW1haWwuYmFzZTY0bWltZQorCitmcm9tIGVtYWlsLmVycm9ycyBpbXBvcnQgSGVhZGVyUGFyc2VFcnJvcgorZnJvbSBlbWFpbC5jaGFyc2V0IGltcG9ydCBDaGFyc2V0CiAKIE5MID0gJ1xuJwogU1BBQ0UgPSAnICcKQEAgLTQyLDcgKzQ5LDcgQEAKIAogDAogIyBIZWxwZXJzCi1fbWF4X2FwcGVuZCA9IGVtYWlsLnF1b3ByaU1JTUUuX21heF9hcHBlbmQKK19tYXhfYXBwZW5kID0gZW1haWwucXVvcHJpbWltZS5fbWF4X2FwcGVuZAogCiAKIAwKQEAgLTgyLDEwICs4OSwxMCBAQAogICAgICAgICAgICAgICAgIGVuY29kZWQgPSBwYXJ0c1syXQogICAgICAgICAgICAgICAgIGRlYyA9IE5vbmUKICAgICAgICAgICAgICAgICBpZiBlbmNvZGluZyA9PSAncSc6Ci0gICAgICAgICAgICAgICAgICAgIGRlYyA9IGVtYWlsLnF1b3ByaU1JTUUuaGVhZGVyX2RlY29kZShlbmNvZGVkKQorICAgICAgICAgICAgICAgICAgICBkZWMgPSBlbWFpbC5xdW9wcmltaW1lLmhlYWRlcl9kZWNvZGUoZW5jb2RlZCkKICAgICAgICAgICAgICAgICBlbGlmIGVuY29kaW5nID09ICdiJzoKICAgICAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgZGVjID0gZW1haWwuYmFzZTY0TUlNRS5kZWNvZGUoZW5jb2RlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlYyA9IGVtYWlsLmJhc2U2NG1pbWUuZGVjb2RlKGVuY29kZWQpCiAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBiaW5hc2NpaS5FcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgICMgVHVybiB0aGlzIGludG8gYSBoaWdoZXIgbGV2ZWwgZXhjZXB0aW9uLiAgQkFXOiBSaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgIyBub3cgd2UgdGhyb3cgdGhlIGxvd2VyIGxldmVsIGV4Y2VwdGlvbiBhd2F5IGJ1dApkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL0l0ZXJhdG9ycy5weSBiL0xpYi9lbWFpbC9pdGVyYXRvcnMucHkKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gTGliL2VtYWlsL0l0ZXJhdG9ycy5weQpyZW5hbWUgdG8gTGliL2VtYWlsL2l0ZXJhdG9ycy5weQppbmRleCA3NGE5M2M3Li5lOTlmMjI4IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvSXRlcmF0b3JzLnB5CisrKyBiL0xpYi9lbWFpbC9pdGVyYXRvcnMucHkKQEAgLTEsOSArMSwxNiBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IEJhcnJ5IFdhcnNhdwogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCiAiIiJWYXJpb3VzIHR5cGVzIG9mIHVzZWZ1bCBpdGVyYXRvcnMgYW5kIGdlbmVyYXRvcnMuIiIiCiAKK19fYWxsX18gPSBbCisgICAgJ2JvZHlfbGluZV9pdGVyYXRvcicsCisgICAgJ3R5cGVkX3N1YnBhcnRfaXRlcmF0b3InLAorICAgICd3YWxrJywKKyAgICAjIERvIG5vdCBpbmNsdWRlIF9zdHJ1Y3R1cmUoKSBzaW5jZSBpdCdzIHBhcnQgb2YgdGhlIGRlYnVnZ2luZyBBUEkuCisgICAgXQorCiBpbXBvcnQgc3lzCiBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIApAQCAtMjUsNyArMzIsNiBAQAogCiAMCiAjIFRoZXNlIHR3byBmdW5jdGlvbnMgYXJlIGltcG9ydGVkIGludG8gdGhlIEl0ZXJhdG9ycy5weSBpbnRlcmZhY2UgbW9kdWxlLgotIyBUaGUgUHl0aG9uIDIuMiB2ZXJzaW9uIHVzZXMgZ2VuZXJhdG9ycyBmb3IgZWZmaWNpZW5jeS4KIGRlZiBib2R5X2xpbmVfaXRlcmF0b3IobXNnLCBkZWNvZGU9RmFsc2UpOgogICAgICIiIkl0ZXJhdGUgb3ZlciB0aGUgcGFydHMsIHJldHVybmluZyBzdHJpbmcgcGF5bG9hZHMgbGluZS1ieS1saW5lLgogCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvTWVzc2FnZS5weSBiL0xpYi9lbWFpbC9tZXNzYWdlLnB5CnNpbWlsYXJpdHkgaW5kZXggOTIlCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9NZXNzYWdlLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvbWVzc2FnZS5weQppbmRleCBiYzc2NDE2Li41MGQ5MGI0IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvTWVzc2FnZS5weQorKysgYi9MaWIvZW1haWwvbWVzc2FnZS5weQpAQCAtNCw2ICs0LDggQEAKIAogIiIiQmFzaWMgbWVzc2FnZSBvYmplY3QgZm9yIHRoZSBlbWFpbCBwYWNrYWdlIG9iamVjdCBtb2RlbC4iIiIKIAorX19hbGxfXyA9IFsnTWVzc2FnZSddCisKIGltcG9ydCByZQogaW1wb3J0IHV1CiBpbXBvcnQgYmluYXNjaWkKQEAgLTExLDkgKzEzLDkgQEAKIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogCiAjIEludHJhcGFja2FnZSBpbXBvcnRzCi1mcm9tIGVtYWlsIGltcG9ydCBVdGlscwotZnJvbSBlbWFpbCBpbXBvcnQgRXJyb3JzCi1mcm9tIGVtYWlsIGltcG9ydCBDaGFyc2V0CitpbXBvcnQgZW1haWwuY2hhcnNldAorZnJvbSBlbWFpbCBpbXBvcnQgdXRpbHMKK2Zyb20gZW1haWwgaW1wb3J0IGVycm9ycwogCiBTRU1JU1BBQ0UgPSAnOyAnCiAKQEAgLTQxLDExICs0MywxMSBAQAogICAgICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSk6CiAgICAgICAgICAgICAjIEVuY29kZSBhcyBwZXIgUkZDIDIyMzEKICAgICAgICAgICAgIHBhcmFtICs9ICcqJwotICAgICAgICAgICAgdmFsdWUgPSBVdGlscy5lbmNvZGVfcmZjMjIzMSh2YWx1ZVsyXSwgdmFsdWVbMF0sIHZhbHVlWzFdKQorICAgICAgICAgICAgdmFsdWUgPSB1dGlscy5lbmNvZGVfcmZjMjIzMSh2YWx1ZVsyXSwgdmFsdWVbMF0sIHZhbHVlWzFdKQogICAgICAgICAjIEJBVzogUGxlYXNlIGNoZWNrIHRoaXMuICBJIHRoaW5rIHRoYXQgaWYgcXVvdGUgaXMgc2V0IGl0IHNob3VsZAogICAgICAgICAjIGZvcmNlIHF1b3RpbmcgZXZlbiBpZiBub3QgbmVjZXNzYXJ5LgogICAgICAgICBpZiBxdW90ZSBvciB0c3BlY2lhbHMuc2VhcmNoKHZhbHVlKToKLSAgICAgICAgICAgIHJldHVybiAnJXM9IiVzIicgJSAocGFyYW0sIFV0aWxzLnF1b3RlKHZhbHVlKSkKKyAgICAgICAgICAgIHJldHVybiAnJXM9IiVzIicgJSAocGFyYW0sIHV0aWxzLnF1b3RlKHZhbHVlKSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiAnJXM9JXMnICUgKHBhcmFtLCB2YWx1ZSkKICAgICBlbHNlOgpAQCAtNzAsMTQgKzcyLDE0IEBACiAKIAogZGVmIF91bnF1b3RldmFsdWUodmFsdWUpOgotICAgICMgVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiBVdGlscy5jb2xsYXBzZV9yZmMyMjMxX3ZhbHVlKCkgYmVjYXVzZSBpdCBkb2Vzbid0CisgICAgIyBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIHV0aWxzLmNvbGxhcHNlX3JmYzIyMzFfdmFsdWUoKSBiZWNhdXNlIGl0IGRvZXNuJ3QKICAgICAjIHRyeSB0byBjb252ZXJ0IHRoZSB2YWx1ZSB0byBhIHVuaWNvZGUuICBNZXNzYWdlLmdldF9wYXJhbSgpIGFuZAogICAgICMgTWVzc2FnZS5nZXRfcGFyYW1zKCkgYXJlIGJvdGggY3VycmVudGx5IGRlZmluZWQgdG8gcmV0dXJuIHRoZSB0dXBsZSBpbgogICAgICMgdGhlIGZhY2Ugb2YgUkZDIDIyMzEgcGFyYW1ldGVycy4KICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCB0dXBsZSk6Ci0gICAgICAgIHJldHVybiB2YWx1ZVswXSwgdmFsdWVbMV0sIFV0aWxzLnVucXVvdGUodmFsdWVbMl0pCisgICAgICAgIHJldHVybiB2YWx1ZVswXSwgdmFsdWVbMV0sIHV0aWxzLnVucXVvdGUodmFsdWVbMl0pCiAgICAgZWxzZToKLSAgICAgICAgcmV0dXJuIFV0aWxzLnVucXVvdGUodmFsdWUpCisgICAgICAgIHJldHVybiB1dGlscy51bnF1b3RlKHZhbHVlKQogCiAKIAwKQEAgLTE4OCwxNyArMTkwLDE3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKICAgICAgICAgICAgIGN0ZSA9IHNlbGYuZ2V0KCdjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJywgJycpLmxvd2VyKCkKICAgICAgICAgICAgIGlmIGN0ZSA9PSAncXVvdGVkLXByaW50YWJsZSc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFV0aWxzLl9xZGVjb2RlKHBheWxvYWQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzLl9xZGVjb2RlKHBheWxvYWQpCiAgICAgICAgICAgICBlbGlmIGN0ZSA9PSAnYmFzZTY0JzoKICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBVdGlscy5fYmRlY29kZShwYXlsb2FkKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXRpbHMuX2JkZWNvZGUocGF5bG9hZCkKICAgICAgICAgICAgICAgICBleGNlcHQgYmluYXNjaWkuRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICMgSW5jb3JyZWN0IHBhZGRpbmcKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBheWxvYWQKICAgICAgICAgICAgIGVsaWYgY3RlIGluICgneC11dWVuY29kZScsICd1dWVuY29kZScsICd1dWUnLCAneC11dWUnKToKICAgICAgICAgICAgICAgICBzZnAgPSBTdHJpbmdJTygpCiAgICAgICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgICAgICB1dS5kZWNvZGUoU3RyaW5nSU8ocGF5bG9hZCsnXG4nKSwgc2ZwKQorICAgICAgICAgICAgICAgICAgICB1dS5kZWNvZGUoU3RyaW5nSU8ocGF5bG9hZCsnXG4nKSwgc2ZwLCBxdWlldD1UcnVlKQogICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gc2ZwLmdldHZhbHVlKCkKICAgICAgICAgICAgICAgICBleGNlcHQgdXUuRXJyb3I6CiAgICAgICAgICAgICAgICAgICAgICMgU29tZSBkZWNvZGluZyBwcm9ibGVtCkBAIC0yMzcsOCArMjM5LDggQEAKICAgICAgICAgICAgIHNlbGYuX2NoYXJzZXQgPSBOb25lCiAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgaWYgaXNpbnN0YW5jZShjaGFyc2V0LCBzdHIpOgotICAgICAgICAgICAgY2hhcnNldCA9IENoYXJzZXQuQ2hhcnNldChjaGFyc2V0KQotICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjaGFyc2V0LCBDaGFyc2V0LkNoYXJzZXQpOgorICAgICAgICAgICAgY2hhcnNldCA9IGVtYWlsLmNoYXJzZXQuQ2hhcnNldChjaGFyc2V0KQorICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShjaGFyc2V0LCBlbWFpbC5jaGFyc2V0LkNoYXJzZXQpOgogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKGNoYXJzZXQpCiAgICAgICAgICMgQkFXOiBzaG91bGQgd2UgYWNjZXB0IHN0cmluZ3MgdGhhdCBjYW4gc2VydmUgYXMgYXJndW1lbnRzIHRvIHRoZQogICAgICAgICAjIENoYXJzZXQgY29uc3RydWN0b3I/CkBAIC00MTMsNDkgKzQxNSw2IEBACiAgICAgICAgICAgICByYWlzZSBLZXlFcnJvcihfbmFtZSkKIAogICAgICMKLSAgICAjIERlcHJlY2F0ZWQgbWV0aG9kcy4gIFRoZXNlIHdpbGwgYmUgcmVtb3ZlZCBpbiBlbWFpbCAzLjEuCi0gICAgIwotCi0gICAgZGVmIGdldF90eXBlKHNlbGYsIGZhaWxvYmo9Tm9uZSk6Ci0gICAgICAgICIiIlJldHVybnMgdGhlIG1lc3NhZ2UncyBjb250ZW50IHR5cGUuCi0KLSAgICAgICAgVGhlIHJldHVybmVkIHN0cmluZyBpcyBjb2VyY2VkIHRvIGxvd2VyY2FzZSBhbmQgcmV0dXJuZWQgYXMgYSBzaW5nbGUKLSAgICAgICAgc3RyaW5nIG9mIHRoZSBmb3JtIGBtYWludHlwZS9zdWJ0eXBlJy4gIElmIHRoZXJlIHdhcyBubyBDb250ZW50LVR5cGUKLSAgICAgICAgaGVhZGVyIGluIHRoZSBtZXNzYWdlLCBmYWlsb2JqIGlzIHJldHVybmVkIChkZWZhdWx0cyB0byBOb25lKS4KLSAgICAgICAgIiIiCi0gICAgICAgIHdhcm5pbmdzLndhcm4oJ2dldF90eXBlKCkgZGVwcmVjYXRlZDsgdXNlIGdldF9jb250ZW50X3R5cGUoKScsCi0gICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQotICAgICAgICBtaXNzaW5nID0gb2JqZWN0KCkKLSAgICAgICAgdmFsdWUgPSBzZWxmLmdldCgnY29udGVudC10eXBlJywgbWlzc2luZykKLSAgICAgICAgaWYgdmFsdWUgaXMgbWlzc2luZzoKLSAgICAgICAgICAgIHJldHVybiBmYWlsb2JqCi0gICAgICAgIHJldHVybiBwYXJhbXJlLnNwbGl0KHZhbHVlKVswXS5sb3dlcigpLnN0cmlwKCkKLQotICAgIGRlZiBnZXRfbWFpbl90eXBlKHNlbGYsIGZhaWxvYmo9Tm9uZSk6Ci0gICAgICAgICIiIlJldHVybiB0aGUgbWVzc2FnZSdzIG1haW4gY29udGVudCB0eXBlIGlmIHByZXNlbnQuIiIiCi0gICAgICAgIHdhcm5pbmdzLndhcm4oJ2dldF9tYWluX3R5cGUoKSBkZXByZWNhdGVkOyB1c2UgZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKScsCi0gICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLCAyKQotICAgICAgICBtaXNzaW5nID0gb2JqZWN0KCkKLSAgICAgICAgY3R5cGUgPSBzZWxmLmdldF90eXBlKG1pc3NpbmcpCi0gICAgICAgIGlmIGN0eXBlIGlzIG1pc3Npbmc6Ci0gICAgICAgICAgICByZXR1cm4gZmFpbG9iagotICAgICAgICBpZiBjdHlwZS5jb3VudCgnLycpIDw+IDE6Ci0gICAgICAgICAgICByZXR1cm4gZmFpbG9iagotICAgICAgICByZXR1cm4gY3R5cGUuc3BsaXQoJy8nKVswXQotCi0gICAgZGVmIGdldF9zdWJ0eXBlKHNlbGYsIGZhaWxvYmo9Tm9uZSk6Ci0gICAgICAgICIiIlJldHVybiB0aGUgbWVzc2FnZSdzIGNvbnRlbnQgc3VidHlwZSBpZiBwcmVzZW50LiIiIgotICAgICAgICB3YXJuaW5ncy53YXJuKCdnZXRfc3VidHlwZSgpIGRlcHJlY2F0ZWQ7IHVzZSBnZXRfY29udGVudF9zdWJ0eXBlKCknLAotICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKLSAgICAgICAgbWlzc2luZyA9IG9iamVjdCgpCi0gICAgICAgIGN0eXBlID0gc2VsZi5nZXRfdHlwZShtaXNzaW5nKQotICAgICAgICBpZiBjdHlwZSBpcyBtaXNzaW5nOgotICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKLSAgICAgICAgaWYgY3R5cGUuY291bnQoJy8nKSA8PiAxOgotICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKLSAgICAgICAgcmV0dXJuIGN0eXBlLnNwbGl0KCcvJylbMV0KLQotICAgICMKICAgICAjIFVzZSB0aGVzZSB0aHJlZSBtZXRob2RzIGluc3RlYWQgb2YgdGhlIHRocmVlIGFib3ZlLgogICAgICMKIApAQCAtNTM3LDcgKzQ5Niw3IEBACiAgICAgICAgICAgICAgICAgbmFtZSA9IHAuc3RyaXAoKQogICAgICAgICAgICAgICAgIHZhbCA9ICcnCiAgICAgICAgICAgICBwYXJhbXMuYXBwZW5kKChuYW1lLCB2YWwpKQotICAgICAgICBwYXJhbXMgPSBVdGlscy5kZWNvZGVfcGFyYW1zKHBhcmFtcykKKyAgICAgICAgcGFyYW1zID0gdXRpbHMuZGVjb2RlX3BhcmFtcyhwYXJhbXMpCiAgICAgICAgIHJldHVybiBwYXJhbXMKIAogICAgIGRlZiBnZXRfcGFyYW1zKHNlbGYsIGZhaWxvYmo9Tm9uZSwgaGVhZGVyPSdjb250ZW50LXR5cGUnLCB1bnF1b3RlPVRydWUpOgpAQCAtNzE0LDcgKzY3Myw3IEBACiAgICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYuZ2V0X3BhcmFtKCduYW1lJywgbWlzc2luZywgJ2NvbnRlbnQtZGlzcG9zaXRpb24nKQogICAgICAgICBpZiBmaWxlbmFtZSBpcyBtaXNzaW5nOgogICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKLSAgICAgICAgcmV0dXJuIFV0aWxzLmNvbGxhcHNlX3JmYzIyMzFfdmFsdWUoZmlsZW5hbWUpLnN0cmlwKCkKKyAgICAgICAgcmV0dXJuIHV0aWxzLmNvbGxhcHNlX3JmYzIyMzFfdmFsdWUoZmlsZW5hbWUpLnN0cmlwKCkKIAogICAgIGRlZiBnZXRfYm91bmRhcnkoc2VsZiwgZmFpbG9iaj1Ob25lKToKICAgICAgICAgIiIiUmV0dXJuIHRoZSBib3VuZGFyeSBhc3NvY2lhdGVkIHdpdGggdGhlIHBheWxvYWQgaWYgcHJlc2VudC4KQEAgLTcyNyw3ICs2ODYsNyBAQAogICAgICAgICBpZiBib3VuZGFyeSBpcyBtaXNzaW5nOgogICAgICAgICAgICAgcmV0dXJuIGZhaWxvYmoKICAgICAgICAgIyBSRkMgMjA0NiBzYXlzIHRoYXQgYm91bmRhcmllcyBtYXkgYmVnaW4gYnV0IG5vdCBlbmQgaW4gdy9zCi0gICAgICAgIHJldHVybiBVdGlscy5jb2xsYXBzZV9yZmMyMjMxX3ZhbHVlKGJvdW5kYXJ5KS5yc3RyaXAoKQorICAgICAgICByZXR1cm4gdXRpbHMuY29sbGFwc2VfcmZjMjIzMV92YWx1ZShib3VuZGFyeSkucnN0cmlwKCkKIAogICAgIGRlZiBzZXRfYm91bmRhcnkoc2VsZiwgYm91bmRhcnkpOgogICAgICAgICAiIiJTZXQgdGhlIGJvdW5kYXJ5IHBhcmFtZXRlciBpbiBDb250ZW50LVR5cGUgdG8gJ2JvdW5kYXJ5Jy4KQEAgLTc0NCw3ICs3MDMsNyBAQAogICAgICAgICBpZiBwYXJhbXMgaXMgbWlzc2luZzoKICAgICAgICAgICAgICMgVGhlcmUgd2FzIG5vIENvbnRlbnQtVHlwZSBoZWFkZXIsIGFuZCB3ZSBkb24ndCBrbm93IHdoYXQgdHlwZQogICAgICAgICAgICAgIyB0byBzZXQgaXQgdG8sIHNvIHJhaXNlIGFuIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgIHJhaXNlIEVycm9ycy5IZWFkZXJQYXJzZUVycm9yLCAnTm8gQ29udGVudC1UeXBlIGhlYWRlciBmb3VuZCcKKyAgICAgICAgICAgIHJhaXNlIGVycm9ycy5IZWFkZXJQYXJzZUVycm9yKCdObyBDb250ZW50LVR5cGUgaGVhZGVyIGZvdW5kJykKICAgICAgICAgbmV3cGFyYW1zID0gW10KICAgICAgICAgZm91bmRwID0gRmFsc2UKICAgICAgICAgZm9yIHBrLCBwdiBpbiBwYXJhbXM6CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvbWltZS9fX2luaXRfXy5weSBiL0xpYi9lbWFpbC9taW1lL19faW5pdF9fLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvbWltZS9fX2luaXRfXy5weQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL21pbWUvYXBwbGljYXRpb24ucHkgYi9MaWIvZW1haWwvbWltZS9hcHBsaWNhdGlvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjhiYjhhCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL21pbWUvYXBwbGljYXRpb24ucHkKQEAgLTAsMCArMSwzNiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBBdXRob3I6IEtlaXRoIERhcnQKKyMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKKworIiIiQ2xhc3MgcmVwcmVzZW50aW5nIGFwcGxpY2F0aW9uLyogdHlwZSBNSU1FIGRvY3VtZW50cy4iIiIKKworX19hbGxfXyA9IFsiTUlNRUFwcGxpY2F0aW9uIl0KKworZnJvbSBlbWFpbCBpbXBvcnQgZW5jb2RlcnMKK2Zyb20gZW1haWwubWltZS5ub25tdWx0aXBhcnQgaW1wb3J0IE1JTUVOb25NdWx0aXBhcnQKKworCitjbGFzcyBNSU1FQXBwbGljYXRpb24oTUlNRU5vbk11bHRpcGFydCk6CisgICAgIiIiQ2xhc3MgZm9yIGdlbmVyYXRpbmcgYXBwbGljYXRpb24vKiBNSU1FIGRvY3VtZW50cy4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfZGF0YSwgX3N1YnR5cGU9J29jdGV0LXN0cmVhbScsCisgICAgICAgICAgICAgICAgIF9lbmNvZGVyPWVuY29kZXJzLmVuY29kZV9iYXNlNjQsICoqX3BhcmFtcyk6CisgICAgICAgICIiIkNyZWF0ZSBhbiBhcHBsaWNhdGlvbi8qIHR5cGUgTUlNRSBkb2N1bWVudC4KKworICAgICAgICBfZGF0YSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSByYXcgYXBwbGljYXRvaW4gZGF0YS4KKworICAgICAgICBfc3VidHlwZSBpcyB0aGUgTUlNRSBjb250ZW50IHR5cGUgc3VidHlwZSwgZGVmYXVsdGluZyB0bworICAgICAgICAnb2N0ZXQtc3RyZWFtJy4KKworICAgICAgICBfZW5jb2RlciBpcyBhIGZ1bmN0aW9uIHdoaWNoIHdpbGwgcGVyZm9ybSB0aGUgYWN0dWFsIGVuY29kaW5nIGZvcgorICAgICAgICB0cmFuc3BvcnQgb2YgdGhlIGFwcGxpY2F0aW9uIGRhdGEsIGRlZmF1bHRpbmcgdG8gYmFzZTY0IGVuY29kaW5nLgorCisgICAgICAgIEFueSBhZGRpdGlvbmFsIGtleXdvcmQgYXJndW1lbnRzIGFyZSBwYXNzZWQgdG8gdGhlIGJhc2UgY2xhc3MKKyAgICAgICAgY29uc3RydWN0b3IsIHdoaWNoIHR1cm5zIHRoZW0gaW50byBwYXJhbWV0ZXJzIG9uIHRoZSBDb250ZW50LVR5cGUKKyAgICAgICAgaGVhZGVyLgorICAgICAgICAiIiIKKyAgICAgICAgaWYgX3N1YnR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvcignSW52YWxpZCBhcHBsaWNhdGlvbiBNSU1FIHN1YnR5cGUnKQorICAgICAgICBNSU1FTm9uTXVsdGlwYXJ0Ll9faW5pdF9fKHNlbGYsICdhcHBsaWNhdGlvbicsIF9zdWJ0eXBlLCAqKl9wYXJhbXMpCisgICAgICAgIHNlbGYuc2V0X3BheWxvYWQoX2RhdGEpCisgICAgICAgIF9lbmNvZGVyKHNlbGYpCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvTUlNRUF1ZGlvLnB5IGIvTGliL2VtYWlsL21pbWUvYXVkaW8ucHkKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gTGliL2VtYWlsL01JTUVBdWRpby5weQpyZW5hbWUgdG8gTGliL2VtYWlsL21pbWUvYXVkaW8ucHkKaW5kZXggMjY2ZWM0Yy4uYzcyOTBjNCAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL01JTUVBdWRpby5weQorKysgYi9MaWIvZW1haWwvbWltZS9hdWRpby5weQpAQCAtMSwxNSArMSwxNiBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IEFudGhvbnkgQmF4dGVyCiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKICIiIkNsYXNzIHJlcHJlc2VudGluZyBhdWRpby8qIHR5cGUgTUlNRSBkb2N1bWVudHMuIiIiCiAKLWltcG9ydCBzbmRoZHIKLWZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworX19hbGxfXyA9IFsnTUlNRUF1ZGlvJ10KIAotZnJvbSBlbWFpbCBpbXBvcnQgRXJyb3JzCi1mcm9tIGVtYWlsIGltcG9ydCBFbmNvZGVycwotZnJvbSBlbWFpbC5NSU1FTm9uTXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0CitpbXBvcnQgc25kaGRyCisKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworZnJvbSBlbWFpbCBpbXBvcnQgZW5jb2RlcnMKK2Zyb20gZW1haWwubWltZS5ub25tdWx0aXBhcnQgaW1wb3J0IE1JTUVOb25NdWx0aXBhcnQKIAogCiAMCkBAIC00Miw3ICs0Myw3IEBACiAgICAgIiIiQ2xhc3MgZm9yIGdlbmVyYXRpbmcgYXVkaW8vKiBNSU1FIGRvY3VtZW50cy4iIiIKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBfYXVkaW9kYXRhLCBfc3VidHlwZT1Ob25lLAotICAgICAgICAgICAgICAgICBfZW5jb2Rlcj1FbmNvZGVycy5lbmNvZGVfYmFzZTY0LCAqKl9wYXJhbXMpOgorICAgICAgICAgICAgICAgICBfZW5jb2Rlcj1lbmNvZGVycy5lbmNvZGVfYmFzZTY0LCAqKl9wYXJhbXMpOgogICAgICAgICAiIiJDcmVhdGUgYW4gYXVkaW8vKiB0eXBlIE1JTUUgZG9jdW1lbnQuCiAKICAgICAgICAgX2F1ZGlvZGF0YSBpcyBhIHN0cmluZyBjb250YWluaW5nIHRoZSByYXcgYXVkaW8gZGF0YS4gIElmIHRoaXMgZGF0YQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL01JTUVCYXNlLnB5IGIvTGliL2VtYWlsL21pbWUvYmFzZS5weQpzaW1pbGFyaXR5IGluZGV4IDc3JQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvTUlNRUJhc2UucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9taW1lL2Jhc2UucHkKaW5kZXggODg2OTFmOC4uYWM5MTkyNSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL01JTUVCYXNlLnB5CisrKyBiL0xpYi9lbWFpbC9taW1lL2Jhc2UucHkKQEAgLTEsMTQgKzEsMTYgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKICMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKIAogIiIiQmFzZSBjbGFzcyBmb3IgTUlNRSBzcGVjaWFsaXphdGlvbnMuIiIiCiAKLWZyb20gZW1haWwgaW1wb3J0IE1lc3NhZ2UKK19fYWxsX18gPSBbJ01JTUVCYXNlJ10KKworZnJvbSBlbWFpbCBpbXBvcnQgbWVzc2FnZQogCiAKIAwKLWNsYXNzIE1JTUVCYXNlKE1lc3NhZ2UuTWVzc2FnZSk6CitjbGFzcyBNSU1FQmFzZShtZXNzYWdlLk1lc3NhZ2UpOgogICAgICIiIkJhc2UgY2xhc3MgZm9yIE1JTUUgc3BlY2lhbGl6YXRpb25zLiIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9tYWludHlwZSwgX3N1YnR5cGUsICoqX3BhcmFtcyk6CkBAIC0xOCw3ICsyMCw3IEBACiAgICAgICAgIGFyZ3VtZW50cy4gIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhpcyBoZWFkZXIgYXJlIHRha2VuIGZyb20gdGhlCiAgICAgICAgIGtleXdvcmQgYXJndW1lbnRzLgogICAgICAgICAiIiIKLSAgICAgICAgTWVzc2FnZS5NZXNzYWdlLl9faW5pdF9fKHNlbGYpCisgICAgICAgIG1lc3NhZ2UuTWVzc2FnZS5fX2luaXRfXyhzZWxmKQogICAgICAgICBjdHlwZSA9ICclcy8lcycgJSAoX21haW50eXBlLCBfc3VidHlwZSkKICAgICAgICAgc2VsZi5hZGRfaGVhZGVyKCdDb250ZW50LVR5cGUnLCBjdHlwZSwgKipfcGFyYW1zKQogICAgICAgICBzZWxmWydNSU1FLVZlcnNpb24nXSA9ICcxLjAnCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvTUlNRUltYWdlLnB5IGIvTGliL2VtYWlsL21pbWUvaW1hZ2UucHkKc2ltaWxhcml0eSBpbmRleCA4NyUKcmVuYW1lIGZyb20gTGliL2VtYWlsL01JTUVJbWFnZS5weQpyZW5hbWUgdG8gTGliL2VtYWlsL21pbWUvaW1hZ2UucHkKaW5kZXggYTY1ODA2Ny4uNTU2MzgyMyAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL01JTUVJbWFnZS5weQorKysgYi9MaWIvZW1haWwvbWltZS9pbWFnZS5weQpAQCAtMSwxNCArMSwxNSBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IEJhcnJ5IFdhcnNhdwogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCiAiIiJDbGFzcyByZXByZXNlbnRpbmcgaW1hZ2UvKiB0eXBlIE1JTUUgZG9jdW1lbnRzLiIiIgogCitfX2FsbF9fID0gWydNSU1FSW1hZ2UnXQorCiBpbXBvcnQgaW1naGRyCiAKLWZyb20gZW1haWwgaW1wb3J0IEVycm9ycwotZnJvbSBlbWFpbCBpbXBvcnQgRW5jb2RlcnMKLWZyb20gZW1haWwuTUlNRU5vbk11bHRpcGFydCBpbXBvcnQgTUlNRU5vbk11bHRpcGFydAorZnJvbSBlbWFpbCBpbXBvcnQgZW5jb2RlcnMKK2Zyb20gZW1haWwubWltZS5ub25tdWx0aXBhcnQgaW1wb3J0IE1JTUVOb25NdWx0aXBhcnQKIAogCiAMCkBAIC0xNiw3ICsxNyw3IEBACiAgICAgIiIiQ2xhc3MgZm9yIGdlbmVyYXRpbmcgaW1hZ2UvKiB0eXBlIE1JTUUgZG9jdW1lbnRzLiIiIgogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIF9pbWFnZWRhdGEsIF9zdWJ0eXBlPU5vbmUsCi0gICAgICAgICAgICAgICAgIF9lbmNvZGVyPUVuY29kZXJzLmVuY29kZV9iYXNlNjQsICoqX3BhcmFtcyk6CisgICAgICAgICAgICAgICAgIF9lbmNvZGVyPWVuY29kZXJzLmVuY29kZV9iYXNlNjQsICoqX3BhcmFtcyk6CiAgICAgICAgICIiIkNyZWF0ZSBhbiBpbWFnZS8qIHR5cGUgTUlNRSBkb2N1bWVudC4KIAogICAgICAgICBfaW1hZ2VkYXRhIGlzIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHJhdyBpbWFnZSBkYXRhLiAgSWYgdGhpcyBkYXRhCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvTUlNRU1lc3NhZ2UucHkgYi9MaWIvZW1haWwvbWltZS9tZXNzYWdlLnB5CnNpbWlsYXJpdHkgaW5kZXggODAlCnJlbmFtZSBmcm9tIExpYi9lbWFpbC9NSU1FTWVzc2FnZS5weQpyZW5hbWUgdG8gTGliL2VtYWlsL21pbWUvbWVzc2FnZS5weQppbmRleCAzMDIxOTM0Li4yNzVkYmZkIDEwMDY0NAotLS0gYS9MaWIvZW1haWwvTUlNRU1lc3NhZ2UucHkKKysrIGIvTGliL2VtYWlsL21pbWUvbWVzc2FnZS5weQpAQCAtMSwxMSArMSwxMyBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IEJhcnJ5IFdhcnNhdwogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCiAiIiJDbGFzcyByZXByZXNlbnRpbmcgbWVzc2FnZS8qIE1JTUUgZG9jdW1lbnRzLiIiIgogCi1mcm9tIGVtYWlsIGltcG9ydCBNZXNzYWdlCi1mcm9tIGVtYWlsLk1JTUVOb25NdWx0aXBhcnQgaW1wb3J0IE1JTUVOb25NdWx0aXBhcnQKK19fYWxsX18gPSBbJ01JTUVNZXNzYWdlJ10KKworZnJvbSBlbWFpbCBpbXBvcnQgbWVzc2FnZQorZnJvbSBlbWFpbC5taW1lLm5vbm11bHRpcGFydCBpbXBvcnQgTUlNRU5vbk11bHRpcGFydAogCiAKIAwKQEAgLTIzLDEwICsyNSwxMCBAQAogICAgICAgICB0aGUgdGVybSAicmZjODIyIiBpcyB0ZWNobmljYWxseSBvdXRkYXRlZCBieSBSRkMgMjgyMikuCiAgICAgICAgICIiIgogICAgICAgICBNSU1FTm9uTXVsdGlwYXJ0Ll9faW5pdF9fKHNlbGYsICdtZXNzYWdlJywgX3N1YnR5cGUpCi0gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKF9tc2csIE1lc3NhZ2UuTWVzc2FnZSk6CisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKF9tc2csIG1lc3NhZ2UuTWVzc2FnZSk6CiAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoJ0FyZ3VtZW50IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBNZXNzYWdlJykKICAgICAgICAgIyBJdCdzIGNvbnZlbmllbnQgdG8gdXNlIHRoaXMgYmFzZSBjbGFzcyBtZXRob2QuICBXZSBuZWVkIHRvIGRvIGl0CiAgICAgICAgICMgdGhpcyB3YXkgb3Igd2UnbGwgZ2V0IGFuIGV4Y2VwdGlvbgotICAgICAgICBNZXNzYWdlLk1lc3NhZ2UuYXR0YWNoKHNlbGYsIF9tc2cpCisgICAgICAgIG1lc3NhZ2UuTWVzc2FnZS5hdHRhY2goc2VsZiwgX21zZykKICAgICAgICAgIyBBbmQgYmUgc3VyZSBvdXIgZGVmYXVsdCB0eXBlIGlzIHNldCBjb3JyZWN0bHkKICAgICAgICAgc2VsZi5zZXRfZGVmYXVsdF90eXBlKCdtZXNzYWdlL3JmYzgyMicpCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvTUlNRU11bHRpcGFydC5weSBiL0xpYi9lbWFpbC9taW1lL211bHRpcGFydC5weQpzaW1pbGFyaXR5IGluZGV4IDgzJQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvTUlNRU11bHRpcGFydC5weQpyZW5hbWUgdG8gTGliL2VtYWlsL21pbWUvbXVsdGlwYXJ0LnB5CmluZGV4IDkwNzJhNjQuLjVjOGM5ZGIgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9NSU1FTXVsdGlwYXJ0LnB5CisrKyBiL0xpYi9lbWFpbC9taW1lL211bHRpcGFydC5weQpAQCAtMSwxNCArMSwxNiBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IEJhcnJ5IFdhcnNhdwogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCiAiIiJCYXNlIGNsYXNzIGZvciBNSU1FIG11bHRpcGFydC8qIHR5cGUgbWVzc2FnZXMuIiIiCiAKLWZyb20gZW1haWwgaW1wb3J0IE1JTUVCYXNlCitfX2FsbF9fID0gWydNSU1FTXVsdGlwYXJ0J10KKworZnJvbSBlbWFpbC5taW1lLmJhc2UgaW1wb3J0IE1JTUVCYXNlCiAKIAogDAotY2xhc3MgTUlNRU11bHRpcGFydChNSU1FQmFzZS5NSU1FQmFzZSk6CitjbGFzcyBNSU1FTXVsdGlwYXJ0KE1JTUVCYXNlKToKICAgICAiIiJCYXNlIGNsYXNzIGZvciBNSU1FIG11bHRpcGFydC8qIHR5cGUgbWVzc2FnZXMuIiIiCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgX3N1YnR5cGU9J21peGVkJywgYm91bmRhcnk9Tm9uZSwgX3N1YnBhcnRzPU5vbmUsCkBAIC0zMSw3ICszMyw3IEBACiAgICAgICAgIEFkZGl0aW9uYWwgcGFyYW1ldGVycyBmb3IgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXIgYXJlIHRha2VuIGZyb20gdGhlCiAgICAgICAgIGtleXdvcmQgYXJndW1lbnRzIChvciBwYXNzZWQgaW50byB0aGUgX3BhcmFtcyBhcmd1bWVudCkuCiAgICAgICAgICIiIgotICAgICAgICBNSU1FQmFzZS5NSU1FQmFzZS5fX2luaXRfXyhzZWxmLCAnbXVsdGlwYXJ0JywgX3N1YnR5cGUsICoqX3BhcmFtcykKKyAgICAgICAgTUlNRUJhc2UuX19pbml0X18oc2VsZiwgJ211bHRpcGFydCcsIF9zdWJ0eXBlLCAqKl9wYXJhbXMpCiAgICAgICAgIGlmIF9zdWJwYXJ0czoKICAgICAgICAgICAgIGZvciBwIGluIF9zdWJwYXJ0czoKICAgICAgICAgICAgICAgICBzZWxmLmF0dGFjaChwKQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL01JTUVOb25NdWx0aXBhcnQucHkgYi9MaWIvZW1haWwvbWltZS9ub25tdWx0aXBhcnQucHkKc2ltaWxhcml0eSBpbmRleCA2OSUKcmVuYW1lIGZyb20gTGliL2VtYWlsL01JTUVOb25NdWx0aXBhcnQucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9taW1lL25vbm11bHRpcGFydC5weQppbmRleCA0MTk1ZDJhLi5kZDI4MGI1IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvTUlNRU5vbk11bHRpcGFydC5weQorKysgYi9MaWIvZW1haWwvbWltZS9ub25tdWx0aXBhcnQucHkKQEAgLTEsMTUgKzEsMTcgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAyLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKICMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKIAogIiIiQmFzZSBjbGFzcyBmb3IgTUlNRSB0eXBlIG1lc3NhZ2VzIHRoYXQgYXJlIG5vdCBtdWx0aXBhcnQuIiIiCiAKLWZyb20gZW1haWwgaW1wb3J0IEVycm9ycwotZnJvbSBlbWFpbCBpbXBvcnQgTUlNRUJhc2UKK19fYWxsX18gPSBbJ01JTUVOb25NdWx0aXBhcnQnXQorCitmcm9tIGVtYWlsIGltcG9ydCBlcnJvcnMKK2Zyb20gZW1haWwubWltZS5iYXNlIGltcG9ydCBNSU1FQmFzZQogCiAKIAwKLWNsYXNzIE1JTUVOb25NdWx0aXBhcnQoTUlNRUJhc2UuTUlNRUJhc2UpOgorY2xhc3MgTUlNRU5vbk11bHRpcGFydChNSU1FQmFzZSk6CiAgICAgIiIiQmFzZSBjbGFzcyBmb3IgTUlNRSBtdWx0aXBhcnQvKiB0eXBlIG1lc3NhZ2VzLiIiIgogCiAgICAgX19weWNoZWNrZXJfXyA9ICd1bnVzZWRuYW1lcz1wYXlsb2FkJwpAQCAtMTgsNyArMjAsNyBAQAogICAgICAgICAjIFRoZSBwdWJsaWMgQVBJIHByb2hpYml0cyBhdHRhY2hpbmcgbXVsdGlwbGUgc3VicGFydHMgdG8gTUlNRUJhc2UKICAgICAgICAgIyBkZXJpdmVkIHN1YnR5cGVzIHNpbmNlIG5vbmUgb2YgdGhlbSBhcmUsIGJ5IGRlZmluaXRpb24sIG9mIGNvbnRlbnQKICAgICAgICAgIyB0eXBlIG11bHRpcGFydC8qCi0gICAgICAgIHJhaXNlIEVycm9ycy5NdWx0aXBhcnRDb252ZXJzaW9uRXJyb3IoCisgICAgICAgIHJhaXNlIGVycm9ycy5NdWx0aXBhcnRDb252ZXJzaW9uRXJyb3IoCiAgICAgICAgICAgICAnQ2Fubm90IGF0dGFjaCBhZGRpdGlvbmFsIHN1YnBhcnRzIHRvIG5vbi1tdWx0aXBhcnQvKicpCiAKICAgICBkZWwgX19weWNoZWNrZXJfXwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL01JTUVUZXh0LnB5IGIvTGliL2VtYWlsL21pbWUvdGV4dC5weQpzaW1pbGFyaXR5IGluZGV4IDgyJQpyZW5hbWUgZnJvbSBMaWIvZW1haWwvTUlNRVRleHQucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9taW1lL3RleHQucHkKaW5kZXggNWVmMTg3Ni4uNTc0N2RiNSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL01JTUVUZXh0LnB5CisrKyBiL0xpYi9lbWFpbC9taW1lL3RleHQucHkKQEAgLTEsMTEgKzEsMTMgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBCYXJyeSBXYXJzYXcKICMgQ29udGFjdDogZW1haWwtc2lnQHB5dGhvbi5vcmcKIAogIiIiQ2xhc3MgcmVwcmVzZW50aW5nIHRleHQvKiB0eXBlIE1JTUUgZG9jdW1lbnRzLiIiIgogCi1mcm9tIGVtYWlsLk1JTUVOb25NdWx0aXBhcnQgaW1wb3J0IE1JTUVOb25NdWx0aXBhcnQKLWZyb20gZW1haWwuRW5jb2RlcnMgaW1wb3J0IGVuY29kZV83b3I4Yml0CitfX2FsbF9fID0gWydNSU1FVGV4dCddCisKK2Zyb20gZW1haWwuZW5jb2RlcnMgaW1wb3J0IGVuY29kZV83b3I4Yml0Citmcm9tIGVtYWlsLm1pbWUubm9ubXVsdGlwYXJ0IGltcG9ydCBNSU1FTm9uTXVsdGlwYXJ0CiAKIAogDApkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL1BhcnNlci5weSBiL0xpYi9lbWFpbC9wYXJzZXIucHkKc2ltaWxhcml0eSBpbmRleCA5NCUKcmVuYW1lIGZyb20gTGliL2VtYWlsL1BhcnNlci5weQpyZW5hbWUgdG8gTGliL2VtYWlsL3BhcnNlci5weQppbmRleCAwYzA1MjI0Li4yZmNhZjI1IDEwMDY0NAotLS0gYS9MaWIvZW1haWwvUGFyc2VyLnB5CisrKyBiL0xpYi9lbWFpbC9wYXJzZXIucHkKQEAgLTEsMTMgKzEsMTYgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDQgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KKyMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDYgUHl0aG9uIFNvZnR3YXJlIEZvdW5kYXRpb24KICMgQXV0aG9yOiBCYXJyeSBXYXJzYXcsIFRob21hcyBXb3V0ZXJzLCBBbnRob255IEJheHRlcgogIyBDb250YWN0OiBlbWFpbC1zaWdAcHl0aG9uLm9yZwogCiAiIiJBIHBhcnNlciBvZiBSRkMgMjgyMiBhbmQgTUlNRSBlbWFpbCBtZXNzYWdlcy4iIiIKIAorX19hbGxfXyA9IFsnUGFyc2VyJywgJ0hlYWRlclBhcnNlciddCisKIGltcG9ydCB3YXJuaW5ncwogZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCi1mcm9tIGVtYWlsLkZlZWRQYXJzZXIgaW1wb3J0IEZlZWRQYXJzZXIKLWZyb20gZW1haWwuTWVzc2FnZSBpbXBvcnQgTWVzc2FnZQorCitmcm9tIGVtYWlsLmZlZWRwYXJzZXIgaW1wb3J0IEZlZWRQYXJzZXIKK2Zyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgTWVzc2FnZQogCiAKIAwKZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC9xdW9wcmlNSU1FLnB5IGIvTGliL2VtYWlsL3F1b3ByaW1pbWUucHkKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gTGliL2VtYWlsL3F1b3ByaU1JTUUucHkKcmVuYW1lIHRvIExpYi9lbWFpbC9xdW9wcmltaW1lLnB5CmluZGV4IGE5YjVkNDkuLmE1NjU4ZGQgMTAwNjQ0Ci0tLSBhL0xpYi9lbWFpbC9xdW9wcmlNSU1FLnB5CisrKyBiL0xpYi9lbWFpbC9xdW9wcmltaW1lLnB5CkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgogIyBBdXRob3I6IEJlbiBHZXJ0emZpZWxkCiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKQEAgLTI2LDkgKzI2LDI3IEBACiB3cmFwcGluZyBpc3N1ZXMsIHVzZSB0aGUgZW1haWwuSGVhZGVyIG1vZHVsZS4KICIiIgogCitfX2FsbF9fID0gWworICAgICdib2R5X2RlY29kZScsCisgICAgJ2JvZHlfZW5jb2RlJywKKyAgICAnYm9keV9xdW9wcmlfY2hlY2snLAorICAgICdib2R5X3F1b3ByaV9sZW4nLAorICAgICdkZWNvZGUnLAorICAgICdkZWNvZGVzdHJpbmcnLAorICAgICdlbmNvZGUnLAorICAgICdlbmNvZGVzdHJpbmcnLAorICAgICdoZWFkZXJfZGVjb2RlJywKKyAgICAnaGVhZGVyX2VuY29kZScsCisgICAgJ2hlYWRlcl9xdW9wcmlfY2hlY2snLAorICAgICdoZWFkZXJfcXVvcHJpX2xlbicsCisgICAgJ3F1b3RlJywKKyAgICAndW5xdW90ZScsCisgICAgXQorCiBpbXBvcnQgcmUKKwogZnJvbSBzdHJpbmcgaW1wb3J0IGhleGRpZ2l0cwotZnJvbSBlbWFpbC5VdGlscyBpbXBvcnQgZml4X2VvbHMKK2Zyb20gZW1haWwudXRpbHMgaW1wb3J0IGZpeF9lb2xzCiAKIENSTEYgPSAnXHJcbicKIE5MID0gJ1xuJwpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weSBiL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWwucHkKaW5kZXggNWE0MmMyMi4uZDk3NzY5MyAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbC5weQorKysgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsLnB5CkBAIC0zOSw5ICszOSw2IEBACiBFTVBUWVNUUklORyA9ICcnCiBTUEFDRSA9ICcgJwogCi0jIFdlIGRvbid0IGNhcmUgYWJvdXQgRGVwcmVjYXRpb25XYXJuaW5ncwotd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoJ2lnbm9yZScsICcnLCBEZXByZWNhdGlvbldhcm5pbmcsIF9fbmFtZV9fKQotCiAKIAwKIGRlZiBvcGVuZmlsZShmaWxlbmFtZSwgbW9kZT0ncicpOgpAQCAtODcsNyArODQsNyBAQAogICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCgnaXNvLTg4NTktMScpCiAgICAgICAgIG1zZy5zZXRfY2hhcnNldChjaGFyc2V0KQogICAgICAgICBlcShtc2dbJ21pbWUtdmVyc2lvbiddLCAnMS4wJykKLSAgICAgICAgZXEobXNnLmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbjsgY2hhcnNldD0iaXNvLTg4NTktMSInKQogICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JyksICdpc28tODg1OS0xJykKICAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICdxdW90ZWQtcHJpbnRhYmxlJykKQEAgLTIxMSw2ICsyMDgsMTkgQEAKICAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdmb28nKQogICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCAnZm9vJykKIAorICAgIGRlZiB0ZXN0X2RlY29kZV9ib2d1c191dV9wYXlsb2FkX3F1aWV0bHkoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ2JlZ2luIDY2NCBmb28udHh0XG4lPFcxRj0wMDAwSCBcbiBcbmVuZFxuJykKKyAgICAgICAgbXNnWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10gPSAneC11dWVuY29kZScKKyAgICAgICAgb2xkX3N0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLnN0ZGVyciA9IHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgICMgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGUgcGF5bG9hZAorICAgICAgICAgICAgbXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLnN0ZGVyciA9IG9sZF9zdGRlcnIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZnAuZ2V0dmFsdWUoKSwgJycpCisKICAgICBkZWYgdGVzdF9kZWNvZGVkX2dlbmVyYXRvcihzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCiAgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA3LnR4dCcpCkBAIC04OTMsNyArOTAzLDcgQEAKICAgICAgICAgc2VsZi5fYXUgPSBNSU1FQXVkaW8oc2VsZi5fYXVkaW9kYXRhKQogCiAgICAgZGVmIHRlc3RfZ3Vlc3NfbWlub3JfdHlwZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9hdS5nZXRfdHlwZSgpLCAnYXVkaW8vYmFzaWMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2F1LmdldF9jb250ZW50X3R5cGUoKSwgJ2F1ZGlvL2Jhc2ljJykKIAogICAgIGRlZiB0ZXN0X2VuY29kaW5nKHNlbGYpOgogICAgICAgICBwYXlsb2FkID0gc2VsZi5fYXUuZ2V0X3BheWxvYWQoKQpAQCAtOTAxLDcgKzkxMSw3IEBACiAKICAgICBkZWYgdGVzdF9jaGVja1NldE1pbm9yKHNlbGYpOgogICAgICAgICBhdSA9IE1JTUVBdWRpbyhzZWxmLl9hdWRpb2RhdGEsICdmaXNoJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhdS5nZXRfdHlwZSgpLCAnYXVkaW8vZmlzaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYXUuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXVkaW8vZmlzaCcpCiAKICAgICBkZWYgdGVzdF9hZGRfaGVhZGVyKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTkzNiw3ICs5NDYsNyBAQAogICAgICAgICBzZWxmLl9pbSA9IE1JTUVJbWFnZShzZWxmLl9pbWdkYXRhKQogCiAgICAgZGVmIHRlc3RfZ3Vlc3NfbWlub3JfdHlwZShzZWxmKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9pbS5nZXRfdHlwZSgpLCAnaW1hZ2UvZ2lmJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9pbS5nZXRfY29udGVudF90eXBlKCksICdpbWFnZS9naWYnKQogCiAgICAgZGVmIHRlc3RfZW5jb2Rpbmcoc2VsZik6CiAgICAgICAgIHBheWxvYWQgPSBzZWxmLl9pbS5nZXRfcGF5bG9hZCgpCkBAIC05NDQsNyArOTU0LDcgQEAKIAogICAgIGRlZiB0ZXN0X2NoZWNrU2V0TWlub3Ioc2VsZik6CiAgICAgICAgIGltID0gTUlNRUltYWdlKHNlbGYuX2ltZ2RhdGEsICdmaXNoJykKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbS5nZXRfdHlwZSgpLCAnaW1hZ2UvZmlzaCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnaW1hZ2UvZmlzaCcpCiAKICAgICBkZWYgdGVzdF9hZGRfaGVhZGVyKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTk3Niw3ICs5ODYsNyBAQAogICAgIGRlZiB0ZXN0X3R5cGVzKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKICAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCi0gICAgICAgIGVxKHNlbGYuX21zZy5nZXRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHNlbGYuX21zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgZXEoc2VsZi5fbXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCAndXMtYXNjaWknKQogICAgICAgICBtaXNzaW5nID0gW10KICAgICAgICAgdW5sZXNzKHNlbGYuX21zZy5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpIGlzIG1pc3NpbmcpCkBAIC0xMDQ1LDcgKzEwNTUsNyBAQAogICAgICAgICAjIHRlc3RzCiAgICAgICAgIG0gPSBzZWxmLl9tc2cKICAgICAgICAgdW5sZXNzKG0uaXNfbXVsdGlwYXJ0KCkpCi0gICAgICAgIGVxKG0uZ2V0X3R5cGUoKSwgJ211bHRpcGFydC9taXhlZCcpCisgICAgICAgIGVxKG0uZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L21peGVkJykKICAgICAgICAgZXEobGVuKG0uZ2V0X3BheWxvYWQoKSksIDIpCiAgICAgICAgIHJhaXNlcyhJbmRleEVycm9yLCBtLmdldF9wYXlsb2FkLCAyKQogICAgICAgICBtMCA9IG0uZ2V0X3BheWxvYWQoMCkKQEAgLTEzNzksNyArMTM4OSw3IEBACiAgICAgZGVmIHRlc3RfcGFyc2VfbWlzc2luZ19taW5vcl90eXBlKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKICAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTQudHh0JykKLSAgICAgICAgZXEobXNnLmdldF90eXBlKCksICd0ZXh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQogICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQogCkBAIC0xNTMxLDcgKzE1NDEsNyBAQAogICAgICAgICBtID0gTWVzc2FnZSgpCiAgICAgICAgIG1bJ1N1YmplY3QnXSA9IHN1YmplY3QKICAgICAgICAgciA9IE1JTUVNZXNzYWdlKG0pCi0gICAgICAgIGVxKHIuZ2V0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoci5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIHBheWxvYWQgPSByLmdldF9wYXlsb2FkKCkKICAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCiAgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKQEAgLTE1NzIsNyArMTU4Miw3IEBACiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAogICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKICAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTEudHh0JykKLSAgICAgICAgZXEobXNnLmdldF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIHBheWxvYWQgPSBtc2cuZ2V0X3BheWxvYWQoKQogICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShwYXlsb2FkLCBsaXN0KSkKICAgICAgICAgZXEobGVuKHBheWxvYWQpLCAxKQpAQCAtMTU4NiwxMiArMTU5NiwxMiBAQAogICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKICAgICAgICAgIyBtc2cgMTYgaXMgYSBEZWxpdmVyeSBTdGF0dXMgTm90aWZpY2F0aW9uLCBzZWUgUkZDIDE4OTQKICAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTYudHh0JykKLSAgICAgICAgZXEobXNnLmdldF90eXBlKCksICdtdWx0aXBhcnQvcmVwb3J0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ211bHRpcGFydC9yZXBvcnQnKQogICAgICAgICB1bmxlc3MobXNnLmlzX211bHRpcGFydCgpKQogICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAzKQogICAgICAgICAjIFN1YnBhcnQgMSBpcyBhIHRleHQvcGxhaW4sIGh1bWFuIHJlYWRhYmxlIHNlY3Rpb24KICAgICAgICAgc3VicGFydCA9IG1zZy5nZXRfcGF5bG9hZCgwKQotICAgICAgICBlcShzdWJwYXJ0LmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgZXEoc3VicGFydC5nZXRfcGF5bG9hZCgpLCAiIiJcCiBUaGlzIHJlcG9ydCByZWxhdGVzIHRvIGEgbWVzc2FnZSB5b3Ugc2VudCB3aXRoIHRoZSBmb2xsb3dpbmcgaGVhZGVyIGZpZWxkczoKIApAQCAtMTYxMSw3ICsxNjIxLDcgQEAKICAgICAgICAgIyBjb25zaXN0cyBvZiB0d28gYmxvY2tzIG9mIGhlYWRlcnMsIHJlcHJlc2VudGVkIGJ5IHR3byBuZXN0ZWQgTWVzc2FnZQogICAgICAgICAjIG9iamVjdHMuCiAgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMSkKLSAgICAgICAgZXEoc3VicGFydC5nZXRfdHlwZSgpLCAnbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMnKQorICAgICAgICBlcShzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvZGVsaXZlcnktc3RhdHVzJykKICAgICAgICAgZXEobGVuKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSksIDIpCiAgICAgICAgICMgbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMgc2hvdWxkIHRyZWF0IGVhY2ggYmxvY2sgYXMgYSBidW5jaCBvZgogICAgICAgICAjIGhlYWRlcnMsIGkuZS4gYSBidW5jaCBvZiBNZXNzYWdlIG9iamVjdHMuCkBAIC0xNjI5LDEzICsxNjM5LDEzIEBACiAgICAgICAgIGVxKGRzbjIuZ2V0X3BhcmFtKCdyZmM4MjInLCBoZWFkZXI9J2ZpbmFsLXJlY2lwaWVudCcpLCAnJykKICAgICAgICAgIyBTdWJwYXJ0IDMgaXMgdGhlIG9yaWdpbmFsIG1lc3NhZ2UKICAgICAgICAgc3VicGFydCA9IG1zZy5nZXRfcGF5bG9hZCgyKQotICAgICAgICBlcShzdWJwYXJ0LmdldF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBwYXlsb2FkID0gc3VicGFydC5nZXRfcGF5bG9hZCgpCiAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQogICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCiAgICAgICAgIHN1YnN1YnBhcnQgPSBwYXlsb2FkWzBdCiAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHN1YnN1YnBhcnQsIE1lc3NhZ2UpKQotICAgICAgICBlcShzdWJzdWJwYXJ0LmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoc3Vic3VicGFydC5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgZXEoc3Vic3VicGFydFsnbWVzc2FnZS1pZCddLAogICAgICAgICAgICAnPDAwMjAwMWMxNDRhNiQ4NzUyZTA2MCQ1NjEwNDU4NkBveHkuZWR1PicpCiAKQEAgLTE3MDYsMTYgKzE3MTYsMTYgQEAKICAgICAgICAgICAgIGZwLmNsb3NlKCkKICAgICAgICAgY29udGFpbmVyMSA9IG1zZy5nZXRfcGF5bG9hZCgwKQogICAgICAgICBlcShjb250YWluZXIxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKLSAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfdHlwZSgpLCBOb25lKQorICAgICAgICBlcShjb250YWluZXIxLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgY29udGFpbmVyMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQogICAgICAgICBlcShjb250YWluZXIyLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKLSAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfdHlwZSgpLCBOb25lKQorICAgICAgICBlcShjb250YWluZXIyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgY29udGFpbmVyMWEgPSBjb250YWluZXIxLmdldF9wYXlsb2FkKDApCiAgICAgICAgIGVxKGNvbnRhaW5lcjFhLmdldF9kZWZhdWx0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQotICAgICAgICBlcShjb250YWluZXIxYS5nZXRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKGNvbnRhaW5lcjFhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBjb250YWluZXIyYSA9IGNvbnRhaW5lcjIuZ2V0X3BheWxvYWQoMCkKICAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAndGV4dC9wbGFpbicpCi0gICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAKICAgICBkZWYgdGVzdF9kZWZhdWx0X3R5cGVfd2l0aF9leHBsaWNpdF9jb250YWluZXJfdHlwZShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCkBAIC0xNzI2LDE2ICsxNzM2LDE2IEBACiAgICAgICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgIGNvbnRhaW5lcjEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKICAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCi0gICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIGNvbnRhaW5lcjIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKICAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCi0gICAgICAgIGVxKGNvbnRhaW5lcjIuZ2V0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIGNvbnRhaW5lcjFhID0gY29udGFpbmVyMS5nZXRfcGF5bG9hZCgwKQogICAgICAgICBlcShjb250YWluZXIxYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKLSAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShjb250YWluZXIxYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgY29udGFpbmVyMmEgPSBjb250YWluZXIyLmdldF9wYXlsb2FkKDApCiAgICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF9kZWZhdWx0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQotICAgICAgICBlcShjb250YWluZXIyYS5nZXRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogCiAgICAgZGVmIHRlc3RfZGVmYXVsdF90eXBlX25vbl9wYXJzZWQoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtMTc1MCw5ICsxNzYwLDkgQEAKICAgICAgICAgc3VicGFydDIgPSBNSU1FTWVzc2FnZShzdWJwYXJ0MmEpCiAgICAgICAgIGNvbnRhaW5lci5hdHRhY2goc3VicGFydDEpCiAgICAgICAgIGNvbnRhaW5lci5hdHRhY2goc3VicGFydDIpCi0gICAgICAgIGVxKHN1YnBhcnQxLmdldF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQxLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgZXEoc3VicGFydDEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQotICAgICAgICBlcShzdWJwYXJ0Mi5nZXRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0Mi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIGVxKHN1YnBhcnQyLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgbmVxKGNvbnRhaW5lci5hc19zdHJpbmcoMCksICcnJ1wKIENvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L2RpZ2VzdDsgYm91bmRhcnk9IkJPVU5EQVJZIgpAQCAtMTc4NCw5ICsxNzk0LDkgQEAKICAgICAgICAgZGVsIHN1YnBhcnQxWydtaW1lLXZlcnNpb24nXQogICAgICAgICBkZWwgc3VicGFydDJbJ2NvbnRlbnQtdHlwZSddCiAgICAgICAgIGRlbCBzdWJwYXJ0MlsnbWltZS12ZXJzaW9uJ10KLSAgICAgICAgZXEoc3VicGFydDEuZ2V0X3R5cGUoKSwgTm9uZSkKKyAgICAgICAgZXEoc3VicGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBlcShzdWJwYXJ0MS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCi0gICAgICAgIGVxKHN1YnBhcnQyLmdldF90eXBlKCksIE5vbmUpCisgICAgICAgIGVxKHN1YnBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgZXEoc3VicGFydDIuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQogICAgICAgICBuZXEoY29udGFpbmVyLmFzX3N0cmluZygwKSwgJycnXAogQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvZGlnZXN0OyBib3VuZGFyeT0iQk9VTkRBUlkiCkBAIC0xODQ3LDcgKzE4NTcsNyBAQAogICAgIGRlZiB0ZXN0X3BhcnNlX3RleHRfbWVzc2FnZShzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFscwogICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQotICAgICAgICBlcShtc2cuZ2V0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCiAgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCiAgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKClbMV0sICgnY2hhcnNldCcsICd1cy1hc2NpaScpKQpAQCAtMTg1OSw3ICsxODY5LDcgQEAKICAgICBkZWYgdGVzdF9wYXJzZV91bnR5cGVkX21lc3NhZ2Uoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbHMKICAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKLSAgICAgICAgZXEobXNnLmdldF90eXBlKCksIE5vbmUpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwgTm9uZSkKICAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCBOb25lKQogICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKQEAgLTE5MzMsNyArMTk0Myw3IEBACiAgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcwogICAgICAgICAjIEdldCBhIG1lc3NhZ2Ugb2JqZWN0IGFuZCByZXNldCB0aGUgc2VlayBwb2ludGVyIGZvciBvdGhlciB0ZXN0cwogICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQotICAgICAgICBlcShtc2cuZ2V0X3R5cGUoKSwgJ211bHRpcGFydC9yZXBvcnQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCiAgICAgICAgICMgVGVzdCB0aGUgQ29udGVudC1UeXBlOiBwYXJhbWV0ZXJzCiAgICAgICAgIHBhcmFtcyA9IHt9CiAgICAgICAgIGZvciBwaywgcHYgaW4gbXNnLmdldF9wYXJhbXMoKToKQEAgLTE5NDUsMTMgKzE5NTUsMTMgQEAKICAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMykKICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHN1YnBhcnRzIGFyZSB3aGF0IHdlIGV4cGVjdAogICAgICAgICBtc2cxID0gbXNnLmdldF9wYXlsb2FkKDApCi0gICAgICAgIGVxKG1zZzEuZ2V0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBlcShtc2cxLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKICAgICAgICAgbXNnMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQotICAgICAgICBlcShtc2cyLmdldF90eXBlKCksIE5vbmUpCisgICAgICAgIGVxKG1zZzIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAgICAgICAgIGVxKG1zZzIuZ2V0X3BheWxvYWQoKSwgJ1lhZGRhIHlhZGRhIHlhZGRhXG4nKQogICAgICAgICBtc2czID0gbXNnLmdldF9wYXlsb2FkKDIpCi0gICAgICAgIGVxKG1zZzMuZ2V0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEobXNnMy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZzMsIE1lc3NhZ2UpKQogICAgICAgICBwYXlsb2FkID0gbXNnMy5nZXRfcGF5bG9hZCgpCiAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQpAQCAtMTk2NSw3ICsxOTc1LDcgQEAKICAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCiAgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA2LnR4dCcpCiAgICAgICAgICMgQ2hlY2sgc29tZSBvZiB0aGUgb3V0ZXIgaGVhZGVycwotICAgICAgICBlcShtc2cuZ2V0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKICAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHBheWxvYWQgaXMgYSBsaXN0IG9mIGV4YWN0bHkgb25lIHN1Yi1NZXNzYWdlLCBhbmQgdGhhdAogICAgICAgICAjIHRoYXQgc3VibWVzc2FnZSBoYXMgYSB0eXBlIG9mIHRleHQvcGxhaW4KICAgICAgICAgcGF5bG9hZCA9IG1zZy5nZXRfcGF5bG9hZCgpCkBAIC0xOTczLDcgKzE5ODMsNyBAQAogICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCiAgICAgICAgIG1zZzEgPSBwYXlsb2FkWzBdCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZzEsIE1lc3NhZ2UpKQotICAgICAgICBlcShtc2cxLmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnMS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UobXNnMS5nZXRfcGF5bG9hZCgpLCBzdHIpKQogICAgICAgICBlcShtc2cxLmdldF9wYXlsb2FkKCksICdcbicpCiAKQEAgLTIwNTgsMTMgKzIwNjgsMTkgQEAKICAgICAgICAgbW9kdWxlID0gX19pbXBvcnRfXygnZW1haWwnKQogICAgICAgICBhbGwgPSBtb2R1bGUuX19hbGxfXwogICAgICAgICBhbGwuc29ydCgpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsLCBbJ0NoYXJzZXQnLCAnRW5jb2RlcnMnLCAnRXJyb3JzJywgJ0dlbmVyYXRvcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0hlYWRlcicsICdJdGVyYXRvcnMnLCAnTUlNRUF1ZGlvJywgJ01JTUVCYXNlJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTUlNRUltYWdlJywgJ01JTUVNZXNzYWdlJywgJ01JTUVNdWx0aXBhcnQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNSU1FTm9uTXVsdGlwYXJ0JywgJ01JTUVUZXh0JywgJ01lc3NhZ2UnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQYXJzZXInLCAnVXRpbHMnLCAnYmFzZTY0TUlNRScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ21lc3NhZ2VfZnJvbV9maWxlJywgJ21lc3NhZ2VfZnJvbV9zdHJpbmcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdxdW9wcmlNSU1FJ10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsLCBbCisgICAgICAgICAgICAjIE9sZCBuYW1lcworICAgICAgICAgICAgJ0NoYXJzZXQnLCAnRW5jb2RlcnMnLCAnRXJyb3JzJywgJ0dlbmVyYXRvcicsCisgICAgICAgICAgICAnSGVhZGVyJywgJ0l0ZXJhdG9ycycsICdNSU1FQXVkaW8nLCAnTUlNRUJhc2UnLAorICAgICAgICAgICAgJ01JTUVJbWFnZScsICdNSU1FTWVzc2FnZScsICdNSU1FTXVsdGlwYXJ0JywKKyAgICAgICAgICAgICdNSU1FTm9uTXVsdGlwYXJ0JywgJ01JTUVUZXh0JywgJ01lc3NhZ2UnLAorICAgICAgICAgICAgJ1BhcnNlcicsICdVdGlscycsICdiYXNlNjRNSU1FJywKKyAgICAgICAgICAgICMgbmV3IG5hbWVzCisgICAgICAgICAgICAnYmFzZTY0bWltZScsICdjaGFyc2V0JywgJ2VuY29kZXJzJywgJ2Vycm9ycycsICdnZW5lcmF0b3InLAorICAgICAgICAgICAgJ2hlYWRlcicsICdpdGVyYXRvcnMnLCAnbWVzc2FnZScsICdtZXNzYWdlX2Zyb21fZmlsZScsCisgICAgICAgICAgICAnbWVzc2FnZV9mcm9tX3N0cmluZycsICdtaW1lJywgJ3BhcnNlcicsCisgICAgICAgICAgICAncXVvcHJpTUlNRScsICdxdW9wcmltaW1lJywgJ3V0aWxzJywKKyAgICAgICAgICAgIF0pCiAKICAgICBkZWYgdGVzdF9mb3JtYXRkYXRlKHNlbGYpOgogICAgICAgICBub3cgPSB0aW1lLnRpbWUoKQpAQCAtMjA5NywxMiArMjExMywxMiBAQAogICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9ub19kYXlvZndlZWsoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAogICAgICAgICBlcShVdGlscy5wYXJzZWRhdGVfdHooJzI1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJyksCi0gICAgICAgICAgICgyMDAzLCAyLCAyNSwgMTMsIDQ3LCAyNiwgMCwgMSwgMCwgLTI4ODAwKSkKKyAgICAgICAgICAgKDIwMDMsIDIsIDI1LCAxMywgNDcsIDI2LCAwLCAxLCAtMSwgLTI4ODAwKSkKIAogICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9jb21wYWN0X25vX2RheW9md2VlayhzZWxmKToKICAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCiAgICAgICAgIGVxKFV0aWxzLnBhcnNlZGF0ZV90eignNSBGZWIgMjAwMyAxMzo0NzoyNiAtMDgwMCcpLAotICAgICAgICAgICAoMjAwMywgMiwgNSwgMTMsIDQ3LCAyNiwgMCwgMSwgMCwgLTI4ODAwKSkKKyAgICAgICAgICAgKDIwMDMsIDIsIDUsIDEzLCA0NywgMjYsIDAsIDEsIC0xLCAtMjg4MDApKQogCiAgICAgZGVmIHRlc3RfcGFyc2VkYXRlX2FjY2VwdGFibGVfdG9fdGltZV9mdW5jdGlvbnMoc2VsZik6CiAgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbApAQCAtMjM1Niw3ICsyMzcyLDcgQEAKICAgICAgICAgICAgIGZwLmNsb3NlKCkKICAgICAgICAgZXEobXNnWydmcm9tJ10sICdwcHAtcmVxdWVzdEB6enoub3JnJykKICAgICAgICAgZXEobXNnWyd0byddLCAncHBwQHp6ei5vcmcnKQotICAgICAgICBlcShtc2cuZ2V0X3R5cGUoKSwgJ211bHRpcGFydC9taXhlZCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvbWl4ZWQnKQogICAgICAgICBzZWxmLmZhaWxJZihtc2cuaXNfbXVsdGlwYXJ0KCkpCiAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZy5nZXRfcGF5bG9hZCgpLCBzdHIpKQogCkBAIC0yNDA1LDEwICsyNDIxLDEwIEBACiAgICAgICAgICAgICBmcC5jbG9zZSgpCiAgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDIpCiAgICAgICAgIHBhcnQxID0gbXNnLmdldF9wYXlsb2FkKDApCi0gICAgICAgIGVxKHBhcnQxLmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEocGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCiAgICAgICAgIGVxKHBhcnQxLmdldF9wYXlsb2FkKCksICdTaW1wbGUgZW1haWwgd2l0aCBhdHRhY2htZW50LlxyXG5cclxuJykKICAgICAgICAgcGFydDIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKLSAgICAgICAgZXEocGFydDIuZ2V0X3R5cGUoKSwgJ2FwcGxpY2F0aW9uL3Jpc2NvcycpCisgICAgICAgIGVxKHBhcnQyLmdldF9jb250ZW50X3R5cGUoKSwgJ2FwcGxpY2F0aW9uL3Jpc2NvcycpCiAKICAgICBkZWYgdGVzdF9tdWx0aXBhcnRfZGlnZXN0X3dpdGhfZXh0cmFfbWltZV9oZWFkZXJzKHNlbGYpOgogICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKQEAgLTI0MjcsMjEgKzI0NDMsMjEgQEAKICAgICAgICAgZXEobXNnLmlzX211bHRpcGFydCgpLCAxKQogICAgICAgICBlcShsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAyKQogICAgICAgICBwYXJ0MSA9IG1zZy5nZXRfcGF5bG9hZCgwKQotICAgICAgICBlcShwYXJ0MS5nZXRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShwYXJ0MS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIGVxKHBhcnQxLmlzX211bHRpcGFydCgpLCAxKQogICAgICAgICBlcShsZW4ocGFydDEuZ2V0X3BheWxvYWQoKSksIDEpCiAgICAgICAgIHBhcnQxYSA9IHBhcnQxLmdldF9wYXlsb2FkKDApCiAgICAgICAgIGVxKHBhcnQxYS5pc19tdWx0aXBhcnQoKSwgMCkKLSAgICAgICAgZXEocGFydDFhLmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEocGFydDFhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBuZXEocGFydDFhLmdldF9wYXlsb2FkKCksICdtZXNzYWdlIDFcbicpCiAgICAgICAgICMgbmV4dCBtZXNzYWdlL3JmYzgyMgogICAgICAgICBwYXJ0MiA9IG1zZy5nZXRfcGF5bG9hZCgxKQotICAgICAgICBlcShwYXJ0Mi5nZXRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShwYXJ0Mi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCiAgICAgICAgIGVxKHBhcnQyLmlzX211bHRpcGFydCgpLCAxKQogICAgICAgICBlcShsZW4ocGFydDIuZ2V0X3BheWxvYWQoKSksIDEpCiAgICAgICAgIHBhcnQyYSA9IHBhcnQyLmdldF9wYXlsb2FkKDApCiAgICAgICAgIGVxKHBhcnQyYS5pc19tdWx0aXBhcnQoKSwgMCkKLSAgICAgICAgZXEocGFydDJhLmdldF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEocGFydDJhLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQogICAgICAgICBuZXEocGFydDJhLmdldF9wYXlsb2FkKCksICdtZXNzYWdlIDJcbicpCiAKICAgICBkZWYgdGVzdF90aHJlZV9saW5lcyhzZWxmKToKQEAgLTI3MjMsNiArMjczOSwxMSBAQAogICAgICAgICBjID0gQ2hhcnNldCgnZmFrZScpCiAgICAgICAgIGVxKCdoZWxsbyB3XHhmNnJsZCcsIGMuYm9keV9lbmNvZGUoJ2hlbGxvIHdceGY2cmxkJykpCiAKKyAgICBkZWYgdGVzdF91bmljb2RlX2NoYXJzZXRfbmFtZShzZWxmKToKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQodSd1cy1hc2NpaScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGNoYXJzZXQpLCAndXMtYXNjaWknKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhFcnJvcnMuQ2hhcnNldEVycm9yLCBDaGFyc2V0LCAnYXNjXHhmZmlpJykKKwogCiAMCiAjIFRlc3QgbXVsdGlsaW5ndWFsIE1JTUUgaGVhZGVycy4KZGlmZiAtLWdpdCBhL0xpYi9lbWFpbC90ZXN0L3Rlc3RfZW1haWxfY29kZWNzLnB5IGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHkKaW5kZXggMTU5OTg5Yy4uMzhiN2Q5NSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHkKKysrIGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3MucHkKQEAgLTEwLDYgKzEwLDEzIEBACiBmcm9tIGVtYWlsLkhlYWRlciBpbXBvcnQgSGVhZGVyLCBkZWNvZGVfaGVhZGVyCiBmcm9tIGVtYWlsLk1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKIAorIyBXZSdyZSBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgYnV0IGl0IGRvZXNuJ3QgaGF2ZSB0aGUgYnVpbHQtaW4gQXNpYW4KKyMgY29kZWNzLCBzbyB3ZSBoYXZlIHRvIHNraXAgYWxsIHRoZXNlIHRlc3RzLgordHJ5OgorICAgIHVuaWNvZGUoJ2ZvbycsICdldWMtanAnKQorZXhjZXB0IExvb2t1cEVycm9yOgorICAgIHJhaXNlIFRlc3RTa2lwcGVkCisKIAogDAogY2xhc3MgVGVzdEVtYWlsQXNpYW5Db2RlY3MoVGVzdEVtYWlsQmFzZSk6CmRpZmYgLS1naXQgYS9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX2NvZGVjc19yZW5hbWVkLnB5IGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3NfcmVuYW1lZC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmJhY2NkCi0tLSAvZGV2L251bGwKKysrIGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9jb2RlY3NfcmVuYW1lZC5weQpAQCAtMCwwICsxLDc3IEBACisjIENvcHlyaWdodCAoQykgMjAwMi0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisjIGVtYWlsIHBhY2thZ2UgdW5pdCB0ZXN0cyBmb3IgKG9wdGlvbmFsKSBBc2lhbiBjb2RlY3MKKworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZCwgcnVuX3VuaXR0ZXN0CisKK2Zyb20gZW1haWwudGVzdC50ZXN0X2VtYWlsIGltcG9ydCBUZXN0RW1haWxCYXNlCitmcm9tIGVtYWlsLmNoYXJzZXQgaW1wb3J0IENoYXJzZXQKK2Zyb20gZW1haWwuaGVhZGVyIGltcG9ydCBIZWFkZXIsIGRlY29kZV9oZWFkZXIKK2Zyb20gZW1haWwubWVzc2FnZSBpbXBvcnQgTWVzc2FnZQorCisjIFdlJ3JlIGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zLCBidXQgaXQgZG9lc24ndCBoYXZlIHRoZSBidWlsdC1pbiBBc2lhbgorIyBjb2RlY3MsIHNvIHdlIGhhdmUgdG8gc2tpcCBhbGwgdGhlc2UgdGVzdHMuCit0cnk6CisgICAgdW5pY29kZSgnZm9vJywgJ2V1Yy1qcCcpCitleGNlcHQgTG9va3VwRXJyb3I6CisgICAgcmFpc2UgVGVzdFNraXBwZWQKKworCisMCitjbGFzcyBUZXN0RW1haWxBc2lhbkNvZGVjcyhUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9qYXBhbmVzZV9jb2RlY3Moc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGogPSBDaGFyc2V0KCJldWMtanAiKQorICAgICAgICBnID0gQ2hhcnNldCgiaXNvLTg4NTktMSIpCisgICAgICAgIGggPSBIZWFkZXIoIkhlbGxvIFdvcmxkISIpCisgICAgICAgIGpoZWxsbyA9ICdceGE1XHhjZlx4YTVceGVkXHhhMVx4YmNceGE1XHhlZlx4YTFceGJjXHhhNVx4ZWJceGE1XHhjOVx4YTFceGFhJworICAgICAgICBnaGVsbG8gPSAnR3JceGZjXHhkZiBHb3R0IScKKyAgICAgICAgaC5hcHBlbmQoamhlbGxvLCBqKQorICAgICAgICBoLmFwcGVuZChnaGVsbG8sIGcpCisgICAgICAgICMgQkFXOiBUaGlzIHVzZWQgdG8gLS0gYW5kIG1heWJlIHNob3VsZCAtLSBmb2xkIHRoZSB0d28gaXNvLTg4NTktMQorICAgICAgICAjIGNodW5rcyBpbnRvIGEgc2luZ2xlIGVuY29kZWQgd29yZC4gIEhvd2V2ZXIgaXQgZG9lc24ndCB2aW9sYXRlIHRoZQorICAgICAgICAjIHN0YW5kYXJkIHRvIGhhdmUgdGhlbSBhcyB0d28gZW5jb2RlZCBjaHVua3MgYW5kIG1heWJlIGl0J3MKKyAgICAgICAgIyByZWFzb25hYmxlIDx3aW5rPiBmb3IgZWFjaCAuYXBwZW5kKCkgY2FsbCB0byByZXN1bHQgaW4gYSBzZXBhcmF0ZQorICAgICAgICAjIGVuY29kZWQgd29yZC4KKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorSGVsbG8gV29ybGQhID0/aXNvLTIwMjItanA/Yj9HeVJDSlU4bGJTRThKVzhoUENWckpVa2hLaHNvUWc9PT89CisgPT9pc28tODg1OS0xP3E/R3I9RkM9REY/PSA9P2lzby04ODU5LTE/cT9fR290dCE/PSIiIikKKyAgICAgICAgZXEoZGVjb2RlX2hlYWRlcihoLmVuY29kZSgpKSwKKyAgICAgICAgICAgWygnSGVsbG8gV29ybGQhJywgTm9uZSksCisgICAgICAgICAgICAoJ1x4MWIkQiVPJW0hPCVvITwlayVJISpceDFiKEInLCAnaXNvLTIwMjItanAnKSwKKyAgICAgICAgICAgICgnR3JceGZjXHhkZiBHb3R0IScsICdpc28tODg1OS0xJyldKQorICAgICAgICBsb25nID0gJ3Rlc3QtamEgXHhhNFx4ZDhceGM1XHhlYVx4YjlceGM2XHhhNFx4YjVceGE0XHhlY1x4YTRceGJmXHhhNVx4ZTFceGExXHhiY1x4YTVceGViXHhhNFx4Y2ZceGJiXHhjYVx4YjJceGYxXHhiY1x4ZDRceGE0XHhjZVx4YmVceGI1XHhjN1x4YTdceGE0XHhmMlx4YzJceGQ0XHhhNFx4YzNceGE0XHhjNlx4YTRceGE0XHhhNFx4ZGVceGE0XHhiOScKKyAgICAgICAgaCA9IEhlYWRlcihsb25nLCBqLCBoZWFkZXJfbmFtZT0iU3ViamVjdCIpCisgICAgICAgICMgdGVzdCBhIHZlcnkgbG9uZyBoZWFkZXIKKyAgICAgICAgZW5jID0gaC5lbmNvZGUoKQorICAgICAgICAjIFRLOiBzcGxpdHRpbmcgcG9pbnQgbWF5IGRpZmZlciBieSBjb2RlYyBkZXNpZ24gYW5kL29yIEhlYWRlciBlbmNvZGluZworICAgICAgICBlcShlbmMgLCAiIiJcCis9P2lzby0yMDIyLWpwP2I/ZEdWemRDMXFZU0FiSkVJa1dFVnFPVVlrTlNSc0pEOGxZU0U4Sldza1R6dEtHeWhDPz0KKyA9P2lzby0yMDIyLWpwP2I/R3lSQ01uRThWQ1JPUGpWSEp5UnlRbFFrUXlSR0pDUWtYaVE1R3loQz89IiIiKQorICAgICAgICAjIFRLOiBmdWxsIGRlY29kZSBjb21wYXJpc29uCisgICAgICAgIGVxKGguX191bmljb2RlX18oKS5lbmNvZGUoJ2V1Yy1qcCcpLCBsb25nKQorCisgICAgZGVmIHRlc3RfcGF5bG9hZF9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgamhlbGxvID0gJ1x4YTVceGNmXHhhNVx4ZWRceGExXHhiY1x4YTVceGVmXHhhMVx4YmNceGE1XHhlYlx4YTVceGM5XHhhMVx4YWEnCisgICAgICAgIGpjb2RlICA9ICdldWMtanAnCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoamhlbGxvLCBqY29kZSkKKyAgICAgICAgdXN0ciA9IHVuaWNvZGUobXNnLmdldF9wYXlsb2FkKCksIG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoamhlbGxvLCB1c3RyLmVuY29kZShqY29kZSkpCisKKworDAorZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFRlc3RFbWFpbEFzaWFuQ29kZWNzKSkKKyAgICByZXR1cm4gc3VpdGUKKworCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KFRlc3RFbWFpbEFzaWFuQ29kZWNzKQorCisKKwwKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdW5pdHRlc3QubWFpbihkZWZhdWx0VGVzdD0nc3VpdGUnKQpkaWZmIC0tZ2l0IGEvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5IGIvTGliL2VtYWlsL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhYzJlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvZW1haWwvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHkKQEAgLTAsMCArMSwzMDc4IEBACisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCisjIGVtYWlsIHBhY2thZ2UgdW5pdCB0ZXN0cworCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0aW1lCitpbXBvcnQgYmFzZTY0CitpbXBvcnQgZGlmZmxpYgoraW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgd2FybmluZ3MKK2Zyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworCitpbXBvcnQgZW1haWwKKworZnJvbSBlbWFpbC5jaGFyc2V0IGltcG9ydCBDaGFyc2V0Citmcm9tIGVtYWlsLmhlYWRlciBpbXBvcnQgSGVhZGVyLCBkZWNvZGVfaGVhZGVyLCBtYWtlX2hlYWRlcgorZnJvbSBlbWFpbC5wYXJzZXIgaW1wb3J0IFBhcnNlciwgSGVhZGVyUGFyc2VyCitmcm9tIGVtYWlsLmdlbmVyYXRvciBpbXBvcnQgR2VuZXJhdG9yLCBEZWNvZGVkR2VuZXJhdG9yCitmcm9tIGVtYWlsLm1lc3NhZ2UgaW1wb3J0IE1lc3NhZ2UKK2Zyb20gZW1haWwubWltZS5hcHBsaWNhdGlvbiBpbXBvcnQgTUlNRUFwcGxpY2F0aW9uCitmcm9tIGVtYWlsLm1pbWUuYXVkaW8gaW1wb3J0IE1JTUVBdWRpbworZnJvbSBlbWFpbC5taW1lLnRleHQgaW1wb3J0IE1JTUVUZXh0Citmcm9tIGVtYWlsLm1pbWUuaW1hZ2UgaW1wb3J0IE1JTUVJbWFnZQorZnJvbSBlbWFpbC5taW1lLmJhc2UgaW1wb3J0IE1JTUVCYXNlCitmcm9tIGVtYWlsLm1pbWUubWVzc2FnZSBpbXBvcnQgTUlNRU1lc3NhZ2UKK2Zyb20gZW1haWwubWltZS5tdWx0aXBhcnQgaW1wb3J0IE1JTUVNdWx0aXBhcnQKK2Zyb20gZW1haWwgaW1wb3J0IHV0aWxzCitmcm9tIGVtYWlsIGltcG9ydCBlcnJvcnMKK2Zyb20gZW1haWwgaW1wb3J0IGVuY29kZXJzCitmcm9tIGVtYWlsIGltcG9ydCBpdGVyYXRvcnMKK2Zyb20gZW1haWwgaW1wb3J0IGJhc2U2NG1pbWUKK2Zyb20gZW1haWwgaW1wb3J0IHF1b3ByaW1pbWUKKworZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgZmluZGZpbGUsIHJ1bl91bml0dGVzdAorZnJvbSBlbWFpbC50ZXN0IGltcG9ydCBfX2ZpbGVfXyBhcyBsYW5kbWFyaworCisKK05MID0gJ1xuJworRU1QVFlTVFJJTkcgPSAnJworU1BBQ0UgPSAnICcKKworCisMCitkZWYgb3BlbmZpbGUoZmlsZW5hbWUsIG1vZGU9J3InKToKKyAgICBwYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShsYW5kbWFyayksICdkYXRhJywgZmlsZW5hbWUpCisgICAgcmV0dXJuIG9wZW4ocGF0aCwgbW9kZSkKKworCisMCisjIEJhc2UgdGVzdCBjbGFzcworY2xhc3MgVGVzdEVtYWlsQmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIG5kaWZmQXNzZXJ0RXF1YWwoc2VsZiwgZmlyc3QsIHNlY29uZCk6CisgICAgICAgICIiIkxpa2UgZmFpbFVubGVzc0VxdWFsIGV4Y2VwdCB1c2UgbmRpZmYgZm9yIHJlYWRhYmxlIG91dHB1dC4iIiIKKyAgICAgICAgaWYgZmlyc3QgPD4gc2Vjb25kOgorICAgICAgICAgICAgc2ZpcnN0ID0gc3RyKGZpcnN0KQorICAgICAgICAgICAgc3NlY29uZCA9IHN0cihzZWNvbmQpCisgICAgICAgICAgICBkaWZmID0gZGlmZmxpYi5uZGlmZihzZmlyc3Quc3BsaXRsaW5lcygpLCBzc2Vjb25kLnNwbGl0bGluZXMoKSkKKyAgICAgICAgICAgIGZwID0gU3RyaW5nSU8oKQorICAgICAgICAgICAgcHJpbnQgPj4gZnAsIE5MLCBOTC5qb2luKGRpZmYpCisgICAgICAgICAgICByYWlzZSBzZWxmLmZhaWx1cmVFeGNlcHRpb24sIGZwLmdldHZhbHVlKCkKKworICAgIGRlZiBfbXNnb2JqKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgZnAgPSBvcGVuZmlsZShmaW5kZmlsZShmaWxlbmFtZSkpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICByZXR1cm4gbXNnCisKKworDAorIyBUZXN0IHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgTWVzc2FnZSBjbGFzcydzIEFQSQorY2xhc3MgVGVzdE1lc3NhZ2VBUEkoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfZ2V0X2FsbChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzIwLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfYWxsKCdjYycpLCBbJ2NjY0B6enoub3JnJywgJ2RkZEB6enoub3JnJywgJ2VlZUB6enoub3JnJ10pCisgICAgICAgIGVxKG1zZy5nZXRfYWxsKCd4eCcsICduL2EnKSwgJ24vYScpCisKKyAgICBkZWYgdGVzdF9nZXRzZXRfY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBlcShtc2cuZ2V0X2NoYXJzZXQoKSwgTm9uZSkKKyAgICAgICAgY2hhcnNldCA9IENoYXJzZXQoJ2lzby04ODU5LTEnKQorICAgICAgICBtc2cuc2V0X2NoYXJzZXQoY2hhcnNldCkKKyAgICAgICAgZXEobXNnWydtaW1lLXZlcnNpb24nXSwgJzEuMCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9Imlzby04ODU5LTEiJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCAnaXNvLTg4NTktMScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAncXVvdGVkLXByaW50YWJsZScpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLmlucHV0X2NoYXJzZXQsICdpc28tODg1OS0xJykKKyAgICAgICAgIyBSZW1vdmUgdGhlIGNoYXJzZXQKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KE5vbmUpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLCBOb25lKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbicpCisgICAgICAgICMgVHJ5IGFkZGluZyBhIGNoYXJzZXQgd2hlbiB0aGVyZSdzIGFscmVhZHkgTUlNRSBoZWFkZXJzIHByZXNlbnQKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snTUlNRS1WZXJzaW9uJ10gPSAnMi4wJworICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQveC13ZWlyZCcKKyAgICAgICAgbXNnWydDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nJ10gPSAncXVpbnRlZC1wdW50YWJsZScKKyAgICAgICAgbXNnLnNldF9jaGFyc2V0KGNoYXJzZXQpCisgICAgICAgIGVxKG1zZ1snbWltZS12ZXJzaW9uJ10sICcyLjAnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC94LXdlaXJkOyBjaGFyc2V0PSJpc28tODg1OS0xIicpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddLCAncXVpbnRlZC1wdW50YWJsZScpCisKKyAgICBkZWYgdGVzdF9zZXRfY2hhcnNldF9mcm9tX3N0cmluZyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X2NoYXJzZXQoJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnLmdldF9jaGFyc2V0KCkuaW5wdXRfY2hhcnNldCwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXR5cGUnXSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIicpCisKKyAgICBkZWYgdGVzdF9zZXRfcGF5bG9hZF93aXRoX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCgnaXNvLTg4NTktMScpCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnVGhpcyBpcyBhIHN0cmluZyBwYXlsb2FkJywgY2hhcnNldCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NoYXJzZXQoKS5pbnB1dF9jaGFyc2V0LCAnaXNvLTg4NTktMScpCisKKyAgICBkZWYgdGVzdF9nZXRfY2hhcnNldHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA4LnR4dCcpCisgICAgICAgIGNoYXJzZXRzID0gbXNnLmdldF9jaGFyc2V0cygpCisgICAgICAgIGVxKGNoYXJzZXRzLCBbTm9uZSwgJ3VzLWFzY2lpJywgJ2lzby04ODU5LTEnLCAnaXNvLTg4NTktMicsICdrb2k4LXInXSkKKworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wOS50eHQnKQorICAgICAgICBjaGFyc2V0cyA9IG1zZy5nZXRfY2hhcnNldHMoJ2RpbmdiYXQnKQorICAgICAgICBlcShjaGFyc2V0cywgWydkaW5nYmF0JywgJ3VzLWFzY2lpJywgJ2lzby04ODU5LTEnLCAnZGluZ2JhdCcsCisgICAgICAgICAgICAgICAgICAgICAgJ2tvaTgtciddKQorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzEyLnR4dCcpCisgICAgICAgIGNoYXJzZXRzID0gbXNnLmdldF9jaGFyc2V0cygpCisgICAgICAgIGVxKGNoYXJzZXRzLCBbTm9uZSwgJ3VzLWFzY2lpJywgJ2lzby04ODU5LTEnLCBOb25lLCAnaXNvLTg4NTktMicsCisgICAgICAgICAgICAgICAgICAgICAgJ2lzby04ODU5LTMnLCAndXMtYXNjaWknLCAna29pOC1yJ10pCisKKyAgICBkZWYgdGVzdF9nZXRfZmlsZW5hbWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA0LnR4dCcpCisgICAgICAgIGZpbGVuYW1lcyA9IFtwLmdldF9maWxlbmFtZSgpIGZvciBwIGluIG1zZy5nZXRfcGF5bG9hZCgpXQorICAgICAgICBlcShmaWxlbmFtZXMsIFsnbXNnLnR4dCcsICdtc2cudHh0J10pCisKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDcudHh0JykKKyAgICAgICAgc3VicGFydCA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShzdWJwYXJ0LmdldF9maWxlbmFtZSgpLCAnZGluZ3VzZmlzaC5naWYnKQorCisgICAgZGVmIHRlc3RfZ2V0X2ZpbGVuYW1lX3dpdGhfbmFtZV9wYXJhbWV0ZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzQ0LnR4dCcpCisgICAgICAgIGZpbGVuYW1lcyA9IFtwLmdldF9maWxlbmFtZSgpIGZvciBwIGluIG1zZy5nZXRfcGF5bG9hZCgpXQorICAgICAgICBlcShmaWxlbmFtZXMsIFsnbXNnLnR4dCcsICdtc2cudHh0J10pCisKKyAgICBkZWYgdGVzdF9nZXRfYm91bmRhcnkoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNy50eHQnKQorICAgICAgICAjIE5vIHF1b3RlcyEKKyAgICAgICAgZXEobXNnLmdldF9ib3VuZGFyeSgpLCAnQk9VTkRBUlknKQorCisgICAgZGVmIHRlc3Rfc2V0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUaGlzIG9uZSBoYXMgbm8gZXhpc3RpbmcgYm91bmRhcnkgcGFyYW1ldGVyLCBidXQgdGhlIENvbnRlbnQtVHlwZToKKyAgICAgICAgIyBoZWFkZXIgYXBwZWFycyBmaWZ0aC4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgbXNnLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBoZWFkZXIsIHZhbHVlID0gbXNnLml0ZW1zKClbNF0KKyAgICAgICAgZXEoaGVhZGVyLmxvd2VyKCksICdjb250ZW50LXR5cGUnKQorICAgICAgICBlcSh2YWx1ZSwgJ3RleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIjsgYm91bmRhcnk9IkJPVU5EQVJZIicpCisgICAgICAgICMgVGhpcyBvbmUgaGFzIGEgQ29udGVudC1UeXBlOiBoZWFkZXIsIHdpdGggYSBib3VuZGFyeSwgc3R1Y2sgaW4gdGhlCisgICAgICAgICMgbWlkZGxlIG9mIGl0cyBoZWFkZXJzLiAgTWFrZSBzdXJlIHRoZSBvcmRlciBpcyBwcmVzZXJ2ZWQ7IGl0IHNob3VsZAorICAgICAgICAjIGJlIGZpZnRoLgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNC50eHQnKQorICAgICAgICBtc2cuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGhlYWRlciwgdmFsdWUgPSBtc2cuaXRlbXMoKVs0XQorICAgICAgICBlcShoZWFkZXIubG93ZXIoKSwgJ2NvbnRlbnQtdHlwZScpCisgICAgICAgIGVxKHZhbHVlLCAnbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiJykKKyAgICAgICAgIyBBbmQgdGhpcyBvbmUgaGFzIG5vIENvbnRlbnQtVHlwZTogaGVhZGVyIGF0IGFsbC4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJyb3JzLkhlYWRlclBhcnNlRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy5zZXRfYm91bmRhcnksICdCT1VOREFSWScpCisKKyAgICBkZWYgdGVzdF9nZXRfZGVjb2RlZF9wYXlsb2FkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTAudHh0JykKKyAgICAgICAgIyBUaGUgb3V0ZXIgbWVzc2FnZSBpcyBhIG11bHRpcGFydAorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCBOb25lKQorICAgICAgICAjIFN1YnBhcnQgMSBpcyA3Yml0IGVuY29kZWQKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDApLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1RoaXMgaXMgYSA3Yml0IGVuY29kZWQgbWVzc2FnZS5cbicpCisgICAgICAgICMgU3VicGFydCAyIGlzIHF1b3ByaQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMSkuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLAorICAgICAgICAgICAnXHhhMVRoaXMgaXMgYSBRdW90ZWQgUHJpbnRhYmxlIGVuY29kZWQgbWVzc2FnZSFcbicpCisgICAgICAgICMgU3VicGFydCAzIGlzIGJhc2U2NAorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoMikuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLAorICAgICAgICAgICAnVGhpcyBpcyBhIEJhc2U2NCBlbmNvZGVkIG1lc3NhZ2UuJykKKyAgICAgICAgIyBTdWJwYXJ0IDQgaGFzIG5vIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGhlYWRlci4KKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKDMpLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwKKyAgICAgICAgICAgJ1RoaXMgaGFzIG5vIENvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGhlYWRlci5cbicpCisKKyAgICBkZWYgdGVzdF9nZXRfZGVjb2RlZF91dV9wYXlsb2FkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnYmVnaW4gNjY2IC1cbis6JjVMOyZcXEA9Vl1SOyYwIFxuIFxuZW5kXG4nKQorICAgICAgICBmb3IgY3RlIGluICgneC11dWVuY29kZScsICd1dWVuY29kZScsICd1dWUnLCAneC11dWUnKToKKyAgICAgICAgICAgIG1zZ1snY29udGVudC10cmFuc2Zlci1lbmNvZGluZyddID0gY3RlCisgICAgICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCAnaGVsbG8gd29ybGQnKQorICAgICAgICAjIE5vdyB0cnkgc29tZSBib2d1cyBkYXRhCisgICAgICAgIG1zZy5zZXRfcGF5bG9hZCgnZm9vJykKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKGRlY29kZT1UcnVlKSwgJ2ZvbycpCisKKyAgICBkZWYgdGVzdF9kZWNvZGVkX2dlbmVyYXRvcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzA3LnR4dCcpCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18xNy50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBEZWNvZGVkR2VuZXJhdG9yKHMpCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHMuZ2V0dmFsdWUoKSwgdGV4dCkKKworICAgIGRlZiB0ZXN0X19jb250YWluc19fKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAnTWUnCisgICAgICAgIG1zZ1sndG8nXSA9ICdZb3UnCisgICAgICAgICMgQ2hlY2sgZm9yIGNhc2UgaW5zZW5zaXRpdml0eQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ2Zyb20nIGluIG1zZykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdGcm9tJyBpbiBtc2cpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygnRlJPTScgaW4gbXNnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ3RvJyBpbiBtc2cpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygnVG8nIGluIG1zZykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCdUTycgaW4gbXNnKQorCisgICAgZGVmIHRlc3RfYXNfc3RyaW5nKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZXEodGV4dCwgbXNnLmFzX3N0cmluZygpKQorICAgICAgICBmdWxscmVwciA9IHN0cihtc2cpCisgICAgICAgIGxpbmVzID0gZnVsbHJlcHIuc3BsaXQoJ1xuJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxpbmVzWzBdLnN0YXJ0c3dpdGgoJ0Zyb20gJykpCisgICAgICAgIGVxKHRleHQsIE5MLmpvaW4obGluZXNbMTpdKSkKKworICAgIGRlZiB0ZXN0X2JhZF9wYXJhbShzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiQ29udGVudC1UeXBlOiBibGFyZzsgYmF6OyBib29cbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnYmF6JyksICcnKQorCisgICAgZGVmIHRlc3RfbWlzc2luZ19maWxlbmFtZShzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiRnJvbTogZm9vXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwgTm9uZSkKKworICAgIGRlZiB0ZXN0X2JvZ3VzX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKAorICAgICAgICAiQ29udGVudC1EaXNwb3NpdGlvbjogYmxhcmc7IGZpbGVuYW1lXG4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfZmlsZW5hbWUoKSwgJycpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCJGcm9tOiBmb29cbiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9ib3VuZGFyeSgpLCBOb25lKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtcyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAnWC1IZWFkZXI6IGZvbz1vbmU7IGJhcj10d287IGJhej10aHJlZVxuJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoaGVhZGVyPSd4LWhlYWRlcicpLAorICAgICAgICAgICBbKCdmb28nLCAnb25lJyksICgnYmFyJywgJ3R3bycpLCAoJ2JheicsICd0aHJlZScpXSkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdYLUhlYWRlcjogZm9vOyBiYXI9b25lOyBiYXo9dHdvXG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcyhoZWFkZXI9J3gtaGVhZGVyJyksCisgICAgICAgICAgIFsoJ2ZvbycsICcnKSwgKCdiYXInLCAnb25lJyksICgnYmF6JywgJ3R3bycpXSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwgTm9uZSkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdYLUhlYWRlcjogZm9vOyBiYXI9Im9uZSI7IGJhej10d29cbicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKGhlYWRlcj0neC1oZWFkZXInKSwKKyAgICAgICAgICAgWygnZm9vJywgJycpLCAoJ2JhcicsICdvbmUnKSwgKCdiYXonLCAndHdvJyldKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtX2xpYmVyYWwoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ0NvbnRlbnQtVHlwZTogTXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeSA9ICJDUElNU1NNVFBDMDZwNWYzdEciJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGFyYW0oJ2JvdW5kYXJ5JyksICdDUElNU1NNVFBDMDZwNWYzdEcnKQorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICJYLUhlYWRlcjogZm9vPW9uZTsgYmFyPXR3bzsgYmF6PXRocmVlXG4iKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdiYXInLCBoZWFkZXI9J3gtaGVhZGVyJyksICd0d28nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdxdXV6JywgaGVhZGVyPSd4LWhlYWRlcicpLCBOb25lKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdxdXV6JyksIE5vbmUpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoCisgICAgICAgICAgICAnWC1IZWFkZXI6IGZvbzsgYmFyPSJvbmUiOyBiYXo9dHdvXG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdmb28nLCBoZWFkZXI9J3gtaGVhZGVyJyksICcnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdiYXInLCBoZWFkZXI9J3gtaGVhZGVyJyksICdvbmUnKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCdiYXonLCBoZWFkZXI9J3gtaGVhZGVyJyksICd0d28nKQorICAgICAgICAjIFhYWDogV2UgYXJlIG5vdCBSRkMtMjA0NSBjb21wbGlhbnQhICBXZSBjYW5ub3QgcGFyc2U6CisgICAgICAgICMgbXNnWyJDb250ZW50LVR5cGUiXSA9ICd0ZXh0L3BsYWluOyB3ZWlyZD0iaGV5OyBkb2xseT8gW3lvdV0gQCA8XFwiaG9tZVxcIj4/IicKKyAgICAgICAgIyBtc2cuZ2V0X3BhcmFtKCJ3ZWlyZCIpCisgICAgICAgICMgeWV0LgorCisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtX2Z1bmt5X2NvbnRpbnVhdGlvbl9saW5lcyhzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjIudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMSkuZ2V0X3BhcmFtKCduYW1lJyksICd3aWJibGUuSlBHJykKKworICAgIGRlZiB0ZXN0X2dldF9wYXJhbV93aXRoX3NlbWlzX2luX3F1b3RlcyhzZWxmKToKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygKKyAgICAgICAgICAgICdDb250ZW50LVR5cGU6IGltYWdlL3BqcGVnOyBuYW1lPSJKaW0mYW1wOyZhbXA7SmlsbCJcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXJhbSgnbmFtZScpLCAnSmltJmFtcDsmYW1wO0ppbGwnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfcGFyYW0oJ25hbWUnLCB1bnF1b3RlPUZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnIkppbSZhbXA7JmFtcDtKaWxsIicpCisKKyAgICBkZWYgdGVzdF9oYXNfa2V5KHNlbGYpOgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCdIZWFkZXI6IGV4aXN0cycpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnaGVhZGVyJykpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnSGVhZGVyJykpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhtc2cuaGFzX2tleSgnSEVBREVSJykpCisgICAgICAgIHNlbGYuZmFpbElmKG1zZy5oYXNfa2V5KCdoZWFkZXJpJykpCisKKyAgICBkZWYgdGVzdF9zZXRfcGFyYW0oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLnNldF9wYXJhbSgnY2hhcnNldCcsICdpc28tMjAyMi1qcCcpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ2lzby0yMDIyLWpwJykKKyAgICAgICAgbXNnLnNldF9wYXJhbSgnaW1wb3J0YW5jZScsICdoaWdoIHZhbHVlJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnaW1wb3J0YW5jZScpLCAnaGlnaCB2YWx1ZScpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2ltcG9ydGFuY2UnLCB1bnF1b3RlPUZhbHNlKSwgJyJoaWdoIHZhbHVlIicpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksIFsoJ3RleHQvcGxhaW4nLCAnJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2NoYXJzZXQnLCAnaXNvLTIwMjItanAnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnaW1wb3J0YW5jZScsICdoaWdoIHZhbHVlJyldKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcyh1bnF1b3RlPUZhbHNlKSwgWygndGV4dC9wbGFpbicsICcnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgnY2hhcnNldCcsICciaXNvLTIwMjItanAiJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ2ltcG9ydGFuY2UnLCAnImhpZ2ggdmFsdWUiJyldKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCdjaGFyc2V0JywgJ2lzby05OTk5LXh4JywgaGVhZGVyPSdYLUppbW15JykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcsIGhlYWRlcj0nWC1KaW1teScpLCAnaXNvLTk5OTkteHgnKQorCisgICAgZGVmIHRlc3RfZGVsX3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDUudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwKKyAgICAgICAgICAgWygnbXVsdGlwYXJ0L3JlcG9ydCcsICcnKSwgKCdyZXBvcnQtdHlwZScsICdkZWxpdmVyeS1zdGF0dXMnKSwKKyAgICAgICAgICAgICgnYm91bmRhcnknLCAnRDE2OTBBN0FDMS45OTY4NTYwOTAvbWFpbC5leGFtcGxlLmNvbScpXSkKKyAgICAgICAgb2xkX3ZhbCA9IG1zZy5nZXRfcGFyYW0oInJlcG9ydC10eXBlIikKKyAgICAgICAgbXNnLmRlbF9wYXJhbSgicmVwb3J0LXR5cGUiKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtcygpLAorICAgICAgICAgICBbKCdtdWx0aXBhcnQvcmVwb3J0JywgJycpLAorICAgICAgICAgICAgKCdib3VuZGFyeScsICdEMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tJyldKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCJyZXBvcnQtdHlwZSIsIG9sZF92YWwpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW1zKCksCisgICAgICAgICAgIFsoJ211bHRpcGFydC9yZXBvcnQnLCAnJyksCisgICAgICAgICAgICAoJ2JvdW5kYXJ5JywgJ0QxNjkwQTdBQzEuOTk2ODU2MDkwL21haWwuZXhhbXBsZS5jb20nKSwKKyAgICAgICAgICAgICgncmVwb3J0LXR5cGUnLCBvbGRfdmFsKV0pCisKKyAgICBkZWYgdGVzdF9kZWxfcGFyYW1fb25fb3RoZXJfaGVhZGVyKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0NvbnRlbnQtRGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsIGZpbGVuYW1lPSdidWQuZ2lmJykKKyAgICAgICAgbXNnLmRlbF9wYXJhbSgnZmlsZW5hbWUnLCAnY29udGVudC1kaXNwb3NpdGlvbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnWydjb250ZW50LWRpc3Bvc2l0aW9uJ10sICdhdHRhY2htZW50JykKKworICAgIGRlZiB0ZXN0X3NldF90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG1zZy5zZXRfdHlwZSwgJ3RleHQnKQorICAgICAgICBtc2cuc2V0X3R5cGUoJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbicpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ2NoYXJzZXQnLCAndXMtYXNjaWknKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiJykKKyAgICAgICAgbXNnLnNldF90eXBlKCd0ZXh0L2h0bWwnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9odG1sOyBjaGFyc2V0PSJ1cy1hc2NpaSInKQorCisgICAgZGVmIHRlc3Rfc2V0X3R5cGVfb25fb3RoZXJfaGVhZGVyKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydYLUNvbnRlbnQtVHlwZSddID0gJ3RleHQvcGxhaW4nCisgICAgICAgIG1zZy5zZXRfdHlwZSgnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywgJ1gtQ29udGVudC1UeXBlJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2dbJ3gtY29udGVudC10eXBlJ10sICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfdHlwZV9taXNzaW5nKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF90eXBlX21pc3Npbmdfd2l0aF9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X2RlZmF1bHRfdHlwZSgnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF90eXBlX2Zyb21fbWVzc2FnZV9pbXBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzAudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMCkuZ2V0X2NvbnRlbnRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlL3JmYzgyMicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF90eXBlX2Zyb21fbWVzc2FnZV9leHBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjgudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMCkuZ2V0X2NvbnRlbnRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlL3JmYzgyMicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF90eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2ltcGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMy50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3R5cGVfZnJvbV9tZXNzYWdlX3RleHRfcGxhaW5fZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfbWlzc2luZyhzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX21pc3Npbmdfd2l0aF9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X2RlZmF1bHRfdHlwZSgnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAnbWVzc2FnZScpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9tYWludHlwZV9mcm9tX21lc3NhZ2VfaW1wbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzMwLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X21haW50eXBlKCksICdtZXNzYWdlJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX2Zyb21fbWVzc2FnZV9leHBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjgudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMCkuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ21lc3NhZ2UnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfbWFpbnR5cGVfZnJvbV9tZXNzYWdlX3RleHRfcGxhaW5faW1wbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX2Zyb21fbWVzc2FnZV90ZXh0X3BsYWluX2V4cGxpY2l0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9tYWludHlwZSgpLCAndGV4dCcpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX21pc3Npbmcoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdwbGFpbicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX21pc3Npbmdfd2l0aF9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X2RlZmF1bHRfdHlwZSgnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9zdWJ0eXBlKCksICdyZmM4MjInKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9mcm9tX21lc3NhZ2VfaW1wbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzMwLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9wYXlsb2FkKDApLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3JmYzgyMicpCisKKyAgICBkZWYgdGVzdF9nZXRfY29udGVudF9zdWJ0eXBlX2Zyb21fbWVzc2FnZV9leHBsaWNpdChzZWxmKToKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjgudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoMCkuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncmZjODIyJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfZnJvbV9tZXNzYWdlX3RleHRfcGxhaW5faW1wbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X3N1YnR5cGVfZnJvbV9tZXNzYWdlX3RleHRfcGxhaW5fZXhwbGljaXQoc2VsZik6CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKworICAgIGRlZiB0ZXN0X2dldF9jb250ZW50X21haW50eXBlX2Vycm9yKHNlbGYpOgorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICduby1zbGFzaC1pbi10aGlzLXN0cmluZycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorCisgICAgZGVmIHRlc3RfZ2V0X2NvbnRlbnRfc3VidHlwZV9lcnJvcihzZWxmKToKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAnbm8tc2xhc2gtaW4tdGhpcy1zdHJpbmcnCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKworICAgIGRlZiB0ZXN0X3JlcGxhY2VfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdGaXJzdCcsICdPbmUnKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignU2Vjb25kJywgJ1R3bycpCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdUaGlyZCcsICdUaHJlZScpCisgICAgICAgIGVxKG1zZy5rZXlzKCksIFsnRmlyc3QnLCAnU2Vjb25kJywgJ1RoaXJkJ10pCisgICAgICAgIGVxKG1zZy52YWx1ZXMoKSwgWydPbmUnLCAnVHdvJywgJ1RocmVlJ10pCisgICAgICAgIG1zZy5yZXBsYWNlX2hlYWRlcignU2Vjb25kJywgJ1R3ZW50eScpCisgICAgICAgIGVxKG1zZy5rZXlzKCksIFsnRmlyc3QnLCAnU2Vjb25kJywgJ1RoaXJkJ10pCisgICAgICAgIGVxKG1zZy52YWx1ZXMoKSwgWydPbmUnLCAnVHdlbnR5JywgJ1RocmVlJ10pCisgICAgICAgIG1zZy5hZGRfaGVhZGVyKCdGaXJzdCcsICdFbGV2ZW4nKQorICAgICAgICBtc2cucmVwbGFjZV9oZWFkZXIoJ0ZpcnN0JywgJ09uZSBIdW5kcmVkJykKKyAgICAgICAgZXEobXNnLmtleXMoKSwgWydGaXJzdCcsICdTZWNvbmQnLCAnVGhpcmQnLCAnRmlyc3QnXSkKKyAgICAgICAgZXEobXNnLnZhbHVlcygpLCBbJ09uZSBIdW5kcmVkJywgJ1R3ZW50eScsICdUaHJlZScsICdFbGV2ZW4nXSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIG1zZy5yZXBsYWNlX2hlYWRlciwgJ0ZvdXJ0aCcsICdNaXNzaW5nJykKKworICAgIGRlZiB0ZXN0X2Jyb2tlbl9iYXNlNjRfcGF5bG9hZChzZWxmKToKKyAgICAgICAgeCA9ICdBd0RwMFA3Ly95Nkx3S0VBY1BhLzZRPTknCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ2NvbnRlbnQtdHlwZSddID0gJ2F1ZGlvL3gtbWlkaScKKyAgICAgICAgbXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10gPSAnYmFzZTY0JworICAgICAgICBtc2cuc2V0X3BheWxvYWQoeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCB4KQorCisKKwwKKyMgVGVzdCB0aGUgZW1haWwuZW5jb2RlcnMgbW9kdWxlCitjbGFzcyBUZXN0RW5jb2RlcnModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2VuY29kZV9lbXB0eV9wYXlsb2FkKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZy5zZXRfY2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzdiaXQnKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9jdGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzdiaXQnKQorCisgICAgZGVmIHRlc3RfZGVmYXVsdF9jdGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIFdpdGggbm8gZXhwbGljaXQgX2NoYXJzZXQgaXRzIHVzLWFzY2lpLCBhbmQgYWxsIGFyZSA3LWJpdAorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzdiaXQnKQorICAgICAgICAjIFNpbWlsYXIsIGJ1dCB3aXRoIDgtYml0IGRhdGEKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIFx4Zjggd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJzhiaXQnKQorICAgICAgICAjIEFuZCBub3cgd2l0aCBhIGRpZmZlcmVudCBjaGFyc2V0CisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyBceGY4IHdvcmxkJywgX2NoYXJzZXQ9J2lzby04ODU5LTEnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ3F1b3RlZC1wcmludGFibGUnKQorCisKKwwKKyMgVGVzdCBsb25nIGhlYWRlciB3cmFwcGluZworY2xhc3MgVGVzdExvbmdIZWFkZXJzKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiB0ZXN0X3NwbGl0X2xvbmdfY29udGludWF0aW9uKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCIiIlwKK1N1YmplY3Q6IGJ1ZyBkZW1vbnN0cmF0aW9uCitcdDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CitcdG1vcmUgdGV4dAorCit0ZXN0CisiIiIpCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzZnApCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCitTdWJqZWN0OiBidWcgZGVtb25zdHJhdGlvbgorXHQxMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTMxMjM0NTY3ODk0MTIzNDU2Nzg5NTEyMzQ1Njc4OTYxMjM0NTY3ODk3MTIzNDU2Nzg5ODExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OTExMjM0NTY3ODkxMTIzNDU2Nzg5MjEyMzQ1Njc4OQorXHRtb3JlIHRleHQKKwordGVzdAorIiIiKQorCisgICAgZGVmIHRlc3RfYW5vdGhlcl9sb25nX2FsbW9zdF91bnNwbGl0dGFibGVfaGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gIiIiXAorYnVnIGRlbW9uc3RyYXRpb24KK1x0MTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkzMTIzNDU2Nzg5NDEyMzQ1Njc4OTUxMjM0NTY3ODk2MTIzNDU2Nzg5NzEyMzQ1Njc4OTgxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkxMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkKK1x0bW9yZSB0ZXh0IiIiCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK2J1ZyBkZW1vbnN0cmF0aW9uCitcdDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CitcdG1vcmUgdGV4dCIiIikKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitidWcgZGVtb25zdHJhdGlvbgorIDEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MTEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5CisgbW9yZSB0ZXh0IiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ19ub25zdHJpbmcoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGcgPSBDaGFyc2V0KCJpc28tODg1OS0xIikKKyAgICAgICAgY3ogPSBDaGFyc2V0KCJpc28tODg1OS0yIikKKyAgICAgICAgdXRmOCA9IENoYXJzZXQoInV0Zi04IikKKyAgICAgICAgZ19oZWFkID0gIkRpZSBNaWV0ZXIgdHJldGVuIGhpZXIgZWluIHdlcmRlbiBtaXQgZWluZW0gRm9lcmRlcmJhbmQga29tZm9ydGFiZWwgZGVuIEtvcnJpZG9yIGVudGxhbmcsIGFuIHNceGZjZGxceGZjbmRpc2NoZW4gV2FuZGdlbVx4ZTRsZGVuIHZvcmJlaSwgZ2VnZW4gZGllIHJvdGllcmVuZGVuIEtsaW5nZW4gYmVmXHhmNnJkZXJ0LiAiCisgICAgICAgIGN6X2hlYWQgPSAiRmluYW5ceGU4bmkgbWV0cm9wb2xlIHNlIGhyb3V0aWx5IHBvZCB0bGFrZW0gamVqaWNoIGRceGY5dnRpcHUuLiAiCisgICAgICAgIHV0ZjhfaGVhZCA9IHUiXHU2YjYzXHU3OGJhXHUzMDZiXHU4YTAwXHUzMDQ2XHUzMDY4XHU3ZmZiXHU4YTMzXHUzMDZmXHUzMDU1XHUzMDhjXHUzMDY2XHUzMDQ0XHUzMDdlXHUzMDViXHUzMDkzXHUzMDAyXHU0ZTAwXHU5MGU4XHUzMDZmXHUzMGM5XHUzMGE0XHUzMGM0XHU4YTllXHUzMDY3XHUzMDU5XHUzMDRjXHUzMDAxXHUzMDQyXHUzMDY4XHUzMDZmXHUzMDY3XHUzMDVmXHUzMDg5XHUzMDgxXHUzMDY3XHUzMDU5XHUzMDAyXHU1YjlmXHU5NjliXHUzMDZiXHUzMDZmXHUzMDBjV2VubiBpc3QgZGFzIE51bnN0dWNrIGdpdCB1bmQgU2xvdGVybWV5ZXI/IEphISBCZWloZXJodW5kIGRhcyBPZGVyIGRpZSBGbGlwcGVyd2FsZHQgZ2Vyc3B1dC5cdTMwMGRcdTMwNjhcdThhMDBcdTMwNjNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNTlcdTMwMDIiLmVuY29kZSgidXRmLTgiKQorICAgICAgICBoID0gSGVhZGVyKGdfaGVhZCwgZywgaGVhZGVyX25hbWU9J1N1YmplY3QnKQorICAgICAgICBoLmFwcGVuZChjel9oZWFkLCBjeikKKyAgICAgICAgaC5hcHBlbmQodXRmOF9oZWFkLCB1dGY4KQorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydTdWJqZWN0J10gPSBoCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzZnApCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCitTdWJqZWN0OiA9P2lzby04ODU5LTE/cT9EaWVfTWlldGVyX3RyZXRlbl9oaWVyX2Vpbl93ZXJkZW5fbWl0X2VpbmVtX0ZvZXJkPz0KKyA9P2lzby04ODU5LTE/cT9lcmJhbmRfa29tZm9ydGFiZWxfZGVuX0tvcnJpZG9yX2VudGxhbmc9MkNfYW5fcz1GQ2RsPUZDbmRpPz0KKyA9P2lzby04ODU5LTE/cT9zY2hlbl9XYW5kZ2VtPUU0bGRlbl92b3JiZWk9MkNfZ2VnZW5fZGllX3JvdGllcmVuZGVuX0tsaW5nPz0KKyA9P2lzby04ODU5LTE/cT9lbl9iZWY9RjZyZGVydD0yRV8/PSA9P2lzby04ODU5LTI/cT9GaW5hbj1FOG5pX21ldD89CisgPT9pc28tODg1OS0yP3E/cm9wb2xlX3NlX2hyb3V0aWx5X3BvZF90bGFrZW1famVqaWNoX2Q9Rjl2dGlwdT0yRT0yRV8/PQorID0/dXRmLTg/Yj81cTJqNTZLNjQ0R3I2S2lBNDRHRzQ0R281Nys3NktpejQ0R3Y0NEdWNDRLTTQ0R200NEdFPz0KKyA9P3V0Zi04P2I/NDRHKzQ0R2I0NEtUNDRDQzVMaUE2WU9vNDRHdjQ0T0o0NEtrNDRPRTZLcWU0NEduNDRHWjQ0R000NENCPz0KKyA9P3V0Zi04P2I/NDRHQzQ0R280NEd2NDRHbjQ0R2Y0NEtKNDRLQjQ0R240NEdaNDRDQzVhNmY2WnFiNDRHcjQ0R3Y0NENNPz0KKyA9P3V0Zi04P3E/V2Vubl9pc3RfZGFzX051bnN0dWNrX2dpdF91bmRfU2xvdGVybWV5ZXI9M0ZfSmEhX0JlaWhlcmh1bmRfZGFzPz0KKyA9P3V0Zi04P2I/SUU5a1pYSWdaR2xsSUVac2FYQndaWEozWVd4a2RDQm5aWEp6Y0hWMEx1T0FqZU9CcU9pb2dPT0Jvdz09Pz0KKyA9P3V0Zi04P2I/NDRHbTQ0R0U0NEcrNDRHWjQ0Q0M/PQorCisiIiIpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKKz0/aXNvLTg4NTktMT9xP0RpZV9NaWV0ZXJfdHJldGVuX2hpZXJfZWluX3dlcmRlbl9taXRfZWluZW1fRm9lcmQ/PQorID0/aXNvLTg4NTktMT9xP2VyYmFuZF9rb21mb3J0YWJlbF9kZW5fS29ycmlkb3JfZW50bGFuZz0yQ19hbl9zPUZDZGw9RkNuZGk/PQorID0/aXNvLTg4NTktMT9xP3NjaGVuX1dhbmRnZW09RTRsZGVuX3ZvcmJlaT0yQ19nZWdlbl9kaWVfcm90aWVyZW5kZW5fS2xpbmc/PQorID0/aXNvLTg4NTktMT9xP2VuX2JlZj1GNnJkZXJ0PTJFXz89ID0/aXNvLTg4NTktMj9xP0ZpbmFuPUU4bmlfbWV0Pz0KKyA9P2lzby04ODU5LTI/cT9yb3BvbGVfc2VfaHJvdXRpbHlfcG9kX3RsYWtlbV9qZWppY2hfZD1GOXZ0aXB1PTJFPTJFXz89CisgPT91dGYtOD9iPzVxMmo1Nks2NDRHcjZLaUE0NEdHNDRHbzU3Kzc2S2l6NDRHdjQ0R1Y0NEtNNDRHbTQ0R0U/PQorID0/dXRmLTg/Yj80NEcrNDRHYjQ0S1Q0NENDNUxpQTZZT280NEd2NDRPSjQ0S2s0NE9FNktxZTQ0R240NEdaNDRHTTQ0Q0I/PQorID0/dXRmLTg/Yj80NEdDNDRHbzQ0R3Y0NEduNDRHZjQ0S0o0NEtCNDRHbjQ0R1o0NENDNWE2ZjZacWI0NEdyNDRHdjQ0Q00/PQorID0/dXRmLTg/cT9XZW5uX2lzdF9kYXNfTnVuc3R1Y2tfZ2l0X3VuZF9TbG90ZXJtZXllcj0zRl9KYSFfQmVpaGVyaHVuZF9kYXM/PQorID0/dXRmLTg/Yj9JRTlrWlhJZ1pHbGxJRVpzYVhCd1pYSjNZV3hrZENCblpYSnpjSFYwTHVPQWplT0JxT2lvZ09PQm93PT0/PQorID0/dXRmLTg/Yj80NEdtNDRHRTQ0Rys0NEdaNDRDQz89IiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ19oZWFkZXJfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCd3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOyAnCisgICAgICAgICAgICAgICAgICAgJ3Nwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicsCisgICAgICAgICAgICAgICAgICAgaGVhZGVyX25hbWU9J1gtRm9vYmFyLVNwb2luay1EZWZyb2JuaXQnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnJydcCit3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOworIHNwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicnJykKKworICAgIGRlZiB0ZXN0X2xvbmdfaGVhZGVyX2VuY29kZV93aXRoX3RhYl9jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoJ3dhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7ICcKKyAgICAgICAgICAgICAgICAgICAnc3Bvb2dlPSJ5dW1teSI7IGhpcHBvcz0iZ2FyZ2FudHVhbiI7IG1hcnNobWFsbG93cz0iZ29vZXkiJywKKyAgICAgICAgICAgICAgICAgICBoZWFkZXJfbmFtZT0nWC1Gb29iYXItU3BvaW5rLURlZnJvYm5pdCcsCisgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICcnJ1wKK3dhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7CitcdHNwb29nZT0ieXVtbXkiOyBoaXBwb3M9ImdhcmdhbnR1YW4iOyBtYXJzaG1hbGxvd3M9Imdvb2V5IicnJykKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9zcGxpdHRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJycpCisgICAgICAgICMgSXQnZCBiZSBncmVhdCBpZiB3ZSBjb3VsZCB1c2UgYWRkX2hlYWRlcigpIGhlcmUsIGJ1dCB0aGF0IGRvZXNuJ3QKKyAgICAgICAgIyBndWFyYW50ZWUgYW4gb3JkZXIgb2YgdGhlIHBhcmFtZXRlcnMuCisgICAgICAgIG1zZ1snWC1Gb29iYXItU3BvaW5rLURlZnJvYm5pdCddID0gKAorICAgICAgICAgICAgJ3dhc25pcG9vcDsgZ2lyYWZmZXM9InZlcnktbG9uZy1uZWNrZWQtYW5pbWFscyI7ICcKKyAgICAgICAgICAgICdzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSInKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgJycnXAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CitYLUZvb2Jhci1TcG9pbmstRGVmcm9ibml0OiB3YXNuaXBvb3A7IGdpcmFmZmVzPSJ2ZXJ5LWxvbmctbmVja2VkLWFuaW1hbHMiOworXHRzcG9vZ2U9Inl1bW15IjsgaGlwcG9zPSJnYXJnYW50dWFuIjsgbWFyc2htYWxsb3dzPSJnb29leSIKKworJycnKQorCisgICAgZGVmIHRlc3Rfbm9fc2VtaXNfaGVhZGVyX3NwbGl0dGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAndGVzdEBkb20uYWluJworICAgICAgICBtc2dbJ1JlZmVyZW5jZXMnXSA9IFNQQUNFLmpvaW4oWyc8JWRAZG9tLmFpbj4nICUgaSBmb3IgaSBpbiByYW5nZSgxMCldKQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ1Rlc3QnKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgIiIiXAorRnJvbTogdGVzdEBkb20uYWluCitSZWZlcmVuY2VzOiA8MEBkb20uYWluPiA8MUBkb20uYWluPiA8MkBkb20uYWluPiA8M0Bkb20uYWluPiA8NEBkb20uYWluPgorXHQ8NUBkb20uYWluPiA8NkBkb20uYWluPiA8N0Bkb20uYWluPiA8OEBkb20uYWluPiA8OUBkb20uYWluPgorCitUZXN0IiIiKQorCisgICAgZGVmIHRlc3Rfbm9fc3BsaXRfbG9uZ19oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGhzdHIgPSAnUmVmZXJlbmNlczogJyArICd4JyAqIDgwCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK1JlZmVyZW5jZXM6IHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4IiIiKQorCisgICAgZGVmIHRlc3Rfc3BsaXR0aW5nX211bHRpcGxlX2xvbmdfbGluZXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGhzdHIgPSAiIiJcCitmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOyBieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOyBmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OyBTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkKK1x0ZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsgYnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsgZm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsgU2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpCitcdGZyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7IGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7IGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47IFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorIiIiCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKK2Zyb20gYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKGxvY2FsaG9zdCBbMTI3LjAuMC4xXSk7CitcdGJ5IGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChQb3N0Zml4KSB3aXRoIEVTTVRQIGlkIEI1NzBFNTFCODE7CitcdGZvciA8bWFpbG1hbi1hZG1pbkBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZz47CitcdFNhdCwgMiBGZWIgMjAwMiAxNzowMDowNiAtMDgwMCAoUFNUKQorXHRmcm9tIGJhYnlsb24uc29jYWwtcmF2ZXMub3JnIChsb2NhbGhvc3QgWzEyNy4wLjAuMV0pOworXHRieSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAoUG9zdGZpeCkgd2l0aCBFU01UUCBpZCBCNTcwRTUxQjgxOworXHRmb3IgPG1haWxtYW4tYWRtaW5AYmFieWxvbi5zb2NhbC1yYXZlcy5vcmc+OworXHRTYXQsIDIgRmViIDIwMDIgMTc6MDA6MDYgLTA4MDAgKFBTVCkKK1x0ZnJvbSBiYWJ5bG9uLnNvY2FsLXJhdmVzLm9yZyAobG9jYWxob3N0IFsxMjcuMC4wLjFdKTsKK1x0YnkgYmFieWxvbi5zb2NhbC1yYXZlcy5vcmcgKFBvc3RmaXgpIHdpdGggRVNNVFAgaWQgQjU3MEU1MUI4MTsKK1x0Zm9yIDxtYWlsbWFuLWFkbWluQGJhYnlsb24uc29jYWwtcmF2ZXMub3JnPjsKK1x0U2F0LCAyIEZlYiAyMDAyIDE3OjAwOjA2IC0wODAwIChQU1QpIiIiKQorCisgICAgZGVmIHRlc3Rfc3BsaXR0aW5nX2ZpcnN0X2xpbmVfb25seV9pc19sb25nKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoc3RyID0gIiIiXAorZnJvbSBtb2RlbWNhYmxlMDkzLjEzOS0yMDEtMjQucXVlLm1jLnZpZGVvdHJvbi5jYSAoWzI0LjIwMS4xMzkuOTNdIGhlbG89Y3RodWxodS5nZXJnLmNhKQorXHRieSBrcm9ub3MubWVtcy1leGNoYW5nZS5vcmcgd2l0aCBlc210cCAoRXhpbSA0LjA1KQorXHRpZCAxN2s0aDUtMDAwMzRpLTAwCitcdGZvciB0ZXN0QG1lbXMtZXhjaGFuZ2Uub3JnOyBXZWQsIDI4IEF1ZyAyMDAyIDExOjI1OjIwIC0wNDAwIiIiCisgICAgICAgIGggPSBIZWFkZXIoaHN0ciwgbWF4bGluZWxlbj03OCwgaGVhZGVyX25hbWU9J1JlY2VpdmVkJywKKyAgICAgICAgICAgICAgICAgICBjb250aW51YXRpb25fd3M9J1x0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgIiIiXAorZnJvbSBtb2RlbWNhYmxlMDkzLjEzOS0yMDEtMjQucXVlLm1jLnZpZGVvdHJvbi5jYSAoWzI0LjIwMS4xMzkuOTNdCitcdGhlbG89Y3RodWxodS5nZXJnLmNhKQorXHRieSBrcm9ub3MubWVtcy1leGNoYW5nZS5vcmcgd2l0aCBlc210cCAoRXhpbSA0LjA1KQorXHRpZCAxN2s0aDUtMDAwMzRpLTAwCitcdGZvciB0ZXN0QG1lbXMtZXhjaGFuZ2Uub3JnOyBXZWQsIDI4IEF1ZyAyMDAyIDExOjI1OjIwIC0wNDAwIiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ184Yml0X2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIGggPSBIZWFkZXIoJ0JyaXRpc2NoZSBSZWdpZXJ1bmcgZ2lidCcsICdpc28tODg1OS0xJywKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyX25hbWU9J1N1YmplY3QnKQorICAgICAgICBoLmFwcGVuZCgnZ3JceGZjbmVzIExpY2h0IGZceGZjciBPZmZzaG9yZS1XaW5ka3JhZnRwcm9qZWt0ZScpCisgICAgICAgIG1zZ1snU3ViamVjdCddID0gaAorICAgICAgICBlcShtc2cuYXNfc3RyaW5nKCksICIiIlwKK1N1YmplY3Q6ID0/aXNvLTg4NTktMT9xP0JyaXRpc2NoZV9SZWdpZXJ1bmdfZ2lidD89ID0/aXNvLTg4NTktMT9xP2dyPUZDbmVzPz0KKyA9P2lzby04ODU5LTE/cT9fTGljaHRfZj1GQ3JfT2Zmc2hvcmUtV2luZGtyYWZ0cHJvamVrdGU/PQorCisiIiIpCisKKyAgICBkZWYgdGVzdF9sb25nXzhiaXRfaGVhZGVyX25vX2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1JlcGx5LVRvJ10gPSAnQnJpdGlzY2hlIFJlZ2llcnVuZyBnaWJ0IGdyXHhmY25lcyBMaWNodCBmXHhmY3IgT2Zmc2hvcmUtV2luZGtyYWZ0cHJvamVrdGUgPGEtdmVyeS1sb25nLWFkZHJlc3NAZXhhbXBsZS5jb20+JworICAgICAgICBlcShtc2cuYXNfc3RyaW5nKCksICIiIlwKK1JlcGx5LVRvOiBCcml0aXNjaGUgUmVnaWVydW5nIGdpYnQgZ3JceGZjbmVzIExpY2h0IGZceGZjciBPZmZzaG9yZS1XaW5ka3JhZnRwcm9qZWt0ZSA8YS12ZXJ5LWxvbmctYWRkcmVzc0BleGFtcGxlLmNvbT4KKworIiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ190b19oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIHRvID0gJyJTb21lb25lIFRlc3QgI0EiIDxzb21lb25lQGVlY3MudW1pY2guZWR1Piw8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4sIlNvbWVvbmUgVGVzdCAjQiIgPHNvbWVvbmVAdW1pY2guZWR1PiwgIlNvbWVvbmUgVGVzdCAjQyIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LCAiU29tZW9uZSBUZXN0ICNEIiA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4nCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1RvJ10gPSB0bworICAgICAgICBlcShtc2cuYXNfc3RyaW5nKDApLCAnJydcCitUbzogIlNvbWVvbmUgVGVzdCAjQSIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+LCA8c29tZW9uZUBlZWNzLnVtaWNoLmVkdT4sCitcdCJTb21lb25lIFRlc3QgI0IiIDxzb21lb25lQHVtaWNoLmVkdT4sCitcdCJTb21lb25lIFRlc3QgI0MiIDxzb21lb25lQGVlY3MudW1pY2guZWR1PiwKK1x0IlNvbWVvbmUgVGVzdCAjRCIgPHNvbWVvbmVAZWVjcy51bWljaC5lZHU+CisKKycnJykKKworICAgIGRlZiB0ZXN0X2xvbmdfbGluZV9hZnRlcl9hcHBlbmQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnVGhpcyBpcyBhbiBleGFtcGxlIG9mIHN0cmluZyB3aGljaCBoYXMgYWxtb3N0IHRoZSBsaW1pdCBvZiBoZWFkZXIgbGVuZ3RoLicKKyAgICAgICAgaCA9IEhlYWRlcihzKQorICAgICAgICBoLmFwcGVuZCgnQWRkIGFub3RoZXIgbGluZS4nKQorICAgICAgICBlcShoLmVuY29kZSgpLCAiIiJcCitUaGlzIGlzIGFuIGV4YW1wbGUgb2Ygc3RyaW5nIHdoaWNoIGhhcyBhbG1vc3QgdGhlIGxpbWl0IG9mIGhlYWRlciBsZW5ndGguCisgQWRkIGFub3RoZXIgbGluZS4iIiIpCisKKyAgICBkZWYgdGVzdF9zaG9ydGVyX2xpbmVfd2l0aF9hcHBlbmQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnVGhpcyBpcyBhIHNob3J0ZXIgbGluZS4nCisgICAgICAgIGggPSBIZWFkZXIocykKKyAgICAgICAgaC5hcHBlbmQoJ0FkZCBhbm90aGVyIHNlbnRlbmNlLiAoU3VycHJpc2U/KScpCisgICAgICAgIGVxKGguZW5jb2RlKCksCisgICAgICAgICAgICdUaGlzIGlzIGEgc2hvcnRlciBsaW5lLiBBZGQgYW5vdGhlciBzZW50ZW5jZS4gKFN1cnByaXNlPyknKQorCisgICAgZGVmIHRlc3RfbG9uZ19maWVsZF9uYW1lKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBmbiA9ICdYLVZlcnktVmVyeS1WZXJ5LUxvbmctSGVhZGVyLU5hbWUnCisgICAgICAgIGdzID0gIkRpZSBNaWV0ZXIgdHJldGVuIGhpZXIgZWluIHdlcmRlbiBtaXQgZWluZW0gRm9lcmRlcmJhbmQga29tZm9ydGFiZWwgZGVuIEtvcnJpZG9yIGVudGxhbmcsIGFuIHNceGZjZGxceGZjbmRpc2NoZW4gV2FuZGdlbVx4ZTRsZGVuIHZvcmJlaSwgZ2VnZW4gZGllIHJvdGllcmVuZGVuIEtsaW5nZW4gYmVmXHhmNnJkZXJ0LiAiCisgICAgICAgIGggPSBIZWFkZXIoZ3MsICdpc28tODg1OS0xJywgaGVhZGVyX25hbWU9Zm4pCisgICAgICAgICMgQkFXOiB0aGlzIHNlZW1zIGJyb2tlbiBiZWNhdXNlIHRoZSBmaXJzdCBsaW5lIGlzIHRvbyBsb25nCisgICAgICAgIGVxKGguZW5jb2RlKCksICIiIlwKKz0/aXNvLTg4NTktMT9xP0RpZV9NaWV0ZXJfdHJldGVuX2hpZXJfPz0KKyA9P2lzby04ODU5LTE/cT9laW5fd2VyZGVuX21pdF9laW5lbV9Gb2VyZGVyYmFuZF9rb21mb3J0YWJlbF9kZW5fS29ycmlkb3JfPz0KKyA9P2lzby04ODU5LTE/cT9lbnRsYW5nPTJDX2FuX3M9RkNkbD1GQ25kaXNjaGVuX1dhbmRnZW09RTRsZGVuX3ZvcmJlaT0yQ19nPz0KKyA9P2lzby04ODU5LTE/cT9lZ2VuX2RpZV9yb3RpZXJlbmRlbl9LbGluZ2VuX2JlZj1GNnJkZXJ0PTJFXz89IiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ19yZWNlaXZlZF9oZWFkZXIoc2VsZik6CisgICAgICAgIGggPSAnZnJvbSBGT08uVExEICh2aXp3b3JsZC5hY2wuZm9vLnRsZCBbMTIzLjQ1Mi42NzguOV0pIGJ5IGhyb3RoZ2FyLmxhLm1hc3RhbGVyLmNvbSAodG1kYS1vZm1pcGQpIHdpdGggRVNNVFA7IFdlZCwgMDUgTWFyIDIwMDMgMTg6MTA6MTggLTA3MDAnCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ1JlY2VpdmVkLTEnXSA9IEhlYWRlcihoLCBjb250aW51YXRpb25fd3M9J1x0JykKKyAgICAgICAgbXNnWydSZWNlaXZlZC0yJ10gPSBoCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmFzX3N0cmluZygpLCAiIiJcCitSZWNlaXZlZC0xOiBmcm9tIEZPTy5UTEQgKHZpendvcmxkLmFjbC5mb28udGxkIFsxMjMuNDUyLjY3OC45XSkgYnkKK1x0aHJvdGhnYXIubGEubWFzdGFsZXIuY29tICh0bWRhLW9mbWlwZCkgd2l0aCBFU01UUDsKK1x0V2VkLCAwNSBNYXIgMjAwMyAxODoxMDoxOCAtMDcwMAorUmVjZWl2ZWQtMjogZnJvbSBGT08uVExEICh2aXp3b3JsZC5hY2wuZm9vLnRsZCBbMTIzLjQ1Mi42NzguOV0pIGJ5CitcdGhyb3RoZ2FyLmxhLm1hc3RhbGVyLmNvbSAodG1kYS1vZm1pcGQpIHdpdGggRVNNVFA7CitcdFdlZCwgMDUgTWFyIDIwMDMgMTg6MTA6MTggLTA3MDAKKworIiIiKQorCisgICAgZGVmIHRlc3Rfc3RyaW5nX2hlYWRlcmluc3RfZXEoc2VsZik6CisgICAgICAgIGggPSAnPDE1OTc1LjE3OTAxLjIwNzI0MC40MTQ2MDRAc2dpZ3JpdHptYW5uMS5tYXRoZW1hdGlrLnR1LW11ZW5jaGVuLmRlPiAoRGF2aWQgQnJlbW5lclwncyBtZXNzYWdlIG9mICJUaHUsIDYgTWFyIDIwMDMgMTM6NTg6MjEgKzAxMDAiKScKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snUmVjZWl2ZWQtMSddID0gSGVhZGVyKGgsIGhlYWRlcl9uYW1lPSdSZWNlaXZlZC0xJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWF0aW9uX3dzPSdcdCcpCisgICAgICAgIG1zZ1snUmVjZWl2ZWQtMiddID0gaAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorUmVjZWl2ZWQtMTogPDE1OTc1LjE3OTAxLjIwNzI0MC40MTQ2MDRAc2dpZ3JpdHptYW5uMS5tYXRoZW1hdGlrLnR1LW11ZW5jaGVuLmRlPgorXHQoRGF2aWQgQnJlbW5lcidzIG1lc3NhZ2Ugb2YgIlRodSwgNiBNYXIgMjAwMyAxMzo1ODoyMSArMDEwMCIpCitSZWNlaXZlZC0yOiA8MTU5NzUuMTc5MDEuMjA3MjQwLjQxNDYwNEBzZ2lncml0em1hbm4xLm1hdGhlbWF0aWsudHUtbXVlbmNoZW4uZGU+CitcdChEYXZpZCBCcmVtbmVyJ3MgbWVzc2FnZSBvZiAiVGh1LCA2IE1hciAyMDAzIDEzOjU4OjIxICswMTAwIikKKworIiIiKQorCisgICAgZGVmIHRlc3RfbG9uZ191bmJyZWFrYWJsZV9saW5lc193aXRoX2NvbnRpbnVhdGlvbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIHQgPSAiIiJcCisgaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQURBQUFBQXdCQU1BQUFDbExPUzBBQUFBR0ZCTVZFVUFBQUFrSGlKZVJVSWNHQmk5CisgbG9jUURRNHpKeWtGQkFYSmZXRGpBQUFDWVVsRVFWUjRuRjJUUVkvaklBeUZjNmx5ZGxHNXg4TnlwMVk2OXdqMVBOMkk1Z3pwIiIiCisgICAgICAgIG1zZ1snRmFjZS0xJ10gPSB0CisgICAgICAgIG1zZ1snRmFjZS0yJ10gPSBIZWFkZXIodCwgaGVhZGVyX25hbWU9J0ZhY2UtMicpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorRmFjZS0xOiBpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBREFBQUFBd0JBTUFBQUNsTE9TMEFBQUFHRkJNVkVVQUFBQWtIaUplUlVJY0dCaTkKK1x0bG9jUURRNHpKeWtGQkFYSmZXRGpBQUFDWVVsRVFWUjRuRjJUUVkvaklBeUZjNmx5ZGxHNXg4TnlwMVk2OXdqMVBOMkk1Z3pwCitGYWNlLTI6IGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFEQUFBQUF3QkFNQUFBQ2xMT1MwQUFBQUdGQk1WRVVBQUFBa0hpSmVSVUljR0JpOQorIGxvY1FEUTR6SnlrRkJBWEpmV0RqQUFBQ1lVbEVRVlI0bkYyVFFZL2pJQXlGYzZseWRsRzV4OE55cDFZNjl3ajFQTjJJNWd6cAorCisiIiIpCisKKyAgICBkZWYgdGVzdF9hbm90aGVyX2xvbmdfbXVsdGlsaW5lX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICcnJ1wKK1JlY2VpdmVkOiBmcm9tIHNpaW1hZ2UuY29tIChbMTcyLjI1LjEuM10pIGJ5IHppbWEuc2lsaWNvbmltYWdlLmNvbSB3aXRoIE1pY3Jvc29mdCBTTVRQU1ZDKDUuMC4yMTk1LjQ5MDUpOworXHRXZWQsIDE2IE9jdCAyMDAyIDA3OjQxOjExIC0wNzAwJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAnJydcCitSZWNlaXZlZDogZnJvbSBzaWltYWdlLmNvbSAoWzE3Mi4yNS4xLjNdKSBieSB6aW1hLnNpbGljb25pbWFnZS5jb20gd2l0aAorXHRNaWNyb3NvZnQgU01UUFNWQyg1LjAuMjE5NS40OTA1KTsgV2VkLCAxNiBPY3QgMjAwMiAwNzo0MToxMSAtMDcwMAorCisnJycpCisKKyAgICBkZWYgdGVzdF9sb25nX2xpbmVzX3dpdGhfZGlmZmVyZW50X2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9ICIiIlwKK0xpc3QtVW5zdWJzY3JpYmU6IDxodHRwczovL2xpc3RzLnNvdXJjZWZvcmdlLm5ldC9saXN0cy9saXN0aW5mby9zcGFtYXNzYXNzaW4tdGFsaz4sCisgICAgICAgIDxtYWlsdG86c3BhbWFzc2Fzc2luLXRhbGstcmVxdWVzdEBsaXN0cy5zb3VyY2Vmb3JnZS5uZXQ/c3ViamVjdD11bnN1YnNjcmliZT4iIiIKKyAgICAgICAgbXNnID0gTWVzc2FnZSgpCisgICAgICAgIG1zZ1snTGlzdCddID0gaAorICAgICAgICBtc2dbJ0xpc3QnXSA9IEhlYWRlcihoLCBoZWFkZXJfbmFtZT0nTGlzdCcpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorTGlzdDogTGlzdC1VbnN1YnNjcmliZTogPGh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3NwYW1hc3Nhc3Npbi10YWxrPiwKK1x0PG1haWx0bzpzcGFtYXNzYXNzaW4tdGFsay1yZXF1ZXN0QGxpc3RzLnNvdXJjZWZvcmdlLm5ldD9zdWJqZWN0PXVuc3Vic2NyaWJlPgorTGlzdDogTGlzdC1VbnN1YnNjcmliZTogPGh0dHBzOi8vbGlzdHMuc291cmNlZm9yZ2UubmV0L2xpc3RzL2xpc3RpbmZvL3NwYW1hc3Nhc3Npbi10YWxrPiwKKyA8bWFpbHRvOnNwYW1hc3Nhc3Npbi10YWxrLXJlcXVlc3RAbGlzdHMuc291cmNlZm9yZ2UubmV0P3N1YmplY3Q9dW5zdWJzY3JpYmU+CisKKyIiIikKKworCisMCisjIFRlc3QgbWFuZ2xpbmcgb2YgIkZyb20gIiBsaW5lcyBpbiB0aGUgYm9keSBvZiBhIG1lc3NhZ2UKK2NsYXNzIFRlc3RGcm9tTWFuZ2xpbmcodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5tc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgc2VsZi5tc2dbJ0Zyb20nXSA9ICdhYWFAYmJiLm9yZycKKyAgICAgICAgc2VsZi5tc2cuc2V0X3BheWxvYWQoIiIiXAorRnJvbSB0aGUgZGVzayBvZiBBLkEuQS46CitCbGFoIGJsYWggYmxhaAorIiIiKQorCisgICAgZGVmIHRlc3RfbWFuZ2xlZF9mcm9tKHNlbGYpOgorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHMsIG1hbmdsZV9mcm9tXz1UcnVlKQorICAgICAgICBnLmZsYXR0ZW4oc2VsZi5tc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAiIiJcCitGcm9tOiBhYWFAYmJiLm9yZworCis+RnJvbSB0aGUgZGVzayBvZiBBLkEuQS46CitCbGFoIGJsYWggYmxhaAorIiIiKQorCisgICAgZGVmIHRlc3RfZG9udF9tYW5nbGVfZnJvbShzZWxmKToKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYW5nbGVfZnJvbV89RmFsc2UpCisgICAgICAgIGcuZmxhdHRlbihzZWxmLm1zZykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICIiIlwKK0Zyb206IGFhYUBiYmIub3JnCisKK0Zyb20gdGhlIGRlc2sgb2YgQS5BLkEuOgorQmxhaCBibGFoIGJsYWgKKyIiIikKKworCisMCisjIFRlc3QgdGhlIGJhc2ljIE1JTUVBdWRpbyBjbGFzcworY2xhc3MgVGVzdE1JTUVBdWRpbyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICAjIE1ha2Ugc3VyZSB3ZSBwaWNrIHVwIHRoZSBhdWRpb3Rlc3QuYXUgdGhhdCBsaXZlcyBpbiBlbWFpbC90ZXN0L2RhdGEuCisgICAgICAgICMgSW4gUHl0aG9uLCB0aGVyZSdzIGFuIGF1ZGlvdGVzdC5hdSBsaXZpbmcgaW4gTGliL3Rlc3QgYnV0IHRoYXQgaXNuJ3QKKyAgICAgICAgIyBpbmNsdWRlZCBpbiBzb21lIGJpbmFyeSBkaXN0cm9zIHRoYXQgZG9uJ3QgaW5jbHVkZSB0aGUgdGVzdAorICAgICAgICAjIHBhY2thZ2UuICBUaGUgdHJhaWxpbmcgZW1wdHkgc3RyaW5nIG9uIHRoZSAuam9pbigpIGlzIHNpZ25pZmljYW50CisgICAgICAgICMgc2luY2UgZmluZGZpbGUoKSB3aWxsIGRvIGEgZGlybmFtZSgpLgorICAgICAgICBkYXRhZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShsYW5kbWFyayksICdkYXRhJywgJycpCisgICAgICAgIGZwID0gb3BlbihmaW5kZmlsZSgnYXVkaW90ZXN0LmF1JywgZGF0YWRpciksICdyYicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2F1ZGlvZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBzZWxmLl9hdSA9IE1JTUVBdWRpbyhzZWxmLl9hdWRpb2RhdGEpCisKKyAgICBkZWYgdGVzdF9ndWVzc19taW5vcl90eXBlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2F1LmdldF9jb250ZW50X3R5cGUoKSwgJ2F1ZGlvL2Jhc2ljJykKKworICAgIGRlZiB0ZXN0X2VuY29kaW5nKHNlbGYpOgorICAgICAgICBwYXlsb2FkID0gc2VsZi5fYXUuZ2V0X3BheWxvYWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGJhc2U2NC5kZWNvZGVzdHJpbmcocGF5bG9hZCksIHNlbGYuX2F1ZGlvZGF0YSkKKworICAgIGRlZiB0ZXN0X2NoZWNrU2V0TWlub3Ioc2VsZik6CisgICAgICAgIGF1ID0gTUlNRUF1ZGlvKHNlbGYuX2F1ZGlvZGF0YSwgJ2Zpc2gnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGF1LmdldF9jb250ZW50X3R5cGUoKSwgJ2F1ZGlvL2Zpc2gnKQorCisgICAgZGVmIHRlc3RfYWRkX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBzZWxmLl9hdS5hZGRfaGVhZGVyKCdDb250ZW50LURpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdhdWRpb3Rlc3QuYXUnKQorICAgICAgICBlcShzZWxmLl9hdVsnY29udGVudC1kaXNwb3NpdGlvbiddLAorICAgICAgICAgICAnYXR0YWNobWVudDsgZmlsZW5hbWU9ImF1ZGlvdGVzdC5hdSInKQorICAgICAgICBlcShzZWxmLl9hdS5nZXRfcGFyYW1zKGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLAorICAgICAgICAgICBbKCdhdHRhY2htZW50JywgJycpLCAoJ2ZpbGVuYW1lJywgJ2F1ZGlvdGVzdC5hdScpXSkKKyAgICAgICAgZXEoc2VsZi5fYXUuZ2V0X3BhcmFtKCdmaWxlbmFtZScsIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLAorICAgICAgICAgICAnYXVkaW90ZXN0LmF1JykKKyAgICAgICAgbWlzc2luZyA9IFtdCisgICAgICAgIGVxKHNlbGYuX2F1LmdldF9wYXJhbSgnYXR0YWNobWVudCcsIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLCAnJykKKyAgICAgICAgdW5sZXNzKHNlbGYuX2F1LmdldF9wYXJhbSgnZm9vJywgZmFpbG9iaj1taXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpIGlzIG1pc3NpbmcpCisgICAgICAgICMgVHJ5IHNvbWUgbWlzc2luZyBzdHVmZgorICAgICAgICB1bmxlc3Moc2VsZi5fYXUuZ2V0X3BhcmFtKCdmb29iYXInLCBtaXNzaW5nKSBpcyBtaXNzaW5nKQorICAgICAgICB1bmxlc3Moc2VsZi5fYXUuZ2V0X3BhcmFtKCdhdHRhY2htZW50JywgbWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2Zvb2JhcicpIGlzIG1pc3NpbmcpCisKKworDAorIyBUZXN0IHRoZSBiYXNpYyBNSU1FSW1hZ2UgY2xhc3MKK2NsYXNzIFRlc3RNSU1FSW1hZ2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnUHlCYW5uZXIwNDguZ2lmJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5faW1nZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBzZWxmLl9pbSA9IE1JTUVJbWFnZShzZWxmLl9pbWdkYXRhKQorCisgICAgZGVmIHRlc3RfZ3Vlc3NfbWlub3JfdHlwZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLl9pbS5nZXRfY29udGVudF90eXBlKCksICdpbWFnZS9naWYnKQorCisgICAgZGVmIHRlc3RfZW5jb2Rpbmcoc2VsZik6CisgICAgICAgIHBheWxvYWQgPSBzZWxmLl9pbS5nZXRfcGF5bG9hZCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmFzZTY0LmRlY29kZXN0cmluZyhwYXlsb2FkKSwgc2VsZi5faW1nZGF0YSkKKworICAgIGRlZiB0ZXN0X2NoZWNrU2V0TWlub3Ioc2VsZik6CisgICAgICAgIGltID0gTUlNRUltYWdlKHNlbGYuX2ltZ2RhdGEsICdmaXNoJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChpbS5nZXRfY29udGVudF90eXBlKCksICdpbWFnZS9maXNoJykKKworICAgIGRlZiB0ZXN0X2FkZF9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgc2VsZi5faW0uYWRkX2hlYWRlcignQ29udGVudC1EaXNwb3NpdGlvbicsICdhdHRhY2htZW50JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT0nZGluZ3VzZmlzaC5naWYnKQorICAgICAgICBlcShzZWxmLl9pbVsnY29udGVudC1kaXNwb3NpdGlvbiddLAorICAgICAgICAgICAnYXR0YWNobWVudDsgZmlsZW5hbWU9ImRpbmd1c2Zpc2guZ2lmIicpCisgICAgICAgIGVxKHNlbGYuX2ltLmdldF9wYXJhbXMoaGVhZGVyPSdjb250ZW50LWRpc3Bvc2l0aW9uJyksCisgICAgICAgICAgIFsoJ2F0dGFjaG1lbnQnLCAnJyksICgnZmlsZW5hbWUnLCAnZGluZ3VzZmlzaC5naWYnKV0pCisgICAgICAgIGVxKHNlbGYuX2ltLmdldF9wYXJhbSgnZmlsZW5hbWUnLCBoZWFkZXI9J2NvbnRlbnQtZGlzcG9zaXRpb24nKSwKKyAgICAgICAgICAgJ2Rpbmd1c2Zpc2guZ2lmJykKKyAgICAgICAgbWlzc2luZyA9IFtdCisgICAgICAgIGVxKHNlbGYuX2ltLmdldF9wYXJhbSgnYXR0YWNobWVudCcsIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpLCAnJykKKyAgICAgICAgdW5sZXNzKHNlbGYuX2ltLmdldF9wYXJhbSgnZm9vJywgZmFpbG9iaj1taXNzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcj0nY29udGVudC1kaXNwb3NpdGlvbicpIGlzIG1pc3NpbmcpCisgICAgICAgICMgVHJ5IHNvbWUgbWlzc2luZyBzdHVmZgorICAgICAgICB1bmxlc3Moc2VsZi5faW0uZ2V0X3BhcmFtKCdmb29iYXInLCBtaXNzaW5nKSBpcyBtaXNzaW5nKQorICAgICAgICB1bmxlc3Moc2VsZi5faW0uZ2V0X3BhcmFtKCdhdHRhY2htZW50JywgbWlzc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXI9J2Zvb2JhcicpIGlzIG1pc3NpbmcpCisKKworDAorIyBUZXN0IHRoZSBiYXNpYyBNSU1FQXBwbGljYXRpb24gY2xhc3MKK2NsYXNzIFRlc3RNSU1FQXBwbGljYXRpb24odW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2hlYWRlcnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNSU1FQXBwbGljYXRpb24oJ1x4ZmFceGZiXHhmY1x4ZmRceGZlXHhmZicpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ2Jhc2U2NCcpCisKKyAgICBkZWYgdGVzdF9ib2R5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgYnl0ZXMgPSAnXHhmYVx4ZmJceGZjXHhmZFx4ZmVceGZmJworICAgICAgICBtc2cgPSBNSU1FQXBwbGljYXRpb24oYnl0ZXMpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnK3Z2OC9mNy8nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCBieXRlcykKKworCisMCisjIFRlc3QgdGhlIGJhc2ljIE1JTUVUZXh0IGNsYXNzCitjbGFzcyBUZXN0TUlNRVRleHQodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5fbXNnID0gTUlNRVRleHQoJ2hlbGxvIHRoZXJlJykKKworICAgIGRlZiB0ZXN0X3R5cGVzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIGVxKHNlbGYuX21zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoc2VsZi5fbXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCAndXMtYXNjaWknKQorICAgICAgICBtaXNzaW5nID0gW10KKyAgICAgICAgdW5sZXNzKHNlbGYuX21zZy5nZXRfcGFyYW0oJ2Zvb2JhcicsIG1pc3NpbmcpIGlzIG1pc3NpbmcpCisgICAgICAgIHVubGVzcyhzZWxmLl9tc2cuZ2V0X3BhcmFtKCdjaGFyc2V0JywgbWlzc2luZywgaGVhZGVyPSdmb29iYXInKQorICAgICAgICAgICAgICAgaXMgbWlzc2luZykKKworICAgIGRlZiB0ZXN0X3BheWxvYWQoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5fbXNnLmdldF9wYXlsb2FkKCksICdoZWxsbyB0aGVyZScpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhub3Qgc2VsZi5fbXNnLmlzX211bHRpcGFydCgpKQorCisgICAgZGVmIHRlc3RfY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB0aGVyZScsIF9jaGFyc2V0PSd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZy5nZXRfY2hhcnNldCgpLmlucHV0X2NoYXJzZXQsICd1cy1hc2NpaScpCisgICAgICAgIGVxKG1zZ1snY29udGVudC10eXBlJ10sICd0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSInKQorCisKKwwKKyMgVGVzdCBjb21wbGljYXRlZCBtdWx0aXBhcnQvKiBtZXNzYWdlcworY2xhc3MgVGVzdE11bHRpcGFydChUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ1B5QmFubmVyMDQ4LmdpZicpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgICAgICBjb250YWluZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJywgYm91bmRhcnk9J0JPVU5EQVJZJykKKyAgICAgICAgaW1hZ2UgPSBNSU1FSW1hZ2UoZGF0YSwgbmFtZT0nZGluZ3VzZmlzaC5naWYnKQorICAgICAgICBpbWFnZS5hZGRfaGVhZGVyKCdjb250ZW50LWRpc3Bvc2l0aW9uJywgJ2F0dGFjaG1lbnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdkaW5ndXNmaXNoLmdpZicpCisgICAgICAgIGludHJvID0gTUlNRVRleHQoJycnXAorSGkgdGhlcmUsCisKK1RoaXMgaXMgdGhlIGRpbmd1cyBmaXNoLgorJycnKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKGludHJvKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKGltYWdlKQorICAgICAgICBjb250YWluZXJbJ0Zyb20nXSA9ICdCYXJyeSA8YmFycnlAZGlnaWNvb2wuY29tPicKKyAgICAgICAgY29udGFpbmVyWydUbyddID0gJ0Rpbmd1cyBMb3ZlcnMgPGNyYXZpbmRvZ3NAY3JhdmluZG9ncy5jb20+JworICAgICAgICBjb250YWluZXJbJ1N1YmplY3QnXSA9ICdIZXJlIGlzIHlvdXIgZGluZ3VzIGZpc2gnCisKKyAgICAgICAgbm93ID0gOTg3ODA5NzAyLjU0ODQ4NTk5CisgICAgICAgIHRpbWV0dXBsZSA9IHRpbWUubG9jYWx0aW1lKG5vdykKKyAgICAgICAgaWYgdGltZXR1cGxlWy0xXSA9PSAwOgorICAgICAgICAgICAgdHpzZWNzID0gdGltZS50aW1lem9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHpzZWNzID0gdGltZS5hbHR6b25lCisgICAgICAgIGlmIHR6c2VjcyA+IDA6CisgICAgICAgICAgICBzaWduID0gJy0nCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaWduID0gJysnCisgICAgICAgIHR6b2Zmc2V0ID0gJyAlcyUwNGQnICUgKHNpZ24sIHR6c2VjcyAvIDM2KQorICAgICAgICBjb250YWluZXJbJ0RhdGUnXSA9IHRpbWUuc3RyZnRpbWUoCisgICAgICAgICAgICAnJWEsICVkICViICVZICVIOiVNOiVTJywKKyAgICAgICAgICAgIHRpbWUubG9jYWx0aW1lKG5vdykpICsgdHpvZmZzZXQKKyAgICAgICAgc2VsZi5fbXNnID0gY29udGFpbmVyCisgICAgICAgIHNlbGYuX2ltID0gaW1hZ2UKKyAgICAgICAgc2VsZi5fdHh0ID0gaW50cm8KKworICAgIGRlZiB0ZXN0X2hpZXJhcmNoeShzZWxmKToKKyAgICAgICAgIyBjb252ZW5pZW5jZQorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisgICAgICAgICMgdGVzdHMKKyAgICAgICAgbSA9IHNlbGYuX21zZworICAgICAgICB1bmxlc3MobS5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgZXEobS5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvbWl4ZWQnKQorICAgICAgICBlcShsZW4obS5nZXRfcGF5bG9hZCgpKSwgMikKKyAgICAgICAgcmFpc2VzKEluZGV4RXJyb3IsIG0uZ2V0X3BheWxvYWQsIDIpCisgICAgICAgIG0wID0gbS5nZXRfcGF5bG9hZCgwKQorICAgICAgICBtMSA9IG0uZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgdW5sZXNzKG0wIGlzIHNlbGYuX3R4dCkKKyAgICAgICAgdW5sZXNzKG0xIGlzIHNlbGYuX2ltKQorICAgICAgICBlcShtLmdldF9wYXlsb2FkKCksIFttMCwgbTFdKQorICAgICAgICB1bmxlc3Mobm90IG0wLmlzX211bHRpcGFydCgpKQorICAgICAgICB1bmxlc3Mobm90IG0xLmlzX211bHRpcGFydCgpKQorCisgICAgZGVmIHRlc3RfZW1wdHlfbXVsdGlwYXJ0X2lkZW1wb3RlbnQoc2VsZik6CisgICAgICAgIHRleHQgPSAiIiJcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKworLS1CT1VOREFSWQorCisKKy0tQk9VTkRBUlktLQorIiIiCisgICAgICAgIG1zZyA9IFBhcnNlcigpLnBhcnNlc3RyKHRleHQpCisgICAgICAgIHNlbGYubmRpZmZBc3NlcnRFcXVhbCh0ZXh0LCBtc2cuYXNfc3RyaW5nKCkpCisKKyAgICBkZWYgdGVzdF9ub19wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX25vbmVfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgc2VsZi5uZGlmZkFzc2VydEVxdWFsKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKKworLS1CT1VOREFSWS0tJycnKQorCisgICAgZGVmIHRlc3Rfbm9fcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9lbXB0eV9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLnByZWFtYmxlID0gJycKKyAgICAgICAgb3V0ZXIuZXBpbG9ndWUgPSAnJworICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgc2VsZi5uZGlmZkFzc2VydEVxdWFsKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKworLS1CT1VOREFSWQorCistLUJPVU5EQVJZLS0KKycnJykKKworICAgIGRlZiB0ZXN0X29uZV9wYXJ0X2luX2FfbXVsdGlwYXJ0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIG91dGVyLmF0dGFjaChtc2cpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tJycnKQorCisgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfZW1wdHlfcHJlYW1ibGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5wcmVhbWJsZSA9ICcnCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIG91dGVyLmF0dGFjaChtc2cpCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tJycnKQorCisKKyAgICBkZWYgdGVzdF9zZXFfcGFydHNfaW5fYV9tdWx0aXBhcnRfd2l0aF9ub25lX3ByZWFtYmxlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIucHJlYW1ibGUgPSBOb25lCisgICAgICAgIG1zZyA9IE1JTUVUZXh0KCdoZWxsbyB3b3JsZCcpCisgICAgICAgIG91dGVyLmF0dGFjaChtc2cpCisgICAgICAgIG91dGVyLnNldF9ib3VuZGFyeSgnQk9VTkRBUlknKQorICAgICAgICBlcShvdXRlci5hc19zdHJpbmcoKSwgJycnXAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCitTdWJqZWN0OiBBIHN1YmplY3QKK1RvOiBhcGVyc29uQGRvbS5haW4KK0Zyb206IGJwZXJzb25AZG9tLmFpbgorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIgorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworaGVsbG8gd29ybGQKKy0tQk9VTkRBUlktLScnJykKKworCisgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfbm9uZV9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgb3V0ZXIgPSBNSU1FQmFzZSgnbXVsdGlwYXJ0JywgJ21peGVkJykKKyAgICAgICAgb3V0ZXJbJ1N1YmplY3QnXSA9ICdBIHN1YmplY3QnCisgICAgICAgIG91dGVyWydUbyddID0gJ2FwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXJbJ0Zyb20nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyLmVwaWxvZ3VlID0gTm9uZQorICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2hlbGxvIHdvcmxkCistLUJPVU5EQVJZLS0nJycpCisKKworICAgIGRlZiB0ZXN0X3NlcV9wYXJ0c19pbl9hX211bHRpcGFydF93aXRoX2VtcHR5X2VwaWxvZ3VlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBvdXRlciA9IE1JTUVCYXNlKCdtdWx0aXBhcnQnLCAnbWl4ZWQnKQorICAgICAgICBvdXRlclsnU3ViamVjdCddID0gJ0Egc3ViamVjdCcKKyAgICAgICAgb3V0ZXJbJ1RvJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlclsnRnJvbSddID0gJ2JwZXJzb25AZG9tLmFpbicKKyAgICAgICAgb3V0ZXIuZXBpbG9ndWUgPSAnJworICAgICAgICBtc2cgPSBNSU1FVGV4dCgnaGVsbG8gd29ybGQnKQorICAgICAgICBvdXRlci5hdHRhY2gobXNnKQorICAgICAgICBvdXRlci5zZXRfYm91bmRhcnkoJ0JPVU5EQVJZJykKKyAgICAgICAgZXEob3V0ZXIuYXNfc3RyaW5nKCksICcnJ1wKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCitNSU1FLVZlcnNpb246IDEuMAorU3ViamVjdDogQSBzdWJqZWN0CitUbzogYXBlcnNvbkBkb20uYWluCitGcm9tOiBicGVyc29uQGRvbS5haW4KKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK2hlbGxvIHdvcmxkCistLUJPVU5EQVJZLS0KKycnJykKKworCisgICAgZGVmIHRlc3Rfc2VxX3BhcnRzX2luX2FfbXVsdGlwYXJ0X3dpdGhfbmxfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIG91dGVyID0gTUlNRUJhc2UoJ211bHRpcGFydCcsICdtaXhlZCcpCisgICAgICAgIG91dGVyWydTdWJqZWN0J10gPSAnQSBzdWJqZWN0JworICAgICAgICBvdXRlclsnVG8nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG91dGVyWydGcm9tJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBvdXRlci5lcGlsb2d1ZSA9ICdcbicKKyAgICAgICAgbXNnID0gTUlNRVRleHQoJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgb3V0ZXIuYXR0YWNoKG1zZykKKyAgICAgICAgb3V0ZXIuc2V0X2JvdW5kYXJ5KCdCT1VOREFSWScpCisgICAgICAgIGVxKG91dGVyLmFzX3N0cmluZygpLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IkJPVU5EQVJZIgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IEEgc3ViamVjdAorVG86IGFwZXJzb25AZG9tLmFpbgorRnJvbTogYnBlcnNvbkBkb20uYWluCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCitoZWxsbyB3b3JsZAorLS1CT1VOREFSWS0tCisKKycnJykKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfZXh0ZXJuYWxfYm9keShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzM2LnR4dCcpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIG1zZzEgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEobXNnMS5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvYWx0ZXJuYXRpdmUnKQorICAgICAgICBlcShsZW4obXNnMS5nZXRfcGF5bG9hZCgpKSwgMikKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gbXNnMS5nZXRfcGF5bG9hZCgpOgorICAgICAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL2V4dGVybmFsLWJvZHknKQorICAgICAgICAgICAgZXEobGVuKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSksIDEpCisgICAgICAgICAgICBzdWJzdWJwYXJ0ID0gc3VicGFydC5nZXRfcGF5bG9hZCgwKQorICAgICAgICAgICAgZXEoc3Vic3VicGFydC5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKworICAgIGRlZiB0ZXN0X2RvdWJsZV9ib3VuZGFyeShzZWxmKToKKyAgICAgICAgIyBtc2dfMzcudHh0IGlzIGEgbXVsdGlwYXJ0IHRoYXQgY29udGFpbnMgdHdvIGRhc2gtYm91bmRhcnkncyBpbiBhCisgICAgICAgICMgcm93LiAgT3VyIGludGVycHJldGF0aW9uIG9mIFJGQyAyMDQ2IGNhbGxzIGZvciBpZ25vcmluZyB0aGUgc2Vjb25kCisgICAgICAgICMgYW5kIHN1YnNlcXVlbnQgYm91bmRhcmllcy4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzcudHh0JykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obXNnLmdldF9wYXlsb2FkKCkpLCAzKQorCisgICAgZGVmIHRlc3RfbmVzdGVkX2lubmVyX2NvbnRhaW5zX291dGVyX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICAjIG1zZ18zOC50eHQgaGFzIGFuIGlubmVyIHBhcnQgdGhhdCBjb250YWlucyBvdXRlciBib3VuZGFyaWVzLiAgTXkKKyAgICAgICAgIyBpbnRlcnByZXRhdGlvbiBvZiBSRkMgMjA0NiAoYmFzZWQgb24gc2VjdGlvbnMgNS4xIGFuZCA1LjEuMikgc2F5CisgICAgICAgICMgdGhlc2UgYXJlIGlsbGVnYWwgYW5kIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhcyB1bnRlcm1pbmF0ZWQgaW5uZXIKKyAgICAgICAgIyBwYXJ0cy4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMzgudHh0JykKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBpdGVyYXRvcnMuX3N0cnVjdHVyZShtc2csIHNmcCkKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK211bHRpcGFydC9taXhlZAorICAgIG11bHRpcGFydC9taXhlZAorICAgICAgICBtdWx0aXBhcnQvYWx0ZXJuYXRpdmUKKyAgICAgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgIHRleHQvcGxhaW4KKyAgICB0ZXh0L3BsYWluCisiIiIpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfd2l0aF9zYW1lX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICAjIG1zZyAzOS50eHQgaXMgc2ltaWxhcmx5IGV2aWwgaW4gdGhhdCBpdCdzIGdvdCBpbm5lciBwYXJ0cyB0aGF0IHVzZQorICAgICAgICAjIHRoZSBzYW1lIGJvdW5kYXJ5IGFzIG91dGVyIHBhcnRzLiAgQWdhaW4sIEkgYmVsaWV2ZSB0aGUgd2F5IHRoaXMgaXMKKyAgICAgICAgIyBwYXJzZWQgaXMgY2xvc2VzdCB0byB0aGUgc3Bpcml0IG9mIFJGQyAyMDQ2CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzM5LnR4dCcpCisgICAgICAgIHNmcCA9IFN0cmluZ0lPKCkKKyAgICAgICAgaXRlcmF0b3JzLl9zdHJ1Y3R1cmUobXNnLCBzZnApCisgICAgICAgIGVxKHNmcC5nZXR2YWx1ZSgpLCAiIiJcCittdWx0aXBhcnQvbWl4ZWQKKyAgICBtdWx0aXBhcnQvbWl4ZWQKKyAgICAgICAgbXVsdGlwYXJ0L2FsdGVybmF0aXZlCisgICAgICAgIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbQorICAgICAgICBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0KKyAgICB0ZXh0L3BsYWluCisiIiIpCisKKyAgICBkZWYgdGVzdF9ib3VuZGFyeV9pbl9ub25fbXVsdGlwYXJ0KHNlbGYpOgorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ180MC50eHQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5hc19zdHJpbmcoKSwgJycnXAorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBib3VuZGFyeT0iLS05NjEyODQyMzY1NTI1MjIyNjkiCisKKy0tLS05NjEyODQyMzY1NTI1MjIyNjkKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOworQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN0JpdAorCis8aHRtbD48L2h0bWw+CisKKy0tLS05NjEyODQyMzY1NTI1MjIyNjktLQorJycnKQorCisgICAgZGVmIHRlc3RfYm91bmRhcnlfd2l0aF9sZWFkaW5nX3NwYWNlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygnJydcCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSIgICAgWFhYWCIKKworLS0gICAgWFhYWAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKKworLS0gICAgWFhYWAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKKy0tICAgIFhYWFgtLQorJycnKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MobXNnLmlzX211bHRpcGFydCgpKQorICAgICAgICBlcShtc2cuZ2V0X2JvdW5kYXJ5KCksICcgICAgWFhYWCcpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDIpCisKKyAgICBkZWYgdGVzdF9ib3VuZGFyeV93aXRob3V0X3RyYWlsaW5nX25ld2xpbmUoc2VsZik6CisgICAgICAgIG0gPSBQYXJzZXIoKS5wYXJzZXN0cigiIiJcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Ij09PT09PT09PT09PT09PTAwMTIzOTQxNjQ9PSIKK01JTUUtVmVyc2lvbjogMS4wCisKKy0tPT09PT09PT09PT09PT09MDAxMjM5NDE2ND09CitDb250ZW50LVR5cGU6IGltYWdlL2ZpbGUxLmpwZworTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorCitZWE5rWmc9PQorLS09PT09PT09PT09PT09PT0wMDEyMzk0MTY0PT0tLSIiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobS5nZXRfcGF5bG9hZCgwKS5nZXRfcGF5bG9hZCgpLCAnWVhOa1pnPT0nKQorCisKKwwKKyMgVGVzdCBzb21lIGJhZGx5IGZvcm1hdHRlZCBtZXNzYWdlcworY2xhc3MgVGVzdE5vbkNvbmZvcm1hbnQoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfcGFyc2VfbWlzc2luZ19taW5vcl90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMTQudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorCisgICAgZGVmIHRlc3Rfc2FtZV9ib3VuZGFyeV9pbm5lcl9vdXRlcihzZWxmKToKKyAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE1LnR4dCcpCisgICAgICAgICMgWFhYIFdlIGNhbiBwcm9iYWJseSBldmVudHVhbGx5IGRvIGJldHRlcgorICAgICAgICBpbm5lciA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICB1bmxlc3MoaGFzYXR0cihpbm5lciwgJ2RlZmVjdHMnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oaW5uZXIuZGVmZWN0cyksIDEpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKGlubmVyLmRlZmVjdHNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5TdGFydEJvdW5kYXJ5Tm90Rm91bmREZWZlY3QpKQorCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X25vX2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICB1bmxlc3MgPSBzZWxmLmZhaWxVbmxlc3MKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjUudHh0JykKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmdldF9wYXlsb2FkKCksIHN0cikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5kZWZlY3RzKSwgMikKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sIGVycm9ycy5Ob0JvdW5kYXJ5SW5NdWx0aXBhcnREZWZlY3QpKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLk11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCkpCisKKyAgICBkZWYgdGVzdF9pbnZhbGlkX2NvbnRlbnRfdHlwZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG5lcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgIyBSRkMgMjA0NSwgJDUuMiBzYXlzIGludmFsaWQgeWllbGRzIHRleHQvcGxhaW4KKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0JworICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgICMgQ2xlYXIgdGhlIG9sZCB2YWx1ZSBhbmQgdHJ5IHNvbWV0aGluZyAvcmVhbGx5LyBpbnZhbGlkCisgICAgICAgIGRlbCBtc2dbJ2NvbnRlbnQtdHlwZSddCisgICAgICAgIG1zZ1snQ29udGVudC1UeXBlJ10gPSAnZm9vJworICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfbWFpbnR5cGUoKSwgJ3RleHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfc3VidHlwZSgpLCAncGxhaW4nKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgICMgU3RpbGwsIG1ha2Ugc3VyZSB0aGF0IHRoZSBtZXNzYWdlIGlzIGlkZW1wb3RlbnRseSBnZW5lcmF0ZWQKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBuZXEocy5nZXR2YWx1ZSgpLCAnQ29udGVudC1UeXBlOiBmb29cblxuJykKKworICAgIGRlZiB0ZXN0X25vX3N0YXJ0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zMS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgIiIiXAorLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKK21lc3NhZ2UgMQorCistLUJPVU5EQVJZCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKworbWVzc2FnZSAyCisKKy0tQk9VTkRBUlktLQorIiIiKQorCisgICAgZGVmIHRlc3Rfbm9fc2VwYXJhdGluZ19ibGFua19saW5lKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18zNS50eHQnKQorICAgICAgICBlcShtc2cuYXNfc3RyaW5nKCksICIiIlwKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorVG86IGJwZXJzb25AZG9tLmFpbgorU3ViamVjdDogaGVyZSdzIHNvbWV0aGluZyBpbnRlcmVzdGluZworCitjb3VudGVyIHRvIFJGQyAyODIyLCB0aGVyZSdzIG5vIHNlcGFyYXRpbmcgbmV3bGluZSBoZXJlCisiIiIpCisKKyAgICBkZWYgdGVzdF9seWluZ19tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ180MS50eHQnKQorICAgICAgICB1bmxlc3MoaGFzYXR0cihtc2csICdkZWZlY3RzJykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKG1zZy5kZWZlY3RzKSwgMikKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLmRlZmVjdHNbMF0sIGVycm9ycy5Ob0JvdW5kYXJ5SW5NdWx0aXBhcnREZWZlY3QpKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2cuZGVmZWN0c1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLk11bHRpcGFydEludmFyaWFudFZpb2xhdGlvbkRlZmVjdCkpCisKKyAgICBkZWYgdGVzdF9taXNzaW5nX3N0YXJ0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBvdXRlciA9IHNlbGYuX21zZ29iaignbXNnXzQyLnR4dCcpCisgICAgICAgICMgVGhlIG1lc3NhZ2Ugc3RydWN0dXJlIGlzOgorICAgICAgICAjCisgICAgICAgICMgbXVsdGlwYXJ0L21peGVkCisgICAgICAgICMgICAgdGV4dC9wbGFpbgorICAgICAgICAjICAgIG1lc3NhZ2UvcmZjODIyCisgICAgICAgICMgICAgICAgIG11bHRpcGFydC9taXhlZCBbKl0KKyAgICAgICAgIworICAgICAgICAjIFsqXSBUaGlzIG1lc3NhZ2UgaXMgbWlzc2luZyBpdHMgc3RhcnQgYm91bmRhcnkKKyAgICAgICAgYmFkID0gb3V0ZXIuZ2V0X3BheWxvYWQoMSkuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYmFkLmRlZmVjdHMpLCAxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShiYWQuZGVmZWN0c1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLlN0YXJ0Qm91bmRhcnlOb3RGb3VuZERlZmVjdCkpCisKKworDAorIyBUZXN0IFJGQyAyMDQ3IGhlYWRlciBlbmNvZGluZyBhbmQgZGVjb2RpbmcKK2NsYXNzIFRlc3RSRkMyMDQ3KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9yZmMyMDQ3X211bHRpbGluZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAiIiJSZTogPT9tYWMtaWNlbGFuZD9xP3I9OEFrc209OUFyZz04Q3M/PSBiYXoKKyBmb28gYmFyID0/bWFjLWljZWxhbmQ/cT9yPThBa3NtPTlBcmc9OENzPz0iIiIKKyAgICAgICAgZGggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIGVxKGRoLCBbCisgICAgICAgICAgICAoJ1JlOicsIE5vbmUpLAorICAgICAgICAgICAgKCdyXHg4YWtzbVx4OWFyZ1x4OGNzJywgJ21hYy1pY2VsYW5kJyksCisgICAgICAgICAgICAoJ2JheiBmb28gYmFyJywgTm9uZSksCisgICAgICAgICAgICAoJ3JceDhha3NtXHg5YXJnXHg4Y3MnLCAnbWFjLWljZWxhbmQnKV0pCisgICAgICAgIGVxKHN0cihtYWtlX2hlYWRlcihkaCkpLAorICAgICAgICAgICAiIiJSZTogPT9tYWMtaWNlbGFuZD9xP3I9OEFrc209OUFyZz04Q3M/PSBiYXogZm9vIGJhcgorID0/bWFjLWljZWxhbmQ/cT9yPThBa3NtPTlBcmc9OENzPz0iIiIpCisKKyAgICBkZWYgdGVzdF93aGl0ZXNwYWNlX2VhdGVyX3VuaWNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gJz0/SVNPLTg4NTktMT9RP0FuZHI9RTk/PSBQaXJhcmQgPHBpcmFyZEBkb20uYWluPicKKyAgICAgICAgZGggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIGVxKGRoLCBbKCdBbmRyXHhlOScsICdpc28tODg1OS0xJyksICgnUGlyYXJkIDxwaXJhcmRAZG9tLmFpbj4nLCBOb25lKV0pCisgICAgICAgIGh1ID0gdW5pY29kZShtYWtlX2hlYWRlcihkaCkpLmVuY29kZSgnbGF0aW4tMScpCisgICAgICAgIGVxKGh1LCAnQW5kclx4ZTkgUGlyYXJkIDxwaXJhcmRAZG9tLmFpbj4nKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9lYXRlcl91bmljb2RlXzIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBzID0gJ1RoZSA9P2lzby04ODU5LTE/Yj9jWFZwWTJzZ1luSnZkMjRnWm05ND89IGp1bXBlZCBvdmVyIHRoZSA9P2lzby04ODU5LTE/Yj9iR0Y2ZVNCa2IyYz0/PScKKyAgICAgICAgZGggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIGVxKGRoLCBbKCdUaGUnLCBOb25lKSwgKCdxdWljayBicm93biBmb3gnLCAnaXNvLTg4NTktMScpLAorICAgICAgICAgICAgICAgICgnanVtcGVkIG92ZXIgdGhlJywgTm9uZSksICgnbGF6eSBkb2cnLCAnaXNvLTg4NTktMScpXSkKKyAgICAgICAgaHUgPSBtYWtlX2hlYWRlcihkaCkuX191bmljb2RlX18oKQorICAgICAgICBlcShodSwgdSdUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSBsYXp5IGRvZycpCisKKworDAorIyBUZXN0IHRoZSBNSU1FTWVzc2FnZSBjbGFzcworY2xhc3MgVGVzdE1JTUVNZXNzYWdlKFRlc3RFbWFpbEJhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzExLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX3RleHQgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3R5cGVfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgTUlNRU1lc3NhZ2UsICdhIHBsYWluIHN0cmluZycpCisKKyAgICBkZWYgdGVzdF92YWxpZF9hcmd1bWVudChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBzdWJqZWN0ID0gJ0Egc3ViLW1lc3NhZ2UnCisgICAgICAgIG0gPSBNZXNzYWdlKCkKKyAgICAgICAgbVsnU3ViamVjdCddID0gc3ViamVjdAorICAgICAgICByID0gTUlNRU1lc3NhZ2UobSkKKyAgICAgICAgZXEoci5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHBheWxvYWQgPSByLmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgc3VicGFydCA9IHBheWxvYWRbMF0KKyAgICAgICAgdW5sZXNzKHN1YnBhcnQgaXMgbSkKKyAgICAgICAgZXEoc3VicGFydFsnc3ViamVjdCddLCBzdWJqZWN0KQorCisgICAgZGVmIHRlc3RfYmFkX211bHRpcGFydChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZzEgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnMVsnU3ViamVjdCddID0gJ3N1YnBhcnQgMScKKyAgICAgICAgbXNnMiA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cyWydTdWJqZWN0J10gPSAnc3VicGFydCAyJworICAgICAgICByID0gTUlNRU1lc3NhZ2UobXNnMSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoZXJyb3JzLk11bHRpcGFydENvbnZlcnNpb25FcnJvciwgci5hdHRhY2gsIG1zZzIpCisKKyAgICBkZWYgdGVzdF9nZW5lcmF0ZShzZWxmKToKKyAgICAgICAgIyBGaXJzdCBjcmFmdCB0aGUgbWVzc2FnZSB0byBiZSBlbmNhcHN1bGF0ZWQKKyAgICAgICAgbSA9IE1lc3NhZ2UoKQorICAgICAgICBtWydTdWJqZWN0J10gPSAnQW4gZW5jbG9zZWQgbWVzc2FnZScKKyAgICAgICAgbS5zZXRfcGF5bG9hZCgnSGVyZSBpcyB0aGUgYm9keSBvZiB0aGUgbWVzc2FnZS5cbicpCisgICAgICAgIHIgPSBNSU1FTWVzc2FnZShtKQorICAgICAgICByWydTdWJqZWN0J10gPSAnVGhlIGVuY2xvc2luZyBtZXNzYWdlJworICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICBnID0gR2VuZXJhdG9yKHMpCisgICAgICAgIGcuZmxhdHRlbihyKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgIiIiXAorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMgorTUlNRS1WZXJzaW9uOiAxLjAKK1N1YmplY3Q6IFRoZSBlbmNsb3NpbmcgbWVzc2FnZQorCitTdWJqZWN0OiBBbiBlbmNsb3NlZCBtZXNzYWdlCisKK0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuCisiIiIpCisKKyAgICBkZWYgdGVzdF9wYXJzZV9tZXNzYWdlX3JmYzgyMihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18xMS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBwYXlsb2FkID0gbXNnLmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgc3VibXNnID0gcGF5bG9hZFswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzdWJtc2csIE1lc3NhZ2UpKQorICAgICAgICBlcShzdWJtc2dbJ3N1YmplY3QnXSwgJ0FuIGVuY2xvc2VkIG1lc3NhZ2UnKQorICAgICAgICBlcShzdWJtc2cuZ2V0X3BheWxvYWQoKSwgJ0hlcmUgaXMgdGhlIGJvZHkgb2YgdGhlIG1lc3NhZ2UuXG4nKQorCisgICAgZGVmIHRlc3RfZHNuKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgICMgbXNnIDE2IGlzIGEgRGVsaXZlcnkgU3RhdHVzIE5vdGlmaWNhdGlvbiwgc2VlIFJGQyAxODk0CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzE2LnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvcmVwb3J0JykKKyAgICAgICAgdW5sZXNzKG1zZy5pc19tdWx0aXBhcnQoKSkKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMykKKyAgICAgICAgIyBTdWJwYXJ0IDEgaXMgYSB0ZXh0L3BsYWluLCBodW1hbiByZWFkYWJsZSBzZWN0aW9uCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoc3VicGFydC5nZXRfcGF5bG9hZCgpLCAiIiJcCitUaGlzIHJlcG9ydCByZWxhdGVzIHRvIGEgbWVzc2FnZSB5b3Ugc2VudCB3aXRoIHRoZSBmb2xsb3dpbmcgaGVhZGVyIGZpZWxkczoKKworICBNZXNzYWdlLWlkOiA8MDAyMDAxYzE0NGE2JDg3NTJlMDYwJDU2MTA0NTg2QG94eS5lZHU+CisgIERhdGU6IFN1biwgMjMgU2VwIDIwMDEgMjA6MTA6NTUgLTA3MDAKKyAgRnJvbTogIklhbiBULiBIZW5yeSIgPGhlbnJ5aUBveHkuZWR1PgorICBUbzogU29DYWwgUmF2ZXMgPHNjckBzb2NhbC1yYXZlcy5vcmc+CisgIFN1YmplY3Q6IFtzY3JdIHllYWggZm9yIElhbnMhIQorCitZb3VyIG1lc3NhZ2UgY2Fubm90IGJlIGRlbGl2ZXJlZCB0byB0aGUgZm9sbG93aW5nIHJlY2lwaWVudHM6CisKKyAgUmVjaXBpZW50IGFkZHJlc3M6IGphbmdlbDFAY291Z2FyLm5vYy51Y2xhLmVkdQorICBSZWFzb246IHJlY2lwaWVudCByZWFjaGVkIGRpc2sgcXVvdGEKKworIiIiKQorICAgICAgICAjIFN1YnBhcnQgMiBjb250YWlucyB0aGUgbWFjaGluZSBwYXJzYWJsZSBEU04gaW5mb3JtYXRpb24uICBJdAorICAgICAgICAjIGNvbnNpc3RzIG9mIHR3byBibG9ja3Mgb2YgaGVhZGVycywgcmVwcmVzZW50ZWQgYnkgdHdvIG5lc3RlZCBNZXNzYWdlCisgICAgICAgICMgb2JqZWN0cy4KKyAgICAgICAgc3VicGFydCA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShzdWJwYXJ0LmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvZGVsaXZlcnktc3RhdHVzJykKKyAgICAgICAgZXEobGVuKHN1YnBhcnQuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgICMgbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMgc2hvdWxkIHRyZWF0IGVhY2ggYmxvY2sgYXMgYSBidW5jaCBvZgorICAgICAgICAjIGhlYWRlcnMsIGkuZS4gYSBidW5jaCBvZiBNZXNzYWdlIG9iamVjdHMuCisgICAgICAgIGRzbjEgPSBzdWJwYXJ0LmdldF9wYXlsb2FkKDApCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKGRzbjEsIE1lc3NhZ2UpKQorICAgICAgICBlcShkc24xWydvcmlnaW5hbC1lbnZlbG9wZS1pZCddLCAnMEdLNTAwQjRIRDA4ODhAY291Z2FyLm5vYy51Y2xhLmVkdScpCisgICAgICAgIGVxKGRzbjEuZ2V0X3BhcmFtKCdkbnMnLCBoZWFkZXI9J3JlcG9ydGluZy1tdGEnKSwgJycpCisgICAgICAgICMgVHJ5IGEgbWlzc2luZyBvbmUgPHdpbms+CisgICAgICAgIGVxKGRzbjEuZ2V0X3BhcmFtKCduc2QnLCBoZWFkZXI9J3JlcG9ydGluZy1tdGEnKSwgTm9uZSkKKyAgICAgICAgZHNuMiA9IHN1YnBhcnQuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UoZHNuMiwgTWVzc2FnZSkpCisgICAgICAgIGVxKGRzbjJbJ2FjdGlvbiddLCAnZmFpbGVkJykKKyAgICAgICAgZXEoZHNuMi5nZXRfcGFyYW1zKGhlYWRlcj0nb3JpZ2luYWwtcmVjaXBpZW50JyksCisgICAgICAgICAgIFsoJ3JmYzgyMicsICcnKSwgKCdqYW5nZWwxQGNvdWdhci5ub2MudWNsYS5lZHUnLCAnJyldKQorICAgICAgICBlcShkc24yLmdldF9wYXJhbSgncmZjODIyJywgaGVhZGVyPSdmaW5hbC1yZWNpcGllbnQnKSwgJycpCisgICAgICAgICMgU3VicGFydCAzIGlzIHRoZSBvcmlnaW5hbCBtZXNzYWdlCisgICAgICAgIHN1YnBhcnQgPSBtc2cuZ2V0X3BheWxvYWQoMikKKyAgICAgICAgZXEoc3VicGFydC5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIHBheWxvYWQgPSBzdWJwYXJ0LmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgc3Vic3VicGFydCA9IHBheWxvYWRbMF0KKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2Uoc3Vic3VicGFydCwgTWVzc2FnZSkpCisgICAgICAgIGVxKHN1YnN1YnBhcnQuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHN1YnN1YnBhcnRbJ21lc3NhZ2UtaWQnXSwKKyAgICAgICAgICAgJzwwMDIwMDFjMTQ0YTYkODc1MmUwNjAkNTYxMDQ1ODZAb3h5LmVkdT4nKQorCisgICAgZGVmIHRlc3RfZXBpbG9ndWUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18yMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0Zyb20nXSA9ICdhcGVyc29uQGRvbS5haW4nCisgICAgICAgIG1zZ1snVG8nXSA9ICdicGVyc29uQGRvbS5haW4nCisgICAgICAgIG1zZ1snU3ViamVjdCddID0gJ1Rlc3QnCisgICAgICAgIG1zZy5wcmVhbWJsZSA9ICdNSU1FIG1lc3NhZ2UnCisgICAgICAgIG1zZy5lcGlsb2d1ZSA9ICdFbmQgb2YgTUlNRSBtZXNzYWdlXG4nCisgICAgICAgIG1zZzEgPSBNSU1FVGV4dCgnT25lJykKKyAgICAgICAgbXNnMiA9IE1JTUVUZXh0KCdUd28nKQorICAgICAgICBtc2cuYWRkX2hlYWRlcignQ29udGVudC1UeXBlJywgJ211bHRpcGFydC9taXhlZCcsIGJvdW5kYXJ5PSdCT1VOREFSWScpCisgICAgICAgIG1zZy5hdHRhY2gobXNnMSkKKyAgICAgICAgbXNnLmF0dGFjaChtc2cyKQorICAgICAgICBzZnAgPSBTdHJpbmdJTygpCisgICAgICAgIGcgPSBHZW5lcmF0b3Ioc2ZwKQorICAgICAgICBnLmZsYXR0ZW4obXNnKQorICAgICAgICBlcShzZnAuZ2V0dmFsdWUoKSwgdGV4dCkKKworICAgIGRlZiB0ZXN0X25vX25sX3ByZWFtYmxlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydGcm9tJ10gPSAnYXBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1RvJ10gPSAnYnBlcnNvbkBkb20uYWluJworICAgICAgICBtc2dbJ1N1YmplY3QnXSA9ICdUZXN0JworICAgICAgICBtc2cucHJlYW1ibGUgPSAnTUlNRSBtZXNzYWdlJworICAgICAgICBtc2cuZXBpbG9ndWUgPSAnJworICAgICAgICBtc2cxID0gTUlNRVRleHQoJ09uZScpCisgICAgICAgIG1zZzIgPSBNSU1FVGV4dCgnVHdvJykKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdtdWx0aXBhcnQvbWl4ZWQnLCBib3VuZGFyeT0nQk9VTkRBUlknKQorICAgICAgICBtc2cuYXR0YWNoKG1zZzEpCisgICAgICAgIG1zZy5hdHRhY2gobXNnMikKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK1N1YmplY3Q6IFRlc3QKK0NvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT0iQk9VTkRBUlkiCisKK01JTUUgbWVzc2FnZQorLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK09uZQorLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK1R3bworLS1CT1VOREFSWS0tCisiIiIpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3R5cGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMzAudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIGNvbnRhaW5lcjEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEoY29udGFpbmVyMS5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBjb250YWluZXIyID0gbXNnLmdldF9wYXlsb2FkKDEpCisgICAgICAgIGVxKGNvbnRhaW5lcjIuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShjb250YWluZXIyLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgY29udGFpbmVyMWEgPSBjb250YWluZXIxLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKGNvbnRhaW5lcjFhLmdldF9kZWZhdWx0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShjb250YWluZXIxYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgY29udGFpbmVyMmEgPSBjb250YWluZXIyLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKGNvbnRhaW5lcjJhLmdldF9kZWZhdWx0X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShjb250YWluZXIyYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKworICAgIGRlZiB0ZXN0X2RlZmF1bHRfdHlwZV93aXRoX2V4cGxpY2l0X2NvbnRhaW5lcl90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzI4LnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBjb250YWluZXIxID0gbXNnLmdldF9wYXlsb2FkKDApCisgICAgICAgIGVxKGNvbnRhaW5lcjEuZ2V0X2RlZmF1bHRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShjb250YWluZXIxLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgY29udGFpbmVyMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShjb250YWluZXIyLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoY29udGFpbmVyMi5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGNvbnRhaW5lcjFhID0gY29udGFpbmVyMS5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIxYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMWEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGNvbnRhaW5lcjJhID0gY29udGFpbmVyMi5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShjb250YWluZXIyYS5nZXRfZGVmYXVsdF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEoY29udGFpbmVyMmEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisKKyAgICBkZWYgdGVzdF9kZWZhdWx0X3R5cGVfbm9uX3BhcnNlZChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG5lcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICAjIFNldCB1cCBjb250YWluZXIKKyAgICAgICAgY29udGFpbmVyID0gTUlNRU11bHRpcGFydCgnZGlnZXN0JywgJ0JPVU5EQVJZJykKKyAgICAgICAgY29udGFpbmVyLmVwaWxvZ3VlID0gJycKKyAgICAgICAgIyBTZXQgdXAgc3VicGFydHMKKyAgICAgICAgc3VicGFydDFhID0gTUlNRVRleHQoJ21lc3NhZ2UgMVxuJykKKyAgICAgICAgc3VicGFydDJhID0gTUlNRVRleHQoJ21lc3NhZ2UgMlxuJykKKyAgICAgICAgc3VicGFydDEgPSBNSU1FTWVzc2FnZShzdWJwYXJ0MWEpCisgICAgICAgIHN1YnBhcnQyID0gTUlNRU1lc3NhZ2Uoc3VicGFydDJhKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKHN1YnBhcnQxKQorICAgICAgICBjb250YWluZXIuYXR0YWNoKHN1YnBhcnQyKQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0Mi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIG5lcShjb250YWluZXIuYXNfc3RyaW5nKDApLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9kaWdlc3Q7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCisKKy0tQk9VTkRBUlkKK0NvbnRlbnQtVHlwZTogbWVzc2FnZS9yZmM4MjIKK01JTUUtVmVyc2lvbjogMS4wCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDEKKworLS1CT1VOREFSWQorQ29udGVudC1UeXBlOiBtZXNzYWdlL3JmYzgyMgorTUlNRS1WZXJzaW9uOiAxLjAKKworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK21lc3NhZ2UgMgorCistLUJPVU5EQVJZLS0KKycnJykKKyAgICAgICAgZGVsIHN1YnBhcnQxWydjb250ZW50LXR5cGUnXQorICAgICAgICBkZWwgc3VicGFydDFbJ21pbWUtdmVyc2lvbiddCisgICAgICAgIGRlbCBzdWJwYXJ0MlsnY29udGVudC10eXBlJ10KKyAgICAgICAgZGVsIHN1YnBhcnQyWydtaW1lLXZlcnNpb24nXQorICAgICAgICBlcShzdWJwYXJ0MS5nZXRfY29udGVudF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIGVxKHN1YnBhcnQxLmdldF9kZWZhdWx0X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgZXEoc3VicGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShzdWJwYXJ0Mi5nZXRfZGVmYXVsdF90eXBlKCksICdtZXNzYWdlL3JmYzgyMicpCisgICAgICAgIG5lcShjb250YWluZXIuYXNfc3RyaW5nKDApLCAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9kaWdlc3Q7IGJvdW5kYXJ5PSJCT1VOREFSWSIKK01JTUUtVmVyc2lvbjogMS4wCisKKy0tQk9VTkRBUlkKKworQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PSJ1cy1hc2NpaSIKK01JTUUtVmVyc2lvbjogMS4wCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA3Yml0CisKK21lc3NhZ2UgMQorCistLUJPVU5EQVJZCisKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD0idXMtYXNjaWkiCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCittZXNzYWdlIDIKKworLS1CT1VOREFSWS0tCisnJycpCisKKyAgICBkZWYgdGVzdF9taW1lX2F0dGFjaG1lbnRzX2luX2NvbnN0cnVjdG9yKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgdGV4dDEgPSBNSU1FVGV4dCgnJykKKyAgICAgICAgdGV4dDIgPSBNSU1FVGV4dCgnJykKKyAgICAgICAgbXNnID0gTUlNRU11bHRpcGFydChfc3VicGFydHM9KHRleHQxLCB0ZXh0MikpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDIpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgwKSwgdGV4dDEpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgxKSwgdGV4dDIpCisKKworDAorIyBBIGdlbmVyYWwgdGVzdCBvZiBwYXJzZXItPm1vZGVsLT5nZW5lcmF0b3IgaWRlbXBvdGVuY3kuICBJT1csIHJlYWQgYSBtZXNzYWdlCisjIGluLCBwYXJzZSBpdCBpbnRvIGEgbWVzc2FnZSBvYmplY3QgdHJlZSwgdGhlbiB3aXRob3V0IHRvdWNoaW5nIHRoZSB0cmVlLAorIyByZWdlbmVyYXRlIHRoZSBwbGFpbiB0ZXh0LiAgVGhlIG9yaWdpbmFsIHRleHQgYW5kIHRoZSB0cmFuc2Zvcm1lZCB0ZXh0CisjIHNob3VsZCBiZSBpZGVudGljYWwuICBOb3RlOiB0aGF0IHdlIGlnbm9yZSB0aGUgVW5peC1Gcm9tIHNpbmNlIHRoYXQgbWF5CisjIGNvbnRhaW4gYSBjaGFuZ2VkIGRhdGUuCitjbGFzcyBUZXN0SWRlbXBvdGVudChUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgX21zZ29iaihzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGZwID0gb3BlbmZpbGUoZmlsZW5hbWUpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhkYXRhKQorICAgICAgICByZXR1cm4gbXNnLCBkYXRhCisKKyAgICBkZWYgX2lkZW1wb3RlbnQoc2VsZiwgbXNnLCB0ZXh0KToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgcyA9IFN0cmluZ0lPKCkKKyAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYXhoZWFkZXJsZW49MCkKKyAgICAgICAgZy5mbGF0dGVuKG1zZykKKyAgICAgICAgZXEodGV4dCwgcy5nZXR2YWx1ZSgpKQorCisgICAgZGVmIHRlc3RfcGFyc2VfdGV4dF9tZXNzYWdlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X21haW50eXBlKCksICd0ZXh0JykKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3N1YnR5cGUoKSwgJ3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKVsxXSwgKCdjaGFyc2V0JywgJ3VzLWFzY2lpJykpCisgICAgICAgIGVxKG1zZy5nZXRfcGFyYW0oJ2NoYXJzZXQnKSwgJ3VzLWFzY2lpJykKKyAgICAgICAgZXEobXNnLnByZWFtYmxlLCBOb25lKQorICAgICAgICBlcShtc2cuZXBpbG9ndWUsIE5vbmUpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfcGFyc2VfdW50eXBlZF9tZXNzYWdlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzAzLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbXMoKSwgTm9uZSkKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgnY2hhcnNldCcpLCBOb25lKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X3NpbXBsZV9tdWx0aXBhcnQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzA0LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfTUlNRV9kaWdlc3Qoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzAyLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbG9uZ19oZWFkZXIoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzI3LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfTUlNRV9kaWdlc3Rfd2l0aF9wYXJ0X2hlYWRlcnMoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzI4LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbWl4ZWRfd2l0aF9pbWFnZShzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMDYudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBhcnRfcmVwb3J0KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X2RzbihzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMTYudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9wcmVhbWJsZV9lcGlsb2d1ZShzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMjEudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9tdWx0aXBhcnRfb25lX3BhcnQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzIzLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbXVsdGlwYXJ0X25vX3BhcnRzKHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18yNC50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X25vX3N0YXJ0X2JvdW5kYXJ5KHNlbGYpOgorICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18zMS50eHQnKQorICAgICAgICBzZWxmLl9pZGVtcG90ZW50KG1zZywgdGV4dCkKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfY2hhcnNldChzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzIudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9tb3JlX3JmYzIyMzFfcGFyYW1ldGVycyhzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzMudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF90ZXh0X3BsYWluX2luX2FfbXVsdGlwYXJ0X2RpZ2VzdChzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMzQudHh0JykKKyAgICAgICAgc2VsZi5faWRlbXBvdGVudChtc2csIHRleHQpCisKKyAgICBkZWYgdGVzdF9uZXN0ZWRfbXVsdGlwYXJ0X21peGVkcyhzZWxmKToKKyAgICAgICAgbXNnLCB0ZXh0ID0gc2VsZi5fbXNnb2JqKCdtc2dfMTJhLnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfbWVzc2FnZV9leHRlcm5hbF9ib2R5X2lkZW1wb3RlbnQoc2VsZik6CisgICAgICAgIG1zZywgdGV4dCA9IHNlbGYuX21zZ29iaignbXNnXzM2LnR4dCcpCisgICAgICAgIHNlbGYuX2lkZW1wb3RlbnQobXNnLCB0ZXh0KQorCisgICAgZGVmIHRlc3RfY29udGVudF90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICAjIEdldCBhIG1lc3NhZ2Ugb2JqZWN0IGFuZCByZXNldCB0aGUgc2VlayBwb2ludGVyIGZvciBvdGhlciB0ZXN0cworICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNS50eHQnKQorICAgICAgICBlcShtc2cuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbXVsdGlwYXJ0L3JlcG9ydCcpCisgICAgICAgICMgVGVzdCB0aGUgQ29udGVudC1UeXBlOiBwYXJhbWV0ZXJzCisgICAgICAgIHBhcmFtcyA9IHt9CisgICAgICAgIGZvciBwaywgcHYgaW4gbXNnLmdldF9wYXJhbXMoKToKKyAgICAgICAgICAgIHBhcmFtc1twa10gPSBwdgorICAgICAgICBlcShwYXJhbXNbJ3JlcG9ydC10eXBlJ10sICdkZWxpdmVyeS1zdGF0dXMnKQorICAgICAgICBlcShwYXJhbXNbJ2JvdW5kYXJ5J10sICdEMTY5MEE3QUMxLjk5Njg1NjA5MC9tYWlsLmV4YW1wbGUuY29tJykKKyAgICAgICAgZXEobXNnLnByZWFtYmxlLCAnVGhpcyBpcyBhIE1JTUUtZW5jYXBzdWxhdGVkIG1lc3NhZ2UuXG4nKQorICAgICAgICBlcShtc2cuZXBpbG9ndWUsICdcbicpCisgICAgICAgIGVxKGxlbihtc2cuZ2V0X3BheWxvYWQoKSksIDMpCisgICAgICAgICMgTWFrZSBzdXJlIHRoZSBzdWJwYXJ0cyBhcmUgd2hhdCB3ZSBleHBlY3QKKyAgICAgICAgbXNnMSA9IG1zZy5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cxLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKKyAgICAgICAgbXNnMiA9IG1zZy5nZXRfcGF5bG9hZCgxKQorICAgICAgICBlcShtc2cyLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBlcShtc2cyLmdldF9wYXlsb2FkKCksICdZYWRkYSB5YWRkYSB5YWRkYVxuJykKKyAgICAgICAgbXNnMyA9IG1zZy5nZXRfcGF5bG9hZCgyKQorICAgICAgICBlcShtc2czLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UobXNnMywgTWVzc2FnZSkpCisgICAgICAgIHBheWxvYWQgPSBtc2czLmdldF9wYXlsb2FkKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UocGF5bG9hZCwgbGlzdCkpCisgICAgICAgIGVxKGxlbihwYXlsb2FkKSwgMSkKKyAgICAgICAgbXNnNCA9IHBheWxvYWRbMF0KKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnNCwgTWVzc2FnZSkpCisgICAgICAgIGVxKG1zZzQuZ2V0X3BheWxvYWQoKSwgJ1lhZGRhIHlhZGRhIHlhZGRhXG4nKQorCisgICAgZGVmIHRlc3RfcGFyc2VyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWxzCisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICBtc2csIHRleHQgPSBzZWxmLl9tc2dvYmooJ21zZ18wNi50eHQnKQorICAgICAgICAjIENoZWNrIHNvbWUgb2YgdGhlIG91dGVyIGhlYWRlcnMKKyAgICAgICAgZXEobXNnLmdldF9jb250ZW50X3R5cGUoKSwgJ21lc3NhZ2UvcmZjODIyJykKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlIHBheWxvYWQgaXMgYSBsaXN0IG9mIGV4YWN0bHkgb25lIHN1Yi1NZXNzYWdlLCBhbmQgdGhhdAorICAgICAgICAjIHRoYXQgc3VibWVzc2FnZSBoYXMgYSB0eXBlIG9mIHRleHQvcGxhaW4KKyAgICAgICAgcGF5bG9hZCA9IG1zZy5nZXRfcGF5bG9hZCgpCisgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHBheWxvYWQsIGxpc3QpKQorICAgICAgICBlcShsZW4ocGF5bG9hZCksIDEpCisgICAgICAgIG1zZzEgPSBwYXlsb2FkWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZzEsIE1lc3NhZ2UpKQorICAgICAgICBlcShtc2cxLmdldF9jb250ZW50X3R5cGUoKSwgJ3RleHQvcGxhaW4nKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShtc2cxLmdldF9wYXlsb2FkKCksIHN0cikpCisgICAgICAgIGVxKG1zZzEuZ2V0X3BheWxvYWQoKSwgJ1xuJykKKworCisMCisjIFRlc3QgdmFyaW91cyBvdGhlciBiaXRzIG9mIHRoZSBwYWNrYWdlJ3MgZnVuY3Rpb25hbGl0eQorY2xhc3MgVGVzdE1pc2NlbGxhbmVvdXMoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfbWVzc2FnZV9mcm9tX3N0cmluZyhzZWxmKToKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAxLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRleHQgPSBmcC5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyh0ZXh0KQorICAgICAgICBzID0gU3RyaW5nSU8oKQorICAgICAgICAjIERvbid0IHdyYXAvY29udGludWUgbG9uZyBoZWFkZXJzIHNpbmNlIHdlJ3JlIHRyeWluZyB0byB0ZXN0CisgICAgICAgICMgaWRlbXBvdGVuY3kuCisgICAgICAgIGcgPSBHZW5lcmF0b3IocywgbWF4aGVhZGVybGVuPTApCisgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dCwgcy5nZXR2YWx1ZSgpKQorCisgICAgZGVmIHRlc3RfbWVzc2FnZV9mcm9tX2ZpbGUoc2VsZik6CisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgICAgICBmcC5zZWVrKDApCisgICAgICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fZmlsZShmcCkKKyAgICAgICAgICAgIHMgPSBTdHJpbmdJTygpCisgICAgICAgICAgICAjIERvbid0IHdyYXAvY29udGludWUgbG9uZyBoZWFkZXJzIHNpbmNlIHdlJ3JlIHRyeWluZyB0byB0ZXN0CisgICAgICAgICAgICAjIGlkZW1wb3RlbmN5LgorICAgICAgICAgICAgZyA9IEdlbmVyYXRvcihzLCBtYXhoZWFkZXJsZW49MCkKKyAgICAgICAgICAgIGcuZmxhdHRlbihtc2cpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRleHQsIHMuZ2V0dmFsdWUoKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfZnJvbV9zdHJpbmdfd2l0aF9jbGFzcyhzZWxmKToKKyAgICAgICAgdW5sZXNzID0gc2VsZi5mYWlsVW5sZXNzCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICMgQ3JlYXRlIGEgc3ViY2xhc3MKKyAgICAgICAgY2xhc3MgTXlNZXNzYWdlKE1lc3NhZ2UpOgorICAgICAgICAgICAgcGFzcworCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcodGV4dCwgTXlNZXNzYWdlKQorICAgICAgICB1bmxlc3MoaXNpbnN0YW5jZShtc2csIE15TWVzc2FnZSkpCisgICAgICAgICMgVHJ5IHNvbWV0aGluZyBtb3JlIGNvbXBsaWNhdGVkCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18wMi50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB0ZXh0ID0gZnAucmVhZCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcodGV4dCwgTXlNZXNzYWdlKQorICAgICAgICBmb3Igc3VicGFydCBpbiBtc2cud2FsaygpOgorICAgICAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2Uoc3VicGFydCwgTXlNZXNzYWdlKSkKKworICAgIGRlZiB0ZXN0X21lc3NhZ2VfZnJvbV9maWxlX3dpdGhfY2xhc3Moc2VsZik6CisgICAgICAgIHVubGVzcyA9IHNlbGYuZmFpbFVubGVzcworICAgICAgICAjIENyZWF0ZSBhIHN1YmNsYXNzCisgICAgICAgIGNsYXNzIE15TWVzc2FnZShNZXNzYWdlKToKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDEudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnAsIE15TWVzc2FnZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgdW5sZXNzKGlzaW5zdGFuY2UobXNnLCBNeU1lc3NhZ2UpKQorICAgICAgICAjIFRyeSBzb21ldGhpbmcgbW9yZSBjb21wbGljYXRlZAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMDIudHh0JykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX2ZpbGUoZnAsIE15TWVzc2FnZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gbXNnLndhbGsoKToKKyAgICAgICAgICAgIHVubGVzcyhpc2luc3RhbmNlKHN1YnBhcnQsIE15TWVzc2FnZSkpCisKKyAgICBkZWYgdGVzdF9fYWxsX18oc2VsZik6CisgICAgICAgIG1vZHVsZSA9IF9faW1wb3J0X18oJ2VtYWlsJykKKyAgICAgICAgIyBDYW4ndCB1c2Ugc29ydGVkKCkgaGVyZSBkdWUgdG8gUHl0aG9uIDIuMyBjb21wYXRpYmlsaXR5CisgICAgICAgIGFsbCA9IG1vZHVsZS5fX2FsbF9fWzpdCisgICAgICAgIGFsbC5zb3J0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhbGwsIFsKKyAgICAgICAgICAgICMgT2xkIG5hbWVzCisgICAgICAgICAgICAnQ2hhcnNldCcsICdFbmNvZGVycycsICdFcnJvcnMnLCAnR2VuZXJhdG9yJywKKyAgICAgICAgICAgICdIZWFkZXInLCAnSXRlcmF0b3JzJywgJ01JTUVBdWRpbycsICdNSU1FQmFzZScsCisgICAgICAgICAgICAnTUlNRUltYWdlJywgJ01JTUVNZXNzYWdlJywgJ01JTUVNdWx0aXBhcnQnLAorICAgICAgICAgICAgJ01JTUVOb25NdWx0aXBhcnQnLCAnTUlNRVRleHQnLCAnTWVzc2FnZScsCisgICAgICAgICAgICAnUGFyc2VyJywgJ1V0aWxzJywgJ2Jhc2U2NE1JTUUnLAorICAgICAgICAgICAgIyBuZXcgbmFtZXMKKyAgICAgICAgICAgICdiYXNlNjRtaW1lJywgJ2NoYXJzZXQnLCAnZW5jb2RlcnMnLCAnZXJyb3JzJywgJ2dlbmVyYXRvcicsCisgICAgICAgICAgICAnaGVhZGVyJywgJ2l0ZXJhdG9ycycsICdtZXNzYWdlJywgJ21lc3NhZ2VfZnJvbV9maWxlJywKKyAgICAgICAgICAgICdtZXNzYWdlX2Zyb21fc3RyaW5nJywgJ21pbWUnLCAncGFyc2VyJywKKyAgICAgICAgICAgICdxdW9wcmlNSU1FJywgJ3F1b3ByaW1pbWUnLCAndXRpbHMnLAorICAgICAgICAgICAgXSkKKworICAgIGRlZiB0ZXN0X2Zvcm1hdGRhdGUoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VkYXRlKHV0aWxzLmZvcm1hdGRhdGUobm93KSlbOjZdLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUuZ210aW1lKG5vdylbOjZdKQorCisgICAgZGVmIHRlc3RfZm9ybWF0ZGF0ZV9sb2NhbHRpbWUoc2VsZik6CisgICAgICAgIG5vdyA9IHRpbWUudGltZSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5wYXJzZWRhdGUodXRpbHMuZm9ybWF0ZGF0ZShub3csIGxvY2FsdGltZT1UcnVlKSlbOjZdLAorICAgICAgICAgICAgdGltZS5sb2NhbHRpbWUobm93KVs6Nl0pCisKKyAgICBkZWYgdGVzdF9mb3JtYXRkYXRlX3VzZWdtdChzZWxmKToKKyAgICAgICAgbm93ID0gdGltZS50aW1lKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHV0aWxzLmZvcm1hdGRhdGUobm93LCBsb2NhbHRpbWU9RmFsc2UpLAorICAgICAgICAgICAgdGltZS5zdHJmdGltZSgnJWEsICVkICViICVZICVIOiVNOiVTIC0wMDAwJywgdGltZS5nbXRpbWUobm93KSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5mb3JtYXRkYXRlKG5vdywgbG9jYWx0aW1lPUZhbHNlLCB1c2VnbXQ9VHJ1ZSksCisgICAgICAgICAgICB0aW1lLnN0cmZ0aW1lKCclYSwgJWQgJWIgJVkgJUg6JU06JVMgR01UJywgdGltZS5nbXRpbWUobm93KSkpCisKKyAgICBkZWYgdGVzdF9wYXJzZWRhdGVfbm9uZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWRhdGUoJycpLCBOb25lKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX2NvbXBhY3Qoc2VsZik6CisgICAgICAgICMgVGhlIEZXUyBhZnRlciB0aGUgY29tbWEgaXMgb3B0aW9uYWwKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWRhdGUoJ1dlZCwzIEFwciAyMDAyIDE0OjU4OjI2ICswODAwJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMucGFyc2VkYXRlKCdXZWQsIDMgQXByIDIwMDIgMTQ6NTg6MjYgKzA4MDAnKSkKKworICAgIGRlZiB0ZXN0X3BhcnNlZGF0ZV9ub19kYXlvZndlZWsoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh1dGlscy5wYXJzZWRhdGVfdHooJzI1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJyksCisgICAgICAgICAgICgyMDAzLCAyLCAyNSwgMTMsIDQ3LCAyNiwgMCwgMSwgLTEsIC0yODgwMCkpCisKKyAgICBkZWYgdGVzdF9wYXJzZWRhdGVfY29tcGFjdF9ub19kYXlvZndlZWsoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh1dGlscy5wYXJzZWRhdGVfdHooJzUgRmViIDIwMDMgMTM6NDc6MjYgLTA4MDAnKSwKKyAgICAgICAgICAgKDIwMDMsIDIsIDUsIDEzLCA0NywgMjYsIDAsIDEsIC0xLCAtMjg4MDApKQorCisgICAgZGVmIHRlc3RfcGFyc2VkYXRlX2FjY2VwdGFibGVfdG9fdGltZV9mdW5jdGlvbnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB0aW1ldHVwID0gdXRpbHMucGFyc2VkYXRlKCc1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJykKKyAgICAgICAgdCA9IGludCh0aW1lLm1rdGltZSh0aW1ldHVwKSkKKyAgICAgICAgZXEodGltZS5sb2NhbHRpbWUodClbOjZdLCB0aW1ldHVwWzo2XSkKKyAgICAgICAgZXEoaW50KHRpbWUuc3RyZnRpbWUoJyVZJywgdGltZXR1cCkpLCAyMDAzKQorICAgICAgICB0aW1ldHVwID0gdXRpbHMucGFyc2VkYXRlX3R6KCc1IEZlYiAyMDAzIDEzOjQ3OjI2IC0wODAwJykKKyAgICAgICAgdCA9IGludCh0aW1lLm1rdGltZSh0aW1ldHVwWzo5XSkpCisgICAgICAgIGVxKHRpbWUubG9jYWx0aW1lKHQpWzo2XSwgdGltZXR1cFs6Nl0pCisgICAgICAgIGVxKGludCh0aW1lLnN0cmZ0aW1lKCclWScsIHRpbWV0dXBbOjldKSksIDIwMDMpCisKKyAgICBkZWYgdGVzdF9wYXJzZWFkZHJfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VhZGRyKCc8PicpLCAoJycsICcnKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5mb3JtYXRhZGRyKHV0aWxzLnBhcnNlYWRkcignPD4nKSksICcnKQorCisgICAgZGVmIHRlc3Rfbm9xdW90ZV9kdW1wKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdXRpbHMuZm9ybWF0YWRkcigoJ0EgU2lsbHkgUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgJ0EgU2lsbHkgUGVyc29uIDxwZXJzb25AZG9tLmFpbj4nKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2R1bXAoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICB1dGlscy5mb3JtYXRhZGRyKCgnQSAoVmVyeSkgU2lsbHkgUGVyc29uJywgJ3BlcnNvbkBkb20uYWluJykpLAorICAgICAgICAgICAgciciQSBcKFZlcnlcKSBTaWxseSBQZXJzb24iIDxwZXJzb25AZG9tLmFpbj4nKQorICAgICAgICBhID0gcidBIFwoU3BlY2lhbFwpIFBlcnNvbicKKyAgICAgICAgYiA9ICdwZXJzb25AZG9tLmFpbicKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1dGlscy5wYXJzZWFkZHIodXRpbHMuZm9ybWF0YWRkcigoYSwgYikpKSwgKGEsIGIpKQorCisgICAgZGVmIHRlc3RfZXNjYXBlX2JhY2tzbGFzaGVzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgdXRpbHMuZm9ybWF0YWRkcigoJ0FydGh1ciBcQmFja3NsYXNoXCBGb29iYXInLCAncGVyc29uQGRvbS5haW4nKSksCisgICAgICAgICAgICByJyJBcnRodXIgXFxCYWNrc2xhc2hcXCBGb29iYXIiIDxwZXJzb25AZG9tLmFpbj4nKQorICAgICAgICBhID0gcidBcnRodXIgXEJhY2tzbGFzaFwgRm9vYmFyJworICAgICAgICBiID0gJ3BlcnNvbkBkb20uYWluJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHV0aWxzLnBhcnNlYWRkcih1dGlscy5mb3JtYXRhZGRyKChhLCBiKSkpLCAoYSwgYikpCisKKyAgICBkZWYgdGVzdF9uYW1lX3dpdGhfZG90KHNlbGYpOgorICAgICAgICB4ID0gJ0pvaG4gWC4gRG9lIDxqeGRAZXhhbXBsZS5jb20+JworICAgICAgICB5ID0gJyJKb2huIFguIERvZSIgPGp4ZEBleGFtcGxlLmNvbT4nCisgICAgICAgIGEsIGIgPSAoJ0pvaG4gWC4gRG9lJywgJ2p4ZEBleGFtcGxlLmNvbScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VhZGRyKHgpLCAoYSwgYikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMucGFyc2VhZGRyKHkpLCAoYSwgYikpCisgICAgICAgICMgZm9ybWF0YWRkcigpIHF1b3RlcyB0aGUgbmFtZSBpZiB0aGVyZSdzIGEgZG90IGluIGl0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodXRpbHMuZm9ybWF0YWRkcigoYSwgYikpLCB5KQorCisgICAgZGVmIHRlc3RfcXVvdGVfZHVtcChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHV0aWxzLmZvcm1hdGFkZHIoKCdBIFNpbGx5OyBQZXJzb24nLCAncGVyc29uQGRvbS5haW4nKSksCisgICAgICAgICAgICByJyJBIFNpbGx5OyBQZXJzb24iIDxwZXJzb25AZG9tLmFpbj4nKQorCisgICAgZGVmIHRlc3RfZml4X2VvbHMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBlcSh1dGlscy5maXhfZW9scygnaGVsbG8nKSwgJ2hlbGxvJykKKyAgICAgICAgZXEodXRpbHMuZml4X2VvbHMoJ2hlbGxvXG4nKSwgJ2hlbGxvXHJcbicpCisgICAgICAgIGVxKHV0aWxzLmZpeF9lb2xzKCdoZWxsb1xyJyksICdoZWxsb1xyXG4nKQorICAgICAgICBlcSh1dGlscy5maXhfZW9scygnaGVsbG9cclxuJyksICdoZWxsb1xyXG4nKQorICAgICAgICBlcSh1dGlscy5maXhfZW9scygnaGVsbG9cblxyJyksICdoZWxsb1xyXG5cclxuJykKKworICAgIGRlZiB0ZXN0X2NoYXJzZXRfcmljaGNvbXBhcmlzb25zKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbmUgPSBzZWxmLmZhaWxJZkVxdWFsCisgICAgICAgIGNzZXQxID0gQ2hhcnNldCgpCisgICAgICAgIGNzZXQyID0gQ2hhcnNldCgpCisgICAgICAgIGVxKGNzZXQxLCAndXMtYXNjaWknKQorICAgICAgICBlcShjc2V0MSwgJ1VTLUFTQ0lJJykKKyAgICAgICAgZXEoY3NldDEsICdVcy1Bc0NpSScpCisgICAgICAgIGVxKCd1cy1hc2NpaScsIGNzZXQxKQorICAgICAgICBlcSgnVVMtQVNDSUknLCBjc2V0MSkKKyAgICAgICAgZXEoJ1VzLUFzQ2lJJywgY3NldDEpCisgICAgICAgIG5lKGNzZXQxLCAndXNhc2NpaScpCisgICAgICAgIG5lKGNzZXQxLCAnVVNBU0NJSScpCisgICAgICAgIG5lKGNzZXQxLCAnVXNBc0NpSScpCisgICAgICAgIG5lKCd1c2FzY2lpJywgY3NldDEpCisgICAgICAgIG5lKCdVU0FTQ0lJJywgY3NldDEpCisgICAgICAgIG5lKCdVc0FzQ2lJJywgY3NldDEpCisgICAgICAgIGVxKGNzZXQxLCBjc2V0MikKKyAgICAgICAgZXEoY3NldDIsIGNzZXQxKQorCisgICAgZGVmIHRlc3RfZ2V0YWRkcmVzc2VzKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEodXRpbHMuZ2V0YWRkcmVzc2VzKFsnYXBlcnNvbkBkb20uYWluIChBbCBQZXJzb24pJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQnVkIFBlcnNvbiA8YnBlcnNvbkBkb20uYWluPiddKSwKKyAgICAgICAgICAgWygnQWwgUGVyc29uJywgJ2FwZXJzb25AZG9tLmFpbicpLAorICAgICAgICAgICAgKCdCdWQgUGVyc29uJywgJ2JwZXJzb25AZG9tLmFpbicpXSkKKworICAgIGRlZiB0ZXN0X2dldGFkZHJlc3Nlc19uYXN0eShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHV0aWxzLmdldGFkZHJlc3NlcyhbJ2ZvbzogOyddKSwgWygnJywgJycpXSkKKyAgICAgICAgZXEodXRpbHMuZ2V0YWRkcmVzc2VzKAorICAgICAgICAgICBbJ1tdKi0tID1+JCddKSwKKyAgICAgICAgICAgWygnJywgJycpLCAoJycsICcnKSwgKCcnLCAnKi0tJyldKQorICAgICAgICBlcSh1dGlscy5nZXRhZGRyZXNzZXMoCisgICAgICAgICAgIFsnZm9vOiA7JywgJyJKYXNvbiBSLiBNYXN0YWxlciIgPGphc29uQGRvbS5haW4+J10pLAorICAgICAgICAgICBbKCcnLCAnJyksICgnSmFzb24gUi4gTWFzdGFsZXInLCAnamFzb25AZG9tLmFpbicpXSkKKworICAgIGRlZiB0ZXN0X3V0aWxzX3F1b3RlX3VucXVvdGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnLmFkZF9oZWFkZXIoJ2NvbnRlbnQtZGlzcG9zaXRpb24nLCAnYXR0YWNobWVudCcsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPSdmb29cXHdhY2t5Im5hbWUnKQorICAgICAgICBlcShtc2cuZ2V0X2ZpbGVuYW1lKCksICdmb29cXHdhY2t5Im5hbWUnKQorCisgICAgZGVmIHRlc3RfZ2V0X2JvZHlfZW5jb2Rpbmdfd2l0aF9ib2d1c19jaGFyc2V0KHNlbGYpOgorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCgnbm90IGEgY2hhcnNldCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2hhcnNldC5nZXRfYm9keV9lbmNvZGluZygpLCAnYmFzZTY0JykKKworICAgIGRlZiB0ZXN0X2dldF9ib2R5X2VuY29kaW5nX3dpdGhfdXBwZXJjYXNlX2NoYXJzZXQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBNZXNzYWdlKCkKKyAgICAgICAgbXNnWydDb250ZW50LVR5cGUnXSA9ICd0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04JworICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHlwZSddLCAndGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOCcpCisgICAgICAgIGNoYXJzZXRzID0gbXNnLmdldF9jaGFyc2V0cygpCisgICAgICAgIGVxKGxlbihjaGFyc2V0cyksIDEpCisgICAgICAgIGVxKGNoYXJzZXRzWzBdLCAndXRmLTgnKQorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldChjaGFyc2V0c1swXSkKKyAgICAgICAgZXEoY2hhcnNldC5nZXRfYm9keV9lbmNvZGluZygpLCAnYmFzZTY0JykKKyAgICAgICAgbXNnLnNldF9wYXlsb2FkKCdoZWxsbyB3b3JsZCcsIGNoYXJzZXQ9Y2hhcnNldCkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdhR1ZzYkc4Z2QyOXliR1E9XG4nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoZGVjb2RlPVRydWUpLCAnaGVsbG8gd29ybGQnKQorICAgICAgICBlcShtc2dbJ2NvbnRlbnQtdHJhbnNmZXItZW5jb2RpbmcnXSwgJ2Jhc2U2NCcpCisgICAgICAgICMgVHJ5IGFub3RoZXIgb25lCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2dbJ0NvbnRlbnQtVHlwZSddID0gJ3RleHQvcGxhaW47IGNoYXJzZXQ9IlVTLUFTQ0lJIicKKyAgICAgICAgY2hhcnNldHMgPSBtc2cuZ2V0X2NoYXJzZXRzKCkKKyAgICAgICAgZXEobGVuKGNoYXJzZXRzKSwgMSkKKyAgICAgICAgZXEoY2hhcnNldHNbMF0sICd1cy1hc2NpaScpCisgICAgICAgIGNoYXJzZXQgPSBDaGFyc2V0KGNoYXJzZXRzWzBdKQorICAgICAgICBlcShjaGFyc2V0LmdldF9ib2R5X2VuY29kaW5nKCksIGVuY29kZXJzLmVuY29kZV83b3I4Yml0KQorICAgICAgICBtc2cuc2V0X3BheWxvYWQoJ2hlbGxvIHdvcmxkJywgY2hhcnNldD1jaGFyc2V0KQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgJ2hlbGxvIHdvcmxkJykKKyAgICAgICAgZXEobXNnWydjb250ZW50LXRyYW5zZmVyLWVuY29kaW5nJ10sICc3Yml0JykKKworICAgIGRlZiB0ZXN0X2NoYXJzZXRzX2Nhc2VfaW5zZW5zaXRpdmUoc2VsZik6CisgICAgICAgIGxjID0gQ2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICB1YyA9IENoYXJzZXQoJ1VTLUFTQ0lJJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsYy5nZXRfYm9keV9lbmNvZGluZygpLCB1Yy5nZXRfYm9keV9lbmNvZGluZygpKQorCisgICAgZGVmIHRlc3RfcGFydGlhbF9mYWxsc19pbnNpZGVfbWVzc2FnZV9kZWxpdmVyeV9zdGF0dXMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgICMgVGhlIFBhcnNlciBpbnRlcmZhY2UgcHJvdmlkZXMgY2h1bmtzIG9mIGRhdGEgdG8gRmVlZFBhcnNlciBpbiA4MTkyCisgICAgICAgICMgYnl0ZSBndWxwcy4gIFNGIGJ1ZyAjMTA3NjQ4NSBmb3VuZCBvbmUgb2YgdGhvc2UgY2h1bmtzIGluc2lkZQorICAgICAgICAjIG1lc3NhZ2UvZGVsaXZlcnktc3RhdHVzIGhlYWRlciBibG9jaywgd2hpY2ggdHJpZ2dlcmVkIGFuCisgICAgICAgICMgdW5yZWFkbGluZSgpIG9mIE5lZWRNb3JlRGF0YS4KKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfNDMudHh0JykKKyAgICAgICAgc2ZwID0gU3RyaW5nSU8oKQorICAgICAgICBpdGVyYXRvcnMuX3N0cnVjdHVyZShtc2csIHNmcCkKKyAgICAgICAgZXEoc2ZwLmdldHZhbHVlKCksICIiIlwKK211bHRpcGFydC9yZXBvcnQKKyAgICB0ZXh0L3BsYWluCisgICAgbWVzc2FnZS9kZWxpdmVyeS1zdGF0dXMKKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgICAgIHRleHQvcGxhaW4KKyAgICAgICAgdGV4dC9wbGFpbgorICAgICAgICB0ZXh0L3BsYWluCisgICAgdGV4dC9yZmM4MjItaGVhZGVycworIiIiKQorCisKKwwKKyMgVGVzdCB0aGUgaXRlcmF0b3IvZ2VuZXJhdG9ycworY2xhc3MgVGVzdEl0ZXJhdG9ycyhUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9ib2R5X2xpbmVfaXRlcmF0b3Ioc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgIyBGaXJzdCBhIHNpbXBsZSBub24tbXVsdGlwYXJ0IG1lc3NhZ2UKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDEudHh0JykKKyAgICAgICAgaXQgPSBpdGVyYXRvcnMuYm9keV9saW5lX2l0ZXJhdG9yKG1zZykKKyAgICAgICAgbGluZXMgPSBsaXN0KGl0KQorICAgICAgICBlcShsZW4obGluZXMpLCA2KQorICAgICAgICBuZXEoRU1QVFlTVFJJTkcuam9pbihsaW5lcyksIG1zZy5nZXRfcGF5bG9hZCgpKQorICAgICAgICAjIE5vdyBhIG1vcmUgY29tcGxpY2F0ZWQgbXVsdGlwYXJ0CisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAyLnR4dCcpCisgICAgICAgIGl0ID0gaXRlcmF0b3JzLmJvZHlfbGluZV9pdGVyYXRvcihtc2cpCisgICAgICAgIGxpbmVzID0gbGlzdChpdCkKKyAgICAgICAgZXEobGVuKGxpbmVzKSwgNDMpCisgICAgICAgIGZwID0gb3BlbmZpbGUoJ21zZ18xOS50eHQnKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBuZXEoRU1QVFlTVFJJTkcuam9pbihsaW5lcyksIGZwLnJlYWQoKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0X3R5cGVkX3N1YnBhcnRfaXRlcmF0b3Ioc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wNC50eHQnKQorICAgICAgICBpdCA9IGl0ZXJhdG9ycy50eXBlZF9zdWJwYXJ0X2l0ZXJhdG9yKG1zZywgJ3RleHQnKQorICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIHN1YnBhcnRzID0gMAorICAgICAgICBmb3Igc3VicGFydCBpbiBpdDoKKyAgICAgICAgICAgIHN1YnBhcnRzICs9IDEKKyAgICAgICAgICAgIGxpbmVzLmFwcGVuZChzdWJwYXJ0LmdldF9wYXlsb2FkKCkpCisgICAgICAgIGVxKHN1YnBhcnRzLCAyKQorICAgICAgICBlcShFTVBUWVNUUklORy5qb2luKGxpbmVzKSwgIiIiXAorYSBzaW1wbGUga2luZCBvZiBtaXJyb3IKK3RvIHJlZmxlY3QgdXBvbiBvdXIgb3duCithIHNpbXBsZSBraW5kIG9mIG1pcnJvcgordG8gcmVmbGVjdCB1cG9uIG91ciBvd24KKyIiIikKKworICAgIGRlZiB0ZXN0X3R5cGVkX3N1YnBhcnRfaXRlcmF0b3JfZGVmYXVsdF90eXBlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMDMudHh0JykKKyAgICAgICAgaXQgPSBpdGVyYXRvcnMudHlwZWRfc3VicGFydF9pdGVyYXRvcihtc2csICd0ZXh0JywgJ3BsYWluJykKKyAgICAgICAgbGluZXMgPSBbXQorICAgICAgICBzdWJwYXJ0cyA9IDAKKyAgICAgICAgZm9yIHN1YnBhcnQgaW4gaXQ6CisgICAgICAgICAgICBzdWJwYXJ0cyArPSAxCisgICAgICAgICAgICBsaW5lcy5hcHBlbmQoc3VicGFydC5nZXRfcGF5bG9hZCgpKQorICAgICAgICBlcShzdWJwYXJ0cywgMSkKKyAgICAgICAgZXEoRU1QVFlTVFJJTkcuam9pbihsaW5lcyksICIiIlwKKworSGksCisKK0RvIHlvdSBsaWtlIHRoaXMgbWVzc2FnZT8KKworLU1lCisiIiIpCisKKworDAorY2xhc3MgVGVzdFBhcnNlcnMoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfaGVhZGVyX3BhcnNlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgICMgUGFyc2Ugb25seSB0aGUgaGVhZGVycyBvZiBhIGNvbXBsZXggbXVsdGlwYXJ0IE1JTUUgZG9jdW1lbnQKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzAyLnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IEhlYWRlclBhcnNlcigpLnBhcnNlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBlcShtc2dbJ2Zyb20nXSwgJ3BwcC1yZXF1ZXN0QHp6ei5vcmcnKQorICAgICAgICBlcShtc2dbJ3RvJ10sICdwcHBAenp6Lm9yZycpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF90eXBlKCksICdtdWx0aXBhcnQvbWl4ZWQnKQorICAgICAgICBzZWxmLmZhaWxJZihtc2cuaXNfbXVsdGlwYXJ0KCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKG1zZy5nZXRfcGF5bG9hZCgpLCBzdHIpKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9jb250aW51YXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIFRoaXMgbWVzc2FnZSBjb250YWlucyBhIGxpbmUgYWZ0ZXIgdGhlIFN1YmplY3Q6IGhlYWRlciB0aGF0IGhhcyBvbmx5CisgICAgICAgICMgd2hpdGVzcGFjZSwgYnV0IGl0IGlzIG5vdCBlbXB0eSEKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZygiIiJcCitGcm9tOiBhcGVyc29uQGRvbS5haW4KK1RvOiBicGVyc29uQGRvbS5haW4KK1N1YmplY3Q6IHRoZSBuZXh0IGxpbmUgaGFzIGEgc3BhY2Ugb24gaXQKK1x4MjAKK0RhdGU6IE1vbiwgOCBBcHIgMjAwMiAxNTowOToxOSAtMDQwMAorTWVzc2FnZS1JRDogc3BhbQorCitIZXJlJ3MgdGhlIG1lc3NhZ2UgYm9keQorIiIiKQorICAgICAgICBlcShtc2dbJ3N1YmplY3QnXSwgJ3RoZSBuZXh0IGxpbmUgaGFzIGEgc3BhY2Ugb24gaXRcbiAnKQorICAgICAgICBlcShtc2dbJ21lc3NhZ2UtaWQnXSwgJ3NwYW0nKQorICAgICAgICBlcShtc2cuZ2V0X3BheWxvYWQoKSwgIkhlcmUncyB0aGUgbWVzc2FnZSBib2R5XG4iKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9jb250aW51YXRpb25fbGFzdF9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIExpa2UgdGhlIHByZXZpb3VzIHRlc3QsIGJ1dCB0aGUgc3ViamVjdCBsaW5lIGlzIHRoZSBsYXN0CisgICAgICAgICMgaGVhZGVyLgorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKCIiIlwKK0Zyb206IGFwZXJzb25AZG9tLmFpbgorVG86IGJwZXJzb25AZG9tLmFpbgorRGF0ZTogTW9uLCA4IEFwciAyMDAyIDE1OjA5OjE5IC0wNDAwCitNZXNzYWdlLUlEOiBzcGFtCitTdWJqZWN0OiB0aGUgbmV4dCBsaW5lIGhhcyBhIHNwYWNlIG9uIGl0CitceDIwCisKK0hlcmUncyB0aGUgbWVzc2FnZSBib2R5CisiIiIpCisgICAgICAgIGVxKG1zZ1snc3ViamVjdCddLCAndGhlIG5leHQgbGluZSBoYXMgYSBzcGFjZSBvbiBpdFxuICcpCisgICAgICAgIGVxKG1zZ1snbWVzc2FnZS1pZCddLCAnc3BhbScpCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAiSGVyZSdzIHRoZSBtZXNzYWdlIGJvZHlcbiIpCisKKyAgICBkZWYgdGVzdF9jcmxmX3NlcGFyYXRpb24oc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBmcCA9IG9wZW5maWxlKCdtc2dfMjYudHh0JywgbW9kZT0ncmInKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtc2cgPSBQYXJzZXIoKS5wYXJzZShmcCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKKyAgICAgICAgcGFydDEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEocGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAndGV4dC9wbGFpbicpCisgICAgICAgIGVxKHBhcnQxLmdldF9wYXlsb2FkKCksICdTaW1wbGUgZW1haWwgd2l0aCBhdHRhY2htZW50LlxyXG5cclxuJykKKyAgICAgICAgcGFydDIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEocGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnYXBwbGljYXRpb24vcmlzY29zJykKKworICAgIGRlZiB0ZXN0X211bHRpcGFydF9kaWdlc3Rfd2l0aF9leHRyYV9taW1lX2hlYWRlcnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBuZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgZnAgPSBvcGVuZmlsZSgnbXNnXzI4LnR4dCcpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9maWxlKGZwKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAjIFN0cnVjdHVyZSBpczoKKyAgICAgICAgIyBtdWx0aXBhcnQvZGlnZXN0CisgICAgICAgICMgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICAjICAgICB0ZXh0L3BsYWluCisgICAgICAgICMgICBtZXNzYWdlL3JmYzgyMgorICAgICAgICAjICAgICB0ZXh0L3BsYWluCisgICAgICAgIGVxKG1zZy5pc19tdWx0aXBhcnQoKSwgMSkKKyAgICAgICAgZXEobGVuKG1zZy5nZXRfcGF5bG9hZCgpKSwgMikKKyAgICAgICAgcGFydDEgPSBtc2cuZ2V0X3BheWxvYWQoMCkKKyAgICAgICAgZXEocGFydDEuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShwYXJ0MS5pc19tdWx0aXBhcnQoKSwgMSkKKyAgICAgICAgZXEobGVuKHBhcnQxLmdldF9wYXlsb2FkKCkpLCAxKQorICAgICAgICBwYXJ0MWEgPSBwYXJ0MS5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShwYXJ0MWEuaXNfbXVsdGlwYXJ0KCksIDApCisgICAgICAgIGVxKHBhcnQxYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgbmVxKHBhcnQxYS5nZXRfcGF5bG9hZCgpLCAnbWVzc2FnZSAxXG4nKQorICAgICAgICAjIG5leHQgbWVzc2FnZS9yZmM4MjIKKyAgICAgICAgcGFydDIgPSBtc2cuZ2V0X3BheWxvYWQoMSkKKyAgICAgICAgZXEocGFydDIuZ2V0X2NvbnRlbnRfdHlwZSgpLCAnbWVzc2FnZS9yZmM4MjInKQorICAgICAgICBlcShwYXJ0Mi5pc19tdWx0aXBhcnQoKSwgMSkKKyAgICAgICAgZXEobGVuKHBhcnQyLmdldF9wYXlsb2FkKCkpLCAxKQorICAgICAgICBwYXJ0MmEgPSBwYXJ0Mi5nZXRfcGF5bG9hZCgwKQorICAgICAgICBlcShwYXJ0MmEuaXNfbXVsdGlwYXJ0KCksIDApCisgICAgICAgIGVxKHBhcnQyYS5nZXRfY29udGVudF90eXBlKCksICd0ZXh0L3BsYWluJykKKyAgICAgICAgbmVxKHBhcnQyYS5nZXRfcGF5bG9hZCgpLCAnbWVzc2FnZSAyXG4nKQorCisgICAgZGVmIHRlc3RfdGhyZWVfbGluZXMoc2VsZik6CisgICAgICAgICMgQSBidWcgcmVwb3J0IGJ5IEFuZHJldyBNY05hbWFyYQorICAgICAgICBsaW5lcyA9IFsnRnJvbTogQW5kcmV3IFBlcnNvbiA8YXBlcnNvbkBkb20uYWluJywKKyAgICAgICAgICAgICAgICAgJ1N1YmplY3Q6IFRlc3QnLAorICAgICAgICAgICAgICAgICAnRGF0ZTogVHVlLCAyMCBBdWcgMjAwMiAxNjo0Mzo0NSArMTAwMCddCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcoTkwuam9pbihsaW5lcykpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnWydkYXRlJ10sICdUdWUsIDIwIEF1ZyAyMDAyIDE2OjQzOjQ1ICsxMDAwJykKKworICAgIGRlZiB0ZXN0X3N0cmlwX2xpbmVfZmVlZF9hbmRfY2FycmlhZ2VfcmV0dXJuX2luX2hlYWRlcnMoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIEZvciBbIDEwMDI0NzUgXSBlbWFpbCBtZXNzYWdlIHBhcnNlciBkb2Vzbid0IGhhbmRsZSBcclxuIGNvcnJlY3RseQorICAgICAgICB2YWx1ZTEgPSAndGV4dCcKKyAgICAgICAgdmFsdWUyID0gJ21vcmUgdGV4dCcKKyAgICAgICAgbSA9ICdIZWFkZXI6ICVzXHJcbk5leHQtSGVhZGVyOiAlc1xyXG5cclxuQm9keVxyXG5cclxuJyAlICgKKyAgICAgICAgICAgIHZhbHVlMSwgdmFsdWUyKQorICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKG1zZy5nZXQoJ0hlYWRlcicpLCB2YWx1ZTEpCisgICAgICAgIGVxKG1zZy5nZXQoJ05leHQtSGVhZGVyJyksIHZhbHVlMikKKworICAgIGRlZiB0ZXN0X3JmYzI4MjJfaGVhZGVyX3N5bnRheChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG0gPSAnPkZyb206IGZvb1xuRnJvbTogYmFyXG4hIiNRVVg7fjogem9vXG5cbmJvZHknCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgZXEobGVuKG1zZy5rZXlzKCkpLCAzKQorICAgICAgICBrZXlzID0gbXNnLmtleXMoKQorICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICBlcShrZXlzLCBbJyEiI1FVWDt+JywgJz5Gcm9tJywgJ0Zyb20nXSkKKyAgICAgICAgZXEobXNnLmdldF9wYXlsb2FkKCksICdib2R5JykKKworICAgIGRlZiB0ZXN0X3JmYzI4MjJfc3BhY2Vfbm90X2FsbG93ZWRfaW5faGVhZGVyKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbSA9ICc+RnJvbSBmb29AZXhhbXBsZS5jb20gMTE6MjU6NTNcbkZyb206IGJhclxuISIjUVVYO346IHpvb1xuXG5ib2R5JworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGVxKGxlbihtc2cua2V5cygpKSwgMCkKKworICAgIGRlZiB0ZXN0X3JmYzI4MjJfb25lX2NoYXJhY3Rlcl9oZWFkZXIoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBtID0gJ0E6IGZpcnN0IGhlYWRlclxuQjogc2Vjb25kIGhlYWRlclxuQ0M6IHRoaXJkIGhlYWRlclxuXG5ib2R5JworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIGhlYWRlcnMgPSBtc2cua2V5cygpCisgICAgICAgIGhlYWRlcnMuc29ydCgpCisgICAgICAgIGVxKGhlYWRlcnMsIFsnQScsICdCJywgJ0NDJ10pCisgICAgICAgIGVxKG1zZy5nZXRfcGF5bG9hZCgpLCAnYm9keScpCisKKworDAorY2xhc3MgVGVzdEJhc2U2NCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbGVuKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0bWltZS5iYXNlNjRfbGVuKCdoZWxsbycpLAorICAgICAgICAgICBsZW4oYmFzZTY0bWltZS5lbmNvZGUoJ2hlbGxvJywgZW9sPScnKSkpCisgICAgICAgIGZvciBzaXplIGluIHJhbmdlKDE1KToKKyAgICAgICAgICAgIGlmICAgc2l6ZSA9PSAwIDogYnNpemUgPSAwCisgICAgICAgICAgICBlbGlmIHNpemUgPD0gMyA6IGJzaXplID0gNAorICAgICAgICAgICAgZWxpZiBzaXplIDw9IDYgOiBic2l6ZSA9IDgKKyAgICAgICAgICAgIGVsaWYgc2l6ZSA8PSA5IDogYnNpemUgPSAxMgorICAgICAgICAgICAgZWxpZiBzaXplIDw9IDEyOiBic2l6ZSA9IDE2CisgICAgICAgICAgICBlbHNlICAgICAgICAgICA6IGJzaXplID0gMjAKKyAgICAgICAgICAgIGVxKGJhc2U2NG1pbWUuYmFzZTY0X2xlbigneCcqc2l6ZSksIGJzaXplKQorCisgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0bWltZS5kZWNvZGUoJycpLCAnJykKKyAgICAgICAgZXEoYmFzZTY0bWltZS5kZWNvZGUoJ2FHVnNiRzg9JyksICdoZWxsbycpCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZGVjb2RlKCdhR1ZzYkc4PScsICdYJyksICdoZWxsbycpCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZGVjb2RlKCdhR1ZzYkc4TkNuZHZjbXhrXG4nLCAnWCcpLCAnaGVsbG9Yd29ybGQnKQorCisgICAgZGVmIHRlc3RfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgZXEoYmFzZTY0bWltZS5lbmNvZGUoJycpLCAnJykKKyAgICAgICAgZXEoYmFzZTY0bWltZS5lbmNvZGUoJ2hlbGxvJyksICdhR1ZzYkc4PVxuJykKKyAgICAgICAgIyBUZXN0IHRoZSBiaW5hcnkgZmxhZworICAgICAgICBlcShiYXNlNjRtaW1lLmVuY29kZSgnaGVsbG9cbicpLCAnYUdWc2JHOEtcbicpCisgICAgICAgIGVxKGJhc2U2NG1pbWUuZW5jb2RlKCdoZWxsb1xuJywgMCksICdhR1ZzYkc4TkNnPT1cbicpCisgICAgICAgICMgVGVzdCB0aGUgbWF4bGluZWxlbiBhcmcKKyAgICAgICAgZXEoYmFzZTY0bWltZS5lbmNvZGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwKSwgIiIiXAorZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZworZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZworZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZworZUhoNGVDQjRlSGg0SUE9PQorIiIiKQorICAgICAgICAjIFRlc3QgdGhlIGVvbCBhcmd1bWVudAorICAgICAgICBlcShiYXNlNjRtaW1lLmVuY29kZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDAsIGVvbD0nXHJcbicpLCAiIiJcCitlSGg0ZUNCNGVIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhoNElIaDRlSGdnXHIKK2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGg0SUhoNGVIZ2dccgorZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGg0ZUhnZ1xyCitlSGg0ZUNCNGVIaDRJQT09XHIKKyIiIikKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9lbmNvZGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoZSA9IGJhc2U2NG1pbWUuaGVhZGVyX2VuY29kZQorICAgICAgICBlcShoZSgnaGVsbG8nKSwgJz0/aXNvLTg4NTktMT9iP2FHVnNiRzg9Pz0nKQorICAgICAgICBlcShoZSgnaGVsbG9cbndvcmxkJyksICc9P2lzby04ODU5LTE/Yj9hR1ZzYkc4TkNuZHZjbXhrPz0nKQorICAgICAgICAjIFRlc3QgdGhlIGNoYXJzZXQgb3B0aW9uCisgICAgICAgIGVxKGhlKCdoZWxsbycsIGNoYXJzZXQ9J2lzby04ODU5LTInKSwgJz0/aXNvLTg4NTktMj9iP2FHVnNiRzg9Pz0nKQorICAgICAgICAjIFRlc3QgdGhlIGtlZXBfZW9scyBmbGFnCisgICAgICAgIGVxKGhlKCdoZWxsb1xud29ybGQnLCBrZWVwX2VvbHM9VHJ1ZSksCisgICAgICAgICAgICc9P2lzby04ODU5LTE/Yj9hR1ZzYkc4S2QyOXliR1E9Pz0nKQorICAgICAgICAjIFRlc3QgdGhlIG1heGxpbmVsZW4gYXJndW1lbnQKKyAgICAgICAgZXEoaGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwKSwgIiIiXAorPT9pc28tODg1OS0xP2I/ZUhoNGVDQjRlSGg0SUhoNGVIZ2dlSGc9Pz0KKyA9P2lzby04ODU5LTE/Yj9lSGdnZUhoNGVDQjRlSGg0SUhoNGVIZz0/PQorID0/aXNvLTg4NTktMT9iP0lIaDRlSGdnZUhoNGVDQjRlSGg0SUhnPT89CisgPT9pc28tODg1OS0xP2I/ZUhoNElIaDRlSGdnZUhoNGVDQjRlSGc9Pz0KKyA9P2lzby04ODU5LTE/Yj9lQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQT0/PQorID0/aXNvLTg4NTktMT9iP2VIaDRlQ0I0ZUhoNElIaDRlSGdnPz0iIiIpCisgICAgICAgICMgVGVzdCB0aGUgZW9sIGFyZ3VtZW50CisgICAgICAgIGVxKGhlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCwgZW9sPSdcclxuJyksICIiIlwKKz0/aXNvLTg4NTktMT9iP2VIaDRlQ0I0ZUhoNElIaDRlSGdnZUhnPT89XHIKKyA9P2lzby04ODU5LTE/Yj9lSGdnZUhoNGVDQjRlSGg0SUhoNGVIZz0/PVxyCisgPT9pc28tODg1OS0xP2I/SUhoNGVIZ2dlSGg0ZUNCNGVIaDRJSGc9Pz1ccgorID0/aXNvLTg4NTktMT9iP2VIaDRJSGg0ZUhnZ2VIaDRlQ0I0ZUhnPT89XHIKKyA9P2lzby04ODU5LTE/Yj9lQ0I0ZUhoNElIaDRlSGdnZUhoNGVDQT0/PVxyCisgPT9pc28tODg1OS0xP2I/ZUhoNGVDQjRlSGg0SUhoNGVIZ2c/PSIiIikKKworCisMCitjbGFzcyBUZXN0UXVvcHJpKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuaGxpdCA9IFtjaHIoeCkgZm9yIHggaW4gcmFuZ2Uob3JkKCdhJyksIG9yZCgneicpKzEpXSArIFwKKyAgICAgICAgICAgICAgICAgICAgW2Nocih4KSBmb3IgeCBpbiByYW5nZShvcmQoJ0EnKSwgb3JkKCdaJykrMSldICsgXAorICAgICAgICAgICAgICAgICAgICBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnMCcpLCBvcmQoJzknKSsxKV0gKyBcCisgICAgICAgICAgICAgICAgICAgIFsnIScsICcqJywgJysnLCAnLScsICcvJywgJyAnXQorICAgICAgICBzZWxmLmhub24gPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKDI1NikgaWYgY2hyKHgpIG5vdCBpbiBzZWxmLmhsaXRdCisgICAgICAgIGFzc2VydCBsZW4oc2VsZi5obGl0KSArIGxlbihzZWxmLmhub24pID09IDI1NgorICAgICAgICBzZWxmLmJsaXQgPSBbY2hyKHgpIGZvciB4IGluIHJhbmdlKG9yZCgnICcpLCBvcmQoJ34nKSsxKV0gKyBbJ1x0J10KKyAgICAgICAgc2VsZi5ibGl0LnJlbW92ZSgnPScpCisgICAgICAgIHNlbGYuYm5vbiA9IFtjaHIoeCkgZm9yIHggaW4gcmFuZ2UoMjU2KSBpZiBjaHIoeCkgbm90IGluIHNlbGYuYmxpdF0KKyAgICAgICAgYXNzZXJ0IGxlbihzZWxmLmJsaXQpICsgbGVuKHNlbGYuYm5vbikgPT0gMjU2CisKKyAgICBkZWYgdGVzdF9oZWFkZXJfcXVvcHJpX2NoZWNrKHNlbGYpOgorICAgICAgICBmb3IgYyBpbiBzZWxmLmhsaXQ6CisgICAgICAgICAgICBzZWxmLmZhaWxJZihxdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfY2hlY2soYykpCisgICAgICAgIGZvciBjIGluIHNlbGYuaG5vbjoKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhxdW9wcmltaW1lLmhlYWRlcl9xdW9wcmlfY2hlY2soYykpCisKKyAgICBkZWYgdGVzdF9ib2R5X3F1b3ByaV9jaGVjayhzZWxmKToKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5ibGl0OgorICAgICAgICAgICAgc2VsZi5mYWlsSWYocXVvcHJpbWltZS5ib2R5X3F1b3ByaV9jaGVjayhjKSkKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5ibm9uOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHF1b3ByaW1pbWUuYm9keV9xdW9wcmlfY2hlY2soYykpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfcXVvcHJpX2xlbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGhxbCA9IHF1b3ByaW1pbWUuaGVhZGVyX3F1b3ByaV9sZW4KKyAgICAgICAgZW5jID0gcXVvcHJpbWltZS5oZWFkZXJfZW5jb2RlCisgICAgICAgIGZvciBzIGluICgnaGVsbG8nLCAnaEBlQGxAbEBvQCcpOgorICAgICAgICAgICAgIyBFbXB0eSBjaGFyc2V0IGFuZCBubyBsaW5lLWVuZGluZ3MuICA3ID09IFJGQyBjaHJvbWUKKyAgICAgICAgICAgIGVxKGhxbChzKSwgbGVuKGVuYyhzLCBjaGFyc2V0PScnLCBlb2w9JycpKS03KQorICAgICAgICBmb3IgYyBpbiBzZWxmLmhsaXQ6CisgICAgICAgICAgICBlcShocWwoYyksIDEpCisgICAgICAgIGZvciBjIGluIHNlbGYuaG5vbjoKKyAgICAgICAgICAgIGVxKGhxbChjKSwgMykKKworICAgIGRlZiB0ZXN0X2JvZHlfcXVvcHJpX2xlbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGJxbCA9IHF1b3ByaW1pbWUuYm9keV9xdW9wcmlfbGVuCisgICAgICAgIGZvciBjIGluIHNlbGYuYmxpdDoKKyAgICAgICAgICAgIGVxKGJxbChjKSwgMSkKKyAgICAgICAgZm9yIGMgaW4gc2VsZi5ibm9uOgorICAgICAgICAgICAgZXEoYnFsKGMpLCAzKQorCisgICAgZGVmIHRlc3RfcXVvdGVfdW5xdW90ZV9pZGVtcG90ZW50KHNlbGYpOgorICAgICAgICBmb3IgeCBpbiByYW5nZSgyNTYpOgorICAgICAgICAgICAgYyA9IGNocih4KQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChxdW9wcmltaW1lLnVucXVvdGUocXVvcHJpbWltZS5xdW90ZShjKSksIGMpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaGUgPSBxdW9wcmltaW1lLmhlYWRlcl9lbmNvZGUKKyAgICAgICAgZXEoaGUoJ2hlbGxvJyksICc9P2lzby04ODU5LTE/cT9oZWxsbz89JykKKyAgICAgICAgZXEoaGUoJ2hlbGxvXG53b3JsZCcpLCAnPT9pc28tODg1OS0xP3E/aGVsbG89MEQ9MEF3b3JsZD89JykKKyAgICAgICAgIyBUZXN0IHRoZSBjaGFyc2V0IG9wdGlvbgorICAgICAgICBlcShoZSgnaGVsbG8nLCBjaGFyc2V0PSdpc28tODg1OS0yJyksICc9P2lzby04ODU5LTI/cT9oZWxsbz89JykKKyAgICAgICAgIyBUZXN0IHRoZSBrZWVwX2VvbHMgZmxhZworICAgICAgICBlcShoZSgnaGVsbG9cbndvcmxkJywga2VlcF9lb2xzPVRydWUpLCAnPT9pc28tODg1OS0xP3E/aGVsbG89MEF3b3JsZD89JykKKyAgICAgICAgIyBUZXN0IGEgbm9uLUFTQ0lJIGNoYXJhY3RlcgorICAgICAgICBlcShoZSgnaGVsbG9ceGM3dGhlcmUnKSwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPUM3dGhlcmU/PScpCisgICAgICAgICMgVGVzdCB0aGUgbWF4bGluZWxlbiBhcmd1bWVudAorICAgICAgICBlcShoZSgneHh4eCAnICogMjAsIG1heGxpbmVsZW49NDApLCAiIiJcCis9P2lzby04ODU5LTE/cT94eHh4X3h4eHhfeHh4eF94eHh4X3h4Pz0KKyA9P2lzby04ODU5LTE/cT94eF94eHh4X3h4eHhfeHh4eF94eHh4Pz0KKyA9P2lzby04ODU5LTE/cT9feHh4eF94eHh4X3h4eHhfeHh4eF94Pz0KKyA9P2lzby04ODU5LTE/cT94eHhfeHh4eF94eHh4X3h4eHhfeHh4Pz0KKyA9P2lzby04ODU5LTE/cT94X3h4eHhfeHh4eF8/PSIiIikKKyAgICAgICAgIyBUZXN0IHRoZSBlb2wgYXJndW1lbnQKKyAgICAgICAgZXEoaGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwLCBlb2w9J1xyXG4nKSwgIiIiXAorPT9pc28tODg1OS0xP3E/eHh4eF94eHh4X3h4eHhfeHh4eF94eD89XHIKKyA9P2lzby04ODU5LTE/cT94eF94eHh4X3h4eHhfeHh4eF94eHh4Pz1ccgorID0/aXNvLTg4NTktMT9xP194eHh4X3h4eHhfeHh4eF94eHh4X3g/PVxyCisgPT9pc28tODg1OS0xP3E/eHh4X3h4eHhfeHh4eF94eHh4X3h4eD89XHIKKyA9P2lzby04ODU5LTE/cT94X3h4eHhfeHh4eF8/PSIiIikKKworICAgIGRlZiB0ZXN0X2RlY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZGVjb2RlKCcnKSwgJycpCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZGVjb2RlKCdoZWxsbycpLCAnaGVsbG8nKQorICAgICAgICBlcShxdW9wcmltaW1lLmRlY29kZSgnaGVsbG8nLCAnWCcpLCAnaGVsbG8nKQorICAgICAgICBlcShxdW9wcmltaW1lLmRlY29kZSgnaGVsbG9cbndvcmxkJywgJ1gnKSwgJ2hlbGxvWHdvcmxkJykKKworICAgIGRlZiB0ZXN0X2VuY29kZShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCcnKSwgJycpCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCdoZWxsbycpLCAnaGVsbG8nKQorICAgICAgICAjIFRlc3QgdGhlIGJpbmFyeSBmbGFnCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCdoZWxsb1xyXG53b3JsZCcpLCAnaGVsbG9cbndvcmxkJykKKyAgICAgICAgZXEocXVvcHJpbWltZS5lbmNvZGUoJ2hlbGxvXHJcbndvcmxkJywgMCksICdoZWxsb1xud29ybGQnKQorICAgICAgICAjIFRlc3QgdGhlIG1heGxpbmVsZW4gYXJnCisgICAgICAgIGVxKHF1b3ByaW1pbWUuZW5jb2RlKCd4eHh4ICcgKiAyMCwgbWF4bGluZWxlbj00MCksICIiIlwKK3h4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eD0KKyB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eD0KK3ggeHh4eCB4eHh4IHh4eHggeHh4eD0yMCIiIikKKyAgICAgICAgIyBUZXN0IHRoZSBlb2wgYXJndW1lbnQKKyAgICAgICAgZXEocXVvcHJpbWltZS5lbmNvZGUoJ3h4eHggJyAqIDIwLCBtYXhsaW5lbGVuPTQwLCBlb2w9J1xyXG4nKSwgIiIiXAoreHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4PVxyCisgeHh4eCB4eHh4IHh4eHggeHh4eCB4eHh4IHh4eHggeHh4eCB4eHg9XHIKK3ggeHh4eCB4eHh4IHh4eHggeHh4eD0yMCIiIikKKyAgICAgICAgZXEocXVvcHJpbWltZS5lbmNvZGUoIiIiXAorb25lIGxpbmUKKwordHdvIGxpbmUiIiIpLCAiIiJcCitvbmUgbGluZQorCit0d28gbGluZSIiIikKKworCisMCisjIFRlc3QgdGhlIENoYXJzZXQgY2xhc3MKK2NsYXNzIFRlc3RDaGFyc2V0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIGZyb20gZW1haWwgaW1wb3J0IGNoYXJzZXQgYXMgQ2hhcnNldE1vZHVsZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkZWwgQ2hhcnNldE1vZHVsZS5DSEFSU0VUU1snZmFrZSddCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB0ZXN0X2lkZW1wb3RlbnQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICAjIE1ha2Ugc3VyZSB1cy1hc2NpaSA9IG5vIFVuaWNvZGUgY29udmVyc2lvbgorICAgICAgICBjID0gQ2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICBzID0gJ0hlbGxvIFdvcmxkIScKKyAgICAgICAgc3AgPSBjLnRvX3NwbGl0dGFibGUocykKKyAgICAgICAgZXEocywgYy5mcm9tX3NwbGl0dGFibGUoc3ApKQorICAgICAgICAjIHRlc3QgOC1iaXQgaWRlbXBvdGVuY3kgd2l0aCB1cy1hc2NpaQorICAgICAgICBzID0gJ1x4YTRceGEyXHhhNFx4YTRceGE0XHhhNlx4YTRceGE4XHhhNFx4YWEnCisgICAgICAgIHNwID0gYy50b19zcGxpdHRhYmxlKHMpCisgICAgICAgIGVxKHMsIGMuZnJvbV9zcGxpdHRhYmxlKHNwKSkKKworICAgIGRlZiB0ZXN0X2JvZHlfZW5jb2RlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgIyBUcnkgYSBjaGFyc2V0IHdpdGggUVAgYm9keSBlbmNvZGluZworICAgICAgICBjID0gQ2hhcnNldCgnaXNvLTg4NTktMScpCisgICAgICAgIGVxKCdoZWxsbyB3PUY2cmxkJywgYy5ib2R5X2VuY29kZSgnaGVsbG8gd1x4ZjZybGQnKSkKKyAgICAgICAgIyBUcnkgYSBjaGFyc2V0IHdpdGggQmFzZTY0IGJvZHkgZW5jb2RpbmcKKyAgICAgICAgYyA9IENoYXJzZXQoJ3V0Zi04JykKKyAgICAgICAgZXEoJ2FHVnNiRzhnZDI5eWJHUT1cbicsIGMuYm9keV9lbmNvZGUoJ2hlbGxvIHdvcmxkJykpCisgICAgICAgICMgVHJ5IGEgY2hhcnNldCB3aXRoIE5vbmUgYm9keSBlbmNvZGluZworICAgICAgICBjID0gQ2hhcnNldCgndXMtYXNjaWknKQorICAgICAgICBlcSgnaGVsbG8gd29ybGQnLCBjLmJvZHlfZW5jb2RlKCdoZWxsbyB3b3JsZCcpKQorICAgICAgICAjIFRyeSB0aGUgY29udmVydCBhcmd1bWVudCwgd2hlcmUgaW5wdXQgY29kZWMgPD4gb3V0cHV0IGNvZGVjCisgICAgICAgIGMgPSBDaGFyc2V0KCdldWMtanAnKQorICAgICAgICAjIFdpdGggYXBvbG9naWVzIHRvIFRva2lvIEtpa3VjaGkgOykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZXEoJ1x4MWIkQjVGQ087fklXXHgxYihCJywKKyAgICAgICAgICAgICAgIGMuYm9keV9lbmNvZGUoJ1x4YjVceGM2XHhjM1x4Y2ZceGJiXHhmZVx4YzlceGQ3JykpCisgICAgICAgICAgICBlcSgnXHhiNVx4YzZceGMzXHhjZlx4YmJceGZlXHhjOVx4ZDcnLAorICAgICAgICAgICAgICAgYy5ib2R5X2VuY29kZSgnXHhiNVx4YzZceGMzXHhjZlx4YmJceGZlXHhjOVx4ZDcnLCBGYWxzZSkpCisgICAgICAgIGV4Y2VwdCBMb29rdXBFcnJvcjoKKyAgICAgICAgICAgICMgV2UgcHJvYmFibHkgZG9uJ3QgaGF2ZSB0aGUgSmFwYW5lc2UgY29kZWNzIGluc3RhbGxlZAorICAgICAgICAgICAgcGFzcworICAgICAgICAjIFRlc3RpbmcgU0YgYnVnICM2MjU1MDksIHdoaWNoIHdlIGhhdmUgdG8gZmFrZSwgc2luY2UgdGhlcmUgYXJlIG5vCisgICAgICAgICMgYnVpbHQtaW4gZW5jb2RpbmdzIHdoZXJlIHRoZSBoZWFkZXIgZW5jb2RpbmcgaXMgUVAgYnV0IHRoZSBib2R5CisgICAgICAgICMgZW5jb2RpbmcgaXMgbm90LgorICAgICAgICBmcm9tIGVtYWlsIGltcG9ydCBjaGFyc2V0IGFzIENoYXJzZXRNb2R1bGUKKyAgICAgICAgQ2hhcnNldE1vZHVsZS5hZGRfY2hhcnNldCgnZmFrZScsIENoYXJzZXRNb2R1bGUuUVAsIE5vbmUpCisgICAgICAgIGMgPSBDaGFyc2V0KCdmYWtlJykKKyAgICAgICAgZXEoJ2hlbGxvIHdceGY2cmxkJywgYy5ib2R5X2VuY29kZSgnaGVsbG8gd1x4ZjZybGQnKSkKKworICAgIGRlZiB0ZXN0X3VuaWNvZGVfY2hhcnNldF9uYW1lKHNlbGYpOgorICAgICAgICBjaGFyc2V0ID0gQ2hhcnNldCh1J3VzLWFzY2lpJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIoY2hhcnNldCksICd1cy1hc2NpaScpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKGVycm9ycy5DaGFyc2V0RXJyb3IsIENoYXJzZXQsICdhc2NceGZmaWknKQorCisKKwwKKyMgVGVzdCBtdWx0aWxpbmd1YWwgTUlNRSBoZWFkZXJzLgorY2xhc3MgVGVzdEhlYWRlcihUZXN0RW1haWxCYXNlKToKKyAgICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5uZGlmZkFzc2VydEVxdWFsCisgICAgICAgIGggPSBIZWFkZXIoJ0hlbGxvIFdvcmxkIScpCisgICAgICAgIGVxKGguZW5jb2RlKCksICdIZWxsbyBXb3JsZCEnKQorICAgICAgICBoLmFwcGVuZCgnIEdvb2RieWUgV29ybGQhJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJ0hlbGxvIFdvcmxkISAgR29vZGJ5ZSBXb3JsZCEnKQorCisgICAgZGVmIHRlc3Rfc2ltcGxlX3N1cnByaXNlKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCdIZWxsbyBXb3JsZCEnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnSGVsbG8gV29ybGQhJykKKyAgICAgICAgaC5hcHBlbmQoJ0dvb2RieWUgV29ybGQhJykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgJ0hlbGxvIFdvcmxkISBHb29kYnllIFdvcmxkIScpCisKKyAgICBkZWYgdGVzdF9oZWFkZXJfbmVlZHNfbm9fZGVjb2Rpbmcoc2VsZik6CisgICAgICAgIGggPSAnbm8gZGVjb2RpbmcgbmVlZGVkJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZV9oZWFkZXIoaCksIFsoaCwgTm9uZSldKQorCisgICAgZGVmIHRlc3RfbG9uZyhzZWxmKToKKyAgICAgICAgaCA9IEhlYWRlcigiSSBhbSB0aGUgdmVyeSBtb2RlbCBvZiBhIG1vZGVybiBNYWpvci1HZW5lcmFsOyBJJ3ZlIGluZm9ybWF0aW9uIHZlZ2V0YWJsZSwgYW5pbWFsLCBhbmQgbWluZXJhbDsgSSBrbm93IHRoZSBraW5ncyBvZiBFbmdsYW5kLCBhbmQgSSBxdW90ZSB0aGUgZmlnaHRzIGhpc3RvcmljYWwgZnJvbSBNYXJhdGhvbiB0byBXYXRlcmxvbywgaW4gb3JkZXIgY2F0ZWdvcmljYWw7IEknbSB2ZXJ5IHdlbGwgYWNxdWFpbnRlZCwgdG9vLCB3aXRoIG1hdHRlcnMgbWF0aGVtYXRpY2FsOyBJIHVuZGVyc3RhbmQgZXF1YXRpb25zLCBib3RoIHRoZSBzaW1wbGUgYW5kIHF1YWRyYXRpY2FsOyBhYm91dCBiaW5vbWlhbCB0aGVvcmVtIEknbSB0ZWVtaW5nIHdpdGggYSBsb3QgbycgbmV3cywgd2l0aCBtYW55IGNoZWVyZnVsIGZhY3RzIGFib3V0IHRoZSBzcXVhcmUgb2YgdGhlIGh5cG90ZW51c2UuIiwKKyAgICAgICAgICAgICAgICAgICBtYXhsaW5lbGVuPTc2KQorICAgICAgICBmb3IgbCBpbiBoLmVuY29kZShzcGxpdGNoYXJzPScgJykuc3BsaXQoJ1xuICcpOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGxlbihsKSA8PSA3NikKKworICAgIGRlZiB0ZXN0X211bHRpbGluZ3VhbChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgZyA9IENoYXJzZXQoImlzby04ODU5LTEiKQorICAgICAgICBjeiA9IENoYXJzZXQoImlzby04ODU5LTIiKQorICAgICAgICB1dGY4ID0gQ2hhcnNldCgidXRmLTgiKQorICAgICAgICBnX2hlYWQgPSAiRGllIE1pZXRlciB0cmV0ZW4gaGllciBlaW4gd2VyZGVuIG1pdCBlaW5lbSBGb2VyZGVyYmFuZCBrb21mb3J0YWJlbCBkZW4gS29ycmlkb3IgZW50bGFuZywgYW4gc1x4ZmNkbFx4ZmNuZGlzY2hlbiBXYW5kZ2VtXHhlNGxkZW4gdm9yYmVpLCBnZWdlbiBkaWUgcm90aWVyZW5kZW4gS2xpbmdlbiBiZWZceGY2cmRlcnQuICIKKyAgICAgICAgY3pfaGVhZCA9ICJGaW5hblx4ZThuaSBtZXRyb3BvbGUgc2UgaHJvdXRpbHkgcG9kIHRsYWtlbSBqZWppY2ggZFx4Zjl2dGlwdS4uICIKKyAgICAgICAgdXRmOF9oZWFkID0gdSJcdTZiNjNcdTc4YmFcdTMwNmJcdThhMDBcdTMwNDZcdTMwNjhcdTdmZmJcdThhMzNcdTMwNmZcdTMwNTVcdTMwOGNcdTMwNjZcdTMwNDRcdTMwN2VcdTMwNWJcdTMwOTNcdTMwMDJcdTRlMDBcdTkwZThcdTMwNmZcdTMwYzlcdTMwYTRcdTMwYzRcdThhOWVcdTMwNjdcdTMwNTlcdTMwNGNcdTMwMDFcdTMwNDJcdTMwNjhcdTMwNmZcdTMwNjdcdTMwNWZcdTMwODlcdTMwODFcdTMwNjdcdTMwNTlcdTMwMDJcdTViOWZcdTk2OWJcdTMwNmJcdTMwNmZcdTMwMGNXZW5uIGlzdCBkYXMgTnVuc3R1Y2sgZ2l0IHVuZCBTbG90ZXJtZXllcj8gSmEhIEJlaWhlcmh1bmQgZGFzIE9kZXIgZGllIEZsaXBwZXJ3YWxkdCBnZXJzcHV0Llx1MzAwZFx1MzA2OFx1OGEwMFx1MzA2M1x1MzA2Nlx1MzA0NFx1MzA3ZVx1MzA1OVx1MzAwMiIuZW5jb2RlKCJ1dGYtOCIpCisgICAgICAgIGggPSBIZWFkZXIoZ19oZWFkLCBnKQorICAgICAgICBoLmFwcGVuZChjel9oZWFkLCBjeikKKyAgICAgICAgaC5hcHBlbmQodXRmOF9oZWFkLCB1dGY4KQorICAgICAgICBlbmMgPSBoLmVuY29kZSgpCisgICAgICAgIGVxKGVuYywgIiIiXAorPT9pc28tODg1OS0xP3E/RGllX01pZXRlcl90cmV0ZW5faGllcl9laW5fd2VyZGVuX21pdF9laW5lbV9Gb2VyZGVyYmFuZF9rbz89CisgPT9pc28tODg1OS0xP3E/bWZvcnRhYmVsX2Rlbl9Lb3JyaWRvcl9lbnRsYW5nPTJDX2FuX3M9RkNkbD1GQ25kaXNjaGVuX1dhbj89CisgPT9pc28tODg1OS0xP3E/ZGdlbT1FNGxkZW5fdm9yYmVpPTJDX2dlZ2VuX2RpZV9yb3RpZXJlbmRlbl9LbGluZ2VuX2JlZj1GNj89CisgPT9pc28tODg1OS0xP3E/cmRlcnQ9MkVfPz0gPT9pc28tODg1OS0yP3E/RmluYW49RThuaV9tZXRyb3BvbGVfc2VfaHJvdXRpbHk/PQorID0/aXNvLTg4NTktMj9xP19wb2RfdGxha2VtX2plamljaF9kPUY5dnRpcHU9MkU9MkVfPz0gPT91dGYtOD9iPzVxMmo1Nks2Pz0KKyA9P3V0Zi04P2I/NDRHcjZLaUE0NEdHNDRHbzU3Kzc2S2l6NDRHdjQ0R1Y0NEtNNDRHbTQ0R0U0NEcrNDRHYjQ0S1Q0NENDPz0KKyA9P3V0Zi04P2I/NUxpQTZZT280NEd2NDRPSjQ0S2s0NE9FNktxZTQ0R240NEdaNDRHTTQ0Q0I0NEdDNDRHbzQ0R3Y0NEduPz0KKyA9P3V0Zi04P2I/NDRHZjQ0S0o0NEtCNDRHbjQ0R1o0NENDNWE2ZjZacWI0NEdyNDRHdjQ0Q01WMlZ1YmlCcGMzUWdaR0Z6Pz0KKyA9P3V0Zi04P3E/X051bnN0dWNrX2dpdF91bmRfU2xvdGVybWV5ZXI9M0ZfSmEhX0JlaWhlcmh1bmRfZGFzX09kZXJfZGllX0ZsPz0KKyA9P3V0Zi04P2I/YVhCd1pYSjNZV3hrZENCblpYSnpjSFYwTHVPQWplT0JxT2lvZ09PQm8rT0JwdU9CaE9PQnZ1T0JtUT09Pz0KKyA9P3V0Zi04P2I/NDRDQz89IiIiKQorICAgICAgICBlcShkZWNvZGVfaGVhZGVyKGVuYyksCisgICAgICAgICAgIFsoZ19oZWFkLCAiaXNvLTg4NTktMSIpLCAoY3pfaGVhZCwgImlzby04ODU5LTIiKSwKKyAgICAgICAgICAgICh1dGY4X2hlYWQsICJ1dGYtOCIpXSkKKyAgICAgICAgdXN0ciA9IHVuaWNvZGUoaCkKKyAgICAgICAgZXEodXN0ci5lbmNvZGUoJ3V0Zi04JyksCisgICAgICAgICAgICdEaWUgTWlldGVyIHRyZXRlbiBoaWVyIGVpbiB3ZXJkZW4gbWl0IGVpbmVtIEZvZXJkZXJiYW5kICcKKyAgICAgICAgICAgJ2tvbWZvcnRhYmVsIGRlbiBLb3JyaWRvciBlbnRsYW5nLCBhbiBzXHhjM1x4YmNkbFx4YzNceGJjbmRpc2NoZW4gJworICAgICAgICAgICAnV2FuZGdlbVx4YzNceGE0bGRlbiB2b3JiZWksIGdlZ2VuIGRpZSByb3RpZXJlbmRlbiBLbGluZ2VuICcKKyAgICAgICAgICAgJ2JlZlx4YzNceGI2cmRlcnQuIEZpbmFuXHhjNFx4OGRuaSBtZXRyb3BvbGUgc2UgaHJvdXRpbHkgcG9kICcKKyAgICAgICAgICAgJ3RsYWtlbSBqZWppY2ggZFx4YzVceGFmdnRpcHUuLiBceGU2XHhhZFx4YTNceGU3XHhhMlx4YmFceGUzXHg4MScKKyAgICAgICAgICAgJ1x4YWJceGU4XHhhOFx4ODBceGUzXHg4MVx4ODZceGUzXHg4MVx4YThceGU3XHhiZlx4YmJceGU4XHhhOFx4YjMnCisgICAgICAgICAgICdceGUzXHg4MVx4YWZceGUzXHg4MVx4OTVceGUzXHg4Mlx4OGNceGUzXHg4MVx4YTZceGUzXHg4MVx4ODRceGUzJworICAgICAgICAgICAnXHg4MVx4YmVceGUzXHg4MVx4OWJceGUzXHg4Mlx4OTNceGUzXHg4MFx4ODJceGU0XHhiOFx4ODBceGU5XHg4MycKKyAgICAgICAgICAgJ1x4YThceGUzXHg4MVx4YWZceGUzXHg4M1x4ODlceGUzXHg4Mlx4YTRceGUzXHg4M1x4ODRceGU4XHhhYVx4OWUnCisgICAgICAgICAgICdceGUzXHg4MVx4YTdceGUzXHg4MVx4OTlceGUzXHg4MVx4OGNceGUzXHg4MFx4ODFceGUzXHg4MVx4ODJceGUzJworICAgICAgICAgICAnXHg4MVx4YThceGUzXHg4MVx4YWZceGUzXHg4MVx4YTdceGUzXHg4MVx4OWZceGUzXHg4Mlx4ODlceGUzXHg4MicKKyAgICAgICAgICAgJ1x4ODFceGUzXHg4MVx4YTdceGUzXHg4MVx4OTlceGUzXHg4MFx4ODJceGU1XHhhZVx4OWZceGU5XHg5YVx4OWInCisgICAgICAgICAgICdceGUzXHg4MVx4YWJceGUzXHg4MVx4YWZceGUzXHg4MFx4OGNXZW5uIGlzdCBkYXMgTnVuc3R1Y2sgZ2l0ICcKKyAgICAgICAgICAgJ3VuZCBTbG90ZXJtZXllcj8gSmEhIEJlaWhlcmh1bmQgZGFzIE9kZXIgZGllIEZsaXBwZXJ3YWxkdCAnCisgICAgICAgICAgICdnZXJzcHV0Llx4ZTNceDgwXHg4ZFx4ZTNceDgxXHhhOFx4ZThceGE4XHg4MFx4ZTNceDgxXHhhM1x4ZTNceDgxJworICAgICAgICAgICAnXHhhNlx4ZTNceDgxXHg4NFx4ZTNceDgxXHhiZVx4ZTNceDgxXHg5OVx4ZTNceDgwXHg4MicpCisgICAgICAgICMgVGVzdCBtYWtlX2hlYWRlcigpCisgICAgICAgIG5ld2ggPSBtYWtlX2hlYWRlcihkZWNvZGVfaGVhZGVyKGVuYykpCisgICAgICAgIGVxKG5ld2gsIGVuYykKKworICAgIGRlZiB0ZXN0X2hlYWRlcl9jdG9yX2RlZmF1bHRfYXJncyhzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcigpCisgICAgICAgIGVxKGgsICcnKQorICAgICAgICBoLmFwcGVuZCgnZm9vJywgQ2hhcnNldCgnaXNvLTg4NTktMScpKQorICAgICAgICBlcShoLCAnPT9pc28tODg1OS0xP3E/Zm9vPz0nKQorCisgICAgZGVmIHRlc3RfZXhwbGljaXRfbWF4bGluZWxlbihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLm5kaWZmQXNzZXJ0RXF1YWwKKyAgICAgICAgaHN0ciA9ICdBIHZlcnkgbG9uZyBsaW5lIHRoYXQgbXVzdCBnZXQgc3BsaXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gYXQgdGhlIDc2dGggY2hhcmFjdGVyIGJvdW5kYXJ5IHRvIHRlc3QgdGhlIG5vbi1kZWZhdWx0IGJlaGF2aW9yJworICAgICAgICBoID0gSGVhZGVyKGhzdHIpCisgICAgICAgIGVxKGguZW5jb2RlKCksICcnJ1wKK0EgdmVyeSBsb25nIGxpbmUgdGhhdCBtdXN0IGdldCBzcGxpdCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBhdCB0aGUgNzZ0aAorIGNoYXJhY3RlciBib3VuZGFyeSB0byB0ZXN0IHRoZSBub24tZGVmYXVsdCBiZWhhdmlvcicnJykKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyLCBoZWFkZXJfbmFtZT0nU3ViamVjdCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICcnJ1wKK0EgdmVyeSBsb25nIGxpbmUgdGhhdCBtdXN0IGdldCBzcGxpdCB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBhdCB0aGUKKyA3NnRoIGNoYXJhY3RlciBib3VuZGFyeSB0byB0ZXN0IHRoZSBub24tZGVmYXVsdCBiZWhhdmlvcicnJykKKyAgICAgICAgaCA9IEhlYWRlcihoc3RyLCBtYXhsaW5lbGVuPTEwMjQsIGhlYWRlcl9uYW1lPSdTdWJqZWN0JykKKyAgICAgICAgZXEoaC5lbmNvZGUoKSwgaHN0cikKKworICAgIGRlZiB0ZXN0X3VzX2FzY2lpX2hlYWRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnaGVsbG8nCisgICAgICAgIHggPSBkZWNvZGVfaGVhZGVyKHMpCisgICAgICAgIGVxKHgsIFsoJ2hlbGxvJywgTm9uZSldKQorICAgICAgICBoID0gbWFrZV9oZWFkZXIoeCkKKyAgICAgICAgZXEocywgaC5lbmNvZGUoKSkKKworICAgIGRlZiB0ZXN0X3N0cmluZ19jaGFyc2V0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcigpCisgICAgICAgIGguYXBwZW5kKCdoZWxsbycsICdpc28tODg1OS0xJykKKyAgICAgICAgZXEoaCwgJz0/aXNvLTg4NTktMT9xP2hlbGxvPz0nKQorCisjIyAgICBkZWYgdGVzdF91bmljb2RlX2Vycm9yKHNlbGYpOgorIyMgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisjIyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgSGVhZGVyLCB1J1tQXHhmNnN0YWxdJywgJ3VzLWFzY2lpJykKKyMjICAgICAgICByYWlzZXMoVW5pY29kZUVycm9yLCBIZWFkZXIsICdbUFx4ZjZzdGFsXScsICd1cy1hc2NpaScpCisjIyAgICAgICAgaCA9IEhlYWRlcigpCisjIyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgaC5hcHBlbmQsIHUnW1BceGY2c3RhbF0nLCAndXMtYXNjaWknKQorIyMgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIGguYXBwZW5kLCAnW1BceGY2c3RhbF0nLCAndXMtYXNjaWknKQorIyMgICAgICAgIHJhaXNlcyhVbmljb2RlRXJyb3IsIEhlYWRlciwgdSdcdTgzY2FcdTU3MzBcdTY2NDJcdTU5MmInLCAnaXNvLTg4NTktMScpCisKKyAgICBkZWYgdGVzdF91dGY4X3Nob3J0ZXN0KHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgaCA9IEhlYWRlcih1J3BceGY2c3RhbCcsICd1dGYtOCcpCisgICAgICAgIGVxKGguZW5jb2RlKCksICc9P3V0Zi04P3E/cD1DMz1CNnN0YWw/PScpCisgICAgICAgIGggPSBIZWFkZXIodSdcdTgzY2FcdTU3MzBcdTY2NDJcdTU5MmInLCAndXRmLTgnKQorICAgICAgICBlcShoLmVuY29kZSgpLCAnPT91dGYtOD9iPzZJK0s1Wnl3NXBtQzVhU3I/PScpCisKKyAgICBkZWYgdGVzdF9iYWRfOGJpdF9oZWFkZXIoc2VsZik6CisgICAgICAgIHJhaXNlcyA9IHNlbGYuYXNzZXJ0UmFpc2VzCisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICB4ID0gJ1lud3A0ZFVFYmF5IEF1Y3Rpb24gU2VtaWFyLSBObyBDaGFyZ2UgXHg5NiBFYXJuIEJpZycKKyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgSGVhZGVyLCB4KQorICAgICAgICBoID0gSGVhZGVyKCkKKyAgICAgICAgcmFpc2VzKFVuaWNvZGVFcnJvciwgaC5hcHBlbmQsIHgpCisgICAgICAgIGVxKHN0cihIZWFkZXIoeCwgZXJyb3JzPSdyZXBsYWNlJykpLCB4KQorICAgICAgICBoLmFwcGVuZCh4LCBlcnJvcnM9J3JlcGxhY2UnKQorICAgICAgICBlcShzdHIoaCksIHgpCisKKyAgICBkZWYgdGVzdF9lbmNvZGVkX2FkamFjZW50X25vbmVuY29kZWQoc2VsZik6CisgICAgICAgIGVxID0gc2VsZi5hc3NlcnRFcXVhbAorICAgICAgICBoID0gSGVhZGVyKCkKKyAgICAgICAgaC5hcHBlbmQoJ2hlbGxvJywgJ2lzby04ODU5LTEnKQorICAgICAgICBoLmFwcGVuZCgnd29ybGQnKQorICAgICAgICBzID0gaC5lbmNvZGUoKQorICAgICAgICBlcShzLCAnPT9pc28tODg1OS0xP3E/aGVsbG8/PSB3b3JsZCcpCisgICAgICAgIGggPSBtYWtlX2hlYWRlcihkZWNvZGVfaGVhZGVyKHMpKQorICAgICAgICBlcShoLmVuY29kZSgpLCBzKQorCisgICAgZGVmIHRlc3Rfd2hpdGVzcGFjZV9lYXRlcihzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIHMgPSAnU3ViamVjdDogPT9rb2k4LXI/Yj84TkxQMThYU3k4RWd6c0VneHNuT3djell6dGs9Pz0gPT9rb2k4LXI/cT89Q0E/PSB6ei4nCisgICAgICAgIHBhcnRzID0gZGVjb2RlX2hlYWRlcihzKQorICAgICAgICBlcShwYXJ0cywgWygnU3ViamVjdDonLCBOb25lKSwgKCdceGYwXHhkMlx4Y2ZceGQ3XHhjNVx4ZDJceGNiXHhjMSBceGNlXHhjMSBceGM2XHhjOVx4Y2VceGMxXHhjY1x4ZDhceGNlXHhkOVx4Y2EnLCAna29pOC1yJyksICgnenouJywgTm9uZSldKQorICAgICAgICBoZHIgPSBtYWtlX2hlYWRlcihwYXJ0cykKKyAgICAgICAgZXEoaGRyLmVuY29kZSgpLAorICAgICAgICAgICAnU3ViamVjdDogPT9rb2k4LXI/Yj84TkxQMThYU3k4RWd6c0VneHNuT3djell6dG5LPz0genouJykKKworICAgIGRlZiB0ZXN0X2Jyb2tlbl9iYXNlNjRfaGVhZGVyKHNlbGYpOgorICAgICAgICByYWlzZXMgPSBzZWxmLmFzc2VydFJhaXNlcworICAgICAgICBzID0gJ1N1YmplY3Q6ID0/RVVDLUtSP0I/Q1NpeHBMRHRLU0MvN0xpdXZzYXg0aUM2dUxtd01jaWpJS0hhSUx6U3dkL0gwU0M4K0xDandMc2d2N1cvK01qM0lRPz0nCisgICAgICAgIHJhaXNlcyhlcnJvcnMuSGVhZGVyUGFyc2VFcnJvciwgZGVjb2RlX2hlYWRlciwgcykKKworCisMCisjIFRlc3QgUkZDIDIyMzEgaGVhZGVyIHBhcmFtZXRlcnMgKGVuL2RlKWNvZGluZworY2xhc3MgVGVzdFJGQzIyMzEoVGVzdEVtYWlsQmFzZSk6CisgICAgZGVmIHRlc3RfZ2V0X3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0RXF1YWwKKyAgICAgICAgbXNnID0gc2VsZi5fbXNnb2JqKCdtc2dfMjkudHh0JykKKyAgICAgICAgZXEobXNnLmdldF9wYXJhbSgndGl0bGUnKSwKKyAgICAgICAgICAgKCd1cy1hc2NpaScsICdlbicsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScpKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCd0aXRsZScsIHVucXVvdGU9RmFsc2UpLAorICAgICAgICAgICAoJ3VzLWFzY2lpJywgJ2VuJywgJyJUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0ISInKSkKKworICAgIGRlZiB0ZXN0X3NldF9wYXJhbShzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IE1lc3NhZ2UoKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCd0aXRsZScsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScsCisgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldD0ndXMtYXNjaWknKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCd0aXRsZScpLAorICAgICAgICAgICAoJ3VzLWFzY2lpJywgJycsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScpKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCd0aXRsZScsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScsCisgICAgICAgICAgICAgICAgICAgICAgY2hhcnNldD0ndXMtYXNjaWknLCBsYW5ndWFnZT0nZW4nKQorICAgICAgICBlcShtc2cuZ2V0X3BhcmFtKCd0aXRsZScpLAorICAgICAgICAgICAoJ3VzLWFzY2lpJywgJ2VuJywgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhJykpCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzAxLnR4dCcpCisgICAgICAgIG1zZy5zZXRfcGFyYW0oJ3RpdGxlJywgJ1RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpc25cJ3QgaXQhJywKKyAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0PSd1cy1hc2NpaScsIGxhbmd1YWdlPSdlbicpCisgICAgICAgIGVxKG1zZy5hc19zdHJpbmcoKSwgIiIiXAorUmV0dXJuLVBhdGg6IDxiYmJAenp6Lm9yZz4KK0RlbGl2ZXJlZC1UbzogYmJiQHp6ei5vcmcKK1JlY2VpdmVkOiBieSBtYWlsLnp6ei5vcmcgKFBvc3RmaXgsIGZyb20gdXNlcmlkIDg4OSkKK1x0aWQgMjdDRUFEMzhDQzsgRnJpLCAgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMCAoRURUKQorTUlNRS1WZXJzaW9uOiAxLjAKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKK01lc3NhZ2UtSUQ6IDwxNTA5MC42MTMwNC4xMTA5MjkuNDU2ODRAYWFhLnp6ei5vcmc+CitGcm9tOiBiYmJAZGRkLmNvbSAoSm9obiBYLiBEb2UpCitUbzogYmJiQHp6ei5vcmcKK1N1YmplY3Q6IFRoaXMgaXMgYSB0ZXN0IG1lc3NhZ2UKK0RhdGU6IEZyaSwgNCBNYXkgMjAwMSAxNDowNTo0NCAtMDQwMAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBjaGFyc2V0PXVzLWFzY2lpOworXHR0aXRsZSo9InVzLWFzY2lpJ2VuJ1RoaXMlMjBpcyUyMGV2ZW4lMjBtb3JlJTIwJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwaXNuJTI3dCUyMGl0JTIxIgorCisKK0hpLAorCitEbyB5b3UgbGlrZSB0aGlzIG1lc3NhZ2U/CisKKy1NZQorIiIiKQorCisgICAgZGVmIHRlc3RfZGVsX3BhcmFtKHNlbGYpOgorICAgICAgICBlcSA9IHNlbGYubmRpZmZBc3NlcnRFcXVhbAorICAgICAgICBtc2cgPSBzZWxmLl9tc2dvYmooJ21zZ18wMS50eHQnKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCdmb28nLCAnYmFyJywgY2hhcnNldD0ndXMtYXNjaWknLCBsYW5ndWFnZT0nZW4nKQorICAgICAgICBtc2cuc2V0X3BhcmFtKCd0aXRsZScsICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXNuXCd0IGl0IScsCisgICAgICAgICAgICBjaGFyc2V0PSd1cy1hc2NpaScsIGxhbmd1YWdlPSdlbicpCisgICAgICAgIG1zZy5kZWxfcGFyYW0oJ2ZvbycsIGhlYWRlcj0nQ29udGVudC1UeXBlJykKKyAgICAgICAgZXEobXNnLmFzX3N0cmluZygpLCAiIiJcCitSZXR1cm4tUGF0aDogPGJiYkB6enoub3JnPgorRGVsaXZlcmVkLVRvOiBiYmJAenp6Lm9yZworUmVjZWl2ZWQ6IGJ5IG1haWwuenp6Lm9yZyAoUG9zdGZpeCwgZnJvbSB1c2VyaWQgODg5KQorXHRpZCAyN0NFQUQzOENDOyBGcmksICA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwIChFRFQpCitNSU1FLVZlcnNpb246IDEuMAorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorTWVzc2FnZS1JRDogPDE1MDkwLjYxMzA0LjExMDkyOS40NTY4NEBhYWEuenp6Lm9yZz4KK0Zyb206IGJiYkBkZGQuY29tIChKb2huIFguIERvZSkKK1RvOiBiYmJAenp6Lm9yZworU3ViamVjdDogVGhpcyBpcyBhIHRlc3QgbWVzc2FnZQorRGF0ZTogRnJpLCA0IE1heSAyMDAxIDE0OjA1OjQ0IC0wNDAwCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9InVzLWFzY2lpIjsKK1x0dGl0bGUqPSJ1cy1hc2NpaSdlbidUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMGlzbiUyN3QlMjBpdCUyMSIKKworCitIaSwKKworRG8geW91IGxpa2UgdGhpcyBtZXNzYWdlPworCistTWUKKyIiIikKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfZ2V0X2NvbnRlbnRfY2hhcnNldChzZWxmKToKKyAgICAgICAgZXEgPSBzZWxmLmFzc2VydEVxdWFsCisgICAgICAgIG1zZyA9IHNlbGYuX21zZ29iaignbXNnXzMyLnR4dCcpCisgICAgICAgIGVxKG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCksICd1cy1hc2NpaScpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2xhbmd1YWdlX29yX2NoYXJzZXQoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiA4Yml0CitDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPSJmaWxlX19fX0NfX0RPQ1VNRU5UU18yMEFORF8yMFNFVFRJTkdTX0ZBQklFTl9MT0NBTF8yMFNFVFRJTkdTX1RFTVBfbnNtYWlsLmh0bSIKK0NvbnRlbnQtVHlwZTogdGV4dC9odG1sOyBOQU1FKjA9ZmlsZV9fX19DX19ET0NVTUVOVFNfMjBBTkRfMjBTRVRUSU5HU19GQUJJRU5fTE9DQUxfMjBTRVRUSU5HU19URU07IE5BTUUqMT1QX25zbWFpbC5odG0KKworJycnCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X3BhcmFtKCdOQU1FJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgKE5vbmUsIE5vbmUsICdmaWxlX19fX0NfX0RPQ1VNRU5UU18yMEFORF8yMFNFVFRJTkdTX0ZBQklFTl9MT0NBTF8yMFNFVFRJTkdTX1RFTVBfbnNtYWlsLmh0bScpKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2ZpbGVuYW1lKHNlbGYpOgorICAgICAgICBtID0gJycnXAorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOworXHRmaWxlbmFtZSowPSJUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGZpbGVuYW1lKjE9IiUyQSUyQSUyQWZ1biUyQSUyQSUyQSUyMCI7CitcdGZpbGVuYW1lKjI9ImlzIGl0IG5vdC5wZGYiCisKKycnJworICAgICAgICBtc2cgPSBlbWFpbC5tZXNzYWdlX2Zyb21fc3RyaW5nKG0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmdldF9maWxlbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdUaGlzIGlzIGV2ZW4gbW9yZSAqKipmdW4qKiogaXMgaXQgbm90LnBkZicpCisKKyAgICBkZWYgdGVzdF9yZmMyMjMxX25vX2xhbmd1YWdlX29yX2NoYXJzZXRfaW5fYm91bmRhcnkoc2VsZik6CisgICAgICAgIG0gPSAnJydcCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9hbHRlcm5hdGl2ZTsKK1x0Ym91bmRhcnkqMD0iVGhpcyUyMGlzJTIwZXZlbiUyMG1vcmUlMjAiOworXHRib3VuZGFyeSoxPSIlMkElMkElMkFmdW4lMkElMkElMkElMjAiOworXHRib3VuZGFyeSoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfYm91bmRhcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnVGhpcyBpcyBldmVuIG1vcmUgKioqZnVuKioqIGlzIGl0IG5vdC5wZGYnKQorCisgICAgZGVmIHRlc3RfcmZjMjIzMV9ub19sYW5ndWFnZV9vcl9jaGFyc2V0X2luX2NoYXJzZXQoc2VsZik6CisgICAgICAgICMgVGhpcyBpcyBhIG5vbnNlbnNpY2FsIGNoYXJzZXQgdmFsdWUsIGJ1dCB0ZXN0cyB0aGUgY29kZSBhbnl3YXkKKyAgICAgICAgbSA9ICcnJ1wKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsKK1x0Y2hhcnNldCowPSJUaGlzJTIwaXMlMjBldmVuJTIwbW9yZSUyMCI7CitcdGNoYXJzZXQqMT0iJTJBJTJBJTJBZnVuJTJBJTJBJTJBJTIwIjsKK1x0Y2hhcnNldCoyPSJpcyBpdCBub3QucGRmIgorCisnJycKKyAgICAgICAgbXNnID0gZW1haWwubWVzc2FnZV9mcm9tX3N0cmluZyhtKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5nZXRfY29udGVudF9jaGFyc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgJ3RoaXMgaXMgZXZlbiBtb3JlICoqKmZ1bioqKiBpcyBpdCBub3QucGRmJykKKworICAgIGRlZiB0ZXN0X3JmYzIyMzFfdW5rbm93bl9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgbSA9ICIiIlwKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDhiaXQKK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWUqMD1YLVVOS05PV04nJ215ZmlsZS50eHQKKworIiIiCisgICAgICAgIG1zZyA9IGVtYWlsLm1lc3NhZ2VfZnJvbV9zdHJpbmcobSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuZ2V0X2ZpbGVuYW1lKCksICdteWZpbGUudHh0JykKKworCisMCitkZWYgX3Rlc3RjbGFzc2VzKCk6CisgICAgbW9kID0gc3lzLm1vZHVsZXNbX19uYW1lX19dCisgICAgcmV0dXJuIFtnZXRhdHRyKG1vZCwgbmFtZSkgZm9yIG5hbWUgaW4gZGlyKG1vZCkgaWYgbmFtZS5zdGFydHN3aXRoKCdUZXN0JyldCisKKworZGVmIHN1aXRlKCk6CisgICAgc3VpdGUgPSB1bml0dGVzdC5UZXN0U3VpdGUoKQorICAgIGZvciB0ZXN0Y2xhc3MgaW4gX3Rlc3RjbGFzc2VzKCk6CisgICAgICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKHRlc3RjbGFzcykpCisgICAgcmV0dXJuIHN1aXRlCisKKworZGVmIHRlc3RfbWFpbigpOgorICAgIGZvciB0ZXN0Y2xhc3MgaW4gX3Rlc3RjbGFzc2VzKCk6CisgICAgICAgIHJ1bl91bml0dGVzdCh0ZXN0Y2xhc3MpCisKKworDAoraWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgICB1bml0dGVzdC5tYWluKGRlZmF1bHRUZXN0PSdzdWl0ZScpCmRpZmYgLS1naXQgYS9MaWIvZW1haWwvVXRpbHMucHkgYi9MaWIvZW1haWwvdXRpbHMucHkKc2ltaWxhcml0eSBpbmRleCA5NiUKcmVuYW1lIGZyb20gTGliL2VtYWlsL1V0aWxzLnB5CnJlbmFtZSB0byBMaWIvZW1haWwvdXRpbHMucHkKaW5kZXggOWJhNzYwMS4uMjUwZWIxOSAxMDA2NDQKLS0tIGEvTGliL2VtYWlsL1V0aWxzLnB5CisrKyBiL0xpYi9lbWFpbC91dGlscy5weQpAQCAtMSw5ICsxLDI0IEBACi0jIENvcHlyaWdodCAoQykgMjAwMS0yMDA0IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCisjIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uCiAjIEF1dGhvcjogQmFycnkgV2Fyc2F3CiAjIENvbnRhY3Q6IGVtYWlsLXNpZ0BweXRob24ub3JnCiAKICIiIk1pc2NlbGxhbmVvdXMgdXRpbGl0aWVzLiIiIgogCitfX2FsbF9fID0gWworICAgICdjb2xsYXBzZV9yZmMyMjMxX3ZhbHVlJywKKyAgICAnZGVjb2RlX3BhcmFtcycsCisgICAgJ2RlY29kZV9yZmMyMjMxJywKKyAgICAnZW5jb2RlX3JmYzIyMzEnLAorICAgICdmb3JtYXRhZGRyJywKKyAgICAnZm9ybWF0ZGF0ZScsCisgICAgJ2dldGFkZHJlc3NlcycsCisgICAgJ21ha2VfbXNnaWQnLAorICAgICdwYXJzZWFkZHInLAorICAgICdwYXJzZWRhdGUnLAorICAgICdwYXJzZWRhdGVfdHonLAorICAgICd1bnF1b3RlJywKKyAgICBdCisKIGltcG9ydCBvcwogaW1wb3J0IHJlCiBpbXBvcnQgdGltZQpAQCAtMjQsNyArMzksNyBAQAogZnJvbSBxdW9wcmkgaW1wb3J0IGRlY29kZXN0cmluZyBhcyBfcWRlY29kZQogCiAjIEludHJhcGFja2FnZSBpbXBvcnRzCi1mcm9tIGVtYWlsLkVuY29kZXJzIGltcG9ydCBfYmVuY29kZSwgX3FlbmNvZGUKK2Zyb20gZW1haWwuZW5jb2RlcnMgaW1wb3J0IF9iZW5jb2RlLCBfcWVuY29kZQogCiBDT01NQVNQQUNFID0gJywgJwogRU1QVFlTVFJJTkcgPSAnJwpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9iaWc1LnB5IGIvTGliL2VuY29kaW5ncy9iaWc1LnB5CmluZGV4IGQ1NmFhMWIuLjdhZGViMGUgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvYmlnNS5weQorKysgYi9MaWIvZW5jb2RpbmdzL2JpZzUucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgYmlnNS5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIEJJRzUKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGJpZzUucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc190dywgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfdHcuZ2V0Y29kZWMoJ2JpZzUnKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdiaWc1JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9iaWc1aGtzY3MucHkgYi9MaWIvZW5jb2RpbmdzL2JpZzVoa3Njcy5weQppbmRleCA0NDM5OTdmLi4zNTBkZjM3IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2JpZzVoa3Njcy5weQorKysgYi9MaWIvZW5jb2RpbmdzL2JpZzVoa3Njcy5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBiaWc1aGtzY3MucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBCSUc1SEtTQ1MKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGJpZzVoa3Njcy5weSx2IDEuMSAyMDA0LzA2LzI5IDA1OjE0OjI3IHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2hrLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19oay5nZXRjb2RlYygnYmlnNWhrc2NzJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nYmlnNWhrc2NzJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9jcDkzMi5weSBiL0xpYi9lbmNvZGluZ3MvY3A5MzIucHkKaW5kZXggMzg5MzdmNS4uZTAxZjU5YiAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9jcDkzMi5weQorKysgYi9MaWIvZW5jb2RpbmdzL2NwOTMyLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGNwOTMyLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgQ1A5MzIKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGNwOTMyLnB5LHYgMS44IDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfanAsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKIAogY29kZWMgPSBfY29kZWNzX2pwLmdldGNvZGVjKCdjcDkzMicpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwOTMyJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9jcDk0OS5weSBiL0xpYi9lbmNvZGluZ3MvY3A5NDkucHkKaW5kZXggMGYzYzg0Ny4uNjI3Yzg3MSAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9jcDk0OS5weQorKysgYi9MaWIvZW5jb2RpbmdzL2NwOTQ5LnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGNwOTQ5LnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgQ1A5NDkKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGNwOTQ5LnB5LHYgMS44IDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3Nfa3IsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKIAogY29kZWMgPSBfY29kZWNzX2tyLmdldGNvZGVjKCdjcDk0OScpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwOTQ5JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9jcDk1MC5weSBiL0xpYi9lbmNvZGluZ3MvY3A5NTAucHkKaW5kZXggZGFiM2UyOC4uMzllZWM1ZSAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9jcDk1MC5weQorKysgYi9MaWIvZW5jb2RpbmdzL2NwOTUwLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGNwOTUwLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgQ1A5NTAKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGNwOTUwLnB5LHYgMS44IDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfdHcsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKIAogY29kZWMgPSBfY29kZWNzX3R3LmdldGNvZGVjKCdjcDk1MCcpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2NwOTUwJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9ldWNfamlzXzIwMDQucHkgYi9MaWIvZW5jb2RpbmdzL2V1Y19qaXNfMjAwNC5weQppbmRleCAwMmQ1NWNhLi43MmI4N2FlIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2V1Y19qaXNfMjAwNC5weQorKysgYi9MaWIvZW5jb2RpbmdzL2V1Y19qaXNfMjAwNC5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBldWNfamlzXzIwMDQucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBFVUNfSklTXzIwMDQKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGV1Y19qaXNfMjAwNC5weSx2IDEuMSAyMDA0LzA3LzA3IDE2OjE4OjI1IHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2pwLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19qcC5nZXRjb2RlYygnZXVjX2ppc18yMDA0JykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nZXVjX2ppc18yMDA0JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9ldWNfamlzeDAyMTMucHkgYi9MaWIvZW5jb2RpbmdzL2V1Y19qaXN4MDIxMy5weQppbmRleCAzMGYxNzNlLi5jYzQ3ZDA0IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2V1Y19qaXN4MDIxMy5weQorKysgYi9MaWIvZW5jb2RpbmdzL2V1Y19qaXN4MDIxMy5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBldWNfamlzeDAyMTMucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBFVUNfSklTWDAyMTMKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGV1Y19qaXN4MDIxMy5weSx2IDEuOCAyMDA0LzA2LzI4IDE4OjE2OjAzIHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2pwLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19qcC5nZXRjb2RlYygnZXVjX2ppc3gwMjEzJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nZXVjX2ppc3gwMjEzJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9ldWNfanAucHkgYi9MaWIvZW5jb2RpbmdzL2V1Y19qcC5weQppbmRleCBhMzk0N2EzLi43YmNiZTQxIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2V1Y19qcC5weQorKysgYi9MaWIvZW5jb2RpbmdzL2V1Y19qcC5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBldWNfanAucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBFVUNfSlAKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGV1Y19qcC5weSx2IDEuOCAyMDA0LzA2LzI4IDE4OjE2OjAzIHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2pwLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19qcC5nZXRjb2RlYygnZXVjX2pwJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nZXVjX2pwJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9ldWNfa3IucHkgYi9MaWIvZW5jb2RpbmdzL2V1Y19rci5weQppbmRleCBiYmViZWU4Li5jMWZiMTI2IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2V1Y19rci5weQorKysgYi9MaWIvZW5jb2RpbmdzL2V1Y19rci5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBldWNfa3IucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBFVUNfS1IKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGV1Y19rci5weSx2IDEuOCAyMDA0LzA2LzI4IDE4OjE2OjAzIHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2tyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19rci5nZXRjb2RlYygnZXVjX2tyJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nZXVjX2tyJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9nYjE4MDMwLnB5IGIvTGliL2VuY29kaW5ncy9nYjE4MDMwLnB5CmluZGV4IDdlY2EzMTkuLjM0ZmI2YzMgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvZ2IxODAzMC5weQorKysgYi9MaWIvZW5jb2RpbmdzL2diMTgwMzAucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgZ2IxODAzMC5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIEdCMTgwMzAKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGdiMTgwMzAucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19jbiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfY24uZ2V0Y29kZWMoJ2diMTgwMzAnKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdnYjE4MDMwJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9nYjIzMTIucHkgYi9MaWIvZW5jb2RpbmdzL2diMjMxMi5weQppbmRleCA1MTMwZWZhLi4zYzNiODM3IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2diMjMxMi5weQorKysgYi9MaWIvZW5jb2RpbmdzL2diMjMxMi5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBnYjIzMTIucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBHQjIzMTIKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGdiMjMxMi5weSx2IDEuOCAyMDA0LzA2LzI4IDE4OjE2OjAzIHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2NuLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19jbi5nZXRjb2RlYygnZ2IyMzEyJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nZ2IyMzEyJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9nYmsucHkgYi9MaWIvZW5jb2RpbmdzL2diay5weQppbmRleCA2Nzg1NGJjLi4xYjQ1ZGI4IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2diay5weQorKysgYi9MaWIvZW5jb2RpbmdzL2diay5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBnYmsucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBHQksKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGdiay5weSx2IDEuOCAyMDA0LzA2LzI4IDE4OjE2OjAzIHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2NuLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19jbi5nZXRjb2RlYygnZ2JrJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0nZ2JrJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9oei5weSBiL0xpYi9lbmNvZGluZ3MvaHoucHkKaW5kZXggMzk0MDg5NC4uMzgzNDQyYSAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9oei5weQorKysgYi9MaWIvZW5jb2RpbmdzL2h6LnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGh6LnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgSFoKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGh6LnB5LHYgMS44IDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfY24sIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKIAogY29kZWMgPSBfY29kZWNzX2NuLmdldGNvZGVjKCdoeicpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2h6JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9pZG5hLnB5IGIvTGliL2VuY29kaW5ncy9pZG5hLnB5CmluZGV4IDhiZGFlMzIuLmVhOTBkNjcgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvaWRuYS5weQorKysgYi9MaWIvZW5jb2RpbmdzL2lkbmEucHkKQEAgLTM1LDcgKzM1LDcgQEAKICAgICAgICAgICAgc3RyaW5ncHJlcC5pbl90YWJsZV9jNyhjKSBvciBcCiAgICAgICAgICAgIHN0cmluZ3ByZXAuaW5fdGFibGVfYzgoYykgb3IgXAogICAgICAgICAgICBzdHJpbmdwcmVwLmluX3RhYmxlX2M5KGMpOgotICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAiSW52YWxpZCBjaGFyYWN0ZXIgJXMiICUgcmVwcihjKQorICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJJbnZhbGlkIGNoYXJhY3RlciAlciIgJSBjKQogCiAgICAgIyBDaGVjayBiaWRpCiAgICAgUmFuZEFMID0gbWFwKHN0cmluZ3ByZXAuaW5fdGFibGVfZDEsIGxhYmVsKQpAQCAtNDgsMTQgKzQ4LDE0IEBACiAgICAgICAgICAgICAjIDIpIElmIGEgc3RyaW5nIGNvbnRhaW5zIGFueSBSYW5kQUxDYXQgY2hhcmFjdGVyLCB0aGUgc3RyaW5nCiAgICAgICAgICAgICAjIE1VU1QgTk9UIGNvbnRhaW4gYW55IExDYXQgY2hhcmFjdGVyLgogICAgICAgICAgICAgaWYgZmlsdGVyKHN0cmluZ3ByZXAuaW5fdGFibGVfZDIsIGxhYmVsKToKLSAgICAgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IsICJWaW9sYXRpb24gb2YgQklESSByZXF1aXJlbWVudCAyIgorICAgICAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiVmlvbGF0aW9uIG9mIEJJREkgcmVxdWlyZW1lbnQgMiIpCiAKICAgICAgICAgICAgICMgMykgSWYgYSBzdHJpbmcgY29udGFpbnMgYW55IFJhbmRBTENhdCBjaGFyYWN0ZXIsIGEKICAgICAgICAgICAgICMgUmFuZEFMQ2F0IGNoYXJhY3RlciBNVVNUIGJlIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlCiAgICAgICAgICAgICAjIHN0cmluZywgYW5kIGEgUmFuZEFMQ2F0IGNoYXJhY3RlciBNVVNUIGJlIHRoZSBsYXN0CiAgICAgICAgICAgICAjIGNoYXJhY3RlciBvZiB0aGUgc3RyaW5nLgogICAgICAgICAgICAgaWYgbm90IFJhbmRBTFswXSBvciBub3QgUmFuZEFMWy0xXToKLSAgICAgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IsICJWaW9sYXRpb24gb2YgQklESSByZXF1aXJlbWVudCAzIgorICAgICAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiVmlvbGF0aW9uIG9mIEJJREkgcmVxdWlyZW1lbnQgMyIpCiAKICAgICByZXR1cm4gbGFiZWwKIApAQCAtNzAsNyArNzAsNyBAQAogICAgICAgICAjIFNraXAgdG8gc3RlcCA4LgogICAgICAgICBpZiAwIDwgbGVuKGxhYmVsKSA8IDY0OgogICAgICAgICAgICAgcmV0dXJuIGxhYmVsCi0gICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgImxhYmVsIHRvbyBsb25nIgorICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoImxhYmVsIGVtcHR5IG9yIHRvbyBsb25nIikKIAogICAgICMgU3RlcCAyOiBuYW1lcHJlcAogICAgIGxhYmVsID0gbmFtZXByZXAobGFiZWwpCkBAIC04NSwxMSArODUsMTEgQEAKICAgICAgICAgIyBTa2lwIHRvIHN0ZXAgOC4KICAgICAgICAgaWYgMCA8IGxlbihsYWJlbCkgPCA2NDoKICAgICAgICAgICAgIHJldHVybiBsYWJlbAotICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IsICJsYWJlbCB0b28gbG9uZyIKKyAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJsYWJlbCBlbXB0eSBvciB0b28gbG9uZyIpCiAKICAgICAjIFN0ZXAgNTogQ2hlY2sgQUNFIHByZWZpeAogICAgIGlmIGxhYmVsLnN0YXJ0c3dpdGgodWFjZV9wcmVmaXgpOgotICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IsICJMYWJlbCBzdGFydHMgd2l0aCBBQ0UgcHJlZml4IgorICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoIkxhYmVsIHN0YXJ0cyB3aXRoIEFDRSBwcmVmaXgiKQogCiAgICAgIyBTdGVwIDY6IEVuY29kZSB3aXRoIFBVTllDT0RFCiAgICAgbGFiZWwgPSBsYWJlbC5lbmNvZGUoInB1bnljb2RlIikKQEAgLTEwMCw3ICsxMDAsNyBAQAogICAgICMgU3RlcCA4OiBDaGVjayBzaXplCiAgICAgaWYgMCA8IGxlbihsYWJlbCkgPCA2NDoKICAgICAgICAgcmV0dXJuIGxhYmVsCi0gICAgcmFpc2UgVW5pY29kZUVycm9yLCAibGFiZWwgdG9vIGxvbmciCisgICAgcmFpc2UgVW5pY29kZUVycm9yKCJsYWJlbCBlbXB0eSBvciB0b28gbG9uZyIpCiAKIGRlZiBUb1VuaWNvZGUobGFiZWwpOgogICAgICMgU3RlcCAxOiBDaGVjayBmb3IgQVNDSUkKQEAgLTExOSw3ICsxMTksNyBAQAogICAgICAgICB0cnk6CiAgICAgICAgICAgICBsYWJlbCA9IGxhYmVsLmVuY29kZSgiYXNjaWkiKQogICAgICAgICBleGNlcHQgVW5pY29kZUVycm9yOgotICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAiSW52YWxpZCBjaGFyYWN0ZXIgaW4gSUROIGxhYmVsIgorICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yKCJJbnZhbGlkIGNoYXJhY3RlciBpbiBJRE4gbGFiZWwiKQogICAgICMgU3RlcCAzOiBDaGVjayBmb3IgQUNFIHByZWZpeAogICAgIGlmIG5vdCBsYWJlbC5zdGFydHN3aXRoKGFjZV9wcmVmaXgpOgogICAgICAgICByZXR1cm4gdW5pY29kZShsYWJlbCwgImFzY2lpIikKQEAgLTEzNiw3ICsxMzYsNyBAQAogICAgICMgU3RlcCA3OiBDb21wYXJlIHRoZSByZXN1bHQgb2Ygc3RlcCA2IHdpdGggdGhlIG9uZSBvZiBzdGVwIDMKICAgICAjIGxhYmVsMiB3aWxsIGFscmVhZHkgYmUgaW4gbG93ZXIgY2FzZS4KICAgICBpZiBsYWJlbC5sb3dlcigpICE9IGxhYmVsMjoKLSAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAoIklETkEgZG9lcyBub3Qgcm91bmQtdHJpcCIsIGxhYmVsLCBsYWJlbDIpCisgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiSUROQSBkb2VzIG5vdCByb3VuZC10cmlwIiwgbGFiZWwsIGxhYmVsMikKIAogICAgICMgU3RlcCA4OiByZXR1cm4gdGhlIHJlc3VsdCBvZiBzdGVwIDUKICAgICByZXR1cm4gcmVzdWx0CkBAIC0xNDgsNyArMTQ4LDcgQEAKIAogICAgICAgICBpZiBlcnJvcnMgIT0gJ3N0cmljdCc6CiAgICAgICAgICAgICAjIElETkEgaXMgcXVpdGUgY2xlYXIgdGhhdCBpbXBsZW1lbnRhdGlvbnMgbXVzdCBiZSBzdHJpY3QKLSAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvciwgInVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrZXJyb3JzCisgICAgICAgICAgICByYWlzZSBVbmljb2RlRXJyb3IoInVuc3VwcG9ydGVkIGVycm9yIGhhbmRsaW5nICIrZXJyb3JzKQogCiAgICAgICAgIGlmIG5vdCBpbnB1dDoKICAgICAgICAgICAgIHJldHVybiAiIiwgMApAQCAtMTY4LDcgKzE2OCw3IEBACiAgICAgZGVmIGRlY29kZShzZWxmLGlucHV0LGVycm9ycz0nc3RyaWN0Jyk6CiAKICAgICAgICAgaWYgZXJyb3JzICE9ICdzdHJpY3QnOgotICAgICAgICAgICAgcmFpc2UgVW5pY29kZUVycm9yLCAiVW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgIitlcnJvcnMKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiVW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgIitlcnJvcnMpCiAKICAgICAgICAgaWYgbm90IGlucHV0OgogICAgICAgICAgICAgcmV0dXJuIHUiIiwgMApAQCAtMTk0LDEzICsxOTQsNzkgQEAKIAogICAgICAgICByZXR1cm4gdSIuIi5qb2luKHJlc3VsdCkrdHJhaWxpbmdfZG90LCBsZW4oaW5wdXQpCiAKLWNsYXNzIEluY3JlbWVudGFsRW5jb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKLSAgICBkZWYgZW5jb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBDb2RlYygpLmVuY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIoY29kZWNzLkJ1ZmZlcmVkSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBkZWYgX2J1ZmZlcl9lbmNvZGUoc2VsZiwgaW5wdXQsIGVycm9ycywgZmluYWwpOgorICAgICAgICBpZiBlcnJvcnMgIT0gJ3N0cmljdCc6CisgICAgICAgICAgICAjIElETkEgaXMgcXVpdGUgY2xlYXIgdGhhdCBpbXBsZW1lbnRhdGlvbnMgbXVzdCBiZSBzdHJpY3QKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigidW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgIitlcnJvcnMpCiAKLWNsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKLSAgICBkZWYgZGVjb2RlKHNlbGYsIGlucHV0LCBmaW5hbD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBDb2RlYygpLmRlY29kZShpbnB1dCwgc2VsZi5lcnJvcnMpWzBdCisgICAgICAgIGlmIG5vdCBpbnB1dDoKKyAgICAgICAgICAgIHJldHVybiAoIiIsIDApCisKKyAgICAgICAgbGFiZWxzID0gZG90cy5zcGxpdChpbnB1dCkKKyAgICAgICAgdHJhaWxpbmdfZG90ID0gdScnCisgICAgICAgIGlmIGxhYmVsczoKKyAgICAgICAgICAgIGlmIG5vdCBsYWJlbHNbLTFdOgorICAgICAgICAgICAgICAgIHRyYWlsaW5nX2RvdCA9ICcuJworICAgICAgICAgICAgICAgIGRlbCBsYWJlbHNbLTFdCisgICAgICAgICAgICBlbGlmIG5vdCBmaW5hbDoKKyAgICAgICAgICAgICAgICAjIEtlZXAgcG90ZW50aWFsbHkgdW5maW5pc2hlZCBsYWJlbCB1bnRpbCB0aGUgbmV4dCBjYWxsCisgICAgICAgICAgICAgICAgZGVsIGxhYmVsc1stMV0KKyAgICAgICAgICAgICAgICBpZiBsYWJlbHM6CisgICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nX2RvdCA9ICcuJworCisgICAgICAgIHJlc3VsdCA9IFtdCisgICAgICAgIHNpemUgPSAwCisgICAgICAgIGZvciBsYWJlbCBpbiBsYWJlbHM6CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKFRvQVNDSUkobGFiZWwpKQorICAgICAgICAgICAgaWYgc2l6ZToKKyAgICAgICAgICAgICAgICBzaXplICs9IDEKKyAgICAgICAgICAgIHNpemUgKz0gbGVuKGxhYmVsKQorCisgICAgICAgICMgSm9pbiB3aXRoIFUrMDAyRQorICAgICAgICByZXN1bHQgPSAiLiIuam9pbihyZXN1bHQpICsgdHJhaWxpbmdfZG90CisgICAgICAgIHNpemUgKz0gbGVuKHRyYWlsaW5nX2RvdCkKKyAgICAgICAgcmV0dXJuIChyZXN1bHQsIHNpemUpCisKK2NsYXNzIEluY3JlbWVudGFsRGVjb2Rlcihjb2RlY3MuQnVmZmVyZWRJbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGRlZiBfYnVmZmVyX2RlY29kZShzZWxmLCBpbnB1dCwgZXJyb3JzLCBmaW5hbCk6CisgICAgICAgIGlmIGVycm9ycyAhPSAnc3RyaWN0JzoKKyAgICAgICAgICAgIHJhaXNlIFVuaWNvZGVFcnJvcigiVW5zdXBwb3J0ZWQgZXJyb3IgaGFuZGxpbmcgIitlcnJvcnMpCisKKyAgICAgICAgaWYgbm90IGlucHV0OgorICAgICAgICAgICAgcmV0dXJuICh1IiIsIDApCisKKyAgICAgICAgIyBJRE5BIGFsbG93cyBkZWNvZGluZyB0byBvcGVyYXRlIG9uIFVuaWNvZGUgc3RyaW5ncywgdG9vLgorICAgICAgICBpZiBpc2luc3RhbmNlKGlucHV0LCB1bmljb2RlKToKKyAgICAgICAgICAgIGxhYmVscyA9IGRvdHMuc3BsaXQoaW5wdXQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIE11c3QgYmUgQVNDSUkgc3RyaW5nCisgICAgICAgICAgICBpbnB1dCA9IHN0cihpbnB1dCkKKyAgICAgICAgICAgIHVuaWNvZGUoaW5wdXQsICJhc2NpaSIpCisgICAgICAgICAgICBsYWJlbHMgPSBpbnB1dC5zcGxpdCgiLiIpCisKKyAgICAgICAgdHJhaWxpbmdfZG90ID0gdScnCisgICAgICAgIGlmIGxhYmVsczoKKyAgICAgICAgICAgIGlmIG5vdCBsYWJlbHNbLTFdOgorICAgICAgICAgICAgICAgIHRyYWlsaW5nX2RvdCA9IHUnLicKKyAgICAgICAgICAgICAgICBkZWwgbGFiZWxzWy0xXQorICAgICAgICAgICAgZWxpZiBub3QgZmluYWw6CisgICAgICAgICAgICAgICAgIyBLZWVwIHBvdGVudGlhbGx5IHVuZmluaXNoZWQgbGFiZWwgdW50aWwgdGhlIG5leHQgY2FsbAorICAgICAgICAgICAgICAgIGRlbCBsYWJlbHNbLTFdCisgICAgICAgICAgICAgICAgaWYgbGFiZWxzOgorICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ19kb3QgPSB1Jy4nCisKKyAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgc2l6ZSA9IDAKKyAgICAgICAgZm9yIGxhYmVsIGluIGxhYmVsczoKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoVG9Vbmljb2RlKGxhYmVsKSkKKyAgICAgICAgICAgIGlmIHNpemU6CisgICAgICAgICAgICAgICAgc2l6ZSArPSAxCisgICAgICAgICAgICBzaXplICs9IGxlbihsYWJlbCkKKworICAgICAgICByZXN1bHQgPSB1Ii4iLmpvaW4ocmVzdWx0KSArIHRyYWlsaW5nX2RvdAorICAgICAgICBzaXplICs9IGxlbih0cmFpbGluZ19kb3QpCisgICAgICAgIHJldHVybiAocmVzdWx0LCBzaXplKQogCiBjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsY29kZWNzLlN0cmVhbVdyaXRlcik6CiAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwLnB5IGIvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwLnB5CmluZGV4IDEwOTY1OGIuLmFiMDQwNjAgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcC5weQorKysgYi9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanAucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgaXNvMjAyMl9qcC5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIElTTzIwMjJfSlAKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGlzbzIwMjJfanAucHksdiAxLjIgMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19pc28yMDIyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19pc28yMDIyLmdldGNvZGVjKCdpc28yMDIyX2pwJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvMjAyMl9qcCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8xLnB5IGIvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwXzEucHkKaW5kZXggMjAxYmQyOC4uOTk3MDQ0ZCAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwXzEucHkKKysrIGIvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwXzEucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgaXNvMjAyMl9qcF8xLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgSVNPMjAyMl9KUF8xCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBpc28yMDIyX2pwXzEucHksdiAxLjIgMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19pc28yMDIyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19pc28yMDIyLmdldGNvZGVjKCdpc28yMDIyX2pwXzEnKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc28yMDIyX2pwXzEnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfMi5weSBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8yLnB5CmluZGV4IDdhNjEwMTguLjkxMDZiZjcgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8yLnB5CisrKyBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8yLnB5CkBAIC0yLDEwICsyLDEwIEBACiAjIGlzbzIwMjJfanBfMi5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIElTTzIwMjJfSlBfMgogIwogIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KLSMgJENKS0NvZGVjczogaXNvMjAyMl9qcF8yLnB5LHYgMS4yIDIwMDQvMDYvMjggMTg6MTY6MDMgcGVya3kgRXhwICQKICMKIAogaW1wb3J0IF9jb2RlY3NfaXNvMjAyMiwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfaXNvMjAyMi5nZXRjb2RlYygnaXNvMjAyMl9qcF8yJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvMjAyMl9qcF8yJywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwXzIwMDQucHkgYi9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfMjAwNC5weQppbmRleCAyNDk3MTI0Li40MDE5OGJmIDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfMjAwNC5weQorKysgYi9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfMjAwNC5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBpc28yMDIyX2pwXzIwMDQucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBJU08yMDIyX0pQXzIwMDQKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGlzbzIwMjJfanBfMjAwNC5weSx2IDEuMSAyMDA0LzA3LzA3IDE2OjE4OjI1IHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2lzbzIwMjIsIGNvZGVjcworaW1wb3J0IF9tdWx0aWJ5dGVjb2RlYyBhcyBtYmMKIAogY29kZWMgPSBfY29kZWNzX2lzbzIwMjIuZ2V0Y29kZWMoJ2lzbzIwMjJfanBfMjAwNCcpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzIwMjJfanBfMjAwNCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF8zLnB5IGIvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwXzMucHkKaW5kZXggOGIyZWQwMC4uMzQ2ZTA4YiAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwXzMucHkKKysrIGIvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwXzMucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgaXNvMjAyMl9qcF8zLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgSVNPMjAyMl9KUF8zCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBpc28yMDIyX2pwXzMucHksdiAxLjIgMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19pc28yMDIyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19pc28yMDIyLmdldGNvZGVjKCdpc28yMDIyX2pwXzMnKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdpc28yMDIyX2pwXzMnLAorICAgICAgICBlbmNvZGU9Q29kZWMoKS5lbmNvZGUsCisgICAgICAgIGRlY29kZT1Db2RlYygpLmRlY29kZSwKKyAgICAgICAgaW5jcmVtZW50YWxlbmNvZGVyPUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgaW5jcmVtZW50YWxkZWNvZGVyPUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgc3RyZWFtcmVhZGVyPVN0cmVhbVJlYWRlciwKKyAgICAgICAgc3RyZWFtd3JpdGVyPVN0cmVhbVdyaXRlciwKKyAgICApCmRpZmYgLS1naXQgYS9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfZXh0LnB5IGIvTGliL2VuY29kaW5ncy9pc28yMDIyX2pwX2V4dC5weQppbmRleCA5N2NiNGU3Li43NTJiYWI5IDEwMDY0NAotLS0gYS9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfanBfZXh0LnB5CisrKyBiL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9qcF9leHQucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgaXNvMjAyMl9qcF9leHQucHk6IFB5dGhvbiBVbmljb2RlIENvZGVjIGZvciBJU08yMDIyX0pQX0VYVAogIwogIyBXcml0dGVuIGJ5IEh5ZS1TaGlrIENoYW5nIDxwZXJreUBGcmVlQlNELm9yZz4KLSMgJENKS0NvZGVjczogaXNvMjAyMl9qcF9leHQucHksdiAxLjIgMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19pc28yMDIyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19pc28yMDIyLmdldGNvZGVjKCdpc28yMDIyX2pwX2V4dCcpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J2lzbzIwMjJfanBfZXh0JywKKyAgICAgICAgZW5jb2RlPUNvZGVjKCkuZW5jb2RlLAorICAgICAgICBkZWNvZGU9Q29kZWMoKS5kZWNvZGUsCisgICAgICAgIGluY3JlbWVudGFsZW5jb2Rlcj1JbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgIGluY3JlbWVudGFsZGVjb2Rlcj1JbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgIHN0cmVhbXJlYWRlcj1TdHJlYW1SZWFkZXIsCisgICAgICAgIHN0cmVhbXdyaXRlcj1TdHJlYW1Xcml0ZXIsCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL2VuY29kaW5ncy9pc28yMDIyX2tyLnB5IGIvTGliL2VuY29kaW5ncy9pc28yMDIyX2tyLnB5CmluZGV4IGY1NTQ5Y2EuLmJmNzAxODcgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3MvaXNvMjAyMl9rci5weQorKysgYi9MaWIvZW5jb2RpbmdzL2lzbzIwMjJfa3IucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgaXNvMjAyMl9rci5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIElTTzIwMjJfS1IKICMKICMgV3JpdHRlbiBieSBIeWUtU2hpayBDaGFuZyA8cGVya3lARnJlZUJTRC5vcmc+Ci0jICRDSktDb2RlY3M6IGlzbzIwMjJfa3IucHksdiAxLjIgMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19pc28yMDIyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19pc28yMDIyLmdldGNvZGVjKCdpc28yMDIyX2tyJykKIApAQCAtMTMsMjIgKzEzLDI3IEBACiAgICAgZW5jb2RlID0gY29kZWMuZW5jb2RlCiAgICAgZGVjb2RlID0gY29kZWMuZGVjb2RlCiAKLWNsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgY29kZWNzLlN0cmVhbVJlYWRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVJlYWRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVJlYWRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi5yZWFkID0gX19jb2RlYy5yZWFkCi0gICAgICAgIHNlbGYucmVhZGxpbmUgPSBfX2NvZGVjLnJlYWRsaW5lCi0gICAgICAgIHNlbGYucmVhZGxpbmVzID0gX19jb2RlYy5yZWFkbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRW5jb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbEVuY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAotY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtV3JpdGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtV3JpdGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLndyaXRlID0gX19jb2RlYy53cml0ZQotICAgICAgICBzZWxmLndyaXRlbGluZXMgPSBfX2NvZGVjLndyaXRlbGluZXMKLSAgICAgICAgc2VsZi5yZXNldCA9IF9fY29kZWMucmVzZXQKK2NsYXNzIEluY3JlbWVudGFsRGVjb2RlcihtYmMuTXVsdGlieXRlSW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjcy5JbmNyZW1lbnRhbERlY29kZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtUmVhZGVyLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVdyaXRlciwgY29kZWNzLlN0cmVhbVdyaXRlcik6CisgICAgY29kZWMgPSBjb2RlYwogCiBkZWYgZ2V0cmVnZW50cnkoKToKLSAgICByZXR1cm4gKGNvZGVjLmVuY29kZSwgY29kZWMuZGVjb2RlLCBTdHJlYW1SZWFkZXIsIFN0cmVhbVdyaXRlcikKKyAgICByZXR1cm4gY29kZWNzLkNvZGVjSW5mbygKKyAgICAgICAgbmFtZT0naXNvMjAyMl9rcicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3Mvam9oYWIucHkgYi9MaWIvZW5jb2RpbmdzL2pvaGFiLnB5CmluZGV4IGI2YTg3ZDcuLjUxMmFlZWIgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3Mvam9oYWIucHkKKysrIGIvTGliL2VuY29kaW5ncy9qb2hhYi5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBqb2hhYi5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIEpPSEFCCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBqb2hhYi5weSx2IDEuOCAyMDA0LzA2LzI4IDE4OjE2OjAzIHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2tyLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19rci5nZXRjb2RlYygnam9oYWInKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdqb2hhYicsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3Mvc2hpZnRfamlzLnB5IGIvTGliL2VuY29kaW5ncy9zaGlmdF9qaXMucHkKaW5kZXggZWM1ZTUxNy4uODMzODExNyAxMDA2NDQKLS0tIGEvTGliL2VuY29kaW5ncy9zaGlmdF9qaXMucHkKKysrIGIvTGliL2VuY29kaW5ncy9zaGlmdF9qaXMucHkKQEAgLTIsMTAgKzIsMTAgQEAKICMgc2hpZnRfamlzLnB5OiBQeXRob24gVW5pY29kZSBDb2RlYyBmb3IgU0hJRlRfSklTCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBzaGlmdF9qaXMucHksdiAxLjggMjAwNC8wNi8yOCAxODoxNjowMyBwZXJreSBFeHAgJAogIwogCiBpbXBvcnQgX2NvZGVjc19qcCwgY29kZWNzCitpbXBvcnQgX211bHRpYnl0ZWNvZGVjIGFzIG1iYwogCiBjb2RlYyA9IF9jb2RlY3NfanAuZ2V0Y29kZWMoJ3NoaWZ0X2ppcycpCiAKQEAgLTEzLDIyICsxMywyNyBAQAogICAgIGVuY29kZSA9IGNvZGVjLmVuY29kZQogICAgIGRlY29kZSA9IGNvZGVjLmRlY29kZQogCi1jbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1SZWFkZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1SZWFkZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYucmVhZCA9IF9fY29kZWMucmVhZAotICAgICAgICBzZWxmLnJlYWRsaW5lID0gX19jb2RlYy5yZWFkbGluZQotICAgICAgICBzZWxmLnJlYWRsaW5lcyA9IF9fY29kZWMucmVhZGxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbEVuY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxFbmNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKLWNsYXNzIFN0cmVhbVdyaXRlcihDb2RlYywgY29kZWNzLlN0cmVhbVdyaXRlcik6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzPSdzdHJpY3QnKToKLSAgICAgICAgY29kZWNzLlN0cmVhbVdyaXRlci5fX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycykKLSAgICAgICAgX19jb2RlYyA9IGNvZGVjLlN0cmVhbVdyaXRlcihzdHJlYW0sIGVycm9ycykKLSAgICAgICAgc2VsZi53cml0ZSA9IF9fY29kZWMud3JpdGUKLSAgICAgICAgc2VsZi53cml0ZWxpbmVzID0gX19jb2RlYy53cml0ZWxpbmVzCi0gICAgICAgIHNlbGYucmVzZXQgPSBfX2NvZGVjLnJlc2V0CitjbGFzcyBJbmNyZW1lbnRhbERlY29kZXIobWJjLk11bHRpYnl0ZUluY3JlbWVudGFsRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY3MuSW5jcmVtZW50YWxEZWNvZGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCisKK2NsYXNzIFN0cmVhbVJlYWRlcihDb2RlYywgbWJjLk11bHRpYnl0ZVN0cmVhbVJlYWRlciwgY29kZWNzLlN0cmVhbVJlYWRlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1Xcml0ZXIsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgorICAgIGNvZGVjID0gY29kZWMKIAogZGVmIGdldHJlZ2VudHJ5KCk6Ci0gICAgcmV0dXJuIChjb2RlYy5lbmNvZGUsIGNvZGVjLmRlY29kZSwgU3RyZWFtUmVhZGVyLCBTdHJlYW1Xcml0ZXIpCisgICAgcmV0dXJuIGNvZGVjcy5Db2RlY0luZm8oCisgICAgICAgIG5hbWU9J3NoaWZ0X2ppcycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3Mvc2hpZnRfamlzXzIwMDQucHkgYi9MaWIvZW5jb2RpbmdzL3NoaWZ0X2ppc18yMDA0LnB5CmluZGV4IDQ0NmNkN2MuLjE2MWIxZTggMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3Mvc2hpZnRfamlzXzIwMDQucHkKKysrIGIvTGliL2VuY29kaW5ncy9zaGlmdF9qaXNfMjAwNC5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBzaGlmdF9qaXNfMjAwNC5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIFNISUZUX0pJU18yMDA0CiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBzaGlmdF9qaXNfMjAwNC5weSx2IDEuMSAyMDA0LzA3LzA3IDE2OjE4OjI1IHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2pwLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19qcC5nZXRjb2RlYygnc2hpZnRfamlzXzIwMDQnKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdzaGlmdF9qaXNfMjAwNCcsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9lbmNvZGluZ3Mvc2hpZnRfamlzeDAyMTMucHkgYi9MaWIvZW5jb2RpbmdzL3NoaWZ0X2ppc3gwMjEzLnB5CmluZGV4IDQ5NTQ2OGIuLmNiNjUzZjUgMTAwNjQ0Ci0tLSBhL0xpYi9lbmNvZGluZ3Mvc2hpZnRfamlzeDAyMTMucHkKKysrIGIvTGliL2VuY29kaW5ncy9zaGlmdF9qaXN4MDIxMy5weQpAQCAtMiwxMCArMiwxMCBAQAogIyBzaGlmdF9qaXN4MDIxMy5weTogUHl0aG9uIFVuaWNvZGUgQ29kZWMgZm9yIFNISUZUX0pJU1gwMjEzCiAjCiAjIFdyaXR0ZW4gYnkgSHllLVNoaWsgQ2hhbmcgPHBlcmt5QEZyZWVCU0Qub3JnPgotIyAkQ0pLQ29kZWNzOiBzaGlmdF9qaXN4MDIxMy5weSx2IDEuOCAyMDA0LzA2LzI4IDE4OjE2OjAzIHBlcmt5IEV4cCAkCiAjCiAKIGltcG9ydCBfY29kZWNzX2pwLCBjb2RlY3MKK2ltcG9ydCBfbXVsdGlieXRlY29kZWMgYXMgbWJjCiAKIGNvZGVjID0gX2NvZGVjc19qcC5nZXRjb2RlYygnc2hpZnRfamlzeDAyMTMnKQogCkBAIC0xMywyMiArMTMsMjcgQEAKICAgICBlbmNvZGUgPSBjb2RlYy5lbmNvZGUKICAgICBkZWNvZGUgPSBjb2RlYy5kZWNvZGUKIAotY2xhc3MgU3RyZWFtUmVhZGVyKENvZGVjLCBjb2RlY3MuU3RyZWFtUmVhZGVyKToKLSAgICBkZWYgX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnM9J3N0cmljdCcpOgotICAgICAgICBjb2RlY3MuU3RyZWFtUmVhZGVyLl9faW5pdF9fKHNlbGYsIHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBfX2NvZGVjID0gY29kZWMuU3RyZWFtUmVhZGVyKHN0cmVhbSwgZXJyb3JzKQotICAgICAgICBzZWxmLnJlYWQgPSBfX2NvZGVjLnJlYWQKLSAgICAgICAgc2VsZi5yZWFkbGluZSA9IF9fY29kZWMucmVhZGxpbmUKLSAgICAgICAgc2VsZi5yZWFkbGluZXMgPSBfX2NvZGVjLnJlYWRsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxFbmNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbEVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRW5jb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYwogCi1jbGFzcyBTdHJlYW1Xcml0ZXIoQ29kZWMsIGNvZGVjcy5TdHJlYW1Xcml0ZXIpOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzdHJlYW0sIGVycm9ycz0nc3RyaWN0Jyk6Ci0gICAgICAgIGNvZGVjcy5TdHJlYW1Xcml0ZXIuX19pbml0X18oc2VsZiwgc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIF9fY29kZWMgPSBjb2RlYy5TdHJlYW1Xcml0ZXIoc3RyZWFtLCBlcnJvcnMpCi0gICAgICAgIHNlbGYud3JpdGUgPSBfX2NvZGVjLndyaXRlCi0gICAgICAgIHNlbGYud3JpdGVsaW5lcyA9IF9fY29kZWMud3JpdGVsaW5lcwotICAgICAgICBzZWxmLnJlc2V0ID0gX19jb2RlYy5yZXNldAorY2xhc3MgSW5jcmVtZW50YWxEZWNvZGVyKG1iYy5NdWx0aWJ5dGVJbmNyZW1lbnRhbERlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNzLkluY3JlbWVudGFsRGVjb2Rlcik6CisgICAgY29kZWMgPSBjb2RlYworCitjbGFzcyBTdHJlYW1SZWFkZXIoQ29kZWMsIG1iYy5NdWx0aWJ5dGVTdHJlYW1SZWFkZXIsIGNvZGVjcy5TdHJlYW1SZWFkZXIpOgorICAgIGNvZGVjID0gY29kZWMKKworY2xhc3MgU3RyZWFtV3JpdGVyKENvZGVjLCBtYmMuTXVsdGlieXRlU3RyZWFtV3JpdGVyLCBjb2RlY3MuU3RyZWFtV3JpdGVyKToKKyAgICBjb2RlYyA9IGNvZGVjCiAKIGRlZiBnZXRyZWdlbnRyeSgpOgotICAgIHJldHVybiAoY29kZWMuZW5jb2RlLCBjb2RlYy5kZWNvZGUsIFN0cmVhbVJlYWRlciwgU3RyZWFtV3JpdGVyKQorICAgIHJldHVybiBjb2RlY3MuQ29kZWNJbmZvKAorICAgICAgICBuYW1lPSdzaGlmdF9qaXN4MDIxMycsCisgICAgICAgIGVuY29kZT1Db2RlYygpLmVuY29kZSwKKyAgICAgICAgZGVjb2RlPUNvZGVjKCkuZGVjb2RlLAorICAgICAgICBpbmNyZW1lbnRhbGVuY29kZXI9SW5jcmVtZW50YWxFbmNvZGVyLAorICAgICAgICBpbmNyZW1lbnRhbGRlY29kZXI9SW5jcmVtZW50YWxEZWNvZGVyLAorICAgICAgICBzdHJlYW1yZWFkZXI9U3RyZWFtUmVhZGVyLAorICAgICAgICBzdHJlYW13cml0ZXI9U3RyZWFtV3JpdGVyLAorICAgICkKZGlmZiAtLWdpdCBhL0xpYi9nZXRwYXNzLnB5IGIvTGliL2dldHBhc3MucHkKaW5kZXggYTMwZDNhMS4uODIwNGE0NyAxMDA2NDQKLS0tIGEvTGliL2dldHBhc3MucHkKKysrIGIvTGliL2dldHBhc3MucHkKQEAgLTE1LDExICsxNSwxNCBAQAogCiBfX2FsbF9fID0gWyJnZXRwYXNzIiwiZ2V0dXNlciJdCiAKLWRlZiB1bml4X2dldHBhc3MocHJvbXB0PSdQYXNzd29yZDogJyk6CitkZWYgdW5peF9nZXRwYXNzKHByb21wdD0nUGFzc3dvcmQ6ICcsIHN0cmVhbT1Ob25lKToKICAgICAiIiJQcm9tcHQgZm9yIGEgcGFzc3dvcmQsIHdpdGggZWNobyB0dXJuZWQgb2ZmLgorICAgIFRoZSBwcm9tcHQgaXMgd3JpdHRlbiBvbiBzdHJlYW0sIGJ5IGRlZmF1bHQgc3Rkb3V0LgogCiAgICAgUmVzdG9yZSB0ZXJtaW5hbCBzZXR0aW5ncyBhdCBlbmQuCiAgICAgIiIiCisgICAgaWYgc3RyZWFtIGlzIE5vbmU6CisgICAgICAgIHN0cmVhbSA9IHN5cy5zdGRvdXQKIAogICAgIHRyeToKICAgICAgICAgZmQgPSBzeXMuc3RkaW4uZmlsZW5vKCkKQEAgLTMyLDE4ICszNSwxOCBAQAogICAgIG5ld1szXSA9IG5ld1szXSAmIH50ZXJtaW9zLkVDSE8gIyAzID09ICdsZmxhZ3MnCiAgICAgdHJ5OgogICAgICAgICB0ZXJtaW9zLnRjc2V0YXR0cihmZCwgdGVybWlvcy5UQ1NBRFJBSU4sIG5ldykKLSAgICAgICAgcGFzc3dkID0gX3Jhd19pbnB1dChwcm9tcHQpCisgICAgICAgIHBhc3N3ZCA9IF9yYXdfaW5wdXQocHJvbXB0LCBzdHJlYW0pCiAgICAgZmluYWxseToKICAgICAgICAgdGVybWlvcy50Y3NldGF0dHIoZmQsIHRlcm1pb3MuVENTQURSQUlOLCBvbGQpCiAKLSAgICBzeXMuc3Rkb3V0LndyaXRlKCdcbicpCisgICAgc3RyZWFtLndyaXRlKCdcbicpCiAgICAgcmV0dXJuIHBhc3N3ZAogCiAKLWRlZiB3aW5fZ2V0cGFzcyhwcm9tcHQ9J1Bhc3N3b3JkOiAnKToKK2RlZiB3aW5fZ2V0cGFzcyhwcm9tcHQ9J1Bhc3N3b3JkOiAnLCBzdHJlYW09Tm9uZSk6CiAgICAgIiIiUHJvbXB0IGZvciBwYXNzd29yZCB3aXRoIGVjaG8gb2ZmLCB1c2luZyBXaW5kb3dzIGdldGNoKCkuIiIiCiAgICAgaWYgc3lzLnN0ZGluIGlzIG5vdCBzeXMuX19zdGRpbl9fOgotICAgICAgICByZXR1cm4gZGVmYXVsdF9nZXRwYXNzKHByb21wdCkKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRfZ2V0cGFzcyhwcm9tcHQsIHN0cmVhbSkKICAgICBpbXBvcnQgbXN2Y3J0CiAgICAgZm9yIGMgaW4gcHJvbXB0OgogICAgICAgICBtc3ZjcnQucHV0Y2goYykKQEAgLTYzLDE2ICs2NiwxOCBAQAogICAgIHJldHVybiBwdwogCiAKLWRlZiBkZWZhdWx0X2dldHBhc3MocHJvbXB0PSdQYXNzd29yZDogJyk6Ci0gICAgcHJpbnQgIldhcm5pbmc6IFByb2JsZW0gd2l0aCBnZXRwYXNzLiBQYXNzd29yZHMgbWF5IGJlIGVjaG9lZC4iCi0gICAgcmV0dXJuIF9yYXdfaW5wdXQocHJvbXB0KQorZGVmIGRlZmF1bHRfZ2V0cGFzcyhwcm9tcHQ9J1Bhc3N3b3JkOiAnLCBzdHJlYW09Tm9uZSk6CisgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAiV2FybmluZzogUHJvYmxlbSB3aXRoIGdldHBhc3MuIFBhc3N3b3JkcyBtYXkgYmUgZWNob2VkLiIKKyAgICByZXR1cm4gX3Jhd19pbnB1dChwcm9tcHQsIHN0cmVhbSkKIAogCi1kZWYgX3Jhd19pbnB1dChwcm9tcHQ9IiIpOgorZGVmIF9yYXdfaW5wdXQocHJvbXB0PSIiLCBzdHJlYW09Tm9uZSk6CiAgICAgIyBUaGlzIGRvZXNuJ3Qgc2F2ZSB0aGUgc3RyaW5nIGluIHRoZSBHTlUgcmVhZGxpbmUgaGlzdG9yeS4KKyAgICBpZiBzdHJlYW0gaXMgTm9uZToKKyAgICAgICAgc3RyZWFtID0gc3lzLnN0ZG91dAogICAgIHByb21wdCA9IHN0cihwcm9tcHQpCiAgICAgaWYgcHJvbXB0OgotICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHByb21wdCkKKyAgICAgICAgc3RyZWFtLndyaXRlKHByb21wdCkKICAgICBsaW5lID0gc3lzLnN0ZGluLnJlYWRsaW5lKCkKICAgICBpZiBub3QgbGluZToKICAgICAgICAgcmFpc2UgRU9GRXJyb3IKZGlmZiAtLWdpdCBhL0xpYi9nbG9iLnB5IGIvTGliL2dsb2IucHkKaW5kZXggZWNjNmQyNS4uOTU2NTZjYyAxMDA2NDQKLS0tIGEvTGliL2dsb2IucHkKKysrIGIvTGliL2dsb2IucHkKQEAgLTYwLDcgKzYwLDcgQEAKICAgICBpZiBiYXNlbmFtZSA9PSAnJzoKICAgICAgICAgIyBgb3MucGF0aC5zcGxpdCgpYCByZXR1cm5zIGFuIGVtcHR5IGJhc2VuYW1lIGZvciBwYXRocyBlbmRpbmcgd2l0aCBhCiAgICAgICAgICMgZGlyZWN0b3J5IHNlcGFyYXRvci4gICdxKngvJyBzaG91bGQgbWF0Y2ggb25seSBkaXJlY3Rvcmllcy4KLSAgICAgICAgaWYgb3MuaXNkaXIoZGlybmFtZSk6CisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlybmFtZSk6CiAgICAgICAgICAgICByZXR1cm4gW2Jhc2VuYW1lXQogICAgIGVsc2U6CiAgICAgICAgIGlmIG9zLnBhdGgubGV4aXN0cyhvcy5wYXRoLmpvaW4oZGlybmFtZSwgYmFzZW5hbWUpKToKZGlmZiAtLWdpdCBhL0xpYi9pZGxlbGliL0lPQmluZGluZy5weSBiL0xpYi9pZGxlbGliL0lPQmluZGluZy5weQppbmRleCBjZTFmZDJhLi5kZWViNWM1IDEwMDY0NAotLS0gYS9MaWIvaWRsZWxpYi9JT0JpbmRpbmcucHkKKysrIGIvTGliL2lkbGVsaWIvSU9CaW5kaW5nLnB5CkBAIC0zNzcsNiArMzc3LDcgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICJ3YiIpCiAgICAgICAgICAgICBmLndyaXRlKGNoYXJzKQorICAgICAgICAgICAgZi5mbHVzaCgpCiAgICAgICAgICAgICBmLmNsb3NlKCkKICAgICAgICAgICAgIHJldHVybiBUcnVlCiAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBtc2c6CmRpZmYgLS1naXQgYS9MaWIvaWRsZWxpYi9ORVdTLnR4dCBiL0xpYi9pZGxlbGliL05FV1MudHh0CmluZGV4IGJiZTk4NzguLjgxNjMzMzAgMTAwNjQ0Ci0tLSBhL0xpYi9pZGxlbGliL05FV1MudHh0CisrKyBiL0xpYi9pZGxlbGliL05FV1MudHh0CkBAIC0xLDcgKzEsMTAgQEAKLVdoYXQncyBOZXcgaW4gSURMRSAxLjJhMD8KLT09PT09PT09PT09PT09PT09PT09PT09CitXaGF0J3MgTmV3IGluIElETEUgMS4yYTE/Cis9PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSpSZWxlYXNlIGRhdGU6IFhYLVhYWC0yMDA2KgorKlJlbGVhc2UgZGF0ZTogMDUtQVBSLTIwMDYqCisKKy0gU291cmNlIGZpbGUgZi5mbHVzaCgpIGFmdGVyIHdyaXRpbmc7IHRyeWluZyB0byBhdm9pZCBsb3NzYWdlIGlmIHVzZXIKKyAga2lsbHMgR1VJLgogCiAtIE9wdGlvbnMgLyBLZXlzIC8gQWR2YW5jZWQgZGlhbG9nIG1hZGUgZnVuY3Rpb25hbC4gIEFsc28sIGFsbG93IGJpbmRpbmcKICAgb2YgJ21vdmVtZW50JyBrZXlzLgpAQCAtNzAsNyArNzMsNyBAQAogCiAtIEltcHJvdmUgZXJyb3IgaGFuZGxpbmcgd2hlbiAuaWRsZXJjIGNhbid0IGJlIGNyZWF0ZWQgKHdhcm4gYW5kIGV4aXQpLgogCi0tIFRoZSBHVUkgd2FzIGhhbmdpbmcgaWYgdGhlIHNoZWxsIHdpbmRvdyB3YXMgY2xvc2VkIHdoaWxlIGEgcmF3X2lucHV0KCkgCistIFRoZSBHVUkgd2FzIGhhbmdpbmcgaWYgdGhlIHNoZWxsIHdpbmRvdyB3YXMgY2xvc2VkIHdoaWxlIGEgcmF3X2lucHV0KCkKICAgd2FzIHBlbmRpbmcuICBSZXN0b3JlZCB0aGUgcXVpdCgpIG9mIHRoZSByZWFkbGluZSgpIG1haW5sb29wKCkuCiAgIGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL2lkbGUtZGV2LzIwMDQtRGVjZW1iZXIvMDAyMzA3Lmh0bWwKIApkaWZmIC0tZ2l0IGEvTGliL2lkbGVsaWIvaWRsZXZlci5weSBiL0xpYi9pZGxlbGliL2lkbGV2ZXIucHkKaW5kZXggZWVmMjg4NS4uZmJkZTU2YyAxMDA2NDQKLS0tIGEvTGliL2lkbGVsaWIvaWRsZXZlci5weQorKysgYi9MaWIvaWRsZWxpYi9pZGxldmVyLnB5CkBAIC0xICsxIEBACi1JRExFX1ZFUlNJT04gPSAiMS4yYTAiCitJRExFX1ZFUlNJT04gPSAiMS4yYTEiCmRpZmYgLS1naXQgYS9MaWIvaW5zcGVjdC5weSBiL0xpYi9pbnNwZWN0LnB5CmluZGV4IDU3YmYxOGMuLjJlNGQ5ODcgMTAwNjQ0Ci0tLSBhL0xpYi9pbnNwZWN0LnB5CisrKyBiL0xpYi9pbnNwZWN0LnB5CkBAIC0zNTMsNyArMzUzLDcgQEAKICAgICAgICAgaWYgJ2InIGluIG1vZGUgYW5kIHN0cmluZy5sb3dlcihmaWxlbmFtZVstbGVuKHN1ZmZpeCk6XSkgPT0gc3VmZml4OgogICAgICAgICAgICAgIyBMb29rcyBsaWtlIGEgYmluYXJ5IGZpbGUuICBXZSB3YW50IHRvIG9ubHkgcmV0dXJuIGEgdGV4dCBmaWxlLgogICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CisgICAgaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpIG9yIGhhc2F0dHIoZ2V0bW9kdWxlKG9iamVjdCksICdfX2xvYWRlcl9fJyk6CiAgICAgICAgIHJldHVybiBmaWxlbmFtZQogCiBkZWYgZ2V0YWJzZmlsZShvYmplY3QpOgpAQCAtMzc5LDcgKzM3OSw3IEBACiAgICAgaWYgZmlsZSBpbiBtb2R1bGVzYnlmaWxlOgogICAgICAgICByZXR1cm4gc3lzLm1vZHVsZXMuZ2V0KG1vZHVsZXNieWZpbGVbZmlsZV0pCiAgICAgZm9yIG1vZHVsZSBpbiBzeXMubW9kdWxlcy52YWx1ZXMoKToKLSAgICAgICAgaWYgaGFzYXR0cihtb2R1bGUsICdfX2ZpbGVfXycpOgorICAgICAgICBpZiBpc21vZHVsZShtb2R1bGUpIGFuZCBoYXNhdHRyKG1vZHVsZSwgJ19fZmlsZV9fJyk6CiAgICAgICAgICAgICBtb2R1bGVzYnlmaWxlWwogICAgICAgICAgICAgICAgIG9zLnBhdGgucmVhbHBhdGgoCiAgICAgICAgICAgICAgICAgICAgICAgICBnZXRhYnNmaWxlKG1vZHVsZSkpXSA9IG1vZHVsZS5fX25hbWVfXwpAQCAtNDA2LDcgKzQwNiw3IEBACiAgICAgaW4gdGhlIGZpbGUgYW5kIHRoZSBsaW5lIG51bWJlciBpbmRleGVzIGEgbGluZSBpbiB0aGF0IGxpc3QuICBBbiBJT0Vycm9yCiAgICAgaXMgcmFpc2VkIGlmIHRoZSBzb3VyY2UgY29kZSBjYW5ub3QgYmUgcmV0cmlldmVkLiIiIgogICAgIGZpbGUgPSBnZXRzb3VyY2VmaWxlKG9iamVjdCkgb3IgZ2V0ZmlsZShvYmplY3QpCi0gICAgbGluZXMgPSBsaW5lY2FjaGUuZ2V0bGluZXMoZmlsZSkKKyAgICBsaW5lcyA9IGxpbmVjYWNoZS5nZXRsaW5lcyhmaWxlLCBnZXRtb2R1bGUob2JqZWN0KS5fX2RpY3RfXykKICAgICBpZiBub3QgbGluZXM6CiAgICAgICAgIHJhaXNlIElPRXJyb3IoJ2NvdWxkIG5vdCBnZXQgc291cmNlIGNvZGUnKQogCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9QYXJhLnB5IGIvTGliL2xpYi1vbGQvUGFyYS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkOGRjNi4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9QYXJhLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzQzICswLDAgQEAKLSMgVGV4dCBmb3JtYXR0aW5nIGFic3RyYWN0aW9ucwotIyBOb3RlIC0tIHRoaXMgbW9kdWxlIGlzIG9ic29sZXRlLCBpdCdzIHRvbyBzbG93IGFueXdheQotCi0KLSMgT2Z0LXVzZWQgdHlwZSBvYmplY3QKLUludCA9IHR5cGUoMCkKLQotCi0jIFJlcHJlc2VudCBhIHBhcmFncmFwaC4gIFRoaXMgaXMgYSBsaXN0IG9mIHdvcmRzIHdpdGggYXNzb2NpYXRlZAotIyBmb250IGFuZCBzaXplIGluZm9ybWF0aW9uLCBwbHVzIGluZGVudHMgYW5kIGp1c3RpZmljYXRpb24gZm9yIHRoZQotIyBlbnRpcmUgcGFyYWdyYXBoLgotIyBPbmNlIHRoZSB3b3JkcyBoYXZlIGJlZW4gYWRkZWQgdG8gYSBwYXJhZ3JhcGgsIGl0IGNhbiBiZSBsYWlkIG91dAotIyBmb3IgZGlmZmVyZW50IGxpbmUgd2lkdGhzLiAgT25jZSBsYWlkIG91dCwgaXQgY2FuIGJlIHJlbmRlcmVkIGF0Ci0jIGRpZmZlcmVudCBzY3JlZW4gbG9jYXRpb25zLiAgT25jZSByZW5kZXJlZCwgaXQgY2FuIGJlIHF1ZXJpZWQKLSMgZm9yIG1vdXNlIGhpdHMsIGFuZCBwYXJ0cyBvZiB0aGUgdGV4dCBjYW4gYmUgaGlnaGxpZ2h0ZWQKLWNsYXNzIFBhcmE6Ci0gICAgIwotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi53b3JkcyA9IFtdICMgVGhlIHdvcmRzCi0gICAgICAgIHNlbGYuanVzdCA9ICdsJyAjIEp1c3RpZmljYXRpb246ICdsJywgJ3InLCAnbHInIG9yICdjJwotICAgICAgICBzZWxmLmluZGVudF9sZWZ0ID0gc2VsZi5pbmRlbnRfcmlnaHQgPSBzZWxmLmluZGVudF9oYW5nID0gMAotICAgICAgICAjIEZpbmFsIGxheS1vdXQgcGFyYW1ldGVycywgbWF5IGNoYW5nZQotICAgICAgICBzZWxmLmxlZnQgPSBzZWxmLnRvcCA9IHNlbGYucmlnaHQgPSBzZWxmLmJvdHRvbSA9IFwKLSAgICAgICAgICAgICAgICBzZWxmLndpZHRoID0gc2VsZi5oZWlnaHQgPSBzZWxmLmxpbmVzID0gTm9uZQotICAgICMKLSAgICAjIEFkZCBhIHdvcmQsIGNvbXB1dGluZyBzaXplIGluZm9ybWF0aW9uIGZvciBpdC4KLSAgICAjIFdvcmRzIG1heSBhbHNvIGJlIGFkZGVkIG1hbnVhbGx5IGJ5IGFwcGVuZGluZyB0byBzZWxmLndvcmRzCi0gICAgIyBFYWNoIHdvcmQgc2hvdWxkIGJlIGEgNy10dXBsZToKLSAgICAjIChmb250LCB0ZXh0LCB3aWR0aCwgc3BhY2UsIHN0cmV0Y2gsIGFzY2VudCwgZGVzY2VudCkKLSAgICBkZWYgYWRkd29yZChzZWxmLCBkLCBmb250LCB0ZXh0LCBzcGFjZSwgc3RyZXRjaCk6Ci0gICAgICAgIGlmIGZvbnQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBkLnNldGZvbnQoZm9udCkKLSAgICAgICAgd2lkdGggPSBkLnRleHR3aWR0aCh0ZXh0KQotICAgICAgICBhc2NlbnQgPSBkLmJhc2VsaW5lKCkKLSAgICAgICAgZGVzY2VudCA9IGQubGluZWhlaWdodCgpIC0gYXNjZW50Ci0gICAgICAgIHNwdyA9IGQudGV4dHdpZHRoKCcgJykKLSAgICAgICAgc3BhY2UgPSBzcGFjZSAqIHNwdwotICAgICAgICBzdHJldGNoID0gc3RyZXRjaCAqIHNwdwotICAgICAgICB0dXBsZSA9IChmb250LCB0ZXh0LCB3aWR0aCwgc3BhY2UsIHN0cmV0Y2gsIGFzY2VudCwgZGVzY2VudCkKLSAgICAgICAgc2VsZi53b3Jkcy5hcHBlbmQodHVwbGUpCi0gICAgIwotICAgICMgSG9va3MgdG8gYmVnaW4gYW5kIGVuZCBhbmNob3JzIC0tIGluc2VydCBudW1iZXJzIGluIHRoZSB3b3JkIGxpc3QhCi0gICAgZGVmIGJnbl9hbmNob3Ioc2VsZiwgaWQpOgotICAgICAgICBzZWxmLndvcmRzLmFwcGVuZChpZCkKLSAgICAjCi0gICAgZGVmIGVuZF9hbmNob3Ioc2VsZiwgaWQpOgotICAgICAgICBzZWxmLndvcmRzLmFwcGVuZCgwKQotICAgICMKLSAgICAjIFJldHVybiB0aGUgdG90YWwgbGVuZ3RoICh3aWR0aCkgb2YgdGhlIHRleHQgYWRkZWQgc28gZmFyLCBpbiBwaXhlbHMKLSAgICBkZWYgZ2V0bGVuZ3RoKHNlbGYpOgotICAgICAgICB0b3RhbCA9IDAKLSAgICAgICAgZm9yIHdvcmQgaW4gc2VsZi53b3JkczoKLSAgICAgICAgICAgIGlmIHR5cGUod29yZCkgaXMgbm90IEludDoKLSAgICAgICAgICAgICAgICB0b3RhbCA9IHRvdGFsICsgd29yZFsyXSArIHdvcmRbM10KLSAgICAgICAgcmV0dXJuIHRvdGFsCi0gICAgIwotICAgICMgVGFiIHRvIGEgZ2l2ZW4gcG9zaXRpb24gKHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGxlZnQgaW5kZW50KToKLSAgICAjIHJlbW92ZSBhbGwgc3RyZXRjaCwgYWRkIGZpeGVkIHNwYWNlIHVwIHRvIHRoZSBuZXcgaW5kZW50LgotICAgICMgSWYgdGhlIGN1cnJlbnQgcG9zaXRpb24gaXMgYWxyZWFkeSBhdCB0aGUgdGFiIHN0b3AsCi0gICAgIyBkb24ndCBhZGQgYW55IG5ldyBzcGFjZSAoYnV0IHN0aWxsIHJlbW92ZSB0aGUgc3RyZXRjaCkKLSAgICBkZWYgdGFidG8oc2VsZiwgdGFiKToKLSAgICAgICAgdG90YWwgPSAwCi0gICAgICAgIGFzLCBkZSA9IDEsIDAKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYud29yZHMpKToKLSAgICAgICAgICAgIHdvcmQgPSBzZWxmLndvcmRzW2ldCi0gICAgICAgICAgICBpZiB0eXBlKHdvcmQpIGlzIEludDogY29udGludWUKLSAgICAgICAgICAgIChmbywgdGUsIHdpLCBzcCwgc3QsIGFzLCBkZSkgPSB3b3JkCi0gICAgICAgICAgICBzZWxmLndvcmRzW2ldID0gKGZvLCB0ZSwgd2ksIHNwLCAwLCBhcywgZGUpCi0gICAgICAgICAgICB0b3RhbCA9IHRvdGFsICsgd2kgKyBzcAotICAgICAgICBpZiB0b3RhbCA8IHRhYjoKLSAgICAgICAgICAgIHNlbGYud29yZHMuYXBwZW5kKChOb25lLCAnJywgMCwgdGFiLXRvdGFsLCAwLCBhcywgZGUpKQotICAgICMKLSAgICAjIE1ha2UgYSBoYW5naW5nIHRhZzogdGFiIHRvIGhhbmcsIGluY3JlbWVudCBpbmRlbnRfbGVmdCBieSBoYW5nLAotICAgICMgYW5kIHJlc2V0IGluZGVudF9oYW5nIHRvIC1oYW5nCi0gICAgZGVmIG1ha2VoYW5naW5ndGFnKHNlbGYsIGhhbmcpOgotICAgICAgICBzZWxmLnRhYnRvKGhhbmcpCi0gICAgICAgIHNlbGYuaW5kZW50X2xlZnQgPSBzZWxmLmluZGVudF9sZWZ0ICsgaGFuZwotICAgICAgICBzZWxmLmluZGVudF9oYW5nID0gLWhhbmcKLSAgICAjCi0gICAgIyBEZWNpZGUgd2hlcmUgdGhlIGxpbmUgYnJlYWtzIHdpbGwgYmUgZ2l2ZW4gc29tZSBzY3JlZW4gd2lkdGgKLSAgICBkZWYgbGF5b3V0KHNlbGYsIGxpbmV3aWR0aCk6Ci0gICAgICAgIHNlbGYud2lkdGggPSBsaW5ld2lkdGgKLSAgICAgICAgaGVpZ2h0ID0gMAotICAgICAgICBzZWxmLmxpbmVzID0gbGluZXMgPSBbXQotICAgICAgICBhdmFpbDEgPSBzZWxmLndpZHRoIC0gc2VsZi5pbmRlbnRfbGVmdCAtIHNlbGYuaW5kZW50X3JpZ2h0Ci0gICAgICAgIGF2YWlsID0gYXZhaWwxIC0gc2VsZi5pbmRlbnRfaGFuZwotICAgICAgICB3b3JkcyA9IHNlbGYud29yZHMKLSAgICAgICAgaSA9IDAKLSAgICAgICAgbiA9IGxlbih3b3JkcykKLSAgICAgICAgbGFzdGZvbnQgPSBOb25lCi0gICAgICAgIHdoaWxlIGkgPCBuOgotICAgICAgICAgICAgZmlyc3Rmb250ID0gbGFzdGZvbnQKLSAgICAgICAgICAgIGNoYXJjb3VudCA9IDAKLSAgICAgICAgICAgIHdpZHRoID0gMAotICAgICAgICAgICAgc3RyZXRjaCA9IDAKLSAgICAgICAgICAgIGFzY2VudCA9IDAKLSAgICAgICAgICAgIGRlc2NlbnQgPSAwCi0gICAgICAgICAgICBsc3AgPSAwCi0gICAgICAgICAgICBqID0gaQotICAgICAgICAgICAgd2hpbGUgaSA8IG46Ci0gICAgICAgICAgICAgICAgd29yZCA9IHdvcmRzW2ldCi0gICAgICAgICAgICAgICAgaWYgdHlwZSh3b3JkKSBpcyBJbnQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIHdvcmQgPiAwIGFuZCB3aWR0aCA+PSBhdmFpbDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgICAgIGkgPSBpKzEKLSAgICAgICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgICAgICBmbywgdGUsIHdpLCBzcCwgc3QsIGFzLCBkZSA9IHdvcmQKLSAgICAgICAgICAgICAgICBpZiB3aWR0aCArIHdpID4gYXZhaWwgYW5kIHdpZHRoID4gMCBhbmQgd2kgPiAwOgotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgICAgIGlmIGZvIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgICAgICBsYXN0Zm9udCA9IGZvCi0gICAgICAgICAgICAgICAgICAgIGlmIHdpZHRoID09IDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdGZvbnQgPSBmbwotICAgICAgICAgICAgICAgIGNoYXJjb3VudCA9IGNoYXJjb3VudCArIGxlbih0ZSkgKyAoc3AgPiAwKQotICAgICAgICAgICAgICAgIHdpZHRoID0gd2lkdGggKyB3aSArIHNwCi0gICAgICAgICAgICAgICAgbHNwID0gc3AKLSAgICAgICAgICAgICAgICBzdHJldGNoID0gc3RyZXRjaCArIHN0Ci0gICAgICAgICAgICAgICAgbHN0ID0gc3QKLSAgICAgICAgICAgICAgICBhc2NlbnQgPSBtYXgoYXNjZW50LCBhcykKLSAgICAgICAgICAgICAgICBkZXNjZW50ID0gbWF4KGRlc2NlbnQsIGRlKQotICAgICAgICAgICAgICAgIGkgPSBpKzEKLSAgICAgICAgICAgIHdoaWxlIGkgPiBqIGFuZCB0eXBlKHdvcmRzW2ktMV0pIGlzIEludCBhbmQgXAotICAgICAgICAgICAgICAgICAgICB3b3Jkc1tpLTFdID4gMDogaSA9IGktMQotICAgICAgICAgICAgd2lkdGggPSB3aWR0aCAtIGxzcAotICAgICAgICAgICAgaWYgaSA8IG46Ci0gICAgICAgICAgICAgICAgc3RyZXRjaCA9IHN0cmV0Y2ggLSBsc3QKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc3RyZXRjaCA9IDAKLSAgICAgICAgICAgIHR1cGxlID0gaS1qLCBmaXJzdGZvbnQsIGNoYXJjb3VudCwgd2lkdGgsIHN0cmV0Y2gsIFwKLSAgICAgICAgICAgICAgICAgICAgYXNjZW50LCBkZXNjZW50Ci0gICAgICAgICAgICBsaW5lcy5hcHBlbmQodHVwbGUpCi0gICAgICAgICAgICBoZWlnaHQgPSBoZWlnaHQgKyBhc2NlbnQgKyBkZXNjZW50Ci0gICAgICAgICAgICBhdmFpbCA9IGF2YWlsMQotICAgICAgICBzZWxmLmhlaWdodCA9IGhlaWdodAotICAgICMKLSAgICAjIENhbGwgYSBmdW5jdGlvbiBmb3IgYWxsIHdvcmRzIGluIGEgbGluZQotICAgIGRlZiB2aXNpdChzZWxmLCB3b3JkZnVuYywgYW5jaG9yZnVuYyk6Ci0gICAgICAgIGF2YWlsMSA9IHNlbGYud2lkdGggLSBzZWxmLmluZGVudF9sZWZ0IC0gc2VsZi5pbmRlbnRfcmlnaHQKLSAgICAgICAgYXZhaWwgPSBhdmFpbDEgLSBzZWxmLmluZGVudF9oYW5nCi0gICAgICAgIHYgPSBzZWxmLnRvcAotICAgICAgICBpID0gMAotICAgICAgICBmb3IgdHVwbGUgaW4gc2VsZi5saW5lczoKLSAgICAgICAgICAgIHdvcmRjb3VudCwgZmlyc3Rmb250LCBjaGFyY291bnQsIHdpZHRoLCBzdHJldGNoLCBcCi0gICAgICAgICAgICAgICAgICAgIGFzY2VudCwgZGVzY2VudCA9IHR1cGxlCi0gICAgICAgICAgICBoID0gc2VsZi5sZWZ0ICsgc2VsZi5pbmRlbnRfbGVmdAotICAgICAgICAgICAgaWYgaSA9PSAwOiBoID0gaCArIHNlbGYuaW5kZW50X2hhbmcKLSAgICAgICAgICAgIGV4dHJhID0gMAotICAgICAgICAgICAgaWYgc2VsZi5qdXN0ID09ICdyJzogaCA9IGggKyBhdmFpbCAtIHdpZHRoCi0gICAgICAgICAgICBlbGlmIHNlbGYuanVzdCA9PSAnYyc6IGggPSBoICsgKGF2YWlsIC0gd2lkdGgpIC8gMgotICAgICAgICAgICAgZWxpZiBzZWxmLmp1c3QgPT0gJ2xyJyBhbmQgc3RyZXRjaCA+IDA6Ci0gICAgICAgICAgICAgICAgZXh0cmEgPSBhdmFpbCAtIHdpZHRoCi0gICAgICAgICAgICB2MiA9IHYgKyBhc2NlbnQgKyBkZXNjZW50Ci0gICAgICAgICAgICBmb3IgaiBpbiByYW5nZShpLCBpK3dvcmRjb3VudCk6Ci0gICAgICAgICAgICAgICAgd29yZCA9IHNlbGYud29yZHNbal0KLSAgICAgICAgICAgICAgICBpZiB0eXBlKHdvcmQpIGlzIEludDoKLSAgICAgICAgICAgICAgICAgICAgb2sgPSBhbmNob3JmdW5jKHNlbGYsIHR1cGxlLCB3b3JkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLCB2KQotICAgICAgICAgICAgICAgICAgICBpZiBvayBpcyBub3QgTm9uZTogcmV0dXJuIG9rCi0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgZm8sIHRlLCB3aSwgc3AsIHN0LCBhcywgZGUgPSB3b3JkCi0gICAgICAgICAgICAgICAgaWYgZXh0cmEgPiAwIGFuZCBzdHJldGNoID4gMDoKLSAgICAgICAgICAgICAgICAgICAgZXggPSBleHRyYSAqIHN0IC8gc3RyZXRjaAotICAgICAgICAgICAgICAgICAgICBleHRyYSA9IGV4dHJhIC0gZXgKLSAgICAgICAgICAgICAgICAgICAgc3RyZXRjaCA9IHN0cmV0Y2ggLSBzdAotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIGV4ID0gMAotICAgICAgICAgICAgICAgIGgyID0gaCArIHdpICsgc3AgKyBleAotICAgICAgICAgICAgICAgIG9rID0gd29yZGZ1bmMoc2VsZiwgdHVwbGUsIHdvcmQsIGgsIHYsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGgyLCB2MiwgKGo9PWkpLCAoaj09aSt3b3JkY291bnQtMSkpCi0gICAgICAgICAgICAgICAgaWYgb2sgaXMgbm90IE5vbmU6IHJldHVybiBvawotICAgICAgICAgICAgICAgIGggPSBoMgotICAgICAgICAgICAgdiA9IHYyCi0gICAgICAgICAgICBpID0gaSArIHdvcmRjb3VudAotICAgICAgICAgICAgYXZhaWwgPSBhdmFpbDEKLSAgICAjCi0gICAgIyBSZW5kZXIgYSBwYXJhZ3JhcGggaW4gImRyYXdpbmcgb2JqZWN0IiBkLCB1c2luZyB0aGUgcmVjdGFuZ2xlCi0gICAgIyBnaXZlbiBieSAobGVmdCwgdG9wLCByaWdodCkgd2l0aCBhbiB1bnNwZWNpZmllZCBib3R0b20uCi0gICAgIyBSZXR1cm4gdGhlIGNvbXB1dGVkIGJvdHRvbSBvZiB0aGUgdGV4dC4KLSAgICBkZWYgcmVuZGVyKHNlbGYsIGQsIGxlZnQsIHRvcCwgcmlnaHQpOgotICAgICAgICBpZiBzZWxmLndpZHRoICE9IHJpZ2h0LWxlZnQ6Ci0gICAgICAgICAgICBzZWxmLmxheW91dChyaWdodC1sZWZ0KQotICAgICAgICBzZWxmLmxlZnQgPSBsZWZ0Ci0gICAgICAgIHNlbGYudG9wID0gdG9wCi0gICAgICAgIHNlbGYucmlnaHQgPSByaWdodAotICAgICAgICBzZWxmLmJvdHRvbSA9IHNlbGYudG9wICsgc2VsZi5oZWlnaHQKLSAgICAgICAgc2VsZi5hbmNob3JpZCA9IDAKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgc2VsZi5kID0gZAotICAgICAgICAgICAgc2VsZi52aXNpdChzZWxmLl9fY2xhc3NfXy5fcmVuZGVyd29yZCwgXAotICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fcmVuZGVyYW5jaG9yKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgc2VsZi5kID0gTm9uZQotICAgICAgICByZXR1cm4gc2VsZi5ib3R0b20KLSAgICAjCi0gICAgZGVmIF9yZW5kZXJ3b3JkKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2LCBoMiwgdjIsIGlzZmlyc3QsIGlzbGFzdCk6Ci0gICAgICAgIGlmIHdvcmRbMF0gaXMgbm90IE5vbmU6IHNlbGYuZC5zZXRmb250KHdvcmRbMF0pCi0gICAgICAgIGJhc2VsaW5lID0gdiArIHR1cGxlWzVdCi0gICAgICAgIHNlbGYuZC50ZXh0KChoLCBiYXNlbGluZSAtIHdvcmRbNV0pLCB3b3JkWzFdKQotICAgICAgICBpZiBzZWxmLmFuY2hvcmlkID4gMDoKLSAgICAgICAgICAgIHNlbGYuZC5saW5lKChoLCBiYXNlbGluZSsyKSwgKGgyLCBiYXNlbGluZSsyKSkKLSAgICAjCi0gICAgZGVmIF9yZW5kZXJhbmNob3Ioc2VsZiwgdHVwbGUsIHdvcmQsIGgsIHYpOgotICAgICAgICBzZWxmLmFuY2hvcmlkID0gd29yZAotICAgICMKLSAgICAjIFJldHVybiB3aGljaCBhbmNob3Iocykgd2FzIGhpdCBieSB0aGUgbW91c2UKLSAgICBkZWYgaGl0Y2hlY2soc2VsZiwgbW91c2VoLCBtb3VzZXYpOgotICAgICAgICBzZWxmLm1vdXNlaCA9IG1vdXNlaAotICAgICAgICBzZWxmLm1vdXNldiA9IG1vdXNldgotICAgICAgICBzZWxmLmFuY2hvcmlkID0gMAotICAgICAgICBzZWxmLmhpdHMgPSBbXQotICAgICAgICBzZWxmLnZpc2l0KHNlbGYuX19jbGFzc19fLl9oaXRjaGVja3dvcmQsIFwKLSAgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5faGl0Y2hlY2thbmNob3IpCi0gICAgICAgIHJldHVybiBzZWxmLmhpdHMKLSAgICAjCi0gICAgZGVmIF9oaXRjaGVja3dvcmQoc2VsZiwgdHVwbGUsIHdvcmQsIGgsIHYsIGgyLCB2MiwgaXNmaXJzdCwgaXNsYXN0KToKLSAgICAgICAgaWYgc2VsZi5hbmNob3JpZCA+IDAgYW5kIGggPD0gc2VsZi5tb3VzZWggPD0gaDIgYW5kIFwKLSAgICAgICAgICAgICAgICB2IDw9IHNlbGYubW91c2V2IDw9IHYyOgotICAgICAgICAgICAgc2VsZi5oaXRzLmFwcGVuZChzZWxmLmFuY2hvcmlkKQotICAgICMKLSAgICBkZWYgX2hpdGNoZWNrYW5jaG9yKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2KToKLSAgICAgICAgc2VsZi5hbmNob3JpZCA9IHdvcmQKLSAgICAjCi0gICAgIyBSZXR1cm4gd2hldGhlciB0aGUgZ2l2ZW4gYW5jaG9yIGlkIGlzIHByZXNlbnQKLSAgICBkZWYgaGFzYW5jaG9yKHNlbGYsIGlkKToKLSAgICAgICAgcmV0dXJuIGlkIGluIHNlbGYud29yZHMgb3IgLWlkIGluIHNlbGYud29yZHMKLSAgICAjCi0gICAgIyBFeHRyYWN0IHRoZSByYXcgdGV4dCBmcm9tIHRoZSB3b3JkIGxpc3QsIHN1YnN0aXR1dGluZyBvbmUgc3BhY2UKLSAgICAjIGZvciBub24tZW1wdHkgaW50ZXItd29yZCBzcGFjZSwgYW5kIHRlcm1pbmF0aW5nIHdpdGggJ1xuJwotICAgIGRlZiBleHRyYWN0KHNlbGYpOgotICAgICAgICB0ZXh0ID0gJycKLSAgICAgICAgZm9yIHcgaW4gc2VsZi53b3JkczoKLSAgICAgICAgICAgIGlmIHR5cGUodykgaXMgbm90IEludDoKLSAgICAgICAgICAgICAgICB3b3JkID0gd1sxXQotICAgICAgICAgICAgICAgIGlmIHdbM106IHdvcmQgPSB3b3JkICsgJyAnCi0gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQgKyB3b3JkCi0gICAgICAgIHJldHVybiB0ZXh0ICsgJ1xuJwotICAgICMKLSAgICAjIFJldHVybiB3aGljaCBjaGFyYWN0ZXIgcG9zaXRpb24gd2FzIGhpdCBieSB0aGUgbW91c2UsIGFzCi0gICAgIyBhbiBvZmZzZXQgaW4gdGhlIGVudGlyZSB0ZXh0IGFzIHJldHVybmVkIGJ5IGV4dHJhY3QoKS4KLSAgICAjIFJldHVybiBOb25lIGlmIHRoZSBtb3VzZSB3YXMgbm90IGluIHRoaXMgcGFyYWdyYXBoCi0gICAgZGVmIHdoZXJlaXMoc2VsZiwgZCwgbW91c2VoLCBtb3VzZXYpOgotICAgICAgICBpZiBtb3VzZXYgPCBzZWxmLnRvcCBvciBtb3VzZXYgPiBzZWxmLmJvdHRvbToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIHNlbGYubW91c2VoID0gbW91c2VoCi0gICAgICAgIHNlbGYubW91c2V2ID0gbW91c2V2Ci0gICAgICAgIHNlbGYubGFzdGZvbnQgPSBOb25lCi0gICAgICAgIHNlbGYuY2hhcmNvdW50ID0gMAotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmQgPSBkCi0gICAgICAgICAgICByZXR1cm4gc2VsZi52aXNpdChzZWxmLl9fY2xhc3NfXy5fd2hlcmVpc3dvcmQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX19jbGFzc19fLl93aGVyZWlzYW5jaG9yKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgc2VsZi5kID0gTm9uZQotICAgICMKLSAgICBkZWYgX3doZXJlaXN3b3JkKHNlbGYsIHR1cGxlLCB3b3JkLCBoMSwgdjEsIGgyLCB2MiwgaXNmaXJzdCwgaXNsYXN0KToKLSAgICAgICAgZm8sIHRlLCB3aSwgc3AsIHN0LCBhcywgZGUgPSB3b3JkCi0gICAgICAgIGlmIGZvIGlzIG5vdCBOb25lOiBzZWxmLmxhc3Rmb250ID0gZm8KLSAgICAgICAgaCA9IGgxCi0gICAgICAgIGlmIGlzZmlyc3Q6IGgxID0gMAotICAgICAgICBpZiBpc2xhc3Q6IGgyID0gOTk5OTk5Ci0gICAgICAgIGlmIG5vdCAodjEgPD0gc2VsZi5tb3VzZXYgPD0gdjIgYW5kIGgxIDw9IHNlbGYubW91c2VoIDw9IGgyKToKLSAgICAgICAgICAgIHNlbGYuY2hhcmNvdW50ID0gc2VsZi5jaGFyY291bnQgKyBsZW4odGUpICsgKHNwID4gMCkKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBzZWxmLmxhc3Rmb250IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2VsZi5kLnNldGZvbnQoc2VsZi5sYXN0Zm9udCkKLSAgICAgICAgY2MgPSAwCi0gICAgICAgIGZvciBjIGluIHRlOgotICAgICAgICAgICAgY3cgPSBzZWxmLmQudGV4dHdpZHRoKGMpCi0gICAgICAgICAgICBpZiBzZWxmLm1vdXNlaCA8PSBoICsgY3cvMjoKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5jaGFyY291bnQgKyBjYwotICAgICAgICAgICAgY2MgPSBjYysxCi0gICAgICAgICAgICBoID0gaCtjdwotICAgICAgICBzZWxmLmNoYXJjb3VudCA9IHNlbGYuY2hhcmNvdW50ICsgY2MKLSAgICAgICAgaWYgc2VsZi5tb3VzZWggPD0gKGgraDIpIC8gMjoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmNoYXJjb3VudAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuY2hhcmNvdW50ICsgMQotICAgICMKLSAgICBkZWYgX3doZXJlaXNhbmNob3Ioc2VsZiwgdHVwbGUsIHdvcmQsIGgsIHYpOgotICAgICAgICBwYXNzCi0gICAgIwotICAgICMgUmV0dXJuIHNjcmVlbiBwb3NpdGlvbiBjb3JyZXNwb25kaW5nIHRvIHBvc2l0aW9uIGluIHBhcmFncmFwaC4KLSAgICAjIFJldHVybiB0dXBsZSAoaCwgdnRvcCwgdmJhc2VsaW5lLCB2Ym90dG9tKS4KLSAgICAjIFRoaXMgaXMgbW9yZSBvciBsZXNzIHRoZSBpbnZlcnNlIG9mIHdoZXJlaXMoKQotICAgIGRlZiBzY3JlZW5wb3Moc2VsZiwgZCwgcG9zKToKLSAgICAgICAgaWYgcG9zIDwgMDoKLSAgICAgICAgICAgIGFzY2VudCwgZGVzY2VudCA9IHNlbGYubGluZXNbMF1bNTo3XQotICAgICAgICAgICAgcmV0dXJuIHNlbGYubGVmdCwgc2VsZi50b3AsIHNlbGYudG9wICsgYXNjZW50LCBcCi0gICAgICAgICAgICAgICAgICAgIHNlbGYudG9wICsgYXNjZW50ICsgZGVzY2VudAotICAgICAgICBzZWxmLnBvcyA9IHBvcwotICAgICAgICBzZWxmLmxhc3Rmb250ID0gTm9uZQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzZWxmLmQgPSBkCi0gICAgICAgICAgICBvayA9IHNlbGYudmlzaXQoc2VsZi5fX2NsYXNzX18uX3NjcmVlbnBvc3dvcmQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9fY2xhc3NfXy5fc2NyZWVucG9zYW5jaG9yKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgc2VsZi5kID0gTm9uZQotICAgICAgICBpZiBvayBpcyBOb25lOgotICAgICAgICAgICAgYXNjZW50LCBkZXNjZW50ID0gc2VsZi5saW5lc1stMV1bNTo3XQotICAgICAgICAgICAgb2sgPSBzZWxmLnJpZ2h0LCBzZWxmLmJvdHRvbSAtIGFzY2VudCAtIGRlc2NlbnQsIFwKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5ib3R0b20gLSBkZXNjZW50LCBzZWxmLmJvdHRvbQotICAgICAgICByZXR1cm4gb2sKLSAgICAjCi0gICAgZGVmIF9zY3JlZW5wb3N3b3JkKHNlbGYsIHR1cGxlLCB3b3JkLCBoMSwgdjEsIGgyLCB2MiwgaXNmaXJzdCwgaXNsYXN0KToKLSAgICAgICAgZm8sIHRlLCB3aSwgc3AsIHN0LCBhcywgZGUgPSB3b3JkCi0gICAgICAgIGlmIGZvIGlzIG5vdCBOb25lOiBzZWxmLmxhc3Rmb250ID0gZm8KLSAgICAgICAgY2MgPSBsZW4odGUpICsgKHNwID4gMCkKLSAgICAgICAgaWYgc2VsZi5wb3MgPiBjYzoKLSAgICAgICAgICAgIHNlbGYucG9zID0gc2VsZi5wb3MgLSBjYwotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIHNlbGYucG9zIDwgY2M6Ci0gICAgICAgICAgICBzZWxmLmQuc2V0Zm9udChzZWxmLmxhc3Rmb250KQotICAgICAgICAgICAgaCA9IGgxICsgc2VsZi5kLnRleHR3aWR0aCh0ZVs6c2VsZi5wb3NdKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaCA9IGgyCi0gICAgICAgIGFzY2VudCwgZGVzY2VudCA9IHR1cGxlWzU6N10KLSAgICAgICAgcmV0dXJuIGgsIHYxLCB2MSthc2NlbnQsIHYyCi0gICAgIwotICAgIGRlZiBfc2NyZWVucG9zYW5jaG9yKHNlbGYsIHR1cGxlLCB3b3JkLCBoLCB2KToKLSAgICAgICAgcGFzcwotICAgICMKLSAgICAjIEludmVydCB0aGUgc3RyZXRjaCBvZiB0ZXh0IGJldHdlZW4gcG9zMSBhbmQgcG9zMi4KLSAgICAjIElmIHBvczEgaXMgTm9uZSwgdGhlIGJlZ2lubmluZyBpcyBpbXBsaWVkOwotICAgICMgaWYgcG9zMiBpcyBOb25lLCB0aGUgZW5kIGlzIGltcGxpZWQuCi0gICAgIyBVbmRvZXMgaXRzIG93biBlZmZlY3Qgd2hlbiBjYWxsZWQgYWdhaW4gd2l0aCB0aGUgc2FtZSBhcmd1bWVudHMKLSAgICBkZWYgaW52ZXJ0KHNlbGYsIGQsIHBvczEsIHBvczIpOgotICAgICAgICBpZiBwb3MxIGlzIE5vbmU6Ci0gICAgICAgICAgICBwb3MxID0gc2VsZi5sZWZ0LCBzZWxmLnRvcCwgc2VsZi50b3AsIHNlbGYudG9wCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwb3MxID0gc2VsZi5zY3JlZW5wb3MoZCwgcG9zMSkKLSAgICAgICAgaWYgcG9zMiBpcyBOb25lOgotICAgICAgICAgICAgcG9zMiA9IHNlbGYucmlnaHQsIHNlbGYuYm90dG9tLHNlbGYuYm90dG9tLHNlbGYuYm90dG9tCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwb3MyID0gc2VsZi5zY3JlZW5wb3MoZCwgcG9zMikKLSAgICAgICAgaDEsIHRvcDEsIGJhc2VsaW5lMSwgYm90dG9tMSA9IHBvczEKLSAgICAgICAgaDIsIHRvcDIsIGJhc2VsaW5lMiwgYm90dG9tMiA9IHBvczIKLSAgICAgICAgaWYgYm90dG9tMSA8PSB0b3AyOgotICAgICAgICAgICAgZC5pbnZlcnQoKGgxLCB0b3AxKSwgKHNlbGYucmlnaHQsIGJvdHRvbTEpKQotICAgICAgICAgICAgaDEgPSBzZWxmLmxlZnQKLSAgICAgICAgICAgIGlmIGJvdHRvbTEgPCB0b3AyOgotICAgICAgICAgICAgICAgIGQuaW52ZXJ0KChoMSwgYm90dG9tMSksIChzZWxmLnJpZ2h0LCB0b3AyKSkKLSAgICAgICAgICAgIHRvcDEsIGJvdHRvbTEgPSB0b3AyLCBib3R0b20yCi0gICAgICAgIGQuaW52ZXJ0KChoMSwgdG9wMSksIChoMiwgYm90dG9tMikpCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9hZGRwYWNrLnB5IGIvTGliL2xpYi1vbGQvYWRkcGFjay5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZiMjYwMS4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9hZGRwYWNrLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotIyBUaGlzIG1vZHVsZSBwcm92aWRlcyBzdGFuZGFyZCBzdXBwb3J0IGZvciAicGFja2FnZXMiLgotIwotIyBUaGUgaWRlYSBpcyB0aGF0IGxhcmdlIGdyb3VwcyBvZiByZWxhdGVkIG1vZHVsZXMgY2FuIGJlIHBsYWNlZCBpbgotIyB0aGVpciBvd24gc3ViZGlyZWN0b3J5LCB3aGljaCBjYW4gYmUgYWRkZWQgdG8gdGhlIFB5dGhvbiBzZWFyY2ggcGF0aAotIyBpbiBhIHJlbGF0aXZlbHkgZWFzeSB3YXkuCi0jCi0jIFRoZSBjdXJyZW50IHZlcnNpb24gdGFrZXMgYSBwYWNrYWdlIG5hbWUgYW5kIHNlYXJjaGVzIHRoZSBQeXRob24KLSMgc2VhcmNoIHBhdGggZm9yIGEgZGlyZWN0b3J5IGJ5IHRoYXQgbmFtZSwgYW5kIGlmIGZvdW5kIGFkZHMgaXQgdG8KLSMgdGhlIG1vZHVsZSBzZWFyY2ggcGF0aCAoc3lzLnBhdGgpLiAgSXQgbWFpbnRhaW5zIGEgbGlzdCBvZiBwYWNrYWdlcwotIyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkIHNvIGFkZGluZyB0aGUgc2FtZSBwYWNrYWdlIG1hbnkgdGltZXMKLSMgaXMgT0suCi0jCi0jIEl0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gYSBmYWlybHkgc3R5bGl6ZWQgbWFubmVyOiBlYWNoIG1vZHVsZQotIyB0aGF0IHdhbnRzIHRvIHVzZSBhIHBhcnRpY3VsYXIgcGFja2FnZSwgc2F5ICdGb28nLCBpcyBzdXBwb3NlZCB0bwotIyBjb250YWluIHRoZSBmb2xsb3dpbmcgY29kZToKLSMKLSMgICBmcm9tIGFkZHBhY2sgaW1wb3J0IGFkZHBhY2sKLSMgICBhZGRwYWNrKCdGb28nKQotIyAgIDxpbXBvcnQgbW9kdWxlcyBmcm9tIHBhY2thZ2UgRm9vPgotIwotIyBBZGRpdGlvbmFsIGFyZ3VtZW50cywgd2hlbiBwcmVzZW50LCBwcm92aWRlIGFkZGl0aW9uYWwgcGxhY2VzIHdoZXJlCi0jIHRvIGxvb2sgZm9yIHRoZSBwYWNrYWdlIGJlZm9yZSB0cnlpbmcgc3lzLnBhdGggKHRoZXNlIG1heSBiZSBlaXRoZXIKLSMgc3RyaW5ncyBvciBsaXN0cy90dXBsZXMgb2Ygc3RyaW5ncykuICBBbHNvLCBpZiB0aGUgcGFja2FnZSBuYW1lIGlzIGEKLSMgZnVsbCBwYXRobmFtZSwgZmlyc3QgdGhlIGxhc3QgY29tcG9uZW50IGlzIHRyaWVkIGluIHRoZSB1c3VhbCB3YXksCi0jIHRoZW4gdGhlIGZ1bGwgcGF0aG5hbWUgaXMgdHJpZWQgbGFzdC4gIElmIHRoZSBwYWNrYWdlIG5hbWUgaXMgYQotIyAqcmVsYXRpdmUqIHBhdGhuYW1lIChVTklYOiBjb250YWlucyBhIHNsYXNoIGJ1dCBkb2Vzbid0IHN0YXJ0IHdpdGgKLSMgb25lKSwgdGhlbiBub3RoaW5nIHNwZWNpYWwgaXMgZG9uZS4gIFRoZSBwYWNrYWdlcyAiL2Zvby9iYXIvYmxldGNoIgotIyBhbmQgImJsZXRjaCIgYXJlIGNvbnNpZGVyZWQgdGhlIHNhbWUsIGJ1dCB1bnJlbGF0ZWQgdG8gImJhci9ibGV0Y2giLgotIwotIyBJZiB0aGUgYWxnb3JpdGhtIGZpbmRzIG1vcmUgdGhhbiBvbmUgc3VpdGFibGUgc3ViZGlyZWN0b3J5LCBhbGwgYXJlCi0jIGFkZGVkIHRvIHRoZSBzZWFyY2ggcGF0aCAtLSB0aGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIG92ZXJyaWRlIHBhcnQKLSMgb2YgYSBwYWNrYWdlLiAgVGhlIHNhbWUgcGF0aCB3aWxsIG5vdCBiZSBhZGRlZCBtb3JlIHRoYW4gb25jZS4KLSMKLSMgSWYgbm8gZGlyZWN0b3J5IGlzIGZvdW5kLCBJbXBvcnRFcnJvciBpcyByYWlzZWQuCi0KLV9wYWNrcyA9IHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHtwYWNrOiBbcGF0aG5hbWUsIC4uLl0sIC4uLn0KLQotZGVmIGFkZHBhY2socGFjaywgKmxvY2F0aW9ucyk6Ci0gICAgaW1wb3J0IG9zCi0gICAgaWYgb3MucGF0aC5pc2FicyhwYWNrKToKLSAgICAgICAgYmFzZSA9IG9zLnBhdGguYmFzZW5hbWUocGFjaykKLSAgICBlbHNlOgotICAgICAgICBiYXNlID0gcGFjawotICAgIGlmIF9wYWNrcy5oYXNfa2V5KGJhc2UpOgotICAgICAgICByZXR1cm4KLSAgICBpbXBvcnQgc3lzCi0gICAgcGF0aCA9IFtdCi0gICAgZm9yIGxvYyBpbiBfZmxhdHRlbihsb2NhdGlvbnMpICsgc3lzLnBhdGg6Ci0gICAgICAgIGZuID0gb3MucGF0aC5qb2luKGxvYywgYmFzZSkKLSAgICAgICAgaWYgZm4gbm90IGluIHBhdGggYW5kIG9zLnBhdGguaXNkaXIoZm4pOgotICAgICAgICAgICAgcGF0aC5hcHBlbmQoZm4pCi0gICAgaWYgcGFjayAhPSBiYXNlIGFuZCBwYWNrIG5vdCBpbiBwYXRoIGFuZCBvcy5wYXRoLmlzZGlyKHBhY2spOgotICAgICAgICBwYXRoLmFwcGVuZChwYWNrKQotICAgIGlmIG5vdCBwYXRoOiByYWlzZSBJbXBvcnRFcnJvciwgJ3BhY2thZ2UgJyArIHBhY2sgKyAnIG5vdCBmb3VuZCcKLSAgICBfcGFja3NbYmFzZV0gPSBwYXRoCi0gICAgZm9yIGZuIGluIHBhdGg6Ci0gICAgICAgIGlmIGZuIG5vdCBpbiBzeXMucGF0aDoKLSAgICAgICAgICAgIHN5cy5wYXRoLmFwcGVuZChmbikKLQotZGVmIF9mbGF0dGVuKGxvY2F0aW9ucyk6Ci0gICAgbG9jcyA9IFtdCi0gICAgZm9yIGxvYyBpbiBsb2NhdGlvbnM6Ci0gICAgICAgIGlmIHR5cGUobG9jKSA9PSB0eXBlKCcnKToKLSAgICAgICAgICAgIGxvY3MuYXBwZW5kKGxvYykKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGxvY3MgPSBsb2NzICsgX2ZsYXR0ZW4obG9jKQotICAgIHJldHVybiBsb2NzCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9jbXAucHkgYi9MaWIvbGliLW9sZC9jbXAucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNDZhMjUuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvY21wLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotIiIiRWZmaWNpZW50bHkgY29tcGFyZSBmaWxlcywgYm9vbGVhbiBvdXRjb21lIG9ubHkgKGVxdWFsIC8gbm90IGVxdWFsKS4KLQotVHJpY2tzICh1c2VkIGluIHRoaXMgb3JkZXIpOgotICAgIC0gRmlsZXMgd2l0aCBpZGVudGljYWwgdHlwZSwgc2l6ZSAmIG10aW1lIGFyZSBhc3N1bWVkIHRvIGJlIGNsb25lcwotICAgIC0gRmlsZXMgd2l0aCBkaWZmZXJlbnQgdHlwZSBvciBzaXplIGNhbm5vdCBiZSBpZGVudGljYWwKLSAgICAtIFdlIGtlZXAgYSBjYWNoZSBvZiBvdXRjb21lcyBvZiBlYXJsaWVyIGNvbXBhcmlzb25zCi0gICAgLSBXZSBkb24ndCBmb3JrIGEgcHJvY2VzcyB0byBydW4gJ2NtcCcgYnV0IHJlYWQgdGhlIGZpbGVzIG91cnNlbHZlcwotIiIiCi0KLWltcG9ydCBvcwotCi1jYWNoZSA9IHt9Ci0KLWRlZiBjbXAoZjEsIGYyLCBzaGFsbG93PTEpOgotICAgICIiIkNvbXBhcmUgdHdvIGZpbGVzLCB1c2UgdGhlIGNhY2hlIGlmIHBvc3NpYmxlLgotICAgIFJldHVybiAxIGZvciBpZGVudGljYWwgZmlsZXMsIDAgZm9yIGRpZmZlcmVudC4KLSAgICBSYWlzZSBleGNlcHRpb25zIGlmIGVpdGhlciBmaWxlIGNvdWxkIG5vdCBiZSBzdGF0dGVkLCByZWFkLCBldGMuIiIiCi0gICAgczEsIHMyID0gc2lnKG9zLnN0YXQoZjEpKSwgc2lnKG9zLnN0YXQoZjIpKQotICAgIGlmIHMxWzBdICE9IDggb3IgczJbMF0gIT0gODoKLSAgICAgICAgIyBFaXRoZXIgaXMgYSBub3QgYSBwbGFpbiBmaWxlIC0tIGFsd2F5cyByZXBvcnQgYXMgZGlmZmVyZW50Ci0gICAgICAgIHJldHVybiAwCi0gICAgaWYgc2hhbGxvdyBhbmQgczEgPT0gczI6Ci0gICAgICAgICMgdHlwZSwgc2l6ZSAmIG10aW1lIG1hdGNoIC0tIHJlcG9ydCBzYW1lCi0gICAgICAgIHJldHVybiAxCi0gICAgaWYgczFbOjJdICE9IHMyWzoyXTogIyBUeXBlcyBvciBzaXplcyBkaWZmZXIsIGRvbid0IGJvdGhlcgotICAgICAgICAjIHR5cGVzIG9yIHNpemVzIGRpZmZlciAtLSByZXBvcnQgZGlmZmVyZW50Ci0gICAgICAgIHJldHVybiAwCi0gICAgIyBzYW1lIHR5cGUgYW5kIHNpemUgLS0gbG9vayBpbiB0aGUgY2FjaGUKLSAgICBrZXkgPSAoZjEsIGYyKQotICAgIHRyeToKLSAgICAgICAgY3MxLCBjczIsIG91dGNvbWUgPSBjYWNoZVtrZXldCi0gICAgICAgICMgY2FjaGUgaGl0Ci0gICAgICAgIGlmIHMxID09IGNzMSBhbmQgczIgPT0gY3MyOgotICAgICAgICAgICAgIyBjYWNoZWQgc2lnbmF0dXJlcyBtYXRjaAotICAgICAgICAgICAgcmV0dXJuIG91dGNvbWUKLSAgICAgICAgIyBzdGFsZSBjYWNoZWQgc2lnbmF0dXJlKHMpCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAjIGNhY2hlIG1pc3MKLSAgICAgICAgcGFzcwotICAgICMgcmVhbGx5IGNvbXBhcmUKLSAgICBvdXRjb21lID0gZG9fY21wKGYxLCBmMikKLSAgICBjYWNoZVtrZXldID0gczEsIHMyLCBvdXRjb21lCi0gICAgcmV0dXJuIG91dGNvbWUKLQotZGVmIHNpZyhzdCk6Ci0gICAgIiIiUmV0dXJuIHNpZ25hdHVyZSAoaS5lLiwgdHlwZSwgc2l6ZSwgbXRpbWUpIGZyb20gcmF3IHN0YXQgZGF0YQotICAgIDAtNTogc3RfbW9kZSwgc3RfaW5vLCBzdF9kZXYsIHN0X25saW5rLCBzdF91aWQsIHN0X2dpZAotICAgIDYtOTogc3Rfc2l6ZSwgc3RfYXRpbWUsIHN0X210aW1lLCBzdF9jdGltZSIiIgotICAgIHR5cGUgPSBzdFswXSAvIDQwOTYKLSAgICBzaXplID0gc3RbNl0KLSAgICBtdGltZSA9IHN0WzhdCi0gICAgcmV0dXJuIHR5cGUsIHNpemUsIG10aW1lCi0KLWRlZiBkb19jbXAoZjEsIGYyKToKLSAgICAiIiJDb21wYXJlIHR3byBmaWxlcywgcmVhbGx5LiIiIgotICAgIGJ1ZnNpemUgPSA4KjEwMjQgIyBDb3VsZCBiZSB0dW5lZAotICAgIGZwMSA9IG9wZW4oZjEsICdyYicpCi0gICAgZnAyID0gb3BlbihmMiwgJ3JiJykKLSAgICB3aGlsZSAxOgotICAgICAgICBiMSA9IGZwMS5yZWFkKGJ1ZnNpemUpCi0gICAgICAgIGIyID0gZnAyLnJlYWQoYnVmc2l6ZSkKLSAgICAgICAgaWYgYjEgIT0gYjI6IHJldHVybiAwCi0gICAgICAgIGlmIG5vdCBiMTogcmV0dXJuIDEKZGlmZiAtLWdpdCBhL0xpYi9saWItb2xkL2NtcGNhY2hlLnB5IGIvTGliL2xpYi1vbGQvY21wY2FjaGUucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNTQwZjguLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvY21wY2FjaGUucHkKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0iIiJFZmZpY2llbnRseSBjb21wYXJlIGZpbGVzLCBib29sZWFuIG91dGNvbWUgb25seSAoZXF1YWwgLyBub3QgZXF1YWwpLgotCi1Ucmlja3MgKHVzZWQgaW4gdGhpcyBvcmRlcik6Ci0gICAgLSBVc2UgdGhlIHN0YXRjYWNoZSBtb2R1bGUgdG8gYXZvaWQgc3RhdHRpbmcgZmlsZXMgbW9yZSB0aGFuIG9uY2UKLSAgICAtIEZpbGVzIHdpdGggaWRlbnRpY2FsIHR5cGUsIHNpemUgJiBtdGltZSBhcmUgYXNzdW1lZCB0byBiZSBjbG9uZXMKLSAgICAtIEZpbGVzIHdpdGggZGlmZmVyZW50IHR5cGUgb3Igc2l6ZSBjYW5ub3QgYmUgaWRlbnRpY2FsCi0gICAgLSBXZSBrZWVwIGEgY2FjaGUgb2Ygb3V0Y29tZXMgb2YgZWFybGllciBjb21wYXJpc29ucwotICAgIC0gV2UgZG9uJ3QgZm9yayBhIHByb2Nlc3MgdG8gcnVuICdjbXAnIGJ1dCByZWFkIHRoZSBmaWxlcyBvdXJzZWx2ZXMKLSIiIgotCi1pbXBvcnQgb3MKLWZyb20gc3RhdCBpbXBvcnQgKgotaW1wb3J0IHN0YXRjYWNoZQotCi0KLSMgVGhlIGNhY2hlLgotIwotY2FjaGUgPSB7fQotCi0KLWRlZiBjbXAoZjEsIGYyLCBzaGFsbG93PTEpOgotICAgICIiIkNvbXBhcmUgdHdvIGZpbGVzLCB1c2UgdGhlIGNhY2hlIGlmIHBvc3NpYmxlLgotICAgIE1heSByYWlzZSBvcy5lcnJvciBpZiBhIHN0YXQgb3Igb3BlbiBvZiBlaXRoZXIgZmFpbHMuCi0gICAgUmV0dXJuIDEgZm9yIGlkZW50aWNhbCBmaWxlcywgMCBmb3IgZGlmZmVyZW50LgotICAgIFJhaXNlIGV4Y2VwdGlvbnMgaWYgZWl0aGVyIGZpbGUgY291bGQgbm90IGJlIHN0YXR0ZWQsIHJlYWQsIGV0Yy4iIiIKLSAgICBzMSwgczIgPSBzaWcoc3RhdGNhY2hlLnN0YXQoZjEpKSwgc2lnKHN0YXRjYWNoZS5zdGF0KGYyKSkKLSAgICBpZiBub3QgU19JU1JFRyhzMVswXSkgb3Igbm90IFNfSVNSRUcoczJbMF0pOgotICAgICAgICAjIEVpdGhlciBpcyBhIG5vdCBhIHBsYWluIGZpbGUgLS0gYWx3YXlzIHJlcG9ydCBhcyBkaWZmZXJlbnQKLSAgICAgICAgcmV0dXJuIDAKLSAgICBpZiBzaGFsbG93IGFuZCBzMSA9PSBzMjoKLSAgICAgICAgIyB0eXBlLCBzaXplICYgbXRpbWUgbWF0Y2ggLS0gcmVwb3J0IHNhbWUKLSAgICAgICAgcmV0dXJuIDEKLSAgICBpZiBzMVs6Ml0gIT0gczJbOjJdOiAjIFR5cGVzIG9yIHNpemVzIGRpZmZlciwgZG9uJ3QgYm90aGVyCi0gICAgICAgICMgdHlwZXMgb3Igc2l6ZXMgZGlmZmVyIC0tIHJlcG9ydCBkaWZmZXJlbnQKLSAgICAgICAgcmV0dXJuIDAKLSAgICAjIHNhbWUgdHlwZSBhbmQgc2l6ZSAtLSBsb29rIGluIHRoZSBjYWNoZQotICAgIGtleSA9IGYxICsgJyAnICsgZjIKLSAgICBpZiBjYWNoZS5oYXNfa2V5KGtleSk6Ci0gICAgICAgIGNzMSwgY3MyLCBvdXRjb21lID0gY2FjaGVba2V5XQotICAgICAgICAjIGNhY2hlIGhpdAotICAgICAgICBpZiBzMSA9PSBjczEgYW5kIHMyID09IGNzMjoKLSAgICAgICAgICAgICMgY2FjaGVkIHNpZ25hdHVyZXMgbWF0Y2gKLSAgICAgICAgICAgIHJldHVybiBvdXRjb21lCi0gICAgICAgICMgc3RhbGUgY2FjaGVkIHNpZ25hdHVyZShzKQotICAgICMgcmVhbGx5IGNvbXBhcmUKLSAgICBvdXRjb21lID0gZG9fY21wKGYxLCBmMikKLSAgICBjYWNoZVtrZXldID0gczEsIHMyLCBvdXRjb21lCi0gICAgcmV0dXJuIG91dGNvbWUKLQotZGVmIHNpZyhzdCk6Ci0gICAgIiIiUmV0dXJuIHNpZ25hdHVyZSAoaS5lLiwgdHlwZSwgc2l6ZSwgbXRpbWUpIGZyb20gcmF3IHN0YXQgZGF0YS4iIiIKLSAgICByZXR1cm4gU19JRk1UKHN0W1NUX01PREVdKSwgc3RbU1RfU0laRV0sIHN0W1NUX01USU1FXQotCi1kZWYgZG9fY21wKGYxLCBmMik6Ci0gICAgIiIiQ29tcGFyZSB0d28gZmlsZXMsIHJlYWxseS4iIiIKLSAgICAjcHJpbnQgJyAgICBjbXAnLCBmMSwgZjIgIyBYWFggcmVtb3ZlIHdoZW4gZGVidWdnZWQKLSAgICBidWZzaXplID0gOCoxMDI0ICMgQ291bGQgYmUgdHVuZWQKLSAgICBmcDEgPSBvcGVuKGYxLCAncmInKQotICAgIGZwMiA9IG9wZW4oZjIsICdyYicpCi0gICAgd2hpbGUgMToKLSAgICAgICAgYjEgPSBmcDEucmVhZChidWZzaXplKQotICAgICAgICBiMiA9IGZwMi5yZWFkKGJ1ZnNpemUpCi0gICAgICAgIGlmIGIxICE9IGIyOiByZXR1cm4gMAotICAgICAgICBpZiBub3QgYjE6IHJldHVybiAxCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9jb2RlaGFjay5weSBiL0xpYi9saWItb2xkL2NvZGVoYWNrLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjVlM2ExLi4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL2NvZGVoYWNrLnB5CisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotIyBBIHN1YnJvdXRpbmUgZm9yIGV4dHJhY3RpbmcgYSBmdW5jdGlvbiBuYW1lIGZyb20gYSBjb2RlIG9iamVjdAotIyAod2l0aCBjYWNoZSkKLQotaW1wb3J0IHN5cwotZnJvbSBzdGF0IGltcG9ydCAqCi1pbXBvcnQgc3RyaW5nCi1pbXBvcnQgb3MKLWltcG9ydCBsaW5lY2FjaGUKLQotIyBYWFggVGhlIGZ1bmN0aW9ucyBnZXRjb2RlbmFtZSgpIGFuZCBnZXRmdW5jbmFtZSgpIGFyZSBub3cgb2Jzb2xldGUKLSMgWFhYIGFzIGNvZGUgYW5kIGZ1bmN0aW9uIG9iamVjdHMgbm93IGhhdmUgYSBuYW1lIGF0dHJpYnV0ZSAtLQotIyBYWFggY28uY29fbmFtZSBhbmQgZi5mdW5jX25hbWUuCi0jIFhYWCBnZXRsaW5lbm8oKSBpcyBub3cgYWxzbyBvYnNvbGV0ZSBiZWNhdXNlIG9mIHRoZSBuZXcgYXR0cmlidXRlCi0jIFhYWCBvZiBjb2RlIG9iamVjdHMsIGNvLmNvX2ZpcnN0bGluZW5vLgotCi0jIEV4dHJhY3QgdGhlIGZ1bmN0aW9uIG9yIGNsYXNzIG5hbWUgZnJvbSBhIGNvZGUgb2JqZWN0LgotIyBUaGlzIGlzIGEgYml0IG9mIGEgaGFjaywgc2luY2UgYSBjb2RlIG9iamVjdCBkb2Vzbid0IGNvbnRhaW4KLSMgdGhlIG5hbWUgZGlyZWN0bHkuICBTbyB3aGF0IGRvIHdlIGRvOgotIyAtIGdldCB0aGUgZmlsZW5hbWUgKHdoaWNoICppcyogaW4gdGhlIGNvZGUgb2JqZWN0KQotIyAtIGxvb2sgaW4gdGhlIGNvZGUgc3RyaW5nIHRvIGZpbmQgdGhlIGZpcnN0IFNFVF9MSU5FTk8gaW5zdHJ1Y3Rpb24KLSMgICAodGhpcyBtdXN0IGJlIHRoZSBmaXJzdCBpbnN0cnVjdGlvbikKLSMgLSBnZXQgdGhlIGxpbmUgZnJvbSB0aGUgZmlsZQotIyAtIGlmIHRoZSBsaW5lIHN0YXJ0cyB3aXRoICdjbGFzcycgb3IgJ2RlZicgKGFmdGVyIHBvc3NpYmxlIHdoaXRlc3BhY2UpLAotIyAgIGV4dHJhY3QgdGhlIGZvbGxvd2luZyBpZGVudGlmaWVyCi0jCi0jIFRoaXMgYnJlYWtzIGFwYXJ0IHdoZW4gdGhlIGZ1bmN0aW9uIHdhcyByZWFkIGZyb20gPHN0ZGluPgotIyBvciBjb25zdHJ1Y3RlZCBieSBleGVjKCksIHdoZW4gdGhlIGZpbGUgaXMgbm90IGFjY2Vzc2libGUsCi0jIGFuZCBhbHNvIHdoZW4gdGhlIGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgb3Igd2hlbiBhIGxpbmUgaXMKLSMgY29udGludWVkIHdpdGggYSBiYWNrc2xhc2ggYmVmb3JlIHRoZSBmdW5jdGlvbiBvciBjbGFzcyBuYW1lLgotIwotIyBCZWNhdXNlIHRoaXMgaXMgYSBwcmV0dHkgZXhwZW5zaXZlIGhhY2ssIGEgY2FjaGUgaXMga2VwdC4KLQotU0VUX0xJTkVOTyA9IDEyNyAjIFRoZSBvcGNvZGUgKHNlZSAib3Bjb2RlLmgiIGluIHRoZSBQeXRob24gc291cmNlKQotaWRlbnRjaGFycyA9IHN0cmluZy5hc2NpaV9sZXR0ZXJzICsgc3RyaW5nLmRpZ2l0cyArICdfJyAjIElkZW50aWZpZXIgY2hhcmFjdGVycwotCi1fbmFtZWNhY2hlID0ge30gIyBUaGUgY2FjaGUKLQotZGVmIGdldGNvZGVuYW1lKGNvKToKLSAgICB0cnk6Ci0gICAgICAgIHJldHVybiBjby5jb19uYW1lCi0gICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICBwYXNzCi0gICAga2V5ID0gYGNvYCAjIGFyYml0cmFyeSBidXQgdW5pcXVlbHkgaWRlbnRpZnlpbmcgc3RyaW5nCi0gICAgaWYgX25hbWVjYWNoZS5oYXNfa2V5KGtleSk6IHJldHVybiBfbmFtZWNhY2hlW2tleV0KLSAgICBmaWxlbmFtZSA9IGNvLmNvX2ZpbGVuYW1lCi0gICAgY29kZSA9IGNvLmNvX2NvZGUKLSAgICBuYW1lID0gJycKLSAgICBpZiBvcmQoY29kZVswXSkgPT0gU0VUX0xJTkVOTzoKLSAgICAgICAgbGluZW5vID0gb3JkKGNvZGVbMV0pIHwgb3JkKGNvZGVbMl0pIDw8IDgKLSAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8pCi0gICAgICAgIHdvcmRzID0gbGluZS5zcGxpdCgpCi0gICAgICAgIGlmIGxlbih3b3JkcykgPj0gMiBhbmQgd29yZHNbMF0gaW4gKCdkZWYnLCAnY2xhc3MnKToKLSAgICAgICAgICAgIG5hbWUgPSB3b3Jkc1sxXQotICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKG5hbWUpKToKLSAgICAgICAgICAgICAgICBpZiBuYW1lW2ldIG5vdCBpbiBpZGVudGNoYXJzOgotICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVs6aV0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICBfbmFtZWNhY2hlW2tleV0gPSBuYW1lCi0gICAgcmV0dXJuIG5hbWUKLQotIyBVc2UgdGhlIGFib3ZlIHJvdXRpbmUgdG8gZmluZCBhIGZ1bmN0aW9uJ3MgbmFtZS4KLQotZGVmIGdldGZ1bmNuYW1lKGZ1bmMpOgotICAgIHRyeToKLSAgICAgICAgcmV0dXJuIGZ1bmMuZnVuY19uYW1lCi0gICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICBwYXNzCi0gICAgcmV0dXJuIGdldGNvZGVuYW1lKGZ1bmMuZnVuY19jb2RlKQotCi0jIEEgcGFydCBvZiB0aGUgYWJvdmUgY29kZSB0byBleHRyYWN0IGp1c3QgdGhlIGxpbmUgbnVtYmVyIGZyb20gYSBjb2RlIG9iamVjdC4KLQotZGVmIGdldGxpbmVubyhjbyk6Ci0gICAgdHJ5OgotICAgICAgICByZXR1cm4gY28uY29fZmlyc3RsaW5lbm8KLSAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgIHBhc3MKLSAgICBjb2RlID0gY28uY29fY29kZQotICAgIGlmIG9yZChjb2RlWzBdKSA9PSBTRVRfTElORU5POgotICAgICAgICByZXR1cm4gb3JkKGNvZGVbMV0pIHwgb3JkKGNvZGVbMl0pIDw8IDgKLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gLTEKZGlmZiAtLWdpdCBhL0xpYi9saWItb2xkL2RpcmNtcC5weSBiL0xpYi9saWItb2xkL2RpcmNtcC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3YmYyYS4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9kaXJjbXAucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotIiIiQSBjbGFzcyB0byBidWlsZCBkaXJlY3RvcnkgZGlmZiB0b29scyBvbi4iIiIKLQotaW1wb3J0IG9zCi0KLWltcG9ydCBkaXJjYWNoZQotaW1wb3J0IGNtcGNhY2hlCi1pbXBvcnQgc3RhdGNhY2hlCi1mcm9tIHN0YXQgaW1wb3J0ICoKLQotY2xhc3MgZGlyY21wOgotICAgICIiIkRpcmVjdG9yeSBjb21wYXJpc29uIGNsYXNzLiIiIgotCi0gICAgZGVmIG5ldyhzZWxmLCBhLCBiKToKLSAgICAgICAgIiIiSW5pdGlhbGl6ZS4iIiIKLSAgICAgICAgc2VsZi5hID0gYQotICAgICAgICBzZWxmLmIgPSBiCi0gICAgICAgICMgUHJvcGVydGllcyB0aGF0IGNhbGxlciBtYXkgY2hhbmdlIGJlZm9yZSBjYWxsaW5nIHNlbGYucnVuKCk6Ci0gICAgICAgIHNlbGYuaGlkZSA9IFtvcy5jdXJkaXIsIG9zLnBhcmRpcl0gIyBOYW1lcyBuZXZlciB0byBiZSBzaG93bgotICAgICAgICBzZWxmLmlnbm9yZSA9IFsnUkNTJywgJ3RhZ3MnXSAjIE5hbWVzIGlnbm9yZWQgaW4gY29tcGFyaXNvbgotCi0gICAgICAgIHJldHVybiBzZWxmCi0KLSAgICBkZWYgcnVuKHNlbGYpOgotICAgICAgICAiIiJDb21wYXJlIGV2ZXJ5dGhpbmcgZXhjZXB0IGNvbW1vbiBzdWJkaXJlY3Rvcmllcy4iIiIKLSAgICAgICAgc2VsZi5hX2xpc3QgPSBmaWx0ZXIoZGlyY2FjaGUubGlzdGRpcihzZWxmLmEpLCBzZWxmLmhpZGUpCi0gICAgICAgIHNlbGYuYl9saXN0ID0gZmlsdGVyKGRpcmNhY2hlLmxpc3RkaXIoc2VsZi5iKSwgc2VsZi5oaWRlKQotICAgICAgICBzZWxmLmFfbGlzdC5zb3J0KCkKLSAgICAgICAgc2VsZi5iX2xpc3Quc29ydCgpCi0gICAgICAgIHNlbGYucGhhc2UxKCkKLSAgICAgICAgc2VsZi5waGFzZTIoKQotICAgICAgICBzZWxmLnBoYXNlMygpCi0KLSAgICBkZWYgcGhhc2UxKHNlbGYpOgotICAgICAgICAiIiJDb21wdXRlIGNvbW1vbiBuYW1lcy4iIiIKLSAgICAgICAgc2VsZi5hX29ubHkgPSBbXQotICAgICAgICBzZWxmLmNvbW1vbiA9IFtdCi0gICAgICAgIGZvciB4IGluIHNlbGYuYV9saXN0OgotICAgICAgICAgICAgaWYgeCBpbiBzZWxmLmJfbGlzdDoKLSAgICAgICAgICAgICAgICBzZWxmLmNvbW1vbi5hcHBlbmQoeCkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5hX29ubHkuYXBwZW5kKHgpCi0KLSAgICAgICAgc2VsZi5iX29ubHkgPSBbXQotICAgICAgICBmb3IgeCBpbiBzZWxmLmJfbGlzdDoKLSAgICAgICAgICAgIGlmIHggbm90IGluIHNlbGYuY29tbW9uOgotICAgICAgICAgICAgICAgIHNlbGYuYl9vbmx5LmFwcGVuZCh4KQotCi0gICAgZGVmIHBoYXNlMihzZWxmKToKLSAgICAgICAgIiIiRGlzdGluZ3Vpc2ggZmlsZXMsIGRpcmVjdG9yaWVzLCBmdW5uaWVzLiIiIgotICAgICAgICBzZWxmLmNvbW1vbl9kaXJzID0gW10KLSAgICAgICAgc2VsZi5jb21tb25fZmlsZXMgPSBbXQotICAgICAgICBzZWxmLmNvbW1vbl9mdW5ueSA9IFtdCi0KLSAgICAgICAgZm9yIHggaW4gc2VsZi5jb21tb246Ci0gICAgICAgICAgICBhX3BhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5hLCB4KQotICAgICAgICAgICAgYl9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuYiwgeCkKLQotICAgICAgICAgICAgb2sgPSAxCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgYV9zdGF0ID0gc3RhdGNhY2hlLnN0YXQoYV9wYXRoKQotICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yLCB3aHk6Ci0gICAgICAgICAgICAgICAgIyBwcmludCAnQ2FuXCd0IHN0YXQnLCBhX3BhdGgsICc6Jywgd2h5WzFdCi0gICAgICAgICAgICAgICAgb2sgPSAwCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgYl9zdGF0ID0gc3RhdGNhY2hlLnN0YXQoYl9wYXRoKQotICAgICAgICAgICAgZXhjZXB0IG9zLmVycm9yLCB3aHk6Ci0gICAgICAgICAgICAgICAgIyBwcmludCAnQ2FuXCd0IHN0YXQnLCBiX3BhdGgsICc6Jywgd2h5WzFdCi0gICAgICAgICAgICAgICAgb2sgPSAwCi0KLSAgICAgICAgICAgIGlmIG9rOgotICAgICAgICAgICAgICAgIGFfdHlwZSA9IFNfSUZNVChhX3N0YXRbU1RfTU9ERV0pCi0gICAgICAgICAgICAgICAgYl90eXBlID0gU19JRk1UKGJfc3RhdFtTVF9NT0RFXSkKLSAgICAgICAgICAgICAgICBpZiBhX3R5cGUgIT0gYl90eXBlOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmNvbW1vbl9mdW5ueS5hcHBlbmQoeCkKLSAgICAgICAgICAgICAgICBlbGlmIFNfSVNESVIoYV90eXBlKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21tb25fZGlycy5hcHBlbmQoeCkKLSAgICAgICAgICAgICAgICBlbGlmIFNfSVNSRUcoYV90eXBlKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21tb25fZmlsZXMuYXBwZW5kKHgpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5jb21tb25fZnVubnkuYXBwZW5kKHgpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuY29tbW9uX2Z1bm55LmFwcGVuZCh4KQotCi0gICAgZGVmIHBoYXNlMyhzZWxmKToKLSAgICAgICAgIiIiRmluZCBvdXQgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb21tb24gZmlsZXMuIiIiCi0gICAgICAgIHh4ID0gY21wZmlsZXMoc2VsZi5hLCBzZWxmLmIsIHNlbGYuY29tbW9uX2ZpbGVzKQotICAgICAgICBzZWxmLnNhbWVfZmlsZXMsIHNlbGYuZGlmZl9maWxlcywgc2VsZi5mdW5ueV9maWxlcyA9IHh4Ci0KLSAgICBkZWYgcGhhc2U0KHNlbGYpOgotICAgICAgICAiIiJGaW5kIG91dCBkaWZmZXJlbmNlcyBiZXR3ZWVuIGNvbW1vbiBzdWJkaXJlY3Rvcmllcy4KLSAgICAgICAgQSBuZXcgZGlyY21wIG9iamVjdCBpcyBjcmVhdGVkIGZvciBlYWNoIGNvbW1vbiBzdWJkaXJlY3RvcnksCi0gICAgICAgIHRoZXNlIGFyZSBzdG9yZWQgaW4gYSBkaWN0aW9uYXJ5IGluZGV4ZWQgYnkgZmlsZW5hbWUuCi0gICAgICAgIFRoZSBoaWRlIGFuZCBpZ25vcmUgcHJvcGVydGllcyBhcmUgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudC4iIiIKLSAgICAgICAgc2VsZi5zdWJkaXJzID0ge30KLSAgICAgICAgZm9yIHggaW4gc2VsZi5jb21tb25fZGlyczoKLSAgICAgICAgICAgIGFfeCA9IG9zLnBhdGguam9pbihzZWxmLmEsIHgpCi0gICAgICAgICAgICBiX3ggPSBvcy5wYXRoLmpvaW4oc2VsZi5iLCB4KQotICAgICAgICAgICAgc2VsZi5zdWJkaXJzW3hdID0gbmV3ZGQgPSBkaXJjbXAoKS5uZXcoYV94LCBiX3gpCi0gICAgICAgICAgICBuZXdkZC5oaWRlID0gc2VsZi5oaWRlCi0gICAgICAgICAgICBuZXdkZC5pZ25vcmUgPSBzZWxmLmlnbm9yZQotICAgICAgICAgICAgbmV3ZGQucnVuKCkKLQotICAgIGRlZiBwaGFzZTRfY2xvc3VyZShzZWxmKToKLSAgICAgICAgIiIiUmVjdXJzaXZlbHkgY2FsbCBwaGFzZTQoKSBvbiBzdWJkaXJlY3Rvcmllcy4iIiIKLSAgICAgICAgc2VsZi5waGFzZTQoKQotICAgICAgICBmb3IgeCBpbiBzZWxmLnN1YmRpcnMua2V5cygpOgotICAgICAgICAgICAgc2VsZi5zdWJkaXJzW3hdLnBoYXNlNF9jbG9zdXJlKCkKLQotICAgIGRlZiByZXBvcnQoc2VsZik6Ci0gICAgICAgICIiIlByaW50IGEgcmVwb3J0IG9uIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGEgYW5kIGIuIiIiCi0gICAgICAgICMgQXNzdW1lIHRoYXQgcGhhc2VzIDEgdG8gMyBoYXZlIGJlZW4gZXhlY3V0ZWQKLSAgICAgICAgIyBPdXRwdXQgZm9ybWF0IGlzIHB1cnBvc2VseSBsb3VzeQotICAgICAgICBwcmludCAnZGlmZicsIHNlbGYuYSwgc2VsZi5iCi0gICAgICAgIGlmIHNlbGYuYV9vbmx5OgotICAgICAgICAgICAgcHJpbnQgJ09ubHkgaW4nLCBzZWxmLmEsICc6Jywgc2VsZi5hX29ubHkKLSAgICAgICAgaWYgc2VsZi5iX29ubHk6Ci0gICAgICAgICAgICBwcmludCAnT25seSBpbicsIHNlbGYuYiwgJzonLCBzZWxmLmJfb25seQotICAgICAgICBpZiBzZWxmLnNhbWVfZmlsZXM6Ci0gICAgICAgICAgICBwcmludCAnSWRlbnRpY2FsIGZpbGVzIDonLCBzZWxmLnNhbWVfZmlsZXMKLSAgICAgICAgaWYgc2VsZi5kaWZmX2ZpbGVzOgotICAgICAgICAgICAgcHJpbnQgJ0RpZmZlcmluZyBmaWxlcyA6Jywgc2VsZi5kaWZmX2ZpbGVzCi0gICAgICAgIGlmIHNlbGYuZnVubnlfZmlsZXM6Ci0gICAgICAgICAgICBwcmludCAnVHJvdWJsZSB3aXRoIGNvbW1vbiBmaWxlcyA6Jywgc2VsZi5mdW5ueV9maWxlcwotICAgICAgICBpZiBzZWxmLmNvbW1vbl9kaXJzOgotICAgICAgICAgICAgcHJpbnQgJ0NvbW1vbiBzdWJkaXJlY3RvcmllcyA6Jywgc2VsZi5jb21tb25fZGlycwotICAgICAgICBpZiBzZWxmLmNvbW1vbl9mdW5ueToKLSAgICAgICAgICAgIHByaW50ICdDb21tb24gZnVubnkgY2FzZXMgOicsIHNlbGYuY29tbW9uX2Z1bm55Ci0KLSAgICBkZWYgcmVwb3J0X2Nsb3N1cmUoc2VsZik6Ci0gICAgICAgICIiIlByaW50IHJlcG9ydHMgb24gc2VsZiBhbmQgb24gc3ViZGlycy4KLSAgICAgICAgSWYgcGhhc2UgNCBoYXNuJ3QgYmVlbiBkb25lLCBubyBzdWJkaXIgcmVwb3J0cyBhcmUgcHJpbnRlZC4iIiIKLSAgICAgICAgc2VsZi5yZXBvcnQoKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB4ID0gc2VsZi5zdWJkaXJzCi0gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgIHJldHVybiAjIE5vIHN1YmRpcmVjdG9yaWVzIGNvbXB1dGVkCi0gICAgICAgIGZvciB4IGluIHNlbGYuc3ViZGlycy5rZXlzKCk6Ci0gICAgICAgICAgICBwcmludAotICAgICAgICAgICAgc2VsZi5zdWJkaXJzW3hdLnJlcG9ydF9jbG9zdXJlKCkKLQotICAgIGRlZiByZXBvcnRfcGhhc2U0X2Nsb3N1cmUoc2VsZik6Ci0gICAgICAgICIiIlJlcG9ydCBhbmQgZG8gcGhhc2UgNCByZWN1cnNpdmVseS4iIiIKLSAgICAgICAgc2VsZi5yZXBvcnQoKQotICAgICAgICBzZWxmLnBoYXNlNCgpCi0gICAgICAgIGZvciB4IGluIHNlbGYuc3ViZGlycy5rZXlzKCk6Ci0gICAgICAgICAgICBwcmludAotICAgICAgICAgICAgc2VsZi5zdWJkaXJzW3hdLnJlcG9ydF9waGFzZTRfY2xvc3VyZSgpCi0KLQotZGVmIGNtcGZpbGVzKGEsIGIsIGNvbW1vbik6Ci0gICAgIiIiQ29tcGFyZSBjb21tb24gZmlsZXMgaW4gdHdvIGRpcmVjdG9yaWVzLgotICAgIFJldHVybjoKLSAgICAgICAgLSBmaWxlcyB0aGF0IGNvbXBhcmUgZXF1YWwKLSAgICAgICAgLSBmaWxlcyB0aGF0IGNvbXBhcmUgZGlmZmVyZW50Ci0gICAgICAgIC0gZnVubnkgY2FzZXMgKGNhbid0IHN0YXQgZXRjLikiIiIKLQotICAgIHJlcyA9IChbXSwgW10sIFtdKQotICAgIGZvciB4IGluIGNvbW1vbjoKLSAgICAgICAgcmVzW2NtcChvcy5wYXRoLmpvaW4oYSwgeCksIG9zLnBhdGguam9pbihiLCB4KSldLmFwcGVuZCh4KQotICAgIHJldHVybiByZXMKLQotCi1kZWYgY21wKGEsIGIpOgotICAgICIiIkNvbXBhcmUgdHdvIGZpbGVzLgotICAgIFJldHVybjoKLSAgICAgICAgMCBmb3IgZXF1YWwKLSAgICAgICAgMSBmb3IgZGlmZmVyZW50Ci0gICAgICAgIDIgZm9yIGZ1bm55IGNhc2VzIChjYW4ndCBzdGF0LCBldGMuKSIiIgotCi0gICAgdHJ5OgotICAgICAgICBpZiBjbXBjYWNoZS5jbXAoYSwgYik6IHJldHVybiAwCi0gICAgICAgIHJldHVybiAxCi0gICAgZXhjZXB0IG9zLmVycm9yOgotICAgICAgICByZXR1cm4gMgotCi0KLWRlZiBmaWx0ZXIobGlzdCwgc2tpcCk6Ci0gICAgIiIiUmV0dXJuIGEgY29weSB3aXRoIGl0ZW1zIHRoYXQgb2NjdXIgaW4gc2tpcCByZW1vdmVkLiIiIgotCi0gICAgcmVzdWx0ID0gW10KLSAgICBmb3IgaXRlbSBpbiBsaXN0OgotICAgICAgICBpZiBpdGVtIG5vdCBpbiBza2lwOiByZXN1bHQuYXBwZW5kKGl0ZW0pCi0gICAgcmV0dXJuIHJlc3VsdAotCi0KLWRlZiBkZW1vKCk6Ci0gICAgIiIiRGVtb25zdHJhdGlvbiBhbmQgdGVzdGluZy4iIiIKLQotICAgIGltcG9ydCBzeXMKLSAgICBpbXBvcnQgZ2V0b3B0Ci0gICAgb3B0aW9ucywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAncicpCi0gICAgaWYgbGVuKGFyZ3MpICE9IDI6Ci0gICAgICAgIHJhaXNlIGdldG9wdC5lcnJvciwgJ25lZWQgZXhhY3RseSB0d28gYXJncycKLSAgICBkZCA9IGRpcmNtcCgpLm5ldyhhcmdzWzBdLCBhcmdzWzFdKQotICAgIGRkLnJ1bigpCi0gICAgaWYgKCctcicsICcnKSBpbiBvcHRpb25zOgotICAgICAgICBkZC5yZXBvcnRfcGhhc2U0X2Nsb3N1cmUoKQotICAgIGVsc2U6Ci0gICAgICAgIGRkLnJlcG9ydCgpCi0KLWlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gICAgZGVtbygpCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9kdW1wLnB5IGIvTGliL2xpYi1vbGQvZHVtcC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBiZGJhOC4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9kdW1wLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotIyBNb2R1bGUgJ2R1bXAnCi0jCi0jIFByaW50IHB5dGhvbiBjb2RlIHRoYXQgcmVjb25zdHJ1Y3RzIGEgdmFyaWFibGUuCi0jIFRoaXMgb25seSB3b3JrcyBpbiBjZXJ0YWluIGNhc2VzLgotIwotIyBJdCB3b3JrcyBmaW5lIGZvcjoKLSMgLSBpbnRzIGFuZCBmbG9hdHMgKGV4Y2VwdCBOYU5zIGFuZCBvdGhlciB3ZWlyZCB0aGluZ3MpCi0jIC0gc3RyaW5ncwotIyAtIGNvbXBvdW5kcyBhbmQgbGlzdHMsIHByb3ZpZGVkIGl0IHdvcmtzIGZvciBhbGwgdGhlaXIgZWxlbWVudHMKLSMgLSBpbXBvcnRlZCBtb2R1bGVzLCBwcm92aWRlZCB0aGVpciBuYW1lIGlzIHRoZSBtb2R1bGUgbmFtZQotIwotIyBJdCB3b3JrcyBmb3IgdG9wLWxldmVsIGRpY3Rpb25hcmllcyBidXQgbm90IGZvciBkaWN0aW9uYXJpZXMKLSMgY29udGFpbmVkIGluIG90aGVyIG9iamVjdHMgKGNvdWxkIGJlIG1hZGUgdG8gd29yayB3aXRoIHNvbWUgaGFzc2xlCi0jIHRob3VnaCkuCi0jCi0jIEl0IGRvZXMgbm90IHdvcmsgZm9yIGZ1bmN0aW9ucyAoYWxsIHNvcnRzKSwgY2xhc3NlcywgY2xhc3Mgb2JqZWN0cywKLSMgd2luZG93cywgZmlsZXMgZXRjLgotIwotIyBGaW5hbGx5LCBvYmplY3RzIHJlZmVyZW5jZWQgYnkgbW9yZSB0aGFuIG9uZSBuYW1lIG9yIGNvbnRhaW5lZCBpbiBtb3JlCi0jIHRoYW4gb25lIG90aGVyIG9iamVjdCBsb3NlIHRoZWlyIHNoYXJpbmcgcHJvcGVydHkgKHRoaXMgaXMgYmFkIGZvcgotIyBzdHJpbmdzIHVzZWQgYXMgZXhjZXB0aW9uIGlkZW50aWZpZXJzLCBmb3IgaW5zdGFuY2UpLgotCi0jIER1bXAgYSB3aG9sZSBzeW1ib2wgdGFibGUKLSMKLWRlZiBkdW1wc3ltdGFiKGRpY3QpOgotICAgIGZvciBrZXkgaW4gZGljdC5rZXlzKCk6Ci0gICAgICAgIGR1bXB2YXIoa2V5LCBkaWN0W2tleV0pCi0KLSMgRHVtcCBhIHNpbmdsZSB2YXJpYWJsZQotIwotZGVmIGR1bXB2YXIobmFtZSwgeCk6Ci0gICAgaW1wb3J0IHN5cwotICAgIHQgPSB0eXBlKHgpCi0gICAgaWYgdCA9PSB0eXBlKHt9KToKLSAgICAgICAgcHJpbnQgbmFtZSwgJz0ge30nCi0gICAgICAgIGZvciBrZXkgaW4geC5rZXlzKCk6Ci0gICAgICAgICAgICBpdGVtID0geFtrZXldCi0gICAgICAgICAgICBpZiBub3QgcHJpbnRhYmxlKGl0ZW0pOgotICAgICAgICAgICAgICAgIHByaW50ICcjJywKLSAgICAgICAgICAgIHByaW50IG5hbWUsICdbJywgYGtleWAsICddID0nLCBgaXRlbWAKLSAgICBlbGlmIHQgaW4gKHR5cGUoJycpLCB0eXBlKDApLCB0eXBlKDAuMCksIHR5cGUoW10pLCB0eXBlKCgpKSk6Ci0gICAgICAgIGlmIG5vdCBwcmludGFibGUoeCk6Ci0gICAgICAgICAgICBwcmludCAnIycsCi0gICAgICAgIHByaW50IG5hbWUsICc9JywgYHhgCi0gICAgZWxpZiB0ID09IHR5cGUoc3lzKToKLSAgICAgICAgcHJpbnQgJ2ltcG9ydCcsIG5hbWUsICcjJywgeAotICAgIGVsc2U6Ci0gICAgICAgIHByaW50ICcjJywgbmFtZSwgJz0nLCB4Ci0KLSMgY2hlY2sgaWYgYSB2YWx1ZSBpcyBwcmludGFibGUgaW4gYSB3YXkgdGhhdCBjYW4gYmUgcmVhZCBiYWNrIHdpdGggaW5wdXQoKQotIwotZGVmIHByaW50YWJsZSh4KToKLSAgICB0ID0gdHlwZSh4KQotICAgIGlmIHQgaW4gKHR5cGUoJycpLCB0eXBlKDApLCB0eXBlKDAuMCkpOgotICAgICAgICByZXR1cm4gMQotICAgIGlmIHQgaW4gKHR5cGUoW10pLCB0eXBlKCgpKSk6Ci0gICAgICAgIGZvciBpdGVtIGluIHg6Ci0gICAgICAgICAgICBpZiBub3QgcHJpbnRhYmxlKGl0ZW0pOgotICAgICAgICAgICAgICAgIHJldHVybiAwCi0gICAgICAgIHJldHVybiAxCi0gICAgaWYgeCA9PSB7fToKLSAgICAgICAgcmV0dXJuIDEKLSAgICByZXR1cm4gMApkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvZmluZC5weSBiL0xpYi9saWItb2xkL2ZpbmQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YWQ3NzEuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvZmluZC5weQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLWltcG9ydCBmbm1hdGNoCi1pbXBvcnQgb3MKLQotX2RlYnVnID0gMAotCi1fcHJ1bmUgPSBbJygqKSddCi0KLWRlZiBmaW5kKHBhdHRlcm4sIGRpciA9IG9zLmN1cmRpcik6Ci0gICAgbGlzdCA9IFtdCi0gICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcikKLSAgICBuYW1lcy5zb3J0KCkKLSAgICBmb3IgbmFtZSBpbiBuYW1lczoKLSAgICAgICAgaWYgbmFtZSBpbiAob3MuY3VyZGlyLCBvcy5wYXJkaXIpOgotICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgZnVsbG5hbWUgPSBvcy5wYXRoLmpvaW4oZGlyLCBuYW1lKQotICAgICAgICBpZiBmbm1hdGNoLmZubWF0Y2gobmFtZSwgcGF0dGVybik6Ci0gICAgICAgICAgICBsaXN0LmFwcGVuZChmdWxsbmFtZSkKLSAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmdWxsbmFtZSkgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhmdWxsbmFtZSk6Ci0gICAgICAgICAgICBmb3IgcCBpbiBfcHJ1bmU6Ci0gICAgICAgICAgICAgICAgaWYgZm5tYXRjaC5mbm1hdGNoKG5hbWUsIHApOgotICAgICAgICAgICAgICAgICAgICBpZiBfZGVidWc6IHByaW50ICJza2lwIiwgYGZ1bGxuYW1lYAotICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBpZiBfZGVidWc6IHByaW50ICJkZXNjZW5kIGludG8iLCBgZnVsbG5hbWVgCi0gICAgICAgICAgICAgICAgbGlzdCA9IGxpc3QgKyBmaW5kKHBhdHRlcm4sIGZ1bGxuYW1lKQotICAgIHJldHVybiBsaXN0CmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9mbXQucHkgYi9MaWIvbGliLW9sZC9mbXQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5N2QzN2EuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvZm10LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjIzICswLDAgQEAKLSMgVGV4dCBmb3JtYXR0aW5nIGFic3RyYWN0aW9ucwotIyBOb3RlIC0tIHRoaXMgbW9kdWxlIGlzIG9ic29sZXRlLCBpdCdzIHRvbyBzbG93IGFueXdheQotCi0KLWltcG9ydCBzdHJpbmcKLWltcG9ydCBQYXJhCi0KLQotIyBBIGZvcm1hdHRlciBiYWNrLWVuZCBvYmplY3QgaGFzIG9uZSBtZXRob2QgdGhhdCBpcyBjYWxsZWQgYnkgdGhlIGZvcm1hdHRlcjoKLSMgYWRkcGFyYShwKSwgd2hlcmUgcCBpcyBhIHBhcmFncmFwaCBvYmplY3QuICBGb3IgZXhhbXBsZToKLQotCi0jIEZvcm1hdHRlciBiYWNrLWVuZCB0byBkbyBub3RoaW5nIGF0IGFsbCB3aXRoIHRoZSBwYXJhZ3JhcGhzCi1jbGFzcyBOdWxsQmFja0VuZDoKLSAgICAjCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0gICAgIwotICAgIGRlZiBhZGRwYXJhKHNlbGYsIHApOgotICAgICAgICBwYXNzCi0gICAgIwotICAgIGRlZiBiZ25fYW5jaG9yKHNlbGYsIGlkKToKLSAgICAgICAgcGFzcwotICAgICMKLSAgICBkZWYgZW5kX2FuY2hvcihzZWxmLCBpZCk6Ci0gICAgICAgIHBhc3MKLQotCi0jIEZvcm1hdHRlciBiYWNrLWVuZCB0byBjb2xsZWN0IHRoZSBwYXJhZ3JhcGhzIGluIGEgbGlzdAotY2xhc3MgU2F2aW5nQmFja0VuZChOdWxsQmFja0VuZCk6Ci0gICAgIwotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5wYXJhbGlzdCA9IFtdCi0gICAgIwotICAgIGRlZiBhZGRwYXJhKHNlbGYsIHApOgotICAgICAgICBzZWxmLnBhcmFsaXN0LmFwcGVuZChwKQotICAgICMKLSAgICBkZWYgaGl0Y2hlY2soc2VsZiwgaCwgdik6Ci0gICAgICAgIGhpdHMgPSBbXQotICAgICAgICBmb3IgcCBpbiBzZWxmLnBhcmFsaXN0OgotICAgICAgICAgICAgaWYgcC50b3AgPD0gdiA8PSBwLmJvdHRvbToKLSAgICAgICAgICAgICAgICBmb3IgaWQgaW4gcC5oaXRjaGVjayhoLCB2KToKLSAgICAgICAgICAgICAgICAgICAgaWYgaWQgbm90IGluIGhpdHM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBoaXRzLmFwcGVuZChpZCkKLSAgICAgICAgcmV0dXJuIGhpdHMKLSAgICAjCi0gICAgZGVmIGV4dHJhY3Qoc2VsZik6Ci0gICAgICAgIHRleHQgPSAnJwotICAgICAgICBmb3IgcCBpbiBzZWxmLnBhcmFsaXN0OgotICAgICAgICAgICAgdGV4dCA9IHRleHQgKyAocC5leHRyYWN0KCkpCi0gICAgICAgIHJldHVybiB0ZXh0Ci0gICAgIwotICAgIGRlZiBleHRyYWN0cGFydChzZWxmLCBsb25nMSwgbG9uZzIpOgotICAgICAgICBpZiBsb25nMSA+IGxvbmcyOiBsb25nMSwgbG9uZzIgPSBsb25nMiwgbG9uZzEKLSAgICAgICAgcGFyYTEsIHBvczEgPSBsb25nMQotICAgICAgICBwYXJhMiwgcG9zMiA9IGxvbmcyCi0gICAgICAgIHRleHQgPSAnJwotICAgICAgICB3aGlsZSBwYXJhMSA8IHBhcmEyOgotICAgICAgICAgICAgcHRleHQgPSBzZWxmLnBhcmFsaXN0W3BhcmExXS5leHRyYWN0KCkKLSAgICAgICAgICAgIHRleHQgPSB0ZXh0ICsgcHRleHRbcG9zMTpdCi0gICAgICAgICAgICBwb3MxID0gMAotICAgICAgICAgICAgcGFyYTEgPSBwYXJhMSArIDEKLSAgICAgICAgcHRleHQgPSBzZWxmLnBhcmFsaXN0W3BhcmEyXS5leHRyYWN0KCkKLSAgICAgICAgcmV0dXJuIHRleHQgKyBwdGV4dFtwb3MxOnBvczJdCi0gICAgIwotICAgIGRlZiB3aGVyZWlzKHNlbGYsIGQsIGgsIHYpOgotICAgICAgICB0b3RhbCA9IDAKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYucGFyYWxpc3QpKToKLSAgICAgICAgICAgIHAgPSBzZWxmLnBhcmFsaXN0W2ldCi0gICAgICAgICAgICByZXN1bHQgPSBwLndoZXJlaXMoZCwgaCwgdikKLSAgICAgICAgICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICByZXR1cm4gaSwgcmVzdWx0Ci0gICAgICAgIHJldHVybiBOb25lCi0gICAgIwotICAgIGRlZiByb3VuZHRvd29yZHMoc2VsZiwgbG9uZzEsIGxvbmcyKToKLSAgICAgICAgaSwgb2Zmc2V0ID0gbG9uZzEKLSAgICAgICAgdGV4dCA9IHNlbGYucGFyYWxpc3RbaV0uZXh0cmFjdCgpCi0gICAgICAgIHdoaWxlIG9mZnNldCA+IDAgYW5kIHRleHRbb2Zmc2V0LTFdICE9ICcgJzogb2Zmc2V0ID0gb2Zmc2V0LTEKLSAgICAgICAgbG9uZzEgPSBpLCBvZmZzZXQKLSAgICAgICAgIwotICAgICAgICBpLCBvZmZzZXQgPSBsb25nMgotICAgICAgICB0ZXh0ID0gc2VsZi5wYXJhbGlzdFtpXS5leHRyYWN0KCkKLSAgICAgICAgbiA9IGxlbih0ZXh0KQotICAgICAgICB3aGlsZSBvZmZzZXQgPCBuLTEgYW5kIHRleHRbb2Zmc2V0XSAhPSAnICc6IG9mZnNldCA9IG9mZnNldCsxCi0gICAgICAgIGxvbmcyID0gaSwgb2Zmc2V0Ci0gICAgICAgICMKLSAgICAgICAgcmV0dXJuIGxvbmcxLCBsb25nMgotICAgICMKLSAgICBkZWYgcm91bmR0b3BhcmFncmFwaHMoc2VsZiwgbG9uZzEsIGxvbmcyKToKLSAgICAgICAgbG9uZzEgPSBsb25nMVswXSwgMAotICAgICAgICBsb25nMiA9IGxvbmcyWzBdLCBsZW4oc2VsZi5wYXJhbGlzdFtsb25nMlswXV0uZXh0cmFjdCgpKQotICAgICAgICByZXR1cm4gbG9uZzEsIGxvbmcyCi0KLQotIyBGb3JtYXR0ZXIgYmFjay1lbmQgdG8gc2VuZCB0aGUgdGV4dCBkaXJlY3RseSB0byB0aGUgZHJhd2luZyBvYmplY3QKLWNsYXNzIFdyaXRpbmdCYWNrRW5kKE51bGxCYWNrRW5kKToKLSAgICAjCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGQsIHdpZHRoKToKLSAgICAgICAgc2VsZi5kID0gZAotICAgICAgICBzZWxmLndpZHRoID0gd2lkdGgKLSAgICAgICAgc2VsZi5saW5lbm8gPSAwCi0gICAgIwotICAgIGRlZiBhZGRwYXJhKHNlbGYsIHApOgotICAgICAgICBzZWxmLmxpbmVubyA9IHAucmVuZGVyKHNlbGYuZCwgMCwgc2VsZi5saW5lbm8sIHNlbGYud2lkdGgpCi0KLQotIyBBIGZvcm1hdHRlciByZWNlaXZlcyBhIHN0cmVhbSBvZiBmb3JtYXR0aW5nIGluc3RydWN0aW9ucyBhbmQgYXNzZW1ibGVzCi0jIHRoZXNlIGludG8gYSBzdHJlYW0gb2YgcGFyYWdyYXBocyBvbiB0byBhIGJhY2stZW5kLiAgVGhlIGFzc2VtYmx5IGlzCi0jIHBhcmFtZXRyaXplZCBieSBhIHRleHQgbWVhc3VyZW1lbnQgb2JqZWN0LCB3aGljaCBtdXN0IG1hdGNoIHRoZSBvdXRwdXQKLSMgb3BlcmF0aW9ucyBvZiB0aGUgYmFjay1lbmQuICBUaGUgYmFjay1lbmQgaXMgcmVzcG9uc2libGUgZm9yIHNwbGl0dGluZwotIyBwYXJhZ3JhcGhzIHVwIGluIGxpbmVzIG9mIGEgZ2l2ZW4gbWF4aW11bSB3aWR0aC4gIChUaGlzIGlzIGRvbmUgYmVjYXVzZQotIyBpbiBhIHdpbmRvd2luZyBlbnZpcm9ubWVudCwgd2hlbiB0aGUgd2luZG93IHNpemUgY2hhbmdlcywgdGhlcmUgaXMgbm8KLSMgbmVlZCB0byByZWRvIHRoZSBhc3NlbWJseSBpbnRvIHBhcmFncmFwaHMsIGJ1dCB0aGUgc3BsaXR0aW5nIGludG8gbGluZXMKLSMgbXVzdCBiZSBkb25lIHRha2luZyB0aGUgbmV3IHdpbmRvdyBzaXplIGludG8gYWNjb3VudC4pCi0KLQotIyBGb3JtYXR0ZXIgYmFzZSBjbGFzcy4gIEluaXRpYWxpemUgaXQgd2l0aCBhIHRleHQgbWVhc3VyZW1lbnQgb2JqZWN0LAotIyB3aGljaCBpcyB1c2VkIGZvciB0ZXh0IG1lYXN1cmVtZW50cywgYW5kIGEgYmFjay1lbmQgb2JqZWN0LAotIyB3aGljaCByZWNlaXZlcyB0aGUgY29tcGxldGVkIHBhcmFncmFwaHMuICBUaGUgZm9ybWF0dGluZyBtZXRob2RzIGFyZToKLSMgc2V0Zm9udChmb250KQotIyBzZXRsZWZ0aW5kZW50KG5zcGFjZXMpCi0jIHNldGp1c3QodHlwZSkgd2hlcmUgdHlwZSBpcyAnbCcsICdjJywgJ3InLCBvciAnbHInCi0jIGZsdXNoKCkKLSMgdnNwYWNlKG5saW5lcykKLSMgbmVlZHZzcGFjZShubGluZXMpCi0jIGFkZHdvcmQod29yZCwgbnNwYWNlcykKLWNsYXNzIEJhc2VGb3JtYXR0ZXI6Ci0gICAgIwotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkLCBiKToKLSAgICAgICAgIyBEcmF3aW5nIG9iamVjdCB1c2VkIGZvciB0ZXh0IG1lYXN1cmVtZW50cwotICAgICAgICBzZWxmLmQgPSBkCi0gICAgICAgICMKLSAgICAgICAgIyBCYWNrRW5kIG9iamVjdCByZWNlaXZpbmcgY29tcGxldGVkIHBhcmFncmFwaHMKLSAgICAgICAgc2VsZi5iID0gYgotICAgICAgICAjCi0gICAgICAgICMgUGFyYW1ldGVycyBvZiB0aGUgZm9ybWF0dGluZyBtb2RlbAotICAgICAgICBzZWxmLmxlZnRpbmRlbnQgPSAwCi0gICAgICAgIHNlbGYuanVzdCA9ICdsJwotICAgICAgICBzZWxmLmZvbnQgPSBOb25lCi0gICAgICAgIHNlbGYuYmxhbmtsaW5lcyA9IDAKLSAgICAgICAgIwotICAgICAgICAjIFBhcmFtZXRlcnMgZGVyaXZlZCBmcm9tIHRoZSBjdXJyZW50IGZvbnQKLSAgICAgICAgc2VsZi5zcGFjZSA9IGQudGV4dHdpZHRoKCcgJykKLSAgICAgICAgc2VsZi5saW5lID0gZC5saW5laGVpZ2h0KCkKLSAgICAgICAgc2VsZi5hc2NlbnQgPSBkLmJhc2VsaW5lKCkKLSAgICAgICAgc2VsZi5kZXNjZW50ID0gc2VsZi5saW5lIC0gc2VsZi5hc2NlbnQKLSAgICAgICAgIwotICAgICAgICAjIFBhcmFtZXRlciBkZXJpdmVkIGZyb20gdGhlIGRlZmF1bHQgZm9udAotICAgICAgICBzZWxmLm5fc3BhY2UgPSBzZWxmLnNwYWNlCi0gICAgICAgICMKLSAgICAgICAgIyBDdXJyZW50IHBhcmFncmFwaCBiZWluZyBidWlsdAotICAgICAgICBzZWxmLnBhcmEgPSBOb25lCi0gICAgICAgIHNlbGYubm9zcGFjZSA9IDEKLSAgICAgICAgIwotICAgICAgICAjIEZvbnQgdG8gc2V0IG9uIHRoZSBuZXh0IHdvcmQKLSAgICAgICAgc2VsZi5uZXh0Zm9udCA9IE5vbmUKLSAgICAjCi0gICAgZGVmIG5ld3BhcmEoc2VsZik6Ci0gICAgICAgIHJldHVybiBQYXJhLlBhcmEoKQotICAgICMKLSAgICBkZWYgc2V0Zm9udChzZWxmLCBmb250KToKLSAgICAgICAgaWYgZm9udCBpcyBOb25lOiByZXR1cm4KLSAgICAgICAgc2VsZi5mb250ID0gc2VsZi5uZXh0Zm9udCA9IGZvbnQKLSAgICAgICAgZCA9IHNlbGYuZAotICAgICAgICBkLnNldGZvbnQoZm9udCkKLSAgICAgICAgc2VsZi5zcGFjZSA9IGQudGV4dHdpZHRoKCcgJykKLSAgICAgICAgc2VsZi5saW5lID0gZC5saW5laGVpZ2h0KCkKLSAgICAgICAgc2VsZi5hc2NlbnQgPSBkLmJhc2VsaW5lKCkKLSAgICAgICAgc2VsZi5kZXNjZW50ID0gc2VsZi5saW5lIC0gc2VsZi5hc2NlbnQKLSAgICAjCi0gICAgZGVmIHNldGxlZnRpbmRlbnQoc2VsZiwgbnNwYWNlcyk6Ci0gICAgICAgIHNlbGYubGVmdGluZGVudCA9IGludChzZWxmLm5fc3BhY2UgKiBuc3BhY2VzKQotICAgICAgICBpZiBzZWxmLnBhcmE6Ci0gICAgICAgICAgICBoYW5nID0gc2VsZi5sZWZ0aW5kZW50IC0gc2VsZi5wYXJhLmluZGVudF9sZWZ0Ci0gICAgICAgICAgICBpZiBoYW5nID4gMCBhbmQgc2VsZi5wYXJhLmdldGxlbmd0aCgpIDw9IGhhbmc6Ci0gICAgICAgICAgICAgICAgc2VsZi5wYXJhLm1ha2VoYW5naW5ndGFnKGhhbmcpCi0gICAgICAgICAgICAgICAgc2VsZi5ub3NwYWNlID0gMQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLmZsdXNoKCkKLSAgICAjCi0gICAgZGVmIHNldHJpZ2h0aW5kZW50KHNlbGYsIG5zcGFjZXMpOgotICAgICAgICBzZWxmLnJpZ2h0aW5kZW50ID0gaW50KHNlbGYubl9zcGFjZSAqIG5zcGFjZXMpCi0gICAgICAgIGlmIHNlbGYucGFyYToKLSAgICAgICAgICAgIHNlbGYucGFyYS5pbmRlbnRfcmlnaHQgPSBzZWxmLnJpZ2h0aW5kZW50Ci0gICAgICAgICAgICBzZWxmLmZsdXNoKCkKLSAgICAjCi0gICAgZGVmIHNldGp1c3Qoc2VsZiwganVzdCk6Ci0gICAgICAgIHNlbGYuanVzdCA9IGp1c3QKLSAgICAgICAgaWYgc2VsZi5wYXJhOgotICAgICAgICAgICAgc2VsZi5wYXJhLmp1c3QgPSBzZWxmLmp1c3QKLSAgICAjCi0gICAgZGVmIGZsdXNoKHNlbGYpOgotICAgICAgICBpZiBzZWxmLnBhcmE6Ci0gICAgICAgICAgICBzZWxmLmIuYWRkcGFyYShzZWxmLnBhcmEpCi0gICAgICAgICAgICBzZWxmLnBhcmEgPSBOb25lCi0gICAgICAgICAgICBpZiBzZWxmLmZvbnQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5kLnNldGZvbnQoc2VsZi5mb250KQotICAgICAgICBzZWxmLm5vc3BhY2UgPSAxCi0gICAgIwotICAgIGRlZiB2c3BhY2Uoc2VsZiwgbmxpbmVzKToKLSAgICAgICAgc2VsZi5mbHVzaCgpCi0gICAgICAgIGlmIG5saW5lcyA+IDA6Ci0gICAgICAgICAgICBzZWxmLnBhcmEgPSBzZWxmLm5ld3BhcmEoKQotICAgICAgICAgICAgdHVwbGUgPSBOb25lLCAnJywgMCwgMCwgMCwgaW50KG5saW5lcypzZWxmLmxpbmUpLCAwCi0gICAgICAgICAgICBzZWxmLnBhcmEud29yZHMuYXBwZW5kKHR1cGxlKQotICAgICAgICAgICAgc2VsZi5mbHVzaCgpCi0gICAgICAgICAgICBzZWxmLmJsYW5rbGluZXMgPSBzZWxmLmJsYW5rbGluZXMgKyBubGluZXMKLSAgICAjCi0gICAgZGVmIG5lZWR2c3BhY2Uoc2VsZiwgbmxpbmVzKToKLSAgICAgICAgc2VsZi5mbHVzaCgpICMgSnVzdCB0byBiZSBzdXJlCi0gICAgICAgIGlmIG5saW5lcyA+IHNlbGYuYmxhbmtsaW5lczoKLSAgICAgICAgICAgIHNlbGYudnNwYWNlKG5saW5lcyAtIHNlbGYuYmxhbmtsaW5lcykKLSAgICAjCi0gICAgZGVmIGFkZHdvcmQoc2VsZiwgdGV4dCwgc3BhY2UpOgotICAgICAgICBpZiBzZWxmLm5vc3BhY2UgYW5kIG5vdCB0ZXh0OgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYubm9zcGFjZSA9IDAKLSAgICAgICAgc2VsZi5ibGFua2xpbmVzID0gMAotICAgICAgICBpZiBub3Qgc2VsZi5wYXJhOgotICAgICAgICAgICAgc2VsZi5wYXJhID0gc2VsZi5uZXdwYXJhKCkKLSAgICAgICAgICAgIHNlbGYucGFyYS5pbmRlbnRfbGVmdCA9IHNlbGYubGVmdGluZGVudAotICAgICAgICAgICAgc2VsZi5wYXJhLmp1c3QgPSBzZWxmLmp1c3QKLSAgICAgICAgICAgIHNlbGYubmV4dGZvbnQgPSBzZWxmLmZvbnQKLSAgICAgICAgc3BhY2UgPSBpbnQoc3BhY2UgKiBzZWxmLnNwYWNlKQotICAgICAgICBzZWxmLnBhcmEud29yZHMuYXBwZW5kKChzZWxmLm5leHRmb250LCB0ZXh0LAotICAgICAgICAgICAgICAgIHNlbGYuZC50ZXh0d2lkdGgodGV4dCksIHNwYWNlLCBzcGFjZSwKLSAgICAgICAgICAgICAgICBzZWxmLmFzY2VudCwgc2VsZi5kZXNjZW50KSkKLSAgICAgICAgc2VsZi5uZXh0Zm9udCA9IE5vbmUKLSAgICAjCi0gICAgZGVmIGJnbl9hbmNob3Ioc2VsZiwgaWQpOgotICAgICAgICBpZiBub3Qgc2VsZi5wYXJhOgotICAgICAgICAgICAgc2VsZi5ub3NwYWNlID0gMAotICAgICAgICAgICAgc2VsZi5hZGR3b3JkKCcnLCAwKQotICAgICAgICBzZWxmLnBhcmEuYmduX2FuY2hvcihpZCkKLSAgICAjCi0gICAgZGVmIGVuZF9hbmNob3Ioc2VsZiwgaWQpOgotICAgICAgICBpZiBub3Qgc2VsZi5wYXJhOgotICAgICAgICAgICAgc2VsZi5ub3NwYWNlID0gMAotICAgICAgICAgICAgc2VsZi5hZGR3b3JkKCcnLCAwKQotICAgICAgICBzZWxmLnBhcmEuZW5kX2FuY2hvcihpZCkKLQotCi0jIE1lYXN1cmluZyBvYmplY3QgZm9yIG1lYXN1cmluZyB0ZXh0IGFzIHZpZXdlZCBvbiBhIHR0eQotY2xhc3MgTnVsbE1lYXN1cmVyOgotICAgICMKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLSAgICAjCi0gICAgZGVmIHNldGZvbnQoc2VsZiwgZm9udCk6Ci0gICAgICAgIHBhc3MKLSAgICAjCi0gICAgZGVmIHRleHR3aWR0aChzZWxmLCB0ZXh0KToKLSAgICAgICAgcmV0dXJuIGxlbih0ZXh0KQotICAgICMKLSAgICBkZWYgbGluZWhlaWdodChzZWxmKToKLSAgICAgICAgcmV0dXJuIDEKLSAgICAjCi0gICAgZGVmIGJhc2VsaW5lKHNlbGYpOgotICAgICAgICByZXR1cm4gMAotCi0KLSMgRHJhd2luZyBvYmplY3QgZm9yIHdyaXRpbmcgcGxhaW4gQVNDSUkgdGV4dCB0byBhIGZpbGUKLWNsYXNzIEZpbGVXcml0ZXI6Ci0gICAgIwotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCk6Ci0gICAgICAgIHNlbGYuZnAgPSBmcAotICAgICAgICBzZWxmLmxpbmVubywgc2VsZi5jb2xubyA9IDAsIDAKLSAgICAjCi0gICAgZGVmIHNldGZvbnQoc2VsZiwgZm9udCk6Ci0gICAgICAgIHBhc3MKLSAgICAjCi0gICAgZGVmIHRleHQoc2VsZiwgKGgsIHYpLCBzdHIpOgotICAgICAgICBpZiBub3Qgc3RyOiByZXR1cm4KLSAgICAgICAgaWYgJ1xuJyBpbiBzdHI6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnY2FuXCd0IHdyaXRlIFxcbicKLSAgICAgICAgd2hpbGUgc2VsZi5saW5lbm8gPCB2OgotICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgnXG4nKQotICAgICAgICAgICAgc2VsZi5jb2xubywgc2VsZi5saW5lbm8gPSAwLCBzZWxmLmxpbmVubyArIDEKLSAgICAgICAgd2hpbGUgc2VsZi5saW5lbm8gPiB2OgotICAgICAgICAgICAgIyBYWFggVGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLi4uCi0gICAgICAgICAgICBzZWxmLmZwLndyaXRlKCdcMDMzW0EnKSAjIEFOU0kgdXAgYXJyb3cKLSAgICAgICAgICAgIHNlbGYubGluZW5vID0gc2VsZi5saW5lbm8gLSAxCi0gICAgICAgIGlmIHNlbGYuY29sbm8gPCBoOgotICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgnICcgKiAoaCAtIHNlbGYuY29sbm8pKQotICAgICAgICBlbGlmIHNlbGYuY29sbm8gPiBoOgotICAgICAgICAgICAgc2VsZi5mcC53cml0ZSgnXGInICogKHNlbGYuY29sbm8gLSBoKSkKLSAgICAgICAgc2VsZi5jb2xubyA9IGgKLSAgICAgICAgc2VsZi5mcC53cml0ZShzdHIpCi0gICAgICAgIHNlbGYuY29sbm8gPSBoICsgbGVuKHN0cikKLQotCi0jIEZvcm1hdHRpbmcgY2xhc3MgdG8gZG8gbm90aGluZyBhdCBhbGwgd2l0aCB0aGUgZGF0YQotY2xhc3MgTnVsbEZvcm1hdHRlcihCYXNlRm9ybWF0dGVyKToKLSAgICAjCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBkID0gTnVsbE1lYXN1cmVyKCkKLSAgICAgICAgYiA9IE51bGxCYWNrRW5kKCkKLSAgICAgICAgQmFzZUZvcm1hdHRlci5fX2luaXRfXyhzZWxmLCBkLCBiKQotCi0KLSMgRm9ybWF0dGluZyBjbGFzcyB0byB3cml0ZSBkaXJlY3RseSB0byBhIGZpbGUKLWNsYXNzIFdyaXRpbmdGb3JtYXR0ZXIoQmFzZUZvcm1hdHRlcik6Ci0gICAgIwotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBmcCwgd2lkdGgpOgotICAgICAgICBkbSA9IE51bGxNZWFzdXJlcigpCi0gICAgICAgIGR3ID0gRmlsZVdyaXRlcihmcCkKLSAgICAgICAgYiA9IFdyaXRpbmdCYWNrRW5kKGR3LCB3aWR0aCkKLSAgICAgICAgQmFzZUZvcm1hdHRlci5fX2luaXRfXyhzZWxmLCBkbSwgYikKLSAgICAgICAgc2VsZi5ibGFua2xpbmVzID0gMQotICAgICMKLSAgICAjIFN1cHByZXNzIG11bHRpcGxlIGJsYW5rIGxpbmVzCi0gICAgZGVmIG5lZWR2c3BhY2Uoc2VsZiwgbmxpbmVzKToKLSAgICAgICAgQmFzZUZvcm1hdHRlci5uZWVkdnNwYWNlKHNlbGYsIG1pbigxLCBubGluZXMpKQotCi0KLSMgQSAiRnVubnlGb3JtYXR0ZXIiIHdyaXRlcyBBU0NJSSB0ZXh0IHdpdGggYSB0d2lzdDogKmJvbGQgd29yZHMqLAotIyBfaXRhbGljIHRleHRfIGFuZCBfdW5kZXJsaW5lZCB3b3Jkc18sIGFuZCBgcXVvdGVkIHRleHQnLgotIyBJdCBhc3N1bWVzIHRoYXQgdGhlIGZvbnRzIGFyZSAncicsICdpJywgJ2InLCAndScsICdxJzogKHJvbWFuLAotIyBpdGFsaWMsIGJvbGQsIHVuZGVybGluZSwgcXVvdGUpLgotIyBNb3Jlb3ZlciwgaWYgdGhlIGZvbnQgaXMgaW4gdXBwZXIgY2FzZSwgdGhlIHRleHQgaXMgY29udmVydGVkIHRvCi0jIFVQUEVSIENBU0UuCi1jbGFzcyBGdW5ueUZvcm1hdHRlcihXcml0aW5nRm9ybWF0dGVyKToKLSAgICAjCi0gICAgZGVmIGZsdXNoKHNlbGYpOgotICAgICAgICBpZiBzZWxmLnBhcmE6IGZpbmFsaXplKHNlbGYucGFyYSkKLSAgICAgICAgV3JpdGluZ0Zvcm1hdHRlci5mbHVzaChzZWxmKQotCi0KLSMgU3Vycm91bmRzICpib2xkIHdvcmRzKiBhbmQgX2l0YWxpYyB0ZXh0XyBpbiBhIHBhcmFncmFwaCB3aXRoCi0jIGFwcHJvcHJpYXRlIG1hcmtlcnMsIGZpeGluZyB0aGUgc2l6ZSAoYXNzdW1pbmcgdGhlc2UgY2hhcmFjdGVycycKLSMgd2lkdGggaXMgMSkuCi1vcGVuY2hhciA9IFwKLSAgICB7J2InOicqJywgJ2knOidfJywgJ3UnOidfJywgJ3EnOidgJywgJ0InOicqJywgJ0knOidfJywgJ1UnOidfJywgJ1EnOidgJ30KLWNsb3NlY2hhciA9IFwKLSAgICB7J2InOicqJywgJ2knOidfJywgJ3UnOidfJywgJ3EnOidcJycsICdCJzonKicsICdJJzonXycsICdVJzonXycsICdRJzonXCcnfQotZGVmIGZpbmFsaXplKHBhcmEpOgotICAgIG9sZGZvbnQgPSBjdXJmb250ID0gJ3InCi0gICAgcGFyYS53b3Jkcy5hcHBlbmQoKCdyJywgJycsIDAsIDAsIDAsIDApKSAjIHRlbXBvcmFyeSwgZGVsZXRlZCBhdCBlbmQKLSAgICBmb3IgaSBpbiByYW5nZShsZW4ocGFyYS53b3JkcykpOgotICAgICAgICBmbywgdGUsIHdpID0gcGFyYS53b3Jkc1tpXVs6M10KLSAgICAgICAgaWYgZm8gaXMgbm90IE5vbmU6IGN1cmZvbnQgPSBmbwotICAgICAgICBpZiBjdXJmb250ICE9IG9sZGZvbnQ6Ci0gICAgICAgICAgICBpZiBjbG9zZWNoYXIuaGFzX2tleShvbGRmb250KToKLSAgICAgICAgICAgICAgICBjID0gY2xvc2VjaGFyW29sZGZvbnRdCi0gICAgICAgICAgICAgICAgaiA9IGktMQotICAgICAgICAgICAgICAgIHdoaWxlIGogPiAwIGFuZCBwYXJhLndvcmRzW2pdWzFdID09ICcnOiBqID0gai0xCi0gICAgICAgICAgICAgICAgZm8xLCB0ZTEsIHdpMSA9IHBhcmEud29yZHNbal1bOjNdCi0gICAgICAgICAgICAgICAgdGUxID0gdGUxICsgYwotICAgICAgICAgICAgICAgIHdpMSA9IHdpMSArIGxlbihjKQotICAgICAgICAgICAgICAgIHBhcmEud29yZHNbal0gPSAoZm8xLCB0ZTEsIHdpMSkgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJhLndvcmRzW2pdWzM6XQotICAgICAgICAgICAgaWYgb3BlbmNoYXIuaGFzX2tleShjdXJmb250KSBhbmQgdGU6Ci0gICAgICAgICAgICAgICAgYyA9IG9wZW5jaGFyW2N1cmZvbnRdCi0gICAgICAgICAgICAgICAgdGUgPSBjICsgdGUKLSAgICAgICAgICAgICAgICB3aSA9IGxlbihjKSArIHdpCi0gICAgICAgICAgICAgICAgcGFyYS53b3Jkc1tpXSA9IChmbywgdGUsIHdpKSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmEud29yZHNbaV1bMzpdCi0gICAgICAgICAgICBpZiB0ZTogb2xkZm9udCA9IGN1cmZvbnQKLSAgICAgICAgICAgIGVsc2U6IG9sZGZvbnQgPSAncicKLSAgICAgICAgaWYgY3VyZm9udCBpbiBzdHJpbmcudXBwZXJjYXNlOgotICAgICAgICAgICAgdGUgPSBzdHJpbmcudXBwZXIodGUpCi0gICAgICAgICAgICBwYXJhLndvcmRzW2ldID0gKGZvLCB0ZSwgd2kpICsgcGFyYS53b3Jkc1tpXVszOl0KLSAgICBkZWwgcGFyYS53b3Jkc1stMV0KLQotCi0jIEZvcm1hdHRlciBiYWNrLWVuZCB0byBkcmF3IHRoZSB0ZXh0IGluIGEgd2luZG93LgotIyBUaGlzIGhhcyBhbiBvcHRpb24gdG8gZHJhdyB3aGlsZSB0aGUgcGFyYWdyYXBocyBhcmUgYmVpbmcgYWRkZWQsCi0jIHRvIG1pbmltaXplIHRoZSBkZWxheSBiZWZvcmUgdGhlIHVzZXIgc2VlcyBhbnl0aGluZy4KLSMgVGhpcyBtYW5hZ2VzIHRoZSBlbnRpcmUgImRvY3VtZW50IiBvZiB0aGUgd2luZG93LgotY2xhc3MgU3Rkd2luQmFja0VuZChTYXZpbmdCYWNrRW5kKToKLSAgICAjCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHdpbmRvdywgZHJhd25vdyk6Ci0gICAgICAgIHNlbGYud2luZG93ID0gd2luZG93Ci0gICAgICAgIHNlbGYuZHJhd25vdyA9IGRyYXdub3cKLSAgICAgICAgc2VsZi53aWR0aCA9IHdpbmRvdy5nZXR3aW5zaXplKClbMF0KLSAgICAgICAgc2VsZi5zZWxlY3Rpb24gPSBOb25lCi0gICAgICAgIHNlbGYuaGVpZ2h0ID0gMAotICAgICAgICB3aW5kb3cuc2V0b3JpZ2luKDAsIDApCi0gICAgICAgIHdpbmRvdy5zZXRkb2NzaXplKDAsIDApCi0gICAgICAgIHNlbGYuZCA9IHdpbmRvdy5iZWdpbmRyYXdpbmcoKQotICAgICAgICBTYXZpbmdCYWNrRW5kLl9faW5pdF9fKHNlbGYpCi0gICAgIwotICAgIGRlZiBmaW5pc2goc2VsZik6Ci0gICAgICAgIHNlbGYuZC5jbG9zZSgpCi0gICAgICAgIHNlbGYuZCA9IE5vbmUKLSAgICAgICAgc2VsZi53aW5kb3cuc2V0ZG9jc2l6ZSgwLCBzZWxmLmhlaWdodCkKLSAgICAjCi0gICAgZGVmIGFkZHBhcmEoc2VsZiwgcCk6Ci0gICAgICAgIHNlbGYucGFyYWxpc3QuYXBwZW5kKHApCi0gICAgICAgIGlmIHNlbGYuZHJhd25vdzoKLSAgICAgICAgICAgIHNlbGYuaGVpZ2h0ID0gXAotICAgICAgICAgICAgICAgICAgICBwLnJlbmRlcihzZWxmLmQsIDAsIHNlbGYuaGVpZ2h0LCBzZWxmLndpZHRoKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcC5sYXlvdXQoc2VsZi53aWR0aCkKLSAgICAgICAgICAgIHAubGVmdCA9IDAKLSAgICAgICAgICAgIHAudG9wID0gc2VsZi5oZWlnaHQKLSAgICAgICAgICAgIHAucmlnaHQgPSBzZWxmLndpZHRoCi0gICAgICAgICAgICBwLmJvdHRvbSA9IHNlbGYuaGVpZ2h0ICsgcC5oZWlnaHQKLSAgICAgICAgICAgIHNlbGYuaGVpZ2h0ID0gcC5ib3R0b20KLSAgICAjCi0gICAgZGVmIHJlc2l6ZShzZWxmKToKLSAgICAgICAgc2VsZi53aW5kb3cuY2hhbmdlKCgwLCAwKSwgKHNlbGYud2lkdGgsIHNlbGYuaGVpZ2h0KSkKLSAgICAgICAgc2VsZi53aWR0aCA9IHNlbGYud2luZG93LmdldHdpbnNpemUoKVswXQotICAgICAgICBzZWxmLmhlaWdodCA9IDAKLSAgICAgICAgZm9yIHAgaW4gc2VsZi5wYXJhbGlzdDoKLSAgICAgICAgICAgIHAubGF5b3V0KHNlbGYud2lkdGgpCi0gICAgICAgICAgICBwLmxlZnQgPSAwCi0gICAgICAgICAgICBwLnRvcCA9IHNlbGYuaGVpZ2h0Ci0gICAgICAgICAgICBwLnJpZ2h0ID0gc2VsZi53aWR0aAotICAgICAgICAgICAgcC5ib3R0b20gPSBzZWxmLmhlaWdodCArIHAuaGVpZ2h0Ci0gICAgICAgICAgICBzZWxmLmhlaWdodCA9IHAuYm90dG9tCi0gICAgICAgIHNlbGYud2luZG93LmNoYW5nZSgoMCwgMCksIChzZWxmLndpZHRoLCBzZWxmLmhlaWdodCkpCi0gICAgICAgIHNlbGYud2luZG93LnNldGRvY3NpemUoMCwgc2VsZi5oZWlnaHQpCi0gICAgIwotICAgIGRlZiByZWRyYXcoc2VsZiwgYXJlYSk6Ci0gICAgICAgIGQgPSBzZWxmLndpbmRvdy5iZWdpbmRyYXdpbmcoKQotICAgICAgICAobGVmdCwgdG9wKSwgKHJpZ2h0LCBib3R0b20pID0gYXJlYQotICAgICAgICBkLmVyYXNlKGFyZWEpCi0gICAgICAgIGQuY2xpcHJlY3QoYXJlYSkKLSAgICAgICAgZm9yIHAgaW4gc2VsZi5wYXJhbGlzdDoKLSAgICAgICAgICAgIGlmIHRvcCA8IHAuYm90dG9tIGFuZCBwLnRvcCA8IGJvdHRvbToKLSAgICAgICAgICAgICAgICB2ID0gcC5yZW5kZXIoZCwgcC5sZWZ0LCBwLnRvcCwgcC5yaWdodCkKLSAgICAgICAgaWYgc2VsZi5zZWxlY3Rpb246Ci0gICAgICAgICAgICBzZWxmLmludmVydChkLCBzZWxmLnNlbGVjdGlvbikKLSAgICAgICAgZC5jbG9zZSgpCi0gICAgIwotICAgIGRlZiBzZXRzZWxlY3Rpb24oc2VsZiwgbmV3KToKLSAgICAgICAgaWYgbmV3OgotICAgICAgICAgICAgbG9uZzEsIGxvbmcyID0gbmV3Ci0gICAgICAgICAgICBwb3MxID0gbG9uZzFbOjNdCi0gICAgICAgICAgICBwb3MyID0gbG9uZzJbOjNdCi0gICAgICAgICAgICBuZXcgPSBwb3MxLCBwb3MyCi0gICAgICAgIGlmIG5ldyAhPSBzZWxmLnNlbGVjdGlvbjoKLSAgICAgICAgICAgIGQgPSBzZWxmLndpbmRvdy5iZWdpbmRyYXdpbmcoKQotICAgICAgICAgICAgaWYgc2VsZi5zZWxlY3Rpb246Ci0gICAgICAgICAgICAgICAgc2VsZi5pbnZlcnQoZCwgc2VsZi5zZWxlY3Rpb24pCi0gICAgICAgICAgICBpZiBuZXc6Ci0gICAgICAgICAgICAgICAgc2VsZi5pbnZlcnQoZCwgbmV3KQotICAgICAgICAgICAgZC5jbG9zZSgpCi0gICAgICAgICAgICBzZWxmLnNlbGVjdGlvbiA9IG5ldwotICAgICMKLSAgICBkZWYgZ2V0c2VsZWN0aW9uKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5zZWxlY3Rpb24KLSAgICAjCi0gICAgZGVmIGV4dHJhY3RzZWxlY3Rpb24oc2VsZik6Ci0gICAgICAgIGlmIHNlbGYuc2VsZWN0aW9uOgotICAgICAgICAgICAgYSwgYiA9IHNlbGYuc2VsZWN0aW9uCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5leHRyYWN0cGFydChhLCBiKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAjCi0gICAgZGVmIGludmVydChzZWxmLCBkLCByZWdpb24pOgotICAgICAgICBsb25nMSwgbG9uZzIgPSByZWdpb24KLSAgICAgICAgaWYgbG9uZzEgPiBsb25nMjogbG9uZzEsIGxvbmcyID0gbG9uZzIsIGxvbmcxCi0gICAgICAgIHBhcmExLCBwb3MxID0gbG9uZzEKLSAgICAgICAgcGFyYTIsIHBvczIgPSBsb25nMgotICAgICAgICB3aGlsZSBwYXJhMSA8IHBhcmEyOgotICAgICAgICAgICAgc2VsZi5wYXJhbGlzdFtwYXJhMV0uaW52ZXJ0KGQsIHBvczEsIE5vbmUpCi0gICAgICAgICAgICBwb3MxID0gTm9uZQotICAgICAgICAgICAgcGFyYTEgPSBwYXJhMSArIDEKLSAgICAgICAgc2VsZi5wYXJhbGlzdFtwYXJhMl0uaW52ZXJ0KGQsIHBvczEsIHBvczIpCi0gICAgIwotICAgIGRlZiBzZWFyY2goc2VsZiwgcHJvZyk6Ci0gICAgICAgIGltcG9ydCByZSwgc3RyaW5nCi0gICAgICAgIGlmIHR5cGUocHJvZykgaXMgdHlwZSgnJyk6Ci0gICAgICAgICAgICBwcm9nID0gcmUuY29tcGlsZShzdHJpbmcubG93ZXIocHJvZykpCi0gICAgICAgIGlmIHNlbGYuc2VsZWN0aW9uOgotICAgICAgICAgICAgaW9sZCA9IHNlbGYuc2VsZWN0aW9uWzBdWzBdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpb2xkID0gLTEKLSAgICAgICAgaGl0ID0gTm9uZQotICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5wYXJhbGlzdCkpOgotICAgICAgICAgICAgaWYgaSA9PSBpb2xkIG9yIGkgPCBpb2xkIGFuZCBoaXQ6Ci0gICAgICAgICAgICAgICAgY29udGludWUKLSAgICAgICAgICAgIHAgPSBzZWxmLnBhcmFsaXN0W2ldCi0gICAgICAgICAgICB0ZXh0ID0gc3RyaW5nLmxvd2VyKHAuZXh0cmFjdCgpKQotICAgICAgICAgICAgbWF0Y2ggPSBwcm9nLnNlYXJjaCh0ZXh0KQotICAgICAgICAgICAgaWYgbWF0Y2g6Ci0gICAgICAgICAgICAgICAgYSwgYiA9IG1hdGNoLmdyb3VwKDApCi0gICAgICAgICAgICAgICAgbG9uZzEgPSBpLCBhCi0gICAgICAgICAgICAgICAgbG9uZzIgPSBpLCBiCi0gICAgICAgICAgICAgICAgaGl0ID0gbG9uZzEsIGxvbmcyCi0gICAgICAgICAgICAgICAgaWYgaSA+IGlvbGQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGlmIGhpdDoKLSAgICAgICAgICAgIHNlbGYuc2V0c2VsZWN0aW9uKGhpdCkKLSAgICAgICAgICAgIGkgPSBoaXRbMF1bMF0KLSAgICAgICAgICAgIHAgPSBzZWxmLnBhcmFsaXN0W2ldCi0gICAgICAgICAgICBzZWxmLndpbmRvdy5zaG93KChwLmxlZnQsIHAudG9wKSwgKHAucmlnaHQsIHAuYm90dG9tKSkKLSAgICAgICAgICAgIHJldHVybiAxCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByZXR1cm4gMAotICAgICMKLSAgICBkZWYgc2hvd2FuY2hvcihzZWxmLCBpZCk6Ci0gICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLnBhcmFsaXN0KSk6Ci0gICAgICAgICAgICBwID0gc2VsZi5wYXJhbGlzdFtpXQotICAgICAgICAgICAgaWYgcC5oYXNhbmNob3IoaWQpOgotICAgICAgICAgICAgICAgIGxvbmcxID0gaSwgMAotICAgICAgICAgICAgICAgIGxvbmcyID0gaSwgbGVuKHAuZXh0cmFjdCgpKQotICAgICAgICAgICAgICAgIGhpdCA9IGxvbmcxLCBsb25nMgotICAgICAgICAgICAgICAgIHNlbGYuc2V0c2VsZWN0aW9uKGhpdCkKLSAgICAgICAgICAgICAgICBzZWxmLndpbmRvdy5zaG93KAotICAgICAgICAgICAgICAgICAgICAgICAgKHAubGVmdCwgcC50b3ApLCAocC5yaWdodCwgcC5ib3R0b20pKQotICAgICAgICAgICAgICAgIGJyZWFrCi0KLQotIyBHTCBleHRlbnNpb25zCi0KLWNsYXNzIEdMRm9udENhY2hlOgotICAgICMKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYucmVzZXQoKQotICAgICAgICBzZWxmLnNldGZvbnQoJycpCi0gICAgIwotICAgIGRlZiByZXNldChzZWxmKToKLSAgICAgICAgc2VsZi5mb250a2V5ID0gTm9uZQotICAgICAgICBzZWxmLmZvbnRoYW5kbGUgPSBOb25lCi0gICAgICAgIHNlbGYuZm9udGluZm8gPSBOb25lCi0gICAgICAgIHNlbGYuZm9udGNhY2hlID0ge30KLSAgICAjCi0gICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICBzZWxmLnJlc2V0KCkKLSAgICAjCi0gICAgZGVmIHNldGZvbnQoc2VsZiwgZm9udGtleSk6Ci0gICAgICAgIGlmIGZvbnRrZXkgPT0gJyc6Ci0gICAgICAgICAgICBmb250a2V5ID0gJ1RpbWVzLVJvbWFuIDEyJwotICAgICAgICBlbGlmICcgJyBub3QgaW4gZm9udGtleToKLSAgICAgICAgICAgIGZvbnRrZXkgPSBmb250a2V5ICsgJyAxMicKLSAgICAgICAgaWYgZm9udGtleSA9PSBzZWxmLmZvbnRrZXk6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaWYgc2VsZi5mb250Y2FjaGUuaGFzX2tleShmb250a2V5KToKLSAgICAgICAgICAgIGhhbmRsZSA9IHNlbGYuZm9udGNhY2hlW2ZvbnRrZXldCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpbXBvcnQgc3RyaW5nCi0gICAgICAgICAgICBpID0gc3RyaW5nLmluZGV4KGZvbnRrZXksICcgJykKLSAgICAgICAgICAgIG5hbWUsIHNpemVzdHIgPSBmb250a2V5WzppXSwgZm9udGtleVtpOl0KLSAgICAgICAgICAgIHNpemUgPSBldmFsKHNpemVzdHIpCi0gICAgICAgICAgICBrZXkxID0gbmFtZSArICcgMScKLSAgICAgICAgICAgIGtleSA9IG5hbWUgKyAnICcgKyBgc2l6ZWAKLSAgICAgICAgICAgICMgTkIga2V5IG1heSBkaWZmZXIgZnJvbSBmb250a2V5IQotICAgICAgICAgICAgaWYgc2VsZi5mb250Y2FjaGUuaGFzX2tleShrZXkpOgotICAgICAgICAgICAgICAgIGhhbmRsZSA9IHNlbGYuZm9udGNhY2hlW2tleV0KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaWYgc2VsZi5mb250Y2FjaGUuaGFzX2tleShrZXkxKToKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlID0gc2VsZi5mb250Y2FjaGVba2V5MV0KLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBpbXBvcnQgZm0KLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlID0gZm0uZmluZGZvbnQobmFtZSkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5mb250Y2FjaGVba2V5MV0gPSBoYW5kbGUKLSAgICAgICAgICAgICAgICBoYW5kbGUgPSBoYW5kbGUuc2NhbGVmb250KHNpemUpCi0gICAgICAgICAgICAgICAgc2VsZi5mb250Y2FjaGVbZm9udGtleV0gPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZvbnRjYWNoZVtrZXldID0gaGFuZGxlCi0gICAgICAgIHNlbGYuZm9udGtleSA9IGZvbnRrZXkKLSAgICAgICAgaWYgc2VsZi5mb250aGFuZGxlICE9IGhhbmRsZToKLSAgICAgICAgICAgIHNlbGYuZm9udGhhbmRsZSA9IGhhbmRsZQotICAgICAgICAgICAgc2VsZi5mb250aW5mbyA9IGhhbmRsZS5nZXRmb250aW5mbygpCi0gICAgICAgICAgICBoYW5kbGUuc2V0Zm9udCgpCi0KLQotY2xhc3MgR0xNZWFzdXJlcihHTEZvbnRDYWNoZSk6Ci0gICAgIwotICAgIGRlZiB0ZXh0d2lkdGgoc2VsZiwgdGV4dCk6Ci0gICAgICAgIHJldHVybiBzZWxmLmZvbnRoYW5kbGUuZ2V0c3Ryd2lkdGgodGV4dCkKLSAgICAjCi0gICAgZGVmIGJhc2VsaW5lKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5mb250aW5mb1s2XSAtIHNlbGYuZm9udGluZm9bM10KLSAgICAjCi0gICAgZGVmIGxpbmVoZWlnaHQoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmZvbnRpbmZvWzZdCi0KLQotY2xhc3MgR0xXcml0ZXIoR0xGb250Q2FjaGUpOgotICAgICMKLSAgICAjIE5PVEVTOgotICAgICMgKDEpIFVzZSBnbC5vcnRobzIgdG8gdXNlIFggcGl4ZWwgY29vcmRpbmF0ZXMhCi0gICAgIwotICAgIGRlZiB0ZXh0KHNlbGYsIChoLCB2KSwgdGV4dCk6Ci0gICAgICAgIGltcG9ydCBnbCwgZm0KLSAgICAgICAgZ2wuY21vdjJpKGgsIHYgKyBzZWxmLmZvbnRpbmZvWzZdIC0gc2VsZi5mb250aW5mb1szXSkKLSAgICAgICAgZm0ucHJzdHIodGV4dCkKLSAgICAjCi0gICAgZGVmIHNldGZvbnQoc2VsZiwgZm9udGtleSk6Ci0gICAgICAgIG9sZGhhbmRsZSA9IHNlbGYuZm9udGhhbmRsZQotICAgICAgICBHTEZvbnRDYWNoZS5zZXRmb250KGZvbnRrZXkpCi0gICAgICAgIGlmIHNlbGYuZm9udGhhbmRsZSAhPSBvbGRoYW5kbGU6Ci0gICAgICAgICAgICBoYW5kbGUuc2V0Zm9udCgpCi0KLQotY2xhc3MgR0xNZWFzdXJlcldyaXRlcihHTE1lYXN1cmVyLCBHTFdyaXRlcik6Ci0gICAgcGFzcwotCi0KLWNsYXNzIEdMQmFja0VuZChTYXZpbmdCYWNrRW5kKToKLSAgICAjCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHdpZCk6Ci0gICAgICAgIGltcG9ydCBnbAotICAgICAgICBnbC53aW5zZXQod2lkKQotICAgICAgICBzZWxmLndpZCA9IHdpZAotICAgICAgICBzZWxmLndpZHRoID0gZ2wuZ2V0c2l6ZSgpWzFdCi0gICAgICAgIHNlbGYuaGVpZ2h0ID0gMAotICAgICAgICBzZWxmLmQgPSBHTE1lYXN1cmVyV3JpdGVyKCkKLSAgICAgICAgU2F2aW5nQmFja0VuZC5fX2luaXRfXyhzZWxmKQotICAgICMKLSAgICBkZWYgZmluaXNoKHNlbGYpOgotICAgICAgICBwYXNzCi0gICAgIwotICAgIGRlZiBhZGRwYXJhKHNlbGYsIHApOgotICAgICAgICBzZWxmLnBhcmFsaXN0LmFwcGVuZChwKQotICAgICAgICBzZWxmLmhlaWdodCA9IHAucmVuZGVyKHNlbGYuZCwgMCwgc2VsZi5oZWlnaHQsIHNlbGYud2lkdGgpCi0gICAgIwotICAgIGRlZiByZWRyYXcoc2VsZik6Ci0gICAgICAgIGltcG9ydCBnbAotICAgICAgICBnbC53aW5zZXQoc2VsZi53aWQpCi0gICAgICAgIHdpZHRoID0gZ2wuZ2V0c2l6ZSgpWzFdCi0gICAgICAgIGlmIHdpZHRoICE9IHNlbGYud2lkdGg6Ci0gICAgICAgICAgICBzZXRkb2NzaXplID0gMQotICAgICAgICAgICAgc2VsZi53aWR0aCA9IHdpZHRoCi0gICAgICAgICAgICBmb3IgcCBpbiBzZWxmLnBhcmFsaXN0OgotICAgICAgICAgICAgICAgIHAudG9wID0gcC5ib3R0b20gPSBOb25lCi0gICAgICAgIGQgPSBzZWxmLmQKLSAgICAgICAgdiA9IDAKLSAgICAgICAgZm9yIHAgaW4gc2VsZi5wYXJhbGlzdDoKLSAgICAgICAgICAgIHYgPSBwLnJlbmRlcihkLCAwLCB2LCB3aWR0aCkKZGlmZiAtLWdpdCBhL0xpYi9saWItb2xkL2dyZXAucHkgYi9MaWIvbGliLW9sZC9ncmVwLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTI2NzQ2Li4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL2dyZXAucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0jICdncmVwJwotCi1pbXBvcnQgcmVnZXgKLWZyb20gcmVnZXhfc3ludGF4IGltcG9ydCAqCi0KLW9wdF9zaG93X3doZXJlID0gMAotb3B0X3Nob3dfZmlsZW5hbWUgPSAwCi1vcHRfc2hvd19saW5lbm8gPSAxCi0KLWRlZiBncmVwKHBhdCwgKmZpbGVzKToKLSAgICByZXR1cm4gZ2dyZXAoUkVfU1lOVEFYX0dSRVAsIHBhdCwgZmlsZXMpCi0KLWRlZiBlZ3JlcChwYXQsICpmaWxlcyk6Ci0gICAgcmV0dXJuIGdncmVwKFJFX1NZTlRBWF9FR1JFUCwgcGF0LCBmaWxlcykKLQotZGVmIGVtZ3JlcChwYXQsICpmaWxlcyk6Ci0gICAgcmV0dXJuIGdncmVwKFJFX1NZTlRBWF9FTUFDUywgcGF0LCBmaWxlcykKLQotZGVmIGdncmVwKHN5bnRheCwgcGF0LCBmaWxlcyk6Ci0gICAgaWYgbGVuKGZpbGVzKSA9PSAxIGFuZCB0eXBlKGZpbGVzWzBdKSA9PSB0eXBlKFtdKToKLSAgICAgICAgZmlsZXMgPSBmaWxlc1swXQotICAgIGdsb2JhbCBvcHRfc2hvd19maWxlbmFtZQotICAgIG9wdF9zaG93X2ZpbGVuYW1lID0gKGxlbihmaWxlcykgIT0gMSkKLSAgICBzeW50YXggPSByZWdleC5zZXRfc3ludGF4KHN5bnRheCkKLSAgICB0cnk6Ci0gICAgICAgIHByb2cgPSByZWdleC5jb21waWxlKHBhdCkKLSAgICBmaW5hbGx5OgotICAgICAgICBzeW50YXggPSByZWdleC5zZXRfc3ludGF4KHN5bnRheCkKLSAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZXM6Ci0gICAgICAgIGZwID0gb3BlbihmaWxlbmFtZSwgJ3InKQotICAgICAgICBsaW5lbm8gPSAwCi0gICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQotICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCi0gICAgICAgICAgICBsaW5lbm8gPSBsaW5lbm8gKyAxCi0gICAgICAgICAgICBpZiBwcm9nLnNlYXJjaChsaW5lKSA+PSAwOgotICAgICAgICAgICAgICAgIHNob3dsaW5lKGZpbGVuYW1lLCBsaW5lbm8sIGxpbmUsIHByb2cpCi0gICAgICAgIGZwLmNsb3NlKCkKLQotZGVmIHBncmVwKHBhdCwgKmZpbGVzKToKLSAgICBpZiBsZW4oZmlsZXMpID09IDEgYW5kIHR5cGUoZmlsZXNbMF0pID09IHR5cGUoW10pOgotICAgICAgICBmaWxlcyA9IGZpbGVzWzBdCi0gICAgZ2xvYmFsIG9wdF9zaG93X2ZpbGVuYW1lCi0gICAgb3B0X3Nob3dfZmlsZW5hbWUgPSAobGVuKGZpbGVzKSAhPSAxKQotICAgIGltcG9ydCByZQotICAgIHByb2cgPSByZS5jb21waWxlKHBhdCkKLSAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZXM6Ci0gICAgICAgIGZwID0gb3BlbihmaWxlbmFtZSwgJ3InKQotICAgICAgICBsaW5lbm8gPSAwCi0gICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICBsaW5lID0gZnAucmVhZGxpbmUoKQotICAgICAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCi0gICAgICAgICAgICBsaW5lbm8gPSBsaW5lbm8gKyAxCi0gICAgICAgICAgICBpZiBwcm9nLnNlYXJjaChsaW5lKToKLSAgICAgICAgICAgICAgICBzaG93bGluZShmaWxlbmFtZSwgbGluZW5vLCBsaW5lLCBwcm9nKQotICAgICAgICBmcC5jbG9zZSgpCi0KLWRlZiBzaG93bGluZShmaWxlbmFtZSwgbGluZW5vLCBsaW5lLCBwcm9nKToKLSAgICBpZiBsaW5lWy0xOl0gPT0gJ1xuJzogbGluZSA9IGxpbmVbOi0xXQotICAgIGlmIG9wdF9zaG93X2xpbmVubzoKLSAgICAgICAgcHJlZml4ID0gYGxpbmVub2Aucmp1c3QoMykgKyAnOiAnCi0gICAgZWxzZToKLSAgICAgICAgcHJlZml4ID0gJycKLSAgICBpZiBvcHRfc2hvd19maWxlbmFtZToKLSAgICAgICAgcHJlZml4ID0gZmlsZW5hbWUgKyAnOiAnICsgcHJlZml4Ci0gICAgcHJpbnQgcHJlZml4ICsgbGluZQotICAgIGlmIG9wdF9zaG93X3doZXJlOgotICAgICAgICBzdGFydCwgZW5kID0gcHJvZy5yZWdzKClbMF0KLSAgICAgICAgbGluZSA9IGxpbmVbOnN0YXJ0XQotICAgICAgICBpZiAnXHQnIG5vdCBpbiBsaW5lOgotICAgICAgICAgICAgcHJlZml4ID0gJyAnICogKGxlbihwcmVmaXgpICsgc3RhcnQpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmVmaXggPSAnICcgKiBsZW4ocHJlZml4KQotICAgICAgICAgICAgZm9yIGMgaW4gbGluZToKLSAgICAgICAgICAgICAgICBpZiBjICE9ICdcdCc6IGMgPSAnICcKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBwcmVmaXggKyBjCi0gICAgICAgIGlmIHN0YXJ0ID09IGVuZDogcHJlZml4ID0gcHJlZml4ICsgJ1xcJwotICAgICAgICBlbHNlOiBwcmVmaXggPSBwcmVmaXggKyAnXicqKGVuZC1zdGFydCkKLSAgICAgICAgcHJpbnQgcHJlZml4CmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9sb2NrZmlsZS5weSBiL0xpYi9saWItb2xkL2xvY2tmaWxlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGU5YjQ4Li4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL2xvY2tmaWxlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotaW1wb3J0IHN0cnVjdCwgZmNudGwKLQotZGVmIHdyaXRlbG9jayhmKToKLSAgICBfbG9jayhmLCBmY250bC5GX1dSTENLKQotCi1kZWYgcmVhZGxvY2soZik6Ci0gICAgX2xvY2soZiwgZmNudGwuRl9SRExDSykKLQotZGVmIHVubG9jayhmKToKLSAgICBfbG9jayhmLCBmY250bC5GX1VOTENLKQotCi1kZWYgX2xvY2soZiwgb3ApOgotICAgIGR1bW15ID0gZmNudGwuZmNudGwoZi5maWxlbm8oKSwgZmNudGwuRl9TRVRMS1csCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QucGFjaygnMmg4bCcsIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCkpCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9uZXdkaXIucHkgYi9MaWIvbGliLW9sZC9uZXdkaXIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NmJlY2MuLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvbmV3ZGlyLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotIyBOZXcgZGlyKCkgZnVuY3Rpb24KLQotCi0jIFRoaXMgc2hvdWxkIGJlIHRoZSBuZXcgZGlyKCksIGV4Y2VwdCB0aGF0IGl0IHNob3VsZCBzdGlsbCBsaXN0Ci0jIHRoZSBjdXJyZW50IGxvY2FsIG5hbWUgc3BhY2UgYnkgZGVmYXVsdAotCi1kZWYgbGlzdGF0dHJzKHgpOgotICAgIHRyeToKLSAgICAgICAgZGljdGtleXMgPSB4Ll9fZGljdF9fLmtleXMoKQotICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6Ci0gICAgICAgIGRpY3RrZXlzID0gW10KLSAgICAjCi0gICAgdHJ5OgotICAgICAgICBtZXRob2RzID0geC5fX21ldGhvZHNfXwotICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6Ci0gICAgICAgIG1ldGhvZHMgPSBbXQotICAgICMKLSAgICB0cnk6Ci0gICAgICAgIG1lbWJlcnMgPSB4Ll9fbWVtYmVyc19fCi0gICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKLSAgICAgICAgbWVtYmVycyA9IFtdCi0gICAgIwotICAgIHRyeToKLSAgICAgICAgdGhlX2NsYXNzID0geC5fX2NsYXNzX18KLSAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgotICAgICAgICB0aGVfY2xhc3MgPSBOb25lCi0gICAgIwotICAgIHRyeToKLSAgICAgICAgYmFzZXMgPSB4Ll9fYmFzZXNfXwotICAgIGV4Y2VwdCAoQXR0cmlidXRlRXJyb3IsIFR5cGVFcnJvcik6Ci0gICAgICAgIGJhc2VzID0gKCkKLSAgICAjCi0gICAgdG90YWwgPSBkaWN0a2V5cyArIG1ldGhvZHMgKyBtZW1iZXJzCi0gICAgaWYgdGhlX2NsYXNzOgotICAgICAgICAjIEl0J3MgYSBjbGFzcyBpbnN0YWNlOyBhZGQgdGhlIGNsYXNzJ3MgYXR0cmlidXRlcwotICAgICAgICAjIHRoYXQgYXJlIGZ1bmN0aW9ucyAobWV0aG9kcykuLi4KLSAgICAgICAgY2xhc3NfYXR0cnMgPSBsaXN0YXR0cnModGhlX2NsYXNzKQotICAgICAgICBjbGFzc19tZXRob2RzID0gW10KLSAgICAgICAgZm9yIG5hbWUgaW4gY2xhc3NfYXR0cnM6Ci0gICAgICAgICAgICBpZiBpc19mdW5jdGlvbihnZXRhdHRyKHRoZV9jbGFzcywgbmFtZSkpOgotICAgICAgICAgICAgICAgIGNsYXNzX21ldGhvZHMuYXBwZW5kKG5hbWUpCi0gICAgICAgIHRvdGFsID0gdG90YWwgKyBjbGFzc19tZXRob2RzCi0gICAgZWxpZiBiYXNlczoKLSAgICAgICAgIyBJdCdzIGEgZGVyaXZlZCBjbGFzczsgYWRkIHRoZSBiYXNlIGNsYXNzIGF0dHJpYnV0ZXMKLSAgICAgICAgZm9yIGJhc2UgaW4gYmFzZXM6Ci0gICAgICAgICAgICBiYXNlX2F0dHJzID0gbGlzdGF0dHJzKGJhc2UpCi0gICAgICAgICAgICB0b3RhbCA9IHRvdGFsICsgYmFzZV9hdHRycwotICAgIHRvdGFsLnNvcnQoKQotICAgIHJldHVybiB0b3RhbAotICAgIGkgPSAwCi0gICAgd2hpbGUgaSsxIDwgbGVuKHRvdGFsKToKLSAgICAgICAgaWYgdG90YWxbaV0gPT0gdG90YWxbaSsxXToKLSAgICAgICAgICAgIGRlbCB0b3RhbFtpKzFdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBpID0gaSsxCi0gICAgcmV0dXJuIHRvdGFsCi0KLQotIyBIZWxwZXIgdG8gcmVjb2duaXplIGZ1bmN0aW9ucwotCi1kZWYgaXNfZnVuY3Rpb24oeCk6Ci0gICAgcmV0dXJuIHR5cGUoeCkgPT0gdHlwZShpc19mdW5jdGlvbikKLQotCi0jIEFwcHJveGltYXRpb24gb2YgYnVpbHRpbiBkaXIoKTsgYnV0IG5vdGUgdGhhdCB0aGlzIGxpc3RzIHRoZSB1c2VyJ3MKLSMgdmFyaWFibGVzIGJ5IGRlZmF1bHQsIG5vdCB0aGUgY3VycmVudCBsb2NhbCBuYW1lIHNwYWNlLgotCi1kZWYgZGlyKHggPSBOb25lKToKLSAgICBpZiB4IGlzIG5vdCBOb25lOgotICAgICAgICByZXR1cm4gbGlzdGF0dHJzKHgpCi0gICAgZWxzZToKLSAgICAgICAgaW1wb3J0IF9fbWFpbl9fCi0gICAgICAgIHJldHVybiBsaXN0YXR0cnMoX19tYWluX18pCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9uaS5weSBiL0xpYi9saWItb2xkL25pLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzRmOTg5Li4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL25pLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLSIiIk5ldyBpbXBvcnQgc2NoZW1lIHdpdGggcGFja2FnZSBzdXBwb3J0LgotCi1RdWljayBSZWZlcmVuY2UKLS0tLS0tLS0tLS0tLS0tLQotCi0tIFRvIGVuYWJsZSBwYWNrYWdlIHN1cHBvcnQsIGV4ZWN1dGUgImltcG9ydCBuaSIgYmVmb3JlIGltcG9ydGluZyBhbnkKLSAgcGFja2FnZXMuICBJbXBvcnRpbmcgdGhpcyBtb2R1bGUgYXV0b21hdGljYWxseSBpbnN0YWxscyB0aGUgcmVsZXZhbnQKLSAgaW1wb3J0IGhvb2tzLgotCi0tIFRvIGNyZWF0ZSBhIHBhY2thZ2UgbmFtZWQgc3BhbSBjb250YWluaW5nIHN1Yi1tb2R1bGVzIGhhbSwgYmFjb24gYW5kCi0gIGVnZ3MsIGNyZWF0ZSBhIGRpcmVjdG9yeSBzcGFtIHNvbWV3aGVyZSBvbiBQeXRob24ncyBtb2R1bGUgc2VhcmNoCi0gIHBhdGggKGkuZS4gc3BhbSdzIHBhcmVudCBkaXJlY3RvcnkgbXVzdCBiZSBvbmUgb2YgdGhlIGRpcmVjdG9yaWVzIGluCi0gIHN5cy5wYXRoIG9yICRQWVRIT05QQVRIKTsgdGhlbiBjcmVhdGUgZmlsZXMgaGFtLnB5LCBiYWNvbi5weSBhbmQKLSAgZWdncy5weSBpbnNpZGUgc3BhbS4KLQotLSBUbyBpbXBvcnQgbW9kdWxlIGhhbSBmcm9tIHBhY2thZ2Ugc3BhbSBhbmQgdXNlIGZ1bmN0aW9uIGhhbW5lZ2dzKCkKLSAgZnJvbSB0aGF0IG1vZHVsZSwgeW91IGNhbiBlaXRoZXIgZG8KLQotICAgIGltcG9ydCBzcGFtLmhhbSAgICAgICAgICAgICAjICpub3QqICJpbXBvcnQgc3BhbSIgISEhCi0gICAgc3BhbS5oYW0uaGFtbmVnZ3MoKQotCi0gIG9yCi0KLSAgICBmcm9tIHNwYW0gaW1wb3J0IGhhbQotICAgIGhhbS5oYW1uZWdncygpCi0KLSAgb3IKLQotICAgIGZyb20gc3BhbS5oYW0gaW1wb3J0IGhhbW5lZ2dzCi0gICAgaGFtbmVnZ3MoKQotCi0tIEltcG9ydGluZyBqdXN0ICJzcGFtIiBkb2VzIG5vdCBkbyB3aGF0IHlvdSBleHBlY3Q6IGl0IGNyZWF0ZXMgYW4KLSAgZW1wdHkgcGFja2FnZSBuYW1lZCBzcGFtIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LCBidXQgaXQgZG9lcwotICBub3QgaW1wb3J0IHNwYW0ncyBzdWJtb2R1bGVzLiAgVGhlIG9ubHkgc3VibW9kdWxlIHRoYXQgaXMgZ3VhcmFudGVlZAotICB0byBiZSBpbXBvcnRlZCBpcyBzcGFtLl9faW5pdF9fLCBpZiBpdCBleGlzdHMuICBOb3RlIHRoYXQKLSAgc3BhbS5fX2luaXRfXyBpcyBhIHN1Ym1vZHVsZSBvZiBwYWNrYWdlIHNwYW0uICBJdCBjYW4gcmVmZXJlbmNlIHRvCi0gIHNwYW0ncyBuYW1lc3BhY2UgdmlhIHRoZSAnX18uJyBwcmVmaXgsIGZvciBpbnN0YW5jZQotCi0gICAgX18uc3BhbV9pbml0ZWQgPSAxICAgICAgICAgICMgU2V0IGEgcGFja2FnZS1sZXZlbCB2YXJpYWJsZQotCi0KLQotVGhlb3J5IG9mIE9wZXJhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1BIFBhY2thZ2UgaXMgYSBtb2R1bGUgdGhhdCBjYW4gY29udGFpbiBvdGhlciBtb2R1bGVzLiAgUGFja2FnZXMgY2FuIGJlCi1uZXN0ZWQuICBQYWNrYWdlIGludHJvZHVjZSBkb3R0ZWQgbmFtZXMgZm9yIG1vZHVsZXMsIGxpa2UgUC5RLk0sIHdoaWNoCi1jb3VsZCBjb3JyZXNwb25kIHRvIGEgZmlsZSBQL1EvTS5weSBmb3VuZCBzb21ld2hlcmUgb24gc3lzLnBhdGguICBJdAotaXMgcG9zc2libGUgdG8gaW1wb3J0IGEgcGFja2FnZSBpdHNlbGYsIHRob3VnaCB0aGlzIG1ha2VzIGxpdHRsZSBzZW5zZQotdW5sZXNzIHRoZSBwYWNrYWdlIGNvbnRhaW5zIGEgbW9kdWxlIGNhbGxlZCBfX2luaXRfXy4KLQotQSBwYWNrYWdlIGhhcyB0d28gdmFyaWFibGVzIHRoYXQgY29udHJvbCB0aGUgbmFtZXNwYWNlIHVzZWQgZm9yCi1wYWNrYWdlcyBhbmQgbW9kdWxlcywgYm90aCBpbml0aWFsaXplZCB0byBzZW5zaWJsZSBkZWZhdWx0cyB0aGUgZmlyc3QKLXRpbWUgdGhlIHBhY2thZ2UgaXMgcmVmZXJlbmNlZC4KLQotKDEpIEEgcGFja2FnZSdzICptb2R1bGUgc2VhcmNoIHBhdGgqLCBjb250YWluZWQgaW4gdGhlIHBlci1wYWNrYWdlCi12YXJpYWJsZSBfX3BhdGhfXywgZGVmaW5lcyBhIGxpc3Qgb2YgKmRpcmVjdG9yaWVzKiB3aGVyZSBzdWJtb2R1bGVzIG9yCi1zdWJwYWNrYWdlcyBvZiB0aGUgcGFja2FnZSBhcmUgc2VhcmNoZWQuICBJdCBpcyBpbml0aWFsaXplZCB0byB0aGUKLWRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBwYWNrYWdlLiAgU2V0dGluZyB0aGlzIHZhcmlhYmxlIHRvIE5vbmUgbWFrZXMKLXRoZSBtb2R1bGUgc2VhcmNoIHBhdGggZGVmYXVsdCB0byBzeXMucGF0aCAodGhpcyBpcyBub3QgcXVpdGUgdGhlIHNhbWUKLWFzIHNldHRpbmcgaXQgdG8gc3lzLnBhdGgsIHNpbmNlIHRoZSBsYXR0ZXIgd29uJ3QgdHJhY2sgbGF0ZXIKLWFzc2lnbm1lbnRzIHRvIHN5cy5wYXRoKS4KLQotKDIpIEEgcGFja2FnZSdzICppbXBvcnQgZG9tYWluKiwgY29udGFpbmVkIGluIHRoZSBwZXItcGFja2FnZSB2YXJpYWJsZQotX19kb21haW5fXywgZGVmaW5lcyBhIGxpc3Qgb2YgKnBhY2thZ2VzKiB0aGF0IGFyZSBzZWFyY2hlZCAodXNpbmcKLXRoZWlyIHJlc3BlY3RpdmUgbW9kdWxlIHNlYXJjaCBwYXRocykgdG8gc2F0aXNmeSBpbXBvcnRzLiAgSXQgaXMKLWluaXRpYWxpemVkIHRvIHRoZSBsaXN0IGNvbnNpc3Rpbmcgb2YgdGhlIHBhY2thZ2UgaXRzZWxmLCBpdHMgcGFyZW50Ci1wYWNrYWdlLCBpdHMgcGFyZW50J3MgcGFyZW50LCBhbmQgc28gb24sIGVuZGluZyB3aXRoIHRoZSByb290IHBhY2thZ2UKLSh0aGUgbmFtZWxlc3MgcGFja2FnZSBjb250YWluaW5nIGFsbCB0b3AtbGV2ZWwgcGFja2FnZXMgYW5kIG1vZHVsZXMsCi13aG9zZSBtb2R1bGUgc2VhcmNoIHBhdGggaXMgTm9uZSwgaW1wbHlpbmcgc3lzLnBhdGgpLgotCi1UaGUgZGVmYXVsdCBkb21haW4gaW1wbGVtZW50cyBhIHNlYXJjaCBhbGdvcml0aG0gY2FsbGVkICJleHBhbmRpbmcKLXNlYXJjaCIuICBBbiBhbHRlcm5hdGl2ZSBzZWFyY2ggYWxnb3JpdGhtIGNhbGxlZCAiZXhwbGljaXQgc2VhcmNoIgotZml4ZXMgdGhlIGltcG9ydCBzZWFyY2ggcGF0aCB0byBjb250YWluIG9ubHkgdGhlIHJvb3QgcGFja2FnZSwKLXJlcXVpcmluZyB0aGUgbW9kdWxlcyBpbiB0aGUgcGFja2FnZSB0byBuYW1lIGFsbCBpbXBvcnRlZCBtb2R1bGVzIGJ5Ci10aGVpciBmdWxsIG5hbWUuICBUaGUgY29udmVudGlvbiBvZiB1c2luZyAnX18nIHRvIHJlZmVyIHRvIHRoZSBjdXJyZW50Ci1wYWNrYWdlIChib3RoIGFzIGEgcGVyLW1vZHVsZSB2YXJpYWJsZSBhbmQgaW4gbW9kdWxlIG5hbWVzKSBjYW4gYmUKLXVzZWQgYnkgcGFja2FnZXMgdXNpbmcgZXhwbGljaXQgc2VhcmNoIHRvIHJlZmVyIHRvIG1vZHVsZXMgaW4gdGhlIHNhbWUKLXBhY2thZ2U7IHRoaXMgY29tYmluYXRpb24gaXMga25vd24gYXMgImV4cGxpY2l0LXJlbGF0aXZlIHNlYXJjaCIuCi0KLVRoZSBQYWNrYWdlSW1wb3J0ZXIgYW5kIFBhY2thZ2VMb2FkZXIgY2xhc3NlcyB0b2dldGhlciBpbXBsZW1lbnQgdGhlCi1mb2xsb3dpbmcgcG9saWNpZXM6Ci0KLS0gVGhlcmUgaXMgYSByb290IHBhY2thZ2UsIHdob3NlIG5hbWUgaXMgJycuICBJdCBjYW5ub3QgYmUgaW1wb3J0ZWQKLSAgZGlyZWN0bHkgYnV0IG1heSBiZSByZWZlcmVuY2VkLCBlLmcuIGJ5IHVzaW5nICdfXycgZnJvbSBhIHRvcC1sZXZlbAotICBtb2R1bGUuCi0KLS0gSW4gZWFjaCBtb2R1bGUgb3IgcGFja2FnZSwgdGhlIHZhcmlhYmxlICdfXycgY29udGFpbnMgYSByZWZlcmVuY2UgdG8KLSAgdGhlIHBhcmVudCBwYWNrYWdlOyBpbiB0aGUgcm9vdCBwYWNrYWdlLCAnX18nIHBvaW50cyB0byBpdHNlbGYuCi0KLS0gSW4gdGhlIG5hbWUgZm9yIGltcG9ydGVkIG1vZHVsZXMgKGUuZy4gTSBpbiAiaW1wb3J0IE0iIG9yICJmcm9tIE0KLSAgaW1wb3J0IC4uLiIpLCBhIGxlYWRpbmcgJ19fJyByZWZlcnMgdG8gdGhlIGN1cnJlbnQgcGFja2FnZSAoaS5lLgotICB0aGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBjdXJyZW50IG1vZHVsZSk7IGxlYWRpbmcgJ19fLl9fJyBhbmQgc28KLSAgb24gcmVmZXIgdG8gdGhlIGN1cnJlbnQgcGFja2FnZSdzIHBhcmVudCwgYW5kIHNvIG9uLiAgVGhlIHVzZSBvZgotICAnX18nIGVsc2V3aGVyZSBpbiB0aGUgbW9kdWxlIG5hbWUgaXMgbm90IHN1cHBvcnRlZC4KLQotLSBNb2R1bGVzIGFyZSBzZWFyY2hlZCB1c2luZyB0aGUgImV4cGFuZGluZyBzZWFyY2giIGFsZ29yaXRobSBieQotICB2aXJ0dWUgb2YgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIF9fZG9tYWluX18uCi0KLS0gSWYgQS5CLkMgaXMgaW1wb3J0ZWQsIEEgaXMgc2VhcmNoZWQgdXNpbmcgX19kb21haW5fXzsgdGhlbgotICBzdWJwYWNrYWdlIEIgaXMgc2VhcmNoZWQgaW4gQSB1c2luZyBpdHMgX19wYXRoX18sIGFuZCBzbyBvbi4KLQotLSBCdWlsdC1pbiBtb2R1bGVzIGhhdmUgcHJpb3JpdHk6IGV2ZW4gaWYgYSBmaWxlIHN5cy5weSBleGlzdHMgaW4gYQotICBwYWNrYWdlLCAiaW1wb3J0IHN5cyIgaW1wb3J0cyB0aGUgYnVpbHQtaW4gc3lzIG1vZHVsZS4KLQotLSBUaGUgc2FtZSBob2xkcyBmb3IgZnJvemVuIG1vZHVsZXMsIGZvciBiZXR0ZXIgb3IgZm9yIHdvcnNlLgotCi0tIFN1Ym1vZHVsZXMgYW5kIHN1YnBhY2thZ2VzIGFyZSBub3QgYXV0b21hdGljYWxseSBsb2FkZWQgd2hlbiB0aGVpcgotICBwYXJlbnQgcGFja2FnZXMgaXMgbG9hZGVkLgotCi0tIFRoZSBjb25zdHJ1Y3QgImZyb20gcGFja2FnZSBpbXBvcnQgKiIgaXMgaWxsZWdhbC4gIChJdCBjYW4gc3RpbGwgYmUKLSAgdXNlZCB0byBpbXBvcnQgbmFtZXMgZnJvbSBhIG1vZHVsZS4pCi0KLS0gV2hlbiAiZnJvbSBwYWNrYWdlIGltcG9ydCBtb2R1bGUxLCBtb2R1bGUyLCAuLi4iIGlzIHVzZWQsIHRob3NlCi0gICAgbW9kdWxlcyBhcmUgZXhwbGljaXRseSBsb2FkZWQuCi0KLS0gV2hlbiBhIHBhY2thZ2UgaXMgbG9hZGVkLCBpZiBpdCBoYXMgYSBzdWJtb2R1bGUgX19pbml0X18sIHRoYXQKLSAgbW9kdWxlIGlzIGxvYWRlZC4gIFRoaXMgaXMgdGhlIHBsYWNlIHdoZXJlIHJlcXVpcmVkIHN1Ym1vZHVsZXMgY2FuCi0gIGJlIGxvYWRlZCwgdGhlIF9fcGF0aF9fIHZhcmlhYmxlIGV4dGVuZGVkLCBldGMuICBUaGUgX19pbml0X18gbW9kdWxlCi0gIGlzIGxvYWRlZCBldmVuIGlmIHRoZSBwYWNrYWdlIHdhcyBsb2FkZWQgb25seSBpbiBvcmRlciB0byBjcmVhdGUgYQotICBzdHViIGZvciBhIHN1Yi1wYWNrYWdlOiBpZiAiaW1wb3J0IFAuUS5SIiBpcyB0aGUgZmlyc3QgcmVmZXJlbmNlIHRvCi0gIFAsIGFuZCBQIGhhcyBhIHN1Ym1vZHVsZSBfX2luaXRfXywgUC5fX2luaXRfXyBpcyBsb2FkZWQgYmVmb3JlIFAuUQotICBpcyBldmVuIHNlYXJjaGVkLgotCi1DYXZlYXRzOgotCi0tIEl0IGlzIHBvc3NpYmxlIHRvIGltcG9ydCBhIHBhY2thZ2UgdGhhdCBoYXMgbm8gX19pbml0X18gc3VibW9kdWxlOwotICB0aGlzIGlzIG5vdCBwYXJ0aWN1bGFybHkgdXNlZnVsIGJ1dCB0aGVyZSBtYXkgYmUgdXNlZnVsIGFwcGxpY2F0aW9ucwotICBmb3IgaXQgKGUuZy4gdG8gbWFuaXB1bGF0ZSBpdHMgc2VhcmNoIHBhdGhzIGZyb20gdGhlIG91dHNpZGUhKS4KLQotLSBUaGVyZSBhcmUgbm8gc3BlY2lhbCBwcm92aXNpb25zIGZvciBvcy5jaGRpcigpLiAgSWYgeW91IHBsYW4gdG8gdXNlCi0gIG9zLmNoZGlyKCkgYmVmb3JlIHlvdSBoYXZlIGltcG9ydGVkIGFsbCB5b3VyIG1vZHVsZXMsIGl0IGlzIGJldHRlcgotICBub3QgdG8gaGF2ZSByZWxhdGl2ZSBwYXRobmFtZXMgaW4gc3lzLnBhdGguICAoVGhpcyBjb3VsZCBhY3R1YWxseSBiZQotICBmaXhlZCBieSBjaGFuZ2luZyB0aGUgaW1wbGVtZW50YXRpb24gb2YgcGF0aF9qb2luKCkgaW4gdGhlIGhvb2sgdG8KLSAgYWJzb2x1dGl6ZSBwYXRocy4pCi0KLS0gUGFja2FnZXMgYW5kIG1vZHVsZXMgYXJlIGludHJvZHVjZWQgaW4gc3lzLm1vZHVsZXMgYXMgc29vbiBhcyB0aGVpcgotICBsb2FkaW5nIGlzIHN0YXJ0ZWQuICBXaGVuIHRoZSBsb2FkaW5nIGlzIHRlcm1pbmF0ZWQgYnkgYW4gZXhjZXB0aW9uLAotICB0aGUgc3lzLm1vZHVsZXMgZW50cmllcyByZW1haW4gYXJvdW5kLgotCi0tIFRoZXJlIGFyZSBubyBzcGVjaWFsIG1lYXN1cmVzIHRvIHN1cHBvcnQgbXV0dWFsbHkgcmVjdXJzaXZlIG1vZHVsZXMsCi0gIGJ1dCBpdCB3aWxsIHdvcmsgdW5kZXIgdGhlIHNhbWUgY29uZGl0aW9ucyB3aGVyZSBpdCB3b3JrcyBpbiB0aGUKLSAgZmxhdCBtb2R1bGUgc3BhY2Ugc3lzdGVtLgotCi0tIFNvbWV0aW1lcyBkdW1teSBlbnRyaWVzICh3aG9zZSB2YWx1ZSBpcyBOb25lKSBhcmUgZW50ZXJlZCBpbgotICBzeXMubW9kdWxlcywgdG8gaW5kaWNhdGUgdGhhdCBhIHBhcnRpY3VsYXIgbW9kdWxlIGRvZXMgbm90IGV4aXN0IC0tCi0gIHRoaXMgaXMgZG9uZSB0byBzcGVlZCB1cCB0aGUgZXhwYW5kaW5nIHNlYXJjaCBhbGdvcml0aG0gd2hlbiBhCi0gIG1vZHVsZSByZXNpZGluZyBhdCBhIGhpZ2hlciBsZXZlbCBpcyByZXBlYXRlZGx5IGltcG9ydGVkIChQeXRob24KLSAgcHJvbWlzZXMgdGhhdCBpbXBvcnRpbmcgYSBwcmV2aW91c2x5IGltcG9ydGVkIG1vZHVsZSBpcyBjaGVhcCEpCi0KLS0gQWx0aG91Z2ggZHluYW1pY2FsbHkgbG9hZGVkIGV4dGVuc2lvbnMgYXJlIGFsbG93ZWQgaW5zaWRlIHBhY2thZ2VzLAotICB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiAoaGFyZGNvZGVkIGluIHRoZSBpbnRlcnByZXRlcikgb2YgdGhlaXIKLSAgaW5pdGlhbGl6YXRpb24gbWF5IGNhdXNlIHByb2JsZW1zIGlmIGFuIGV4dGVuc2lvbiBpbnZva2VzIHRoZQotICBpbnRlcnByZXRlciBkdXJpbmcgaXRzIGluaXRpYWxpemF0aW9uLgotCi0tIHJlbG9hZCgpIG1heSBmaW5kIGFub3RoZXIgdmVyc2lvbiBvZiB0aGUgbW9kdWxlIG9ubHkgaWYgaXQgb2NjdXJzIG9uCi0gIHRoZSBwYWNrYWdlIHNlYXJjaCBwYXRoLiAgVGh1cywgaXQga2VlcHMgdGhlIGNvbm5lY3Rpb24gdG8gdGhlCi0gIHBhY2thZ2UgdG8gd2hpY2ggdGhlIG1vZHVsZSBiZWxvbmdzLCBidXQgbWF5IGZpbmQgYSBkaWZmZXJlbnQgZmlsZS4KLQotWFhYIE5lZWQgdG8gaGF2ZSBhbiBleHBsaWNpdCBuYW1lIGZvciAnJywgZS5nLiAnX19yb290X18nLgotCi0iIiIKLQotCi1pbXBvcnQgaW1wCi1pbXBvcnQgc3lzCi1pbXBvcnQgX19idWlsdGluX18KLQotaW1wb3J0IGlob29rcwotZnJvbSBpaG9va3MgaW1wb3J0IE1vZHVsZUxvYWRlciwgTW9kdWxlSW1wb3J0ZXIKLQotCi1jbGFzcyBQYWNrYWdlTG9hZGVyKE1vZHVsZUxvYWRlcik6Ci0KLSAgICAiIiJBIHN1YmNsYXNzIG9mIE1vZHVsZUxvYWRlciB3aXRoIHBhY2thZ2Ugc3VwcG9ydC4KLQotICAgIGZpbmRfbW9kdWxlX2luX2RpcigpIHdpbGwgc3VjY2VlZCBpZiB0aGVyZSdzIGEgc3ViZGlyZWN0b3J5IHdpdGgKLSAgICB0aGUgZ2l2ZW4gbmFtZTsgbG9hZF9tb2R1bGUoKSB3aWxsIGNyZWF0ZSBhIHN0dWIgZm9yIGEgcGFja2FnZSBhbmQKLSAgICBsb2FkIGl0cyBfX2luaXRfXyBtb2R1bGUgaWYgaXQgZXhpc3RzLgotCi0gICAgIiIiCi0KLSAgICBkZWYgZmluZF9tb2R1bGVfaW5fZGlyKHNlbGYsIG5hbWUsIGRpcik6Ci0gICAgICAgIGlmIGRpciBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGRpcm5hbWUgPSBzZWxmLmhvb2tzLnBhdGhfam9pbihkaXIsIG5hbWUpCi0gICAgICAgICAgICBpZiBzZWxmLmhvb2tzLnBhdGhfaXNkaXIoZGlybmFtZSk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUsIGRpcm5hbWUsICgnJywgJycsICdQQUNLQUdFJykKLSAgICAgICAgcmV0dXJuIE1vZHVsZUxvYWRlci5maW5kX21vZHVsZV9pbl9kaXIoc2VsZiwgbmFtZSwgZGlyKQotCi0gICAgZGVmIGxvYWRfbW9kdWxlKHNlbGYsIG5hbWUsIHN0dWZmKToKLSAgICAgICAgZmlsZSwgZmlsZW5hbWUsIGluZm8gPSBzdHVmZgotICAgICAgICBzdWZmLCBtb2RlLCB0eXBlID0gaW5mbwotICAgICAgICBpZiB0eXBlID09ICdQQUNLQUdFJzoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWRfcGFja2FnZShuYW1lLCBzdHVmZikKLSAgICAgICAgaWYgc3lzLm1vZHVsZXMuaGFzX2tleShuYW1lKToKLSAgICAgICAgICAgIG0gPSBzeXMubW9kdWxlc1tuYW1lXQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc3lzLm1vZHVsZXNbbmFtZV0gPSBtID0gaW1wLm5ld19tb2R1bGUobmFtZSkKLSAgICAgICAgc2VsZi5zZXRfcGFyZW50KG0pCi0gICAgICAgIGlmIHR5cGUgPT0gaW1wLkNfRVhURU5TSU9OIGFuZCAnLicgaW4gbmFtZToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmxvYWRfZHluYW1pYyhuYW1lLCBzdHVmZikKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJldHVybiBNb2R1bGVMb2FkZXIubG9hZF9tb2R1bGUoc2VsZiwgbmFtZSwgc3R1ZmYpCi0KLSAgICBkZWYgbG9hZF9keW5hbWljKHNlbGYsIG5hbWUsIHN0dWZmKToKLSAgICAgICAgZmlsZSwgZmlsZW5hbWUsIChzdWZmLCBtb2RlLCB0eXBlKSA9IHN0dWZmCi0gICAgICAgICMgSGFjayBhcm91bmQgcmVzdHJpY3Rpb24gaW4gaW1wLmxvYWRfZHluYW1pYygpCi0gICAgICAgIGkgPSBuYW1lLnJmaW5kKCcuJykKLSAgICAgICAgdGFpbCA9IG5hbWVbaSsxOl0KLSAgICAgICAgaWYgc3lzLm1vZHVsZXMuaGFzX2tleSh0YWlsKToKLSAgICAgICAgICAgIHNhdmUgPSBzeXMubW9kdWxlc1t0YWlsXQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2F2ZSA9IE5vbmUKLSAgICAgICAgc3lzLm1vZHVsZXNbdGFpbF0gPSBpbXAubmV3X21vZHVsZShuYW1lKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBtID0gaW1wLmxvYWRfZHluYW1pYyh0YWlsLCBmaWxlbmFtZSwgZmlsZSkKLSAgICAgICAgZmluYWxseToKLSAgICAgICAgICAgIGlmIHNhdmU6Ci0gICAgICAgICAgICAgICAgc3lzLm1vZHVsZXNbdGFpbF0gPSBzYXZlCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGRlbCBzeXMubW9kdWxlc1t0YWlsXQotICAgICAgICBzeXMubW9kdWxlc1tuYW1lXSA9IG0KLSAgICAgICAgcmV0dXJuIG0KLQotICAgIGRlZiBsb2FkX3BhY2thZ2Uoc2VsZiwgbmFtZSwgc3R1ZmYpOgotICAgICAgICBmaWxlLCBmaWxlbmFtZSwgaW5mbyA9IHN0dWZmCi0gICAgICAgIGlmIHN5cy5tb2R1bGVzLmhhc19rZXkobmFtZSk6Ci0gICAgICAgICAgICBwYWNrYWdlID0gc3lzLm1vZHVsZXNbbmFtZV0KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHN5cy5tb2R1bGVzW25hbWVdID0gcGFja2FnZSA9IGltcC5uZXdfbW9kdWxlKG5hbWUpCi0gICAgICAgIHBhY2thZ2UuX19wYXRoX18gPSBbZmlsZW5hbWVdCi0gICAgICAgIHNlbGYuaW5pdF9wYWNrYWdlKHBhY2thZ2UpCi0gICAgICAgIHJldHVybiBwYWNrYWdlCi0KLSAgICBkZWYgaW5pdF9wYWNrYWdlKHNlbGYsIHBhY2thZ2UpOgotICAgICAgICBzZWxmLnNldF9wYXJlbnQocGFja2FnZSkKLSAgICAgICAgc2VsZi5zZXRfZG9tYWluKHBhY2thZ2UpCi0gICAgICAgIHNlbGYuY2FsbF9pbml0X21vZHVsZShwYWNrYWdlKQotCi0gICAgZGVmIHNldF9wYXJlbnQoc2VsZiwgbSk6Ci0gICAgICAgIG5hbWUgPSBtLl9fbmFtZV9fCi0gICAgICAgIGlmICcuJyBpbiBuYW1lOgotICAgICAgICAgICAgbmFtZSA9IG5hbWVbOm5hbWUucmZpbmQoJy4nKV0KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIG5hbWUgPSAnJwotICAgICAgICBtLl9fID0gc3lzLm1vZHVsZXNbbmFtZV0KLQotICAgIGRlZiBzZXRfZG9tYWluKHNlbGYsIHBhY2thZ2UpOgotICAgICAgICBuYW1lID0gcGFja2FnZS5fX25hbWVfXwotICAgICAgICBwYWNrYWdlLl9fZG9tYWluX18gPSBkb21haW4gPSBbbmFtZV0KLSAgICAgICAgd2hpbGUgJy4nIGluIG5hbWU6Ci0gICAgICAgICAgICBuYW1lID0gbmFtZVs6bmFtZS5yZmluZCgnLicpXQotICAgICAgICAgICAgZG9tYWluLmFwcGVuZChuYW1lKQotICAgICAgICBpZiBuYW1lOgotICAgICAgICAgICAgZG9tYWluLmFwcGVuZCgnJykKLQotICAgIGRlZiBjYWxsX2luaXRfbW9kdWxlKHNlbGYsIHBhY2thZ2UpOgotICAgICAgICBzdHVmZiA9IHNlbGYuZmluZF9tb2R1bGUoJ19faW5pdF9fJywgcGFja2FnZS5fX3BhdGhfXykKLSAgICAgICAgaWYgc3R1ZmY6Ci0gICAgICAgICAgICBtID0gc2VsZi5sb2FkX21vZHVsZShwYWNrYWdlLl9fbmFtZV9fICsgJy5fX2luaXRfXycsIHN0dWZmKQotICAgICAgICAgICAgcGFja2FnZS5fX2luaXRfXyA9IG0KLQotCi1jbGFzcyBQYWNrYWdlSW1wb3J0ZXIoTW9kdWxlSW1wb3J0ZXIpOgotCi0gICAgIiIiSW1wb3J0ZXIgdGhhdCB1bmRlcnN0YW5kcyBwYWNrYWdlcyBhbmQgJ19fJy4iIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2FkZXIgPSBOb25lLCB2ZXJib3NlID0gMCk6Ci0gICAgICAgIE1vZHVsZUltcG9ydGVyLl9faW5pdF9fKHNlbGYsCi0gICAgICAgIGxvYWRlciBvciBQYWNrYWdlTG9hZGVyKE5vbmUsIHZlcmJvc2UpLCB2ZXJib3NlKQotCi0gICAgZGVmIGltcG9ydF9tb2R1bGUoc2VsZiwgbmFtZSwgZ2xvYmFscz17fSwgbG9jYWxzPXt9LCBmcm9tbGlzdD1bXSk6Ci0gICAgICAgIGlmIGdsb2JhbHMuaGFzX2tleSgnX18nKToKLSAgICAgICAgICAgIHBhY2thZ2UgPSBnbG9iYWxzWydfXyddCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIE5vIGNhbGxpbmcgY29udGV4dCwgYXNzdW1lIGluIHJvb3QgcGFja2FnZQotICAgICAgICAgICAgcGFja2FnZSA9IHN5cy5tb2R1bGVzWycnXQotICAgICAgICBpZiBuYW1lWzozXSBpbiAoJ19fLicsICdfXycpOgotICAgICAgICAgICAgcCA9IHBhY2thZ2UKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lWzM6XQotICAgICAgICAgICAgd2hpbGUgbmFtZVs6M10gaW4gKCdfXy4nLCAnX18nKToKLSAgICAgICAgICAgICAgICBwID0gcC5fXwotICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lWzM6XQotICAgICAgICAgICAgaWYgbm90IG5hbWU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZmluaXNoKHBhY2thZ2UsIHAsICcnLCBmcm9tbGlzdCkKLSAgICAgICAgICAgIGlmICcuJyBpbiBuYW1lOgotICAgICAgICAgICAgICAgIGkgPSBuYW1lLmZpbmQoJy4nKQotICAgICAgICAgICAgICAgIG5hbWUsIHRhaWwgPSBuYW1lWzppXSwgbmFtZVtpOl0KLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgdGFpbCA9ICcnCi0gICAgICAgICAgICBtbmFtZSA9IHAuX19uYW1lX18gYW5kIHAuX19uYW1lX18rJy4nK25hbWUgb3IgbmFtZQotICAgICAgICAgICAgbSA9IHNlbGYuZ2V0MShtbmFtZSkKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbmlzaChwYWNrYWdlLCBtLCB0YWlsLCBmcm9tbGlzdCkKLSAgICAgICAgaWYgJy4nIGluIG5hbWU6Ci0gICAgICAgICAgICBpID0gbmFtZS5maW5kKCcuJykKLSAgICAgICAgICAgIG5hbWUsIHRhaWwgPSBuYW1lWzppXSwgbmFtZVtpOl0KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHRhaWwgPSAnJwotICAgICAgICBmb3IgcG5hbWUgaW4gcGFja2FnZS5fX2RvbWFpbl9fOgotICAgICAgICAgICAgbW5hbWUgPSBwbmFtZSBhbmQgcG5hbWUrJy4nK25hbWUgb3IgbmFtZQotICAgICAgICAgICAgbSA9IHNlbGYuZ2V0MChtbmFtZSkKLSAgICAgICAgICAgIGlmIG06IGJyZWFrCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgIk5vIHN1Y2ggbW9kdWxlICVzIiAlIG5hbWUKLSAgICAgICAgcmV0dXJuIHNlbGYuZmluaXNoKG0sIG0sIHRhaWwsIGZyb21saXN0KQotCi0gICAgZGVmIGZpbmlzaChzZWxmLCBtb2R1bGUsIG0sIHRhaWwsIGZyb21saXN0KToKLSAgICAgICAgIyBHb3QgLi4uLkE7IG5vdyBnZXQgLi4uLkEuQi5DLkQKLSAgICAgICAgeW5hbWUgPSBtLl9fbmFtZV9fCi0gICAgICAgIGlmIHRhaWwgYW5kIHN5cy5tb2R1bGVzLmhhc19rZXkoeW5hbWUgKyB0YWlsKTogIyBGYXN0IHBhdGgKLSAgICAgICAgICAgIHluYW1lLCB0YWlsID0geW5hbWUgKyB0YWlsLCAnJwotICAgICAgICAgICAgbSA9IHNlbGYuZ2V0MSh5bmFtZSkKLSAgICAgICAgd2hpbGUgdGFpbDoKLSAgICAgICAgICAgIGkgPSB0YWlsLmZpbmQoJy4nLCAxKQotICAgICAgICAgICAgaWYgaSA+IDA6Ci0gICAgICAgICAgICAgICAgaGVhZCwgdGFpbCA9IHRhaWxbOmldLCB0YWlsW2k6XQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBoZWFkLCB0YWlsID0gdGFpbCwgJycKLSAgICAgICAgICAgIHluYW1lID0geW5hbWUgKyBoZWFkCi0gICAgICAgICAgICBtID0gc2VsZi5nZXQxKHluYW1lKQotCi0gICAgICAgICMgR290IC4uLi5BLkIuQy5EOyBub3cgZmluYWxpemUgdGhpbmdzIGRlcGVuZGluZyBvbiBmcm9tbGlzdAotICAgICAgICBpZiBub3QgZnJvbWxpc3Q6Ci0gICAgICAgICAgICByZXR1cm4gbW9kdWxlCi0gICAgICAgIGlmICdfXycgaW4gZnJvbWxpc3Q6Ci0gICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgIkNhbid0IGltcG9ydCBfXyBmcm9tIGFueXdoZXJlIgotICAgICAgICBpZiBub3QgaGFzYXR0cihtLCAnX19wYXRoX18nKTogcmV0dXJuIG0KLSAgICAgICAgaWYgJyonIGluIGZyb21saXN0OgotICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJDYW4ndCBpbXBvcnQgKiBmcm9tIGEgcGFja2FnZSIKLSAgICAgICAgZm9yIGYgaW4gZnJvbWxpc3Q6Ci0gICAgICAgICAgICBpZiBoYXNhdHRyKG0sIGYpOiBjb250aW51ZQotICAgICAgICAgICAgZm5hbWUgPSB5bmFtZSArICcuJyArIGYKLSAgICAgICAgICAgIHNlbGYuZ2V0MShmbmFtZSkKLSAgICAgICAgcmV0dXJuIG0KLQotICAgIGRlZiBnZXQxKHNlbGYsIG5hbWUpOgotICAgICAgICBtID0gc2VsZi5nZXQobmFtZSkKLSAgICAgICAgaWYgbm90IG06Ci0gICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvciwgIk5vIG1vZHVsZSBuYW1lZCAlcyIgJSBuYW1lCi0gICAgICAgIHJldHVybiBtCi0KLSAgICBkZWYgZ2V0MChzZWxmLCBuYW1lKToKLSAgICAgICAgbSA9IHNlbGYuZ2V0KG5hbWUpCi0gICAgICAgIGlmIG5vdCBtOgotICAgICAgICAgICAgc3lzLm1vZHVsZXNbbmFtZV0gPSBOb25lCi0gICAgICAgIHJldHVybiBtCi0KLSAgICBkZWYgZ2V0KHNlbGYsIG5hbWUpOgotICAgICAgICAjIEludGVybmFsIHJvdXRpbmUgdG8gZ2V0IG9yIGxvYWQgYSBtb2R1bGUgd2hlbiBpdHMgcGFyZW50IGV4aXN0cwotICAgICAgICBpZiBzeXMubW9kdWxlcy5oYXNfa2V5KG5hbWUpOgotICAgICAgICAgICAgcmV0dXJuIHN5cy5tb2R1bGVzW25hbWVdCi0gICAgICAgIGlmICcuJyBpbiBuYW1lOgotICAgICAgICAgICAgaSA9IG5hbWUucmZpbmQoJy4nKQotICAgICAgICAgICAgaGVhZCwgdGFpbCA9IG5hbWVbOmldLCBuYW1lW2krMTpdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBoZWFkLCB0YWlsID0gJycsIG5hbWUKLSAgICAgICAgcGF0aCA9IHN5cy5tb2R1bGVzW2hlYWRdLl9fcGF0aF9fCi0gICAgICAgIHN0dWZmID0gc2VsZi5sb2FkZXIuZmluZF9tb2R1bGUodGFpbCwgcGF0aCkKLSAgICAgICAgaWYgbm90IHN0dWZmOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgc3lzLm1vZHVsZXNbbmFtZV0gPSBtID0gc2VsZi5sb2FkZXIubG9hZF9tb2R1bGUobmFtZSwgc3R1ZmYpCi0gICAgICAgIGlmIGhlYWQ6Ci0gICAgICAgICAgICBzZXRhdHRyKHN5cy5tb2R1bGVzW2hlYWRdLCB0YWlsLCBtKQotICAgICAgICByZXR1cm4gbQotCi0gICAgZGVmIHJlbG9hZChzZWxmLCBtb2R1bGUpOgotICAgICAgICBuYW1lID0gbW9kdWxlLl9fbmFtZV9fCi0gICAgICAgIGlmICcuJyBpbiBuYW1lOgotICAgICAgICAgICAgaSA9IG5hbWUucmZpbmQoJy4nKQotICAgICAgICAgICAgaGVhZCwgdGFpbCA9IG5hbWVbOmldLCBuYW1lW2krMTpdCi0gICAgICAgICAgICBwYXRoID0gc3lzLm1vZHVsZXNbaGVhZF0uX19wYXRoX18KLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHRhaWwgPSBuYW1lCi0gICAgICAgICAgICBwYXRoID0gc3lzLm1vZHVsZXNbJyddLl9fcGF0aF9fCi0gICAgICAgIHN0dWZmID0gc2VsZi5sb2FkZXIuZmluZF9tb2R1bGUodGFpbCwgcGF0aCkKLSAgICAgICAgaWYgbm90IHN0dWZmOgotICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IsICJObyBtb2R1bGUgbmFtZWQgJXMiICUgbmFtZQotICAgICAgICByZXR1cm4gc2VsZi5sb2FkZXIubG9hZF9tb2R1bGUobmFtZSwgc3R1ZmYpCi0KLSAgICBkZWYgdW5sb2FkKHNlbGYsIG1vZHVsZSk6Ci0gICAgICAgIGlmIGhhc2F0dHIobW9kdWxlLCAnX19wYXRoX18nKToKLSAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yLCAiZG9uJ3Qga25vdyBob3cgdG8gdW5sb2FkIHBhY2thZ2VzIHlldCIKLSAgICAgICAgUGFja2FnZUltcG9ydGVyLnVubG9hZChzZWxmLCBtb2R1bGUpCi0KLSAgICBkZWYgaW5zdGFsbChzZWxmKToKLSAgICAgICAgaWYgbm90IHN5cy5tb2R1bGVzLmhhc19rZXkoJycpOgotICAgICAgICAgICAgc3lzLm1vZHVsZXNbJyddID0gcGFja2FnZSA9IGltcC5uZXdfbW9kdWxlKCcnKQotICAgICAgICAgICAgcGFja2FnZS5fX3BhdGhfXyA9IE5vbmUKLSAgICAgICAgICAgIHNlbGYubG9hZGVyLmluaXRfcGFja2FnZShwYWNrYWdlKQotICAgICAgICAgICAgZm9yIG0gaW4gc3lzLm1vZHVsZXMudmFsdWVzKCk6Ci0gICAgICAgICAgICAgICAgaWYgbm90IG06IGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgaWYgbm90IGhhc2F0dHIobSwgJ19fJyk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZGVyLnNldF9wYXJlbnQobSkKLSAgICAgICAgTW9kdWxlSW1wb3J0ZXIuaW5zdGFsbChzZWxmKQotCi0KLWRlZiBpbnN0YWxsKHYgPSAwKToKLSAgICBpaG9va3MuaW5zdGFsbChQYWNrYWdlSW1wb3J0ZXIoTm9uZSwgdikpCi0KLWRlZiB1bmluc3RhbGwoKToKLSAgICBpaG9va3MudW5pbnN0YWxsKCkKLQotZGVmIG5pKHYgPSAwKToKLSAgICBpbnN0YWxsKHYpCi0KLWRlZiBubygpOgotICAgIHVuaW5zdGFsbCgpCi0KLWRlZiB0ZXN0KCk6Ci0gICAgaW1wb3J0IHBkYgotICAgIHRyeToKLSAgICAgICAgdGVzdHByb3BlcigpCi0gICAgZXhjZXB0OgotICAgICAgICBzeXMubGFzdF90eXBlLCBzeXMubGFzdF92YWx1ZSwgc3lzLmxhc3RfdHJhY2ViYWNrID0gc3lzLmV4Y19pbmZvKCkKLSAgICAgICAgcHJpbnQKLSAgICAgICAgcHJpbnQgc3lzLmxhc3RfdHlwZSwgJzonLCBzeXMubGFzdF92YWx1ZQotICAgICAgICBwcmludAotICAgICAgICBwZGIucG0oKQotCi1kZWYgdGVzdHByb3BlcigpOgotICAgIGluc3RhbGwoMSkKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCBtYWN0ZXN0Ci0gICAgICAgIHByaW50IGRpcihtYWN0ZXN0KQotICAgICAgICByYXdfaW5wdXQoJ09LPycpCi0gICAgZmluYWxseToKLSAgICAgICAgdW5pbnN0YWxsKCkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAgIHRlc3QoKQotZWxzZToKLSAgICBpbnN0YWxsKCkKZGlmZiAtLWdpdCBhL0xpYi9saWItb2xkL3BhY2ttYWlsLnB5IGIvTGliL2xpYi1vbGQvcGFja21haWwucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NjkxMDguLjAwMDAwMDAKLS0tIGEvTGliL2xpYi1vbGQvcGFja21haWwucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotIyBNb2R1bGUgJ3BhY2ttYWlsJyAtLSBjcmVhdGUgYSBzZWxmLXVucGFja2luZyBzaGVsbCBhcmNoaXZlLgotCi0jIFRoaXMgbW9kdWxlIHdvcmtzIG9uIFVOSVggYW5kIG9uIHRoZSBNYWM7IHRoZSBhcmNoaXZlcyBjYW4gdW5wYWNrCi0jIHRoZW1zZWx2ZXMgb25seSBvbiBVTklYLgotCi1pbXBvcnQgb3MKLWZyb20gc3RhdCBpbXBvcnQgU1RfTVRJTUUKLQotIyBQcmludCBoZWxwCi1kZWYgaGVscCgpOgotICAgIHByaW50ICdBbGwgZm5zIGhhdmUgYSBmaWxlIG9wZW4gZm9yIHdyaXRpbmcgYXMgZmlyc3QgcGFyYW1ldGVyJwotICAgIHByaW50ICdwYWNrKGYsIGZ1bGxuYW1lLCBuYW1lKTogcGFjayBmdWxsbmFtZSBhcyBuYW1lJwotICAgIHByaW50ICdwYWNrc29tZShmLCBkaXJlY3RvcnksIG5hbWVsaXN0KTogc2VsZWN0ZWQgZmlsZXMgZnJvbSBkaXJlY3RvcnknCi0gICAgcHJpbnQgJ3BhY2thbGwoZiwgZGlyZWN0b3J5KTogcGFjayBhbGwgZmlsZXMgZnJvbSBkaXJlY3RvcnknCi0gICAgcHJpbnQgJ3BhY2tub3RvbGRlcihmLCBkaXJlY3RvcnksIG5hbWUpOiBwYWNrIGFsbCBmaWxlcyBmcm9tIGRpcmVjdG9yeScKLSAgICBwcmludCAnICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBhcmUgbm90IG9sZGVyIHRoYW4gYSBmaWxlIHRoZXJlJwotICAgIHByaW50ICdwYWNrdHJlZShmLCBkaXJlY3RvcnkpOiBwYWNrIGVudGlyZSBkaXJlY3RvcnkgdHJlZScKLQotIyBQYWNrIG9uZSBmaWxlCi1kZWYgcGFjayhvdXRmcCwgZmlsZSwgbmFtZSk6Ci0gICAgZnAgPSBvcGVuKGZpbGUsICdyJykKLSAgICBvdXRmcC53cml0ZSgnZWNobyAnICsgbmFtZSArICdcbicpCi0gICAgb3V0ZnAud3JpdGUoJ3NlZCAicy9eWC8vIiA+IicgKyBuYW1lICsgJyIgPDwiISJcbicpCi0gICAgd2hpbGUgMToKLSAgICAgICAgbGluZSA9IGZwLnJlYWRsaW5lKCkKLSAgICAgICAgaWYgbm90IGxpbmU6IGJyZWFrCi0gICAgICAgIGlmIGxpbmVbLTE6XSAhPSAnXG4nOgotICAgICAgICAgICAgbGluZSA9IGxpbmUgKyAnXG4nCi0gICAgICAgIG91dGZwLndyaXRlKCdYJyArIGxpbmUpCi0gICAgb3V0ZnAud3JpdGUoJyFcbicpCi0gICAgZnAuY2xvc2UoKQotCi0jIFBhY2sgc29tZSBmaWxlcyBmcm9tIGEgZGlyZWN0b3J5Ci1kZWYgcGFja3NvbWUob3V0ZnAsIGRpcm5hbWUsIG5hbWVzKToKLSAgICBmb3IgbmFtZSBpbiBuYW1lczoKLSAgICAgICAgcHJpbnQgbmFtZQotICAgICAgICBmaWxlID0gb3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpCi0gICAgICAgIHBhY2sob3V0ZnAsIGZpbGUsIG5hbWUpCi0KLSMgUGFjayBhbGwgZmlsZXMgZnJvbSBhIGRpcmVjdG9yeQotZGVmIHBhY2thbGwob3V0ZnAsIGRpcm5hbWUpOgotICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXJuYW1lKQotICAgIHRyeToKLSAgICAgICAgbmFtZXMucmVtb3ZlKCcuJykKLSAgICBleGNlcHQ6Ci0gICAgICAgIHBhc3MKLSAgICB0cnk6Ci0gICAgICAgIG5hbWVzLnJlbW92ZSgnLi4nKQotICAgIGV4Y2VwdDoKLSAgICAgICAgcGFzcwotICAgIG5hbWVzLnNvcnQoKQotICAgIHBhY2tzb21lKG91dGZwLCBkaXJuYW1lLCBuYW1lcykKLQotIyBQYWNrIGFsbCBmaWxlcyBmcm9tIGEgZGlyZWN0b3J5IHRoYXQgYXJlIG5vdCBvbGRlciB0aGFuIGEgZ2l2ZSBvbmUKLWRlZiBwYWNrbm90b2xkZXIob3V0ZnAsIGRpcm5hbWUsIG9sZGVzdCk6Ci0gICAgbmFtZXMgPSBvcy5saXN0ZGlyKGRpcm5hbWUpCi0gICAgdHJ5OgotICAgICAgICBuYW1lcy5yZW1vdmUoJy4nKQotICAgIGV4Y2VwdDoKLSAgICAgICAgcGFzcwotICAgIHRyeToKLSAgICAgICAgbmFtZXMucmVtb3ZlKCcuLicpCi0gICAgZXhjZXB0OgotICAgICAgICBwYXNzCi0gICAgb2xkZXN0ID0gb3MucGF0aC5qb2luKGRpcm5hbWUsIG9sZGVzdCkKLSAgICBzdCA9IG9zLnN0YXQob2xkZXN0KQotICAgIG10aW1lID0gc3RbU1RfTVRJTUVdCi0gICAgdG9kbyA9IFtdCi0gICAgZm9yIG5hbWUgaW4gbmFtZXM6Ci0gICAgICAgIHByaW50IG5hbWUsICcuLi4nLAotICAgICAgICBzdCA9IG9zLnN0YXQob3MucGF0aC5qb2luKGRpcm5hbWUsIG5hbWUpKQotICAgICAgICBpZiBzdFtTVF9NVElNRV0gPj0gbXRpbWU6Ci0gICAgICAgICAgICBwcmludCAnWWVzLicKLSAgICAgICAgICAgIHRvZG8uYXBwZW5kKG5hbWUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCAnTm8uJwotICAgIHRvZG8uc29ydCgpCi0gICAgcGFja3NvbWUob3V0ZnAsIGRpcm5hbWUsIHRvZG8pCi0KLSMgUGFjayBhIHdob2xlIHRyZWUgKG5vIGV4Y2VwdGlvbnMpCi1kZWYgcGFja3RyZWUob3V0ZnAsIGRpcm5hbWUpOgotICAgIHByaW50ICdwYWNrdHJlZScsIGRpcm5hbWUKLSAgICBvdXRmcC53cml0ZSgnbWtkaXIgJyArIHVuaXhmaXgoZGlybmFtZSkgKyAnXG4nKQotICAgIG5hbWVzID0gb3MubGlzdGRpcihkaXJuYW1lKQotICAgIHRyeToKLSAgICAgICAgbmFtZXMucmVtb3ZlKCcuJykKLSAgICBleGNlcHQ6Ci0gICAgICAgIHBhc3MKLSAgICB0cnk6Ci0gICAgICAgIG5hbWVzLnJlbW92ZSgnLi4nKQotICAgIGV4Y2VwdDoKLSAgICAgICAgcGFzcwotICAgIHN1YmRpcnMgPSBbXQotICAgIGZvciBuYW1lIGluIG5hbWVzOgotICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKQotICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZ1bGxuYW1lKToKLSAgICAgICAgICAgIHN1YmRpcnMuYXBwZW5kKGZ1bGxuYW1lKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgJ3BhY2snLCBmdWxsbmFtZQotICAgICAgICAgICAgcGFjayhvdXRmcCwgZnVsbG5hbWUsIHVuaXhmaXgoZnVsbG5hbWUpKQotICAgIGZvciBzdWJkaXJuYW1lIGluIHN1YmRpcnM6Ci0gICAgICAgIHBhY2t0cmVlKG91dGZwLCBzdWJkaXJuYW1lKQotCi1kZWYgdW5peGZpeChuYW1lKToKLSAgICBjb21wcyA9IG5hbWUuc3BsaXQob3Muc2VwKQotICAgIHJlcyA9ICcnCi0gICAgZm9yIGNvbXAgaW4gY29tcHM6Ci0gICAgICAgIGlmIGNvbXA6Ci0gICAgICAgICAgICBpZiByZXM6IHJlcyA9IHJlcyArICcvJwotICAgICAgICAgICAgcmVzID0gcmVzICsgY29tcAotICAgIHJldHVybiByZXMKZGlmZiAtLWdpdCBhL0xpYi9saWItb2xkL3BvbHkucHkgYi9MaWIvbGliLW9sZC9wb2x5LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTZhMWRjLi4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL3BvbHkucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIG1vZHVsZSAncG9seScgLS0gUG9seW5vbWlhbHMKLQotIyBBIHBvbHlub21pYWwgaXMgcmVwcmVzZW50ZWQgYnkgYSBsaXN0IG9mIGNvZWZmaWNpZW50cywgZS5nLiwKLSMgWzEsIDEwLCA1XSByZXByZXNlbnRzIDEqeCoqMCArIDEwKngqKjEgKyA1KngqKjIgKG9yIDEgKyAxMHggKyA1eCoqMikuCi0jIFRoZXJlIGlzIG5vIHdheSB0byBzdXBwcmVzcyBpbnRlcm5hbCB6ZXJvczsgdHJhaWxpbmcgemVyb3MgYXJlCi0jIHRha2VuIG91dCBieSBub3JtYWxpemUoKS4KLQotZGVmIG5vcm1hbGl6ZShwKTogIyBTdHJpcCB1bm5lY2Vzc2FyeSB6ZXJvIGNvZWZmaWNpZW50cwotICAgIG4gPSBsZW4ocCkKLSAgICB3aGlsZSBuOgotICAgICAgICBpZiBwW24tMV06IHJldHVybiBwWzpuXQotICAgICAgICBuID0gbi0xCi0gICAgcmV0dXJuIFtdCi0KLWRlZiBwbHVzKGEsIGIpOgotICAgIGlmIGxlbihhKSA8IGxlbihiKTogYSwgYiA9IGIsIGEgIyBtYWtlIHN1cmUgYSBpcyB0aGUgbG9uZ2VzdAotICAgIHJlcyA9IGFbOl0gIyBtYWtlIGEgY29weQotICAgIGZvciBpIGluIHJhbmdlKGxlbihiKSk6Ci0gICAgICAgIHJlc1tpXSA9IHJlc1tpXSArIGJbaV0KLSAgICByZXR1cm4gbm9ybWFsaXplKHJlcykKLQotZGVmIG1pbnVzKGEsIGIpOgotICAgIG5lZ19iID0gbWFwKGxhbWJkYSB4OiAteCwgYls6XSkKLSAgICByZXR1cm4gcGx1cyhhLCBuZWdfYikKLQotZGVmIG9uZShwb3dlciwgY29lZmYpOiAjIFJlcHJlc2VudGF0aW9uIG9mIGNvZWZmICogeCoqcG93ZXIKLSAgICByZXMgPSBbXQotICAgIGZvciBpIGluIHJhbmdlKHBvd2VyKTogcmVzLmFwcGVuZCgwKQotICAgIHJldHVybiByZXMgKyBbY29lZmZdCi0KLWRlZiB0aW1lcyhhLCBiKToKLSAgICByZXMgPSBbXQotICAgIGZvciBpIGluIHJhbmdlKGxlbihhKSk6Ci0gICAgICAgIGZvciBqIGluIHJhbmdlKGxlbihiKSk6Ci0gICAgICAgICAgICByZXMgPSBwbHVzKHJlcywgb25lKGkraiwgYVtpXSpiW2pdKSkKLSAgICByZXR1cm4gcmVzCi0KLWRlZiBwb3dlcihhLCBuKTogIyBSYWlzZSBwb2x5bm9taWFsIGEgdG8gdGhlIHBvc2l0aXZlIGludGVncmFsIHBvd2VyIG4KLSAgICBpZiBuID09IDA6IHJldHVybiBbMV0KLSAgICBpZiBuID09IDE6IHJldHVybiBhCi0gICAgaWYgbi8yKjIgPT0gbjoKLSAgICAgICAgYiA9IHBvd2VyKGEsIG4vMikKLSAgICAgICAgcmV0dXJuIHRpbWVzKGIsIGIpCi0gICAgcmV0dXJuIHRpbWVzKHBvd2VyKGEsIG4tMSksIGEpCi0KLWRlZiBkZXIoYSk6ICMgRmlyc3QgZGVyaXZhdGl2ZQotICAgIHJlcyA9IGFbMTpdCi0gICAgZm9yIGkgaW4gcmFuZ2UobGVuKHJlcykpOgotICAgICAgICByZXNbaV0gPSByZXNbaV0gKiAoaSsxKQotICAgIHJldHVybiByZXMKLQotIyBDb21wdXRpbmcgYSBwcmltaXRpdmUgZnVuY3Rpb24gd291bGQgcmVxdWlyZSByYXRpb25hbCBhcml0aG1ldGljLi4uCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC9yYW5kLnB5IGIvTGliL2xpYi1vbGQvcmFuZC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU1N2I2OS4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9yYW5kLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotIyBNb2R1bGUgJ3JhbmQnCi0jIERvbid0IHVzZSB1bmxlc3MgeW91IHdhbnQgY29tcGF0aWJpbGl0eSB3aXRoIEMncyByYW5kKCkhCi0KLWltcG9ydCB3aHJhbmRvbQotCi1kZWYgc3JhbmQoc2VlZCk6Ci0gICAgd2hyYW5kb20uc2VlZChzZWVkJTI1Niwgc2VlZC8yNTYlMjU2LCBzZWVkLzY1NTM2JTI1NikKLQotZGVmIHJhbmQoKToKLSAgICByZXR1cm4gaW50KHdocmFuZG9tLnJhbmRvbSgpICogMzI3NjguMCkgJSAzMjc2OAotCi1kZWYgY2hvaWNlKHNlcSk6Ci0gICAgcmV0dXJuIHNlcVtyYW5kKCkgJSBsZW4oc2VxKV0KZGlmZiAtLWdpdCBhL0xpYi9saWItb2xkL3N0YXRjYWNoZS5weSBiL0xpYi9saWItb2xkL3N0YXRjYWNoZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3ODM5My4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC9zdGF0Y2FjaGUucHkKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0iIiJNYWludGFpbiBhIGNhY2hlIG9mIHN0YXQoKSBpbmZvcm1hdGlvbiBvbiBmaWxlcy4KLQotVGhlcmUgYXJlIGZ1bmN0aW9ucyB0byByZXNldCB0aGUgY2FjaGUgb3IgdG8gc2VsZWN0aXZlbHkgcmVtb3ZlIGl0ZW1zLgotIiIiCi0KLWltcG9ydCB3YXJuaW5ncwotd2FybmluZ3Mud2FybigiVGhlIHN0YXRjYWNoZSBtb2R1bGUgaXMgb2Jzb2xldGUuICBVc2Ugb3Muc3RhdCgpIGluc3RlYWQuIiwKLSAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nKQotZGVsIHdhcm5pbmdzCi0KLWltcG9ydCBvcyBhcyBfb3MKLWZyb20gc3RhdCBpbXBvcnQgKgotCi1fX2FsbF9fID0gWyJzdGF0IiwicmVzZXQiLCJmb3JnZXQiLCJmb3JnZXRfcHJlZml4IiwiZm9yZ2V0X2RpciIsCi0gICAgICAgICAgICJmb3JnZXRfZXhjZXB0X3ByZWZpeCIsImlzZGlyIl0KLQotIyBUaGUgY2FjaGUuICBLZXlzIGFyZSBwYXRobmFtZXMsIHZhbHVlcyBhcmUgb3Muc3RhdCBvdXRjb21lcy4KLSMgUmVtZW1iZXIgdGhhdCBtdWx0aXBsZSB0aHJlYWRzIG1heSBiZSBjYWxsaW5nIHRoaXMhICBTbywgZS5nLiwgdGhhdAotIyBwYXRoIGluIGNhY2hlIHJldHVybnMgMSBkb2Vzbid0IG1lYW4gdGhlIGNhY2hlIHdpbGwgc3RpbGwgY29udGFpbgotIyBwYXRoIG9uIHRoZSBuZXh0IGxpbmUuICBDb2RlIGRlZmVuc2l2ZWx5LgotCi1jYWNoZSA9IHt9Ci0KLWRlZiBzdGF0KHBhdGgpOgotICAgICIiIlN0YXQgYSBmaWxlLCBwb3NzaWJseSBvdXQgb2YgdGhlIGNhY2hlLiIiIgotICAgIHJldCA9IGNhY2hlLmdldChwYXRoLCBOb25lKQotICAgIGlmIHJldCBpcyBOb25lOgotICAgICAgICBjYWNoZVtwYXRoXSA9IHJldCA9IF9vcy5zdGF0KHBhdGgpCi0gICAgcmV0dXJuIHJldAotCi1kZWYgcmVzZXQoKToKLSAgICAiIiJDbGVhciB0aGUgY2FjaGUuIiIiCi0gICAgY2FjaGUuY2xlYXIoKQotCi0jIEZvciB0aHJlYWQgc2FmdGV5LCBhbHdheXMgdXNlIGZvcmdldCgpIGludGVybmFsbHkgdG9vLgotZGVmIGZvcmdldChwYXRoKToKLSAgICAiIiJSZW1vdmUgYSBnaXZlbiBpdGVtIGZyb20gdGhlIGNhY2hlLCBpZiBpdCBleGlzdHMuIiIiCi0gICAgdHJ5OgotICAgICAgICBkZWwgY2FjaGVbcGF0aF0KLSAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgIHBhc3MKLQotZGVmIGZvcmdldF9wcmVmaXgocHJlZml4KToKLSAgICAiIiJSZW1vdmUgYWxsIHBhdGhuYW1lcyB3aXRoIGEgZ2l2ZW4gcHJlZml4LiIiIgotICAgIGZvciBwYXRoIGluIGNhY2hlLmtleXMoKToKLSAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKHByZWZpeCk6Ci0gICAgICAgICAgICBmb3JnZXQocGF0aCkKLQotZGVmIGZvcmdldF9kaXIocHJlZml4KToKLSAgICAiIiJGb3JnZXQgYSBkaXJlY3RvcnkgYW5kIGFsbCBlbnRyaWVzIGV4Y2VwdCBmb3IgZW50cmllcyBpbiBzdWJkaXJzLiIiIgotCi0gICAgIyBSZW1vdmUgdHJhaWxpbmcgc2VwYXJhdG9yLCBpZiBhbnkuICBUaGlzIGlzIHRyaWNreSB0byBkbyBpbiBhCi0gICAgIyB4LXBsYXRmb3JtIHdheS4gIEZvciBleGFtcGxlLCBXaW5kb3dzIGFjY2VwdHMgYm90aCAvIGFuZCBcIGFzCi0gICAgIyBzZXBhcmF0b3JzLCBhbmQgaWYgdGhlcmUncyBub3RoaW5nICpidXQqIGEgc2VwYXJhdG9yIHdlIHdhbnQgdG8KLSAgICAjIHByZXNlcnZlIHRoYXQgdGhpcyBpcyB0aGUgcm9vdC4gIE9ubHkgb3MucGF0aCBoYXMgdGhlIHBsYXRmb3JtCi0gICAgIyBrbm93bGVkZ2Ugd2UgbmVlZC4KLSAgICBmcm9tIG9zLnBhdGggaW1wb3J0IHNwbGl0LCBqb2luCi0gICAgcHJlZml4ID0gc3BsaXQoam9pbihwcmVmaXgsICJ4eHgiKSlbMF0KLSAgICBmb3JnZXQocHJlZml4KQotICAgIGZvciBwYXRoIGluIGNhY2hlLmtleXMoKToKLSAgICAgICAgIyBGaXJzdCBjaGVjayB0aGF0IHRoZSBwYXRoIGF0IGxlYXN0IHN0YXJ0cyB3aXRoIHRoZSBwcmVmaXgsIHNvCi0gICAgICAgICMgdGhhdCB3aGVuIGl0IGRvZXNuJ3Qgd2UgY2FuIGF2b2lkIHBheWluZyBmb3Igc3BsaXQoKS4KLSAgICAgICAgaWYgcGF0aC5zdGFydHN3aXRoKHByZWZpeCkgYW5kIHNwbGl0KHBhdGgpWzBdID09IHByZWZpeDoKLSAgICAgICAgICAgIGZvcmdldChwYXRoKQotCi1kZWYgZm9yZ2V0X2V4Y2VwdF9wcmVmaXgocHJlZml4KToKLSAgICAiIiJSZW1vdmUgYWxsIHBhdGhuYW1lcyBleGNlcHQgd2l0aCBhIGdpdmVuIHByZWZpeC4KLQotICAgIE5vcm1hbGx5IHVzZWQgd2l0aCBwcmVmaXggPSAnLycgYWZ0ZXIgYSBjaGRpcigpLgotICAgICIiIgotCi0gICAgZm9yIHBhdGggaW4gY2FjaGUua2V5cygpOgotICAgICAgICBpZiBub3QgcGF0aC5zdGFydHN3aXRoKHByZWZpeCk6Ci0gICAgICAgICAgICBmb3JnZXQocGF0aCkKLQotZGVmIGlzZGlyKHBhdGgpOgotICAgICIiIlJldHVybiBUcnVlIGlmIGRpcmVjdG9yeSwgZWxzZSBGYWxzZS4iIiIKLSAgICB0cnk6Ci0gICAgICAgIHN0ID0gc3RhdChwYXRoKQotICAgIGV4Y2VwdCBfb3MuZXJyb3I6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBTX0lTRElSKHN0LnN0X21vZGUpCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC90Yi5weSBiL0xpYi9saWItb2xkL3RiLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDYzNTU5Li4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL3RiLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLSMgUHJpbnQgdHJhY2ViYWNrcywgd2l0aCBhIGR1bXAgb2YgbG9jYWwgdmFyaWFibGVzLgotIyBBbHNvIGFuIGludGVyYWN0aXZlIHN0YWNrIHRyYWNlIGJyb3dzZXIuCi0jIE5vdGUgLS0gdGhpcyBtb2R1bGUgaXMgb2Jzb2xldGUgLS0gdXNlIHBkYi5wbSgpIGluc3RlYWQuCi0KLWltcG9ydCBzeXMKLWltcG9ydCBvcwotZnJvbSBzdGF0IGltcG9ydCAqCi1pbXBvcnQgbGluZWNhY2hlCi0KLWRlZiBicigpOiBicm93c2VyKHN5cy5sYXN0X3RyYWNlYmFjaykKLQotZGVmIHRiKCk6IHByaW50dGIoc3lzLmxhc3RfdHJhY2ViYWNrKQotCi1kZWYgYnJvd3Nlcih0Yik6Ci0gICAgaWYgbm90IHRiOgotICAgICAgICBwcmludCAnTm8gdHJhY2ViYWNrLicKLSAgICAgICAgcmV0dXJuCi0gICAgdGJsaXN0ID0gW10KLSAgICB3aGlsZSB0YjoKLSAgICAgICAgdGJsaXN0LmFwcGVuZCh0YikKLSAgICAgICAgdGIgPSB0Yi50Yl9uZXh0Ci0gICAgcHRyID0gbGVuKHRibGlzdCktMQotICAgIHRiID0gdGJsaXN0W3B0cl0KLSAgICB3aGlsZSAxOgotICAgICAgICBpZiB0YiAhPSB0Ymxpc3RbcHRyXToKLSAgICAgICAgICAgIHRiID0gdGJsaXN0W3B0cl0KLSAgICAgICAgICAgIHByaW50IGBwdHJgICsgJzonLAotICAgICAgICAgICAgcHJpbnR0YmhlYWRlcih0YikKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgbGluZSA9IHJhd19pbnB1dCgnVEI6ICcpCi0gICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLSAgICAgICAgICAgIHByaW50ICdcbltJbnRlcnJ1cHRlZF0nCi0gICAgICAgICAgICBicmVhawotICAgICAgICBleGNlcHQgRU9GRXJyb3I6Ci0gICAgICAgICAgICBwcmludCAnXG5bRU9GXScKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgIGNtZCA9IGxpbmUuc3RyaXAoKQotICAgICAgICBpZiBjbWQ6Ci0gICAgICAgICAgICBpZiBjbWQgPT0gJ3F1aXQnOgotICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICBlbGlmIGNtZCA9PSAnbGlzdCc6Ci0gICAgICAgICAgICAgICAgYnJvd3Nlcmxpc3QodGIpCi0gICAgICAgICAgICBlbGlmIGNtZCA9PSAndXAnOgotICAgICAgICAgICAgICAgIGlmIHB0ci0xID49IDA6IHB0ciA9IHB0ci0xCi0gICAgICAgICAgICAgICAgZWxzZTogcHJpbnQgJ0JvdHRvbSBvZiBzdGFjay4nCi0gICAgICAgICAgICBlbGlmIGNtZCA9PSAnZG93bic6Ci0gICAgICAgICAgICAgICAgaWYgcHRyKzEgPCBsZW4odGJsaXN0KTogcHRyID0gcHRyKzEKLSAgICAgICAgICAgICAgICBlbHNlOiBwcmludCAnVG9wIG9mIHN0YWNrLicKLSAgICAgICAgICAgIGVsaWYgY21kID09ICdsb2NhbHMnOgotICAgICAgICAgICAgICAgIHByaW50c3ltYm9scyh0Yi50Yl9mcmFtZS5mX2xvY2FscykKLSAgICAgICAgICAgIGVsaWYgY21kID09ICdnbG9iYWxzJzoKLSAgICAgICAgICAgICAgICBwcmludHN5bWJvbHModGIudGJfZnJhbWUuZl9nbG9iYWxzKQotICAgICAgICAgICAgZWxpZiBjbWQgaW4gKCc/JywgJ2hlbHAnKToKLSAgICAgICAgICAgICAgICBicm93c2VyaGVscCgpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGJyb3dzZXJleGVjKHRiLCBjbWQpCi0KLWRlZiBicm93c2VybGlzdCh0Yik6Ci0gICAgZmlsZW5hbWUgPSB0Yi50Yl9mcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKLSAgICBsaW5lbm8gPSB0Yi50Yl9saW5lbm8KLSAgICBsYXN0ID0gbGluZW5vCi0gICAgZmlyc3QgPSBtYXgoMSwgbGFzdC0xMCkKLSAgICBmb3IgaSBpbiByYW5nZShmaXJzdCwgbGFzdCsxKToKLSAgICAgICAgaWYgaSA9PSBsaW5lbm86IHByZWZpeCA9ICcqKionICsgYGlgLnJqdXN0KDQpICsgJzonCi0gICAgICAgIGVsc2U6IHByZWZpeCA9IGBpYC5yanVzdCg3KSArICc6JwotICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGkpCi0gICAgICAgIGlmIGxpbmVbLTE6XSA9PSAnXG4nOiBsaW5lID0gbGluZVs6LTFdCi0gICAgICAgIHByaW50IHByZWZpeCArIGxpbmUKLQotZGVmIGJyb3dzZXJleGVjKHRiLCBjbWQpOgotICAgIGxvY2FscyA9IHRiLnRiX2ZyYW1lLmZfbG9jYWxzCi0gICAgZ2xvYmFscyA9IHRiLnRiX2ZyYW1lLmZfZ2xvYmFscwotICAgIHRyeToKLSAgICAgICAgZXhlYyBjbWQrJ1xuJyBpbiBnbG9iYWxzLCBsb2NhbHMKLSAgICBleGNlcHQ6Ci0gICAgICAgIHQsIHYgPSBzeXMuZXhjX2luZm8oKVs6Ml0KLSAgICAgICAgcHJpbnQgJyoqKiBFeGNlcHRpb246JywKLSAgICAgICAgaWYgdHlwZSh0KSBpcyB0eXBlKCcnKToKLSAgICAgICAgICAgIHByaW50IHQsCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCB0Ll9fbmFtZV9fLAotICAgICAgICBpZiB2IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgcHJpbnQgJzonLCB2LAotICAgICAgICBwcmludAotICAgICAgICBwcmludCAnVHlwZSBoZWxwIHRvIGdldCBoZWxwLicKLQotZGVmIGJyb3dzZXJoZWxwKCk6Ci0gICAgcHJpbnQKLSAgICBwcmludCAnICAgIFRoaXMgaXMgdGhlIHRyYWNlYmFjayBicm93c2VyLiAgQ29tbWFuZHMgYXJlOicKLSAgICBwcmludCAnICAgICAgICB1cCAgICAgIDogbW92ZSBvbmUgbGV2ZWwgdXAgaW4gdGhlIGNhbGwgc3RhY2snCi0gICAgcHJpbnQgJyAgICAgICAgZG93biAgICA6IG1vdmUgb25lIGxldmVsIGRvd24gaW4gdGhlIGNhbGwgc3RhY2snCi0gICAgcHJpbnQgJyAgICAgICAgbG9jYWxzICA6IHByaW50IGFsbCBsb2NhbCB2YXJpYWJsZXMgYXQgdGhpcyBsZXZlbCcKLSAgICBwcmludCAnICAgICAgICBnbG9iYWxzIDogcHJpbnQgYWxsIGdsb2JhbCB2YXJpYWJsZXMgYXQgdGhpcyBsZXZlbCcKLSAgICBwcmludCAnICAgICAgICBsaXN0ICAgIDogbGlzdCBzb3VyY2UgY29kZSBhcm91bmQgdGhlIGZhaWx1cmUnCi0gICAgcHJpbnQgJyAgICAgICAgaGVscCAgICA6IHByaW50IGhlbHAgKHdoYXQgeW91IGFyZSByZWFkaW5nIG5vdyknCi0gICAgcHJpbnQgJyAgICAgICAgcXVpdCAgICA6IGJhY2sgdG8gY29tbWFuZCBpbnRlcnByZXRlcicKLSAgICBwcmludCAnICAgIFR5cGluZyBhbnkgb3RoZXIgMS1saW5lIHN0YXRlbWVudCB3aWxsIGV4ZWN1dGUgaXQnCi0gICAgcHJpbnQgJyAgICB1c2luZyB0aGUgY3VycmVudCBsZXZlbFwncyBzeW1ib2wgdGFibGVzJwotICAgIHByaW50Ci0KLWRlZiBwcmludHRiKHRiKToKLSAgICB3aGlsZSB0YjoKLSAgICAgICAgcHJpbnQxdGIodGIpCi0gICAgICAgIHRiID0gdGIudGJfbmV4dAotCi1kZWYgcHJpbnQxdGIodGIpOgotICAgIHByaW50dGJoZWFkZXIodGIpCi0gICAgaWYgdGIudGJfZnJhbWUuZl9sb2NhbHMgaXMgbm90IHRiLnRiX2ZyYW1lLmZfZ2xvYmFsczoKLSAgICAgICAgcHJpbnRzeW1ib2xzKHRiLnRiX2ZyYW1lLmZfbG9jYWxzKQotCi1kZWYgcHJpbnR0YmhlYWRlcih0Yik6Ci0gICAgZmlsZW5hbWUgPSB0Yi50Yl9mcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKLSAgICBsaW5lbm8gPSB0Yi50Yl9saW5lbm8KLSAgICBpbmZvID0gJyInICsgZmlsZW5hbWUgKyAnIignICsgYGxpbmVub2AgKyAnKScKLSAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubykKLSAgICBpZiBsaW5lOgotICAgICAgICBpbmZvID0gaW5mbyArICc6ICcgKyBsaW5lLnN0cmlwKCkKLSAgICBwcmludCBpbmZvCi0KLWRlZiBwcmludHN5bWJvbHMoZCk6Ci0gICAga2V5cyA9IGQua2V5cygpCi0gICAga2V5cy5zb3J0KCkKLSAgICBmb3IgbmFtZSBpbiBrZXlzOgotICAgICAgICBwcmludCAnICAnICsgbmFtZS5sanVzdCgxMikgKyAnOicsCi0gICAgICAgIHByaW50b2JqZWN0KGRbbmFtZV0sIDQpCi0gICAgICAgIHByaW50Ci0KLWRlZiBwcmludG9iamVjdCh2LCBtYXhsZXZlbCk6Ci0gICAgaWYgdiBpcyBOb25lOgotICAgICAgICBwcmludCAnTm9uZScsCi0gICAgZWxpZiB0eXBlKHYpIGluICh0eXBlKDApLCB0eXBlKDAuMCkpOgotICAgICAgICBwcmludCB2LAotICAgIGVsaWYgdHlwZSh2KSBpcyB0eXBlKCcnKToKLSAgICAgICAgaWYgbGVuKHYpID4gMjA6Ci0gICAgICAgICAgICBwcmludCBgdls6MTddICsgJy4uLidgLAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgYHZgLAotICAgIGVsaWYgdHlwZSh2KSBpcyB0eXBlKCgpKToKLSAgICAgICAgcHJpbnQgJygnLAotICAgICAgICBwcmludGxpc3QodiwgbWF4bGV2ZWwpCi0gICAgICAgIHByaW50ICcpJywKLSAgICBlbGlmIHR5cGUodikgaXMgdHlwZShbXSk6Ci0gICAgICAgIHByaW50ICdbJywKLSAgICAgICAgcHJpbnRsaXN0KHYsIG1heGxldmVsKQotICAgICAgICBwcmludCAnXScsCi0gICAgZWxpZiB0eXBlKHYpIGlzIHR5cGUoe30pOgotICAgICAgICBwcmludCAneycsCi0gICAgICAgIHByaW50ZGljdCh2LCBtYXhsZXZlbCkKLSAgICAgICAgcHJpbnQgJ30nLAotICAgIGVsc2U6Ci0gICAgICAgIHByaW50IHYsCi0KLWRlZiBwcmludGxpc3QodiwgbWF4bGV2ZWwpOgotICAgIG4gPSBsZW4odikKLSAgICBpZiBuID09IDA6IHJldHVybgotICAgIGlmIG1heGxldmVsIDw9IDA6Ci0gICAgICAgIHByaW50ICcuLi4nLAotICAgICAgICByZXR1cm4KLSAgICBmb3IgaSBpbiByYW5nZShtaW4oNiwgbikpOgotICAgICAgICBwcmludG9iamVjdCh2W2ldLCBtYXhsZXZlbC0xKQotICAgICAgICBpZiBpKzEgPCBuOiBwcmludCAnLCcsCi0gICAgaWYgbiA+IDY6IHByaW50ICcuLi4nLAotCi1kZWYgcHJpbnRkaWN0KHYsIG1heGxldmVsKToKLSAgICBrZXlzID0gdi5rZXlzKCkKLSAgICBuID0gbGVuKGtleXMpCi0gICAgaWYgbiA9PSAwOiByZXR1cm4KLSAgICBpZiBtYXhsZXZlbCA8PSAwOgotICAgICAgICBwcmludCAnLi4uJywKLSAgICAgICAgcmV0dXJuCi0gICAga2V5cy5zb3J0KCkKLSAgICBmb3IgaSBpbiByYW5nZShtaW4oNiwgbikpOgotICAgICAgICBrZXkgPSBrZXlzW2ldCi0gICAgICAgIHByaW50IGBrZXlgICsgJzonLAotICAgICAgICBwcmludG9iamVjdCh2W2tleV0sIG1heGxldmVsLTEpCi0gICAgICAgIGlmIGkrMSA8IG46IHByaW50ICcsJywKLSAgICBpZiBuID4gNjogcHJpbnQgJy4uLicsCmRpZmYgLS1naXQgYS9MaWIvbGliLW9sZC90enBhcnNlLnB5IGIvTGliL2xpYi1vbGQvdHpwYXJzZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI0NjhiNS4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC90enBhcnNlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAotIiIiUGFyc2UgYSB0aW1lem9uZSBzcGVjaWZpY2F0aW9uLiIiIgotCi0jIFhYWCBVbmZpbmlzaGVkLgotIyBYWFggT25seSB0aGUgdHlwaWNhbCBmb3JtICJYWFhoaFlZWTtkZGQvaGgsZGRkL2hoIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLgotCi1pbXBvcnQgd2FybmluZ3MKLXdhcm5pbmdzLndhcm4oCi0gICAgIlRoZSB0enBhcnNlIG1vZHVsZSBpcyBvYnNvbGV0ZSBhbmQgd2lsbCBkaXNhcHBlYXIgaW4gdGhlIGZ1dHVyZSIsCi0gICAgRGVwcmVjYXRpb25XYXJuaW5nKQotCi10enBhdCA9ICgnXihbQS1aXVtBLVpdW0EtWl0pKFstK10/WzAtOV0rKShbQS1aXVtBLVpdW0EtWl0pOycKLSAgICAgICAgICAnKFswLTldKykvKFswLTldKyksKFswLTldKykvKFswLTldKykkJykKLQotdHpwcm9nID0gTm9uZQotCi1kZWYgdHpwYXJzZSh0enN0cik6Ci0gICAgIiIiR2l2ZW4gYSB0aW1lem9uZSBzcGVjLCByZXR1cm4gYSB0dXBsZSBvZiBpbmZvcm1hdGlvbgotICAgICh0em5hbWUsIGRlbHRhLCBkc3RuYW1lLCBkYXlzdGFydCwgaG91cnN0YXJ0LCBkYXllbmQsIGhvdXJlbmQpLAotICAgIHdoZXJlICd0em5hbWUnIGlzIHRoZSBuYW1lIG9mIHRoZSB0aW1lem9uZSwgJ2RlbHRhJyBpcyB0aGUgb2Zmc2V0Ci0gICAgaW4gaG91cnMgZnJvbSBHTVQsICdkc3RuYW1lJyBpcyB0aGUgbmFtZSBvZiB0aGUgZGF5bGlnaHQtc2F2aW5nCi0gICAgdGltZXpvbmUsIGFuZCAnZGF5c3RhcnQnLydob3Vyc3RhcnQnIGFuZCAnZGF5ZW5kJy8naG91cmVuZCcKLSAgICBzcGVjaWZ5IHRoZSBzdGFydGluZyBhbmQgZW5kaW5nIHBvaW50cyBmb3IgZGF5bGlnaHQgc2F2aW5nIHRpbWUuIiIiCi0gICAgZ2xvYmFsIHR6cHJvZwotICAgIGlmIHR6cHJvZyBpcyBOb25lOgotICAgICAgICBpbXBvcnQgcmUKLSAgICAgICAgdHpwcm9nID0gcmUuY29tcGlsZSh0enBhdCkKLSAgICBtYXRjaCA9IHR6cHJvZy5tYXRjaCh0enN0cikKLSAgICBpZiBub3QgbWF0Y2g6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICdub3QgdGhlIFRaIHN5bnRheCBJIHVuZGVyc3RhbmQnCi0gICAgc3VicyA9IFtdCi0gICAgZm9yIGkgaW4gcmFuZ2UoMSwgOCk6Ci0gICAgICAgIHN1YnMuYXBwZW5kKG1hdGNoLmdyb3VwKGkpKQotICAgIGZvciBpIGluICgxLCAzLCA0LCA1LCA2KToKLSAgICAgICAgc3Vic1tpXSA9IGV2YWwoc3Vic1tpXSkKLSAgICBbdHpuYW1lLCBkZWx0YSwgZHN0bmFtZSwgZGF5c3RhcnQsIGhvdXJzdGFydCwgZGF5ZW5kLCBob3VyZW5kXSA9IHN1YnMKLSAgICByZXR1cm4gKHR6bmFtZSwgZGVsdGEsIGRzdG5hbWUsIGRheXN0YXJ0LCBob3Vyc3RhcnQsIGRheWVuZCwgaG91cmVuZCkKLQotZGVmIHR6bG9jYWx0aW1lKHNlY3MsIHBhcmFtcyk6Ci0gICAgIiIiR2l2ZW4gYSBVbml4IHRpbWUgaW4gc2Vjb25kcyBhbmQgYSB0dXBsZSBvZiBpbmZvcm1hdGlvbiBhYm91dAotICAgIGEgdGltZXpvbmUgYXMgcmV0dXJuZWQgYnkgdHpwYXJzZSgpLCByZXR1cm4gdGhlIGxvY2FsIHRpbWUgaW4gdGhlCi0gICAgZm9ybSAoeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWluLCBzZWMsIHlkYXksIHdkYXksIHR6bmFtZSkuIiIiCi0gICAgaW1wb3J0IHRpbWUKLSAgICAodHpuYW1lLCBkZWx0YSwgZHN0bmFtZSwgZGF5c3RhcnQsIGhvdXJzdGFydCwgZGF5ZW5kLCBob3VyZW5kKSA9IHBhcmFtcwotICAgIHllYXIsIG1vbnRoLCBkYXlzLCBob3VycywgbWlucywgc2VjcywgeWRheSwgd2RheSwgaXNkc3QgPSBcCi0gICAgICAgICAgICB0aW1lLmdtdGltZShzZWNzIC0gZGVsdGEqMzYwMCkKLSAgICBpZiAoZGF5c3RhcnQsIGhvdXJzdGFydCkgPD0gKHlkYXkrMSwgaG91cnMpIDwgKGRheWVuZCwgaG91cmVuZCk6Ci0gICAgICAgIHR6bmFtZSA9IGRzdG5hbWUKLSAgICAgICAgaG91cnMgPSBob3VycyArIDEKLSAgICByZXR1cm4geWVhciwgbW9udGgsIGRheXMsIGhvdXJzLCBtaW5zLCBzZWNzLCB5ZGF5LCB3ZGF5LCB0em5hbWUKLQotZGVmIHR6c2V0KCk6Ci0gICAgIiIiRGV0ZXJtaW5lIHRoZSBjdXJyZW50IHRpbWV6b25lIGZyb20gdGhlICJUWiIgZW52aXJvbm1lbnQgdmFyaWFibGUuIiIiCi0gICAgZ2xvYmFsIHR6cGFyYW1zLCB0aW1lem9uZSwgYWx0em9uZSwgZGF5bGlnaHQsIHR6bmFtZQotICAgIGltcG9ydCBvcwotICAgIHR6c3RyID0gb3MuZW52aXJvblsnVFonXQotICAgIHR6cGFyYW1zID0gdHpwYXJzZSh0enN0cikKLSAgICB0aW1lem9uZSA9IHR6cGFyYW1zWzFdICogMzYwMAotICAgIGFsdHpvbmUgPSB0aW1lem9uZSAtIDM2MDAKLSAgICBkYXlsaWdodCA9IDEKLSAgICB0em5hbWUgPSB0enBhcmFtc1swXSwgdHpwYXJhbXNbMl0KLQotZGVmIGlzZHN0KHNlY3MpOgotICAgICIiIlJldHVybiB0cnVlIGlmIGRheWxpZ2h0LXNhdmluZyB0aW1lIGlzIGluIGVmZmVjdCBmb3IgdGhlIGdpdmVuCi0gICAgVW5peCB0aW1lIGluIHRoZSBjdXJyZW50IHRpbWV6b25lLiIiIgotICAgIGltcG9ydCB0aW1lCi0gICAgKHR6bmFtZSwgZGVsdGEsIGRzdG5hbWUsIGRheXN0YXJ0LCBob3Vyc3RhcnQsIGRheWVuZCwgaG91cmVuZCkgPSBcCi0gICAgICAgICAgICB0enBhcmFtcwotICAgIHllYXIsIG1vbnRoLCBkYXlzLCBob3VycywgbWlucywgc2VjcywgeWRheSwgd2RheSwgaXNkc3QgPSBcCi0gICAgICAgICAgICB0aW1lLmdtdGltZShzZWNzIC0gZGVsdGEqMzYwMCkKLSAgICByZXR1cm4gKGRheXN0YXJ0LCBob3Vyc3RhcnQpIDw9ICh5ZGF5KzEsIGhvdXJzKSA8IChkYXllbmQsIGhvdXJlbmQpCi0KLXR6c2V0KCkKLQotZGVmIGxvY2FsdGltZShzZWNzKToKLSAgICAiIiJHZXQgdGhlIGxvY2FsIHRpbWUgaW4gdGhlIGN1cnJlbnQgdGltZXpvbmUuIiIiCi0gICAgcmV0dXJuIHR6bG9jYWx0aW1lKHNlY3MsIHR6cGFyYW1zKQotCi1kZWYgdGVzdCgpOgotICAgIGZyb20gdGltZSBpbXBvcnQgYXNjdGltZSwgZ210aW1lCi0gICAgaW1wb3J0IHRpbWUsIHN5cwotICAgIG5vdyA9IHRpbWUudGltZSgpCi0gICAgeCA9IGxvY2FsdGltZShub3cpCi0gICAgdG0gPSB4WzotMV0gKyAoMCwpCi0gICAgcHJpbnQgJ25vdyA9Jywgbm93LCAnPScsIGFzY3RpbWUodG0pLCB4Wy0xXQotICAgIG5vdyA9IG5vdyAtIG5vdyAlICgyNCozNjAwKQotICAgIGlmIHN5cy5hcmd2WzE6XTogbm93ID0gbm93ICsgZXZhbChzeXMuYXJndlsxXSkKLSAgICB4ID0gZ210aW1lKG5vdykKLSAgICB0bSA9IHhbOi0xXSArICgwLCkKLSAgICBwcmludCAnZ210aW1lID0nLCBub3csICc9JywgYXNjdGltZSh0bSksICd5ZGF5ID0nLCB4Wy0yXQotICAgIGphbjEgPSBub3cgLSB4Wy0yXSoyNCozNjAwCi0gICAgeCA9IGxvY2FsdGltZShqYW4xKQotICAgIHRtID0geFs6LTFdICsgKDAsKQotICAgIHByaW50ICdqYW4xID0nLCBqYW4xLCAnPScsIGFzY3RpbWUodG0pLCB4Wy0xXQotICAgIGZvciBkIGluIHJhbmdlKDg1LCA5NSkgKyByYW5nZSgyNjUsIDI3NSk6Ci0gICAgICAgIHQgPSBqYW4xICsgZCoyNCozNjAwCi0gICAgICAgIHggPSBsb2NhbHRpbWUodCkKLSAgICAgICAgdG0gPSB4WzotMV0gKyAoMCwpCi0gICAgICAgIHByaW50ICdkID0nLCBkLCAndCA9JywgdCwgJz0nLCBhc2N0aW1lKHRtKSwgeFstMV0KZGlmZiAtLWdpdCBhL0xpYi9saWItb2xkL3V0aWwucHkgYi9MaWIvbGliLW9sZC91dGlsLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDRhZjFlLi4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL3V0aWwucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIE1vZHVsZSAndXRpbCcgLS0gc29tZSB1c2VmdWwgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgZml0IGVsc2V3aGVyZQotCi0jIE5COiBUaGVzZSBhcmUgbm93IGJ1aWx0LWluIGZ1bmN0aW9ucywgYnV0IHRoaXMgbW9kdWxlIGlzIHByb3ZpZGVkCi0jIGZvciBjb21wYXRpYmlsaXR5LiAgRG9uJ3QgdXNlIGluIG5ldyBwcm9ncmFtcyB1bmxlc3MgeW91IG5lZWQgYmFja3dhcmQKLSMgY29tcGF0aWJpbGl0eSAoaS5lLiBuZWVkIHRvIHJ1biB3aXRoIG9sZCBpbnRlcnByZXRlcnMpLgotCi0KLSMgUmVtb3ZlIGFuIGl0ZW0gZnJvbSBhIGxpc3QuCi0jIE5vIGNvbXBsYWludHMgaWYgaXQgaXNuJ3QgaW4gdGhlIGxpc3QgYXQgYWxsLgotIyBJZiBpdCBvY2N1cnMgbW9yZSB0aGFuIG9uY2UsIHJlbW92ZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZS4KLSMKLWRlZiByZW1vdmUoaXRlbSwgbGlzdCk6Ci0gICAgaWYgaXRlbSBpbiBsaXN0OiBsaXN0LnJlbW92ZShpdGVtKQotCi0KLSMgUmV0dXJuIGEgc3RyaW5nIGNvbnRhaW5pbmcgYSBmaWxlJ3MgY29udGVudHMuCi0jCi1kZWYgcmVhZGZpbGUoZm4pOgotICAgIHJldHVybiByZWFkb3BlbmZpbGUob3BlbihmbiwgJ3InKSkKLQotCi0jIFJlYWQgYW4gb3BlbiBmaWxlIHVudGlsIEVPRi4KLSMKLWRlZiByZWFkb3BlbmZpbGUoZnApOgotICAgIHJldHVybiBmcC5yZWFkKCkKZGlmZiAtLWdpdCBhL0xpYi9saWItb2xkL3doYXRzb3VuZC5weSBiL0xpYi9saWItb2xkL3doYXRzb3VuZC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIxZGYyMy4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC93aGF0c291bmQucHkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1mcm9tIHNuZGhkciBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvTGliL2xpYi1vbGQvd2hyYW5kb20ucHkgYi9MaWIvbGliLW9sZC93aHJhbmRvbS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMwZDFhNC4uMDAwMDAwMAotLS0gYS9MaWIvbGliLW9sZC93aHJhbmRvbS5weQorKysgL2Rldi9udWxsCkBAIC0xLDE0NCArMCwwIEBACi0iIiJXaWNobWFuLUhpbGwgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IuCi0KLVdpY2htYW5uLCBCLiBBLiAmIEhpbGwsIEkuIEQuICgxOTgyKQotQWxnb3JpdGhtIEFTIDE4MzoKLUFuIGVmZmljaWVudCBhbmQgcG9ydGFibGUgcHNldWRvLXJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCi1BcHBsaWVkIFN0YXRpc3RpY3MgMzEgKDE5ODIpIDE4OC0xOTAKLQotc2VlIGFsc286Ci0gICAgICAgIENvcnJlY3Rpb24gdG8gQWxnb3JpdGhtIEFTIDE4MwotICAgICAgICBBcHBsaWVkIFN0YXRpc3RpY3MgMzMgKDE5ODQpIDEyMwotCi0gICAgICAgIE1jTGVvZCwgQS4gSS4gKDE5ODUpCi0gICAgICAgIEEgcmVtYXJrIG9uIEFsZ29yaXRobSBBUyAxODMKLSAgICAgICAgQXBwbGllZCBTdGF0aXN0aWNzIDM0ICgxOTg1KSwxOTgtMjAwCi0KLQotVVNFOgotd2hyYW5kb20ucmFuZG9tKCkgICAgICAgeWllbGRzIGRvdWJsZSBwcmVjaXNpb24gcmFuZG9tIG51bWJlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1seSBkaXN0cmlidXRlZCBiZXR3ZWVuIDAgYW5kIDEuCi0KLXdocmFuZG9tLnNlZWQoeCwgeSwgeikgIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB3aHJhbmRvbS5yYW5kb20oKQotICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VlZCB0aGUgZ2VuZXJhdG9yCi0KLVRoZXJlIGlzIGFsc28gYW4gaW50ZXJmYWNlIHRvIGNyZWF0ZSBtdWx0aXBsZSBpbmRlcGVuZGVudAotcmFuZG9tIGdlbmVyYXRvcnMsIGFuZCB0byBjaG9vc2UgZnJvbSBvdGhlciByYW5nZXMuCi0KLQotCi1NdWx0aS10aHJlYWRpbmcgbm90ZTogdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIHVzZWQgaGVyZSBpcyBub3QKLXRocmVhZC1zYWZlOyBpdCBpcyBwb3NzaWJsZSB0aGF0IG5lYXJseSBzaW11bHRhbmVvdXMgY2FsbHMgaW4KLWRpZmZlcmVudCB0aGVhZHMgcmV0dXJuIHRoZSBzYW1lIHJhbmRvbSB2YWx1ZS4gIFRvIGF2b2lkIHRoaXMsIHlvdQotaGF2ZSB0byB1c2UgYSBsb2NrIGFyb3VuZCBhbGwgY2FsbHMuICAoSSBkaWRuJ3Qgd2FudCB0byBzbG93IHRoaXMKLWRvd24gaW4gdGhlIHNlcmlhbCBjYXNlIGJ5IHVzaW5nIGEgbG9jayBoZXJlLikKLSIiIgotCi1pbXBvcnQgd2FybmluZ3MKLXdhcm5pbmdzLndhcm4oInRoZSB3aHJhbmRvbSBtb2R1bGUgaXMgZGVwcmVjYXRlZDsgcGxlYXNlIHVzZSB0aGUgcmFuZG9tIG1vZHVsZSIsCi0gICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLQotIyBUcmFuc2xhdGVkIGJ5IEd1aWRvIHZhbiBSb3NzdW0gZnJvbSBDIHNvdXJjZSBwcm92aWRlZCBieQotIyBBZHJpYW4gQmFkZGVsZXkuCi0KLQotY2xhc3Mgd2hyYW5kb206Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHggPSAwLCB5ID0gMCwgeiA9IDApOgotICAgICAgICAiIiJJbml0aWFsaXplIGFuIGluc3RhbmNlLgotICAgICAgICBXaXRob3V0IGFyZ3VtZW50cywgaW5pdGlhbGl6ZSBmcm9tIGN1cnJlbnQgdGltZS4KLSAgICAgICAgV2l0aCBhcmd1bWVudHMgKHgsIHksIHopLCBpbml0aWFsaXplIGZyb20gdGhlbS4iIiIKLSAgICAgICAgc2VsZi5zZWVkKHgsIHksIHopCi0KLSAgICBkZWYgc2VlZChzZWxmLCB4ID0gMCwgeSA9IDAsIHogPSAwKToKLSAgICAgICAgIiIiU2V0IHRoZSBzZWVkIGZyb20gKHgsIHksIHopLgotICAgICAgICBUaGVzZSBtdXN0IGJlIGludGVnZXJzIGluIHRoZSByYW5nZSBbMCwgMjU2KS4iIiIKLSAgICAgICAgaWYgbm90IHR5cGUoeCkgPT0gdHlwZSh5KSA9PSB0eXBlKHopID09IHR5cGUoMCk6Ci0gICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICdzZWVkcyBtdXN0IGJlIGludGVnZXJzJwotICAgICAgICBpZiBub3QgKDAgPD0geCA8IDI1NiBhbmQgMCA8PSB5IDwgMjU2IGFuZCAwIDw9IHogPCAyNTYpOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgJ3NlZWRzIG11c3QgYmUgaW4gcmFuZ2UoMCwgMjU2KScKLSAgICAgICAgaWYgMCA9PSB4ID09IHkgPT0gejoKLSAgICAgICAgICAgICMgSW5pdGlhbGl6ZSBmcm9tIGN1cnJlbnQgdGltZQotICAgICAgICAgICAgaW1wb3J0IHRpbWUKLSAgICAgICAgICAgIHQgPSBsb25nKHRpbWUudGltZSgpICogMjU2KQotICAgICAgICAgICAgdCA9IGludCgodCYweGZmZmZmZikgXiAodD4+MjQpKQotICAgICAgICAgICAgdCwgeCA9IGRpdm1vZCh0LCAyNTYpCi0gICAgICAgICAgICB0LCB5ID0gZGl2bW9kKHQsIDI1NikKLSAgICAgICAgICAgIHQsIHogPSBkaXZtb2QodCwgMjU2KQotICAgICAgICAjIFplcm8gaXMgYSBwb29yIHNlZWQsIHNvIHN1YnN0aXR1dGUgMQotICAgICAgICBzZWxmLl9zZWVkID0gKHggb3IgMSwgeSBvciAxLCB6IG9yIDEpCi0KLSAgICBkZWYgcmFuZG9tKHNlbGYpOgotICAgICAgICAiIiJHZXQgdGhlIG5leHQgcmFuZG9tIG51bWJlciBpbiB0aGUgcmFuZ2UgWzAuMCwgMS4wKS4iIiIKLSAgICAgICAgIyBUaGlzIHBhcnQgaXMgdGhyZWFkLXVuc2FmZToKLSAgICAgICAgIyBCRUdJTiBDUklUSUNBTCBTRUNUSU9OCi0gICAgICAgIHgsIHksIHogPSBzZWxmLl9zZWVkCi0gICAgICAgICMKLSAgICAgICAgeCA9ICgxNzEgKiB4KSAlIDMwMjY5Ci0gICAgICAgIHkgPSAoMTcyICogeSkgJSAzMDMwNwotICAgICAgICB6ID0gKDE3MCAqIHopICUgMzAzMjMKLSAgICAgICAgIwotICAgICAgICBzZWxmLl9zZWVkID0geCwgeSwgegotICAgICAgICAjIEVORCBDUklUSUNBTCBTRUNUSU9OCi0gICAgICAgICMKLSAgICAgICAgcmV0dXJuICh4LzMwMjY5LjAgKyB5LzMwMzA3LjAgKyB6LzMwMzIzLjApICUgMS4wCi0KLSAgICBkZWYgdW5pZm9ybShzZWxmLCBhLCBiKToKLSAgICAgICAgIiIiR2V0IGEgcmFuZG9tIG51bWJlciBpbiB0aGUgcmFuZ2UgW2EsIGIpLiIiIgotICAgICAgICByZXR1cm4gYSArIChiLWEpICogc2VsZi5yYW5kb20oKQotCi0gICAgZGVmIHJhbmRpbnQoc2VsZiwgYSwgYik6Ci0gICAgICAgICIiIkdldCBhIHJhbmRvbSBpbnRlZ2VyIGluIHRoZSByYW5nZSBbYSwgYl0gaW5jbHVkaW5nCi0gICAgICAgIGJvdGggZW5kIHBvaW50cy4KLQotICAgICAgICAoRGVwcmVjYXRlZDsgdXNlIHJhbmRyYW5nZSBiZWxvdy4pIiIiCi0gICAgICAgIHJldHVybiBzZWxmLnJhbmRyYW5nZShhLCBiKzEpCi0KLSAgICBkZWYgY2hvaWNlKHNlbGYsIHNlcSk6Ci0gICAgICAgICIiIkNob29zZSBhIHJhbmRvbSBlbGVtZW50IGZyb20gYSBub24tZW1wdHkgc2VxdWVuY2UuIiIiCi0gICAgICAgIHJldHVybiBzZXFbaW50KHNlbGYucmFuZG9tKCkgKiBsZW4oc2VxKSldCi0KLSAgICBkZWYgcmFuZHJhbmdlKHNlbGYsIHN0YXJ0LCBzdG9wPU5vbmUsIHN0ZXA9MSwgaW50PWludCwgZGVmYXVsdD1Ob25lKToKLSAgICAgICAgIiIiQ2hvb3NlIGEgcmFuZG9tIGl0ZW0gZnJvbSByYW5nZShzdGFydCwgc3RvcFssIHN0ZXBdKS4KLQotICAgICAgICBUaGlzIGZpeGVzIHRoZSBwcm9ibGVtIHdpdGggcmFuZGludCgpIHdoaWNoIGluY2x1ZGVzIHRoZQotICAgICAgICBlbmRwb2ludDsgaW4gUHl0aG9uIHRoaXMgaXMgdXN1YWxseSBub3Qgd2hhdCB5b3Ugd2FudC4KLSAgICAgICAgRG8gbm90IHN1cHBseSB0aGUgJ2ludCcgYW5kICdkZWZhdWx0JyBhcmd1bWVudHMuIiIiCi0gICAgICAgICMgVGhpcyBjb2RlIGlzIGEgYml0IG1lc3N5IHRvIG1ha2UgaXQgZmFzdCBmb3IgdGhlCi0gICAgICAgICMgY29tbW9uIGNhc2Ugd2hpbGUgc3RpbGwgZG9pbmcgYWRlcXVhdGUgZXJyb3IgY2hlY2tpbmcKLSAgICAgICAgaXN0YXJ0ID0gaW50KHN0YXJ0KQotICAgICAgICBpZiBpc3RhcnQgIT0gc3RhcnQ6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibm9uLWludGVnZXIgYXJnIDEgZm9yIHJhbmRyYW5nZSgpIgotICAgICAgICBpZiBzdG9wIGlzIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiBpc3RhcnQgPiAwOgotICAgICAgICAgICAgICAgIHJldHVybiBpbnQoc2VsZi5yYW5kb20oKSAqIGlzdGFydCkKLSAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJlbXB0eSByYW5nZSBmb3IgcmFuZHJhbmdlKCkiCi0gICAgICAgIGlzdG9wID0gaW50KHN0b3ApCi0gICAgICAgIGlmIGlzdG9wICE9IHN0b3A6Ci0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibm9uLWludGVnZXIgc3RvcCBmb3IgcmFuZHJhbmdlKCkiCi0gICAgICAgIGlmIHN0ZXAgPT0gMToKLSAgICAgICAgICAgIGlmIGlzdGFydCA8IGlzdG9wOgotICAgICAgICAgICAgICAgIHJldHVybiBpc3RhcnQgKyBpbnQoc2VsZi5yYW5kb20oKSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpc3RvcCAtIGlzdGFydCkpCi0gICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiZW1wdHkgcmFuZ2UgZm9yIHJhbmRyYW5nZSgpIgotICAgICAgICBpc3RlcCA9IGludChzdGVwKQotICAgICAgICBpZiBpc3RlcCAhPSBzdGVwOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm5vbi1pbnRlZ2VyIHN0ZXAgZm9yIHJhbmRyYW5nZSgpIgotICAgICAgICBpZiBpc3RlcCA+IDA6Ci0gICAgICAgICAgICBuID0gKGlzdG9wIC0gaXN0YXJ0ICsgaXN0ZXAgLSAxKSAvIGlzdGVwCi0gICAgICAgIGVsaWYgaXN0ZXAgPCAwOgotICAgICAgICAgICAgbiA9IChpc3RvcCAtIGlzdGFydCArIGlzdGVwICsgMSkgLyBpc3RlcAotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInplcm8gc3RlcCBmb3IgcmFuZHJhbmdlKCkiCi0KLSAgICAgICAgaWYgbiA8PSAwOgotICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgImVtcHR5IHJhbmdlIGZvciByYW5kcmFuZ2UoKSIKLSAgICAgICAgcmV0dXJuIGlzdGFydCArIGlzdGVwKmludChzZWxmLnJhbmRvbSgpICogbikKLQotCi0jIEluaXRpYWxpemUgZnJvbSB0aGUgY3VycmVudCB0aW1lCi1faW5zdCA9IHdocmFuZG9tKCkKLXNlZWQgPSBfaW5zdC5zZWVkCi1yYW5kb20gPSBfaW5zdC5yYW5kb20KLXVuaWZvcm0gPSBfaW5zdC51bmlmb3JtCi1yYW5kaW50ID0gX2luc3QucmFuZGludAotY2hvaWNlID0gX2luc3QuY2hvaWNlCi1yYW5kcmFuZ2UgPSBfaW5zdC5yYW5kcmFuZ2UKZGlmZiAtLWdpdCBhL0xpYi9saWItb2xkL3ptb2QucHkgYi9MaWIvbGliLW9sZC96bW9kLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWY0OWRmLi4wMDAwMDAwCi0tLSBhL0xpYi9saWItb2xkL3ptb2QucHkKKysrIC9kZXYvbnVsbApAQCAtMSw5NCArMCwwIEBACi0jIG1vZHVsZSAnem1vZCcKLQotIyBDb21wdXRlIHByb3BlcnRpZXMgb2YgbWF0aGVtYXRpY2FsICJmaWVsZHMiIGZvcm1lZCBieSB0YWtpbmcKLSMgWi9uICh0aGUgd2hvbGUgbnVtYmVycyBtb2R1bG8gc29tZSB3aG9sZSBudW1iZXIgbikgYW5kIGFuCi0jIGlycmVkdWNpYmxlIHBvbHlub21pYWwgKGkuZS4sIGEgcG9seW5vbWlhbCB3aXRoIG9ubHkgY29tcGxleCB6ZXJvcyksCi0jIGUuZy4sIFovNSBhbmQgWCoqMiArIDIuCi0jCi0jIFRoZSBmaWVsZCBpcyBmb3JtZWQgYnkgdGFraW5nIGFsbCBwb3NzaWJsZSBsaW5lYXIgY29tYmluYXRpb25zIG9mCi0jIGEgc2V0IG9mIGQgYmFzZSB2ZWN0b3JzICh3aGVyZSBkIGlzIHRoZSBkZWdyZWUgb2YgdGhlIHBvbHlub21pYWwpLgotIwotIyBOb3RlIHRoYXQgdGhpcyBwcm9jZWR1cmUgZG9lc24ndCB5aWVsZCBhIGZpZWxkIGZvciBhbGwgY29tYmluYXRpb25zCi0jIG9mIG4gYW5kIHA6IGl0IG1heSB3ZWxsIGJlIHRoYXQgc29tZSBudW1iZXJzIGhhdmUgbW9yZSB0aGFuIG9uZQotIyBpbnZlcnNlIGFuZCBvdGhlcnMgaGF2ZSBub25lLiAgVGhpcyBpcyB3aGF0IHdlIGNoZWNrLgotIwotIyBSZW1lbWJlciB0aGF0IGEgZmllbGQgaXMgYSByaW5nIHdoZXJlIGVhY2ggZWxlbWVudCBoYXMgYW4gaW52ZXJzZS4KLSMgQSByaW5nIGhhcyBjb21tdXRhdGl2ZSBhZGRpdGlvbiBhbmQgbXVsdGlwbGljYXRpb24sIGEgemVybyBhbmQgYSBvbmU6Ci0jIDAqeCA9IHgqMCA9IDAsIDAreCA9IHgrMCA9IHgsIDEqeCA9IHgqMSA9IHguICBBbHNvLCB0aGUgZGlzdHJpYnV0aXZlCi0jIHByb3BlcnR5IGhvbGRzOiBhKihiK2MpID0gYSpiICsgYipjLgotIyAoWFhYIEkgZm9yZ2V0IGlmIHRoaXMgaXMgYW4gYXhpb20gb3IgZm9sbG93cyBmcm9tIHRoZSBydWxlcy4pCi0KLWltcG9ydCBwb2x5Ci0KLQotIyBFeGFtcGxlIE4gYW5kIHBvbHlub21pYWwKLQotTiA9IDUKLVAgPSBwb2x5LnBsdXMocG9seS5vbmUoMCwgMiksIHBvbHkub25lKDIsIDEpKSAjIDIgKyB4KioyCi0KLQotIyBSZXR1cm4geCBtb2R1bG8geS4gIFJldHVybnMgPj0gMCBldmVuIGlmIHggPCAwLgotCi1kZWYgbW9kKHgsIHkpOgotICAgIHJldHVybiBkaXZtb2QoeCwgeSlbMV0KLQotCi0jIE5vcm1hbGl6ZSBhIHBvbHlub21pYWwgbW9kdWxvIG4gYW5kIG1vZHVsbyBwLgotCi1kZWYgbm9ybShhLCBuLCBwKToKLSAgICBhID0gcG9seS5tb2R1bG8oYSwgcCkKLSAgICBhID0gYVs6XQotICAgIGZvciBpIGluIHJhbmdlKGxlbihhKSk6IGFbaV0gPSBtb2QoYVtpXSwgbikKLSAgICBhID0gcG9seS5ub3JtYWxpemUoYSkKLSAgICByZXR1cm4gYQotCi0KLSMgTWFrZSBhIGxpc3Qgb2YgYWxsIG5eZCBlbGVtZW50cyBvZiB0aGUgcHJvcG9zZWQgZmllbGQuCi0KLWRlZiBtYWtlX2FsbChtYXQpOgotICAgIGFsbCA9IFtdCi0gICAgZm9yIHJvdyBpbiBtYXQ6Ci0gICAgICAgIGZvciBhIGluIHJvdzoKLSAgICAgICAgICAgIGFsbC5hcHBlbmQoYSkKLSAgICByZXR1cm4gYWxsCi0KLWRlZiBtYWtlX2VsZW1lbnRzKG4sIGQpOgotICAgIGlmIGQgPT0gMDogcmV0dXJuIFtwb2x5Lm9uZSgwLCAwKV0KLSAgICBzdWIgPSBtYWtlX2VsZW1lbnRzKG4sIGQtMSkKLSAgICBhbGwgPSBbXQotICAgIGZvciBhIGluIHN1YjoKLSAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobik6Ci0gICAgICAgICAgICBhbGwuYXBwZW5kKHBvbHkucGx1cyhhLCBwb2x5Lm9uZShkLTEsIGkpKSkKLSAgICByZXR1cm4gYWxsCi0KLWRlZiBtYWtlX2ludihhbGwsIG4sIHApOgotICAgIHggPSBwb2x5Lm9uZSgxLCAxKQotICAgIGludiA9IFtdCi0gICAgZm9yIGEgaW4gYWxsOgotICAgICAgICBpbnYuYXBwZW5kKG5vcm0ocG9seS50aW1lcyhhLCB4KSwgbiwgcCkpCi0gICAgcmV0dXJuIGludgotCi1kZWYgY2hlY2tmaWVsZChuLCBwKToKLSAgICBhbGwgPSBtYWtlX2VsZW1lbnRzKG4sIGxlbihwKS0xKQotICAgIGludiA9IG1ha2VfaW52KGFsbCwgbiwgcCkKLSAgICBhbGwxID0gYWxsWzpdCi0gICAgaW52MSA9IGludls6XQotICAgIGFsbDEuc29ydCgpCi0gICAgaW52MS5zb3J0KCkKLSAgICBpZiBhbGwxID09IGludjE6IHByaW50ICdCSU5HTyEnCi0gICAgZWxzZToKLSAgICAgICAgcHJpbnQgJ1NvcnJ5OicsIG4sIHAKLSAgICAgICAgcHJpbnQgYWxsCi0gICAgICAgIHByaW50IGludgotCi1kZWYgcmoocywgd2lkdGgpOgotICAgIGlmIHR5cGUocykgaXMgbm90IHR5cGUoJycpOiBzID0gYHNgCi0gICAgbiA9IGxlbihzKQotICAgIGlmIG4gPj0gd2lkdGg6IHJldHVybiBzCi0gICAgcmV0dXJuICcgJyood2lkdGggLSBuKSArIHMKLQotZGVmIGxqKHMsIHdpZHRoKToKLSAgICBpZiB0eXBlKHMpIGlzIG5vdCB0eXBlKCcnKTogcyA9IGBzYAotICAgIG4gPSBsZW4ocykKLSAgICBpZiBuID49IHdpZHRoOiByZXR1cm4gcwotICAgIHJldHVybiBzICsgJyAnKih3aWR0aCAtIG4pCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL1RpeC5weSBiL0xpYi9saWItdGsvVGl4LnB5CmluZGV4IDJmYjEzMDcuLjE0YzNjMjQgMTAwNzU1Ci0tLSBhL0xpYi9saWItdGsvVGl4LnB5CisrKyBiL0xpYi9saWItdGsvVGl4LnB5CkBAIC0xNTQxLDggKzE1NDEsOCBAQAogICAgICAgICAnJydUaGlzIGNvbW1hbmQgaXMgdXNlZCB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZSBlbnRyeSBnaXZlbiBieQogICAgICBlbnRyeVBhdGggaGFzIGNoaWxkcmVuIGVudHJpZXMgYW5kIHdoZXRoZXIgdGhlIGNoaWxkcmVuIGFyZSB2aXNpYmxlLiBtb2RlCiAgICAgIG11c3QgYmUgb25lIG9mIG9wZW4sIGNsb3NlIG9yIG5vbmUuIElmIG1vZGUgaXMgc2V0IHRvIG9wZW4sIGEgKCspCi0gICAgIGluZGljYXRvciBpcyBkcmF3biBuZXh0IHRvIHRoZSBlbnRyeS4gSWYgbW9kZSBpcyBzZXQgdG8gY2xvc2UsIGEgKC0pCi0gICAgIGluZGljYXRvciBpcyBkcmF3biBuZXh0IHRvIHRoZSBlbnRyeS4gSWYgbW9kZSBpcyBzZXQgdG8gbm9uZSwgbm8KKyAgICAgaW5kaWNhdG9yIGlzIGRyYXduIG5leHQgdGhlIHRoZSBlbnRyeS4gSWYgbW9kZSBpcyBzZXQgdG8gY2xvc2UsIGEgKC0pCisgICAgIGluZGljYXRvciBpcyBkcmF3biBuZXh0IHRoZSB0aGUgZW50cnkuIElmIG1vZGUgaXMgc2V0IHRvIG5vbmUsIG5vCiAgICAgIGluZGljYXRvcnMgd2lsbCBiZSBkcmF3biBmb3IgdGhpcyBlbnRyeS4gVGhlIGRlZmF1bHQgbW9kZSBpcyBub25lLiBUaGUKICAgICAgb3BlbiBtb2RlIGluZGljYXRlcyB0aGUgZW50cnkgaGFzIGhpZGRlbiBjaGlsZHJlbiBhbmQgdGhpcyBlbnRyeSBjYW4gYmUKICAgICAgb3BlbmVkIGJ5IHRoZSB1c2VyLiBUaGUgY2xvc2UgbW9kZSBpbmRpY2F0ZXMgdGhhdCBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZQpAQCAtMTc3Myw2ICsxNzczLDcgQEAKICAgICAjIEZJWE1FOiBJdCBzaG91bGQgaW5oZXJpdCAtc3VwZXJjbGFzcyB0aXhTY3JvbGxlZFdpZGdldAogICAgIHBhc3MKIAorCiBjbGFzcyBHcmlkKFRpeFdpZGdldCk6CiAgICAgJycnVGhlIFRpeCBHcmlkIGNvbW1hbmQgY3JlYXRlcyBhIG5ldyB3aW5kb3cgIGFuZCBtYWtlcyBpdCBpbnRvIGEKICAgICB0aXhHcmlkIHdpZGdldC4gQWRkaXRpb25hbCBvcHRpb25zLCBtYXkgYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kCkBAIC0xNzg3LDI2ICsxNzg4LDEwMSBAQAogICAgIGJvcmRlci4KIAogICAgIFN1YndpZGdldHMgLSBOb25lJycnCi0gICAgcGFzcworICAgICMgdmFsaWQgc3BlY2lmaWMgcmVzb3VyY2VzIGFzIG9mIFRrIDguNAorICAgICMgZWRpdGRvbmVjbWQsIGVkaXRub3RpZnljbWQsIGZsb2F0aW5nY29scywgZmxvYXRpbmdyb3dzLCBmb3JtYXRjbWQsCisgICAgIyBoaWdobGlnaHRiYWNrZ3JvdW5kLCBoaWdobGlnaHRjb2xvciwgbGVmdG1hcmdpbiwgaXRlbXR5cGUsIHNlbGVjdG1vZGUsCisgICAgIyBzZWxlY3R1bml0LCB0b3BtYXJnaW4sCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcj1Ob25lLCBjbmY9e30sICoqa3cpOgorICAgICAgICBzdGF0aWM9IFtdCisgICAgICAgIHNlbGYuY25mPSBjbmYKKyAgICAgICAgVGl4V2lkZ2V0Ll9faW5pdF9fKHNlbGYsIG1hc3RlciwgJ3RpeEdyaWQnLCBzdGF0aWMsIGNuZiwga3cpCiAKKyAgICAjIHZhbGlkIG9wdGlvbnMgYXMgb2YgVGsgOC40CisgICAgIyBhbmNob3IsIGJkdHlwZSwgY2dldCwgY29uZmlndXJlLCBkZWxldGUsIGRyYWdzaXRlLCBkcm9wc2l0ZSwgZW50cnljZ2V0LCBlZGl0CisgICAgIyBlbnRyeWNvbmZpZ3VyZSwgZm9ybWF0LCBnZW9tZXRyeWluZm8sIGluZm8sIGluZGV4LCBtb3ZlLCBuZWFyZXN0LCBzZWxlY3Rpb24KKyAgICAjIHNldCwgc2l6ZSwgdW5zZXQsIHh2aWV3LCB5dmlldwogICAgICMgZGVmIGFuY2hvciBvcHRpb24gP2FyZ3MgLi4uPworICAgIGRlZiBhbmNob3JfZ2V0KHNlbGYpOgorICAgICAgICAiR2V0IHRoZSAoeCx5KSBjb29yZGluYXRlIG9mIHRoZSBjdXJyZW50IGFuY2hvciBjZWxsIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cyhzZWxmLnRrLmNhbGwoc2VsZiwgJ2FuY2hvcicsICdnZXQnKSkKKwogICAgICMgZGVmIGJkdHlwZQogICAgICMgZGVmIGRlbGV0ZSBkaW0gZnJvbSA/dG8/CisgICAgZGVmIGRlbGV0ZV9yb3coc2VsZiwgZnJvbV8sIHRvPU5vbmUpOgorICAgICAgICAiIiJEZWxldGUgcm93cyBiZXR3ZWVuIGZyb21fIGFuZCB0byBpbmNsdXNpdmUuCisgICAgICAgIElmIHRvIGlzIG5vdCBwcm92aWRlZCwgIGRlbGV0ZSBvbmx5IHJvdyBhdCBmcm9tXyIiIgorICAgICAgICBpZiB0byBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsICdkZWxldGUnLCAncm93JywgZnJvbV8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ2RlbGV0ZScsICdyb3cnLCBmcm9tXywgdG8pCisgICAgZGVmIGRlbGV0ZV9jb2x1bW4oc2VsZiwgZnJvbV8sIHRvPU5vbmUpOgorICAgICAgICAiIiJEZWxldGUgY29sdW1ucyBiZXR3ZWVuIGZyb21fIGFuZCB0byBpbmNsdXNpdmUuCisgICAgICAgIElmIHRvIGlzIG5vdCBwcm92aWRlZCwgIGRlbGV0ZSBvbmx5IGNvbHVtbiBhdCBmcm9tXyIiIgorICAgICAgICBpZiB0byBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsICdkZWxldGUnLCAnY29sdW1uJywgZnJvbV8pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRrLmNhbGwoc2VsZiwgJ2RlbGV0ZScsICdjb2x1bW4nLCBmcm9tXywgdG8pCiAgICAgIyBkZWYgZWRpdCBhcHBseQogICAgICMgZGVmIGVkaXQgc2V0IHggeQotICAgICMgZGVmIGVudHJ5Y2dldCB4IHkgb3B0aW9uCi0gICAgIyBkZWYgZW50cnljb25maWd1cmUgeCB5ID9vcHRpb24/ID92YWx1ZSBvcHRpb24gdmFsdWUgLi4uPworCisgICAgZGVmIGVudHJ5Y2dldChzZWxmLCB4LCB5LCBvcHRpb24pOgorICAgICAgICAiR2V0IHRoZSBvcHRpb24gdmFsdWUgZm9yIGNlbGwgYXQgKHgseSkiCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZiwgJ2VudHJ5Y2dldCcsIHgsIHksIG9wdGlvbikKKworICAgIGRlZiBlbnRyeWNvbmZpZ3VyZShzZWxmLCB4LCB5LCAqKmt3KToKKyAgICAgICAgcmV0dXJuIHNlbGYudGsuY2FsbChzZWxmLCAnZW50cnljb25maWd1cmUnLCB4LCB5LCAqc2VsZi5fb3B0aW9ucyhOb25lLCBrdykpCiAgICAgIyBkZWYgZm9ybWF0CiAgICAgIyBkZWYgaW5kZXgKKworICAgIGRlZiBpbmZvX2V4aXN0cyhzZWxmLCB4LCB5KToKKyAgICAgICAgIlJldHVybiBUcnVlIGlmIGRpc3BsYXkgaXRlbSBleGlzdHMgYXQgKHgseSkiCisgICAgICAgIHJldHVybiBib29sKGludChzZWxmLnRrLmNhbGwoc2VsZiwgJ2luZm8nLCAnZXhpc3RzJywgeCwgeSkpKQorCisgICAgZGVmIGluZm9fYmJveChzZWxmLCB4LCB5KToKKyAgICAgICAgIyBUaGlzIHNlZW1zIHRvIGFsd2F5cyByZXR1cm4gJycsIGF0IGxlYXN0IGZvciAndGV4dCcgZGlzcGxheWl0ZW1zCisgICAgICAgIHJldHVybiBzZWxmLnRrLmNhbGwoc2VsZiwgJ2luZm8nLCAnYmJveCcsIHgsIHkpCisKKyAgICBkZWYgbmVhcmVzdChzZWxmLCB4LCB5KToKKyAgICAgICAgIlJldHVybiBjb29yZGluYXRlIG9mIGNlbGwgbmVhcmVzdCBwaXhlbCBjb29yZGluYXRlICh4LHkpIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0aW50cyhzZWxmLnRrLmNhbGwoc2VsZiwgJ25lYXJlc3QnLCB4LCB5KSkKKworICAgICMgZGVmIHNlbGVjdGlvbiBhZGp1c3QKKyAgICAjIGRlZiBzZWxlY3Rpb24gY2xlYXIKKyAgICAjIGRlZiBzZWxlY3Rpb24gaW5jbHVkZXMKKyAgICAjIGRlZiBzZWxlY3Rpb24gc2V0CisgICAgIyBkZWYgc2VsZWN0aW9uIHRvZ2dsZQogICAgICMgZGVmIG1vdmUgZGltIGZyb20gdG8gb2Zmc2V0Ci0gICAgIyBkZWYgc2V0IHggeSA/LWl0ZW10eXBlIHR5cGU/ID9vcHRpb24gdmFsdWUuLi4/CisKKyAgICBkZWYgc2V0KHNlbGYsIHgsIHksIGl0ZW10eXBlPU5vbmUsICoqa3cpOgorICAgICAgICBhcmdzPSBzZWxmLl9vcHRpb25zKHNlbGYuY25mLCBrdykKKyAgICAgICAgaWYgaXRlbXR5cGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBhcmdzPSAoJy1pdGVtdHlwZScsIGl0ZW10eXBlKSArIGFyZ3MKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsICdzZXQnLCB4LCB5LCAqYXJncykKKwogICAgICMgZGVmIHNpemUgZGltIGluZGV4ID9vcHRpb24gdmFsdWUgLi4uPwogICAgICMgZGVmIHVuc2V0IHggeQotICAgICMgZGVmIHh2aWV3Ci0gICAgIyBkZWYgeXZpZXcKIAotY2xhc3MgU2Nyb2xsZWRHcmlkKFRpeFdpZGdldCk6CisgICAgZGVmIHh2aWV3KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0ZG91YmxlcyhzZWxmLnRrLmNhbGwoc2VsZiwgJ3h2aWV3JykpCisgICAgZGVmIHh2aWV3X21vdmV0byhzZWxmLCBmcmFjdGlvbik6CisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCd4dmlldycsICdtb3ZldG8nLCBmcmFjdGlvbikKKyAgICBkZWYgeHZpZXdfc2Nyb2xsKHNlbGYsIGNvdW50LCB3aGF0PSJ1bml0cyIpOgorICAgICAgICAiU2Nyb2xsIHJpZ2h0IChjb3VudD4wKSBvciBsZWZ0IDxjb3VudD4gb2YgdW5pdHN8cGFnZXMiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCAneHZpZXcnLCAnc2Nyb2xsJywgY291bnQsIHdoYXQpCisKKyAgICBkZWYgeXZpZXcoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9nZXRkb3VibGVzKHNlbGYudGsuY2FsbChzZWxmLCAneXZpZXcnKSkKKyAgICBkZWYgeXZpZXdfbW92ZXRvKHNlbGYsIGZyYWN0aW9uKToKKyAgICAgICAgc2VsZi50ay5jYWxsKHNlbGYsJ3lzdmlldycsICdtb3ZldG8nLCBmcmFjdGlvbikKKyAgICBkZWYgeXZpZXdfc2Nyb2xsKHNlbGYsIGNvdW50LCB3aGF0PSJ1bml0cyIpOgorICAgICAgICAiU2Nyb2xsIGRvd24gKGNvdW50PjApIG9yIHVwIDxjb3VudD4gb2YgdW5pdHN8cGFnZXMiCisgICAgICAgIHNlbGYudGsuY2FsbChzZWxmLCAneXZpZXcnLCAnc2Nyb2xsJywgY291bnQsIHdoYXQpCisKK2NsYXNzIFNjcm9sbGVkR3JpZChHcmlkKToKICAgICAnJydTY3JvbGxlZCBHcmlkIHdpZGdldHMnJycKIAogICAgICMgRklYTUU6IEl0IHNob3VsZCBpbmhlcml0IC1zdXBlcmNsYXNzIHRpeFNjcm9sbGVkV2lkZ2V0Ci0gICAgcGFzcworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtYXN0ZXI9Tm9uZSwgY25mPXt9LCAqKmt3KToKKyAgICAgICAgc3RhdGljPSBbXQorICAgICAgICBzZWxmLmNuZj0gY25mCisgICAgICAgIFRpeFdpZGdldC5fX2luaXRfXyhzZWxmLCBtYXN0ZXIsICd0aXhTY3JvbGxlZEdyaWQnLCBzdGF0aWMsIGNuZiwga3cpCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL1RraW50ZXIucHkgYi9MaWIvbGliLXRrL1RraW50ZXIucHkKaW5kZXggZDYwMGNkNy4uMGJhOTU0ZSAxMDA2NDQKLS0tIGEvTGliL2xpYi10ay9Ua2ludGVyLnB5CisrKyBiL0xpYi9saWItdGsvVGtpbnRlci5weQpAQCAtNDQ5LDE4ICs0NDksMTUgQEAKICAgICAgICAgICAgICMgSSdkIHJhdGhlciB1c2UgdGltZS5zbGVlcChtcyowLjAwMSkKICAgICAgICAgICAgIHNlbGYudGsuY2FsbCgnYWZ0ZXInLCBtcykKICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgWFhYIERpc2d1c3RpbmcgaGFjayB0byBjbGVhbiB1cCBhZnRlciBjYWxsaW5nIGZ1bmMKLSAgICAgICAgICAgIHRtcCA9IFtdCi0gICAgICAgICAgICBkZWYgY2FsbGl0KGZ1bmM9ZnVuYywgYXJncz1hcmdzLCBzZWxmPXNlbGYsIHRtcD10bXApOgorICAgICAgICAgICAgZGVmIGNhbGxpdCgpOgogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgZnVuYygqYXJncykKICAgICAgICAgICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRlbGV0ZWNvbW1hbmQodG1wWzBdKQorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kZWxldGVjb21tYW5kKG5hbWUpCiAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBUY2xFcnJvcjoKICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgIG5hbWUgPSBzZWxmLl9yZWdpc3RlcihjYWxsaXQpCi0gICAgICAgICAgICB0bXAuYXBwZW5kKG5hbWUpCiAgICAgICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCdhZnRlcicsIG1zLCBuYW1lKQogICAgIGRlZiBhZnRlcl9pZGxlKHNlbGYsIGZ1bmMsICphcmdzKToKICAgICAgICAgIiIiQ2FsbCBGVU5DIG9uY2UgaWYgdGhlIFRjbCBtYWluIGxvb3AgaGFzIG5vIGV2ZW50IHRvCkBAIC00ODYsNyArNDgzLDI0IEBACiAgICAgZGVmIGJlbGwoc2VsZiwgZGlzcGxheW9mPTApOgogICAgICAgICAiIiJSaW5nIGEgZGlzcGxheSdzIGJlbGwuIiIiCiAgICAgICAgIHNlbGYudGsuY2FsbCgoJ2JlbGwnLCkgKyBzZWxmLl9kaXNwbGF5b2YoZGlzcGxheW9mKSkKKwogICAgICMgQ2xpcGJvYXJkIGhhbmRsaW5nOgorICAgIGRlZiBjbGlwYm9hcmRfZ2V0KHNlbGYsICoqa3cpOgorICAgICAgICAiIiJSZXRyaWV2ZSBkYXRhIGZyb20gdGhlIGNsaXBib2FyZCBvbiB3aW5kb3cncyBkaXNwbGF5LgorCisgICAgICAgIFRoZSB3aW5kb3cga2V5d29yZCBkZWZhdWx0cyB0byB0aGUgcm9vdCB3aW5kb3cgb2YgdGhlIFRraW50ZXIKKyAgICAgICAgYXBwbGljYXRpb24uCisKKyAgICAgICAgVGhlIHR5cGUga2V5d29yZCBzcGVjaWZpZXMgdGhlIGZvcm0gaW4gd2hpY2ggdGhlIGRhdGEgaXMKKyAgICAgICAgdG8gYmUgcmV0dXJuZWQgYW5kIHNob3VsZCBiZSBhbiBhdG9tIG5hbWUgc3VjaCBhcyBTVFJJTkcKKyAgICAgICAgb3IgRklMRV9OQU1FLiAgVHlwZSBkZWZhdWx0cyB0byBTVFJJTkcuCisKKyAgICAgICAgVGhpcyBjb21tYW5kIGlzIGVxdWl2YWxlbnQgdG86CisKKyAgICAgICAgc2VsZWN0aW9uX2dldChDTElQQk9BUkQpCisgICAgICAgICIiIgorICAgICAgICByZXR1cm4gc2VsZi50ay5jYWxsKCgnY2xpcGJvYXJkJywgJ2dldCcpICsgc2VsZi5fb3B0aW9ucyhrdykpCisKICAgICBkZWYgY2xpcGJvYXJkX2NsZWFyKHNlbGYsICoqa3cpOgogICAgICAgICAiIiJDbGVhciB0aGUgZGF0YSBpbiB0aGUgVGsgY2xpcGJvYXJkLgogCmRpZmYgLS1naXQgYS9MaWIvbGliLXRrL3RrRm9udC5weSBiL0xpYi9saWItdGsvdGtGb250LnB5CmluZGV4IDViNWE2YmEuLjE1ZGVhMmUgMTAwNjQ0Ci0tLSBhL0xpYi9saWItdGsvdGtGb250LnB5CisrKyBiL0xpYi9saWItdGsvdGtGb250LnB5CkBAIC0xMDgsNyArMTA4LDkgQEAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgaWYgc2VsZi5kZWxldGVfZm9udDoKICAgICAgICAgICAgICAgICBzZWxmLl9jYWxsKCJmb250IiwgImRlbGV0ZSIsIHNlbGYubmFtZSkKLSAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVGtpbnRlci5UY2xFcnJvcik6CisgICAgICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgIHBhc3MKIAogICAgIGRlZiBjb3B5KHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL2xpbmVjYWNoZS5weSBiL0xpYi9saW5lY2FjaGUucHkKaW5kZXggMmNjYzZjNi4uZjQ5Njk1YSAxMDA2NDQKLS0tIGEvTGliL2xpbmVjYWNoZS5weQorKysgYi9MaWIvbGluZWNhY2hlLnB5CkBAIC0xMCw4ICsxMCw4IEBACiAKIF9fYWxsX18gPSBbImdldGxpbmUiLCAiY2xlYXJjYWNoZSIsICJjaGVja2NhY2hlIl0KIAotZGVmIGdldGxpbmUoZmlsZW5hbWUsIGxpbmVubyk6Ci0gICAgbGluZXMgPSBnZXRsaW5lcyhmaWxlbmFtZSkKK2RlZiBnZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZV9nbG9iYWxzPU5vbmUpOgorICAgIGxpbmVzID0gZ2V0bGluZXMoZmlsZW5hbWUsIG1vZHVsZV9nbG9iYWxzKQogICAgIGlmIDEgPD0gbGluZW5vIDw9IGxlbihsaW5lcyk6CiAgICAgICAgIHJldHVybiBsaW5lc1tsaW5lbm8tMV0KICAgICBlbHNlOgpAQCAtMzAsMTQgKzMwLDE0IEBACiAgICAgY2FjaGUgPSB7fQogCiAKLWRlZiBnZXRsaW5lcyhmaWxlbmFtZSk6CitkZWYgZ2V0bGluZXMoZmlsZW5hbWUsIG1vZHVsZV9nbG9iYWxzPU5vbmUpOgogICAgICIiIkdldCB0aGUgbGluZXMgZm9yIGEgZmlsZSBmcm9tIHRoZSBjYWNoZS4KICAgICBVcGRhdGUgdGhlIGNhY2hlIGlmIGl0IGRvZXNuJ3QgY29udGFpbiBhbiBlbnRyeSBmb3IgdGhpcyBmaWxlIGFscmVhZHkuIiIiCiAKICAgICBpZiBmaWxlbmFtZSBpbiBjYWNoZToKICAgICAgICAgcmV0dXJuIGNhY2hlW2ZpbGVuYW1lXVsyXQogICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiB1cGRhdGVjYWNoZShmaWxlbmFtZSkKKyAgICAgICAgcmV0dXJuIHVwZGF0ZWNhY2hlKGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscykKIAogCiBkZWYgY2hlY2tjYWNoZShmaWxlbmFtZT1Ob25lKToKQEAgLTU0LDYgKzU0LDggQEAKIAogICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6CiAgICAgICAgIHNpemUsIG10aW1lLCBsaW5lcywgZnVsbG5hbWUgPSBjYWNoZVtmaWxlbmFtZV0KKyAgICAgICAgaWYgbXRpbWUgaXMgTm9uZToKKyAgICAgICAgICAgIGNvbnRpbnVlICAgIyBuby1vcCBmb3IgZmlsZXMgbG9hZGVkIHZpYSBhIF9fbG9hZGVyX18KICAgICAgICAgdHJ5OgogICAgICAgICAgICAgc3RhdCA9IG9zLnN0YXQoZnVsbG5hbWUpCiAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKQEAgLTYzLDcgKzY1LDcgQEAKICAgICAgICAgICAgIGRlbCBjYWNoZVtmaWxlbmFtZV0KIAogCi1kZWYgdXBkYXRlY2FjaGUoZmlsZW5hbWUpOgorZGVmIHVwZGF0ZWNhY2hlKGZpbGVuYW1lLCBtb2R1bGVfZ2xvYmFscz1Ob25lKToKICAgICAiIiJVcGRhdGUgYSBjYWNoZSBlbnRyeSBhbmQgcmV0dXJuIGl0cyBsaXN0IG9mIGxpbmVzLgogICAgIElmIHNvbWV0aGluZydzIHdyb25nLCBwcmludCBhIG1lc3NhZ2UsIGRpc2NhcmQgdGhlIGNhY2hlIGVudHJ5LAogICAgIGFuZCByZXR1cm4gYW4gZW1wdHkgbGlzdC4iIiIKQEAgLTcyLDEyICs3NCwzNCBAQAogICAgICAgICBkZWwgY2FjaGVbZmlsZW5hbWVdCiAgICAgaWYgbm90IGZpbGVuYW1lIG9yIGZpbGVuYW1lWzBdICsgZmlsZW5hbWVbLTFdID09ICc8Pic6CiAgICAgICAgIHJldHVybiBbXQorCiAgICAgZnVsbG5hbWUgPSBmaWxlbmFtZQogICAgIHRyeToKICAgICAgICAgc3RhdCA9IG9zLnN0YXQoZnVsbG5hbWUpCiAgICAgZXhjZXB0IG9zLmVycm9yLCBtc2c6Ci0gICAgICAgICMgVHJ5IGxvb2tpbmcgdGhyb3VnaCB0aGUgbW9kdWxlIHNlYXJjaCBwYXRoLgogICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpWzFdCisKKyAgICAgICAgIyBUcnkgZm9yIGEgX19sb2FkZXJfXywgaWYgYXZhaWxhYmxlCisgICAgICAgIGlmIG1vZHVsZV9nbG9iYWxzIGFuZCAnX19sb2FkZXJfXycgaW4gbW9kdWxlX2dsb2JhbHM6CisgICAgICAgICAgICBuYW1lID0gbW9kdWxlX2dsb2JhbHMuZ2V0KCdfX25hbWVfXycpCisgICAgICAgICAgICBsb2FkZXIgPSBtb2R1bGVfZ2xvYmFsc1snX19sb2FkZXJfXyddCisgICAgICAgICAgICBnZXRfc291cmNlID0gZ2V0YXR0cihsb2FkZXIsICdnZXRfc291cmNlJywgTm9uZSkKKworICAgICAgICAgICAgaWYgbmFtZSBhbmQgZ2V0X3NvdXJjZToKKyAgICAgICAgICAgICAgICBpZiBiYXNlbmFtZS5zdGFydHN3aXRoKG5hbWUuc3BsaXQoJy4nKVstMV0rJy4nKToKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGdldF9zb3VyY2UobmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgSU9FcnJvcik6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjYWNoZVtmaWxlbmFtZV0gPSAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuKGRhdGEpLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsaW5lKydcbicgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdGxpbmVzKCldLCBmdWxsbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlW2ZpbGVuYW1lXVsyXQorCisgICAgICAgICMgVHJ5IGxvb2tpbmcgdGhyb3VnaCB0aGUgbW9kdWxlIHNlYXJjaCBwYXRoLgorCiAgICAgICAgIGZvciBkaXJuYW1lIGluIHN5cy5wYXRoOgogICAgICAgICAgICAgIyBXaGVuIHVzaW5nIGltcHV0aWwsIHN5cy5wYXRoIG1heSBjb250YWluIHRoaW5ncyBvdGhlciB0aGFuCiAgICAgICAgICAgICAjIHN0cmluZ3M7IGlnbm9yZSB0aGVtIHdoZW4gaXQgaGFwcGVucy4KZGlmZiAtLWdpdCBhL0xpYi9sb2dnaW5nL19faW5pdF9fLnB5IGIvTGliL2xvZ2dpbmcvX19pbml0X18ucHkKaW5kZXggN2RiMGRhYi4uOTc5ODkzMSAxMDA2NDQKLS0tIGEvTGliL2xvZ2dpbmcvX19pbml0X18ucHkKKysrIGIvTGliL2xvZ2dpbmcvX19pbml0X18ucHkKQEAgLTcxOSw3ICs3MTksNyBAQAogICAgICAgICBJZiBzdHJtIGlzIG5vdCBzcGVjaWZpZWQsIHN5cy5zdGRlcnIgaXMgdXNlZC4KICAgICAgICAgIiIiCiAgICAgICAgIEhhbmRsZXIuX19pbml0X18oc2VsZikKLSAgICAgICAgaWYgbm90IHN0cm06CisgICAgICAgIGlmIHN0cm0gaXMgTm9uZToKICAgICAgICAgICAgIHN0cm0gPSBzeXMuc3RkZXJyCiAgICAgICAgIHNlbGYuc3RyZWFtID0gc3RybQogICAgICAgICBzZWxmLmZvcm1hdHRlciA9IE5vbmUKZGlmZiAtLWdpdCBhL0xpYi9taW1ldG9vbHMucHkgYi9MaWIvbWltZXRvb2xzLnB5CmluZGV4IDBiNjk4YWMuLjhjMWNjMTkgMTAwNjQ0Ci0tLSBhL0xpYi9taW1ldG9vbHMucHkKKysrIGIvTGliL21pbWV0b29scy5weQpAQCAtMTI3LDcgKzEyNywxMCBAQAogICAgIGltcG9ydCB0aW1lCiAgICAgaWYgX3ByZWZpeCBpcyBOb25lOgogICAgICAgICBpbXBvcnQgc29ja2V0Ci0gICAgICAgIGhvc3RpZCA9IHNvY2tldC5nZXRob3N0YnluYW1lKHNvY2tldC5nZXRob3N0bmFtZSgpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBob3N0aWQgPSBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSkKKyAgICAgICAgZXhjZXB0IHNvY2tldC5nYWllcnJvcjoKKyAgICAgICAgICAgIGhvc3RpZCA9ICcxMjcuMC4wLjEnCiAgICAgICAgIHRyeToKICAgICAgICAgICAgIHVpZCA9IHJlcHIob3MuZ2V0dWlkKCkpCiAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKZGlmZiAtLWdpdCBhL0xpYi9taW1ldHlwZXMucHkgYi9MaWIvbWltZXR5cGVzLnB5CmluZGV4IDdhOGI3NjUuLmJlZTJmZjcgMTAwNjQ0Ci0tLSBhL0xpYi9taW1ldHlwZXMucHkKKysrIGIvTGliL21pbWV0eXBlcy5weQpAQCAtMzE1LDE2MiArMzE1LDE3MSBAQAogICAgIHJldHVybiBkYi50eXBlc19tYXBbVHJ1ZV0KIAogCi1zdWZmaXhfbWFwID0gewotICAgICcudGd6JzogJy50YXIuZ3onLAotICAgICcudGF6JzogJy50YXIuZ3onLAotICAgICcudHonOiAnLnRhci5neicsCi0gICAgfQorZGVmIF9kZWZhdWx0X21pbWVfdHlwZXMoKToKKyAgICBnbG9iYWwgc3VmZml4X21hcAorICAgIGdsb2JhbCBlbmNvZGluZ3NfbWFwCisgICAgZ2xvYmFsIHR5cGVzX21hcAorICAgIGdsb2JhbCBjb21tb25fdHlwZXMKIAotZW5jb2RpbmdzX21hcCA9IHsKLSAgICAnLmd6JzogJ2d6aXAnLAotICAgICcuWic6ICdjb21wcmVzcycsCi0gICAgfQorICAgIHN1ZmZpeF9tYXAgPSB7CisgICAgICAgICcudGd6JzogJy50YXIuZ3onLAorICAgICAgICAnLnRheic6ICcudGFyLmd6JywKKyAgICAgICAgJy50eic6ICcudGFyLmd6JywKKyAgICAgICAgfQogCi0jIEJlZm9yZSBhZGRpbmcgbmV3IHR5cGVzLCBtYWtlIHN1cmUgdGhleSBhcmUgZWl0aGVyIHJlZ2lzdGVyZWQgd2l0aCBJQU5BLCBhdAotIyBodHRwOi8vd3d3LmlzaS5lZHUvaW4tbm90ZXMvaWFuYS9hc3NpZ25tZW50cy9tZWRpYS10eXBlcwotIyBvciBleHRlbnNpb25zLCBpLmUuIHVzaW5nIHRoZSB4LSBwcmVmaXgKKyAgICBlbmNvZGluZ3NfbWFwID0geworICAgICAgICAnLmd6JzogJ2d6aXAnLAorICAgICAgICAnLlonOiAnY29tcHJlc3MnLAorICAgICAgICB9CiAKLSMgSWYgeW91IGFkZCB0byB0aGVzZSwgcGxlYXNlIGtlZXAgdGhlbSBzb3J0ZWQhCi10eXBlc19tYXAgPSB7Ci0gICAgJy5hJyAgICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCi0gICAgJy5haScgICAgIDogJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLAotICAgICcuYWlmJyAgICA6ICdhdWRpby94LWFpZmYnLAotICAgICcuYWlmYycgICA6ICdhdWRpby94LWFpZmYnLAotICAgICcuYWlmZicgICA6ICdhdWRpby94LWFpZmYnLAotICAgICcuYXUnICAgICA6ICdhdWRpby9iYXNpYycsCi0gICAgJy5hdmknICAgIDogJ3ZpZGVvL3gtbXN2aWRlbycsCi0gICAgJy5iYXQnICAgIDogJ3RleHQvcGxhaW4nLAotICAgICcuYmNwaW8nICA6ICdhcHBsaWNhdGlvbi94LWJjcGlvJywKLSAgICAnLmJpbicgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKLSAgICAnLmJtcCcgICAgOiAnaW1hZ2UveC1tcy1ibXAnLAotICAgICcuYycgICAgICA6ICd0ZXh0L3BsYWluJywKLSAgICAjIER1cGxpY2F0ZXMgOigKLSAgICAnLmNkZicgICAgOiAnYXBwbGljYXRpb24veC1jZGYnLAotICAgICcuY2RmJyAgICA6ICdhcHBsaWNhdGlvbi94LW5ldGNkZicsCi0gICAgJy5jcGlvJyAgIDogJ2FwcGxpY2F0aW9uL3gtY3BpbycsCi0gICAgJy5jc2gnICAgIDogJ2FwcGxpY2F0aW9uL3gtY3NoJywKLSAgICAnLmNzcycgICAgOiAndGV4dC9jc3MnLAotICAgICcuZGxsJyAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAotICAgICcuZG9jJyAgICA6ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAotICAgICcuZG90JyAgICA6ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAotICAgICcuZHZpJyAgICA6ICdhcHBsaWNhdGlvbi94LWR2aScsCi0gICAgJy5lbWwnICAgIDogJ21lc3NhZ2UvcmZjODIyJywKLSAgICAnLmVwcycgICAgOiAnYXBwbGljYXRpb24vcG9zdHNjcmlwdCcsCi0gICAgJy5ldHgnICAgIDogJ3RleHQveC1zZXRleHQnLAotICAgICcuZXhlJyAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAotICAgICcuZ2lmJyAgICA6ICdpbWFnZS9naWYnLAotICAgICcuZ3RhcicgICA6ICdhcHBsaWNhdGlvbi94LWd0YXInLAotICAgICcuaCcgICAgICA6ICd0ZXh0L3BsYWluJywKLSAgICAnLmhkZicgICAgOiAnYXBwbGljYXRpb24veC1oZGYnLAotICAgICcuaHRtJyAgICA6ICd0ZXh0L2h0bWwnLAotICAgICcuaHRtbCcgICA6ICd0ZXh0L2h0bWwnLAotICAgICcuaWVmJyAgICA6ICdpbWFnZS9pZWYnLAotICAgICcuanBlJyAgICA6ICdpbWFnZS9qcGVnJywKLSAgICAnLmpwZWcnICAgOiAnaW1hZ2UvanBlZycsCi0gICAgJy5qcGcnICAgIDogJ2ltYWdlL2pwZWcnLAotICAgICcuanMnICAgICA6ICdhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQnLAotICAgICcua3NoJyAgICA6ICd0ZXh0L3BsYWluJywKLSAgICAnLmxhdGV4JyAgOiAnYXBwbGljYXRpb24veC1sYXRleCcsCi0gICAgJy5tMXYnICAgIDogJ3ZpZGVvL21wZWcnLAotICAgICcubWFuJyAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmLW1hbicsCi0gICAgJy5tZScgICAgIDogJ2FwcGxpY2F0aW9uL3gtdHJvZmYtbWUnLAotICAgICcubWh0JyAgICA6ICdtZXNzYWdlL3JmYzgyMicsCi0gICAgJy5taHRtbCcgIDogJ21lc3NhZ2UvcmZjODIyJywKLSAgICAnLm1pZicgICAgOiAnYXBwbGljYXRpb24veC1taWYnLAotICAgICcubW92JyAgICA6ICd2aWRlby9xdWlja3RpbWUnLAotICAgICcubW92aWUnICA6ICd2aWRlby94LXNnaS1tb3ZpZScsCi0gICAgJy5tcDInICAgIDogJ2F1ZGlvL21wZWcnLAotICAgICcubXAzJyAgICA6ICdhdWRpby9tcGVnJywKLSAgICAnLm1wYScgICAgOiAndmlkZW8vbXBlZycsCi0gICAgJy5tcGUnICAgIDogJ3ZpZGVvL21wZWcnLAotICAgICcubXBlZycgICA6ICd2aWRlby9tcGVnJywKLSAgICAnLm1wZycgICAgOiAndmlkZW8vbXBlZycsCi0gICAgJy5tcycgICAgIDogJ2FwcGxpY2F0aW9uL3gtdHJvZmYtbXMnLAotICAgICcubmMnICAgICA6ICdhcHBsaWNhdGlvbi94LW5ldGNkZicsCi0gICAgJy5ud3MnICAgIDogJ21lc3NhZ2UvcmZjODIyJywKLSAgICAnLm8nICAgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKLSAgICAnLm9iaicgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKLSAgICAnLm9kYScgICAgOiAnYXBwbGljYXRpb24vb2RhJywKLSAgICAnLnAxMicgICAgOiAnYXBwbGljYXRpb24veC1wa2NzMTInLAotICAgICcucDdjJyAgICA6ICdhcHBsaWNhdGlvbi9wa2NzNy1taW1lJywKLSAgICAnLnBibScgICAgOiAnaW1hZ2UveC1wb3J0YWJsZS1iaXRtYXAnLAotICAgICcucGRmJyAgICA6ICdhcHBsaWNhdGlvbi9wZGYnLAotICAgICcucGZ4JyAgICA6ICdhcHBsaWNhdGlvbi94LXBrY3MxMicsCi0gICAgJy5wZ20nICAgIDogJ2ltYWdlL3gtcG9ydGFibGUtZ3JheW1hcCcsCi0gICAgJy5wbCcgICAgIDogJ3RleHQvcGxhaW4nLAotICAgICcucG5nJyAgICA6ICdpbWFnZS9wbmcnLAotICAgICcucG5tJyAgICA6ICdpbWFnZS94LXBvcnRhYmxlLWFueW1hcCcsCi0gICAgJy5wb3QnICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JywKLSAgICAnLnBwYScgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAotICAgICcucHBtJyAgICA6ICdpbWFnZS94LXBvcnRhYmxlLXBpeG1hcCcsCi0gICAgJy5wcHMnICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JywKLSAgICAnLnBwdCcgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAotICAgICcucHMnICAgICA6ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKLSAgICAnLnB3eicgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLXBvd2VycG9pbnQnLAotICAgICcucHknICAgICA6ICd0ZXh0L3gtcHl0aG9uJywKLSAgICAnLnB5YycgICAgOiAnYXBwbGljYXRpb24veC1weXRob24tY29kZScsCi0gICAgJy5weW8nICAgIDogJ2FwcGxpY2F0aW9uL3gtcHl0aG9uLWNvZGUnLAotICAgICcucXQnICAgICA6ICd2aWRlby9xdWlja3RpbWUnLAotICAgICcucmEnICAgICA6ICdhdWRpby94LXBuLXJlYWxhdWRpbycsCi0gICAgJy5yYW0nICAgIDogJ2FwcGxpY2F0aW9uL3gtcG4tcmVhbGF1ZGlvJywKLSAgICAnLnJhcycgICAgOiAnaW1hZ2UveC1jbXUtcmFzdGVyJywKLSAgICAnLnJkZicgICAgOiAnYXBwbGljYXRpb24veG1sJywKLSAgICAnLnJnYicgICAgOiAnaW1hZ2UveC1yZ2InLAotICAgICcucm9mZicgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmJywKLSAgICAnLnJ0eCcgICAgOiAndGV4dC9yaWNodGV4dCcsCi0gICAgJy5zZ20nICAgIDogJ3RleHQveC1zZ21sJywKLSAgICAnLnNnbWwnICAgOiAndGV4dC94LXNnbWwnLAotICAgICcuc2gnICAgICA6ICdhcHBsaWNhdGlvbi94LXNoJywKLSAgICAnLnNoYXInICAgOiAnYXBwbGljYXRpb24veC1zaGFyJywKLSAgICAnLnNuZCcgICAgOiAnYXVkaW8vYmFzaWMnLAotICAgICcuc28nICAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAotICAgICcuc3JjJyAgICA6ICdhcHBsaWNhdGlvbi94LXdhaXMtc291cmNlJywKLSAgICAnLnN2NGNwaW8nOiAnYXBwbGljYXRpb24veC1zdjRjcGlvJywKLSAgICAnLnN2NGNyYycgOiAnYXBwbGljYXRpb24veC1zdjRjcmMnLAotICAgICcuc3dmJyAgICA6ICdhcHBsaWNhdGlvbi94LXNob2Nrd2F2ZS1mbGFzaCcsCi0gICAgJy50JyAgICAgIDogJ2FwcGxpY2F0aW9uL3gtdHJvZmYnLAotICAgICcudGFyJyAgICA6ICdhcHBsaWNhdGlvbi94LXRhcicsCi0gICAgJy50Y2wnICAgIDogJ2FwcGxpY2F0aW9uL3gtdGNsJywKLSAgICAnLnRleCcgICAgOiAnYXBwbGljYXRpb24veC10ZXgnLAotICAgICcudGV4aScgICA6ICdhcHBsaWNhdGlvbi94LXRleGluZm8nLAotICAgICcudGV4aW5mbyc6ICdhcHBsaWNhdGlvbi94LXRleGluZm8nLAotICAgICcudGlmJyAgICA6ICdpbWFnZS90aWZmJywKLSAgICAnLnRpZmYnICAgOiAnaW1hZ2UvdGlmZicsCi0gICAgJy50cicgICAgIDogJ2FwcGxpY2F0aW9uL3gtdHJvZmYnLAotICAgICcudHN2JyAgICA6ICd0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzJywKLSAgICAnLnR4dCcgICAgOiAndGV4dC9wbGFpbicsCi0gICAgJy51c3RhcicgIDogJ2FwcGxpY2F0aW9uL3gtdXN0YXInLAotICAgICcudmNmJyAgICA6ICd0ZXh0L3gtdmNhcmQnLAotICAgICcud2F2JyAgICA6ICdhdWRpby94LXdhdicsCi0gICAgJy53aXonICAgIDogJ2FwcGxpY2F0aW9uL21zd29yZCcsCi0gICAgJy53c2RsJyAgIDogJ2FwcGxpY2F0aW9uL3htbCcsCi0gICAgJy54Ym0nICAgIDogJ2ltYWdlL3gteGJpdG1hcCcsCi0gICAgJy54bGInICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcsCi0gICAgIyBEdXBsaWNhdGVzIDooCi0gICAgJy54bHMnICAgIDogJ2FwcGxpY2F0aW9uL2V4Y2VsJywKLSAgICAnLnhscycgICAgOiAnYXBwbGljYXRpb24vdm5kLm1zLWV4Y2VsJywKLSAgICAnLnhtbCcgICAgOiAndGV4dC94bWwnLAotICAgICcueHBkbCcgICA6ICdhcHBsaWNhdGlvbi94bWwnLAotICAgICcueHBtJyAgICA6ICdpbWFnZS94LXhwaXhtYXAnLAotICAgICcueHNsJyAgICA6ICdhcHBsaWNhdGlvbi94bWwnLAotICAgICcueHdkJyAgICA6ICdpbWFnZS94LXh3aW5kb3dkdW1wJywKLSAgICAnLnppcCcgICAgOiAnYXBwbGljYXRpb24vemlwJywKLSAgICB9CisgICAgIyBCZWZvcmUgYWRkaW5nIG5ldyB0eXBlcywgbWFrZSBzdXJlIHRoZXkgYXJlIGVpdGhlciByZWdpc3RlcmVkIHdpdGggSUFOQSwKKyAgICAjIGF0IGh0dHA6Ly93d3cuaXNpLmVkdS9pbi1ub3Rlcy9pYW5hL2Fzc2lnbm1lbnRzL21lZGlhLXR5cGVzCisgICAgIyBvciBleHRlbnNpb25zLCBpLmUuIHVzaW5nIHRoZSB4LSBwcmVmaXgKIAotIyBUaGVzZSBhcmUgbm9uLXN0YW5kYXJkIHR5cGVzLCBjb21tb25seSBmb3VuZCBpbiB0aGUgd2lsZC4gIFRoZXkgd2lsbCBvbmx5Ci0jIG1hdGNoIGlmIHN0cmljdD0wIGZsYWcgaXMgZ2l2ZW4gdG8gdGhlIEFQSSBtZXRob2RzLgorICAgICMgSWYgeW91IGFkZCB0byB0aGVzZSwgcGxlYXNlIGtlZXAgdGhlbSBzb3J0ZWQhCisgICAgdHlwZXNfbWFwID0geworICAgICAgICAnLmEnICAgICAgOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJywKKyAgICAgICAgJy5haScgICAgIDogJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLAorICAgICAgICAnLmFpZicgICAgOiAnYXVkaW8veC1haWZmJywKKyAgICAgICAgJy5haWZjJyAgIDogJ2F1ZGlvL3gtYWlmZicsCisgICAgICAgICcuYWlmZicgICA6ICdhdWRpby94LWFpZmYnLAorICAgICAgICAnLmF1JyAgICAgOiAnYXVkaW8vYmFzaWMnLAorICAgICAgICAnLmF2aScgICAgOiAndmlkZW8veC1tc3ZpZGVvJywKKyAgICAgICAgJy5iYXQnICAgIDogJ3RleHQvcGxhaW4nLAorICAgICAgICAnLmJjcGlvJyAgOiAnYXBwbGljYXRpb24veC1iY3BpbycsCisgICAgICAgICcuYmluJyAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAorICAgICAgICAnLmJtcCcgICAgOiAnaW1hZ2UveC1tcy1ibXAnLAorICAgICAgICAnLmMnICAgICAgOiAndGV4dC9wbGFpbicsCisgICAgICAgICMgRHVwbGljYXRlcyA6KAorICAgICAgICAnLmNkZicgICAgOiAnYXBwbGljYXRpb24veC1jZGYnLAorICAgICAgICAnLmNkZicgICAgOiAnYXBwbGljYXRpb24veC1uZXRjZGYnLAorICAgICAgICAnLmNwaW8nICAgOiAnYXBwbGljYXRpb24veC1jcGlvJywKKyAgICAgICAgJy5jc2gnICAgIDogJ2FwcGxpY2F0aW9uL3gtY3NoJywKKyAgICAgICAgJy5jc3MnICAgIDogJ3RleHQvY3NzJywKKyAgICAgICAgJy5kbGwnICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCisgICAgICAgICcuZG9jJyAgICA6ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAorICAgICAgICAnLmRvdCcgICAgOiAnYXBwbGljYXRpb24vbXN3b3JkJywKKyAgICAgICAgJy5kdmknICAgIDogJ2FwcGxpY2F0aW9uL3gtZHZpJywKKyAgICAgICAgJy5lbWwnICAgIDogJ21lc3NhZ2UvcmZjODIyJywKKyAgICAgICAgJy5lcHMnICAgIDogJ2FwcGxpY2F0aW9uL3Bvc3RzY3JpcHQnLAorICAgICAgICAnLmV0eCcgICAgOiAndGV4dC94LXNldGV4dCcsCisgICAgICAgICcuZXhlJyAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAorICAgICAgICAnLmdpZicgICAgOiAnaW1hZ2UvZ2lmJywKKyAgICAgICAgJy5ndGFyJyAgIDogJ2FwcGxpY2F0aW9uL3gtZ3RhcicsCisgICAgICAgICcuaCcgICAgICA6ICd0ZXh0L3BsYWluJywKKyAgICAgICAgJy5oZGYnICAgIDogJ2FwcGxpY2F0aW9uL3gtaGRmJywKKyAgICAgICAgJy5odG0nICAgIDogJ3RleHQvaHRtbCcsCisgICAgICAgICcuaHRtbCcgICA6ICd0ZXh0L2h0bWwnLAorICAgICAgICAnLmllZicgICAgOiAnaW1hZ2UvaWVmJywKKyAgICAgICAgJy5qcGUnICAgIDogJ2ltYWdlL2pwZWcnLAorICAgICAgICAnLmpwZWcnICAgOiAnaW1hZ2UvanBlZycsCisgICAgICAgICcuanBnJyAgICA6ICdpbWFnZS9qcGVnJywKKyAgICAgICAgJy5qcycgICAgIDogJ2FwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCcsCisgICAgICAgICcua3NoJyAgICA6ICd0ZXh0L3BsYWluJywKKyAgICAgICAgJy5sYXRleCcgIDogJ2FwcGxpY2F0aW9uL3gtbGF0ZXgnLAorICAgICAgICAnLm0xdicgICAgOiAndmlkZW8vbXBlZycsCisgICAgICAgICcubWFuJyAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmLW1hbicsCisgICAgICAgICcubWUnICAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmLW1lJywKKyAgICAgICAgJy5taHQnICAgIDogJ21lc3NhZ2UvcmZjODIyJywKKyAgICAgICAgJy5taHRtbCcgIDogJ21lc3NhZ2UvcmZjODIyJywKKyAgICAgICAgJy5taWYnICAgIDogJ2FwcGxpY2F0aW9uL3gtbWlmJywKKyAgICAgICAgJy5tb3YnICAgIDogJ3ZpZGVvL3F1aWNrdGltZScsCisgICAgICAgICcubW92aWUnICA6ICd2aWRlby94LXNnaS1tb3ZpZScsCisgICAgICAgICcubXAyJyAgICA6ICdhdWRpby9tcGVnJywKKyAgICAgICAgJy5tcDMnICAgIDogJ2F1ZGlvL21wZWcnLAorICAgICAgICAnLm1wYScgICAgOiAndmlkZW8vbXBlZycsCisgICAgICAgICcubXBlJyAgICA6ICd2aWRlby9tcGVnJywKKyAgICAgICAgJy5tcGVnJyAgIDogJ3ZpZGVvL21wZWcnLAorICAgICAgICAnLm1wZycgICAgOiAndmlkZW8vbXBlZycsCisgICAgICAgICcubXMnICAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmLW1zJywKKyAgICAgICAgJy5uYycgICAgIDogJ2FwcGxpY2F0aW9uL3gtbmV0Y2RmJywKKyAgICAgICAgJy5ud3MnICAgIDogJ21lc3NhZ2UvcmZjODIyJywKKyAgICAgICAgJy5vJyAgICAgIDogJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbScsCisgICAgICAgICcub2JqJyAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAorICAgICAgICAnLm9kYScgICAgOiAnYXBwbGljYXRpb24vb2RhJywKKyAgICAgICAgJy5wMTInICAgIDogJ2FwcGxpY2F0aW9uL3gtcGtjczEyJywKKyAgICAgICAgJy5wN2MnICAgIDogJ2FwcGxpY2F0aW9uL3BrY3M3LW1pbWUnLAorICAgICAgICAnLnBibScgICAgOiAnaW1hZ2UveC1wb3J0YWJsZS1iaXRtYXAnLAorICAgICAgICAnLnBkZicgICAgOiAnYXBwbGljYXRpb24vcGRmJywKKyAgICAgICAgJy5wZngnICAgIDogJ2FwcGxpY2F0aW9uL3gtcGtjczEyJywKKyAgICAgICAgJy5wZ20nICAgIDogJ2ltYWdlL3gtcG9ydGFibGUtZ3JheW1hcCcsCisgICAgICAgICcucGwnICAgICA6ICd0ZXh0L3BsYWluJywKKyAgICAgICAgJy5wbmcnICAgIDogJ2ltYWdlL3BuZycsCisgICAgICAgICcucG5tJyAgICA6ICdpbWFnZS94LXBvcnRhYmxlLWFueW1hcCcsCisgICAgICAgICcucG90JyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCcsCisgICAgICAgICcucHBhJyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCcsCisgICAgICAgICcucHBtJyAgICA6ICdpbWFnZS94LXBvcnRhYmxlLXBpeG1hcCcsCisgICAgICAgICcucHBzJyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCcsCisgICAgICAgICcucHB0JyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtcG93ZXJwb2ludCcsCisgICAgICAgICcucHMnICAgICA6ICdhcHBsaWNhdGlvbi9wb3N0c2NyaXB0JywKKyAgICAgICAgJy5wd3onICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1wb3dlcnBvaW50JywKKyAgICAgICAgJy5weScgICAgIDogJ3RleHQveC1weXRob24nLAorICAgICAgICAnLnB5YycgICAgOiAnYXBwbGljYXRpb24veC1weXRob24tY29kZScsCisgICAgICAgICcucHlvJyAgICA6ICdhcHBsaWNhdGlvbi94LXB5dGhvbi1jb2RlJywKKyAgICAgICAgJy5xdCcgICAgIDogJ3ZpZGVvL3F1aWNrdGltZScsCisgICAgICAgICcucmEnICAgICA6ICdhdWRpby94LXBuLXJlYWxhdWRpbycsCisgICAgICAgICcucmFtJyAgICA6ICdhcHBsaWNhdGlvbi94LXBuLXJlYWxhdWRpbycsCisgICAgICAgICcucmFzJyAgICA6ICdpbWFnZS94LWNtdS1yYXN0ZXInLAorICAgICAgICAnLnJkZicgICAgOiAnYXBwbGljYXRpb24veG1sJywKKyAgICAgICAgJy5yZ2InICAgIDogJ2ltYWdlL3gtcmdiJywKKyAgICAgICAgJy5yb2ZmJyAgIDogJ2FwcGxpY2F0aW9uL3gtdHJvZmYnLAorICAgICAgICAnLnJ0eCcgICAgOiAndGV4dC9yaWNodGV4dCcsCisgICAgICAgICcuc2dtJyAgICA6ICd0ZXh0L3gtc2dtbCcsCisgICAgICAgICcuc2dtbCcgICA6ICd0ZXh0L3gtc2dtbCcsCisgICAgICAgICcuc2gnICAgICA6ICdhcHBsaWNhdGlvbi94LXNoJywKKyAgICAgICAgJy5zaGFyJyAgIDogJ2FwcGxpY2F0aW9uL3gtc2hhcicsCisgICAgICAgICcuc25kJyAgICA6ICdhdWRpby9iYXNpYycsCisgICAgICAgICcuc28nICAgICA6ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAorICAgICAgICAnLnNyYycgICAgOiAnYXBwbGljYXRpb24veC13YWlzLXNvdXJjZScsCisgICAgICAgICcuc3Y0Y3Bpbyc6ICdhcHBsaWNhdGlvbi94LXN2NGNwaW8nLAorICAgICAgICAnLnN2NGNyYycgOiAnYXBwbGljYXRpb24veC1zdjRjcmMnLAorICAgICAgICAnLnN3ZicgICAgOiAnYXBwbGljYXRpb24veC1zaG9ja3dhdmUtZmxhc2gnLAorICAgICAgICAnLnQnICAgICAgOiAnYXBwbGljYXRpb24veC10cm9mZicsCisgICAgICAgICcudGFyJyAgICA6ICdhcHBsaWNhdGlvbi94LXRhcicsCisgICAgICAgICcudGNsJyAgICA6ICdhcHBsaWNhdGlvbi94LXRjbCcsCisgICAgICAgICcudGV4JyAgICA6ICdhcHBsaWNhdGlvbi94LXRleCcsCisgICAgICAgICcudGV4aScgICA6ICdhcHBsaWNhdGlvbi94LXRleGluZm8nLAorICAgICAgICAnLnRleGluZm8nOiAnYXBwbGljYXRpb24veC10ZXhpbmZvJywKKyAgICAgICAgJy50aWYnICAgIDogJ2ltYWdlL3RpZmYnLAorICAgICAgICAnLnRpZmYnICAgOiAnaW1hZ2UvdGlmZicsCisgICAgICAgICcudHInICAgICA6ICdhcHBsaWNhdGlvbi94LXRyb2ZmJywKKyAgICAgICAgJy50c3YnICAgIDogJ3RleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMnLAorICAgICAgICAnLnR4dCcgICAgOiAndGV4dC9wbGFpbicsCisgICAgICAgICcudXN0YXInICA6ICdhcHBsaWNhdGlvbi94LXVzdGFyJywKKyAgICAgICAgJy52Y2YnICAgIDogJ3RleHQveC12Y2FyZCcsCisgICAgICAgICcud2F2JyAgICA6ICdhdWRpby94LXdhdicsCisgICAgICAgICcud2l6JyAgICA6ICdhcHBsaWNhdGlvbi9tc3dvcmQnLAorICAgICAgICAnLndzZGwnICAgOiAnYXBwbGljYXRpb24veG1sJywKKyAgICAgICAgJy54Ym0nICAgIDogJ2ltYWdlL3gteGJpdG1hcCcsCisgICAgICAgICcueGxiJyAgICA6ICdhcHBsaWNhdGlvbi92bmQubXMtZXhjZWwnLAorICAgICAgICAjIER1cGxpY2F0ZXMgOigKKyAgICAgICAgJy54bHMnICAgIDogJ2FwcGxpY2F0aW9uL2V4Y2VsJywKKyAgICAgICAgJy54bHMnICAgIDogJ2FwcGxpY2F0aW9uL3ZuZC5tcy1leGNlbCcsCisgICAgICAgICcueG1sJyAgICA6ICd0ZXh0L3htbCcsCisgICAgICAgICcueHBkbCcgICA6ICdhcHBsaWNhdGlvbi94bWwnLAorICAgICAgICAnLnhwbScgICAgOiAnaW1hZ2UveC14cGl4bWFwJywKKyAgICAgICAgJy54c2wnICAgIDogJ2FwcGxpY2F0aW9uL3htbCcsCisgICAgICAgICcueHdkJyAgICA6ICdpbWFnZS94LXh3aW5kb3dkdW1wJywKKyAgICAgICAgJy56aXAnICAgIDogJ2FwcGxpY2F0aW9uL3ppcCcsCisgICAgICAgIH0KIAotIyBQbGVhc2Ugc29ydCB0aGVzZSB0b28KLWNvbW1vbl90eXBlcyA9IHsKLSAgICAnLmpwZycgOiAnaW1hZ2UvanBnJywKLSAgICAnLm1pZCcgOiAnYXVkaW8vbWlkaScsCi0gICAgJy5taWRpJzogJ2F1ZGlvL21pZGknLAotICAgICcucGN0JyA6ICdpbWFnZS9waWN0JywKLSAgICAnLnBpYycgOiAnaW1hZ2UvcGljdCcsCi0gICAgJy5waWN0JzogJ2ltYWdlL3BpY3QnLAotICAgICcucnRmJyA6ICdhcHBsaWNhdGlvbi9ydGYnLAotICAgICcueHVsJyA6ICd0ZXh0L3h1bCcKLSAgICB9CisgICAgIyBUaGVzZSBhcmUgbm9uLXN0YW5kYXJkIHR5cGVzLCBjb21tb25seSBmb3VuZCBpbiB0aGUgd2lsZC4gIFRoZXkgd2lsbAorICAgICMgb25seSBtYXRjaCBpZiBzdHJpY3Q9MCBmbGFnIGlzIGdpdmVuIHRvIHRoZSBBUEkgbWV0aG9kcy4KKworICAgICMgUGxlYXNlIHNvcnQgdGhlc2UgdG9vCisgICAgY29tbW9uX3R5cGVzID0geworICAgICAgICAnLmpwZycgOiAnaW1hZ2UvanBnJywKKyAgICAgICAgJy5taWQnIDogJ2F1ZGlvL21pZGknLAorICAgICAgICAnLm1pZGknOiAnYXVkaW8vbWlkaScsCisgICAgICAgICcucGN0JyA6ICdpbWFnZS9waWN0JywKKyAgICAgICAgJy5waWMnIDogJ2ltYWdlL3BpY3QnLAorICAgICAgICAnLnBpY3QnOiAnaW1hZ2UvcGljdCcsCisgICAgICAgICcucnRmJyA6ICdhcHBsaWNhdGlvbi9ydGYnLAorICAgICAgICAnLnh1bCcgOiAndGV4dC94dWwnCisgICAgICAgIH0KKworCitfZGVmYXVsdF9taW1lX3R5cGVzKCkKIAogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgpkaWZmIC0tZ2l0IGEvTGliL3BkYi5weSBiL0xpYi9wZGIucHkKaW5kZXggMWFhMmVhZS4uNWI3ZWE5OSAxMDA3NTUKLS0tIGEvTGliL3BkYi5weQorKysgYi9MaWIvcGRiLnB5CkBAIC05MSw2ICs5MSwxMiBAQAogICAgICAgICAgICAgICAgIHNlbGYucmNMaW5lcy5hcHBlbmQobGluZSkKICAgICAgICAgICAgIHJjRmlsZS5jbG9zZSgpCiAKKyAgICAgICAgc2VsZi5jb21tYW5kcyA9IHt9ICMgYXNzb2NpYXRlcyBhIGNvbW1hbmQgbGlzdCB0byBicmVha3BvaW50IG51bWJlcnMKKyAgICAgICAgc2VsZi5jb21tYW5kc19kb3Byb21wdCA9IHt9ICMgZm9yIGVhY2ggYnAgbnVtLCB0ZWxscyBpZiB0aGUgcHJvbXB0IG11c3QgYmUgZGlzcC4gYWZ0ZXIgZXhlY2luZyB0aGUgY21kIGxpc3QKKyAgICAgICAgc2VsZi5jb21tYW5kc19zaWxlbnQgPSB7fSAjIGZvciBlYWNoIGJwIG51bSwgdGVsbHMgaWYgdGhlIHN0YWNrIHRyYWNlIG11c3QgYmUgZGlzcC4gYWZ0ZXIgZXhlY2luZyB0aGUgY21kIGxpc3QKKyAgICAgICAgc2VsZi5jb21tYW5kc19kZWZpbmluZyA9IEZhbHNlICMgVHJ1ZSB3aGlsZSBpbiB0aGUgcHJvY2VzcyBvZiBkZWZpbmluZyBhIGNvbW1hbmQgbGlzdAorICAgICAgICBzZWxmLmNvbW1hbmRzX2JudW0gPSBOb25lICMgVGhlIGJyZWFrcG9pbnQgbnVtYmVyIGZvciB3aGljaCB3ZSBhcmUgZGVmaW5pbmcgYSBsaXN0CisKICAgICBkZWYgcmVzZXQoc2VsZik6CiAgICAgICAgIGJkYi5CZGIucmVzZXQoc2VsZikKICAgICAgICAgc2VsZi5mb3JnZXQoKQpAQCAtMTM3LDcgKzE0MywyOCBAQAogICAgICAgICAgICAgICAgIG9yIGZyYW1lLmZfbGluZW5vPD0gMCk6CiAgICAgICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgICAgICBzZWxmLl93YWl0X2Zvcl9tYWlucHlmaWxlID0gMAotICAgICAgICBzZWxmLmludGVyYWN0aW9uKGZyYW1lLCBOb25lKQorICAgICAgICBpZiBzZWxmLmJwX2NvbW1hbmRzKGZyYW1lKToKKyAgICAgICAgICAgIHNlbGYuaW50ZXJhY3Rpb24oZnJhbWUsIE5vbmUpCisKKyAgICBkZWYgYnBfY29tbWFuZHMoc2VsZixmcmFtZSk6CisgICAgICAgICIiIiBDYWxsIGV2ZXJ5IGNvbW1hbmQgdGhhdCB3YXMgc2V0IGZvciB0aGUgY3VycmVudCBhY3RpdmUgYnJlYWtwb2ludCAoaWYgdGhlcmUgaXMgb25lKQorICAgICAgICBSZXR1cm5zIFRydWUgaWYgdGhlIG5vcm1hbCBpbnRlcmFjdGlvbiBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCwgRmFsc2Ugb3RoZXJ3aXNlICIiIgorICAgICAgICAjc2VsZi5jdXJyZW50YnAgaXMgc2V0IGluIGJkYi5weSBpbiBiZGIuYnJlYWtfaGVyZSBpZiBhIGJyZWFrcG9pbnQgd2FzIGhpdAorICAgICAgICBpZiBnZXRhdHRyKHNlbGYsImN1cnJlbnRicCIsRmFsc2UpIGFuZCBzZWxmLmN1cnJlbnRicCBpbiBzZWxmLmNvbW1hbmRzOgorICAgICAgICAgICAgY3VycmVudGJwID0gc2VsZi5jdXJyZW50YnAKKyAgICAgICAgICAgIHNlbGYuY3VycmVudGJwID0gMAorICAgICAgICAgICAgbGFzdGNtZF9iYWNrID0gc2VsZi5sYXN0Y21kCisgICAgICAgICAgICBzZWxmLnNldHVwKGZyYW1lLCBOb25lKQorICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5jb21tYW5kc1tjdXJyZW50YnBdOgorICAgICAgICAgICAgICAgIHNlbGYub25lY21kKGxpbmUpCisgICAgICAgICAgICBzZWxmLmxhc3RjbWQgPSBsYXN0Y21kX2JhY2sKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmNvbW1hbmRzX3NpbGVudFtjdXJyZW50YnBdOgorICAgICAgICAgICAgICAgIHNlbGYucHJpbnRfc3RhY2tfZW50cnkoc2VsZi5zdGFja1tzZWxmLmN1cmluZGV4XSkKKyAgICAgICAgICAgIGlmIHNlbGYuY29tbWFuZHNfZG9wcm9tcHRbY3VycmVudGJwXToKKyAgICAgICAgICAgICAgICBzZWxmLmNtZGxvb3AoKQorICAgICAgICAgICAgc2VsZi5mb3JnZXQoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHJldHVybiAxCiAKICAgICBkZWYgdXNlcl9yZXR1cm4oc2VsZiwgZnJhbWUsIHJldHVybl92YWx1ZSk6CiAgICAgICAgICIiIlRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSByZXR1cm4gdHJhcCBpcyBzZXQgaGVyZS4iIiIKQEAgLTIwMiwxMiArMjI5LDcwIEBACiAgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVbOm1hcmtlcl0ucnN0cmlwKCkKICAgICAgICAgcmV0dXJuIGxpbmUKIAorICAgIGRlZiBvbmVjbWQoc2VsZiwgbGluZSk6CisgICAgICAgICIiIkludGVycHJldCB0aGUgYXJndW1lbnQgYXMgdGhvdWdoIGl0IGhhZCBiZWVuIHR5cGVkIGluIHJlc3BvbnNlCisgICAgICAgIHRvIHRoZSBwcm9tcHQuCisKKyAgICAgICAgQ2hlY2tzIHdldGhlciAgdGhpcyBsaW5lIGlzIHR5cGVkIGluIHRoZSBub3JtYWwgcHJvbXB0IG9yIGluIGEgYnJlYWtwb2ludCBjb21tYW5kIGxpc3QgZGVmaW5pdGlvbgorICAgICAgICAiIiIKKyAgICAgICAgaWYgbm90IHNlbGYuY29tbWFuZHNfZGVmaW5pbmc6CisgICAgICAgICAgICByZXR1cm4gY21kLkNtZC5vbmVjbWQoc2VsZiwgbGluZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmhhbmRsZV9jb21tYW5kX2RlZihsaW5lKQorCisgICAgZGVmIGhhbmRsZV9jb21tYW5kX2RlZihzZWxmLGxpbmUpOgorICAgICAgICAiIiIgSGFuZGxlcyBvbmUgY29tbWFuZCBsaW5lIGR1cmluZyBjb21tYW5kIGxpc3QgZGVmaW5pdGlvbi4gIiIiCisgICAgICAgIGNtZCwgYXJnLCBsaW5lID0gc2VsZi5wYXJzZWxpbmUobGluZSkKKyAgICAgICAgaWYgY21kID09ICdzaWxlbnQnOgorICAgICAgICAgICAgc2VsZi5jb21tYW5kc19zaWxlbnRbc2VsZi5jb21tYW5kc19ibnVtXSA9IFRydWUKKyAgICAgICAgICAgIHJldHVybiAjIGNvbnRpbnVlIHRvIGhhbmRsZSBvdGhlciBjbWQgZGVmIGluIHRoZSBjbWQgbGlzdAorICAgICAgICBlbGlmIGNtZCA9PSAnZW5kJzoKKyAgICAgICAgICAgIHNlbGYuY21kcXVldWUgPSBbXQorICAgICAgICAgICAgcmV0dXJuIDEgIyBlbmQgb2YgY21kIGxpc3QKKyAgICAgICAgY21kbGlzdCA9IHNlbGYuY29tbWFuZHNbc2VsZi5jb21tYW5kc19ibnVtXQorICAgICAgICBpZiAoYXJnKToKKyAgICAgICAgICAgIGNtZGxpc3QuYXBwZW5kKGNtZCsnICcrYXJnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY21kbGlzdC5hcHBlbmQoY21kKQorICAgICAgICAjIERldGVybWluZSBpZiB3ZSBtdXN0IHN0b3AKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoc2VsZiwgJ2RvXycgKyBjbWQpCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGZ1bmMgPSBzZWxmLmRlZmF1bHQKKyAgICAgICAgaWYgZnVuYy5mdW5jX25hbWUgaW4gc2VsZi5jb21tYW5kc19yZXN1bWluZyA6ICMgb25lIG9mIHRoZSByZXN1bWluZyBjb21tYW5kcy4KKyAgICAgICAgICAgIHNlbGYuY29tbWFuZHNfZG9wcm9tcHRbc2VsZi5jb21tYW5kc19ibnVtXSA9IEZhbHNlCisgICAgICAgICAgICBzZWxmLmNtZHF1ZXVlID0gW10KKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIHJldHVybgorCiAgICAgIyBDb21tYW5kIGRlZmluaXRpb25zLCBjYWxsZWQgYnkgY21kbG9vcCgpCiAgICAgIyBUaGUgYXJndW1lbnQgaXMgdGhlIHJlbWFpbmluZyBzdHJpbmcgb24gdGhlIGNvbW1hbmQgbGluZQogICAgICMgUmV0dXJuIHRydWUgdG8gZXhpdCBmcm9tIHRoZSBjb21tYW5kIGxvb3AKIAogICAgIGRvX2ggPSBjbWQuQ21kLmRvX2hlbHAKIAorICAgIGRlZiBkb19jb21tYW5kcyhzZWxmLCBhcmcpOgorICAgICAgICAiIiJEZWZpbmVzIGEgbGlzdCBvZiBjb21tYW5kcyBhc3NvY2lhdGVkIHRvIGEgYnJlYWtwb2ludAorICAgICAgICBUaG9zZSBjb21tYW5kcyB3aWxsIGJlIGV4ZWN1dGVkIHdoZW5ldmVyIHRoZSBicmVha3BvaW50IGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBzdG9wIGV4ZWN1dGlvbi4iIiIKKyAgICAgICAgaWYgbm90IGFyZzoKKyAgICAgICAgICAgIGJudW0gPSBsZW4oYmRiLkJyZWFrcG9pbnQuYnBieW51bWJlciktMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGJudW0gPSBpbnQoYXJnKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHByaW50ICJVc2FnZSA6IGNvbW1hbmRzIFtibnVtXVxuICAgICAgICAuLi5cbiAgICAgICAgZW5kIgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmNvbW1hbmRzX2JudW0gPSBibnVtCisgICAgICAgIHNlbGYuY29tbWFuZHNbYm51bV0gPSBbXQorICAgICAgICBzZWxmLmNvbW1hbmRzX2RvcHJvbXB0W2JudW1dID0gVHJ1ZQorICAgICAgICBzZWxmLmNvbW1hbmRzX3NpbGVudFtibnVtXSA9IEZhbHNlCisgICAgICAgIHByb21wdF9iYWNrID0gc2VsZi5wcm9tcHQKKyAgICAgICAgc2VsZi5wcm9tcHQgPSAnKGNvbSkgJworICAgICAgICBzZWxmLmNvbW1hbmRzX2RlZmluaW5nID0gVHJ1ZQorICAgICAgICBzZWxmLmNtZGxvb3AoKQorICAgICAgICBzZWxmLmNvbW1hbmRzX2RlZmluaW5nID0gRmFsc2UKKyAgICAgICAgc2VsZi5wcm9tcHQgPSBwcm9tcHRfYmFjaworCiAgICAgZGVmIGRvX2JyZWFrKHNlbGYsIGFyZywgdGVtcG9yYXJ5ID0gMCk6CiAgICAgICAgICMgYnJlYWsgWyAoW2ZpbGVuYW1lOl1saW5lbm8gfCBmdW5jdGlvbikgWywgImNvbmRpdGlvbiJdIF0KICAgICAgICAgaWYgbm90IGFyZzoKQEAgLTY5MSw2ICs3NzYsOSBAQAogICAgICAgICBpZiBhcmdzWzBdIGluIHNlbGYuYWxpYXNlczoKICAgICAgICAgICAgIGRlbCBzZWxmLmFsaWFzZXNbYXJnc1swXV0KIAorICAgICNsaXN0IG9mIGFsbCB0aGUgY29tbWFuZHMgbWFraW5nIHRoZSBwcm9ncmFtIHJlc3VtZSBleGVjdXRpb24uCisgICAgY29tbWFuZHNfcmVzdW1pbmcgPSBbJ2RvX2NvbnRpbnVlJywgJ2RvX3N0ZXAnLCAnZG9fbmV4dCcsICdkb19yZXR1cm4nLCAnZG9fcXVpdCcsICdkb19qdW1wJ10KKwogICAgICMgUHJpbnQgYSB0cmFjZWJhY2sgc3RhcnRpbmcgYXQgdGhlIHRvcCBzdGFjayBmcmFtZS4KICAgICAjIFRoZSBtb3N0IHJlY2VudGx5IGVudGVyZWQgZnJhbWUgaXMgcHJpbnRlZCBsYXN0OwogICAgICMgdGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBkYnggYW5kIGdkYiwgYnV0IGNvbnNpc3RlbnQgd2l0aApAQCAtOTQ0LDYgKzEwMzIsNDEgQEAKICAgICAgICAgcHJpbnQgIiIidW5hbGlhcyBuYW1lCiBEZWxldGVzIHRoZSBzcGVjaWZpZWQgYWxpYXMuIiIiCiAKKyAgICBkZWYgaGVscF9jb21tYW5kcyhzZWxmKToKKyAgICAgICAgcHJpbnQgIiIiY29tbWFuZHMgW2JwbnVtYmVyXQorKGNvbSkgLi4uCisoY29tKSBlbmQKKyhQZGIpCisKK1NwZWNpZnkgYSBsaXN0IG9mIGNvbW1hbmRzIGZvciBicmVha3BvaW50IG51bWJlciBicG51bWJlci4gIFRoZQorY29tbWFuZHMgdGhlbXNlbHZlcyBhcHBlYXIgb24gdGhlIGZvbGxvd2luZyBsaW5lcy4gIFR5cGUgYSBsaW5lCitjb250YWluaW5nIGp1c3QgJ2VuZCcgdG8gdGVybWluYXRlIHRoZSBjb21tYW5kcy4KKworVG8gcmVtb3ZlIGFsbCBjb21tYW5kcyBmcm9tIGEgYnJlYWtwb2ludCwgdHlwZSBjb21tYW5kcyBhbmQKK2ZvbGxvdyBpdCBpbW1lZGlhdGVseSB3aXRoICBlbmQ7IHRoYXQgaXMsIGdpdmUgbm8gY29tbWFuZHMuCisKK1dpdGggbm8gYnBudW1iZXIgYXJndW1lbnQsIGNvbW1hbmRzIHJlZmVycyB0byB0aGUgbGFzdAorYnJlYWtwb2ludCBzZXQuCisKK1lvdSBjYW4gdXNlIGJyZWFrcG9pbnQgY29tbWFuZHMgdG8gc3RhcnQgeW91ciBwcm9ncmFtIHVwIGFnYWluLgorU2ltcGx5IHVzZSB0aGUgY29udGludWUgY29tbWFuZCwgb3Igc3RlcCwgb3IgYW55IG90aGVyCitjb21tYW5kIHRoYXQgcmVzdW1lcyBleGVjdXRpb24uCisKK1NwZWNpZnlpbmcgYW55IGNvbW1hbmQgcmVzdW1pbmcgZXhlY3V0aW9uIChjdXJyZW50bHkgY29udGludWUsCitzdGVwLCBuZXh0LCByZXR1cm4sIGp1bXAsIHF1aXQgYW5kIHRoZWlyIGFiYnJldmlhdGlvbnMpIHRlcm1pbmF0ZXMKK3RoZSBjb21tYW5kIGxpc3QgKGFzIGlmIHRoYXQgY29tbWFuZCB3YXMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgZW5kKS4KK1RoaXMgaXMgYmVjYXVzZSBhbnkgdGltZSB5b3UgcmVzdW1lIGV4ZWN1dGlvbgorKGV2ZW4gd2l0aCBhIHNpbXBsZSBuZXh0IG9yIHN0ZXApLCB5b3UgbWF5IGVuY291bnRlcgorYW5vdGhlciBicmVha3BvaW50LS13aGljaCBjb3VsZCBoYXZlIGl0cyBvd24gY29tbWFuZCBsaXN0LCBsZWFkaW5nIHRvCithbWJpZ3VpdGllcyBhYm91dCB3aGljaCBsaXN0IHRvIGV4ZWN1dGUuCisKKyAgIElmIHlvdSB1c2UgdGhlICdzaWxlbnQnIGNvbW1hbmQgaW4gdGhlIGNvbW1hbmQgbGlzdCwgdGhlCit1c3VhbCBtZXNzYWdlIGFib3V0IHN0b3BwaW5nIGF0IGEgYnJlYWtwb2ludCBpcyBub3QgcHJpbnRlZC4gIFRoaXMgbWF5CitiZSBkZXNpcmFibGUgZm9yIGJyZWFrcG9pbnRzIHRoYXQgYXJlIHRvIHByaW50IGEgc3BlY2lmaWMgbWVzc2FnZSBhbmQKK3RoZW4gY29udGludWUuICBJZiBub25lIG9mIHRoZSBvdGhlciBjb21tYW5kcyBwcmludCBhbnl0aGluZywgeW91CitzZWUgbm8gc2lnbiB0aGF0IHRoZSBicmVha3BvaW50IHdhcyByZWFjaGVkLgorIiIiCisKICAgICBkZWYgaGVscF9wZGIoc2VsZik6CiAgICAgICAgIGhlbHAoKQogCmRpZmYgLS1naXQgYS9MaWIvcGtnX3Jlc291cmNlcy5weSBiL0xpYi9wa2dfcmVzb3VyY2VzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNmNjOTAKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvcGtnX3Jlc291cmNlcy5weQpAQCAtMCwwICsxLDIzNzcgQEAKKyIiIlBhY2thZ2UgcmVzb3VyY2UgQVBJCistLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBIHJlc291cmNlIGlzIGEgbG9naWNhbCBmaWxlIGNvbnRhaW5lZCB3aXRoaW4gYSBwYWNrYWdlLCBvciBhIGxvZ2ljYWwKK3N1YmRpcmVjdG9yeSB0aGVyZW9mLiAgVGhlIHBhY2thZ2UgcmVzb3VyY2UgQVBJIGV4cGVjdHMgcmVzb3VyY2UgbmFtZXMKK3RvIGhhdmUgdGhlaXIgcGF0aCBwYXJ0cyBzZXBhcmF0ZWQgd2l0aCBgYC9gYCwgKm5vdCogd2hhdGV2ZXIgdGhlIGxvY2FsCitwYXRoIHNlcGFyYXRvciBpcy4gIERvIG5vdCB1c2Ugb3MucGF0aCBvcGVyYXRpb25zIHRvIG1hbmlwdWxhdGUgcmVzb3VyY2UKK25hbWVzIGJlaW5nIHBhc3NlZCBpbnRvIHRoZSBBUEkuCisKK1RoZSBwYWNrYWdlIHJlc291cmNlIEFQSSBpcyBkZXNpZ25lZCB0byB3b3JrIHdpdGggbm9ybWFsIGZpbGVzeXN0ZW0gcGFja2FnZXMsCisuZWdnIGZpbGVzLCBhbmQgdW5wYWNrZWQgLmVnZyBmaWxlcy4gIEl0IGNhbiBhbHNvIHdvcmsgaW4gYSBsaW1pdGVkIHdheSB3aXRoCisuemlwIGZpbGVzIGFuZCB3aXRoIGN1c3RvbSBQRVAgMzAyIGxvYWRlcnMgdGhhdCBzdXBwb3J0IHRoZSBgYGdldF9kYXRhKClgYAorbWV0aG9kLgorIiIiCisKK2ltcG9ydCBzeXMsIG9zLCB6aXBpbXBvcnQsIHRpbWUsIHJlLCBpbXAsIG5ldywgcGtndXRpbCAgIyBYWFgKK2Zyb20gc2V0cyBpbXBvcnQgSW1tdXRhYmxlU2V0Citmcm9tIG9zIGltcG9ydCB1dGltZSwgcmVuYW1lLCB1bmxpbmsgICAgIyBjYXB0dXJlIHRoZXNlIHRvIGJ5cGFzcyBzYW5kYm94aW5nCitmcm9tIG9zIGltcG9ydCBvcGVuIGFzIG9zX29wZW4KKworZGVmIGdldF9zdXBwb3J0ZWRfcGxhdGZvcm0oKToKKyAgICAiIiJSZXR1cm4gdGhpcyBwbGF0Zm9ybSdzIG1heGltdW0gY29tcGF0aWJsZSB2ZXJzaW9uLgorCisgICAgZGlzdHV0aWxzLnV0aWwuZ2V0X3BsYXRmb3JtKCkgbm9ybWFsbHkgcmVwb3J0cyB0aGUgbWluaW11bSB2ZXJzaW9uCisgICAgb2YgTWFjIE9TIFggdGhhdCB3b3VsZCBiZSByZXF1aXJlZCB0byAqdXNlKiBleHRlbnNpb25zIHByb2R1Y2VkIGJ5CisgICAgZGlzdHV0aWxzLiAgQnV0IHdoYXQgd2Ugd2FudCB3aGVuIGNoZWNraW5nIGNvbXBhdGliaWxpdHkgaXMgdG8ga25vdyB0aGUKKyAgICB2ZXJzaW9uIG9mIE1hYyBPUyBYIHRoYXQgd2UgYXJlICpydW5uaW5nKi4gIFRvIGFsbG93IHVzYWdlIG9mIHBhY2thZ2VzIHRoYXQKKyAgICBleHBsaWNpdGx5IHJlcXVpcmUgYSBuZXdlciB2ZXJzaW9uIG9mIE1hYyBPUyBYLCB3ZSBtdXN0IGFsc28ga25vdyB0aGUKKyAgICBjdXJyZW50IHZlcnNpb24gb2YgdGhlIE9TLgorCisgICAgSWYgdGhpcyBjb25kaXRpb24gb2NjdXJzIGZvciBhbnkgb3RoZXIgcGxhdGZvcm0gd2l0aCBhIHZlcnNpb24gaW4gaXRzCisgICAgcGxhdGZvcm0gc3RyaW5ncywgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgZXh0ZW5kZWQgYWNjb3JkaW5nbHkuCisgICAgIiIiCisgICAgcGxhdCA9IGdldF9idWlsZF9wbGF0Zm9ybSgpOyBtID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHBsYXQpCisgICAgaWYgbSBpcyBub3QgTm9uZSBhbmQgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBwbGF0ID0gJ21hY29zeC0lcy0lcycgJSAoJy4nLmpvaW4oX21hY29zeF92ZXJzKClbOjJdKSwgbS5ncm91cCgzKSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICBwYXNzICAgICMgbm90IE1hYyBPUyBYCisgICAgcmV0dXJuIHBsYXQKKworX19hbGxfXyA9IFsKKyAgICAjIEJhc2ljIHJlc291cmNlIGFjY2VzcyBhbmQgZGlzdHJpYnV0aW9uL2VudHJ5IHBvaW50IGRpc2NvdmVyeQorICAgICdyZXF1aXJlJywgJ3J1bl9zY3JpcHQnLCAnZ2V0X3Byb3ZpZGVyJywgICdnZXRfZGlzdHJpYnV0aW9uJywKKyAgICAnbG9hZF9lbnRyeV9wb2ludCcsICdnZXRfZW50cnlfbWFwJywgJ2dldF9lbnRyeV9pbmZvJywgJ2l0ZXJfZW50cnlfcG9pbnRzJywKKyAgICAncmVzb3VyY2Vfc3RyaW5nJywgJ3Jlc291cmNlX3N0cmVhbScsICdyZXNvdXJjZV9maWxlbmFtZScsCisgICAgJ3Jlc291cmNlX2xpc3RkaXInLCAncmVzb3VyY2VfZXhpc3RzJywgJ3Jlc291cmNlX2lzZGlyJywKKworICAgICMgRW52aXJvbm1lbnRhbCBjb250cm9sCisgICAgJ2RlY2xhcmVfbmFtZXNwYWNlJywgJ3dvcmtpbmdfc2V0JywgJ2FkZF9hY3RpdmF0aW9uX2xpc3RlbmVyJywKKyAgICAnZmluZF9kaXN0cmlidXRpb25zJywgJ3NldF9leHRyYWN0aW9uX3BhdGgnLCAnY2xlYW51cF9yZXNvdXJjZXMnLAorICAgICdnZXRfZGVmYXVsdF9jYWNoZScsCisKKyAgICAjIFByaW1hcnkgaW1wbGVtZW50YXRpb24gY2xhc3NlcworICAgICdFbnZpcm9ubWVudCcsICdXb3JraW5nU2V0JywgJ1Jlc291cmNlTWFuYWdlcicsCisgICAgJ0Rpc3RyaWJ1dGlvbicsICdSZXF1aXJlbWVudCcsICdFbnRyeVBvaW50JywKKworICAgICMgRXhjZXB0aW9ucworICAgICdSZXNvbHV0aW9uRXJyb3InLCdWZXJzaW9uQ29uZmxpY3QnLCdEaXN0cmlidXRpb25Ob3RGb3VuZCcsJ1Vua25vd25FeHRyYScsCisgICAgJ0V4dHJhY3Rpb25FcnJvcicsCisKKyAgICAjIFBhcnNpbmcgZnVuY3Rpb25zIGFuZCBzdHJpbmcgdXRpbGl0aWVzCisgICAgJ3BhcnNlX3JlcXVpcmVtZW50cycsICdwYXJzZV92ZXJzaW9uJywgJ3NhZmVfbmFtZScsICdzYWZlX3ZlcnNpb24nLAorICAgICdnZXRfcGxhdGZvcm0nLCAnY29tcGF0aWJsZV9wbGF0Zm9ybXMnLCAneWllbGRfbGluZXMnLCAnc3BsaXRfc2VjdGlvbnMnLAorICAgICdzYWZlX2V4dHJhJywgJ3RvX2ZpbGVuYW1lJywKKworICAgICMgZmlsZXN5c3RlbSB1dGlsaXRpZXMKKyAgICAnZW5zdXJlX2RpcmVjdG9yeScsICdub3JtYWxpemVfcGF0aCcsCisKKyAgICAjIERpc3RyaWJ1dGlvbiAicHJlY2VkZW5jZSIgY29uc3RhbnRzCisgICAgJ0VHR19ESVNUJywgJ0JJTkFSWV9ESVNUJywgJ1NPVVJDRV9ESVNUJywgJ0NIRUNLT1VUX0RJU1QnLCAnREVWRUxPUF9ESVNUJywKKworICAgICMgIlByb3ZpZGVyIiBpbnRlcmZhY2VzLCBpbXBsZW1lbnRhdGlvbnMsIGFuZCByZWdpc3RyYXRpb24vbG9va3VwIEFQSXMKKyAgICAnSU1ldGFkYXRhUHJvdmlkZXInLCAnSVJlc291cmNlUHJvdmlkZXInLCAnRmlsZU1ldGFkYXRhJywKKyAgICAnUGF0aE1ldGFkYXRhJywgJ0VnZ01ldGFkYXRhJywgJ0VtcHR5UHJvdmlkZXInLCAnZW1wdHlfcHJvdmlkZXInLAorICAgICdOdWxsUHJvdmlkZXInLCAnRWdnUHJvdmlkZXInLCAnRGVmYXVsdFByb3ZpZGVyJywgJ1ppcFByb3ZpZGVyJywKKyAgICAncmVnaXN0ZXJfZmluZGVyJywgJ3JlZ2lzdGVyX25hbWVzcGFjZV9oYW5kbGVyJywgJ3JlZ2lzdGVyX2xvYWRlcl90eXBlJywKKyAgICAnZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzJywgJ2dldF9pbXBvcnRlcicsCisKKyAgICAjIERlcHJlY2F0ZWQvYmFja3dhcmQgY29tcGF0aWJpbGl0eSBvbmx5CisgICAgJ3J1bl9tYWluJywgJ0F2YWlsYWJsZURpc3RyaWJ1dGlvbnMnLAorXQorY2xhc3MgUmVzb2x1dGlvbkVycm9yKEV4Y2VwdGlvbik6CisgICAgIiIiQWJzdHJhY3QgYmFzZSBmb3IgZGVwZW5kZW5jeSByZXNvbHV0aW9uIGVycm9ycyIiIgorICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fK3JlcHIoc2VsZi5hcmdzKQorCitjbGFzcyBWZXJzaW9uQ29uZmxpY3QoUmVzb2x1dGlvbkVycm9yKToKKyAgICAiIiJBbiBhbHJlYWR5LWluc3RhbGxlZCB2ZXJzaW9uIGNvbmZsaWN0cyB3aXRoIHRoZSByZXF1ZXN0ZWQgdmVyc2lvbiIiIgorCitjbGFzcyBEaXN0cmlidXRpb25Ob3RGb3VuZChSZXNvbHV0aW9uRXJyb3IpOgorICAgICIiIkEgcmVxdWVzdGVkIGRpc3RyaWJ1dGlvbiB3YXMgbm90IGZvdW5kIiIiCisKK2NsYXNzIFVua25vd25FeHRyYShSZXNvbHV0aW9uRXJyb3IpOgorICAgICIiIkRpc3RyaWJ1dGlvbiBkb2Vzbid0IGhhdmUgYW4gImV4dHJhIGZlYXR1cmUiIG9mIHRoZSBnaXZlbiBuYW1lIiIiCisKK19wcm92aWRlcl9mYWN0b3JpZXMgPSB7fQorUFlfTUFKT1IgPSBzeXMudmVyc2lvbls6M10KK0VHR19ESVNUICAgID0gMworQklOQVJZX0RJU1QgPSAyCitTT1VSQ0VfRElTVCA9IDEKK0NIRUNLT1VUX0RJU1QgPSAwCitERVZFTE9QX0RJU1QgPSAtMQorCitkZWYgcmVnaXN0ZXJfbG9hZGVyX3R5cGUobG9hZGVyX3R5cGUsIHByb3ZpZGVyX2ZhY3RvcnkpOgorICAgICIiIlJlZ2lzdGVyIGBwcm92aWRlcl9mYWN0b3J5YCB0byBtYWtlIHByb3ZpZGVycyBmb3IgYGxvYWRlcl90eXBlYAorCisgICAgYGxvYWRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgYGBtb2R1bGUuX19sb2FkZXJfX2BgLAorICAgIGFuZCBgcHJvdmlkZXJfZmFjdG9yeWAgaXMgYSBmdW5jdGlvbiB0aGF0LCBwYXNzZWQgYSAqbW9kdWxlKiBvYmplY3QsCisgICAgcmV0dXJucyBhbiBgYElSZXNvdXJjZVByb3ZpZGVyYGAgZm9yIHRoYXQgbW9kdWxlLgorICAgICIiIgorICAgIF9wcm92aWRlcl9mYWN0b3JpZXNbbG9hZGVyX3R5cGVdID0gcHJvdmlkZXJfZmFjdG9yeQorCitkZWYgZ2V0X3Byb3ZpZGVyKG1vZHVsZU9yUmVxKToKKyAgICAiIiJSZXR1cm4gYW4gSVJlc291cmNlUHJvdmlkZXIgZm9yIHRoZSBuYW1lZCBtb2R1bGUgb3IgcmVxdWlyZW1lbnQiIiIKKyAgICBpZiBpc2luc3RhbmNlKG1vZHVsZU9yUmVxLFJlcXVpcmVtZW50KToKKyAgICAgICAgcmV0dXJuIHdvcmtpbmdfc2V0LmZpbmQobW9kdWxlT3JSZXEpIG9yIHJlcXVpcmUoc3RyKG1vZHVsZU9yUmVxKSlbMF0KKyAgICB0cnk6CisgICAgICAgIG1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZHVsZU9yUmVxXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgX19pbXBvcnRfXyhtb2R1bGVPclJlcSkKKyAgICAgICAgbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kdWxlT3JSZXFdCisgICAgbG9hZGVyID0gZ2V0YXR0cihtb2R1bGUsICdfX2xvYWRlcl9fJywgTm9uZSkKKyAgICByZXR1cm4gX2ZpbmRfYWRhcHRlcihfcHJvdmlkZXJfZmFjdG9yaWVzLCBsb2FkZXIpKG1vZHVsZSkKKworZGVmIF9tYWNvc3hfdmVycyhfY2FjaGU9W10pOgorICAgIGlmIG5vdCBfY2FjaGU6CisgICAgICAgIGluZm8gPSBvcy5wb3BlbignL3Vzci9iaW4vc3dfdmVycycpLnJlYWQoKS5zcGxpdGxpbmVzKCkKKyAgICAgICAgZm9yIGxpbmUgaW4gaW5mbzoKKyAgICAgICAgICAgIGtleSwgdmFsdWUgPSBsaW5lLnNwbGl0KE5vbmUsIDEpCisgICAgICAgICAgICBpZiBrZXkgPT0gJ1Byb2R1Y3RWZXJzaW9uOic6CisgICAgICAgICAgICAgICAgX2NhY2hlLmFwcGVuZCh2YWx1ZS5zdHJpcCgpLnNwbGl0KCIuIikpCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJXaGF0PyEiCisgICAgcmV0dXJuIF9jYWNoZVswXQorCitkZWYgX21hY29zeF9hcmNoKG1hY2hpbmUpOgorICAgIHJldHVybiB7J1Bvd2VyUEMnOidwcGMnLCAnUG93ZXJfTWFjaW50b3NoJzoncHBjJ30uZ2V0KG1hY2hpbmUsbWFjaGluZSkKKworZGVmIGdldF9idWlsZF9wbGF0Zm9ybSgpOgorICAgICIiIlJldHVybiB0aGlzIHBsYXRmb3JtJ3Mgc3RyaW5nIGZvciBwbGF0Zm9ybS1zcGVjaWZpYyBkaXN0cmlidXRpb25zCisKKyAgICBYWFggQ3VycmVudGx5IHRoaXMgaXMgdGhlIHNhbWUgYXMgYGBkaXN0dXRpbHMudXRpbC5nZXRfcGxhdGZvcm0oKWBgLCBidXQgaXQKKyAgICBuZWVkcyBzb21lIGhhY2tzIGZvciBMaW51eCBhbmQgTWFjIE9TIFguCisgICAgIiIiCisgICAgZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgZ2V0X3BsYXRmb3JtCisgICAgcGxhdCA9IGdldF9wbGF0Zm9ybSgpCisgICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iIGFuZCBub3QgcGxhdC5zdGFydHN3aXRoKCdtYWNvc3gtJyk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZlcnNpb24gPSBfbWFjb3N4X3ZlcnMoKQorICAgICAgICAgICAgbWFjaGluZSA9IG9zLnVuYW1lKClbNF0ucmVwbGFjZSgiICIsICJfIikKKyAgICAgICAgICAgIHJldHVybiAibWFjb3N4LSVkLiVkLSVzIiAlIChpbnQodmVyc2lvblswXSksIGludCh2ZXJzaW9uWzFdKSwKKyAgICAgICAgICAgICAgICBfbWFjb3N4X2FyY2gobWFjaGluZSkpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgIyBpZiBzb21lb25lIGlzIHJ1bm5pbmcgYSBub24tTWFjIGRhcndpbiBzeXN0ZW0sIHRoaXMgd2lsbCBmYWxsCisgICAgICAgICAgICAjIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIHBhc3MKKyAgICByZXR1cm4gcGxhdAorCittYWNvc1ZlcnNpb25TdHJpbmcgPSByZS5jb21waWxlKHIibWFjb3N4LShcZCspXC4oXGQrKS0oLiopIikKK2RhcndpblZlcnNpb25TdHJpbmcgPSByZS5jb21waWxlKHIiZGFyd2luLShcZCspXC4oXGQrKVwuKFxkKyktKC4qKSIpCitnZXRfcGxhdGZvcm0gPSBnZXRfYnVpbGRfcGxhdGZvcm0gICAjIFhYWCBiYWNrd2FyZCBjb21wYXQKKworZGVmIGNvbXBhdGlibGVfcGxhdGZvcm1zKHByb3ZpZGVkLHJlcXVpcmVkKToKKyAgICAiIiJDYW4gY29kZSBmb3IgdGhlIGBwcm92aWRlZGAgcGxhdGZvcm0gcnVuIG9uIHRoZSBgcmVxdWlyZWRgIHBsYXRmb3JtPworCisgICAgUmV0dXJucyB0cnVlIGlmIGVpdGhlciBwbGF0Zm9ybSBpcyBgYE5vbmVgYCwgb3IgdGhlIHBsYXRmb3JtcyBhcmUgZXF1YWwuCisKKyAgICBYWFggTmVlZHMgY29tcGF0aWJpbGl0eSBjaGVja3MgZm9yIExpbnV4IGFuZCBvdGhlciB1bml4eSBPU2VzLgorICAgICIiIgorICAgIGlmIHByb3ZpZGVkIGlzIE5vbmUgb3IgcmVxdWlyZWQgaXMgTm9uZSBvciBwcm92aWRlZD09cmVxdWlyZWQ6CisgICAgICAgIHJldHVybiBUcnVlICAgICAjIGVhc3kgY2FzZQorCisgICAgIyBNYWMgT1MgWCBzcGVjaWFsIGNhc2VzCisgICAgcmVxTWFjID0gbWFjb3NWZXJzaW9uU3RyaW5nLm1hdGNoKHJlcXVpcmVkKQorICAgIGlmIHJlcU1hYzoKKyAgICAgICAgcHJvdk1hYyA9IG1hY29zVmVyc2lvblN0cmluZy5tYXRjaChwcm92aWRlZCkKKworICAgICAgICAjIGlzIHRoaXMgYSBNYWMgcGFja2FnZT8KKyAgICAgICAgaWYgbm90IHByb3ZNYWM6CisgICAgICAgICAgICAjIHRoaXMgaXMgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHBhY2thZ2VzIGJ1aWx0IGJlZm9yZQorICAgICAgICAgICAgIyBzZXR1cHRvb2xzIDAuNi4gQWxsIHBhY2thZ2VzIGJ1aWx0IGFmdGVyIHRoaXMgcG9pbnQgd2lsbAorICAgICAgICAgICAgIyB1c2UgdGhlIG5ldyBtYWNvc3ggZGVzaWduYXRpb24uCisgICAgICAgICAgICBwcm92RGFyd2luID0gZGFyd2luVmVyc2lvblN0cmluZy5tYXRjaChwcm92aWRlZCkKKyAgICAgICAgICAgIGlmIHByb3ZEYXJ3aW46CisgICAgICAgICAgICAgICAgZHZlcnNpb24gPSBpbnQocHJvdkRhcndpbi5ncm91cCgxKSkKKyAgICAgICAgICAgICAgICBtYWNvc3ZlcnNpb24gPSAiJXMuJXMiICUgKHJlcU1hYy5ncm91cCgxKSwgcmVxTWFjLmdyb3VwKDIpKQorICAgICAgICAgICAgICAgIGlmIGR2ZXJzaW9uID09IDcgYW5kIG1hY29zdmVyc2lvbiA+PSAiMTAuMyIgb3IgXAorICAgICAgICAgICAgICAgICAgICBkdmVyc2lvbiA9PSA4IGFuZCBtYWNvc3ZlcnNpb24gPj0gIjEwLjQiOgorCisgICAgICAgICAgICAgICAgICAgICNpbXBvcnQgd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgI3dhcm5pbmdzLndhcm4oIk1hYyBlZ2dzIHNob3VsZCBiZSByZWJ1aWx0IHRvICIKKyAgICAgICAgICAgICAgICAgICAgIyAgICAidXNlIHRoZSBtYWNvc3ggZGVzaWduYXRpb24gaW5zdGVhZCBvZiBkYXJ3aW4uIiwKKyAgICAgICAgICAgICAgICAgICAgIyAgICBjYXRlZ29yeT1EZXByZWNhdGlvbldhcm5pbmcpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgICAgICByZXR1cm4gRmFsc2UgICAgIyBlZ2cgaXNuJ3QgbWFjb3N4IG9yIGxlZ2FjeSBkYXJ3aW4KKworICAgICAgICAjIGFyZSB0aGV5IHRoZSBzYW1lIG1ham9yIHZlcnNpb24gYW5kIG1hY2hpbmUgdHlwZT8KKyAgICAgICAgaWYgcHJvdk1hYy5ncm91cCgxKSAhPSByZXFNYWMuZ3JvdXAoMSkgb3IgXAorICAgICAgICAgICAgcHJvdk1hYy5ncm91cCgzKSAhPSByZXFNYWMuZ3JvdXAoMyk6CisgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworCisKKyAgICAgICAgIyBpcyB0aGUgcmVxdWlyZWQgT1MgbWFqb3IgdXBkYXRlID49IHRoZSBwcm92aWRlZCBvbmU/CisgICAgICAgIGlmIGludChwcm92TWFjLmdyb3VwKDIpKSA+IGludChyZXFNYWMuZ3JvdXAoMikpOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAgICAgcmV0dXJuIFRydWUKKworICAgICMgWFhYIExpbnV4IGFuZCBvdGhlciBwbGF0Zm9ybXMnIHNwZWNpYWwgY2FzZXMgc2hvdWxkIGdvIGhlcmUKKyAgICByZXR1cm4gRmFsc2UKKworCitkZWYgcnVuX3NjcmlwdChkaXN0X3NwZWMsIHNjcmlwdF9uYW1lKToKKyAgICAiIiJMb2NhdGUgZGlzdHJpYnV0aW9uIGBkaXN0X3NwZWNgIGFuZCBydW4gaXRzIGBzY3JpcHRfbmFtZWAgc2NyaXB0IiIiCisgICAgbnMgPSBzeXMuX2dldGZyYW1lKDEpLmZfZ2xvYmFscworICAgIG5hbWUgPSBuc1snX19uYW1lX18nXQorICAgIG5zLmNsZWFyKCkKKyAgICBuc1snX19uYW1lX18nXSA9IG5hbWUKKyAgICByZXF1aXJlKGRpc3Rfc3BlYylbMF0ucnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbnMpCisKK3J1bl9tYWluID0gcnVuX3NjcmlwdCAgICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorCitkZWYgZ2V0X2Rpc3RyaWJ1dGlvbihkaXN0KToKKyAgICAiIiJSZXR1cm4gYSBjdXJyZW50IGRpc3RyaWJ1dGlvbiBvYmplY3QgZm9yIGEgUmVxdWlyZW1lbnQgb3Igc3RyaW5nIiIiCisgICAgaWYgaXNpbnN0YW5jZShkaXN0LGJhc2VzdHJpbmcpOiBkaXN0ID0gUmVxdWlyZW1lbnQucGFyc2UoZGlzdCkKKyAgICBpZiBpc2luc3RhbmNlKGRpc3QsUmVxdWlyZW1lbnQpOiBkaXN0ID0gZ2V0X3Byb3ZpZGVyKGRpc3QpCisgICAgaWYgbm90IGlzaW5zdGFuY2UoZGlzdCxEaXN0cmlidXRpb24pOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkV4cGVjdGVkIHN0cmluZywgUmVxdWlyZW1lbnQsIG9yIERpc3RyaWJ1dGlvbiIsIGRpc3QpCisgICAgcmV0dXJuIGRpc3QKKworZGVmIGxvYWRfZW50cnlfcG9pbnQoZGlzdCwgZ3JvdXAsIG5hbWUpOgorICAgICIiIlJldHVybiBgbmFtZWAgZW50cnkgcG9pbnQgb2YgYGdyb3VwYCBmb3IgYGRpc3RgIG9yIHJhaXNlIEltcG9ydEVycm9yIiIiCisgICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkubG9hZF9lbnRyeV9wb2ludChncm91cCwgbmFtZSkKKworZGVmIGdldF9lbnRyeV9tYXAoZGlzdCwgZ3JvdXA9Tm9uZSk6CisgICAgIiIiUmV0dXJuIHRoZSBlbnRyeSBwb2ludCBtYXAgZm9yIGBncm91cGAsIG9yIHRoZSBmdWxsIGVudHJ5IG1hcCIiIgorICAgIHJldHVybiBnZXRfZGlzdHJpYnV0aW9uKGRpc3QpLmdldF9lbnRyeV9tYXAoZ3JvdXApCisKK2RlZiBnZXRfZW50cnlfaW5mbyhkaXN0LCBncm91cCwgbmFtZSk6CisgICAgIiIiUmV0dXJuIHRoZSBFbnRyeVBvaW50IG9iamVjdCBmb3IgYGdyb3VwYCtgbmFtZWAsIG9yIGBgTm9uZWBgIiIiCisgICAgcmV0dXJuIGdldF9kaXN0cmlidXRpb24oZGlzdCkuZ2V0X2VudHJ5X2luZm8oZ3JvdXAsIG5hbWUpCisKKwordHJ5OgorICAgIGZyb20gcGtndXRpbCBpbXBvcnQgZ2V0X2ltcG9ydGVyCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgaW1wb3J0IF9wa2d1dGlsIGFzIHBrZ3V0aWwKKyAgICBnZXRfaW1wb3J0ZXIgPSBwa2d1dGlsLmdldF9pbXBvcnRlcgorZWxzZToKKyAgICBpbXBvcnQgcGtndXRpbAorCisKK2NsYXNzIElNZXRhZGF0YVByb3ZpZGVyOgorCisgICAgZGVmIGhhc19tZXRhZGF0YShuYW1lKToKKyAgICAgICAgIiIiRG9lcyB0aGUgcGFja2FnZSdzIGRpc3RyaWJ1dGlvbiBjb250YWluIHRoZSBuYW1lZCBtZXRhZGF0YT8iIiIKKworICAgIGRlZiBnZXRfbWV0YWRhdGEobmFtZSk6CisgICAgICAgICIiIlRoZSBuYW1lZCBtZXRhZGF0YSByZXNvdXJjZSBhcyBhIHN0cmluZyIiIgorCisgICAgZGVmIGdldF9tZXRhZGF0YV9saW5lcyhuYW1lKToKKyAgICAgICAgIiIiWWllbGQgbmFtZWQgbWV0YWRhdGEgcmVzb3VyY2UgYXMgbGlzdCBvZiBub24tYmxhbmsgbm9uLWNvbW1lbnQgbGluZXMKKworICAgICAgIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaXMgc3RyaXBwZWQgZnJvbSBlYWNoIGxpbmUsIGFuZCBsaW5lcworICAgICAgIHdpdGggYGAjYGAgYXMgdGhlIGZpcnN0IG5vbi1ibGFuayBjaGFyYWN0ZXIgYXJlIG9taXR0ZWQuIiIiCisKKyAgICBkZWYgbWV0YWRhdGFfaXNkaXIobmFtZSk6CisgICAgICAgICIiIklzIHRoZSBuYW1lZCBtZXRhZGF0YSBhIGRpcmVjdG9yeT8gIChsaWtlIGBgb3MucGF0aC5pc2RpcigpYGApIiIiCisKKyAgICBkZWYgbWV0YWRhdGFfbGlzdGRpcihuYW1lKToKKyAgICAgICAgIiIiTGlzdCBvZiBtZXRhZGF0YSBuYW1lcyBpbiB0aGUgZGlyZWN0b3J5IChsaWtlIGBgb3MubGlzdGRpcigpYGApIiIiCisKKyAgICBkZWYgcnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbmFtZXNwYWNlKToKKyAgICAgICAgIiIiRXhlY3V0ZSB0aGUgbmFtZWQgc2NyaXB0IGluIHRoZSBzdXBwbGllZCBuYW1lc3BhY2UgZGljdGlvbmFyeSIiIgorCisKKworCisKKworCisKKworCitjbGFzcyBJUmVzb3VyY2VQcm92aWRlcihJTWV0YWRhdGFQcm92aWRlcik6CisgICAgIiIiQW4gb2JqZWN0IHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHBhY2thZ2UgcmVzb3VyY2VzIiIiCisKKyAgICBkZWYgZ2V0X3Jlc291cmNlX2ZpbGVuYW1lKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgorICAgICAgICAiIiJSZXR1cm4gYSB0cnVlIGZpbGVzeXN0ZW0gcGF0aCBmb3IgYHJlc291cmNlX25hbWVgCisKKyAgICAgICAgYG1hbmFnZXJgIG11c3QgYmUgYW4gYGBJUmVzb3VyY2VNYW5hZ2VyYGAiIiIKKworICAgIGRlZiBnZXRfcmVzb3VyY2Vfc3RyZWFtKG1hbmFnZXIsIHJlc291cmNlX25hbWUpOgorICAgICAgICAiIiJSZXR1cm4gYSByZWFkYWJsZSBmaWxlLWxpa2Ugb2JqZWN0IGZvciBgcmVzb3VyY2VfbmFtZWAKKworICAgICAgICBgbWFuYWdlcmAgbXVzdCBiZSBhbiBgYElSZXNvdXJjZU1hbmFnZXJgYCIiIgorCisgICAgZGVmIGdldF9yZXNvdXJjZV9zdHJpbmcobWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgICIiIlJldHVybiBhIHN0cmluZyBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZiBgcmVzb3VyY2VfbmFtZWAKKworICAgICAgICBgbWFuYWdlcmAgbXVzdCBiZSBhbiBgYElSZXNvdXJjZU1hbmFnZXJgYCIiIgorCisgICAgZGVmIGhhc19yZXNvdXJjZShyZXNvdXJjZV9uYW1lKToKKyAgICAgICAgIiIiRG9lcyB0aGUgcGFja2FnZSBjb250YWluIHRoZSBuYW1lZCByZXNvdXJjZT8iIiIKKworICAgIGRlZiByZXNvdXJjZV9pc2RpcihyZXNvdXJjZV9uYW1lKToKKyAgICAgICAgIiIiSXMgdGhlIG5hbWVkIHJlc291cmNlIGEgZGlyZWN0b3J5PyAgKGxpa2UgYGBvcy5wYXRoLmlzZGlyKClgYCkiIiIKKworICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHJlc291cmNlX25hbWUpOgorICAgICAgICAiIiJMaXN0IG9mIHJlc291cmNlIG5hbWVzIGluIHRoZSBkaXJlY3RvcnkgKGxpa2UgYGBvcy5saXN0ZGlyKClgYCkiIiIKKworCisKKworCisKKworCisKKworCisKKworCisKK2NsYXNzIFdvcmtpbmdTZXQob2JqZWN0KToKKyAgICAiIiJBIGNvbGxlY3Rpb24gb2YgYWN0aXZlIGRpc3RyaWJ1dGlvbnMgb24gc3lzLnBhdGggKG9yIGEgc2ltaWxhciBsaXN0KSIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGVudHJpZXM9Tm9uZSk6CisgICAgICAgICIiIkNyZWF0ZSB3b3JraW5nIHNldCBmcm9tIGxpc3Qgb2YgcGF0aCBlbnRyaWVzIChkZWZhdWx0PXN5cy5wYXRoKSIiIgorICAgICAgICBzZWxmLmVudHJpZXMgPSBbXQorICAgICAgICBzZWxmLmVudHJ5X2tleXMgPSB7fQorICAgICAgICBzZWxmLmJ5X2tleSA9IHt9CisgICAgICAgIHNlbGYuY2FsbGJhY2tzID0gW10KKworICAgICAgICBpZiBlbnRyaWVzIGlzIE5vbmU6CisgICAgICAgICAgICBlbnRyaWVzID0gc3lzLnBhdGgKKworICAgICAgICBmb3IgZW50cnkgaW4gZW50cmllczoKKyAgICAgICAgICAgIHNlbGYuYWRkX2VudHJ5KGVudHJ5KQorCisKKyAgICBkZWYgYWRkX2VudHJ5KHNlbGYsIGVudHJ5KToKKyAgICAgICAgIiIiQWRkIGEgcGF0aCBpdGVtIHRvIGBgLmVudHJpZXNgYCwgZmluZGluZyBhbnkgZGlzdHJpYnV0aW9ucyBvbiBpdAorCisgICAgICAgIGBgZmluZF9kaXN0cmlidXRpb25zKGVudHJ5LEZhbHNlKWBgIGlzIHVzZWQgdG8gZmluZCBkaXN0cmlidXRpb25zCisgICAgICAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHBhdGggZW50cnksIGFuZCB0aGV5IGFyZSBhZGRlZC4gIGBlbnRyeWAgaXMKKyAgICAgICAgYWx3YXlzIGFwcGVuZGVkIHRvIGBgLmVudHJpZXNgYCwgZXZlbiBpZiBpdCBpcyBhbHJlYWR5IHByZXNlbnQuCisgICAgICAgIChUaGlzIGlzIGJlY2F1c2UgYGBzeXMucGF0aGBgIGNhbiBjb250YWluIHRoZSBzYW1lIHZhbHVlIG1vcmUgdGhhbgorICAgICAgICBvbmNlLCBhbmQgdGhlIGBgLmVudHJpZXNgYCBvZiB0aGUgYGBzeXMucGF0aGBgIFdvcmtpbmdTZXQgc2hvdWxkIGFsd2F5cworICAgICAgICBlcXVhbCBgYHN5cy5wYXRoYGAuKQorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5lbnRyeV9rZXlzLnNldGRlZmF1bHQoZW50cnksIFtdKQorICAgICAgICBzZWxmLmVudHJpZXMuYXBwZW5kKGVudHJ5KQorICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMoZW50cnksIFRydWUpOgorICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCwgZW50cnksIEZhbHNlKQorCisKKyAgICBkZWYgX19jb250YWluc19fKHNlbGYsZGlzdCk6CisgICAgICAgICIiIlRydWUgaWYgYGRpc3RgIGlzIHRoZSBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciBpdHMgcHJvamVjdCIiIgorICAgICAgICByZXR1cm4gc2VsZi5ieV9rZXkuZ2V0KGRpc3Qua2V5KSA9PSBkaXN0CisKKworCisKKworICAgIGRlZiBmaW5kKHNlbGYsIHJlcSk6CisgICAgICAgICIiIkZpbmQgYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgcmVxdWlyZW1lbnQgYHJlcWAKKworICAgICAgICBJZiB0aGVyZSBpcyBhbiBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcmVxdWVzdGVkIHByb2plY3QsIHRoaXMKKyAgICAgICAgcmV0dXJucyBpdCBhcyBsb25nIGFzIGl0IG1lZXRzIHRoZSB2ZXJzaW9uIHJlcXVpcmVtZW50IHNwZWNpZmllZCBieQorICAgICAgICBgcmVxYC4gIEJ1dCwgaWYgdGhlcmUgaXMgYW4gYWN0aXZlIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHByb2plY3QgYW5kIGl0CisgICAgICAgIGRvZXMgKm5vdCogbWVldCB0aGUgYHJlcWAgcmVxdWlyZW1lbnQsIGBgVmVyc2lvbkNvbmZsaWN0YGAgaXMgcmFpc2VkLgorICAgICAgICBJZiB0aGVyZSBpcyBubyBhY3RpdmUgZGlzdHJpYnV0aW9uIGZvciB0aGUgcmVxdWVzdGVkIHByb2plY3QsIGBgTm9uZWBgCisgICAgICAgIGlzIHJldHVybmVkLgorICAgICAgICAiIiIKKyAgICAgICAgZGlzdCA9IHNlbGYuYnlfa2V5LmdldChyZXEua2V5KQorICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lIGFuZCBkaXN0IG5vdCBpbiByZXE6CisgICAgICAgICAgICByYWlzZSBWZXJzaW9uQ29uZmxpY3QoZGlzdCxyZXEpICAgICAjIFhYWCBhZGQgbW9yZSBpbmZvCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gZGlzdAorCisgICAgZGVmIGl0ZXJfZW50cnlfcG9pbnRzKHNlbGYsIGdyb3VwLCBuYW1lPU5vbmUpOgorICAgICAgICAiIiJZaWVsZCBlbnRyeSBwb2ludCBvYmplY3RzIGZyb20gYGdyb3VwYCBtYXRjaGluZyBgbmFtZWAKKworICAgICAgICBJZiBgbmFtZWAgaXMgTm9uZSwgeWllbGRzIGFsbCBlbnRyeSBwb2ludHMgaW4gYGdyb3VwYCBmcm9tIGFsbAorICAgICAgICBkaXN0cmlidXRpb25zIGluIHRoZSB3b3JraW5nIHNldCwgb3RoZXJ3aXNlIG9ubHkgb25lcyBtYXRjaGluZworICAgICAgICBib3RoIGBncm91cGAgYW5kIGBuYW1lYCBhcmUgeWllbGRlZCAoaW4gZGlzdHJpYnV0aW9uIG9yZGVyKS4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBkaXN0IGluIHNlbGY6CisgICAgICAgICAgICBlbnRyaWVzID0gZGlzdC5nZXRfZW50cnlfbWFwKGdyb3VwKQorICAgICAgICAgICAgaWYgbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgICAgIGZvciBlcCBpbiBlbnRyaWVzLnZhbHVlcygpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBlcAorICAgICAgICAgICAgZWxpZiBuYW1lIGluIGVudHJpZXM6CisgICAgICAgICAgICAgICAgeWllbGQgZW50cmllc1tuYW1lXQorCisgICAgZGVmIHJ1bl9zY3JpcHQoc2VsZiwgcmVxdWlyZXMsIHNjcmlwdF9uYW1lKToKKyAgICAgICAgIiIiTG9jYXRlIGRpc3RyaWJ1dGlvbiBmb3IgYHJlcXVpcmVzYCBhbmQgcnVuIGBzY3JpcHRfbmFtZWAgc2NyaXB0IiIiCisgICAgICAgIG5zID0gc3lzLl9nZXRmcmFtZSgxKS5mX2dsb2JhbHMKKyAgICAgICAgbmFtZSA9IG5zWydfX25hbWVfXyddCisgICAgICAgIG5zLmNsZWFyKCkKKyAgICAgICAgbnNbJ19fbmFtZV9fJ10gPSBuYW1lCisgICAgICAgIHNlbGYucmVxdWlyZShyZXF1aXJlcylbMF0ucnVuX3NjcmlwdChzY3JpcHRfbmFtZSwgbnMpCisKKworCisgICAgZGVmIF9faXRlcl9fKHNlbGYpOgorICAgICAgICAiIiJZaWVsZCBkaXN0cmlidXRpb25zIGZvciBub24tZHVwbGljYXRlIHByb2plY3RzIGluIHRoZSB3b3JraW5nIHNldAorCisgICAgICAgIFRoZSB5aWVsZCBvcmRlciBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIGl0ZW1zJyBwYXRoIGVudHJpZXMgd2VyZQorICAgICAgICBhZGRlZCB0byB0aGUgd29ya2luZyBzZXQuCisgICAgICAgICIiIgorICAgICAgICBzZWVuID0ge30KKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5lbnRyaWVzOgorICAgICAgICAgICAgZm9yIGtleSBpbiBzZWxmLmVudHJ5X2tleXNbaXRlbV06CisgICAgICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBzZWVuOgorICAgICAgICAgICAgICAgICAgICBzZWVuW2tleV09MQorICAgICAgICAgICAgICAgICAgICB5aWVsZCBzZWxmLmJ5X2tleVtrZXldCisKKyAgICBkZWYgYWRkKHNlbGYsIGRpc3QsIGVudHJ5PU5vbmUsIGluc2VydD1UcnVlKToKKyAgICAgICAgIiIiQWRkIGBkaXN0YCB0byB3b3JraW5nIHNldCwgYXNzb2NpYXRlZCB3aXRoIGBlbnRyeWAKKworICAgICAgICBJZiBgZW50cnlgIGlzIHVuc3BlY2lmaWVkLCBpdCBkZWZhdWx0cyB0byB0aGUgYGAubG9jYXRpb25gYCBvZiBgZGlzdGAuCisgICAgICAgIE9uIGV4aXQgZnJvbSB0aGlzIHJvdXRpbmUsIGBlbnRyeWAgaXMgYWRkZWQgdG8gdGhlIGVuZCBvZiB0aGUgd29ya2luZworICAgICAgICBzZXQncyBgYC5lbnRyaWVzYGAgKGlmIGl0IHdhc24ndCBhbHJlYWR5IHByZXNlbnQpLgorCisgICAgICAgIGBkaXN0YCBpcyBvbmx5IGFkZGVkIHRvIHRoZSB3b3JraW5nIHNldCBpZiBpdCdzIGZvciBhIHByb2plY3QgdGhhdAorICAgICAgICBkb2Vzbid0IGFscmVhZHkgaGF2ZSBhIGRpc3RyaWJ1dGlvbiBpbiB0aGUgc2V0LiAgSWYgaXQncyBhZGRlZCwgYW55CisgICAgICAgIGNhbGxiYWNrcyByZWdpc3RlcmVkIHdpdGggdGhlIGBgc3Vic2NyaWJlKClgYCBtZXRob2Qgd2lsbCBiZSBjYWxsZWQuCisgICAgICAgICIiIgorICAgICAgICBpZiBpbnNlcnQ6CisgICAgICAgICAgICBkaXN0Lmluc2VydF9vbihzZWxmLmVudHJpZXMsIGVudHJ5KQorCisgICAgICAgIGlmIGVudHJ5IGlzIE5vbmU6CisgICAgICAgICAgICBlbnRyeSA9IGRpc3QubG9jYXRpb24KKyAgICAgICAga2V5cyA9IHNlbGYuZW50cnlfa2V5cy5zZXRkZWZhdWx0KGVudHJ5LFtdKQorCisgICAgICAgIGlmIGRpc3Qua2V5IGluIHNlbGYuYnlfa2V5OgorICAgICAgICAgICAgcmV0dXJuICAgICAgIyBpZ25vcmUgaGlkZGVuIGRpc3Ryb3MKKworICAgICAgICBzZWxmLmJ5X2tleVtkaXN0LmtleV0gPSBkaXN0CisgICAgICAgIGlmIGRpc3Qua2V5IG5vdCBpbiBrZXlzOgorICAgICAgICAgICAga2V5cy5hcHBlbmQoZGlzdC5rZXkpCisKKyAgICAgICAgc2VsZi5fYWRkZWRfbmV3KGRpc3QpCisKKworICAgIGRlZiByZXNvbHZlKHNlbGYsIHJlcXVpcmVtZW50cywgZW52PU5vbmUsIGluc3RhbGxlcj1Ob25lKToKKyAgICAgICAgIiIiTGlzdCBhbGwgZGlzdHJpYnV0aW9ucyBuZWVkZWQgdG8gKHJlY3Vyc2l2ZWx5KSBtZWV0IGByZXF1aXJlbWVudHNgCisKKyAgICAgICAgYHJlcXVpcmVtZW50c2AgbXVzdCBiZSBhIHNlcXVlbmNlIG9mIGBgUmVxdWlyZW1lbnRgYCBvYmplY3RzLiAgYGVudmAsCisgICAgICAgIGlmIHN1cHBsaWVkLCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgIGluc3RhbmNlLiAgSWYKKyAgICAgICAgbm90IHN1cHBsaWVkLCBpdCBkZWZhdWx0cyB0byBhbGwgZGlzdHJpYnV0aW9ucyBhdmFpbGFibGUgd2l0aGluIGFueQorICAgICAgICBlbnRyeSBvciBkaXN0cmlidXRpb24gaW4gdGhlIHdvcmtpbmcgc2V0LiAgYGluc3RhbGxlcmAsIGlmIHN1cHBsaWVkLAorICAgICAgICB3aWxsIGJlIGludm9rZWQgd2l0aCBlYWNoIHJlcXVpcmVtZW50IHRoYXQgY2Fubm90IGJlIG1ldCBieSBhbgorICAgICAgICBhbHJlYWR5LWluc3RhbGxlZCBkaXN0cmlidXRpb247IGl0IHNob3VsZCByZXR1cm4gYSBgYERpc3RyaWJ1dGlvbmBgIG9yCisgICAgICAgIGBgTm9uZWBgLgorICAgICAgICAiIiIKKworICAgICAgICByZXF1aXJlbWVudHMgPSBsaXN0KHJlcXVpcmVtZW50cylbOjotMV0gICMgc2V0IHVwIHRoZSBzdGFjaworICAgICAgICBwcm9jZXNzZWQgPSB7fSAgIyBzZXQgb2YgcHJvY2Vzc2VkIHJlcXVpcmVtZW50cworICAgICAgICBiZXN0ID0ge30gICMga2V5IC0+IGRpc3QKKyAgICAgICAgdG9fYWN0aXZhdGUgPSBbXQorCisgICAgICAgIHdoaWxlIHJlcXVpcmVtZW50czoKKyAgICAgICAgICAgIHJlcSA9IHJlcXVpcmVtZW50cy5wb3AoMCkgICAjIHByb2Nlc3MgZGVwZW5kZW5jaWVzIGJyZWFkdGgtZmlyc3QKKyAgICAgICAgICAgIGlmIHJlcSBpbiBwcm9jZXNzZWQ6CisgICAgICAgICAgICAgICAgIyBJZ25vcmUgY3ljbGljIG9yIHJlZHVuZGFudCBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZGlzdCA9IGJlc3QuZ2V0KHJlcS5rZXkpCisgICAgICAgICAgICBpZiBkaXN0IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgIyBGaW5kIHRoZSBiZXN0IGRpc3RyaWJ1dGlvbiBhbmQgYWRkIGl0IHRvIHRoZSBtYXAKKyAgICAgICAgICAgICAgICBkaXN0ID0gc2VsZi5ieV9rZXkuZ2V0KHJlcS5rZXkpCisgICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBpZiBlbnYgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudiA9IEVudmlyb25tZW50KHNlbGYuZW50cmllcykKKyAgICAgICAgICAgICAgICAgICAgZGlzdCA9IGJlc3RbcmVxLmtleV0gPSBlbnYuYmVzdF9tYXRjaChyZXEsIHNlbGYsIGluc3RhbGxlcikKKyAgICAgICAgICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHJpYnV0aW9uTm90Rm91bmQocmVxKSAgIyBYWFggcHV0IG1vcmUgaW5mbyBoZXJlCisgICAgICAgICAgICAgICAgdG9fYWN0aXZhdGUuYXBwZW5kKGRpc3QpCisgICAgICAgICAgICBpZiBkaXN0IG5vdCBpbiByZXE6CisgICAgICAgICAgICAgICAgIyBPb3BzLCB0aGUgImJlc3QiIHNvIGZhciBjb25mbGljdHMgd2l0aCBhIGRlcGVuZGVuY3kKKyAgICAgICAgICAgICAgICByYWlzZSBWZXJzaW9uQ29uZmxpY3QoZGlzdCxyZXEpICMgWFhYIHB1dCBtb3JlIGluZm8gaGVyZQorICAgICAgICAgICAgcmVxdWlyZW1lbnRzLmV4dGVuZChkaXN0LnJlcXVpcmVzKHJlcS5leHRyYXMpWzo6LTFdKQorICAgICAgICAgICAgcHJvY2Vzc2VkW3JlcV0gPSBUcnVlCisKKyAgICAgICAgcmV0dXJuIHRvX2FjdGl2YXRlICAgICMgcmV0dXJuIGxpc3Qgb2YgZGlzdHJvcyB0byBhY3RpdmF0ZQorCisgICAgZGVmIGZpbmRfcGx1Z2lucyhzZWxmLAorICAgICAgICBwbHVnaW5fZW52LCBmdWxsX2Vudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSwgZmFsbGJhY2s9VHJ1ZQorICAgICk6CisgICAgICAgICIiIkZpbmQgYWxsIGFjdGl2YXRhYmxlIGRpc3RyaWJ1dGlvbnMgaW4gYHBsdWdpbl9lbnZgCisKKyAgICAgICAgRXhhbXBsZSB1c2FnZTo6CisKKyAgICAgICAgICAgIGRpc3RyaWJ1dGlvbnMsIGVycm9ycyA9IHdvcmtpbmdfc2V0LmZpbmRfcGx1Z2lucygKKyAgICAgICAgICAgICAgICBFbnZpcm9ubWVudChwbHVnaW5fZGlybGlzdCkKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIG1hcCh3b3JraW5nX3NldC5hZGQsIGRpc3RyaWJ1dGlvbnMpICAjIGFkZCBwbHVnaW5zK2xpYnMgdG8gc3lzLnBhdGgKKyAgICAgICAgICAgIHByaW50ICJDb3VsZG4ndCBsb2FkIiwgZXJyb3JzICAgICAgICAjIGRpc3BsYXkgZXJyb3JzCisKKyAgICAgICAgVGhlIGBwbHVnaW5fZW52YCBzaG91bGQgYmUgYW4gYGBFbnZpcm9ubWVudGBgIGluc3RhbmNlIHRoYXQgY29udGFpbnMKKyAgICAgICAgb25seSBkaXN0cmlidXRpb25zIHRoYXQgYXJlIGluIHRoZSBwcm9qZWN0J3MgInBsdWdpbiBkaXJlY3RvcnkiIG9yCisgICAgICAgIGRpcmVjdG9yaWVzLiBUaGUgYGZ1bGxfZW52YCwgaWYgc3VwcGxpZWQsIHNob3VsZCBiZSBhbiBgYEVudmlyb25tZW50YGAKKyAgICAgICAgY29udGFpbnMgYWxsIGN1cnJlbnRseS1hdmFpbGFibGUgZGlzdHJpYnV0aW9ucy4gIElmIGBmdWxsX2VudmAgaXMgbm90CisgICAgICAgIHN1cHBsaWVkLCBvbmUgaXMgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlIGBgV29ya2luZ1NldGBgIHRoaXMKKyAgICAgICAgbWV0aG9kIGlzIGNhbGxlZCBvbiwgd2hpY2ggd2lsbCB0eXBpY2FsbHkgbWVhbiB0aGF0IGV2ZXJ5IGRpcmVjdG9yeSBvbgorICAgICAgICBgYHN5cy5wYXRoYGAgd2lsbCBiZSBzY2FubmVkIGZvciBkaXN0cmlidXRpb25zLgorCisgICAgICAgIGBpbnN0YWxsZXJgIGlzIGEgc3RhbmRhcmQgaW5zdGFsbGVyIGNhbGxiYWNrIGFzIHVzZWQgYnkgdGhlCisgICAgICAgIGBgcmVzb2x2ZSgpYGAgbWV0aG9kLiBUaGUgYGZhbGxiYWNrYCBmbGFnIGluZGljYXRlcyB3aGV0aGVyIHdlIHNob3VsZAorICAgICAgICBhdHRlbXB0IHRvIHJlc29sdmUgb2xkZXIgdmVyc2lvbnMgb2YgYSBwbHVnaW4gaWYgdGhlIG5ld2VzdCB2ZXJzaW9uCisgICAgICAgIGNhbm5vdCBiZSByZXNvbHZlZC4KKworICAgICAgICBUaGlzIG1ldGhvZCByZXR1cm5zIGEgMi10dXBsZTogKGBkaXN0cmlidXRpb25zYCwgYGVycm9yX2luZm9gKSwgd2hlcmUKKyAgICAgICAgYGRpc3RyaWJ1dGlvbnNgIGlzIGEgbGlzdCBvZiB0aGUgZGlzdHJpYnV0aW9ucyBmb3VuZCBpbiBgcGx1Z2luX2VudmAKKyAgICAgICAgdGhhdCB3ZXJlIGxvYWRhYmxlLCBhbG9uZyB3aXRoIGFueSBvdGhlciBkaXN0cmlidXRpb25zIHRoYXQgYXJlIG5lZWRlZAorICAgICAgICB0byByZXNvbHZlIHRoZWlyIGRlcGVuZGVuY2llcy4gIGBlcnJvcl9pbmZvYCBpcyBhIGRpY3Rpb25hcnkgbWFwcGluZworICAgICAgICB1bmxvYWRhYmxlIHBsdWdpbiBkaXN0cmlidXRpb25zIHRvIGFuIGV4Y2VwdGlvbiBpbnN0YW5jZSBkZXNjcmliaW5nIHRoZQorICAgICAgICBlcnJvciB0aGF0IG9jY3VycmVkLiBVc3VhbGx5IHRoaXMgd2lsbCBiZSBhIGBgRGlzdHJpYnV0aW9uTm90Rm91bmRgYCBvcgorICAgICAgICBgYFZlcnNpb25Db25mbGljdGBgIGluc3RhbmNlLgorICAgICAgICAiIiIKKworICAgICAgICBwbHVnaW5fcHJvamVjdHMgPSBsaXN0KHBsdWdpbl9lbnYpCisgICAgICAgIHBsdWdpbl9wcm9qZWN0cy5zb3J0KCkgICMgc2NhbiBwcm9qZWN0IG5hbWVzIGluIGFscGhhYmV0aWMgb3JkZXIKKworICAgICAgICBlcnJvcl9pbmZvID0ge30KKyAgICAgICAgZGlzdHJpYnV0aW9ucyA9IHt9CisKKyAgICAgICAgaWYgZnVsbF9lbnYgaXMgTm9uZToKKyAgICAgICAgICAgIGVudiA9IEVudmlyb25tZW50KHNlbGYuZW50cmllcykKKyAgICAgICAgICAgIGVudiArPSBwbHVnaW5fZW52CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlbnYgPSBmdWxsX2VudiArIHBsdWdpbl9lbnYKKworICAgICAgICBzaGFkb3dfc2V0ID0gc2VsZi5fX2NsYXNzX18oW10pCisgICAgICAgIG1hcChzaGFkb3dfc2V0LmFkZCwgc2VsZikgICAjIHB1dCBhbGwgb3VyIGVudHJpZXMgaW4gc2hhZG93X3NldAorCisgICAgICAgIGZvciBwcm9qZWN0X25hbWUgaW4gcGx1Z2luX3Byb2plY3RzOgorCisgICAgICAgICAgICBmb3IgZGlzdCBpbiBwbHVnaW5fZW52W3Byb2plY3RfbmFtZV06CisKKyAgICAgICAgICAgICAgICByZXEgPSBbZGlzdC5hc19yZXF1aXJlbWVudCgpXQorCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICByZXNvbHZlZXMgPSBzaGFkb3dfc2V0LnJlc29sdmUocmVxLCBlbnYsIGluc3RhbGxlcikKKworICAgICAgICAgICAgICAgIGV4Y2VwdCBSZXNvbHV0aW9uRXJyb3IsdjoKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JfaW5mb1tkaXN0XSA9IHYgICAgIyBzYXZlIGVycm9yIGluZm8KKyAgICAgICAgICAgICAgICAgICAgaWYgZmFsbGJhY2s6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAgICAjIHRyeSB0aGUgbmV4dCBvbGRlciB2ZXJzaW9uIG9mIHByb2plY3QKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrICAgICAgICMgZ2l2ZSB1cCBvbiB0aGlzIHByb2plY3QsIGtlZXAgZ29pbmcKKworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1hcChzaGFkb3dfc2V0LmFkZCwgcmVzb2x2ZWVzKQorICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25zLnVwZGF0ZShkaWN0LmZyb21rZXlzKHJlc29sdmVlcykpCisKKyAgICAgICAgICAgICAgICAgICAgIyBzdWNjZXNzLCBubyBuZWVkIHRvIHRyeSBhbnkgbW9yZSB2ZXJzaW9ucyBvZiB0aGlzIHByb2plY3QKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgICAgICBkaXN0cmlidXRpb25zID0gbGlzdChkaXN0cmlidXRpb25zKQorICAgICAgICBkaXN0cmlidXRpb25zLnNvcnQoKQorCisgICAgICAgIHJldHVybiBkaXN0cmlidXRpb25zLCBlcnJvcl9pbmZvCisKKworCisKKworICAgIGRlZiByZXF1aXJlKHNlbGYsICpyZXF1aXJlbWVudHMpOgorICAgICAgICAiIiJFbnN1cmUgdGhhdCBkaXN0cmlidXRpb25zIG1hdGNoaW5nIGByZXF1aXJlbWVudHNgIGFyZSBhY3RpdmF0ZWQKKworICAgICAgICBgcmVxdWlyZW1lbnRzYCBtdXN0IGJlIGEgc3RyaW5nIG9yIGEgKHBvc3NpYmx5LW5lc3RlZCkgc2VxdWVuY2UKKyAgICAgICAgdGhlcmVvZiwgc3BlY2lmeWluZyB0aGUgZGlzdHJpYnV0aW9ucyBhbmQgdmVyc2lvbnMgcmVxdWlyZWQuICBUaGUKKyAgICAgICAgcmV0dXJuIHZhbHVlIGlzIGEgc2VxdWVuY2Ugb2YgdGhlIGRpc3RyaWJ1dGlvbnMgdGhhdCBuZWVkZWQgdG8gYmUKKyAgICAgICAgYWN0aXZhdGVkIHRvIGZ1bGZpbGwgdGhlIHJlcXVpcmVtZW50czsgYWxsIHJlbGV2YW50IGRpc3RyaWJ1dGlvbnMgYXJlCisgICAgICAgIGluY2x1ZGVkLCBldmVuIGlmIHRoZXkgd2VyZSBhbHJlYWR5IGFjdGl2YXRlZCBpbiB0aGlzIHdvcmtpbmcgc2V0LgorICAgICAgICAiIiIKKworICAgICAgICBuZWVkZWQgPSBzZWxmLnJlc29sdmUocGFyc2VfcmVxdWlyZW1lbnRzKHJlcXVpcmVtZW50cykpCisKKyAgICAgICAgZm9yIGRpc3QgaW4gbmVlZGVkOgorICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKKworICAgICAgICByZXR1cm4gbmVlZGVkCisKKworICAgIGRlZiBzdWJzY3JpYmUoc2VsZiwgY2FsbGJhY2spOgorICAgICAgICAiIiJJbnZva2UgYGNhbGxiYWNrYCBmb3IgYWxsIGRpc3RyaWJ1dGlvbnMgKGluY2x1ZGluZyBleGlzdGluZyBvbmVzKSIiIgorICAgICAgICBpZiBjYWxsYmFjayBpbiBzZWxmLmNhbGxiYWNrczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmNhbGxiYWNrcy5hcHBlbmQoY2FsbGJhY2spCisgICAgICAgIGZvciBkaXN0IGluIHNlbGY6CisgICAgICAgICAgICBjYWxsYmFjayhkaXN0KQorCisKKyAgICBkZWYgX2FkZGVkX25ldyhzZWxmLCBkaXN0KToKKyAgICAgICAgZm9yIGNhbGxiYWNrIGluIHNlbGYuY2FsbGJhY2tzOgorICAgICAgICAgICAgY2FsbGJhY2soZGlzdCkKKworCisKKworCisKKworCisKKworCitjbGFzcyBFbnZpcm9ubWVudChvYmplY3QpOgorICAgICIiIlNlYXJjaGFibGUgc25hcHNob3Qgb2YgZGlzdHJpYnV0aW9ucyBvbiBhIHNlYXJjaCBwYXRoIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2VhcmNoX3BhdGg9Tm9uZSwgcGxhdGZvcm09Z2V0X3N1cHBvcnRlZF9wbGF0Zm9ybSgpLCBweXRob249UFlfTUFKT1IpOgorICAgICAgICAiIiJTbmFwc2hvdCBkaXN0cmlidXRpb25zIGF2YWlsYWJsZSBvbiBhIHNlYXJjaCBwYXRoCisKKyAgICAgICAgQW55IGRpc3RyaWJ1dGlvbnMgZm91bmQgb24gYHNlYXJjaF9wYXRoYCBhcmUgYWRkZWQgdG8gdGhlIGVudmlyb25tZW50LgorICAgICAgICBgc2VhcmNoX3BhdGhgIHNob3VsZCBiZSBhIHNlcXVlbmNlIG9mIGBgc3lzLnBhdGhgYCBpdGVtcy4gIElmIG5vdAorICAgICAgICBzdXBwbGllZCwgYGBzeXMucGF0aGBgIGlzIHVzZWQuCisKKyAgICAgICAgYHBsYXRmb3JtYCBpcyBhbiBvcHRpb25hbCBzdHJpbmcgc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgcGxhdGZvcm0KKyAgICAgICAgdGhhdCBwbGF0Zm9ybS1zcGVjaWZpYyBkaXN0cmlidXRpb25zIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoLiAgSWYKKyAgICAgICAgdW5zcGVjaWZpZWQsIGl0IGRlZmF1bHRzIHRvIHRoZSBjdXJyZW50IHBsYXRmb3JtLiAgYHB5dGhvbmAgaXMgYW4KKyAgICAgICAgb3B0aW9uYWwgc3RyaW5nIG5hbWluZyB0aGUgZGVzaXJlZCB2ZXJzaW9uIG9mIFB5dGhvbiAoZS5nLiBgYCcyLjQnYGApOworICAgICAgICBpdCBkZWZhdWx0cyB0byB0aGUgY3VycmVudCB2ZXJzaW9uLgorCisgICAgICAgIFlvdSBtYXkgZXhwbGljaXRseSBzZXQgYHBsYXRmb3JtYCAoYW5kL29yIGBweXRob25gKSB0byBgYE5vbmVgYCBpZiB5b3UKKyAgICAgICAgd2lzaCB0byBtYXAgKmFsbCogZGlzdHJpYnV0aW9ucywgbm90IGp1c3QgdGhvc2UgY29tcGF0aWJsZSB3aXRoIHRoZQorICAgICAgICBydW5uaW5nIHBsYXRmb3JtIG9yIFB5dGhvbiB2ZXJzaW9uLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5fZGlzdG1hcCA9IHt9CisgICAgICAgIHNlbGYuX2NhY2hlID0ge30KKyAgICAgICAgc2VsZi5wbGF0Zm9ybSA9IHBsYXRmb3JtCisgICAgICAgIHNlbGYucHl0aG9uID0gcHl0aG9uCisgICAgICAgIHNlbGYuc2NhbihzZWFyY2hfcGF0aCkKKworICAgIGRlZiBjYW5fYWRkKHNlbGYsIGRpc3QpOgorICAgICAgICAiIiJJcyBkaXN0cmlidXRpb24gYGRpc3RgIGFjY2VwdGFibGUgZm9yIHRoaXMgZW52aXJvbm1lbnQ/CisKKyAgICAgICAgVGhlIGRpc3RyaWJ1dGlvbiBtdXN0IG1hdGNoIHRoZSBwbGF0Zm9ybSBhbmQgcHl0aG9uIHZlcnNpb24KKyAgICAgICAgcmVxdWlyZW1lbnRzIHNwZWNpZmllZCB3aGVuIHRoaXMgZW52aXJvbm1lbnQgd2FzIGNyZWF0ZWQsIG9yIEZhbHNlCisgICAgICAgIGlzIHJldHVybmVkLgorICAgICAgICAiIiIKKyAgICAgICAgcmV0dXJuIChzZWxmLnB5dGhvbiBpcyBOb25lIG9yIGRpc3QucHlfdmVyc2lvbiBpcyBOb25lCisgICAgICAgICAgICBvciBkaXN0LnB5X3ZlcnNpb249PXNlbGYucHl0aG9uKSBcCisgICAgICAgICAgIGFuZCBjb21wYXRpYmxlX3BsYXRmb3JtcyhkaXN0LnBsYXRmb3JtLHNlbGYucGxhdGZvcm0pCisKKyAgICBkZWYgcmVtb3ZlKHNlbGYsIGRpc3QpOgorICAgICAgICAiIiJSZW1vdmUgYGRpc3RgIGZyb20gdGhlIGVudmlyb25tZW50IiIiCisgICAgICAgIHNlbGYuX2Rpc3RtYXBbZGlzdC5rZXldLnJlbW92ZShkaXN0KQorCisgICAgZGVmIHNjYW4oc2VsZiwgc2VhcmNoX3BhdGg9Tm9uZSk6CisgICAgICAgICIiIlNjYW4gYHNlYXJjaF9wYXRoYCBmb3IgZGlzdHJpYnV0aW9ucyB1c2FibGUgaW4gdGhpcyBlbnZpcm9ubWVudAorCisgICAgICAgIEFueSBkaXN0cmlidXRpb25zIGZvdW5kIGFyZSBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQuCisgICAgICAgIGBzZWFyY2hfcGF0aGAgc2hvdWxkIGJlIGEgc2VxdWVuY2Ugb2YgYGBzeXMucGF0aGBgIGl0ZW1zLiAgSWYgbm90CisgICAgICAgIHN1cHBsaWVkLCBgYHN5cy5wYXRoYGAgaXMgdXNlZC4gIE9ubHkgZGlzdHJpYnV0aW9ucyBjb25mb3JtaW5nIHRvCisgICAgICAgIHRoZSBwbGF0Zm9ybS9weXRob24gdmVyc2lvbiBkZWZpbmVkIGF0IGluaXRpYWxpemF0aW9uIGFyZSBhZGRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIHNlYXJjaF9wYXRoIGlzIE5vbmU6CisgICAgICAgICAgICBzZWFyY2hfcGF0aCA9IHN5cy5wYXRoCisKKyAgICAgICAgZm9yIGl0ZW0gaW4gc2VhcmNoX3BhdGg6CisgICAgICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMoaXRlbSk6CisgICAgICAgICAgICAgICAgc2VsZi5hZGQoZGlzdCkKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLHByb2plY3RfbmFtZSk6CisgICAgICAgICIiIlJldHVybiBhIG5ld2VzdC10by1vbGRlc3QgbGlzdCBvZiBkaXN0cmlidXRpb25zIGZvciBgcHJvamVjdF9uYW1lYAorICAgICAgICAiIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NhY2hlW3Byb2plY3RfbmFtZV0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgcHJvamVjdF9uYW1lID0gcHJvamVjdF9uYW1lLmxvd2VyKCkKKyAgICAgICAgICAgIGlmIHByb2plY3RfbmFtZSBub3QgaW4gc2VsZi5fZGlzdG1hcDoKKyAgICAgICAgICAgICAgICByZXR1cm4gW10KKworICAgICAgICBpZiBwcm9qZWN0X25hbWUgbm90IGluIHNlbGYuX2NhY2hlOgorICAgICAgICAgICAgZGlzdHMgPSBzZWxmLl9jYWNoZVtwcm9qZWN0X25hbWVdID0gc2VsZi5fZGlzdG1hcFtwcm9qZWN0X25hbWVdCisgICAgICAgICAgICBfc29ydF9kaXN0cyhkaXN0cykKKworICAgICAgICByZXR1cm4gc2VsZi5fY2FjaGVbcHJvamVjdF9uYW1lXQorCisgICAgZGVmIGFkZChzZWxmLGRpc3QpOgorICAgICAgICAiIiJBZGQgYGRpc3RgIGlmIHdlIGBgY2FuX2FkZCgpYGAgaXQgYW5kIGl0IGlzbid0IGFscmVhZHkgYWRkZWQiIiIKKyAgICAgICAgaWYgc2VsZi5jYW5fYWRkKGRpc3QpIGFuZCBkaXN0Lmhhc192ZXJzaW9uKCk6CisgICAgICAgICAgICBkaXN0cyA9IHNlbGYuX2Rpc3RtYXAuc2V0ZGVmYXVsdChkaXN0LmtleSxbXSkKKyAgICAgICAgICAgIGlmIGRpc3Qgbm90IGluIGRpc3RzOgorICAgICAgICAgICAgICAgIGRpc3RzLmFwcGVuZChkaXN0KQorICAgICAgICAgICAgICAgIGlmIGRpc3Qua2V5IGluIHNlbGYuX2NhY2hlOgorICAgICAgICAgICAgICAgICAgICBfc29ydF9kaXN0cyhzZWxmLl9jYWNoZVtkaXN0LmtleV0pCisKKworICAgIGRlZiBiZXN0X21hdGNoKHNlbGYsIHJlcSwgd29ya2luZ19zZXQsIGluc3RhbGxlcj1Ob25lKToKKyAgICAgICAgIiIiRmluZCBkaXN0cmlidXRpb24gYmVzdCBtYXRjaGluZyBgcmVxYCBhbmQgdXNhYmxlIG9uIGB3b3JraW5nX3NldGAKKworICAgICAgICBUaGlzIGNhbGxzIHRoZSBgYGZpbmQocmVxKWBgIG1ldGhvZCBvZiB0aGUgYHdvcmtpbmdfc2V0YCB0byBzZWUgaWYgYQorICAgICAgICBzdWl0YWJsZSBkaXN0cmlidXRpb24gaXMgYWxyZWFkeSBhY3RpdmUuICAoVGhpcyBtYXkgcmFpc2UKKyAgICAgICAgYGBWZXJzaW9uQ29uZmxpY3RgYCBpZiBhbiB1bnN1aXRhYmxlIHZlcnNpb24gb2YgdGhlIHByb2plY3QgaXMgYWxyZWFkeQorICAgICAgICBhY3RpdmUgaW4gdGhlIHNwZWNpZmllZCBgd29ya2luZ19zZXRgLikgIElmIGEgc3VpdGFibGUgZGlzdHJpYnV0aW9uCisgICAgICAgIGlzbid0IGFjdGl2ZSwgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmV3ZXN0IGRpc3RyaWJ1dGlvbiBpbiB0aGUKKyAgICAgICAgZW52aXJvbm1lbnQgdGhhdCBtZWV0cyB0aGUgYGBSZXF1aXJlbWVudGBgIGluIGByZXFgLiAgSWYgbm8gc3VpdGFibGUKKyAgICAgICAgZGlzdHJpYnV0aW9uIGlzIGZvdW5kLCBhbmQgYGluc3RhbGxlcmAgaXMgc3VwcGxpZWQsIHRoZW4gdGhlIHJlc3VsdCBvZgorICAgICAgICBjYWxsaW5nIHRoZSBlbnZpcm9ubWVudCdzIGBgb2J0YWluKHJlcSwgaW5zdGFsbGVyKWBgIG1ldGhvZCB3aWxsIGJlCisgICAgICAgIHJldHVybmVkLgorICAgICAgICAiIiIKKyAgICAgICAgZGlzdCA9IHdvcmtpbmdfc2V0LmZpbmQocmVxKQorICAgICAgICBpZiBkaXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGRpc3QKKyAgICAgICAgZm9yIGRpc3QgaW4gc2VsZltyZXEua2V5XToKKyAgICAgICAgICAgIGlmIGRpc3QgaW4gcmVxOgorICAgICAgICAgICAgICAgIHJldHVybiBkaXN0CisgICAgICAgIHJldHVybiBzZWxmLm9idGFpbihyZXEsIGluc3RhbGxlcikgIyB0cnkgYW5kIGRvd25sb2FkL2luc3RhbGwKKworICAgIGRlZiBvYnRhaW4oc2VsZiwgcmVxdWlyZW1lbnQsIGluc3RhbGxlcj1Ob25lKToKKyAgICAgICAgIiIiT2J0YWluIGEgZGlzdHJpYnV0aW9uIG1hdGNoaW5nIGByZXF1aXJlbWVudGAgKGUuZy4gdmlhIGRvd25sb2FkKQorCisgICAgICAgIE9idGFpbiBhIGRpc3RybyB0aGF0IG1hdGNoZXMgcmVxdWlyZW1lbnQgKGUuZy4gdmlhIGRvd25sb2FkKS4gIEluIHRoZQorICAgICAgICBiYXNlIGBgRW52aXJvbm1lbnRgYCBjbGFzcywgdGhpcyByb3V0aW5lIGp1c3QgcmV0dXJucworICAgICAgICBgYGluc3RhbGxlcihyZXF1aXJlbWVudClgYCwgdW5sZXNzIGBpbnN0YWxsZXJgIGlzIE5vbmUsIGluIHdoaWNoIGNhc2UKKyAgICAgICAgTm9uZSBpcyByZXR1cm5lZCBpbnN0ZWFkLiAgVGhpcyBtZXRob2QgaXMgYSBob29rIHRoYXQgYWxsb3dzIHN1YmNsYXNzZXMKKyAgICAgICAgdG8gYXR0ZW1wdCBvdGhlciB3YXlzIG9mIG9idGFpbmluZyBhIGRpc3RyaWJ1dGlvbiBiZWZvcmUgZmFsbGluZyBiYWNrCisgICAgICAgIHRvIHRoZSBgaW5zdGFsbGVyYCBhcmd1bWVudC4iIiIKKyAgICAgICAgaWYgaW5zdGFsbGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGluc3RhbGxlcihyZXF1aXJlbWVudCkKKworICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKKyAgICAgICAgIiIiWWllbGQgdGhlIHVuaXF1ZSBwcm9qZWN0IG5hbWVzIG9mIHRoZSBhdmFpbGFibGUgZGlzdHJpYnV0aW9ucyIiIgorICAgICAgICBmb3Iga2V5IGluIHNlbGYuX2Rpc3RtYXAua2V5cygpOgorICAgICAgICAgICAgaWYgc2VsZltrZXldOiB5aWVsZCBrZXkKKworCisKKworICAgIGRlZiBfX2lhZGRfXyhzZWxmLCBvdGhlcik6CisgICAgICAgICIiIkluLXBsYWNlIGFkZGl0aW9uIG9mIGEgZGlzdHJpYnV0aW9uIG9yIGVudmlyb25tZW50IiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsRGlzdHJpYnV0aW9uKToKKyAgICAgICAgICAgIHNlbGYuYWRkKG90aGVyKQorICAgICAgICBlbGlmIGlzaW5zdGFuY2Uob3RoZXIsRW52aXJvbm1lbnQpOgorICAgICAgICAgICAgZm9yIHByb2plY3QgaW4gb3RoZXI6CisgICAgICAgICAgICAgICAgZm9yIGRpc3QgaW4gb3RoZXJbcHJvamVjdF06CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYWRkKGRpc3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIkNhbid0IGFkZCAlciB0byBlbnZpcm9ubWVudCIgJSAob3RoZXIsKSkKKyAgICAgICAgcmV0dXJuIHNlbGYKKworICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgIiIiQWRkIGFuIGVudmlyb25tZW50IG9yIGRpc3RyaWJ1dGlvbiB0byBhbiBlbnZpcm9ubWVudCIiIgorICAgICAgICBuZXcgPSBzZWxmLl9fY2xhc3NfXyhbXSwgcGxhdGZvcm09Tm9uZSwgcHl0aG9uPU5vbmUpCisgICAgICAgIGZvciBlbnYgaW4gc2VsZiwgb3RoZXI6CisgICAgICAgICAgICBuZXcgKz0gZW52CisgICAgICAgIHJldHVybiBuZXcKKworCitBdmFpbGFibGVEaXN0cmlidXRpb25zID0gRW52aXJvbm1lbnQgICAgIyBYWFggYmFja3dhcmQgY29tcGF0aWJpbGl0eQorCisKK2NsYXNzIEV4dHJhY3Rpb25FcnJvcihSdW50aW1lRXJyb3IpOgorICAgICIiIkFuIGVycm9yIG9jY3VycmVkIGV4dHJhY3RpbmcgYSByZXNvdXJjZQorCisgICAgVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGUgZnJvbSBpbnN0YW5jZXMgb2YgdGhpcyBleGNlcHRpb246CisKKyAgICBtYW5hZ2VyCisgICAgICAgIFRoZSByZXNvdXJjZSBtYW5hZ2VyIHRoYXQgcmFpc2VkIHRoaXMgZXhjZXB0aW9uCisKKyAgICBjYWNoZV9wYXRoCisgICAgICAgIFRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgcmVzb3VyY2UgZXh0cmFjdGlvbgorCisgICAgb3JpZ2luYWxfZXJyb3IKKyAgICAgICAgVGhlIGV4Y2VwdGlvbiBpbnN0YW5jZSB0aGF0IGNhdXNlZCBleHRyYWN0aW9uIHRvIGZhaWwKKyAgICAiIiIKKworCisKKworY2xhc3MgUmVzb3VyY2VNYW5hZ2VyOgorICAgICIiIk1hbmFnZSByZXNvdXJjZSBleHRyYWN0aW9uIGFuZCBwYWNrYWdlcyIiIgorICAgIGV4dHJhY3Rpb25fcGF0aCA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jYWNoZWRfZmlsZXMgPSB7fQorCisgICAgZGVmIHJlc291cmNlX2V4aXN0cyhzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKKyAgICAgICAgIiIiRG9lcyB0aGUgbmFtZWQgcmVzb3VyY2UgZXhpc3Q/IiIiCisgICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuaGFzX3Jlc291cmNlKHJlc291cmNlX25hbWUpCisKKyAgICBkZWYgcmVzb3VyY2VfaXNkaXIoc2VsZiwgcGFja2FnZV9vcl9yZXF1aXJlbWVudCwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgICIiIklzIHRoZSBuYW1lZCByZXNvdXJjZSBhbiBleGlzdGluZyBkaXJlY3Rvcnk/IiIiCisgICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkucmVzb3VyY2VfaXNkaXIoCisgICAgICAgICAgICByZXNvdXJjZV9uYW1lCisgICAgICAgICkKKworICAgIGRlZiByZXNvdXJjZV9maWxlbmFtZShzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgdHJ1ZSBmaWxlc3lzdGVtIHBhdGggZm9yIHNwZWNpZmllZCByZXNvdXJjZSIiIgorICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9maWxlbmFtZSgKKyAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKKyAgICAgICAgKQorCisgICAgZGVmIHJlc291cmNlX3N0cmVhbShzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIGEgcmVhZGFibGUgZmlsZS1saWtlIG9iamVjdCBmb3Igc3BlY2lmaWVkIHJlc291cmNlIiIiCisgICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkuZ2V0X3Jlc291cmNlX3N0cmVhbSgKKyAgICAgICAgICAgIHNlbGYsIHJlc291cmNlX25hbWUKKyAgICAgICAgKQorCisgICAgZGVmIHJlc291cmNlX3N0cmluZyhzZWxmLCBwYWNrYWdlX29yX3JlcXVpcmVtZW50LCByZXNvdXJjZV9uYW1lKToKKyAgICAgICAgIiIiUmV0dXJuIHNwZWNpZmllZCByZXNvdXJjZSBhcyBhIHN0cmluZyIiIgorICAgICAgICByZXR1cm4gZ2V0X3Byb3ZpZGVyKHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQpLmdldF9yZXNvdXJjZV9zdHJpbmcoCisgICAgICAgICAgICBzZWxmLCByZXNvdXJjZV9uYW1lCisgICAgICAgICkKKworICAgIGRlZiByZXNvdXJjZV9saXN0ZGlyKHNlbGYsIHBhY2thZ2Vfb3JfcmVxdWlyZW1lbnQsIHJlc291cmNlX25hbWUpOgorICAgICAgICAiIiJMaXN0IHRoZSBjb250ZW50cyBvZiB0aGUgbmFtZWQgcmVzb3VyY2UgZGlyZWN0b3J5IiIiCisgICAgICAgIHJldHVybiBnZXRfcHJvdmlkZXIocGFja2FnZV9vcl9yZXF1aXJlbWVudCkucmVzb3VyY2VfbGlzdGRpcigKKyAgICAgICAgICAgIHJlc291cmNlX25hbWUKKyAgICAgICAgKQorCisgICAgZGVmIGV4dHJhY3Rpb25fZXJyb3Ioc2VsZik6CisgICAgICAgICIiIkdpdmUgYW4gZXJyb3IgbWVzc2FnZSBmb3IgcHJvYmxlbXMgZXh0cmFjdGluZyBmaWxlKHMpIiIiCisKKyAgICAgICAgb2xkX2V4YyA9IHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgIGNhY2hlX3BhdGggPSBzZWxmLmV4dHJhY3Rpb25fcGF0aCBvciBnZXRfZGVmYXVsdF9jYWNoZSgpCisKKyAgICAgICAgZXJyID0gRXh0cmFjdGlvbkVycm9yKCIiIkNhbid0IGV4dHJhY3QgZmlsZShzKSB0byBlZ2cgY2FjaGUKKworVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gZXh0cmFjdCBmaWxlKHMpIHRvIHRoZSBQeXRob24gZWdnCitjYWNoZToKKworICAlcworCitUaGUgUHl0aG9uIGVnZyBjYWNoZSBkaXJlY3RvcnkgaXMgY3VycmVudGx5IHNldCB0bzoKKworICAlcworCitQZXJoYXBzIHlvdXIgYWNjb3VudCBkb2VzIG5vdCBoYXZlIHdyaXRlIGFjY2VzcyB0byB0aGlzIGRpcmVjdG9yeT8gIFlvdSBjYW4KK2NoYW5nZSB0aGUgY2FjaGUgZGlyZWN0b3J5IGJ5IHNldHRpbmcgdGhlIFBZVEhPTl9FR0dfQ0FDSEUgZW52aXJvbm1lbnQKK3ZhcmlhYmxlIHRvIHBvaW50IHRvIGFuIGFjY2Vzc2libGUgZGlyZWN0b3J5LgorIiIiICAgICAgICAgJSAob2xkX2V4YywgY2FjaGVfcGF0aCkKKyAgICAgICAgKQorICAgICAgICBlcnIubWFuYWdlciAgICAgICAgPSBzZWxmCisgICAgICAgIGVyci5jYWNoZV9wYXRoICAgICA9IGNhY2hlX3BhdGgKKyAgICAgICAgZXJyLm9yaWdpbmFsX2Vycm9yID0gb2xkX2V4YworICAgICAgICByYWlzZSBlcnIKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICBkZWYgZ2V0X2NhY2hlX3BhdGgoc2VsZiwgYXJjaGl2ZV9uYW1lLCBuYW1lcz0oKSk6CisgICAgICAgICIiIlJldHVybiBhYnNvbHV0ZSBsb2NhdGlvbiBpbiBjYWNoZSBmb3IgYGFyY2hpdmVfbmFtZWAgYW5kIGBuYW1lc2AKKworICAgICAgICBUaGUgcGFyZW50IGRpcmVjdG9yeSBvZiB0aGUgcmVzdWx0aW5nIHBhdGggd2lsbCBiZSBjcmVhdGVkIGlmIGl0IGRvZXMKKyAgICAgICAgbm90IGFscmVhZHkgZXhpc3QuICBgYXJjaGl2ZV9uYW1lYCBzaG91bGQgYmUgdGhlIGJhc2UgZmlsZW5hbWUgb2YgdGhlCisgICAgICAgIGVuY2xvc2luZyBlZ2cgKHdoaWNoIG1heSBub3QgYmUgdGhlIG5hbWUgb2YgdGhlIGVuY2xvc2luZyB6aXBmaWxlISksCisgICAgICAgIGluY2x1ZGluZyBpdHMgIi5lZ2ciIGV4dGVuc2lvbi4gIGBuYW1lc2AsIGlmIHByb3ZpZGVkLCBzaG91bGQgYmUgYQorICAgICAgICBzZXF1ZW5jZSBvZiBwYXRoIG5hbWUgcGFydHMgInVuZGVyIiB0aGUgZWdnJ3MgZXh0cmFjdGlvbiBsb2NhdGlvbi4KKworICAgICAgICBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgcmVzb3VyY2UgcHJvdmlkZXJzIHRoYXQgbmVlZCB0bworICAgICAgICBvYnRhaW4gYW4gZXh0cmFjdGlvbiBsb2NhdGlvbiwgYW5kIG9ubHkgZm9yIG5hbWVzIHRoZXkgaW50ZW5kIHRvCisgICAgICAgIGV4dHJhY3QsIGFzIGl0IHRyYWNrcyB0aGUgZ2VuZXJhdGVkIG5hbWVzIGZvciBwb3NzaWJsZSBjbGVhbnVwIGxhdGVyLgorICAgICAgICAiIiIKKyAgICAgICAgZXh0cmFjdF9wYXRoID0gc2VsZi5leHRyYWN0aW9uX3BhdGggb3IgZ2V0X2RlZmF1bHRfY2FjaGUoKQorICAgICAgICB0YXJnZXRfcGF0aCA9IG9zLnBhdGguam9pbihleHRyYWN0X3BhdGgsIGFyY2hpdmVfbmFtZSsnLXRtcCcsICpuYW1lcykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXRfcGF0aCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5leHRyYWN0aW9uX2Vycm9yKCkKKworICAgICAgICBzZWxmLmNhY2hlZF9maWxlc1t0YXJnZXRfcGF0aF0gPSAxCisgICAgICAgIHJldHVybiB0YXJnZXRfcGF0aAorCisKKyAgICBkZWYgcG9zdHByb2Nlc3Moc2VsZiwgdGVtcG5hbWUsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiUGVyZm9ybSBhbnkgcGxhdGZvcm0tc3BlY2lmaWMgcG9zdHByb2Nlc3Npbmcgb2YgYHRlbXBuYW1lYAorCisgICAgICAgIFRoaXMgaXMgd2hlcmUgTWFjIGhlYWRlciByZXdyaXRlcyBzaG91bGQgYmUgZG9uZTsgb3RoZXIgcGxhdGZvcm1zIGRvbid0CisgICAgICAgIGhhdmUgYW55dGhpbmcgc3BlY2lhbCB0aGV5IHNob3VsZCBkby4KKworICAgICAgICBSZXNvdXJjZSBwcm92aWRlcnMgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgT05MWSBhZnRlciBzdWNjZXNzZnVsbHkKKyAgICAgICAgZXh0cmFjdGluZyBhIGNvbXByZXNzZWQgcmVzb3VyY2UuICBUaGV5IG11c3QgTk9UIGNhbGwgaXQgb24gcmVzb3VyY2VzCisgICAgICAgIHRoYXQgYXJlIGFscmVhZHkgaW4gdGhlIGZpbGVzeXN0ZW0uCisKKyAgICAgICAgYHRlbXBuYW1lYCBpcyB0aGUgY3VycmVudCAodGVtcG9yYXJ5KSBuYW1lIG9mIHRoZSBmaWxlLCBhbmQgYGZpbGVuYW1lYAorICAgICAgICBpcyB0aGUgbmFtZSBpdCB3aWxsIGJlIHJlbmFtZWQgdG8gYnkgdGhlIGNhbGxlciBhZnRlciB0aGlzIHJvdXRpbmUKKyAgICAgICAgcmV0dXJucy4KKyAgICAgICAgIiIiCisgICAgICAgICMgWFhYCisKKworICAgIGRlZiBzZXRfZXh0cmFjdGlvbl9wYXRoKHNlbGYsIHBhdGgpOgorICAgICAgICAiIiJTZXQgdGhlIGJhc2UgcGF0aCB3aGVyZSByZXNvdXJjZXMgd2lsbCBiZSBleHRyYWN0ZWQgdG8sIGlmIG5lZWRlZC4KKworICAgICAgICBJZiB5b3UgZG8gbm90IGNhbGwgdGhpcyByb3V0aW5lIGJlZm9yZSBhbnkgZXh0cmFjdGlvbnMgdGFrZSBwbGFjZSwgdGhlCisgICAgICAgIHBhdGggZGVmYXVsdHMgdG8gdGhlIHJldHVybiB2YWx1ZSBvZiBgYGdldF9kZWZhdWx0X2NhY2hlKClgYC4gIChXaGljaAorICAgICAgICBpcyBiYXNlZCBvbiB0aGUgYGBQWVRIT05fRUdHX0NBQ0hFYGAgZW52aXJvbm1lbnQgdmFyaWFibGUsIHdpdGggdmFyaW91cworICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBmYWxsYmFja3MuICBTZWUgdGhhdCByb3V0aW5lJ3MgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZQorICAgICAgICBkZXRhaWxzLikKKworICAgICAgICBSZXNvdXJjZXMgYXJlIGV4dHJhY3RlZCB0byBzdWJkaXJlY3RvcmllcyBvZiB0aGlzIHBhdGggYmFzZWQgdXBvbgorICAgICAgICBpbmZvcm1hdGlvbiBnaXZlbiBieSB0aGUgYGBJUmVzb3VyY2VQcm92aWRlcmBgLiAgWW91IG1heSBzZXQgdGhpcyB0byBhCisgICAgICAgIHRlbXBvcmFyeSBkaXJlY3RvcnksIGJ1dCB0aGVuIHlvdSBtdXN0IGNhbGwgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAgdG8KKyAgICAgICAgZGVsZXRlIHRoZSBleHRyYWN0ZWQgZmlsZXMgd2hlbiBkb25lLiAgVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQKKyAgICAgICAgYGBjbGVhbnVwX3Jlc291cmNlcygpYGAgd2lsbCBiZSBhYmxlIHRvIHJlbW92ZSBhbGwgZXh0cmFjdGVkIGZpbGVzLgorCisgICAgICAgIChOb3RlOiB5b3UgbWF5IG5vdCBjaGFuZ2UgdGhlIGV4dHJhY3Rpb24gcGF0aCBmb3IgYSBnaXZlbiByZXNvdXJjZQorICAgICAgICBtYW5hZ2VyIG9uY2UgcmVzb3VyY2VzIGhhdmUgYmVlbiBleHRyYWN0ZWQsIHVubGVzcyB5b3UgZmlyc3QgY2FsbAorICAgICAgICBgYGNsZWFudXBfcmVzb3VyY2VzKClgYC4pCisgICAgICAgICIiIgorICAgICAgICBpZiBzZWxmLmNhY2hlZF9maWxlczoKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgIkNhbid0IGNoYW5nZSBleHRyYWN0aW9uIHBhdGgsIGZpbGVzIGFscmVhZHkgZXh0cmFjdGVkIgorICAgICAgICAgICAgKQorCisgICAgICAgIHNlbGYuZXh0cmFjdGlvbl9wYXRoID0gcGF0aAorCisgICAgZGVmIGNsZWFudXBfcmVzb3VyY2VzKHNlbGYsIGZvcmNlPUZhbHNlKToKKyAgICAgICAgIiIiCisgICAgICAgIERlbGV0ZSBhbGwgZXh0cmFjdGVkIHJlc291cmNlIGZpbGVzIGFuZCBkaXJlY3RvcmllcywgcmV0dXJuaW5nIGEgbGlzdAorICAgICAgICBvZiB0aGUgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzIHRoYXQgY291bGQgbm90IGJlIHN1Y2Nlc3NmdWxseSByZW1vdmVkLgorICAgICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGNvbmN1cnJlbmN5IHByb3RlY3Rpb24sIHNvIGl0IHNob3VsZAorICAgICAgICBnZW5lcmFsbHkgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgZXh0cmFjdGlvbiBwYXRoIGlzIGEgdGVtcG9yYXJ5CisgICAgICAgIGRpcmVjdG9yeSBleGNsdXNpdmUgdG8gYSBzaW5nbGUgcHJvY2Vzcy4gIFRoaXMgbWV0aG9kIGlzIG5vdAorICAgICAgICBhdXRvbWF0aWNhbGx5IGNhbGxlZDsgeW91IG11c3QgY2FsbCBpdCBleHBsaWNpdGx5IG9yIHJlZ2lzdGVyIGl0IGFzIGFuCisgICAgICAgIGBgYXRleGl0YGAgZnVuY3Rpb24gaWYgeW91IHdpc2ggdG8gZW5zdXJlIGNsZWFudXAgb2YgYSB0ZW1wb3JhcnkKKyAgICAgICAgZGlyZWN0b3J5IHVzZWQgZm9yIGV4dHJhY3Rpb25zLgorICAgICAgICAiIiIKKyAgICAgICAgIyBYWFgKKworCisKK2RlZiBnZXRfZGVmYXVsdF9jYWNoZSgpOgorICAgICIiIkRldGVybWluZSB0aGUgZGVmYXVsdCBjYWNoZSBsb2NhdGlvbgorCisgICAgVGhpcyByZXR1cm5zIHRoZSBgYFBZVEhPTl9FR0dfQ0FDSEVgYCBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaWYgc2V0LgorICAgIE90aGVyd2lzZSwgb24gV2luZG93cywgaXQgcmV0dXJucyBhICJQeXRob24tRWdncyIgc3ViZGlyZWN0b3J5IG9mIHRoZQorICAgICJBcHBsaWNhdGlvbiBEYXRhIiBkaXJlY3RvcnkuICBPbiBhbGwgb3RoZXIgc3lzdGVtcywgaXQncyAifi8ucHl0aG9uLWVnZ3MiLgorICAgICIiIgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIG9zLmVudmlyb25bJ1BZVEhPTl9FR0dfQ0FDSEUnXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgcGFzcworCisgICAgaWYgb3MubmFtZSE9J250JzoKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguZXhwYW5kdXNlcignfi8ucHl0aG9uLWVnZ3MnKQorCisgICAgYXBwX2RhdGEgPSAnQXBwbGljYXRpb24gRGF0YScgICAjIFhYWCB0aGlzIG1heSBiZSBsb2NhbGUtc3BlY2lmaWMhCisgICAgYXBwX2hvbWVzID0gWworICAgICAgICAoKCdBUFBEQVRBJywpLCBOb25lKSwgICAgICAgIyBiZXN0IG9wdGlvbiwgc2hvdWxkIGJlIGxvY2FsZS1zYWZlCisgICAgICAgICgoJ1VTRVJQUk9GSUxFJywpLCBhcHBfZGF0YSksCisgICAgICAgICgoJ0hPTUVEUklWRScsJ0hPTUVQQVRIJyksIGFwcF9kYXRhKSwKKyAgICAgICAgKCgnSE9NRVBBVEgnLCksIGFwcF9kYXRhKSwKKyAgICAgICAgKCgnSE9NRScsKSwgTm9uZSksCisgICAgICAgICgoJ1dJTkRJUicsKSwgYXBwX2RhdGEpLCAgICAjIDk1Lzk4L01FCisgICAgXQorCisgICAgZm9yIGtleXMsIHN1YmRpciBpbiBhcHBfaG9tZXM6CisgICAgICAgIGRpcm5hbWUgPSAnJworICAgICAgICBmb3Iga2V5IGluIGtleXM6CisgICAgICAgICAgICBpZiBrZXkgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5qb2luKG9zLmVudmlyb25ba2V5XSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHN1YmRpcjoKKyAgICAgICAgICAgICAgICBkaXJuYW1lID0gb3MucGF0aC5qb2luKGRpcm5hbWUsc3ViZGlyKQorICAgICAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihkaXJuYW1lLCAnUHl0aG9uLUVnZ3MnKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKKyAgICAgICAgICAgICJQbGVhc2Ugc2V0IHRoZSBQWVRIT05fRUdHX0NBQ0hFIGVudmlyb21lbnQgdmFyaWFibGUiCisgICAgICAgICkKKworZGVmIHNhZmVfbmFtZShuYW1lKToKKyAgICAiIiJDb252ZXJ0IGFuIGFyYml0cmFyeSBzdHJpbmcgdG8gYSBzdGFuZGFyZCBkaXN0cmlidXRpb24gbmFtZQorCisgICAgQW55IHJ1bnMgb2Ygbm9uLWFscGhhbnVtZXJpYy8uIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgJy0nLgorICAgICIiIgorICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Ll0rJywgJy0nLCBuYW1lKQorCisKK2RlZiBzYWZlX3ZlcnNpb24odmVyc2lvbik6CisgICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgdmVyc2lvbiBzdHJpbmcKKworICAgIFNwYWNlcyBiZWNvbWUgZG90cywgYW5kIGFsbCBvdGhlciBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYmVjb21lCisgICAgZGFzaGVzLCB3aXRoIHJ1bnMgb2YgbXVsdGlwbGUgZGFzaGVzIGNvbmRlbnNlZCB0byBhIHNpbmdsZSBkYXNoLgorICAgICIiIgorICAgIHZlcnNpb24gPSB2ZXJzaW9uLnJlcGxhY2UoJyAnLCcuJykKKyAgICByZXR1cm4gcmUuc3ViKCdbXkEtWmEtejAtOS5dKycsICctJywgdmVyc2lvbikKKworCitkZWYgc2FmZV9leHRyYShleHRyYSk6CisgICAgIiIiQ29udmVydCBhbiBhcmJpdHJhcnkgc3RyaW5nIHRvIGEgc3RhbmRhcmQgJ2V4dHJhJyBuYW1lCisKKyAgICBBbnkgcnVucyBvZiBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlcnMgYXJlIHJlcGxhY2VkIHdpdGggYSBzaW5nbGUgJ18nLAorICAgIGFuZCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBsb3dlcmNhc2VkLgorICAgICIiIgorICAgIHJldHVybiByZS5zdWIoJ1teQS1aYS16MC05Ll0rJywgJ18nLCBleHRyYSkubG93ZXIoKQorCisKK2RlZiB0b19maWxlbmFtZShuYW1lKToKKyAgICAiIiJDb252ZXJ0IGEgcHJvamVjdCBvciB2ZXJzaW9uIG5hbWUgdG8gaXRzIGZpbGVuYW1lLWVzY2FwZWQgZm9ybQorCisgICAgQW55ICctJyBjaGFyYWN0ZXJzIGFyZSBjdXJyZW50bHkgcmVwbGFjZWQgd2l0aCAnXycuCisgICAgIiIiCisgICAgcmV0dXJuIG5hbWUucmVwbGFjZSgnLScsJ18nKQorCisKKworCisKKworCisKK2NsYXNzIE51bGxQcm92aWRlcjoKKyAgICAiIiJUcnkgdG8gaW1wbGVtZW50IHJlc291cmNlcyBhbmQgbWV0YWRhdGEgZm9yIGFyYml0cmFyeSBQRVAgMzAyIGxvYWRlcnMiIiIKKworICAgIGVnZ19uYW1lID0gTm9uZQorICAgIGVnZ19pbmZvID0gTm9uZQorICAgIGxvYWRlciA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2R1bGUpOgorICAgICAgICBzZWxmLmxvYWRlciA9IGdldGF0dHIobW9kdWxlLCAnX19sb2FkZXJfXycsIE5vbmUpCisgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBvcy5wYXRoLmRpcm5hbWUoZ2V0YXR0cihtb2R1bGUsICdfX2ZpbGVfXycsICcnKSkKKworICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKQorCisgICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0oc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgIHJldHVybiBTdHJpbmdJTyhzZWxmLmdldF9yZXNvdXJjZV9zdHJpbmcobWFuYWdlciwgcmVzb3VyY2VfbmFtZSkpCisKKyAgICBkZWYgZ2V0X3Jlc291cmNlX3N0cmluZyhzZWxmLCBtYW5hZ2VyLCByZXNvdXJjZV9uYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2dldChzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLCByZXNvdXJjZV9uYW1lKSkKKworICAgIGRlZiBoYXNfcmVzb3VyY2Uoc2VsZiwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl9oYXMoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCwgcmVzb3VyY2VfbmFtZSkpCisKKyAgICBkZWYgaGFzX21ldGFkYXRhKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5lZ2dfaW5mbyBhbmQgc2VsZi5faGFzKHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sbmFtZSkpCisKKyAgICBkZWYgZ2V0X21ldGFkYXRhKHNlbGYsIG5hbWUpOgorICAgICAgICBpZiBub3Qgc2VsZi5lZ2dfaW5mbzoKKyAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICByZXR1cm4gc2VsZi5fZ2V0KHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sbmFtZSkpCisKKyAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4geWllbGRfbGluZXMoc2VsZi5nZXRfbWV0YWRhdGEobmFtZSkpCisKKyAgICBkZWYgcmVzb3VyY2VfaXNkaXIoc2VsZixyZXNvdXJjZV9uYW1lKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2lzZGlyKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpKQorCisgICAgZGVmIG1ldGFkYXRhX2lzZGlyKHNlbGYsbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLmVnZ19pbmZvIGFuZCBzZWxmLl9pc2RpcihzZWxmLl9mbihzZWxmLmVnZ19pbmZvLG5hbWUpKQorCisKKyAgICBkZWYgcmVzb3VyY2VfbGlzdGRpcihzZWxmLHJlc291cmNlX25hbWUpOgorICAgICAgICByZXR1cm4gc2VsZi5fbGlzdGRpcihzZWxmLl9mbihzZWxmLm1vZHVsZV9wYXRoLHJlc291cmNlX25hbWUpKQorCisgICAgZGVmIG1ldGFkYXRhX2xpc3RkaXIoc2VsZixuYW1lKToKKyAgICAgICAgaWYgc2VsZi5lZ2dfaW5mbzoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9saXN0ZGlyKHNlbGYuX2ZuKHNlbGYuZWdnX2luZm8sbmFtZSkpCisgICAgICAgIHJldHVybiBbXQorCisgICAgZGVmIHJ1bl9zY3JpcHQoc2VsZixzY3JpcHRfbmFtZSxuYW1lc3BhY2UpOgorICAgICAgICBzY3JpcHQgPSAnc2NyaXB0cy8nK3NjcmlwdF9uYW1lCisgICAgICAgIGlmIG5vdCBzZWxmLmhhc19tZXRhZGF0YShzY3JpcHQpOgorICAgICAgICAgICAgcmFpc2UgUmVzb2x1dGlvbkVycm9yKCJObyBzY3JpcHQgbmFtZWQgJXIiICUgc2NyaXB0X25hbWUpCisgICAgICAgIHNjcmlwdF90ZXh0ID0gc2VsZi5nZXRfbWV0YWRhdGEoc2NyaXB0KS5yZXBsYWNlKCdcclxuJywnXG4nKQorICAgICAgICBzY3JpcHRfdGV4dCA9IHNjcmlwdF90ZXh0LnJlcGxhY2UoJ1xyJywnXG4nKQorICAgICAgICBzY3JpcHRfZmlsZW5hbWUgPSBzZWxmLl9mbihzZWxmLmVnZ19pbmZvLHNjcmlwdCkKKyAgICAgICAgbmFtZXNwYWNlWydfX2ZpbGVfXyddID0gc2NyaXB0X2ZpbGVuYW1lCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNjcmlwdF9maWxlbmFtZSk6CisgICAgICAgICAgICBleGVjZmlsZShzY3JpcHRfZmlsZW5hbWUsIG5hbWVzcGFjZSwgbmFtZXNwYWNlKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZnJvbSBsaW5lY2FjaGUgaW1wb3J0IGNhY2hlCisgICAgICAgICAgICBjYWNoZVtzY3JpcHRfZmlsZW5hbWVdID0gKAorICAgICAgICAgICAgICAgIGxlbihzY3JpcHRfdGV4dCksIDAsIHNjcmlwdF90ZXh0LnNwbGl0KCdcbicpLCBzY3JpcHRfZmlsZW5hbWUKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNjcmlwdF9jb2RlID0gY29tcGlsZShzY3JpcHRfdGV4dCxzY3JpcHRfZmlsZW5hbWUsJ2V4ZWMnKQorICAgICAgICAgICAgZXhlYyBzY3JpcHRfY29kZSBpbiBuYW1lc3BhY2UsIG5hbWVzcGFjZQorCisgICAgZGVmIF9oYXMoc2VsZiwgcGF0aCk6CisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgdW5yZWdpc3RlcmVkIGxvYWRlciB0eXBlIgorICAgICAgICApCisKKyAgICBkZWYgX2lzZGlyKHNlbGYsIHBhdGgpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKKyAgICAgICAgKQorCisgICAgZGVmIF9saXN0ZGlyKHNlbGYsIHBhdGgpOgorICAgICAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yKAorICAgICAgICAgICAgIkNhbid0IHBlcmZvcm0gdGhpcyBvcGVyYXRpb24gZm9yIHVucmVnaXN0ZXJlZCBsb2FkZXIgdHlwZSIKKyAgICAgICAgKQorCisgICAgZGVmIF9mbihzZWxmLCBiYXNlLCByZXNvdXJjZV9uYW1lKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihiYXNlLCAqcmVzb3VyY2VfbmFtZS5zcGxpdCgnLycpKQorCisgICAgZGVmIF9nZXQoc2VsZiwgcGF0aCk6CisgICAgICAgIGlmIGhhc2F0dHIoc2VsZi5sb2FkZXIsICdnZXRfZGF0YScpOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYubG9hZGVyLmdldF9kYXRhKHBhdGgpCisgICAgICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoCisgICAgICAgICAgICAiQ2FuJ3QgcGVyZm9ybSB0aGlzIG9wZXJhdGlvbiBmb3IgbG9hZGVycyB3aXRob3V0ICdnZXRfZGF0YSgpJyIKKyAgICAgICAgKQorCityZWdpc3Rlcl9sb2FkZXJfdHlwZShvYmplY3QsIE51bGxQcm92aWRlcikKKworCitjbGFzcyBFZ2dQcm92aWRlcihOdWxsUHJvdmlkZXIpOgorICAgICIiIlByb3ZpZGVyIGJhc2VkIG9uIGEgdmlydHVhbCBmaWxlc3lzdGVtIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZixtb2R1bGUpOgorICAgICAgICBOdWxsUHJvdmlkZXIuX19pbml0X18oc2VsZixtb2R1bGUpCisgICAgICAgIHNlbGYuX3NldHVwX3ByZWZpeCgpCisKKyAgICBkZWYgX3NldHVwX3ByZWZpeChzZWxmKToKKyAgICAgICAgIyB3ZSBhc3N1bWUgaGVyZSB0aGF0IG91ciBtZXRhZGF0YSBtYXkgYmUgbmVzdGVkIGluc2lkZSBhICJiYXNrZXQiCisgICAgICAgICMgb2YgbXVsdGlwbGUgZWdnczsgdGhhdCdzIHdoeSB3ZSB1c2UgbW9kdWxlX3BhdGggaW5zdGVhZCBvZiAuYXJjaGl2ZQorICAgICAgICBwYXRoID0gc2VsZi5tb2R1bGVfcGF0aAorICAgICAgICBvbGQgPSBOb25lCisgICAgICAgIHdoaWxlIHBhdGghPW9sZDoKKyAgICAgICAgICAgIGlmIHBhdGgubG93ZXIoKS5lbmRzd2l0aCgnLmVnZycpOgorICAgICAgICAgICAgICAgIHNlbGYuZWdnX25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCisgICAgICAgICAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IG9zLnBhdGguam9pbihwYXRoLCAnRUdHLUlORk8nKQorICAgICAgICAgICAgICAgIHNlbGYuZWdnX3Jvb3QgPSBwYXRoCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIG9sZCA9IHBhdGgKKyAgICAgICAgICAgIHBhdGgsIGJhc2UgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCisKKworCisKKworCisKKworY2xhc3MgRGVmYXVsdFByb3ZpZGVyKEVnZ1Byb3ZpZGVyKToKKyAgICAiIiJQcm92aWRlcyBhY2Nlc3MgdG8gcGFja2FnZSByZXNvdXJjZXMgaW4gdGhlIGZpbGVzeXN0ZW0iIiIKKworICAgIGRlZiBfaGFzKHNlbGYsIHBhdGgpOgorICAgICAgICByZXR1cm4gb3MucGF0aC5leGlzdHMocGF0aCkKKworICAgIGRlZiBfaXNkaXIoc2VsZixwYXRoKToKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguaXNkaXIocGF0aCkKKworICAgIGRlZiBfbGlzdGRpcihzZWxmLHBhdGgpOgorICAgICAgICByZXR1cm4gb3MubGlzdGRpcihwYXRoKQorCisgICAgZGVmIGdldF9yZXNvdXJjZV9zdHJlYW0oc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgIHJldHVybiBvcGVuKHNlbGYuX2ZuKHNlbGYubW9kdWxlX3BhdGgsIHJlc291cmNlX25hbWUpLCAncmInKQorCisgICAgZGVmIF9nZXQoc2VsZiwgcGF0aCk6CisgICAgICAgIHN0cmVhbSA9IG9wZW4ocGF0aCwgJ3JiJykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5yZWFkKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpCisKK3JlZ2lzdGVyX2xvYWRlcl90eXBlKHR5cGUoTm9uZSksIERlZmF1bHRQcm92aWRlcikKKworCitjbGFzcyBFbXB0eVByb3ZpZGVyKE51bGxQcm92aWRlcik6CisgICAgIiIiUHJvdmlkZXIgdGhhdCByZXR1cm5zIG5vdGhpbmcgZm9yIGFsbCByZXF1ZXN0cyIiIgorCisgICAgX2lzZGlyID0gX2hhcyA9IGxhbWJkYSBzZWxmLHBhdGg6IEZhbHNlCisgICAgX2dldCAgICAgICAgICA9IGxhbWJkYSBzZWxmLHBhdGg6ICcnCisgICAgX2xpc3RkaXIgICAgICA9IGxhbWJkYSBzZWxmLHBhdGg6IFtdCisgICAgbW9kdWxlX3BhdGggICA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCitlbXB0eV9wcm92aWRlciA9IEVtcHR5UHJvdmlkZXIoKQorCisKKworCitjbGFzcyBaaXBQcm92aWRlcihFZ2dQcm92aWRlcik6CisgICAgIiIiUmVzb3VyY2Ugc3VwcG9ydCBmb3IgemlwcyBhbmQgZWdncyIiIgorCisgICAgZWFnZXJzID0gTm9uZQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG1vZHVsZSk6CisgICAgICAgIEVnZ1Byb3ZpZGVyLl9faW5pdF9fKHNlbGYsbW9kdWxlKQorICAgICAgICBzZWxmLnppcGluZm8gPSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGVbc2VsZi5sb2FkZXIuYXJjaGl2ZV0KKyAgICAgICAgc2VsZi56aXBfcHJlID0gc2VsZi5sb2FkZXIuYXJjaGl2ZStvcy5zZXAKKworICAgIGRlZiBfemlwaW5mb19uYW1lKHNlbGYsIGZzcGF0aCk6CisgICAgICAgICMgQ29udmVydCBhIHZpcnR1YWwgZmlsZW5hbWUgKGZ1bGwgcGF0aCB0byBmaWxlKSBpbnRvIGEgemlwZmlsZSBzdWJwYXRoCisgICAgICAgICMgdXNhYmxlIHdpdGggdGhlIHppcGltcG9ydCBkaXJlY3RvcnkgY2FjaGUgZm9yIG91ciB0YXJnZXQgYXJjaGl2ZQorICAgICAgICBpZiBmc3BhdGguc3RhcnRzd2l0aChzZWxmLnppcF9wcmUpOgorICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi56aXBfcHJlKTpdCisgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKAorICAgICAgICAgICAgIiVzIGlzIG5vdCBhIHN1YnBhdGggb2YgJXMiICUgKGZzcGF0aCxzZWxmLnppcF9wcmUpCisgICAgICAgICkKKworICAgIGRlZiBfcGFydHMoc2VsZix6aXBfcGF0aCk6CisgICAgICAgICMgQ29udmVydCBhIHppcGZpbGUgc3VicGF0aCBpbnRvIGFuIGVnZy1yZWxhdGl2ZSBwYXRoIHBhcnQgbGlzdAorICAgICAgICBmc3BhdGggPSBzZWxmLnppcF9wcmUremlwX3BhdGggICMgcHNldWRvLWZzIHBhdGgKKyAgICAgICAgaWYgZnNwYXRoLnN0YXJ0c3dpdGgoc2VsZi5lZ2dfcm9vdCtvcy5zZXApOgorICAgICAgICAgICAgcmV0dXJuIGZzcGF0aFtsZW4oc2VsZi5lZ2dfcm9vdCkrMTpdLnNwbGl0KG9zLnNlcCkKKyAgICAgICAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoCisgICAgICAgICAgICAiJXMgaXMgbm90IGEgc3VicGF0aCBvZiAlcyIgJSAoZnNwYXRoLHNlbGYuZWdnX3Jvb3QpCisgICAgICAgICkKKworICAgIGRlZiBnZXRfcmVzb3VyY2VfZmlsZW5hbWUoc2VsZiwgbWFuYWdlciwgcmVzb3VyY2VfbmFtZSk6CisgICAgICAgIGlmIG5vdCBzZWxmLmVnZ19uYW1lOgorICAgICAgICAgICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcigKKyAgICAgICAgICAgICAgICAicmVzb3VyY2VfZmlsZW5hbWUoKSBvbmx5IHN1cHBvcnRlZCBmb3IgLmVnZywgbm90IC56aXAiCisgICAgICAgICAgICApCisgICAgICAgICMgbm8gbmVlZCB0byBsb2NrIGZvciBleHRyYWN0aW9uLCBzaW5jZSB3ZSB1c2UgdGVtcCBuYW1lcworICAgICAgICB6aXBfcGF0aCA9IHNlbGYuX3Jlc291cmNlX3RvX3ppcChyZXNvdXJjZV9uYW1lKQorICAgICAgICBlYWdlcnMgPSBzZWxmLl9nZXRfZWFnZXJfcmVzb3VyY2VzKCkKKyAgICAgICAgaWYgJy8nLmpvaW4oc2VsZi5fcGFydHMoemlwX3BhdGgpKSBpbiBlYWdlcnM6CisgICAgICAgICAgICBmb3IgbmFtZSBpbiBlYWdlcnM6CisgICAgICAgICAgICAgICAgc2VsZi5fZXh0cmFjdF9yZXNvdXJjZShtYW5hZ2VyLCBzZWxmLl9lYWdlcl90b196aXAobmFtZSkpCisgICAgICAgIHJldHVybiBzZWxmLl9leHRyYWN0X3Jlc291cmNlKG1hbmFnZXIsIHppcF9wYXRoKQorCisgICAgZGVmIF9leHRyYWN0X3Jlc291cmNlKHNlbGYsIG1hbmFnZXIsIHppcF9wYXRoKToKKworICAgICAgICBpZiB6aXBfcGF0aCBpbiBzZWxmLl9pbmRleCgpOgorICAgICAgICAgICAgZm9yIG5hbWUgaW4gc2VsZi5faW5kZXgoKVt6aXBfcGF0aF06CisgICAgICAgICAgICAgICAgbGFzdCA9IHNlbGYuX2V4dHJhY3RfcmVzb3VyY2UoCisgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIsIG9zLnBhdGguam9pbih6aXBfcGF0aCwgbmFtZSkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICByZXR1cm4gb3MucGF0aC5kaXJuYW1lKGxhc3QpICAjIHJldHVybiB0aGUgZXh0cmFjdGVkIGRpcmVjdG9yeSBuYW1lCisKKyAgICAgICAgemlwX3N0YXQgPSBzZWxmLnppcGluZm9bemlwX3BhdGhdCisgICAgICAgIHQsZCxzaXplID0gemlwX3N0YXRbNV0sIHppcF9zdGF0WzZdLCB6aXBfc3RhdFszXQorICAgICAgICBkYXRlX3RpbWUgPSAoCisgICAgICAgICAgICAoZD4+OSkrMTk4MCwgKGQ+PjUpJjB4RiwgZCYweDFGLCAgICAgICAgICAgICAgICAgICAgICAjIHltZAorICAgICAgICAgICAgKHQmMHhGRkZGKT4+MTEsICh0Pj41KSYweDNGLCAodCYweDFGKSAqIDIsIDAsIDAsIC0xICAgIyBobXMsIGV0Yy4KKyAgICAgICAgKQorICAgICAgICB0aW1lc3RhbXAgPSB0aW1lLm1rdGltZShkYXRlX3RpbWUpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVhbF9wYXRoID0gbWFuYWdlci5nZXRfY2FjaGVfcGF0aCgKKyAgICAgICAgICAgICAgICBzZWxmLmVnZ19uYW1lLCBzZWxmLl9wYXJ0cyh6aXBfcGF0aCkKKyAgICAgICAgICAgICkKKworICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocmVhbF9wYXRoKToKKyAgICAgICAgICAgICAgICBzdGF0ID0gb3Muc3RhdChyZWFsX3BhdGgpCisgICAgICAgICAgICAgICAgaWYgc3RhdC5zdF9zaXplPT1zaXplIGFuZCBzdGF0LnN0X210aW1lPT10aW1lc3RhbXA6CisgICAgICAgICAgICAgICAgICAgICMgc2l6ZSBhbmQgc3RhbXAgbWF0Y2gsIGRvbid0IGJvdGhlciBleHRyYWN0aW5nCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFsX3BhdGgKKworICAgICAgICAgICAgb3V0ZiwgdG1wbmFtID0gX21rc3RlbXAoIi4kZXh0cmFjdCIsIGRpcj1vcy5wYXRoLmRpcm5hbWUocmVhbF9wYXRoKSkKKyAgICAgICAgICAgIG9zLndyaXRlKG91dGYsIHNlbGYubG9hZGVyLmdldF9kYXRhKHppcF9wYXRoKSkKKyAgICAgICAgICAgIG9zLmNsb3NlKG91dGYpCisgICAgICAgICAgICB1dGltZSh0bXBuYW0sICh0aW1lc3RhbXAsdGltZXN0YW1wKSkKKyAgICAgICAgICAgIG1hbmFnZXIucG9zdHByb2Nlc3ModG1wbmFtLCByZWFsX3BhdGgpCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZW5hbWUodG1wbmFtLCByZWFsX3BhdGgpCisKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShyZWFsX3BhdGgpOgorICAgICAgICAgICAgICAgICAgICBzdGF0ID0gb3Muc3RhdChyZWFsX3BhdGgpCisKKyAgICAgICAgICAgICAgICAgICAgaWYgc3RhdC5zdF9zaXplPT1zaXplIGFuZCBzdGF0LnN0X210aW1lPT10aW1lc3RhbXA6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHNpemUgYW5kIHN0YW1wIG1hdGNoLCBzb21lYm9keSBkaWQgaXQganVzdCBhaGVhZCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgIyB1cywgc28gd2UncmUgZG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAorICAgICAgICAgICAgICAgICAgICBlbGlmIG9zLm5hbWU9PSdudCc6ICAgICAjIFdpbmRvd3MsIGRlbCBvbGQgZmlsZSBhbmQgcmV0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgIHVubGluayhyZWFsX3BhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWUodG1wbmFtLCByZWFsX3BhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhbF9wYXRoCisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICBtYW5hZ2VyLmV4dHJhY3Rpb25fZXJyb3IoKSAgIyByZXBvcnQgYSB1c2VyLWZyaWVuZGx5IGVycm9yCisKKyAgICAgICAgcmV0dXJuIHJlYWxfcGF0aAorCisgICAgZGVmIF9nZXRfZWFnZXJfcmVzb3VyY2VzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmVhZ2VycyBpcyBOb25lOgorICAgICAgICAgICAgZWFnZXJzID0gW10KKyAgICAgICAgICAgIGZvciBuYW1lIGluICgnbmF0aXZlX2xpYnMudHh0JywgJ2VhZ2VyX3Jlc291cmNlcy50eHQnKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmhhc19tZXRhZGF0YShuYW1lKToKKyAgICAgICAgICAgICAgICAgICAgZWFnZXJzLmV4dGVuZChzZWxmLmdldF9tZXRhZGF0YV9saW5lcyhuYW1lKSkKKyAgICAgICAgICAgIHNlbGYuZWFnZXJzID0gZWFnZXJzCisgICAgICAgIHJldHVybiBzZWxmLmVhZ2VycworCisgICAgZGVmIF9pbmRleChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2RpcmluZGV4CisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIGluZCA9IHt9CisgICAgICAgICAgICBmb3IgcGF0aCBpbiBzZWxmLnppcGluZm86CisgICAgICAgICAgICAgICAgcGFydHMgPSBwYXRoLnNwbGl0KG9zLnNlcCkKKyAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0czoKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0gb3Muc2VwLmpvaW4ocGFydHNbOi0xXSkKKyAgICAgICAgICAgICAgICAgICAgaWYgcGFyZW50IGluIGluZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZFtwYXJlbnRdLmFwcGVuZChwYXJ0c1stMV0pCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgaW5kW3BhcmVudF0gPSBbcGFydHMucG9wKCldCisgICAgICAgICAgICBzZWxmLl9kaXJpbmRleCA9IGluZAorICAgICAgICAgICAgcmV0dXJuIGluZAorCisgICAgZGVmIF9oYXMoc2VsZiwgZnNwYXRoKToKKyAgICAgICAgemlwX3BhdGggPSBzZWxmLl96aXBpbmZvX25hbWUoZnNwYXRoKQorICAgICAgICByZXR1cm4gemlwX3BhdGggaW4gc2VsZi56aXBpbmZvIG9yIHppcF9wYXRoIGluIHNlbGYuX2luZGV4KCkKKworICAgIGRlZiBfaXNkaXIoc2VsZixmc3BhdGgpOgorICAgICAgICByZXR1cm4gc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCkgaW4gc2VsZi5faW5kZXgoKQorCisgICAgZGVmIF9saXN0ZGlyKHNlbGYsZnNwYXRoKToKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZi5faW5kZXgoKS5nZXQoc2VsZi5femlwaW5mb19uYW1lKGZzcGF0aCksICgpKSkKKworICAgIGRlZiBfZWFnZXJfdG9femlwKHNlbGYscmVzb3VyY2VfbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoc2VsZi5fZm4oc2VsZi5lZ2dfcm9vdCxyZXNvdXJjZV9uYW1lKSkKKworICAgIGRlZiBfcmVzb3VyY2VfdG9femlwKHNlbGYscmVzb3VyY2VfbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLl96aXBpbmZvX25hbWUoc2VsZi5fZm4oc2VsZi5tb2R1bGVfcGF0aCxyZXNvdXJjZV9uYW1lKSkKKworcmVnaXN0ZXJfbG9hZGVyX3R5cGUoemlwaW1wb3J0LnppcGltcG9ydGVyLCBaaXBQcm92aWRlcikKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2NsYXNzIEZpbGVNZXRhZGF0YShFbXB0eVByb3ZpZGVyKToKKyAgICAiIiJNZXRhZGF0YSBoYW5kbGVyIGZvciBzdGFuZGFsb25lIFBLRy1JTkZPIGZpbGVzCisKKyAgICBVc2FnZTo6CisKKyAgICAgICAgbWV0YWRhdGEgPSBGaWxlTWV0YWRhdGEoIi9wYXRoL3RvL1BLRy1JTkZPIikKKworICAgIFRoaXMgcHJvdmlkZXIgcmVqZWN0cyBhbGwgZGF0YSBhbmQgbWV0YWRhdGEgcmVxdWVzdHMgZXhjZXB0IGZvciBQS0ctSU5GTywKKyAgICB3aGljaCBpcyB0cmVhdGVkIGFzIGV4aXN0aW5nLCBhbmQgd2lsbCBiZSB0aGUgY29udGVudHMgb2YgdGhlIGZpbGUgYXQKKyAgICB0aGUgcHJvdmlkZWQgbG9jYXRpb24uCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZixwYXRoKToKKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorCisgICAgZGVmIGhhc19tZXRhZGF0YShzZWxmLG5hbWUpOgorICAgICAgICByZXR1cm4gbmFtZT09J1BLRy1JTkZPJworCisgICAgZGVmIGdldF9tZXRhZGF0YShzZWxmLG5hbWUpOgorICAgICAgICBpZiBuYW1lPT0nUEtHLUlORk8nOgorICAgICAgICAgICAgcmV0dXJuIG9wZW4oc2VsZi5wYXRoLCdyVScpLnJlYWQoKQorICAgICAgICByYWlzZSBLZXlFcnJvcigiTm8gbWV0YWRhdGEgZXhjZXB0IFBLRy1JTkZPIGlzIGF2YWlsYWJsZSIpCisKKyAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKHNlbGYsbmFtZSk6CisgICAgICAgIHJldHVybiB5aWVsZF9saW5lcyhzZWxmLmdldF9tZXRhZGF0YShuYW1lKSkKKworCisKKworCisKKworCisKKworCisKKworCisKKworY2xhc3MgUGF0aE1ldGFkYXRhKERlZmF1bHRQcm92aWRlcik6CisgICAgIiIiTWV0YWRhdGEgcHJvdmlkZXIgZm9yIGVnZyBkaXJlY3RvcmllcworCisgICAgVXNhZ2U6OgorCisgICAgICAgICMgRGV2ZWxvcG1lbnQgZWdnczoKKworICAgICAgICBlZ2dfaW5mbyA9ICIvcGF0aC90by9QYWNrYWdlTmFtZS5lZ2ctaW5mbyIKKyAgICAgICAgYmFzZV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoZWdnX2luZm8pCisgICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGJhc2VfZGlyLCBlZ2dfaW5mbykKKyAgICAgICAgZGlzdF9uYW1lID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGVnZ19pbmZvKSlbMF0KKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihiYXNlZGlyLHByb2plY3RfbmFtZT1kaXN0X25hbWUsbWV0YWRhdGE9bWV0YWRhdGEpCisKKyAgICAgICAgIyBVbnBhY2tlZCBlZ2cgZGlyZWN0b3JpZXM6CisKKyAgICAgICAgZWdnX3BhdGggPSAiL3BhdGgvdG8vUGFja2FnZU5hbWUtdmVyLXB5dmVyLWV0Yy5lZ2ciCisgICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGVnZ19wYXRoLCBvcy5wYXRoLmpvaW4oZWdnX3BhdGgsJ0VHRy1JTkZPJykpCisgICAgICAgIGRpc3QgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZShlZ2dfcGF0aCwgbWV0YWRhdGE9bWV0YWRhdGEpCisgICAgIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGgsIGVnZ19pbmZvKToKKyAgICAgICAgc2VsZi5tb2R1bGVfcGF0aCA9IHBhdGgKKyAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IGVnZ19pbmZvCisKKworY2xhc3MgRWdnTWV0YWRhdGEoWmlwUHJvdmlkZXIpOgorICAgICIiIk1ldGFkYXRhIHByb3ZpZGVyIGZvciAuZWdnIGZpbGVzIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgaW1wb3J0ZXIpOgorICAgICAgICAiIiJDcmVhdGUgYSBtZXRhZGF0YSBwcm92aWRlciBmcm9tIGEgemlwaW1wb3J0ZXIiIiIKKworICAgICAgICBzZWxmLnppcGluZm8gPSB6aXBpbXBvcnQuX3ppcF9kaXJlY3RvcnlfY2FjaGVbaW1wb3J0ZXIuYXJjaGl2ZV0KKyAgICAgICAgc2VsZi56aXBfcHJlID0gaW1wb3J0ZXIuYXJjaGl2ZStvcy5zZXAKKyAgICAgICAgc2VsZi5sb2FkZXIgPSBpbXBvcnRlcgorICAgICAgICBpZiBpbXBvcnRlci5wcmVmaXg6CisgICAgICAgICAgICBzZWxmLm1vZHVsZV9wYXRoID0gb3MucGF0aC5qb2luKGltcG9ydGVyLmFyY2hpdmUsIGltcG9ydGVyLnByZWZpeCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYubW9kdWxlX3BhdGggPSBpbXBvcnRlci5hcmNoaXZlCisgICAgICAgIHNlbGYuX3NldHVwX3ByZWZpeCgpCisKKworCitfZGlzdHJpYnV0aW9uX2ZpbmRlcnMgPSB7fQorCitkZWYgcmVnaXN0ZXJfZmluZGVyKGltcG9ydGVyX3R5cGUsIGRpc3RyaWJ1dGlvbl9maW5kZXIpOgorICAgICIiIlJlZ2lzdGVyIGBkaXN0cmlidXRpb25fZmluZGVyYCB0byBmaW5kIGRpc3RyaWJ1dGlvbnMgaW4gc3lzLnBhdGggaXRlbXMKKworICAgIGBpbXBvcnRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgIkltcG9ydGVyIiAoc3lzLnBhdGggaXRlbQorICAgIGhhbmRsZXIpLCBhbmQgYGRpc3RyaWJ1dGlvbl9maW5kZXJgIGlzIGEgY2FsbGFibGUgdGhhdCwgcGFzc2VkIGEgcGF0aAorICAgIGl0ZW0gYW5kIHRoZSBpbXBvcnRlciBpbnN0YW5jZSwgeWllbGRzIGBgRGlzdHJpYnV0aW9uYGAgaW5zdGFuY2VzIGZvdW5kIG9uCisgICAgdGhhdCBwYXRoIGl0ZW0uICBTZWUgYGBwa2dfcmVzb3VyY2VzLmZpbmRfb25fcGF0aGBgIGZvciBhbiBleGFtcGxlLiIiIgorICAgIF9kaXN0cmlidXRpb25fZmluZGVyc1tpbXBvcnRlcl90eXBlXSA9IGRpc3RyaWJ1dGlvbl9maW5kZXIKKworCitkZWYgZmluZF9kaXN0cmlidXRpb25zKHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CisgICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBhY2Nlc3NpYmxlIHZpYSBgcGF0aF9pdGVtYCIiIgorICAgIGltcG9ydGVyID0gZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSkKKyAgICBmaW5kZXIgPSBfZmluZF9hZGFwdGVyKF9kaXN0cmlidXRpb25fZmluZGVycywgaW1wb3J0ZXIpCisgICAgcmV0dXJuIGZpbmRlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBvbmx5KQorCitkZWYgZmluZF9pbl96aXAoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CisgICAgbWV0YWRhdGEgPSBFZ2dNZXRhZGF0YShpbXBvcnRlcikKKyAgICBpZiBtZXRhZGF0YS5oYXNfbWV0YWRhdGEoJ1BLRy1JTkZPJyk6CisgICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKHBhdGhfaXRlbSwgbWV0YWRhdGE9bWV0YWRhdGEpCisgICAgaWYgb25seToKKyAgICAgICAgcmV0dXJuICAjIGRvbid0IHlpZWxkIG5lc3RlZCBkaXN0cm9zCisgICAgZm9yIHN1Yml0ZW0gaW4gbWV0YWRhdGEucmVzb3VyY2VfbGlzdGRpcignLycpOgorICAgICAgICBpZiBzdWJpdGVtLmVuZHN3aXRoKCcuZWdnJyk6CisgICAgICAgICAgICBzdWJwYXRoID0gb3MucGF0aC5qb2luKHBhdGhfaXRlbSwgc3ViaXRlbSkKKyAgICAgICAgICAgIGZvciBkaXN0IGluIGZpbmRfaW5femlwKHppcGltcG9ydC56aXBpbXBvcnRlcihzdWJwYXRoKSwgc3VicGF0aCk6CisgICAgICAgICAgICAgICAgeWllbGQgZGlzdAorCityZWdpc3Rlcl9maW5kZXIoemlwaW1wb3J0LnppcGltcG9ydGVyLCBmaW5kX2luX3ppcCkKKworZGVmIFN0cmluZ0lPKCphcmdzLCAqKmt3KToKKyAgICAiIiJUaHVuayB0byBsb2FkIHRoZSByZWFsIFN0cmluZ0lPIG9uIGRlbWFuZCIiIgorICAgIGdsb2JhbCBTdHJpbmdJTworICAgIHRyeToKKyAgICAgICAgZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTworICAgIHJldHVybiBTdHJpbmdJTygqYXJncywqKmt3KQorCitkZWYgZmluZF9ub3RoaW5nKGltcG9ydGVyLCBwYXRoX2l0ZW0sIG9ubHk9RmFsc2UpOgorICAgIHJldHVybiAoKQorcmVnaXN0ZXJfZmluZGVyKG9iamVjdCxmaW5kX25vdGhpbmcpCisKK2RlZiBmaW5kX29uX3BhdGgoaW1wb3J0ZXIsIHBhdGhfaXRlbSwgb25seT1GYWxzZSk6CisgICAgIiIiWWllbGQgZGlzdHJpYnV0aW9ucyBhY2Nlc3NpYmxlIG9uIGEgc3lzLnBhdGggZGlyZWN0b3J5IiIiCisgICAgcGF0aF9pdGVtID0gX25vcm1hbGl6ZV9jYWNoZWQocGF0aF9pdGVtKQorCisgICAgaWYgb3MucGF0aC5pc2RpcihwYXRoX2l0ZW0pOgorICAgICAgICBpZiBwYXRoX2l0ZW0ubG93ZXIoKS5lbmRzd2l0aCgnLmVnZycpOgorICAgICAgICAgICAgIyB1bnBhY2tlZCBlZ2cKKyAgICAgICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKAorICAgICAgICAgICAgICAgIHBhdGhfaXRlbSwgbWV0YWRhdGE9UGF0aE1ldGFkYXRhKAorICAgICAgICAgICAgICAgICAgICBwYXRoX2l0ZW0sIG9zLnBhdGguam9pbihwYXRoX2l0ZW0sJ0VHRy1JTkZPJykKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIHNjYW4gZm9yIC5lZ2cgYW5kIC5lZ2ctaW5mbyBpbiBkaXJlY3RvcnkKKyAgICAgICAgICAgIGZvciBlbnRyeSBpbiBvcy5saXN0ZGlyKHBhdGhfaXRlbSk6CisgICAgICAgICAgICAgICAgbG93ZXIgPSBlbnRyeS5sb3dlcigpCisgICAgICAgICAgICAgICAgaWYgbG93ZXIuZW5kc3dpdGgoJy5lZ2ctaW5mbycpOgorICAgICAgICAgICAgICAgICAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihwYXRoX2l0ZW0sIGVudHJ5KQorICAgICAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGZ1bGxwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgZWdnLWluZm8gZGlyZWN0b3J5LCBhbGxvdyBnZXR0aW5nIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IFBhdGhNZXRhZGF0YShwYXRoX2l0ZW0sIGZ1bGxwYXRoKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSBGaWxlTWV0YWRhdGEoZnVsbHBhdGgpCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbi5mcm9tX2xvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aF9pdGVtLGVudHJ5LG1ldGFkYXRhLHByZWNlZGVuY2U9REVWRUxPUF9ESVNUCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBlbGlmIG5vdCBvbmx5IGFuZCBsb3dlci5lbmRzd2l0aCgnLmVnZycpOgorICAgICAgICAgICAgICAgICAgICBmb3IgZGlzdCBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMob3MucGF0aC5qb2luKHBhdGhfaXRlbSwgZW50cnkpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIGRpc3QKKyAgICAgICAgICAgICAgICBlbGlmIG5vdCBvbmx5IGFuZCBsb3dlci5lbmRzd2l0aCgnLmVnZy1saW5rJyk6CisgICAgICAgICAgICAgICAgICAgIGZvciBsaW5lIGluIGZpbGUob3MucGF0aC5qb2luKHBhdGhfaXRlbSwgZW50cnkpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lLnN0cmlwKCk6IGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBmaW5kX2Rpc3RyaWJ1dGlvbnMobGluZS5yc3RyaXAoKSk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgaXRlbQorCityZWdpc3Rlcl9maW5kZXIocGtndXRpbC5JbXBJbXBvcnRlciwgZmluZF9vbl9wYXRoKQorCitfbmFtZXNwYWNlX2hhbmRsZXJzID0ge30KK19uYW1lc3BhY2VfcGFja2FnZXMgPSB7fQorCitkZWYgcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoaW1wb3J0ZXJfdHlwZSwgbmFtZXNwYWNlX2hhbmRsZXIpOgorICAgICIiIlJlZ2lzdGVyIGBuYW1lc3BhY2VfaGFuZGxlcmAgdG8gZGVjbGFyZSBuYW1lc3BhY2UgcGFja2FnZXMKKworICAgIGBpbXBvcnRlcl90eXBlYCBpcyB0aGUgdHlwZSBvciBjbGFzcyBvZiBhIFBFUCAzMDIgIkltcG9ydGVyIiAoc3lzLnBhdGggaXRlbQorICAgIGhhbmRsZXIpLCBhbmQgYG5hbWVzcGFjZV9oYW5kbGVyYCBpcyBhIGNhbGxhYmxlIGxpa2UgdGhpczo6CisKKyAgICAgICAgZGVmIG5hbWVzcGFjZV9oYW5kbGVyKGltcG9ydGVyLHBhdGhfZW50cnksbW9kdWxlTmFtZSxtb2R1bGUpOgorICAgICAgICAgICAgIyByZXR1cm4gYSBwYXRoX2VudHJ5IHRvIHVzZSBmb3IgY2hpbGQgcGFja2FnZXMKKworICAgIE5hbWVzcGFjZSBoYW5kbGVycyBhcmUgb25seSBjYWxsZWQgaWYgdGhlIGltcG9ydGVyIG9iamVjdCBoYXMgYWxyZWFkeQorICAgIGFncmVlZCB0aGF0IGl0IGNhbiBoYW5kbGUgdGhlIHJlbGV2YW50IHBhdGggaXRlbSwgYW5kIHRoZXkgc2hvdWxkIG9ubHkKKyAgICByZXR1cm4gYSBzdWJwYXRoIGlmIHRoZSBtb2R1bGUgX19wYXRoX18gZG9lcyBub3QgYWxyZWFkeSBjb250YWluIGFuCisgICAgZXF1aXZhbGVudCBzdWJwYXRoLiAgRm9yIGFuIGV4YW1wbGUgbmFtZXNwYWNlIGhhbmRsZXIsIHNlZQorICAgIGBgcGtnX3Jlc291cmNlcy5maWxlX25zX2hhbmRsZXJgYC4KKyAgICAiIiIKKyAgICBfbmFtZXNwYWNlX2hhbmRsZXJzW2ltcG9ydGVyX3R5cGVdID0gbmFtZXNwYWNlX2hhbmRsZXIKKworZGVmIF9oYW5kbGVfbnMocGFja2FnZU5hbWUsIHBhdGhfaXRlbSk6CisgICAgIiIiRW5zdXJlIHRoYXQgbmFtZWQgcGFja2FnZSBpbmNsdWRlcyBhIHN1YnBhdGggb2YgcGF0aF9pdGVtIChpZiBuZWVkZWQpIiIiCisgICAgaW1wb3J0ZXIgPSBnZXRfaW1wb3J0ZXIocGF0aF9pdGVtKQorICAgIGlmIGltcG9ydGVyIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBOb25lCisgICAgbG9hZGVyID0gaW1wb3J0ZXIuZmluZF9tb2R1bGUocGFja2FnZU5hbWUpCisgICAgaWYgbG9hZGVyIGlzIE5vbmU6CisgICAgICAgIHJldHVybiBOb25lCisgICAgbW9kdWxlID0gc3lzLm1vZHVsZXMuZ2V0KHBhY2thZ2VOYW1lKQorICAgIGlmIG1vZHVsZSBpcyBOb25lOgorICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1twYWNrYWdlTmFtZV0gPSBuZXcubW9kdWxlKHBhY2thZ2VOYW1lKQorICAgICAgICBtb2R1bGUuX19wYXRoX18gPSBbXTsgX3NldF9wYXJlbnRfbnMocGFja2FnZU5hbWUpCisgICAgZWxpZiBub3QgaGFzYXR0cihtb2R1bGUsJ19fcGF0aF9fJyk6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvcigiTm90IGEgcGFja2FnZToiLCBwYWNrYWdlTmFtZSkKKyAgICBoYW5kbGVyID0gX2ZpbmRfYWRhcHRlcihfbmFtZXNwYWNlX2hhbmRsZXJzLCBpbXBvcnRlcikKKyAgICBzdWJwYXRoID0gaGFuZGxlcihpbXBvcnRlcixwYXRoX2l0ZW0scGFja2FnZU5hbWUsbW9kdWxlKQorICAgIGlmIHN1YnBhdGggaXMgbm90IE5vbmU6CisgICAgICAgIHBhdGggPSBtb2R1bGUuX19wYXRoX187IHBhdGguYXBwZW5kKHN1YnBhdGgpCisgICAgICAgIGxvYWRlci5sb2FkX21vZHVsZShwYWNrYWdlTmFtZSk7IG1vZHVsZS5fX3BhdGhfXyA9IHBhdGgKKyAgICByZXR1cm4gc3VicGF0aAorCitkZWYgZGVjbGFyZV9uYW1lc3BhY2UocGFja2FnZU5hbWUpOgorICAgICIiIkRlY2xhcmUgdGhhdCBwYWNrYWdlICdwYWNrYWdlTmFtZScgaXMgYSBuYW1lc3BhY2UgcGFja2FnZSIiIgorCisgICAgaW1wLmFjcXVpcmVfbG9jaygpCisgICAgdHJ5OgorICAgICAgICBpZiBwYWNrYWdlTmFtZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgcGF0aCwgcGFyZW50ID0gc3lzLnBhdGgsIE5vbmUKKyAgICAgICAgaWYgJy4nIGluIHBhY2thZ2VOYW1lOgorICAgICAgICAgICAgcGFyZW50ID0gJy4nLmpvaW4ocGFja2FnZU5hbWUuc3BsaXQoJy4nKVs6LTFdKQorICAgICAgICAgICAgZGVjbGFyZV9uYW1lc3BhY2UocGFyZW50KQorICAgICAgICAgICAgX19pbXBvcnRfXyhwYXJlbnQpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcGF0aCA9IHN5cy5tb2R1bGVzW3BhcmVudF0uX19wYXRoX18KKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IoIk5vdCBhIHBhY2thZ2U6IiwgcGFyZW50KQorCisgICAgICAgICMgVHJhY2sgd2hhdCBwYWNrYWdlcyBhcmUgbmFtZXNwYWNlcywgc28gd2hlbiBuZXcgcGF0aCBpdGVtcyBhcmUgYWRkZWQsCisgICAgICAgICMgdGhleSBjYW4gYmUgdXBkYXRlZAorICAgICAgICBfbmFtZXNwYWNlX3BhY2thZ2VzLnNldGRlZmF1bHQocGFyZW50LFtdKS5hcHBlbmQocGFja2FnZU5hbWUpCisgICAgICAgIF9uYW1lc3BhY2VfcGFja2FnZXMuc2V0ZGVmYXVsdChwYWNrYWdlTmFtZSxbXSkKKworICAgICAgICBmb3IgcGF0aF9pdGVtIGluIHBhdGg6CisgICAgICAgICAgICAjIEVuc3VyZSBhbGwgdGhlIHBhcmVudCdzIHBhdGggaXRlbXMgYXJlIHJlZmxlY3RlZCBpbiB0aGUgY2hpbGQsCisgICAgICAgICAgICAjIGlmIHRoZXkgYXBwbHkKKyAgICAgICAgICAgIF9oYW5kbGVfbnMocGFja2FnZU5hbWUsIHBhdGhfaXRlbSkKKworICAgIGZpbmFsbHk6CisgICAgICAgIGltcC5yZWxlYXNlX2xvY2soKQorCitkZWYgZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHBhdGhfaXRlbSwgcGFyZW50PU5vbmUpOgorICAgICIiIkVuc3VyZSB0aGF0IHByZXZpb3VzbHktZGVjbGFyZWQgbmFtZXNwYWNlIHBhY2thZ2VzIGluY2x1ZGUgcGF0aF9pdGVtIiIiCisgICAgaW1wLmFjcXVpcmVfbG9jaygpCisgICAgdHJ5OgorICAgICAgICBmb3IgcGFja2FnZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzLmdldChwYXJlbnQsKCkpOgorICAgICAgICAgICAgc3VicGF0aCA9IF9oYW5kbGVfbnMocGFja2FnZSwgcGF0aF9pdGVtKQorICAgICAgICAgICAgaWYgc3VicGF0aDogZml4dXBfbmFtZXNwYWNlX3BhY2thZ2VzKHN1YnBhdGgscGFja2FnZSkKKyAgICBmaW5hbGx5OgorICAgICAgICBpbXAucmVsZWFzZV9sb2NrKCkKKworZGVmIGZpbGVfbnNfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKToKKyAgICAiIiJDb21wdXRlIGFuIG5zLXBhY2thZ2Ugc3VicGF0aCBmb3IgYSBmaWxlc3lzdGVtIG9yIHppcGZpbGUgaW1wb3J0ZXIiIiIKKworICAgIHN1YnBhdGggPSBvcy5wYXRoLmpvaW4ocGF0aF9pdGVtLCBwYWNrYWdlTmFtZS5zcGxpdCgnLicpWy0xXSkKKyAgICBub3JtYWxpemVkID0gX25vcm1hbGl6ZV9jYWNoZWQoc3VicGF0aCkKKyAgICBmb3IgaXRlbSBpbiBtb2R1bGUuX19wYXRoX186CisgICAgICAgIGlmIF9ub3JtYWxpemVfY2FjaGVkKGl0ZW0pPT1ub3JtYWxpemVkOgorICAgICAgICAgICAgYnJlYWsKKyAgICBlbHNlOgorICAgICAgICAjIE9ubHkgcmV0dXJuIHRoZSBwYXRoIGlmIGl0J3Mgbm90IGFscmVhZHkgdGhlcmUKKyAgICAgICAgcmV0dXJuIHN1YnBhdGgKKworcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIocGtndXRpbC5JbXBJbXBvcnRlciwgZmlsZV9uc19oYW5kbGVyKQorcmVnaXN0ZXJfbmFtZXNwYWNlX2hhbmRsZXIoemlwaW1wb3J0LnppcGltcG9ydGVyLCBmaWxlX25zX2hhbmRsZXIpCisKKworZGVmIG51bGxfbnNfaGFuZGxlcihpbXBvcnRlciwgcGF0aF9pdGVtLCBwYWNrYWdlTmFtZSwgbW9kdWxlKToKKyAgICByZXR1cm4gTm9uZQorCityZWdpc3Rlcl9uYW1lc3BhY2VfaGFuZGxlcihvYmplY3QsbnVsbF9uc19oYW5kbGVyKQorCisKK2RlZiBub3JtYWxpemVfcGF0aChmaWxlbmFtZSk6CisgICAgIiIiTm9ybWFsaXplIGEgZmlsZS9kaXIgbmFtZSBmb3IgY29tcGFyaXNvbiBwdXJwb3NlcyIiIgorICAgIHJldHVybiBvcy5wYXRoLm5vcm1jYXNlKG9zLnBhdGgucmVhbHBhdGgoZmlsZW5hbWUpKQorCitkZWYgX25vcm1hbGl6ZV9jYWNoZWQoZmlsZW5hbWUsX2NhY2hlPXt9KToKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBfY2FjaGVbZmlsZW5hbWVdCisgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICBfY2FjaGVbZmlsZW5hbWVdID0gcmVzdWx0ID0gbm9ybWFsaXplX3BhdGgoZmlsZW5hbWUpCisgICAgICAgIHJldHVybiByZXN1bHQKKworZGVmIF9zZXRfcGFyZW50X25zKHBhY2thZ2VOYW1lKToKKyAgICBwYXJ0cyA9IHBhY2thZ2VOYW1lLnNwbGl0KCcuJykKKyAgICBuYW1lID0gcGFydHMucG9wKCkKKyAgICBpZiBwYXJ0czoKKyAgICAgICAgcGFyZW50ID0gJy4nLmpvaW4ocGFydHMpCisgICAgICAgIHNldGF0dHIoc3lzLm1vZHVsZXNbcGFyZW50XSwgbmFtZSwgc3lzLm1vZHVsZXNbcGFja2FnZU5hbWVdKQorCisKK2RlZiB5aWVsZF9saW5lcyhzdHJzKToKKyAgICAiIiJZaWVsZCBub24tZW1wdHkvbm9uLWNvbW1lbnQgbGluZXMgb2YgYSBgYGJhc2VzdHJpbmdgYCBvciBzZXF1ZW5jZSIiIgorICAgIGlmIGlzaW5zdGFuY2Uoc3RycyxiYXNlc3RyaW5nKToKKyAgICAgICAgZm9yIHMgaW4gc3Rycy5zcGxpdGxpbmVzKCk6CisgICAgICAgICAgICBzID0gcy5zdHJpcCgpCisgICAgICAgICAgICBpZiBzIGFuZCBub3Qgcy5zdGFydHN3aXRoKCcjJyk6ICAgICAjIHNraXAgYmxhbmsgbGluZXMvY29tbWVudHMKKyAgICAgICAgICAgICAgICB5aWVsZCBzCisgICAgZWxzZToKKyAgICAgICAgZm9yIHNzIGluIHN0cnM6CisgICAgICAgICAgICBmb3IgcyBpbiB5aWVsZF9saW5lcyhzcyk6CisgICAgICAgICAgICAgICAgeWllbGQgcworCitMSU5FX0VORCA9IHJlLmNvbXBpbGUociJccyooIy4qKT8kIikubWF0Y2ggICAgICAgICAjIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnQKK0NPTlRJTlVFID0gcmUuY29tcGlsZShyIlxzKlxcXHMqKCMuKik/JCIpLm1hdGNoICAgICMgbGluZSBjb250aW51YXRpb24KK0RJU1RSTyAgID0gcmUuY29tcGlsZShyIlxzKigoXHd8Wy0uXSkrKSIpLm1hdGNoICAgICMgRGlzdHJpYnV0aW9uIG9yIGV4dHJhCitWRVJTSU9OICA9IHJlLmNvbXBpbGUociJccyooPD0/fD49P3w9PXwhPSlccyooKFx3fFstLl0pKykiKS5tYXRjaCAgIyB2ZXIuIGluZm8KK0NPTU1BICAgID0gcmUuY29tcGlsZShyIlxzKiwiKS5tYXRjaCAgICAgICAgICAgICAgICMgY29tbWEgYmV0d2VlbiBpdGVtcworT0JSQUNLRVQgPSByZS5jb21waWxlKHIiXHMqXFsiKS5tYXRjaAorQ0JSQUNLRVQgPSByZS5jb21waWxlKHIiXHMqXF0iKS5tYXRjaAorTU9EVUxFICAgPSByZS5jb21waWxlKHIiXHcrKFwuXHcrKSokIikubWF0Y2gKK0VHR19OQU1FID0gcmUuY29tcGlsZSgKKyAgICByIig/UDxuYW1lPlteLV0rKSIKKyAgICByIiggLSg/UDx2ZXI+W14tXSspICgtcHkoP1A8cHl2ZXI+W14tXSspICgtKD9QPHBsYXQ+LispKT8gKT8gKT8iLAorICAgIHJlLlZFUkJPU0UgfCByZS5JR05PUkVDQVNFCispLm1hdGNoCisKK2NvbXBvbmVudF9yZSA9IHJlLmNvbXBpbGUocicoXGQrIHwgW2Etel0rIHwgXC58IC0pJywgcmUuVkVSQk9TRSkKK3JlcGxhY2UgPSB7J3ByZSc6J2MnLCAncHJldmlldyc6J2MnLCctJzonZmluYWwtJywncmMnOidjJ30uZ2V0CisKK2RlZiBfcGFyc2VfdmVyc2lvbl9wYXJ0cyhzKToKKyAgICBmb3IgcGFydCBpbiBjb21wb25lbnRfcmUuc3BsaXQocyk6CisgICAgICAgIHBhcnQgPSByZXBsYWNlKHBhcnQscGFydCkKKyAgICAgICAgaWYgbm90IHBhcnQgb3IgcGFydD09Jy4nOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgaWYgcGFydFs6MV0gaW4gJzAxMjM0NTY3ODknOgorICAgICAgICAgICAgeWllbGQgcGFydC56ZmlsbCg4KSAgICAjIHBhZCBmb3IgbnVtZXJpYyBjb21wYXJpc29uCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB5aWVsZCAnKicrcGFydAorCisgICAgeWllbGQgJypmaW5hbCcgICMgZW5zdXJlIHRoYXQgYWxwaGEvYmV0YS9jYW5kaWRhdGUgYXJlIGJlZm9yZSBmaW5hbAorCitkZWYgcGFyc2VfdmVyc2lvbihzKToKKyAgICAiIiJDb252ZXJ0IGEgdmVyc2lvbiBzdHJpbmcgdG8gYSBjaHJvbm9sb2dpY2FsbHktc29ydGFibGUga2V5CisKKyAgICBUaGlzIGlzIGEgcm91Z2ggY3Jvc3MgYmV0d2VlbiBkaXN0dXRpbHMnIFN0cmljdFZlcnNpb24gYW5kIExvb3NlVmVyc2lvbjsKKyAgICBpZiB5b3UgZ2l2ZSBpdCB2ZXJzaW9ucyB0aGF0IHdvdWxkIHdvcmsgd2l0aCBTdHJpY3RWZXJzaW9uLCB0aGVuIGl0IGJlaGF2ZXMKKyAgICB0aGUgc2FtZTsgb3RoZXJ3aXNlIGl0IGFjdHMgbGlrZSBhIHNsaWdodGx5LXNtYXJ0ZXIgTG9vc2VWZXJzaW9uLiBJdCBpcworICAgICpwb3NzaWJsZSogdG8gY3JlYXRlIHBhdGhvbG9naWNhbCB2ZXJzaW9uIGNvZGluZyBzY2hlbWVzIHRoYXQgd2lsbCBmb29sCisgICAgdGhpcyBwYXJzZXIsIGJ1dCB0aGV5IHNob3VsZCBiZSB2ZXJ5IHJhcmUgaW4gcHJhY3RpY2UuCisKKyAgICBUaGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBhIHR1cGxlIG9mIHN0cmluZ3MuICBOdW1lcmljIHBvcnRpb25zIG9mIHRoZQorICAgIHZlcnNpb24gYXJlIHBhZGRlZCB0byA4IGRpZ2l0cyBzbyB0aGV5IHdpbGwgY29tcGFyZSBudW1lcmljYWxseSwgYnV0CisgICAgd2l0aG91dCByZWx5aW5nIG9uIGhvdyBudW1iZXJzIGNvbXBhcmUgcmVsYXRpdmUgdG8gc3RyaW5ncy4gIERvdHMgYXJlCisgICAgZHJvcHBlZCwgYnV0IGRhc2hlcyBhcmUgcmV0YWluZWQuICBUcmFpbGluZyB6ZXJvcyBiZXR3ZWVuIGFscGhhIHNlZ21lbnRzCisgICAgb3IgZGFzaGVzIGFyZSBzdXBwcmVzc2VkLCBzbyB0aGF0IGUuZy4gIjIuNC4wIiBpcyBjb25zaWRlcmVkIHRoZSBzYW1lIGFzCisgICAgIjIuNCIuIEFscGhhbnVtZXJpYyBwYXJ0cyBhcmUgbG93ZXItY2FzZWQuCisKKyAgICBUaGUgYWxnb3JpdGhtIGFzc3VtZXMgdGhhdCBzdHJpbmdzIGxpa2UgIi0iIGFuZCBhbnkgYWxwaGEgc3RyaW5nIHRoYXQKKyAgICBhbHBoYWJldGljYWxseSBmb2xsb3dzICJmaW5hbCIgIHJlcHJlc2VudHMgYSAicGF0Y2ggbGV2ZWwiLiAgU28sICIyLjQtMSIKKyAgICBpcyBhc3N1bWVkIHRvIGJlIGEgYnJhbmNoIG9yIHBhdGNoIG9mICIyLjQiLCBhbmQgdGhlcmVmb3JlICIyLjQuMSIgaXMKKyAgICBjb25zaWRlcmVkIG5ld2VyIHRoYW4gIjIuNC0xIiwgd2hpYyBpbiB0dXJuIGlzIG5ld2VyIHRoYW4gIjIuNCIuCisKKyAgICBTdHJpbmdzIGxpa2UgImEiLCAiYiIsICJjIiwgImFscGhhIiwgImJldGEiLCAiY2FuZGlkYXRlIiBhbmQgc28gb24gKHRoYXQKKyAgICBjb21lIGJlZm9yZSAiZmluYWwiIGFscGhhYmV0aWNhbGx5KSBhcmUgYXNzdW1lZCB0byBiZSBwcmUtcmVsZWFzZSB2ZXJzaW9ucywKKyAgICBzbyB0aGF0IHRoZSB2ZXJzaW9uICIyLjQiIGlzIGNvbnNpZGVyZWQgbmV3ZXIgdGhhbiAiMi40YTEiLgorCisgICAgRmluYWxseSwgdG8gaGFuZGxlIG1pc2NlbGxhbmVvdXMgY2FzZXMsIHRoZSBzdHJpbmdzICJwcmUiLCAicHJldmlldyIsIGFuZAorICAgICJyYyIgYXJlIHRyZWF0ZWQgYXMgaWYgdGhleSB3ZXJlICJjIiwgaS5lLiBhcyB0aG91Z2ggdGhleSB3ZXJlIHJlbGVhc2UKKyAgICBjYW5kaWRhdGVzLCBhbmQgdGhlcmVmb3JlIGFyZSBub3QgYXMgbmV3IGFzIGEgdmVyc2lvbiBzdHJpbmcgdGhhdCBkb2VzIG5vdAorICAgIGNvbnRhaW4gdGhlbS4KKyAgICAiIiIKKyAgICBwYXJ0cyA9IFtdCisgICAgZm9yIHBhcnQgaW4gX3BhcnNlX3ZlcnNpb25fcGFydHMocy5sb3dlcigpKToKKyAgICAgICAgaWYgcGFydC5zdGFydHN3aXRoKCcqJyk6CisgICAgICAgICAgICBpZiBwYXJ0PCcqZmluYWwnOiAgICMgcmVtb3ZlICctJyBiZWZvcmUgYSBwcmVyZWxlYXNlIHRhZworICAgICAgICAgICAgICAgIHdoaWxlIHBhcnRzIGFuZCBwYXJ0c1stMV09PScqZmluYWwtJzogcGFydHMucG9wKCkKKyAgICAgICAgICAgICMgcmVtb3ZlIHRyYWlsaW5nIHplcm9zIGZyb20gZWFjaCBzZXJpZXMgb2YgbnVtZXJpYyBwYXJ0cworICAgICAgICAgICAgd2hpbGUgcGFydHMgYW5kIHBhcnRzWy0xXT09JzAwMDAwMDAwJzoKKyAgICAgICAgICAgICAgICBwYXJ0cy5wb3AoKQorICAgICAgICBwYXJ0cy5hcHBlbmQocGFydCkKKyAgICByZXR1cm4gdHVwbGUocGFydHMpCisKK2NsYXNzIEVudHJ5UG9pbnQob2JqZWN0KToKKyAgICAiIiJPYmplY3QgcmVwcmVzZW50aW5nIGFuIGFkdmVydGlzZWQgaW1wb3J0YWJsZSBvYmplY3QiIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBtb2R1bGVfbmFtZSwgYXR0cnM9KCksIGV4dHJhcz0oKSwgZGlzdD1Ob25lKToKKyAgICAgICAgaWYgbm90IE1PRFVMRShtb2R1bGVfbmFtZSk6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnZhbGlkIG1vZHVsZSBuYW1lIiwgbW9kdWxlX25hbWUpCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgc2VsZi5tb2R1bGVfbmFtZSA9IG1vZHVsZV9uYW1lCisgICAgICAgIHNlbGYuYXR0cnMgPSB0dXBsZShhdHRycykKKyAgICAgICAgc2VsZi5leHRyYXMgPSBSZXF1aXJlbWVudC5wYXJzZSgoInhbJXNdIiAlICcsJy5qb2luKGV4dHJhcykpKS5leHRyYXMKKyAgICAgICAgc2VsZi5kaXN0ID0gZGlzdAorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHMgPSAiJXMgPSAlcyIgJSAoc2VsZi5uYW1lLCBzZWxmLm1vZHVsZV9uYW1lKQorICAgICAgICBpZiBzZWxmLmF0dHJzOgorICAgICAgICAgICAgcyArPSAnOicgKyAnLicuam9pbihzZWxmLmF0dHJzKQorICAgICAgICBpZiBzZWxmLmV4dHJhczoKKyAgICAgICAgICAgIHMgKz0gJyBbJXNdJyAlICcsJy5qb2luKHNlbGYuZXh0cmFzKQorICAgICAgICByZXR1cm4gcworCisgICAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgICAgICByZXR1cm4gIkVudHJ5UG9pbnQucGFyc2UoJXIpIiAlIHN0cihzZWxmKQorCisgICAgZGVmIGxvYWQoc2VsZiwgcmVxdWlyZT1UcnVlLCBlbnY9Tm9uZSwgaW5zdGFsbGVyPU5vbmUpOgorICAgICAgICBpZiByZXF1aXJlOiBzZWxmLnJlcXVpcmUoZW52LCBpbnN0YWxsZXIpCisgICAgICAgIGVudHJ5ID0gX19pbXBvcnRfXyhzZWxmLm1vZHVsZV9uYW1lLCBnbG9iYWxzKCksZ2xvYmFscygpLCBbJ19fbmFtZV9fJ10pCisgICAgICAgIGZvciBhdHRyIGluIHNlbGYuYXR0cnM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZW50cnkgPSBnZXRhdHRyKGVudHJ5LGF0dHIpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIiVyIGhhcyBubyAlciBhdHRyaWJ1dGUiICUgKGVudHJ5LGF0dHIpKQorICAgICAgICByZXR1cm4gZW50cnkKKworICAgIGRlZiByZXF1aXJlKHNlbGYsIGVudj1Ob25lLCBpbnN0YWxsZXI9Tm9uZSk6CisgICAgICAgIGlmIHNlbGYuZXh0cmFzIGFuZCBub3Qgc2VsZi5kaXN0OgorICAgICAgICAgICAgcmFpc2UgVW5rbm93bkV4dHJhKCJDYW4ndCByZXF1aXJlKCkgd2l0aG91dCBhIGRpc3RyaWJ1dGlvbiIsIHNlbGYpCisgICAgICAgIG1hcCh3b3JraW5nX3NldC5hZGQsCisgICAgICAgICAgICB3b3JraW5nX3NldC5yZXNvbHZlKHNlbGYuZGlzdC5yZXF1aXJlcyhzZWxmLmV4dHJhcyksZW52LGluc3RhbGxlcikpCisKKworCisgICAgI0BjbGFzc21ldGhvZAorICAgIGRlZiBwYXJzZShjbHMsIHNyYywgZGlzdD1Ob25lKToKKyAgICAgICAgIiIiUGFyc2UgYSBzaW5nbGUgZW50cnkgcG9pbnQgZnJvbSBzdHJpbmcgYHNyY2AKKworICAgICAgICBFbnRyeSBwb2ludCBzeW50YXggZm9sbG93cyB0aGUgZm9ybTo6CisKKyAgICAgICAgICAgIG5hbWUgPSBzb21lLm1vZHVsZTpzb21lLmF0dHIgW2V4dHJhMSxleHRyYTJdCisKKyAgICAgICAgVGhlIGVudHJ5IG5hbWUgYW5kIG1vZHVsZSBuYW1lIGFyZSByZXF1aXJlZCwgYnV0IHRoZSBgYDphdHRyc2BgIGFuZAorICAgICAgICBgYFtleHRyYXNdYGAgcGFydHMgYXJlIG9wdGlvbmFsCisgICAgICAgICIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBhdHRycyA9IGV4dHJhcyA9ICgpCisgICAgICAgICAgICBuYW1lLHZhbHVlID0gc3JjLnNwbGl0KCc9JywxKQorICAgICAgICAgICAgaWYgJ1snIGluIHZhbHVlOgorICAgICAgICAgICAgICAgIHZhbHVlLGV4dHJhcyA9IHZhbHVlLnNwbGl0KCdbJywxKQorICAgICAgICAgICAgICAgIHJlcSA9IFJlcXVpcmVtZW50LnBhcnNlKCJ4WyIrZXh0cmFzKQorICAgICAgICAgICAgICAgIGlmIHJlcS5zcGVjczogcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICAgICAgICAgIGV4dHJhcyA9IHJlcS5leHRyYXMKKyAgICAgICAgICAgIGlmICc6JyBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICB2YWx1ZSxhdHRycyA9IHZhbHVlLnNwbGl0KCc6JywxKQorICAgICAgICAgICAgICAgIGlmIG5vdCBNT0RVTEUoYXR0cnMucnN0cmlwKCkpOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yCisgICAgICAgICAgICAgICAgYXR0cnMgPSBhdHRycy5yc3RyaXAoKS5zcGxpdCgnLicpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAiRW50cnlQb2ludCBtdXN0IGJlIGluICduYW1lPW1vZHVsZTphdHRycyBbZXh0cmFzXScgZm9ybWF0IiwKKyAgICAgICAgICAgICAgICBzcmMKKyAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBjbHMobmFtZS5zdHJpcCgpLCB2YWx1ZS5sc3RyaXAoKSwgYXR0cnMsIGV4dHJhcywgZGlzdCkKKworICAgIHBhcnNlID0gY2xhc3NtZXRob2QocGFyc2UpCisKKworCisKKworCisKKworICAgICNAY2xhc3NtZXRob2QKKyAgICBkZWYgcGFyc2VfZ3JvdXAoY2xzLCBncm91cCwgbGluZXMsIGRpc3Q9Tm9uZSk6CisgICAgICAgICIiIlBhcnNlIGFuIGVudHJ5IHBvaW50IGdyb3VwIiIiCisgICAgICAgIGlmIG5vdCBNT0RVTEUoZ3JvdXApOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiSW52YWxpZCBncm91cCBuYW1lIiwgZ3JvdXApCisgICAgICAgIHRoaXMgPSB7fQorICAgICAgICBmb3IgbGluZSBpbiB5aWVsZF9saW5lcyhsaW5lcyk6CisgICAgICAgICAgICBlcCA9IGNscy5wYXJzZShsaW5lLCBkaXN0KQorICAgICAgICAgICAgaWYgZXAubmFtZSBpbiB0aGlzOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkR1cGxpY2F0ZSBlbnRyeSBwb2ludCIsIGdyb3VwLCBlcC5uYW1lKQorICAgICAgICAgICAgdGhpc1tlcC5uYW1lXT1lcAorICAgICAgICByZXR1cm4gdGhpcworCisgICAgcGFyc2VfZ3JvdXAgPSBjbGFzc21ldGhvZChwYXJzZV9ncm91cCkKKworICAgICNAY2xhc3NtZXRob2QKKyAgICBkZWYgcGFyc2VfbWFwKGNscywgZGF0YSwgZGlzdD1Ob25lKToKKyAgICAgICAgIiIiUGFyc2UgYSBtYXAgb2YgZW50cnkgcG9pbnQgZ3JvdXBzIiIiCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZGF0YSxkaWN0KToKKyAgICAgICAgICAgIGRhdGEgPSBkYXRhLml0ZW1zKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRhdGEgPSBzcGxpdF9zZWN0aW9ucyhkYXRhKQorICAgICAgICBtYXBzID0ge30KKyAgICAgICAgZm9yIGdyb3VwLCBsaW5lcyBpbiBkYXRhOgorICAgICAgICAgICAgaWYgZ3JvdXAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBpZiBub3QgbGluZXM6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRW50cnkgcG9pbnRzIG11c3QgYmUgbGlzdGVkIGluIGdyb3VwcyIpCisgICAgICAgICAgICBncm91cCA9IGdyb3VwLnN0cmlwKCkKKyAgICAgICAgICAgIGlmIGdyb3VwIGluIG1hcHM6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRHVwbGljYXRlIGdyb3VwIG5hbWUiLCBncm91cCkKKyAgICAgICAgICAgIG1hcHNbZ3JvdXBdID0gY2xzLnBhcnNlX2dyb3VwKGdyb3VwLCBsaW5lcywgZGlzdCkKKyAgICAgICAgcmV0dXJuIG1hcHMKKworICAgIHBhcnNlX21hcCA9IGNsYXNzbWV0aG9kKHBhcnNlX21hcCkKKworCisKKworCisKK2NsYXNzIERpc3RyaWJ1dGlvbihvYmplY3QpOgorICAgICIiIldyYXAgYW4gYWN0dWFsIG9yIHBvdGVudGlhbCBzeXMucGF0aCBlbnRyeSB3L21ldGFkYXRhIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsCisgICAgICAgIGxvY2F0aW9uPU5vbmUsIG1ldGFkYXRhPU5vbmUsIHByb2plY3RfbmFtZT1Ob25lLCB2ZXJzaW9uPU5vbmUsCisgICAgICAgIHB5X3ZlcnNpb249UFlfTUFKT1IsIHBsYXRmb3JtPU5vbmUsIHByZWNlZGVuY2UgPSBFR0dfRElTVAorICAgICk6CisgICAgICAgIHNlbGYucHJvamVjdF9uYW1lID0gc2FmZV9uYW1lKHByb2plY3RfbmFtZSBvciAnVW5rbm93bicpCisgICAgICAgIGlmIHZlcnNpb24gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLl92ZXJzaW9uID0gc2FmZV92ZXJzaW9uKHZlcnNpb24pCisgICAgICAgIHNlbGYucHlfdmVyc2lvbiA9IHB5X3ZlcnNpb24KKyAgICAgICAgc2VsZi5wbGF0Zm9ybSA9IHBsYXRmb3JtCisgICAgICAgIHNlbGYubG9jYXRpb24gPSBsb2NhdGlvbgorICAgICAgICBzZWxmLnByZWNlZGVuY2UgPSBwcmVjZWRlbmNlCisgICAgICAgIHNlbGYuX3Byb3ZpZGVyID0gbWV0YWRhdGEgb3IgZW1wdHlfcHJvdmlkZXIKKworICAgICNAY2xhc3NtZXRob2QKKyAgICBkZWYgZnJvbV9sb2NhdGlvbihjbHMsbG9jYXRpb24sYmFzZW5hbWUsbWV0YWRhdGE9Tm9uZSwqKmt3KToKKyAgICAgICAgcHJvamVjdF9uYW1lLCB2ZXJzaW9uLCBweV92ZXJzaW9uLCBwbGF0Zm9ybSA9IFtOb25lXSo0CisgICAgICAgIGJhc2VuYW1lLCBleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKQorICAgICAgICBpZiBleHQubG93ZXIoKSBpbiAoIi5lZ2ciLCIuZWdnLWluZm8iKToKKyAgICAgICAgICAgIG1hdGNoID0gRUdHX05BTUUoYmFzZW5hbWUpCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICBwcm9qZWN0X25hbWUsIHZlcnNpb24sIHB5X3ZlcnNpb24sIHBsYXRmb3JtID0gbWF0Y2guZ3JvdXAoCisgICAgICAgICAgICAgICAgICAgICduYW1lJywndmVyJywncHl2ZXInLCdwbGF0JworICAgICAgICAgICAgICAgICkKKyAgICAgICAgcmV0dXJuIGNscygKKyAgICAgICAgICAgIGxvY2F0aW9uLCBtZXRhZGF0YSwgcHJvamVjdF9uYW1lPXByb2plY3RfbmFtZSwgdmVyc2lvbj12ZXJzaW9uLAorICAgICAgICAgICAgcHlfdmVyc2lvbj1weV92ZXJzaW9uLCBwbGF0Zm9ybT1wbGF0Zm9ybSwgKiprdworICAgICAgICApCisgICAgZnJvbV9sb2NhdGlvbiA9IGNsYXNzbWV0aG9kKGZyb21fbG9jYXRpb24pCisKKyAgICBoYXNoY21wID0gcHJvcGVydHkoCisgICAgICAgIGxhbWJkYSBzZWxmOiAoCisgICAgICAgICAgICBnZXRhdHRyKHNlbGYsJ3BhcnNlZF92ZXJzaW9uJywoKSksIHNlbGYucHJlY2VkZW5jZSwgc2VsZi5rZXksCisgICAgICAgICAgICAtbGVuKHNlbGYubG9jYXRpb24gb3IgJycpLCBzZWxmLmxvY2F0aW9uLCBzZWxmLnB5X3ZlcnNpb24sCisgICAgICAgICAgICBzZWxmLnBsYXRmb3JtCisgICAgICAgICkKKyAgICApCisgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOiByZXR1cm4gY21wKHNlbGYuaGFzaGNtcCwgb3RoZXIpCisgICAgZGVmIF9faGFzaF9fKHNlbGYpOiByZXR1cm4gaGFzaChzZWxmLmhhc2hjbXApCisKKyAgICAjIFRoZXNlIHByb3BlcnRpZXMgaGF2ZSB0byBiZSBsYXp5IHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0byBsb2FkIGFueQorICAgICMgbWV0YWRhdGEgdW50aWwvdW5sZXNzIGl0J3MgYWN0dWFsbHkgbmVlZGVkLiAgKGkuZS4sIHNvbWUgZGlzdHJpYnV0aW9ucworICAgICMgbWF5IG5vdCBrbm93IHRoZWlyIG5hbWUgb3IgdmVyc2lvbiB3aXRob3V0IGxvYWRpbmcgUEtHLUlORk8pCisKKyAgICAjQHByb3BlcnR5CisgICAgZGVmIGtleShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2tleQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBzZWxmLl9rZXkgPSBrZXkgPSBzZWxmLnByb2plY3RfbmFtZS5sb3dlcigpCisgICAgICAgICAgICByZXR1cm4ga2V5CisgICAga2V5ID0gcHJvcGVydHkoa2V5KQorCisgICAgI0Bwcm9wZXJ0eQorICAgIGRlZiBwYXJzZWRfdmVyc2lvbihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3BhcnNlZF92ZXJzaW9uCisgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgIHNlbGYuX3BhcnNlZF92ZXJzaW9uID0gcHYgPSBwYXJzZV92ZXJzaW9uKHNlbGYudmVyc2lvbikKKyAgICAgICAgICAgIHJldHVybiBwdgorCisgICAgcGFyc2VkX3ZlcnNpb24gPSBwcm9wZXJ0eShwYXJzZWRfdmVyc2lvbikKKworICAgICNAcHJvcGVydHkKKyAgICBkZWYgdmVyc2lvbihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ZlcnNpb24KKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgZm9yIGxpbmUgaW4gc2VsZi5fZ2V0X21ldGFkYXRhKCdQS0ctSU5GTycpOgorICAgICAgICAgICAgICAgIGlmIGxpbmUubG93ZXIoKS5zdGFydHN3aXRoKCd2ZXJzaW9uOicpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl92ZXJzaW9uID0gc2FmZV92ZXJzaW9uKGxpbmUuc3BsaXQoJzonLDEpWzFdLnN0cmlwKCkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl92ZXJzaW9uCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJNaXNzaW5nICdWZXJzaW9uOicgaGVhZGVyIGFuZC9vciBQS0ctSU5GTyBmaWxlIiwgc2VsZgorICAgICAgICAgICAgICAgICkKKyAgICB2ZXJzaW9uID0gcHJvcGVydHkodmVyc2lvbikKKworCisKKworICAgICNAcHJvcGVydHkKKyAgICBkZWYgX2RlcF9tYXAoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9fZGVwX21hcAorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBkbSA9IHNlbGYuX19kZXBfbWFwID0ge05vbmU6IFtdfQorICAgICAgICAgICAgZm9yIG5hbWUgaW4gJ3JlcXVpcmVzLnR4dCcsICdkZXBlbmRzLnR4dCc6CisgICAgICAgICAgICAgICAgZm9yIGV4dHJhLHJlcXMgaW4gc3BsaXRfc2VjdGlvbnMoc2VsZi5fZ2V0X21ldGFkYXRhKG5hbWUpKToKKyAgICAgICAgICAgICAgICAgICAgaWYgZXh0cmE6IGV4dHJhID0gc2FmZV9leHRyYShleHRyYSkKKyAgICAgICAgICAgICAgICAgICAgZG0uc2V0ZGVmYXVsdChleHRyYSxbXSkuZXh0ZW5kKHBhcnNlX3JlcXVpcmVtZW50cyhyZXFzKSkKKyAgICAgICAgICAgIHJldHVybiBkbQorICAgIF9kZXBfbWFwID0gcHJvcGVydHkoX2RlcF9tYXApCisKKyAgICBkZWYgcmVxdWlyZXMoc2VsZixleHRyYXM9KCkpOgorICAgICAgICAiIiJMaXN0IG9mIFJlcXVpcmVtZW50cyBuZWVkZWQgZm9yIHRoaXMgZGlzdHJvIGlmIGBleHRyYXNgIGFyZSB1c2VkIiIiCisgICAgICAgIGRtID0gc2VsZi5fZGVwX21hcAorICAgICAgICBkZXBzID0gW10KKyAgICAgICAgZGVwcy5leHRlbmQoZG0uZ2V0KE5vbmUsKCkpKQorICAgICAgICBmb3IgZXh0IGluIGV4dHJhczoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkZXBzLmV4dGVuZChkbVtzYWZlX2V4dHJhKGV4dCldKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFVua25vd25FeHRyYSgKKyAgICAgICAgICAgICAgICAgICAgIiVzIGhhcyBubyBzdWNoIGV4dHJhIGZlYXR1cmUgJXIiICUgKHNlbGYsIGV4dCkKKyAgICAgICAgICAgICAgICApCisgICAgICAgIHJldHVybiBkZXBzCisKKyAgICBkZWYgX2dldF9tZXRhZGF0YShzZWxmLG5hbWUpOgorICAgICAgICBpZiBzZWxmLmhhc19tZXRhZGF0YShuYW1lKToKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHNlbGYuZ2V0X21ldGFkYXRhX2xpbmVzKG5hbWUpOgorICAgICAgICAgICAgICAgIHlpZWxkIGxpbmUKKworICAgIGRlZiBhY3RpdmF0ZShzZWxmLHBhdGg9Tm9uZSk6CisgICAgICAgICIiIkVuc3VyZSBkaXN0cmlidXRpb24gaXMgaW1wb3J0YWJsZSBvbiBgcGF0aGAgKGRlZmF1bHQ9c3lzLnBhdGgpIiIiCisgICAgICAgIGlmIHBhdGggaXMgTm9uZTogcGF0aCA9IHN5cy5wYXRoCisgICAgICAgIHNlbGYuaW5zZXJ0X29uKHBhdGgpCisgICAgICAgIGlmIHBhdGggaXMgc3lzLnBhdGg6CisgICAgICAgICAgICBmaXh1cF9uYW1lc3BhY2VfcGFja2FnZXMoc2VsZi5sb2NhdGlvbikKKyAgICAgICAgICAgIGZvciBwa2cgaW4gc2VsZi5fZ2V0X21ldGFkYXRhKCduYW1lc3BhY2VfcGFja2FnZXMudHh0Jyk6CisgICAgICAgICAgICAgICAgaWYgcGtnIGluIHN5cy5tb2R1bGVzOiBkZWNsYXJlX25hbWVzcGFjZShwa2cpCisKKyAgICBkZWYgZWdnX25hbWUoc2VsZik6CisgICAgICAgICIiIlJldHVybiB3aGF0IHRoaXMgZGlzdHJpYnV0aW9uJ3Mgc3RhbmRhcmQgLmVnZyBmaWxlbmFtZSBzaG91bGQgYmUiIiIKKyAgICAgICAgZmlsZW5hbWUgPSAiJXMtJXMtcHklcyIgJSAoCisgICAgICAgICAgICB0b19maWxlbmFtZShzZWxmLnByb2plY3RfbmFtZSksIHRvX2ZpbGVuYW1lKHNlbGYudmVyc2lvbiksCisgICAgICAgICAgICBzZWxmLnB5X3ZlcnNpb24gb3IgUFlfTUFKT1IKKyAgICAgICAgKQorCisgICAgICAgIGlmIHNlbGYucGxhdGZvcm06CisgICAgICAgICAgICBmaWxlbmFtZSArPSAnLScrc2VsZi5wbGF0Zm9ybQorICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworICAgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5sb2NhdGlvbjoKKyAgICAgICAgICAgIHJldHVybiAiJXMgKCVzKSIgJSAoc2VsZixzZWxmLmxvY2F0aW9uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHN0cihzZWxmKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHRyeTogdmVyc2lvbiA9IGdldGF0dHIoc2VsZiwndmVyc2lvbicsTm9uZSkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHZlcnNpb24gPSBOb25lCisgICAgICAgIHZlcnNpb24gPSB2ZXJzaW9uIG9yICJbdW5rbm93biB2ZXJzaW9uXSIKKyAgICAgICAgcmV0dXJuICIlcyAlcyIgJSAoc2VsZi5wcm9qZWN0X25hbWUsdmVyc2lvbikKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLGF0dHIpOgorICAgICAgICAiIiJEZWxlZ2F0ZSBhbGwgdW5yZWNvZ25pemVkIHB1YmxpYyBhdHRyaWJ1dGVzIHRvIC5tZXRhZGF0YSBwcm92aWRlciIiIgorICAgICAgICBpZiBhdHRyLnN0YXJ0c3dpdGgoJ18nKToKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLGF0dHIKKyAgICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fcHJvdmlkZXIsIGF0dHIpCisKKyAgICAjQGNsYXNzbWV0aG9kCisgICAgZGVmIGZyb21fZmlsZW5hbWUoY2xzLGZpbGVuYW1lLG1ldGFkYXRhPU5vbmUsICoqa3cpOgorICAgICAgICByZXR1cm4gY2xzLmZyb21fbG9jYXRpb24oCisgICAgICAgICAgICBfbm9ybWFsaXplX2NhY2hlZChmaWxlbmFtZSksIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLCBtZXRhZGF0YSwKKyAgICAgICAgICAgICoqa3cKKyAgICAgICAgKQorICAgIGZyb21fZmlsZW5hbWUgPSBjbGFzc21ldGhvZChmcm9tX2ZpbGVuYW1lKQorCisgICAgZGVmIGFzX3JlcXVpcmVtZW50KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSBgYFJlcXVpcmVtZW50YGAgdGhhdCBtYXRjaGVzIHRoaXMgZGlzdHJpYnV0aW9uIGV4YWN0bHkiIiIKKyAgICAgICAgcmV0dXJuIFJlcXVpcmVtZW50LnBhcnNlKCclcz09JXMnICUgKHNlbGYucHJvamVjdF9uYW1lLCBzZWxmLnZlcnNpb24pKQorCisgICAgZGVmIGxvYWRfZW50cnlfcG9pbnQoc2VsZiwgZ3JvdXAsIG5hbWUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGBuYW1lYCBlbnRyeSBwb2ludCBvZiBgZ3JvdXBgIG9yIHJhaXNlIEltcG9ydEVycm9yIiIiCisgICAgICAgIGVwID0gc2VsZi5nZXRfZW50cnlfaW5mbyhncm91cCxuYW1lKQorICAgICAgICBpZiBlcCBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIkVudHJ5IHBvaW50ICVyIG5vdCBmb3VuZCIgJSAoKGdyb3VwLG5hbWUpLCkpCisgICAgICAgIHJldHVybiBlcC5sb2FkKCkKKworICAgIGRlZiBnZXRfZW50cnlfbWFwKHNlbGYsIGdyb3VwPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIGVudHJ5IHBvaW50IG1hcCBmb3IgYGdyb3VwYCwgb3IgdGhlIGZ1bGwgZW50cnkgbWFwIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGVwX21hcCA9IHNlbGYuX2VwX21hcAorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBlcF9tYXAgPSBzZWxmLl9lcF9tYXAgPSBFbnRyeVBvaW50LnBhcnNlX21hcCgKKyAgICAgICAgICAgICAgICBzZWxmLl9nZXRfbWV0YWRhdGEoJ2VudHJ5X3BvaW50cy50eHQnKSwgc2VsZgorICAgICAgICAgICAgKQorICAgICAgICBpZiBncm91cCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBlcF9tYXAuZ2V0KGdyb3VwLHt9KQorICAgICAgICByZXR1cm4gZXBfbWFwCisKKyAgICBkZWYgZ2V0X2VudHJ5X2luZm8oc2VsZiwgZ3JvdXAsIG5hbWUpOgorICAgICAgICAiIiJSZXR1cm4gdGhlIEVudHJ5UG9pbnQgb2JqZWN0IGZvciBgZ3JvdXBgK2BuYW1lYCwgb3IgYGBOb25lYGAiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuZ2V0X2VudHJ5X21hcChncm91cCkuZ2V0KG5hbWUpCisKKyAgICBkZWYgaW5zZXJ0X29uKHNlbGYsIHBhdGgsIGxvYyA9IE5vbmUpOgorICAgICAgICAiIiJJbnNlcnQgc2VsZi5sb2NhdGlvbiBpbiBwYXRoIGJlZm9yZSBpdHMgbmVhcmVzdCBwYXJlbnQgZGlyZWN0b3J5IiIiCisgICAgICAgIGxvYyA9IGxvYyBvciBzZWxmLmxvY2F0aW9uCisgICAgICAgIGlmIG5vdCBsb2M6IHJldHVybgorICAgICAgICBpZiBwYXRoIGlzIHN5cy5wYXRoOgorICAgICAgICAgICAgc2VsZi5jaGVja192ZXJzaW9uX2NvbmZsaWN0KCkKKyAgICAgICAgYmVzdCwgcG9zID0gMCwgLTEKKyAgICAgICAgZm9yIHAsaXRlbSBpbiBlbnVtZXJhdGUocGF0aCk6CisgICAgICAgICAgICBpdGVtID0gX25vcm1hbGl6ZV9jYWNoZWQoaXRlbSkKKyAgICAgICAgICAgIGlmIGxvYy5zdGFydHN3aXRoKGl0ZW0pIGFuZCBsZW4oaXRlbSk+YmVzdCBhbmQgbG9jPD5pdGVtOgorICAgICAgICAgICAgICAgIGJlc3QsIHBvcyA9IGxlbihpdGVtKSwgcAorICAgICAgICBpZiBwb3M9PS0xOgorICAgICAgICAgICAgaWYgbG9jIG5vdCBpbiBwYXRoOiBwYXRoLmFwcGVuZChsb2MpCisgICAgICAgIGVsaWYgbG9jIG5vdCBpbiBwYXRoWzpwb3MrMV06CisgICAgICAgICAgICB3aGlsZSBsb2MgaW4gcGF0aDogcGF0aC5yZW1vdmUobG9jKQorICAgICAgICAgICAgcGF0aC5pbnNlcnQocG9zLGxvYykKKworCisgICAgZGVmIGNoZWNrX3ZlcnNpb25fY29uZmxpY3Qoc2VsZik6CisgICAgICAgIGlmIHNlbGYua2V5PT0nc2V0dXB0b29scyc6CisgICAgICAgICAgICByZXR1cm4gICAgICAjIGlnbm9yZSB0aGUgaW5ldml0YWJsZSBzZXR1cHRvb2xzIHNlbGYtY29uZmxpY3RzICA6KAorCisgICAgICAgIG5zcCA9IGRpY3QuZnJvbWtleXMoc2VsZi5fZ2V0X21ldGFkYXRhKCduYW1lc3BhY2VfcGFja2FnZXMudHh0JykpCisgICAgICAgIGxvYyA9IG5vcm1hbGl6ZV9wYXRoKHNlbGYubG9jYXRpb24pCisgICAgICAgIGZvciBtb2RuYW1lIGluIHNlbGYuX2dldF9tZXRhZGF0YSgndG9wX2xldmVsLnR4dCcpOgorICAgICAgICAgICAgaWYgKG1vZG5hbWUgbm90IGluIHN5cy5tb2R1bGVzIG9yIG1vZG5hbWUgaW4gbnNwCisgICAgICAgICAgICAgICAgb3IgbW9kbmFtZSBpbiBfbmFtZXNwYWNlX3BhY2thZ2VzCisgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGZuID0gZ2V0YXR0cihzeXMubW9kdWxlc1ttb2RuYW1lXSwgJ19fZmlsZV9fJywgTm9uZSkKKyAgICAgICAgICAgIGlmIGZuIGFuZCBub3JtYWxpemVfcGF0aChmbikuc3RhcnRzd2l0aChsb2MpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpc3N1ZV93YXJuaW5nKAorICAgICAgICAgICAgICAgICJNb2R1bGUgJXMgd2FzIGFscmVhZHkgaW1wb3J0ZWQgZnJvbSAlcywgYnV0ICVzIGlzIGJlaW5nIGFkZGVkIgorICAgICAgICAgICAgICAgICIgdG8gc3lzLnBhdGgiICUgKG1vZG5hbWUsIGZuLCBzZWxmLmxvY2F0aW9uKSwKKyAgICAgICAgICAgICkKKworICAgIGRlZiBoYXNfdmVyc2lvbihzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi52ZXJzaW9uCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgaXNzdWVfd2FybmluZygiVW5idWlsdCBlZ2cgZm9yICIrcmVwcihzZWxmKSkKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICByZXR1cm4gVHJ1ZQorCisgICAgZGVmIGNsb25lKHNlbGYsKiprdyk6CisgICAgICAgICIiIkNvcHkgdGhpcyBkaXN0cmlidXRpb24sIHN1YnN0aXR1dGluZyBpbiBhbnkgY2hhbmdlZCBrZXl3b3JkIGFyZ3MiIiIKKyAgICAgICAgZm9yIGF0dHIgaW4gKAorICAgICAgICAgICAgJ3Byb2plY3RfbmFtZScsICd2ZXJzaW9uJywgJ3B5X3ZlcnNpb24nLCAncGxhdGZvcm0nLCAnbG9jYXRpb24nLAorICAgICAgICAgICAgJ3ByZWNlZGVuY2UnCisgICAgICAgICk6CisgICAgICAgICAgICBrdy5zZXRkZWZhdWx0KGF0dHIsIGdldGF0dHIoc2VsZixhdHRyLE5vbmUpKQorICAgICAgICBrdy5zZXRkZWZhdWx0KCdtZXRhZGF0YScsIHNlbGYuX3Byb3ZpZGVyKQorICAgICAgICByZXR1cm4gc2VsZi5fX2NsYXNzX18oKiprdykKKworCisKKworICAgICNAcHJvcGVydHkKKyAgICBkZWYgZXh0cmFzKHNlbGYpOgorICAgICAgICByZXR1cm4gW2RlcCBmb3IgZGVwIGluIHNlbGYuX2RlcF9tYXAgaWYgZGVwXQorICAgIGV4dHJhcyA9IHByb3BlcnR5KGV4dHJhcykKKworCitkZWYgaXNzdWVfd2FybmluZygqYXJncywqKmt3KToKKyAgICBsZXZlbCA9IDEKKyAgICBnID0gZ2xvYmFscygpCisgICAgdHJ5OgorICAgICAgICAjIGZpbmQgdGhlIGZpcnN0IHN0YWNrIGZyYW1lIHRoYXQgaXMgKm5vdCogY29kZSBpbgorICAgICAgICAjIHRoZSBwa2dfcmVzb3VyY2VzIG1vZHVsZSwgdG8gdXNlIGZvciB0aGUgd2FybmluZworICAgICAgICB3aGlsZSBzeXMuX2dldGZyYW1lKGxldmVsKS5mX2dsb2JhbHMgaXMgZzoKKyAgICAgICAgICAgIGxldmVsICs9IDEKKyAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgcGFzcworICAgIGZyb20gd2FybmluZ3MgaW1wb3J0IHdhcm4KKyAgICB3YXJuKHN0YWNrbGV2ZWwgPSBsZXZlbCsxLCAqYXJncywgKiprdykKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitkZWYgcGFyc2VfcmVxdWlyZW1lbnRzKHN0cnMpOgorICAgICIiIllpZWxkIGBgUmVxdWlyZW1lbnRgYCBvYmplY3RzIGZvciBlYWNoIHNwZWNpZmljYXRpb24gaW4gYHN0cnNgCisKKyAgICBgc3Ryc2AgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBgYGJhc2VzdHJpbmdgYCwgb3IgYSAocG9zc2libHktbmVzdGVkKQorICAgIGl0ZXJhYmxlIHRoZXJlb2YuCisgICAgIiIiCisgICAgIyBjcmVhdGUgYSBzdGVwcGFibGUgaXRlcmF0b3IsIHNvIHdlIGNhbiBoYW5kbGUgXC1jb250aW51YXRpb25zCisgICAgbGluZXMgPSBpdGVyKHlpZWxkX2xpbmVzKHN0cnMpKQorCisgICAgZGVmIHNjYW5fbGlzdChJVEVNLFRFUk1JTkFUT1IsbGluZSxwLGdyb3VwcyxpdGVtX25hbWUpOgorCisgICAgICAgIGl0ZW1zID0gW10KKworICAgICAgICB3aGlsZSBub3QgVEVSTUlOQVRPUihsaW5lLHApOgorICAgICAgICAgICAgaWYgQ09OVElOVUUobGluZSxwKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lcy5uZXh0KCk7IHAgPSAwCisgICAgICAgICAgICAgICAgZXhjZXB0IFN0b3BJdGVyYXRpb246CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiXFwgbXVzdCBub3QgYXBwZWFyIG9uIHRoZSBsYXN0IG5vbmJsYW5rIGxpbmUiCisgICAgICAgICAgICAgICAgICAgICkKKworICAgICAgICAgICAgbWF0Y2ggPSBJVEVNKGxpbmUscCkKKyAgICAgICAgICAgIGlmIG5vdCBtYXRjaDoKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJFeHBlY3RlZCAiK2l0ZW1fbmFtZSsiIGluIixsaW5lLCJhdCIsbGluZVtwOl0pCisKKyAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChtYXRjaC5ncm91cCgqZ3JvdXBzKSkKKyAgICAgICAgICAgIHAgPSBtYXRjaC5lbmQoKQorCisgICAgICAgICAgICBtYXRjaCA9IENPTU1BKGxpbmUscCkKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgIHAgPSBtYXRjaC5lbmQoKSAjIHNraXAgdGhlIGNvbW1hCisgICAgICAgICAgICBlbGlmIG5vdCBURVJNSU5BVE9SKGxpbmUscCk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkICcsJyBvciBlbmQtb2YtbGlzdCBpbiIsbGluZSwiYXQiLGxpbmVbcDpdCisgICAgICAgICAgICAgICAgKQorCisgICAgICAgIG1hdGNoID0gVEVSTUlOQVRPUihsaW5lLHApCisgICAgICAgIGlmIG1hdGNoOiBwID0gbWF0Y2guZW5kKCkgICAjIHNraXAgdGhlIHRlcm1pbmF0b3IsIGlmIGFueQorICAgICAgICByZXR1cm4gbGluZSwgcCwgaXRlbXMKKworICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICBtYXRjaCA9IERJU1RSTyhsaW5lKQorICAgICAgICBpZiBub3QgbWF0Y2g6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJNaXNzaW5nIGRpc3RyaWJ1dGlvbiBzcGVjIiwgbGluZSkKKyAgICAgICAgcHJvamVjdF9uYW1lID0gbWF0Y2guZ3JvdXAoMSkKKyAgICAgICAgcCA9IG1hdGNoLmVuZCgpCisgICAgICAgIGV4dHJhcyA9IFtdCisKKyAgICAgICAgbWF0Y2ggPSBPQlJBQ0tFVChsaW5lLHApCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgcCA9IG1hdGNoLmVuZCgpCisgICAgICAgICAgICBsaW5lLCBwLCBleHRyYXMgPSBzY2FuX2xpc3QoCisgICAgICAgICAgICAgICAgRElTVFJPLCBDQlJBQ0tFVCwgbGluZSwgcCwgKDEsKSwgIidleHRyYScgbmFtZSIKKyAgICAgICAgICAgICkKKworICAgICAgICBsaW5lLCBwLCBzcGVjcyA9IHNjYW5fbGlzdChWRVJTSU9OLExJTkVfRU5ELGxpbmUscCwoMSwyKSwidmVyc2lvbiBzcGVjIikKKyAgICAgICAgc3BlY3MgPSBbKG9wLHNhZmVfdmVyc2lvbih2YWwpKSBmb3Igb3AsdmFsIGluIHNwZWNzXQorICAgICAgICB5aWVsZCBSZXF1aXJlbWVudChwcm9qZWN0X25hbWUsIHNwZWNzLCBleHRyYXMpCisKKworZGVmIF9zb3J0X2Rpc3RzKGRpc3RzKToKKyAgICB0bXAgPSBbKGRpc3QuaGFzaGNtcCxkaXN0KSBmb3IgZGlzdCBpbiBkaXN0c10KKyAgICB0bXAuc29ydCgpCisgICAgZGlzdHNbOjotMV0gPSBbZCBmb3IgaGMsZCBpbiB0bXBdCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworY2xhc3MgUmVxdWlyZW1lbnQ6CisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb2plY3RfbmFtZSwgc3BlY3MsIGV4dHJhcyk6CisgICAgICAgICIiIkRPIE5PVCBDQUxMIFRISVMgVU5ET0NVTUVOVEVEIE1FVEhPRDsgdXNlIFJlcXVpcmVtZW50LnBhcnNlKCkhIiIiCisgICAgICAgIHNlbGYudW5zYWZlX25hbWUsIHByb2plY3RfbmFtZSA9IHByb2plY3RfbmFtZSwgc2FmZV9uYW1lKHByb2plY3RfbmFtZSkKKyAgICAgICAgc2VsZi5wcm9qZWN0X25hbWUsIHNlbGYua2V5ID0gcHJvamVjdF9uYW1lLCBwcm9qZWN0X25hbWUubG93ZXIoKQorICAgICAgICBpbmRleCA9IFsocGFyc2VfdmVyc2lvbih2KSxzdGF0ZV9tYWNoaW5lW29wXSxvcCx2KSBmb3Igb3AsdiBpbiBzcGVjc10KKyAgICAgICAgaW5kZXguc29ydCgpCisgICAgICAgIHNlbGYuc3BlY3MgPSBbKG9wLHZlcikgZm9yIHBhcnNlZCx0cmFucyxvcCx2ZXIgaW4gaW5kZXhdCisgICAgICAgIHNlbGYuaW5kZXgsIHNlbGYuZXh0cmFzID0gaW5kZXgsIHR1cGxlKG1hcChzYWZlX2V4dHJhLGV4dHJhcykpCisgICAgICAgIHNlbGYuaGFzaENtcCA9ICgKKyAgICAgICAgICAgIHNlbGYua2V5LCB0dXBsZShbKG9wLHBhcnNlZCkgZm9yIHBhcnNlZCx0cmFucyxvcCx2ZXIgaW4gaW5kZXhdKSwKKyAgICAgICAgICAgIEltbXV0YWJsZVNldChzZWxmLmV4dHJhcykKKyAgICAgICAgKQorICAgICAgICBzZWxmLl9faGFzaCA9IGhhc2goc2VsZi5oYXNoQ21wKQorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHNwZWNzID0gJywnLmpvaW4oWycnLmpvaW4ocykgZm9yIHMgaW4gc2VsZi5zcGVjc10pCisgICAgICAgIGV4dHJhcyA9ICcsJy5qb2luKHNlbGYuZXh0cmFzKQorICAgICAgICBpZiBleHRyYXM6IGV4dHJhcyA9ICdbJXNdJyAlIGV4dHJhcworICAgICAgICByZXR1cm4gJyVzJXMlcycgJSAoc2VsZi5wcm9qZWN0X25hbWUsIGV4dHJhcywgc3BlY3MpCisKKyAgICBkZWYgX19lcV9fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlcixSZXF1aXJlbWVudCkgYW5kIHNlbGYuaGFzaENtcD09b3RoZXIuaGFzaENtcAorCisgICAgZGVmIF9fY29udGFpbnNfXyhzZWxmLGl0ZW0pOgorICAgICAgICBpZiBpc2luc3RhbmNlKGl0ZW0sRGlzdHJpYnV0aW9uKToKKyAgICAgICAgICAgIGlmIGl0ZW0ua2V5IDw+IHNlbGYua2V5OiByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIGlmIHNlbGYuaW5kZXg6IGl0ZW0gPSBpdGVtLnBhcnNlZF92ZXJzaW9uICAjIG9ubHkgZ2V0IGlmIHdlIG5lZWQgaXQKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGl0ZW0sYmFzZXN0cmluZyk6CisgICAgICAgICAgICBpdGVtID0gcGFyc2VfdmVyc2lvbihpdGVtKQorICAgICAgICBsYXN0ID0gTm9uZQorICAgICAgICBmb3IgcGFyc2VkLHRyYW5zLG9wLHZlciBpbiBzZWxmLmluZGV4OgorICAgICAgICAgICAgYWN0aW9uID0gdHJhbnNbY21wKGl0ZW0scGFyc2VkKV0KKyAgICAgICAgICAgIGlmIGFjdGlvbj09J0YnOiAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBlbGlmIGFjdGlvbj09J1QnOiAgIHJldHVybiBUcnVlCisgICAgICAgICAgICBlbGlmIGFjdGlvbj09JysnOiAgIGxhc3QgPSBUcnVlCisgICAgICAgICAgICBlbGlmIGFjdGlvbj09Jy0nIG9yIGxhc3QgaXMgTm9uZTogICBsYXN0ID0gRmFsc2UKKyAgICAgICAgaWYgbGFzdCBpcyBOb25lOiBsYXN0ID0gVHJ1ZSAgICAjIG5vIHJ1bGVzIGVuY291bnRlcmVkCisgICAgICAgIHJldHVybiBsYXN0CisKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX19oYXNoCisKKyAgICBkZWYgX19yZXByX18oc2VsZik6IHJldHVybiAiUmVxdWlyZW1lbnQucGFyc2UoJXIpIiAlIHN0cihzZWxmKQorCisgICAgI0BzdGF0aWNtZXRob2QKKyAgICBkZWYgcGFyc2Uocyk6CisgICAgICAgIHJlcXMgPSBsaXN0KHBhcnNlX3JlcXVpcmVtZW50cyhzKSkKKyAgICAgICAgaWYgcmVxczoKKyAgICAgICAgICAgIGlmIGxlbihyZXFzKT09MToKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVxc1swXQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiRXhwZWN0ZWQgb25seSBvbmUgcmVxdWlyZW1lbnQiLCBzKQorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJObyByZXF1aXJlbWVudHMgZm91bmQiLCBzKQorCisgICAgcGFyc2UgPSBzdGF0aWNtZXRob2QocGFyc2UpCisKK3N0YXRlX21hY2hpbmUgPSB7CisgICAgIyAgICAgICA9PjwKKyAgICAnPCcgOiAgJy0tVCcsCisgICAgJzw9JzogICdULVQnLAorICAgICc+JyA6ICAnRitGJywKKyAgICAnPj0nOiAgJ1QrRicsCisgICAgJz09JzogICdULi4nLAorICAgICchPSc6ICAnRisrJywKK30KKworCitkZWYgX2dldF9tcm8oY2xzKToKKyAgICAiIiJHZXQgYW4gbXJvIGZvciBhIHR5cGUgb3IgY2xhc3NpYyBjbGFzcyIiIgorICAgIGlmIG5vdCBpc2luc3RhbmNlKGNscyx0eXBlKToKKyAgICAgICAgY2xhc3MgY2xzKGNscyxvYmplY3QpOiBwYXNzCisgICAgICAgIHJldHVybiBjbHMuX19tcm9fX1sxOl0KKyAgICByZXR1cm4gY2xzLl9fbXJvX18KKworZGVmIF9maW5kX2FkYXB0ZXIocmVnaXN0cnksIG9iKToKKyAgICAiIiJSZXR1cm4gYW4gYWRhcHRlciBmYWN0b3J5IGZvciBgb2JgIGZyb20gYHJlZ2lzdHJ5YCIiIgorICAgIGZvciB0IGluIF9nZXRfbXJvKGdldGF0dHIob2IsICdfX2NsYXNzX18nLCB0eXBlKG9iKSkpOgorICAgICAgICBpZiB0IGluIHJlZ2lzdHJ5OgorICAgICAgICAgICAgcmV0dXJuIHJlZ2lzdHJ5W3RdCisKKworZGVmIGVuc3VyZV9kaXJlY3RvcnkocGF0aCk6CisgICAgIiIiRW5zdXJlIHRoYXQgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgYHBhdGhgIGV4aXN0cyIiIgorICAgIGRpcm5hbWUgPSBvcy5wYXRoLmRpcm5hbWUocGF0aCkKKyAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihkaXJuYW1lKToKKyAgICAgICAgb3MubWFrZWRpcnMoZGlybmFtZSkKKworZGVmIHNwbGl0X3NlY3Rpb25zKHMpOgorICAgICIiIlNwbGl0IGEgc3RyaW5nIG9yIGl0ZXJhYmxlIHRoZXJlb2YgaW50byAoc2VjdGlvbixjb250ZW50KSBwYWlycworCisgICAgRWFjaCBgYHNlY3Rpb25gYCBpcyBhIHN0cmlwcGVkIHZlcnNpb24gb2YgdGhlIHNlY3Rpb24gaGVhZGVyICgiW3NlY3Rpb25dIikKKyAgICBhbmQgZWFjaCBgYGNvbnRlbnRgYCBpcyBhIGxpc3Qgb2Ygc3RyaXBwZWQgbGluZXMgZXhjbHVkaW5nIGJsYW5rIGxpbmVzIGFuZAorICAgIGNvbW1lbnQtb25seSBsaW5lcy4gIElmIHRoZXJlIGFyZSBhbnkgc3VjaCBsaW5lcyBiZWZvcmUgdGhlIGZpcnN0IHNlY3Rpb24KKyAgICBoZWFkZXIsIHRoZXkncmUgcmV0dXJuZWQgaW4gYSBmaXJzdCBgYHNlY3Rpb25gYCBvZiBgYE5vbmVgYC4KKyAgICAiIiIKKyAgICBzZWN0aW9uID0gTm9uZQorICAgIGNvbnRlbnQgPSBbXQorICAgIGZvciBsaW5lIGluIHlpZWxkX2xpbmVzKHMpOgorICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoIlsiKToKKyAgICAgICAgICAgIGlmIGxpbmUuZW5kc3dpdGgoIl0iKToKKyAgICAgICAgICAgICAgICBpZiBzZWN0aW9uIG9yIGNvbnRlbnQ6CisgICAgICAgICAgICAgICAgICAgIHlpZWxkIHNlY3Rpb24sIGNvbnRlbnQKKyAgICAgICAgICAgICAgICBzZWN0aW9uID0gbGluZVsxOi0xXS5zdHJpcCgpCisgICAgICAgICAgICAgICAgY29udGVudCA9IFtdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIkludmFsaWQgc2VjdGlvbiBoZWFkaW5nIiwgbGluZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNvbnRlbnQuYXBwZW5kKGxpbmUpCisKKyAgICAjIHdyYXAgdXAgbGFzdCBzZWdtZW50CisgICAgeWllbGQgc2VjdGlvbiwgY29udGVudAorCitkZWYgX21rc3RlbXAoKmFyZ3MsKiprdyk6CisgICAgZnJvbSB0ZW1wZmlsZSBpbXBvcnQgbWtzdGVtcAorICAgIG9sZF9vcGVuID0gb3Mub3BlbgorICAgIHRyeToKKyAgICAgICAgb3Mub3BlbiA9IG9zX29wZW4gICAjIHRlbXBvcmFyaWx5IGJ5cGFzcyBzYW5kYm94aW5nCisgICAgICAgIHJldHVybiBta3N0ZW1wKCphcmdzLCoqa3cpCisgICAgZmluYWxseToKKyAgICAgICAgb3Mub3BlbiA9IG9sZF9vcGVuICAjIGFuZCB0aGVuIHB1dCBpdCBiYWNrCisKKworIyBTZXQgdXAgZ2xvYmFsIHJlc291cmNlIG1hbmFnZXIKK19tYW5hZ2VyID0gUmVzb3VyY2VNYW5hZ2VyKCkKK2RlZiBfaW5pdGlhbGl6ZShnKToKKyAgICBmb3IgbmFtZSBpbiBkaXIoX21hbmFnZXIpOgorICAgICAgICBpZiBub3QgbmFtZS5zdGFydHN3aXRoKCdfJyk6CisgICAgICAgICAgICBnW25hbWVdID0gZ2V0YXR0cihfbWFuYWdlciwgbmFtZSkKK19pbml0aWFsaXplKGdsb2JhbHMoKSkKKworIyBQcmVwYXJlIHRoZSBtYXN0ZXIgd29ya2luZyBzZXQgYW5kIG1ha2UgdGhlIGBgcmVxdWlyZSgpYGAgQVBJIGF2YWlsYWJsZQord29ya2luZ19zZXQgPSBXb3JraW5nU2V0KCkKK3RyeToKKyAgICAjIERvZXMgdGhlIG1haW4gcHJvZ3JhbSBsaXN0IGFueSByZXF1aXJlbWVudHM/CisgICAgZnJvbSBfX21haW5fXyBpbXBvcnQgX19yZXF1aXJlc19fCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgcGFzcyAjIE5vOiBqdXN0IHVzZSB0aGUgZGVmYXVsdCB3b3JraW5nIHNldCBiYXNlZCBvbiBzeXMucGF0aAorZWxzZToKKyAgICAjIFllczogZW5zdXJlIHRoZSByZXF1aXJlbWVudHMgYXJlIG1ldCwgYnkgcHJlZml4aW5nIHN5cy5wYXRoIGlmIG5lY2Vzc2FyeQorICAgIHRyeToKKyAgICAgICAgd29ya2luZ19zZXQucmVxdWlyZShfX3JlcXVpcmVzX18pCisgICAgZXhjZXB0IFZlcnNpb25Db25mbGljdDogICAgICMgdHJ5IGl0IHdpdGhvdXQgZGVmYXVsdHMgYWxyZWFkeSBvbiBzeXMucGF0aAorICAgICAgICB3b3JraW5nX3NldCA9IFdvcmtpbmdTZXQoW10pICAgICMgYnkgc3RhcnRpbmcgd2l0aCBhbiBlbXB0eSBwYXRoCisgICAgICAgIGZvciBkaXN0IGluIHdvcmtpbmdfc2V0LnJlc29sdmUoCisgICAgICAgICAgICBwYXJzZV9yZXF1aXJlbWVudHMoX19yZXF1aXJlc19fKSwgRW52aXJvbm1lbnQoKQorICAgICAgICApOgorICAgICAgICAgICAgd29ya2luZ19zZXQuYWRkKGRpc3QpCisgICAgICAgIGZvciBlbnRyeSBpbiBzeXMucGF0aDogICMgYWRkIGFueSBtaXNzaW5nIGVudHJpZXMgZnJvbSBzeXMucGF0aAorICAgICAgICAgICAgaWYgZW50cnkgbm90IGluIHdvcmtpbmdfc2V0LmVudHJpZXM6CisgICAgICAgICAgICAgICAgd29ya2luZ19zZXQuYWRkX2VudHJ5KGVudHJ5KQorICAgICAgICBzeXMucGF0aFs6XSA9IHdvcmtpbmdfc2V0LmVudHJpZXMgICAjIHRoZW4gY29weSBiYWNrIHRvIHN5cy5wYXRoCisKK3JlcXVpcmUgPSB3b3JraW5nX3NldC5yZXF1aXJlCitpdGVyX2VudHJ5X3BvaW50cyA9IHdvcmtpbmdfc2V0Lml0ZXJfZW50cnlfcG9pbnRzCithZGRfYWN0aXZhdGlvbl9saXN0ZW5lciA9IHdvcmtpbmdfc2V0LnN1YnNjcmliZQorcnVuX3NjcmlwdCA9IHdvcmtpbmdfc2V0LnJ1bl9zY3JpcHQKK3J1bl9tYWluID0gcnVuX3NjcmlwdCAgICMgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorIyBBY3RpdmF0ZSBhbGwgZGlzdHJpYnV0aW9ucyBhbHJlYWR5IG9uIHN5cy5wYXRoLCBhbmQgZW5zdXJlIHRoYXQKKyMgYWxsIGRpc3RyaWJ1dGlvbnMgYWRkZWQgdG8gdGhlIHdvcmtpbmcgc2V0IGluIHRoZSBmdXR1cmUgKGUuZy4gYnkKKyMgY2FsbGluZyBgYHJlcXVpcmUoKWBgKSB3aWxsIGdldCBhY3RpdmF0ZWQgYXMgd2VsbC4KK2FkZF9hY3RpdmF0aW9uX2xpc3RlbmVyKGxhbWJkYSBkaXN0OiBkaXN0LmFjdGl2YXRlKCkpCit3b3JraW5nX3NldC5lbnRyaWVzPVtdOyBtYXAod29ya2luZ19zZXQuYWRkX2VudHJ5LHN5cy5wYXRoKSAjIG1hdGNoIG9yZGVyCmRpZmYgLS1naXQgYS9MaWIvcGtndXRpbC5weSBiL0xpYi9wa2d1dGlsLnB5CmluZGV4IGZiZDcwOGEuLjczMTY4OTIgMTAwNjQ0Ci0tLSBhL0xpYi9wa2d1dGlsLnB5CisrKyBiL0xpYi9wa2d1dGlsLnB5CkBAIC0xLDcgKzEsNDMyIEBACiAiIiJVdGlsaXRpZXMgdG8gc3VwcG9ydCBwYWNrYWdlcy4iIiIKIAorIyBOT1RFOiBUaGlzIG1vZHVsZSBtdXN0IHJlbWFpbiBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMywgYXMgaXQgaXMgc2hhcmVkCisjIGJ5IHNldHVwdG9vbHMgZm9yIGRpc3RyaWJ1dGlvbiB3aXRoIFB5dGhvbiAyLjMgYW5kIHVwLgorCiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKK2ltcG9ydCBpbXAKK2ltcG9ydCBvcy5wYXRoCitmcm9tIHR5cGVzIGltcG9ydCBNb2R1bGVUeXBlCisKK19fYWxsX18gPSBbCisgICAgJ2dldF9pbXBvcnRlcicsICdpdGVyX2ltcG9ydGVycycsICdnZXRfbG9hZGVyJywgJ2ZpbmRfbG9hZGVyJywKKyAgICAnd2Fsa19wYWNrYWdlcycsICdpdGVyX21vZHVsZXMnLAorICAgICdJbXBJbXBvcnRlcicsICdJbXBMb2FkZXInLCAncmVhZF9jb2RlJywgJ2V4dGVuZF9wYXRoJywKK10KKworZGVmIHJlYWRfY29kZShzdHJlYW0pOgorICAgICMgVGhpcyBoZWxwZXIgaXMgbmVlZGVkIGluIG9yZGVyIGZvciB0aGUgUEVQIDMwMiBlbXVsYXRpb24gdG8KKyAgICAjIGNvcnJlY3RseSBoYW5kbGUgY29tcGlsZWQgZmlsZXMKKyAgICBpbXBvcnQgbWFyc2hhbAorCisgICAgbWFnaWMgPSBzdHJlYW0ucmVhZCg0KQorICAgIGlmIG1hZ2ljICE9IGltcC5nZXRfbWFnaWMoKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIHN0cmVhbS5yZWFkKDQpICMgU2tpcCB0aW1lc3RhbXAKKyAgICByZXR1cm4gbWFyc2hhbC5sb2FkKHN0cmVhbSkKKworCitkZWYgc2ltcGxlZ2VuZXJpYyhmdW5jKToKKyAgICAiIiJNYWtlIGEgdHJpdmlhbCBzaW5nbGUtZGlzcGF0Y2ggZ2VuZXJpYyBmdW5jdGlvbiIiIgorICAgIHJlZ2lzdHJ5ID0ge30KKyAgICBkZWYgd3JhcHBlcigqYXJncywqKmt3KToKKyAgICAgICAgb2IgPSBhcmdzWzBdCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNscyA9IG9iLl9fY2xhc3NfXworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBjbHMgPSB0eXBlKG9iKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtcm8gPSBjbHMuX19tcm9fXworICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgY2xhc3MgY2xzKGNscyxvYmplY3QpOiBwYXNzCisgICAgICAgICAgICAgICAgbXJvID0gY2xzLl9fbXJvX19bMTpdCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIG1ybyA9IG9iamVjdCwgICAjIG11c3QgYmUgYW4gRXh0ZW5zaW9uQ2xhc3Mgb3Igc29tZSBzdWNoICA6KAorICAgICAgICBmb3IgdCBpbiBtcm86CisgICAgICAgICAgICBpZiB0IGluIHJlZ2lzdHJ5OgorICAgICAgICAgICAgICAgIHJldHVybiByZWdpc3RyeVt0XSgqYXJncywqKmt3KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKmFyZ3MsKiprdykKKyAgICB0cnk6CisgICAgICAgIHdyYXBwZXIuX19uYW1lX18gPSBmdW5jLl9fbmFtZV9fCisgICAgZXhjZXB0IChUeXBlRXJyb3IsQXR0cmlidXRlRXJyb3IpOgorICAgICAgICBwYXNzICAgICMgUHl0aG9uIDIuMyBkb2Vzbid0IGFsbG93IGZ1bmN0aW9ucyB0byBiZSByZW5hbWVkCisKKyAgICBkZWYgcmVnaXN0ZXIodHlwLCBmdW5jPU5vbmUpOgorICAgICAgICBpZiBmdW5jIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4gbGFtYmRhIGY6IHJlZ2lzdGVyKHR5cCwgZikKKyAgICAgICAgcmVnaXN0cnlbdHlwXSA9IGZ1bmMKKyAgICAgICAgcmV0dXJuIGZ1bmMKKworICAgIHdyYXBwZXIuX19kaWN0X18gPSBmdW5jLl9fZGljdF9fCisgICAgd3JhcHBlci5fX2RvY19fID0gZnVuYy5fX2RvY19fCisgICAgd3JhcHBlci5yZWdpc3RlciA9IHJlZ2lzdGVyCisgICAgcmV0dXJuIHdyYXBwZXIKKworCitkZWYgd2Fsa19wYWNrYWdlcyhwYXRoPU5vbmUsIHByZWZpeD0nJywgb25lcnJvcj1Ob25lKToKKyAgICAiIiJZaWVsZCBzdWJtb2R1bGUgbmFtZXMrbG9hZGVycyByZWN1cnNpdmVseSwgZm9yIHBhdGggb3Igc3lzLnBhdGgiIiIKKworICAgIGRlZiBzZWVuKHAsbT17fSk6CisgICAgICAgIGlmIHAgaW4gbTogcmV0dXJuIFRydWUKKyAgICAgICAgbVtwXSA9IFRydWUKKworICAgIGZvciBpbXBvcnRlciwgbmFtZSwgaXNwa2cgaW4gaXRlcl9tb2R1bGVzKHBhdGgsIHByZWZpeCk6CisgICAgICAgIHlpZWxkIGltcG9ydGVyLCBuYW1lLCBpc3BrZworCisgICAgICAgIGlmIGlzcGtnOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIF9faW1wb3J0X18obmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICBpZiBvbmVycm9yIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBvbmVycm9yKCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcGF0aCA9IGdldGF0dHIoc3lzLm1vZHVsZXNbbmFtZV0sICdfX3BhdGhfXycsIE5vbmUpIG9yIFtdCisKKyAgICAgICAgICAgICAgICAjIGRvbid0IHRyYXZlcnNlIHBhdGggaXRlbXMgd2UndmUgc2VlbiBiZWZvcmUKKyAgICAgICAgICAgICAgICBwYXRoID0gW3AgZm9yIHAgaW4gcGF0aCBpZiBub3Qgc2VlbihwKV0KKworICAgICAgICAgICAgICAgIGZvciBpdGVtIGluIHdhbGtfcGFja2FnZXMocGF0aCwgbmFtZSsnLicpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBpdGVtCisKKworZGVmIGl0ZXJfbW9kdWxlcyhwYXRoPU5vbmUsIHByZWZpeD0nJyk6CisgICAgIiIiWWllbGQgc3VibW9kdWxlIG5hbWVzK2xvYWRlcnMgZm9yIHBhdGggb3Igc3lzLnBhdGgiIiIKKyAgICBpZiBwYXRoIGlzIE5vbmU6CisgICAgICAgIGltcG9ydGVycyA9IGl0ZXJfaW1wb3J0ZXJzKCkKKyAgICBlbHNlOgorICAgICAgICBpbXBvcnRlcnMgPSBtYXAoZ2V0X2ltcG9ydGVyLCBwYXRoKQorCisgICAgeWllbGRlZCA9IHt9CisgICAgZm9yIGkgaW4gaW1wb3J0ZXJzOgorICAgICAgICBmb3IgbmFtZSwgaXNwa2cgaW4gaXRlcl9pbXBvcnRlcl9tb2R1bGVzKGksIHByZWZpeCk6CisgICAgICAgICAgICBpZiBuYW1lIG5vdCBpbiB5aWVsZGVkOgorICAgICAgICAgICAgICAgIHlpZWxkZWRbbmFtZV0gPSAxCisgICAgICAgICAgICAgICAgeWllbGQgaSwgbmFtZSwgaXNwa2cKKworCisjQHNpbXBsZWdlbmVyaWMKK2RlZiBpdGVyX2ltcG9ydGVyX21vZHVsZXMoaW1wb3J0ZXIsIHByZWZpeD0nJyk6CisgICAgaWYgbm90IGhhc2F0dHIoaW1wb3J0ZXIsJ2l0ZXJfbW9kdWxlcycpOgorICAgICAgICByZXR1cm4gW10KKyAgICByZXR1cm4gaW1wb3J0ZXIuaXRlcl9tb2R1bGVzKHByZWZpeCkKKworaXRlcl9pbXBvcnRlcl9tb2R1bGVzID0gc2ltcGxlZ2VuZXJpYyhpdGVyX2ltcG9ydGVyX21vZHVsZXMpCisKKworY2xhc3MgSW1wSW1wb3J0ZXI6CisgICAgIiIiUEVQIDMwMiBJbXBvcnRlciB0aGF0IHdyYXBzIFB5dGhvbidzICJjbGFzc2ljIiBpbXBvcnQgYWxnb3JpdGhtCisKKyAgICBJbXBJbXBvcnRlcihkaXJuYW1lKSBwcm9kdWNlcyBhIFBFUCAzMDIgaW1wb3J0ZXIgdGhhdCBzZWFyY2hlcyB0aGF0CisgICAgZGlyZWN0b3J5LiAgSW1wSW1wb3J0ZXIoTm9uZSkgcHJvZHVjZXMgYSBQRVAgMzAyIGltcG9ydGVyIHRoYXQgc2VhcmNoZXMKKyAgICB0aGUgY3VycmVudCBzeXMucGF0aCwgcGx1cyBhbnkgbW9kdWxlcyB0aGF0IGFyZSBmcm96ZW4gb3IgYnVpbHQtaW4uCisKKyAgICBOb3RlIHRoYXQgSW1wSW1wb3J0ZXIgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgYmVpbmcgdXNlZCBieSBwbGFjZW1lbnQKKyAgICBvbiBzeXMubWV0YV9wYXRoLgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdGg9Tm9uZSk6CisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKworICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBmdWxsbmFtZSwgcGF0aD1Ob25lKToKKyAgICAgICAgIyBOb3RlOiB3ZSBpZ25vcmUgJ3BhdGgnIGFyZ3VtZW50IHNpbmNlIGl0IGlzIG9ubHkgdXNlZCB2aWEgbWV0YV9wYXRoCisgICAgICAgIHN1Ym5hbWUgPSBmdWxsbmFtZS5zcGxpdCgiLiIpWy0xXQorICAgICAgICBpZiBzdWJuYW1lICE9IGZ1bGxuYW1lIGFuZCBzZWxmLnBhdGggaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lOgorICAgICAgICAgICAgcGF0aCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBbb3MucGF0aC5yZWFscGF0aChzZWxmLnBhdGgpXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmaWxlLCBmaWxlbmFtZSwgZXRjID0gaW1wLmZpbmRfbW9kdWxlKHN1Ym5hbWUsIHBhdGgpCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBJbXBMb2FkZXIoZnVsbG5hbWUsIGZpbGUsIGZpbGVuYW1lLCBldGMpCisKKyAgICBkZWYgaXRlcl9tb2R1bGVzKHNlbGYsIHByZWZpeD0nJyk6CisgICAgICAgIGlmIHNlbGYucGF0aCBpcyBOb25lIG9yIG5vdCBvcy5wYXRoLmlzZGlyKHNlbGYucGF0aCk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICB5aWVsZGVkID0ge30KKyAgICAgICAgaW1wb3J0IGluc3BlY3QKKworICAgICAgICBmaWxlbmFtZXMgPSBvcy5saXN0ZGlyKHNlbGYucGF0aCkKKyAgICAgICAgZmlsZW5hbWVzLnNvcnQoKSAgIyBoYW5kbGUgcGFja2FnZXMgYmVmb3JlIHNhbWUtbmFtZWQgbW9kdWxlcworCisgICAgICAgIGZvciBmbiBpbiBmaWxlbmFtZXM6CisgICAgICAgICAgICBtb2RuYW1lID0gaW5zcGVjdC5nZXRtb2R1bGVuYW1lKGZuKQorICAgICAgICAgICAgaWYgbW9kbmFtZT09J19faW5pdF9fJyBvciBtb2RuYW1lIGluIHlpZWxkZWQ6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLnBhdGgsIGZuKQorICAgICAgICAgICAgaXNwa2cgPSBGYWxzZQorCisgICAgICAgICAgICBpZiBub3QgbW9kbmFtZSBhbmQgb3MucGF0aC5pc2RpcihwYXRoKSBhbmQgJy4nIG5vdCBpbiBmbjoKKyAgICAgICAgICAgICAgICBtb2RuYW1lID0gZm4KKyAgICAgICAgICAgICAgICBmb3IgZm4gaW4gb3MubGlzdGRpcihwYXRoKToKKyAgICAgICAgICAgICAgICAgICAgc3VibmFtZSA9IGluc3BlY3QuZ2V0bW9kdWxlbmFtZShmbikKKyAgICAgICAgICAgICAgICAgICAgaWYgc3VibmFtZT09J19faW5pdF9fJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzcGtnID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAgICAjIG5vdCBhIHBhY2thZ2UKKworICAgICAgICAgICAgaWYgbW9kbmFtZSBhbmQgJy4nIG5vdCBpbiBtb2RuYW1lOgorICAgICAgICAgICAgICAgIHlpZWxkZWRbbW9kbmFtZV0gPSAxCisgICAgICAgICAgICAgICAgeWllbGQgcHJlZml4ICsgbW9kbmFtZSwgaXNwa2cKKworCitjbGFzcyBJbXBMb2FkZXI6CisgICAgIiIiUEVQIDMwMiBMb2FkZXIgdGhhdCB3cmFwcyBQeXRob24ncyAiY2xhc3NpYyIgaW1wb3J0IGFsZ29yaXRobQorICAgICIiIgorICAgIGNvZGUgPSBzb3VyY2UgPSBOb25lCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZnVsbG5hbWUsIGZpbGUsIGZpbGVuYW1lLCBldGMpOgorICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQorICAgICAgICBzZWxmLmZ1bGxuYW1lID0gZnVsbG5hbWUKKyAgICAgICAgc2VsZi5ldGMgPSBldGMKKworICAgIGRlZiBsb2FkX21vZHVsZShzZWxmLCBmdWxsbmFtZSk6CisgICAgICAgIHNlbGYuX3Jlb3BlbigpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1vZCA9IGltcC5sb2FkX21vZHVsZShmdWxsbmFtZSwgc2VsZi5maWxlLCBzZWxmLmZpbGVuYW1lLCBzZWxmLmV0YykKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIHNlbGYuZmlsZToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbGUuY2xvc2UoKQorICAgICAgICAjIE5vdGU6IHdlIGRvbid0IHNldCBfX2xvYWRlcl9fIGJlY2F1c2Ugd2Ugd2FudCB0aGUgbW9kdWxlIHRvIGxvb2sKKyAgICAgICAgIyBub3JtYWw7IGkuZS4gdGhpcyBpcyBqdXN0IGEgd3JhcHBlciBmb3Igc3RhbmRhcmQgaW1wb3J0IG1hY2hpbmVyeQorICAgICAgICByZXR1cm4gbW9kCisKKyAgICBkZWYgZ2V0X2RhdGEoc2VsZiwgcGF0aG5hbWUpOgorICAgICAgICByZXR1cm4gb3BlbihwYXRobmFtZSwgInJiIikucmVhZCgpCisKKyAgICBkZWYgX3Jlb3BlbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5maWxlIGFuZCBzZWxmLmZpbGUuY2xvc2VkOgorICAgICAgICAgICAgaWYgbW9kX3R5cGU9PWltcC5QWV9TT1VSQ0U6CisgICAgICAgICAgICAgICAgc2VsZi5maWxlID0gb3BlbihzZWxmLmZpbGVuYW1lLCAnclUnKQorICAgICAgICAgICAgZWxpZiBtb2RfdHlwZSBpbiAoaW1wLlBZX0NPTVBJTEVELCBpbXAuQ19FWFRFTlNJT04pOgorICAgICAgICAgICAgICAgIHNlbGYuZmlsZSA9IG9wZW4oc2VsZi5maWxlbmFtZSwgJ3JiJykKKworICAgIGRlZiBfZml4X25hbWUoc2VsZiwgZnVsbG5hbWUpOgorICAgICAgICBpZiBmdWxsbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgZnVsbG5hbWUgPSBzZWxmLmZ1bGxuYW1lCisgICAgICAgIGVsaWYgZnVsbG5hbWUgIT0gc2VsZi5mdWxsbmFtZToKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJMb2FkZXIgZm9yIG1vZHVsZSAlcyBjYW5ub3QgaGFuZGxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtb2R1bGUgJXMiICUgKHNlbGYuZnVsbG5hbWUsIGZ1bGxuYW1lKSkKKyAgICAgICAgcmV0dXJuIGZ1bGxuYW1lCisKKyAgICBkZWYgaXNfcGFja2FnZShzZWxmLCBmdWxsbmFtZSk6CisgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5fZml4X25hbWUoZnVsbG5hbWUpCisgICAgICAgIHJldHVybiBzZWxmLmV0Y1syXT09aW1wLlBLR19ESVJFQ1RPUlkKKworICAgIGRlZiBnZXRfY29kZShzZWxmLCBmdWxsbmFtZT1Ob25lKToKKyAgICAgICAgZnVsbG5hbWUgPSBzZWxmLl9maXhfbmFtZShmdWxsbmFtZSkKKyAgICAgICAgaWYgc2VsZi5jb2RlIGlzIE5vbmU6CisgICAgICAgICAgICBtb2RfdHlwZSA9IHNlbGYuZXRjWzJdCisgICAgICAgICAgICBpZiBtb2RfdHlwZT09aW1wLlBZX1NPVVJDRToKKyAgICAgICAgICAgICAgICBzb3VyY2UgPSBzZWxmLmdldF9zb3VyY2UoZnVsbG5hbWUpCisgICAgICAgICAgICAgICAgc2VsZi5jb2RlID0gY29tcGlsZShzb3VyY2UsIHNlbGYuZmlsZW5hbWUsICdleGVjJykKKyAgICAgICAgICAgIGVsaWYgbW9kX3R5cGU9PWltcC5QWV9DT01QSUxFRDoKKyAgICAgICAgICAgICAgICBzZWxmLl9yZW9wZW4oKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5jb2RlID0gcmVhZF9jb2RlKHNlbGYuZmlsZSkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGUuY2xvc2UoKQorICAgICAgICAgICAgZWxpZiBtb2RfdHlwZT09aW1wLlBLR19ESVJFQ1RPUlk6CisgICAgICAgICAgICAgICAgc2VsZi5jb2RlID0gc2VsZi5fZ2V0X2RlbGVnYXRlKCkuZ2V0X2NvZGUoKQorICAgICAgICByZXR1cm4gc2VsZi5jb2RlCisKKyAgICBkZWYgZ2V0X3NvdXJjZShzZWxmLCBmdWxsbmFtZT1Ob25lKToKKyAgICAgICAgZnVsbG5hbWUgPSBzZWxmLl9maXhfbmFtZShmdWxsbmFtZSkKKyAgICAgICAgaWYgc2VsZi5zb3VyY2UgaXMgTm9uZToKKyAgICAgICAgICAgIG1vZF90eXBlID0gc2VsZi5ldGNbMl0KKyAgICAgICAgICAgIGlmIG1vZF90eXBlPT1pbXAuUFlfU09VUkNFOgorICAgICAgICAgICAgICAgIHNlbGYuX3Jlb3BlbigpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNvdXJjZSA9IHNlbGYuZmlsZS5yZWFkKCkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGUuY2xvc2UoKQorICAgICAgICAgICAgZWxpZiBtb2RfdHlwZT09aW1wLlBZX0NPTVBJTEVEOgorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYuZmlsZW5hbWVbOi0xXSk6CisgICAgICAgICAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYuZmlsZW5hbWVbOi0xXSwgJ3JVJykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zb3VyY2UgPSBmLnJlYWQoKQorICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGVsaWYgbW9kX3R5cGU9PWltcC5QS0dfRElSRUNUT1JZOgorICAgICAgICAgICAgICAgIHNlbGYuc291cmNlID0gc2VsZi5fZ2V0X2RlbGVnYXRlKCkuZ2V0X3NvdXJjZSgpCisgICAgICAgIHJldHVybiBzZWxmLnNvdXJjZQorCisKKyAgICBkZWYgX2dldF9kZWxlZ2F0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIEltcEltcG9ydGVyKHNlbGYuZmlsZW5hbWUpLmZpbmRfbW9kdWxlKCdfX2luaXRfXycpCisKKyAgICBkZWYgZ2V0X2ZpbGVuYW1lKHNlbGYsIGZ1bGxuYW1lPU5vbmUpOgorICAgICAgICBmdWxsbmFtZSA9IHNlbGYuX2ZpeF9uYW1lKGZ1bGxuYW1lKQorICAgICAgICBtb2RfdHlwZSA9IHNlbGYuZXRjWzJdCisgICAgICAgIGlmIHNlbGYuZXRjWzJdPT1pbXAuUEtHX0RJUkVDVE9SWToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfZGVsZWdhdGUoKS5nZXRfZmlsZW5hbWUoKQorICAgICAgICBlbGlmIHNlbGYuZXRjWzJdIGluIChpbXAuUFlfU09VUkNFLCBpbXAuUFlfQ09NUElMRUQsIGltcC5DX0VYVEVOU0lPTik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5maWxlbmFtZQorICAgICAgICByZXR1cm4gTm9uZQorCisKK3RyeToKKyAgICBpbXBvcnQgemlwaW1wb3J0CisgICAgZnJvbSB6aXBpbXBvcnQgaW1wb3J0IHppcGltcG9ydGVyCisKKyAgICBkZWYgaXRlcl96aXBpbXBvcnRfbW9kdWxlcyhpbXBvcnRlciwgcHJlZml4PScnKToKKyAgICAgICAgZGlybGlzdCA9IHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZVtpbXBvcnRlci5hcmNoaXZlXS5rZXlzKCkKKyAgICAgICAgZGlybGlzdC5zb3J0KCkKKyAgICAgICAgX3ByZWZpeCA9IGltcG9ydGVyLnByZWZpeAorICAgICAgICBwbGVuID0gbGVuKF9wcmVmaXgpCisgICAgICAgIHlpZWxkZWQgPSB7fQorICAgICAgICBpbXBvcnQgaW5zcGVjdAorICAgICAgICBmb3IgZm4gaW4gZGlybGlzdDoKKyAgICAgICAgICAgIGlmIG5vdCBmbi5zdGFydHN3aXRoKF9wcmVmaXgpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgICAgIGZuID0gZm5bcGxlbjpdLnNwbGl0KG9zLnNlcCkKKworICAgICAgICAgICAgaWYgbGVuKGZuKT09MiBhbmQgZm5bMV0uc3RhcnRzd2l0aCgnX19pbml0X18ucHknKToKKyAgICAgICAgICAgICAgICBpZiBmblswXSBub3QgaW4geWllbGRlZDoKKyAgICAgICAgICAgICAgICAgICAgeWllbGRlZFtmblswXV0gPSAxCisgICAgICAgICAgICAgICAgICAgIHlpZWxkIGZuWzBdLCBUcnVlCisKKyAgICAgICAgICAgIGlmIGxlbihmbikhPTE6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgbW9kbmFtZSA9IGluc3BlY3QuZ2V0bW9kdWxlbmFtZShmblswXSkKKyAgICAgICAgICAgIGlmIG1vZG5hbWU9PSdfX2luaXRfXyc6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgaWYgbW9kbmFtZSBhbmQgJy4nIG5vdCBpbiBtb2RuYW1lIGFuZCBtb2RuYW1lIG5vdCBpbiB5aWVsZGVkOgorICAgICAgICAgICAgICAgIHlpZWxkZWRbbW9kbmFtZV0gPSAxCisgICAgICAgICAgICAgICAgeWllbGQgcHJlZml4ICsgbW9kbmFtZSwgRmFsc2UKKworICAgIGl0ZXJfaW1wb3J0ZXJfbW9kdWxlcy5yZWdpc3Rlcih6aXBpbXBvcnRlciwgaXRlcl96aXBpbXBvcnRfbW9kdWxlcykKKworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHBhc3MKKworCitkZWYgZ2V0X2ltcG9ydGVyKHBhdGhfaXRlbSk6CisgICAgIiIiUmV0cmlldmUgYSBQRVAgMzAyIGltcG9ydGVyIGZvciB0aGUgZ2l2ZW4gcGF0aCBpdGVtCisKKyAgICBUaGUgcmV0dXJuZWQgaW1wb3J0ZXIgaXMgY2FjaGVkIGluIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlCisgICAgaWYgaXQgd2FzIG5ld2x5IGNyZWF0ZWQgYnkgYSBwYXRoIGhvb2suCisKKyAgICBJZiB0aGVyZSBpcyBubyBpbXBvcnRlciwgYSB3cmFwcGVyIGFyb3VuZCB0aGUgYmFzaWMgaW1wb3J0CisgICAgbWFjaGluZXJ5IGlzIHJldHVybmVkLiBUaGlzIHdyYXBwZXIgaXMgbmV2ZXIgaW5zZXJ0ZWQgaW50bworICAgIHRoZSBpbXBvcnRlciBjYWNoZSAoTm9uZSBpcyBpbnNlcnRlZCBpbnN0ZWFkKS4KKworICAgIFRoZSBjYWNoZSAob3IgcGFydCBvZiBpdCkgY2FuIGJlIGNsZWFyZWQgbWFudWFsbHkgaWYgYQorICAgIHJlc2NhbiBvZiBzeXMucGF0aF9ob29rcyBpcyBuZWNlc3NhcnkuCisgICAgIiIiCisgICAgdHJ5OgorICAgICAgICBpbXBvcnRlciA9IHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlW3BhdGhfaXRlbV0KKyAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgIGZvciBwYXRoX2hvb2sgaW4gc3lzLnBhdGhfaG9va3M6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaW1wb3J0ZXIgPSBwYXRoX2hvb2socGF0aF9pdGVtKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgaW1wb3J0ZXIgPSBOb25lCisgICAgICAgIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlLnNldGRlZmF1bHQocGF0aF9pdGVtLGltcG9ydGVyKQorCisgICAgaWYgaW1wb3J0ZXIgaXMgTm9uZToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0ZXIgPSBJbXBJbXBvcnRlcihwYXRoX2l0ZW0pCisgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICByZXR1cm4gaW1wb3J0ZXIKKworCitkZWYgaXRlcl9pbXBvcnRlcnMoZnVsbG5hbWU9IiIpOgorICAgICIiIllpZWxkIFBFUCAzMDIgaW1wb3J0ZXJzIGZvciB0aGUgZ2l2ZW4gbW9kdWxlIG5hbWUKKworICAgIElmIGZ1bGxuYW1lIGNvbnRhaW5zIGEgJy4nLCB0aGUgaW1wb3J0ZXJzIHdpbGwgYmUgZm9yIHRoZSBwYWNrYWdlCisgICAgY29udGFpbmluZyBmdWxsbmFtZSwgb3RoZXJ3aXNlIHRoZXkgd2lsbCBiZSBpbXBvcnRlcnMgZm9yIHN5cy5tZXRhX3BhdGgsCisgICAgc3lzLnBhdGgsIGFuZCBQeXRob24ncyAiY2xhc3NpYyIgaW1wb3J0IG1hY2hpbmVyeSwgaW4gdGhhdCBvcmRlci4gIElmCisgICAgdGhlIG5hbWVkIG1vZHVsZSBpcyBpbiBhIHBhY2thZ2UsIHRoYXQgcGFja2FnZSBpcyBpbXBvcnRlZCBhcyBhIHNpZGUKKyAgICBlZmZlY3Qgb2YgaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4KKworICAgIE5vbiBQRVAgMzAyIG1lY2hhbmlzbXMgKGUuZy4gdGhlIFdpbmRvd3MgcmVnaXN0cnkpIHVzZWQgYnkgdGhlCisgICAgc3RhbmRhcmQgaW1wb3J0IG1hY2hpbmVyeSB0byBmaW5kIGZpbGVzIGluIGFsdGVybmF0aXZlIGxvY2F0aW9ucworICAgIGFyZSBwYXJ0aWFsbHkgc3VwcG9ydGVkLCBidXQgYXJlIHNlYXJjaGVkIEFGVEVSIHN5cy5wYXRoLiBOb3JtYWxseSwKKyAgICB0aGVzZSBsb2NhdGlvbnMgYXJlIHNlYXJjaGVkIEJFRk9SRSBzeXMucGF0aCwgcHJldmVudGluZyBzeXMucGF0aAorICAgIGVudHJpZXMgZnJvbSBzaGFkb3dpbmcgdGhlbS4KKworICAgIEZvciB0aGlzIHRvIGNhdXNlIGEgdmlzaWJsZSBkaWZmZXJlbmNlIGluIGJlaGF2aW91ciwgdGhlcmUgbXVzdAorICAgIGJlIGEgbW9kdWxlIG9yIHBhY2thZ2UgbmFtZSB0aGF0IGlzIGFjY2Vzc2libGUgdmlhIGJvdGggc3lzLnBhdGgKKyAgICBhbmQgb25lIG9mIHRoZSBub24gUEVQIDMwMiBmaWxlIHN5c3RlbSBtZWNoYW5pc21zLiBJbiB0aGlzIGNhc2UsCisgICAgdGhlIGVtdWxhdGlvbiB3aWxsIGZpbmQgdGhlIGZvcm1lciB2ZXJzaW9uLCB3aGlsZSB0aGUgYnVpbHRpbgorICAgIGltcG9ydCBtZWNoYW5pc20gd2lsbCBmaW5kIHRoZSBsYXR0ZXIuCisKKyAgICBJdGVtcyBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIGNhbiBiZSBhZmZlY3RlZCBieSB0aGlzIGRpc2NyZXBhbmN5OgorICAgICAgICBpbXAuQ19FWFRFTlNJT04sIGltcC5QWV9TT1VSQ0UsIGltcC5QWV9DT01QSUxFRCwgaW1wLlBLR19ESVJFQ1RPUlkKKyAgICAiIiIKKyAgICBpZiBmdWxsbmFtZS5zdGFydHN3aXRoKCcuJyk6CisgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJSZWxhdGl2ZSBtb2R1bGUgbmFtZXMgbm90IHN1cHBvcnRlZCIpCisgICAgaWYgJy4nIGluIGZ1bGxuYW1lOgorICAgICAgICAjIEdldCB0aGUgY29udGFpbmluZyBwYWNrYWdlJ3MgX19wYXRoX18KKyAgICAgICAgcGtnID0gJy4nLmpvaW4oZnVsbG5hbWUuc3BsaXQoJy4nKVs6LTFdKQorICAgICAgICBpZiBwa2cgbm90IGluIHN5cy5tb2R1bGVzOgorICAgICAgICAgICAgX19pbXBvcnRfXyhwa2cpCisgICAgICAgIHBhdGggPSBnZXRhdHRyKHN5cy5tb2R1bGVzW3BrZ10sJ19fcGF0aF9fJyxOb25lKSBvciBbXQorICAgIGVsc2U6CisgICAgICAgIGZvciBpbXBvcnRlciBpbiBzeXMubWV0YV9wYXRoOgorICAgICAgICAgICAgeWllbGQgaW1wb3J0ZXIKKyAgICAgICAgcGF0aCA9IHN5cy5wYXRoCisgICAgZm9yIGl0ZW0gaW4gcGF0aDoKKyAgICAgICAgeWllbGQgZ2V0X2ltcG9ydGVyKGl0ZW0pCisgICAgaWYgJy4nIG5vdCBpbiBmdWxsbmFtZToKKyAgICAgICAgeWllbGQgSW1wSW1wb3J0ZXIoKQorCitkZWYgZ2V0X2xvYWRlcihtb2R1bGVfb3JfbmFtZSk6CisgICAgIiIiR2V0IGEgUEVQIDMwMiAibG9hZGVyIiBvYmplY3QgZm9yIG1vZHVsZV9vcl9uYW1lCisKKyAgICBJZiB0aGUgbW9kdWxlIG9yIHBhY2thZ2UgaXMgYWNjZXNzaWJsZSB2aWEgdGhlIG5vcm1hbCBpbXBvcnQKKyAgICBtZWNoYW5pc20sIGEgd3JhcHBlciBhcm91bmQgdGhlIHJlbGV2YW50IHBhcnQgb2YgdGhhdCBtYWNoaW5lcnkKKyAgICBpcyByZXR1cm5lZC4gIFJldHVybnMgTm9uZSBpZiB0aGUgbW9kdWxlIGNhbm5vdCBiZSBmb3VuZCBvciBpbXBvcnRlZC4KKyAgICBJZiB0aGUgbmFtZWQgbW9kdWxlIGlzIG5vdCBhbHJlYWR5IGltcG9ydGVkLCBpdHMgY29udGFpbmluZyBwYWNrYWdlCisgICAgKGlmIGFueSkgaXMgaW1wb3J0ZWQsIGluIG9yZGVyIHRvIGVzdGFibGlzaCB0aGUgcGFja2FnZSBfX3BhdGhfXy4KKworICAgIFRoaXMgZnVuY3Rpb24gdXNlcyBpdGVyX2ltcG9ydGVycygpLCBhbmQgaXMgdGh1cyBzdWJqZWN0IHRvIHRoZSBzYW1lCisgICAgbGltaXRhdGlvbnMgcmVnYXJkaW5nIHBsYXRmb3JtLXNwZWNpZmljIHNwZWNpYWwgaW1wb3J0IGxvY2F0aW9ucyBzdWNoCisgICAgYXMgdGhlIFdpbmRvd3MgcmVnaXN0cnkuCisgICAgIiIiCisgICAgaWYgbW9kdWxlX29yX25hbWUgaW4gc3lzLm1vZHVsZXM6CisgICAgICAgIG1vZHVsZV9vcl9uYW1lID0gc3lzLm1vZHVsZXNbbW9kdWxlX29yX25hbWVdCisgICAgaWYgaXNpbnN0YW5jZShtb2R1bGVfb3JfbmFtZSwgTW9kdWxlVHlwZSk6CisgICAgICAgIG1vZHVsZSA9IG1vZHVsZV9vcl9uYW1lCisgICAgICAgIGxvYWRlciA9IGdldGF0dHIobW9kdWxlLCdfX2xvYWRlcl9fJyxOb25lKQorICAgICAgICBpZiBsb2FkZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gbG9hZGVyCisgICAgICAgIGZ1bGxuYW1lID0gbW9kdWxlLl9fbmFtZV9fCisgICAgZWxzZToKKyAgICAgICAgZnVsbG5hbWUgPSBtb2R1bGVfb3JfbmFtZQorICAgIHJldHVybiBmaW5kX2xvYWRlcihmdWxsbmFtZSkKKworZGVmIGZpbmRfbG9hZGVyKGZ1bGxuYW1lKToKKyAgICAiIiJGaW5kIGEgUEVQIDMwMiAibG9hZGVyIiBvYmplY3QgZm9yIGZ1bGxuYW1lCisKKyAgICBJZiBmdWxsbmFtZSBjb250YWlucyBkb3RzLCBwYXRoIG11c3QgYmUgdGhlIGNvbnRhaW5pbmcgcGFja2FnZSdzIF9fcGF0aF9fLgorICAgIFJldHVybnMgTm9uZSBpZiB0aGUgbW9kdWxlIGNhbm5vdCBiZSBmb3VuZCBvciBpbXBvcnRlZC4gVGhpcyBmdW5jdGlvbiB1c2VzCisgICAgaXRlcl9pbXBvcnRlcnMoKSwgYW5kIGlzIHRodXMgc3ViamVjdCB0byB0aGUgc2FtZSBsaW1pdGF0aW9ucyByZWdhcmRpbmcKKyAgICBwbGF0Zm9ybS1zcGVjaWZpYyBzcGVjaWFsIGltcG9ydCBsb2NhdGlvbnMgc3VjaCBhcyB0aGUgV2luZG93cyByZWdpc3RyeS4KKyAgICAiIiIKKyAgICBmb3IgaW1wb3J0ZXIgaW4gaXRlcl9pbXBvcnRlcnMoZnVsbG5hbWUpOgorICAgICAgICBsb2FkZXIgPSBpbXBvcnRlci5maW5kX21vZHVsZShmdWxsbmFtZSkKKyAgICAgICAgaWYgbG9hZGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIGxvYWRlcgorCisgICAgcmV0dXJuIE5vbmUKKwogCiBkZWYgZXh0ZW5kX3BhdGgocGF0aCwgbmFtZSk6CiAgICAgIiIiRXh0ZW5kIGEgcGFja2FnZSdzIHBhdGguCmRpZmYgLS1naXQgYS9MaWIvcGxhdC1tYWMvYXBwbGVzaW5nbGUucHkgYi9MaWIvcGxhdC1tYWMvYXBwbGVzaW5nbGUucHkKaW5kZXggYjAzNWQ5ZS4uNzZiZGIwNiAxMDA2NDQKLS0tIGEvTGliL3BsYXQtbWFjL2FwcGxlc2luZ2xlLnB5CisrKyBiL0xpYi9wbGF0LW1hYy9hcHBsZXNpbmdsZS5weQpAQCAtMjUsNyArMjUsNyBAQAogICAgIHBhc3MKIAogIyBGaWxlIGhlYWRlciBmb3JtYXQ6IG1hZ2ljLCB2ZXJzaW9uLCB1bnVzZWQsIG51bWJlciBvZiBlbnRyaWVzCi1BU19IRUFERVJfRk9STUFUPSI+bGwxNnNoIgorQVNfSEVBREVSX0ZPUk1BVD0iPkxMMTZzaCIKIEFTX0hFQURFUl9MRU5HVEg9MjYKICMgVGhlIGZsYWcgd29yZHMgZm9yIEFwcGxlU2luZ2xlCiBBU19NQUdJQz0weDAwMDUxNjAwCmRpZmYgLS1naXQgYS9MaWIvcGxhdGZvcm0ucHkgYi9MaWIvcGxhdGZvcm0ucHkKaW5kZXggNjJmZGFmNC4uMjg4YmM5NSAxMDA3NTUKLS0tIGEvTGliL3BsYXRmb3JtLnB5CisrKyBiL0xpYi9wbGF0Zm9ybS5weQpAQCAtNjA3LDcgKzYwNyw4IEBACiAgICAgICAgIHZlcnNpb25pbmZvID0gKHZlcnNpb24sc3RhZ2Usbm9ucmVsKQogICAgIGlmIHN5c2E6CiAgICAgICAgIG1hY2hpbmUgPSB7MHgxOiAnNjhrJywKLSAgICAgICAgICAgICAgICAgICAweDI6ICdQb3dlclBDJ30uZ2V0KHN5c2EsJycpCisgICAgICAgICAgICAgICAgICAgMHgyOiAnUG93ZXJQQycsCisgICAgICAgICAgICAgICAgICAgMHhhOiAnaTM4Nid9LmdldChzeXNhLCcnKQogICAgIHJldHVybiByZWxlYXNlLHZlcnNpb25pbmZvLG1hY2hpbmUKIAogZGVmIF9qYXZhX2dldHByb3AobmFtZSxkZWZhdWx0KToKZGlmZiAtLWdpdCBhL0xpYi9wb3BlbjIucHkgYi9MaWIvcG9wZW4yLnB5CmluZGV4IDU0NTQzYmUuLjY3ZWJkMjYgMTAwNjQ0Ci0tLSBhL0xpYi9wb3BlbjIucHkKKysrIGIvTGliL3BvcGVuMi5weQpAQCAtMjAsNyArMjAsMTMgQEAKIAogZGVmIF9jbGVhbnVwKCk6CiAgICAgZm9yIGluc3QgaW4gX2FjdGl2ZVs6XToKLSAgICAgICAgaW5zdC5wb2xsKCkKKyAgICAgICAgaWYgaW5zdC5wb2xsKF9kZWFkc3RhdGU9c3lzLm1heGludCkgPj0gMDoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBfYWN0aXZlLnJlbW92ZShpbnN0KQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgIyBUaGlzIGNhbiBoYXBwZW4gaWYgdHdvIHRocmVhZHMgY3JlYXRlIGEgbmV3IFBvcGVuIGluc3RhbmNlLgorICAgICAgICAgICAgICAgICMgSXQncyBoYXJtbGVzcyB0aGF0IGl0IHdhcyBhbHJlYWR5IHJlbW92ZWQsIHNvIGlnbm9yZS4KKyAgICAgICAgICAgICAgICBwYXNzCiAKIGNsYXNzIFBvcGVuMzoKICAgICAiIiJDbGFzcyByZXByZXNlbnRpbmcgYSBjaGlsZCBwcm9jZXNzLiAgTm9ybWFsbHkgaW5zdGFuY2VzIGFyZSBjcmVhdGVkCkBAIC0zOSw2ICs0NSw3IEBACiAgICAgICAgIHNwZWNpZmllZCwgaXQgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBJL08gYnVmZmVycyB0by9mcm9tIHRoZSBjaGlsZAogICAgICAgICBwcm9jZXNzLiIiIgogICAgICAgICBfY2xlYW51cCgpCisgICAgICAgIHNlbGYuY21kID0gY21kCiAgICAgICAgIHAyY3JlYWQsIHAyY3dyaXRlID0gb3MucGlwZSgpCiAgICAgICAgIGMycHJlYWQsIGMycHdyaXRlID0gb3MucGlwZSgpCiAgICAgICAgIGlmIGNhcHR1cmVzdGRlcnI6CkBAIC02MCw3ICs2NywxMyBAQAogICAgICAgICAgICAgc2VsZi5jaGlsZGVyciA9IG9zLmZkb3BlbihlcnJvdXQsICdyJywgYnVmc2l6ZSkKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHNlbGYuY2hpbGRlcnIgPSBOb25lCi0gICAgICAgIF9hY3RpdmUuYXBwZW5kKHNlbGYpCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgIyBJbiBjYXNlIHRoZSBjaGlsZCBoYXNuJ3QgYmVlbiB3YWl0ZWQgb24sIGNoZWNrIGlmIGl0J3MgZG9uZS4KKyAgICAgICAgc2VsZi5wb2xsKF9kZWFkc3RhdGU9c3lzLm1heGludCkKKyAgICAgICAgaWYgc2VsZi5zdHMgPCAwOgorICAgICAgICAgICAgIyBDaGlsZCBpcyBzdGlsbCBydW5uaW5nLCBrZWVwIHVzIGFsaXZlIHVudGlsIHdlIGNhbiB3YWl0IG9uIGl0LgorICAgICAgICAgICAgX2FjdGl2ZS5hcHBlbmQoc2VsZikKIAogICAgIGRlZiBfcnVuX2NoaWxkKHNlbGYsIGNtZCk6CiAgICAgICAgIGlmIGlzaW5zdGFuY2UoY21kLCBiYXNlc3RyaW5nKToKQEAgLTc1LDI2ICs4OCwyOCBAQAogICAgICAgICBmaW5hbGx5OgogICAgICAgICAgICAgb3MuX2V4aXQoMSkKIAotICAgIGRlZiBwb2xsKHNlbGYpOgorICAgIGRlZiBwb2xsKHNlbGYsIF9kZWFkc3RhdGU9Tm9uZSk6CiAgICAgICAgICIiIlJldHVybiB0aGUgZXhpdCBzdGF0dXMgb2YgdGhlIGNoaWxkIHByb2Nlc3MgaWYgaXQgaGFzIGZpbmlzaGVkLAogICAgICAgICBvciAtMSBpZiBpdCBoYXNuJ3QgZmluaXNoZWQgeWV0LiIiIgogICAgICAgICBpZiBzZWxmLnN0cyA8IDA6CiAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgcGlkLCBzdHMgPSBvcy53YWl0cGlkKHNlbGYucGlkLCBvcy5XTk9IQU5HKQorICAgICAgICAgICAgICAgICMgcGlkIHdpbGwgYmUgMCBpZiBzZWxmLnBpZCBoYXNuJ3QgdGVybWluYXRlZAogICAgICAgICAgICAgICAgIGlmIHBpZCA9PSBzZWxmLnBpZDoKICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHMgPSBzdHMKLSAgICAgICAgICAgICAgICAgICAgX2FjdGl2ZS5yZW1vdmUoc2VsZikKICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgaWYgX2RlYWRzdGF0ZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHMgPSBfZGVhZHN0YXRlCiAgICAgICAgIHJldHVybiBzZWxmLnN0cwogCiAgICAgZGVmIHdhaXQoc2VsZik6CiAgICAgICAgICIiIldhaXQgZm9yIGFuZCByZXR1cm4gdGhlIGV4aXQgc3RhdHVzIG9mIHRoZSBjaGlsZCBwcm9jZXNzLiIiIgogICAgICAgICBpZiBzZWxmLnN0cyA8IDA6CiAgICAgICAgICAgICBwaWQsIHN0cyA9IG9zLndhaXRwaWQoc2VsZi5waWQsIDApCi0gICAgICAgICAgICBpZiBwaWQgPT0gc2VsZi5waWQ6Ci0gICAgICAgICAgICAgICAgc2VsZi5zdHMgPSBzdHMKLSAgICAgICAgICAgICAgICBfYWN0aXZlLnJlbW92ZShzZWxmKQorICAgICAgICAgICAgIyBUaGlzIHVzZWQgdG8gYmUgYSB0ZXN0LCBidXQgaXQgaXMgYmVsaWV2ZWQgdG8gYmUKKyAgICAgICAgICAgICMgYWx3YXlzIHRydWUsIHNvIEkgY2hhbmdlZCBpdCB0byBhbiBhc3NlcnRpb24gLSBtdmwKKyAgICAgICAgICAgIGFzc2VydCBwaWQgPT0gc2VsZi5waWQKKyAgICAgICAgICAgIHNlbGYuc3RzID0gc3RzCiAgICAgICAgIHJldHVybiBzZWxmLnN0cwogCiAKQEAgLTEwMyw2ICsxMTgsNyBAQAogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGNtZCwgYnVmc2l6ZT0tMSk6CiAgICAgICAgIF9jbGVhbnVwKCkKKyAgICAgICAgc2VsZi5jbWQgPSBjbWQKICAgICAgICAgcDJjcmVhZCwgcDJjd3JpdGUgPSBvcy5waXBlKCkKICAgICAgICAgYzJwcmVhZCwgYzJwd3JpdGUgPSBvcy5waXBlKCkKICAgICAgICAgc2VsZi5waWQgPSBvcy5mb3JrKCkKQEAgLTExNiw3ICsxMzIsNiBAQAogICAgICAgICBzZWxmLnRvY2hpbGQgPSBvcy5mZG9wZW4ocDJjd3JpdGUsICd3JywgYnVmc2l6ZSkKICAgICAgICAgb3MuY2xvc2UoYzJwd3JpdGUpCiAgICAgICAgIHNlbGYuZnJvbWNoaWxkID0gb3MuZmRvcGVuKGMycHJlYWQsICdyJywgYnVmc2l6ZSkKLSAgICAgICAgX2FjdGl2ZS5hcHBlbmQoc2VsZikKIAogCiBpZiBzeXMucGxhdGZvcm1bOjNdID09ICJ3aW4iIG9yIHN5cy5wbGF0Zm9ybSA9PSAib3MyZW14IjoKQEAgLTE4Niw2ICsyMDEsOSBAQAogICAgIF9fYWxsX18uZXh0ZW5kKFsiUG9wZW4zIiwgIlBvcGVuNCJdKQogCiBkZWYgX3Rlc3QoKToKKyAgICAjIFdoZW4gdGhlIHRlc3QgcnVucywgdGhlcmUgc2hvdWxkbid0IGJlIGFueSBvcGVuIHBpcGVzCisgICAgX2NsZWFudXAoKQorICAgIGFzc2VydCBub3QgX2FjdGl2ZSwgIkFjdGl2ZSBwaXBlcyB3aGVuIHRlc3Qgc3RhcnRzICIgKyByZXByKFtjLmNtZCBmb3IgYyBpbiBfYWN0aXZlXSkKICAgICBjbWQgID0gImNhdCIKICAgICB0ZXN0c3RyID0gImFiIGNkXG4iCiAgICAgaWYgb3MubmFtZSA9PSAibnQiOgpAQCAtMjE2LDYgKzIzNCw3IEBACiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoInVuZXhwZWN0ZWQgJXIgb24gc3RkZXJyIiAlIChnb3QsKSkKICAgICBmb3IgaW5zdCBpbiBfYWN0aXZlWzpdOgogICAgICAgICBpbnN0LndhaXQoKQorICAgIF9jbGVhbnVwKCkKICAgICBpZiBfYWN0aXZlOgogICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJfYWN0aXZlIG5vdCBlbXB0eSIpCiAgICAgcHJpbnQgIkFsbCBPSyIKZGlmZiAtLWdpdCBhL0xpYi9wc3RhdHMucHkgYi9MaWIvcHN0YXRzLnB5CmluZGV4IDkzMGNjNmQuLmMzYTg4MjggMTAwNjQ0Ci0tLSBhL0xpYi9wc3RhdHMucHkKKysrIGIvTGliL3BzdGF0cy5weQpAQCAtMzIsNiArMzIsNyBAQAogIyBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLgogCiAKK2ltcG9ydCBzeXMKIGltcG9ydCBvcwogaW1wb3J0IHRpbWUKIGltcG9ydCBtYXJzaGFsCkBAIC01OCwxOCArNTksMzEgQEAKICAgICBwcmludGVkLgogCiAgICAgVGhlIHNvcnRfc3RhdHMoKSBtZXRob2Qgbm93IHByb2Nlc3NlcyBzb21lIGFkZGl0aW9uYWwgb3B0aW9ucyAoaS5lLiwgaW4KLSAgICBhZGRpdGlvbiB0byB0aGUgb2xkIC0xLCAwLCAxLCBvciAyKS4gIEl0IHRha2VzIGFuIGFyYml0cmFyeSBudW1iZXIgb2YgcXVvdGVkCi0gICAgc3RyaW5ncyB0byBzZWxlY3QgdGhlIHNvcnQgb3JkZXIuICBGb3IgZXhhbXBsZSBzb3J0X3N0YXRzKCd0aW1lJywgJ25hbWUnKQotICAgIHNvcnRzIG9uIHRoZSBtYWpvciBrZXkgb2YgImludGVybmFsIGZ1bmN0aW9uIHRpbWUiLCBhbmQgb24gdGhlIG1pbm9yCi0gICAga2V5IG9mICd0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24nLiAgTG9vayBhdCB0aGUgdHdvIHRhYmxlcyBpbiBzb3J0X3N0YXRzKCkKLSAgICBhbmQgZ2V0X3NvcnRfYXJnX2RlZnMoc2VsZikgZm9yIG1vcmUgZXhhbXBsZXMuCisgICAgYWRkaXRpb24gdG8gdGhlIG9sZCAtMSwgMCwgMSwgb3IgMikuICBJdCB0YWtlcyBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mCisgICAgcXVvdGVkIHN0cmluZ3MgdG8gc2VsZWN0IHRoZSBzb3J0IG9yZGVyLiAgRm9yIGV4YW1wbGUgc29ydF9zdGF0cygndGltZScsCisgICAgJ25hbWUnKSBzb3J0cyBvbiB0aGUgbWFqb3Iga2V5IG9mICdpbnRlcm5hbCBmdW5jdGlvbiB0aW1lJywgYW5kIG9uIHRoZQorICAgIG1pbm9yIGtleSBvZiAndGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uJy4gIExvb2sgYXQgdGhlIHR3byB0YWJsZXMgaW4KKyAgICBzb3J0X3N0YXRzKCkgYW5kIGdldF9zb3J0X2FyZ19kZWZzKHNlbGYpIGZvciBtb3JlIGV4YW1wbGVzLgogCi0gICAgQWxsIG1ldGhvZHMgbm93IHJldHVybiAic2VsZiIsICBzbyB5b3UgY2FuIHN0cmluZyB0b2dldGhlciBjb21tYW5kcyBsaWtlOgorICAgIEFsbCBtZXRob2RzIHJldHVybiBzZWxmLCAgc28geW91IGNhbiBzdHJpbmcgdG9nZXRoZXIgY29tbWFuZHMgbGlrZToKICAgICAgICAgU3RhdHMoJ2ZvbycsICdnb28nKS5zdHJpcF9kaXJzKCkuc29ydF9zdGF0cygnY2FsbHMnKS5cCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRfc3RhdHMoNSkucHJpbnRfY2FsbGVycyg1KQogICAgICIiIgogCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dkcyk6CisgICAgICAgICMgSSBjYW4ndCBmaWd1cmUgb3V0IGhvdyB0byBleHBsaWN0bHkgc3BlY2lmeSBhIHN0cmVhbSBrZXl3b3JkIGFyZworICAgICAgICAjIHdpdGggKmFyZ3M6CisgICAgICAgICMgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsIHN0cmVhbT1zeXMuc3Rkb3V0KTogLi4uCisgICAgICAgICMgc28gSSB1c2UgKiprd2RzIGFuZCBzcWF1d2sgaWYgc29tZXRoaW5nIHVuZXhwZWN0ZWQgaXMgcGFzc2VkIGluLgorICAgICAgICBzZWxmLnN0cmVhbSA9IHN5cy5zdGRvdXQKKyAgICAgICAgaWYgInN0cmVhbSIgaW4ga3dkczoKKyAgICAgICAgICAgIHNlbGYuc3RyZWFtID0ga3dkc1sic3RyZWFtIl0KKyAgICAgICAgICAgIGRlbCBrd2RzWyJzdHJlYW0iXQorICAgICAgICBpZiBrd2RzOgorICAgICAgICAgICAga2V5cyA9IGt3ZHMua2V5cygpCisgICAgICAgICAgICBrZXlzLnNvcnQoKQorICAgICAgICAgICAgZXh0cmFzID0gIiwgIi5qb2luKFsiJXM9JXMiICUgKGssIGt3ZHNba10pIGZvciBrIGluIGtleXNdKQorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgInVucmVjb2duaXplZCBrZXl3b3JkIGFyZ3M6ICVzIiAlIGV4dHJhcwogICAgICAgICBpZiBub3QgbGVuKGFyZ3MpOgogICAgICAgICAgICAgYXJnID0gTm9uZQogICAgICAgICBlbHNlOgpAQCAtOTYsOSArMTEwLDkgQEAKICAgICAgICAgICAgIHRyb3VibGUgPSAwCiAgICAgICAgIGZpbmFsbHk6CiAgICAgICAgICAgICBpZiB0cm91YmxlOgotICAgICAgICAgICAgICAgIHByaW50ICJJbnZhbGlkIHRpbWluZyBkYXRhIiwKLSAgICAgICAgICAgICAgICBpZiBzZWxmLmZpbGVzOiBwcmludCBzZWxmLmZpbGVzWy0xXSwKLSAgICAgICAgICAgICAgICBwcmludAorICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiSW52YWxpZCB0aW1pbmcgZGF0YSIsCisgICAgICAgICAgICAgICAgaWYgc2VsZi5maWxlczogcHJpbnQgPj4gc2VsZi5zdHJlYW0sIHNlbGYuZmlsZXNbLTFdLAorICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtCiAKICAgICBkZWYgbG9hZF9zdGF0cyhzZWxmLCBhcmcpOgogICAgICAgICBpZiBub3QgYXJnOiAgc2VsZi5zdGF0cyA9IHt9CkBAIC0zMjAsNyArMzM0LDcgQEAKIAogICAgICAgICBpZiBub3QgbGlzdDoKICAgICAgICAgICAgIHJldHVybiAwLCBsaXN0Ci0gICAgICAgIHByaW50IG1zZworICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgbXNnCiAgICAgICAgIGlmIGNvdW50IDwgbGVuKHNlbGYuc3RhdHMpOgogICAgICAgICAgICAgd2lkdGggPSAwCiAgICAgICAgICAgICBmb3IgZnVuYyBpbiBsaXN0OgpAQCAtMzMwLDI0ICszNDQsMjQgQEAKIAogICAgIGRlZiBwcmludF9zdGF0cyhzZWxmLCAqYW1vdW50KToKICAgICAgICAgZm9yIGZpbGVuYW1lIGluIHNlbGYuZmlsZXM6Ci0gICAgICAgICAgICBwcmludCBmaWxlbmFtZQotICAgICAgICBpZiBzZWxmLmZpbGVzOiBwcmludAorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGZpbGVuYW1lCisgICAgICAgIGlmIHNlbGYuZmlsZXM6IHByaW50ID4+IHNlbGYuc3RyZWFtCiAgICAgICAgIGluZGVudCA9ICcgJyAqIDgKICAgICAgICAgZm9yIGZ1bmMgaW4gc2VsZi50b3BfbGV2ZWw6Ci0gICAgICAgICAgICBwcmludCBpbmRlbnQsIGZ1bmNfZ2V0X2Z1bmN0aW9uX25hbWUoZnVuYykKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBpbmRlbnQsIGZ1bmNfZ2V0X2Z1bmN0aW9uX25hbWUoZnVuYykKIAotICAgICAgICBwcmludCBpbmRlbnQsIHNlbGYudG90YWxfY2FsbHMsICJmdW5jdGlvbiBjYWxscyIsCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBpbmRlbnQsIHNlbGYudG90YWxfY2FsbHMsICJmdW5jdGlvbiBjYWxscyIsCiAgICAgICAgIGlmIHNlbGYudG90YWxfY2FsbHMgIT0gc2VsZi5wcmltX2NhbGxzOgotICAgICAgICAgICAgcHJpbnQgIiglZCBwcmltaXRpdmUgY2FsbHMpIiAlIHNlbGYucHJpbV9jYWxscywKLSAgICAgICAgcHJpbnQgImluICUuM2YgQ1BVIHNlY29uZHMiICUgc2VsZi50b3RhbF90dAotICAgICAgICBwcmludAorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICIoJWQgcHJpbWl0aXZlIGNhbGxzKSIgJSBzZWxmLnByaW1fY2FsbHMsCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiaW4gJS4zZiBDUFUgc2Vjb25kcyIgJSBzZWxmLnRvdGFsX3R0CisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtCiAgICAgICAgIHdpZHRoLCBsaXN0ID0gc2VsZi5nZXRfcHJpbnRfbGlzdChhbW91bnQpCiAgICAgICAgIGlmIGxpc3Q6CiAgICAgICAgICAgICBzZWxmLnByaW50X3RpdGxlKCkKICAgICAgICAgICAgIGZvciBmdW5jIGluIGxpc3Q6CiAgICAgICAgICAgICAgICAgc2VsZi5wcmludF9saW5lKGZ1bmMpCi0gICAgICAgICAgICBwcmludAotICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQogICAgICAgICByZXR1cm4gc2VsZgogCiAgICAgZGVmIHByaW50X2NhbGxlZXMoc2VsZiwgKmFtb3VudCk6CkBAIC0zNjEsOCArMzc1LDggQEAKICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludF9jYWxsX2xpbmUod2lkdGgsIGZ1bmMsIHNlbGYuYWxsX2NhbGxlZXNbZnVuY10pCiAgICAgICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAgICAgc2VsZi5wcmludF9jYWxsX2xpbmUod2lkdGgsIGZ1bmMsIHt9KQotICAgICAgICAgICAgcHJpbnQKLSAgICAgICAgICAgIHByaW50CisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0KICAgICAgICAgcmV0dXJuIHNlbGYKIAogICAgIGRlZiBwcmludF9jYWxsZXJzKHNlbGYsICphbW91bnQpOgpAQCAtMzcyLDEyICszODYsMTIgQEAKICAgICAgICAgICAgIGZvciBmdW5jIGluIGxpc3Q6CiAgICAgICAgICAgICAgICAgY2MsIG5jLCB0dCwgY3QsIGNhbGxlcnMgPSBzZWxmLnN0YXRzW2Z1bmNdCiAgICAgICAgICAgICAgICAgc2VsZi5wcmludF9jYWxsX2xpbmUod2lkdGgsIGZ1bmMsIGNhbGxlcnMsICI8LSIpCi0gICAgICAgICAgICBwcmludAotICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbQogICAgICAgICByZXR1cm4gc2VsZgogCiAgICAgZGVmIHByaW50X2NhbGxfaGVhZGluZyhzZWxmLCBuYW1lX3NpemUsIGNvbHVtbl90aXRsZSk6Ci0gICAgICAgIHByaW50ICJGdW5jdGlvbiAiLmxqdXN0KG5hbWVfc2l6ZSkgKyBjb2x1bW5fdGl0bGUKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJGdW5jdGlvbiAiLmxqdXN0KG5hbWVfc2l6ZSkgKyBjb2x1bW5fdGl0bGUKICAgICAgICAgIyBwcmludCBzdWItaGVhZGVyIG9ubHkgaWYgd2UgaGF2ZSBuZXctc3R5bGUgY2FsbGVycwogICAgICAgICBzdWJoZWFkZXIgPSBGYWxzZQogICAgICAgICBmb3IgY2MsIG5jLCB0dCwgY3QsIGNhbGxlcnMgaW4gc2VsZi5zdGF0cy5pdGVydmFsdWVzKCk6CkBAIC0zODYsMTIgKzQwMCwxMiBAQAogICAgICAgICAgICAgICAgIHN1YmhlYWRlciA9IGlzaW5zdGFuY2UodmFsdWUsIHR1cGxlKQogICAgICAgICAgICAgICAgIGJyZWFrCiAgICAgICAgIGlmIHN1YmhlYWRlcjoKLSAgICAgICAgICAgIHByaW50ICIgIipuYW1lX3NpemUgKyAiICAgIG5jYWxscyAgdG90dGltZSAgY3VtdGltZSIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiICIqbmFtZV9zaXplICsgIiAgICBuY2FsbHMgIHRvdHRpbWUgIGN1bXRpbWUiCiAKICAgICBkZWYgcHJpbnRfY2FsbF9saW5lKHNlbGYsIG5hbWVfc2l6ZSwgc291cmNlLCBjYWxsX2RpY3QsIGFycm93PSItPiIpOgotICAgICAgICBwcmludCBmdW5jX3N0ZF9zdHJpbmcoc291cmNlKS5sanVzdChuYW1lX3NpemUpICsgYXJyb3csCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCBmdW5jX3N0ZF9zdHJpbmcoc291cmNlKS5sanVzdChuYW1lX3NpemUpICsgYXJyb3csCiAgICAgICAgIGlmIG5vdCBjYWxsX2RpY3Q6Ci0gICAgICAgICAgICBwcmludAorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0KICAgICAgICAgICAgIHJldHVybgogICAgICAgICBjbGlzdCA9IGNhbGxfZGljdC5rZXlzKCkKICAgICAgICAgY2xpc3Quc29ydCgpCkBAIC00MTEsMzAgKzQyNSwzMCBAQAogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICBzdWJzdGF0cyA9ICclcyglcikgJXMnICUgKG5hbWUsIHZhbHVlLCBmOChzZWxmLnN0YXRzW2Z1bmNdWzNdKSkKICAgICAgICAgICAgICAgICBsZWZ0X3dpZHRoID0gbmFtZV9zaXplICsgMwotICAgICAgICAgICAgcHJpbnQgaW5kZW50KmxlZnRfd2lkdGggKyBzdWJzdGF0cworICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGluZGVudCpsZWZ0X3dpZHRoICsgc3Vic3RhdHMKICAgICAgICAgICAgIGluZGVudCA9ICIgIgogCiAgICAgZGVmIHByaW50X3RpdGxlKHNlbGYpOgotICAgICAgICBwcmludCAnICAgbmNhbGxzICB0b3R0aW1lICBwZXJjYWxsICBjdW10aW1lICBwZXJjYWxsJywgXAotICAgICAgICAgICAgICAnZmlsZW5hbWU6bGluZW5vKGZ1bmN0aW9uKScKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICcgICBuY2FsbHMgIHRvdHRpbWUgIHBlcmNhbGwgIGN1bXRpbWUgIHBlcmNhbGwnLAorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgJ2ZpbGVuYW1lOmxpbmVubyhmdW5jdGlvbiknCiAKICAgICBkZWYgcHJpbnRfbGluZShzZWxmLCBmdW5jKTogICMgaGFjayA6IHNob3VsZCBwcmludCBwZXJjZW50YWdlcwogICAgICAgICBjYywgbmMsIHR0LCBjdCwgY2FsbGVycyA9IHNlbGYuc3RhdHNbZnVuY10KICAgICAgICAgYyA9IHN0cihuYykKICAgICAgICAgaWYgbmMgIT0gY2M6CiAgICAgICAgICAgICBjID0gYyArICcvJyArIHN0cihjYykKLSAgICAgICAgcHJpbnQgYy5yanVzdCg5KSwKLSAgICAgICAgcHJpbnQgZjgodHQpLAorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgYy5yanVzdCg5KSwKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGY4KHR0KSwKICAgICAgICAgaWYgbmMgPT0gMDoKLSAgICAgICAgICAgIHByaW50ICcgJyo4LAorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICcgJyo4LAogICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgZjgodHQvbmMpLAotICAgICAgICBwcmludCBmOChjdCksCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgZjgodHQvbmMpLAorICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgZjgoY3QpLAogICAgICAgICBpZiBjYyA9PSAwOgotICAgICAgICAgICAgcHJpbnQgJyAnKjgsCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgJyAnKjgsCiAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBwcmludCBmOChjdC9jYyksCi0gICAgICAgIHByaW50IGZ1bmNfc3RkX3N0cmluZyhmdW5jKQorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGY4KGN0L2NjKSwKKyAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sIGZ1bmNfc3RkX3N0cmluZyhmdW5jKQogCiBjbGFzcyBUdXBsZUNvbXA6CiAgICAgIiIiVGhpcyBjbGFzcyBwcm92aWRlcyBhIGdlbmVyaWMgZnVuY3Rpb24gZm9yIGNvbXBhcmluZyBhbnkgdHdvIHR1cGxlcy4KQEAgLTU0OSw3ICs1NjMsNyBAQAogICAgICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICAgICAgZnJhYyA9IGZsb2F0KHRlcm0pCiAgICAgICAgICAgICAgICAgICAgIGlmIGZyYWMgPiAxIG9yIGZyYWMgPCAwOgotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgIkZyYWN0aW9uIGFyZ3VtZW50IG11cyBiZSBpbiBbMCwgMV0iCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIkZyYWN0aW9uIGFyZ3VtZW50IG11c3QgYmUgaW4gWzAsIDFdIgogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFwcGVuZChmcmFjKQogICAgICAgICAgICAgICAgICAgICBjb250aW51ZQpAQCAtNTU5LDkzICs1NzMsOTMgQEAKICAgICAgICAgICAgIGlmIHNlbGYuc3RhdHM6CiAgICAgICAgICAgICAgICAgZ2V0YXR0cihzZWxmLnN0YXRzLCBmbikoKnByb2Nlc3NlZCkKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQgIk5vIHN0YXRpc3RpY3Mgb2JqZWN0IGlzIGxvYWRlZC4iCisgICAgICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJObyBzdGF0aXN0aWNzIG9iamVjdCBpcyBsb2FkZWQuIgogICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgZGVmIGdlbmVyaWNfaGVscChzZWxmKToKLSAgICAgICAgICAgIHByaW50ICJBcmd1bWVudHMgbWF5IGJlOiIKLSAgICAgICAgICAgIHByaW50ICIqIEFuIGludGVnZXIgbWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0byBwcmludC4iCi0gICAgICAgICAgICBwcmludCAiKiBBIGRlY2ltYWwgZnJhY3Rpb25hbCBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLCBjb250cm9sbGluZyIKLSAgICAgICAgICAgIHByaW50ICIgIHdoYXQgZnJhY3Rpb24gb2Ygc2VsZWN0ZWQgZW50cmllcyB0byBwcmludC4iCi0gICAgICAgICAgICBwcmludCAiKiBBIHJlZ3VsYXIgZXhwcmVzc2lvbjsgb25seSBlbnRyaWVzIHdpdGggZnVuY3Rpb24gbmFtZXMiCi0gICAgICAgICAgICBwcmludCAiICB0aGF0IG1hdGNoIGl0IGFyZSBwcmludGVkLiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiQXJndW1lbnRzIG1heSBiZToiCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIiogQW4gaW50ZWdlciBtYXhpbXVtIG51bWJlciBvZiBlbnRyaWVzIHRvIHByaW50LiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiKiBBIGRlY2ltYWwgZnJhY3Rpb25hbCBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLCBjb250cm9sbGluZyIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiICB3aGF0IGZyYWN0aW9uIG9mIHNlbGVjdGVkIGVudHJpZXMgdG8gcHJpbnQuIgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICIqIEEgcmVndWxhciBleHByZXNzaW9uOyBvbmx5IGVudHJpZXMgd2l0aCBmdW5jdGlvbiBuYW1lcyIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiICB0aGF0IG1hdGNoIGl0IGFyZSBwcmludGVkLiIKIAogICAgICAgICBkZWYgZG9fYWRkKHNlbGYsIGxpbmUpOgogICAgICAgICAgICAgc2VsZi5zdGF0cy5hZGQobGluZSkKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIGRlZiBoZWxwX2FkZChzZWxmKToKLSAgICAgICAgICAgIHByaW50ICJBZGQgcHJvZmlsZSBpbmZvIGZyb20gZ2l2ZW4gZmlsZSB0byBjdXJyZW50IHN0YXRpc3RpY3Mgb2JqZWN0LiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiQWRkIHByb2ZpbGUgaW5mbyBmcm9tIGdpdmVuIGZpbGUgdG8gY3VycmVudCBzdGF0aXN0aWNzIG9iamVjdC4iCiAKICAgICAgICAgZGVmIGRvX2NhbGxlZXMoc2VsZiwgbGluZSk6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5nZW5lcmljKCdwcmludF9jYWxsZWVzJywgbGluZSkKICAgICAgICAgZGVmIGhlbHBfY2FsbGVlcyhzZWxmKToKLSAgICAgICAgICAgIHByaW50ICJQcmludCBjYWxsZWVzIHN0YXRpc3RpY3MgZnJvbSB0aGUgY3VycmVudCBzdGF0IG9iamVjdC4iCisgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIlByaW50IGNhbGxlZXMgc3RhdGlzdGljcyBmcm9tIHRoZSBjdXJyZW50IHN0YXQgb2JqZWN0LiIKICAgICAgICAgICAgIHNlbGYuZ2VuZXJpY19oZWxwKCkKIAogICAgICAgICBkZWYgZG9fY2FsbGVycyhzZWxmLCBsaW5lKToKICAgICAgICAgICAgIHJldHVybiBzZWxmLmdlbmVyaWMoJ3ByaW50X2NhbGxlcnMnLCBsaW5lKQogICAgICAgICBkZWYgaGVscF9jYWxsZXJzKHNlbGYpOgotICAgICAgICAgICAgcHJpbnQgIlByaW50IGNhbGxlcnMgc3RhdGlzdGljcyBmcm9tIHRoZSBjdXJyZW50IHN0YXQgb2JqZWN0LiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiUHJpbnQgY2FsbGVycyBzdGF0aXN0aWNzIGZyb20gdGhlIGN1cnJlbnQgc3RhdCBvYmplY3QuIgogICAgICAgICAgICAgc2VsZi5nZW5lcmljX2hlbHAoKQogCiAgICAgICAgIGRlZiBkb19FT0Yoc2VsZiwgbGluZSk6Ci0gICAgICAgICAgICBwcmludCAiIgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICIiCiAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICBkZWYgaGVscF9FT0Yoc2VsZik6Ci0gICAgICAgICAgICBwcmludCAiTGVhdmUgdGhlIHByb2ZpbGUgYnJvd2VyLiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiTGVhdmUgdGhlIHByb2ZpbGUgYnJvd2VyLiIKIAogICAgICAgICBkZWYgZG9fcXVpdChzZWxmLCBsaW5lKToKICAgICAgICAgICAgIHJldHVybiAxCiAgICAgICAgIGRlZiBoZWxwX3F1aXQoc2VsZik6Ci0gICAgICAgICAgICBwcmludCAiTGVhdmUgdGhlIHByb2ZpbGUgYnJvd2VyLiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiTGVhdmUgdGhlIHByb2ZpbGUgYnJvd2VyLiIKIAogICAgICAgICBkZWYgZG9fcmVhZChzZWxmLCBsaW5lKToKICAgICAgICAgICAgIGlmIGxpbmU6CiAgICAgICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXRzID0gU3RhdHMobGluZSkKICAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgYXJnczoKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgYXJnc1sxXQorICAgICAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgYXJnc1sxXQogICAgICAgICAgICAgICAgICAgICByZXR1cm4KICAgICAgICAgICAgICAgICBzZWxmLnByb21wdCA9IGxpbmUgKyAiJSAiCiAgICAgICAgICAgICBlbGlmIGxlbihzZWxmLnByb21wdCkgPiAyOgogICAgICAgICAgICAgICAgIGxpbmUgPSBzZWxmLnByb21wdFstMjpdCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHByaW50ICJObyBzdGF0aXN0aWNzIG9iamVjdCBpcyBjdXJyZW50IC0tIGNhbm5vdCByZWxvYWQuIgorICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiTm8gc3RhdGlzdGljcyBvYmplY3QgaXMgY3VycmVudCAtLSBjYW5ub3QgcmVsb2FkLiIKICAgICAgICAgICAgIHJldHVybiAwCiAgICAgICAgIGRlZiBoZWxwX3JlYWQoc2VsZik6Ci0gICAgICAgICAgICBwcmludCAiUmVhZCBpbiBwcm9maWxlIGRhdGEgZnJvbSBhIHNwZWNpZmllZCBmaWxlLiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiUmVhZCBpbiBwcm9maWxlIGRhdGEgZnJvbSBhIHNwZWNpZmllZCBmaWxlLiIKIAogICAgICAgICBkZWYgZG9fcmV2ZXJzZShzZWxmLCBsaW5lKToKICAgICAgICAgICAgIHNlbGYuc3RhdHMucmV2ZXJzZV9vcmRlcigpCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBkZWYgaGVscF9yZXZlcnNlKHNlbGYpOgotICAgICAgICAgICAgcHJpbnQgIlJldmVyc2UgdGhlIHNvcnQgb3JkZXIgb2YgdGhlIHByb2ZpbGluZyByZXBvcnQuIgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJSZXZlcnNlIHRoZSBzb3J0IG9yZGVyIG9mIHRoZSBwcm9maWxpbmcgcmVwb3J0LiIKIAogICAgICAgICBkZWYgZG9fc29ydChzZWxmLCBsaW5lKToKICAgICAgICAgICAgIGFiYnJldnMgPSBzZWxmLnN0YXRzLmdldF9zb3J0X2FyZ19kZWZzKCkKICAgICAgICAgICAgIGlmIGxpbmUgYW5kIG5vdCBmaWx0ZXIobGFtYmRhIHgsYT1hYmJyZXZzOiB4IG5vdCBpbiBhLGxpbmUuc3BsaXQoKSk6CiAgICAgICAgICAgICAgICAgc2VsZi5zdGF0cy5zb3J0X3N0YXRzKCpsaW5lLnNwbGl0KCkpCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHByaW50ICJWYWxpZCBzb3J0IGtleXMgKHVuaXF1ZSBwcmVmaXhlcyBhcmUgYWNjZXB0ZWQpOiIKKyAgICAgICAgICAgICAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIlZhbGlkIHNvcnQga2V5cyAodW5pcXVlIHByZWZpeGVzIGFyZSBhY2NlcHRlZCk6IgogICAgICAgICAgICAgICAgIGZvciAoa2V5LCB2YWx1ZSkgaW4gU3RhdHMuc29ydF9hcmdfZGljdF9kZWZhdWx0Lml0ZXJpdGVtcygpOgotICAgICAgICAgICAgICAgICAgICBwcmludCAiJXMgLS0gJXMiICUgKGtleSwgdmFsdWVbMV0pCisgICAgICAgICAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiJXMgLS0gJXMiICUgKGtleSwgdmFsdWVbMV0pCiAgICAgICAgICAgICByZXR1cm4gMAogICAgICAgICBkZWYgaGVscF9zb3J0KHNlbGYpOgotICAgICAgICAgICAgcHJpbnQgIlNvcnQgcHJvZmlsZSBkYXRhIGFjY29yZGluZyB0byBzcGVjaWZpZWQga2V5cy4iCi0gICAgICAgICAgICBwcmludCAiKFR5cGluZyBgc29ydCcgd2l0aG91dCBhcmd1bWVudHMgbGlzdHMgdmFsaWQga2V5cy4pIgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJTb3J0IHByb2ZpbGUgZGF0YSBhY2NvcmRpbmcgdG8gc3BlY2lmaWVkIGtleXMuIgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICIoVHlwaW5nIGBzb3J0JyB3aXRob3V0IGFyZ3VtZW50cyBsaXN0cyB2YWxpZCBrZXlzLikiCiAgICAgICAgIGRlZiBjb21wbGV0ZV9zb3J0KHNlbGYsIHRleHQsICphcmdzKToKICAgICAgICAgICAgIHJldHVybiBbYSBmb3IgYSBpbiBTdGF0cy5zb3J0X2FyZ19kaWN0X2RlZmF1bHQgaWYgYS5zdGFydHN3aXRoKHRleHQpXQogCiAgICAgICAgIGRlZiBkb19zdGF0cyhzZWxmLCBsaW5lKToKICAgICAgICAgICAgIHJldHVybiBzZWxmLmdlbmVyaWMoJ3ByaW50X3N0YXRzJywgbGluZSkKICAgICAgICAgZGVmIGhlbHBfc3RhdHMoc2VsZik6Ci0gICAgICAgICAgICBwcmludCAiUHJpbnQgc3RhdGlzdGljcyBmcm9tIHRoZSBjdXJyZW50IHN0YXQgb2JqZWN0LiIKKyAgICAgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiUHJpbnQgc3RhdGlzdGljcyBmcm9tIHRoZSBjdXJyZW50IHN0YXQgb2JqZWN0LiIKICAgICAgICAgICAgIHNlbGYuZ2VuZXJpY19oZWxwKCkKIAogICAgICAgICBkZWYgZG9fc3RyaXAoc2VsZiwgbGluZSk6CiAgICAgICAgICAgICBzZWxmLnN0YXRzLnN0cmlwX2RpcnMoKQogICAgICAgICAgICAgcmV0dXJuIDAKICAgICAgICAgZGVmIGhlbHBfc3RyaXAoc2VsZik6Ci0gICAgICAgICAgICBwcmludCAiU3RyaXAgbGVhZGluZyBwYXRoIGluZm9ybWF0aW9uIGZyb20gZmlsZW5hbWVzIGluIHRoZSByZXBvcnQuIgorICAgICAgICAgICAgcHJpbnQgPj4gc2VsZi5zdHJlYW0sICJTdHJpcCBsZWFkaW5nIHBhdGggaW5mb3JtYXRpb24gZnJvbSBmaWxlbmFtZXMgaW4gdGhlIHJlcG9ydC4iCiAKICAgICAgICAgZGVmIHBvc3RjbWQoc2VsZiwgc3RvcCwgbGluZSk6CiAgICAgICAgICAgICBpZiBzdG9wOgpAQCAtNjUzLDE0ICs2NjcsMTQgQEAKICAgICAgICAgICAgIHJldHVybiBOb25lCiAKICAgICBpbXBvcnQgc3lzCi0gICAgcHJpbnQgIldlbGNvbWUgdG8gdGhlIHByb2ZpbGUgc3RhdGlzdGljcyBicm93c2VyLiIKKyAgICBwcmludCA+PiBzZWxmLnN0cmVhbSwgIldlbGNvbWUgdG8gdGhlIHByb2ZpbGUgc3RhdGlzdGljcyBicm93c2VyLiIKICAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKICAgICAgICAgaW5pdHByb2ZpbGUgPSBzeXMuYXJndlsxXQogICAgIGVsc2U6CiAgICAgICAgIGluaXRwcm9maWxlID0gTm9uZQogICAgIHRyeToKICAgICAgICAgUHJvZmlsZUJyb3dzZXIoaW5pdHByb2ZpbGUpLmNtZGxvb3AoKQotICAgICAgICBwcmludCAiR29vZGJ5ZS4iCisgICAgICAgIHByaW50ID4+IHNlbGYuc3RyZWFtLCAiR29vZGJ5ZS4iCiAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgogICAgICAgICBwYXNzCiAKZGlmZiAtLWdpdCBhL0xpYi9weWRvYy5weSBiL0xpYi9weWRvYy5weQppbmRleCBiNmFmYzdmLi5jZjM4NjMwIDEwMDc1NQotLS0gYS9MaWIvcHlkb2MucHkKKysrIGIvTGliL3B5ZG9jLnB5CkBAIC01MiwxMCArNTIsMTYgQEAKICMgICAgIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBjaGFuZ2VkIHdpdGggb3MuY2hkaXIoKSwgYW4gaW5jb3JyZWN0CiAjICAgICBwYXRoIHdpbGwgYmUgZGlzcGxheWVkLgogCi1pbXBvcnQgc3lzLCBpbXAsIG9zLCByZSwgdHlwZXMsIGluc3BlY3QsIF9fYnVpbHRpbl9fCitpbXBvcnQgc3lzLCBpbXAsIG9zLCByZSwgdHlwZXMsIGluc3BlY3QsIF9fYnVpbHRpbl9fLCBwa2d1dGlsCiBmcm9tIHJlcHIgaW1wb3J0IFJlcHIKIGZyb20gc3RyaW5nIGltcG9ydCBleHBhbmR0YWJzLCBmaW5kLCBqb2luLCBsb3dlciwgc3BsaXQsIHN0cmlwLCByZmluZCwgcnN0cmlwCi1mcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBkZXF1ZQordHJ5OgorICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgIyBQeXRob24gMi4zIGNvbXBhdGliaWxpdHkKKyAgICBjbGFzcyBkZXF1ZShsaXN0KToKKyAgICAgICAgZGVmIHBvcGxlZnQoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wb3AoMCkKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29tbW9uIHJvdXRpbmVzCiAKQEAgLTE4Miw2ICsxODgsMjMgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQogICAgIHJldHVybiBGYWxzZQogCitkZWYgc291cmNlX3N5bm9wc2lzKGZpbGUpOgorICAgIGxpbmUgPSBmaWxlLnJlYWRsaW5lKCkKKyAgICB3aGlsZSBsaW5lWzoxXSA9PSAnIycgb3Igbm90IHN0cmlwKGxpbmUpOgorICAgICAgICBsaW5lID0gZmlsZS5yZWFkbGluZSgpCisgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhaworICAgIGxpbmUgPSBzdHJpcChsaW5lKQorICAgIGlmIGxpbmVbOjRdID09ICdyIiIiJzogbGluZSA9IGxpbmVbMTpdCisgICAgaWYgbGluZVs6M10gPT0gJyIiIic6CisgICAgICAgIGxpbmUgPSBsaW5lWzM6XQorICAgICAgICBpZiBsaW5lWy0xOl0gPT0gJ1xcJzogbGluZSA9IGxpbmVbOi0xXQorICAgICAgICB3aGlsZSBub3Qgc3RyaXAobGluZSk6CisgICAgICAgICAgICBsaW5lID0gZmlsZS5yZWFkbGluZSgpCisgICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKKyAgICAgICAgcmVzdWx0ID0gc3RyaXAoc3BsaXQobGluZSwgJyIiIicpWzBdKQorICAgIGVsc2U6IHJlc3VsdCA9IE5vbmUKKyAgICByZXR1cm4gcmVzdWx0CisKIGRlZiBzeW5vcHNpcyhmaWxlbmFtZSwgY2FjaGU9e30pOgogICAgICIiIkdldCB0aGUgb25lLWxpbmUgc3VtbWFyeSBvdXQgb2YgYSBtb2R1bGUgZmlsZS4iIiIKICAgICBtdGltZSA9IG9zLnN0YXQoZmlsZW5hbWUpLnN0X210aW1lCkBAIC0xOTYsMjQgKzIxOSwxMSBAQAogICAgICAgICBpZiBpbmZvIGFuZCAnYicgaW4gaW5mb1syXTogIyBiaW5hcnkgbW9kdWxlcyBoYXZlIHRvIGJlIGltcG9ydGVkCiAgICAgICAgICAgICB0cnk6IG1vZHVsZSA9IGltcC5sb2FkX21vZHVsZSgnX190ZW1wX18nLCBmaWxlLCBmaWxlbmFtZSwgaW5mb1sxOl0pCiAgICAgICAgICAgICBleGNlcHQ6IHJldHVybiBOb25lCi0gICAgICAgICAgICByZXN1bHQgPSBzcGxpdChtb2R1bGUuX19kb2NfXyBvciAnJywgJ1xuJylbMF0KKyAgICAgICAgICAgIHJlc3VsdCA9IChtb2R1bGUuX19kb2NfXyBvciAnJykuc3BsaXRsaW5lcygpWzBdCiAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbJ19fdGVtcF9fJ10KICAgICAgICAgZWxzZTogIyB0ZXh0IG1vZHVsZXMgY2FuIGJlIGRpcmVjdGx5IGV4YW1pbmVkCi0gICAgICAgICAgICBsaW5lID0gZmlsZS5yZWFkbGluZSgpCi0gICAgICAgICAgICB3aGlsZSBsaW5lWzoxXSA9PSAnIycgb3Igbm90IHN0cmlwKGxpbmUpOgotICAgICAgICAgICAgICAgIGxpbmUgPSBmaWxlLnJlYWRsaW5lKCkKLSAgICAgICAgICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKLSAgICAgICAgICAgIGxpbmUgPSBzdHJpcChsaW5lKQotICAgICAgICAgICAgaWYgbGluZVs6NF0gPT0gJ3IiIiInOiBsaW5lID0gbGluZVsxOl0KLSAgICAgICAgICAgIGlmIGxpbmVbOjNdID09ICciIiInOgotICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lWzM6XQotICAgICAgICAgICAgICAgIGlmIGxpbmVbLTE6XSA9PSAnXFwnOiBsaW5lID0gbGluZVs6LTFdCi0gICAgICAgICAgICAgICAgd2hpbGUgbm90IHN0cmlwKGxpbmUpOgotICAgICAgICAgICAgICAgICAgICBsaW5lID0gZmlsZS5yZWFkbGluZSgpCi0gICAgICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lOiBicmVhawotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHN0cmlwKHNwbGl0KGxpbmUsICciIiInKVswXSkKLSAgICAgICAgICAgIGVsc2U6IHJlc3VsdCA9IE5vbmUKLSAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgICAgICByZXN1bHQgPSBzb3VyY2Vfc3lub3BzaXMoZmlsZSkKKyAgICAgICAgICAgIGZpbGUuY2xvc2UoKQogICAgICAgICBjYWNoZVtmaWxlbmFtZV0gPSAobXRpbWUsIHJlc3VsdCkKICAgICByZXR1cm4gcmVzdWx0CiAKQEAgLTY0MywxNiArNjUzLDggQEAKIAogICAgICAgICBpZiBoYXNhdHRyKG9iamVjdCwgJ19fcGF0aF9fJyk6CiAgICAgICAgICAgICBtb2Rwa2dzID0gW10KLSAgICAgICAgICAgIG1vZG5hbWVzID0gW10KLSAgICAgICAgICAgIGZvciBmaWxlIGluIG9zLmxpc3RkaXIob2JqZWN0Ll9fcGF0aF9fWzBdKToKLSAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKG9iamVjdC5fX3BhdGhfX1swXSwgZmlsZSkKLSAgICAgICAgICAgICAgICBtb2RuYW1lID0gaW5zcGVjdC5nZXRtb2R1bGVuYW1lKGZpbGUpCi0gICAgICAgICAgICAgICAgaWYgbW9kbmFtZSAhPSAnX19pbml0X18nOgotICAgICAgICAgICAgICAgICAgICBpZiBtb2RuYW1lIGFuZCBtb2RuYW1lIG5vdCBpbiBtb2RuYW1lczoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZHBrZ3MuYXBwZW5kKChtb2RuYW1lLCBuYW1lLCAwLCAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZG5hbWVzLmFwcGVuZChtb2RuYW1lKQotICAgICAgICAgICAgICAgICAgICBlbGlmIGlzcGFja2FnZShwYXRoKToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZHBrZ3MuYXBwZW5kKChmaWxlLCBuYW1lLCAxLCAwKSkKKyAgICAgICAgICAgIGZvciBpbXBvcnRlciwgbW9kbmFtZSwgaXNwa2cgaW4gcGtndXRpbC5pdGVyX21vZHVsZXMob2JqZWN0Ll9fcGF0aF9fKToKKyAgICAgICAgICAgICAgICBtb2Rwa2dzLmFwcGVuZCgobW9kbmFtZSwgbmFtZSwgaXNwa2csIDApKQogICAgICAgICAgICAgbW9kcGtncy5zb3J0KCkKICAgICAgICAgICAgIGNvbnRlbnRzID0gc2VsZi5tdWx0aWNvbHVtbihtb2Rwa2dzLCBzZWxmLm1vZHBrZ2xpbmspCiAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzZWxmLmJpZ3NlY3Rpb24oCkBAIC03OTYsNyArNzk4LDEwIEBACiAgICAgICAgICAgICB0YWcgKz0gJzo8YnI+XG4nCiAKICAgICAgICAgICAgICMgU29ydCBhdHRycyBieSBuYW1lLgotICAgICAgICAgICAgYXR0cnMuc29ydChrZXk9bGFtYmRhIHQ6IHRbMF0pCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgYXR0cnMuc29ydChrZXk9bGFtYmRhIHQ6IHRbMF0pCisgICAgICAgICAgICBleGNlcHQgVHlwZUVycm9yOgorICAgICAgICAgICAgICAgIGF0dHJzLnNvcnQobGFtYmRhIHQxLCB0MjogY21wKHQxWzBdLCB0MlswXSkpICAgICMgMi4zIGNvbXBhdAogCiAgICAgICAgICAgICAjIFB1bXAgb3V0IHRoZSBhdHRycywgc2VncmVnYXRlZCBieSBraW5kLgogICAgICAgICAgICAgYXR0cnMgPSBzcGlsbCgnTWV0aG9kcyAlcycgJSB0YWcsIGF0dHJzLApAQCAtOTE0LDI1ICs5MTksOSBAQAogICAgICAgICAiIiJHZW5lcmF0ZSBhbiBIVE1MIGluZGV4IGZvciBhIGRpcmVjdG9yeSBvZiBtb2R1bGVzLiIiIgogICAgICAgICBtb2Rwa2dzID0gW10KICAgICAgICAgaWYgc2hhZG93ZWQgaXMgTm9uZTogc2hhZG93ZWQgPSB7fQotICAgICAgICBzZWVuID0ge30KLSAgICAgICAgZmlsZXMgPSBvcy5saXN0ZGlyKGRpcikKLQotICAgICAgICBkZWYgZm91bmQobmFtZSwgaXNwYWNrYWdlLAotICAgICAgICAgICAgICAgICAgbW9kcGtncz1tb2Rwa2dzLCBzaGFkb3dlZD1zaGFkb3dlZCwgc2Vlbj1zZWVuKToKLSAgICAgICAgICAgIGlmIG5hbWUgbm90IGluIHNlZW46Ci0gICAgICAgICAgICAgICAgbW9kcGtncy5hcHBlbmQoKG5hbWUsICcnLCBpc3BhY2thZ2UsIG5hbWUgaW4gc2hhZG93ZWQpKQotICAgICAgICAgICAgICAgIHNlZW5bbmFtZV0gPSAxCi0gICAgICAgICAgICAgICAgc2hhZG93ZWRbbmFtZV0gPSAxCi0KLSAgICAgICAgIyBQYWNrYWdlIHNwYW0vX19pbml0X18ucHkgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIG1vZHVsZSBzcGFtLnB5LgotICAgICAgICBmb3IgZmlsZSBpbiBmaWxlczoKLSAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlyLCBmaWxlKQotICAgICAgICAgICAgaWYgaXNwYWNrYWdlKHBhdGgpOiBmb3VuZChmaWxlLCAxKQotICAgICAgICBmb3IgZmlsZSBpbiBmaWxlczoKLSAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlyLCBmaWxlKQotICAgICAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6Ci0gICAgICAgICAgICAgICAgbW9kbmFtZSA9IGluc3BlY3QuZ2V0bW9kdWxlbmFtZShmaWxlKQotICAgICAgICAgICAgICAgIGlmIG1vZG5hbWU6IGZvdW5kKG1vZG5hbWUsIDApCisgICAgICAgIGZvciBpbXBvcnRlciwgbmFtZSwgaXNwa2cgaW4gcGtndXRpbC5pdGVyX21vZHVsZXMoW2Rpcl0pOgorICAgICAgICAgICAgbW9kcGtncy5hcHBlbmQoKG5hbWUsICcnLCBpc3BrZywgbmFtZSBpbiBzaGFkb3dlZCkpCisgICAgICAgICAgICBzaGFkb3dlZFtuYW1lXSA9IDEKIAogICAgICAgICBtb2Rwa2dzLnNvcnQoKQogICAgICAgICBjb250ZW50cyA9IHNlbGYubXVsdGljb2x1bW4obW9kcGtncywgc2VsZi5tb2Rwa2dsaW5rKQpAQCAtMTA1OSwxNCArMTA0OCwxMiBAQAogCiAgICAgICAgIGlmIGhhc2F0dHIob2JqZWN0LCAnX19wYXRoX18nKToKICAgICAgICAgICAgIG1vZHBrZ3MgPSBbXQotICAgICAgICAgICAgZm9yIGZpbGUgaW4gb3MubGlzdGRpcihvYmplY3QuX19wYXRoX19bMF0pOgotICAgICAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ob2JqZWN0Ll9fcGF0aF9fWzBdLCBmaWxlKQotICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBpbnNwZWN0LmdldG1vZHVsZW5hbWUoZmlsZSkKLSAgICAgICAgICAgICAgICBpZiBtb2RuYW1lICE9ICdfX2luaXRfXyc6Ci0gICAgICAgICAgICAgICAgICAgIGlmIG1vZG5hbWUgYW5kIG1vZG5hbWUgbm90IGluIG1vZHBrZ3M6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtb2Rwa2dzLmFwcGVuZChtb2RuYW1lKQotICAgICAgICAgICAgICAgICAgICBlbGlmIGlzcGFja2FnZShwYXRoKToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1vZHBrZ3MuYXBwZW5kKGZpbGUgKyAnIChwYWNrYWdlKScpCisgICAgICAgICAgICBmb3IgaW1wb3J0ZXIsIG1vZG5hbWUsIGlzcGtnIGluIHBrZ3V0aWwuaXRlcl9tb2R1bGVzKG9iamVjdC5fX3BhdGhfXyk6CisgICAgICAgICAgICAgICAgaWYgaXNwa2c6CisgICAgICAgICAgICAgICAgICAgIG1vZHBrZ3MuYXBwZW5kKG1vZG5hbWUgKyAnIChwYWNrYWdlKScpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbW9kcGtncy5hcHBlbmQobW9kbmFtZSkKKwogICAgICAgICAgICAgbW9kcGtncy5zb3J0KCkKICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHNlbGYuc2VjdGlvbigKICAgICAgICAgICAgICAgICAnUEFDS0FHRSBDT05URU5UUycsIGpvaW4obW9kcGtncywgJ1xuJykpCkBAIC0xNDkwLDIwICsxNDc3LDkgQEAKIGRlZiB3cml0ZWRvY3MoZGlyLCBwa2dwYXRoPScnLCBkb25lPU5vbmUpOgogICAgICIiIldyaXRlIG91dCBIVE1MIGRvY3VtZW50YXRpb24gZm9yIGFsbCBtb2R1bGVzIGluIGEgZGlyZWN0b3J5IHRyZWUuIiIiCiAgICAgaWYgZG9uZSBpcyBOb25lOiBkb25lID0ge30KLSAgICBmb3IgZmlsZSBpbiBvcy5saXN0ZGlyKGRpcik6Ci0gICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oZGlyLCBmaWxlKQotICAgICAgICBpZiBpc3BhY2thZ2UocGF0aCk6Ci0gICAgICAgICAgICB3cml0ZWRvY3MocGF0aCwgcGtncGF0aCArIGZpbGUgKyAnLicsIGRvbmUpCi0gICAgICAgIGVsaWYgb3MucGF0aC5pc2ZpbGUocGF0aCk6Ci0gICAgICAgICAgICBtb2RuYW1lID0gaW5zcGVjdC5nZXRtb2R1bGVuYW1lKHBhdGgpCi0gICAgICAgICAgICBpZiBtb2RuYW1lOgotICAgICAgICAgICAgICAgIGlmIG1vZG5hbWUgPT0gJ19faW5pdF9fJzoKLSAgICAgICAgICAgICAgICAgICAgbW9kbmFtZSA9IHBrZ3BhdGhbOi0xXSAjIHJlbW92ZSB0cmFpbGluZyBwZXJpb2QKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBtb2RuYW1lID0gcGtncGF0aCArIG1vZG5hbWUKLSAgICAgICAgICAgICAgICBpZiBtb2RuYW1lIG5vdCBpbiBkb25lOgotICAgICAgICAgICAgICAgICAgICBkb25lW21vZG5hbWVdID0gMQotICAgICAgICAgICAgICAgICAgICB3cml0ZWRvYyhtb2RuYW1lKQorICAgIGZvciBpbXBvcnRlciwgbW9kbmFtZSwgaXNwa2cgaW4gcGtndXRpbC53YWxrX3BhY2thZ2VzKFtkaXJdLCBwa2dwYXRoKToKKyAgICAgICAgd3JpdGVkb2MobW9kbmFtZSkKKyAgICByZXR1cm4KIAogZGVmIHJhd19pbnB1dChwcm9tcHQpOgogICAgIHN5cy5zdGRvdXQud3JpdGUocHJvbXB0KQpAQCAtMTgzNSwzMCArMTgxMSw5IEBACiAgICAgICAgICAgICBzZWxmLnN0YXRlLmFwcGVuZCgoY2hpbGQsIHNlbGYuY2hpbGRyZW4oY2hpbGQpKSkKICAgICAgICAgcmV0dXJuIGNoaWxkCiAKLWNsYXNzIE1vZHVsZVNjYW5uZXIoU2Nhbm5lcik6CisKK2NsYXNzIE1vZHVsZVNjYW5uZXI6CiAgICAgIiIiQW4gaW50ZXJydXB0aWJsZSBzY2FubmVyIHRoYXQgc2VhcmNoZXMgbW9kdWxlIHN5bm9wc2VzLiIiIgotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcm9vdHMgPSBtYXAobGFtYmRhIGRpcjogKGRpciwgJycpLCBwYXRoZGlycygpKQotICAgICAgICBTY2FubmVyLl9faW5pdF9fKHNlbGYsIHJvb3RzLCBzZWxmLnN1Ym1vZHVsZXMsIHNlbGYuaXNuZXdwYWNrYWdlKQotICAgICAgICBzZWxmLmlub2RlcyA9IG1hcChsYW1iZGEgKGRpciwgcGtnKTogb3Muc3RhdChkaXIpLnN0X2lubywgcm9vdHMpCi0KLSAgICBkZWYgc3VibW9kdWxlcyhzZWxmLCAoZGlyLCBwYWNrYWdlKSk6Ci0gICAgICAgIGNoaWxkcmVuID0gW10KLSAgICAgICAgZm9yIGZpbGUgaW4gb3MubGlzdGRpcihkaXIpOgotICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihkaXIsIGZpbGUpCi0gICAgICAgICAgICBpZiBpc3BhY2thZ2UocGF0aCk6Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4uYXBwZW5kKChwYXRoLCBwYWNrYWdlICsgKHBhY2thZ2UgYW5kICcuJykgKyBmaWxlKSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgY2hpbGRyZW4uYXBwZW5kKChwYXRoLCBwYWNrYWdlKSkKLSAgICAgICAgY2hpbGRyZW4uc29ydCgpICMgc28gdGhhdCBzcGFtLnB5IGNvbWVzIGJlZm9yZSBzcGFtLnB5YyBvciBzcGFtLnB5bwotICAgICAgICByZXR1cm4gY2hpbGRyZW4KLQotICAgIGRlZiBpc25ld3BhY2thZ2Uoc2VsZiwgKGRpciwgcGFja2FnZSkpOgotICAgICAgICBpbm9kZSA9IG9zLnBhdGguZXhpc3RzKGRpcikgYW5kIG9zLnN0YXQoZGlyKS5zdF9pbm8KLSAgICAgICAgaWYgbm90IChvcy5wYXRoLmlzbGluayhkaXIpIGFuZCBpbm9kZSBpbiBzZWxmLmlub2Rlcyk6Ci0gICAgICAgICAgICBzZWxmLmlub2Rlcy5hcHBlbmQoaW5vZGUpICMgZGV0ZWN0IGNpcmN1bGFyIHN5bWJvbGljIGxpbmtzCi0gICAgICAgICAgICByZXR1cm4gaXNwYWNrYWdlKGRpcikKLSAgICAgICAgcmV0dXJuIEZhbHNlCiAKICAgICBkZWYgcnVuKHNlbGYsIGNhbGxiYWNrLCBrZXk9Tm9uZSwgY29tcGxldGVyPU5vbmUpOgogICAgICAgICBpZiBrZXk6IGtleSA9IGxvd2VyKGtleSkKQEAgLTE4NzUsMjIgKzE4MzAsMzEgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgZmluZChsb3dlcihtb2RuYW1lICsgJyAtICcgKyBkZXNjKSwga2V5KSA+PSAwOgogICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soTm9uZSwgbW9kbmFtZSwgZGVzYykKIAotICAgICAgICB3aGlsZSBub3Qgc2VsZi5xdWl0OgotICAgICAgICAgICAgbm9kZSA9IHNlbGYubmV4dCgpCi0gICAgICAgICAgICBpZiBub3Qgbm9kZTogYnJlYWsKLSAgICAgICAgICAgIHBhdGgsIHBhY2thZ2UgPSBub2RlCi0gICAgICAgICAgICBtb2RuYW1lID0gaW5zcGVjdC5nZXRtb2R1bGVuYW1lKHBhdGgpCi0gICAgICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKSBhbmQgbW9kbmFtZToKLSAgICAgICAgICAgICAgICBtb2RuYW1lID0gcGFja2FnZSArIChwYWNrYWdlIGFuZCAnLicpICsgbW9kbmFtZQotICAgICAgICAgICAgICAgIGlmIG5vdCBtb2RuYW1lIGluIHNlZW46Ci0gICAgICAgICAgICAgICAgICAgIHNlZW5bbW9kbmFtZV0gPSAxICMgaWYgd2Ugc2VlIHNwYW0ucHksIHNraXAgc3BhbS5weWMKLSAgICAgICAgICAgICAgICAgICAgaWYga2V5IGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhwYXRoLCBtb2RuYW1lLCAnJykKKyAgICAgICAgZm9yIGltcG9ydGVyLCBtb2RuYW1lLCBpc3BrZyBpbiBwa2d1dGlsLndhbGtfcGFja2FnZXMoKToKKyAgICAgICAgICAgIGlmIHNlbGYucXVpdDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYga2V5IGlzIE5vbmU6CisgICAgICAgICAgICAgICAgY2FsbGJhY2soTm9uZSwgbW9kbmFtZSwgJycpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxvYWRlciA9IGltcG9ydGVyLmZpbmRfbW9kdWxlKG1vZG5hbWUpCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihsb2FkZXIsJ2dldF9zb3VyY2UnKToKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IFN0cmluZ0lPCisgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBzb3VyY2Vfc3lub3BzaXMoCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdJTy5TdHJpbmdJTyhsb2FkZXIuZ2V0X3NvdXJjZShtb2RuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgKSBvciAnJworICAgICAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKGxvYWRlciwnZ2V0X2ZpbGVuYW1lJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXRoID0gbG9hZGVyLmdldF9maWxlbmFtZShtb2RuYW1lKQogICAgICAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IHN5bm9wc2lzKHBhdGgpIG9yICcnCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiBmaW5kKGxvd2VyKG1vZG5hbWUgKyAnIC0gJyArIGRlc2MpLCBrZXkpID49IDA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2socGF0aCwgbW9kbmFtZSwgZGVzYykKLSAgICAgICAgaWYgY29tcGxldGVyOiBjb21wbGV0ZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IE5vbmUKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtb2R1bGUgPSBsb2FkZXIubG9hZF9tb2R1bGUobW9kbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgZGVzYyA9IChtb2R1bGUuX19kb2NfXyBvciAnJykuc3BsaXRsaW5lcygpWzBdCisgICAgICAgICAgICAgICAgICAgIHBhdGggPSBnZXRhdHRyKG1vZHVsZSwnX19maWxlX18nLE5vbmUpCisgICAgICAgICAgICAgICAgaWYgZmluZChsb3dlcihtb2RuYW1lICsgJyAtICcgKyBkZXNjKSwga2V5KSA+PSAwOgorICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhwYXRoLCBtb2RuYW1lLCBkZXNjKQorCisgICAgICAgIGlmIGNvbXBsZXRlcjoKKyAgICAgICAgICAgIGNvbXBsZXRlcigpCiAKIGRlZiBhcHJvcG9zKGtleSk6CiAgICAgIiIiUHJpbnQgYWxsIHRoZSBvbmUtbGluZSBtb2R1bGUgc3VtbWFyaWVzIHRoYXQgY29udGFpbiBhIHN1YnN0cmluZy4iIiIKQEAgLTE5NTUsNyArMTkxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICdCdWlsdC1pbiBNb2R1bGVzJywgJyNmZmZmZmYnLCAnI2VlNzdhYScsIGNvbnRlbnRzKV0KIAogICAgICAgICAgICAgICAgIHNlZW4gPSB7fQotICAgICAgICAgICAgICAgIGZvciBkaXIgaW4gcGF0aGRpcnMoKToKKyAgICAgICAgICAgICAgICBmb3IgZGlyIGluIHN5cy5wYXRoOgogICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLmFwcGVuZChodG1sLmluZGV4KGRpciwgc2VlbikpCiAgICAgICAgICAgICAgICAgY29udGVudHMgPSBoZWFkaW5nICsgam9pbihpbmRpY2VzKSArICcnJzxwIGFsaWduPXJpZ2h0PgogPGZvbnQgY29sb3I9IiM5MDkwOTAiIGZhY2U9ImhlbHZldGljYSwgYXJpYWwiPjxzdHJvbmc+CmRpZmYgLS1naXQgYS9MaWIvcmFuZG9tLnB5IGIvTGliL3JhbmRvbS5weQppbmRleCBiNGFkMmIzLi40NjVmNDc3IDEwMDY0NAotLS0gYS9MaWIvcmFuZG9tLnB5CisrKyBiL0xpYi9yYW5kb20ucHkKQEAgLTI4NSw2ICsyODUsMTUgQEAKICAgICAgICAgbGFyZ2UgcG9wdWxhdGlvbjogICBzYW1wbGUoeHJhbmdlKDEwMDAwMDAwKSwgNjApCiAgICAgICAgICIiIgogCisgICAgICAgICMgWFhYIEFsdGhvdWdoIHRoZSBkb2N1bWVudGF0aW9uIHNheXMgYHBvcHVsYXRpb25gIGlzICJhIHNlcXVlbmNlIiwKKyAgICAgICAgIyBYWFggYXR0ZW1wdHMgYXJlIG1hZGUgdG8gY2F0ZXIgdG8gYW55IGl0ZXJhYmxlIHdpdGggYSBfX2xlbl9fCisgICAgICAgICMgWFhYIG1ldGhvZC4gIFRoaXMgaGFzIGhhZCBtaXhlZCBzdWNjZXNzLiAgRXhhbXBsZXMgZnJvbSBib3RoCisgICAgICAgICMgWFhYIHNpZGVzOiAgc2V0cyB3b3JrIGZpbmUsIGFuZCBzaG91bGQgYmVjb21lIG9mZmljaWFsbHkgc3VwcG9ydGVkOworICAgICAgICAjIFhYWCBkaWN0cyBhcmUgbXVjaCBoYXJkZXIsIGFuZCBoYXZlIGZhaWxlZCBpbiB2YXJpb3VzIHN1YnRsZQorICAgICAgICAjIFhYWCB3YXlzIGFjcm9zcyBhdHRlbXB0cy4gIFN1cHBvcnQgZm9yIG1hcHBpbmcgdHlwZXMgc2hvdWxkIHByb2JhYmx5CisgICAgICAgICMgWFhYIGJlIGRyb3BwZWQgKGFuZCB1c2VycyBzaG91bGQgcGFzcyBtYXBwaW5nLmtleXMoKSBvciAudmFsdWVzKCkKKyAgICAgICAgIyBYWFggZXhwbGljaXRseSkuCisKICAgICAgICAgIyBTYW1wbGluZyB3aXRob3V0IHJlcGxhY2VtZW50IGVudGFpbHMgdHJhY2tpbmcgZWl0aGVyIHBvdGVudGlhbAogICAgICAgICAjIHNlbGVjdGlvbnMgKHRoZSBwb29sKSBpbiBhIGxpc3Qgb3IgcHJldmlvdXMgc2VsZWN0aW9ucyBpbiBhIHNldC4KIApAQCAtMzA0LDcgKzMxMyw5IEBACiAgICAgICAgIHNldHNpemUgPSAyMSAgICAgICAgIyBzaXplIG9mIGEgc21hbGwgc2V0IG1pbnVzIHNpemUgb2YgYW4gZW1wdHkgbGlzdAogICAgICAgICBpZiBrID4gNToKICAgICAgICAgICAgIHNldHNpemUgKz0gNCAqKiBfY2VpbChfbG9nKGsgKiAzLCA0KSkgIyB0YWJsZSBzaXplIGZvciBiaWcgc2V0cwotICAgICAgICBpZiBuIDw9IHNldHNpemU6ICAgICMgaXMgYW4gbi1sZW5ndGggbGlzdCBzbWFsbGVyIHRoYW4gYSBrLWxlbmd0aCBzZXQKKyAgICAgICAgaWYgbiA8PSBzZXRzaXplIG9yIGhhc2F0dHIocG9wdWxhdGlvbiwgImtleXMiKToKKyAgICAgICAgICAgICMgQW4gbi1sZW5ndGggbGlzdCBpcyBzbWFsbGVyIHRoYW4gYSBrLWxlbmd0aCBzZXQsIG9yIHRoaXMgaXMgYQorICAgICAgICAgICAgIyBtYXBwaW5nIHR5cGUgc28gdGhlIG90aGVyIGFsZ29yaXRobSB3b3VsZG4ndCB3b3JrLgogICAgICAgICAgICAgcG9vbCA9IGxpc3QocG9wdWxhdGlvbikKICAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShrKTogICAgICAgICAjIGludmFyaWFudDogIG5vbi1zZWxlY3RlZCBhdCBbMCxuLWkpCiAgICAgICAgICAgICAgICAgaiA9IF9pbnQocmFuZG9tKCkgKiAobi1pKSkKQEAgLTMxMiwxNyArMzIzLDE4IEBACiAgICAgICAgICAgICAgICAgcG9vbFtqXSA9IHBvb2xbbi1pLTFdICAgIyBtb3ZlIG5vbi1zZWxlY3RlZCBpdGVtIGludG8gdmFjYW5jeQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIG4gPiAwIGFuZCAocG9wdWxhdGlvblswXSwgcG9wdWxhdGlvbltuLy8yXSwgcG9wdWxhdGlvbltuLTFdKQotICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIEtleUVycm9yKTogICAjIGhhbmRsZSBub24tc2VxdWVuY2UgaXRlcmFibGVzCi0gICAgICAgICAgICAgICAgcG9wdWxhdGlvbiA9IHR1cGxlKHBvcHVsYXRpb24pCi0gICAgICAgICAgICBzZWxlY3RlZCA9IHNldCgpCi0gICAgICAgICAgICBzZWxlY3RlZF9hZGQgPSBzZWxlY3RlZC5hZGQKLSAgICAgICAgICAgIGZvciBpIGluIHhyYW5nZShrKToKLSAgICAgICAgICAgICAgICBqID0gX2ludChyYW5kb20oKSAqIG4pCi0gICAgICAgICAgICAgICAgd2hpbGUgaiBpbiBzZWxlY3RlZDoKKyAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IHNldCgpCisgICAgICAgICAgICAgICAgc2VsZWN0ZWRfYWRkID0gc2VsZWN0ZWQuYWRkCisgICAgICAgICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGspOgogICAgICAgICAgICAgICAgICAgICBqID0gX2ludChyYW5kb20oKSAqIG4pCi0gICAgICAgICAgICAgICAgc2VsZWN0ZWRfYWRkKGopCi0gICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gcG9wdWxhdGlvbltqXQorICAgICAgICAgICAgICAgICAgICB3aGlsZSBqIGluIHNlbGVjdGVkOgorICAgICAgICAgICAgICAgICAgICAgICAgaiA9IF9pbnQocmFuZG9tKCkgKiBuKQorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZF9hZGQoaikKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gcG9wdWxhdGlvbltqXQorICAgICAgICAgICAgZXhjZXB0IChUeXBlRXJyb3IsIEtleUVycm9yKTogICAjIGhhbmRsZSAoYXQgbGVhc3QpIHNldHMKKyAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKHBvcHVsYXRpb24sIGxpc3QpOgorICAgICAgICAgICAgICAgICAgICByYWlzZQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnNhbXBsZSh0dXBsZShwb3B1bGF0aW9uKSwgaykKICAgICAgICAgcmV0dXJuIHJlc3VsdAogCiAjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLSByZWFsLXZhbHVlZCBkaXN0cmlidXRpb25zICAtLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9MaWIvcmVjb252ZXJ0LnB5IGIvTGliL3JlY29udmVydC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjRiYWI1Yi4uMDAwMDAwMAotLS0gYS9MaWIvcmVjb252ZXJ0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KLQotciIiIkNvbnZlcnQgb2xkICgicmVnZXgiKSByZWd1bGFyIGV4cHJlc3Npb25zIHRvIG5ldyBzeW50YXggKCJyZSIpLgotCi1XaGVuIGltcG9ydGVkIGFzIGEgbW9kdWxlLCB0aGVyZSBhcmUgdHdvIGZ1bmN0aW9ucywgd2l0aCB0aGVpciBvd24KLXN0cmluZ3M6Ci0KLSAgY29udmVydChzLCBzeW50YXg9Tm9uZSkgLS0gY29udmVydCBhIHJlZ2V4IHJlZ3VsYXIgZXhwcmVzc2lvbiB0byByZSBzeW50YXgKLQotICBxdW90ZShzKSAtLSByZXR1cm4gYSBxdW90ZWQgc3RyaW5nIGxpdGVyYWwKLQotV2hlbiB1c2VkIGFzIGEgc2NyaXB0LCByZWFkIGEgUHl0aG9uIHN0cmluZyBsaXRlcmFsIChvciBhbnkgb3RoZXIKLWV4cHJlc3Npb24gZXZhbHVhdGluZyB0byBhIHN0cmluZykgZnJvbSBzdGRpbiwgYW5kIHdyaXRlIHRoZQotdHJhbnNsYXRlZCBleHByZXNzaW9uIHRvIHN0ZG91dCBhcyBhIHN0cmluZyBsaXRlcmFsLiAgVW5sZXNzIHN0ZG91dCBpcwotYSB0dHksIG5vIHRyYWlsaW5nIFxuIGlzIHdyaXR0ZW4gdG8gc3Rkb3V0LiAgVGhpcyBpcyBkb25lIHNvIHRoYXQgaXQKLWNhbiBiZSB1c2VkIHdpdGggRW1hY3MgQy1VIE0tfCAoc2hlbGwtY29tbWFuZC1vbi1yZWdpb24gd2l0aCBhcmd1bWVudAotd2hpY2ggZmlsdGVycyB0aGUgcmVnaW9uIHRocm91Z2ggdGhlIHNoZWxsIGNvbW1hbmQpLgotCi1ObyBhdHRlbXB0IGhhcyBiZWVuIG1hZGUgYXQgY29kaW5nIGZvciBwZXJmb3JtYW5jZS4KLQotVHJhbnNsYXRpb24gdGFibGUuLi4KLQotICAgIFwoICAgICggICAgICh1bmxlc3MgUkVfTk9fQktfUEFSRU5TIHNldCkKLSAgICBcKSAgICApICAgICAodW5sZXNzIFJFX05PX0JLX1BBUkVOUyBzZXQpCi0gICAgXHwgICAgfCAgICAgKHVubGVzcyBSRV9OT19CS19WQkFSIHNldCkKLSAgICBcPCAgICBcYiAgICAobm90IHF1aXRlIHRoZSBzYW1lLCBidXQgYWxsYS4uLikKLSAgICBcPiAgICBcYiAgICAobm90IHF1aXRlIHRoZSBzYW1lLCBidXQgYWxsYS4uLikKLSAgICBcYCAgICBcQQotICAgIFwnICAgIFxaCi0KLU5vdCB0cmFuc2xhdGVkLi4uCi0KLSAgICAuCi0gICAgXgotICAgICQKLSAgICAqCi0gICAgKyAgICAgICAgICAgKHVubGVzcyBSRV9CS19QTFVTX1FNIHNldCwgdGhlbiB0byBcKykKLSAgICA/ICAgICAgICAgICAodW5sZXNzIFJFX0JLX1BMVVNfUU0gc2V0LCB0aGVuIHRvIFw/KQotICAgIFwKLSAgICBcYgotICAgIFxCCi0gICAgXHcKLSAgICBcVwotICAgIFwxIC4uLiBcOQotCi1TcGVjaWFsIGNhc2VzLi4uCi0KLSAgICBOb24tcHJpbnRhYmxlIGNoYXJhY3RlcnMgYXJlIGFsd2F5cyByZXBsYWNlZCBieSB0aGVpciAzLWRpZ2l0Ci0gICAgZXNjYXBlIGNvZGUgKGV4Y2VwdCBcdCwgXG4sIFxyLCB3aGljaCB1c2UgbW5lbW9uaWMgZXNjYXBlcykKLQotICAgIE5ld2xpbmUgaXMgdHVybmVkIGludG8gfCB3aGVuIFJFX05FV0xJTkVfT1IgaXMgc2V0Ci0KLVhYWCBUbyBiZSBkb25lLi4uCi0KLSAgICBbLi4uXSAgICAgKGRpZmZlcmVudCB0cmVhdG1lbnQgb2YgYmFja3NsYXNoZWQgaXRlbXM/KQotICAgIFteLi4uXSAgICAoZGlmZmVyZW50IHRyZWF0bWVudCBvZiBiYWNrc2xhc2hlZCBpdGVtcz8pCi0gICAgXiAkICogKyA/IChpbiBzb21lIGVycm9yIGNvbnRleHRzIHRoZXNlIGFyZSBwcm9iYWJseSB0cmVhdGVkIGRpZmZlcmVudGx5KQotICAgIFx2REQgIFxERCAoaW4gdGhlIHJlZ2V4IGRvY3MgYnV0IG9ubHkgd29ya3Mgd2hlbiBSRV9BTlNJX0hFWCBzZXQpCi0KLSIiIgotCi0KLWltcG9ydCB3YXJuaW5ncwotd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIuKiByZWdleCAuKiIsIERlcHJlY2F0aW9uV2FybmluZywgX19uYW1lX18sCi0gICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmQ9MSkKLQotaW1wb3J0IHJlZ2V4Ci1mcm9tIHJlZ2V4X3N5bnRheCBpbXBvcnQgKiAjIFJFXyoKLQotX19hbGxfXyA9IFsiY29udmVydCIsInF1b3RlIl0KLQotIyBEZWZhdWx0IHRyYW5zbGF0aW9uIHRhYmxlCi1tYXN0ZXJ0YWJsZSA9IHsKLSAgICByJ1w8JzogcidcYicsCi0gICAgcidcPic6IHInXGInLAotICAgIHInXGAnOiByJ1xBJywKLSAgICByJ1wnJzogcidcWicsCi0gICAgcidcKCc6ICcoJywKLSAgICByJ1wpJzogJyknLAotICAgIHInXHwnOiAnfCcsCi0gICAgJygnOiByJ1woJywKLSAgICAnKSc6IHInXCknLAotICAgICd8JzogcidcfCcsCi0gICAgJ1x0JzogcidcdCcsCi0gICAgJ1xuJzogcidcbicsCi0gICAgJ1xyJzogcidccicsCi19Ci0KLQotZGVmIGNvbnZlcnQocywgc3ludGF4PU5vbmUpOgotICAgICIiIkNvbnZlcnQgYSByZWdleCByZWd1bGFyIGV4cHJlc3Npb24gdG8gcmUgc3ludGF4LgotCi0gICAgVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sIGFzIGEgc3RyaW5nIG9iamVjdCwKLSAgICBqdXN0IGxpa2UgaXQgd291bGQgYmUgcGFzc2VkIHRvIHJlZ2V4LmNvbXBpbGUoKS4gIChJLmUuLCBwYXNzIHRoZQotICAgIGFjdHVhbCBzdHJpbmcgb2JqZWN0IC0tIHN0cmluZyBxdW90ZXMgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbgotICAgIHJlbW92ZWQgYW5kIHRoZSBzdGFuZGFyZCBlc2NhcGUgcHJvY2Vzc2luZyBoYXMgYWxyZWFkeSBiZWVuIGRvbmUsCi0gICAgZS5nLiBieSBldmFsKCkuKQotCi0gICAgVGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCBpcyB0aGUgcmVnZXggc3ludGF4IHZhcmlhbnQgdG8gYmUKLSAgICB1c2VkLiAgVGhpcyBpcyBhbiBpbnRlZ2VyIG1hc2sgYXMgcGFzc2VkIHRvIHJlZ2V4LnNldF9zeW50YXgoKTsKLSAgICB0aGUgZmxhZyBiaXRzIGFyZSBkZWZpbmVkIGluIHJlZ2V4X3N5bnRheC4gIFdoZW4gbm90IHNwZWNpZmllZCwgb3IKLSAgICB3aGVuIE5vbmUgaXMgZ2l2ZW4sIHRoZSBjdXJyZW50IHJlZ2V4IHN5bnRheCBtYXNrIChhcyByZXRyaWV2ZWQgYnkKLSAgICByZWdleC5nZXRfc3ludGF4KCkpIGlzIHVzZWQgLS0gd2hpY2ggaXMgMCBieSBkZWZhdWx0LgotCi0gICAgVGhlIHJldHVybiB2YWx1ZSBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiwgYXMgYSBzdHJpbmcgb2JqZWN0IHRoYXQKLSAgICBjb3VsZCBiZSBwYXNzZWQgdG8gcmUuY29tcGlsZSgpLiAgKEkuZS4sIG5vIHN0cmluZyBxdW90ZXMgaGF2ZQotICAgIGJlZW4gYWRkZWQgLS0gdXNlIHF1b3RlKCkgYmVsb3csIG9yIHJlcHIoKS4pCi0KLSAgICBUaGUgY29udmVyc2lvbiBpcyBub3QgYWx3YXlzIGd1YXJhbnRlZWQgdG8gYmUgY29ycmVjdC4gIE1vcmUKLSAgICBzeW50YWN0aWNhbCBhbmFseXNpcyBzaG91bGQgYmUgcGVyZm9ybWVkIHRvIGRldGVjdCBib3JkZXJsaW5lCi0gICAgY2FzZXMgYW5kIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlbS4gIEZvciBleGFtcGxlLCAneCo/JyBpcyBub3QKLSAgICB0cmFuc2xhdGVkIGNvcnJlY3RseS4KLQotICAgICIiIgotICAgIHRhYmxlID0gbWFzdGVydGFibGUuY29weSgpCi0gICAgaWYgc3ludGF4IGlzIE5vbmU6Ci0gICAgICAgIHN5bnRheCA9IHJlZ2V4LmdldF9zeW50YXgoKQotICAgIGlmIHN5bnRheCAmIFJFX05PX0JLX1BBUkVOUzoKLSAgICAgICAgZGVsIHRhYmxlW3InXCgnXSwgdGFibGVbcidcKSddCi0gICAgICAgIGRlbCB0YWJsZVsnKCddLCB0YWJsZVsnKSddCi0gICAgaWYgc3ludGF4ICYgUkVfTk9fQktfVkJBUjoKLSAgICAgICAgZGVsIHRhYmxlW3InXHwnXQotICAgICAgICBkZWwgdGFibGVbJ3wnXQotICAgIGlmIHN5bnRheCAmIFJFX0JLX1BMVVNfUU06Ci0gICAgICAgIHRhYmxlWycrJ10gPSByJ1wrJwotICAgICAgICB0YWJsZVsnPyddID0gcidcPycKLSAgICAgICAgdGFibGVbcidcKyddID0gJysnCi0gICAgICAgIHRhYmxlW3InXD8nXSA9ICc/JwotICAgIGlmIHN5bnRheCAmIFJFX05FV0xJTkVfT1I6Ci0gICAgICAgIHRhYmxlWydcbiddID0gJ3wnCi0gICAgcmVzID0gIiIKLQotICAgIGkgPSAwCi0gICAgZW5kID0gbGVuKHMpCi0gICAgd2hpbGUgaSA8IGVuZDoKLSAgICAgICAgYyA9IHNbaV0KLSAgICAgICAgaSA9IGkrMQotICAgICAgICBpZiBjID09ICdcXCc6Ci0gICAgICAgICAgICBjID0gc1tpXQotICAgICAgICAgICAgaSA9IGkrMQotICAgICAgICAgICAga2V5ID0gJ1xcJyArIGMKLSAgICAgICAgICAgIGtleSA9IHRhYmxlLmdldChrZXksIGtleSkKLSAgICAgICAgICAgIHJlcyA9IHJlcyArIGtleQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgYyA9IHRhYmxlLmdldChjLCBjKQotICAgICAgICAgICAgcmVzID0gcmVzICsgYwotICAgIHJldHVybiByZXMKLQotCi1kZWYgcXVvdGUocywgcXVvdGU9Tm9uZSk6Ci0gICAgIiIiQ29udmVydCBhIHN0cmluZyBvYmplY3QgdG8gYSBxdW90ZWQgc3RyaW5nIGxpdGVyYWwuCi0KLSAgICBUaGlzIGlzIHNpbWlsYXIgdG8gcmVwcigpIGJ1dCB3aWxsIHJldHVybiBhICJyYXciIHN0cmluZyAocicuLi4nCi0gICAgb3IgciIuLi4iKSB3aGVuIHRoZSBzdHJpbmcgY29udGFpbnMgYmFja3NsYXNoZXMsIGluc3RlYWQgb2YKLSAgICBkb3VibGluZyBhbGwgYmFja3NsYXNoZXMuICBUaGUgcmVzdWx0aW5nIHN0cmluZyBkb2VzICpub3QqIGFsd2F5cwotICAgIGV2YWx1YXRlIHRvIHRoZSBzYW1lIHN0cmluZyBhcyB0aGUgb3JpZ2luYWw7IGhvd2V2ZXIgaXQgd2lsbCBkbwotICAgIGp1c3QgdGhlIHJpZ2h0IHRoaW5nIHdoZW4gcGFzc2VkIGludG8gcmUuY29tcGlsZSgpLgotCi0gICAgVGhlIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCBmb3JjZXMgdGhlIHN0cmluZyBxdW90ZTsgaXQgbXVzdCBiZQotICAgIGEgc2luZ2xlIGNoYXJhY3RlciB3aGljaCBpcyBhIHZhbGlkIFB5dGhvbiBzdHJpbmcgcXVvdGUuCi0KLSAgICAiIiIKLSAgICBpZiBxdW90ZSBpcyBOb25lOgotICAgICAgICBxID0gIiciCi0gICAgICAgIGFsdHEgPSAiJyIKLSAgICAgICAgaWYgcSBpbiBzIGFuZCBhbHRxIG5vdCBpbiBzOgotICAgICAgICAgICAgcSA9IGFsdHEKLSAgICBlbHNlOgotICAgICAgICBhc3NlcnQgcXVvdGUgaW4gKCciJywgIiciLCAnIiIiJywgIicnJyIpCi0gICAgICAgIHEgPSBxdW90ZQotICAgIHJlcyA9IHEKLSAgICBmb3IgYyBpbiBzOgotICAgICAgICBpZiBjID09IHE6IGMgPSAnXFwnICsgYwotICAgICAgICBlbGlmIGMgPCAnICcgb3IgYyA+ICd+JzogYyA9ICJcXCUwM28iICUgb3JkKGMpCi0gICAgICAgIHJlcyA9IHJlcyArIGMKLSAgICByZXMgPSByZXMgKyBxCi0gICAgaWYgJ1xcJyBpbiByZXM6Ci0gICAgICAgIHJlcyA9ICdyJyArIHJlcwotICAgIHJldHVybiByZXMKLQotCi1kZWYgbWFpbigpOgotICAgICIiIk1haW4gcHJvZ3JhbSAtLSBjYWxsZWQgd2hlbiBydW4gYXMgYSBzY3JpcHQuIiIiCi0gICAgaW1wb3J0IHN5cwotICAgIHMgPSBldmFsKHN5cy5zdGRpbi5yZWFkKCkpCi0gICAgc3lzLnN0ZG91dC53cml0ZShxdW90ZShjb252ZXJ0KHMpKSkKLSAgICBpZiBzeXMuc3Rkb3V0LmlzYXR0eSgpOgotICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKCJcbiIpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgICBtYWluKCkKZGlmZiAtLWdpdCBhL0xpYi9yZWdleF9zeW50YXgucHkgYi9MaWIvcmVnZXhfc3ludGF4LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGEwZGJmLi4wMDAwMDAwCi0tLSBhL0xpYi9yZWdleF9zeW50YXgucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0iIiJDb25zdGFudHMgZm9yIHNlbGVjdGluZyByZWdleHAgc3ludGF4ZXMgZm9yIHRoZSBvYnNvbGV0ZSByZWdleCBtb2R1bGUuCi0KLVRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICAicmVnZXgiIGhhcyBub3cKLWJlZW4gcmVwbGFjZWQgYnkgdGhlIG5ldyByZWd1bGFyIGV4cHJlc3Npb24gbW9kdWxlLCAicmUiLgotCi1UaGVzZSBiaXRzIGFyZSBwYXNzZWQgdG8gcmVnZXguc2V0X3N5bnRheCgpIHRvIGNob29zZSBhbW9uZwotYWx0ZXJuYXRpdmUgcmVnZXhwIHN5bnRheGVzLgotIiIiCi0KLSMgMSBtZWFucyBwbGFpbiBwYXJlbnRoZXNlcyBzZXJ2ZSBhcyBncm91cGluZywgYW5kIGJhY2tzbGFzaAotIyAgIHBhcmVudGhlc2VzIGFyZSBuZWVkZWQgZm9yIGxpdGVyYWwgc2VhcmNoaW5nLgotIyAwIG1lYW5zIGJhY2tzbGFzaC1wYXJlbnRoZXNlcyBhcmUgZ3JvdXBpbmcsIGFuZCBwbGFpbiBwYXJlbnRoZXNlcwotIyAgIGFyZSBmb3IgbGl0ZXJhbCBzZWFyY2hpbmcuCi1SRV9OT19CS19QQVJFTlMgPSAxCi0KLSMgMSBtZWFucyBwbGFpbiB8IHNlcnZlcyBhcyB0aGUgIm9yIi1vcGVyYXRvciwgYW5kIFx8IGlzIGEgbGl0ZXJhbC4KLSMgMCBtZWFucyBcfCBzZXJ2ZXMgYXMgdGhlICJvciItb3BlcmF0b3IsIGFuZCB8IGlzIGEgbGl0ZXJhbC4KLVJFX05PX0JLX1ZCQVIgPSAyCi0KLSMgMCBtZWFucyBwbGFpbiArIG9yID8gc2VydmVzIGFzIGFuIG9wZXJhdG9yLCBhbmQgXCssIFw/IGFyZSBsaXRlcmFscy4KLSMgMSBtZWFucyBcKywgXD8gYXJlIG9wZXJhdG9ycyBhbmQgcGxhaW4gKywgPyBhcmUgbGl0ZXJhbHMuCi1SRV9CS19QTFVTX1FNID0gNAotCi0jIDEgbWVhbnMgfCBiaW5kcyB0aWdodGVyIHRoYW4gXiBvciAkLgotIyAwIG1lYW5zIHRoZSBjb250cmFyeS4KLVJFX1RJR0hUX1ZCQVIgPSA4Ci0KLSMgMSBtZWFucyB0cmVhdCBcbiBhcyBhbiBfT1Igb3BlcmF0b3IKLSMgMCBtZWFucyB0cmVhdCBpdCBhcyBhIG5vcm1hbCBjaGFyYWN0ZXIKLVJFX05FV0xJTkVfT1IgPSAxNgotCi0jIDAgbWVhbnMgdGhhdCBhIHNwZWNpYWwgY2hhcmFjdGVycyAoc3VjaCBhcyAqLCBeLCBhbmQgJCkgYWx3YXlzIGhhdmUKLSMgICB0aGVpciBzcGVjaWFsIG1lYW5pbmcgcmVnYXJkbGVzcyBvZiB0aGUgc3Vycm91bmRpbmcgY29udGV4dC4KLSMgMSBtZWFucyB0aGF0IHNwZWNpYWwgY2hhcmFjdGVycyBtYXkgYWN0IGFzIG5vcm1hbCBjaGFyYWN0ZXJzIGluIHNvbWUKLSMgICBjb250ZXh0cy4gIFNwZWNpZmljYWxseSwgdGhpcyBhcHBsaWVzIHRvOgotIyAgICAgICBeIC0gb25seSBzcGVjaWFsIGF0IHRoZSBiZWdpbm5pbmcsIG9yIGFmdGVyICggb3IgfAotIyAgICAgICAkIC0gb25seSBzcGVjaWFsIGF0IHRoZSBlbmQsIG9yIGJlZm9yZSApIG9yIHwKLSMgICAgICAgKiwgKywgPyAtIG9ubHkgc3BlY2lhbCB3aGVuIG5vdCBhZnRlciB0aGUgYmVnaW5uaW5nLCAoLCBvciB8Ci1SRV9DT05URVhUX0lOREVQX09QUyA9IDMyCi0KLSMgQU5TSSBzZXF1ZW5jZXMgKFxuIGV0YykgYW5kIFx4aGgKLVJFX0FOU0lfSEVYID0gNjQKLQotIyBObyBHTlUgZXh0ZW5zaW9ucwotUkVfTk9fR05VX0VYVEVOU0lPTlMgPSAxMjgKLQotIyBOb3cgZGVmaW5lIGNvbWJpbmF0aW9ucyBvZiBiaXRzIGZvciB0aGUgc3RhbmRhcmQgcG9zc2liaWxpdGllcy4KLVJFX1NZTlRBWF9BV0sgPSAoUkVfTk9fQktfUEFSRU5TIHwgUkVfTk9fQktfVkJBUiB8IFJFX0NPTlRFWFRfSU5ERVBfT1BTKQotUkVfU1lOVEFYX0VHUkVQID0gKFJFX1NZTlRBWF9BV0sgfCBSRV9ORVdMSU5FX09SKQotUkVfU1lOVEFYX0dSRVAgPSAoUkVfQktfUExVU19RTSB8IFJFX05FV0xJTkVfT1IpCi1SRV9TWU5UQVhfRU1BQ1MgPSAwCi0KLSMgKFB5dGhvbidzIG9ic29sZXRlICJyZWdleHAiIG1vZHVsZSB1c2VkIGEgc3ludGF4IHNpbWlsYXIgdG8gYXdrLikKZGlmZiAtLWdpdCBhL0xpYi9yZWdzdWIucHkgYi9MaWIvcmVnc3ViLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmMxMGE1Li4wMDAwMDAwCi0tLSBhL0xpYi9yZWdzdWIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxOTggKzAsMCBAQAotIiIiUmVnZXhwLWJhc2VkIHNwbGl0IGFuZCByZXBsYWNlIHVzaW5nIHRoZSBvYnNvbGV0ZSByZWdleCBtb2R1bGUuCi0KLVRoaXMgbW9kdWxlIGlzIG9ubHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuICBUaGVzZSBvcGVyYXRpb25zCi1hcmUgbm93IHByb3ZpZGVkIGJ5IHRoZSBuZXcgcmVndWxhciBleHByZXNzaW9uIG1vZHVsZSwgInJlIi4KLQotc3ViKHBhdCwgcmVwbCwgc3RyKTogICAgICAgIHJlcGxhY2UgZmlyc3Qgb2NjdXJyZW5jZSBvZiBwYXR0ZXJuIGluIHN0cmluZwotZ3N1YihwYXQsIHJlcGwsIHN0cik6ICAgICAgIHJlcGxhY2UgYWxsIG9jY3VycmVuY2VzIG9mIHBhdHRlcm4gaW4gc3RyaW5nCi1zcGxpdChzdHIsIHBhdCwgbWF4c3BsaXQpOiAgc3BsaXQgc3RyaW5nIHVzaW5nIHBhdHRlcm4gYXMgZGVsaW1pdGVyCi1zcGxpdHgoc3RyLCBwYXQsIG1heHNwbGl0KTogc3BsaXQgc3RyaW5nIHVzaW5nIHBhdHRlcm4gYXMgZGVsaW1pdGVyIHBsdXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsaW1pdGVycwotIiIiCi0KLWltcG9ydCB3YXJuaW5ncwotd2FybmluZ3Mud2FybigidGhlIHJlZ3N1YiBtb2R1bGUgaXMgZGVwcmVjYXRlZDsgcGxlYXNlIHVzZSByZS5zdWIoKSIsCi0gICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZykKLQotIyBJZ25vcmUgZnVydGhlciBkZXByZWNhdGlvbiB3YXJuaW5ncyBhYm91dCB0aGlzIG1vZHVsZQotd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIiLCBEZXByZWNhdGlvbldhcm5pbmcsIF9fbmFtZV9fKQotCi1pbXBvcnQgcmVnZXgKLQotX19hbGxfXyA9IFsic3ViIiwiZ3N1YiIsInNwbGl0Iiwic3BsaXR4IiwiY2Fwd29yZHMiXQotCi0jIFJlcGxhY2UgZmlyc3Qgb2NjdXJyZW5jZSBvZiBwYXR0ZXJuIHBhdCBpbiBzdHJpbmcgc3RyIGJ5IHJlcGxhY2VtZW50Ci0jIHJlcGwuICBJZiB0aGUgcGF0dGVybiBpc24ndCBmb3VuZCwgdGhlIHN0cmluZyBpcyByZXR1cm5lZCB1bmNoYW5nZWQuCi0jIFRoZSByZXBsYWNlbWVudCBtYXkgY29udGFpbiByZWZlcmVuY2VzIFxkaWdpdCB0byBzdWJwYXR0ZXJucyBhbmQKLSMgZXNjYXBlZCBiYWNrc2xhc2hlcy4gIFRoZSBwYXR0ZXJuIG1heSBiZSBhIHN0cmluZyBvciBhbiBhbHJlYWR5Ci0jIGNvbXBpbGVkIHBhdHRlcm4uCi0KLWRlZiBzdWIocGF0LCByZXBsLCBzdHIpOgotICAgIHByb2cgPSBjb21waWxlKHBhdCkKLSAgICBpZiBwcm9nLnNlYXJjaChzdHIpID49IDA6Ci0gICAgICAgIHJlZ3MgPSBwcm9nLnJlZ3MKLSAgICAgICAgYSwgYiA9IHJlZ3NbMF0KLSAgICAgICAgc3RyID0gc3RyWzphXSArIGV4cGFuZChyZXBsLCByZWdzLCBzdHIpICsgc3RyW2I6XQotICAgIHJldHVybiBzdHIKLQotCi0jIFJlcGxhY2UgYWxsIChub24tb3ZlcmxhcHBpbmcpIG9jY3VycmVuY2VzIG9mIHBhdHRlcm4gcGF0IGluIHN0cmluZwotIyBzdHIgYnkgcmVwbGFjZW1lbnQgcmVwbC4gIFRoZSBzYW1lIHJ1bGVzIGFzIGZvciBzdWIoKSBhcHBseS4KLSMgRW1wdHkgbWF0Y2hlcyBmb3IgdGhlIHBhdHRlcm4gYXJlIHJlcGxhY2VkIG9ubHkgd2hlbiBub3QgYWRqYWNlbnQgdG8KLSMgYSBwcmV2aW91cyBtYXRjaCwgc28gZS5nLiBnc3ViKCcnLCAnLScsICdhYmMnKSByZXR1cm5zICctYS1iLWMtJy4KLQotZGVmIGdzdWIocGF0LCByZXBsLCBzdHIpOgotICAgIHByb2cgPSBjb21waWxlKHBhdCkKLSAgICBuZXcgPSAnJwotICAgIHN0YXJ0ID0gMAotICAgIGZpcnN0ID0gMQotICAgIHdoaWxlIHByb2cuc2VhcmNoKHN0ciwgc3RhcnQpID49IDA6Ci0gICAgICAgIHJlZ3MgPSBwcm9nLnJlZ3MKLSAgICAgICAgYSwgYiA9IHJlZ3NbMF0KLSAgICAgICAgaWYgYSA9PSBiID09IHN0YXJ0IGFuZCBub3QgZmlyc3Q6Ci0gICAgICAgICAgICBpZiBzdGFydCA+PSBsZW4oc3RyKSBvciBwcm9nLnNlYXJjaChzdHIsIHN0YXJ0KzEpIDwgMDoKLSAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgcmVncyA9IHByb2cucmVncwotICAgICAgICAgICAgYSwgYiA9IHJlZ3NbMF0KLSAgICAgICAgbmV3ID0gbmV3ICsgc3RyW3N0YXJ0OmFdICsgZXhwYW5kKHJlcGwsIHJlZ3MsIHN0cikKLSAgICAgICAgc3RhcnQgPSBiCi0gICAgICAgIGZpcnN0ID0gMAotICAgIG5ldyA9IG5ldyArIHN0cltzdGFydDpdCi0gICAgcmV0dXJuIG5ldwotCi0KLSMgU3BsaXQgc3RyaW5nIHN0ciBpbiBmaWVsZHMgc2VwYXJhdGVkIGJ5IGRlbGltaXRlcnMgbWF0Y2hpbmcgcGF0dGVybgotIyBwYXQuICBPbmx5IG5vbi1lbXB0eSBtYXRjaGVzIGZvciB0aGUgcGF0dGVybiBhcmUgY29uc2lkZXJlZCwgc28gZS5nLgotIyBzcGxpdCgnYWJjJywgJycpIHJldHVybnMgWydhYmMnXS4KLSMgVGhlIG9wdGlvbmFsIDNyZCBhcmd1bWVudCBzZXRzIHRoZSBudW1iZXIgb2Ygc3BsaXRzIHRoYXQgYXJlIHBlcmZvcm1lZC4KLQotZGVmIHNwbGl0KHN0ciwgcGF0LCBtYXhzcGxpdCA9IDApOgotICAgIHJldHVybiBpbnRzcGxpdChzdHIsIHBhdCwgbWF4c3BsaXQsIDApCi0KLSMgU3BsaXQgc3RyaW5nIHN0ciBpbiBmaWVsZHMgc2VwYXJhdGVkIGJ5IGRlbGltaXRlcnMgbWF0Y2hpbmcgcGF0dGVybgotIyBwYXQuICBPbmx5IG5vbi1lbXB0eSBtYXRjaGVzIGZvciB0aGUgcGF0dGVybiBhcmUgY29uc2lkZXJlZCwgc28gZS5nLgotIyBzcGxpdCgnYWJjJywgJycpIHJldHVybnMgWydhYmMnXS4gVGhlIGRlbGltaXRlcnMgYXJlIGFsc28gaW5jbHVkZWQKLSMgaW4gdGhlIGxpc3QuCi0jIFRoZSBvcHRpb25hbCAzcmQgYXJndW1lbnQgc2V0cyB0aGUgbnVtYmVyIG9mIHNwbGl0cyB0aGF0IGFyZSBwZXJmb3JtZWQuCi0KLQotZGVmIHNwbGl0eChzdHIsIHBhdCwgbWF4c3BsaXQgPSAwKToKLSAgICByZXR1cm4gaW50c3BsaXQoc3RyLCBwYXQsIG1heHNwbGl0LCAxKQotCi0jIEludGVybmFsIGZ1bmN0aW9uIHVzZWQgdG8gaW1wbGVtZW50IHNwbGl0KCkgYW5kIHNwbGl0eCgpLgotCi1kZWYgaW50c3BsaXQoc3RyLCBwYXQsIG1heHNwbGl0LCByZXRhaW4pOgotICAgIHByb2cgPSBjb21waWxlKHBhdCkKLSAgICByZXMgPSBbXQotICAgIHN0YXJ0ID0gbmV4dCA9IDAKLSAgICBzcGxpdGNvdW50ID0gMAotICAgIHdoaWxlIHByb2cuc2VhcmNoKHN0ciwgbmV4dCkgPj0gMDoKLSAgICAgICAgcmVncyA9IHByb2cucmVncwotICAgICAgICBhLCBiID0gcmVnc1swXQotICAgICAgICBpZiBhID09IGI6Ci0gICAgICAgICAgICBuZXh0ID0gbmV4dCArIDEKLSAgICAgICAgICAgIGlmIG5leHQgPj0gbGVuKHN0cik6Ci0gICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJlcy5hcHBlbmQoc3RyW3N0YXJ0OmFdKQotICAgICAgICAgICAgaWYgcmV0YWluOgotICAgICAgICAgICAgICAgIHJlcy5hcHBlbmQoc3RyW2E6Yl0pCi0gICAgICAgICAgICBzdGFydCA9IG5leHQgPSBiCi0gICAgICAgICAgICBzcGxpdGNvdW50ID0gc3BsaXRjb3VudCArIDEKLSAgICAgICAgICAgIGlmIChtYXhzcGxpdCBhbmQgKHNwbGl0Y291bnQgPj0gbWF4c3BsaXQpKToKLSAgICAgICAgICAgICAgICBicmVhawotICAgIHJlcy5hcHBlbmQoc3RyW3N0YXJ0Ol0pCi0gICAgcmV0dXJuIHJlcwotCi0KLSMgQ2FwaXRhbGl6ZSB3b3JkcyBzcGxpdCB1c2luZyBhIHBhdHRlcm4KLQotZGVmIGNhcHdvcmRzKHN0ciwgcGF0PSdbXmEtekEtWjAtOV9dKycpOgotICAgIHdvcmRzID0gc3BsaXR4KHN0ciwgcGF0KQotICAgIGZvciBpIGluIHJhbmdlKDAsIGxlbih3b3JkcyksIDIpOgotICAgICAgICB3b3Jkc1tpXSA9IHdvcmRzW2ldLmNhcGl0YWxpemUoKQotICAgIHJldHVybiAiIi5qb2luKHdvcmRzKQotCi0KLSMgSW50ZXJuYWwgc3Vicm91dGluZXM6Ci0jIGNvbXBpbGUocGF0KTogY29tcGlsZSBhIHBhdHRlcm4sIGNhY2hpbmcgYWxyZWFkeSBjb21waWxlZCBwYXR0ZXJucwotIyBleHBhbmQocmVwbCwgcmVncywgc3RyKTogZXhwYW5kIFxkaWdpdCBlc2NhcGVzIGluIHJlcGxhY2VtZW50IHN0cmluZwotCi0KLSMgTWFuYWdlIGEgY2FjaGUgb2YgY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9ucy4KLSMKLSMgSWYgdGhlIHBhdHRlcm4gaXMgYSBzdHJpbmcgYSBjb21waWxlZCB2ZXJzaW9uIG9mIGl0IGlzIHJldHVybmVkLiAgSWYKLSMgdGhlIHBhdHRlcm4gaGFzIGJlZW4gdXNlZCBiZWZvcmUgd2UgcmV0dXJuIGFuIGFscmVhZHkgY29tcGlsZWQKLSMgdmVyc2lvbiBmcm9tIHRoZSBjYWNoZTsgb3RoZXJ3aXNlIHdlIGNvbXBpbGUgaXQgbm93IGFuZCBzYXZlIHRoZQotIyBjb21waWxlZCB2ZXJzaW9uIGluIHRoZSBjYWNoZSwgYWxvbmcgd2l0aCB0aGUgc3ludGF4IGl0IHdhcyBjb21waWxlZAotIyB3aXRoLiAgSW5zdGVhZCBvZiBhIHN0cmluZywgYSBjb21waWxlZCByZWd1bGFyIGV4cHJlc3Npb24gY2FuIGFsc28KLSMgYmUgcGFzc2VkLgotCi1jYWNoZSA9IHt9Ci0KLWRlZiBjb21waWxlKHBhdCk6Ci0gICAgaWYgdHlwZShwYXQpICE9IHR5cGUoJycpOgotICAgICAgICByZXR1cm4gcGF0ICAgICAgICAgICAgICAjIEFzc3VtZSBpdCBpcyBhIGNvbXBpbGVkIHJlZ2V4Ci0gICAga2V5ID0gKHBhdCwgcmVnZXguZ2V0X3N5bnRheCgpKQotICAgIGlmIGtleSBpbiBjYWNoZToKLSAgICAgICAgcHJvZyA9IGNhY2hlW2tleV0gICAgICAgIyBHZXQgaXQgZnJvbSB0aGUgY2FjaGUKLSAgICBlbHNlOgotICAgICAgICBwcm9nID0gY2FjaGVba2V5XSA9IHJlZ2V4LmNvbXBpbGUocGF0KQotICAgIHJldHVybiBwcm9nCi0KLQotZGVmIGNsZWFyX2NhY2hlKCk6Ci0gICAgZ2xvYmFsIGNhY2hlCi0gICAgY2FjaGUgPSB7fQotCi0KLSMgRXhwYW5kIFxkaWdpdCBpbiB0aGUgcmVwbGFjZW1lbnQuCi0jIEVhY2ggb2NjdXJyZW5jZSBvZiBcZGlnaXQgaXMgcmVwbGFjZWQgYnkgdGhlIHN1YnN0cmluZyBvZiBzdHIKLSMgaW5kaWNhdGVkIGJ5IHJlZ3NbZGlnaXRdLiAgVG8gaW5jbHVkZSBhIGxpdGVyYWwgXCBpbiB0aGUKLSMgcmVwbGFjZW1lbnQsIGRvdWJsZSBpdDsgb3RoZXIgXCBlc2NhcGVzIGFyZSBsZWZ0IHVuY2hhbmdlZCAoaS5lLgotIyB0aGUgXCBhbmQgdGhlIGZvbGxvd2luZyBjaGFyYWN0ZXIgYXJlIGJvdGggY29waWVkKS4KLQotZGVmIGV4cGFuZChyZXBsLCByZWdzLCBzdHIpOgotICAgIGlmICdcXCcgbm90IGluIHJlcGw6Ci0gICAgICAgIHJldHVybiByZXBsCi0gICAgbmV3ID0gJycKLSAgICBpID0gMAotICAgIG9yZDAgPSBvcmQoJzAnKQotICAgIHdoaWxlIGkgPCBsZW4ocmVwbCk6Ci0gICAgICAgIGMgPSByZXBsW2ldOyBpID0gaSsxCi0gICAgICAgIGlmIGMgIT0gJ1xcJyBvciBpID49IGxlbihyZXBsKToKLSAgICAgICAgICAgIG5ldyA9IG5ldyArIGMKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAgIGMgPSByZXBsW2ldOyBpID0gaSsxCi0gICAgICAgICAgICBpZiAnMCcgPD0gYyA8PSAnOSc6Ci0gICAgICAgICAgICAgICAgYSwgYiA9IHJlZ3Nbb3JkKGMpLW9yZDBdCi0gICAgICAgICAgICAgICAgbmV3ID0gbmV3ICsgc3RyW2E6Yl0KLSAgICAgICAgICAgIGVsaWYgYyA9PSAnXFwnOgotICAgICAgICAgICAgICAgIG5ldyA9IG5ldyArIGMKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbmV3ID0gbmV3ICsgJ1xcJyArIGMKLSAgICByZXR1cm4gbmV3Ci0KLQotIyBUZXN0IHByb2dyYW0sIHJlYWRzIHNlcXVlbmNlcyAicGF0IHJlcGwgc3RyIiBmcm9tIHN0ZGluLgotIyBPcHRpb25hbCBhcmd1bWVudCBzcGVjaWZpZXMgcGF0dGVybiB1c2VkIHRvIHNwbGl0IGxpbmVzLgotCi1kZWYgdGVzdCgpOgotICAgIGltcG9ydCBzeXMKLSAgICBpZiBzeXMuYXJndlsxOl06Ci0gICAgICAgIGRlbHBhdCA9IHN5cy5hcmd2WzFdCi0gICAgZWxzZToKLSAgICAgICAgZGVscGF0ID0gJ1sgXHRcbl0rJwotICAgIHdoaWxlIDE6Ci0gICAgICAgIGlmIHN5cy5zdGRpbi5pc2F0dHkoKTogc3lzLnN0ZGVyci53cml0ZSgnLS0+ICcpCi0gICAgICAgIGxpbmUgPSBzeXMuc3RkaW4ucmVhZGxpbmUoKQotICAgICAgICBpZiBub3QgbGluZTogYnJlYWsKLSAgICAgICAgaWYgbGluZVstMV0gPT0gJ1xuJzogbGluZSA9IGxpbmVbOi0xXQotICAgICAgICBmaWVsZHMgPSBzcGxpdChsaW5lLCBkZWxwYXQpCi0gICAgICAgIGlmIGxlbihmaWVsZHMpICE9IDM6Ci0gICAgICAgICAgICBwcmludCAnU29ycnksIG5vdCB0aHJlZSBmaWVsZHMnCi0gICAgICAgICAgICBwcmludCAnc3BsaXQ6JywgcmVwcihmaWVsZHMpCi0gICAgICAgICAgICBjb250aW51ZQotICAgICAgICBbcGF0LCByZXBsLCBzdHJdID0gc3BsaXQobGluZSwgZGVscGF0KQotICAgICAgICBwcmludCAnc3ViIDonLCByZXByKHN1YihwYXQsIHJlcGwsIHN0cikpCi0gICAgICAgIHByaW50ICdnc3ViOicsIHJlcHIoZ3N1YihwYXQsIHJlcGwsIHN0cikpCmRpZmYgLS1naXQgYS9MaWIvcmV4ZWMucHkgYi9MaWIvcmV4ZWMucHkKaW5kZXggZWQwMWQyNC4uMTBlNGJjMCAxMDA2NDQKLS0tIGEvTGliL3JleGVjLnB5CisrKyBiL0xpYi9yZXhlYy5weQpAQCAtMTM2LDcgKzEzNiw3IEBACiAgICAgb2tfYnVpbHRpbl9tb2R1bGVzID0gKCdhdWRpb29wJywgJ2FycmF5JywgJ2JpbmFzY2lpJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NtYXRoJywgJ2Vycm5vJywgJ2ltYWdlb3AnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnbWFyc2hhbCcsICdtYXRoJywgJ21kNScsICdvcGVyYXRvcicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJzZXInLCAncmVnZXgnLCAnc2VsZWN0JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ3BhcnNlcicsICdzZWxlY3QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnc2hhJywgJ19zcmUnLCAnc3Ryb3AnLCAnc3RydWN0JywgJ3RpbWUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnX3dlYWtyZWYnKQogCmRpZmYgLS1naXQgYS9MaWIvcnVucHkucHkgYi9MaWIvcnVucHkucHkKaW5kZXggYWZiMDA5OC4uODI5MGRmZSAxMDA3NTUKLS0tIGEvTGliL3J1bnB5LnB5CisrKyBiL0xpYi9ydW5weS5weQpAQCAtMTEsMzQ5ICsxMSwxNSBAQAogCiBpbXBvcnQgc3lzCiBpbXBvcnQgaW1wCit0cnk6CisgICAgZnJvbSBpbXAgaW1wb3J0IGdldF9sb2FkZXIKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBmcm9tIHBrZ3V0aWwgaW1wb3J0IGdldF9sb2FkZXIKIAogX19hbGxfXyA9IFsKICAgICAicnVuX21vZHVsZSIsCiBdCiAKLXRyeToKLSAgICBfZ2V0X2xvYWRlciA9IGltcC5nZXRfbG9hZGVyCi1leGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgIyBnZXRfbG9hZGVyKCkgaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBpbXAgbW9kdWxlLCBzbyBlbXVsYXRlIGl0Ci0gICAgIyBhcyBiZXN0IHdlIGNhbiB1c2luZyB0aGUgUEVQIDMwMiBpbXBvcnQgbWFjaGluZXJ5IGV4cG9zZWQgc2luY2UKLSAgICAjIFB5dGhvbiAyLjMuIFRoZSBlbXVsYXRpb24gaXNuJ3QgcGVyZmVjdCwgYnV0IHRoZSBkaWZmZXJlbmNlcwotICAgICMgaW4gdGhlIHdheSBuYW1lcyBhcmUgc2hhZG93ZWQgc2hvdWxkbid0IG1hdHRlciBpbiBwcmFjdGljZS4KLSAgICBpbXBvcnQgb3MucGF0aAotICAgIGltcG9ydCBtYXJzaGFsICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBIYW5kbGUgY29tcGlsZWQgUHl0aG9uIGZpbGVzCi0KLSAgICAjIFRoaXMgaGVscGVyIGlzIG5lZWRlZCBpbiBvcmRlciBmb3IgdGhlIFBFUCAzMDIgZW11bGF0aW9uIHRvCi0gICAgIyBjb3JyZWN0bHkgaGFuZGxlIGNvbXBpbGVkIGZpbGVzCi0gICAgZGVmIF9yZWFkX2NvbXBpbGVkX2ZpbGUoY29tcGlsZWRfZmlsZSk6Ci0gICAgICAgIG1hZ2ljID0gY29tcGlsZWRfZmlsZS5yZWFkKDQpCi0gICAgICAgIGlmIG1hZ2ljICE9IGltcC5nZXRfbWFnaWMoKToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGNvbXBpbGVkX2ZpbGUucmVhZCg0KSAjIFNraXAgdGltZXN0YW1wCi0gICAgICAgICAgICByZXR1cm4gbWFyc2hhbC5sb2FkKGNvbXBpbGVkX2ZpbGUpCi0gICAgICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgY2xhc3MgX0Fic29sdXRlSW1wb3J0ZXIob2JqZWN0KToKLSAgICAgICAgIiIiUEVQIDMwMiBpbXBvcnRlciB3cmFwcGVyIGZvciB0b3AgbGV2ZWwgaW1wb3J0IG1hY2hpbmVyeSIiIgotICAgICAgICBkZWYgZmluZF9tb2R1bGUoc2VsZiwgbW9kX25hbWUsIHBhdGg9Tm9uZSk6Ci0gICAgICAgICAgICBpZiBwYXRoIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgZmlsZSwgZmlsZW5hbWUsIG1vZF9pbmZvID0gaW1wLmZpbmRfbW9kdWxlKG1vZF9uYW1lKQotICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgICAgIHJldHVybiBOb25lCi0gICAgICAgICAgICBzdWZmaXgsIG1vZGUsIG1vZF90eXBlID0gbW9kX2luZm8KLSAgICAgICAgICAgIGlmIG1vZF90eXBlID09IGltcC5QWV9TT1VSQ0U6Ci0gICAgICAgICAgICAgICAgbG9hZGVyID0gX1NvdXJjZUZpbGVMb2FkZXIobW9kX25hbWUsIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIG1vZF9pbmZvKQotICAgICAgICAgICAgZWxpZiBtb2RfdHlwZSA9PSBpbXAuUFlfQ09NUElMRUQ6Ci0gICAgICAgICAgICAgICAgbG9hZGVyID0gX0NvbXBpbGVkRmlsZUxvYWRlcihtb2RfbmFtZSwgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBtb2RfaW5mbykKLSAgICAgICAgICAgIGVsaWYgbW9kX3R5cGUgPT0gaW1wLlBLR19ESVJFQ1RPUlk6Ci0gICAgICAgICAgICAgICAgbG9hZGVyID0gX1BhY2thZ2VEaXJMb2FkZXIobW9kX25hbWUsIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIG1vZF9pbmZvKQotICAgICAgICAgICAgZWxpZiBtb2RfdHlwZSA9PSBpbXAuQ19FWFRFTlNJT046Ci0gICAgICAgICAgICAgICAgbG9hZGVyID0gX0ZpbGVTeXN0ZW1Mb2FkZXIobW9kX25hbWUsIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIG1vZF9pbmZvKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBsb2FkZXIgPSBfQmFzaWNMb2FkZXIobW9kX25hbWUsIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBtb2RfaW5mbykKLSAgICAgICAgICAgIHJldHVybiBsb2FkZXIKLQotCi0gICAgY2xhc3MgX0ZpbGVTeXN0ZW1JbXBvcnRlcihvYmplY3QpOgotICAgICAgICAiIiJQRVAgMzAyIGltcG9ydGVyIHdyYXBwZXIgZm9yIGZpbGVzeXN0ZW0gYmFzZWQgaW1wb3J0cyIiIgotICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aF9pdGVtPU5vbmUpOgotICAgICAgICAgICAgaWYgcGF0aF9pdGVtIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIGlmIHBhdGhfaXRlbSAhPSAnJyBhbmQgbm90IG9zLnBhdGguaXNkaXIocGF0aF9pdGVtKToKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSIgJSBwYXRoX2l0ZW0pCi0gICAgICAgICAgICAgICAgc2VsZi5wYXRoX2RpciA9IHBhdGhfaXRlbQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICByYWlzZSBJbXBvcnRFcnJvcigiRmlsZXN5c3RlbSBpbXBvcnRlciByZXF1aXJlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEgZGlyZWN0b3J5IG5hbWUiKQotCi0gICAgICAgIGRlZiBmaW5kX21vZHVsZShzZWxmLCBtb2RfbmFtZSwgcGF0aD1Ob25lKToKLSAgICAgICAgICAgIGlmIHBhdGggaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgICAgIHBhdGhfZGlyID0gc2VsZi5wYXRoX2RpcgotICAgICAgICAgICAgaWYgcGF0aF9kaXIgPT0gJyc6Ci0gICAgICAgICAgICAgICAgcGF0aF9kaXIgPSBvcy5nZXRjd2QoKQotICAgICAgICAgICAgc3ViX25hbWUgPSBtb2RfbmFtZS5yc3BsaXQoIi4iLCAxKVstMV0KLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBmaWxlLCBmaWxlbmFtZSwgbW9kX2luZm8gPSBpbXAuZmluZF9tb2R1bGUoc3ViX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXRoX2Rpcl0pCi0gICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5vbmUKLSAgICAgICAgICAgIGlmIG5vdCBmaWxlbmFtZS5zdGFydHN3aXRoKHBhdGhfZGlyKToKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICAgICAgc3VmZml4LCBtb2RlLCBtb2RfdHlwZSA9IG1vZF9pbmZvCi0gICAgICAgICAgICBpZiBtb2RfdHlwZSA9PSBpbXAuUFlfU09VUkNFOgotICAgICAgICAgICAgICAgIGxvYWRlciA9IF9Tb3VyY2VGaWxlTG9hZGVyKG1vZF9uYW1lLCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBtb2RfaW5mbykKLSAgICAgICAgICAgIGVsaWYgbW9kX3R5cGUgPT0gaW1wLlBZX0NPTVBJTEVEOgotICAgICAgICAgICAgICAgIGxvYWRlciA9IF9Db21waWxlZEZpbGVMb2FkZXIobW9kX25hbWUsIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbW9kX2luZm8pCi0gICAgICAgICAgICBlbGlmIG1vZF90eXBlID09IGltcC5QS0dfRElSRUNUT1JZOgotICAgICAgICAgICAgICAgIGxvYWRlciA9IF9QYWNrYWdlRGlyTG9hZGVyKG1vZF9uYW1lLCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBtb2RfaW5mbykKLSAgICAgICAgICAgIGVsaWYgbW9kX3R5cGUgPT0gaW1wLkNfRVhURU5TSU9OOgotICAgICAgICAgICAgICAgIGxvYWRlciA9IF9GaWxlU3lzdGVtTG9hZGVyKG1vZF9uYW1lLCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBtb2RfaW5mbykKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgbG9hZGVyID0gX0Jhc2ljTG9hZGVyKG1vZF9uYW1lLCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbW9kX2luZm8pCi0gICAgICAgICAgICByZXR1cm4gbG9hZGVyCi0KLQotICAgIGNsYXNzIF9CYXNpY0xvYWRlcihvYmplY3QpOgotICAgICAgICAiIiJQRVAgMzAyIGxvYWRlciB3cmFwcGVyIGZvciB0b3AgbGV2ZWwgaW1wb3J0IG1hY2hpbmVyeSIiIgotICAgICAgICBkZWYgX19pbml0X18oc2VsZiwgbW9kX25hbWUsIGZpbGUsIGZpbGVuYW1lLCBtb2RfaW5mbyk6Ci0gICAgICAgICAgICBzZWxmLm1vZF9uYW1lID0gbW9kX25hbWUKLSAgICAgICAgICAgIHNlbGYuZmlsZSA9IGZpbGUKLSAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQotICAgICAgICAgICAgc2VsZi5tb2RfaW5mbyA9IG1vZF9pbmZvCi0KLSAgICAgICAgZGVmIF9maXhfbmFtZShzZWxmLCBtb2RfbmFtZSk6Ci0gICAgICAgICAgICBpZiBtb2RfbmFtZSBpcyBOb25lOgotICAgICAgICAgICAgICAgIG1vZF9uYW1lID0gc2VsZi5tb2RfbmFtZQotICAgICAgICAgICAgZWxpZiBtb2RfbmFtZSAhPSBzZWxmLm1vZF9uYW1lOgotICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJMb2FkZXIgZm9yIG1vZHVsZSAlcyBjYW5ub3QgaGFuZGxlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibW9kdWxlICVzIiAlIChzZWxmLm1vZF9uYW1lLCBtb2RfbmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gbW9kX25hbWUKLQotICAgICAgICBkZWYgbG9hZF9tb2R1bGUoc2VsZiwgbW9kX25hbWU9Tm9uZSk6Ci0gICAgICAgICAgICBtb2RfbmFtZSA9IHNlbGYuX2ZpeF9uYW1lKG1vZF9uYW1lKQotICAgICAgICAgICAgbW9kID0gaW1wLmxvYWRfbW9kdWxlKG1vZF9uYW1lLCBzZWxmLmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maWxlbmFtZSwgc2VsZi5tb2RfaW5mbykKLSAgICAgICAgICAgIG1vZC5fX2xvYWRlcl9fID0gc2VsZiAgIyBmb3IgaW50cm9zcGVjdGlvbgotICAgICAgICAgICAgcmV0dXJuIG1vZAotCi0gICAgICAgIGRlZiBnZXRfY29kZShzZWxmLCBtb2RfbmFtZT1Ob25lKToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0KLSAgICAgICAgZGVmIGdldF9zb3VyY2Uoc2VsZiwgbW9kX25hbWU9Tm9uZSk6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgICAgIGRlZiBpc19wYWNrYWdlKHNlbGYsIG1vZF9uYW1lPU5vbmUpOgotICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICAgICAgZGVmIGNsb3NlKHNlbGYpOgotICAgICAgICAgICAgaWYgc2VsZi5maWxlOgotICAgICAgICAgICAgICAgIHNlbGYuZmlsZS5jbG9zZSgpCi0KLSAgICAgICAgZGVmIF9fZGVsX18oc2VsZik6Ci0gICAgICAgICAgICBzZWxmLmNsb3NlKCkKLQotCi0gICAgY2xhc3MgX0ZpbGVTeXN0ZW1Mb2FkZXIoX0Jhc2ljTG9hZGVyKToKLSAgICAgICAgIiIiUEVQIDMwMiBsb2FkZXIgd3JhcHBlciBmb3IgZmlsZXN5c3RlbSBiYXNlZCBpbXBvcnRzIiIiCi0gICAgICAgIGRlZiBnZXRfY29kZShzZWxmLCBtb2RfbmFtZT1Ob25lKToKLSAgICAgICAgICAgIG1vZF9uYW1lID0gc2VsZi5fZml4X25hbWUobW9kX25hbWUpCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5fZ2V0X2NvZGUobW9kX25hbWUpCi0KLSAgICAgICAgZGVmIGdldF9kYXRhKHNlbGYsIHBhdGhuYW1lKToKLSAgICAgICAgICAgIHJldHVybiBvcGVuKHBhdGhuYW1lLCAicmIiKS5yZWFkKCkKLQotICAgICAgICBkZWYgZ2V0X2ZpbGVuYW1lKHNlbGYsIG1vZF9uYW1lPU5vbmUpOgotICAgICAgICAgICAgbW9kX25hbWUgPSBzZWxmLl9maXhfbmFtZShtb2RfbmFtZSkKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl9nZXRfZmlsZW5hbWUobW9kX25hbWUpCi0KLSAgICAgICAgZGVmIGdldF9zb3VyY2Uoc2VsZiwgbW9kX25hbWU9Tm9uZSk6Ci0gICAgICAgICAgICBtb2RfbmFtZSA9IHNlbGYuX2ZpeF9uYW1lKG1vZF9uYW1lKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2dldF9zb3VyY2UobW9kX25hbWUpCi0KLSAgICAgICAgZGVmIGlzX3BhY2thZ2Uoc2VsZiwgbW9kX25hbWU9Tm9uZSk6Ci0gICAgICAgICAgICBtb2RfbmFtZSA9IHNlbGYuX2ZpeF9uYW1lKG1vZF9uYW1lKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2lzX3BhY2thZ2UobW9kX25hbWUpCi0KLSAgICAgICAgZGVmIF9nZXRfY29kZShzZWxmLCBtb2RfbmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgICAgIGRlZiBfZ2V0X2ZpbGVuYW1lKHNlbGYsIG1vZF9uYW1lKToKLSAgICAgICAgICAgIHJldHVybiBzZWxmLmZpbGVuYW1lCi0KLSAgICAgICAgZGVmIF9nZXRfc291cmNlKHNlbGYsIG1vZF9uYW1lKToKLSAgICAgICAgICAgIHJldHVybiBOb25lCi0KLSAgICAgICAgZGVmIF9pc19wYWNrYWdlKHNlbGYsIG1vZF9uYW1lKToKLSAgICAgICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgY2xhc3MgX1BhY2thZ2VEaXJMb2FkZXIoX0ZpbGVTeXN0ZW1Mb2FkZXIpOgotICAgICAgICAiIiJQRVAgMzAyIGxvYWRlciB3cmFwcGVyIGZvciBQS0dfRElSRUNUT1JZIGRpcmVjdG9yaWVzIiIiCi0gICAgICAgIGRlZiBfaXNfcGFja2FnZShzZWxmLCBtb2RfbmFtZSk6Ci0gICAgICAgICAgICByZXR1cm4gVHJ1ZQotCi0KLSAgICBjbGFzcyBfU291cmNlRmlsZUxvYWRlcihfRmlsZVN5c3RlbUxvYWRlcik6Ci0gICAgICAgICIiIlBFUCAzMDIgbG9hZGVyIHdyYXBwZXIgZm9yIFBZX1NPVVJDRSBtb2R1bGVzIiIiCi0gICAgICAgIGRlZiBfZ2V0X2NvZGUoc2VsZiwgbW9kX25hbWUpOgotICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGUoc2VsZi5fZ2V0X3NvdXJjZShtb2RfbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVuYW1lLCAnZXhlYycpCi0KLSAgICAgICAgZGVmIF9nZXRfc291cmNlKHNlbGYsIG1vZF9uYW1lKToKLSAgICAgICAgICAgIGYgPSBzZWxmLmZpbGUKLSAgICAgICAgICAgIGYuc2VlaygwKQotICAgICAgICAgICAgcmV0dXJuIGYucmVhZCgpCi0KLQotICAgIGNsYXNzIF9Db21waWxlZEZpbGVMb2FkZXIoX0ZpbGVTeXN0ZW1Mb2FkZXIpOgotICAgICAgICAiIiJQRVAgMzAyIGxvYWRlciB3cmFwcGVyIGZvciBQWV9DT01QSUxFRCBtb2R1bGVzIiIiCi0gICAgICAgIGRlZiBfZ2V0X2NvZGUoc2VsZiwgbW9kX25hbWUpOgotICAgICAgICAgICAgZiA9IHNlbGYuZmlsZQotICAgICAgICAgICAgZi5zZWVrKDApCi0gICAgICAgICAgICByZXR1cm4gX3JlYWRfY29tcGlsZWRfZmlsZShmKQotCi0KLSAgICBkZWYgX2dldF9pbXBvcnRlcihwYXRoX2l0ZW0pOgotICAgICAgICAiIiJSZXRyaWV2ZSBhIFBFUCAzMDIgaW1wb3J0ZXIgZm9yIHRoZSBnaXZlbiBwYXRoIGl0ZW0KLQotICAgICAgICBUaGUgcmV0dXJuZWQgaW1wb3J0ZXIgaXMgY2FjaGVkIGluIHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlCi0gICAgICAgIGlmIGl0IHdhcyBuZXdseSBjcmVhdGVkIGJ5IGEgcGF0aCBob29rLgotCi0gICAgICAgIElmIHRoZXJlIGlzIG5vIGltcG9ydGVyLCBhIHdyYXBwZXIgYXJvdW5kIHRoZSBiYXNpYyBpbXBvcnQKLSAgICAgICAgbWFjaGluZXJ5IGlzIHJldHVybmVkLiBUaGlzIHdyYXBwZXIgaXMgbmV2ZXIgaW5zZXJ0ZWQgaW50bwotICAgICAgICB0aGUgaW1wb3J0ZXIgY2FjaGUgKE5vbmUgaXMgaW5zZXJ0ZWQgaW5zdGVhZCkuCi0KLSAgICAgICAgVGhlIGNhY2hlIChvciBwYXJ0IG9mIGl0KSBjYW4gYmUgY2xlYXJlZCBtYW51YWxseSBpZiBhCi0gICAgICAgIHJlc2NhbiBvZiBzeXMucGF0aF9ob29rcyBpcyBuZWNlc3NhcnkuCi0gICAgICAgICIiIgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBpbXBvcnRlciA9IHN5cy5wYXRoX2ltcG9ydGVyX2NhY2hlW3BhdGhfaXRlbV0KLSAgICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICAgICAgZm9yIHBhdGhfaG9vayBpbiBzeXMucGF0aF9ob29rczoKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIGltcG9ydGVyID0gcGF0aF9ob29rKHBhdGhfaXRlbSkKLSAgICAgICAgICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgaW1wb3J0ZXIgPSBOb25lCi0gICAgICAgICAgICBzeXMucGF0aF9pbXBvcnRlcl9jYWNoZVtwYXRoX2l0ZW1dID0gaW1wb3J0ZXIKLSAgICAgICAgaWYgaW1wb3J0ZXIgaXMgTm9uZToKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBpbXBvcnRlciA9IF9GaWxlU3lzdGVtSW1wb3J0ZXIocGF0aF9pdGVtKQotICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICAgICAgICAgIHBhc3MKLSAgICAgICAgcmV0dXJuIGltcG9ydGVyCi0KLQotICAgIGRlZiBfZ2V0X3BhdGhfbG9hZGVyKG1vZF9uYW1lLCBwYXRoPU5vbmUpOgotICAgICAgICAiIiJSZXRyaWV2ZSBhIFBFUCAzMDIgbG9hZGVyIHVzaW5nIGEgcGF0aCBpbXBvcnRlciIiIgotICAgICAgICBpZiBwYXRoIGlzIE5vbmU6Ci0gICAgICAgICAgICBwYXRoID0gc3lzLnBhdGgKLSAgICAgICAgICAgIGFic29sdXRlX2xvYWRlciA9IF9BYnNvbHV0ZUltcG9ydGVyKCkuZmluZF9tb2R1bGUobW9kX25hbWUpCi0gICAgICAgICAgICBpZiBpc2luc3RhbmNlKGFic29sdXRlX2xvYWRlciwgX0ZpbGVTeXN0ZW1Mb2FkZXIpOgotICAgICAgICAgICAgICAgICMgRm91bmQgaW4gZmlsZXN5c3RlbSwgc28gc2NhbiBwYXRoIGhvb2tzCi0gICAgICAgICAgICAgICAgIyBiZWZvcmUgYWNjZXB0aW5nIHRoaXMgb25lIGFzIHRoZSByaWdodCBvbmUKLSAgICAgICAgICAgICAgICBsb2FkZXIgPSBOb25lCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICMgTm90IGZvdW5kIGluIGZpbGVzeXN0ZW0sIHNvIHVzZSB0b3AtbGV2ZWwgbG9hZGVyCi0gICAgICAgICAgICAgICAgbG9hZGVyID0gYWJzb2x1dGVfbG9hZGVyCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBsb2FkZXIgPSBhYnNvbHV0ZV9sb2FkZXIgPSBOb25lCi0gICAgICAgIGlmIGxvYWRlciBpcyBOb25lOgotICAgICAgICAgICAgZm9yIHBhdGhfaXRlbSBpbiBwYXRoOgotICAgICAgICAgICAgICAgIGltcG9ydGVyID0gX2dldF9pbXBvcnRlcihwYXRoX2l0ZW0pCi0gICAgICAgICAgICAgICAgaWYgaW1wb3J0ZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRlciA9IGltcG9ydGVyLmZpbmRfbW9kdWxlKG1vZF9uYW1lKQotICAgICAgICAgICAgICAgICAgICBpZiBsb2FkZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIEZvdW5kIGEgbG9hZGVyIGZvciBvdXIgbW9kdWxlCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhawotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAjIE5vIHBhdGggaG9vayBmb3VuZCwgc28gYWNjZXB0IHRoZSB0b3AgbGV2ZWwgbG9hZGVyCi0gICAgICAgICAgICAgICAgbG9hZGVyID0gYWJzb2x1dGVfbG9hZGVyCi0gICAgICAgIHJldHVybiBsb2FkZXIKLQotICAgIGRlZiBfZ2V0X3BhY2thZ2UocGtnX25hbWUpOgotICAgICAgICAiIiJSZXRyaWV2ZSBhIG5hbWVkIHBhY2thZ2UiIiIKLSAgICAgICAgcGtnID0gX19pbXBvcnRfXyhwa2dfbmFtZSkKLSAgICAgICAgc3ViX3BrZ19uYW1lcyA9IHBrZ19uYW1lLnNwbGl0KCIuIikKLSAgICAgICAgZm9yIHN1Yl9wa2cgaW4gc3ViX3BrZ19uYW1lc1sxOl06Ci0gICAgICAgICAgICBwa2cgPSBnZXRhdHRyKHBrZywgc3ViX3BrZykKLSAgICAgICAgcmV0dXJuIHBrZwotCi0gICAgZGVmIF9nZXRfbG9hZGVyKG1vZF9uYW1lLCBwYXRoPU5vbmUpOgotICAgICAgICAiIiJSZXRyaWV2ZSBhIFBFUCAzMDIgbG9hZGVyIGZvciB0aGUgZ2l2ZW4gbW9kdWxlIG9yIHBhY2thZ2UKLQotICAgICAgICBJZiB0aGUgbW9kdWxlIG9yIHBhY2thZ2UgaXMgYWNjZXNzaWJsZSB2aWEgdGhlIG5vcm1hbCBpbXBvcnQKLSAgICAgICAgbWVjaGFuaXNtLCBhIHdyYXBwZXIgYXJvdW5kIHRoZSByZWxldmFudCBwYXJ0IG9mIHRoYXQgbWFjaGluZXJ5Ci0gICAgICAgIGlzIHJldHVybmVkLgotCi0gICAgICAgIE5vbiBQRVAgMzAyIG1lY2hhbmlzbXMgKGUuZy4gdGhlIFdpbmRvd3MgcmVnaXN0cnkpIHVzZWQgYnkgdGhlCi0gICAgICAgIHN0YW5kYXJkIGltcG9ydCBtYWNoaW5lcnkgdG8gZmluZCBmaWxlcyBpbiBhbHRlcm5hdGl2ZSBsb2NhdGlvbnMKLSAgICAgICAgYXJlIHBhcnRpYWxseSBzdXBwb3J0ZWQsIGJ1dCBhcmUgc2VhcmNoZWQgQUZURVIgc3lzLnBhdGguIE5vcm1hbGx5LAotICAgICAgICB0aGVzZSBsb2NhdGlvbnMgYXJlIHNlYXJjaGVkIEJFRk9SRSBzeXMucGF0aCwgcHJldmVudGluZyBzeXMucGF0aAotICAgICAgICBlbnRyaWVzIGZyb20gc2hhZG93aW5nIHRoZW0uCi0gICAgICAgIEZvciB0aGlzIHRvIGNhdXNlIGEgdmlzaWJsZSBkaWZmZXJlbmNlIGluIGJlaGF2aW91ciwgdGhlcmUgbXVzdAotICAgICAgICBiZSBhIG1vZHVsZSBvciBwYWNrYWdlIG5hbWUgdGhhdCBpcyBhY2Nlc3NpYmxlIHZpYSBib3RoIHN5cy5wYXRoCi0gICAgICAgIGFuZCBvbmUgb2YgdGhlIG5vbiBQRVAgMzAyIGZpbGUgc3lzdGVtIG1lY2hhbmlzbXMuIEluIHRoaXMgY2FzZSwKLSAgICAgICAgdGhlIGVtdWxhdGlvbiB3aWxsIGZpbmQgdGhlIGZvcm1lciB2ZXJzaW9uLCB3aGlsZSB0aGUgYnVpbHRpbgotICAgICAgICBpbXBvcnQgbWVjaGFuaXNtIHdpbGwgZmluZCB0aGUgbGF0dGVyLgotICAgICAgICBJdGVtcyBvZiB0aGUgZm9sbG93aW5nIHR5cGVzIGNhbiBiZSBhZmZlY3RlZCBieSB0aGlzIGRpc2NyZXBhbmN5OgotICAgICAgICAgICAgaW1wLkNfRVhURU5TSU9OCi0gICAgICAgICAgICBpbXAuUFlfU09VUkNFCi0gICAgICAgICAgICBpbXAuUFlfQ09NUElMRUQKLSAgICAgICAgICAgIGltcC5QS0dfRElSRUNUT1JZCi0gICAgICAgICIiIgotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBsb2FkZXIgPSBzeXMubW9kdWxlc1ttb2RfbmFtZV0uX19sb2FkZXJfXwotICAgICAgICBleGNlcHQgKEtleUVycm9yLCBBdHRyaWJ1dGVFcnJvcik6Ci0gICAgICAgICAgICBsb2FkZXIgPSBOb25lCi0gICAgICAgIGlmIGxvYWRlciBpcyBOb25lOgotICAgICAgICAgICAgaW1wLmFjcXVpcmVfbG9jaygpCi0gICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgIyBNb2R1bGUgbm90IGluIHN5cy5tb2R1bGVzLCBvciB1c2VzIGFuIHVuaG9va2VkIGxvYWRlcgotICAgICAgICAgICAgICAgIHBhcnRzID0gbW9kX25hbWUucnNwbGl0KCIuIiwgMSkKLSAgICAgICAgICAgICAgICBpZiBsZW4ocGFydHMpID09IDI6Ci0gICAgICAgICAgICAgICAgICAgICMgU3ViIHBhY2thZ2UsIHNvIHVzZSBwYXJlbnQgcGFja2FnZSdzIHBhdGgKLSAgICAgICAgICAgICAgICAgICAgcGtnX25hbWUsIHN1Yl9uYW1lID0gcGFydHMKLSAgICAgICAgICAgICAgICAgICAgaWYgcGtnX25hbWUgYW5kIHBrZ19uYW1lWzBdICE9ICcuJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBhdGggaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgSW1wb3J0RXJyb3IoIlBhdGggYXJndW1lbnQgbXVzdCBiZSBOb25lICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBhIGRvdHRlZCBtb2R1bGUgbmFtZSIpCi0gICAgICAgICAgICAgICAgICAgICAgICBwa2cgPSBfZ2V0X3BhY2thZ2UocGtnX25hbWUpCi0gICAgICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBrZy5fX3BhdGhfXwotICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKHBrZ19uYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBub3QgYSBwYWNrYWdlIikKLSAgICAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJSZWxhdGl2ZSBpbXBvcnQgc3ludGF4IGlzIG5vdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydGVkIGJ5IF9nZXRfbG9hZGVyKCkiKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgICMgVG9wIGxldmVsIG1vZHVsZSwgc28gc3RpY2sgd2l0aCBkZWZhdWx0IHBhdGgKLSAgICAgICAgICAgICAgICAgICAgc3ViX25hbWUgPSBtb2RfbmFtZQotCi0gICAgICAgICAgICAgICAgZm9yIGltcG9ydGVyIGluIHN5cy5tZXRhX3BhdGg6Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRlciA9IGltcG9ydGVyLmZpbmRfbW9kdWxlKG1vZF9uYW1lLCBwYXRoKQotICAgICAgICAgICAgICAgICAgICBpZiBsb2FkZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAjIEZvdW5kIGEgbWV0YWhvb2sgdG8gaGFuZGxlIHRoZSBtb2R1bGUKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgIyBIYW5kbGluZyB2aWEgdGhlIHN0YW5kYXJkIHBhdGggbWVjaGFuaXNtCi0gICAgICAgICAgICAgICAgICAgIGxvYWRlciA9IF9nZXRfcGF0aF9sb2FkZXIobW9kX25hbWUsIHBhdGgpCi0gICAgICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgICAgIGltcC5yZWxlYXNlX2xvY2soKQotICAgICAgICByZXR1cm4gbG9hZGVyCi0KLQotIyBUaGlzIGhlbHBlciBpcyBuZWVkZWQgZHVlIHRvIGEgbWlzc2luZyBjb21wb25lbnQgaW4gdGhlIFBFUCAzMDIKLSMgbG9hZGVyIHByb3RvY29sIChzcGVjaWZpY2FsbHksICJnZXRfZmlsZW5hbWUiIGlzIG5vbi1zdGFuZGFyZCkKLWRlZiBfZ2V0X2ZpbGVuYW1lKGxvYWRlciwgbW9kX25hbWUpOgotICAgIHRyeToKLSAgICAgICAgZ2V0X2ZpbGVuYW1lID0gbG9hZGVyLmdldF9maWxlbmFtZQotICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgcmV0dXJuIE5vbmUKLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gZ2V0X2ZpbGVuYW1lKG1vZF9uYW1lKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBEb25lIHdpdGggdGhlIGltcG9ydCBtYWNoaW5lcnkgZW11bGF0aW9uLCBvbiB3aXRoIHRoZSBjb2RlIQogCiBkZWYgX3J1bl9jb2RlKGNvZGUsIHJ1bl9nbG9iYWxzLCBpbml0X2dsb2JhbHMsCiAgICAgICAgICAgICAgIG1vZF9uYW1lLCBtb2RfZm5hbWUsIG1vZF9sb2FkZXIpOgpAQCAtMzc5LDIxICs0NSwxNyBAQAogICAgICAgICByZXN0b3JlX21vZHVsZSA9IG1vZF9uYW1lIGluIHN5cy5tb2R1bGVzCiAgICAgICAgIGlmIHJlc3RvcmVfbW9kdWxlOgogICAgICAgICAgICAgc2F2ZWRfbW9kdWxlID0gc3lzLm1vZHVsZXNbbW9kX25hbWVdCi0gICAgICAgIGltcC5hY3F1aXJlX2xvY2soKQorICAgICAgICBzeXMuYXJndlswXSA9IG1vZF9mbmFtZQorICAgICAgICBzeXMubW9kdWxlc1ttb2RfbmFtZV0gPSB0ZW1wX21vZHVsZQogICAgICAgICB0cnk6Ci0gICAgICAgICAgICBzeXMuYXJndlswXSA9IG1vZF9mbmFtZQotICAgICAgICAgICAgc3lzLm1vZHVsZXNbbW9kX25hbWVdID0gdGVtcF9tb2R1bGUKLSAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICBfcnVuX2NvZGUoY29kZSwgbW9kX2dsb2JhbHMsIGluaXRfZ2xvYmFscywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kX25hbWUsIG1vZF9mbmFtZSwgbW9kX2xvYWRlcikKLSAgICAgICAgICAgIGZpbmFsbHk6Ci0gICAgICAgICAgICAgICAgc3lzLmFyZ3ZbMF0gPSBzYXZlZF9hcmd2MAotICAgICAgICAgICAgICAgIGlmIHJlc3RvcmVfbW9kdWxlOgotICAgICAgICAgICAgICAgICAgICBzeXMubW9kdWxlc1ttb2RfbmFtZV0gPSBzYXZlZF9tb2R1bGUKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbW9kX25hbWVdCisgICAgICAgICAgICBfcnVuX2NvZGUoY29kZSwgbW9kX2dsb2JhbHMsIGluaXRfZ2xvYmFscywKKyAgICAgICAgICAgICAgICAgICAgICBtb2RfbmFtZSwgbW9kX2ZuYW1lLCBtb2RfbG9hZGVyKQogICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgaW1wLnJlbGVhc2VfbG9jaygpCisgICAgICAgICAgICBzeXMuYXJndlswXSA9IHNhdmVkX2FyZ3YwCisgICAgICAgIGlmIHJlc3RvcmVfbW9kdWxlOgorICAgICAgICAgICAgc3lzLm1vZHVsZXNbbW9kX25hbWVdID0gc2F2ZWRfbW9kdWxlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbW9kX25hbWVdCiAgICAgICAgICMgQ29weSB0aGUgZ2xvYmFscyBvZiB0aGUgdGVtcG9yYXJ5IG1vZHVsZSwgYXMgdGhleQogICAgICAgICAjIG1heSBiZSBjbGVhcmVkIHdoZW4gdGhlIHRlbXBvcmFyeSBtb2R1bGUgZ29lcyBhd2F5CiAgICAgICAgIHJldHVybiBtb2RfZ2xvYmFscy5jb3B5KCkKQEAgLTQwMywxMyArNjUsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RfbmFtZSwgbW9kX2ZuYW1lLCBtb2RfbG9hZGVyKQogCiAKKyMgVGhpcyBoZWxwZXIgaXMgbmVlZGVkIGR1ZSB0byBhIG1pc3NpbmcgY29tcG9uZW50IGluIHRoZSBQRVAgMzAyCisjIGxvYWRlciBwcm90b2NvbCAoc3BlY2lmaWNhbGx5LCAiZ2V0X2ZpbGVuYW1lIiBpcyBub24tc3RhbmRhcmQpCitkZWYgX2dldF9maWxlbmFtZShsb2FkZXIsIG1vZF9uYW1lKToKKyAgICB0cnk6CisgICAgICAgIGdldF9maWxlbmFtZSA9IGxvYWRlci5nZXRfZmlsZW5hbWUKKyAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgIHJldHVybiBOb25lCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuIGdldF9maWxlbmFtZShtb2RfbmFtZSkKKworCiBkZWYgcnVuX21vZHVsZShtb2RfbmFtZSwgaW5pdF9nbG9iYWxzPU5vbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuX25hbWU9Tm9uZSwgYWx0ZXJfc3lzPUZhbHNlKToKICAgICAiIiJFeGVjdXRlIGEgbW9kdWxlJ3MgY29kZSB3aXRob3V0IGltcG9ydGluZyBpdAogCiAgICAgICAgUmV0dXJucyB0aGUgcmVzdWx0aW5nIHRvcCBsZXZlbCBuYW1lc3BhY2UgZGljdGlvbmFyeQogICAgICIiIgotICAgIGxvYWRlciA9IF9nZXRfbG9hZGVyKG1vZF9uYW1lKQorICAgIGxvYWRlciA9IGdldF9sb2FkZXIobW9kX25hbWUpCiAgICAgaWYgbG9hZGVyIGlzIE5vbmU6CiAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJObyBtb2R1bGUgbmFtZWQgIiArIG1vZF9uYW1lKQogICAgIGNvZGUgPSBsb2FkZXIuZ2V0X2NvZGUobW9kX25hbWUpCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby9QS0ctSU5GTyBiL0xpYi9zZXR1cHRvb2xzLmVnZy1pbmZvL1BLRy1JTkZPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNWMxYTEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby9QS0ctSU5GTwpAQCAtMCwwICsxLDg5IEBACitNZXRhZGF0YS1WZXJzaW9uOiAxLjAKK05hbWU6IHNldHVwdG9vbHMKK1ZlcnNpb246IDAuN2ExZGV2LXI0NTUzNgorU3VtbWFyeTogRG93bmxvYWQsIGJ1aWxkLCBpbnN0YWxsLCB1cGdyYWRlLCBhbmQgdW5pbnN0YWxsIFB5dGhvbiBwYWNrYWdlcyAtLSBlYXNpbHkhCitIb21lLXBhZ2U6IGh0dHA6Ly9wZWFrLnRlbGVjb21tdW5pdHkuY29tL0RldkNlbnRlci9zZXR1cHRvb2xzCitBdXRob3I6IFBoaWxsaXAgSi4gRWJ5CitBdXRob3ItZW1haWw6IHBlYWtAZWJ5LXNhcm5hLmNvbQorTGljZW5zZTogUFNGIG9yIFpQTAorRGVzY3JpcHRpb246IGBgc2V0dXB0b29sc2BgIGlzIGEgY29sbGVjdGlvbiBvZiBlbmhhbmNlbWVudHMgdG8gdGhlIFB5dGhvbiBgYGRpc3R1dGlsc2BgCisgICAgICAgIChmb3IgUHl0aG9uIDIuMy41IGFuZCB1cCBvbiBtb3N0IHBsYXRmb3JtczsgNjQtYml0IHBsYXRmb3JtcyByZXF1aXJlIGEgbWluaW11bQorICAgICAgICBvZiBQeXRob24gMi40KSB0aGF0IGFsbG93IHlvdSB0byBtb3JlIGVhc2lseSBidWlsZCBhbmQgZGlzdHJpYnV0ZSBQeXRob24KKyAgICAgICAgcGFja2FnZXMsIGVzcGVjaWFsbHkgb25lcyB0aGF0IGhhdmUgZGVwZW5kZW5jaWVzIG9uIG90aGVyIHBhY2thZ2VzLgorICAgICAgICAKKyAgICAgICAgUGFja2FnZXMgYnVpbHQgYW5kIGRpc3RyaWJ1dGVkIHVzaW5nIGBgc2V0dXB0b29sc2BgIGxvb2sgdG8gdGhlIHVzZXIgbGlrZQorICAgICAgICBvcmRpbmFyeSBQeXRob24gcGFja2FnZXMgYmFzZWQgb24gdGhlIGBgZGlzdHV0aWxzYGAuICBZb3VyIHVzZXJzIGRvbid0IG5lZWQgdG8KKyAgICAgICAgaW5zdGFsbCBvciBldmVuIGtub3cgYWJvdXQgc2V0dXB0b29scyBpbiBvcmRlciB0byB1c2UgdGhlbSwgYW5kIHlvdSBkb24ndAorICAgICAgICBoYXZlIHRvIGluY2x1ZGUgdGhlIGVudGlyZSBzZXR1cHRvb2xzIHBhY2thZ2UgaW4geW91ciBkaXN0cmlidXRpb25zLiAgQnkKKyAgICAgICAgaW5jbHVkaW5nIGp1c3QgYSBzaW5nbGUgYGJvb3RzdHJhcCBtb2R1bGVgXyAoYW4gOEsgLnB5IGZpbGUpLCB5b3VyIHBhY2thZ2Ugd2lsbAorICAgICAgICBhdXRvbWF0aWNhbGx5IGRvd25sb2FkIGFuZCBpbnN0YWxsIGBgc2V0dXB0b29sc2BgIGlmIHRoZSB1c2VyIGlzIGJ1aWxkaW5nIHlvdXIKKyAgICAgICAgcGFja2FnZSBmcm9tIHNvdXJjZSBhbmQgZG9lc24ndCBoYXZlIGEgc3VpdGFibGUgdmVyc2lvbiBhbHJlYWR5IGluc3RhbGxlZC4KKyAgICAgICAgCisgICAgICAgIC4uIF9ib290c3RyYXAgbW9kdWxlOiBodHRwOi8vcGVhay50ZWxlY29tbXVuaXR5LmNvbS9kaXN0L2V6X3NldHVwLnB5CisgICAgICAgIAorICAgICAgICBGZWF0dXJlIEhpZ2hsaWdodHM6CisgICAgICAgIAorICAgICAgICAqIEF1dG9tYXRpY2FsbHkgZmluZC9kb3dubG9hZC9pbnN0YWxsL3VwZ3JhZGUgZGVwZW5kZW5jaWVzIGF0IGJ1aWxkIHRpbWUgdXNpbmcKKyAgICAgICAgdGhlIGBFYXN5SW5zdGFsbCB0b29sIDxodHRwOi8vcGVhay50ZWxlY29tbXVuaXR5LmNvbS9EZXZDZW50ZXIvRWFzeUluc3RhbGw+YF8sCisgICAgICAgIHdoaWNoIHN1cHBvcnRzIGRvd25sb2FkaW5nIHZpYSBIVFRQLCBGVFAsIFN1YnZlcnNpb24sIGFuZCBTb3VyY2VGb3JnZSwgYW5kCisgICAgICAgIGF1dG9tYXRpY2FsbHkgc2NhbnMgd2ViIHBhZ2VzIGxpbmtlZCBmcm9tIFB5UEkgdG8gZmluZCBkb3dubG9hZCBsaW5rcy4gIChJdCdzCisgICAgICAgIHRoZSBjbG9zZXN0IHRoaW5nIHRvIENQQU4gY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgUHl0aG9uLikKKyAgICAgICAgCisgICAgICAgICogQ3JlYXRlIGBQeXRob24gRWdncyA8aHR0cDovL3BlYWsudGVsZWNvbW11bml0eS5jb20vRGV2Q2VudGVyL1B5dGhvbkVnZ3M+YF8gLQorICAgICAgICBhIHNpbmdsZS1maWxlIGltcG9ydGFibGUgZGlzdHJpYnV0aW9uIGZvcm1hdAorICAgICAgICAKKyAgICAgICAgKiBJbmNsdWRlIGRhdGEgZmlsZXMgaW5zaWRlIHlvdXIgcGFja2FnZSBkaXJlY3Rvcmllcywgd2hlcmUgeW91ciBjb2RlIGNhbgorICAgICAgICBhY3R1YWxseSB1c2UgdGhlbS4gIChQeXRob24gMi40IGRpc3R1dGlscyBhbHNvIHN1cHBvcnRzIHRoaXMgZmVhdHVyZSwgYnV0CisgICAgICAgIHNldHVwdG9vbHMgcHJvdmlkZXMgdGhlIGZlYXR1cmUgZm9yIFB5dGhvbiAyLjMgcGFja2FnZXMgYWxzbywgYW5kIHN1cHBvcnRzCisgICAgICAgIGFjY2Vzc2luZyBkYXRhIGZpbGVzIGluIHppcHBlZCBwYWNrYWdlcyB0b28uKQorICAgICAgICAKKyAgICAgICAgKiBBdXRvbWF0aWNhbGx5IGluY2x1ZGUgYWxsIHBhY2thZ2VzIGluIHlvdXIgc291cmNlIHRyZWUsIHdpdGhvdXQgbGlzdGluZyB0aGVtCisgICAgICAgIGluZGl2aWR1YWxseSBpbiBzZXR1cC5weQorICAgICAgICAKKyAgICAgICAgKiBBdXRvbWF0aWNhbGx5IGluY2x1ZGUgYWxsIHJlbGV2YW50IGZpbGVzIGluIHlvdXIgc291cmNlIGRpc3RyaWJ1dGlvbnMsCisgICAgICAgIHdpdGhvdXQgbmVlZGluZyB0byBjcmVhdGUgYSBgYE1BTklGRVNULmluYGAgZmlsZSwgYW5kIHdpdGhvdXQgaGF2aW5nIHRvIGZvcmNlCisgICAgICAgIHJlZ2VuZXJhdGlvbiBvZiB0aGUgYGBNQU5JRkVTVGBgIGZpbGUgd2hlbiB5b3VyIHNvdXJjZSB0cmVlIGNoYW5nZXMuCisgICAgICAgIAorICAgICAgICAqIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgd3JhcHBlciBzY3JpcHRzIG9yIFdpbmRvd3MgKGNvbnNvbGUgYW5kIEdVSSkgLmV4ZQorICAgICAgICBmaWxlcyBmb3IgYW55IG51bWJlciBvZiAibWFpbiIgZnVuY3Rpb25zIGluIHlvdXIgcHJvamVjdC4gIChOb3RlOiB0aGlzIGlzIG5vdAorICAgICAgICBhIHB5MmV4ZSByZXBsYWNlbWVudDsgdGhlIC5leGUgZmlsZXMgcmVseSBvbiB0aGUgbG9jYWwgUHl0aG9uIGluc3RhbGxhdGlvbi4pCisgICAgICAgIAorICAgICAgICAqIFRyYW5zcGFyZW50IFB5cmV4IHN1cHBvcnQsIHNvIHRoYXQgeW91ciBzZXR1cC5weSBjYW4gbGlzdCBgYC5weXhgYCBmaWxlcyBhbmQKKyAgICAgICAgc3RpbGwgd29yayBldmVuIHdoZW4gdGhlIGVuZC11c2VyIGRvZXNuJ3QgaGF2ZSBQeXJleCBpbnN0YWxsZWQgKGFzIGxvbmcgYXMKKyAgICAgICAgeW91IGluY2x1ZGUgdGhlIFB5cmV4LWdlbmVyYXRlZCBDIGluIHlvdXIgc291cmNlIGRpc3RyaWJ1dGlvbikKKyAgICAgICAgCisgICAgICAgICogQ29tbWFuZCBhbGlhc2VzIC0gY3JlYXRlIHByb2plY3Qtc3BlY2lmaWMsIHBlci11c2VyLCBvciBzaXRlLXdpZGUgc2hvcnRjdXQKKyAgICAgICAgbmFtZXMgZm9yIGNvbW1vbmx5IHVzZWQgY29tbWFuZHMgYW5kIG9wdGlvbnMKKyAgICAgICAgCisgICAgICAgICogUHlQSSB1cGxvYWQgc3VwcG9ydCAtIHVwbG9hZCB5b3VyIHNvdXJjZSBkaXN0cmlidXRpb25zIGFuZCBlZ2dzIHRvIFB5UEkKKyAgICAgICAgCisgICAgICAgICogRGVwbG95IHlvdXIgcHJvamVjdCBpbiAiZGV2ZWxvcG1lbnQgbW9kZSIsIHN1Y2ggdGhhdCBpdCdzIGF2YWlsYWJsZSBvbgorICAgICAgICBgYHN5cy5wYXRoYGAsIHlldCBjYW4gc3RpbGwgYmUgZWRpdGVkIGRpcmVjdGx5IGZyb20gaXRzIHNvdXJjZSBjaGVja291dC4KKyAgICAgICAgCisgICAgICAgICogRWFzaWx5IGV4dGVuZCB0aGUgZGlzdHV0aWxzIHdpdGggbmV3IGNvbW1hbmRzIG9yIGBgc2V0dXAoKWBgIGFyZ3VtZW50cywgYW5kCisgICAgICAgIGRpc3RyaWJ1dGUvcmV1c2UgeW91ciBleHRlbnNpb25zIGZvciBtdWx0aXBsZSBwcm9qZWN0cywgd2l0aG91dCBjb3B5aW5nIGNvZGUuCisgICAgICAgIAorICAgICAgICAqIENyZWF0ZSBleHRlbnNpYmxlIGFwcGxpY2F0aW9ucyBhbmQgZnJhbWV3b3JrcyB0aGF0IGF1dG9tYXRpY2FsbHkgZGlzY292ZXIKKyAgICAgICAgZXh0ZW5zaW9ucywgdXNpbmcgc2ltcGxlICJlbnRyeSBwb2ludHMiIGRlY2xhcmVkIGluIGEgcHJvamVjdCdzIHNldHVwIHNjcmlwdC4KKyAgICAgICAgCisgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoZSBQeVBJIGRvd25sb2FkcywgdGhlIGRldmVsb3BtZW50IHZlcnNpb24gb2YgYGBzZXR1cHRvb2xzYGAKKyAgICAgICAgaXMgYXZhaWxhYmxlIGZyb20gdGhlIGBQeXRob24gU1ZOIHNhbmRib3hgXywgYW5kIGluLWRldmVsb3BtZW50IHZlcnNpb25zIG9mIHRoZQorICAgICAgICBgMC42IGJyYW5jaGBfIGFyZSBhdmFpbGFibGUgYXMgd2VsbC4KKyAgICAgICAgCisgICAgICAgIC4uIF8wLjYgYnJhbmNoOiBodHRwOi8vc3ZuLnB5dGhvbi5vcmcvcHJvamVjdHMvc2FuZGJveC9icmFuY2hlcy9zZXR1cHRvb2xzLTAuNi8jZWdnPXNldHVwdG9vbHMtZGV2MDYKKyAgICAgICAgCisgICAgICAgIC4uIF9QeXRob24gU1ZOIHNhbmRib3g6IGh0dHA6Ly9zdm4ucHl0aG9uLm9yZy9wcm9qZWN0cy9zYW5kYm94L3RydW5rL3NldHVwdG9vbHMvI2VnZz1zZXR1cHRvb2xzLWRldgorICAgICAgICAKKyAgICAgICAgCitLZXl3b3JkczogQ1BBTiBQeVBJIGRpc3R1dGlscyBlZ2dzIHBhY2thZ2UgbWFuYWdlbWVudAorUGxhdGZvcm06IFVOS05PV04KK0NsYXNzaWZpZXI6IERldmVsb3BtZW50IFN0YXR1cyA6OiAzIC0gQWxwaGEKK0NsYXNzaWZpZXI6IEludGVuZGVkIEF1ZGllbmNlIDo6IERldmVsb3BlcnMKK0NsYXNzaWZpZXI6IExpY2Vuc2UgOjogT1NJIEFwcHJvdmVkIDo6IFB5dGhvbiBTb2Z0d2FyZSBGb3VuZGF0aW9uIExpY2Vuc2UKK0NsYXNzaWZpZXI6IExpY2Vuc2UgOjogT1NJIEFwcHJvdmVkIDo6IFpvcGUgUHVibGljIExpY2Vuc2UKK0NsYXNzaWZpZXI6IE9wZXJhdGluZyBTeXN0ZW0gOjogT1MgSW5kZXBlbmRlbnQKK0NsYXNzaWZpZXI6IFByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbgorQ2xhc3NpZmllcjogVG9waWMgOjogU29mdHdhcmUgRGV2ZWxvcG1lbnQgOjogTGlicmFyaWVzIDo6IFB5dGhvbiBNb2R1bGVzCitDbGFzc2lmaWVyOiBUb3BpYyA6OiBTeXN0ZW0gOjogQXJjaGl2aW5nIDo6IFBhY2thZ2luZworQ2xhc3NpZmllcjogVG9waWMgOjogU3lzdGVtIDo6IFN5c3RlbXMgQWRtaW5pc3RyYXRpb24KK0NsYXNzaWZpZXI6IFRvcGljIDo6IFV0aWxpdGllcwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vZW50cnlfcG9pbnRzLnR4dCBiL0xpYi9zZXR1cHRvb2xzLmVnZy1pbmZvL2VudHJ5X3BvaW50cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGFmZTJjYgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzLmVnZy1pbmZvL2VudHJ5X3BvaW50cy50eHQKQEAgLTAsMCArMSw1MSBAQAorW2Rpc3R1dGlscy5zZXR1cF9rZXl3b3Jkc10KK2RlcGVuZGVuY3lfbGlua3MgPSBzZXR1cHRvb2xzLmRpc3Q6YXNzZXJ0X3N0cmluZ19saXN0CitlbnRyeV9wb2ludHMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfZW50cnlfcG9pbnRzCitleHRyYXNfcmVxdWlyZSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19leHRyYXMKK3BhY2thZ2VfZGF0YSA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19wYWNrYWdlX2RhdGEKK2luc3RhbGxfcmVxdWlyZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcmVxdWlyZW1lbnRzCitpbmNsdWRlX3BhY2thZ2VfZGF0YSA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfYm9vbAorZXhjbHVkZV9wYWNrYWdlX2RhdGEgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfcGFja2FnZV9kYXRhCituYW1lc3BhY2VfcGFja2FnZXMgPSBzZXR1cHRvb2xzLmRpc3Q6Y2hlY2tfbnNwCit0ZXN0X3N1aXRlID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3Rlc3Rfc3VpdGUKK2VhZ2VyX3Jlc291cmNlcyA9IHNldHVwdG9vbHMuZGlzdDphc3NlcnRfc3RyaW5nX2xpc3QKK3ppcF9zYWZlID0gc2V0dXB0b29scy5kaXN0OmFzc2VydF9ib29sCit0ZXN0X2xvYWRlciA9IHNldHVwdG9vbHMuZGlzdDpjaGVja19pbXBvcnRhYmxlCit0ZXN0c19yZXF1aXJlID0gc2V0dXB0b29scy5kaXN0OmNoZWNrX3JlcXVpcmVtZW50cworCitbc2V0dXB0b29scy5maWxlX2ZpbmRlcnNdCitzdm5fY3ZzID0gc2V0dXB0b29scy5jb21tYW5kLnNkaXN0Ol9kZWZhdWx0X3JldmN0cmwKKworW2VnZ19pbmZvLndyaXRlcnNdCitkZXBlbmRlbmN5X2xpbmtzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnCityZXF1aXJlcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfcmVxdWlyZW1lbnRzCitQS0ctSU5GTyA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzp3cml0ZV9wa2dfaW5mbworZWFnZXJfcmVzb3VyY2VzLnR4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbzpvdmVyd3JpdGVfYXJnCit0b3BfbGV2ZWwudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOndyaXRlX3RvcGxldmVsX25hbWVzCituYW1lc3BhY2VfcGFja2FnZXMudHh0ID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOm92ZXJ3cml0ZV9hcmcKK2VudHJ5X3BvaW50cy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d3JpdGVfZW50cmllcworZGVwZW5kcy50eHQgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWdnX2luZm86d2Fybl9kZXBlbmRzX29ic29sZXRlCisKK1tjb25zb2xlX3NjcmlwdHNdCitlYXN5X2luc3RhbGwgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4KK2Vhc3lfaW5zdGFsbC0yLjUgPSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsOm1haW4KKworW2Rpc3R1dGlscy5jb21tYW5kc10KK2JkaXN0X3JwbSA9IHNldHVwdG9vbHMuY29tbWFuZC5iZGlzdF9ycG06YmRpc3RfcnBtCityb3RhdGUgPSBzZXR1cHRvb2xzLmNvbW1hbmQucm90YXRlOnJvdGF0ZQorZGV2ZWxvcCA9IHNldHVwdG9vbHMuY29tbWFuZC5kZXZlbG9wOmRldmVsb3AKK3NldG9wdCA9IHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQ6c2V0b3B0CitidWlsZF9weSA9IHNldHVwdG9vbHMuY29tbWFuZC5idWlsZF9weTpidWlsZF9weQorc2F2ZW9wdHMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuc2F2ZW9wdHM6c2F2ZW9wdHMKK2VnZ19pbmZvID0gc2V0dXB0b29scy5jb21tYW5kLmVnZ19pbmZvOmVnZ19pbmZvCitpbnN0YWxsX2VnZ19pbmZvID0gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGxfZWdnX2luZm86aW5zdGFsbF9lZ2dfaW5mbworYWxpYXMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuYWxpYXM6YWxpYXMKK2Vhc3lfaW5zdGFsbCA9IHNldHVwdG9vbHMuY29tbWFuZC5lYXN5X2luc3RhbGw6ZWFzeV9pbnN0YWxsCitpbnN0YWxsX3NjcmlwdHMgPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9zY3JpcHRzOmluc3RhbGxfc2NyaXB0cworYmRpc3RfZWdnID0gc2V0dXB0b29scy5jb21tYW5kLmJkaXN0X2VnZzpiZGlzdF9lZ2cKK2luc3RhbGwgPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbDppbnN0YWxsCit0ZXN0ID0gc2V0dXB0b29scy5jb21tYW5kLnRlc3Q6dGVzdAoraW5zdGFsbF9saWIgPSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9saWI6aW5zdGFsbF9saWIKK2J1aWxkX2V4dCA9IHNldHVwdG9vbHMuY29tbWFuZC5idWlsZF9leHQ6YnVpbGRfZXh0CitzZGlzdCA9IHNldHVwdG9vbHMuY29tbWFuZC5zZGlzdDpzZGlzdAorCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby90b3BfbGV2ZWwudHh0IGIvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vdG9wX2xldmVsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTc3YzZhCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vdG9wX2xldmVsLnR4dApAQCAtMCwwICsxLDMgQEAKK2Vhc3lfaW5zdGFsbAorcGtnX3Jlc291cmNlcworc2V0dXB0b29scwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vemlwLXNhZmUgYi9MaWIvc2V0dXB0b29scy5lZ2ctaW5mby96aXAtc2FmZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMuZWdnLWluZm8vemlwLXNhZmUKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL19faW5pdF9fLnB5IGIvTGliL3NldHVwdG9vbHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkyMWNlMgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsNjQgQEAKKyIiIkV4dGVuc2lvbnMgdG8gdGhlICdkaXN0dXRpbHMnIGZvciBsYXJnZSBvciBjb21wbGV4IGRpc3RyaWJ1dGlvbnMiIiIKK2Zyb20gc2V0dXB0b29scy5leHRlbnNpb24gaW1wb3J0IEV4dGVuc2lvbiwgTGlicmFyeQorZnJvbSBzZXR1cHRvb2xzLmRpc3QgaW1wb3J0IERpc3RyaWJ1dGlvbiwgRmVhdHVyZSwgX2dldF91bnBhdGNoZWQKK2ltcG9ydCBkaXN0dXRpbHMuY29yZSwgc2V0dXB0b29scy5jb21tYW5kCitmcm9tIHNldHVwdG9vbHMuZGVwZW5kcyBpbXBvcnQgUmVxdWlyZQorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZCBhcyBfQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCitpbXBvcnQgb3MucGF0aAorCitfX3ZlcnNpb25fXyA9ICcwLjdhMScKK19fYWxsX18gPSBbCisgICAgJ3NldHVwJywgJ0Rpc3RyaWJ1dGlvbicsICdGZWF0dXJlJywgJ0NvbW1hbmQnLCAnRXh0ZW5zaW9uJywgJ1JlcXVpcmUnLAorICAgICdmaW5kX3BhY2thZ2VzJworXQorCitib290c3RyYXBfaW5zdGFsbF9mcm9tID0gTm9uZQorCitkZWYgZmluZF9wYWNrYWdlcyh3aGVyZT0nLicsIGV4Y2x1ZGU9KCkpOgorICAgICIiIlJldHVybiBhIGxpc3QgYWxsIFB5dGhvbiBwYWNrYWdlcyBmb3VuZCB3aXRoaW4gZGlyZWN0b3J5ICd3aGVyZScKKworICAgICd3aGVyZScgc2hvdWxkIGJlIHN1cHBsaWVkIGFzIGEgImNyb3NzLXBsYXRmb3JtIiAoaS5lLiBVUkwtc3R5bGUpIHBhdGg7IGl0CisgICAgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gdGhlIGFwcHJvcHJpYXRlIGxvY2FsIHBhdGggc3ludGF4LiAgJ2V4Y2x1ZGUnIGlzIGEKKyAgICBzZXF1ZW5jZSBvZiBwYWNrYWdlIG5hbWVzIHRvIGV4Y2x1ZGU7ICcqJyBjYW4gYmUgdXNlZCBhcyBhIHdpbGRjYXJkIGluIHRoZQorICAgIG5hbWVzLCBzdWNoIHRoYXQgJ2Zvby4qJyB3aWxsIGV4Y2x1ZGUgYWxsIHN1YnBhY2thZ2VzIG9mICdmb28nIChidXQgbm90CisgICAgJ2ZvbycgaXRzZWxmKS4KKyAgICAiIiIKKyAgICBvdXQgPSBbXQorICAgIHN0YWNrPVsoY29udmVydF9wYXRoKHdoZXJlKSwgJycpXQorICAgIHdoaWxlIHN0YWNrOgorICAgICAgICB3aGVyZSxwcmVmaXggPSBzdGFjay5wb3AoMCkKKyAgICAgICAgZm9yIG5hbWUgaW4gb3MubGlzdGRpcih3aGVyZSk6CisgICAgICAgICAgICBmbiA9IG9zLnBhdGguam9pbih3aGVyZSxuYW1lKQorICAgICAgICAgICAgaWYgKG9zLnBhdGguaXNkaXIoZm4pIGFuZAorICAgICAgICAgICAgICAgIG9zLnBhdGguaXNmaWxlKG9zLnBhdGguam9pbihmbiwnX19pbml0X18ucHknKSkKKyAgICAgICAgICAgICk6CisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZChwcmVmaXgrbmFtZSk7IHN0YWNrLmFwcGVuZCgoZm4scHJlZml4K25hbWUrJy4nKSkKKyAgICBmb3IgcGF0IGluIGV4Y2x1ZGU6CisgICAgICAgIGZyb20gZm5tYXRjaCBpbXBvcnQgZm5tYXRjaGNhc2UKKyAgICAgICAgb3V0ID0gW2l0ZW0gZm9yIGl0ZW0gaW4gb3V0IGlmIG5vdCBmbm1hdGNoY2FzZShpdGVtLHBhdCldCisgICAgcmV0dXJuIG91dAorCitzZXR1cCA9IGRpc3R1dGlscy5jb3JlLnNldHVwCisKK19Db21tYW5kID0gX2dldF91bnBhdGNoZWQoX0NvbW1hbmQpCisKK2NsYXNzIENvbW1hbmQoX0NvbW1hbmQpOgorICAgIF9fZG9jX18gPSBfQ29tbWFuZC5fX2RvY19fCisKKyAgICBjb21tYW5kX2NvbnN1bWVzX2FyZ3VtZW50cyA9IEZhbHNlCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGlzdCwgKiprdyk6CisgICAgICAgICMgQWRkIHN1cHBvcnQgZm9yIGtleXdvcmQgYXJndW1lbnRzCisgICAgICAgIF9Db21tYW5kLl9faW5pdF9fKHNlbGYsZGlzdCkKKyAgICAgICAgZm9yIGssdiBpbiBrdy5pdGVtcygpOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLGssdikKKworICAgIGRlZiByZWluaXRpYWxpemVfY29tbWFuZChzZWxmLCBjb21tYW5kLCByZWluaXRfc3ViY29tbWFuZHM9MCwgKiprdyk6CisgICAgICAgIGNtZCA9IF9Db21tYW5kLnJlaW5pdGlhbGl6ZV9jb21tYW5kKHNlbGYsIGNvbW1hbmQsIHJlaW5pdF9zdWJjb21tYW5kcykKKyAgICAgICAgZm9yIGssdiBpbiBrdy5pdGVtcygpOgorICAgICAgICAgICAgc2V0YXR0cihjbWQsayx2KSAgICAjIHVwZGF0ZSBjb21tYW5kIHdpdGgga2V5d29yZHMKKyAgICAgICAgcmV0dXJuIGNtZAorCitpbXBvcnQgZGlzdHV0aWxzLmNvcmUKK2Rpc3R1dGlscy5jb3JlLkNvbW1hbmQgPSBDb21tYW5kICAgICMgd2UgY2FuJ3QgcGF0Y2ggZGlzdHV0aWxzLmNtZCwgYWxhcwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvYXJjaGl2ZV91dGlsLnB5IGIvTGliL3NldHVwdG9vbHMvYXJjaGl2ZV91dGlsLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRkOWM2ODQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9hcmNoaXZlX3V0aWwucHkKQEAgLTAsMCArMSwyMDAgQEAKKyIiIlV0aWxpdGllcyBmb3IgZXh0cmFjdGluZyBjb21tb24gYXJjaGl2ZSBmb3JtYXRzIiIiCisKKworX19hbGxfXyA9IFsKKyAgICAidW5wYWNrX2FyY2hpdmUiLCAidW5wYWNrX3ppcGZpbGUiLCAidW5wYWNrX3RhcmZpbGUiLCAiZGVmYXVsdF9maWx0ZXIiLAorICAgICJVbnJlY29nbml6ZWRGb3JtYXQiLCAiZXh0cmFjdGlvbl9kcml2ZXJzIiwgInVucGFja19kaXJlY3RvcnkiLAorXQorCitpbXBvcnQgemlwZmlsZSwgdGFyZmlsZSwgb3MsIHNodXRpbAorZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBlbnN1cmVfZGlyZWN0b3J5Citmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCisKK2NsYXNzIFVucmVjb2duaXplZEZvcm1hdChEaXN0dXRpbHNFcnJvcik6CisgICAgIiIiQ291bGRuJ3QgcmVjb2duaXplIHRoZSBhcmNoaXZlIHR5cGUiIiIKKworZGVmIGRlZmF1bHRfZmlsdGVyKHNyYyxkc3QpOgorICAgICIiIlRoZSBkZWZhdWx0IHByb2dyZXNzL2ZpbHRlciBjYWxsYmFjazsgcmV0dXJucyBUcnVlIGZvciBhbGwgZmlsZXMiIiIKKyAgICByZXR1cm4gZHN0CisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworZGVmIHVucGFja19hcmNoaXZlKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyPWRlZmF1bHRfZmlsdGVyLAorICAgIGRyaXZlcnM9Tm9uZQorKToKKyAgICAiIiJVbnBhY2sgYGZpbGVuYW1lYCB0byBgZXh0cmFjdF9kaXJgLCBvciByYWlzZSBgYFVucmVjb2duaXplZEZvcm1hdGBgCisKKyAgICBgcHJvZ3Jlc3NfZmlsdGVyYCBpcyBhIGZ1bmN0aW9uIHRha2luZyB0d28gYXJndW1lbnRzOiBhIHNvdXJjZSBwYXRoCisgICAgaW50ZXJuYWwgdG8gdGhlIGFyY2hpdmUgKCcvJy1zZXBhcmF0ZWQpLCBhbmQgYSBmaWxlc3lzdGVtIHBhdGggd2hlcmUgaXQKKyAgICB3aWxsIGJlIGV4dHJhY3RlZC4gIFRoZSBjYWxsYmFjayBtdXN0IHJldHVybiB0aGUgZGVzaXJlZCBleHRyYWN0IHBhdGgKKyAgICAod2hpY2ggbWF5IGJlIHRoZSBzYW1lIGFzIHRoZSBvbmUgcGFzc2VkIGluKSwgb3IgZWxzZSBgYE5vbmVgYCB0byBza2lwCisgICAgdGhhdCBmaWxlIG9yIGRpcmVjdG9yeS4gIFRoZSBjYWxsYmFjayBjYW4gdGh1cyBiZSB1c2VkIHRvIHJlcG9ydCBvbiB0aGUKKyAgICBwcm9ncmVzcyBvZiB0aGUgZXh0cmFjdGlvbiwgYXMgd2VsbCBhcyB0byBmaWx0ZXIgdGhlIGl0ZW1zIGV4dHJhY3RlZCBvcgorICAgIGFsdGVyIHRoZWlyIGV4dHJhY3Rpb24gcGF0aHMuCisKKyAgICBgZHJpdmVyc2AsIGlmIHN1cHBsaWVkLCBtdXN0IGJlIGEgbm9uLWVtcHR5IHNlcXVlbmNlIG9mIGZ1bmN0aW9ucyB3aXRoIHRoZQorICAgIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgZnVuY3Rpb24gKG1pbnVzIHRoZSBgZHJpdmVyc2AgYXJndW1lbnQpLCB0aGF0IHJhaXNlCisgICAgYGBVbnJlY29nbml6ZWRGb3JtYXRgYCBpZiB0aGV5IGRvIG5vdCBzdXBwb3J0IGV4dHJhY3RpbmcgdGhlIGRlc2lnbmF0ZWQKKyAgICBhcmNoaXZlIHR5cGUuICBUaGUgYGRyaXZlcnNgIGFyZSB0cmllZCBpbiBzZXF1ZW5jZSB1bnRpbCBvbmUgaXMgZm91bmQgdGhhdAorICAgIGRvZXMgbm90IHJhaXNlIGFuIGVycm9yLCBvciB1bnRpbCBhbGwgYXJlIGV4aGF1c3RlZCAoaW4gd2hpY2ggY2FzZQorICAgIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaXMgcmFpc2VkKS4gIElmIHlvdSBkbyBub3Qgc3VwcGx5IGEgc2VxdWVuY2Ugb2YKKyAgICBkcml2ZXJzLCB0aGUgbW9kdWxlJ3MgYGBleHRyYWN0aW9uX2RyaXZlcnNgYCBjb25zdGFudCB3aWxsIGJlIHVzZWQsIHdoaWNoCisgICAgbWVhbnMgdGhhdCBgYHVucGFja196aXBmaWxlYGAgYW5kIGBgdW5wYWNrX3RhcmZpbGVgYCB3aWxsIGJlIHRyaWVkLCBpbiB0aGF0CisgICAgb3JkZXIuCisgICAgIiIiCisgICAgZm9yIGRyaXZlciBpbiBkcml2ZXJzIG9yIGV4dHJhY3Rpb25fZHJpdmVyczoKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZHJpdmVyKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyKQorICAgICAgICBleGNlcHQgVW5yZWNvZ25pemVkRm9ybWF0OgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybgorICAgIGVsc2U6CisgICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgKKyAgICAgICAgICAgICJOb3QgYSByZWNvZ25pemVkIGFyY2hpdmUgdHlwZTogJXMiICUgZmlsZW5hbWUKKyAgICAgICAgKQorCisKKworCisKKworCitkZWYgdW5wYWNrX2RpcmVjdG9yeShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlcik6CisgICAgIiIiIlVucGFjayIgYSBkaXJlY3RvcnksIHVzaW5nIHRoZSBzYW1lIGludGVyZmFjZSBhcyBmb3IgYXJjaGl2ZXMKKworICAgIFJhaXNlcyBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIGBmaWxlbmFtZWAgaXMgbm90IGEgZGlyZWN0b3J5CisgICAgIiIiCisgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpOgorICAgICAgICByYWlzZSBVbnJlY29nbml6ZWRGb3JtYXQoIiVzIGlzIG5vdCBhIGRpcmVjdG9yeSIgJSAoZmlsZW5hbWUsKSkKKworICAgIHBhdGhzID0ge2ZpbGVuYW1lOignJyxleHRyYWN0X2Rpcil9CisgICAgZm9yIGJhc2UsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoZmlsZW5hbWUpOgorICAgICAgICBzcmMsZHN0ID0gcGF0aHNbYmFzZV0KKyAgICAgICAgZm9yIGQgaW4gZGlyczoKKyAgICAgICAgICAgIHBhdGhzW29zLnBhdGguam9pbihiYXNlLGQpXSA9IHNyYytkKycvJywgb3MucGF0aC5qb2luKGRzdCxkKQorICAgICAgICBmb3IgZiBpbiBmaWxlczoKKyAgICAgICAgICAgIG5hbWUgPSBzcmMrZgorICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKGRzdCxmKQorICAgICAgICAgICAgdGFyZ2V0ID0gcHJvZ3Jlc3NfZmlsdGVyKHNyYytmLCB0YXJnZXQpCisgICAgICAgICAgICBpZiBub3QgdGFyZ2V0OgorICAgICAgICAgICAgICAgIGNvbnRpbnVlICAgICMgc2tpcCBub24tZmlsZXMKKyAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQorICAgICAgICAgICAgZiA9IG9zLnBhdGguam9pbihiYXNlLGYpCisgICAgICAgICAgICBzaHV0aWwuY29weWZpbGUoZiwgdGFyZ2V0KQorICAgICAgICAgICAgc2h1dGlsLmNvcHlzdGF0KGYsIHRhcmdldCkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2RlZiB1bnBhY2tfemlwZmlsZShmaWxlbmFtZSwgZXh0cmFjdF9kaXIsIHByb2dyZXNzX2ZpbHRlcj1kZWZhdWx0X2ZpbHRlcik6CisgICAgIiIiVW5wYWNrIHppcCBgZmlsZW5hbWVgIHRvIGBleHRyYWN0X2RpcmAKKworICAgIFJhaXNlcyBgYFVucmVjb2duaXplZEZvcm1hdGBgIGlmIGBmaWxlbmFtZWAgaXMgbm90IGEgemlwZmlsZSAoYXMgZGV0ZXJtaW5lZAorICAgIGJ5IGBgemlwZmlsZS5pc196aXBmaWxlKClgYCkuICBTZWUgYGB1bnBhY2tfYXJjaGl2ZSgpYGAgZm9yIGFuIGV4cGxhbmF0aW9uCisgICAgb2YgdGhlIGBwcm9ncmVzc19maWx0ZXJgIGFyZ3VtZW50LgorICAgICIiIgorCisgICAgaWYgbm90IHppcGZpbGUuaXNfemlwZmlsZShmaWxlbmFtZSk6CisgICAgICAgIHJhaXNlIFVucmVjb2duaXplZEZvcm1hdCgiJXMgaXMgbm90IGEgemlwIGZpbGUiICUgKGZpbGVuYW1lLCkpCisKKyAgICB6ID0gemlwZmlsZS5aaXBGaWxlKGZpbGVuYW1lKQorICAgIHRyeToKKyAgICAgICAgZm9yIGluZm8gaW4gei5pbmZvbGlzdCgpOgorICAgICAgICAgICAgbmFtZSA9IGluZm8uZmlsZW5hbWUKKworICAgICAgICAgICAgIyBkb24ndCBleHRyYWN0IGFic29sdXRlIHBhdGhzIG9yIG9uZXMgd2l0aCAuLiBpbiB0aGVtCisgICAgICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJy8nKSBvciAnLi4nIGluIG5hbWU6CisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKGV4dHJhY3RfZGlyLCAqbmFtZS5zcGxpdCgnLycpKQorICAgICAgICAgICAgdGFyZ2V0ID0gcHJvZ3Jlc3NfZmlsdGVyKG5hbWUsIHRhcmdldCkKKyAgICAgICAgICAgIGlmIG5vdCB0YXJnZXQ6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy8nKToKKyAgICAgICAgICAgICAgICAjIGRpcmVjdG9yeQorICAgICAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGZpbGUKKyAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHRhcmdldCkKKyAgICAgICAgICAgICAgICBkYXRhID0gei5yZWFkKGluZm8uZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgZiA9IG9wZW4odGFyZ2V0LCd3YicpCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBmLndyaXRlKGRhdGEpCisgICAgICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgIGRlbCBkYXRhCisgICAgZmluYWxseToKKyAgICAgICAgei5jbG9zZSgpCisKKworZGVmIHVucGFja190YXJmaWxlKGZpbGVuYW1lLCBleHRyYWN0X2RpciwgcHJvZ3Jlc3NfZmlsdGVyPWRlZmF1bHRfZmlsdGVyKToKKyAgICAiIiJVbnBhY2sgdGFyL3Rhci5nei90YXIuYnoyIGBmaWxlbmFtZWAgdG8gYGV4dHJhY3RfZGlyYAorCisgICAgUmFpc2VzIGBgVW5yZWNvZ25pemVkRm9ybWF0YGAgaWYgYGZpbGVuYW1lYCBpcyBub3QgYSB0YXJmaWxlIChhcyBkZXRlcm1pbmVkCisgICAgYnkgYGB0YXJmaWxlLm9wZW4oKWBgKS4gIFNlZSBgYHVucGFja19hcmNoaXZlKClgYCBmb3IgYW4gZXhwbGFuYXRpb24KKyAgICBvZiB0aGUgYHByb2dyZXNzX2ZpbHRlcmAgYXJndW1lbnQuCisgICAgIiIiCisKKyAgICB0cnk6CisgICAgICAgIHRhcm9iaiA9IHRhcmZpbGUub3BlbihmaWxlbmFtZSkKKyAgICBleGNlcHQgdGFyZmlsZS5UYXJFcnJvcjoKKyAgICAgICAgcmFpc2UgVW5yZWNvZ25pemVkRm9ybWF0KAorICAgICAgICAgICAgIiVzIGlzIG5vdCBhIGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkIHRhciBmaWxlIiAlIChmaWxlbmFtZSwpCisgICAgICAgICkKKworICAgIHRyeToKKyAgICAgICAgdGFyb2JqLmNob3duID0gbGFtYmRhICphcmdzOiBOb25lICAgIyBkb24ndCBkbyBhbnkgY2hvd25pbmchCisgICAgICAgIGZvciBtZW1iZXIgaW4gdGFyb2JqOgorICAgICAgICAgICAgaWYgbWVtYmVyLmlzZmlsZSgpIG9yIG1lbWJlci5pc2RpcigpOgorICAgICAgICAgICAgICAgIG5hbWUgPSBtZW1iZXIubmFtZQorICAgICAgICAgICAgICAgICMgZG9uJ3QgZXh0cmFjdCBhYnNvbHV0ZSBwYXRocyBvciBvbmVzIHdpdGggLi4gaW4gdGhlbQorICAgICAgICAgICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJy8nKSBhbmQgJy4uJyBub3QgaW4gbmFtZToKKyAgICAgICAgICAgICAgICAgICAgZHN0ID0gb3MucGF0aC5qb2luKGV4dHJhY3RfZGlyLCAqbmFtZS5zcGxpdCgnLycpKQorICAgICAgICAgICAgICAgICAgICBkc3QgPSBwcm9ncmVzc19maWx0ZXIobmFtZSwgZHN0KQorICAgICAgICAgICAgICAgICAgICBpZiBkc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICBpZiBkc3QuZW5kc3dpdGgob3Muc2VwKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QgPSBkc3RbOi0xXQorICAgICAgICAgICAgICAgICAgICAgICAgdGFyb2JqLl9leHRyYWN0X21lbWJlcihtZW1iZXIsZHN0KSAgIyBYWFggVWdoCisgICAgICAgIHJldHVybiBUcnVlCisgICAgZmluYWxseToKKyAgICAgICAgdGFyb2JqLmNsb3NlKCkKKworCisKKworZXh0cmFjdGlvbl9kcml2ZXJzID0gdW5wYWNrX2RpcmVjdG9yeSwgdW5wYWNrX3ppcGZpbGUsIHVucGFja190YXJmaWxlCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9jbGkuZXhlIGIvTGliL3NldHVwdG9vbHMvY2xpLmV4ZQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYzgzMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY2xpLmV4ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL19faW5pdF9fLnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9fX2luaXRfXy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmY1M2U3Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9fX2luaXRfXy5weQpAQCAtMCwwICsxLDE5IEBACitfX2FsbF9fID0gWworICAgICdhbGlhcycsICdiZGlzdF9lZ2cnLCAnYmRpc3RfcnBtJywgJ2J1aWxkX2V4dCcsICdidWlsZF9weScsICdkZXZlbG9wJywKKyAgICAnZWFzeV9pbnN0YWxsJywgJ2VnZ19pbmZvJywgJ2luc3RhbGwnLCAnaW5zdGFsbF9saWInLCAncm90YXRlJywgJ3NhdmVvcHRzJywKKyAgICAnc2Rpc3QnLCAnc2V0b3B0JywgJ3Rlc3QnLCAndXBsb2FkJywgJ2luc3RhbGxfZWdnX2luZm8nLCAnaW5zdGFsbF9zY3JpcHRzJywKK10KKworaW1wb3J0IHN5cworaWYgc3lzLnZlcnNpb24+PScyLjUnOgorICAgICMgSW4gUHl0aG9uIDIuNSBhbmQgYWJvdmUsIGRpc3R1dGlscyBpbmNsdWRlcyBpdHMgb3duIHVwbG9hZCBjb21tYW5kCisgICAgX19hbGxfXy5yZW1vdmUoJ3VwbG9hZCcpCisKKworZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5iZGlzdCBpbXBvcnQgYmRpc3QKKworaWYgJ2VnZycgbm90IGluIGJkaXN0LmZvcm1hdF9jb21tYW5kczoKKyAgICBiZGlzdC5mb3JtYXRfY29tbWFuZFsnZWdnJ10gPSAoJ2JkaXN0X2VnZycsICJQeXRob24gLmVnZyBmaWxlIikKKyAgICBiZGlzdC5mb3JtYXRfY29tbWFuZHMuYXBwZW5kKCdlZ2cnKQorCitkZWwgYmRpc3QsIHN5cwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9hbGlhcy5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYWxpYXMucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWRmNDc0YQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYWxpYXMucHkKQEAgLTAsMCArMSw3OSBAQAoraW1wb3J0IGRpc3R1dGlscywgb3MKK2Zyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0ICoKK2Zyb20gc2V0dXB0b29scy5jb21tYW5kLnNldG9wdCBpbXBvcnQgZWRpdF9jb25maWcsIG9wdGlvbl9iYXNlLCBjb25maWdfZmlsZQorCitkZWYgc2hxdW90ZShhcmcpOgorICAgICIiIlF1b3RlIGFuIGFyZ3VtZW50IGZvciBsYXRlciBwYXJzaW5nIGJ5IHNobGV4LnNwbGl0KCkiIiIKKyAgICBmb3IgYyBpbiAnIicsICInIiwgIlxcIiwgIiMiOgorICAgICAgICBpZiBjIGluIGFyZzogcmV0dXJuIHJlcHIoYXJnKQorICAgIGlmIGFyZy5zcGxpdCgpPD5bYXJnXToKKyAgICAgICAgcmV0dXJuIHJlcHIoYXJnKQorICAgIHJldHVybiBhcmcKKworCitjbGFzcyBhbGlhcyhvcHRpb25fYmFzZSk6CisgICAgIiIiRGVmaW5lIGEgc2hvcnRjdXQgdGhhdCBpbnZva2VzIG9uZSBvciBtb3JlIGNvbW1hbmRzIiIiCisKKyAgICBkZXNjcmlwdGlvbiA9ICJkZWZpbmUgYSBzaG9ydGN1dCB0byBpbnZva2Ugb25lIG9yIG1vcmUgY29tbWFuZHMiCisgICAgY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMgPSBUcnVlCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgncmVtb3ZlJywgICAncicsICdyZW1vdmUgKHVuc2V0KSB0aGUgYWxpYXMnKSwKKyAgICBdICsgb3B0aW9uX2Jhc2UudXNlcl9vcHRpb25zCisKKyAgICBib29sZWFuX29wdGlvbnMgPSBvcHRpb25fYmFzZS5ib29sZWFuX29wdGlvbnMgKyBbJ3JlbW92ZSddCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBvcHRpb25fYmFzZS5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgc2VsZi5hcmdzID0gTm9uZQorICAgICAgICBzZWxmLnJlbW92ZSA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBvcHRpb25fYmFzZS5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIGlmIHNlbGYucmVtb3ZlIGFuZCBsZW4oc2VsZi5hcmdzKTw+MToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKAorICAgICAgICAgICAgICAgICJNdXN0IHNwZWNpZnkgZXhhY3RseSBvbmUgYXJndW1lbnQgKHRoZSBhbGlhcyBuYW1lKSB3aGVuICIKKyAgICAgICAgICAgICAgICAidXNpbmcgLS1yZW1vdmUiCisgICAgICAgICAgICApCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBhbGlhc2VzID0gc2VsZi5kaXN0cmlidXRpb24uZ2V0X29wdGlvbl9kaWN0KCdhbGlhc2VzJykKKworICAgICAgICBpZiBub3Qgc2VsZi5hcmdzOgorICAgICAgICAgICAgcHJpbnQgIkNvbW1hbmQgQWxpYXNlcyIKKyAgICAgICAgICAgIHByaW50ICItLS0tLS0tLS0tLS0tLS0iCisgICAgICAgICAgICBmb3IgYWxpYXMgaW4gYWxpYXNlczoKKyAgICAgICAgICAgICAgICBwcmludCAic2V0dXAucHkgYWxpYXMiLCBmb3JtYXRfYWxpYXMoYWxpYXMsIGFsaWFzZXMpCisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBlbGlmIGxlbihzZWxmLmFyZ3MpPT0xOgorICAgICAgICAgICAgYWxpYXMsID0gc2VsZi5hcmdzCisgICAgICAgICAgICBpZiBzZWxmLnJlbW92ZToKKyAgICAgICAgICAgICAgICBjb21tYW5kID0gTm9uZQorICAgICAgICAgICAgZWxpZiBhbGlhcyBpbiBhbGlhc2VzOgorICAgICAgICAgICAgICAgIHByaW50ICJzZXR1cC5weSBhbGlhcyIsIGZvcm1hdF9hbGlhcyhhbGlhcywgYWxpYXNlcykKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgIk5vIGFsaWFzIGRlZmluaXRpb24gZm91bmQgZm9yICVyIiAlIGFsaWFzCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBhbGlhcyA9IHNlbGYuYXJnc1swXQorICAgICAgICAgICAgY29tbWFuZCA9ICcgJy5qb2luKG1hcChzaHF1b3RlLHNlbGYuYXJnc1sxOl0pKQorCisgICAgICAgIGVkaXRfY29uZmlnKHNlbGYuZmlsZW5hbWUsIHsnYWxpYXNlcyc6IHthbGlhczpjb21tYW5kfX0sIHNlbGYuZHJ5X3J1bikKKworCitkZWYgZm9ybWF0X2FsaWFzKG5hbWUsIGFsaWFzZXMpOgorICAgIHNvdXJjZSwgY29tbWFuZCA9IGFsaWFzZXNbbmFtZV0KKyAgICBpZiBzb3VyY2UgPT0gY29uZmlnX2ZpbGUoJ2dsb2JhbCcpOgorICAgICAgICBzb3VyY2UgPSAnLS1nbG9iYWwtY29uZmlnICcKKyAgICBlbGlmIHNvdXJjZSA9PSBjb25maWdfZmlsZSgndXNlcicpOgorICAgICAgICBzb3VyY2UgPSAnLS11c2VyLWNvbmZpZyAnCisgICAgZWxpZiBzb3VyY2UgPT0gY29uZmlnX2ZpbGUoJ2xvY2FsJyk6CisgICAgICAgIHNvdXJjZSA9ICcnCisgICAgZWxzZToKKyAgICAgICAgc291cmNlID0gJy0tZmlsZW5hbWU9JXInICUgc291cmNlCisgICAgcmV0dXJuIHNvdXJjZStuYW1lKycgJytjb21tYW5kCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X2VnZy5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfZWdnLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxN2Q4OGQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X2VnZy5weQpAQCAtMCwwICsxLDQ0OSBAQAorIiIic2V0dXB0b29scy5jb21tYW5kLmJkaXN0X2VnZworCitCdWlsZCAuZWdnIGRpc3RyaWJ1dGlvbnMiIiIKKworIyBUaGlzIG1vZHVsZSBzaG91bGQgYmUga2VwdCBjb21wYXRpYmxlIHdpdGggUHl0aG9uIDIuMworaW1wb3J0IHN5cywgb3MsIG1hcnNoYWwKK2Zyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMuZGlyX3V0aWwgaW1wb3J0IHJlbW92ZV90cmVlLCBta3BhdGgKK2Zyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgZ2V0X3B5dGhvbl92ZXJzaW9uLCBnZXRfcHl0aG9uX2xpYgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBnZXRfYnVpbGRfcGxhdGZvcm0sIERpc3RyaWJ1dGlvbgorZnJvbSB0eXBlcyBpbXBvcnQgQ29kZVR5cGUKK2Zyb20gc2V0dXB0b29scy5leHRlbnNpb24gaW1wb3J0IExpYnJhcnkKKworZGVmIHdyaXRlX3N0dWIocmVzb3VyY2UsIHB5ZmlsZSk6CisgICAgZiA9IG9wZW4ocHlmaWxlLCd3JykKKyAgICBmLndyaXRlKCdcbicuam9pbihbCisgICAgICAgICJkZWYgX19ib290c3RyYXBfXygpOiIsCisgICAgICAgICIgICBnbG9iYWwgX19ib290c3RyYXBfXywgX19sb2FkZXJfXywgX19maWxlX18iLAorICAgICAgICAiICAgaW1wb3J0IHN5cywgcGtnX3Jlc291cmNlcywgaW1wIiwKKyAgICAgICAgIiAgIF9fZmlsZV9fID0gcGtnX3Jlc291cmNlcy5yZXNvdXJjZV9maWxlbmFtZShfX25hbWVfXywlcikiCisgICAgICAgICAgICAlIHJlc291cmNlLAorICAgICAgICAiICAgZGVsIF9fYm9vdHN0cmFwX18sIF9fbG9hZGVyX18iLAorICAgICAgICAiICAgaW1wLmxvYWRfZHluYW1pYyhfX25hbWVfXyxfX2ZpbGVfXykiLAorICAgICAgICAiX19ib290c3RyYXBfXygpIiwKKyAgICAgICAgIiIgIyB0ZXJtaW5hbCBcbgorICAgIF0pKQorICAgIGYuY2xvc2UoKQorCisjIHN0dWIgX19pbml0X18ucHkgZm9yIHBhY2thZ2VzIGRpc3RyaWJ1dGVkIHdpdGhvdXQgb25lCitOU19QS0dfU1RVQiA9ICdfX2ltcG9ydF9fKCJwa2dfcmVzb3VyY2VzIikuZGVjbGFyZV9uYW1lc3BhY2UoX19uYW1lX18pJworCisKKworCisKKworCisKKworCitjbGFzcyBiZGlzdF9lZ2coQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICJjcmVhdGUgYW4gXCJlZ2dcIiBkaXN0cmlidXRpb24iCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnYmRpc3QtZGlyPScsICdiJywKKyAgICAgICAgICAgICJ0ZW1wb3JhcnkgZGlyZWN0b3J5IGZvciBjcmVhdGluZyB0aGUgZGlzdHJpYnV0aW9uIiksCisgICAgICAgICgncGxhdC1uYW1lPScsICdwJywKKyAgICAgICAgICAgICAgICAgICAgICJwbGF0Zm9ybSBuYW1lIHRvIGVtYmVkIGluIGdlbmVyYXRlZCBmaWxlbmFtZXMgIgorICAgICAgICAgICAgICAgICAgICAgIihkZWZhdWx0OiAlcykiICUgZ2V0X2J1aWxkX3BsYXRmb3JtKCkpLAorICAgICAgICAoJ2V4Y2x1ZGUtc291cmNlLWZpbGVzJywgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICJyZW1vdmUgYWxsIC5weSBmaWxlcyBmcm9tIHRoZSBnZW5lcmF0ZWQgZWdnIiksCisgICAgICAgICgna2VlcC10ZW1wJywgJ2snLAorICAgICAgICAgICAgICAgICAgICAgImtlZXAgdGhlIHBzZXVkby1pbnN0YWxsYXRpb24gdHJlZSBhcm91bmQgYWZ0ZXIgIiArCisgICAgICAgICAgICAgICAgICAgICAiY3JlYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlIiksCisgICAgICAgICgnZGlzdC1kaXI9JywgJ2QnLAorICAgICAgICAgICAgICAgICAgICAgImRpcmVjdG9yeSB0byBwdXQgZmluYWwgYnVpbHQgZGlzdHJpYnV0aW9ucyBpbiIpLAorICAgICAgICAoJ3NraXAtYnVpbGQnLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgInNraXAgcmVidWlsZGluZyBldmVyeXRoaW5nIChmb3IgdGVzdGluZy9kZWJ1Z2dpbmcpIiksCisgICAgXQorCisgICAgYm9vbGVhbl9vcHRpb25zID0gWworICAgICAgICAna2VlcC10ZW1wJywgJ3NraXAtYnVpbGQnLCAnZXhjbHVkZS1zb3VyY2UtZmlsZXMnCisgICAgXQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zIChzZWxmKToKKyAgICAgICAgc2VsZi5iZGlzdF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYucGxhdF9uYW1lID0gTm9uZQorICAgICAgICBzZWxmLmtlZXBfdGVtcCA9IDAKKyAgICAgICAgc2VsZi5kaXN0X2RpciA9IE5vbmUKKyAgICAgICAgc2VsZi5za2lwX2J1aWxkID0gMAorICAgICAgICBzZWxmLmVnZ19vdXRwdXQgPSBOb25lCisgICAgICAgIHNlbGYuZXhjbHVkZV9zb3VyY2VfZmlsZXMgPSBOb25lCisKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQorICAgICAgICBzZWxmLmVnZ19pbmZvID0gZWlfY21kLmVnZ19pbmZvCisKKyAgICAgICAgaWYgc2VsZi5iZGlzdF9kaXIgaXMgTm9uZToKKyAgICAgICAgICAgIGJkaXN0X2Jhc2UgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYmRpc3QnKS5iZGlzdF9iYXNlCisgICAgICAgICAgICBzZWxmLmJkaXN0X2RpciA9IG9zLnBhdGguam9pbihiZGlzdF9iYXNlLCAnZWdnJykKKworICAgICAgICBpZiBzZWxmLnBsYXRfbmFtZSBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5wbGF0X25hbWUgPSBnZXRfYnVpbGRfcGxhdGZvcm0oKQorCisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdiZGlzdCcsKCdkaXN0X2RpcicsICdkaXN0X2RpcicpKQorCisgICAgICAgIGlmIHNlbGYuZWdnX291dHB1dCBpcyBOb25lOgorCisgICAgICAgICAgICAjIENvbXB1dGUgZmlsZW5hbWUgb2YgdGhlIG91dHB1dCBlZ2cKKyAgICAgICAgICAgIGJhc2VuYW1lID0gRGlzdHJpYnV0aW9uKAorICAgICAgICAgICAgICAgIE5vbmUsIE5vbmUsIGVpX2NtZC5lZ2dfbmFtZSwgZWlfY21kLmVnZ192ZXJzaW9uLAorICAgICAgICAgICAgICAgIGdldF9weXRob25fdmVyc2lvbigpLAorICAgICAgICAgICAgICAgIHNlbGYuZGlzdHJpYnV0aW9uLmhhc19leHRfbW9kdWxlcygpIGFuZCBzZWxmLnBsYXRfbmFtZQorICAgICAgICAgICAgKS5lZ2dfbmFtZSgpCisKKyAgICAgICAgICAgIHNlbGYuZWdnX291dHB1dCA9IG9zLnBhdGguam9pbihzZWxmLmRpc3RfZGlyLCBiYXNlbmFtZSsnLmVnZycpCisKKworCisKKworCisKKworICAgIGRlZiBkb19pbnN0YWxsX2RhdGEoc2VsZik6CisgICAgICAgICMgSGFjayBmb3IgcGFja2FnZXMgdGhhdCBpbnN0YWxsIGRhdGEgdG8gaW5zdGFsbCdzIC0taW5zdGFsbC1saWIKKyAgICAgICAgc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGwnKS5pbnN0YWxsX2xpYiA9IHNlbGYuYmRpc3RfZGlyCisKKyAgICAgICAgc2l0ZV9wYWNrYWdlcyA9IG9zLnBhdGgubm9ybWNhc2Uob3MucGF0aC5yZWFscGF0aChnZXRfcHl0aG9uX2xpYigpKSkKKyAgICAgICAgb2xkLCBzZWxmLmRpc3RyaWJ1dGlvbi5kYXRhX2ZpbGVzID0gc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcyxbXQorCisgICAgICAgIGZvciBpdGVtIGluIG9sZDoKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoaXRlbSx0dXBsZSkgYW5kIGxlbihpdGVtKT09MjoKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzYWJzKGl0ZW1bMF0pOgorICAgICAgICAgICAgICAgICAgICByZWFscGF0aCA9IG9zLnBhdGgucmVhbHBhdGgoaXRlbVswXSkKKyAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZCA9IG9zLnBhdGgubm9ybWNhc2UocmVhbHBhdGgpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vcm1hbGl6ZWQ9PXNpdGVfcGFja2FnZXMgb3Igbm9ybWFsaXplZC5zdGFydHN3aXRoKAorICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZV9wYWNrYWdlcytvcy5zZXAKKyAgICAgICAgICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSByZWFscGF0aFtsZW4oc2l0ZV9wYWNrYWdlcykrMTpdLCBpdGVtWzFdCisgICAgICAgICAgICAgICAgICAgICMgWFhYIGVsc2U6IHJhaXNlID8/PworICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcy5hcHBlbmQoaXRlbSkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyBwYWNrYWdlIGRhdGEgdG8gJXMiICUgc2VsZi5iZGlzdF9kaXIpCisgICAgICAgICAgICBzZWxmLmNhbGxfY29tbWFuZCgnaW5zdGFsbF9kYXRhJywgZm9yY2U9MCwgcm9vdD1Ob25lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZGF0YV9maWxlcyA9IG9sZAorCisKKyAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CisgICAgICAgIHJldHVybiBbc2VsZi5lZ2dfb3V0cHV0XQorCisKKyAgICBkZWYgY2FsbF9jb21tYW5kKHNlbGYsY21kbmFtZSwqKmt3KToKKyAgICAgICAgIiIiSW52b2tlIHJlaW5pdGlhbGl6ZWQgY29tbWFuZCBgY21kbmFtZWAgd2l0aCBrZXl3b3JkIGFyZ3MiIiIKKyAgICAgICAgZm9yIGRpcm5hbWUgaW4gSU5TVEFMTF9ESVJFQ1RPUllfQVRUUlM6CisgICAgICAgICAgICBrdy5zZXRkZWZhdWx0KGRpcm5hbWUsc2VsZi5iZGlzdF9kaXIpCisgICAgICAgIGt3LnNldGRlZmF1bHQoJ3NraXBfYnVpbGQnLHNlbGYuc2tpcF9idWlsZCkKKyAgICAgICAga3cuc2V0ZGVmYXVsdCgnZHJ5X3J1bicsIHNlbGYuZHJ5X3J1bikKKyAgICAgICAgY21kID0gc2VsZi5yZWluaXRpYWxpemVfY29tbWFuZChjbWRuYW1lLCAqKmt3KQorICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKGNtZG5hbWUpCisgICAgICAgIHJldHVybiBjbWQKKworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIyBHZW5lcmF0ZSBtZXRhZGF0YSBmaXJzdAorICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCJlZ2dfaW5mbyIpCisKKyAgICAgICAgIyBXZSBydW4gaW5zdGFsbF9saWIgYmVmb3JlIGluc3RhbGxfZGF0YSwgYmVjYXVzZSBzb21lIGRhdGEgaGFja3MKKyAgICAgICAgIyBwdWxsIHRoZWlyIGRhdGEgcGF0aCBmcm9tIHRoZSBpbnN0YWxsX2xpYiBjb21tYW5kLgorICAgICAgICBsb2cuaW5mbygiaW5zdGFsbGluZyBsaWJyYXJ5IGNvZGUgdG8gJXMiICUgc2VsZi5iZGlzdF9kaXIpCisgICAgICAgIGluc3RjbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnaW5zdGFsbCcpCisgICAgICAgIG9sZF9yb290ID0gaW5zdGNtZC5yb290OyBpbnN0Y21kLnJvb3QgPSBOb25lCisgICAgICAgIGNtZCA9IHNlbGYuY2FsbF9jb21tYW5kKCdpbnN0YWxsX2xpYicsIHdhcm5fZGlyPTApCisgICAgICAgIGluc3RjbWQucm9vdCA9IG9sZF9yb290CisKKyAgICAgICAgYWxsX291dHB1dHMsIGV4dF9vdXRwdXRzID0gc2VsZi5nZXRfZXh0X291dHB1dHMoKQorICAgICAgICBzZWxmLnN0dWJzID0gW10KKyAgICAgICAgdG9fY29tcGlsZSA9IFtdCisgICAgICAgIGZvciAocCxleHRfbmFtZSkgaW4gZW51bWVyYXRlKGV4dF9vdXRwdXRzKToKKyAgICAgICAgICAgIGZpbGVuYW1lLGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZXh0X25hbWUpCisgICAgICAgICAgICBweWZpbGUgPSBvcy5wYXRoLmpvaW4oc2VsZi5iZGlzdF9kaXIsIGZpbGVuYW1lICsgJy5weScpCisgICAgICAgICAgICBzZWxmLnN0dWJzLmFwcGVuZChweWZpbGUpCisgICAgICAgICAgICBsb2cuaW5mbygiY3JlYXRpbmcgc3R1YiBsb2FkZXIgZm9yICVzIiAlIGV4dF9uYW1lKQorICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICB3cml0ZV9zdHViKG9zLnBhdGguYmFzZW5hbWUoZXh0X25hbWUpLCBweWZpbGUpCisgICAgICAgICAgICB0b19jb21waWxlLmFwcGVuZChweWZpbGUpCisgICAgICAgICAgICBleHRfb3V0cHV0c1twXSA9IGV4dF9uYW1lLnJlcGxhY2Uob3Muc2VwLCcvJykKKworICAgICAgICB0b19jb21waWxlLmV4dGVuZChzZWxmLm1ha2VfaW5pdF9maWxlcygpKQorICAgICAgICBpZiB0b19jb21waWxlOgorICAgICAgICAgICAgY21kLmJ5dGVfY29tcGlsZSh0b19jb21waWxlKQorCisgICAgICAgIGlmIHNlbGYuZGlzdHJpYnV0aW9uLmRhdGFfZmlsZXM6CisgICAgICAgICAgICBzZWxmLmRvX2luc3RhbGxfZGF0YSgpCisKKyAgICAgICAgIyBNYWtlIHRoZSBFR0ctSU5GTyBkaXJlY3RvcnkKKyAgICAgICAgYXJjaGl2ZV9yb290ID0gc2VsZi5iZGlzdF9kaXIKKyAgICAgICAgZWdnX2luZm8gPSBvcy5wYXRoLmpvaW4oYXJjaGl2ZV9yb290LCdFR0ctSU5GTycpCisgICAgICAgIHNlbGYubWtwYXRoKGVnZ19pbmZvKQorICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgorICAgICAgICAgICAgc2NyaXB0X2RpciA9IG9zLnBhdGguam9pbihlZ2dfaW5mbywgJ3NjcmlwdHMnKQorICAgICAgICAgICAgbG9nLmluZm8oImluc3RhbGxpbmcgc2NyaXB0cyB0byAlcyIgJSBzY3JpcHRfZGlyKQorICAgICAgICAgICAgc2VsZi5jYWxsX2NvbW1hbmQoJ2luc3RhbGxfc2NyaXB0cycsaW5zdGFsbF9kaXI9c2NyaXB0X2Rpcixub19lcD0xKQorCisgICAgICAgIG5hdGl2ZV9saWJzID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sIm5hdGl2ZV9saWJzLnR4dCIpCisgICAgICAgIGlmIGFsbF9vdXRwdXRzOgorICAgICAgICAgICAgbG9nLmluZm8oIndyaXRpbmcgJXMiICUgbmF0aXZlX2xpYnMpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgIGxpYnNfZmlsZSA9IG9wZW4obmF0aXZlX2xpYnMsICd3dCcpCisgICAgICAgICAgICAgICAgbGlic19maWxlLndyaXRlKCdcbicuam9pbihhbGxfb3V0cHV0cykpCisgICAgICAgICAgICAgICAgbGlic19maWxlLndyaXRlKCdcbicpCisgICAgICAgICAgICAgICAgbGlic19maWxlLmNsb3NlKCkKKyAgICAgICAgZWxpZiBvcy5wYXRoLmlzZmlsZShuYXRpdmVfbGlicyk6CisgICAgICAgICAgICBsb2cuaW5mbygicmVtb3ZpbmcgJXMiICUgbmF0aXZlX2xpYnMpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhuYXRpdmVfbGlicykKKworICAgICAgICBmb3IgZmlsZW5hbWUgaW4gb3MubGlzdGRpcihzZWxmLmVnZ19pbmZvKToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5lZ2dfaW5mbyxmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgorICAgICAgICAgICAgICAgIHNlbGYuY29weV9maWxlKHBhdGgsb3MucGF0aC5qb2luKGVnZ19pbmZvLGZpbGVuYW1lKSkKKworICAgICAgICB3cml0ZV9zYWZldHlfZmxhZygKKyAgICAgICAgICAgIG9zLnBhdGguam9pbihhcmNoaXZlX3Jvb3QsJ0VHRy1JTkZPJyksIHNlbGYuemlwX3NhZmUoKQorICAgICAgICApCisKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sJ2RlcGVuZHMudHh0JykpOgorICAgICAgICAgICAgbG9nLndhcm4oCisgICAgICAgICAgICAgICAgIldBUk5JTkc6ICdkZXBlbmRzLnR4dCcgd2lsbCBub3QgYmUgdXNlZCBieSBzZXR1cHRvb2xzIDAuNiFcbiIKKyAgICAgICAgICAgICAgICAiVXNlIHRoZSBpbnN0YWxsX3JlcXVpcmVzL2V4dHJhc19yZXF1aXJlIHNldHVwKCkgYXJncyBpbnN0ZWFkLiIKKyAgICAgICAgICAgICkKKworICAgICAgICBpZiBzZWxmLmV4Y2x1ZGVfc291cmNlX2ZpbGVzOgorICAgICAgICAgICAgc2VsZi56YXBfcHlmaWxlcygpCisKKyAgICAgICAgIyBNYWtlIHRoZSBhcmNoaXZlCisgICAgICAgIG1ha2VfemlwZmlsZShzZWxmLmVnZ19vdXRwdXQsIGFyY2hpdmVfcm9vdCwgdmVyYm9zZT1zZWxmLnZlcmJvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGRyeV9ydW49c2VsZi5kcnlfcnVuKQorICAgICAgICBpZiBub3Qgc2VsZi5rZWVwX3RlbXA6CisgICAgICAgICAgICByZW1vdmVfdHJlZShzZWxmLmJkaXN0X2RpciwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisKKyAgICAgICAgIyBBZGQgdG8gJ0Rpc3RyaWJ1dGlvbi5kaXN0X2ZpbGVzJyBzbyB0aGF0IHRoZSAidXBsb2FkIiBjb21tYW5kIHdvcmtzCisgICAgICAgIGdldGF0dHIoc2VsZi5kaXN0cmlidXRpb24sJ2Rpc3RfZmlsZXMnLFtdKS5hcHBlbmQoCisgICAgICAgICAgICAoJ2JkaXN0X2VnZycsZ2V0X3B5dGhvbl92ZXJzaW9uKCksc2VsZi5lZ2dfb3V0cHV0KSkKKworICAgIGRlZiB6YXBfcHlmaWxlcyhzZWxmKToKKyAgICAgICAgbG9nLmluZm8oIlJlbW92aW5nIC5weSBmaWxlcyBmcm9tIHRlbXBvcmFyeSBkaXJlY3RvcnkiKQorICAgICAgICBmb3IgYmFzZSxkaXJzLGZpbGVzIGluIHdhbGtfZWdnKHNlbGYuYmRpc3RfZGlyKToKKyAgICAgICAgICAgIGZvciBuYW1lIGluIGZpbGVzOgorICAgICAgICAgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy5weScpOgorICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKGJhc2UsbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEZWxldGluZyAlcyIsIHBhdGgpCisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhwYXRoKQorCisgICAgZGVmIHppcF9zYWZlKHNlbGYpOgorICAgICAgICBzYWZlID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwnemlwX3NhZmUnLE5vbmUpCisgICAgICAgIGlmIHNhZmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gc2FmZQorICAgICAgICBsb2cud2FybigiemlwX3NhZmUgZmxhZyBub3Qgc2V0OyBhbmFseXppbmcgYXJjaGl2ZSBjb250ZW50cy4uLiIpCisgICAgICAgIHJldHVybiBhbmFseXplX2VnZyhzZWxmLmJkaXN0X2Rpciwgc2VsZi5zdHVicykKKworICAgIGRlZiBtYWtlX2luaXRfZmlsZXMoc2VsZik6CisgICAgICAgICIiIkNyZWF0ZSBtaXNzaW5nIHBhY2thZ2UgX19pbml0X18gZmlsZXMiIiIKKyAgICAgICAgaW5pdF9maWxlcyA9IFtdCisgICAgICAgIGZvciBiYXNlLGRpcnMsZmlsZXMgaW4gd2Fsa19lZ2coc2VsZi5iZGlzdF9kaXIpOgorICAgICAgICAgICAgaWYgYmFzZT09c2VsZi5iZGlzdF9kaXI6CisgICAgICAgICAgICAgICAgIyBkb24ndCBwdXQgYW4gX19pbml0X18gaW4gdGhlIHJvb3QKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgaWYgbmFtZS5lbmRzd2l0aCgnLnB5Jyk6CisgICAgICAgICAgICAgICAgICAgIGlmICdfX2luaXRfXy5weScgbm90IGluIGZpbGVzOgorICAgICAgICAgICAgICAgICAgICAgICAgcGtnID0gYmFzZVtsZW4oc2VsZi5iZGlzdF9kaXIpKzE6XS5yZXBsYWNlKG9zLnNlcCwnLicpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5oYXNfY29udGVudHNfZm9yKHBrZyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLndhcm4oIkNyZWF0aW5nIG1pc3NpbmcgX19pbml0X18ucHkgZm9yICVzIixwa2cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4oYmFzZSwnX19pbml0X18ucHknKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCd3Jyk7IGYud3JpdGUoTlNfUEtHX1NUVUIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfZmlsZXMuYXBwZW5kKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIG5vdCBhIHBhY2thZ2UsIGRvbid0IHRyYXZlcnNlIHRvIHN1YmRpcmVjdG9yaWVzCisgICAgICAgICAgICAgICAgZGlyc1s6XSA9IFtdCisKKyAgICAgICAgcmV0dXJuIGluaXRfZmlsZXMKKworICAgIGRlZiBnZXRfZXh0X291dHB1dHMoc2VsZik6CisgICAgICAgICIiIkdldCBhIGxpc3Qgb2YgcmVsYXRpdmUgcGF0aHMgdG8gQyBleHRlbnNpb25zIGluIHRoZSBvdXRwdXQgZGlzdHJvIiIiCisKKyAgICAgICAgYWxsX291dHB1dHMgPSBbXQorICAgICAgICBleHRfb3V0cHV0cyA9IFtdCisKKyAgICAgICAgcGF0aHMgPSB7c2VsZi5iZGlzdF9kaXI6Jyd9CisgICAgICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiBvcy53YWxrKHNlbGYuYmRpc3RfZGlyKToKKyAgICAgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlczoKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKVsxXS5sb3dlcigpIGluIE5BVElWRV9FWFRFTlNJT05TOgorICAgICAgICAgICAgICAgICAgICBhbGxfb3V0cHV0cy5hcHBlbmQocGF0aHNbYmFzZV0rZmlsZW5hbWUpCisgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZGlyczoKKyAgICAgICAgICAgICAgICBwYXRoc1tvcy5wYXRoLmpvaW4oYmFzZSxmaWxlbmFtZSldID0gcGF0aHNbYmFzZV0rZmlsZW5hbWUrJy8nCisKKyAgICAgICAgaWYgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCk6CisgICAgICAgICAgICBidWlsZF9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfZXh0JykKKyAgICAgICAgICAgIGZvciBleHQgaW4gYnVpbGRfY21kLmV4dGVuc2lvbnM6CisgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsTGlicmFyeSk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgZnVsbG5hbWUgPSBidWlsZF9jbWQuZ2V0X2V4dF9mdWxsbmFtZShleHQubmFtZSkKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IGJ1aWxkX2NtZC5nZXRfZXh0X2ZpbGVuYW1lKGZ1bGxuYW1lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKS5zdGFydHN3aXRoKCdkbC0nKToKKyAgICAgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKHNlbGYuYmRpc3RfZGlyLGZpbGVuYW1lKSk6CisgICAgICAgICAgICAgICAgICAgICAgICBleHRfb3V0cHV0cy5hcHBlbmQoZmlsZW5hbWUpCisKKyAgICAgICAgcmV0dXJuIGFsbF9vdXRwdXRzLCBleHRfb3V0cHV0cworCisKK05BVElWRV9FWFRFTlNJT05TID0gZGljdC5mcm9ta2V5cygnLmRsbCAuc28gLmR5bGliIC5weWQnLnNwbGl0KCkpCisKKworCisKKworCisKKworCisKKworCitkZWYgd2Fsa19lZ2coZWdnX2Rpcik6CisgICAgIiIiV2FsayBhbiB1bnBhY2tlZCBlZ2cncyBjb250ZW50cywgc2tpcHBpbmcgdGhlIG1ldGFkYXRhIGRpcmVjdG9yeSIiIgorICAgIHdhbGtlciA9IG9zLndhbGsoZWdnX2RpcikKKyAgICBiYXNlLGRpcnMsZmlsZXMgPSB3YWxrZXIubmV4dCgpCisgICAgaWYgJ0VHRy1JTkZPJyBpbiBkaXJzOgorICAgICAgICBkaXJzLnJlbW92ZSgnRUdHLUlORk8nKQorICAgIHlpZWxkIGJhc2UsZGlycyxmaWxlcworICAgIGZvciBiZGYgaW4gd2Fsa2VyOgorICAgICAgICB5aWVsZCBiZGYKKworZGVmIGFuYWx5emVfZWdnKGVnZ19kaXIsIHN0dWJzKToKKyAgICAjIGNoZWNrIGZvciBleGlzdGluZyBmbGFnIGluIEVHRy1JTkZPCisgICAgZm9yIGZsYWcsZm4gaW4gc2FmZXR5X2ZsYWdzLml0ZW1zKCk6CisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihlZ2dfZGlyLCdFR0ctSU5GTycsZm4pKToKKyAgICAgICAgICAgIHJldHVybiBmbGFnCisKKyAgICBzYWZlID0gVHJ1ZQorICAgIGZvciBiYXNlLCBkaXJzLCBmaWxlcyBpbiB3YWxrX2VnZyhlZ2dfZGlyKToKKyAgICAgICAgZm9yIG5hbWUgaW4gZmlsZXM6CisgICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCcucHknKSBvciBuYW1lLmVuZHN3aXRoKCcucHl3Jyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgbmFtZS5lbmRzd2l0aCgnLnB5YycpIG9yIG5hbWUuZW5kc3dpdGgoJy5weW8nKToKKyAgICAgICAgICAgICAgICAjIGFsd2F5cyBzY2FuLCBldmVuIGlmIHdlIGFscmVhZHkga25vdyB3ZSdyZSBub3Qgc2FmZQorICAgICAgICAgICAgICAgIHNhZmUgPSBzY2FuX21vZHVsZShlZ2dfZGlyLCBiYXNlLCBuYW1lLCBzdHVicykgYW5kIHNhZmUKKyAgICByZXR1cm4gc2FmZQorCitkZWYgd3JpdGVfc2FmZXR5X2ZsYWcoZWdnX2Rpciwgc2FmZSk6CisgICAgIyBXcml0ZSBvciByZW1vdmUgemlwIHNhZmV0eSBmbGFnIGZpbGUocykKKyAgICBmb3IgZmxhZyxmbiBpbiBzYWZldHlfZmxhZ3MuaXRlbXMoKToKKyAgICAgICAgZm4gPSBvcy5wYXRoLmpvaW4oZWdnX2RpciwgZm4pCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKGZuKToKKyAgICAgICAgICAgIGlmIHNhZmUgaXMgTm9uZSBvciBib29sKHNhZmUpPD5mbGFnOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhmbikKKyAgICAgICAgZWxpZiBzYWZlIGlzIG5vdCBOb25lIGFuZCBib29sKHNhZmUpPT1mbGFnOgorICAgICAgICAgICAgb3BlbihmbiwndycpLmNsb3NlKCkKKworc2FmZXR5X2ZsYWdzID0geworICAgIFRydWU6ICd6aXAtc2FmZScsCisgICAgRmFsc2U6ICdub3QtemlwLXNhZmUnLAorfQorCitkZWYgc2Nhbl9tb2R1bGUoZWdnX2RpciwgYmFzZSwgbmFtZSwgc3R1YnMpOgorICAgICIiIkNoZWNrIHdoZXRoZXIgbW9kdWxlIHBvc3NpYmx5IHVzZXMgdW5zYWZlLWZvci16aXBmaWxlIHN0dWZmIiIiCisKKyAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihiYXNlLG5hbWUpCisgICAgaWYgZmlsZW5hbWVbOi0xXSBpbiBzdHViczoKKyAgICAgICAgcmV0dXJuIFRydWUgICAgICMgRXh0ZW5zaW9uIG1vZHVsZQorICAgIHBrZyA9IGJhc2VbbGVuKGVnZ19kaXIpKzE6XS5yZXBsYWNlKG9zLnNlcCwnLicpCisgICAgbW9kdWxlID0gcGtnKyhwa2cgYW5kICcuJyBvciAnJykrb3MucGF0aC5zcGxpdGV4dChuYW1lKVswXQorICAgIGYgPSBvcGVuKGZpbGVuYW1lLCdyYicpOyBmLnJlYWQoOCkgICAjIHNraXAgbWFnaWMgJiBkYXRlCisgICAgY29kZSA9IG1hcnNoYWwubG9hZChmKTsgIGYuY2xvc2UoKQorICAgIHNhZmUgPSBUcnVlCisgICAgc3ltYm9scyA9IGRpY3QuZnJvbWtleXMoaXRlcl9zeW1ib2xzKGNvZGUpKQorICAgIGZvciBiYWQgaW4gWydfX2ZpbGVfXycsICdfX3BhdGhfXyddOgorICAgICAgICBpZiBiYWQgaW4gc3ltYm9sczoKKyAgICAgICAgICAgIGxvZy53YXJuKCIlczogbW9kdWxlIHJlZmVyZW5jZXMgJXMiLCBtb2R1bGUsIGJhZCkKKyAgICAgICAgICAgIHNhZmUgPSBGYWxzZQorICAgIGlmICdpbnNwZWN0JyBpbiBzeW1ib2xzOgorICAgICAgICBmb3IgYmFkIGluIFsKKyAgICAgICAgICAgICdnZXRzb3VyY2UnLCAnZ2V0YWJzZmlsZScsICdnZXRzb3VyY2VmaWxlJywgJ2dldGZpbGUnCisgICAgICAgICAgICAnZ2V0c291cmNlbGluZXMnLCAnZmluZHNvdXJjZScsICdnZXRjb21tZW50cycsICdnZXRmcmFtZWluZm8nLAorICAgICAgICAgICAgJ2dldGlubmVyZnJhbWVzJywgJ2dldG91dGVyZnJhbWVzJywgJ3N0YWNrJywgJ3RyYWNlJworICAgICAgICBdOgorICAgICAgICAgICAgaWYgYmFkIGluIHN5bWJvbHM6CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIiVzOiBtb2R1bGUgTUFZIGJlIHVzaW5nIGluc3BlY3QuJXMiLCBtb2R1bGUsIGJhZCkKKyAgICAgICAgICAgICAgICBzYWZlID0gRmFsc2UKKyAgICBpZiAnX19uYW1lX18nIGluIHN5bWJvbHMgYW5kICdfX21haW5fXycgaW4gc3ltYm9scyBhbmQgJy4nIG5vdCBpbiBtb2R1bGU6CisgICAgICAgIGlmIGdldF9weXRob25fdmVyc2lvbigpPj0iMi40IjoKKyAgICAgICAgICAgIGxvZy53YXJuKCIlczogdG9wLWxldmVsIG1vZHVsZSBtYXkgYmUgJ3B5dGhvbiAtbScgc2NyaXB0IiwgbW9kdWxlKQorICAgICAgICAgICAgc2FmZSA9IEZhbHNlCisgICAgcmV0dXJuIHNhZmUKKworZGVmIGl0ZXJfc3ltYm9scyhjb2RlKToKKyAgICAiIiJZaWVsZCBuYW1lcyBhbmQgc3RyaW5ncyB1c2VkIGJ5IGBjb2RlYCBhbmQgaXRzIG5lc3RlZCBjb2RlIG9iamVjdHMiIiIKKyAgICBmb3IgbmFtZSBpbiBjb2RlLmNvX25hbWVzOiB5aWVsZCBuYW1lCisgICAgZm9yIGNvbnN0IGluIGNvZGUuY29fY29uc3RzOgorICAgICAgICBpZiBpc2luc3RhbmNlKGNvbnN0LGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgeWllbGQgY29uc3QKKyAgICAgICAgZWxpZiBpc2luc3RhbmNlKGNvbnN0LENvZGVUeXBlKToKKyAgICAgICAgICAgIGZvciBuYW1lIGluIGl0ZXJfc3ltYm9scyhjb25zdCk6CisgICAgICAgICAgICAgICAgeWllbGQgbmFtZQorCisjIEF0dHJpYnV0ZSBuYW1lcyBvZiBvcHRpb25zIGZvciBjb21tYW5kcyB0aGF0IG1pZ2h0IG5lZWQgdG8gYmUgY29udmluY2VkIHRvCisjIGluc3RhbGwgdG8gdGhlIGVnZyBidWlsZCBkaXJlY3RvcnkKKworSU5TVEFMTF9ESVJFQ1RPUllfQVRUUlMgPSBbCisgICAgJ2luc3RhbGxfbGliJywgJ2luc3RhbGxfZGlyJywgJ2luc3RhbGxfZGF0YScsICdpbnN0YWxsX2Jhc2UnCitdCisKK2RlZiBtYWtlX3ppcGZpbGUgKHppcF9maWxlbmFtZSwgYmFzZV9kaXIsIHZlcmJvc2U9MCwgZHJ5X3J1bj0wLCBjb21wcmVzcz1Ob25lKToKKyAgICAiIiJDcmVhdGUgYSB6aXAgZmlsZSBmcm9tIGFsbCB0aGUgZmlsZXMgdW5kZXIgJ2Jhc2VfZGlyJy4gIFRoZSBvdXRwdXQKKyAgICB6aXAgZmlsZSB3aWxsIGJlIG5hbWVkICdiYXNlX2RpcicgKyAiLnppcCIuICBVc2VzIGVpdGhlciB0aGUgInppcGZpbGUiCisgICAgUHl0aG9uIG1vZHVsZSAoaWYgYXZhaWxhYmxlKSBvciB0aGUgSW5mb1pJUCAiemlwIiB1dGlsaXR5IChpZiBpbnN0YWxsZWQKKyAgICBhbmQgZm91bmQgb24gdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGgpLiAgSWYgbmVpdGhlciB0b29sIGlzIGF2YWlsYWJsZSwKKyAgICByYWlzZXMgRGlzdHV0aWxzRXhlY0Vycm9yLiAgUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgb3V0cHV0IHppcCBmaWxlLgorICAgICIiIgorICAgIGltcG9ydCB6aXBmaWxlCisgICAgbWtwYXRoKG9zLnBhdGguZGlybmFtZSh6aXBfZmlsZW5hbWUpLCBkcnlfcnVuPWRyeV9ydW4pCisgICAgbG9nLmluZm8oImNyZWF0aW5nICclcycgYW5kIGFkZGluZyAnJXMnIHRvIGl0IiwgemlwX2ZpbGVuYW1lLCBiYXNlX2RpcikKKworICAgIGRlZiB2aXNpdCAoeiwgZGlybmFtZSwgbmFtZXMpOgorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGguam9pbihkaXJuYW1lLCBuYW1lKSkKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgorICAgICAgICAgICAgICAgIHAgPSBwYXRoW2xlbihiYXNlX2RpcikrMTpdCisgICAgICAgICAgICAgICAgaWYgbm90IGRyeV9ydW46CisgICAgICAgICAgICAgICAgICAgIHoud3JpdGUocGF0aCwgcCkKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoImFkZGluZyAnJXMnIiAlIHApCisKKyAgICBpZiBjb21wcmVzcyBpcyBOb25lOgorICAgICAgICBjb21wcmVzcyA9IChzeXMudmVyc2lvbj49IjIuNCIpICMgYXZvaWQgMi4zIHppcGltcG9ydCBidWcgd2hlbiA2NCBiaXRzCisKKyAgICBjb21wcmVzc2lvbiA9IFt6aXBmaWxlLlpJUF9TVE9SRUQsIHppcGZpbGUuWklQX0RFRkxBVEVEXVtib29sKGNvbXByZXNzKV0KKyAgICBpZiBub3QgZHJ5X3J1bjoKKyAgICAgICAgeiA9IHppcGZpbGUuWmlwRmlsZSh6aXBfZmlsZW5hbWUsICJ3IiwgY29tcHJlc3Npb249Y29tcHJlc3Npb24pCisgICAgICAgIG9zLnBhdGgud2FsayhiYXNlX2RpciwgdmlzaXQsIHopCisgICAgICAgIHouY2xvc2UoKQorICAgIGVsc2U6CisgICAgICAgIG9zLnBhdGgud2FsayhiYXNlX2RpciwgdmlzaXQsIE5vbmUpCisKKyAgICByZXR1cm4gemlwX2ZpbGVuYW1lCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3JwbS5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYmRpc3RfcnBtLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAwZTA3YWMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2JkaXN0X3JwbS5weQpAQCAtMCwwICsxLDM3IEBACisjIFRoaXMgaXMganVzdCBhIGtsdWRnZSBzbyB0aGF0IGJkaXN0X3JwbSBkb2Vzbid0IGd1ZXNzIHdyb25nIGFib3V0IHRoZQorIyBkaXN0cmlidXRpb24gbmFtZSBhbmQgdmVyc2lvbiwgaWYgdGhlIGVnZ19pbmZvIGNvbW1hbmQgaXMgZ29pbmcgdG8gYWx0ZXIKKyMgdGhlbSwgYW5kIGFub3RoZXIga2x1ZGdlIHRvIGFsbG93IHlvdSB0byBidWlsZCBvbGQtc3R5bGUgbm9uLWVnZyBSUE1zCisKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYmRpc3RfcnBtIGltcG9ydCBiZGlzdF9ycG0gYXMgX2JkaXN0X3JwbQorCitjbGFzcyBiZGlzdF9ycG0oX2JkaXN0X3JwbSk6CisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBfYmRpc3RfcnBtLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBzZWxmLm5vX2VnZyA9IE5vbmUKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykgICAgIyBlbnN1cmUgZGlzdHJvIG5hbWUgaXMgdXAtdG8tZGF0ZQorICAgICAgICBfYmRpc3RfcnBtLnJ1bihzZWxmKQorCisgICAgZGVmIF9tYWtlX3NwZWNfZmlsZShzZWxmKToKKyAgICAgICAgdmVyc2lvbiA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCkKKyAgICAgICAgcnBtdmVyc2lvbiA9IHZlcnNpb24ucmVwbGFjZSgnLScsJ18nKQorICAgICAgICBzcGVjID0gX2JkaXN0X3JwbS5fbWFrZV9zcGVjX2ZpbGUoc2VsZikKKyAgICAgICAgbGluZTIzID0gJyVkZWZpbmUgdmVyc2lvbiAnK3ZlcnNpb24KKyAgICAgICAgbGluZTI0ID0gJyVkZWZpbmUgdmVyc2lvbiAnK3JwbXZlcnNpb24KKyAgICAgICAgc3BlYyAgPSBbCisgICAgICAgICAgICBsaW5lLnJlcGxhY2UoCisgICAgICAgICAgICAgICAgIlNvdXJjZTA6ICV7bmFtZX0tJXt2ZXJzaW9ufS50YXIiLAorICAgICAgICAgICAgICAgICJTb3VyY2UwOiAle25hbWV9LSV7dW5tYW5nbGVkX3ZlcnNpb259LnRhciIKKyAgICAgICAgICAgICkucmVwbGFjZSgKKyAgICAgICAgICAgICAgICAic2V0dXAucHkgaW5zdGFsbCAiLAorICAgICAgICAgICAgICAgICJzZXR1cC5weSBpbnN0YWxsIC0tc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkICIKKyAgICAgICAgICAgICkucmVwbGFjZSgKKyAgICAgICAgICAgICAgICAiJXNldHVwIiwKKyAgICAgICAgICAgICAgICAiJXNldHVwIC1uICV7bmFtZX0tJXt1bm1hbmdsZWRfdmVyc2lvbn0iCisgICAgICAgICAgICApLnJlcGxhY2UobGluZTIzLGxpbmUyNCkKKyAgICAgICAgICAgIGZvciBsaW5lIGluIHNwZWMKKyAgICAgICAgXQorICAgICAgICBzcGVjLmluc2VydChzcGVjLmluZGV4KGxpbmUyNCkrMSwgIiVkZWZpbmUgdW5tYW5nbGVkX3ZlcnNpb24gIit2ZXJzaW9uKQorICAgICAgICByZXR1cm4gc3BlYwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9leHQucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2J1aWxkX2V4dC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODU1MWZiCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9leHQucHkKQEAgLTAsMCArMSwyODUgQEAKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfZXh0IGltcG9ydCBidWlsZF9leHQgYXMgX2R1X2J1aWxkX2V4dAordHJ5OgorICAgICMgQXR0ZW1wdCB0byB1c2UgUHlyZXggZm9yIGJ1aWxkaW5nIGV4dGVuc2lvbnMsIGlmIGF2YWlsYWJsZQorICAgIGZyb20gUHlyZXguRGlzdHV0aWxzLmJ1aWxkX2V4dCBpbXBvcnQgYnVpbGRfZXh0IGFzIF9idWlsZF9leHQKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBfYnVpbGRfZXh0ID0gX2R1X2J1aWxkX2V4dAorCitpbXBvcnQgb3MsIHN5cworZnJvbSBkaXN0dXRpbHMuZmlsZV91dGlsIGltcG9ydCBjb3B5X2ZpbGUKK2Zyb20gc2V0dXB0b29scy5leHRlbnNpb24gaW1wb3J0IExpYnJhcnkKK2Zyb20gZGlzdHV0aWxzLmNjb21waWxlciBpbXBvcnQgbmV3X2NvbXBpbGVyCitmcm9tIGRpc3R1dGlscy5zeXNjb25maWcgaW1wb3J0IGN1c3RvbWl6ZV9jb21waWxlciwgZ2V0X2NvbmZpZ192YXIKK2dldF9jb25maWdfdmFyKCJMRFNIQVJFRCIpICAjIG1ha2Ugc3VyZSBfY29uZmlnX3ZhcnMgaXMgaW5pdGlhbGl6ZWQKK2Zyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgX2NvbmZpZ192YXJzCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0ICoKKworaGF2ZV9ydGxkID0gRmFsc2UKK3VzZV9zdHVicyA9IEZhbHNlCitsaWJ0eXBlID0gJ3NoYXJlZCcKKworaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgIHVzZV9zdHVicyA9IFRydWUKK2VsaWYgb3MubmFtZSAhPSAnbnQnOgorICAgIHRyeToKKyAgICAgICAgZnJvbSBkbCBpbXBvcnQgUlRMRF9OT1cKKyAgICAgICAgaGF2ZV9ydGxkID0gVHJ1ZQorICAgICAgICB1c2Vfc3R1YnMgPSBUcnVlCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzCisKK2RlZiBpZl9kbChzKToKKyAgICBpZiBoYXZlX3J0bGQ6CisgICAgICAgIHJldHVybiBzCisgICAgcmV0dXJuICcnCisKKworCisKKworCitjbGFzcyBidWlsZF9leHQoX2J1aWxkX2V4dCk6CisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIiIiQnVpbGQgZXh0ZW5zaW9ucyBpbiBidWlsZCBkaXJlY3RvcnksIHRoZW4gY29weSBpZiAtLWlucGxhY2UiIiIKKyAgICAgICAgb2xkX2lucGxhY2UsIHNlbGYuaW5wbGFjZSA9IHNlbGYuaW5wbGFjZSwgMAorICAgICAgICBfYnVpbGRfZXh0LnJ1bihzZWxmKQorICAgICAgICBzZWxmLmlucGxhY2UgPSBvbGRfaW5wbGFjZQorICAgICAgICBpZiBvbGRfaW5wbGFjZToKKyAgICAgICAgICAgIHNlbGYuY29weV9leHRlbnNpb25zX3RvX3NvdXJjZSgpCisKKyAgICBkZWYgY29weV9leHRlbnNpb25zX3RvX3NvdXJjZShzZWxmKToKKyAgICAgICAgYnVpbGRfcHkgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGRfcHknKQorICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gc2VsZi5nZXRfZXh0X2Z1bGxuYW1lKGV4dC5uYW1lKQorICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmdldF9leHRfZmlsZW5hbWUoZnVsbG5hbWUpCisgICAgICAgICAgICBtb2RwYXRoID0gZnVsbG5hbWUuc3BsaXQoJy4nKQorICAgICAgICAgICAgcGFja2FnZSA9ICcuJy5qb2luKG1vZHBhdGhbOi0xXSkKKyAgICAgICAgICAgIHBhY2thZ2VfZGlyID0gYnVpbGRfcHkuZ2V0X3BhY2thZ2VfZGlyKHBhY2thZ2UpCisgICAgICAgICAgICBkZXN0X2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHBhY2thZ2VfZGlyLG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKQorICAgICAgICAgICAgc3JjX2ZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfbGliLGZpbGVuYW1lKQorCisgICAgICAgICAgICAjIEFsd2F5cyBjb3B5LCBldmVuIGlmIHNvdXJjZSBpcyBvbGRlciB0aGFuIGRlc3RpbmF0aW9uLCB0byBlbnN1cmUKKyAgICAgICAgICAgICMgdGhhdCB0aGUgcmlnaHQgZXh0ZW5zaW9ucyBmb3IgdGhlIGN1cnJlbnQgUHl0aG9uL3BsYXRmb3JtIGFyZQorICAgICAgICAgICAgIyB1c2VkLgorICAgICAgICAgICAgY29weV9maWxlKAorICAgICAgICAgICAgICAgIHNyY19maWxlbmFtZSwgZGVzdF9maWxlbmFtZSwgdmVyYm9zZT1zZWxmLnZlcmJvc2UsCisgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4KKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGlmIGV4dC5fbmVlZHNfc3R1YjoKKyAgICAgICAgICAgICAgICBzZWxmLndyaXRlX3N0dWIocGFja2FnZV9kaXIgb3Igb3MuY3VyZGlyLCBleHQsIFRydWUpCisKKworICAgIGlmIF9idWlsZF9leHQgaXMgbm90IF9kdV9idWlsZF9leHQ6CisgICAgICAgICMgV29ya2Fyb3VuZCBmb3IgcHJvYmxlbXMgdXNpbmcgc29tZSBQeXJleCB2ZXJzaW9ucyB3L1NXSUcgYW5kL29yIDIuNAorICAgICAgICBkZWYgc3dpZ19zb3VyY2VzKHNlbGYsIHNvdXJjZXMsICpvdGhlcmFyZ3MpOgorICAgICAgICAgICAgIyBmaXJzdCBkbyBhbnkgUHlyZXggcHJvY2Vzc2luZworICAgICAgICAgICAgc291cmNlcyA9IF9idWlsZF9leHQuc3dpZ19zb3VyY2VzKHNlbGYsIHNvdXJjZXMpIG9yIHNvdXJjZXMKKyAgICAgICAgICAgICMgVGhlbiBkbyBhbnkgYWN0dWFsIFNXSUcgc3R1ZmYgb24gdGhlIHJlbWFpbmRlcgorICAgICAgICAgICAgcmV0dXJuIF9kdV9idWlsZF9leHQuc3dpZ19zb3VyY2VzKHNlbGYsIHNvdXJjZXMsICpvdGhlcmFyZ3MpCisKKworCisgICAgZGVmIGdldF9leHRfZmlsZW5hbWUoc2VsZiwgZnVsbG5hbWUpOgorICAgICAgICBmaWxlbmFtZSA9IF9idWlsZF9leHQuZ2V0X2V4dF9maWxlbmFtZShzZWxmLGZ1bGxuYW1lKQorICAgICAgICBleHQgPSBzZWxmLmV4dF9tYXBbZnVsbG5hbWVdCisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LExpYnJhcnkpOgorICAgICAgICAgICAgZm4sIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5zaGxpYl9jb21waWxlci5saWJyYXJ5X2ZpbGVuYW1lKGZuLGxpYnR5cGUpCisgICAgICAgIGVsaWYgdXNlX3N0dWJzIGFuZCBleHQuX2xpbmtzX3RvX2R5bmFtaWM6CisgICAgICAgICAgICBkLGZuID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSkKKyAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oZCwnZGwtJytmbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgX2J1aWxkX2V4dC5pbml0aWFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgc2VsZi5zaGxpYl9jb21waWxlciA9IE5vbmUKKyAgICAgICAgc2VsZi5zaGxpYnMgPSBbXQorICAgICAgICBzZWxmLmV4dF9tYXAgPSB7fQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIF9idWlsZF9leHQuZmluYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBzZWxmLmV4dGVuc2lvbnMgPSBzZWxmLmV4dGVuc2lvbnMgb3IgW10KKyAgICAgICAgc2VsZi5jaGVja19leHRlbnNpb25zX2xpc3Qoc2VsZi5leHRlbnNpb25zKQorICAgICAgICBzZWxmLnNobGlicyA9IFtleHQgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LExpYnJhcnkpXQorICAgICAgICBpZiBzZWxmLnNobGliczoKKyAgICAgICAgICAgIHNlbGYuc2V0dXBfc2hsaWJfY29tcGlsZXIoKQorICAgICAgICBmb3IgZXh0IGluIHNlbGYuZXh0ZW5zaW9uczoKKyAgICAgICAgICAgIGZ1bGxuYW1lID0gZXh0Ll9mdWxsX25hbWUgPSBzZWxmLmdldF9leHRfZnVsbG5hbWUoZXh0Lm5hbWUpCisgICAgICAgICAgICBzZWxmLmV4dF9tYXBbZnVsbG5hbWVdID0gZXh0CisgICAgICAgICAgICBsdGQgPSBleHQuX2xpbmtzX3RvX2R5bmFtaWMgPSBcCisgICAgICAgICAgICAgICAgc2VsZi5zaGxpYnMgYW5kIHNlbGYubGlua3NfdG9fZHluYW1pYyhleHQpIG9yIEZhbHNlCisgICAgICAgICAgICBleHQuX25lZWRzX3N0dWIgPSBsdGQgYW5kIHVzZV9zdHVicyBhbmQgbm90IGlzaW5zdGFuY2UoZXh0LExpYnJhcnkpCisgICAgICAgICAgICBmaWxlbmFtZSA9IGV4dC5fZmlsZV9uYW1lID0gc2VsZi5nZXRfZXh0X2ZpbGVuYW1lKGZ1bGxuYW1lKQorICAgICAgICAgICAgbGliZGlyID0gb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2xpYixmaWxlbmFtZSkpCisgICAgICAgICAgICBpZiBsdGQgYW5kIGxpYmRpciBub3QgaW4gZXh0LmxpYnJhcnlfZGlyczoKKyAgICAgICAgICAgICAgICBleHQubGlicmFyeV9kaXJzLmFwcGVuZChsaWJkaXIpCisgICAgICAgICAgICBpZiBsdGQgYW5kIHVzZV9zdHVicyBhbmQgb3MuY3VyZGlyIG5vdCBpbiBleHQucnVudGltZV9saWJyYXJ5X2RpcnM6CisgICAgICAgICAgICAgICAgZXh0LnJ1bnRpbWVfbGlicmFyeV9kaXJzLmFwcGVuZChvcy5jdXJkaXIpCisKKworCisgICAgZGVmIHNldHVwX3NobGliX2NvbXBpbGVyKHNlbGYpOgorICAgICAgICBjb21waWxlciA9IHNlbGYuc2hsaWJfY29tcGlsZXIgPSBuZXdfY29tcGlsZXIoCisgICAgICAgICAgICBjb21waWxlcj1zZWxmLmNvbXBpbGVyLCBkcnlfcnVuPXNlbGYuZHJ5X3J1biwgZm9yY2U9c2VsZi5mb3JjZQorICAgICAgICApCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgICAgIHRtcCA9IF9jb25maWdfdmFycy5jb3B5KCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAjIFhYWCBIZWxwISAgSSBkb24ndCBoYXZlIGFueSBpZGVhIHdoZXRoZXIgdGhlc2UgYXJlIHJpZ2h0Li4uCisgICAgICAgICAgICAgICAgX2NvbmZpZ192YXJzWydMRFNIQVJFRCddID0gImdjYyAtV2wsLXggLWR5bmFtaWNsaWIgLXVuZGVmaW5lZCBkeW5hbWljX2xvb2t1cCIKKyAgICAgICAgICAgICAgICBfY29uZmlnX3ZhcnNbJ0NDU0hBUkVEJ10gPSAiIC1keW5hbWljbGliIgorICAgICAgICAgICAgICAgIF9jb25maWdfdmFyc1snU08nXSA9ICIuZHlsaWIiCisgICAgICAgICAgICAgICAgY3VzdG9taXplX2NvbXBpbGVyKGNvbXBpbGVyKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBfY29uZmlnX3ZhcnMuY2xlYXIoKQorICAgICAgICAgICAgICAgIF9jb25maWdfdmFycy51cGRhdGUodG1wKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY3VzdG9taXplX2NvbXBpbGVyKGNvbXBpbGVyKQorCisgICAgICAgIGlmIHNlbGYuaW5jbHVkZV9kaXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgY29tcGlsZXIuc2V0X2luY2x1ZGVfZGlycyhzZWxmLmluY2x1ZGVfZGlycykKKyAgICAgICAgaWYgc2VsZi5kZWZpbmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAjICdkZWZpbmUnIG9wdGlvbiBpcyBhIGxpc3Qgb2YgKG5hbWUsdmFsdWUpIHR1cGxlcworICAgICAgICAgICAgZm9yIChuYW1lLHZhbHVlKSBpbiBzZWxmLmRlZmluZToKKyAgICAgICAgICAgICAgICBjb21waWxlci5kZWZpbmVfbWFjcm8obmFtZSwgdmFsdWUpCisgICAgICAgIGlmIHNlbGYudW5kZWYgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmb3IgbWFjcm8gaW4gc2VsZi51bmRlZjoKKyAgICAgICAgICAgICAgICBjb21waWxlci51bmRlZmluZV9tYWNybyhtYWNybykKKyAgICAgICAgaWYgc2VsZi5saWJyYXJpZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb21waWxlci5zZXRfbGlicmFyaWVzKHNlbGYubGlicmFyaWVzKQorICAgICAgICBpZiBzZWxmLmxpYnJhcnlfZGlycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNvbXBpbGVyLnNldF9saWJyYXJ5X2RpcnMoc2VsZi5saWJyYXJ5X2RpcnMpCisgICAgICAgIGlmIHNlbGYucnBhdGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb21waWxlci5zZXRfcnVudGltZV9saWJyYXJ5X2RpcnMoc2VsZi5ycGF0aCkKKyAgICAgICAgaWYgc2VsZi5saW5rX29iamVjdHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb21waWxlci5zZXRfbGlua19vYmplY3RzKHNlbGYubGlua19vYmplY3RzKQorCisgICAgICAgICMgaGFjayBzbyBkaXN0dXRpbHMnIGJ1aWxkX2V4dGVuc2lvbigpIGJ1aWxkcyBhIGxpYnJhcnkgaW5zdGVhZAorICAgICAgICBjb21waWxlci5saW5rX3NoYXJlZF9vYmplY3QgPSBsaW5rX3NoYXJlZF9vYmplY3QuX19nZXRfXyhjb21waWxlcikKKworCisKKyAgICBkZWYgZ2V0X2V4cG9ydF9zeW1ib2xzKHNlbGYsIGV4dCk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LExpYnJhcnkpOgorICAgICAgICAgICAgcmV0dXJuIGV4dC5leHBvcnRfc3ltYm9scworICAgICAgICByZXR1cm4gX2J1aWxkX2V4dC5nZXRfZXhwb3J0X3N5bWJvbHMoc2VsZixleHQpCisKKyAgICBkZWYgYnVpbGRfZXh0ZW5zaW9uKHNlbGYsIGV4dCk6CisgICAgICAgIF9jb21waWxlciA9IHNlbGYuY29tcGlsZXIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShleHQsTGlicmFyeSk6CisgICAgICAgICAgICAgICAgc2VsZi5jb21waWxlciA9IHNlbGYuc2hsaWJfY29tcGlsZXIKKyAgICAgICAgICAgIF9idWlsZF9leHQuYnVpbGRfZXh0ZW5zaW9uKHNlbGYsZXh0KQorICAgICAgICAgICAgaWYgZXh0Ll9uZWVkc19zdHViOgorICAgICAgICAgICAgICAgIHNlbGYud3JpdGVfc3R1YigKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5JykuYnVpbGRfbGliLCBleHQKKyAgICAgICAgICAgICAgICApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLmNvbXBpbGVyID0gX2NvbXBpbGVyCisKKyAgICBkZWYgbGlua3NfdG9fZHluYW1pYyhzZWxmLCBleHQpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiAnZXh0JyBsaW5rcyB0byBhIGR5bmFtaWMgbGliIGluIHRoZSBzYW1lIHBhY2thZ2UiIiIKKyAgICAgICAgIyBYWFggdGhpcyBzaG91bGQgY2hlY2sgdG8gZW5zdXJlIHRoZSBsaWIgaXMgYWN0dWFsbHkgYmVpbmcgYnVpbHQKKyAgICAgICAgIyBYWFggYXMgZHluYW1pYywgYW5kIG5vdCBqdXN0IHVzaW5nIGEgbG9jYWxseS1mb3VuZCB2ZXJzaW9uIG9yIGEKKyAgICAgICAgIyBYWFggc3RhdGljLWNvbXBpbGVkIHZlcnNpb24KKyAgICAgICAgbGlibmFtZXMgPSBkaWN0LmZyb21rZXlzKFtsaWIuX2Z1bGxfbmFtZSBmb3IgbGliIGluIHNlbGYuc2hsaWJzXSkKKyAgICAgICAgcGtnID0gJy4nLmpvaW4oZXh0Ll9mdWxsX25hbWUuc3BsaXQoJy4nKVs6LTFdK1snJ10pCisgICAgICAgIGZvciBsaWJuYW1lIGluIGV4dC5saWJyYXJpZXM6CisgICAgICAgICAgICBpZiBwa2crbGlibmFtZSBpbiBsaWJuYW1lczogcmV0dXJuIFRydWUKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CisgICAgICAgIG91dHB1dHMgPSBfYnVpbGRfZXh0LmdldF9vdXRwdXRzKHNlbGYpCisgICAgICAgIG9wdGltaXplID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkX3B5Jykub3B0aW1pemUKKyAgICAgICAgZm9yIGV4dCBpbiBzZWxmLmV4dGVuc2lvbnM6CisgICAgICAgICAgICBpZiBleHQuX25lZWRzX3N0dWI6CisgICAgICAgICAgICAgICAgYmFzZSA9IG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2xpYiwgKmV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJykpCisgICAgICAgICAgICAgICAgb3V0cHV0cy5hcHBlbmQoYmFzZSsnLnB5JykKKyAgICAgICAgICAgICAgICBvdXRwdXRzLmFwcGVuZChiYXNlKycucHljJykKKyAgICAgICAgICAgICAgICBpZiBvcHRpbWl6ZToKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hcHBlbmQoYmFzZSsnLnB5bycpCisgICAgICAgIHJldHVybiBvdXRwdXRzCisKKyAgICBkZWYgd3JpdGVfc3R1YihzZWxmLCBvdXRwdXRfZGlyLCBleHQsIGNvbXBpbGU9RmFsc2UpOgorICAgICAgICBsb2cuaW5mbygid3JpdGluZyBzdHViIGxvYWRlciBmb3IgJXMgdG8gJXMiLGV4dC5fZnVsbF9uYW1lLCBvdXRwdXRfZGlyKQorICAgICAgICBzdHViX2ZpbGUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0X2RpciwgKmV4dC5fZnVsbF9uYW1lLnNwbGl0KCcuJykpKycucHknCisgICAgICAgIGlmIGNvbXBpbGUgYW5kIG9zLnBhdGguZXhpc3RzKHN0dWJfZmlsZSk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihzdHViX2ZpbGUrIiBhbHJlYWR5IGV4aXN0cyEgUGxlYXNlIGRlbGV0ZS4iKQorICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgZiA9IG9wZW4oc3R1Yl9maWxlLCd3JykKKyAgICAgICAgICAgIGYud3JpdGUoJ1xuJy5qb2luKFsKKyAgICAgICAgICAgICAgICAiZGVmIF9fYm9vdHN0cmFwX18oKToiLAorICAgICAgICAgICAgICAgICIgICBnbG9iYWwgX19ib290c3RyYXBfXywgX19maWxlX18sIF9fbG9hZGVyX18iLAorICAgICAgICAgICAgICAgICIgICBpbXBvcnQgc3lzLCBvcywgcGtnX3Jlc291cmNlcywgaW1wIitpZl9kbCgiLCBkbCIpLAorICAgICAgICAgICAgICAgICIgICBfX2ZpbGVfXyA9IHBrZ19yZXNvdXJjZXMucmVzb3VyY2VfZmlsZW5hbWUoX19uYW1lX18sJXIpIgorICAgICAgICAgICAgICAgICAgICUgb3MucGF0aC5iYXNlbmFtZShleHQuX2ZpbGVfbmFtZSksCisgICAgICAgICAgICAgICAgIiAgIGRlbCBfX2Jvb3RzdHJhcF9fIiwKKyAgICAgICAgICAgICAgICAiICAgaWYgJ19fbG9hZGVyX18nIGluIGdsb2JhbHMoKToiLAorICAgICAgICAgICAgICAgICIgICAgICAgZGVsIF9fbG9hZGVyX18iLAorICAgICAgICAgICAgICAgIGlmX2RsKCIgICBvbGRfZmxhZ3MgPSBzeXMuZ2V0ZGxvcGVuZmxhZ3MoKSIpLAorICAgICAgICAgICAgICAgICIgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkiLAorICAgICAgICAgICAgICAgICIgICB0cnk6IiwKKyAgICAgICAgICAgICAgICAiICAgICBvcy5jaGRpcihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pKSIsCisgICAgICAgICAgICAgICAgaWZfZGwoIiAgICAgc3lzLnNldGRsb3BlbmZsYWdzKGRsLlJUTERfTk9XKSIpLAorICAgICAgICAgICAgICAgICIgICAgIGltcC5sb2FkX2R5bmFtaWMoX19uYW1lX18sX19maWxlX18pIiwKKyAgICAgICAgICAgICAgICAiICAgZmluYWxseToiLAorICAgICAgICAgICAgICAgIGlmX2RsKCIgICAgIHN5cy5zZXRkbG9wZW5mbGFncyhvbGRfZmxhZ3MpIiksCisgICAgICAgICAgICAgICAgIiAgICAgb3MuY2hkaXIob2xkX2RpcikiLAorICAgICAgICAgICAgICAgICJfX2Jvb3RzdHJhcF9fKCkiLAorICAgICAgICAgICAgICAgICIiICMgdGVybWluYWwgXG4KKyAgICAgICAgICAgIF0pKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGlmIGNvbXBpbGU6CisgICAgICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBieXRlX2NvbXBpbGUKKyAgICAgICAgICAgIGJ5dGVfY29tcGlsZShbc3R1Yl9maWxlXSwgb3B0aW1pemU9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1UcnVlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKyAgICAgICAgICAgIG9wdGltaXplID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2luc3RhbGxfbGliJykub3B0aW1pemUKKyAgICAgICAgICAgIGlmIG9wdGltaXplID4gMDoKKyAgICAgICAgICAgICAgICBieXRlX2NvbXBpbGUoW3N0dWJfZmlsZV0sIG9wdGltaXplPW9wdGltaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZT1UcnVlLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHN0dWJfZmlsZSkgYW5kIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICAgICAgb3MudW5saW5rKHN0dWJfZmlsZSkKKworCitpZiB1c2Vfc3R1YnMgb3Igb3MubmFtZT09J250JzoKKyAgICAjIEJ1aWxkIHNoYXJlZCBsaWJyYXJpZXMKKyAgICAjCisgICAgZGVmIGxpbmtfc2hhcmVkX29iamVjdChzZWxmLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwgb3V0cHV0X2Rpcj1Ob25lLAorICAgICAgICBsaWJyYXJpZXM9Tm9uZSwgbGlicmFyeV9kaXJzPU5vbmUsIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgIGV4cG9ydF9zeW1ib2xzPU5vbmUsIGRlYnVnPTAsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwKKyAgICAgICAgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwgYnVpbGRfdGVtcD1Ob25lLCB0YXJnZXRfbGFuZz1Ob25lCisgICAgKTogIHNlbGYubGluaygKKyAgICAgICAgICAgIHNlbGYuU0hBUkVEX0xJQlJBUlksIG9iamVjdHMsIG91dHB1dF9saWJuYW1lLAorICAgICAgICAgICAgb3V0cHV0X2RpciwgbGlicmFyaWVzLCBsaWJyYXJ5X2RpcnMsIHJ1bnRpbWVfbGlicmFyeV9kaXJzLAorICAgICAgICAgICAgZXhwb3J0X3N5bWJvbHMsIGRlYnVnLCBleHRyYV9wcmVhcmdzLCBleHRyYV9wb3N0YXJncywKKyAgICAgICAgICAgIGJ1aWxkX3RlbXAsIHRhcmdldF9sYW5nCisgICAgICAgICkKK2Vsc2U6CisgICAgIyBCdWlsZCBzdGF0aWMgbGlicmFyaWVzIGV2ZXJ5d2hlcmUgZWxzZQorICAgIGxpYnR5cGUgPSAnc3RhdGljJworCisgICAgZGVmIGxpbmtfc2hhcmVkX29iamVjdChzZWxmLCBvYmplY3RzLCBvdXRwdXRfbGlibmFtZSwgb3V0cHV0X2Rpcj1Ob25lLAorICAgICAgICBsaWJyYXJpZXM9Tm9uZSwgbGlicmFyeV9kaXJzPU5vbmUsIHJ1bnRpbWVfbGlicmFyeV9kaXJzPU5vbmUsCisgICAgICAgIGV4cG9ydF9zeW1ib2xzPU5vbmUsIGRlYnVnPTAsIGV4dHJhX3ByZWFyZ3M9Tm9uZSwKKyAgICAgICAgZXh0cmFfcG9zdGFyZ3M9Tm9uZSwgYnVpbGRfdGVtcD1Ob25lLCB0YXJnZXRfbGFuZz1Ob25lCisgICAgKToKKyAgICAgICAgIyBYWFggd2UgbmVlZCB0byBlaXRoZXIgZGlzYWxsb3cgdGhlc2UgYXR0cnMgb24gTGlicmFyeSBpbnN0YW5jZXMsCisgICAgICAgICMgICAgIG9yIHdhcm4vYWJvcnQgaGVyZSBpZiBzZXQsIG9yIHNvbWV0aGluZy4uLgorICAgICAgICAjbGlicmFyaWVzPU5vbmUsIGxpYnJhcnlfZGlycz1Ob25lLCBydW50aW1lX2xpYnJhcnlfZGlycz1Ob25lLAorICAgICAgICAjZXhwb3J0X3N5bWJvbHM9Tm9uZSwgZXh0cmFfcHJlYXJncz1Ob25lLCBleHRyYV9wb3N0YXJncz1Ob25lLAorICAgICAgICAjYnVpbGRfdGVtcD1Ob25lCisKKyAgICAgICAgYXNzZXJ0IG91dHB1dF9kaXIgaXMgTm9uZSAgICMgZGlzdHV0aWxzIGJ1aWxkX2V4dCBkb2Vzbid0IHBhc3MgdGhpcworICAgICAgICBvdXRwdXRfZGlyLGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChvdXRwdXRfbGlibmFtZSkKKyAgICAgICAgYmFzZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpCisgICAgICAgIGlmIHNlbGYubGlicmFyeV9maWxlbmFtZSgieCIpLnN0YXJ0c3dpdGgoJ2xpYicpOgorICAgICAgICAgICAgIyBzdHJpcCAnbGliJyBwcmVmaXg7IHRoaXMgaXMga2x1ZGd5IGlmIHNvbWUgcGxhdGZvcm0gdXNlcworICAgICAgICAgICAgIyBhIGRpZmZlcmVudCBwcmVmaXgKKyAgICAgICAgICAgIGJhc2VuYW1lID0gYmFzZW5hbWVbMzpdCisKKyAgICAgICAgc2VsZi5jcmVhdGVfc3RhdGljX2xpYigKKyAgICAgICAgICAgIG9iamVjdHMsIGJhc2VuYW1lLCBvdXRwdXRfZGlyLCBkZWJ1ZywgdGFyZ2V0X2xhbmcKKyAgICAgICAgKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9idWlsZF9weS5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfcHkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhOWIyMwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvYnVpbGRfcHkucHkKQEAgLTAsMCArMSwxOTIgQEAKK2ltcG9ydCBvcy5wYXRoLCBzeXMsIGZubWF0Y2gKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfcHkgaW1wb3J0IGJ1aWxkX3B5IGFzIF9idWlsZF9weQorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCitmcm9tIGdsb2IgaW1wb3J0IGdsb2IKKworY2xhc3MgYnVpbGRfcHkoX2J1aWxkX3B5KToKKyAgICAiIiJFbmhhbmNlZCAnYnVpbGRfcHknIGNvbW1hbmQgdGhhdCBpbmNsdWRlcyBkYXRhIGZpbGVzIHdpdGggcGFja2FnZXMKKworICAgIFRoZSBkYXRhIGZpbGVzIGFyZSBzcGVjaWZpZWQgdmlhIGEgJ3BhY2thZ2VfZGF0YScgYXJndW1lbnQgdG8gJ3NldHVwKCknLgorICAgIFNlZSAnc2V0dXB0b29scy5kaXN0LkRpc3RyaWJ1dGlvbicgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIEFsc28sIHRoaXMgdmVyc2lvbiBvZiB0aGUgJ2J1aWxkX3B5JyBjb21tYW5kIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBib3RoCisgICAgJ3B5X21vZHVsZXMnIGFuZCAncGFja2FnZXMnIGluIHRoZSBzYW1lIHNldHVwIG9wZXJhdGlvbi4KKyAgICAiIiIKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgX2J1aWxkX3B5LmZpbmFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgc2VsZi5wYWNrYWdlX2RhdGEgPSBzZWxmLmRpc3RyaWJ1dGlvbi5wYWNrYWdlX2RhdGEKKyAgICAgICAgc2VsZi5leGNsdWRlX3BhY2thZ2VfZGF0YSA9IHNlbGYuZGlzdHJpYnV0aW9uLmV4Y2x1ZGVfcGFja2FnZV9kYXRhIG9yIHt9CisgICAgICAgIGlmICdkYXRhX2ZpbGVzJyBpbiBzZWxmLl9fZGljdF9fOiBkZWwgc2VsZi5fX2RpY3RfX1snZGF0YV9maWxlcyddCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAiIiJCdWlsZCBtb2R1bGVzLCBwYWNrYWdlcywgYW5kIGNvcHkgZGF0YSBmaWxlcyB0byBidWlsZCBkaXJlY3RvcnkiIiIKKyAgICAgICAgaWYgbm90IHNlbGYucHlfbW9kdWxlcyBhbmQgbm90IHNlbGYucGFja2FnZXM6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBzZWxmLnB5X21vZHVsZXM6CisgICAgICAgICAgICBzZWxmLmJ1aWxkX21vZHVsZXMoKQorCisgICAgICAgIGlmIHNlbGYucGFja2FnZXM6CisgICAgICAgICAgICBzZWxmLmJ1aWxkX3BhY2thZ2VzKCkKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfcGFja2FnZV9kYXRhKCkKKworICAgICAgICAjIE9ubHkgY29tcGlsZSBhY3R1YWwgLnB5IGZpbGVzLCB1c2luZyBvdXIgYmFzZSBjbGFzcycgaWRlYSBvZiB3aGF0IG91cgorICAgICAgICAjIG91dHB1dCBmaWxlcyBhcmUuCisgICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKF9idWlsZF9weS5nZXRfb3V0cHV0cyhzZWxmLCBpbmNsdWRlX2J5dGVjb2RlPTApKQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsYXR0cik6CisgICAgICAgIGlmIGF0dHI9PSdkYXRhX2ZpbGVzJzogICMgbGF6aWx5IGNvbXB1dGUgZGF0YSBmaWxlcworICAgICAgICAgICAgc2VsZi5kYXRhX2ZpbGVzID0gZmlsZXMgPSBzZWxmLl9nZXRfZGF0YV9maWxlcygpOyByZXR1cm4gZmlsZXMKKyAgICAgICAgcmV0dXJuIF9idWlsZF9weS5fX2dldGF0dHJfXyhzZWxmLGF0dHIpCisKKyAgICBkZWYgX2dldF9kYXRhX2ZpbGVzKHNlbGYpOgorICAgICAgICAiIiJHZW5lcmF0ZSBsaXN0IG9mICcocGFja2FnZSxzcmNfZGlyLGJ1aWxkX2RpcixmaWxlbmFtZXMpJyB0dXBsZXMiIiIKKyAgICAgICAgc2VsZi5hbmFseXplX21hbmlmZXN0KCkKKyAgICAgICAgZGF0YSA9IFtdCisgICAgICAgIGZvciBwYWNrYWdlIGluIHNlbGYucGFja2FnZXMgb3IgKCk6CisgICAgICAgICAgICAjIExvY2F0ZSBwYWNrYWdlIHNvdXJjZSBkaXJlY3RvcnkKKyAgICAgICAgICAgIHNyY19kaXIgPSBzZWxmLmdldF9wYWNrYWdlX2RpcihwYWNrYWdlKQorCisgICAgICAgICAgICAjIENvbXB1dGUgcGFja2FnZSBidWlsZCBkaXJlY3RvcnkKKyAgICAgICAgICAgIGJ1aWxkX2RpciA9IG9zLnBhdGguam9pbigqKFtzZWxmLmJ1aWxkX2xpYl0gKyBwYWNrYWdlLnNwbGl0KCcuJykpKQorCisgICAgICAgICAgICAjIExlbmd0aCBvZiBwYXRoIHRvIHN0cmlwIGZyb20gZm91bmQgZmlsZXMKKyAgICAgICAgICAgIHBsZW4gPSBsZW4oc3JjX2RpcikrMQorCisgICAgICAgICAgICAjIFN0cmlwIGRpcmVjdG9yeSBmcm9tIGdsb2JiZWQgZmlsZW5hbWVzCisgICAgICAgICAgICBmaWxlbmFtZXMgPSBbCisgICAgICAgICAgICAgICAgZmlsZVtwbGVuOl0gZm9yIGZpbGUgaW4gc2VsZi5maW5kX2RhdGFfZmlsZXMocGFja2FnZSwgc3JjX2RpcikKKyAgICAgICAgICAgICAgICBdCisgICAgICAgICAgICBkYXRhLmFwcGVuZCggKHBhY2thZ2UsIHNyY19kaXIsIGJ1aWxkX2RpciwgZmlsZW5hbWVzKSApCisgICAgICAgIHJldHVybiBkYXRhCisKKyAgICBkZWYgZmluZF9kYXRhX2ZpbGVzKHNlbGYsIHBhY2thZ2UsIHNyY19kaXIpOgorICAgICAgICAiIiJSZXR1cm4gZmlsZW5hbWVzIGZvciBwYWNrYWdlJ3MgZGF0YSBmaWxlcyBpbiAnc3JjX2RpciciIiIKKyAgICAgICAgZ2xvYnMgPSAoc2VsZi5wYWNrYWdlX2RhdGEuZ2V0KCcnLCBbXSkKKyAgICAgICAgICAgICAgICAgKyBzZWxmLnBhY2thZ2VfZGF0YS5nZXQocGFja2FnZSwgW10pKQorICAgICAgICBmaWxlcyA9IHNlbGYubWFuaWZlc3RfZmlsZXMuZ2V0KHBhY2thZ2UsIFtdKVs6XQorICAgICAgICBmb3IgcGF0dGVybiBpbiBnbG9iczoKKyAgICAgICAgICAgICMgRWFjaCBwYXR0ZXJuIGhhcyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoCisgICAgICAgICAgICBmaWxlcy5leHRlbmQoZ2xvYihvcy5wYXRoLmpvaW4oc3JjX2RpciwgY29udmVydF9wYXRoKHBhdHRlcm4pKSkpCisgICAgICAgIHJldHVybiBzZWxmLmV4Y2x1ZGVfZGF0YV9maWxlcyhwYWNrYWdlLCBzcmNfZGlyLCBmaWxlcykKKworICAgIGRlZiBidWlsZF9wYWNrYWdlX2RhdGEoc2VsZik6CisgICAgICAgICIiIkNvcHkgZGF0YSBmaWxlcyBpbnRvIGJ1aWxkIGRpcmVjdG9yeSIiIgorICAgICAgICBsYXN0ZGlyID0gTm9uZQorICAgICAgICBmb3IgcGFja2FnZSwgc3JjX2RpciwgYnVpbGRfZGlyLCBmaWxlbmFtZXMgaW4gc2VsZi5kYXRhX2ZpbGVzOgorICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oYnVpbGRfZGlyLCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBzZWxmLm1rcGF0aChvcy5wYXRoLmRpcm5hbWUodGFyZ2V0KSkKKyAgICAgICAgICAgICAgICBzZWxmLmNvcHlfZmlsZShvcy5wYXRoLmpvaW4oc3JjX2RpciwgZmlsZW5hbWUpLCB0YXJnZXQpCisKKworICAgIGRlZiBhbmFseXplX21hbmlmZXN0KHNlbGYpOgorICAgICAgICBzZWxmLm1hbmlmZXN0X2ZpbGVzID0gbWYgPSB7fQorICAgICAgICBpZiBub3Qgc2VsZi5kaXN0cmlidXRpb24uaW5jbHVkZV9wYWNrYWdlX2RhdGE6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc3JjX2RpcnMgPSB7fQorICAgICAgICBmb3IgcGFja2FnZSBpbiBzZWxmLnBhY2thZ2VzIG9yICgpOgorICAgICAgICAgICAgIyBMb2NhdGUgcGFja2FnZSBzb3VyY2UgZGlyZWN0b3J5CisgICAgICAgICAgICBzcmNfZGlyc1thc3NlcnRfcmVsYXRpdmUoc2VsZi5nZXRfcGFja2FnZV9kaXIocGFja2FnZSkpXSA9IHBhY2thZ2UKKworICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCisgICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdlZ2dfaW5mbycpCisgICAgICAgIGZvciBwYXRoIGluIGVpX2NtZC5maWxlbGlzdC5maWxlczoKKyAgICAgICAgICAgIGlmIHBhdGguZW5kc3dpdGgoJy5weScpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBkLGYgPSBvcy5wYXRoLnNwbGl0KGFzc2VydF9yZWxhdGl2ZShwYXRoKSkKKyAgICAgICAgICAgIHByZXYgPSBOb25lCisgICAgICAgICAgICB3aGlsZSBkIGFuZCBkIT1wcmV2IGFuZCBkIG5vdCBpbiBzcmNfZGlyczoKKyAgICAgICAgICAgICAgICBwcmV2ID0gZAorICAgICAgICAgICAgICAgIGQsIGRmID0gb3MucGF0aC5zcGxpdChkKQorICAgICAgICAgICAgICAgIGYgPSBvcy5wYXRoLmpvaW4oZGYsIGYpCisgICAgICAgICAgICBpZiBkIGluIHNyY19kaXJzOgorICAgICAgICAgICAgICAgIG1mLnNldGRlZmF1bHQoc3JjX2RpcnNbZF0sW10pLmFwcGVuZChwYXRoKQorCisKKyAgICBkZWYgZ2V0X2RhdGFfZmlsZXMoc2VsZik6IHBhc3MgICMga2x1ZGdlIDIuNCBmb3IgbGF6eSBjb21wdXRhdGlvbgorCisgICAgaWYgc3lzLnZlcnNpb248IjIuNCI6ICAgICMgUHl0aG9uIDIuNCBhbHJlYWR5IGhhcyB0aGlzIGNvZGUKKyAgICAgICAgZGVmIGdldF9vdXRwdXRzKHNlbGYsIGluY2x1ZGVfYnl0ZWNvZGU9MSk6CisgICAgICAgICAgICAiIiJSZXR1cm4gY29tcGxldGUgbGlzdCBvZiBmaWxlcyBjb3BpZWQgdG8gdGhlIGJ1aWxkIGRpcmVjdG9yeQorCisgICAgICAgICAgICBUaGlzIGluY2x1ZGVzIGJvdGggJy5weScgZmlsZXMgYW5kIGRhdGEgZmlsZXMsIGFzIHdlbGwgYXMgJy5weWMnCisgICAgICAgICAgICBhbmQgJy5weW8nIGZpbGVzIGlmICdpbmNsdWRlX2J5dGVjb2RlJyBpcyB0cnVlLiAgKFRoaXMgbWV0aG9kIGlzCisgICAgICAgICAgICBuZWVkZWQgZm9yIHRoZSAnaW5zdGFsbF9saWInIGNvbW1hbmQgdG8gZG8gaXRzIGpvYiBwcm9wZXJseSwgYW5kIHRvCisgICAgICAgICAgICBnZW5lcmF0ZSBhIGNvcnJlY3QgaW5zdGFsbGF0aW9uIG1hbmlmZXN0LikKKyAgICAgICAgICAgICIiIgorICAgICAgICAgICAgcmV0dXJuIF9idWlsZF9weS5nZXRfb3V0cHV0cyhzZWxmLCBpbmNsdWRlX2J5dGVjb2RlKSArIFsKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oYnVpbGRfZGlyLCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBmb3IgcGFja2FnZSwgc3JjX2RpciwgYnVpbGRfZGlyLGZpbGVuYW1lcyBpbiBzZWxmLmRhdGFfZmlsZXMKKyAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzCisgICAgICAgICAgICAgICAgXQorCisgICAgZGVmIGNoZWNrX3BhY2thZ2Uoc2VsZiwgcGFja2FnZSwgcGFja2FnZV9kaXIpOgorICAgICAgICAiIiJDaGVjayBuYW1lc3BhY2UgcGFja2FnZXMnIF9faW5pdF9fIGZvciBkZWNsYXJlX25hbWVzcGFjZSIiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYWNrYWdlc19jaGVja2VkW3BhY2thZ2VdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBpbml0X3B5ID0gX2J1aWxkX3B5LmNoZWNrX3BhY2thZ2Uoc2VsZiwgcGFja2FnZSwgcGFja2FnZV9kaXIpCisgICAgICAgIHNlbGYucGFja2FnZXNfY2hlY2tlZFtwYWNrYWdlXSA9IGluaXRfcHkKKworICAgICAgICBpZiBub3QgaW5pdF9weSBvciBub3Qgc2VsZi5kaXN0cmlidXRpb24ubmFtZXNwYWNlX3BhY2thZ2VzOgorICAgICAgICAgICAgcmV0dXJuIGluaXRfcHkKKworICAgICAgICBmb3IgcGtnIGluIHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlczoKKyAgICAgICAgICAgIGlmIHBrZz09cGFja2FnZSBvciBwa2cuc3RhcnRzd2l0aChwYWNrYWdlKycuJyk6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiBpbml0X3B5CisKKyAgICAgICAgZiA9IG9wZW4oaW5pdF9weSwnclUnKQorICAgICAgICBpZiAnZGVjbGFyZV9uYW1lc3BhY2UnIG5vdCBpbiBmLnJlYWQoKToKKyAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAorICAgICAgICAgICAgICAiTmFtZXNwYWNlIHBhY2thZ2UgcHJvYmxlbTogJXMgaXMgYSBuYW1lc3BhY2UgcGFja2FnZSwgYnV0IGl0c1xuIgorICAgICAgICAgICAgICAiX19pbml0X18ucHkgZG9lcyBub3QgY2FsbCBkZWNsYXJlX25hbWVzcGFjZSgpISBQbGVhc2UgZml4IGl0LlxuIgorICAgICAgICAgICAgICAnKFNlZSB0aGUgc2V0dXB0b29scyBtYW51YWwgdW5kZXIgIk5hbWVzcGFjZSBQYWNrYWdlcyIgZm9yICcKKyAgICAgICAgICAgICAgImRldGFpbHMuKVxuIiAlIChwYWNrYWdlLCkKKyAgICAgICAgICAgICkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHJldHVybiBpbml0X3B5CisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLnBhY2thZ2VzX2NoZWNrZWQ9e30KKyAgICAgICAgX2J1aWxkX3B5LmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQorCisKKworCisKKworCisgICAgZGVmIGV4Y2x1ZGVfZGF0YV9maWxlcyhzZWxmLCBwYWNrYWdlLCBzcmNfZGlyLCBmaWxlcyk6CisgICAgICAgICIiIkZpbHRlciBmaWxlbmFtZXMgZm9yIHBhY2thZ2UncyBkYXRhIGZpbGVzIGluICdzcmNfZGlyJyIiIgorICAgICAgICBnbG9icyA9IChzZWxmLmV4Y2x1ZGVfcGFja2FnZV9kYXRhLmdldCgnJywgW10pCisgICAgICAgICAgICAgICAgICsgc2VsZi5leGNsdWRlX3BhY2thZ2VfZGF0YS5nZXQocGFja2FnZSwgW10pKQorICAgICAgICBiYWQgPSBbXQorICAgICAgICBmb3IgcGF0dGVybiBpbiBnbG9iczoKKyAgICAgICAgICAgIGJhZC5leHRlbmQoCisgICAgICAgICAgICAgICAgZm5tYXRjaC5maWx0ZXIoCisgICAgICAgICAgICAgICAgICAgIGZpbGVzLCBvcy5wYXRoLmpvaW4oc3JjX2RpciwgY29udmVydF9wYXRoKHBhdHRlcm4pKQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkKKyAgICAgICAgYmFkID0gZGljdC5mcm9ta2V5cyhiYWQpCisgICAgICAgIHJldHVybiBbZiBmb3IgZiBpbiBmaWxlcyBpZiBmIG5vdCBpbiBiYWRdCisKKworZGVmIGFzc2VydF9yZWxhdGl2ZShwYXRoKToKKyAgICBpZiBub3Qgb3MucGF0aC5pc2FicyhwYXRoKToKKyAgICAgICAgcmV0dXJuIHBhdGgKKyAgICBmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1NldHVwRXJyb3IKKyAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAorIiIiRXJyb3I6IHNldHVwIHNjcmlwdCBzcGVjaWZpZXMgYW4gYWJzb2x1dGUgcGF0aDoKKworICAgICVzCisKK3NldHVwKCkgYXJndW1lbnRzIG11c3QgKmFsd2F5cyogYmUgLy1zZXBhcmF0ZWQgcGF0aHMgcmVsYXRpdmUgdG8gdGhlCitzZXR1cC5weSBkaXJlY3RvcnksICpuZXZlciogYWJzb2x1dGUgcGF0aHMuCisiIiIgJSBwYXRoCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9kZXZlbG9wLnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9kZXZlbG9wLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdhYjViMjMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2RldmVsb3AucHkKQEAgLTAsMCArMSwxMTYgQEAKK2Zyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgZWFzeV9pbnN0YWxsCitmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKK2Zyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgRGlzdHJpYnV0aW9uLCBQYXRoTWV0YWRhdGEsIG5vcm1hbGl6ZV9wYXRoCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0ICoKK2ltcG9ydCBzeXMsIG9zCisKK2NsYXNzIGRldmVsb3AoZWFzeV9pbnN0YWxsKToKKyAgICAiIiJTZXQgdXAgcGFja2FnZSBmb3IgZGV2ZWxvcG1lbnQiIiIKKworICAgIGRlc2NyaXB0aW9uID0gImluc3RhbGwgcGFja2FnZSBpbiAnZGV2ZWxvcG1lbnQgbW9kZSciCisKKyAgICB1c2VyX29wdGlvbnMgPSBlYXN5X2luc3RhbGwudXNlcl9vcHRpb25zICsgWworICAgICAgICAoInVuaW5zdGFsbCIsICJ1IiwgIlVuaW5zdGFsbCB0aGlzIHNvdXJjZSBwYWNrYWdlIiksCisgICAgXQorCisgICAgYm9vbGVhbl9vcHRpb25zID0gZWFzeV9pbnN0YWxsLmJvb2xlYW5fb3B0aW9ucyArIFsndW5pbnN0YWxsJ10KKworICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gRmFsc2UgICMgb3ZlcnJpZGUgYmFzZQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi51bmluc3RhbGw6CisgICAgICAgICAgICBzZWxmLm11bHRpX3ZlcnNpb24gPSBUcnVlCisgICAgICAgICAgICBzZWxmLnVuaW5zdGFsbF9saW5rKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9mb3JfZGV2ZWxvcG1lbnQoKQorICAgICAgICBzZWxmLndhcm5fZGVwcmVjYXRlZF9vcHRpb25zKCkKKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYudW5pbnN0YWxsID0gTm9uZQorICAgICAgICBlYXN5X2luc3RhbGwuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCisKKworCisKKworCisKKworCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgZWkgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgiZWdnX2luZm8iKQorICAgICAgICBpZiBlaS5icm9rZW5fZWdnX2luZm86CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICJQbGVhc2UgcmVuYW1lICVyIHRvICVyIGJlZm9yZSB1c2luZyAnZGV2ZWxvcCciCisgICAgICAgICAgICAlIChlaS5lZ2dfaW5mbywgZWkuYnJva2VuX2VnZ19pbmZvKQorICAgICAgICAgICAgKQorICAgICAgICBzZWxmLmFyZ3MgPSBbZWkuZWdnX25hbWVdCisgICAgICAgIGVhc3lfaW5zdGFsbC5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIHNlbGYuZWdnX2xpbmsgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgZWkuZWdnX25hbWUrJy5lZ2ctbGluaycpCisgICAgICAgIHNlbGYuZWdnX2Jhc2UgPSBlaS5lZ2dfYmFzZQorICAgICAgICBzZWxmLmVnZ19wYXRoID0gb3MucGF0aC5hYnNwYXRoKGVpLmVnZ19iYXNlKQorCisgICAgICAgICMgTWFrZSBhIGRpc3RyaWJ1dGlvbiBmb3IgdGhlIHBhY2thZ2UncyBzb3VyY2UKKyAgICAgICAgc2VsZi5kaXN0ID0gRGlzdHJpYnV0aW9uKAorICAgICAgICAgICAgbm9ybWFsaXplX3BhdGgoc2VsZi5lZ2dfcGF0aCksCisgICAgICAgICAgICBQYXRoTWV0YWRhdGEoc2VsZi5lZ2dfcGF0aCwgb3MucGF0aC5hYnNwYXRoKGVpLmVnZ19pbmZvKSksCisgICAgICAgICAgICBwcm9qZWN0X25hbWUgPSBlaS5lZ2dfbmFtZQorICAgICAgICApCisKKyAgICBkZWYgaW5zdGFsbF9mb3JfZGV2ZWxvcG1lbnQoc2VsZik6CisgICAgICAgICMgRW5zdXJlIG1ldGFkYXRhIGlzIHVwLXRvLWRhdGUKKyAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnZWdnX2luZm8nKQorCisgICAgICAgICMgQnVpbGQgZXh0ZW5zaW9ucyBpbi1wbGFjZQorICAgICAgICBzZWxmLnJlaW5pdGlhbGl6ZV9jb21tYW5kKCdidWlsZF9leHQnLCBpbnBsYWNlPTEpCisgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2J1aWxkX2V4dCcpCisKKyAgICAgICAgc2VsZi5pbnN0YWxsX3NpdGVfcHkoKSAgIyBlbnN1cmUgdGhhdCB0YXJnZXQgZGlyIGlzIHNpdGUtc2FmZQorCisgICAgICAgICMgY3JlYXRlIGFuIC5lZ2ctbGluayBpbiB0aGUgaW5zdGFsbGF0aW9uIGRpciwgcG9pbnRpbmcgdG8gb3VyIGVnZworICAgICAgICBsb2cuaW5mbygiQ3JlYXRpbmcgJXMgKGxpbmsgdG8gJXMpIiwgc2VsZi5lZ2dfbGluaywgc2VsZi5lZ2dfYmFzZSkKKyAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgIGYgPSBvcGVuKHNlbGYuZWdnX2xpbmssInciKQorICAgICAgICAgICAgZi53cml0ZShzZWxmLmVnZ19wYXRoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgIyBwb3N0cHJvY2VzcyB0aGUgaW5zdGFsbGVkIGRpc3RybywgZml4aW5nIHVwIC5wdGgsIGluc3RhbGxpbmcgc2NyaXB0cywKKyAgICAgICAgIyBhbmQgaGFuZGxpbmcgcmVxdWlyZW1lbnRzCisgICAgICAgIHNlbGYucHJvY2Vzc19kaXN0cmlidXRpb24oTm9uZSwgc2VsZi5kaXN0KQorCisgICAgZGVmIHVuaW5zdGFsbF9saW5rKHNlbGYpOgorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmVnZ19saW5rKToKKyAgICAgICAgICAgIGxvZy5pbmZvKCJSZW1vdmluZyAlcyAobGluayB0byAlcykiLCBzZWxmLmVnZ19saW5rLCBzZWxmLmVnZ19iYXNlKQorICAgICAgICAgICAgY29udGVudHMgPSBbbGluZS5yc3RyaXAoKSBmb3IgbGluZSBpbiBmaWxlKHNlbGYuZWdnX2xpbmspXQorICAgICAgICAgICAgaWYgY29udGVudHMgIT0gW3NlbGYuZWdnX3BhdGhdOgorICAgICAgICAgICAgICAgIGxvZy53YXJuKCJMaW5rIHBvaW50cyB0byAlczogdW5pbnN0YWxsIGFib3J0ZWQiLCBjb250ZW50cykKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuZWdnX2xpbmspCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBzZWxmLnVwZGF0ZV9wdGgoc2VsZi5kaXN0KSAgIyByZW1vdmUgYW55IC5wdGggbGluayB0byB1cworICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgorICAgICAgICAgICAgIyBYWFggc2hvdWxkIGFsc28gY2hlY2sgZm9yIGVudHJ5IHBvaW50IHNjcmlwdHMhCisgICAgICAgICAgICBsb2cud2FybigiTm90ZTogeW91IG11c3QgdW5pbnN0YWxsIG9yIHJlcGxhY2Ugc2NyaXB0cyBtYW51YWxseSEiKQorCisKKyAgICBkZWYgaW5zdGFsbF9lZ2dfc2NyaXB0cyhzZWxmLCBkaXN0KToKKyAgICAgICAgaWYgZGlzdCBpcyBub3Qgc2VsZi5kaXN0OgorICAgICAgICAgICAgIyBJbnN0YWxsaW5nIGEgZGVwZW5kZW5jeSwgc28gZmFsbCBiYWNrIHRvIG5vcm1hbCBiZWhhdmlvcgorICAgICAgICAgICAgcmV0dXJuIGVhc3lfaW5zdGFsbC5pbnN0YWxsX2VnZ19zY3JpcHRzKHNlbGYsZGlzdCkKKworICAgICAgICAjIGNyZWF0ZSB3cmFwcGVyIHNjcmlwdHMgaW4gdGhlIHNjcmlwdCBkaXIsIHBvaW50aW5nIHRvIGRpc3Quc2NyaXB0cworCisgICAgICAgICMgbmV3LXN0eWxlLi4uCisgICAgICAgIHNlbGYuaW5zdGFsbF93cmFwcGVyX3NjcmlwdHMoZGlzdCkKKworICAgICAgICAjIC4uLmFuZCBvbGQtc3R5bGUKKyAgICAgICAgZm9yIHNjcmlwdF9uYW1lIGluIHNlbGYuZGlzdHJpYnV0aW9uLnNjcmlwdHMgb3IgW106CisgICAgICAgICAgICBzY3JpcHRfcGF0aCA9IG9zLnBhdGguYWJzcGF0aChjb252ZXJ0X3BhdGgoc2NyaXB0X25hbWUpKQorICAgICAgICAgICAgc2NyaXB0X25hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKHNjcmlwdF9wYXRoKQorICAgICAgICAgICAgZiA9IG9wZW4oc2NyaXB0X3BhdGgsJ3JVJykKKyAgICAgICAgICAgIHNjcmlwdF90ZXh0ID0gZi5yZWFkKCkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgc2VsZi5pbnN0YWxsX3NjcmlwdChkaXN0LCBzY3JpcHRfbmFtZSwgc2NyaXB0X3RleHQsIHNjcmlwdF9wYXRoKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9lYXN5X2luc3RhbGwucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2Vhc3lfaW5zdGFsbC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZGRjZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9lYXN5X2luc3RhbGwucHkKQEAgLTAsMCArMSwxNTU1IEBACisjIXB5dGhvbgorIiIiXAorRWFzeSBJbnN0YWxsCistLS0tLS0tLS0tLS0KKworQSB0b29sIGZvciBkb2luZyBhdXRvbWF0aWMgZG93bmxvYWQvZXh0cmFjdC9idWlsZCBvZiBkaXN0dXRpbHMtYmFzZWQgUHl0aG9uCitwYWNrYWdlcy4gIEZvciBkZXRhaWxlZCBkb2N1bWVudGF0aW9uLCBzZWUgdGhlIGFjY29tcGFueWluZyBFYXN5SW5zdGFsbC50eHQKK2ZpbGUsIG9yIHZpc2l0IHRoZSBgRWFzeUluc3RhbGwgaG9tZSBwYWdlYF9fLgorCitfXyBodHRwOi8vcGVhay50ZWxlY29tbXVuaXR5LmNvbS9EZXZDZW50ZXIvRWFzeUluc3RhbGwKKyIiIgoraW1wb3J0IHN5cywgb3MucGF0aCwgemlwaW1wb3J0LCBzaHV0aWwsIHRlbXBmaWxlLCB6aXBmaWxlLCByZSwgc3RhdCwgcmFuZG9tCitmcm9tIGdsb2IgaW1wb3J0IGdsb2IKK2Zyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAorZnJvbSBzZXR1cHRvb2xzLnNhbmRib3ggaW1wb3J0IHJ1bl9zZXR1cAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZywgZGlyX3V0aWwKK2Zyb20gZGlzdHV0aWxzLnN5c2NvbmZpZyBpbXBvcnQgZ2V0X3B5dGhvbl9saWIKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzQXJnRXJyb3IsIERpc3R1dGlsc09wdGlvbkVycm9yLCBcCisgICAgRGlzdHV0aWxzRXJyb3IKK2Zyb20gc2V0dXB0b29scy5hcmNoaXZlX3V0aWwgaW1wb3J0IHVucGFja19hcmNoaXZlCitmcm9tIHNldHVwdG9vbHMucGFja2FnZV9pbmRleCBpbXBvcnQgUGFja2FnZUluZGV4LCBwYXJzZV9iZGlzdF93aW5pbnN0Citmcm9tIHNldHVwdG9vbHMucGFja2FnZV9pbmRleCBpbXBvcnQgVVJMX1NDSEVNRQorZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQgaW1wb3J0IGJkaXN0X2VnZywgZWdnX2luZm8KK2Zyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKgorc3lzX2V4ZWN1dGFibGUgPSBvcy5wYXRoLm5vcm1wYXRoKHN5cy5leGVjdXRhYmxlKQorCitfX2FsbF9fID0gWworICAgICdzYW1lZmlsZScsICdlYXN5X2luc3RhbGwnLCAnUHRoRGlzdHJpYnV0aW9ucycsICdleHRyYWN0X3dpbmluc3RfY2ZnJywKKyAgICAnbWFpbicsICdnZXRfZXhlX3ByZWZpeGVzJywKK10KKworZGVmIHNhbWVmaWxlKHAxLHAyKToKKyAgICBpZiBoYXNhdHRyKG9zLnBhdGgsJ3NhbWVmaWxlJykgYW5kICgKKyAgICAgICAgb3MucGF0aC5leGlzdHMocDEpIGFuZCBvcy5wYXRoLmV4aXN0cyhwMikKKyAgICApOgorICAgICAgICByZXR1cm4gb3MucGF0aC5zYW1lZmlsZShwMSxwMikKKyAgICByZXR1cm4gKAorICAgICAgICBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGgubm9ybWNhc2UocDEpKSA9PQorICAgICAgICBvcy5wYXRoLm5vcm1wYXRoKG9zLnBhdGgubm9ybWNhc2UocDIpKQorICAgICkKKworY2xhc3MgZWFzeV9pbnN0YWxsKENvbW1hbmQpOgorICAgICIiIk1hbmFnZSBhIGRvd25sb2FkL2J1aWxkL2luc3RhbGwgcHJvY2VzcyIiIgorICAgIGRlc2NyaXB0aW9uID0gIkZpbmQvZ2V0L2luc3RhbGwgUHl0aG9uIHBhY2thZ2VzIgorICAgIGNvbW1hbmRfY29uc3VtZXNfYXJndW1lbnRzID0gVHJ1ZQorCisgICAgdXNlcl9vcHRpb25zID0gWworICAgICAgICAoJ3ByZWZpeD0nLCBOb25lLCAiaW5zdGFsbGF0aW9uIHByZWZpeCIpLAorICAgICAgICAoInppcC1vayIsICJ6IiwgImluc3RhbGwgcGFja2FnZSBhcyBhIHppcGZpbGUiKSwKKyAgICAgICAgKCJtdWx0aS12ZXJzaW9uIiwgIm0iLCAibWFrZSBhcHBzIGhhdmUgdG8gcmVxdWlyZSgpIGEgdmVyc2lvbiIpLAorICAgICAgICAoInVwZ3JhZGUiLCAiVSIsICJmb3JjZSB1cGdyYWRlIChzZWFyY2hlcyBQeVBJIGZvciBsYXRlc3QgdmVyc2lvbnMpIiksCisgICAgICAgICgiaW5zdGFsbC1kaXI9IiwgImQiLCAiaW5zdGFsbCBwYWNrYWdlIHRvIERJUiIpLAorICAgICAgICAoInNjcmlwdC1kaXI9IiwgInMiLCAiaW5zdGFsbCBzY3JpcHRzIHRvIERJUiIpLAorICAgICAgICAoImV4Y2x1ZGUtc2NyaXB0cyIsICJ4IiwgIkRvbid0IGluc3RhbGwgc2NyaXB0cyIpLAorICAgICAgICAoImFsd2F5cy1jb3B5IiwgImEiLCAiQ29weSBhbGwgbmVlZGVkIHBhY2thZ2VzIHRvIGluc3RhbGwgZGlyIiksCisgICAgICAgICgiaW5kZXgtdXJsPSIsICJpIiwgImJhc2UgVVJMIG9mIFB5dGhvbiBQYWNrYWdlIEluZGV4IiksCisgICAgICAgICgiZmluZC1saW5rcz0iLCAiZiIsICJhZGRpdGlvbmFsIFVSTChzKSB0byBzZWFyY2ggZm9yIHBhY2thZ2VzIiksCisgICAgICAgICgiZGVsZXRlLWNvbmZsaWN0aW5nIiwgIkQiLCAibm8gbG9uZ2VyIG5lZWRlZDsgZG9uJ3QgdXNlIHRoaXMiKSwKKyAgICAgICAgKCJpZ25vcmUtY29uZmxpY3RzLWF0LW15LXJpc2siLCBOb25lLAorICAgICAgICAgICAgIm5vIGxvbmdlciBuZWVkZWQ7IGRvbid0IHVzZSB0aGlzIiksCisgICAgICAgICgiYnVpbGQtZGlyZWN0b3J5PSIsICJiIiwKKyAgICAgICAgICAgICJkb3dubG9hZC9leHRyYWN0L2J1aWxkIGluIERJUjsga2VlcCB0aGUgcmVzdWx0cyIpLAorICAgICAgICAoJ29wdGltaXplPScsICdPJywKKyAgICAgICAgICJhbHNvIGNvbXBpbGUgd2l0aCBvcHRpbWl6YXRpb246IC1PMSBmb3IgXCJweXRob24gLU9cIiwgIgorICAgICAgICAgIi1PMiBmb3IgXCJweXRob24gLU9PXCIsIGFuZCAtTzAgdG8gZGlzYWJsZSBbZGVmYXVsdDogLU8wXSIpLAorICAgICAgICAoJ3JlY29yZD0nLCBOb25lLAorICAgICAgICAgImZpbGVuYW1lIGluIHdoaWNoIHRvIHJlY29yZCBsaXN0IG9mIGluc3RhbGxlZCBmaWxlcyIpLAorICAgICAgICAoJ2Fsd2F5cy11bnppcCcsICdaJywgImRvbid0IGluc3RhbGwgYXMgYSB6aXBmaWxlLCBubyBtYXR0ZXIgd2hhdCIpLAorICAgICAgICAoJ3NpdGUtZGlycz0nLCdTJywibGlzdCBvZiBkaXJlY3RvcmllcyB3aGVyZSAucHRoIGZpbGVzIHdvcmsiKSwKKyAgICAgICAgKCdlZGl0YWJsZScsICdlJywgIkluc3RhbGwgc3BlY2lmaWVkIHBhY2thZ2VzIGluIGVkaXRhYmxlIGZvcm0iKSwKKyAgICAgICAgKCduby1kZXBzJywgJ04nLCAiZG9uJ3QgaW5zdGFsbCBkZXBlbmRlbmNpZXMiKSwKKyAgICAgICAgKCdhbGxvdy1ob3N0cz0nLCAnSCcsICJwYXR0ZXJuKHMpIHRoYXQgaG9zdG5hbWVzIG11c3QgbWF0Y2giKSwKKyAgICBdCisgICAgYm9vbGVhbl9vcHRpb25zID0gWworICAgICAgICAnemlwLW9rJywgJ211bHRpLXZlcnNpb24nLCAnZXhjbHVkZS1zY3JpcHRzJywgJ3VwZ3JhZGUnLCAnYWx3YXlzLWNvcHknLAorICAgICAgICAnZGVsZXRlLWNvbmZsaWN0aW5nJywgJ2lnbm9yZS1jb25mbGljdHMtYXQtbXktcmlzaycsICdlZGl0YWJsZScsCisgICAgICAgICduby1kZXBzJywKKyAgICBdCisgICAgbmVnYXRpdmVfb3B0ID0geydhbHdheXMtdW56aXAnOiAnemlwLW9rJ30KKyAgICBjcmVhdGVfaW5kZXggPSBQYWNrYWdlSW5kZXgKKworCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi56aXBfb2sgPSBOb25lCisgICAgICAgIHNlbGYuaW5zdGFsbF9kaXIgPSBzZWxmLnNjcmlwdF9kaXIgPSBzZWxmLmV4Y2x1ZGVfc2NyaXB0cyA9IE5vbmUKKyAgICAgICAgc2VsZi5pbmRleF91cmwgPSBOb25lCisgICAgICAgIHNlbGYuZmluZF9saW5rcyA9IE5vbmUKKyAgICAgICAgc2VsZi5idWlsZF9kaXJlY3RvcnkgPSBOb25lCisgICAgICAgIHNlbGYuYXJncyA9IE5vbmUKKyAgICAgICAgc2VsZi5vcHRpbWl6ZSA9IHNlbGYucmVjb3JkID0gTm9uZQorICAgICAgICBzZWxmLnVwZ3JhZGUgPSBzZWxmLmFsd2F5c19jb3B5ID0gc2VsZi5tdWx0aV92ZXJzaW9uID0gTm9uZQorICAgICAgICBzZWxmLmVkaXRhYmxlID0gc2VsZi5ub19kZXBzID0gc2VsZi5hbGxvd19ob3N0cyA9IE5vbmUKKyAgICAgICAgc2VsZi5yb290ID0gc2VsZi5wcmVmaXggPSBzZWxmLm5vX3JlcG9ydCA9IE5vbmUKKworICAgICAgICAjIE9wdGlvbnMgbm90IHNwZWNpZmlhYmxlIHZpYSBjb21tYW5kIGxpbmUKKyAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4ID0gTm9uZQorICAgICAgICBzZWxmLnB0aF9maWxlID0gTm9uZQorICAgICAgICBzZWxmLmRlbGV0ZV9jb25mbGljdGluZyA9IE5vbmUKKyAgICAgICAgc2VsZi5pZ25vcmVfY29uZmxpY3RzX2F0X215X3Jpc2sgPSBOb25lCisgICAgICAgIHNlbGYuc2l0ZV9kaXJzID0gTm9uZQorICAgICAgICBzZWxmLmluc3RhbGxlZF9wcm9qZWN0cyA9IHt9CisgICAgICAgIHNlbGYuc2l0ZXB5X2luc3RhbGxlZCA9IEZhbHNlCisgICAgICAgICMgQWx3YXlzIHJlYWQgZWFzeV9pbnN0YWxsIG9wdGlvbnMsIGV2ZW4gaWYgd2UgYXJlIHN1YmNsYXNzZWQsIG9yIGhhdmUKKyAgICAgICAgIyBhbiBpbmRlcGVuZGVudCBpbnN0YW5jZSBjcmVhdGVkLiAgVGhpcyBlbnN1cmVzIHRoYXQgZGVmYXVsdHMgd2lsbAorICAgICAgICAjIGFsd2F5cyBjb21lIGZyb20gdGhlIHN0YW5kYXJkIGNvbmZpZ3VyYXRpb24gZmlsZShzKScgImVhc3lfaW5zdGFsbCIKKyAgICAgICAgIyBzZWN0aW9uLCBldmVuIGlmIHRoaXMgaXMgYSAiZGV2ZWxvcCIgb3IgImluc3RhbGwiIGNvbW1hbmQsIG9yIHNvbWUKKyAgICAgICAgIyBvdGhlciBlbWJlZGRpbmcuCisgICAgICAgIHNlbGYuX2RyeV9ydW4gPSBOb25lCisgICAgICAgIHNlbGYudmVyYm9zZSA9IHNlbGYuZGlzdHJpYnV0aW9uLnZlcmJvc2UKKyAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uX3NldF9jb21tYW5kX29wdGlvbnMoCisgICAgICAgICAgICBzZWxmLCBzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfb3B0aW9uX2RpY3QoJ2Vhc3lfaW5zdGFsbCcpCisgICAgICAgICkKKworICAgIGRlZiBkZWxldGVfYmxvY2tlcnMoc2VsZiwgYmxvY2tlcnMpOgorICAgICAgICBmb3IgZmlsZW5hbWUgaW4gYmxvY2tlcnM6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSkgb3Igb3MucGF0aC5pc2xpbmsoZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJEZWxldGluZyAlcyIsIGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZmlsZW5hbWUpIGFuZCBub3Qgb3MucGF0aC5pc2xpbmsoZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgICAgICAgICAgcm10cmVlKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuX2V4cGFuZCgnaW5zdGFsbF9kaXInLCdzY3JpcHRfZGlyJywnYnVpbGRfZGlyZWN0b3J5Jywnc2l0ZV9kaXJzJykKKyAgICAgICAgIyBJZiBhIG5vbi1kZWZhdWx0IGluc3RhbGxhdGlvbiBkaXJlY3Rvcnkgd2FzIHNwZWNpZmllZCwgZGVmYXVsdCB0aGUKKyAgICAgICAgIyBzY3JpcHQgZGlyZWN0b3J5IHRvIG1hdGNoIGl0LgorICAgICAgICBpZiBzZWxmLnNjcmlwdF9kaXIgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc2NyaXB0X2RpciA9IHNlbGYuaW5zdGFsbF9kaXIKKworICAgICAgICAjIExldCBpbnN0YWxsX2RpciBnZXQgc2V0IGJ5IGluc3RhbGxfbGliIGNvbW1hbmQsIHdoaWNoIGluIHR1cm4KKyAgICAgICAgIyBnZXRzIGl0cyBpbmZvIGZyb20gdGhlIGluc3RhbGwgY29tbWFuZCwgYW5kIHRha2VzIGludG8gYWNjb3VudAorICAgICAgICAjIC0tcHJlZml4IGFuZCAtLWhvbWUgYW5kIGFsbCB0aGF0IG90aGVyIGNydWQuCisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsX2xpYicsCisgICAgICAgICAgICAoJ2luc3RhbGxfZGlyJywnaW5zdGFsbF9kaXInKQorICAgICAgICApCisgICAgICAgICMgTGlrZXdpc2UsIHNldCBkZWZhdWx0IHNjcmlwdF9kaXIgZnJvbSAnaW5zdGFsbF9zY3JpcHRzLmluc3RhbGxfZGlyJworICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbF9zY3JpcHRzJywKKyAgICAgICAgICAgICgnaW5zdGFsbF9kaXInLCAnc2NyaXB0X2RpcicpCisgICAgICAgICkKKyAgICAgICAgIyBkZWZhdWx0IC0tcmVjb3JkIGZyb20gdGhlIGluc3RhbGwgY29tbWFuZAorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbCcsICgncmVjb3JkJywgJ3JlY29yZCcpKQorICAgICAgICBub3JtcGF0aCA9IG1hcChub3JtYWxpemVfcGF0aCwgc3lzLnBhdGgpCisgICAgICAgIHNlbGYuYWxsX3NpdGVfZGlycyA9IGdldF9zaXRlX2RpcnMoKQorICAgICAgICBpZiBzZWxmLnNpdGVfZGlycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNpdGVfZGlycyA9IFsKKyAgICAgICAgICAgICAgICBvcy5wYXRoLmV4cGFuZHVzZXIocy5zdHJpcCgpKSBmb3IgcyBpbiBzZWxmLnNpdGVfZGlycy5zcGxpdCgnLCcpCisgICAgICAgICAgICBdCisgICAgICAgICAgICBmb3IgZCBpbiBzaXRlX2RpcnM6CisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoZCk6CisgICAgICAgICAgICAgICAgICAgIGxvZy53YXJuKCIlcyAoaW4gLS1zaXRlLWRpcnMpIGRvZXMgbm90IGV4aXN0IiwgZCkKKyAgICAgICAgICAgICAgICBlbGlmIG5vcm1hbGl6ZV9wYXRoKGQpIG5vdCBpbiBub3JtcGF0aDoKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICBkKyIgKGluIC0tc2l0ZS1kaXJzKSBpcyBub3Qgb24gc3lzLnBhdGgiCisgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFsbF9zaXRlX2RpcnMuYXBwZW5kKG5vcm1hbGl6ZV9wYXRoKGQpKQorICAgICAgICBzZWxmLmNoZWNrX3NpdGVfZGlyKCkKKyAgICAgICAgc2VsZi5pbmRleF91cmwgPSBzZWxmLmluZGV4X3VybCBvciAiaHR0cDovL3d3dy5weXRob24ub3JnL3B5cGkiCisgICAgICAgIHNlbGYuc2hhZG93X3BhdGggPSBzZWxmLmFsbF9zaXRlX2RpcnNbOl0KKyAgICAgICAgZm9yIHBhdGhfaXRlbSBpbiBzZWxmLmluc3RhbGxfZGlyLCBub3JtYWxpemVfcGF0aChzZWxmLnNjcmlwdF9kaXIpOgorICAgICAgICAgICAgaWYgcGF0aF9pdGVtIG5vdCBpbiBzZWxmLnNoYWRvd19wYXRoOgorICAgICAgICAgICAgICAgIHNlbGYuc2hhZG93X3BhdGguaW5zZXJ0KDAsIHBhdGhfaXRlbSkKKworICAgICAgICBpZiBzZWxmLmFsbG93X2hvc3RzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaG9zdHMgPSBbcy5zdHJpcCgpIGZvciBzIGluIHNlbGYuYWxsb3dfaG9zdHMuc3BsaXQoJywnKV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhvc3RzID0gWycqJ10KKworICAgICAgICBpZiBzZWxmLnBhY2thZ2VfaW5kZXggaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYucGFja2FnZV9pbmRleCA9IHNlbGYuY3JlYXRlX2luZGV4KAorICAgICAgICAgICAgICAgIHNlbGYuaW5kZXhfdXJsLCBzZWFyY2hfcGF0aCA9IHNlbGYuc2hhZG93X3BhdGgsIGhvc3RzPWhvc3RzCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYubG9jYWxfaW5kZXggPSBFbnZpcm9ubWVudChzZWxmLnNoYWRvd19wYXRoKQorCisgICAgICAgIGlmIHNlbGYuZmluZF9saW5rcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoc2VsZi5maW5kX2xpbmtzLCBiYXNlc3RyaW5nKToKKyAgICAgICAgICAgICAgICBzZWxmLmZpbmRfbGlua3MgPSBzZWxmLmZpbmRfbGlua3Muc3BsaXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5maW5kX2xpbmtzID0gW10KKworICAgICAgICBzZWxmLnBhY2thZ2VfaW5kZXguYWRkX2ZpbmRfbGlua3Moc2VsZi5maW5kX2xpbmtzKQorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbF9saWInLCAoJ29wdGltaXplJywnb3B0aW1pemUnKSkKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uoc2VsZi5vcHRpbWl6ZSxpbnQpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYub3B0aW1pemUgPSBpbnQoc2VsZi5vcHRpbWl6ZSkKKyAgICAgICAgICAgICAgICBpZiBub3QgKDAgPD0gc2VsZi5vcHRpbWl6ZSA8PSAyKTogcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIi0tb3B0aW1pemUgbXVzdCBiZSAwLCAxLCBvciAyIikKKworICAgICAgICBpZiBzZWxmLmRlbGV0ZV9jb25mbGljdGluZyBhbmQgc2VsZi5pZ25vcmVfY29uZmxpY3RzX2F0X215X3Jpc2s6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAiQ2FuJ3QgdXNlIGJvdGggLS1kZWxldGUtY29uZmxpY3RpbmcgYW5kICIKKyAgICAgICAgICAgICAgICAiLS1pZ25vcmUtY29uZmxpY3RzLWF0LW15LXJpc2sgYXQgdGhlIHNhbWUgdGltZSIKKyAgICAgICAgICAgICkKKyAgICAgICAgaWYgc2VsZi5lZGl0YWJsZSBhbmQgbm90IHNlbGYuYnVpbGRfZGlyZWN0b3J5OgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCisgICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBhIGJ1aWxkIGRpcmVjdG9yeSAoLWIpIHdoZW4gdXNpbmcgLS1lZGl0YWJsZSIKKyAgICAgICAgICAgICkKKyAgICAgICAgaWYgbm90IHNlbGYuYXJnczoKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAorICAgICAgICAgICAgICAgICJObyB1cmxzLCBmaWxlbmFtZXMsIG9yIHJlcXVpcmVtZW50cyBzcGVjaWZpZWQgKHNlZSAtLWhlbHApIikKKworICAgICAgICBzZWxmLm91dHB1dHMgPSBbXQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi52ZXJib3NlPD5zZWxmLmRpc3RyaWJ1dGlvbi52ZXJib3NlOgorICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi52ZXJib3NlKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmb3Igc3BlYyBpbiBzZWxmLmFyZ3M6CisgICAgICAgICAgICAgICAgc2VsZi5lYXN5X2luc3RhbGwoc3BlYywgbm90IHNlbGYubm9fZGVwcykKKyAgICAgICAgICAgIGlmIHNlbGYucmVjb3JkOgorICAgICAgICAgICAgICAgIG91dHB1dHMgPSBzZWxmLm91dHB1dHMKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnJvb3Q6ICAgICAgICAgICAgICAgIyBzdHJpcCBhbnkgcGFja2FnZSBwcmVmaXgKKyAgICAgICAgICAgICAgICAgICAgcm9vdF9sZW4gPSBsZW4oc2VsZi5yb290KQorICAgICAgICAgICAgICAgICAgICBmb3IgY291bnRlciBpbiB4cmFuZ2UobGVuKG91dHB1dHMpKToKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHNbY291bnRlcl0gPSBvdXRwdXRzW2NvdW50ZXJdW3Jvb3RfbGVuOl0KKyAgICAgICAgICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgZmlsZV91dGlsCisgICAgICAgICAgICAgICAgc2VsZi5leGVjdXRlKAorICAgICAgICAgICAgICAgICAgICBmaWxlX3V0aWwud3JpdGVfZmlsZSwgKHNlbGYucmVjb3JkLCBvdXRwdXRzKSwKKyAgICAgICAgICAgICAgICAgICAgIndyaXRpbmcgbGlzdCBvZiBpbnN0YWxsZWQgZmlsZXMgdG8gJyVzJyIgJQorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlY29yZAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHNlbGYud2Fybl9kZXByZWNhdGVkX29wdGlvbnMoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbG9nLnNldF92ZXJib3NpdHkoc2VsZi5kaXN0cmlidXRpb24udmVyYm9zZSkKKworICAgIGRlZiBwc2V1ZG9fdGVtcG5hbWUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBhIHBzZXVkby10ZW1wbmFtZSBiYXNlIGluIHRoZSBpbnN0YWxsIGRpcmVjdG9yeS4KKyAgICAgICAgVGhpcyBjb2RlIGlzIGludGVudGlvbmFsbHkgbmFpdmU7IGlmIGEgbWFsaWNpb3VzIHBhcnR5IGNhbiB3cml0ZSB0bworICAgICAgICB0aGUgdGFyZ2V0IGRpcmVjdG9yeSB5b3UncmUgYWxyZWFkeSBpbiBkZWVwIGRvb2Rvby4KKyAgICAgICAgIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHBpZCA9IG9zLmdldHBpZCgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBpZCA9IHJhbmRvbS5yYW5kaW50KDAsc3lzLm1heGludCkKKyAgICAgICAgcmV0dXJuIG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLCAidGVzdC1lYXN5LWluc3RhbGwtJXMiICUgcGlkKQorCisgICAgZGVmIHdhcm5fZGVwcmVjYXRlZF9vcHRpb25zKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmRlbGV0ZV9jb25mbGljdGluZyBvciBzZWxmLmlnbm9yZV9jb25mbGljdHNfYXRfbXlfcmlzazoKKyAgICAgICAgICAgIGxvZy53YXJuKAorICAgICAgICAgICAgICAgICJOb3RlOiBUaGUgLUQsIC0tZGVsZXRlLWNvbmZsaWN0aW5nIGFuZCIKKyAgICAgICAgICAgICAgICAiIC0taWdub3JlLWNvbmZsaWN0cy1hdC1teS1yaXNrIG5vIGxvbmdlciBoYXZlIGFueSBwdXJwb3NlIgorICAgICAgICAgICAgICAgICIgYW5kIHNob3VsZCBub3QgYmUgdXNlZC4iCisgICAgICAgICAgICApCisKKyAgICBkZWYgY2hlY2tfc2l0ZV9kaXIoc2VsZik6CisgICAgICAgICIiIlZlcmlmeSB0aGF0IHNlbGYuaW5zdGFsbF9kaXIgaXMgLnB0aC1jYXBhYmxlIGRpciwgaWYgbmVlZGVkIiIiCisKKyAgICAgICAgaW5zdGRpciA9IG5vcm1hbGl6ZV9wYXRoKHNlbGYuaW5zdGFsbF9kaXIpCisgICAgICAgIHB0aF9maWxlID0gb3MucGF0aC5qb2luKGluc3RkaXIsJ2Vhc3ktaW5zdGFsbC5wdGgnKQorCisgICAgICAgICMgSXMgaXQgYSBjb25maWd1cmVkLCBQWVRIT05QQVRILCBpbXBsaWNpdCwgb3IgZXhwbGljaXQgc2l0ZSBkaXI/CisgICAgICAgIGlzX3NpdGVfZGlyID0gaW5zdGRpciBpbiBzZWxmLmFsbF9zaXRlX2RpcnMKKworICAgICAgICBpZiBub3QgaXNfc2l0ZV9kaXI6CisgICAgICAgICAgICAjIE5vPyAgVGhlbiBkaXJlY3RseSB0ZXN0IHdoZXRoZXIgaXQgZG9lcyAucHRoIGZpbGUgcHJvY2Vzc2luZworICAgICAgICAgICAgaXNfc2l0ZV9kaXIgPSBzZWxmLmNoZWNrX3B0aF9wcm9jZXNzaW5nKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgbWFrZSBzdXJlIHdlIGNhbiB3cml0ZSB0byB0YXJnZXQgZGlyCisgICAgICAgICAgICB0ZXN0ZmlsZSA9IHNlbGYucHNldWRvX3RlbXBuYW1lKCkrJy53cml0ZS10ZXN0JworICAgICAgICAgICAgdGVzdF9leGlzdHMgPSBvcy5wYXRoLmV4aXN0cyh0ZXN0ZmlsZSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpZiB0ZXN0X2V4aXN0czogb3MudW5saW5rKHRlc3RmaWxlKQorICAgICAgICAgICAgICAgIG9wZW4odGVzdGZpbGUsJ3cnKS5jbG9zZSgpCisgICAgICAgICAgICAgICAgb3MudW5saW5rKHRlc3RmaWxlKQorICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLElPRXJyb3IpOgorICAgICAgICAgICAgICAgIHNlbGYuY2FudF93cml0ZV90b190YXJnZXQoKQorCisgICAgICAgIGlmIG5vdCBpc19zaXRlX2RpciBhbmQgbm90IHNlbGYubXVsdGlfdmVyc2lvbjoKKyAgICAgICAgICAgICMgQ2FuJ3QgaW5zdGFsbCBub24tbXVsdGkgdG8gbm9uLXNpdGUgZGlyCisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihzZWxmLm5vX2RlZmF1bHRfdmVyc2lvbl9tc2coKSkKKworICAgICAgICBpZiBpc19zaXRlX2RpcjoKKyAgICAgICAgICAgIGlmIHNlbGYucHRoX2ZpbGUgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnB0aF9maWxlID0gUHRoRGlzdHJpYnV0aW9ucyhwdGhfZmlsZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUgPSBOb25lCisKKyAgICAgICAgUFlUSE9OUEFUSCA9IG9zLmVudmlyb24uZ2V0KCdQWVRIT05QQVRIJywnJykuc3BsaXQob3MucGF0aHNlcCkKKyAgICAgICAgaWYgaW5zdGRpciBub3QgaW4gbWFwKG5vcm1hbGl6ZV9wYXRoLCBmaWx0ZXIoTm9uZSxQWVRIT05QQVRIKSk6CisgICAgICAgICAgICAjIG9ubHkgUFlUSE9OUEFUSCBkaXJzIG5lZWQgYSBzaXRlLnB5LCBzbyBwcmV0ZW5kIGl0J3MgdGhlcmUKKyAgICAgICAgICAgIHNlbGYuc2l0ZXB5X2luc3RhbGxlZCA9IFRydWUKKworICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gaW5zdGRpcgorCisKKyAgICBkZWYgY2FudF93cml0ZV90b190YXJnZXQoc2VsZik6CisgICAgICAgIG1zZyA9ICIiImNhbid0IGNyZWF0ZSBvciByZW1vdmUgZmlsZXMgaW4gaW5zdGFsbCBkaXJlY3RvcnkKKworVGhlIGZvbGxvd2luZyBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gYWRkIG9yIHJlbW92ZSBmaWxlcyBpbiB0aGUKK2luc3RhbGxhdGlvbiBkaXJlY3Rvcnk6CisKKyAgICAlcworCitUaGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeSB5b3Ugc3BlY2lmaWVkICh2aWEgLS1pbnN0YWxsLWRpciwgLS1wcmVmaXgsIG9yCit0aGUgZGlzdHV0aWxzIGRlZmF1bHQgc2V0dGluZykgd2FzOgorCisgICAgJXMKKyIiIiAgICAgJSAoc3lzLmV4Y19pbmZvKClbMV0sIHNlbGYuaW5zdGFsbF9kaXIsKQorCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmluc3RhbGxfZGlyKToKKyAgICAgICAgICAgIG1zZyArPSAiIiIKK1RoaXMgZGlyZWN0b3J5IGRvZXMgbm90IGN1cnJlbnRseSBleGlzdC4gIFBsZWFzZSBjcmVhdGUgaXQgYW5kIHRyeSBhZ2Fpbiwgb3IKK2Nob29zZSBhIGRpZmZlcmVudCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5ICh1c2luZyB0aGUgLWQgb3IgLS1pbnN0YWxsLWRpcgorb3B0aW9uKS4KKyIiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbXNnICs9ICIiIgorUGVyaGFwcyB5b3VyIGFjY291bnQgZG9lcyBub3QgaGF2ZSB3cml0ZSBhY2Nlc3MgdG8gdGhpcyBkaXJlY3Rvcnk/ICBJZiB0aGUKK2luc3RhbGxhdGlvbiBkaXJlY3RvcnkgaXMgYSBzeXN0ZW0tb3duZWQgZGlyZWN0b3J5LCB5b3UgbWF5IG5lZWQgdG8gc2lnbiBpbgorYXMgdGhlIGFkbWluaXN0cmF0b3Igb3IgInJvb3QiIGFjY291bnQuICBJZiB5b3UgZG8gbm90IGhhdmUgYWRtaW5pc3RyYXRpdmUKK2FjY2VzcyB0byB0aGlzIG1hY2hpbmUsIHlvdSBtYXkgd2lzaCB0byBjaG9vc2UgYSBkaWZmZXJlbnQgaW5zdGFsbGF0aW9uCitkaXJlY3RvcnksIHByZWZlcmFibHkgb25lIHRoYXQgaXMgbGlzdGVkIGluIHlvdXIgUFlUSE9OUEFUSCBlbnZpcm9ubWVudAordmFyaWFibGUuCisKK0ZvciBpbmZvcm1hdGlvbiBvbiBvdGhlciBvcHRpb25zLCB5b3UgbWF5IHdpc2ggdG8gY29uc3VsdCB0aGUKK2RvY3VtZW50YXRpb24gYXQ6CisKKyAgaHR0cDovL3BlYWsudGVsZWNvbW11bml0eS5jb20vRWFzeUluc3RhbGwuaHRtbAorCitQbGVhc2UgbWFrZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlcyBmb3IgeW91ciBzeXN0ZW0gYW5kIHRyeSBhZ2Fpbi4KKyIiIgorICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihtc2cpCisKKworCisKKyAgICBkZWYgY2hlY2tfcHRoX3Byb2Nlc3Npbmcoc2VsZik6CisgICAgICAgICIiIkVtcGlyaWNhbGx5IHZlcmlmeSB3aGV0aGVyIC5wdGggZmlsZXMgYXJlIHN1cHBvcnRlZCBpbiBpbnN0LiBkaXIiIiIKKyAgICAgICAgaW5zdGRpciA9IHNlbGYuaW5zdGFsbF9kaXIKKyAgICAgICAgbG9nLmluZm8oIkNoZWNraW5nIC5wdGggZmlsZSBzdXBwb3J0IGluICVzIiwgaW5zdGRpcikKKyAgICAgICAgcHRoX2ZpbGUgPSBzZWxmLnBzZXVkb190ZW1wbmFtZSgpKyIucHRoIgorICAgICAgICBva19maWxlID0gcHRoX2ZpbGUrJy5vaycKKyAgICAgICAgb2tfZXhpc3RzID0gb3MucGF0aC5leGlzdHMob2tfZmlsZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgb2tfZXhpc3RzOiBvcy51bmxpbmsob2tfZmlsZSkKKyAgICAgICAgICAgIGYgPSBvcGVuKHB0aF9maWxlLCd3JykKKyAgICAgICAgZXhjZXB0IChPU0Vycm9yLElPRXJyb3IpOgorICAgICAgICAgICAgc2VsZi5jYW50X3dyaXRlX3RvX3RhcmdldCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZi53cml0ZSgiaW1wb3J0IG9zO29wZW4oJXIsJ3cnKS53cml0ZSgnT0snKVxuIiAlIChva19maWxlLCkpCisgICAgICAgICAgICAgICAgZi5jbG9zZSgpOyBmPU5vbmUKKyAgICAgICAgICAgICAgICBleGVjdXRhYmxlID0gc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgICAgICAgICBpZiBvcy5uYW1lPT0nbnQnOgorICAgICAgICAgICAgICAgICAgICBkaXJuYW1lLGJhc2VuYW1lID0gb3MucGF0aC5zcGxpdChleGVjdXRhYmxlKQorICAgICAgICAgICAgICAgICAgICBhbHQgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwncHl0aG9udy5leGUnKQorICAgICAgICAgICAgICAgICAgICBpZiBiYXNlbmFtZS5sb3dlcigpPT0ncHl0aG9uLmV4ZScgYW5kIG9zLnBhdGguZXhpc3RzKGFsdCk6CisgICAgICAgICAgICAgICAgICAgICAgICAjIHVzZSBweXRob253LmV4ZSB0byBhdm9pZCBvcGVuaW5nIGEgY29uc29sZSB3aW5kb3cKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBhbHQKKyAgICAgICAgICAgICAgICAgICAgaWYgJyAnIGluIGV4ZWN1dGFibGU6IGV4ZWN1dGFibGU9JyIlcyInICUgZXhlY3V0YWJsZQorICAgICAgICAgICAgICAgIGZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBzcGF3bgorICAgICAgICAgICAgICAgIHNwYXduKFtleGVjdXRhYmxlLCctRScsJy1jJywncGFzcyddLDApCisKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhva19maWxlKToKKyAgICAgICAgICAgICAgICAgICAgbG9nLmluZm8oCisgICAgICAgICAgICAgICAgICAgICAgICAiVEVTVCBQQVNTRUQ6ICVzIGFwcGVhcnMgdG8gc3VwcG9ydCAucHRoIGZpbGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RkaXIKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBpZiBmOiBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhva19maWxlKTogb3MudW5saW5rKG9rX2ZpbGUpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocHRoX2ZpbGUpOiBvcy51bmxpbmsocHRoX2ZpbGUpCisgICAgICAgIGlmIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246CisgICAgICAgICAgICBsb2cud2FybigiVEVTVCBGQUlMRUQ6ICVzIGRvZXMgTk9UIHN1cHBvcnQgLnB0aCBmaWxlcyIsIGluc3RkaXIpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgZGVmIGluc3RhbGxfZWdnX3NjcmlwdHMoc2VsZiwgZGlzdCk6CisgICAgICAgICIiIldyaXRlIGFsbCB0aGUgc2NyaXB0cyBmb3IgYGRpc3RgLCB1bmxlc3Mgc2NyaXB0cyBhcmUgZXhjbHVkZWQiIiIKKworICAgICAgICBzZWxmLmluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKGRpc3QpCisgICAgICAgIGlmIHNlbGYuZXhjbHVkZV9zY3JpcHRzIG9yIG5vdCBkaXN0Lm1ldGFkYXRhX2lzZGlyKCdzY3JpcHRzJyk6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBmb3Igc2NyaXB0X25hbWUgaW4gZGlzdC5tZXRhZGF0YV9saXN0ZGlyKCdzY3JpcHRzJyk6CisgICAgICAgICAgICBzZWxmLmluc3RhbGxfc2NyaXB0KAorICAgICAgICAgICAgICAgIGRpc3QsIHNjcmlwdF9uYW1lLAorICAgICAgICAgICAgICAgIGRpc3QuZ2V0X21ldGFkYXRhKCdzY3JpcHRzLycrc2NyaXB0X25hbWUpLnJlcGxhY2UoJ1xyJywnXG4nKQorICAgICAgICAgICAgKQorCisgICAgZGVmIGFkZF9vdXRwdXQoc2VsZiwgcGF0aCk6CisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CisgICAgICAgICAgICBmb3IgYmFzZSwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhwYXRoKToKKyAgICAgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQob3MucGF0aC5qb2luKGJhc2UsZmlsZW5hbWUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5vdXRwdXRzLmFwcGVuZChwYXRoKQorCisgICAgZGVmIG5vdF9lZGl0YWJsZShzZWxmLCBzcGVjKToKKyAgICAgICAgaWYgc2VsZi5lZGl0YWJsZToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0FyZ0Vycm9yKAorICAgICAgICAgICAgICAgICJJbnZhbGlkIGFyZ3VtZW50ICVyOiB5b3UgY2FuJ3QgdXNlIGZpbGVuYW1lcyBvciBVUkxzICIKKyAgICAgICAgICAgICAgICAid2l0aCAtLWVkaXRhYmxlIChleGNlcHQgdmlhIHRoZSAtLWZpbmQtbGlua3Mgb3B0aW9uKS4iCisgICAgICAgICAgICAgICAgJSAoc3BlYywpCisgICAgICAgICAgICApCisKKyAgICBkZWYgY2hlY2tfZWRpdGFibGUoc2VsZixzcGVjKToKKyAgICAgICAgaWYgbm90IHNlbGYuZWRpdGFibGU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9kaXJlY3RvcnksIHNwZWMua2V5KSk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNBcmdFcnJvcigKKyAgICAgICAgICAgICAgICAiJXIgYWxyZWFkeSBleGlzdHMgaW4gJXM7IGNhbid0IGRvIGEgY2hlY2tvdXQgdGhlcmUiICUKKyAgICAgICAgICAgICAgICAoc3BlYy5rZXksIHNlbGYuYnVpbGRfZGlyZWN0b3J5KQorICAgICAgICAgICAgKQorCisKKworICAgIGRlZiBlYXN5X2luc3RhbGwoc2VsZiwgc3BlYywgZGVwcz1GYWxzZSk6CisgICAgICAgIHRtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAocHJlZml4PSJlYXN5X2luc3RhbGwtIikKKyAgICAgICAgZG93bmxvYWQgPSBOb25lCisgICAgICAgIHNlbGYuaW5zdGFsbF9zaXRlX3B5KCkKKworICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShzcGVjLFJlcXVpcmVtZW50KToKKyAgICAgICAgICAgICAgICBpZiBVUkxfU0NIRU1FKHNwZWMpOgorICAgICAgICAgICAgICAgICAgICAjIEl0J3MgYSB1cmwsIGRvd25sb2FkIGl0IHRvIHRtcGRpciBhbmQgcHJvY2VzcworICAgICAgICAgICAgICAgICAgICBzZWxmLm5vdF9lZGl0YWJsZShzcGVjKQorICAgICAgICAgICAgICAgICAgICBkb3dubG9hZCA9IHNlbGYucGFja2FnZV9pbmRleC5kb3dubG9hZChzcGVjLCB0bXBkaXIpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfaXRlbShOb25lLCBkb3dubG9hZCwgdG1wZGlyLCBkZXBzLCBUcnVlKQorCisgICAgICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzcGVjKToKKyAgICAgICAgICAgICAgICAgICAgIyBFeGlzdGluZyBmaWxlIG9yIGRpcmVjdG9yeSwganVzdCBwcm9jZXNzIGl0IGRpcmVjdGx5CisgICAgICAgICAgICAgICAgICAgIHNlbGYubm90X2VkaXRhYmxlKHNwZWMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfaXRlbShOb25lLCBzcGVjLCB0bXBkaXIsIGRlcHMsIFRydWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc3BlYyA9IHBhcnNlX3JlcXVpcmVtZW50X2FyZyhzcGVjKQorCisgICAgICAgICAgICBzZWxmLmNoZWNrX2VkaXRhYmxlKHNwZWMpCisgICAgICAgICAgICBkaXN0ID0gc2VsZi5wYWNrYWdlX2luZGV4LmZldGNoX2Rpc3RyaWJ1dGlvbigKKyAgICAgICAgICAgICAgICBzcGVjLCB0bXBkaXIsIHNlbGYudXBncmFkZSwgc2VsZi5lZGl0YWJsZSwgbm90IHNlbGYuYWx3YXlzX2NvcHkKKyAgICAgICAgICAgICkKKworICAgICAgICAgICAgaWYgZGlzdCBpcyBOb25lOgorICAgICAgICAgICAgICAgIG1zZyA9ICJDb3VsZCBub3QgZmluZCBzdWl0YWJsZSBkaXN0cmlidXRpb24gZm9yICVyIiAlIHNwZWMKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmFsd2F5c19jb3B5OgorICAgICAgICAgICAgICAgICAgICBtc2crPSIgKC0tYWx3YXlzLWNvcHkgc2tpcHMgc3lzdGVtIGFuZCBkZXZlbG9wbWVudCBlZ2dzKSIKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihtc2cpCisgICAgICAgICAgICBlbGlmIGRpc3QucHJlY2VkZW5jZT09REVWRUxPUF9ESVNUOgorICAgICAgICAgICAgICAgICMgLmVnZy1pbmZvIGRpc3RzIGRvbid0IG5lZWQgaW5zdGFsbGluZywganVzdCBwcm9jZXNzIGRlcHMKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKHNwZWMsIGRpc3QsIGRlcHMsICJVc2luZyIpCisgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5zdGFsbF9pdGVtKHNwZWMsIGRpc3QubG9jYXRpb24sIHRtcGRpciwgZGVwcykKKworICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHModG1wZGlyKToKKyAgICAgICAgICAgICAgICBybXRyZWUodG1wZGlyKQorCisgICAgZGVmIGluc3RhbGxfaXRlbShzZWxmLCBzcGVjLCBkb3dubG9hZCwgdG1wZGlyLCBkZXBzLCBpbnN0YWxsX25lZWRlZD1GYWxzZSk6CisKKyAgICAgICAgIyBJbnN0YWxsYXRpb24gaXMgYWxzbyBuZWVkZWQgaWYgZmlsZSBpbiB0bXBkaXIgb3IgaXMgbm90IGFuIGVnZworICAgICAgICBpbnN0YWxsX25lZWRlZCA9IGluc3RhbGxfbmVlZGVkIG9yIG9zLnBhdGguZGlybmFtZShkb3dubG9hZCkgPT0gdG1wZGlyCisgICAgICAgIGluc3RhbGxfbmVlZGVkID0gaW5zdGFsbF9uZWVkZWQgb3Igbm90IGRvd25sb2FkLmVuZHN3aXRoKCcuZWdnJykKKworICAgICAgICBsb2cuaW5mbygiUHJvY2Vzc2luZyAlcyIsIG9zLnBhdGguYmFzZW5hbWUoZG93bmxvYWQpKQorCisgICAgICAgIGlmIGluc3RhbGxfbmVlZGVkIG9yIHNlbGYuYWx3YXlzX2NvcHk6CisgICAgICAgICAgICBkaXN0cyA9IHNlbGYuaW5zdGFsbF9lZ2dzKHNwZWMsIGRvd25sb2FkLCB0bXBkaXIpCisgICAgICAgICAgICBmb3IgZGlzdCBpbiBkaXN0czoKKyAgICAgICAgICAgICAgICBzZWxmLnByb2Nlc3NfZGlzdHJpYnV0aW9uKHNwZWMsIGRpc3QsIGRlcHMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkaXN0cyA9IFtzZWxmLmNoZWNrX2NvbmZsaWN0cyhzZWxmLmVnZ19kaXN0cmlidXRpb24oZG93bmxvYWQpKV0KKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc19kaXN0cmlidXRpb24oc3BlYywgZGlzdHNbMF0sIGRlcHMsICJVc2luZyIpCisKKyAgICAgICAgaWYgc3BlYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGZvciBkaXN0IGluIGRpc3RzOgorICAgICAgICAgICAgICAgIGlmIGRpc3QgaW4gc3BlYzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKyAgICBkZWYgcHJvY2Vzc19kaXN0cmlidXRpb24oc2VsZiwgcmVxdWlyZW1lbnQsIGRpc3QsIGRlcHM9VHJ1ZSwgKmluZm8pOgorICAgICAgICBzZWxmLnVwZGF0ZV9wdGgoZGlzdCkKKyAgICAgICAgc2VsZi5wYWNrYWdlX2luZGV4LmFkZChkaXN0KQorICAgICAgICBzZWxmLmxvY2FsX2luZGV4LmFkZChkaXN0KQorICAgICAgICBzZWxmLmluc3RhbGxfZWdnX3NjcmlwdHMoZGlzdCkKKyAgICAgICAgc2VsZi5pbnN0YWxsZWRfcHJvamVjdHNbZGlzdC5rZXldID0gZGlzdAorICAgICAgICBsb2cud2FybihzZWxmLmluc3RhbGxhdGlvbl9yZXBvcnQocmVxdWlyZW1lbnQsIGRpc3QsICppbmZvKSkKKyAgICAgICAgaWYgbm90IGRlcHMgYW5kIG5vdCBzZWxmLmFsd2F5c19jb3B5OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsaWYgcmVxdWlyZW1lbnQgaXMgbm90IE5vbmUgYW5kIGRpc3Qua2V5ICE9IHJlcXVpcmVtZW50LmtleToKKyAgICAgICAgICAgIGxvZy53YXJuKCJTa2lwcGluZyBkZXBlbmRlbmNpZXMgZm9yICVzIiwgZGlzdCkKKyAgICAgICAgICAgIHJldHVybiAgIyBYWFggdGhpcyBpcyBub3QgdGhlIGRpc3RyaWJ1dGlvbiB3ZSB3ZXJlIGxvb2tpbmcgZm9yCisgICAgICAgIGVsaWYgcmVxdWlyZW1lbnQgaXMgTm9uZSBvciBkaXN0IG5vdCBpbiByZXF1aXJlbWVudDoKKyAgICAgICAgICAgICMgaWYgd2Ugd291bmQgdXAgd2l0aCBhIGRpZmZlcmVudCB2ZXJzaW9uLCByZXNvbHZlIHdoYXQgd2UndmUgZ290CisgICAgICAgICAgICBkaXN0cmVxID0gZGlzdC5hc19yZXF1aXJlbWVudCgpCisgICAgICAgICAgICByZXF1aXJlbWVudCA9IHJlcXVpcmVtZW50IG9yIGRpc3RyZXEKKyAgICAgICAgICAgIHJlcXVpcmVtZW50ID0gUmVxdWlyZW1lbnQoCisgICAgICAgICAgICAgICAgZGlzdHJlcS5wcm9qZWN0X25hbWUsIGRpc3RyZXEuc3BlY3MsIHJlcXVpcmVtZW50LmV4dHJhcworICAgICAgICAgICAgKQorICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnZGVwZW5kZW5jeV9saW5rcy50eHQnKToKKyAgICAgICAgICAgIHNlbGYucGFja2FnZV9pbmRleC5hZGRfZmluZF9saW5rcygKKyAgICAgICAgICAgICAgICBkaXN0LmdldF9tZXRhZGF0YV9saW5lcygnZGVwZW5kZW5jeV9saW5rcy50eHQnKQorICAgICAgICAgICAgKQorICAgICAgICBsb2cuaW5mbygiUHJvY2Vzc2luZyBkZXBlbmRlbmNpZXMgZm9yICVzIiwgcmVxdWlyZW1lbnQpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRpc3Ryb3MgPSBXb3JraW5nU2V0KFtdKS5yZXNvbHZlKAorICAgICAgICAgICAgICAgIFtyZXF1aXJlbWVudF0sIHNlbGYubG9jYWxfaW5kZXgsIHNlbGYuZWFzeV9pbnN0YWxsCisgICAgICAgICAgICApCisgICAgICAgIGV4Y2VwdCBEaXN0cmlidXRpb25Ob3RGb3VuZCwgZToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAorICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCByZXF1aXJlZCBkaXN0cmlidXRpb24gJXMiICUgZS5hcmdzCisgICAgICAgICAgICApCisgICAgICAgIGV4Y2VwdCBWZXJzaW9uQ29uZmxpY3QsIGU6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICAgICAiSW5zdGFsbGVkIGRpc3RyaWJ1dGlvbiAlcyBjb25mbGljdHMgd2l0aCByZXF1aXJlbWVudCAlcyIKKyAgICAgICAgICAgICAgICAlIGUuYXJncworICAgICAgICAgICAgKQorICAgICAgICBpZiBzZWxmLmFsd2F5c19jb3B5OgorICAgICAgICAgICAgIyBGb3JjZSBhbGwgdGhlIHJlbGV2YW50IGRpc3Ryb3MgdG8gYmUgY29waWVkIG9yIGFjdGl2YXRlZAorICAgICAgICAgICAgZm9yIGRpc3QgaW4gZGlzdHJvczoKKyAgICAgICAgICAgICAgICBpZiBkaXN0LmtleSBub3QgaW4gc2VsZi5pbnN0YWxsZWRfcHJvamVjdHM6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZWFzeV9pbnN0YWxsKGRpc3QuYXNfcmVxdWlyZW1lbnQoKSkKKworICAgIGRlZiBzaG91bGRfdW56aXAoc2VsZiwgZGlzdCk6CisgICAgICAgIGlmIHNlbGYuemlwX29rIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuIG5vdCBzZWxmLnppcF9vaworICAgICAgICBpZiBkaXN0Lmhhc19tZXRhZGF0YSgnbm90LXppcC1zYWZlJyk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBpZiBub3QgZGlzdC5oYXNfbWV0YWRhdGEoJ3ppcC1zYWZlJyk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgIGRlZiBtYXliZV9tb3ZlKHNlbGYsIHNwZWMsIGRpc3RfZmlsZW5hbWUsIHNldHVwX2Jhc2UpOgorICAgICAgICBkc3QgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9kaXJlY3RvcnksIHNwZWMua2V5KQorICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhkc3QpOgorICAgICAgICAgICAgbG9nLndhcm4oCisgICAgICAgICAgICAgICAiJXIgYWxyZWFkeSBleGlzdHMgaW4gJXM7IGJ1aWxkIGRpcmVjdG9yeSAlcyB3aWxsIG5vdCBiZSBrZXB0IiwKKyAgICAgICAgICAgICAgIHNwZWMua2V5LCBzZWxmLmJ1aWxkX2RpcmVjdG9yeSwgc2V0dXBfYmFzZQorICAgICAgICAgICAgKQorICAgICAgICAgICAgcmV0dXJuIHNldHVwX2Jhc2UKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihkaXN0X2ZpbGVuYW1lKToKKyAgICAgICAgICAgIHNldHVwX2Jhc2UgPSBkaXN0X2ZpbGVuYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmRpcm5hbWUoZGlzdF9maWxlbmFtZSk9PXNldHVwX2Jhc2U6CisgICAgICAgICAgICAgICAgb3MudW5saW5rKGRpc3RfZmlsZW5hbWUpICAgIyBnZXQgaXQgb3V0IG9mIHRoZSB0bXAgZGlyCisgICAgICAgICAgICBjb250ZW50cyA9IG9zLmxpc3RkaXIoc2V0dXBfYmFzZSkKKyAgICAgICAgICAgIGlmIGxlbihjb250ZW50cyk9PTE6CisgICAgICAgICAgICAgICAgZGlzdF9maWxlbmFtZSA9IG9zLnBhdGguam9pbihzZXR1cF9iYXNlLGNvbnRlbnRzWzBdKQorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZGlzdF9maWxlbmFtZSk6CisgICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIG9ubHkgdGhpbmcgdGhlcmUgaXMgYSBkaXJlY3RvcnksIG1vdmUgaXQgaW5zdGVhZAorICAgICAgICAgICAgICAgICAgICBzZXR1cF9iYXNlID0gZGlzdF9maWxlbmFtZQorICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KGRzdCk7IHNodXRpbC5tb3ZlKHNldHVwX2Jhc2UsIGRzdCkKKyAgICAgICAgcmV0dXJuIGRzdAorCisgICAgZGVmIGluc3RhbGxfd3JhcHBlcl9zY3JpcHRzKHNlbGYsIGRpc3QpOgorICAgICAgICBpZiBub3Qgc2VsZi5leGNsdWRlX3NjcmlwdHM6CisgICAgICAgICAgICBmb3IgYXJncyBpbiBnZXRfc2NyaXB0X2FyZ3MoZGlzdCk6CisgICAgICAgICAgICAgICAgc2VsZi53cml0ZV9zY3JpcHQoKmFyZ3MpCisKKworCisKKworCisgICAgZGVmIGluc3RhbGxfc2NyaXB0KHNlbGYsIGRpc3QsIHNjcmlwdF9uYW1lLCBzY3JpcHRfdGV4dCwgZGV2X3BhdGg9Tm9uZSk6CisgICAgICAgICIiIkdlbmVyYXRlIGEgbGVnYWN5IHNjcmlwdCB3cmFwcGVyIGFuZCBpbnN0YWxsIGl0IiIiCisgICAgICAgIHNwZWMgPSBzdHIoZGlzdC5hc19yZXF1aXJlbWVudCgpKQorCisgICAgICAgIGlmIGRldl9wYXRoOgorICAgICAgICAgICAgc2NyaXB0X3RleHQgPSBnZXRfc2NyaXB0X2hlYWRlcihzY3JpcHRfdGV4dCkgKyAoCisgICAgICAgICAgICAgICAgIiMgRUFTWS1JTlNUQUxMLURFVi1TQ1JJUFQ6ICUoc3BlYylyLCUoc2NyaXB0X25hbWUpclxuIgorICAgICAgICAgICAgICAgICJfX3JlcXVpcmVzX18gPSAlKHNwZWMpclxuIgorICAgICAgICAgICAgICAgICJmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IHJlcXVpcmU7IHJlcXVpcmUoJShzcGVjKXIpXG4iCisgICAgICAgICAgICAgICAgImRlbCByZXF1aXJlXG4iCisgICAgICAgICAgICAgICAgIl9fZmlsZV9fID0gJShkZXZfcGF0aClyXG4iCisgICAgICAgICAgICAgICAgImV4ZWNmaWxlKF9fZmlsZV9fKVxuIgorICAgICAgICAgICAgKSAlIGxvY2FscygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzY3JpcHRfdGV4dCA9IGdldF9zY3JpcHRfaGVhZGVyKHNjcmlwdF90ZXh0KSArICgKKyAgICAgICAgICAgICAgICAiIyBFQVNZLUlOU1RBTEwtU0NSSVBUOiAlKHNwZWMpciwlKHNjcmlwdF9uYW1lKXJcbiIKKyAgICAgICAgICAgICAgICAiX19yZXF1aXJlc19fID0gJShzcGVjKXJcbiIKKyAgICAgICAgICAgICAgICAiaW1wb3J0IHBrZ19yZXNvdXJjZXNcbiIKKyAgICAgICAgICAgICAgICAicGtnX3Jlc291cmNlcy5ydW5fc2NyaXB0KCUoc3BlYylyLCAlKHNjcmlwdF9uYW1lKXIpXG4iCisgICAgICAgICAgICApICUgbG9jYWxzKCkKKworICAgICAgICBzZWxmLndyaXRlX3NjcmlwdChzY3JpcHRfbmFtZSwgc2NyaXB0X3RleHQpCisKKyAgICBkZWYgd3JpdGVfc2NyaXB0KHNlbGYsIHNjcmlwdF9uYW1lLCBjb250ZW50cywgbW9kZT0idCIsIGJsb2NrZXJzPSgpKToKKyAgICAgICAgIiIiV3JpdGUgYW4gZXhlY3V0YWJsZSBmaWxlIHRvIHRoZSBzY3JpcHRzIGRpcmVjdG9yeSIiIgorICAgICAgICBzZWxmLmRlbGV0ZV9ibG9ja2VycyggICAjIGNsZWFuIHVwIG9sZCAucHkvLnB5dyB3L28gYSBzY3JpcHQKKyAgICAgICAgICAgIFtvcy5wYXRoLmpvaW4oc2VsZi5zY3JpcHRfZGlyLHgpIGZvciB4IGluIGJsb2NrZXJzXSkKKyAgICAgICAgbG9nLmluZm8oIkluc3RhbGxpbmcgJXMgc2NyaXB0IHRvICVzIiwgc2NyaXB0X25hbWUsIHNlbGYuc2NyaXB0X2RpcikKKyAgICAgICAgdGFyZ2V0ID0gb3MucGF0aC5qb2luKHNlbGYuc2NyaXB0X2Rpciwgc2NyaXB0X25hbWUpCisgICAgICAgIHNlbGYuYWRkX291dHB1dCh0YXJnZXQpCisKKyAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkodGFyZ2V0KQorICAgICAgICAgICAgZiA9IG9wZW4odGFyZ2V0LCJ3Iittb2RlKQorICAgICAgICAgICAgZi53cml0ZShjb250ZW50cykKKyAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLmNobW9kKHRhcmdldCwwNzU1KQorICAgICAgICAgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgb3MuZXJyb3IpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBpbnN0YWxsX2VnZ3Moc2VsZiwgc3BlYywgZGlzdF9maWxlbmFtZSwgdG1wZGlyKToKKyAgICAgICAgIyAuZWdnIGRpcnMgb3IgZmlsZXMgYXJlIGFscmVhZHkgYnVpbHQsIHNvIGp1c3QgcmV0dXJuIHRoZW0KKyAgICAgICAgaWYgZGlzdF9maWxlbmFtZS5sb3dlcigpLmVuZHN3aXRoKCcuZWdnJyk6CisgICAgICAgICAgICByZXR1cm4gW3NlbGYuaW5zdGFsbF9lZ2coZGlzdF9maWxlbmFtZSwgdG1wZGlyKV0KKyAgICAgICAgZWxpZiBkaXN0X2ZpbGVuYW1lLmxvd2VyKCkuZW5kc3dpdGgoJy5leGUnKToKKyAgICAgICAgICAgIHJldHVybiBbc2VsZi5pbnN0YWxsX2V4ZShkaXN0X2ZpbGVuYW1lLCB0bXBkaXIpXQorCisgICAgICAgICMgQW55dGhpbmcgZWxzZSwgdHJ5IHRvIGV4dHJhY3QgYW5kIGJ1aWxkCisgICAgICAgIHNldHVwX2Jhc2UgPSB0bXBkaXIKKyAgICAgICAgaWYgb3MucGF0aC5pc2ZpbGUoZGlzdF9maWxlbmFtZSkgYW5kIG5vdCBkaXN0X2ZpbGVuYW1lLmVuZHN3aXRoKCcucHknKToKKyAgICAgICAgICAgIHVucGFja19hcmNoaXZlKGRpc3RfZmlsZW5hbWUsIHRtcGRpciwgc2VsZi51bnBhY2tfcHJvZ3Jlc3MpCisgICAgICAgIGVsaWYgb3MucGF0aC5pc2RpcihkaXN0X2ZpbGVuYW1lKToKKyAgICAgICAgICAgIHNldHVwX2Jhc2UgPSBvcy5wYXRoLmFic3BhdGgoZGlzdF9maWxlbmFtZSkKKworICAgICAgICBpZiAoc2V0dXBfYmFzZS5zdGFydHN3aXRoKHRtcGRpcikgICAjIHNvbWV0aGluZyB3ZSBkb3dubG9hZGVkCisgICAgICAgICAgICBhbmQgc2VsZi5idWlsZF9kaXJlY3RvcnkgYW5kIHNwZWMgaXMgbm90IE5vbmUKKyAgICAgICAgKToKKyAgICAgICAgICAgIHNldHVwX2Jhc2UgPSBzZWxmLm1heWJlX21vdmUoc3BlYywgZGlzdF9maWxlbmFtZSwgc2V0dXBfYmFzZSkKKworICAgICAgICAjIEZpbmQgdGhlIHNldHVwLnB5IGZpbGUKKyAgICAgICAgc2V0dXBfc2NyaXB0ID0gb3MucGF0aC5qb2luKHNldHVwX2Jhc2UsICdzZXR1cC5weScpCisKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNldHVwX3NjcmlwdCk6CisgICAgICAgICAgICBzZXR1cHMgPSBnbG9iKG9zLnBhdGguam9pbihzZXR1cF9iYXNlLCAnKicsICdzZXR1cC5weScpKQorICAgICAgICAgICAgaWYgbm90IHNldHVwczoKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGZpbmQgYSBzZXR1cCBzY3JpcHQgaW4gJXMiICUgZGlzdF9maWxlbmFtZQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGlmIGxlbihzZXR1cHMpPjE6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJNdWx0aXBsZSBzZXR1cCBzY3JpcHRzIGluICVzIiAlIGRpc3RfZmlsZW5hbWUKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBzZXR1cF9zY3JpcHQgPSBzZXR1cHNbMF0KKworICAgICAgICAjIE5vdyBydW4gaXQsIGFuZCByZXR1cm4gdGhlIHJlc3VsdAorICAgICAgICBpZiBzZWxmLmVkaXRhYmxlOgorICAgICAgICAgICAgbG9nLndhcm4oc2VsZi5yZXBvcnRfZWRpdGFibGUoc3BlYywgc2V0dXBfc2NyaXB0KSkKKyAgICAgICAgICAgIHJldHVybiBbXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuYnVpbGRfYW5kX2luc3RhbGwoc2V0dXBfc2NyaXB0LCBzZXR1cF9iYXNlKQorCisgICAgZGVmIGVnZ19kaXN0cmlidXRpb24oc2VsZiwgZWdnX3BhdGgpOgorICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGVnZ19wYXRoKToKKyAgICAgICAgICAgIG1ldGFkYXRhID0gUGF0aE1ldGFkYXRhKGVnZ19wYXRoLG9zLnBhdGguam9pbihlZ2dfcGF0aCwnRUdHLUlORk8nKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1ldGFkYXRhID0gRWdnTWV0YWRhdGEoemlwaW1wb3J0LnppcGltcG9ydGVyKGVnZ19wYXRoKSkKKyAgICAgICAgcmV0dXJuIERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKGVnZ19wYXRoLG1ldGFkYXRhPW1ldGFkYXRhKQorCisgICAgZGVmIGluc3RhbGxfZWdnKHNlbGYsIGVnZ19wYXRoLCB0bXBkaXIpOgorICAgICAgICBkZXN0aW5hdGlvbiA9IG9zLnBhdGguam9pbihzZWxmLmluc3RhbGxfZGlyLG9zLnBhdGguYmFzZW5hbWUoZWdnX3BhdGgpKQorICAgICAgICBkZXN0aW5hdGlvbiA9IG9zLnBhdGguYWJzcGF0aChkZXN0aW5hdGlvbikKKyAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgIGVuc3VyZV9kaXJlY3RvcnkoZGVzdGluYXRpb24pCisKKyAgICAgICAgZGlzdCA9IHNlbGYuZWdnX2Rpc3RyaWJ1dGlvbihlZ2dfcGF0aCkKKyAgICAgICAgc2VsZi5jaGVja19jb25mbGljdHMoZGlzdCkKKyAgICAgICAgaWYgbm90IHNhbWVmaWxlKGVnZ19wYXRoLCBkZXN0aW5hdGlvbik6CisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGRlc3RpbmF0aW9uKSBhbmQgbm90IG9zLnBhdGguaXNsaW5rKGRlc3RpbmF0aW9uKToKKyAgICAgICAgICAgICAgICBkaXJfdXRpbC5yZW1vdmVfdHJlZShkZXN0aW5hdGlvbiwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisgICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKGRlc3RpbmF0aW9uKToKKyAgICAgICAgICAgICAgICBzZWxmLmV4ZWN1dGUob3MudW5saW5rLChkZXN0aW5hdGlvbiwpLCJSZW1vdmluZyAiK2Rlc3RpbmF0aW9uKQorICAgICAgICAgICAgdW5jYWNoZV96aXBkaXIoZGVzdGluYXRpb24pCisgICAgICAgICAgICBpZiBvcy5wYXRoLmlzZGlyKGVnZ19wYXRoKToKKyAgICAgICAgICAgICAgICBpZiBlZ2dfcGF0aC5zdGFydHN3aXRoKHRtcGRpcik6CisgICAgICAgICAgICAgICAgICAgIGYsbSA9IHNodXRpbC5tb3ZlLCAiTW92aW5nIgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGYsbSA9IHNodXRpbC5jb3B5dHJlZSwgIkNvcHlpbmciCisgICAgICAgICAgICBlbGlmIHNlbGYuc2hvdWxkX3VuemlwKGRpc3QpOgorICAgICAgICAgICAgICAgIHNlbGYubWtwYXRoKGRlc3RpbmF0aW9uKQorICAgICAgICAgICAgICAgIGYsbSA9IHNlbGYudW5wYWNrX2FuZF9jb21waWxlLCAiRXh0cmFjdGluZyIKKyAgICAgICAgICAgIGVsaWYgZWdnX3BhdGguc3RhcnRzd2l0aCh0bXBkaXIpOgorICAgICAgICAgICAgICAgIGYsbSA9IHNodXRpbC5tb3ZlLCAiTW92aW5nIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBmLG0gPSBzaHV0aWwuY29weTIsICJDb3B5aW5nIgorCisgICAgICAgICAgICBzZWxmLmV4ZWN1dGUoZiwgKGVnZ19wYXRoLCBkZXN0aW5hdGlvbiksCisgICAgICAgICAgICAgICAgKG0rIiAlcyB0byAlcyIpICUKKyAgICAgICAgICAgICAgICAob3MucGF0aC5iYXNlbmFtZShlZ2dfcGF0aCksb3MucGF0aC5kaXJuYW1lKGRlc3RpbmF0aW9uKSkpCisKKyAgICAgICAgc2VsZi5hZGRfb3V0cHV0KGRlc3RpbmF0aW9uKQorICAgICAgICByZXR1cm4gc2VsZi5lZ2dfZGlzdHJpYnV0aW9uKGRlc3RpbmF0aW9uKQorCisgICAgZGVmIGluc3RhbGxfZXhlKHNlbGYsIGRpc3RfZmlsZW5hbWUsIHRtcGRpcik6CisgICAgICAgICMgU2VlIGlmIGl0J3MgdmFsaWQsIGdldCBkYXRhCisgICAgICAgIGNmZyA9IGV4dHJhY3Rfd2luaW5zdF9jZmcoZGlzdF9maWxlbmFtZSkKKyAgICAgICAgaWYgY2ZnIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgdmFsaWQgZGlzdHV0aWxzIFdpbmRvd3MgLmV4ZSIgJSBkaXN0X2ZpbGVuYW1lCisgICAgICAgICAgICApCisgICAgICAgICMgQ3JlYXRlIGEgZHVtbXkgZGlzdHJpYnV0aW9uIG9iamVjdCB1bnRpbCB3ZSBidWlsZCB0aGUgcmVhbCBkaXN0cm8KKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbihOb25lLAorICAgICAgICAgICAgcHJvamVjdF9uYW1lPWNmZy5nZXQoJ21ldGFkYXRhJywnbmFtZScpLAorICAgICAgICAgICAgdmVyc2lvbj1jZmcuZ2V0KCdtZXRhZGF0YScsJ3ZlcnNpb24nKSwgcGxhdGZvcm09IndpbjMyIgorICAgICAgICApCisKKyAgICAgICAgIyBDb252ZXJ0IHRoZSAuZXhlIHRvIGFuIHVucGFja2VkIGVnZworICAgICAgICBlZ2dfcGF0aCA9IGRpc3QubG9jYXRpb24gPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBkaXN0LmVnZ19uYW1lKCkrJy5lZ2cnKQorICAgICAgICBlZ2dfdG1wICA9IGVnZ19wYXRoKycudG1wJworICAgICAgICBlZ2dfaW5mbyA9IG9zLnBhdGguam9pbihlZ2dfdG1wLCAnRUdHLUlORk8nKQorICAgICAgICBwa2dfaW5mID0gb3MucGF0aC5qb2luKGVnZ19pbmZvLCAnUEtHLUlORk8nKQorICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHBrZ19pbmYpICAgIyBtYWtlIHN1cmUgRUdHLUlORk8gZGlyIGV4aXN0cworICAgICAgICBkaXN0Ll9wcm92aWRlciA9IFBhdGhNZXRhZGF0YShlZ2dfdG1wLCBlZ2dfaW5mbykgICAgIyBYWFgKKyAgICAgICAgc2VsZi5leGVfdG9fZWdnKGRpc3RfZmlsZW5hbWUsIGVnZ190bXApCisKKyAgICAgICAgIyBXcml0ZSBFR0ctSU5GTy9QS0ctSU5GTworICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGtnX2luZik6CisgICAgICAgICAgICBmID0gb3Blbihwa2dfaW5mLCd3JykKKyAgICAgICAgICAgIGYud3JpdGUoJ01ldGFkYXRhLVZlcnNpb246IDEuMFxuJykKKyAgICAgICAgICAgIGZvciBrLHYgaW4gY2ZnLml0ZW1zKCdtZXRhZGF0YScpOgorICAgICAgICAgICAgICAgIGlmIGs8Pid0YXJnZXRfdmVyc2lvbic6CisgICAgICAgICAgICAgICAgICAgIGYud3JpdGUoJyVzOiAlc1xuJyAlIChrLnJlcGxhY2UoJ18nLCctJykudGl0bGUoKSwgdikpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgc2NyaXB0X2RpciA9IG9zLnBhdGguam9pbihlZ2dfaW5mbywnc2NyaXB0cycpCisgICAgICAgIHNlbGYuZGVsZXRlX2Jsb2NrZXJzKCAgICMgZGVsZXRlIGVudHJ5LXBvaW50IHNjcmlwdHMgdG8gYXZvaWQgZHVwaW5nCisgICAgICAgICAgICBbb3MucGF0aC5qb2luKHNjcmlwdF9kaXIsYXJnc1swXSkgZm9yIGFyZ3MgaW4gZ2V0X3NjcmlwdF9hcmdzKGRpc3QpXQorICAgICAgICApCisgICAgICAgICMgQnVpbGQgLmVnZyBmaWxlIGZyb20gdG1wZGlyCisgICAgICAgIGJkaXN0X2VnZy5tYWtlX3ppcGZpbGUoCisgICAgICAgICAgICBlZ2dfcGF0aCwgZWdnX3RtcCwgdmVyYm9zZT1zZWxmLnZlcmJvc2UsIGRyeV9ydW49c2VsZi5kcnlfcnVuCisgICAgICAgICkKKyAgICAgICAgIyBpbnN0YWxsIHRoZSAuZWdnCisgICAgICAgIHJldHVybiBzZWxmLmluc3RhbGxfZWdnKGVnZ19wYXRoLCB0bXBkaXIpCisKKyAgICBkZWYgZXhlX3RvX2VnZyhzZWxmLCBkaXN0X2ZpbGVuYW1lLCBlZ2dfdG1wKToKKyAgICAgICAgIiIiRXh0cmFjdCBhIGJkaXN0X3dpbmluc3QgdG8gdGhlIGRpcmVjdG9yaWVzIGFuIGVnZyB3b3VsZCB1c2UiIiIKKyAgICAgICAgIyBDaGVjayBmb3IgLnB0aCBmaWxlIGFuZCBzZXQgdXAgcHJlZml4IHRyYW5zbGF0aW9ucworICAgICAgICBwcmVmaXhlcyA9IGdldF9leGVfcHJlZml4ZXMoZGlzdF9maWxlbmFtZSkKKyAgICAgICAgdG9fY29tcGlsZSA9IFtdCisgICAgICAgIG5hdGl2ZV9saWJzID0gW10KKyAgICAgICAgdG9wX2xldmVsID0ge30KKworICAgICAgICBkZWYgcHJvY2VzcyhzcmMsZHN0KToKKyAgICAgICAgICAgIGZvciBvbGQsbmV3IGluIHByZWZpeGVzOgorICAgICAgICAgICAgICAgIGlmIHNyYy5zdGFydHN3aXRoKG9sZCk6CisgICAgICAgICAgICAgICAgICAgIHNyYyA9IG5ldytzcmNbbGVuKG9sZCk6XQorICAgICAgICAgICAgICAgICAgICBwYXJ0cyA9IHNyYy5zcGxpdCgnLycpCisgICAgICAgICAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbihlZ2dfdG1wLCAqcGFydHMpCisgICAgICAgICAgICAgICAgICAgIGRsID0gZHN0Lmxvd2VyKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgZGwuZW5kc3dpdGgoJy5weWQnKSBvciBkbC5lbmRzd2l0aCgnLmRsbCcpOgorICAgICAgICAgICAgICAgICAgICAgICAgdG9wX2xldmVsW29zLnBhdGguc3BsaXRleHQocGFydHNbMF0pWzBdXSA9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9saWJzLmFwcGVuZChzcmMpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgZGwuZW5kc3dpdGgoJy5weScpIGFuZCBvbGQhPSdTQ1JJUFRTLyc6CisgICAgICAgICAgICAgICAgICAgICAgICB0b3BfbGV2ZWxbb3MucGF0aC5zcGxpdGV4dChwYXJ0c1swXSlbMF1dID0gMQorICAgICAgICAgICAgICAgICAgICAgICAgdG9fY29tcGlsZS5hcHBlbmQoZHN0KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZHN0CisgICAgICAgICAgICBpZiBub3Qgc3JjLmVuZHN3aXRoKCcucHRoJyk6CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIldBUk5JTkc6IGNhbid0IHByb2Nlc3MgJXMiLCBzcmMpCisgICAgICAgICAgICByZXR1cm4gTm9uZQorCisgICAgICAgICMgZXh0cmFjdCwgdHJhY2tpbmcgLnB5ZC8uZGxsLT5uYXRpdmVfbGlicyBhbmQgLnB5IC0+IHRvX2NvbXBpbGUKKyAgICAgICAgdW5wYWNrX2FyY2hpdmUoZGlzdF9maWxlbmFtZSwgZWdnX3RtcCwgcHJvY2VzcykKKyAgICAgICAgc3R1YnMgPSBbXQorICAgICAgICBmb3IgcmVzIGluIG5hdGl2ZV9saWJzOgorICAgICAgICAgICAgaWYgcmVzLmxvd2VyKCkuZW5kc3dpdGgoJy5weWQnKTogICAgIyBjcmVhdGUgc3R1YnMgZm9yIC5weWQncworICAgICAgICAgICAgICAgIHBhcnRzID0gcmVzLnNwbGl0KCcvJykKKyAgICAgICAgICAgICAgICByZXNvdXJjZSwgcGFydHNbLTFdID0gcGFydHNbLTFdLCBwYXJ0c1stMV1bOi0xXQorICAgICAgICAgICAgICAgIHB5ZmlsZSA9IG9zLnBhdGguam9pbihlZ2dfdG1wLCAqcGFydHMpCisgICAgICAgICAgICAgICAgdG9fY29tcGlsZS5hcHBlbmQocHlmaWxlKTsgc3R1YnMuYXBwZW5kKHB5ZmlsZSkKKyAgICAgICAgICAgICAgICBiZGlzdF9lZ2cud3JpdGVfc3R1YihyZXNvdXJjZSwgcHlmaWxlKQorCisgICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKHRvX2NvbXBpbGUpICAgIyBjb21waWxlIC5weSdzCisgICAgICAgIGJkaXN0X2VnZy53cml0ZV9zYWZldHlfZmxhZyhvcy5wYXRoLmpvaW4oZWdnX3RtcCwnRUdHLUlORk8nKSwKKyAgICAgICAgICAgIGJkaXN0X2VnZy5hbmFseXplX2VnZyhlZ2dfdG1wLCBzdHVicykpICAjIHdyaXRlIHppcC1zYWZldHkgZmxhZworCisgICAgICAgIGZvciBuYW1lIGluICd0b3BfbGV2ZWwnLCduYXRpdmVfbGlicyc6CisgICAgICAgICAgICBpZiBsb2NhbHMoKVtuYW1lXToKKyAgICAgICAgICAgICAgICB0eHQgPSBvcy5wYXRoLmpvaW4oZWdnX3RtcCwgJ0VHRy1JTkZPJywgbmFtZSsnLnR4dCcpCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHR4dCk6CisgICAgICAgICAgICAgICAgICAgIG9wZW4odHh0LCd3Jykud3JpdGUoJ1xuJy5qb2luKGxvY2FscygpW25hbWVdKSsnXG4nKQorCisgICAgZGVmIGNoZWNrX2NvbmZsaWN0cyhzZWxmLCBkaXN0KToKKyAgICAgICAgIiIiVmVyaWZ5IHRoYXQgdGhlcmUgYXJlIG5vIGNvbmZsaWN0aW5nICJvbGQtc3R5bGUiIHBhY2thZ2VzIiIiCisKKyAgICAgICAgcmV0dXJuIGRpc3QgICAgICMgWFhYIHRlbXBvcmFyaWx5IGRpc2FibGUgdW50aWwgbmV3IHN0cmF0ZWd5IGlzIHN0YWJsZQorICAgICAgICBmcm9tIGltcCBpbXBvcnQgZmluZF9tb2R1bGUsIGdldF9zdWZmaXhlcworICAgICAgICBmcm9tIGdsb2IgaW1wb3J0IGdsb2IKKworICAgICAgICBibG9ja2VycyA9IFtdCisgICAgICAgIG5hbWVzID0gZGljdC5mcm9ta2V5cyhkaXN0Ll9nZXRfbWV0YWRhdGEoJ3RvcF9sZXZlbC50eHQnKSkgIyBYWFggcHJpdmF0ZSBhdHRyCisKKyAgICAgICAgZXh0cyA9IHsnLnB5Yyc6MSwgJy5weW8nOjF9ICAgICAjIGdldF9zdWZmaXhlcygpIG1pZ2h0IGxlYXZlIG9uZSBvdXQKKyAgICAgICAgZm9yIGV4dCxtb2RlLHR5cCBpbiBnZXRfc3VmZml4ZXMoKToKKyAgICAgICAgICAgIGV4dHNbZXh0XSA9IDEKKworICAgICAgICBmb3IgcGF0aCxmaWxlcyBpbiBleHBhbmRfcGF0aHMoW3NlbGYuaW5zdGFsbF9kaXJdK3NlbGYuYWxsX3NpdGVfZGlycyk6CisgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgYmFzZSxleHQgPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIGlmIGJhc2UgaW4gbmFtZXM6CisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBleHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAjIG5vIGV4dGVuc2lvbiwgY2hlY2sgZm9yIHBhY2thZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLCBmaWxlbmFtZSwgZGVzY3IgPSBmaW5kX21vZHVsZShiYXNlLCBbcGF0aF0pCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZjogZi5jbG9zZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZmlsZW5hbWUgbm90IGluIGJsb2NrZXJzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja2Vycy5hcHBlbmQoZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgIGVsaWYgZXh0IGluIGV4dHMgYW5kIGJhc2UhPSdzaXRlJzogICMgWFhYIHVnaAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tlcnMuYXBwZW5kKG9zLnBhdGguam9pbihwYXRoLGZpbGVuYW1lKSkKKyAgICAgICAgaWYgYmxvY2tlcnM6CisgICAgICAgICAgICBzZWxmLmZvdW5kX2NvbmZsaWN0cyhkaXN0LCBibG9ja2VycykKKworICAgICAgICByZXR1cm4gZGlzdAorCisgICAgZGVmIGZvdW5kX2NvbmZsaWN0cyhzZWxmLCBkaXN0LCBibG9ja2Vycyk6CisgICAgICAgIGlmIHNlbGYuZGVsZXRlX2NvbmZsaWN0aW5nOgorICAgICAgICAgICAgbG9nLndhcm4oIkF0dGVtcHRpbmcgdG8gZGVsZXRlIGNvbmZsaWN0aW5nIHBhY2thZ2VzOiIpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5kZWxldGVfYmxvY2tlcnMoYmxvY2tlcnMpCisKKyAgICAgICAgbXNnID0gIiIiXAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorQ09ORkxJQ1QgV0FSTklORzoKKworVGhlIGZvbGxvd2luZyBtb2R1bGVzIG9yIHBhY2thZ2VzIGhhdmUgdGhlIHNhbWUgbmFtZXMgYXMgbW9kdWxlcyBvcgorcGFja2FnZXMgYmVpbmcgaW5zdGFsbGVkLCBhbmQgd2lsbCBiZSAqYmVmb3JlKiB0aGUgaW5zdGFsbGVkIHBhY2thZ2VzIGluCitQeXRob24ncyBzZWFyY2ggcGF0aC4gIFlvdSBNVVNUIHJlbW92ZSBhbGwgb2YgdGhlIHJlbGV2YW50IGZpbGVzIGFuZAorZGlyZWN0b3JpZXMgYmVmb3JlIHlvdSB3aWxsIGJlIGFibGUgdG8gdXNlIHRoZSBwYWNrYWdlKHMpIHlvdSBhcmUKK2luc3RhbGxpbmc6CisKKyAgICVzCisKKyIiIiAlICdcbiAgICcuam9pbihibG9ja2VycykKKworICAgICAgICBpZiBzZWxmLmlnbm9yZV9jb25mbGljdHNfYXRfbXlfcmlzazoKKyAgICAgICAgICAgIG1zZyArPSAiIiJcCisoTm90ZTogeW91IGNhbiBydW4gRWFzeUluc3RhbGwgb24gJyVzJyB3aXRoIHRoZQorLS1kZWxldGUtY29uZmxpY3Rpbmcgb3B0aW9uIHRvIGF0dGVtcHQgZGVsZXRpb24gb2YgdGhlIGFib3ZlIGZpbGVzCithbmQvb3IgZGlyZWN0b3JpZXMuKQorIiIiICUgZGlzdC5wcm9qZWN0X25hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1zZyArPSAiIiJcCitOb3RlOiB5b3UgY2FuIGF0dGVtcHQgdGhpcyBpbnN0YWxsYXRpb24gYWdhaW4gd2l0aCBFYXN5SW5zdGFsbCwgYW5kIHVzZQorZWl0aGVyIHRoZSAtLWRlbGV0ZS1jb25mbGljdGluZyAoLUQpIG9wdGlvbiBvciB0aGUKKy0taWdub3JlLWNvbmZsaWN0cy1hdC1teS1yaXNrIG9wdGlvbiwgdG8gZWl0aGVyIGRlbGV0ZSB0aGUgYWJvdmUgZmlsZXMKK2FuZCBkaXJlY3Rvcmllcywgb3IgdG8gaWdub3JlIHRoZSBjb25mbGljdHMsIHJlc3BlY3RpdmVseS4gIE5vdGUgdGhhdCBpZgoreW91IGlnbm9yZSB0aGUgY29uZmxpY3RzLCB0aGUgaW5zdGFsbGVkIHBhY2thZ2UocykgbWF5IG5vdCB3b3JrLgorIiIiCisgICAgICAgIG1zZyArPSAiIiJcCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisiIiIKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZShtc2cpCisgICAgICAgIHN5cy5zdGRlcnIuZmx1c2goKQorICAgICAgICBpZiBub3Qgc2VsZi5pZ25vcmVfY29uZmxpY3RzX2F0X215X3Jpc2s6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigiSW5zdGFsbGF0aW9uIGFib3J0ZWQgZHVlIHRvIGNvbmZsaWN0cyIpCisKKyAgICBkZWYgaW5zdGFsbGF0aW9uX3JlcG9ydChzZWxmLCByZXEsIGRpc3QsIHdoYXQ9Ikluc3RhbGxlZCIpOgorICAgICAgICAiIiJIZWxwZnVsIGluc3RhbGxhdGlvbiBtZXNzYWdlIGZvciBkaXNwbGF5IHRvIHBhY2thZ2UgdXNlcnMiIiIKKyAgICAgICAgbXNnID0gIlxuJSh3aGF0KXMgJShlZ2dsb2MpcyUoZXh0cmFzKXMiCisgICAgICAgIGlmIHNlbGYubXVsdGlfdmVyc2lvbiBhbmQgbm90IHNlbGYubm9fcmVwb3J0OgorICAgICAgICAgICAgbXNnICs9ICIiIgorCitCZWNhdXNlIHRoaXMgZGlzdHJpYnV0aW9uIHdhcyBpbnN0YWxsZWQgLS1tdWx0aS12ZXJzaW9uIG9yIC0taW5zdGFsbC1kaXIsCitiZWZvcmUgeW91IGNhbiBpbXBvcnQgbW9kdWxlcyBmcm9tIHRoaXMgcGFja2FnZSBpbiBhbiBhcHBsaWNhdGlvbiwgeW91Cit3aWxsIG5lZWQgdG8gJ2ltcG9ydCBwa2dfcmVzb3VyY2VzJyBhbmQgdGhlbiB1c2UgYSAncmVxdWlyZSgpJyBjYWxsCitzaW1pbGFyIHRvIG9uZSBvZiB0aGVzZSBleGFtcGxlcywgaW4gb3JkZXIgdG8gc2VsZWN0IHRoZSBkZXNpcmVkIHZlcnNpb246CisKKyAgICBwa2dfcmVzb3VyY2VzLnJlcXVpcmUoIiUobmFtZSlzIikgICMgbGF0ZXN0IGluc3RhbGxlZCB2ZXJzaW9uCisgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCIlKG5hbWUpcz09JSh2ZXJzaW9uKXMiKSAgIyB0aGlzIGV4YWN0IHZlcnNpb24KKyAgICBwa2dfcmVzb3VyY2VzLnJlcXVpcmUoIiUobmFtZSlzPj0lKHZlcnNpb24pcyIpICAjIHRoaXMgdmVyc2lvbiBvciBoaWdoZXIKKyIiIgorICAgICAgICAgICAgaWYgc2VsZi5pbnN0YWxsX2RpciBub3QgaW4gbWFwKG5vcm1hbGl6ZV9wYXRoLHN5cy5wYXRoKToKKyAgICAgICAgICAgICAgICBtc2cgKz0gIiIiCisKK05vdGUgYWxzbyB0aGF0IHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IG11c3QgYmUgb24gc3lzLnBhdGggYXQgcnVudGltZSBmb3IKK3RoaXMgdG8gd29yay4gIChlLmcuIGJ5IGJlaW5nIHRoZSBhcHBsaWNhdGlvbidzIHNjcmlwdCBkaXJlY3RvcnksIGJ5IGJlaW5nIG9uCitQWVRIT05QQVRILCBvciBieSBiZWluZyBhZGRlZCB0byBzeXMucGF0aCBieSB5b3VyIGNvZGUuKQorIiIiCisgICAgICAgIGVnZ2xvYyA9IGRpc3QubG9jYXRpb24KKyAgICAgICAgbmFtZSA9IGRpc3QucHJvamVjdF9uYW1lCisgICAgICAgIHZlcnNpb24gPSBkaXN0LnZlcnNpb24KKyAgICAgICAgZXh0cmFzID0gJycgIyBUT0RPOiBzZWxmLnJlcG9ydF9leHRyYXMocmVxLCBkaXN0KQorICAgICAgICByZXR1cm4gbXNnICUgbG9jYWxzKCkKKworICAgIGRlZiByZXBvcnRfZWRpdGFibGUoc2VsZiwgc3BlYywgc2V0dXBfc2NyaXB0KToKKyAgICAgICAgZGlybmFtZSA9IG9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpCisgICAgICAgIHB5dGhvbiA9IHN5cy5leGVjdXRhYmxlCisgICAgICAgIHJldHVybiAiIiJcbkV4dHJhY3RlZCBlZGl0YWJsZSB2ZXJzaW9uIG9mICUoc3BlYylzIHRvICUoZGlybmFtZSlzCisKK0lmIGl0IHVzZXMgc2V0dXB0b29scyBpbiBpdHMgc2V0dXAgc2NyaXB0LCB5b3UgY2FuIGFjdGl2YXRlIGl0IGluCisiZGV2ZWxvcG1lbnQiIG1vZGUgYnkgZ29pbmcgdG8gdGhhdCBkaXJlY3RvcnkgYW5kIHJ1bm5pbmc6OgorCisgICAgJShweXRob24pcyBzZXR1cC5weSBkZXZlbG9wCisKK1NlZSB0aGUgc2V0dXB0b29scyBkb2N1bWVudGF0aW9uIGZvciB0aGUgImRldmVsb3AiIGNvbW1hbmQgZm9yIG1vcmUgaW5mby4KKyIiIiAlIGxvY2FscygpCisKKyAgICBkZWYgcnVuX3NldHVwKHNlbGYsIHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSwgYXJncyk6CisgICAgICAgIHN5cy5tb2R1bGVzLnNldGRlZmF1bHQoJ2Rpc3R1dGlscy5jb21tYW5kLmJkaXN0X2VnZycsIGJkaXN0X2VnZykKKyAgICAgICAgc3lzLm1vZHVsZXMuc2V0ZGVmYXVsdCgnZGlzdHV0aWxzLmNvbW1hbmQuZWdnX2luZm8nLCBlZ2dfaW5mbykKKworICAgICAgICBhcmdzID0gbGlzdChhcmdzKQorICAgICAgICBpZiBzZWxmLnZlcmJvc2U+MjoKKyAgICAgICAgICAgIHYgPSAndicgKiAoc2VsZi52ZXJib3NlIC0gMSkKKyAgICAgICAgICAgIGFyZ3MuaW5zZXJ0KDAsJy0nK3YpCisgICAgICAgIGVsaWYgc2VsZi52ZXJib3NlPDI6CisgICAgICAgICAgICBhcmdzLmluc2VydCgwLCctcScpCisgICAgICAgIGlmIHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgIGFyZ3MuaW5zZXJ0KDAsJy1uJykKKyAgICAgICAgbG9nLmluZm8oCisgICAgICAgICAgICAiUnVubmluZyAlcyAlcyIsIHNldHVwX3NjcmlwdFtsZW4oc2V0dXBfYmFzZSkrMTpdLCAnICcuam9pbihhcmdzKQorICAgICAgICApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJ1bl9zZXR1cChzZXR1cF9zY3JpcHQsIGFyZ3MpCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0LCB2OgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoIlNldHVwIHNjcmlwdCBleGl0ZWQgd2l0aCAlcyIgJSAodi5hcmdzWzBdLCkpCisKKyAgICBkZWYgYnVpbGRfYW5kX2luc3RhbGwoc2VsZiwgc2V0dXBfc2NyaXB0LCBzZXR1cF9iYXNlKToKKyAgICAgICAgYXJncyA9IFsnYmRpc3RfZWdnJywgJy0tZGlzdC1kaXInXQorICAgICAgICBkaXN0X2RpciA9IHRlbXBmaWxlLm1rZHRlbXAoCisgICAgICAgICAgICBwcmVmaXg9J2VnZy1kaXN0LXRtcC0nLCBkaXI9b3MucGF0aC5kaXJuYW1lKHNldHVwX3NjcmlwdCkKKyAgICAgICAgKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBhcmdzLmFwcGVuZChkaXN0X2RpcikKKyAgICAgICAgICAgIHNlbGYucnVuX3NldHVwKHNldHVwX3NjcmlwdCwgc2V0dXBfYmFzZSwgYXJncykKKyAgICAgICAgICAgIGFsbF9lZ2dzID0gRW52aXJvbm1lbnQoW2Rpc3RfZGlyXSkKKyAgICAgICAgICAgIGVnZ3MgPSBbXQorICAgICAgICAgICAgZm9yIGtleSBpbiBhbGxfZWdnczoKKyAgICAgICAgICAgICAgICBmb3IgZGlzdCBpbiBhbGxfZWdnc1trZXldOgorICAgICAgICAgICAgICAgICAgICBlZ2dzLmFwcGVuZChzZWxmLmluc3RhbGxfZWdnKGRpc3QubG9jYXRpb24sIHNldHVwX2Jhc2UpKQorICAgICAgICAgICAgaWYgbm90IGVnZ3MgYW5kIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIk5vIGVnZ3MgZm91bmQgaW4gJXMgKHNldHVwIHNjcmlwdCBwcm9ibGVtPykiLAorICAgICAgICAgICAgICAgICAgICBkaXN0X2RpcikKKyAgICAgICAgICAgIHJldHVybiBlZ2dzCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBybXRyZWUoZGlzdF9kaXIpCisgICAgICAgICAgICBsb2cuc2V0X3ZlcmJvc2l0eShzZWxmLnZlcmJvc2UpICMgcmVzdG9yZSBvdXIgbG9nIHZlcmJvc2l0eQorCisgICAgZGVmIHVwZGF0ZV9wdGgoc2VsZixkaXN0KToKKyAgICAgICAgaWYgc2VsZi5wdGhfZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZm9yIGQgaW4gc2VsZi5wdGhfZmlsZVtkaXN0LmtleV06ICAgICMgZHJvcCBvbGQgZW50cmllcworICAgICAgICAgICAgaWYgc2VsZi5tdWx0aV92ZXJzaW9uIG9yIGQubG9jYXRpb24gIT0gZGlzdC5sb2NhdGlvbjoKKyAgICAgICAgICAgICAgICBsb2cuaW5mbygiUmVtb3ZpbmcgJXMgZnJvbSBlYXN5LWluc3RhbGwucHRoIGZpbGUiLCBkKQorICAgICAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUucmVtb3ZlKGQpCisgICAgICAgICAgICAgICAgaWYgZC5sb2NhdGlvbiBpbiBzZWxmLnNoYWRvd19wYXRoOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNoYWRvd19wYXRoLnJlbW92ZShkLmxvY2F0aW9uKQorCisgICAgICAgIGlmIG5vdCBzZWxmLm11bHRpX3ZlcnNpb246CisgICAgICAgICAgICBpZiBkaXN0LmxvY2F0aW9uIGluIHNlbGYucHRoX2ZpbGUucGF0aHM6CisgICAgICAgICAgICAgICAgbG9nLmluZm8oCisgICAgICAgICAgICAgICAgICAgICIlcyBpcyBhbHJlYWR5IHRoZSBhY3RpdmUgdmVyc2lvbiBpbiBlYXN5LWluc3RhbGwucHRoIiwKKyAgICAgICAgICAgICAgICAgICAgZGlzdAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbG9nLmluZm8oIkFkZGluZyAlcyB0byBlYXN5LWluc3RhbGwucHRoIGZpbGUiLCBkaXN0KQorICAgICAgICAgICAgICAgIHNlbGYucHRoX2ZpbGUuYWRkKGRpc3QpICMgYWRkIG5ldyBlbnRyeQorICAgICAgICAgICAgICAgIGlmIGRpc3QubG9jYXRpb24gbm90IGluIHNlbGYuc2hhZG93X3BhdGg6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2hhZG93X3BhdGguYXBwZW5kKGRpc3QubG9jYXRpb24pCisKKyAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKworICAgICAgICAgICAgc2VsZi5wdGhfZmlsZS5zYXZlKCkKKworICAgICAgICAgICAgaWYgZGlzdC5rZXk9PSdzZXR1cHRvb2xzJzoKKyAgICAgICAgICAgICAgICAjIEVuc3VyZSB0aGF0IHNldHVwdG9vbHMgaXRzZWxmIG5ldmVyIGJlY29tZXMgdW5hdmFpbGFibGUhCisgICAgICAgICAgICAgICAgIyBYWFggc2hvdWxkIHRoaXMgY2hlY2sgZm9yIGxhdGVzdCB2ZXJzaW9uPworICAgICAgICAgICAgICAgIGZpbGVuYW1lID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsJ3NldHVwdG9vbHMucHRoJykKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmlzbGluayhmaWxlbmFtZSk6IG9zLnVubGluayhmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3d0JykKKyAgICAgICAgICAgICAgICBmLndyaXRlKHNlbGYucHRoX2ZpbGUubWFrZV9yZWxhdGl2ZShkaXN0LmxvY2F0aW9uKSsnXG4nKQorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIHVucGFja19wcm9ncmVzcyhzZWxmLCBzcmMsIGRzdCk6CisgICAgICAgICMgUHJvZ3Jlc3MgZmlsdGVyIGZvciB1bnBhY2tpbmcKKyAgICAgICAgbG9nLmRlYnVnKCJVbnBhY2tpbmcgJXMgdG8gJXMiLCBzcmMsIGRzdCkKKyAgICAgICAgcmV0dXJuIGRzdCAgICAgIyBvbmx5IHVucGFjay1hbmQtY29tcGlsZSBza2lwcyBmaWxlcyBmb3IgZHJ5IHJ1bgorCisgICAgZGVmIHVucGFja19hbmRfY29tcGlsZShzZWxmLCBlZ2dfcGF0aCwgZGVzdGluYXRpb24pOgorICAgICAgICB0b19jb21waWxlID0gW10KKworICAgICAgICBkZWYgcGYoc3JjLGRzdCk6CisgICAgICAgICAgICBpZiBkc3QuZW5kc3dpdGgoJy5weScpIGFuZCBub3Qgc3JjLnN0YXJ0c3dpdGgoJ0VHRy1JTkZPLycpOgorICAgICAgICAgICAgICAgIHRvX2NvbXBpbGUuYXBwZW5kKGRzdCkKKyAgICAgICAgICAgIHNlbGYudW5wYWNrX3Byb2dyZXNzKHNyYyxkc3QpCisgICAgICAgICAgICByZXR1cm4gbm90IHNlbGYuZHJ5X3J1biBhbmQgZHN0IG9yIE5vbmUKKworICAgICAgICB1bnBhY2tfYXJjaGl2ZShlZ2dfcGF0aCwgZGVzdGluYXRpb24sIHBmKQorICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZSh0b19jb21waWxlKQorCisKKyAgICBkZWYgYnl0ZV9jb21waWxlKHNlbGYsIHRvX2NvbXBpbGUpOgorICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBieXRlX2NvbXBpbGUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgIyB0cnkgdG8gbWFrZSB0aGUgYnl0ZSBjb21waWxlIG1lc3NhZ2VzIHF1aWV0ZXIKKyAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSAtIDEpCisKKyAgICAgICAgICAgIGJ5dGVfY29tcGlsZSh0b19jb21waWxlLCBvcHRpbWl6ZT0wLCBmb3JjZT0xLCBkcnlfcnVuPXNlbGYuZHJ5X3J1bikKKyAgICAgICAgICAgIGlmIHNlbGYub3B0aW1pemU6CisgICAgICAgICAgICAgICAgYnl0ZV9jb21waWxlKAorICAgICAgICAgICAgICAgICAgICB0b19jb21waWxlLCBvcHRpbWl6ZT1zZWxmLm9wdGltaXplLCBmb3JjZT0xLAorICAgICAgICAgICAgICAgICAgICBkcnlfcnVuPXNlbGYuZHJ5X3J1bgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGxvZy5zZXRfdmVyYm9zaXR5KHNlbGYudmVyYm9zZSkgICAgICMgcmVzdG9yZSBvcmlnaW5hbCB2ZXJib3NpdHkKKworCisKKworCisKKworCisKKworCisKKworCisgICAgZGVmIG5vX2RlZmF1bHRfdmVyc2lvbl9tc2coc2VsZik6CisgICAgICAgIHJldHVybiAiIiJiYWQgaW5zdGFsbCBkaXJlY3Rvcnkgb3IgUFlUSE9OUEFUSAorCitZb3UgYXJlIGF0dGVtcHRpbmcgdG8gaW5zdGFsbCBhIHBhY2thZ2UgdG8gYSBkaXJlY3RvcnkgdGhhdCBpcyBub3QKK29uIFBZVEhPTlBBVEggYW5kIHdoaWNoIFB5dGhvbiBkb2VzIG5vdCByZWFkICIucHRoIiBmaWxlcyBmcm9tLiAgVGhlCitpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHlvdSBzcGVjaWZpZWQgKHZpYSAtLWluc3RhbGwtZGlyLCAtLXByZWZpeCwgb3IKK3RoZSBkaXN0dXRpbHMgZGVmYXVsdCBzZXR0aW5nKSB3YXM6CisKKyAgICAlcworCithbmQgeW91ciBQWVRIT05QQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIGN1cnJlbnRseSBjb250YWluczoKKworICAgICVyCisKK0hlcmUgYXJlIHNvbWUgb2YgeW91ciBvcHRpb25zIGZvciBjb3JyZWN0aW5nIHRoZSBwcm9ibGVtOgorCisqIFlvdSBjYW4gY2hvb3NlIGEgZGlmZmVyZW50IGluc3RhbGxhdGlvbiBkaXJlY3RvcnksIGkuZS4sIG9uZSB0aGF0IGlzCisgIG9uIFBZVEhPTlBBVEggb3Igc3VwcG9ydHMgLnB0aCBmaWxlcworCisqIFlvdSBjYW4gYWRkIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5IHRvIHRoZSBQWVRIT05QQVRIIGVudmlyb25tZW50CisgIHZhcmlhYmxlLiAgKEl0IG11c3QgdGhlbiBhbHNvIGJlIG9uIFBZVEhPTlBBVEggd2hlbmV2ZXIgeW91IHJ1bgorICBQeXRob24gYW5kIHdhbnQgdG8gdXNlIHRoZSBwYWNrYWdlKHMpIHlvdSBhcmUgaW5zdGFsbGluZy4pCisKKyogWW91IGNhbiBzZXQgdXAgdGhlIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgdG8gc3VwcG9ydCAiLnB0aCIgZmlsZXMgYnkKKyAgdXNpbmcgb25lIG9mIHRoZSBhcHByb2FjaGVzIGRlc2NyaWJlZCBoZXJlOgorCisgIGh0dHA6Ly9wZWFrLnRlbGVjb21tdW5pdHkuY29tL0Vhc3lJbnN0YWxsLmh0bWwjY3VzdG9tLWluc3RhbGxhdGlvbi1sb2NhdGlvbnMKKworUGxlYXNlIG1ha2UgdGhlIGFwcHJvcHJpYXRlIGNoYW5nZXMgZm9yIHlvdXIgc3lzdGVtIGFuZCB0cnkgYWdhaW4uIiIiICUgKAorICAgICAgICBzZWxmLmluc3RhbGxfZGlyLCBvcy5lbnZpcm9uLmdldCgnUFlUSE9OUEFUSCcsJycpCisgICAgKQorCisKKworCisKKworCisKKworCisgICAgZGVmIGluc3RhbGxfc2l0ZV9weShzZWxmKToKKyAgICAgICAgIiIiTWFrZSBzdXJlIHRoZXJlJ3MgYSBzaXRlLnB5IGluIHRoZSB0YXJnZXQgZGlyLCBpZiBuZWVkZWQiIiIKKworICAgICAgICBpZiBzZWxmLnNpdGVweV9pbnN0YWxsZWQ6CisgICAgICAgICAgICByZXR1cm4gICMgYWxyZWFkeSBkaWQgaXQsIG9yIGRvbid0IG5lZWQgdG8KKworICAgICAgICBzaXRlcHkgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgInNpdGUucHkiKQorICAgICAgICBzb3VyY2UgPSByZXNvdXJjZV9zdHJpbmcoInNldHVwdG9vbHMiLCAic2l0ZS1wYXRjaC5weSIpCisgICAgICAgIGN1cnJlbnQgPSAiIgorCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNpdGVweSk6CisgICAgICAgICAgICBsb2cuZGVidWcoIkNoZWNraW5nIGV4aXN0aW5nIHNpdGUucHkgaW4gJXMiLCBzZWxmLmluc3RhbGxfZGlyKQorICAgICAgICAgICAgY3VycmVudCA9IG9wZW4oc2l0ZXB5LCdyYicpLnJlYWQoKQorICAgICAgICAgICAgaWYgbm90IGN1cnJlbnQuc3RhcnRzd2l0aCgnZGVmIF9fYm9vdCgpOicpOgorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAorICAgICAgICAgICAgICAgICAgICAiJXMgaXMgbm90IGEgc2V0dXB0b29scy1nZW5lcmF0ZWQgc2l0ZS5weTsgcGxlYXNlIgorICAgICAgICAgICAgICAgICAgICAiIHJlbW92ZSBpdC4iICUgc2l0ZXB5CisgICAgICAgICAgICAgICAgKQorCisgICAgICAgIGlmIGN1cnJlbnQgIT0gc291cmNlOgorICAgICAgICAgICAgbG9nLmluZm8oIkNyZWF0aW5nICVzIiwgc2l0ZXB5KQorICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICBlbnN1cmVfZGlyZWN0b3J5KHNpdGVweSkKKyAgICAgICAgICAgICAgICBmID0gb3BlbihzaXRlcHksJ3diJykKKyAgICAgICAgICAgICAgICBmLndyaXRlKHNvdXJjZSkKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuYnl0ZV9jb21waWxlKFtzaXRlcHldKQorCisgICAgICAgIHNlbGYuc2l0ZXB5X2luc3RhbGxlZCA9IFRydWUKKworCisKKworCisKKworCisKKworCisKKyAgICBJTlNUQUxMX1NDSEVNRVMgPSBkaWN0KAorICAgICAgICBwb3NpeCA9IGRpY3QoCisgICAgICAgICAgICBpbnN0YWxsX2RpciA9ICckYmFzZS9saWIvcHl0aG9uJHB5X3ZlcnNpb25fc2hvcnQvc2l0ZS1wYWNrYWdlcycsCisgICAgICAgICAgICBzY3JpcHRfZGlyICA9ICckYmFzZS9iaW4nLAorICAgICAgICApLAorICAgICkKKworICAgIERFRkFVTFRfU0NIRU1FID0gZGljdCgKKyAgICAgICAgaW5zdGFsbF9kaXIgPSAnJGJhc2UvTGliL3NpdGUtcGFja2FnZXMnLAorICAgICAgICBzY3JpcHRfZGlyICA9ICckYmFzZS9TY3JpcHRzJywKKyAgICApCisKKyAgICBkZWYgX2V4cGFuZChzZWxmLCAqYXR0cnMpOgorICAgICAgICBjb25maWdfdmFycyA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsJykuY29uZmlnX3ZhcnMKKworICAgICAgICBpZiBzZWxmLnByZWZpeDoKKyAgICAgICAgICAgICMgU2V0IGRlZmF1bHQgaW5zdGFsbF9kaXIvc2NyaXB0cyBmcm9tIC0tcHJlZml4CisgICAgICAgICAgICBjb25maWdfdmFycyA9IGNvbmZpZ192YXJzLmNvcHkoKQorICAgICAgICAgICAgY29uZmlnX3ZhcnNbJ2Jhc2UnXSA9IHNlbGYucHJlZml4CisgICAgICAgICAgICBzY2hlbWUgPSBzZWxmLklOU1RBTExfU0NIRU1FUy5nZXQob3MubmFtZSxzZWxmLkRFRkFVTFRfU0NIRU1FKQorICAgICAgICAgICAgZm9yIGF0dHIsdmFsIGluIHNjaGVtZS5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIGdldGF0dHIoc2VsZixhdHRyLE5vbmUpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoc2VsZixhdHRyLHZhbCkKKworICAgICAgICBmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBzdWJzdF92YXJzCisgICAgICAgIGZvciBhdHRyIGluIGF0dHJzOgorICAgICAgICAgICAgdmFsID0gZ2V0YXR0cihzZWxmLCBhdHRyKQorICAgICAgICAgICAgaWYgdmFsIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHZhbCA9IHN1YnN0X3ZhcnModmFsLCBjb25maWdfdmFycykKKyAgICAgICAgICAgICAgICBpZiBvcy5uYW1lID09ICdwb3NpeCc6CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IG9zLnBhdGguZXhwYW5kdXNlcih2YWwpCisgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBhdHRyLCB2YWwpCisKKworCisKKworCisKKworCitkZWYgZ2V0X3NpdGVfZGlycygpOgorICAgICMgcmV0dXJuIGEgbGlzdCBvZiAnc2l0ZScgZGlycworICAgIHNpdGVkaXJzID0gZmlsdGVyKE5vbmUsb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnLCcnKS5zcGxpdChvcy5wYXRoc2VwKSkKKyAgICBwcmVmaXhlcyA9IFtzeXMucHJlZml4XQorICAgIGlmIHN5cy5leGVjX3ByZWZpeCAhPSBzeXMucHJlZml4OgorICAgICAgICBwcmVmaXhlcy5hcHBlbmQoc3lzLmV4ZWNfcHJlZml4KQorICAgIGZvciBwcmVmaXggaW4gcHJlZml4ZXM6CisgICAgICAgIGlmIHByZWZpeDoKKyAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiAoJ29zMmVteCcsICdyaXNjb3MnKToKKyAgICAgICAgICAgICAgICBzaXRlZGlycy5hcHBlbmQob3MucGF0aC5qb2luKHByZWZpeCwgIkxpYiIsICJzaXRlLXBhY2thZ2VzIikpCisgICAgICAgICAgICBlbGlmIG9zLnNlcCA9PSAnLyc6CisgICAgICAgICAgICAgICAgc2l0ZWRpcnMuZXh0ZW5kKFtvcy5wYXRoLmpvaW4ocHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGliIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB5dGhvbiIgKyBzeXMudmVyc2lvbls6M10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzaXRlLXBhY2thZ2VzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5qb2luKHByZWZpeCwgImxpYiIsICJzaXRlLXB5dGhvbiIpXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2l0ZWRpcnMuZXh0ZW5kKAorICAgICAgICAgICAgICAgICAgICBbcHJlZml4LCBvcy5wYXRoLmpvaW4ocHJlZml4LCAibGliIiwgInNpdGUtcGFja2FnZXMiKV0KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gJ2Rhcndpbic6CisgICAgICAgICAgICAgICAgIyBmb3IgZnJhbWV3b3JrIGJ1aWxkcyAqb25seSogd2UgYWRkIHRoZSBzdGFuZGFyZCBBcHBsZQorICAgICAgICAgICAgICAgICMgbG9jYXRpb25zLiBDdXJyZW50bHkgb25seSBwZXItdXNlciwgYnV0IC9MaWJyYXJ5IGFuZAorICAgICAgICAgICAgICAgICMgL05ldHdvcmsvTGlicmFyeSBjb3VsZCBiZSBhZGRlZCB0b28KKyAgICAgICAgICAgICAgICBpZiAnUHl0aG9uLmZyYW1ld29yaycgaW4gcHJlZml4OgorICAgICAgICAgICAgICAgICAgICBob21lID0gb3MuZW52aXJvbi5nZXQoJ0hPTUUnKQorICAgICAgICAgICAgICAgICAgICBpZiBob21lOgorICAgICAgICAgICAgICAgICAgICAgICAgc2l0ZWRpcnMuYXBwZW5kKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbihob21lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnTGlicmFyeScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQeXRob24nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbls6M10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzaXRlLXBhY2thZ2VzJykpCisgICAgZm9yIHBsYXRfc3BlY2lmaWMgaW4gKDAsMSk6CisgICAgICAgIHNpdGVfbGliID0gZ2V0X3B5dGhvbl9saWIocGxhdF9zcGVjaWZpYykKKyAgICAgICAgaWYgc2l0ZV9saWIgbm90IGluIHNpdGVkaXJzOiBzaXRlZGlycy5hcHBlbmQoc2l0ZV9saWIpCisKKyAgICBzaXRlZGlycyA9IG1hcChub3JtYWxpemVfcGF0aCwgc2l0ZWRpcnMpCisgICAgcmV0dXJuIHNpdGVkaXJzCisKKworZGVmIGV4cGFuZF9wYXRocyhpbnB1dHMpOgorICAgICIiIllpZWxkIHN5cy5wYXRoIGRpcmVjdG9yaWVzIHRoYXQgbWlnaHQgY29udGFpbiAib2xkLXN0eWxlIiBwYWNrYWdlcyIiIgorCisgICAgc2VlbiA9IHt9CisKKyAgICBmb3IgZGlybmFtZSBpbiBpbnB1dHM6CisgICAgICAgIGRpcm5hbWUgPSBub3JtYWxpemVfcGF0aChkaXJuYW1lKQorICAgICAgICBpZiBkaXJuYW1lIGluIHNlZW46CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIHNlZW5bZGlybmFtZV0gPSAxCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmlzZGlyKGRpcm5hbWUpOgorICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBmaWxlcyA9IG9zLmxpc3RkaXIoZGlybmFtZSkKKyAgICAgICAgeWllbGQgZGlybmFtZSwgZmlsZXMKKworICAgICAgICBmb3IgbmFtZSBpbiBmaWxlczoKKyAgICAgICAgICAgIGlmIG5vdCBuYW1lLmVuZHN3aXRoKCcucHRoJyk6CisgICAgICAgICAgICAgICAgIyBXZSBvbmx5IGNhcmUgYWJvdXQgdGhlIC5wdGggZmlsZXMKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgaWYgbmFtZSBpbiAoJ2Vhc3ktaW5zdGFsbC5wdGgnLCdzZXR1cHRvb2xzLnB0aCcpOgorICAgICAgICAgICAgICAgICMgSWdub3JlIC5wdGggZmlsZXMgdGhhdCB3ZSBjb250cm9sCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgIyBSZWFkIHRoZSAucHRoIGZpbGUKKyAgICAgICAgICAgIGYgPSBvcGVuKG9zLnBhdGguam9pbihkaXJuYW1lLG5hbWUpKQorICAgICAgICAgICAgbGluZXMgPSBsaXN0KHlpZWxkX2xpbmVzKGYpKQorICAgICAgICAgICAgZi5jbG9zZSgpCisKKyAgICAgICAgICAgICMgWWllbGQgZXhpc3Rpbmcgbm9uLWR1cGUsIG5vbi1pbXBvcnQgZGlyZWN0b3J5IGxpbmVzIGZyb20gaXQKKyAgICAgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgICAgIGlmIG5vdCBsaW5lLnN0YXJ0c3dpdGgoImltcG9ydCIpOgorICAgICAgICAgICAgICAgICAgICBsaW5lID0gbm9ybWFsaXplX3BhdGgobGluZS5yc3RyaXAoKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgbGluZSBub3QgaW4gc2VlbjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZW5bbGluZV0gPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBub3Qgb3MucGF0aC5pc2RpcihsaW5lKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgbGluZSwgb3MubGlzdGRpcihsaW5lKQorCisKK2RlZiBleHRyYWN0X3dpbmluc3RfY2ZnKGRpc3RfZmlsZW5hbWUpOgorICAgICIiIkV4dHJhY3QgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gYSBiZGlzdF93aW5pbnN0IC5leGUKKworICAgIFJldHVybnMgYSBDb25maWdQYXJzZXIuUmF3Q29uZmlnUGFyc2VyLCBvciBOb25lCisgICAgIiIiCisgICAgZiA9IG9wZW4oZGlzdF9maWxlbmFtZSwncmInKQorICAgIHRyeToKKyAgICAgICAgZW5kcmVjID0gemlwZmlsZS5fRW5kUmVjRGF0YShmKQorICAgICAgICBpZiBlbmRyZWMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgcHJlcGVuZGVkID0gKGVuZHJlY1s5XSAtIGVuZHJlY1s1XSkgLSBlbmRyZWNbNl0KKyAgICAgICAgaWYgcHJlcGVuZGVkIDwgMTI6ICAjIG5vIHdpbmluc3QgZGF0YSBoZXJlCisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBmLnNlZWsocHJlcGVuZGVkLTEyKQorCisgICAgICAgIGltcG9ydCBzdHJ1Y3QsIFN0cmluZ0lPLCBDb25maWdQYXJzZXIKKyAgICAgICAgdGFnLCBjZmdsZW4sIGJtbGVuID0gc3RydWN0LnVucGFjaygiPGlpaSIsZi5yZWFkKDEyKSkKKyAgICAgICAgaWYgdGFnIG5vdCBpbiAoMHgxMjM0NTY3QSwgMHgxMjM0NTY3Qik6CisgICAgICAgICAgICByZXR1cm4gTm9uZSAgICAgIyBub3QgYSB2YWxpZCB0YWcKKworICAgICAgICBmLnNlZWsocHJlcGVuZGVkLSgxMitjZmdsZW4rYm1sZW4pKQorICAgICAgICBjZmcgPSBDb25maWdQYXJzZXIuUmF3Q29uZmlnUGFyc2VyKHsndmVyc2lvbic6JycsJ3RhcmdldF92ZXJzaW9uJzonJ30pCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNmZy5yZWFkZnAoU3RyaW5nSU8uU3RyaW5nSU8oZi5yZWFkKGNmZ2xlbikuc3BsaXQoY2hyKDApLDEpWzBdKSkKKyAgICAgICAgZXhjZXB0IENvbmZpZ1BhcnNlci5FcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIGlmIG5vdCBjZmcuaGFzX3NlY3Rpb24oJ21ldGFkYXRhJykgb3Igbm90IGNmZy5oYXNfc2VjdGlvbignU2V0dXAnKToKKyAgICAgICAgICAgIHJldHVybiBOb25lCisgICAgICAgIHJldHVybiBjZmcKKworICAgIGZpbmFsbHk6CisgICAgICAgIGYuY2xvc2UoKQorCisKKworCisKKworCisKK2RlZiBnZXRfZXhlX3ByZWZpeGVzKGV4ZV9maWxlbmFtZSk6CisgICAgIiIiR2V0IGV4ZS0+ZWdnIHBhdGggdHJhbnNsYXRpb25zIGZvciBhIGdpdmVuIC5leGUgZmlsZSIiIgorCisgICAgcHJlZml4ZXMgPSBbCisgICAgICAgICgnUFVSRUxJQi8nLCAnJyksCisgICAgICAgICgnUExBVExJQi8nLCAnJyksCisgICAgICAgICgnU0NSSVBUUy8nLCAnRUdHLUlORk8vc2NyaXB0cy8nKQorICAgIF0KKyAgICB6ID0gemlwZmlsZS5aaXBGaWxlKGV4ZV9maWxlbmFtZSkKKyAgICB0cnk6CisgICAgICAgIGZvciBpbmZvIGluIHouaW5mb2xpc3QoKToKKyAgICAgICAgICAgIG5hbWUgPSBpbmZvLmZpbGVuYW1lCisgICAgICAgICAgICBwYXJ0cyA9IG5hbWUuc3BsaXQoJy8nKQorICAgICAgICAgICAgaWYgbGVuKHBhcnRzKT09MyBhbmQgcGFydHNbMl09PSdQS0ctSU5GTyc6CisgICAgICAgICAgICAgICAgaWYgcGFydHNbMV0uZW5kc3dpdGgoJy5lZ2ctaW5mbycpOgorICAgICAgICAgICAgICAgICAgICBwcmVmaXhlcy5pbnNlcnQoMCwoJy8nLmpvaW4ocGFydHNbOjJdKSwgJ0VHRy1JTkZPLycpKQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaWYgbGVuKHBhcnRzKTw+MiBvciBub3QgbmFtZS5lbmRzd2l0aCgnLnB0aCcpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBuYW1lLmVuZHN3aXRoKCctbnNwa2cucHRoJyk6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGlmIHBhcnRzWzBdIGluICgnUFVSRUxJQicsJ1BMQVRMSUInKToKKyAgICAgICAgICAgICAgICBmb3IgcHRoIGluIHlpZWxkX2xpbmVzKHoucmVhZChuYW1lKSk6CisgICAgICAgICAgICAgICAgICAgIHB0aCA9IHB0aC5zdHJpcCgpLnJlcGxhY2UoJ1xcJywnLycpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBwdGguc3RhcnRzd2l0aCgnaW1wb3J0Jyk6CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhlcy5hcHBlbmQoKCgnJXMvJXMvJyAlIChwYXJ0c1swXSxwdGgpKSwgJycpKQorICAgIGZpbmFsbHk6CisgICAgICAgIHouY2xvc2UoKQorCisgICAgcHJlZml4ZXMuc29ydCgpOyBwcmVmaXhlcy5yZXZlcnNlKCkKKyAgICByZXR1cm4gcHJlZml4ZXMKKworCitkZWYgcGFyc2VfcmVxdWlyZW1lbnRfYXJnKHNwZWMpOgorICAgIHRyeToKKyAgICAgICAgcmV0dXJuIFJlcXVpcmVtZW50LnBhcnNlKHNwZWMpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAorICAgICAgICAgICAgIk5vdCBhIFVSTCwgZXhpc3RpbmcgZmlsZSwgb3IgcmVxdWlyZW1lbnQgc3BlYzogJXIiICUgKHNwZWMsKQorICAgICAgICApCisKK2NsYXNzIFB0aERpc3RyaWJ1dGlvbnMoRW52aXJvbm1lbnQpOgorICAgICIiIkEgLnB0aCBmaWxlIHdpdGggRGlzdHJpYnV0aW9uIHBhdGhzIGluIGl0IiIiCisKKyAgICBkaXJ0eSA9IEZhbHNlCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBzZWxmLmZpbGVuYW1lID0gZmlsZW5hbWUKKyAgICAgICAgc2VsZi5iYXNlZGlyID0gbm9ybWFsaXplX3BhdGgob3MucGF0aC5kaXJuYW1lKHNlbGYuZmlsZW5hbWUpKQorICAgICAgICBzZWxmLl9sb2FkKCk7IEVudmlyb25tZW50Ll9faW5pdF9fKHNlbGYsIFtdLCBOb25lLCBOb25lKQorICAgICAgICBmb3IgcGF0aCBpbiB5aWVsZF9saW5lcyhzZWxmLnBhdGhzKToKKyAgICAgICAgICAgIG1hcChzZWxmLmFkZCwgZmluZF9kaXN0cmlidXRpb25zKHBhdGgsIFRydWUpKQorCisgICAgZGVmIF9sb2FkKHNlbGYpOgorICAgICAgICBzZWxmLnBhdGhzID0gW10KKyAgICAgICAgc2F3X2ltcG9ydCA9IEZhbHNlCisgICAgICAgIHNlZW4gPSB7fQorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShzZWxmLmZpbGVuYW1lKToKKyAgICAgICAgICAgIGZvciBsaW5lIGluIG9wZW4oc2VsZi5maWxlbmFtZSwncnQnKToKKyAgICAgICAgICAgICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJ2ltcG9ydCcpOgorICAgICAgICAgICAgICAgICAgICBzYXdfaW1wb3J0ID0gVHJ1ZQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHBhdGggPSBsaW5lLnJzdHJpcCgpCisgICAgICAgICAgICAgICAgc2VsZi5wYXRocy5hcHBlbmQocGF0aCkKKyAgICAgICAgICAgICAgICBpZiBub3QgcGF0aC5zdHJpcCgpIG9yIHBhdGguc3RyaXAoKS5zdGFydHN3aXRoKCcjJyk6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgIyBza2lwIG5vbi1leGlzdGVudCBwYXRocywgaW4gY2FzZSBzb21lYm9keSBkZWxldGVkIGEgcGFja2FnZQorICAgICAgICAgICAgICAgICMgbWFudWFsbHksIGFuZCBkdXBsaWNhdGUgcGF0aHMgYXMgd2VsbAorICAgICAgICAgICAgICAgIHBhdGggPSBzZWxmLnBhdGhzWy0xXSA9IG5vcm1hbGl6ZV9wYXRoKAorICAgICAgICAgICAgICAgICAgICBvcy5wYXRoLmpvaW4oc2VsZi5iYXNlZGlyLHBhdGgpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKSBvciBwYXRoIGluIHNlZW46CisgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aHMucG9wKCkgICAgIyBza2lwIGl0CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGlydHkgPSBUcnVlICAgIyB3ZSBjbGVhbmVkIHVwLCBzbyB3ZSdyZSBkaXJ0eSBub3cgOikKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBzZWVuW3BhdGhdID0gMQorCisgICAgICAgIGlmIHNlbGYucGF0aHMgYW5kIG5vdCBzYXdfaW1wb3J0OgorICAgICAgICAgICAgc2VsZi5kaXJ0eSA9IFRydWUgICAjIGVuc3VyZSBhbnl0aGluZyB3ZSB0b3VjaCBoYXMgaW1wb3J0IHdyYXBwZXJzCisgICAgICAgIHdoaWxlIHNlbGYucGF0aHMgYW5kIG5vdCBzZWxmLnBhdGhzWy0xXS5zdHJpcCgpOgorICAgICAgICAgICAgc2VsZi5wYXRocy5wb3AoKQorCisgICAgZGVmIHNhdmUoc2VsZik6CisgICAgICAgICIiIldyaXRlIGNoYW5nZWQgLnB0aCBmaWxlIGJhY2sgdG8gZGlzayIiIgorICAgICAgICBpZiBub3Qgc2VsZi5kaXJ0eToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIGRhdGEgPSAnXG4nLmpvaW4obWFwKHNlbGYubWFrZV9yZWxhdGl2ZSxzZWxmLnBhdGhzKSkKKyAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2F2aW5nICVzIiwgc2VsZi5maWxlbmFtZSkKKyAgICAgICAgICAgIGRhdGEgPSAoCisgICAgICAgICAgICAgICAgImltcG9ydCBzeXM7IHN5cy5fX3BsZW4gPSBsZW4oc3lzLnBhdGgpXG4iCisgICAgICAgICAgICAgICAgIiVzXG4iCisgICAgICAgICAgICAgICAgImltcG9ydCBzeXM7IG5ldz1zeXMucGF0aFtzeXMuX19wbGVuOl07IgorICAgICAgICAgICAgICAgICIgZGVsIHN5cy5wYXRoW3N5cy5fX3BsZW46XTsiCisgICAgICAgICAgICAgICAgIiBwPWdldGF0dHIoc3lzLCdfX2VnZ2luc2VydCcsMCk7IHN5cy5wYXRoW3A6cF09bmV3OyIKKyAgICAgICAgICAgICAgICAiIHN5cy5fX2VnZ2luc2VydCA9IHArbGVuKG5ldylcbiIKKyAgICAgICAgICAgICkgJSBkYXRhCisKKyAgICAgICAgICAgIGlmIG9zLnBhdGguaXNsaW5rKHNlbGYuZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgIG9zLnVubGluayhzZWxmLmZpbGVuYW1lKQorICAgICAgICAgICAgZiA9IG9wZW4oc2VsZi5maWxlbmFtZSwnd2InKQorICAgICAgICAgICAgZi53cml0ZShkYXRhKTsgZi5jbG9zZSgpCisKKyAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzZWxmLmZpbGVuYW1lKToKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiRGVsZXRpbmcgZW1wdHkgJXMiLCBzZWxmLmZpbGVuYW1lKQorICAgICAgICAgICAgb3MudW5saW5rKHNlbGYuZmlsZW5hbWUpCisKKyAgICAgICAgc2VsZi5kaXJ0eSA9IEZhbHNlCisKKyAgICBkZWYgYWRkKHNlbGYsZGlzdCk6CisgICAgICAgICIiIkFkZCBgZGlzdGAgdG8gdGhlIGRpc3RyaWJ1dGlvbiBtYXAiIiIKKyAgICAgICAgaWYgZGlzdC5sb2NhdGlvbiBub3QgaW4gc2VsZi5wYXRoczoKKyAgICAgICAgICAgIHNlbGYucGF0aHMuYXBwZW5kKGRpc3QubG9jYXRpb24pOyBzZWxmLmRpcnR5ID0gVHJ1ZQorICAgICAgICBFbnZpcm9ubWVudC5hZGQoc2VsZixkaXN0KQorCisgICAgZGVmIHJlbW92ZShzZWxmLGRpc3QpOgorICAgICAgICAiIiJSZW1vdmUgYGRpc3RgIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBtYXAiIiIKKyAgICAgICAgd2hpbGUgZGlzdC5sb2NhdGlvbiBpbiBzZWxmLnBhdGhzOgorICAgICAgICAgICAgc2VsZi5wYXRocy5yZW1vdmUoZGlzdC5sb2NhdGlvbik7IHNlbGYuZGlydHkgPSBUcnVlCisgICAgICAgIEVudmlyb25tZW50LnJlbW92ZShzZWxmLGRpc3QpCisKKworICAgIGRlZiBtYWtlX3JlbGF0aXZlKHNlbGYscGF0aCk6CisgICAgICAgIGlmIG5vcm1hbGl6ZV9wYXRoKG9zLnBhdGguZGlybmFtZShwYXRoKSk9PXNlbGYuYmFzZWRpcjoKKyAgICAgICAgICAgIHJldHVybiBvcy5wYXRoLmJhc2VuYW1lKHBhdGgpCisgICAgICAgIHJldHVybiBwYXRoCisKKworZGVmIGdldF9zY3JpcHRfaGVhZGVyKHNjcmlwdF90ZXh0LCBleGVjdXRhYmxlPXN5c19leGVjdXRhYmxlKToKKyAgICAiIiJDcmVhdGUgYSAjISBsaW5lLCBnZXR0aW5nIG9wdGlvbnMgKGlmIGFueSkgZnJvbSBzY3JpcHRfdGV4dCIiIgorICAgIGZyb20gZGlzdHV0aWxzLmNvbW1hbmQuYnVpbGRfc2NyaXB0cyBpbXBvcnQgZmlyc3RfbGluZV9yZQorICAgIGZpcnN0LCByZXN0ID0gKHNjcmlwdF90ZXh0KydcbicpLnNwbGl0KCdcbicsMSkKKyAgICBtYXRjaCA9IGZpcnN0X2xpbmVfcmUubWF0Y2goZmlyc3QpCisgICAgb3B0aW9ucyA9ICcnCisgICAgaWYgbWF0Y2g6CisgICAgICAgIHNjcmlwdF90ZXh0ID0gcmVzdAorICAgICAgICBvcHRpb25zID0gbWF0Y2guZ3JvdXAoMSkgb3IgJycKKyAgICAgICAgaWYgb3B0aW9uczoKKyAgICAgICAgICAgIG9wdGlvbnMgPSAnICcrb3B0aW9ucworICAgIHJldHVybiAiIyElKGV4ZWN1dGFibGUpcyUob3B0aW9ucylzXG4iICUgbG9jYWxzKCkKKworCitkZWYgYXV0b19jaG1vZChmdW5jLCBhcmcsIGV4Yyk6CisgICAgaWYgZnVuYyBpcyBvcy5yZW1vdmUgYW5kIG9zLm5hbWU9PSdudCc6CisgICAgICAgIG9zLmNobW9kKGFyZywgc3RhdC5TX0lXUklURSkKKyAgICAgICAgcmV0dXJuIGZ1bmMoYXJnKQorICAgIGV4YyA9IHN5cy5leGNfaW5mbygpCisgICAgcmFpc2UgZXhjWzBdLCAoZXhjWzFdWzBdLCBleGNbMV1bMV0gKyAoIiAlcyAlcyIgJSAoZnVuYyxhcmcpKSkKKworCitkZWYgdW5jYWNoZV96aXBkaXIocGF0aCk6CisgICAgIiIiRW5zdXJlIHRoYXQgdGhlIHppcCBkaXJlY3RvcnkgY2FjaGUgZG9lc24ndCBoYXZlIHN0YWxlIGluZm8gZm9yIHBhdGgiIiIKKyAgICBmcm9tIHppcGltcG9ydCBpbXBvcnQgX3ppcF9kaXJlY3RvcnlfY2FjaGUgYXMgemRjCisgICAgaWYgcGF0aCBpbiB6ZGM6CisgICAgICAgIGRlbCB6ZGNbcGF0aF0KKyAgICBlbHNlOgorICAgICAgICBwYXRoID0gbm9ybWFsaXplX3BhdGgocGF0aCkKKyAgICAgICAgZm9yIHAgaW4gemRjOgorICAgICAgICAgICAgaWYgbm9ybWFsaXplX3BhdGgocCk9PXBhdGg6CisgICAgICAgICAgICAgICAgZGVsIHpkY1twXQorICAgICAgICAgICAgICAgIHJldHVybgorCisKK2RlZiBnZXRfc2NyaXB0X2FyZ3MoZGlzdCwgZXhlY3V0YWJsZT1zeXNfZXhlY3V0YWJsZSk6CisgICAgIiIiWWllbGQgd3JpdGVfc2NyaXB0KCkgYXJndW1lbnQgdHVwbGVzIGZvciBhIGRpc3RyaWJ1dGlvbidzIGVudHJ5cG9pbnRzIiIiCisgICAgc3BlYyA9IHN0cihkaXN0LmFzX3JlcXVpcmVtZW50KCkpCisgICAgaGVhZGVyID0gZ2V0X3NjcmlwdF9oZWFkZXIoIiIsIGV4ZWN1dGFibGUpCisgICAgZm9yIGdyb3VwIGluICdjb25zb2xlX3NjcmlwdHMnLCAnZ3VpX3NjcmlwdHMnOgorICAgICAgICBmb3IgbmFtZSxlcCBpbiBkaXN0LmdldF9lbnRyeV9tYXAoZ3JvdXApLml0ZW1zKCk6CisgICAgICAgICAgICBzY3JpcHRfdGV4dCA9ICgKKyAgICAgICAgICAgICAgICAiIyBFQVNZLUlOU1RBTEwtRU5UUlktU0NSSVBUOiAlKHNwZWMpciwlKGdyb3VwKXIsJShuYW1lKXJcbiIKKyAgICAgICAgICAgICAgICAiX19yZXF1aXJlc19fID0gJShzcGVjKXJcbiIKKyAgICAgICAgICAgICAgICAiaW1wb3J0IHN5c1xuIgorICAgICAgICAgICAgICAgICJmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IGxvYWRfZW50cnlfcG9pbnRcbiIKKyAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgInN5cy5leGl0KFxuIgorICAgICAgICAgICAgICAgICIgICBsb2FkX2VudHJ5X3BvaW50KCUoc3BlYylyLCAlKGdyb3VwKXIsICUobmFtZSlyKSgpXG4iCisgICAgICAgICAgICAgICAgIilcbiIKKyAgICAgICAgICAgICkgJSBsb2NhbHMoKQorICAgICAgICAgICAgaWYgc3lzLnBsYXRmb3JtPT0nd2luMzInOgorICAgICAgICAgICAgICAgICMgT24gV2luZG93cywgYWRkIGEgLnB5IGV4dGVuc2lvbiBhbmQgYW4gLmV4ZSBsYXVuY2hlcgorICAgICAgICAgICAgICAgIGlmIGdyb3VwPT0nZ3VpX3NjcmlwdHMnOgorICAgICAgICAgICAgICAgICAgICBleHQsIGxhdW5jaGVyID0gJy1zY3JpcHQucHl3JywgJ2d1aS5leGUnCisgICAgICAgICAgICAgICAgICAgIG9sZCA9IFsnLnB5dyddCisgICAgICAgICAgICAgICAgICAgIG5ld19oZWFkZXIgPSByZS5zdWIoJyg/aSlweXRob24uZXhlJywncHl0aG9udy5leGUnLGhlYWRlcikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBleHQsIGxhdW5jaGVyID0gJy1zY3JpcHQucHknLCAnY2xpLmV4ZScKKyAgICAgICAgICAgICAgICAgICAgb2xkID0gWycucHknLCcucHljJywnLnB5byddCisgICAgICAgICAgICAgICAgICAgIG5ld19oZWFkZXIgPSByZS5zdWIoJyg/aSlweXRob253LmV4ZScsJ3B5dGhvbncuZXhlJyxoZWFkZXIpCisKKyAgICAgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhuZXdfaGVhZGVyWzI6LTFdKToKKyAgICAgICAgICAgICAgICAgICAgaGRyID0gbmV3X2hlYWRlcgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGhkciA9IGhlYWRlcgorICAgICAgICAgICAgICAgIHlpZWxkIChuYW1lK2V4dCwgaGRyK3NjcmlwdF90ZXh0LCAndCcsIFtuYW1lK3ggZm9yIHggaW4gb2xkXSkKKyAgICAgICAgICAgICAgICB5aWVsZCAoCisgICAgICAgICAgICAgICAgICAgIG5hbWUrJy5leGUnLCByZXNvdXJjZV9zdHJpbmcoJ3NldHVwdG9vbHMnLCBsYXVuY2hlciksCisgICAgICAgICAgICAgICAgICAgICdiJyAjIHdyaXRlIGluIGJpbmFyeSBtb2RlCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIE9uIG90aGVyIHBsYXRmb3Jtcywgd2UgYXNzdW1lIHRoZSByaWdodCB0aGluZyB0byBkbyBpcyB0bworICAgICAgICAgICAgICAgICMganVzdCB3cml0ZSB0aGUgc3R1YiB3aXRoIG5vIGV4dGVuc2lvbi4KKyAgICAgICAgICAgICAgICB5aWVsZCAobmFtZSwgaGVhZGVyK3NjcmlwdF90ZXh0KQorCitkZWYgcm10cmVlKHBhdGgsIGlnbm9yZV9lcnJvcnM9RmFsc2UsIG9uZXJyb3I9YXV0b19jaG1vZCk6CisgICAgIiIiUmVjdXJzaXZlbHkgZGVsZXRlIGEgZGlyZWN0b3J5IHRyZWUuCisKKyAgICBUaGlzIGNvZGUgaXMgdGFrZW4gZnJvbSB0aGUgUHl0aG9uIDIuNCB2ZXJzaW9uIG9mICdzaHV0aWwnLCBiZWNhdXNlCisgICAgdGhlIDIuMyB2ZXJzaW9uIGRvZXNuJ3QgcmVhbGx5IHdvcmsgcmlnaHQuCisgICAgIiIiCisgICAgaWYgaWdub3JlX2Vycm9yczoKKyAgICAgICAgZGVmIG9uZXJyb3IoKmFyZ3MpOgorICAgICAgICAgICAgcGFzcworICAgIGVsaWYgb25lcnJvciBpcyBOb25lOgorICAgICAgICBkZWYgb25lcnJvcigqYXJncyk6CisgICAgICAgICAgICByYWlzZQorICAgIG5hbWVzID0gW10KKyAgICB0cnk6CisgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcihwYXRoKQorICAgIGV4Y2VwdCBvcy5lcnJvciwgZXJyOgorICAgICAgICBvbmVycm9yKG9zLmxpc3RkaXIsIHBhdGgsIHN5cy5leGNfaW5mbygpKQorICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICBmdWxsbmFtZSA9IG9zLnBhdGguam9pbihwYXRoLCBuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBtb2RlID0gb3MubHN0YXQoZnVsbG5hbWUpLnN0X21vZGUKKyAgICAgICAgZXhjZXB0IG9zLmVycm9yOgorICAgICAgICAgICAgbW9kZSA9IDAKKyAgICAgICAgaWYgc3RhdC5TX0lTRElSKG1vZGUpOgorICAgICAgICAgICAgcm10cmVlKGZ1bGxuYW1lLCBpZ25vcmVfZXJyb3JzLCBvbmVycm9yKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIG9zLnJlbW92ZShmdWxsbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvciwgZXJyOgorICAgICAgICAgICAgICAgIG9uZXJyb3Iob3MucmVtb3ZlLCBmdWxsbmFtZSwgc3lzLmV4Y19pbmZvKCkpCisgICAgdHJ5OgorICAgICAgICBvcy5ybWRpcihwYXRoKQorICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgb25lcnJvcihvcy5ybWRpciwgcGF0aCwgc3lzLmV4Y19pbmZvKCkpCisKKworCisKKworCisKK2RlZiBtYWluKGFyZ3Y9Tm9uZSwgKiprdyk6CisgICAgZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBzZXR1cAorICAgIGZyb20gc2V0dXB0b29scy5kaXN0IGltcG9ydCBEaXN0cmlidXRpb24KKyAgICBpbXBvcnQgZGlzdHV0aWxzLmNvcmUKKworICAgIFVTQUdFID0gIiIiXAordXNhZ2U6ICUoc2NyaXB0KXMgW29wdGlvbnNdIHJlcXVpcmVtZW50X29yX3VybCAuLi4KKyAgIG9yOiAlKHNjcmlwdClzIC0taGVscAorIiIiCisKKyAgICBkZWYgZ2VuX3VzYWdlIChzY3JpcHRfbmFtZSk6CisgICAgICAgIHNjcmlwdCA9IG9zLnBhdGguYmFzZW5hbWUoc2NyaXB0X25hbWUpCisgICAgICAgIHJldHVybiBVU0FHRSAlIHZhcnMoKQorCisgICAgZGVmIHdpdGhfZWlfdXNhZ2UoZik6CisgICAgICAgIG9sZF9nZW5fdXNhZ2UgPSBkaXN0dXRpbHMuY29yZS5nZW5fdXNhZ2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGlzdHV0aWxzLmNvcmUuZ2VuX3VzYWdlID0gZ2VuX3VzYWdlCisgICAgICAgICAgICByZXR1cm4gZigpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkaXN0dXRpbHMuY29yZS5nZW5fdXNhZ2UgPSBvbGRfZ2VuX3VzYWdlCisKKyAgICBjbGFzcyBEaXN0cmlidXRpb25XaXRob3V0SGVscENvbW1hbmRzKERpc3RyaWJ1dGlvbik6CisgICAgICAgIGRlZiBfc2hvd19oZWxwKHNlbGYsKmFyZ3MsKiprdyk6CisgICAgICAgICAgICB3aXRoX2VpX3VzYWdlKGxhbWJkYTogRGlzdHJpYnV0aW9uLl9zaG93X2hlbHAoc2VsZiwqYXJncywqKmt3KSkKKworICAgIGlmIGFyZ3YgaXMgTm9uZToKKyAgICAgICAgYXJndiA9IHN5cy5hcmd2WzE6XQorCisgICAgd2l0aF9laV91c2FnZShsYW1iZGE6CisgICAgICAgIHNldHVwKAorICAgICAgICAgICAgc2NyaXB0X2FyZ3MgPSBbJy1xJywnZWFzeV9pbnN0YWxsJywgJy12J10rYXJndiwKKyAgICAgICAgICAgIHNjcmlwdF9uYW1lID0gc3lzLmFyZ3ZbMF0gb3IgJ2Vhc3lfaW5zdGFsbCcsCisgICAgICAgICAgICBkaXN0Y2xhc3M9RGlzdHJpYnV0aW9uV2l0aG91dEhlbHBDb21tYW5kcywgKiprdworICAgICAgICApCisgICAgKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9lZ2dfaW5mby5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjY4ZmIzOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvZWdnX2luZm8ucHkKQEAgLTAsMCArMSwzNjUgQEAKKyIiInNldHVwdG9vbHMuY29tbWFuZC5lZ2dfaW5mbworCitDcmVhdGUgYSBkaXN0cmlidXRpb24ncyAuZWdnLWluZm8gZGlyZWN0b3J5IGFuZCBjb250ZW50cyIiIgorCisjIFRoaXMgbW9kdWxlIHNob3VsZCBiZSBrZXB0IGNvbXBhdGlibGUgd2l0aCBQeXRob24gMi4zCitpbXBvcnQgb3MsIHJlCitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKgorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuc2Rpc3QgaW1wb3J0IHNkaXN0Citmcm9tIGRpc3R1dGlscyBpbXBvcnQgZmlsZV91dGlsCitmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKK2Zyb20gZGlzdHV0aWxzLmZpbGVsaXN0IGltcG9ydCBGaWxlTGlzdAorZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBwYXJzZV9yZXF1aXJlbWVudHMsIHNhZmVfbmFtZSwgcGFyc2VfdmVyc2lvbiwgXAorICAgIHNhZmVfdmVyc2lvbiwgeWllbGRfbGluZXMsIEVudHJ5UG9pbnQsIGl0ZXJfZW50cnlfcG9pbnRzLCB0b19maWxlbmFtZQorZnJvbSBzZGlzdCBpbXBvcnQgd2Fsa19yZXZjdHJsCisKK2NsYXNzIGVnZ19pbmZvKENvbW1hbmQpOgorICAgIGRlc2NyaXB0aW9uID0gImNyZWF0ZSBhIGRpc3RyaWJ1dGlvbidzIC5lZ2ctaW5mbyBkaXJlY3RvcnkiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnZWdnLWJhc2U9JywgJ2UnLCAiZGlyZWN0b3J5IGNvbnRhaW5pbmcgLmVnZy1pbmZvIGRpcmVjdG9yaWVzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAoZGVmYXVsdDogdG9wIG9mIHRoZSBzb3VyY2UgdHJlZSkiKSwKKyAgICAgICAgKCd0YWctc3ZuLXJldmlzaW9uJywgJ3InLAorICAgICAgICAgICAgIkFkZCBzdWJ2ZXJzaW9uIHJldmlzaW9uIElEIHRvIHZlcnNpb24gbnVtYmVyIiksCisgICAgICAgICgndGFnLWRhdGUnLCAnZCcsICJBZGQgZGF0ZSBzdGFtcCAoZS5nLiAyMDA1MDUyOCkgdG8gdmVyc2lvbiBudW1iZXIiKSwKKyAgICAgICAgKCd0YWctYnVpbGQ9JywgJ2InLCAiU3BlY2lmeSBleHBsaWNpdCB0YWcgdG8gYWRkIHRvIHZlcnNpb24gbnVtYmVyIiksCisgICAgXQorCisgICAgYm9vbGVhbl9vcHRpb25zID0gWyd0YWctZGF0ZScsJ3RhZy1zdm4tcmV2aXNpb24nXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIHNlbGYuZWdnX25hbWUgPSBOb25lCisgICAgICAgIHNlbGYuZWdnX3ZlcnNpb24gPSBOb25lCisgICAgICAgIHNlbGYuZWdnX2Jhc2UgPSBOb25lCisgICAgICAgIHNlbGYuZWdnX2luZm8gPSBOb25lCisgICAgICAgIHNlbGYudGFnX2J1aWxkID0gTm9uZQorICAgICAgICBzZWxmLnRhZ19zdm5fcmV2aXNpb24gPSAwCisgICAgICAgIHNlbGYudGFnX2RhdGUgPSAwCisgICAgICAgIHNlbGYuYnJva2VuX2VnZ19pbmZvID0gRmFsc2UKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zIChzZWxmKToKKyAgICAgICAgc2VsZi5lZ2dfbmFtZSA9IHNhZmVfbmFtZShzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpKQorICAgICAgICBzZWxmLmVnZ192ZXJzaW9uID0gc2VsZi50YWdnZWRfdmVyc2lvbigpCisKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGlzdCgKKyAgICAgICAgICAgICAgICBwYXJzZV9yZXF1aXJlbWVudHMoJyVzPT0lcycgJSAoc2VsZi5lZ2dfbmFtZSxzZWxmLmVnZ192ZXJzaW9uKSkKKyAgICAgICAgICAgICkKKyAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBkaXN0cmlidXRpb24gbmFtZSBvciB2ZXJzaW9uIHN5bnRheDogJXMtJXMiICUKKyAgICAgICAgICAgICAgICAoc2VsZi5lZ2dfbmFtZSxzZWxmLmVnZ192ZXJzaW9uKQorICAgICAgICAgICAgKQorCisgICAgICAgIGlmIHNlbGYuZWdnX2Jhc2UgaXMgTm9uZToKKyAgICAgICAgICAgIGRpcnMgPSBzZWxmLmRpc3RyaWJ1dGlvbi5wYWNrYWdlX2RpcgorICAgICAgICAgICAgc2VsZi5lZ2dfYmFzZSA9IChkaXJzIG9yIHt9KS5nZXQoJycsb3MuY3VyZGlyKQorCisgICAgICAgIHNlbGYuZW5zdXJlX2Rpcm5hbWUoJ2VnZ19iYXNlJykKKyAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IHRvX2ZpbGVuYW1lKHNlbGYuZWdnX25hbWUpKycuZWdnLWluZm8nCisgICAgICAgIGlmIHNlbGYuZWdnX2Jhc2UgIT0gb3MuY3VyZGlyOgorICAgICAgICAgICAgc2VsZi5lZ2dfaW5mbyA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19iYXNlLCBzZWxmLmVnZ19pbmZvKQorICAgICAgICBpZiAnLScgaW4gc2VsZi5lZ2dfbmFtZTogc2VsZi5jaGVja19icm9rZW5fZWdnX2luZm8oKQorCisgICAgICAgICMgU2V0IHBhY2thZ2UgdmVyc2lvbiBmb3IgdGhlIGJlbmVmaXQgb2YgZHVtYmVyIGNvbW1hbmRzCisgICAgICAgICMgKGUuZy4gc2Rpc3QsIGJkaXN0X3dpbmluc3QsIGV0Yy4pCisgICAgICAgICMKKyAgICAgICAgc2VsZi5kaXN0cmlidXRpb24ubWV0YWRhdGEudmVyc2lvbiA9IHNlbGYuZWdnX3ZlcnNpb24KKworICAgICAgICAjIElmIHdlIGJvb3RzdHJhcHBlZCBhcm91bmQgdGhlIGxhY2sgb2YgYSBQS0ctSU5GTywgYXMgbWlnaHQgYmUgdGhlCisgICAgICAgICMgY2FzZSBpbiBhIGZyZXNoIGNoZWNrb3V0LCBtYWtlIHN1cmUgdGhhdCBhbnkgc3BlY2lhbCB0YWdzIGdldCBhZGRlZAorICAgICAgICAjIHRvIHRoZSB2ZXJzaW9uIGluZm8KKyAgICAgICAgIworICAgICAgICBwZCA9IHNlbGYuZGlzdHJpYnV0aW9uLl9wYXRjaGVkX2Rpc3QKKyAgICAgICAgaWYgcGQgaXMgbm90IE5vbmUgYW5kIHBkLmtleT09c2VsZi5lZ2dfbmFtZS5sb3dlcigpOgorICAgICAgICAgICAgcGQuX3ZlcnNpb24gPSBzZWxmLmVnZ192ZXJzaW9uCisgICAgICAgICAgICBwZC5fcGFyc2VkX3ZlcnNpb24gPSBwYXJzZV92ZXJzaW9uKHNlbGYuZWdnX3ZlcnNpb24pCisgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbi5fcGF0Y2hlZF9kaXN0ID0gTm9uZQorCisKKworICAgIGRlZiB3cml0ZV9vcl9kZWxldGVfZmlsZShzZWxmLCB3aGF0LCBmaWxlbmFtZSwgZGF0YSwgZm9yY2U9RmFsc2UpOgorICAgICAgICAiIiJXcml0ZSBgZGF0YWAgdG8gYGZpbGVuYW1lYCBvciBkZWxldGUgaWYgZW1wdHkKKworICAgICAgICBJZiBgZGF0YWAgaXMgbm9uLWVtcHR5LCB0aGlzIHJvdXRpbmUgaXMgdGhlIHNhbWUgYXMgYGB3cml0ZV9maWxlKClgYC4KKyAgICAgICAgSWYgYGRhdGFgIGlzIGVtcHR5IGJ1dCBub3QgYGBOb25lYGAsIHRoaXMgaXMgdGhlIHNhbWUgYXMgY2FsbGluZworICAgICAgICBgYGRlbGV0ZV9maWxlKGZpbGVuYW1lKWAuICBJZiBgZGF0YWAgaXMgYGBOb25lYGAsIHRoZW4gdGhpcyBpcyBhIG5vLW9wCisgICAgICAgIHVubGVzcyBgZmlsZW5hbWVgIGV4aXN0cywgaW4gd2hpY2ggY2FzZSBhIHdhcm5pbmcgaXMgaXNzdWVkIGFib3V0IHRoZQorICAgICAgICBvcnBoYW5lZCBmaWxlIChpZiBgZm9yY2VgIGlzIGZhbHNlKSwgb3IgZGVsZXRlZCAoaWYgYGZvcmNlYCBpcyB0cnVlKS4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIGRhdGE6CisgICAgICAgICAgICBzZWxmLndyaXRlX2ZpbGUod2hhdCwgZmlsZW5hbWUsIGRhdGEpCisgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgICAgICAgICAgaWYgZGF0YSBpcyBOb25lIGFuZCBub3QgZm9yY2U6CisgICAgICAgICAgICAgICAgbG9nLndhcm4oCisgICAgICAgICAgICAgICAgICAgICIlcyBub3Qgc2V0IGluIHNldHVwKCksIGJ1dCAlcyBleGlzdHMiLCB3aGF0LCBmaWxlbmFtZQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5kZWxldGVfZmlsZShmaWxlbmFtZSkKKworICAgIGRlZiB3cml0ZV9maWxlKHNlbGYsIHdoYXQsIGZpbGVuYW1lLCBkYXRhKToKKyAgICAgICAgIiIiV3JpdGUgYGRhdGFgIHRvIGBmaWxlbmFtZWAgKGlmIG5vdCBhIGRyeSBydW4pIGFmdGVyIGFubm91bmNpbmcgaXQKKworICAgICAgICBgd2hhdGAgaXMgdXNlZCBpbiBhIGxvZyBtZXNzYWdlIHRvIGlkZW50aWZ5IHdoYXQgaXMgYmVpbmcgd3JpdHRlbgorICAgICAgICB0byB0aGUgZmlsZS4KKyAgICAgICAgIiIiCisgICAgICAgIGxvZy5pbmZvKCJ3cml0aW5nICVzIHRvICVzIiwgd2hhdCwgZmlsZW5hbWUpCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3diJykKKyAgICAgICAgICAgIGYud3JpdGUoZGF0YSkKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgZGVmIGRlbGV0ZV9maWxlKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIiIiRGVsZXRlIGBmaWxlbmFtZWAgKGlmIG5vdCBhIGRyeSBydW4pIGFmdGVyIGFubm91bmNpbmcgaXQiIiIKKyAgICAgICAgbG9nLmluZm8oImRlbGV0aW5nICVzIiwgZmlsZW5hbWUpCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCisKKworCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLm1rcGF0aChzZWxmLmVnZ19pbmZvKQorICAgICAgICBpbnN0YWxsZXIgPSBzZWxmLmRpc3RyaWJ1dGlvbi5mZXRjaF9idWlsZF9lZ2cKKyAgICAgICAgZm9yIGVwIGluIGl0ZXJfZW50cnlfcG9pbnRzKCdlZ2dfaW5mby53cml0ZXJzJyk6CisgICAgICAgICAgICB3cml0ZXIgPSBlcC5sb2FkKGluc3RhbGxlcj1pbnN0YWxsZXIpCisgICAgICAgICAgICB3cml0ZXIoc2VsZiwgZXAubmFtZSwgb3MucGF0aC5qb2luKHNlbGYuZWdnX2luZm8sZXAubmFtZSkpCisgICAgICAgIHNlbGYuZmluZF9zb3VyY2VzKCkKKworICAgIGRlZiB0YWdnZWRfdmVyc2lvbihzZWxmKToKKyAgICAgICAgdmVyc2lvbiA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCkKKyAgICAgICAgaWYgc2VsZi50YWdfYnVpbGQ6CisgICAgICAgICAgICB2ZXJzaW9uKz1zZWxmLnRhZ19idWlsZAorICAgICAgICBpZiBzZWxmLnRhZ19zdm5fcmV2aXNpb24gYW5kICgKKyAgICAgICAgICAgIG9zLnBhdGguZXhpc3RzKCcuc3ZuJykgb3Igb3MucGF0aC5leGlzdHMoJ1BLRy1JTkZPJykKKyAgICAgICAgKTogIHZlcnNpb24gKz0gJy1yJXMnICUgc2VsZi5nZXRfc3ZuX3JldmlzaW9uKCkKKyAgICAgICAgaWYgc2VsZi50YWdfZGF0ZToKKyAgICAgICAgICAgIGltcG9ydCB0aW1lOyB2ZXJzaW9uICs9IHRpbWUuc3RyZnRpbWUoIi0lWSVtJWQiKQorICAgICAgICByZXR1cm4gc2FmZV92ZXJzaW9uKHZlcnNpb24pCisKKyAgICBkZWYgZ2V0X3N2bl9yZXZpc2lvbihzZWxmKToKKyAgICAgICAgcmV2aXNpb24gPSAwCisgICAgICAgIHVybHJlID0gcmUuY29tcGlsZSgndXJsPSIoW14iXSspIicpCisgICAgICAgIHJldnJlID0gcmUuY29tcGlsZSgnY29tbWl0dGVkLXJldj0iKFxkKykiJykKKyAgICAgICAgZm9yIGJhc2UsZGlycyxmaWxlcyBpbiBvcy53YWxrKG9zLmN1cmRpcik6CisgICAgICAgICAgICBpZiAnLnN2bicgbm90IGluIGRpcnM6CisgICAgICAgICAgICAgICAgZGlyc1s6XSA9IFtdCisgICAgICAgICAgICAgICAgY29udGludWUgICAgIyBubyBzZW5zZSB3YWxraW5nIHVuY29udHJvbGxlZCBzdWJkaXJzCisgICAgICAgICAgICBkaXJzLnJlbW92ZSgnLnN2bicpCisgICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4oYmFzZSwnLnN2bicsJ2VudHJpZXMnKSkKKyAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBkaXJ1cmwgPSB1cmxyZS5zZWFyY2goZGF0YSkuZ3JvdXAoMSkgICAgIyBnZXQgcmVwb3NpdG9yeSBVUkwKKyAgICAgICAgICAgIGlmIGJhc2U9PW9zLmN1cmRpcjoKKyAgICAgICAgICAgICAgICBiYXNlX3VybCA9IGRpcnVybCsnLycgICAjIHNhdmUgdGhlIHJvb3QgdXJsCisgICAgICAgICAgICBlbGlmIG5vdCBkaXJ1cmwuc3RhcnRzd2l0aChiYXNlX3VybCk6CisgICAgICAgICAgICAgICAgZGlyc1s6XSA9IFtdCisgICAgICAgICAgICAgICAgY29udGludWUgICAgIyBub3QgcGFydCBvZiB0aGUgc2FtZSBzdm4gdHJlZSwgc2tpcCBpdAorICAgICAgICAgICAgZm9yIG1hdGNoIGluIHJldnJlLmZpbmRpdGVyKGRhdGEpOgorICAgICAgICAgICAgICAgIHJldmlzaW9uID0gbWF4KHJldmlzaW9uLCBpbnQobWF0Y2guZ3JvdXAoMSkpKQorICAgICAgICByZXR1cm4gc3RyKHJldmlzaW9uIG9yIGdldF9wa2dfaW5mb19yZXZpc2lvbigpKQorCisgICAgZGVmIGZpbmRfc291cmNlcyhzZWxmKToKKyAgICAgICAgIiIiR2VuZXJhdGUgU09VUkNFUy50eHQgbWFuaWZlc3QgZmlsZSIiIgorICAgICAgICBtYW5pZmVzdF9maWxlbmFtZSA9IG9zLnBhdGguam9pbihzZWxmLmVnZ19pbmZvLCJTT1VSQ0VTLnR4dCIpCisgICAgICAgIG1tID0gbWFuaWZlc3RfbWFrZXIoc2VsZi5kaXN0cmlidXRpb24pCisgICAgICAgIG1tLm1hbmlmZXN0ID0gbWFuaWZlc3RfZmlsZW5hbWUKKyAgICAgICAgbW0ucnVuKCkKKyAgICAgICAgc2VsZi5maWxlbGlzdCA9IG1tLmZpbGVsaXN0CisKKyAgICBkZWYgY2hlY2tfYnJva2VuX2VnZ19pbmZvKHNlbGYpOgorICAgICAgICBiZWkgPSBzZWxmLmVnZ19uYW1lKycuZWdnLWluZm8nCisgICAgICAgIGlmIHNlbGYuZWdnX2Jhc2UgIT0gb3MuY3VyZGlyOgorICAgICAgICAgICAgYmVpID0gb3MucGF0aC5qb2luKHNlbGYuZWdnX2Jhc2UsIGJlaSkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoYmVpKToKKyAgICAgICAgICAgIGxvZy53YXJuKAorICAgICAgICAgICAgICAgICItIio3OCsnXG4nCisgICAgICAgICAgICAgICAgIk5vdGU6IFlvdXIgY3VycmVudCAuZWdnLWluZm8gZGlyZWN0b3J5IGhhcyBhICctJyBpbiBpdHMgbmFtZTsiCisgICAgICAgICAgICAgICAgJ1xudGhpcyB3aWxsIG5vdCB3b3JrIGNvcnJlY3RseSB3aXRoICJzZXR1cC5weSBkZXZlbG9wIi5cblxuJworICAgICAgICAgICAgICAgICdQbGVhc2UgcmVuYW1lICVzIHRvICVzIHRvIGNvcnJlY3QgdGhpcyBwcm9ibGVtLlxuJysnLScqNzgsCisgICAgICAgICAgICAgICAgYmVpLCBzZWxmLmVnZ19pbmZvCisgICAgICAgICAgICApCisgICAgICAgICAgICBzZWxmLmJyb2tlbl9lZ2dfaW5mbyA9IHNlbGYuZWdnX2luZm8KKyAgICAgICAgICAgIHNlbGYuZWdnX2luZm8gPSBiZWkgICAgICMgbWFrZSBpdCB3b3JrIGZvciBub3cKKworY2xhc3MgRmlsZUxpc3QoRmlsZUxpc3QpOgorICAgICIiIkZpbGUgbGlzdCB0aGF0IGFjY2VwdHMgb25seSBleGlzdGluZywgcGxhdGZvcm0taW5kZXBlbmRlbnQgcGF0aHMiIiIKKworICAgIGRlZiBhcHBlbmQoc2VsZiwgaXRlbSk6CisgICAgICAgIHBhdGggPSBjb252ZXJ0X3BhdGgoaXRlbSkKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICBzZWxmLmZpbGVzLmFwcGVuZChwYXRoKQorCisKKworCisKKworCisKKworCisKK2NsYXNzIG1hbmlmZXN0X21ha2VyKHNkaXN0KToKKworICAgIHRlbXBsYXRlID0gIk1BTklGRVNULmluIgorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyAoc2VsZik6CisgICAgICAgIHNlbGYudXNlX2RlZmF1bHRzID0gMQorICAgICAgICBzZWxmLnBydW5lID0gMQorICAgICAgICBzZWxmLm1hbmlmZXN0X29ubHkgPSAxCisgICAgICAgIHNlbGYuZm9yY2VfbWFuaWZlc3QgPSAxCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbGlzdCA9IEZpbGVMaXN0KCkKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYubWFuaWZlc3QpOgorICAgICAgICAgICAgc2VsZi53cml0ZV9tYW5pZmVzdCgpICAgIyBpdCBtdXN0IGV4aXN0IHNvIGl0J2xsIGdldCBpbiB0aGUgbGlzdAorICAgICAgICBzZWxmLmZpbGVsaXN0LmZpbmRhbGwoKQorICAgICAgICBzZWxmLmFkZF9kZWZhdWx0cygpCisgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHNlbGYudGVtcGxhdGUpOgorICAgICAgICAgICAgc2VsZi5yZWFkX3RlbXBsYXRlKCkKKyAgICAgICAgc2VsZi5wcnVuZV9maWxlX2xpc3QoKQorICAgICAgICBzZWxmLmZpbGVsaXN0LnNvcnQoKQorICAgICAgICBzZWxmLmZpbGVsaXN0LnJlbW92ZV9kdXBsaWNhdGVzKCkKKyAgICAgICAgc2VsZi53cml0ZV9tYW5pZmVzdCgpCisKKyAgICBkZWYgd3JpdGVfbWFuaWZlc3QgKHNlbGYpOgorICAgICAgICAiIiJXcml0ZSB0aGUgZmlsZSBsaXN0IGluICdzZWxmLmZpbGVsaXN0JyAocHJlc3VtYWJseSBhcyBmaWxsZWQgaW4KKyAgICAgICAgYnkgJ2FkZF9kZWZhdWx0cygpJyBhbmQgJ3JlYWRfdGVtcGxhdGUoKScpIHRvIHRoZSBtYW5pZmVzdCBmaWxlCisgICAgICAgIG5hbWVkIGJ5ICdzZWxmLm1hbmlmZXN0Jy4KKyAgICAgICAgIiIiCisgICAgICAgIGZpbGVzID0gc2VsZi5maWxlbGlzdC5maWxlcworICAgICAgICBpZiBvcy5zZXAhPScvJzoKKyAgICAgICAgICAgIGZpbGVzID0gW2YucmVwbGFjZShvcy5zZXAsJy8nKSBmb3IgZiBpbiBmaWxlc10KKyAgICAgICAgc2VsZi5leGVjdXRlKGZpbGVfdXRpbC53cml0ZV9maWxlLCAoc2VsZi5tYW5pZmVzdCwgZmlsZXMpLAorICAgICAgICAgICAgICAgICAgICAgIndyaXRpbmcgbWFuaWZlc3QgZmlsZSAnJXMnIiAlIHNlbGYubWFuaWZlc3QpCisKKworCisKKworICAgIGRlZiBhZGRfZGVmYXVsdHMoc2VsZik6CisgICAgICAgIHNkaXN0LmFkZF9kZWZhdWx0cyhzZWxmKQorICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChzZWxmLnRlbXBsYXRlKQorICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChzZWxmLm1hbmlmZXN0KQorICAgICAgICByY2ZpbGVzID0gbGlzdCh3YWxrX3JldmN0cmwoKSkKKyAgICAgICAgaWYgcmNmaWxlczoKKyAgICAgICAgICAgIHNlbGYuZmlsZWxpc3QuZXh0ZW5kKHJjZmlsZXMpCisgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc2VsZi5tYW5pZmVzdCk6CisgICAgICAgICAgICBzZWxmLnJlYWRfbWFuaWZlc3QoKQorICAgICAgICBlaV9jbWQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnZWdnX2luZm8nKQorICAgICAgICBzZWxmLmZpbGVsaXN0LmluY2x1ZGVfcGF0dGVybigiKiIsIHByZWZpeD1laV9jbWQuZWdnX2luZm8pCisKKyAgICBkZWYgcHJ1bmVfZmlsZV9saXN0IChzZWxmKToKKyAgICAgICAgYnVpbGQgPSBzZWxmLmdldF9maW5hbGl6ZWRfY29tbWFuZCgnYnVpbGQnKQorICAgICAgICBiYXNlX2RpciA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9mdWxsbmFtZSgpCisgICAgICAgIHNlbGYuZmlsZWxpc3QuZXhjbHVkZV9wYXR0ZXJuKE5vbmUsIHByZWZpeD1idWlsZC5idWlsZF9iYXNlKQorICAgICAgICBzZWxmLmZpbGVsaXN0LmV4Y2x1ZGVfcGF0dGVybihOb25lLCBwcmVmaXg9YmFzZV9kaXIpCisgICAgICAgIHNlcCA9IHJlLmVzY2FwZShvcy5zZXApCisgICAgICAgIHNlbGYuZmlsZWxpc3QuZXhjbHVkZV9wYXR0ZXJuKHNlcCtyJyhSQ1N8Q1ZTfFwuc3ZuKScrc2VwLCBpc19yZWdleD0xKQorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitkZWYgd3JpdGVfcGtnX2luZm8oY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgorICAgIGxvZy5pbmZvKCJ3cml0aW5nICVzIiwgZmlsZW5hbWUpCisgICAgaWYgbm90IGNtZC5kcnlfcnVuOgorICAgICAgICBtZXRhZGF0YSA9IGNtZC5kaXN0cmlidXRpb24ubWV0YWRhdGEKKyAgICAgICAgbWV0YWRhdGEudmVyc2lvbiwgb2xkdmVyID0gY21kLmVnZ192ZXJzaW9uLCBtZXRhZGF0YS52ZXJzaW9uCisgICAgICAgIG1ldGFkYXRhLm5hbWUsIG9sZG5hbWUgICA9IGNtZC5lZ2dfbmFtZSwgbWV0YWRhdGEubmFtZQorICAgICAgICB0cnk6CisgICAgICAgICAgICAjIHdyaXRlIHVuZXNjYXBlZCBkYXRhIHRvIFBLRy1JTkZPLCBzbyBvbGRlciBwa2dfcmVzb3VyY2VzCisgICAgICAgICAgICAjIGNhbiBzdGlsbCBwYXJzZSBpdAorICAgICAgICAgICAgbWV0YWRhdGEud3JpdGVfcGtnX2luZm8oY21kLmVnZ19pbmZvKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgbWV0YWRhdGEubmFtZSwgbWV0YWRhdGEudmVyc2lvbiA9IG9sZG5hbWUsIG9sZHZlcgorCisgICAgICAgIHNhZmUgPSBnZXRhdHRyKGNtZC5kaXN0cmlidXRpb24sJ3ppcF9zYWZlJyxOb25lKQorICAgICAgICBpbXBvcnQgYmRpc3RfZWdnOyBiZGlzdF9lZ2cud3JpdGVfc2FmZXR5X2ZsYWcoY21kLmVnZ19pbmZvLCBzYWZlKQorCitkZWYgd2Fybl9kZXBlbmRzX29ic29sZXRlKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKKyAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CisgICAgICAgIGxvZy53YXJuKAorICAgICAgICAgICAgIldBUk5JTkc6ICdkZXBlbmRzLnR4dCcgaXMgbm90IHVzZWQgYnkgc2V0dXB0b29scyAwLjYhXG4iCisgICAgICAgICAgICAiVXNlIHRoZSBpbnN0YWxsX3JlcXVpcmVzL2V4dHJhc19yZXF1aXJlIHNldHVwKCkgYXJncyBpbnN0ZWFkLiIKKyAgICAgICAgKQorCisKK2RlZiB3cml0ZV9yZXF1aXJlbWVudHMoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgorICAgIGRpc3QgPSBjbWQuZGlzdHJpYnV0aW9uCisgICAgZGF0YSA9IFsnXG4nLmpvaW4oeWllbGRfbGluZXMoZGlzdC5pbnN0YWxsX3JlcXVpcmVzIG9yICgpKSldCisgICAgZm9yIGV4dHJhLHJlcXMgaW4gKGRpc3QuZXh0cmFzX3JlcXVpcmUgb3Ige30pLml0ZW1zKCk6CisgICAgICAgIGRhdGEuYXBwZW5kKCdcblxuWyVzXVxuJXMnICUgKGV4dHJhLCAnXG4nLmpvaW4oeWllbGRfbGluZXMocmVxcykpKSkKKyAgICBjbWQud3JpdGVfb3JfZGVsZXRlX2ZpbGUoInJlcXVpcmVtZW50cyIsIGZpbGVuYW1lLCAnJy5qb2luKGRhdGEpKQorCitkZWYgd3JpdGVfdG9wbGV2ZWxfbmFtZXMoY21kLCBiYXNlbmFtZSwgZmlsZW5hbWUpOgorICAgIHBrZ3MgPSBkaWN0LmZyb21rZXlzKAorICAgICAgICBbay5zcGxpdCgnLicsMSlbMF0KKyAgICAgICAgICAgIGZvciBrIGluIGNtZC5kaXN0cmlidXRpb24uaXRlcl9kaXN0cmlidXRpb25fbmFtZXMoKQorICAgICAgICBdCisgICAgKQorICAgIGNtZC53cml0ZV9maWxlKCJ0b3AtbGV2ZWwgbmFtZXMiLCBmaWxlbmFtZSwgJ1xuJy5qb2luKHBrZ3MpKydcbicpCisKKworCitkZWYgb3ZlcndyaXRlX2FyZyhjbWQsIGJhc2VuYW1lLCBmaWxlbmFtZSk6CisgICAgd3JpdGVfYXJnKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lLCBUcnVlKQorCitkZWYgd3JpdGVfYXJnKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lLCBmb3JjZT1GYWxzZSk6CisgICAgYXJnbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoYmFzZW5hbWUpWzBdCisgICAgdmFsdWUgPSBnZXRhdHRyKGNtZC5kaXN0cmlidXRpb24sIGFyZ25hbWUsIE5vbmUpCisgICAgaWYgdmFsdWUgaXMgbm90IE5vbmU6CisgICAgICAgIHZhbHVlID0gJ1xuJy5qb2luKHZhbHVlKSsnXG4nCisgICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKGFyZ25hbWUsIGZpbGVuYW1lLCB2YWx1ZSwgZm9yY2UpCisKK2RlZiB3cml0ZV9lbnRyaWVzKGNtZCwgYmFzZW5hbWUsIGZpbGVuYW1lKToKKyAgICBlcCA9IGNtZC5kaXN0cmlidXRpb24uZW50cnlfcG9pbnRzCisKKyAgICBpZiBpc2luc3RhbmNlKGVwLGJhc2VzdHJpbmcpIG9yIGVwIGlzIE5vbmU6CisgICAgICAgIGRhdGEgPSBlcAorICAgIGVsaWYgZXAgaXMgbm90IE5vbmU6CisgICAgICAgIGRhdGEgPSBbXQorICAgICAgICBmb3Igc2VjdGlvbiwgY29udGVudHMgaW4gZXAuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGNvbnRlbnRzLGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgICAgIGNvbnRlbnRzID0gRW50cnlQb2ludC5wYXJzZV9ncm91cChzZWN0aW9uLCBjb250ZW50cykKKyAgICAgICAgICAgICAgICBjb250ZW50cyA9ICdcbicuam9pbihtYXAoc3RyLGNvbnRlbnRzLnZhbHVlcygpKSkKKyAgICAgICAgICAgIGRhdGEuYXBwZW5kKCdbJXNdXG4lc1xuXG4nICUgKHNlY3Rpb24sY29udGVudHMpKQorICAgICAgICBkYXRhID0gJycuam9pbihkYXRhKQorCisgICAgY21kLndyaXRlX29yX2RlbGV0ZV9maWxlKCdlbnRyeSBwb2ludHMnLCBmaWxlbmFtZSwgZGF0YSwgVHJ1ZSkKKworZGVmIGdldF9wa2dfaW5mb19yZXZpc2lvbigpOgorICAgICMgU2VlIGlmIHdlIGNhbiBnZXQgYSAtciMjIyBvZmYgb2YgUEtHLUlORk8sIGluIGNhc2UgdGhpcyBpcyBhbiBzZGlzdCBvZgorICAgICMgYSBzdWJ2ZXJzaW9uIHJldmlzaW9uCisgICAgIworICAgIGlmIG9zLnBhdGguZXhpc3RzKCdQS0ctSU5GTycpOgorICAgICAgICBmID0gb3BlbignUEtHLUlORk8nLCdyVScpCisgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICBtYXRjaCA9IHJlLm1hdGNoKHIiVmVyc2lvbjouKi1yKFxkKylccyokIiwgbGluZSkKKyAgICAgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgICAgIHJldHVybiBpbnQobWF0Y2guZ3JvdXAoMSkpCisgICAgcmV0dXJuIDAKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbC5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmI5YWY1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsLnB5CkBAIC0wLDAgKzEsMTAxIEBACitpbXBvcnQgc2V0dXB0b29scywgc3lzCitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGwgaW1wb3J0IGluc3RhbGwgYXMgX2luc3RhbGwKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzQXJnRXJyb3IKKworY2xhc3MgaW5zdGFsbChfaW5zdGFsbCk6CisgICAgIiIiVXNlIGVhc3lfaW5zdGFsbCB0byBpbnN0YWxsIHRoZSBwYWNrYWdlLCB3L2RlcGVuZGVuY2llcyIiIgorCisgICAgdXNlcl9vcHRpb25zID0gX2luc3RhbGwudXNlcl9vcHRpb25zICsgWworICAgICAgICAoJ29sZC1hbmQtdW5tYW5hZ2VhYmxlJywgTm9uZSwgIlRyeSBub3QgdG8gdXNlIHRoaXMhIiksCisgICAgICAgICgnc2luZ2xlLXZlcnNpb24tZXh0ZXJuYWxseS1tYW5hZ2VkJywgTm9uZSwKKyAgICAgICAgICAgICJ1c2VkIGJ5IHN5c3RlbSBwYWNrYWdlIGJ1aWxkZXJzIHRvIGNyZWF0ZSAnZmxhdCcgZWdncyIpLAorICAgIF0KKyAgICBib29sZWFuX29wdGlvbnMgPSBfaW5zdGFsbC5ib29sZWFuX29wdGlvbnMgKyBbCisgICAgICAgICdvbGQtYW5kLXVubWFuYWdlYWJsZScsICdzaW5nbGUtdmVyc2lvbi1leHRlcm5hbGx5LW1hbmFnZWQnLAorICAgIF0KKyAgICBuZXdfY29tbWFuZHMgPSBbCisgICAgICAgICgnaW5zdGFsbF9lZ2dfaW5mbycsIGxhbWJkYSBzZWxmOiBUcnVlKSwKKyAgICAgICAgKCdpbnN0YWxsX3NjcmlwdHMnLCAgbGFtYmRhIHNlbGY6IFRydWUpLAorICAgIF0KKyAgICBfbmMgPSBkaWN0KG5ld19jb21tYW5kcykKKyAgICBzdWJfY29tbWFuZHMgPSBbCisgICAgICAgIGNtZCBmb3IgY21kIGluIF9pbnN0YWxsLnN1Yl9jb21tYW5kcyBpZiBjbWRbMF0gbm90IGluIF9uYworICAgIF0gKyBuZXdfY29tbWFuZHMKKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIF9pbnN0YWxsLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBzZWxmLm9sZF9hbmRfdW5tYW5hZ2VhYmxlID0gTm9uZQorICAgICAgICBzZWxmLnNpbmdsZV92ZXJzaW9uX2V4dGVybmFsbHlfbWFuYWdlZCA9IE5vbmUKKyAgICAgICAgc2VsZi5ub19jb21waWxlID0gTm9uZSAgIyBtYWtlIERJU1RVVElMU19ERUJVRyB3b3JrIHJpZ2h0IQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIF9pbnN0YWxsLmZpbmFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgaWYgc2VsZi5yb290OgorICAgICAgICAgICAgc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQgPSBUcnVlCisgICAgICAgIGVsaWYgc2VsZi5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQ6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5yb290IGFuZCBub3Qgc2VsZi5yZWNvcmQ6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzQXJnRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICJZb3UgbXVzdCBzcGVjaWZ5IC0tcmVjb3JkIG9yIC0tcm9vdCB3aGVuIGJ1aWxkaW5nIHN5c3RlbSIKKyAgICAgICAgICAgICAgICAgICAgIiBwYWNrYWdlcyIKKyAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgaGFuZGxlX2V4dHJhX3BhdGgoc2VsZik6CisgICAgICAgICMgV2UgYWx3YXlzIGlnbm9yZSBleHRyYV9wYXRoLCBiZWNhdXNlIHdlIGluc3RhbGwgYXMgLmVnZyBvciAuZWdnLWluZm8KKyAgICAgICAgc2VsZi5wYXRoX2ZpbGUgPSBOb25lCisgICAgICAgIHNlbGYuZXh0cmFfZGlycyA9ICcnCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICAjIEV4cGxpY2l0IHJlcXVlc3QgZm9yIG9sZC1zdHlsZSBpbnN0YWxsPyAgSnVzdCBkbyBpdAorICAgICAgICBpZiBzZWxmLm9sZF9hbmRfdW5tYW5hZ2VhYmxlIG9yIHNlbGYuc2luZ2xlX3ZlcnNpb25fZXh0ZXJuYWxseV9tYW5hZ2VkOgorICAgICAgICAgICAgcmV0dXJuIF9pbnN0YWxsLnJ1bihzZWxmKQorCisgICAgICAgICMgQXR0ZW1wdCB0byBkZXRlY3Qgd2hldGhlciB3ZSB3ZXJlIGNhbGxlZCBmcm9tIHNldHVwKCkgb3IgYnkgYW5vdGhlcgorICAgICAgICAjIGNvbW1hbmQuICBJZiB3ZSB3ZXJlIGNhbGxlZCBieSBzZXR1cCgpLCBvdXIgY2FsbGVyIHdpbGwgYmUgdGhlCisgICAgICAgICMgJ3J1bl9jb21tYW5kJyBtZXRob2QgaW4gJ2Rpc3R1dGlscy5kaXN0JywgYW5kICppdHMqIGNhbGxlciB3aWxsIGJlCisgICAgICAgICMgdGhlICdydW5fY29tbWFuZHMnIG1ldGhvZC4gIElmIHdlIHdlcmUgY2FsbGVkIGFueSBvdGhlciB3YXksIG91cgorICAgICAgICAjIGltbWVkaWF0ZSBjYWxsZXIgKm1pZ2h0KiBiZSAncnVuX2NvbW1hbmQnLCBidXQgaXQgd29uJ3QgaGF2ZSBiZWVuCisgICAgICAgICMgY2FsbGVkIGJ5ICdydW5fY29tbWFuZHMnLiAgVGhpcyBpcyBzbGlnaHRseSBrbHVkZ3ksIGJ1dCBzZWVtcyB0bworICAgICAgICAjIHdvcmsuCisgICAgICAgICMKKyAgICAgICAgY2FsbGVyID0gc3lzLl9nZXRmcmFtZSgyKQorICAgICAgICBjYWxsZXJfbW9kdWxlID0gY2FsbGVyLmZfZ2xvYmFscy5nZXQoJ19fbmFtZV9fJywnJykKKyAgICAgICAgY2FsbGVyX25hbWUgPSBjYWxsZXIuZl9jb2RlLmNvX25hbWUKKworICAgICAgICBpZiBjYWxsZXJfbW9kdWxlICE9ICdkaXN0dXRpbHMuZGlzdCcgb3IgY2FsbGVyX25hbWUhPSdydW5fY29tbWFuZHMnOgorICAgICAgICAgICAgIyBXZSB3ZXJlbid0IGNhbGxlZCBmcm9tIHRoZSBjb21tYW5kIGxpbmUgb3Igc2V0dXAoKSwgc28gd2UKKyAgICAgICAgICAgICMgc2hvdWxkIHJ1biBpbiBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IG1vZGUgdG8gc3VwcG9ydCBiZGlzdF8qCisgICAgICAgICAgICAjIGNvbW1hbmRzLgorICAgICAgICAgICAgX2luc3RhbGwucnVuKHNlbGYpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmRvX2VnZ19pbnN0YWxsKCkKKworCisKKworCisKKworCisKKworCisKKyAgICBkZWYgZG9fZWdnX2luc3RhbGwoc2VsZik6CisKKyAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBlYXN5X2luc3RhbGwKKworICAgICAgICBjbWQgPSBlYXN5X2luc3RhbGwoCisgICAgICAgICAgICBzZWxmLmRpc3RyaWJ1dGlvbiwgYXJncz0ieCIsIHJvb3Q9c2VsZi5yb290LCByZWNvcmQ9c2VsZi5yZWNvcmQsCisgICAgICAgICkKKyAgICAgICAgY21kLmVuc3VyZV9maW5hbGl6ZWQoKSAgIyBmaW5hbGl6ZSBiZWZvcmUgYmRpc3RfZWdnIG11bmdlcyBpbnN0YWxsIGNtZAorCisgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2JkaXN0X2VnZycpCisgICAgICAgIGFyZ3MgPSBbc2VsZi5kaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfb2JqKCdiZGlzdF9lZ2cnKS5lZ2dfb3V0cHV0XQorCisgICAgICAgIGlmIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbToKKyAgICAgICAgICAgICMgQm9vdHN0cmFwIHNlbGYtaW5zdGFsbGF0aW9uIG9mIHNldHVwdG9vbHMKKyAgICAgICAgICAgIGFyZ3MuaW5zZXJ0KDAsIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSkKKworICAgICAgICBjbWQuYXJncyA9IGFyZ3MKKyAgICAgICAgY21kLnJ1bigpCisgICAgICAgIHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IE5vbmUKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9lZ2dfaW5mby5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOTNlOTFhCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2VnZ19pbmZvLnB5CkBAIC0wLDAgKzEsODEgQEAKK2Zyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAorZnJvbSBzZXR1cHRvb2xzLmFyY2hpdmVfdXRpbCBpbXBvcnQgdW5wYWNrX2FyY2hpdmUKK2Zyb20gZGlzdHV0aWxzIGltcG9ydCBsb2csIGRpcl91dGlsCitpbXBvcnQgb3MsIHNodXRpbCwgcGtnX3Jlc291cmNlcworCitjbGFzcyBpbnN0YWxsX2VnZ19pbmZvKENvbW1hbmQpOgorICAgICIiIkluc3RhbGwgYW4gLmVnZy1pbmZvIGRpcmVjdG9yeSBmb3IgdGhlIHBhY2thZ2UiIiIKKworICAgIGRlc2NyaXB0aW9uID0gIkluc3RhbGwgYW4gLmVnZy1pbmZvIGRpcmVjdG9yeSBmb3IgdGhlIHBhY2thZ2UiCisKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnaW5zdGFsbC1kaXI9JywgJ2QnLCAiZGlyZWN0b3J5IHRvIGluc3RhbGwgdG8iKSwKKyAgICBdCisKKyAgICBkZWYgaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLmluc3RhbGxfZGlyID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3VuZGVmaW5lZF9vcHRpb25zKCdpbnN0YWxsX2xpYicsKCdpbnN0YWxsX2RpcicsJ2luc3RhbGxfZGlyJykpCisgICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCisgICAgICAgIGJhc2VuYW1lID0gcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb24oCisgICAgICAgICAgICBOb25lLCBOb25lLCBlaV9jbWQuZWdnX25hbWUsIGVpX2NtZC5lZ2dfdmVyc2lvbgorICAgICAgICApLmVnZ19uYW1lKCkrJy5lZ2ctaW5mbycKKyAgICAgICAgc2VsZi5zb3VyY2UgPSBlaV9jbWQuZWdnX2luZm8KKyAgICAgICAgc2VsZi50YXJnZXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2RpciwgYmFzZW5hbWUpCisgICAgICAgIHNlbGYub3V0cHV0cyA9IFtzZWxmLnRhcmdldF0KKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKKyAgICAgICAgdGFyZ2V0ID0gc2VsZi50YXJnZXQKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihzZWxmLnRhcmdldCkgYW5kIG5vdCBvcy5wYXRoLmlzbGluayhzZWxmLnRhcmdldCk6CisgICAgICAgICAgICBkaXJfdXRpbC5yZW1vdmVfdHJlZShzZWxmLnRhcmdldCwgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoc2VsZi50YXJnZXQpOgorICAgICAgICAgICAgc2VsZi5leGVjdXRlKG9zLnVubGluaywoc2VsZi50YXJnZXQsKSwiUmVtb3ZpbmcgIitzZWxmLnRhcmdldCkKKyAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgIHBrZ19yZXNvdXJjZXMuZW5zdXJlX2RpcmVjdG9yeShzZWxmLnRhcmdldCkKKyAgICAgICAgc2VsZi5leGVjdXRlKHNlbGYuY29weXRyZWUsICgpLAorICAgICAgICAgICAgIkNvcHlpbmcgJXMgdG8gJXMiICUgKHNlbGYuc291cmNlLCBzZWxmLnRhcmdldCkKKyAgICAgICAgKQorICAgICAgICBzZWxmLmluc3RhbGxfbmFtZXNwYWNlcygpCisKKyAgICBkZWYgZ2V0X291dHB1dHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm91dHB1dHMKKworICAgIGRlZiBjb3B5dHJlZShzZWxmKToKKyAgICAgICAgIyBDb3B5IHRoZSAuZWdnLWluZm8gdHJlZSB0byBzaXRlLXBhY2thZ2VzCisgICAgICAgIGRlZiBza2ltbWVyKHNyYyxkc3QpOgorICAgICAgICAgICAgIyBmaWx0ZXIgb3V0IHNvdXJjZS1jb250cm9sIGRpcmVjdG9yaWVzOyBub3RlIHRoYXQgJ3NyYycgaXMgYWx3YXlzCisgICAgICAgICAgICAjIGEgJy8nLXNlcGFyYXRlZCBwYXRoLCByZWdhcmRsZXNzIG9mIHBsYXRmb3JtLiAgJ2RzdCcgaXMgYQorICAgICAgICAgICAgIyBwbGF0Zm9ybS1zcGVjaWZpYyBwYXRoLgorICAgICAgICAgICAgZm9yIHNraXAgaW4gJy5zdm4vJywnQ1ZTLyc6CisgICAgICAgICAgICAgICAgaWYgc3JjLnN0YXJ0c3dpdGgoc2tpcCkgb3IgJy8nK3NraXAgaW4gc3JjOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgc2VsZi5vdXRwdXRzLmFwcGVuZChkc3QpCisgICAgICAgICAgICBsb2cuZGVidWcoIkNvcHlpbmcgJXMgdG8gJXMiLCBzcmMsIGRzdCkKKyAgICAgICAgICAgIHJldHVybiBkc3QKKyAgICAgICAgdW5wYWNrX2FyY2hpdmUoc2VsZi5zb3VyY2UsIHNlbGYudGFyZ2V0LCBza2ltbWVyKQorCisgICAgZGVmIGluc3RhbGxfbmFtZXNwYWNlcyhzZWxmKToKKyAgICAgICAgbnNwID0gKHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlcyBvciBbXSlbOl0KKyAgICAgICAgaWYgbm90IG5zcDogcmV0dXJuCisgICAgICAgIG5zcC5zb3J0KCkgICMgc2V0IHVwIHNob3J0ZXIgbmFtZXMgZmlyc3QKKyAgICAgICAgZmlsZW5hbWUsZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzZWxmLnRhcmdldCkKKyAgICAgICAgZmlsZW5hbWUgKz0gJy1uc3BrZy5wdGgnOyBzZWxmLm91dHB1dHMuYXBwZW5kKGZpbGVuYW1lKQorICAgICAgICBsb2cuaW5mbygiSW5zdGFsbGluZyAlcyIsZmlsZW5hbWUpCisgICAgICAgIGlmIG5vdCBzZWxmLmRyeV9ydW46CisgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwnd2InKQorICAgICAgICAgICAgZm9yIHBrZyBpbiBuc3A6CisgICAgICAgICAgICAgICAgcHRoID0gdHVwbGUocGtnLnNwbGl0KCcuJykpCisgICAgICAgICAgICAgICAgZi53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgImltcG9ydCBzeXMsbmV3LG9zOyAiCisgICAgICAgICAgICAgICAgICAgICJwID0gb3MucGF0aC5qb2luKHN5cy5fZ2V0ZnJhbWUoMSkuZl9sb2NhbHNbJ3NpdGVkaXInXSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiolKHB0aClyKTsgIgorICAgICAgICAgICAgICAgICAgICAiaWUgPSBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4ocCwnX19pbml0X18ucHknKSk7ICIKKyAgICAgICAgICAgICAgICAgICAgIm0gPSBub3QgaWUgYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzeXMubW9kdWxlcy5zZXRkZWZhdWx0KCUocGtnKXIsbmV3Lm1vZHVsZSglKHBrZylyKSk7ICIKKyAgICAgICAgICAgICAgICAgICAgIm1wID0gKG0gb3IgW10pIGFuZCBtLl9fZGljdF9fLnNldGRlZmF1bHQoJ19fcGF0aF9fJyxbXSk7ICIKKyAgICAgICAgICAgICAgICAgICAgIihwIG5vdCBpbiBtcCkgYW5kIG1wLmFwcGVuZChwKVxuIgorICAgICAgICAgICAgICAgICAgICAlIGxvY2FscygpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgZi5jbG9zZSgpCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfbGliLnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmM4ZGZlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9pbnN0YWxsX2xpYi5weQpAQCAtMCwwICsxLDc2IEBACitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfbGliIGltcG9ydCBpbnN0YWxsX2xpYiBhcyBfaW5zdGFsbF9saWIKK2ltcG9ydCBvcworCitjbGFzcyBpbnN0YWxsX2xpYihfaW5zdGFsbF9saWIpOgorICAgICIiIkRvbid0IGFkZCBjb21waWxlZCBmbGFncyB0byBmaWxlbmFtZXMgb2Ygbm9uLVB5dGhvbiBmaWxlcyIiIgorCisgICAgZGVmIF9ieXRlY29kZV9maWxlbmFtZXMgKHNlbGYsIHB5X2ZpbGVuYW1lcyk6CisgICAgICAgIGJ5dGVjb2RlX2ZpbGVzID0gW10KKyAgICAgICAgZm9yIHB5X2ZpbGUgaW4gcHlfZmlsZW5hbWVzOgorICAgICAgICAgICAgaWYgbm90IHB5X2ZpbGUuZW5kc3dpdGgoJy5weScpOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBzZWxmLmNvbXBpbGU6CisgICAgICAgICAgICAgICAgYnl0ZWNvZGVfZmlsZXMuYXBwZW5kKHB5X2ZpbGUgKyAiYyIpCisgICAgICAgICAgICBpZiBzZWxmLm9wdGltaXplID4gMDoKKyAgICAgICAgICAgICAgICBieXRlY29kZV9maWxlcy5hcHBlbmQocHlfZmlsZSArICJvIikKKworICAgICAgICByZXR1cm4gYnl0ZWNvZGVfZmlsZXMKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYuYnVpbGQoKQorICAgICAgICBvdXRmaWxlcyA9IHNlbGYuaW5zdGFsbCgpCisgICAgICAgIGlmIG91dGZpbGVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgIyBhbHdheXMgY29tcGlsZSwgaW4gY2FzZSB3ZSBoYXZlIGFueSBleHRlbnNpb24gc3R1YnMgdG8gZGVhbCB3aXRoCisgICAgICAgICAgICBzZWxmLmJ5dGVfY29tcGlsZShvdXRmaWxlcykKKworICAgIGRlZiBnZXRfZXhjbHVzaW9ucyhzZWxmKToKKyAgICAgICAgZXhjbHVkZSA9IHt9CisgICAgICAgIG5zcCA9IHNlbGYuZGlzdHJpYnV0aW9uLm5hbWVzcGFjZV9wYWNrYWdlcworCisgICAgICAgIGlmIChuc3AgYW5kIHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdpbnN0YWxsJykKKyAgICAgICAgICAgICAgIC5zaW5nbGVfdmVyc2lvbl9leHRlcm5hbGx5X21hbmFnZWQKKyAgICAgICAgKToKKyAgICAgICAgICAgIGZvciBwa2cgaW4gbnNwOgorICAgICAgICAgICAgICAgIHBhcnRzID0gcGtnLnNwbGl0KCcuJykKKyAgICAgICAgICAgICAgICB3aGlsZSBwYXJ0czoKKyAgICAgICAgICAgICAgICAgICAgcGtnZGlyID0gb3MucGF0aC5qb2luKHNlbGYuaW5zdGFsbF9kaXIsICpwYXJ0cykKKyAgICAgICAgICAgICAgICAgICAgZm9yIGYgaW4gJ19faW5pdF9fLnB5JywgJ19faW5pdF9fLnB5YycsICdfX2luaXRfXy5weW8nOgorICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZVtvcy5wYXRoLmpvaW4ocGtnZGlyLGYpXSA9IDEKKyAgICAgICAgICAgICAgICAgICAgcGFydHMucG9wKCkKKyAgICAgICAgcmV0dXJuIGV4Y2x1ZGUKKworICAgIGRlZiBjb3B5X3RyZWUoCisgICAgICAgIHNlbGYsIGluZmlsZSwgb3V0ZmlsZSwKKyAgICAgICAgcHJlc2VydmVfbW9kZT0xLCBwcmVzZXJ2ZV90aW1lcz0xLCBwcmVzZXJ2ZV9zeW1saW5rcz0wLCBsZXZlbD0xCisgICAgKToKKyAgICAgICAgYXNzZXJ0IHByZXNlcnZlX21vZGUgYW5kIHByZXNlcnZlX3RpbWVzIGFuZCBub3QgcHJlc2VydmVfc3ltbGlua3MKKyAgICAgICAgZXhjbHVkZSA9IHNlbGYuZ2V0X2V4Y2x1c2lvbnMoKQorCisgICAgICAgIGlmIG5vdCBleGNsdWRlOgorICAgICAgICAgICAgcmV0dXJuIF9pbnN0YWxsX2xpYi5jb3B5X3RyZWUoc2VsZiwgaW5maWxlLCBvdXRmaWxlKQorCisgICAgICAgICMgRXhjbHVkZSBuYW1lc3BhY2UgcGFja2FnZSBfX2luaXRfXy5weSogZmlsZXMgZnJvbSB0aGUgb3V0cHV0CisKKyAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmFyY2hpdmVfdXRpbCBpbXBvcnQgdW5wYWNrX2RpcmVjdG9yeQorICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCisKKyAgICAgICAgb3V0ZmlsZXMgPSBbXQorCisgICAgICAgIGRlZiBwZihzcmMsIGRzdCk6CisgICAgICAgICAgICBpZiBkc3QgaW4gZXhjbHVkZToKKyAgICAgICAgICAgICAgICBsb2cud2FybigiU2tpcHBpbmcgaW5zdGFsbGF0aW9uIG9mICVzIChuYW1lc3BhY2UgcGFja2FnZSkiLGRzdCkKKyAgICAgICAgICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICAgICAgICAgbG9nLmluZm8oImNvcHlpbmcgJXMgLT4gJXMiLCBzcmMsIG9zLnBhdGguZGlybmFtZShkc3QpKQorICAgICAgICAgICAgb3V0ZmlsZXMuYXBwZW5kKGRzdCkKKyAgICAgICAgICAgIHJldHVybiBkc3QKKworICAgICAgICB1bnBhY2tfZGlyZWN0b3J5KGluZmlsZSwgb3V0ZmlsZSwgcGYpCisgICAgICAgIHJldHVybiBvdXRmaWxlcworCisgICAgZGVmIGdldF9vdXRwdXRzKHNlbGYpOgorICAgICAgICBvdXRwdXRzID0gX2luc3RhbGxfbGliLmdldF9vdXRwdXRzKHNlbGYpCisgICAgICAgIGV4Y2x1ZGUgPSBzZWxmLmdldF9leGNsdXNpb25zKCkKKyAgICAgICAgaWYgZXhjbHVkZToKKyAgICAgICAgICAgIHJldHVybiBbZiBmb3IgZiBpbiBvdXRwdXRzIGlmIGYgbm90IGluIGV4Y2x1ZGVdCisgICAgICAgIHJldHVybiBvdXRwdXRzCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvaW5zdGFsbF9zY3JpcHRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY5NTU4YmYKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL2luc3RhbGxfc2NyaXB0cy5weQpAQCAtMCwwICsxLDU2IEBACitmcm9tIGRpc3R1dGlscy5jb21tYW5kLmluc3RhbGxfc2NyaXB0cyBpbXBvcnQgaW5zdGFsbF9zY3JpcHRzIFwKKyAgICAgYXMgX2luc3RhbGxfc2NyaXB0cworZnJvbSBlYXN5X2luc3RhbGwgaW1wb3J0IGdldF9zY3JpcHRfYXJncywgc3lzX2V4ZWN1dGFibGUKK2Zyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgRGlzdHJpYnV0aW9uLCBQYXRoTWV0YWRhdGEsIGVuc3VyZV9kaXJlY3RvcnkKK2ltcG9ydCBvcworZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworCitjbGFzcyBpbnN0YWxsX3NjcmlwdHMoX2luc3RhbGxfc2NyaXB0cyk6CisgICAgIiIiRG8gbm9ybWFsIHNjcmlwdCBpbnN0YWxsLCBwbHVzIGFueSBlZ2dfaW5mbyB3cmFwcGVyIHNjcmlwdHMiIiIKKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIF9pbnN0YWxsX3NjcmlwdHMuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIHNlbGYubm9fZXAgPSBGYWxzZQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgiZWdnX2luZm8iKQorICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi5zY3JpcHRzOgorICAgICAgICAgICAgX2luc3RhbGxfc2NyaXB0cy5ydW4oc2VsZikgICMgcnVuIGZpcnN0IHRvIHNldCB1cCBzZWxmLm91dGZpbGVzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLm91dGZpbGVzID0gW10KKyAgICAgICAgaWYgc2VsZi5ub19lcDoKKyAgICAgICAgICAgICMgZG9uJ3QgaW5zdGFsbCBlbnRyeSBwb2ludCBzY3JpcHRzIGludG8gLmVnZyBmaWxlIQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoImVnZ19pbmZvIikKKyAgICAgICAgZGlzdCA9IERpc3RyaWJ1dGlvbigKKyAgICAgICAgICAgIGVpX2NtZC5lZ2dfYmFzZSwgUGF0aE1ldGFkYXRhKGVpX2NtZC5lZ2dfYmFzZSwgZWlfY21kLmVnZ19pbmZvKSwKKyAgICAgICAgICAgIGVpX2NtZC5lZ2dfbmFtZSwgZWlfY21kLmVnZ192ZXJzaW9uLAorICAgICAgICApCisgICAgICAgIGJzX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZF9zY3JpcHRzJykKKyAgICAgICAgZXhlY3V0YWJsZSA9IGdldGF0dHIoYnNfY21kLCdleGVjdXRhYmxlJyxzeXNfZXhlY3V0YWJsZSkKKworICAgICAgICBmb3IgYXJncyBpbiBnZXRfc2NyaXB0X2FyZ3MoZGlzdCwgZXhlY3V0YWJsZSk6CisgICAgICAgICAgICBzZWxmLndyaXRlX3NjcmlwdCgqYXJncykKKworCisKKworCisKKworICAgIGRlZiB3cml0ZV9zY3JpcHQoc2VsZiwgc2NyaXB0X25hbWUsIGNvbnRlbnRzLCBtb2RlPSJ0IiwgKmlnbm9yZWQpOgorICAgICAgICAiIiJXcml0ZSBhbiBleGVjdXRhYmxlIGZpbGUgdG8gdGhlIHNjcmlwdHMgZGlyZWN0b3J5IiIiCisgICAgICAgIGxvZy5pbmZvKCJJbnN0YWxsaW5nICVzIHNjcmlwdCB0byAlcyIsIHNjcmlwdF9uYW1lLCBzZWxmLmluc3RhbGxfZGlyKQorICAgICAgICB0YXJnZXQgPSBvcy5wYXRoLmpvaW4oc2VsZi5pbnN0YWxsX2Rpciwgc2NyaXB0X25hbWUpCisgICAgICAgIHNlbGYub3V0ZmlsZXMuYXBwZW5kKHRhcmdldCkKKworICAgICAgICBpZiBub3Qgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgZW5zdXJlX2RpcmVjdG9yeSh0YXJnZXQpCisgICAgICAgICAgICBmID0gb3Blbih0YXJnZXQsInciK21vZGUpCisgICAgICAgICAgICBmLndyaXRlKGNvbnRlbnRzKQorICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgb3MuY2htb2QodGFyZ2V0LDA3NTUpCisgICAgICAgICAgICBleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBvcy5lcnJvcik6CisgICAgICAgICAgICAgICAgcGFzcwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9yb3RhdGUucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL3JvdGF0ZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44YWFiMzEyCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9yb3RhdGUucHkKQEAgLTAsMCArMSw1NyBAQAoraW1wb3J0IGRpc3R1dGlscywgb3MKK2Zyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0ICoKKworY2xhc3Mgcm90YXRlKENvbW1hbmQpOgorICAgICIiIkRlbGV0ZSBvbGRlciBkaXN0cmlidXRpb25zIiIiCisKKyAgICBkZXNjcmlwdGlvbiA9ICJkZWxldGUgb2xkZXIgZGlzdHJpYnV0aW9ucywga2VlcGluZyBOIG5ld2VzdCBmaWxlcyIKKyAgICB1c2VyX29wdGlvbnMgPSBbCisgICAgICAgICgnbWF0Y2g9JywgICAgJ20nLCAicGF0dGVybnMgdG8gbWF0Y2ggKHJlcXVpcmVkKSIpLAorICAgICAgICAoJ2Rpc3QtZGlyPScsICdkJywgImRpcmVjdG9yeSB3aGVyZSB0aGUgZGlzdHJpYnV0aW9ucyBhcmUiKSwKKyAgICAgICAgKCdrZWVwPScsICAgICAnaycsICJudW1iZXIgb2YgbWF0Y2hpbmcgZGlzdHJpYnV0aW9ucyB0byBrZWVwIiksCisgICAgXQorCisgICAgYm9vbGVhbl9vcHRpb25zID0gW10KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYubWF0Y2ggPSBOb25lCisgICAgICAgIHNlbGYuZGlzdF9kaXIgPSBOb25lCisgICAgICAgIHNlbGYua2VlcCA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm1hdGNoIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAiTXVzdCBzcGVjaWZ5IG9uZSBvciBtb3JlIChjb21tYS1zZXBhcmF0ZWQpIG1hdGNoIHBhdHRlcm5zICIKKyAgICAgICAgICAgICAgICAiKGUuZy4gJy56aXAnIG9yICcuZWdnJykiCisgICAgICAgICAgICApCisgICAgICAgIGlmIHNlbGYua2VlcCBpcyBOb25lOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIk11c3Qgc3BlY2lmeSBudW1iZXIgb2YgZmlsZXMgdG8ga2VlcCIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYua2VlcCA9IGludChzZWxmLmtlZXApCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoIi0ta2VlcCBtdXN0IGJlIGFuIGludGVnZXIiKQorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYubWF0Y2gsIGJhc2VzdHJpbmcpOgorICAgICAgICAgICAgc2VsZi5tYXRjaCA9IFsKKyAgICAgICAgICAgICAgICBjb252ZXJ0X3BhdGgocC5zdHJpcCgpKSBmb3IgcCBpbiBzZWxmLm1hdGNoLnNwbGl0KCcsJykKKyAgICAgICAgICAgIF0KKyAgICAgICAgc2VsZi5zZXRfdW5kZWZpbmVkX29wdGlvbnMoJ2JkaXN0JywoJ2Rpc3RfZGlyJywgJ2Rpc3RfZGlyJykpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCJlZ2dfaW5mbyIpCisgICAgICAgIGZyb20gZ2xvYiBpbXBvcnQgZ2xvYgorICAgICAgICBmb3IgcGF0dGVybiBpbiBzZWxmLm1hdGNoOgorICAgICAgICAgICAgcGF0dGVybiA9IHNlbGYuZGlzdHJpYnV0aW9uLmdldF9uYW1lKCkrJyonK3BhdHRlcm4KKyAgICAgICAgICAgIGZpbGVzID0gZ2xvYihvcy5wYXRoLmpvaW4oc2VsZi5kaXN0X2RpcixwYXR0ZXJuKSkKKyAgICAgICAgICAgIGZpbGVzID0gWyhvcy5wYXRoLmdldG10aW1lKGYpLGYpIGZvciBmIGluIGZpbGVzXQorICAgICAgICAgICAgZmlsZXMuc29ydCgpCisgICAgICAgICAgICBmaWxlcy5yZXZlcnNlKCkKKworICAgICAgICAgICAgbG9nLmluZm8oIiVkIGZpbGUocykgbWF0Y2hpbmcgJXMiLCBsZW4oZmlsZXMpLCBwYXR0ZXJuKQorICAgICAgICAgICAgZmlsZXMgPSBmaWxlc1tzZWxmLmtlZXA6XQorICAgICAgICAgICAgZm9yICh0LGYpIGluIGZpbGVzOgorICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJEZWxldGluZyAlcyIsIGYpCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYuZHJ5X3J1bjoKKyAgICAgICAgICAgICAgICAgICAgb3MudW5saW5rKGYpCmRpZmYgLS1naXQgYS9MaWIvc2V0dXB0b29scy9jb21tYW5kL3NhdmVvcHRzLnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9zYXZlb3B0cy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YzU4ZDcyCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9zYXZlb3B0cy5weQpAQCAtMCwwICsxLDI0IEBACitpbXBvcnQgZGlzdHV0aWxzLCBvcworZnJvbSBzZXR1cHRvb2xzIGltcG9ydCBDb21tYW5kCitmcm9tIHNldHVwdG9vbHMuY29tbWFuZC5zZXRvcHQgaW1wb3J0IGVkaXRfY29uZmlnLCBvcHRpb25fYmFzZQorCitjbGFzcyBzYXZlb3B0cyhvcHRpb25fYmFzZSk6CisgICAgIiIiU2F2ZSBjb21tYW5kLWxpbmUgb3B0aW9ucyB0byBhIGZpbGUiIiIKKworICAgIGRlc2NyaXB0aW9uID0gInNhdmUgc3VwcGxpZWQgb3B0aW9ucyB0byBzZXR1cC5jZmcgb3Igb3RoZXIgY29uZmlnIGZpbGUiCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBkaXN0ID0gc2VsZi5kaXN0cmlidXRpb24KKyAgICAgICAgY29tbWFuZHMgPSBkaXN0LmNvbW1hbmRfb3B0aW9ucy5rZXlzKCkKKyAgICAgICAgc2V0dGluZ3MgPSB7fQorCisgICAgICAgIGZvciBjbWQgaW4gY29tbWFuZHM6CisKKyAgICAgICAgICAgIGlmIGNtZD09J3NhdmVvcHRzJzoKKyAgICAgICAgICAgICAgICBjb250aW51ZSAgICAjIGRvbid0IHNhdmUgb3VyIG93biBvcHRpb25zIQorCisgICAgICAgICAgICBmb3Igb3B0LChzcmMsdmFsKSBpbiBkaXN0LmdldF9vcHRpb25fZGljdChjbWQpLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgaWYgc3JjPT0iY29tbWFuZCBsaW5lIjoKKyAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3Muc2V0ZGVmYXVsdChjbWQse30pW29wdF0gPSB2YWwKKworICAgICAgICBlZGl0X2NvbmZpZyhzZWxmLmZpbGVuYW1lLCBzZXR0aW5ncywgc2VsZi5kcnlfcnVuKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9zZGlzdC5weSBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvc2Rpc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODI5Y2QzYwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2NvbW1hbmQvc2Rpc3QucHkKQEAgLTAsMCArMSwxNjMgQEAKK2Zyb20gZGlzdHV0aWxzLmNvbW1hbmQuc2Rpc3QgaW1wb3J0IHNkaXN0IGFzIF9zZGlzdAorZnJvbSBkaXN0dXRpbHMudXRpbCBpbXBvcnQgY29udmVydF9wYXRoCitpbXBvcnQgb3MsIHJlLCBzeXMsIHBrZ19yZXNvdXJjZXMKKworZW50aXRpZXMgPSBbCisgICAgKCImbHQ7IiwiPCIpLCAoIiZndDsiLCAiPiIpLCAoIiZxdW90OyIsICciJyksICgiJmFwb3M7IiwgIiciKSwKKyAgICAoIiZhbXA7IiwgIiYiKQorXQorCitkZWYgdW5lc2NhcGUoZGF0YSk6CisgICAgZm9yIG9sZCxuZXcgaW4gZW50aXRpZXM6CisgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2Uob2xkLG5ldykKKyAgICByZXR1cm4gZGF0YQorCitkZWYgcmVfZmluZGVyKHBhdHRlcm4sIHBvc3Rwcm9jPU5vbmUpOgorICAgIGRlZiBmaW5kKGRpcm5hbWUsIGZpbGVuYW1lKToKKyAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsJ3JVJykKKyAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBmb3IgbWF0Y2ggaW4gcGF0dGVybi5maW5kaXRlcihkYXRhKToKKyAgICAgICAgICAgIHBhdGggPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgICAgaWYgcG9zdHByb2M6CisgICAgICAgICAgICAgICAgcGF0aCA9IHBvc3Rwcm9jKHBhdGgpCisgICAgICAgICAgICB5aWVsZCBqb2lucGF0aChkaXJuYW1lLHBhdGgpCisgICAgcmV0dXJuIGZpbmQKKworZGVmIGpvaW5wYXRoKHByZWZpeCxzdWZmaXgpOgorICAgIGlmIG5vdCBwcmVmaXg6CisgICAgICAgIHJldHVybiBzdWZmaXgKKyAgICByZXR1cm4gb3MucGF0aC5qb2luKHByZWZpeCxzdWZmaXgpCisKKworCisKKworCisKKworCisKKworZGVmIHdhbGtfcmV2Y3RybChkaXJuYW1lPScnKToKKyAgICAiIiJGaW5kIGFsbCBmaWxlcyB1bmRlciByZXZpc2lvbiBjb250cm9sIiIiCisgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ3NldHVwdG9vbHMuZmlsZV9maW5kZXJzJyk6CisgICAgICAgIGZvciBpdGVtIGluIGVwLmxvYWQoKShkaXJuYW1lKToKKyAgICAgICAgICAgIHlpZWxkIGl0ZW0KKworZGVmIF9kZWZhdWx0X3JldmN0cmwoZGlybmFtZT0nJyk6CisgICAgZm9yIHBhdGgsIGZpbmRlciBpbiBmaW5kZXJzOgorICAgICAgICBwYXRoID0gam9pbnBhdGgoZGlybmFtZSxwYXRoKQorICAgICAgICBpZiBvcy5wYXRoLmlzZmlsZShwYXRoKToKKyAgICAgICAgICAgIGZvciBwYXRoIGluIGZpbmRlcihkaXJuYW1lLHBhdGgpOgorICAgICAgICAgICAgICAgIGlmIG9zLnBhdGguaXNmaWxlKHBhdGgpOgorICAgICAgICAgICAgICAgICAgICB5aWVsZCBwYXRoCisgICAgICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmlzZGlyKHBhdGgpOgorICAgICAgICAgICAgICAgICAgICBmb3IgaXRlbSBpbiBfZGVmYXVsdF9yZXZjdHJsKHBhdGgpOgorICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgaXRlbQorCitkZWYgZXh0ZXJuYWxzX2ZpbmRlcihkaXJuYW1lLCBmaWxlbmFtZSk6CisgICAgIiIiRmluZCBhbnkgJ3N2bjpleHRlcm5hbHMnIGRpcmVjdG9yaWVzIiIiCisgICAgZm91bmQgPSBGYWxzZQorICAgIGYgPSBvcGVuKGZpbGVuYW1lLCdyYicpCisgICAgZm9yIGxpbmUgaW4gaXRlcihmLnJlYWRsaW5lLCAnJyk6ICAgICMgY2FuJ3QgdXNlIGRpcmVjdCBpdGVyIQorICAgICAgICBwYXJ0cyA9IGxpbmUuc3BsaXQoKQorICAgICAgICBpZiBsZW4ocGFydHMpPT0yOgorICAgICAgICAgICAga2luZCxsZW5ndGggPSBwYXJ0cworICAgICAgICAgICAgZGF0YSA9IGYucmVhZChpbnQobGVuZ3RoKSkKKyAgICAgICAgICAgIGlmIGtpbmQ9PSdLJyBhbmQgZGF0YT09J3N2bjpleHRlcm5hbHMnOgorICAgICAgICAgICAgICAgIGZvdW5kID0gVHJ1ZQorICAgICAgICAgICAgZWxpZiBraW5kPT0nVicgYW5kIGZvdW5kOgorICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgZWxzZToKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIHJldHVybgorCisgICAgZm9yIGxpbmUgaW4gZGF0YS5zcGxpdGxpbmVzKCk6CisgICAgICAgIHBhcnRzID0gbGluZS5zcGxpdCgpCisgICAgICAgIGlmIHBhcnRzOgorICAgICAgICAgICAgeWllbGQgam9pbnBhdGgoZGlybmFtZSwgcGFydHNbMF0pCisKKworZmluZGVycyA9IFsKKyAgICAoY29udmVydF9wYXRoKCdDVlMvRW50cmllcycpLAorICAgICAgICByZV9maW5kZXIocmUuY29tcGlsZShyIl5cdz8vKFteL10rKS8iLCByZS5NKSkpLAorICAgIChjb252ZXJ0X3BhdGgoJy5zdm4vZW50cmllcycpLAorICAgICAgICByZV9maW5kZXIoCisgICAgICAgICAgICByZS5jb21waWxlKHInbmFtZT0iKFteIl0rKSIoPyFbXj5dK2RlbGV0ZWQ9InRydWUiKScsIHJlLkkpLAorICAgICAgICAgICAgdW5lc2NhcGUKKyAgICAgICAgKQorICAgICksCisgICAgKGNvbnZlcnRfcGF0aCgnLnN2bi9kaXItcHJvcHMnKSwgZXh0ZXJuYWxzX2ZpbmRlciksCitdCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitjbGFzcyBzZGlzdChfc2Rpc3QpOgorICAgICIiIlNtYXJ0IHNkaXN0IHRoYXQgZmluZHMgYW55dGhpbmcgc3VwcG9ydGVkIGJ5IHJldmlzaW9uIGNvbnRyb2wiIiIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdmb3JtYXRzPScsIE5vbmUsCisgICAgICAgICAiZm9ybWF0cyBmb3Igc291cmNlIGRpc3RyaWJ1dGlvbiAoY29tbWEtc2VwYXJhdGVkIGxpc3QpIiksCisgICAgICAgICgna2VlcC10ZW1wJywgJ2snLAorICAgICAgICAgImtlZXAgdGhlIGRpc3RyaWJ1dGlvbiB0cmVlIGFyb3VuZCBhZnRlciBjcmVhdGluZyAiICsKKyAgICAgICAgICJhcmNoaXZlIGZpbGUocykiKSwKKyAgICAgICAgKCdkaXN0LWRpcj0nLCAnZCcsCisgICAgICAgICAiZGlyZWN0b3J5IHRvIHB1dCB0aGUgc291cmNlIGRpc3RyaWJ1dGlvbiBhcmNoaXZlKHMpIGluICIKKyAgICAgICAgICJbZGVmYXVsdDogZGlzdF0iKSwKKyAgICAgICAgXQorCisgICAgbmVnYXRpdmVfb3B0ID0ge30KKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYucnVuX2NvbW1hbmQoJ2VnZ19pbmZvJykKKyAgICAgICAgZWlfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2VnZ19pbmZvJykKKyAgICAgICAgc2VsZi5maWxlbGlzdCA9IGVpX2NtZC5maWxlbGlzdAorICAgICAgICBzZWxmLmZpbGVsaXN0LmFwcGVuZChvcy5wYXRoLmpvaW4oZWlfY21kLmVnZ19pbmZvLCdTT1VSQ0VTLnR4dCcpKQorCisgICAgICAgIHNlbGYuY2hlY2tfbWV0YWRhdGEoKQorICAgICAgICBzZWxmLm1ha2VfZGlzdHJpYnV0aW9uKCkKKworICAgICAgICBkaXN0X2ZpbGVzID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwnZGlzdF9maWxlcycsW10pCisgICAgICAgIGZvciBmaWxlIGluIHNlbGYuYXJjaGl2ZV9maWxlczoKKyAgICAgICAgICAgIGRhdGEgPSAoJ3NkaXN0JywgJycsIGZpbGUpCisgICAgICAgICAgICBpZiBkYXRhIG5vdCBpbiBkaXN0X2ZpbGVzOgorICAgICAgICAgICAgICAgIGRpc3RfZmlsZXMuYXBwZW5kKGRhdGEpCisKKyAgICBkZWYgcmVhZF90ZW1wbGF0ZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgX3NkaXN0LnJlYWRfdGVtcGxhdGUoc2VsZikKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgIyBncm9keSBoYWNrIHRvIGNsb3NlIHRoZSB0ZW1wbGF0ZSBmaWxlIChNQU5JRkVTVC5pbikKKyAgICAgICAgICAgICMgdGhpcyBwcmV2ZW50cyBlYXN5X2luc3RhbGwncyBhdHRlbXB0IGF0IGRlbGV0aW5nIHRoZSBmaWxlIGZyb20KKyAgICAgICAgICAgICMgZHlpbmcgYW5kIHRodXMgbWFza2luZyB0aGUgcmVhbCBlcnJvcgorICAgICAgICAgICAgc3lzLmV4Y19pbmZvKClbMl0udGJfbmV4dC50Yl9mcmFtZS5mX2xvY2Fsc1sndGVtcGxhdGUnXS5jbG9zZSgpCisgICAgICAgICAgICByYWlzZQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC9zZXRvcHQucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL3NldG9wdC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMGMxMDU4Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC9zZXRvcHQucHkKQEAgLTAsMCArMSwxNTggQEAKK2ltcG9ydCBkaXN0dXRpbHMsIG9zCitmcm9tIHNldHVwdG9vbHMgaW1wb3J0IENvbW1hbmQKK2Zyb20gZGlzdHV0aWxzLnV0aWwgaW1wb3J0IGNvbnZlcnRfcGF0aAorZnJvbSBkaXN0dXRpbHMgaW1wb3J0IGxvZworZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCAqCisKK19fYWxsX18gPSBbJ2NvbmZpZ19maWxlJywgJ2VkaXRfY29uZmlnJywgJ29wdGlvbl9iYXNlJywgJ3NldG9wdCddCisKKworZGVmIGNvbmZpZ19maWxlKGtpbmQ9ImxvY2FsIik6CisgICAgIiIiR2V0IHRoZSBmaWxlbmFtZSBvZiB0aGUgZGlzdHV0aWxzLCBsb2NhbCwgZ2xvYmFsLCBvciBwZXItdXNlciBjb25maWcKKworICAgIGBraW5kYCBtdXN0IGJlIG9uZSBvZiAibG9jYWwiLCAiZ2xvYmFsIiwgb3IgInVzZXIiCisgICAgIiIiCisgICAgaWYga2luZD09J2xvY2FsJzoKKyAgICAgICAgcmV0dXJuICdzZXR1cC5jZmcnCisgICAgaWYga2luZD09J2dsb2JhbCc6CisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4oCisgICAgICAgICAgICBvcy5wYXRoLmRpcm5hbWUoZGlzdHV0aWxzLl9fZmlsZV9fKSwnZGlzdHV0aWxzLmNmZycKKyAgICAgICAgKQorICAgIGlmIGtpbmQ9PSd1c2VyJzoKKyAgICAgICAgZG90ID0gb3MubmFtZT09J3Bvc2l4JyBhbmQgJy4nIG9yICcnCisgICAgICAgIHJldHVybiBvcy5wYXRoLmV4cGFuZHVzZXIoY29udmVydF9wYXRoKCJ+LyVzcHlkaXN0dXRpbHMuY2ZnIiAlIGRvdCkpCisgICAgcmFpc2UgVmFsdWVFcnJvcigKKyAgICAgICAgImNvbmZpZ19maWxlKCkgdHlwZSBtdXN0IGJlICdsb2NhbCcsICdnbG9iYWwnLCBvciAndXNlciciLCBraW5kCisgICAgKQorCisKKworCisKKworCisKKworCisKKworCisKKworZGVmIGVkaXRfY29uZmlnKGZpbGVuYW1lLCBzZXR0aW5ncywgZHJ5X3J1bj1GYWxzZSk6CisgICAgIiIiRWRpdCBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBpbmNsdWRlIGBzZXR0aW5nc2AKKworICAgIGBzZXR0aW5nc2AgaXMgYSBkaWN0aW9uYXJ5IG9mIGRpY3Rpb25hcmllcyBvciBgYE5vbmVgYCB2YWx1ZXMsIGtleWVkIGJ5CisgICAgY29tbWFuZC9zZWN0aW9uIG5hbWUuICBBIGBgTm9uZWBgIHZhbHVlIG1lYW5zIHRvIGRlbGV0ZSB0aGUgZW50aXJlIHNlY3Rpb24sCisgICAgd2hpbGUgYSBkaWN0aW9uYXJ5IGxpc3RzIHNldHRpbmdzIHRvIGJlIGNoYW5nZWQgb3IgZGVsZXRlZCBpbiB0aGF0IHNlY3Rpb24uCisgICAgQSBzZXR0aW5nIG9mIGBgTm9uZWBgIG1lYW5zIHRvIGRlbGV0ZSB0aGF0IHNldHRpbmcuCisgICAgIiIiCisgICAgZnJvbSBDb25maWdQYXJzZXIgaW1wb3J0IFJhd0NvbmZpZ1BhcnNlcgorICAgIGxvZy5kZWJ1ZygiUmVhZGluZyBjb25maWd1cmF0aW9uIGZyb20gJXMiLCBmaWxlbmFtZSkKKyAgICBvcHRzID0gUmF3Q29uZmlnUGFyc2VyKCkKKyAgICBvcHRzLnJlYWQoW2ZpbGVuYW1lXSkKKyAgICBmb3Igc2VjdGlvbiwgb3B0aW9ucyBpbiBzZXR0aW5ncy5pdGVtcygpOgorICAgICAgICBpZiBvcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICBsb2cuaW5mbygiRGVsZXRpbmcgc2VjdGlvbiBbJXNdIGZyb20gJXMiLCBzZWN0aW9uLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIG9wdHMucmVtb3ZlX3NlY3Rpb24oc2VjdGlvbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIG5vdCBvcHRzLmhhc19zZWN0aW9uKHNlY3Rpb24pOgorICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWRkaW5nIG5ldyBzZWN0aW9uIFslc10gdG8gJXMiLCBzZWN0aW9uLCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBvcHRzLmFkZF9zZWN0aW9uKHNlY3Rpb24pCisgICAgICAgICAgICBmb3Igb3B0aW9uLHZhbHVlIGluIG9wdGlvbnMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkRlbGV0aW5nICVzLiVzIGZyb20gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgb3B0aW9uLCBmaWxlbmFtZQorICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgICAgIG9wdHMucmVtb3ZlX29wdGlvbihzZWN0aW9uLG9wdGlvbikKKyAgICAgICAgICAgICAgICAgICAgaWYgbm90IG9wdHMub3B0aW9ucyhzZWN0aW9uKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5pbmZvKCJEZWxldGluZyBlbXB0eSBbJXNdIHNlY3Rpb24gZnJvbSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRzLnJlbW92ZV9zZWN0aW9uKHNlY3Rpb24pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKAorICAgICAgICAgICAgICAgICAgICAgICAgIlNldHRpbmcgJXMuJXMgdG8gJXIgaW4gJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgb3B0aW9uLCB2YWx1ZSwgZmlsZW5hbWUKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICBvcHRzLnNldChzZWN0aW9uLG9wdGlvbix2YWx1ZSkKKworICAgIGxvZy5pbmZvKCJXcml0aW5nICVzIiwgZmlsZW5hbWUpCisgICAgaWYgbm90IGRyeV9ydW46CisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCd3Jyk7IG9wdHMud3JpdGUoZik7IGYuY2xvc2UoKQorCitjbGFzcyBvcHRpb25fYmFzZShDb21tYW5kKToKKyAgICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBjb21tYW5kcyB0aGF0IG1lc3Mgd2l0aCBjb25maWcgZmlsZXMiIiIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdnbG9iYWwtY29uZmlnJywgJ2cnLAorICAgICAgICAgICAgICAgICAic2F2ZSBvcHRpb25zIHRvIHRoZSBzaXRlLXdpZGUgZGlzdHV0aWxzLmNmZyBmaWxlIiksCisgICAgICAgICgndXNlci1jb25maWcnLCAndScsCisgICAgICAgICAgICAgICAgICJzYXZlIG9wdGlvbnMgdG8gdGhlIGN1cnJlbnQgdXNlcidzIHB5ZGlzdHV0aWxzLmNmZyBmaWxlIiksCisgICAgICAgICgnZmlsZW5hbWU9JywgJ2YnLAorICAgICAgICAgICAgICAgICAiY29uZmlndXJhdGlvbiBmaWxlIHRvIHVzZSAoZGVmYXVsdD1zZXR1cC5jZmcpIiksCisgICAgXQorCisgICAgYm9vbGVhbl9vcHRpb25zID0gWworICAgICAgICAnZ2xvYmFsLWNvbmZpZycsICd1c2VyLWNvbmZpZycsCisgICAgXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgc2VsZi5nbG9iYWxfY29uZmlnID0gTm9uZQorICAgICAgICBzZWxmLnVzZXJfY29uZmlnICAgPSBOb25lCisgICAgICAgIHNlbGYuZmlsZW5hbWUgPSBOb25lCisKKyAgICBkZWYgZmluYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgZmlsZW5hbWVzID0gW10KKyAgICAgICAgaWYgc2VsZi5nbG9iYWxfY29uZmlnOgorICAgICAgICAgICAgZmlsZW5hbWVzLmFwcGVuZChjb25maWdfZmlsZSgnZ2xvYmFsJykpCisgICAgICAgIGlmIHNlbGYudXNlcl9jb25maWc6CisgICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKGNvbmZpZ19maWxlKCd1c2VyJykpCisgICAgICAgIGlmIHNlbGYuZmlsZW5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKHNlbGYuZmlsZW5hbWUpCisgICAgICAgIGlmIG5vdCBmaWxlbmFtZXM6CisgICAgICAgICAgICBmaWxlbmFtZXMuYXBwZW5kKGNvbmZpZ19maWxlKCdsb2NhbCcpKQorICAgICAgICBpZiBsZW4oZmlsZW5hbWVzKT4xOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIk11c3Qgc3BlY2lmeSBvbmx5IG9uZSBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9uIiwKKyAgICAgICAgICAgICAgICBmaWxlbmFtZXMKKyAgICAgICAgICAgICkKKyAgICAgICAgc2VsZi5maWxlbmFtZSwgPSBmaWxlbmFtZXMKKworCisKKworY2xhc3Mgc2V0b3B0KG9wdGlvbl9iYXNlKToKKyAgICAiIiJTYXZlIGNvbW1hbmQtbGluZSBvcHRpb25zIHRvIGEgZmlsZSIiIgorCisgICAgZGVzY3JpcHRpb24gPSAic2V0IGFuIG9wdGlvbiBpbiBzZXR1cC5jZmcgb3IgYW5vdGhlciBjb25maWcgZmlsZSIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdjb21tYW5kPScsICdjJywgJ2NvbW1hbmQgdG8gc2V0IGFuIG9wdGlvbiBmb3InKSwKKyAgICAgICAgKCdvcHRpb249JywgICdvJywgICdvcHRpb24gdG8gc2V0JyksCisgICAgICAgICgnc2V0LXZhbHVlPScsICAgJ3MnLCAndmFsdWUgb2YgdGhlIG9wdGlvbicpLAorICAgICAgICAoJ3JlbW92ZScsICAgJ3InLCAncmVtb3ZlICh1bnNldCkgdGhlIHZhbHVlJyksCisgICAgXSArIG9wdGlvbl9iYXNlLnVzZXJfb3B0aW9ucworCisgICAgYm9vbGVhbl9vcHRpb25zID0gb3B0aW9uX2Jhc2UuYm9vbGVhbl9vcHRpb25zICsgWydyZW1vdmUnXQorCisgICAgZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKKyAgICAgICAgb3B0aW9uX2Jhc2UuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIHNlbGYuY29tbWFuZCA9IE5vbmUKKyAgICAgICAgc2VsZi5vcHRpb24gPSBOb25lCisgICAgICAgIHNlbGYuc2V0X3ZhbHVlID0gTm9uZQorICAgICAgICBzZWxmLnJlbW92ZSA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBvcHRpb25fYmFzZS5maW5hbGl6ZV9vcHRpb25zKHNlbGYpCisgICAgICAgIGlmIHNlbGYuY29tbWFuZCBpcyBOb25lIG9yIHNlbGYub3B0aW9uIGlzIE5vbmU6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiTXVzdCBzcGVjaWZ5IC0tY29tbWFuZCAqYW5kKiAtLW9wdGlvbiIpCisgICAgICAgIGlmIHNlbGYuc2V0X3ZhbHVlIGlzIE5vbmUgYW5kIG5vdCBzZWxmLnJlbW92ZToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc09wdGlvbkVycm9yKCJNdXN0IHNwZWNpZnkgLS1zZXQtdmFsdWUgb3IgLS1yZW1vdmUiKQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgZWRpdF9jb25maWcoCisgICAgICAgICAgICBzZWxmLmZpbGVuYW1lLCB7CisgICAgICAgICAgICAgICAgc2VsZi5jb21tYW5kOiB7c2VsZi5vcHRpb24ucmVwbGFjZSgnLScsJ18nKTpzZWxmLnNldF92YWx1ZX0KKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBzZWxmLmRyeV9ydW4KKyAgICAgICAgKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC90ZXN0LnB5IGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZmNhMzUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL3Rlc3QucHkKQEAgLTAsMCArMSwxMTkgQEAKK2Zyb20gc2V0dXB0b29scyBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvcgoraW1wb3J0IHN5cworZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAqCitmcm9tIHVuaXR0ZXN0IGltcG9ydCBUZXN0TG9hZGVyLCBtYWluCisKK2NsYXNzIFNjYW5uaW5nTG9hZGVyKFRlc3RMb2FkZXIpOgorCisgICAgZGVmIGxvYWRUZXN0c0Zyb21Nb2R1bGUoc2VsZiwgbW9kdWxlKToKKyAgICAgICAgIiIiUmV0dXJuIGEgc3VpdGUgb2YgYWxsIHRlc3RzIGNhc2VzIGNvbnRhaW5lZCBpbiB0aGUgZ2l2ZW4gbW9kdWxlCisKKyAgICAgICAgSWYgdGhlIG1vZHVsZSBpcyBhIHBhY2thZ2UsIGxvYWQgdGVzdHMgZnJvbSBhbGwgdGhlIG1vZHVsZXMgaW4gaXQuCisgICAgICAgIElmIHRoZSBtb2R1bGUgaGFzIGFuIGBgYWRkaXRpb25hbF90ZXN0c2BgIGZ1bmN0aW9uLCBjYWxsIGl0IGFuZCBhZGQKKyAgICAgICAgdGhlIHJldHVybiB2YWx1ZSB0byB0aGUgdGVzdHMuCisgICAgICAgICIiIgorICAgICAgICB0ZXN0cyA9IFtdCisgICAgICAgIGlmIG1vZHVsZS5fX25hbWVfXyE9J3NldHVwdG9vbHMudGVzdHMuZG9jdGVzdCc6ICAjIHVnaAorICAgICAgICAgICAgdGVzdHMuYXBwZW5kKFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZShzZWxmLG1vZHVsZSkpCisKKyAgICAgICAgaWYgaGFzYXR0cihtb2R1bGUsICJhZGRpdGlvbmFsX3Rlc3RzIik6CisgICAgICAgICAgICB0ZXN0cy5hcHBlbmQobW9kdWxlLmFkZGl0aW9uYWxfdGVzdHMoKSkKKworICAgICAgICBpZiBoYXNhdHRyKG1vZHVsZSwgJ19fcGF0aF9fJyk6CisgICAgICAgICAgICBmb3IgZmlsZSBpbiByZXNvdXJjZV9saXN0ZGlyKG1vZHVsZS5fX25hbWVfXywgJycpOgorICAgICAgICAgICAgICAgIGlmIGZpbGUuZW5kc3dpdGgoJy5weScpIGFuZCBmaWxlIT0nX19pbml0X18ucHknOgorICAgICAgICAgICAgICAgICAgICBzdWJtb2R1bGUgPSBtb2R1bGUuX19uYW1lX18rJy4nK2ZpbGVbOi0zXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGlmIHJlc291cmNlX2V4aXN0cygKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZS5fX25hbWVfXywgZmlsZSsnL19faW5pdF9fLnB5JworICAgICAgICAgICAgICAgICAgICApOgorICAgICAgICAgICAgICAgICAgICAgICAgc3VibW9kdWxlID0gbW9kdWxlLl9fbmFtZV9fKycuJytmaWxlCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHRlc3RzLmFwcGVuZChzZWxmLmxvYWRUZXN0c0Zyb21OYW1lKHN1Ym1vZHVsZSkpCisKKyAgICAgICAgaWYgbGVuKHRlc3RzKSE9MToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnN1aXRlQ2xhc3ModGVzdHMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gdGVzdHNbMF0gIyBkb24ndCBjcmVhdGUgYSBuZXN0ZWQgc3VpdGUgZm9yIG9ubHkgb25lIHJldHVybgorCisKK2NsYXNzIHRlc3QoQ29tbWFuZCk6CisKKyAgICAiIiJDb21tYW5kIHRvIHJ1biB1bml0IHRlc3RzIGFmdGVyIGluLXBsYWNlIGJ1aWxkIiIiCisKKyAgICBkZXNjcmlwdGlvbiA9ICJydW4gdW5pdCB0ZXN0cyBhZnRlciBpbi1wbGFjZSBidWlsZCIKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCd0ZXN0LW1vZHVsZT0nLCdtJywgIlJ1biAndGVzdF9zdWl0ZScgaW4gc3BlY2lmaWVkIG1vZHVsZSIpLAorICAgICAgICAoJ3Rlc3Qtc3VpdGU9JywncycsCisgICAgICAgICAgICAiVGVzdCBzdWl0ZSB0byBydW4gKGUuZy4gJ3NvbWVfbW9kdWxlLnRlc3Rfc3VpdGUnKSIpLAorICAgIF0KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYudGVzdF9zdWl0ZSA9IE5vbmUKKyAgICAgICAgc2VsZi50ZXN0X21vZHVsZSA9IE5vbmUKKyAgICAgICAgc2VsZi50ZXN0X2xvYWRlciA9IE5vbmUKKworCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisKKyAgICAgICAgaWYgc2VsZi50ZXN0X3N1aXRlIGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLnRlc3RfbW9kdWxlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi50ZXN0X3N1aXRlID0gc2VsZi5kaXN0cmlidXRpb24udGVzdF9zdWl0ZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnRlc3Rfc3VpdGUgPSBzZWxmLnRlc3RfbW9kdWxlKyIudGVzdF9zdWl0ZSIKKyAgICAgICAgZWxpZiBzZWxmLnRlc3RfbW9kdWxlOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzT3B0aW9uRXJyb3IoCisgICAgICAgICAgICAgICAgIllvdSBtYXkgc3BlY2lmeSBhIG1vZHVsZSBvciBhIHN1aXRlLCBidXQgbm90IGJvdGgiCisgICAgICAgICAgICApCisKKyAgICAgICAgc2VsZi50ZXN0X2FyZ3MgPSBbc2VsZi50ZXN0X3N1aXRlXQorCisgICAgICAgIGlmIHNlbGYudmVyYm9zZToKKyAgICAgICAgICAgIHNlbGYudGVzdF9hcmdzLmluc2VydCgwLCctLXZlcmJvc2UnKQorICAgICAgICBpZiBzZWxmLnRlc3RfbG9hZGVyIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLnRlc3RfbG9hZGVyID0gZ2V0YXR0cihzZWxmLmRpc3RyaWJ1dGlvbiwndGVzdF9sb2FkZXInLE5vbmUpCisgICAgICAgIGlmIHNlbGYudGVzdF9sb2FkZXIgaXMgTm9uZToKKyAgICAgICAgICAgIHNlbGYudGVzdF9sb2FkZXIgPSAic2V0dXB0b29scy5jb21tYW5kLnRlc3Q6U2Nhbm5pbmdMb2FkZXIiCisKKworCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgIyBFbnN1cmUgbWV0YWRhdGEgaXMgdXAtdG8tZGF0ZQorICAgICAgICBzZWxmLnJ1bl9jb21tYW5kKCdlZ2dfaW5mbycpCisKKyAgICAgICAgIyBCdWlsZCBleHRlbnNpb25zIGluLXBsYWNlCisgICAgICAgIHNlbGYucmVpbml0aWFsaXplX2NvbW1hbmQoJ2J1aWxkX2V4dCcsIGlucGxhY2U9MSkKKyAgICAgICAgc2VsZi5ydW5fY29tbWFuZCgnYnVpbGRfZXh0JykKKworICAgICAgICBpZiBzZWxmLmRpc3RyaWJ1dGlvbi50ZXN0c19yZXF1aXJlOgorICAgICAgICAgICAgc2VsZi5kaXN0cmlidXRpb24uZmV0Y2hfYnVpbGRfZWdncyhzZWxmLmRpc3RyaWJ1dGlvbi50ZXN0c19yZXF1aXJlKQorCisgICAgICAgIGlmIHNlbGYudGVzdF9zdWl0ZToKKyAgICAgICAgICAgIGNtZCA9ICcgJy5qb2luKHNlbGYudGVzdF9hcmdzKQorICAgICAgICAgICAgaWYgc2VsZi5kcnlfcnVuOgorICAgICAgICAgICAgICAgIHNlbGYuYW5ub3VuY2UoJ3NraXBwaW5nICJ1bml0dGVzdCAlcyIgKGRyeSBydW4pJyAlIGNtZCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgncnVubmluZyAidW5pdHRlc3QgJXMiJyAlIGNtZCkKKyAgICAgICAgICAgICAgICBzZWxmLnJ1bl90ZXN0cygpCisKKworICAgIGRlZiBydW5fdGVzdHMoc2VsZik6CisgICAgICAgIGltcG9ydCB1bml0dGVzdAorICAgICAgICBvbGRfcGF0aCA9IHN5cy5wYXRoWzpdCisgICAgICAgIGVpX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCJlZ2dfaW5mbyIpCisgICAgICAgIHBhdGhfaXRlbSA9IG5vcm1hbGl6ZV9wYXRoKGVpX2NtZC5lZ2dfYmFzZSkKKyAgICAgICAgbWV0YWRhdGEgPSBQYXRoTWV0YWRhdGEoCisgICAgICAgICAgICBwYXRoX2l0ZW0sIG5vcm1hbGl6ZV9wYXRoKGVpX2NtZC5lZ2dfaW5mbykKKyAgICAgICAgKQorICAgICAgICBkaXN0ID0gRGlzdHJpYnV0aW9uKHBhdGhfaXRlbSwgbWV0YWRhdGEsIHByb2plY3RfbmFtZT1laV9jbWQuZWdnX25hbWUpCisgICAgICAgIHdvcmtpbmdfc2V0LmFkZChkaXN0KQorICAgICAgICByZXF1aXJlKHN0cihkaXN0LmFzX3JlcXVpcmVtZW50KCkpKQorICAgICAgICBsb2FkZXJfZXAgPSBFbnRyeVBvaW50LnBhcnNlKCJ4PSIrc2VsZi50ZXN0X2xvYWRlcikKKyAgICAgICAgbG9hZGVyX2NsYXNzID0gbG9hZGVyX2VwLmxvYWQocmVxdWlyZT1GYWxzZSkKKyAgICAgICAgdW5pdHRlc3QubWFpbigKKyAgICAgICAgICAgIE5vbmUsIE5vbmUsIFt1bml0dGVzdC5fX2ZpbGVfX10rc2VsZi50ZXN0X2FyZ3MsCisgICAgICAgICAgICB0ZXN0TG9hZGVyID0gbG9hZGVyX2NsYXNzKCkKKyAgICAgICAgKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWQucHkgYi9MaWIvc2V0dXB0b29scy9jb21tYW5kL3VwbG9hZC5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NDRjNDAwCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvY29tbWFuZC91cGxvYWQucHkKQEAgLTAsMCArMSwxNzggQEAKKyIiImRpc3R1dGlscy5jb21tYW5kLnVwbG9hZAorCitJbXBsZW1lbnRzIHRoZSBEaXN0dXRpbHMgJ3VwbG9hZCcgc3ViY29tbWFuZCAodXBsb2FkIHBhY2thZ2UgdG8gUHlQSSkuIiIiCisKK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgKgorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgQ29tbWFuZAorZnJvbSBkaXN0dXRpbHMuc3Bhd24gaW1wb3J0IHNwYXduCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCitmcm9tIG1kNSBpbXBvcnQgbWQ1CitpbXBvcnQgb3MKK2ltcG9ydCBzb2NrZXQKK2ltcG9ydCBwbGF0Zm9ybQoraW1wb3J0IENvbmZpZ1BhcnNlcgoraW1wb3J0IGh0dHBsaWIKK2ltcG9ydCBiYXNlNjQKK2ltcG9ydCB1cmxwYXJzZQoraW1wb3J0IGNTdHJpbmdJTyBhcyBTdHJpbmdJTworCitjbGFzcyB1cGxvYWQoQ29tbWFuZCk6CisKKyAgICBkZXNjcmlwdGlvbiA9ICJ1cGxvYWQgYmluYXJ5IHBhY2thZ2UgdG8gUHlQSSIKKworICAgIERFRkFVTFRfUkVQT1NJVE9SWSA9ICdodHRwOi8vd3d3LnB5dGhvbi5vcmcvcHlwaScKKworICAgIHVzZXJfb3B0aW9ucyA9IFsKKyAgICAgICAgKCdyZXBvc2l0b3J5PScsICdyJywKKyAgICAgICAgICJ1cmwgb2YgcmVwb3NpdG9yeSBbZGVmYXVsdDogJXNdIiAlIERFRkFVTFRfUkVQT1NJVE9SWSksCisgICAgICAgICgnc2hvdy1yZXNwb25zZScsIE5vbmUsCisgICAgICAgICAnZGlzcGxheSBmdWxsIHJlc3BvbnNlIHRleHQgZnJvbSBzZXJ2ZXInKSwKKyAgICAgICAgKCdzaWduJywgJ3MnLAorICAgICAgICAgJ3NpZ24gZmlsZXMgdG8gdXBsb2FkIHVzaW5nIGdwZycpLAorICAgICAgICAoJ2lkZW50aXR5PScsICdpJywgJ0dQRyBpZGVudGl0eSB1c2VkIHRvIHNpZ24gZmlsZXMnKSwKKyAgICAgICAgXQorICAgIGJvb2xlYW5fb3B0aW9ucyA9IFsnc2hvdy1yZXNwb25zZScsICdzaWduJ10KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYudXNlcm5hbWUgPSAnJworICAgICAgICBzZWxmLnBhc3N3b3JkID0gJycKKyAgICAgICAgc2VsZi5yZXBvc2l0b3J5ID0gJycKKyAgICAgICAgc2VsZi5zaG93X3Jlc3BvbnNlID0gMAorICAgICAgICBzZWxmLnNpZ24gPSBGYWxzZQorICAgICAgICBzZWxmLmlkZW50aXR5ID0gTm9uZQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIGlmIHNlbGYuaWRlbnRpdHkgYW5kIG5vdCBzZWxmLnNpZ246CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgICAiTXVzdCB1c2UgLS1zaWduIGZvciAtLWlkZW50aXR5IHRvIGhhdmUgbWVhbmluZyIKKyAgICAgICAgICAgICkKKyAgICAgICAgaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdIT01FJyk6CisgICAgICAgICAgICByYyA9IG9zLnBhdGguam9pbihvcy5lbnZpcm9uWydIT01FJ10sICcucHlwaXJjJykKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHJjKToKKyAgICAgICAgICAgICAgICBzZWxmLmFubm91bmNlKCdVc2luZyBQeVBJIGxvZ2luIGZyb20gJXMnICUgcmMpCisgICAgICAgICAgICAgICAgY29uZmlnID0gQ29uZmlnUGFyc2VyLkNvbmZpZ1BhcnNlcih7CisgICAgICAgICAgICAgICAgICAgICAgICAndXNlcm5hbWUnOicnLAorICAgICAgICAgICAgICAgICAgICAgICAgJ3Bhc3N3b3JkJzonJywKKyAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvc2l0b3J5JzonJ30pCisgICAgICAgICAgICAgICAgY29uZmlnLnJlYWQocmMpCisgICAgICAgICAgICAgICAgaWYgbm90IHNlbGYucmVwb3NpdG9yeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXBvc2l0b3J5ID0gY29uZmlnLmdldCgnc2VydmVyLWxvZ2luJywgJ3JlcG9zaXRvcnknKQorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnVzZXJuYW1lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVzZXJuYW1lID0gY29uZmlnLmdldCgnc2VydmVyLWxvZ2luJywgJ3VzZXJuYW1lJykKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5wYXNzd29yZDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5wYXNzd29yZCA9IGNvbmZpZy5nZXQoJ3NlcnZlci1sb2dpbicsICdwYXNzd29yZCcpCisgICAgICAgIGlmIG5vdCBzZWxmLnJlcG9zaXRvcnk6CisgICAgICAgICAgICBzZWxmLnJlcG9zaXRvcnkgPSBzZWxmLkRFRkFVTFRfUkVQT1NJVE9SWQorCisgICAgZGVmIHJ1bihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuZGlzdHJpYnV0aW9uLmRpc3RfZmlsZXM6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigiTm8gZGlzdCBmaWxlIGNyZWF0ZWQgaW4gZWFybGllciBjb21tYW5kIikKKyAgICAgICAgZm9yIGNvbW1hbmQsIHB5dmVyc2lvbiwgZmlsZW5hbWUgaW4gc2VsZi5kaXN0cmlidXRpb24uZGlzdF9maWxlczoKKyAgICAgICAgICAgIHNlbGYudXBsb2FkX2ZpbGUoY29tbWFuZCwgcHl2ZXJzaW9uLCBmaWxlbmFtZSkKKworICAgIGRlZiB1cGxvYWRfZmlsZShzZWxmLCBjb21tYW5kLCBweXZlcnNpb24sIGZpbGVuYW1lKToKKyAgICAgICAgIyBTaWduIGlmIHJlcXVlc3RlZAorICAgICAgICBpZiBzZWxmLnNpZ246CisgICAgICAgICAgICBncGdfYXJncyA9IFsiZ3BnIiwgIi0tZGV0YWNoLXNpZ24iLCAiLWEiLCBmaWxlbmFtZV0KKyAgICAgICAgICAgIGlmIHNlbGYuaWRlbnRpdHk6CisgICAgICAgICAgICAgICAgZ3BnX2FyZ3NbMjoyXSA9IFsiLS1sb2NhbC11c2VyIiwgc2VsZi5pZGVudGl0eV0KKyAgICAgICAgICAgIHNwYXduKGdwZ19hcmdzLAorICAgICAgICAgICAgICAgICAgZHJ5X3J1bj1zZWxmLmRyeV9ydW4pCisKKyAgICAgICAgIyBGaWxsIGluIHRoZSBkYXRhCisgICAgICAgIGNvbnRlbnQgPSBvcGVuKGZpbGVuYW1lLCdyYicpLnJlYWQoKQorICAgICAgICBiYXNlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCisgICAgICAgIGNvbW1lbnQgPSAnJworICAgICAgICBpZiBjb21tYW5kPT0nYmRpc3RfZWdnJyBhbmQgc2VsZi5kaXN0cmlidXRpb24uaGFzX2V4dF9tb2R1bGVzKCk6CisgICAgICAgICAgICBjb21tZW50ID0gImJ1aWx0IG9uICVzIiAlIHBsYXRmb3JtLnBsYXRmb3JtKHRlcnNlPTEpCisgICAgICAgIGRhdGEgPSB7CisgICAgICAgICAgICAnOmFjdGlvbic6J2ZpbGVfdXBsb2FkJywKKyAgICAgICAgICAgICdwcm90Y29sX3ZlcnNpb24nOicxJywKKyAgICAgICAgICAgICduYW1lJzpzZWxmLmRpc3RyaWJ1dGlvbi5nZXRfbmFtZSgpLAorICAgICAgICAgICAgJ3ZlcnNpb24nOnNlbGYuZGlzdHJpYnV0aW9uLmdldF92ZXJzaW9uKCksCisgICAgICAgICAgICAnY29udGVudCc6KGJhc2VuYW1lLGNvbnRlbnQpLAorICAgICAgICAgICAgJ2ZpbGV0eXBlJzpjb21tYW5kLAorICAgICAgICAgICAgJ3B5dmVyc2lvbic6cHl2ZXJzaW9uLAorICAgICAgICAgICAgJ21kNV9kaWdlc3QnOm1kNShjb250ZW50KS5oZXhkaWdlc3QoKSwKKyAgICAgICAgICAgIH0KKyAgICAgICAgaWYgY29tbWFuZCA9PSAnYmRpc3RfcnBtJzoKKyAgICAgICAgICAgIGRpc3QsIHZlcnNpb24sIGlkID0gcGxhdGZvcm0uZGlzdCgpCisgICAgICAgICAgICBpZiBkaXN0OgorICAgICAgICAgICAgICAgIGNvbW1lbnQgPSAnYnVpbHQgZm9yICVzICVzJyAlIChkaXN0LCB2ZXJzaW9uKQorICAgICAgICBlbGlmIGNvbW1hbmQgPT0gJ2JkaXN0X2R1bWInOgorICAgICAgICAgICAgY29tbWVudCA9ICdidWlsdCBmb3IgJXMnICUgcGxhdGZvcm0ucGxhdGZvcm0odGVyc2U9MSkKKyAgICAgICAgZGF0YVsnY29tbWVudCddID0gY29tbWVudAorCisgICAgICAgIGlmIHNlbGYuc2lnbjoKKyAgICAgICAgICAgIGRhdGFbJ2dwZ19zaWduYXR1cmUnXSA9IChvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSArICIuYXNjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcGVuKGZpbGVuYW1lKyIuYXNjIikucmVhZCgpKQorCisgICAgICAgICMgc2V0IHVwIHRoZSBhdXRoZW50aWNhdGlvbgorICAgICAgICBhdXRoID0gIkJhc2ljICIgKyBiYXNlNjQuZW5jb2Rlc3RyaW5nKHNlbGYudXNlcm5hbWUgKyAiOiIgKyBzZWxmLnBhc3N3b3JkKS5zdHJpcCgpCisKKyAgICAgICAgIyBCdWlsZCB1cCB0aGUgTUlNRSBwYXlsb2FkIGZvciB0aGUgUE9TVCBkYXRhCisgICAgICAgIGJvdW5kYXJ5ID0gJy0tLS0tLS0tLS0tLS0tR0hTS0ZKRExHRFM3NTQzRkpLTEZIUkU3NTY0Mjc1Njc0MzI1NCcKKyAgICAgICAgc2VwX2JvdW5kYXJ5ID0gJ1xuLS0nICsgYm91bmRhcnkKKyAgICAgICAgZW5kX2JvdW5kYXJ5ID0gc2VwX2JvdW5kYXJ5ICsgJy0tJworICAgICAgICBib2R5ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBkYXRhLml0ZW1zKCk6CisgICAgICAgICAgICAjIGhhbmRsZSBtdWx0aXBsZSBlbnRyaWVzIGZvciB0aGUgc2FtZSBuYW1lCisgICAgICAgICAgICBpZiB0eXBlKHZhbHVlKSAhPSB0eXBlKFtdKToKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IFt2YWx1ZV0KKyAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICBpZiB0eXBlKHZhbHVlKSBpcyB0dXBsZToKKyAgICAgICAgICAgICAgICAgICAgZm4gPSAnO2ZpbGVuYW1lPSIlcyInICUgdmFsdWVbMF0KKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZVsxXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGZuID0gIiIKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cih2YWx1ZSkKKyAgICAgICAgICAgICAgICBib2R5LndyaXRlKHNlcF9ib3VuZGFyeSkKKyAgICAgICAgICAgICAgICBib2R5LndyaXRlKCdcbkNvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iJXMiJyVrZXkpCisgICAgICAgICAgICAgICAgYm9keS53cml0ZShmbikKKyAgICAgICAgICAgICAgICBib2R5LndyaXRlKCJcblxuIikKKyAgICAgICAgICAgICAgICBib2R5LndyaXRlKHZhbHVlKQorICAgICAgICAgICAgICAgIGlmIHZhbHVlIGFuZCB2YWx1ZVstMV0gPT0gJ1xyJzoKKyAgICAgICAgICAgICAgICAgICAgYm9keS53cml0ZSgnXG4nKSAgIyB3cml0ZSBhbiBleHRyYSBuZXdsaW5lIChsdXJ2ZSBNYWNzKQorICAgICAgICBib2R5LndyaXRlKGVuZF9ib3VuZGFyeSkKKyAgICAgICAgYm9keS53cml0ZSgiXG4iKQorICAgICAgICBib2R5ID0gYm9keS5nZXR2YWx1ZSgpCisKKyAgICAgICAgc2VsZi5hbm5vdW5jZSgiU3VibWl0dGluZyAlcyB0byAlcyIgJSAoZmlsZW5hbWUsIHNlbGYucmVwb3NpdG9yeSksIGxvZy5JTkZPKQorCisgICAgICAgICMgYnVpbGQgdGhlIFJlcXVlc3QKKyAgICAgICAgIyBXZSBjYW4ndCB1c2UgdXJsbGliMiBzaW5jZSB3ZSBuZWVkIHRvIHNlbmQgdGhlIEJhc2ljCisgICAgICAgICMgYXV0aCByaWdodCB3aXRoIHRoZSBmaXJzdCByZXF1ZXN0CisgICAgICAgIHNjaGVtYSwgbmV0bG9jLCB1cmwsIHBhcmFtcywgcXVlcnksIGZyYWdtZW50cyA9IFwKKyAgICAgICAgICAgIHVybHBhcnNlLnVybHBhcnNlKHNlbGYucmVwb3NpdG9yeSkKKyAgICAgICAgYXNzZXJ0IG5vdCBwYXJhbXMgYW5kIG5vdCBxdWVyeSBhbmQgbm90IGZyYWdtZW50cworICAgICAgICBpZiBzY2hlbWEgPT0gJ2h0dHAnOgorICAgICAgICAgICAgaHR0cCA9IGh0dHBsaWIuSFRUUENvbm5lY3Rpb24obmV0bG9jKQorICAgICAgICBlbGlmIHNjaGVtYSA9PSAnaHR0cHMnOgorICAgICAgICAgICAgaHR0cCA9IGh0dHBsaWIuSFRUUFNDb25uZWN0aW9uKG5ldGxvYykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yLCAidW5zdXBwb3J0ZWQgc2NoZW1hICIrc2NoZW1hCisKKyAgICAgICAgZGF0YSA9ICcnCisgICAgICAgIGxvZ2xldmVsID0gbG9nLklORk8KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaHR0cC5jb25uZWN0KCkKKyAgICAgICAgICAgIGh0dHAucHV0cmVxdWVzdCgiUE9TVCIsIHVybCkKKyAgICAgICAgICAgIGh0dHAucHV0aGVhZGVyKCdDb250ZW50LXR5cGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJ211bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSVzJyVib3VuZGFyeSkKKyAgICAgICAgICAgIGh0dHAucHV0aGVhZGVyKCdDb250ZW50LWxlbmd0aCcsIHN0cihsZW4oYm9keSkpKQorICAgICAgICAgICAgaHR0cC5wdXRoZWFkZXIoJ0F1dGhvcml6YXRpb24nLCBhdXRoKQorICAgICAgICAgICAgaHR0cC5lbmRoZWFkZXJzKCkKKyAgICAgICAgICAgIGh0dHAuc2VuZChib2R5KQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZShlLm1zZywgbG9nLkVSUk9SKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgciA9IGh0dHAuZ2V0cmVzcG9uc2UoKQorICAgICAgICBpZiByLnN0YXR1cyA9PSAyMDA6CisgICAgICAgICAgICBzZWxmLmFubm91bmNlKCdTZXJ2ZXIgcmVzcG9uc2UgKCVzKTogJXMnICUgKHIuc3RhdHVzLCByLnJlYXNvbiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5JTkZPKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hbm5vdW5jZSgnVXBsb2FkIGZhaWxlZCAoJXMpOiAlcycgJSAoci5zdGF0dXMsIHIucmVhc29uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nLkVSUk9SKQorICAgICAgICBpZiBzZWxmLnNob3dfcmVzcG9uc2U6CisgICAgICAgICAgICBwcmludCAnLScqNzUsIHIucmVhZCgpLCAnLScqNzUKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2RlcGVuZHMucHkgYi9MaWIvc2V0dXB0b29scy9kZXBlbmRzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZDgxOTQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9kZXBlbmRzLnB5CkBAIC0wLDAgKzEsMjM5IEBACitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGdlbmVyYXRvcnMKK2ltcG9ydCBzeXMsIGltcCwgbWFyc2hhbAorZnJvbSBpbXAgaW1wb3J0IFBLR19ESVJFQ1RPUlksIFBZX0NPTVBJTEVELCBQWV9TT1VSQ0UsIFBZX0ZST1pFTgorZnJvbSBkaXN0dXRpbHMudmVyc2lvbiBpbXBvcnQgU3RyaWN0VmVyc2lvbiwgTG9vc2VWZXJzaW9uCisKK19fYWxsX18gPSBbCisgICAgJ1JlcXVpcmUnLCAnZmluZF9tb2R1bGUnLCAnZ2V0X21vZHVsZV9jb25zdGFudCcsICdleHRyYWN0X2NvbnN0YW50JworXQorCitjbGFzcyBSZXF1aXJlOgorICAgICIiIkEgcHJlcmVxdWlzaXRlIHRvIGJ1aWxkaW5nIG9yIGluc3RhbGxpbmcgYSBkaXN0cmlidXRpb24iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLG5hbWUscmVxdWVzdGVkX3ZlcnNpb24sbW9kdWxlLGhvbWVwYWdlPScnLAorICAgICAgICBhdHRyaWJ1dGU9Tm9uZSxmb3JtYXQ9Tm9uZQorICAgICk6CisKKyAgICAgICAgaWYgZm9ybWF0IGlzIE5vbmUgYW5kIHJlcXVlc3RlZF92ZXJzaW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZm9ybWF0ID0gU3RyaWN0VmVyc2lvbgorCisgICAgICAgIGlmIGZvcm1hdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJlcXVlc3RlZF92ZXJzaW9uID0gZm9ybWF0KHJlcXVlc3RlZF92ZXJzaW9uKQorICAgICAgICAgICAgaWYgYXR0cmlidXRlIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYXR0cmlidXRlID0gJ19fdmVyc2lvbl9fJworCisgICAgICAgIHNlbGYuX19kaWN0X18udXBkYXRlKGxvY2FscygpKQorICAgICAgICBkZWwgc2VsZi5zZWxmCisKKworICAgIGRlZiBmdWxsX25hbWUoc2VsZik6CisgICAgICAgICIiIlJldHVybiBmdWxsIHBhY2thZ2UvZGlzdHJpYnV0aW9uIG5hbWUsIHcvdmVyc2lvbiIiIgorICAgICAgICBpZiBzZWxmLnJlcXVlc3RlZF92ZXJzaW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcmV0dXJuICclcy0lcycgJSAoc2VsZi5uYW1lLHNlbGYucmVxdWVzdGVkX3ZlcnNpb24pCisgICAgICAgIHJldHVybiBzZWxmLm5hbWUKKworCisgICAgZGVmIHZlcnNpb25fb2soc2VsZix2ZXJzaW9uKToKKyAgICAgICAgIiIiSXMgJ3ZlcnNpb24nIHN1ZmZpY2llbnRseSB1cC10by1kYXRlPyIiIgorICAgICAgICByZXR1cm4gc2VsZi5hdHRyaWJ1dGUgaXMgTm9uZSBvciBzZWxmLmZvcm1hdCBpcyBOb25lIG9yIFwKKyAgICAgICAgICAgIHN0cih2ZXJzaW9uKTw+InVua25vd24iIGFuZCB2ZXJzaW9uID49IHNlbGYucmVxdWVzdGVkX3ZlcnNpb24KKworCisgICAgZGVmIGdldF92ZXJzaW9uKHNlbGYsIHBhdGhzPU5vbmUsIGRlZmF1bHQ9InVua25vd24iKToKKworICAgICAgICAiIiJHZXQgdmVyc2lvbiBudW1iZXIgb2YgaW5zdGFsbGVkIG1vZHVsZSwgJ05vbmUnLCBvciAnZGVmYXVsdCcKKworICAgICAgICBTZWFyY2ggJ3BhdGhzJyBmb3IgbW9kdWxlLiAgSWYgbm90IGZvdW5kLCByZXR1cm4gJ05vbmUnLiAgSWYgZm91bmQsCisgICAgICAgIHJldHVybiB0aGUgZXh0cmFjdGVkIHZlcnNpb24gYXR0cmlidXRlLCBvciAnZGVmYXVsdCcgaWYgbm8gdmVyc2lvbgorICAgICAgICBhdHRyaWJ1dGUgd2FzIHNwZWNpZmllZCwgb3IgdGhlIHZhbHVlIGNhbm5vdCBiZSBkZXRlcm1pbmVkIHdpdGhvdXQKKyAgICAgICAgaW1wb3J0aW5nIHRoZSBtb2R1bGUuICBUaGUgdmVyc2lvbiBpcyBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIHRoZQorICAgICAgICByZXF1aXJlbWVudCdzIHZlcnNpb24gZm9ybWF0IChpZiBhbnkpLCB1bmxlc3MgaXQgaXMgJ05vbmUnIG9yIHRoZQorICAgICAgICBzdXBwbGllZCAnZGVmYXVsdCcuCisgICAgICAgICIiIgorCisgICAgICAgIGlmIHNlbGYuYXR0cmlidXRlIGlzIE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZixwLGkgPSBmaW5kX21vZHVsZShzZWxmLm1vZHVsZSxwYXRocykKKyAgICAgICAgICAgICAgICBpZiBmOiBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdAorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgdiA9IGdldF9tb2R1bGVfY29uc3RhbnQoc2VsZi5tb2R1bGUsc2VsZi5hdHRyaWJ1dGUsZGVmYXVsdCxwYXRocykKKworICAgICAgICBpZiB2IGlzIG5vdCBOb25lIGFuZCB2IGlzIG5vdCBkZWZhdWx0IGFuZCBzZWxmLmZvcm1hdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmZvcm1hdCh2KQorCisgICAgICAgIHJldHVybiB2CisKKworICAgIGRlZiBpc19wcmVzZW50KHNlbGYscGF0aHM9Tm9uZSk6CisgICAgICAgICIiIlJldHVybiB0cnVlIGlmIGRlcGVuZGVuY3kgaXMgcHJlc2VudCBvbiAncGF0aHMnIiIiCisgICAgICAgIHJldHVybiBzZWxmLmdldF92ZXJzaW9uKHBhdGhzKSBpcyBub3QgTm9uZQorCisKKyAgICBkZWYgaXNfY3VycmVudChzZWxmLHBhdGhzPU5vbmUpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiBkZXBlbmRlbmN5IGlzIHByZXNlbnQgYW5kIHVwLXRvLWRhdGUgb24gJ3BhdGhzJyIiIgorICAgICAgICB2ZXJzaW9uID0gc2VsZi5nZXRfdmVyc2lvbihwYXRocykKKyAgICAgICAgaWYgdmVyc2lvbiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgIHJldHVybiBzZWxmLnZlcnNpb25fb2sodmVyc2lvbikKKworCitkZWYgX2l0ZXJfY29kZShjb2RlKToKKworICAgICIiIllpZWxkICcob3AsYXJnKScgcGFpciBmb3IgZWFjaCBvcGVyYXRpb24gaW4gY29kZSBvYmplY3QgJ2NvZGUnIiIiCisKKyAgICBmcm9tIGFycmF5IGltcG9ydCBhcnJheQorICAgIGZyb20gZGlzIGltcG9ydCBIQVZFX0FSR1VNRU5ULCBFWFRFTkRFRF9BUkcKKworICAgIGJ5dGVzID0gYXJyYXkoJ2InLGNvZGUuY29fY29kZSkKKyAgICBlb2YgPSBsZW4oY29kZS5jb19jb2RlKQorCisgICAgcHRyID0gMAorICAgIGV4dGVuZGVkX2FyZyA9IDAKKworICAgIHdoaWxlIHB0cjxlb2Y6CisKKyAgICAgICAgb3AgPSBieXRlc1twdHJdCisKKyAgICAgICAgaWYgb3A+PUhBVkVfQVJHVU1FTlQ6CisKKyAgICAgICAgICAgIGFyZyA9IGJ5dGVzW3B0cisxXSArIGJ5dGVzW3B0cisyXSoyNTYgKyBleHRlbmRlZF9hcmcKKyAgICAgICAgICAgIHB0ciArPSAzCisKKyAgICAgICAgICAgIGlmIG9wPT1FWFRFTkRFRF9BUkc6CisgICAgICAgICAgICAgICAgZXh0ZW5kZWRfYXJnID0gYXJnICogNjU1MzZMCisgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICBlbHNlOgorICAgICAgICAgICAgYXJnID0gTm9uZQorICAgICAgICAgICAgcHRyICs9IDEKKworICAgICAgICB5aWVsZCBvcCxhcmcKKworCisKKworCisKKworCisKKworZGVmIGZpbmRfbW9kdWxlKG1vZHVsZSwgcGF0aHM9Tm9uZSk6CisgICAgIiIiSnVzdCBsaWtlICdpbXAuZmluZF9tb2R1bGUoKScsIGJ1dCB3aXRoIHBhY2thZ2Ugc3VwcG9ydCIiIgorCisgICAgcGFydHMgPSBtb2R1bGUuc3BsaXQoJy4nKQorCisgICAgd2hpbGUgcGFydHM6CisgICAgICAgIHBhcnQgPSBwYXJ0cy5wb3AoMCkKKyAgICAgICAgZiwgcGF0aCwgKHN1ZmZpeCxtb2RlLGtpbmQpID0gaW5mbyA9IGltcC5maW5kX21vZHVsZShwYXJ0LCBwYXRocykKKworICAgICAgICBpZiBraW5kPT1QS0dfRElSRUNUT1JZOgorICAgICAgICAgICAgcGFydHMgPSBwYXJ0cyBvciBbJ19faW5pdF9fJ10KKyAgICAgICAgICAgIHBhdGhzID0gW3BhdGhdCisKKyAgICAgICAgZWxpZiBwYXJ0czoKKyAgICAgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJDYW4ndCBmaW5kICVyIGluICVzIiAlIChwYXJ0cyxtb2R1bGUpKQorCisgICAgcmV0dXJuIGluZm8KKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKK2RlZiBnZXRfbW9kdWxlX2NvbnN0YW50KG1vZHVsZSwgc3ltYm9sLCBkZWZhdWx0PS0xLCBwYXRocz1Ob25lKToKKworICAgICIiIkZpbmQgJ21vZHVsZScgYnkgc2VhcmNoaW5nICdwYXRocycsIGFuZCBleHRyYWN0ICdzeW1ib2wnCisKKyAgICBSZXR1cm4gJ05vbmUnIGlmICdtb2R1bGUnIGRvZXMgbm90IGV4aXN0IG9uICdwYXRocycsIG9yIGl0IGRvZXMgbm90IGRlZmluZQorICAgICdzeW1ib2wnLiAgSWYgdGhlIG1vZHVsZSBkZWZpbmVzICdzeW1ib2wnIGFzIGEgY29uc3RhbnQsIHJldHVybiB0aGUKKyAgICBjb25zdGFudC4gIE90aGVyd2lzZSwgcmV0dXJuICdkZWZhdWx0Jy4iIiIKKworICAgIHRyeToKKyAgICAgICAgZiwgcGF0aCwgKHN1ZmZpeCxtb2RlLGtpbmQpID0gZmluZF9tb2R1bGUobW9kdWxlLHBhdGhzKQorICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgIyBNb2R1bGUgZG9lc24ndCBleGlzdAorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgdHJ5OgorICAgICAgICBpZiBraW5kPT1QWV9DT01QSUxFRDoKKyAgICAgICAgICAgIGYucmVhZCg4KSAgICMgc2tpcCBtYWdpYyAmIGRhdGUKKyAgICAgICAgICAgIGNvZGUgPSBtYXJzaGFsLmxvYWQoZikKKyAgICAgICAgZWxpZiBraW5kPT1QWV9GUk9aRU46CisgICAgICAgICAgICBjb2RlID0gaW1wLmdldF9mcm96ZW5fb2JqZWN0KG1vZHVsZSkKKyAgICAgICAgZWxpZiBraW5kPT1QWV9TT1VSQ0U6CisgICAgICAgICAgICBjb2RlID0gY29tcGlsZShmLnJlYWQoKSwgcGF0aCwgJ2V4ZWMnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyBOb3Qgc29tZXRoaW5nIHdlIGNhbiBwYXJzZTsgd2UnbGwgaGF2ZSB0byBpbXBvcnQgaXQuICA6KAorICAgICAgICAgICAgaWYgbW9kdWxlIG5vdCBpbiBzeXMubW9kdWxlczoKKyAgICAgICAgICAgICAgICBpbXAubG9hZF9tb2R1bGUobW9kdWxlLGYscGF0aCwoc3VmZml4LG1vZGUsa2luZCkpCisgICAgICAgICAgICByZXR1cm4gZ2V0YXR0cihzeXMubW9kdWxlc1ttb2R1bGVdLHN5bWJvbCxOb25lKQorCisgICAgZmluYWxseToKKyAgICAgICAgaWYgZjoKKyAgICAgICAgICAgIGYuY2xvc2UoKQorCisgICAgcmV0dXJuIGV4dHJhY3RfY29uc3RhbnQoY29kZSxzeW1ib2wsZGVmYXVsdCkKKworCisKKworCisKKworCitkZWYgZXh0cmFjdF9jb25zdGFudChjb2RlLHN5bWJvbCxkZWZhdWx0PS0xKToKKworICAgICIiIkV4dHJhY3QgdGhlIGNvbnN0YW50IHZhbHVlIG9mICdzeW1ib2wnIGZyb20gJ2NvZGUnCisKKyAgICBJZiB0aGUgbmFtZSAnc3ltYm9sJyBpcyBib3VuZCB0byBhIGNvbnN0YW50IHZhbHVlIGJ5IHRoZSBQeXRob24gY29kZQorICAgIG9iamVjdCAnY29kZScsIHJldHVybiB0aGF0IHZhbHVlLiAgSWYgJ3N5bWJvbCcgaXMgYm91bmQgdG8gYW4gZXhwcmVzc2lvbiwKKyAgICByZXR1cm4gJ2RlZmF1bHQnLiAgT3RoZXJ3aXNlLCByZXR1cm4gJ05vbmUnLgorCisgICAgUmV0dXJuIHZhbHVlIGlzIGJhc2VkIG9uIHRoZSBmaXJzdCBhc3NpZ25tZW50IHRvICdzeW1ib2wnLiAgJ3N5bWJvbCcgbXVzdAorICAgIGJlIGEgZ2xvYmFsLCBvciBhdCBsZWFzdCBhIG5vbi0iZmFzdCIgbG9jYWwgaW4gdGhlIGNvZGUgYmxvY2suICBUaGF0IGlzLAorICAgIG9ubHkgJ1NUT1JFX05BTUUnIGFuZCAnU1RPUkVfR0xPQkFMJyBvcGNvZGVzIGFyZSBjaGVja2VkLCBhbmQgJ3N5bWJvbCcKKyAgICBtdXN0IGJlIHByZXNlbnQgaW4gJ2NvZGUuY29fbmFtZXMnLgorICAgICIiIgorCisgICAgaWYgc3ltYm9sIG5vdCBpbiBjb2RlLmNvX25hbWVzOgorICAgICAgICAjIG5hbWUncyBub3QgdGhlcmUsIGNhbid0IHBvc3NpYmx5IGJlIGFuIGFzc2lnbWVudAorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgbmFtZV9pZHggPSBsaXN0KGNvZGUuY29fbmFtZXMpLmluZGV4KHN5bWJvbCkKKworICAgIFNUT1JFX05BTUUgPSA5MAorICAgIFNUT1JFX0dMT0JBTCA9IDk3CisgICAgTE9BRF9DT05TVCA9IDEwMAorCisgICAgY29uc3QgPSBkZWZhdWx0CisKKyAgICBmb3Igb3AsIGFyZyBpbiBfaXRlcl9jb2RlKGNvZGUpOgorCisgICAgICAgIGlmIG9wPT1MT0FEX0NPTlNUOgorICAgICAgICAgICAgY29uc3QgPSBjb2RlLmNvX2NvbnN0c1thcmddCisgICAgICAgIGVsaWYgYXJnPT1uYW1lX2lkeCBhbmQgKG9wPT1TVE9SRV9OQU1FIG9yIG9wPT1TVE9SRV9HTE9CQUwpOgorICAgICAgICAgICAgcmV0dXJuIGNvbnN0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjb25zdCA9IGRlZmF1bHQKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL2Rpc3QucHkgYi9MaWIvc2V0dXB0b29scy9kaXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNDE3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9kaXN0LnB5CkBAIC0wLDAgKzEsNzk4IEBACitfX2FsbF9fID0gWydEaXN0cmlidXRpb24nXQorCitmcm9tIGRpc3R1dGlscy5jb3JlIGltcG9ydCBEaXN0cmlidXRpb24gYXMgX0Rpc3RyaWJ1dGlvbgorZnJvbSBzZXR1cHRvb2xzLmRlcGVuZHMgaW1wb3J0IFJlcXVpcmUKK2Zyb20gc2V0dXB0b29scy5jb21tYW5kLmluc3RhbGwgaW1wb3J0IGluc3RhbGwKK2Zyb20gc2V0dXB0b29scy5jb21tYW5kLnNkaXN0IGltcG9ydCBzZGlzdAorZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuaW5zdGFsbF9saWIgaW1wb3J0IGluc3RhbGxfbGliCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc09wdGlvbkVycm9yLCBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc1NldHVwRXJyb3IKK2ltcG9ydCBzZXR1cHRvb2xzLCBwa2dfcmVzb3VyY2VzLCBkaXN0dXRpbHMuY29yZSwgZGlzdHV0aWxzLmRpc3QsIGRpc3R1dGlscy5jbWQKK2ltcG9ydCBvcworCitkZWYgX2dldF91bnBhdGNoZWQoY2xzKToKKyAgICAiIiJQcm90ZWN0IGFnYWluc3QgcmUtcGF0Y2hpbmcgdGhlIGRpc3R1dGlscyBpZiByZWxvYWRlZAorCisgICAgQWxzbyBlbnN1cmVzIHRoYXQgbm8gb3RoZXIgZGlzdHV0aWxzIGV4dGVuc2lvbiBtb25rZXlwYXRjaGVkIHRoZSBkaXN0dXRpbHMKKyAgICBmaXJzdC4KKyAgICAiIiIKKyAgICB3aGlsZSBjbHMuX19tb2R1bGVfXy5zdGFydHN3aXRoKCdzZXR1cHRvb2xzJyk6CisgICAgICAgIGNscywgPSBjbHMuX19iYXNlc19fCisgICAgaWYgbm90IGNscy5fX21vZHVsZV9fLnN0YXJ0c3dpdGgoJ2Rpc3R1dGlscycpOgorICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKKyAgICAgICAgICAgICJkaXN0dXRpbHMgaGFzIGFscmVhZHkgYmVlbiBwYXRjaGVkIGJ5ICVyIiAlIGNscworICAgICAgICApCisgICAgcmV0dXJuIGNscworCitfRGlzdHJpYnV0aW9uID0gX2dldF91bnBhdGNoZWQoX0Rpc3RyaWJ1dGlvbikKKworc2VxdWVuY2UgPSB0dXBsZSwgbGlzdAorCitkZWYgY2hlY2tfaW1wb3J0YWJsZShkaXN0LCBhdHRyLCB2YWx1ZSk6CisgICAgdHJ5OgorICAgICAgICBlcCA9IHBrZ19yZXNvdXJjZXMuRW50cnlQb2ludC5wYXJzZSgneD0nK3ZhbHVlKQorICAgICAgICBhc3NlcnQgbm90IGVwLmV4dHJhcworICAgIGV4Y2VwdCAoVHlwZUVycm9yLFZhbHVlRXJyb3IsQXR0cmlidXRlRXJyb3IsQXNzZXJ0aW9uRXJyb3IpOgorICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAorICAgICAgICAgICAgIiVyIG11c3QgYmUgaW1wb3J0YWJsZSAnbW9kdWxlOmF0dHJzJyBzdHJpbmcgKGdvdCAlcikiCisgICAgICAgICAgICAlIChhdHRyLHZhbHVlKQorICAgICAgICApCisKKworZGVmIGFzc2VydF9zdHJpbmdfbGlzdChkaXN0LCBhdHRyLCB2YWx1ZSk6CisgICAgIiIiVmVyaWZ5IHRoYXQgdmFsdWUgaXMgYSBzdHJpbmcgbGlzdCBvciBOb25lIiIiCisgICAgdHJ5OgorICAgICAgICBhc3NlcnQgJycuam9pbih2YWx1ZSkhPXZhbHVlCisgICAgZXhjZXB0IChUeXBlRXJyb3IsVmFsdWVFcnJvcixBdHRyaWJ1dGVFcnJvcixBc3NlcnRpb25FcnJvcik6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAiJXIgbXVzdCBiZSBhIGxpc3Qgb2Ygc3RyaW5ncyAoZ290ICVyKSIgJSAoYXR0cix2YWx1ZSkKKyAgICAgICAgKQorCitkZWYgY2hlY2tfbnNwKGRpc3QsIGF0dHIsIHZhbHVlKToKKyAgICAiIiJWZXJpZnkgdGhhdCBuYW1lc3BhY2UgcGFja2FnZXMgYXJlIHZhbGlkIiIiCisgICAgYXNzZXJ0X3N0cmluZ19saXN0KGRpc3QsYXR0cix2YWx1ZSkKKworICAgIGZvciBuc3AgaW4gdmFsdWU6CisgICAgICAgIGlmIG5vdCBkaXN0Lmhhc19jb250ZW50c19mb3IobnNwKToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAgICAgIkRpc3RyaWJ1dGlvbiBjb250YWlucyBubyBtb2R1bGVzIG9yIHBhY2thZ2VzIGZvciAiICsKKyAgICAgICAgICAgICAgICAibmFtZXNwYWNlIHBhY2thZ2UgJXIiICUgbnNwCisgICAgICAgICAgICApCisKK2RlZiBjaGVja19leHRyYXMoZGlzdCwgYXR0ciwgdmFsdWUpOgorICAgICIiIlZlcmlmeSB0aGF0IGV4dHJhc19yZXF1aXJlIG1hcHBpbmcgaXMgdmFsaWQiIiIKKyAgICB0cnk6CisgICAgICAgIGZvciBrLHYgaW4gdmFsdWUuaXRlbXMoKToKKyAgICAgICAgICAgIGxpc3QocGtnX3Jlc291cmNlcy5wYXJzZV9yZXF1aXJlbWVudHModikpCisgICAgZXhjZXB0IChUeXBlRXJyb3IsVmFsdWVFcnJvcixBdHRyaWJ1dGVFcnJvcik6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAiJ2V4dHJhc19yZXF1aXJlJyBtdXN0IGJlIGEgZGljdGlvbmFyeSB3aG9zZSB2YWx1ZXMgYXJlICIKKyAgICAgICAgICAgICJzdHJpbmdzIG9yIGxpc3RzIG9mIHN0cmluZ3MgY29udGFpbmluZyB2YWxpZCBwcm9qZWN0L3ZlcnNpb24gIgorICAgICAgICAgICAgInJlcXVpcmVtZW50IHNwZWNpZmllcnMuIgorICAgICAgICApCisKK2RlZiBhc3NlcnRfYm9vbChkaXN0LCBhdHRyLCB2YWx1ZSk6CisgICAgIiIiVmVyaWZ5IHRoYXQgdmFsdWUgaXMgVHJ1ZSwgRmFsc2UsIDAsIG9yIDEiIiIKKyAgICBpZiBib29sKHZhbHVlKSAhPSB2YWx1ZToKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyAgICAgICAgICAgICIlciBtdXN0IGJlIGEgYm9vbGVhbiB2YWx1ZSAoZ290ICVyKSIgJSAoYXR0cix2YWx1ZSkKKyAgICAgICAgKQorCisKKworZGVmIGNoZWNrX3JlcXVpcmVtZW50cyhkaXN0LCBhdHRyLCB2YWx1ZSk6CisgICAgIiIiVmVyaWZ5IHRoYXQgaW5zdGFsbF9yZXF1aXJlcyBpcyBhIHZhbGlkIHJlcXVpcmVtZW50cyBsaXN0IiIiCisgICAgdHJ5OgorICAgICAgICBsaXN0KHBrZ19yZXNvdXJjZXMucGFyc2VfcmVxdWlyZW1lbnRzKHZhbHVlKSkKKyAgICBleGNlcHQgKFR5cGVFcnJvcixWYWx1ZUVycm9yKToKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyAgICAgICAgICAgICIlciBtdXN0IGJlIGEgc3RyaW5nIG9yIGxpc3Qgb2Ygc3RyaW5ncyAiCisgICAgICAgICAgICAiY29udGFpbmluZyB2YWxpZCBwcm9qZWN0L3ZlcnNpb24gcmVxdWlyZW1lbnQgc3BlY2lmaWVycyIgJSAoYXR0ciwpCisgICAgICAgICkKKworZGVmIGNoZWNrX2VudHJ5X3BvaW50cyhkaXN0LCBhdHRyLCB2YWx1ZSk6CisgICAgIiIiVmVyaWZ5IHRoYXQgZW50cnlfcG9pbnRzIG1hcCBpcyBwYXJzZWFibGUiIiIKKyAgICB0cnk6CisgICAgICAgIHBrZ19yZXNvdXJjZXMuRW50cnlQb2ludC5wYXJzZV9tYXAodmFsdWUpCisgICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoZSkKKworCitkZWYgY2hlY2tfdGVzdF9zdWl0ZShkaXN0LCBhdHRyLCB2YWx1ZSk6CisgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsYmFzZXN0cmluZyk6CisgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoInRlc3Rfc3VpdGUgbXVzdCBiZSBhIHN0cmluZyIpCisKKworZGVmIGNoZWNrX3BhY2thZ2VfZGF0YShkaXN0LCBhdHRyLCB2YWx1ZSk6CisgICAgIiIiVmVyaWZ5IHRoYXQgdmFsdWUgaXMgYSBkaWN0aW9uYXJ5IG9mIHBhY2thZ2UgbmFtZXMgdG8gZ2xvYiBsaXN0cyIiIgorICAgIGlmIGlzaW5zdGFuY2UodmFsdWUsZGljdCk6CisgICAgICAgIGZvciBrLHYgaW4gdmFsdWUuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGssc3RyKTogYnJlYWsKKyAgICAgICAgICAgIHRyeTogaXRlcih2KQorICAgICAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyAgICAgICAgYXR0cisiIG11c3QgYmUgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgcGFja2FnZSBuYW1lcyB0byBsaXN0cyBvZiAiCisgICAgICAgICJ3aWxkY2FyZCBwYXR0ZXJucyIKKyAgICApCisKKworCisKK2NsYXNzIERpc3RyaWJ1dGlvbihfRGlzdHJpYnV0aW9uKToKKyAgICAiIiJEaXN0cmlidXRpb24gd2l0aCBzdXBwb3J0IGZvciBmZWF0dXJlcywgdGVzdHMsIGFuZCBwYWNrYWdlIGRhdGEKKworICAgIFRoaXMgaXMgYW4gZW5oYW5jZWQgdmVyc2lvbiBvZiAnZGlzdHV0aWxzLmRpc3QuRGlzdHJpYnV0aW9uJyB0aGF0CisgICAgZWZmZWN0aXZlbHkgYWRkcyB0aGUgZm9sbG93aW5nIG5ldyBvcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyB0byAnc2V0dXAoKSc6CisKKyAgICAgJ2luc3RhbGxfcmVxdWlyZXMnIC0tIGEgc3RyaW5nIG9yIHNlcXVlbmNlIG9mIHN0cmluZ3Mgc3BlY2lmeWluZyBwcm9qZWN0CisgICAgICAgIHZlcnNpb25zIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiByZXF1aXJlcyB3aGVuIGluc3RhbGxlZCwgaW4gdGhlIGZvcm1hdAorICAgICAgICB1c2VkIGJ5ICdwa2dfcmVzb3VyY2VzLnJlcXVpcmUoKScuICBUaGV5IHdpbGwgYmUgaW5zdGFsbGVkCisgICAgICAgIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGFja2FnZSBpcyBpbnN0YWxsZWQuICBJZiB5b3Ugd2lzaCB0byB1c2UKKyAgICAgICAgcGFja2FnZXMgdGhhdCBhcmUgbm90IGF2YWlsYWJsZSBpbiBQeVBJLCBvciB3YW50IHRvIGdpdmUgeW91ciB1c2VycyBhbgorICAgICAgICBhbHRlcm5hdGUgZG93bmxvYWQgbG9jYXRpb24sIHlvdSBjYW4gYWRkIGEgJ2ZpbmRfbGlua3MnIG9wdGlvbiB0byB0aGUKKyAgICAgICAgJ1tlYXN5X2luc3RhbGxdJyBzZWN0aW9uIG9mIHlvdXIgcHJvamVjdCdzICdzZXR1cC5jZmcnIGZpbGUsIGFuZCB0aGVuCisgICAgICAgIHNldHVwdG9vbHMgd2lsbCBzY2FuIHRoZSBsaXN0ZWQgd2ViIHBhZ2VzIGZvciBsaW5rcyB0aGF0IHNhdGlzZnkgdGhlCisgICAgICAgIHJlcXVpcmVtZW50cy4KKworICAgICAnZXh0cmFzX3JlcXVpcmUnIC0tIGEgZGljdGlvbmFyeSBtYXBwaW5nIG5hbWVzIG9mIG9wdGlvbmFsICJleHRyYXMiIHRvIHRoZQorICAgICAgICBhZGRpdGlvbmFsIHJlcXVpcmVtZW50KHMpIHRoYXQgdXNpbmcgdGhvc2UgZXh0cmFzIGluY3Vycy4gRm9yIGV4YW1wbGUsCisgICAgICAgIHRoaXM6OgorCisgICAgICAgICAgICBleHRyYXNfcmVxdWlyZSA9IGRpY3QocmVTVCA9IFsiZG9jdXRpbHM+PTAuMyIsICJyZVNUZWRpdCJdKQorCisgICAgICAgIGluZGljYXRlcyB0aGF0IHRoZSBkaXN0cmlidXRpb24gY2FuIG9wdGlvbmFsbHkgcHJvdmlkZSBhbiBleHRyYQorICAgICAgICBjYXBhYmlsaXR5IGNhbGxlZCAicmVTVCIsIGJ1dCBpdCBjYW4gb25seSBiZSB1c2VkIGlmIGRvY3V0aWxzIGFuZAorICAgICAgICByZVNUZWRpdCBhcmUgaW5zdGFsbGVkLiAgSWYgdGhlIHVzZXIgaW5zdGFsbHMgeW91ciBwYWNrYWdlIHVzaW5nCisgICAgICAgIEVhc3lJbnN0YWxsIGFuZCByZXF1ZXN0cyBvbmUgb2YgeW91ciBleHRyYXMsIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICAgIGFkZGl0aW9uYWwgcmVxdWlyZW1lbnRzIHdpbGwgYmUgaW5zdGFsbGVkIGlmIG5lZWRlZC4KKworICAgICAnZmVhdHVyZXMnIC0tIGEgZGljdGlvbmFyeSBtYXBwaW5nIG9wdGlvbiBuYW1lcyB0byAnc2V0dXB0b29scy5GZWF0dXJlJworICAgICAgICBvYmplY3RzLiAgRmVhdHVyZXMgYXJlIGEgcG9ydGlvbiBvZiB0aGUgZGlzdHJpYnV0aW9uIHRoYXQgY2FuIGJlCisgICAgICAgIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkIGJhc2VkIG9uIHVzZXIgb3B0aW9ucywgaW50ZXItZmVhdHVyZSBkZXBlbmRlbmNpZXMsCisgICAgICAgIGFuZCBhdmFpbGFiaWxpdHkgb24gdGhlIGN1cnJlbnQgc3lzdGVtLiAgRXhjbHVkZWQgZmVhdHVyZXMgYXJlIG9taXR0ZWQKKyAgICAgICAgZnJvbSBhbGwgc2V0dXAgY29tbWFuZHMsIGluY2x1ZGluZyBzb3VyY2UgYW5kIGJpbmFyeSBkaXN0cmlidXRpb25zLCBzbworICAgICAgICB5b3UgY2FuIGNyZWF0ZSBtdWx0aXBsZSBkaXN0cmlidXRpb25zIGZyb20gdGhlIHNhbWUgc291cmNlIHRyZWUuCisgICAgICAgIEZlYXR1cmUgbmFtZXMgc2hvdWxkIGJlIHZhbGlkIFB5dGhvbiBpZGVudGlmaWVycywgZXhjZXB0IHRoYXQgdGhleSBtYXkKKyAgICAgICAgY29udGFpbiB0aGUgJy0nIChtaW51cykgc2lnbi4gIEZlYXR1cmVzIGNhbiBiZSBpbmNsdWRlZCBvciBleGNsdWRlZAorICAgICAgICB2aWEgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zICctLXdpdGgtWCcgYW5kICctLXdpdGhvdXQtWCcsIHdoZXJlICdYJyBpcworICAgICAgICB0aGUgbmFtZSBvZiB0aGUgZmVhdHVyZS4gIFdoZXRoZXIgYSBmZWF0dXJlIGlzIGluY2x1ZGVkIGJ5IGRlZmF1bHQsIGFuZAorICAgICAgICB3aGV0aGVyIHlvdSBhcmUgYWxsb3dlZCB0byBjb250cm9sIHRoaXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBpcworICAgICAgICBkZXRlcm1pbmVkIGJ5IHRoZSBGZWF0dXJlIG9iamVjdC4gIFNlZSB0aGUgJ0ZlYXR1cmUnIGNsYXNzIGZvciBtb3JlCisgICAgICAgIGluZm9ybWF0aW9uLgorCisgICAgICd0ZXN0X3N1aXRlJyAtLSB0aGUgbmFtZSBvZiBhIHRlc3Qgc3VpdGUgdG8gcnVuIGZvciB0aGUgJ3Rlc3QnIGNvbW1hbmQuCisgICAgICAgIElmIHRoZSB1c2VyIHJ1bnMgJ3B5dGhvbiBzZXR1cC5weSB0ZXN0JywgdGhlIHBhY2thZ2Ugd2lsbCBiZSBpbnN0YWxsZWQsCisgICAgICAgIGFuZCB0aGUgbmFtZWQgdGVzdCBzdWl0ZSB3aWxsIGJlIHJ1bi4gIFRoZSBmb3JtYXQgaXMgdGhlIHNhbWUgYXMKKyAgICAgICAgd291bGQgYmUgdXNlZCBvbiBhICd1bml0dGVzdC5weScgY29tbWFuZCBsaW5lLiAgVGhhdCBpcywgaXQgaXMgdGhlCisgICAgICAgIGRvdHRlZCBuYW1lIG9mIGFuIG9iamVjdCB0byBpbXBvcnQgYW5kIGNhbGwgdG8gZ2VuZXJhdGUgYSB0ZXN0IHN1aXRlLgorCisgICAgICdwYWNrYWdlX2RhdGEnIC0tIGEgZGljdGlvbmFyeSBtYXBwaW5nIHBhY2thZ2UgbmFtZXMgdG8gbGlzdHMgb2YgZmlsZW5hbWVzCisgICAgICAgIG9yIGdsb2JzIHRvIHVzZSB0byBmaW5kIGRhdGEgZmlsZXMgY29udGFpbmVkIGluIHRoZSBuYW1lZCBwYWNrYWdlcy4KKyAgICAgICAgSWYgdGhlIGRpY3Rpb25hcnkgaGFzIGZpbGVuYW1lcyBvciBnbG9icyBsaXN0ZWQgdW5kZXIgJyIiJyAodGhlIGVtcHR5CisgICAgICAgIHN0cmluZyksIHRob3NlIG5hbWVzIHdpbGwgYmUgc2VhcmNoZWQgZm9yIGluIGV2ZXJ5IHBhY2thZ2UsIGluIGFkZGl0aW9uCisgICAgICAgIHRvIGFueSBuYW1lcyBmb3IgdGhlIHNwZWNpZmljIHBhY2thZ2UuICBEYXRhIGZpbGVzIGZvdW5kIHVzaW5nIHRoZXNlCisgICAgICAgIG5hbWVzL2dsb2JzIHdpbGwgYmUgaW5zdGFsbGVkIGFsb25nIHdpdGggdGhlIHBhY2thZ2UsIGluIHRoZSBzYW1lCisgICAgICAgIGxvY2F0aW9uIGFzIHRoZSBwYWNrYWdlLiAgTm90ZSB0aGF0IGdsb2JzIGFyZSBhbGxvd2VkIHRvIHJlZmVyZW5jZQorICAgICAgICB0aGUgY29udGVudHMgb2Ygbm9uLXBhY2thZ2Ugc3ViZGlyZWN0b3JpZXMsIGFzIGxvbmcgYXMgeW91IHVzZSAnLycgYXMKKyAgICAgICAgYSBwYXRoIHNlcGFyYXRvci4gIChHbG9icyBhcmUgYXV0b21hdGljYWxseSBjb252ZXJ0ZWQgdG8KKyAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgcGF0aHMgYXQgcnVudGltZS4pCisKKyAgICBJbiBhZGRpdGlvbiB0byB0aGVzZSBuZXcga2V5d29yZHMsIHRoaXMgY2xhc3MgYWxzbyBoYXMgc2V2ZXJhbCBuZXcgbWV0aG9kcworICAgIGZvciBtYW5pcHVsYXRpbmcgdGhlIGRpc3RyaWJ1dGlvbidzIGNvbnRlbnRzLiAgRm9yIGV4YW1wbGUsIHRoZSAnaW5jbHVkZSgpJworICAgIGFuZCAnZXhjbHVkZSgpJyBtZXRob2RzIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGluLXBsYWNlIGFkZCBhbmQgc3VidHJhY3QKKyAgICBjb21tYW5kcyB0aGF0IGFkZCBvciByZW1vdmUgcGFja2FnZXMsIG1vZHVsZXMsIGV4dGVuc2lvbnMsIGFuZCBzbyBvbiBmcm9tCisgICAgdGhlIGRpc3RyaWJ1dGlvbi4gIFRoZXkgYXJlIHVzZWQgYnkgdGhlIGZlYXR1cmUgc3Vic3lzdGVtIHRvIGNvbmZpZ3VyZSB0aGUKKyAgICBkaXN0cmlidXRpb24gZm9yIHRoZSBpbmNsdWRlZCBhbmQgZXhjbHVkZWQgZmVhdHVyZXMuCisgICAgIiIiCisKKyAgICBfcGF0Y2hlZF9kaXN0ID0gTm9uZQorCisgICAgZGVmIHBhdGNoX21pc3NpbmdfcGtnX2luZm8oc2VsZiwgYXR0cnMpOgorICAgICAgICAjIEZha2UgdXAgYSByZXBsYWNlbWVudCBmb3IgdGhlIGRhdGEgdGhhdCB3b3VsZCBub3JtYWxseSBjb21lIGZyb20KKyAgICAgICAgIyBQS0ctSU5GTywgYnV0IHdoaWNoIG1pZ2h0IG5vdCB5ZXQgYmUgYnVpbHQgaWYgdGhpcyBpcyBhIGZyZXNoCisgICAgICAgICMgY2hlY2tvdXQuCisgICAgICAgICMKKyAgICAgICAgaWYgbm90IGF0dHJzIG9yICduYW1lJyBub3QgaW4gYXR0cnMgb3IgJ3ZlcnNpb24nIG5vdCBpbiBhdHRyczoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBrZXkgPSBwa2dfcmVzb3VyY2VzLnNhZmVfbmFtZShzdHIoYXR0cnNbJ25hbWUnXSkpLmxvd2VyKCkKKyAgICAgICAgZGlzdCA9IHBrZ19yZXNvdXJjZXMud29ya2luZ19zZXQuYnlfa2V5LmdldChrZXkpCisgICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmUgYW5kIG5vdCBkaXN0Lmhhc19tZXRhZGF0YSgnUEtHLUlORk8nKToKKyAgICAgICAgICAgIGRpc3QuX3ZlcnNpb24gPSBwa2dfcmVzb3VyY2VzLnNhZmVfdmVyc2lvbihzdHIoYXR0cnNbJ3ZlcnNpb24nXSkpCisgICAgICAgICAgICBzZWxmLl9wYXRjaGVkX2Rpc3QgPSBkaXN0CisKKyAgICBkZWYgX19pbml0X18gKHNlbGYsIGF0dHJzPU5vbmUpOgorICAgICAgICBoYXZlX3BhY2thZ2VfZGF0YSA9IGhhc2F0dHIoc2VsZiwgInBhY2thZ2VfZGF0YSIpCisgICAgICAgIGlmIG5vdCBoYXZlX3BhY2thZ2VfZGF0YToKKyAgICAgICAgICAgIHNlbGYucGFja2FnZV9kYXRhID0ge30KKyAgICAgICAgc2VsZi5yZXF1aXJlX2ZlYXR1cmVzID0gW10KKyAgICAgICAgc2VsZi5mZWF0dXJlcyA9IHt9CisgICAgICAgIHNlbGYuZGlzdF9maWxlcyA9IFtdCisgICAgICAgIHNlbGYucGF0Y2hfbWlzc2luZ19wa2dfaW5mbyhhdHRycykKKyAgICAgICAgIyBNYWtlIHN1cmUgd2UgaGF2ZSBhbnkgZWdncyBuZWVkZWQgdG8gaW50ZXJwcmV0ICdhdHRycycKKyAgICAgICAgaWYgYXR0cnMgYW5kICdkZXBlbmRlbmN5X2xpbmtzJyBpbiBhdHRyczoKKyAgICAgICAgICAgIHNlbGYuZGVwZW5kZW5jeV9saW5rcyA9IGF0dHJzLnBvcCgnZGVwZW5kZW5jeV9saW5rcycpCisgICAgICAgICAgICBhc3NlcnRfc3RyaW5nX2xpc3Qoc2VsZiwnZGVwZW5kZW5jeV9saW5rcycsc2VsZi5kZXBlbmRlbmN5X2xpbmtzKQorICAgICAgICBpZiBhdHRycyBhbmQgJ3NldHVwX3JlcXVpcmVzJyBpbiBhdHRyczoKKyAgICAgICAgICAgIHNlbGYuZmV0Y2hfYnVpbGRfZWdncyhhdHRycy5wb3AoJ3NldHVwX3JlcXVpcmVzJykpCisgICAgICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHMnKToKKyAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsZXAubmFtZSk6CisgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLGVwLm5hbWUsTm9uZSkKKyAgICAgICAgX0Rpc3RyaWJ1dGlvbi5fX2luaXRfXyhzZWxmLGF0dHJzKQorICAgICAgICBpZiBpc2luc3RhbmNlKHNlbGYubWV0YWRhdGEudmVyc2lvbiwgKGludCxsb25nLGZsb2F0KSk6CisgICAgICAgICAgICAjIFNvbWUgcGVvcGxlIGFwcGFyZW50bHkgdGFrZSAidmVyc2lvbiBudW1iZXIiIHRvbyBsaXRlcmFsbHkgOikKKyAgICAgICAgICAgIHNlbGYubWV0YWRhdGEudmVyc2lvbiA9IHN0cihzZWxmLm1ldGFkYXRhLnZlcnNpb24pCisKKyAgICBkZWYgcGFyc2VfY29tbWFuZF9saW5lKHNlbGYpOgorICAgICAgICAiIiJQcm9jZXNzIGZlYXR1cmVzIGFmdGVyIHBhcnNpbmcgY29tbWFuZCBsaW5lIG9wdGlvbnMiIiIKKyAgICAgICAgcmVzdWx0ID0gX0Rpc3RyaWJ1dGlvbi5wYXJzZV9jb21tYW5kX2xpbmUoc2VsZikKKyAgICAgICAgaWYgc2VsZi5mZWF0dXJlczoKKyAgICAgICAgICAgIHNlbGYuX2ZpbmFsaXplX2ZlYXR1cmVzKCkKKyAgICAgICAgcmV0dXJuIHJlc3VsdAorCisgICAgZGVmIF9mZWF0dXJlX2F0dHJuYW1lKHNlbGYsbmFtZSk6CisgICAgICAgICIiIkNvbnZlcnQgZmVhdHVyZSBuYW1lIHRvIGNvcnJlc3BvbmRpbmcgb3B0aW9uIGF0dHJpYnV0ZSBuYW1lIiIiCisgICAgICAgIHJldHVybiAnd2l0aF8nK25hbWUucmVwbGFjZSgnLScsJ18nKQorCisgICAgZGVmIGZldGNoX2J1aWxkX2VnZ3Moc2VsZiwgcmVxdWlyZXMpOgorICAgICAgICAiIiJSZXNvbHZlIHByZS1zZXR1cCByZXF1aXJlbWVudHMiIiIKKyAgICAgICAgZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCB3b3JraW5nX3NldCwgcGFyc2VfcmVxdWlyZW1lbnRzCisgICAgICAgIGZvciBkaXN0IGluIHdvcmtpbmdfc2V0LnJlc29sdmUoCisgICAgICAgICAgICBwYXJzZV9yZXF1aXJlbWVudHMocmVxdWlyZXMpLCBpbnN0YWxsZXI9c2VsZi5mZXRjaF9idWlsZF9lZ2cKKyAgICAgICAgKToKKyAgICAgICAgICAgIHdvcmtpbmdfc2V0LmFkZChkaXN0KQorCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIF9EaXN0cmlidXRpb24uZmluYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBpZiBzZWxmLmZlYXR1cmVzOgorICAgICAgICAgICAgc2VsZi5fc2V0X2dsb2JhbF9vcHRzX2Zyb21fZmVhdHVyZXMoKQorCisgICAgICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuc2V0dXBfa2V5d29yZHMnKToKKyAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihzZWxmLGVwLm5hbWUsTm9uZSkKKyAgICAgICAgICAgIGlmIHZhbHVlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIGVwLnJlcXVpcmUoaW5zdGFsbGVyPXNlbGYuZmV0Y2hfYnVpbGRfZWdnKQorICAgICAgICAgICAgICAgIGVwLmxvYWQoKShzZWxmLCBlcC5uYW1lLCB2YWx1ZSkKKworICAgIGRlZiBmZXRjaF9idWlsZF9lZ2coc2VsZiwgcmVxKToKKyAgICAgICAgIiIiRmV0Y2ggYW4gZWdnIG5lZWRlZCBmb3IgYnVpbGRpbmciIiIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY21kID0gc2VsZi5fZWdnX2ZldGNoZXIKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmNvbW1hbmQuZWFzeV9pbnN0YWxsIGltcG9ydCBlYXN5X2luc3RhbGwKKyAgICAgICAgICAgIGRpc3QgPSBzZWxmLl9fY2xhc3NfXyh7J3NjcmlwdF9hcmdzJzpbJ2Vhc3lfaW5zdGFsbCddfSkKKyAgICAgICAgICAgIGRpc3QucGFyc2VfY29uZmlnX2ZpbGVzKCkKKyAgICAgICAgICAgIG9wdHMgPSBkaXN0LmdldF9vcHRpb25fZGljdCgnZWFzeV9pbnN0YWxsJykKKyAgICAgICAgICAgIGtlZXAgPSAoCisgICAgICAgICAgICAgICAgJ2ZpbmRfbGlua3MnLCAnc2l0ZV9kaXJzJywgJ2luZGV4X3VybCcsICdvcHRpbWl6ZScsCisgICAgICAgICAgICAgICAgJ3NpdGVfZGlycycsICdhbGxvd19ob3N0cycKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGZvciBrZXkgaW4gb3B0cy5rZXlzKCk6CisgICAgICAgICAgICAgICAgaWYga2V5IG5vdCBpbiBrZWVwOgorICAgICAgICAgICAgICAgICAgICBkZWwgb3B0c1trZXldICAgIyBkb24ndCB1c2UgYW55IG90aGVyIHNldHRpbmdzCisgICAgICAgICAgICBpZiBzZWxmLmRlcGVuZGVuY3lfbGlua3M6CisgICAgICAgICAgICAgICAgbGlua3MgPSBzZWxmLmRlcGVuZGVuY3lfbGlua3NbOl0KKyAgICAgICAgICAgICAgICBpZiAnZmluZF9saW5rcycgaW4gb3B0czoKKyAgICAgICAgICAgICAgICAgICAgbGlua3MgPSBvcHRzWydmaW5kX2xpbmtzJ11bMV0uc3BsaXQoKSArIGxpbmtzCisgICAgICAgICAgICAgICAgb3B0c1snZmluZF9saW5rcyddID0gKCdzZXR1cCcsIGxpbmtzKQorICAgICAgICAgICAgY21kID0gZWFzeV9pbnN0YWxsKAorICAgICAgICAgICAgICAgIGRpc3QsIGFyZ3M9WyJ4Il0sIGluc3RhbGxfZGlyPW9zLmN1cmRpciwgZXhjbHVkZV9zY3JpcHRzPVRydWUsCisgICAgICAgICAgICAgICAgYWx3YXlzX2NvcHk9RmFsc2UsIGJ1aWxkX2RpcmVjdG9yeT1Ob25lLCBlZGl0YWJsZT1GYWxzZSwKKyAgICAgICAgICAgICAgICB1cGdyYWRlPUZhbHNlLCBtdWx0aV92ZXJzaW9uPVRydWUsIG5vX3JlcG9ydCA9IFRydWUKKyAgICAgICAgICAgICkKKyAgICAgICAgICAgIGNtZC5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgICAgIHNlbGYuX2VnZ19mZXRjaGVyID0gY21kCisgICAgICAgIHJldHVybiBjbWQuZWFzeV9pbnN0YWxsKHJlcSkKKworICAgIGRlZiBfc2V0X2dsb2JhbF9vcHRzX2Zyb21fZmVhdHVyZXMoc2VsZik6CisgICAgICAgICIiIkFkZCAtLXdpdGgtWC8tLXdpdGhvdXQtWCBvcHRpb25zIGJhc2VkIG9uIG9wdGlvbmFsIGZlYXR1cmVzIiIiCisKKyAgICAgICAgZ28gPSBbXQorICAgICAgICBubyA9IHNlbGYubmVnYXRpdmVfb3B0LmNvcHkoKQorCisgICAgICAgIGZvciBuYW1lLGZlYXR1cmUgaW4gc2VsZi5mZWF0dXJlcy5pdGVtcygpOgorICAgICAgICAgICAgc2VsZi5fc2V0X2ZlYXR1cmUobmFtZSxOb25lKQorICAgICAgICAgICAgZmVhdHVyZS52YWxpZGF0ZShzZWxmKQorCisgICAgICAgICAgICBpZiBmZWF0dXJlLm9wdGlvbmFsOgorICAgICAgICAgICAgICAgIGRlc2NyID0gZmVhdHVyZS5kZXNjcmlwdGlvbgorICAgICAgICAgICAgICAgIGluY2RlZiA9ICcgKGRlZmF1bHQpJworICAgICAgICAgICAgICAgIGV4Y2RlZj0nJworICAgICAgICAgICAgICAgIGlmIG5vdCBmZWF0dXJlLmluY2x1ZGVfYnlfZGVmYXVsdCgpOgorICAgICAgICAgICAgICAgICAgICBleGNkZWYsIGluY2RlZiA9IGluY2RlZiwgZXhjZGVmCisKKyAgICAgICAgICAgICAgICBnby5hcHBlbmQoKCd3aXRoLScrbmFtZSwgTm9uZSwgJ2luY2x1ZGUgJytkZXNjcitpbmNkZWYpKQorICAgICAgICAgICAgICAgIGdvLmFwcGVuZCgoJ3dpdGhvdXQtJytuYW1lLCBOb25lLCAnZXhjbHVkZSAnK2Rlc2NyK2V4Y2RlZikpCisgICAgICAgICAgICAgICAgbm9bJ3dpdGhvdXQtJytuYW1lXSA9ICd3aXRoLScrbmFtZQorCisgICAgICAgIHNlbGYuZ2xvYmFsX29wdGlvbnMgPSBzZWxmLmZlYXR1cmVfb3B0aW9ucyA9IGdvICsgc2VsZi5nbG9iYWxfb3B0aW9ucworICAgICAgICBzZWxmLm5lZ2F0aXZlX29wdCA9IHNlbGYuZmVhdHVyZV9uZWdvcHQgPSBubworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgIGRlZiBfZmluYWxpemVfZmVhdHVyZXMoc2VsZik6CisgICAgICAgICIiIkFkZC9yZW1vdmUgZmVhdHVyZXMgYW5kIHJlc29sdmUgZGVwZW5kZW5jaWVzIGJldHdlZW4gdGhlbSIiIgorCisgICAgICAgICMgRmlyc3QsIGZsYWcgYWxsIHRoZSBlbmFibGVkIGl0ZW1zIChhbmQgdGh1cyB0aGVpciBkZXBlbmRlbmNpZXMpCisgICAgICAgIGZvciBuYW1lLGZlYXR1cmUgaW4gc2VsZi5mZWF0dXJlcy5pdGVtcygpOgorICAgICAgICAgICAgZW5hYmxlZCA9IHNlbGYuZmVhdHVyZV9pc19pbmNsdWRlZChuYW1lKQorICAgICAgICAgICAgaWYgZW5hYmxlZCBvciAoZW5hYmxlZCBpcyBOb25lIGFuZCBmZWF0dXJlLmluY2x1ZGVfYnlfZGVmYXVsdCgpKToKKyAgICAgICAgICAgICAgICBmZWF0dXJlLmluY2x1ZGVfaW4oc2VsZikKKyAgICAgICAgICAgICAgICBzZWxmLl9zZXRfZmVhdHVyZShuYW1lLDEpCisKKyAgICAgICAgIyBUaGVuIGRpc2FibGUgdGhlIHJlc3QsIHNvIHRoYXQgb2ZmLWJ5LWRlZmF1bHQgZmVhdHVyZXMgZG9uJ3QKKyAgICAgICAgIyBnZXQgZmxhZ2dlZCBhcyBlcnJvcnMgd2hlbiB0aGV5J3JlIHJlcXVpcmVkIGJ5IGFuIGVuYWJsZWQgZmVhdHVyZQorICAgICAgICBmb3IgbmFtZSxmZWF0dXJlIGluIHNlbGYuZmVhdHVyZXMuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLmZlYXR1cmVfaXNfaW5jbHVkZWQobmFtZSk6CisgICAgICAgICAgICAgICAgZmVhdHVyZS5leGNsdWRlX2Zyb20oc2VsZikKKyAgICAgICAgICAgICAgICBzZWxmLl9zZXRfZmVhdHVyZShuYW1lLDApCisKKworICAgIGRlZiBnZXRfY29tbWFuZF9jbGFzcyhzZWxmLCBjb21tYW5kKToKKyAgICAgICAgIiIiUGx1Z2dhYmxlIHZlcnNpb24gb2YgZ2V0X2NvbW1hbmRfY2xhc3MoKSIiIgorICAgICAgICBpZiBjb21tYW5kIGluIHNlbGYuY21kY2xhc3M6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5jbWRjbGFzc1tjb21tYW5kXQorCisgICAgICAgIGZvciBlcCBpbiBwa2dfcmVzb3VyY2VzLml0ZXJfZW50cnlfcG9pbnRzKCdkaXN0dXRpbHMuY29tbWFuZHMnLGNvbW1hbmQpOgorICAgICAgICAgICAgZXAucmVxdWlyZShpbnN0YWxsZXI9c2VsZi5mZXRjaF9idWlsZF9lZ2cpCisgICAgICAgICAgICBzZWxmLmNtZGNsYXNzW2NvbW1hbmRdID0gY21kY2xhc3MgPSBlcC5sb2FkKCkKKyAgICAgICAgICAgIHJldHVybiBjbWRjbGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIF9EaXN0cmlidXRpb24uZ2V0X2NvbW1hbmRfY2xhc3Moc2VsZiwgY29tbWFuZCkKKworICAgIGRlZiBwcmludF9jb21tYW5kcyhzZWxmKToKKyAgICAgICAgZm9yIGVwIGluIHBrZ19yZXNvdXJjZXMuaXRlcl9lbnRyeV9wb2ludHMoJ2Rpc3R1dGlscy5jb21tYW5kcycpOgorICAgICAgICAgICAgaWYgZXAubmFtZSBub3QgaW4gc2VsZi5jbWRjbGFzczoKKyAgICAgICAgICAgICAgICBjbWRjbGFzcyA9IGVwLmxvYWQoRmFsc2UpICMgZG9uJ3QgcmVxdWlyZSBleHRyYXMsIHdlJ3JlIG5vdCBydW5uaW5nCisgICAgICAgICAgICAgICAgc2VsZi5jbWRjbGFzc1tlcC5uYW1lXSA9IGNtZGNsYXNzCisgICAgICAgIHJldHVybiBfRGlzdHJpYnV0aW9uLnByaW50X2NvbW1hbmRzKHNlbGYpCisKKworCisKKworICAgIGRlZiBfc2V0X2ZlYXR1cmUoc2VsZixuYW1lLHN0YXR1cyk6CisgICAgICAgICIiIlNldCBmZWF0dXJlJ3MgaW5jbHVzaW9uIHN0YXR1cyIiIgorICAgICAgICBzZXRhdHRyKHNlbGYsc2VsZi5fZmVhdHVyZV9hdHRybmFtZShuYW1lKSxzdGF0dXMpCisKKyAgICBkZWYgZmVhdHVyZV9pc19pbmNsdWRlZChzZWxmLG5hbWUpOgorICAgICAgICAiIiJSZXR1cm4gMSBpZiBmZWF0dXJlIGlzIGluY2x1ZGVkLCAwIGlmIGV4Y2x1ZGVkLCAnTm9uZScgaWYgdW5rbm93biIiIgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLHNlbGYuX2ZlYXR1cmVfYXR0cm5hbWUobmFtZSkpCisKKyAgICBkZWYgaW5jbHVkZV9mZWF0dXJlKHNlbGYsbmFtZSk6CisgICAgICAgICIiIlJlcXVlc3QgaW5jbHVzaW9uIG9mIGZlYXR1cmUgbmFtZWQgJ25hbWUnIiIiCisKKyAgICAgICAgaWYgc2VsZi5mZWF0dXJlX2lzX2luY2x1ZGVkKG5hbWUpPT0wOgorICAgICAgICAgICAgZGVzY3IgPSBzZWxmLmZlYXR1cmVzW25hbWVdLmRlc2NyaXB0aW9uCisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNPcHRpb25FcnJvcigKKyAgICAgICAgICAgICAgIGRlc2NyICsgIiBpcyByZXF1aXJlZCwgYnV0IHdhcyBleGNsdWRlZCBvciBpcyBub3QgYXZhaWxhYmxlIgorICAgICAgICAgICApCisgICAgICAgIHNlbGYuZmVhdHVyZXNbbmFtZV0uaW5jbHVkZV9pbihzZWxmKQorICAgICAgICBzZWxmLl9zZXRfZmVhdHVyZShuYW1lLDEpCisKKyAgICBkZWYgaW5jbHVkZShzZWxmLCoqYXR0cnMpOgorICAgICAgICAiIiJBZGQgaXRlbXMgdG8gZGlzdHJpYnV0aW9uIHRoYXQgYXJlIG5hbWVkIGluIGtleXdvcmQgYXJndW1lbnRzCisKKyAgICAgICAgRm9yIGV4YW1wbGUsICdkaXN0LmV4Y2x1ZGUocHlfbW9kdWxlcz1bIngiXSknIHdvdWxkIGFkZCAneCcgdG8KKyAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbidzICdweV9tb2R1bGVzJyBhdHRyaWJ1dGUsIGlmIGl0IHdhcyBub3QgYWxyZWFkeQorICAgICAgICB0aGVyZS4KKworICAgICAgICBDdXJyZW50bHksIHRoaXMgbWV0aG9kIG9ubHkgc3VwcG9ydHMgaW5jbHVzaW9uIGZvciBhdHRyaWJ1dGVzIHRoYXQgYXJlCisgICAgICAgIGxpc3RzIG9yIHR1cGxlcy4gIElmIHlvdSBuZWVkIHRvIGFkZCBzdXBwb3J0IGZvciBhZGRpbmcgdG8gb3RoZXIKKyAgICAgICAgYXR0cmlidXRlcyBpbiB0aGlzIG9yIGEgc3ViY2xhc3MsIHlvdSBjYW4gYWRkIGFuICdfaW5jbHVkZV9YJyBtZXRob2QsCisgICAgICAgIHdoZXJlICdYJyBpcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiAgVGhlIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoCisgICAgICAgIHRoZSB2YWx1ZSBwYXNzZWQgdG8gJ2luY2x1ZGUoKScuICBTbywgJ2Rpc3QuaW5jbHVkZShmb289eyJiYXIiOiJiYXoifSknCisgICAgICAgIHdpbGwgdHJ5IHRvIGNhbGwgJ2Rpc3QuX2luY2x1ZGVfZm9vKHsiYmFyIjoiYmF6In0pJywgd2hpY2ggY2FuIHRoZW4KKyAgICAgICAgaGFuZGxlIHdoYXRldmVyIHNwZWNpYWwgaW5jbHVzaW9uIGxvZ2ljIGlzIG5lZWRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBrLHYgaW4gYXR0cnMuaXRlbXMoKToKKyAgICAgICAgICAgIGluY2x1ZGUgPSBnZXRhdHRyKHNlbGYsICdfaW5jbHVkZV8nK2ssIE5vbmUpCisgICAgICAgICAgICBpZiBpbmNsdWRlOgorICAgICAgICAgICAgICAgIGluY2x1ZGUodikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5faW5jbHVkZV9taXNjKGssdikKKworICAgIGRlZiBleGNsdWRlX3BhY2thZ2Uoc2VsZixwYWNrYWdlKToKKyAgICAgICAgIiIiUmVtb3ZlIHBhY2thZ2VzLCBtb2R1bGVzLCBhbmQgZXh0ZW5zaW9ucyBpbiBuYW1lZCBwYWNrYWdlIiIiCisKKyAgICAgICAgcGZ4ID0gcGFja2FnZSsnLicKKyAgICAgICAgaWYgc2VsZi5wYWNrYWdlczoKKyAgICAgICAgICAgIHNlbGYucGFja2FnZXMgPSBbCisgICAgICAgICAgICAgICAgcCBmb3IgcCBpbiBzZWxmLnBhY2thZ2VzCisgICAgICAgICAgICAgICAgICAgIGlmIHA8PnBhY2thZ2UgYW5kIG5vdCBwLnN0YXJ0c3dpdGgocGZ4KQorICAgICAgICAgICAgXQorCisgICAgICAgIGlmIHNlbGYucHlfbW9kdWxlczoKKyAgICAgICAgICAgIHNlbGYucHlfbW9kdWxlcyA9IFsKKyAgICAgICAgICAgICAgICBwIGZvciBwIGluIHNlbGYucHlfbW9kdWxlcworICAgICAgICAgICAgICAgICAgICBpZiBwPD5wYWNrYWdlIGFuZCBub3QgcC5zdGFydHN3aXRoKHBmeCkKKyAgICAgICAgICAgIF0KKworICAgICAgICBpZiBzZWxmLmV4dF9tb2R1bGVzOgorICAgICAgICAgICAgc2VsZi5leHRfbW9kdWxlcyA9IFsKKyAgICAgICAgICAgICAgICBwIGZvciBwIGluIHNlbGYuZXh0X21vZHVsZXMKKyAgICAgICAgICAgICAgICAgICAgaWYgcC5uYW1lPD5wYWNrYWdlIGFuZCBub3QgcC5uYW1lLnN0YXJ0c3dpdGgocGZ4KQorICAgICAgICAgICAgXQorCisKKyAgICBkZWYgaGFzX2NvbnRlbnRzX2ZvcihzZWxmLHBhY2thZ2UpOgorICAgICAgICAiIiJSZXR1cm4gdHJ1ZSBpZiAnZXhjbHVkZV9wYWNrYWdlKHBhY2thZ2UpJyB3b3VsZCBkbyBzb21ldGhpbmciIiIKKworICAgICAgICBwZnggPSBwYWNrYWdlKycuJworCisgICAgICAgIGZvciBwIGluIHNlbGYuaXRlcl9kaXN0cmlidXRpb25fbmFtZXMoKToKKyAgICAgICAgICAgIGlmIHA9PXBhY2thZ2Ugb3IgcC5zdGFydHN3aXRoKHBmeCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIFRydWUKKworCisKKworCisKKworCisKKworICAgIGRlZiBfZXhjbHVkZV9taXNjKHNlbGYsbmFtZSx2YWx1ZSk6CisgICAgICAgICIiIkhhbmRsZSAnZXhjbHVkZSgpJyBmb3IgbGlzdC90dXBsZSBhdHRycyB3aXRob3V0IGEgc3BlY2lhbCBoYW5kbGVyIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLHNlcXVlbmNlKToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAgICAgIiVzOiBzZXR0aW5nIG11c3QgYmUgYSBsaXN0IG9yIHR1cGxlICglcikiICUgKG5hbWUsIHZhbHVlKQorICAgICAgICAgICAgKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvbGQgPSBnZXRhdHRyKHNlbGYsbmFtZSkKKyAgICAgICAgZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyAgICAgICAgICAgICAgICAiJXM6IE5vIHN1Y2ggZGlzdHJpYnV0aW9uIHNldHRpbmciICUgbmFtZQorICAgICAgICAgICAgKQorICAgICAgICBpZiBvbGQgaXMgbm90IE5vbmUgYW5kIG5vdCBpc2luc3RhbmNlKG9sZCxzZXF1ZW5jZSk6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAorICAgICAgICAgICAgICAgIG5hbWUrIjogdGhpcyBzZXR0aW5nIGNhbm5vdCBiZSBjaGFuZ2VkIHZpYSBpbmNsdWRlL2V4Y2x1ZGUiCisgICAgICAgICAgICApCisgICAgICAgIGVsaWYgb2xkOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLG5hbWUsW2l0ZW0gZm9yIGl0ZW0gaW4gb2xkIGlmIGl0ZW0gbm90IGluIHZhbHVlXSkKKworICAgIGRlZiBfaW5jbHVkZV9taXNjKHNlbGYsbmFtZSx2YWx1ZSk6CisgICAgICAgICIiIkhhbmRsZSAnaW5jbHVkZSgpJyBmb3IgbGlzdC90dXBsZSBhdHRycyB3aXRob3V0IGEgc3BlY2lhbCBoYW5kbGVyIiIiCisKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsc2VxdWVuY2UpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyAgICAgICAgICAgICAgICAiJXM6IHNldHRpbmcgbXVzdCBiZSBhIGxpc3QgKCVyKSIgJSAobmFtZSwgdmFsdWUpCisgICAgICAgICAgICApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG9sZCA9IGdldGF0dHIoc2VsZixuYW1lKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAorICAgICAgICAgICAgICAgICIlczogTm8gc3VjaCBkaXN0cmlidXRpb24gc2V0dGluZyIgJSBuYW1lCisgICAgICAgICAgICApCisgICAgICAgIGlmIG9sZCBpcyBOb25lOgorICAgICAgICAgICAgc2V0YXR0cihzZWxmLG5hbWUsdmFsdWUpCisgICAgICAgIGVsaWYgbm90IGlzaW5zdGFuY2Uob2xkLHNlcXVlbmNlKToKKyAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc1NldHVwRXJyb3IoCisgICAgICAgICAgICAgICAgbmFtZSsiOiB0aGlzIHNldHRpbmcgY2Fubm90IGJlIGNoYW5nZWQgdmlhIGluY2x1ZGUvZXhjbHVkZSIKKyAgICAgICAgICAgICkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNldGF0dHIoc2VsZixuYW1lLG9sZCtbaXRlbSBmb3IgaXRlbSBpbiB2YWx1ZSBpZiBpdGVtIG5vdCBpbiBvbGRdKQorCisgICAgZGVmIGV4Y2x1ZGUoc2VsZiwqKmF0dHJzKToKKyAgICAgICAgIiIiUmVtb3ZlIGl0ZW1zIGZyb20gZGlzdHJpYnV0aW9uIHRoYXQgYXJlIG5hbWVkIGluIGtleXdvcmQgYXJndW1lbnRzCisKKyAgICAgICAgRm9yIGV4YW1wbGUsICdkaXN0LmV4Y2x1ZGUocHlfbW9kdWxlcz1bIngiXSknIHdvdWxkIHJlbW92ZSAneCcgZnJvbQorICAgICAgICB0aGUgZGlzdHJpYnV0aW9uJ3MgJ3B5X21vZHVsZXMnIGF0dHJpYnV0ZS4gIEV4Y2x1ZGluZyBwYWNrYWdlcyB1c2VzCisgICAgICAgIHRoZSAnZXhjbHVkZV9wYWNrYWdlKCknIG1ldGhvZCwgc28gYWxsIG9mIHRoZSBwYWNrYWdlJ3MgY29udGFpbmVkCisgICAgICAgIHBhY2thZ2VzLCBtb2R1bGVzLCBhbmQgZXh0ZW5zaW9ucyBhcmUgYWxzbyBleGNsdWRlZC4KKworICAgICAgICBDdXJyZW50bHksIHRoaXMgbWV0aG9kIG9ubHkgc3VwcG9ydHMgZXhjbHVzaW9uIGZyb20gYXR0cmlidXRlcyB0aGF0IGFyZQorICAgICAgICBsaXN0cyBvciB0dXBsZXMuICBJZiB5b3UgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IgZXhjbHVkaW5nIGZyb20gb3RoZXIKKyAgICAgICAgYXR0cmlidXRlcyBpbiB0aGlzIG9yIGEgc3ViY2xhc3MsIHlvdSBjYW4gYWRkIGFuICdfZXhjbHVkZV9YJyBtZXRob2QsCisgICAgICAgIHdoZXJlICdYJyBpcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLiAgVGhlIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aXRoCisgICAgICAgIHRoZSB2YWx1ZSBwYXNzZWQgdG8gJ2V4Y2x1ZGUoKScuICBTbywgJ2Rpc3QuZXhjbHVkZShmb289eyJiYXIiOiJiYXoifSknCisgICAgICAgIHdpbGwgdHJ5IHRvIGNhbGwgJ2Rpc3QuX2V4Y2x1ZGVfZm9vKHsiYmFyIjoiYmF6In0pJywgd2hpY2ggY2FuIHRoZW4KKyAgICAgICAgaGFuZGxlIHdoYXRldmVyIHNwZWNpYWwgZXhjbHVzaW9uIGxvZ2ljIGlzIG5lZWRlZC4KKyAgICAgICAgIiIiCisgICAgICAgIGZvciBrLHYgaW4gYXR0cnMuaXRlbXMoKToKKyAgICAgICAgICAgIGV4Y2x1ZGUgPSBnZXRhdHRyKHNlbGYsICdfZXhjbHVkZV8nK2ssIE5vbmUpCisgICAgICAgICAgICBpZiBleGNsdWRlOgorICAgICAgICAgICAgICAgIGV4Y2x1ZGUodikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fZXhjbHVkZV9taXNjKGssdikKKworICAgIGRlZiBfZXhjbHVkZV9wYWNrYWdlcyhzZWxmLHBhY2thZ2VzKToKKyAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UocGFja2FnZXMsc2VxdWVuY2UpOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyAgICAgICAgICAgICAgICAicGFja2FnZXM6IHNldHRpbmcgbXVzdCBiZSBhIGxpc3Qgb3IgdHVwbGUgKCVyKSIgJSAocGFja2FnZXMsKQorICAgICAgICAgICAgKQorICAgICAgICBtYXAoc2VsZi5leGNsdWRlX3BhY2thZ2UsIHBhY2thZ2VzKQorCisKKworCisKKworCisKKworCisKKworICAgIGRlZiBfcGFyc2VfY29tbWFuZF9vcHRzKHNlbGYsIHBhcnNlciwgYXJncyk6CisgICAgICAgICMgUmVtb3ZlIC0td2l0aC1YLy0td2l0aG91dC1YIG9wdGlvbnMgd2hlbiBwcm9jZXNzaW5nIGNvbW1hbmQgYXJncworICAgICAgICBzZWxmLmdsb2JhbF9vcHRpb25zID0gc2VsZi5fX2NsYXNzX18uZ2xvYmFsX29wdGlvbnMKKyAgICAgICAgc2VsZi5uZWdhdGl2ZV9vcHQgPSBzZWxmLl9fY2xhc3NfXy5uZWdhdGl2ZV9vcHQKKworICAgICAgICAjIEZpcnN0LCBleHBhbmQgYW55IGFsaWFzZXMKKyAgICAgICAgY29tbWFuZCA9IGFyZ3NbMF0KKyAgICAgICAgYWxpYXNlcyA9IHNlbGYuZ2V0X29wdGlvbl9kaWN0KCdhbGlhc2VzJykKKyAgICAgICAgd2hpbGUgY29tbWFuZCBpbiBhbGlhc2VzOgorICAgICAgICAgICAgc3JjLGFsaWFzID0gYWxpYXNlc1tjb21tYW5kXQorICAgICAgICAgICAgZGVsIGFsaWFzZXNbY29tbWFuZF0gICAgIyBlbnN1cmUgZWFjaCBhbGlhcyBjYW4gZXhwYW5kIG9ubHkgb25jZSEKKyAgICAgICAgICAgIGltcG9ydCBzaGxleAorICAgICAgICAgICAgYXJnc1s6MV0gPSBzaGxleC5zcGxpdChhbGlhcyxUcnVlKQorICAgICAgICAgICAgY29tbWFuZCA9IGFyZ3NbMF0KKworICAgICAgICBuYXJncyA9IF9EaXN0cmlidXRpb24uX3BhcnNlX2NvbW1hbmRfb3B0cyhzZWxmLCBwYXJzZXIsIGFyZ3MpCisKKyAgICAgICAgIyBIYW5kbGUgY29tbWFuZHMgdGhhdCB3YW50IHRvIGNvbnN1bWUgYWxsIHJlbWFpbmluZyBhcmd1bWVudHMKKyAgICAgICAgY21kX2NsYXNzID0gc2VsZi5nZXRfY29tbWFuZF9jbGFzcyhjb21tYW5kKQorICAgICAgICBpZiBnZXRhdHRyKGNtZF9jbGFzcywnY29tbWFuZF9jb25zdW1lc19hcmd1bWVudHMnLE5vbmUpOgorICAgICAgICAgICAgc2VsZi5nZXRfb3B0aW9uX2RpY3QoY29tbWFuZClbJ2FyZ3MnXSA9ICgiY29tbWFuZCBsaW5lIiwgbmFyZ3MpCisgICAgICAgICAgICBpZiBuYXJncyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICByZXR1cm4gW10KKworICAgICAgICByZXR1cm4gbmFyZ3MKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgIGRlZiBnZXRfY21kbGluZV9vcHRpb25zKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gYSAne2NtZDoge29wdDp2YWx9fScgbWFwIG9mIGFsbCBjb21tYW5kLWxpbmUgb3B0aW9ucworCisgICAgICAgIE9wdGlvbiBuYW1lcyBhcmUgYWxsIGxvbmcsIGJ1dCBkbyBub3QgaW5jbHVkZSB0aGUgbGVhZGluZyAnLS0nLCBhbmQKKyAgICAgICAgY29udGFpbiBkYXNoZXMgcmF0aGVyIHRoYW4gdW5kZXJzY29yZXMuICBJZiB0aGUgb3B0aW9uIGRvZXNuJ3QgdGFrZQorICAgICAgICBhbiBhcmd1bWVudCAoZS5nLiAnLS1xdWlldCcpLCB0aGUgJ3ZhbCcgaXMgJ05vbmUnLgorCisgICAgICAgIE5vdGUgdGhhdCBvcHRpb25zIHByb3ZpZGVkIGJ5IGNvbmZpZyBmaWxlcyBhcmUgaW50ZW50aW9uYWxseSBleGNsdWRlZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgZCA9IHt9CisKKyAgICAgICAgZm9yIGNtZCxvcHRzIGluIHNlbGYuY29tbWFuZF9vcHRpb25zLml0ZW1zKCk6CisKKyAgICAgICAgICAgIGZvciBvcHQsKHNyYyx2YWwpIGluIG9wdHMuaXRlbXMoKToKKworICAgICAgICAgICAgICAgIGlmIHNyYyAhPSAiY29tbWFuZCBsaW5lIjoKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKworICAgICAgICAgICAgICAgIG9wdCA9IG9wdC5yZXBsYWNlKCdfJywnLScpCisKKyAgICAgICAgICAgICAgICBpZiB2YWw9PTA6CisgICAgICAgICAgICAgICAgICAgIGNtZG9iaiA9IHNlbGYuZ2V0X2NvbW1hbmRfb2JqKGNtZCkKKyAgICAgICAgICAgICAgICAgICAgbmVnX29wdCA9IHNlbGYubmVnYXRpdmVfb3B0LmNvcHkoKQorICAgICAgICAgICAgICAgICAgICBuZWdfb3B0LnVwZGF0ZShnZXRhdHRyKGNtZG9iaiwnbmVnYXRpdmVfb3B0Jyx7fSkpCisgICAgICAgICAgICAgICAgICAgIGZvciBuZWcscG9zIGluIG5lZ19vcHQuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHBvcz09b3B0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdD1uZWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWw9Tm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigiU2hvdWxkbid0IGJlIGFibGUgdG8gZ2V0IGhlcmUiKQorCisgICAgICAgICAgICAgICAgZWxpZiB2YWw9PTE6CisgICAgICAgICAgICAgICAgICAgIHZhbCA9IE5vbmUKKworICAgICAgICAgICAgICAgIGQuc2V0ZGVmYXVsdChjbWQse30pW29wdF0gPSB2YWwKKworICAgICAgICByZXR1cm4gZAorCisKKyAgICBkZWYgaXRlcl9kaXN0cmlidXRpb25fbmFtZXMoc2VsZik6CisgICAgICAgICIiIllpZWxkIGFsbCBwYWNrYWdlcywgbW9kdWxlcywgYW5kIGV4dGVuc2lvbiBuYW1lcyBpbiBkaXN0cmlidXRpb24iIiIKKworICAgICAgICBmb3IgcGtnIGluIHNlbGYucGFja2FnZXMgb3IgKCk6CisgICAgICAgICAgICB5aWVsZCBwa2cKKworICAgICAgICBmb3IgbW9kdWxlIGluIHNlbGYucHlfbW9kdWxlcyBvciAoKToKKyAgICAgICAgICAgIHlpZWxkIG1vZHVsZQorCisgICAgICAgIGZvciBleHQgaW4gc2VsZi5leHRfbW9kdWxlcyBvciAoKToKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZXh0LHR1cGxlKToKKyAgICAgICAgICAgICAgICBuYW1lLGJ1aWxkaW5mbyA9IGV4dAorICAgICAgICAgICAgICAgIHlpZWxkIG5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgeWllbGQgZXh0Lm5hbWUKKworIyBJbnN0YWxsIGl0IHRocm91Z2hvdXQgdGhlIGRpc3R1dGlscworZm9yIG1vZHVsZSBpbiBkaXN0dXRpbHMuZGlzdCwgZGlzdHV0aWxzLmNvcmUsIGRpc3R1dGlscy5jbWQ6CisgICAgbW9kdWxlLkRpc3RyaWJ1dGlvbiA9IERpc3RyaWJ1dGlvbgorCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitjbGFzcyBGZWF0dXJlOgorICAgICIiIkEgc3Vic2V0IG9mIHRoZSBkaXN0cmlidXRpb24gdGhhdCBjYW4gYmUgZXhjbHVkZWQgaWYgdW5uZWVkZWQvd2FudGVkCisKKyAgICBGZWF0dXJlcyBhcmUgY3JlYXRlZCB1c2luZyB0aGVzZSBrZXl3b3JkIGFyZ3VtZW50czoKKworICAgICAgJ2Rlc2NyaXB0aW9uJyAtLSBhIHNob3J0LCBodW1hbiByZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmVhdHVyZSwgdG8KKyAgICAgICAgIGJlIHVzZWQgaW4gZXJyb3IgbWVzc2FnZXMsIGFuZCBvcHRpb24gaGVscCBtZXNzYWdlcy4KKworICAgICAgJ3N0YW5kYXJkJyAtLSBpZiB0cnVlLCB0aGUgZmVhdHVyZSBpcyBpbmNsdWRlZCBieSBkZWZhdWx0IGlmIGl0IGlzCisgICAgICAgICBhdmFpbGFibGUgb24gdGhlIGN1cnJlbnQgc3lzdGVtLiAgT3RoZXJ3aXNlLCB0aGUgZmVhdHVyZSBpcyBvbmx5CisgICAgICAgICBpbmNsdWRlZCBpZiByZXF1ZXN0ZWQgdmlhIGEgY29tbWFuZCBsaW5lICctLXdpdGgtWCcgb3B0aW9uLCBvciBpZgorICAgICAgICAgYW5vdGhlciBpbmNsdWRlZCBmZWF0dXJlIHJlcXVpcmVzIGl0LiAgVGhlIGRlZmF1bHQgc2V0dGluZyBpcyAnRmFsc2UnLgorCisgICAgICAnYXZhaWxhYmxlJyAtLSBpZiB0cnVlLCB0aGUgZmVhdHVyZSBpcyBhdmFpbGFibGUgZm9yIGluc3RhbGxhdGlvbiBvbiB0aGUKKyAgICAgICAgIGN1cnJlbnQgc3lzdGVtLiAgVGhlIGRlZmF1bHQgc2V0dGluZyBpcyAnVHJ1ZScuCisKKyAgICAgICdvcHRpb25hbCcgLS0gaWYgdHJ1ZSwgdGhlIGZlYXR1cmUncyBpbmNsdXNpb24gY2FuIGJlIGNvbnRyb2xsZWQgZnJvbSB0aGUKKyAgICAgICAgIGNvbW1hbmQgbGluZSwgdXNpbmcgdGhlICctLXdpdGgtWCcgb3IgJy0td2l0aG91dC1YJyBvcHRpb25zLiAgSWYKKyAgICAgICAgIGZhbHNlLCB0aGUgZmVhdHVyZSdzIGluY2x1c2lvbiBzdGF0dXMgaXMgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5LAorICAgICAgICAgYmFzZWQgb24gJ2F2YWlsYWJpbGUnLCAnc3RhbmRhcmQnLCBhbmQgd2hldGhlciBhbnkgb3RoZXIgZmVhdHVyZQorICAgICAgICAgcmVxdWlyZXMgaXQuICBUaGUgZGVmYXVsdCBzZXR0aW5nIGlzICdUcnVlJy4KKworICAgICAgJ3JlcXVpcmVfZmVhdHVyZXMnIC0tIGEgc3RyaW5nIG9yIHNlcXVlbmNlIG9mIHN0cmluZ3MgbmFtaW5nIGZlYXR1cmVzCisgICAgICAgICB0aGF0IHNob3VsZCBhbHNvIGJlIGluY2x1ZGVkIGlmIHRoaXMgZmVhdHVyZSBpcyBpbmNsdWRlZC4gIERlZmF1bHRzIHRvCisgICAgICAgICBlbXB0eSBsaXN0LiAgTWF5IGFsc28gY29udGFpbiAnUmVxdWlyZScgb2JqZWN0cyB0aGF0IHNob3VsZCBiZQorICAgICAgICAgYWRkZWQvcmVtb3ZlZCBmcm9tIHRoZSBkaXN0cmlidXRpb24uCisKKyAgICAgICdyZW1vdmUnIC0tIGEgc3RyaW5nIG9yIGxpc3Qgb2Ygc3RyaW5ncyBuYW1pbmcgcGFja2FnZXMgdG8gYmUgcmVtb3ZlZAorICAgICAgICAgZnJvbSB0aGUgZGlzdHJpYnV0aW9uIGlmIHRoaXMgZmVhdHVyZSBpcyAqbm90KiBpbmNsdWRlZC4gIElmIHRoZQorICAgICAgICAgZmVhdHVyZSAqaXMqIGluY2x1ZGVkLCB0aGlzIGFyZ3VtZW50IGlzIGlnbm9yZWQuICBUaGlzIGFyZ3VtZW50IGV4aXN0cworICAgICAgICAgdG8gc3VwcG9ydCByZW1vdmluZyBmZWF0dXJlcyB0aGF0ICJjcm9zc2N1dCIgYSBkaXN0cmlidXRpb24sIHN1Y2ggYXMKKyAgICAgICAgIGRlZmluaW5nIGEgJ3Rlc3RzJyBmZWF0dXJlIHRoYXQgcmVtb3ZlcyBhbGwgdGhlICd0ZXN0cycgc3VicGFja2FnZXMKKyAgICAgICAgIHByb3ZpZGVkIGJ5IG90aGVyIGZlYXR1cmVzLiAgVGhlIGRlZmF1bHQgZm9yIHRoaXMgYXJndW1lbnQgaXMgYW4gZW1wdHkKKyAgICAgICAgIGxpc3QuICAoTm90ZTogdGhlIG5hbWVkIHBhY2thZ2Uocykgb3IgbW9kdWxlcyBtdXN0IGV4aXN0IGluIHRoZSBiYXNlCisgICAgICAgICBkaXN0cmlidXRpb24gd2hlbiB0aGUgJ3NldHVwKCknIGZ1bmN0aW9uIGlzIGluaXRpYWxseSBjYWxsZWQuKQorCisgICAgICBvdGhlciBrZXl3b3JkcyAtLSBhbnkgb3RoZXIga2V5d29yZCBhcmd1bWVudHMgYXJlIHNhdmVkLCBhbmQgcGFzc2VkIHRvCisgICAgICAgICB0aGUgZGlzdHJpYnV0aW9uJ3MgJ2luY2x1ZGUoKScgYW5kICdleGNsdWRlKCknIG1ldGhvZHMgd2hlbiB0aGUKKyAgICAgICAgIGZlYXR1cmUgaXMgaW5jbHVkZWQgb3IgZXhjbHVkZWQsIHJlc3BlY3RpdmVseS4gIFNvLCBmb3IgZXhhbXBsZSwgeW91CisgICAgICAgICBjb3VsZCBwYXNzICdwYWNrYWdlcz1bImEiLCJiIl0nIHRvIGNhdXNlIHBhY2thZ2VzICdhJyBhbmQgJ2InIHRvIGJlCisgICAgICAgICBhZGRlZCBvciByZW1vdmVkIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiBhcyBhcHByb3ByaWF0ZS4KKworICAgIEEgZmVhdHVyZSBtdXN0IGluY2x1ZGUgYXQgbGVhc3Qgb25lICdyZXF1aXJlcycsICdyZW1vdmUnLCBvciBvdGhlcgorICAgIGtleXdvcmQgYXJndW1lbnQuICBPdGhlcndpc2UsIGl0IGNhbid0IGFmZmVjdCB0aGUgZGlzdHJpYnV0aW9uIGluIGFueSB3YXkuCisgICAgTm90ZSBhbHNvIHRoYXQgeW91IGNhbiBzdWJjbGFzcyAnRmVhdHVyZScgdG8gY3JlYXRlIHlvdXIgb3duIHNwZWNpYWxpemVkCisgICAgZmVhdHVyZSB0eXBlcyB0aGF0IG1vZGlmeSB0aGUgZGlzdHJpYnV0aW9uIGluIG90aGVyIHdheXMgd2hlbiBpbmNsdWRlZCBvcgorICAgIGV4Y2x1ZGVkLiAgU2VlIHRoZSBkb2NzdHJpbmdzIGZvciB0aGUgdmFyaW91cyBtZXRob2RzIGhlcmUgZm9yIG1vcmUgZGV0YWlsLgorICAgIEFzaWRlIGZyb20gdGhlIG1ldGhvZHMsIHRoZSBvbmx5IGZlYXR1cmUgYXR0cmlidXRlcyB0aGF0IGRpc3RyaWJ1dGlvbnMgbG9vaworICAgIGF0IGFyZSAnZGVzY3JpcHRpb24nIGFuZCAnb3B0aW9uYWwnLgorICAgICIiIgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZXNjcmlwdGlvbiwgc3RhbmRhcmQ9RmFsc2UsIGF2YWlsYWJsZT1UcnVlLAorICAgICAgICBvcHRpb25hbD1UcnVlLCByZXF1aXJlX2ZlYXR1cmVzPSgpLCByZW1vdmU9KCksICoqZXh0cmFzCisgICAgKToKKworICAgICAgICBzZWxmLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb24KKyAgICAgICAgc2VsZi5zdGFuZGFyZCA9IHN0YW5kYXJkCisgICAgICAgIHNlbGYuYXZhaWxhYmxlID0gYXZhaWxhYmxlCisgICAgICAgIHNlbGYub3B0aW9uYWwgPSBvcHRpb25hbAorICAgICAgICBpZiBpc2luc3RhbmNlKHJlcXVpcmVfZmVhdHVyZXMsKHN0cixSZXF1aXJlKSk6CisgICAgICAgICAgICByZXF1aXJlX2ZlYXR1cmVzID0gcmVxdWlyZV9mZWF0dXJlcywKKworICAgICAgICBzZWxmLnJlcXVpcmVfZmVhdHVyZXMgPSBbCisgICAgICAgICAgICByIGZvciByIGluIHJlcXVpcmVfZmVhdHVyZXMgaWYgaXNpbnN0YW5jZShyLHN0cikKKyAgICAgICAgXQorICAgICAgICBlciA9IFtyIGZvciByIGluIHJlcXVpcmVfZmVhdHVyZXMgaWYgbm90IGlzaW5zdGFuY2UocixzdHIpXQorICAgICAgICBpZiBlcjogZXh0cmFzWydyZXF1aXJlX2ZlYXR1cmVzJ10gPSBlcgorCisgICAgICAgIGlmIGlzaW5zdGFuY2UocmVtb3ZlLHN0cik6CisgICAgICAgICAgICByZW1vdmUgPSByZW1vdmUsCisgICAgICAgIHNlbGYucmVtb3ZlID0gcmVtb3ZlCisgICAgICAgIHNlbGYuZXh0cmFzID0gZXh0cmFzCisKKyAgICAgICAgaWYgbm90IHJlbW92ZSBhbmQgbm90IHJlcXVpcmVfZmVhdHVyZXMgYW5kIG5vdCBleHRyYXM6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNTZXR1cEVycm9yKAorICAgICAgICAgICAgICAgICJGZWF0dXJlICVzOiBtdXN0IGRlZmluZSAncmVxdWlyZV9mZWF0dXJlcycsICdyZW1vdmUnLCBvciBhdCBsZWFzdCBvbmUiCisgICAgICAgICAgICAgICAgIiBvZiAncGFja2FnZXMnLCAncHlfbW9kdWxlcycsIGV0Yy4iCisgICAgICAgICAgICApCisKKyAgICBkZWYgaW5jbHVkZV9ieV9kZWZhdWx0KHNlbGYpOgorICAgICAgICAiIiJTaG91bGQgdGhpcyBmZWF0dXJlIGJlIGluY2x1ZGVkIGJ5IGRlZmF1bHQ/IiIiCisgICAgICAgIHJldHVybiBzZWxmLmF2YWlsYWJsZSBhbmQgc2VsZi5zdGFuZGFyZAorCisgICAgZGVmIGluY2x1ZGVfaW4oc2VsZixkaXN0KToKKworICAgICAgICAiIiJFbnN1cmUgZmVhdHVyZSBhbmQgaXRzIHJlcXVpcmVtZW50cyBhcmUgaW5jbHVkZWQgaW4gZGlzdHJpYnV0aW9uCisKKyAgICAgICAgWW91IG1heSBvdmVycmlkZSB0aGlzIGluIGEgc3ViY2xhc3MgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgb24KKyAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbi4gIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlCisgICAgICAgIHBlciBmZWF0dXJlLCBhbmQgc28gc2hvdWxkIGJlIGlkZW1wb3RlbnQuCisKKyAgICAgICAgIiIiCisKKyAgICAgICAgaWYgbm90IHNlbGYuYXZhaWxhYmxlOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcigKKyAgICAgICAgICAgICAgICBzZWxmLmRlc2NyaXB0aW9uKyIgaXMgcmVxdWlyZWQsIgorICAgICAgICAgICAgICAgICJidXQgaXMgbm90IGF2YWlsYWJsZSBvbiB0aGlzIHBsYXRmb3JtIgorICAgICAgICAgICAgKQorCisgICAgICAgIGRpc3QuaW5jbHVkZSgqKnNlbGYuZXh0cmFzKQorCisgICAgICAgIGZvciBmIGluIHNlbGYucmVxdWlyZV9mZWF0dXJlczoKKyAgICAgICAgICAgIGRpc3QuaW5jbHVkZV9mZWF0dXJlKGYpCisKKworCisgICAgZGVmIGV4Y2x1ZGVfZnJvbShzZWxmLGRpc3QpOgorCisgICAgICAgICIiIkVuc3VyZSBmZWF0dXJlIGlzIGV4Y2x1ZGVkIGZyb20gZGlzdHJpYnV0aW9uCisKKyAgICAgICAgWW91IG1heSBvdmVycmlkZSB0aGlzIGluIGEgc3ViY2xhc3MgdG8gcGVyZm9ybSBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgb24KKyAgICAgICAgdGhlIGRpc3RyaWJ1dGlvbi4gIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSBwZXIKKyAgICAgICAgZmVhdHVyZSwgYW5kIG9ubHkgYWZ0ZXIgYWxsIGluY2x1ZGVkIGZlYXR1cmVzIGhhdmUgYmVlbiBhc2tlZCB0bworICAgICAgICBpbmNsdWRlIHRoZW1zZWx2ZXMuCisgICAgICAgICIiIgorCisgICAgICAgIGRpc3QuZXhjbHVkZSgqKnNlbGYuZXh0cmFzKQorCisgICAgICAgIGlmIHNlbGYucmVtb3ZlOgorICAgICAgICAgICAgZm9yIGl0ZW0gaW4gc2VsZi5yZW1vdmU6CisgICAgICAgICAgICAgICAgZGlzdC5leGNsdWRlX3BhY2thZ2UoaXRlbSkKKworCisKKyAgICBkZWYgdmFsaWRhdGUoc2VsZixkaXN0KToKKworICAgICAgICAiIiJWZXJpZnkgdGhhdCBmZWF0dXJlIG1ha2VzIHNlbnNlIGluIGNvbnRleHQgb2YgZGlzdHJpYnV0aW9uCisKKyAgICAgICAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRoZSBkaXN0cmlidXRpb24ganVzdCBiZWZvcmUgaXQgcGFyc2VzIGl0cworICAgICAgICBjb21tYW5kIGxpbmUuICBJdCBjaGVja3MgdG8gZW5zdXJlIHRoYXQgdGhlICdyZW1vdmUnIGF0dHJpYnV0ZSwgaWYgYW55LAorICAgICAgICBjb250YWlucyBvbmx5IHZhbGlkIHBhY2thZ2UvbW9kdWxlIG5hbWVzIHRoYXQgYXJlIHByZXNlbnQgaW4gdGhlIGJhc2UKKyAgICAgICAgZGlzdHJpYnV0aW9uIHdoZW4gJ3NldHVwKCknIGlzIGNhbGxlZC4gIFlvdSBtYXkgb3ZlcnJpZGUgaXQgaW4gYQorICAgICAgICBzdWJjbGFzcyB0byBwZXJmb3JtIGFueSBvdGhlciByZXF1aXJlZCB2YWxpZGF0aW9uIG9mIHRoZSBmZWF0dXJlCisgICAgICAgIGFnYWluc3QgYSB0YXJnZXQgZGlzdHJpYnV0aW9uLgorICAgICAgICAiIiIKKworICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLnJlbW92ZToKKyAgICAgICAgICAgIGlmIG5vdCBkaXN0Lmhhc19jb250ZW50c19mb3IoaXRlbSk6CisgICAgICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzU2V0dXBFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIiVzIHdhbnRzIHRvIGJlIGFibGUgdG8gcmVtb3ZlICVzLCBidXQgdGhlIGRpc3RyaWJ1dGlvbiIKKyAgICAgICAgICAgICAgICAgICAgIiBkb2Vzbid0IGNvbnRhaW4gYW55IHBhY2thZ2VzIG9yIG1vZHVsZXMgdW5kZXIgJXMiCisgICAgICAgICAgICAgICAgICAgICUgKHNlbGYuZGVzY3JpcHRpb24sIGl0ZW0sIGl0ZW0pCisgICAgICAgICAgICAgICAgKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvZXh0ZW5zaW9uLnB5IGIvTGliL3NldHVwdG9vbHMvZXh0ZW5zaW9uLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmY2Y1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy9leHRlbnNpb24ucHkKQEAgLTAsMCArMSwzNSBAQAorZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRXh0ZW5zaW9uIGFzIF9FeHRlbnNpb24KK2Zyb20gZGlzdCBpbXBvcnQgX2dldF91bnBhdGNoZWQKK19FeHRlbnNpb24gPSBfZ2V0X3VucGF0Y2hlZChfRXh0ZW5zaW9uKQorCit0cnk6CisgICAgZnJvbSBQeXJleC5EaXN0dXRpbHMuYnVpbGRfZXh0IGltcG9ydCBidWlsZF9leHQKK2V4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICBoYXZlX3B5cmV4ID0gRmFsc2UKK2Vsc2U6CisgICAgaGF2ZV9weXJleCA9IFRydWUKKworCitjbGFzcyBFeHRlbnNpb24oX0V4dGVuc2lvbik6CisgICAgIiIiRXh0ZW5zaW9uIHRoYXQgdXNlcyAnLmMnIGZpbGVzIGluIHBsYWNlIG9mICcucHl4JyBmaWxlcyIiIgorCisgICAgaWYgbm90IGhhdmVfcHlyZXg6CisgICAgICAgICMgY29udmVydCAucHl4IGV4dGVuc2lvbnMgdG8gLmMKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsKmFyZ3MsKiprdyk6CisgICAgICAgICAgICBfRXh0ZW5zaW9uLl9faW5pdF9fKHNlbGYsKmFyZ3MsKiprdykKKyAgICAgICAgICAgIHNvdXJjZXMgPSBbXQorICAgICAgICAgICAgZm9yIHMgaW4gc2VsZi5zb3VyY2VzOgorICAgICAgICAgICAgICAgIGlmIHMuZW5kc3dpdGgoJy5weXgnKToKKyAgICAgICAgICAgICAgICAgICAgc291cmNlcy5hcHBlbmQoc1s6LTNdKydjJykKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzb3VyY2VzLmFwcGVuZChzKQorICAgICAgICAgICAgc2VsZi5zb3VyY2VzID0gc291cmNlcworCitjbGFzcyBMaWJyYXJ5KEV4dGVuc2lvbik6CisgICAgIiIiSnVzdCBsaWtlIGEgcmVndWxhciBFeHRlbnNpb24sIGJ1dCBidWlsdCBhcyBhIGxpYnJhcnkgaW5zdGVhZCIiIgorCitpbXBvcnQgc3lzLCBkaXN0dXRpbHMuY29yZSwgZGlzdHV0aWxzLmV4dGVuc2lvbgorZGlzdHV0aWxzLmNvcmUuRXh0ZW5zaW9uID0gRXh0ZW5zaW9uCitkaXN0dXRpbHMuZXh0ZW5zaW9uLkV4dGVuc2lvbiA9IEV4dGVuc2lvbgoraWYgJ2Rpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCcgaW4gc3lzLm1vZHVsZXM6CisgICAgc3lzLm1vZHVsZXNbJ2Rpc3R1dGlscy5jb21tYW5kLmJ1aWxkX2V4dCddLkV4dGVuc2lvbiA9IEV4dGVuc2lvbgpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvZ3VpLmV4ZSBiL0xpYi9zZXR1cHRvb2xzL2d1aS5leGUKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjNmZjM1ZgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL2d1aS5leGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvcGFja2FnZV9pbmRleC5weSBiL0xpYi9zZXR1cHRvb2xzL3BhY2thZ2VfaW5kZXgucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTA3ZTIyMgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL3BhY2thZ2VfaW5kZXgucHkKQEAgLTAsMCArMSw2NzQgQEAKKyIiIlB5UEkgYW5kIGRpcmVjdCBwYWNrYWdlIGRvd25sb2FkaW5nIiIiCisKK2ltcG9ydCBzeXMsIG9zLnBhdGgsIHJlLCB1cmxwYXJzZSwgdXJsbGliMiwgc2h1dGlsLCByYW5kb20sIHNvY2tldAorZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCAqCitmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCitmcm9tIGRpc3R1dGlscy5lcnJvcnMgaW1wb3J0IERpc3R1dGlsc0Vycm9yCitmcm9tIG1kNSBpbXBvcnQgbWQ1Citmcm9tIGZubWF0Y2ggaW1wb3J0IHRyYW5zbGF0ZQorCitFR0dfRlJBR01FTlQgPSByZS5jb21waWxlKHInXmVnZz0oWy1BLVphLXowLTlfLl0rKSQnKQorSFJFRiA9IHJlLmNvbXBpbGUoIiIiaHJlZlxccyo9XFxzKlsnIl0/KFteJyI+IF0rKSIiIiwgcmUuSSkKKyMgdGhpcyBpcyBoZXJlIHRvIGZpeCBlbWFjcycgY3J1ZGR5IGJyb2tlbiBzeW50YXggaGlnaGxpZ2h0aW5nCitQWVBJX01ENSA9IHJlLmNvbXBpbGUoCisgICAgJzxhIGhyZWY9IihbXiIjXSspIj4oW148XSspPC9hPlxuXHMrXFwoPGEgaHJlZj0iW14/XStcPzphY3Rpb249c2hvd19tZDUnCisgICAgJyZhbXA7ZGlnZXN0PShbMC05YS1mXXszMn0pIj5tZDU8L2E+XFwpJworKQorCitVUkxfU0NIRU1FID0gcmUuY29tcGlsZSgnKFstKy5hLXowLTldezIsfSk6JyxyZS5JKS5tYXRjaAorRVhURU5TSU9OUyA9ICIudGFyLmd6IC50YXIuYnoyIC50YXIgLnppcCAudGd6Ii5zcGxpdCgpCisKK19fYWxsX18gPSBbCisgICAgJ1BhY2thZ2VJbmRleCcsICdkaXN0cm9zX2Zvcl91cmwnLCAncGFyc2VfYmRpc3Rfd2luaW5zdCcsCisgICAgJ2ludGVycHJldF9kaXN0cm9fbmFtZScsCitdCisKKworZGVmIHBhcnNlX2JkaXN0X3dpbmluc3QobmFtZSk6CisgICAgIiIiUmV0dXJuIChiYXNlLHB5dmVyc2lvbikgb3IgKE5vbmUsTm9uZSkgZm9yIHBvc3NpYmxlIC5leGUgbmFtZSIiIgorCisgICAgbG93ZXIgPSBuYW1lLmxvd2VyKCkKKyAgICBiYXNlLCBweV92ZXIgPSBOb25lLCBOb25lCisKKyAgICBpZiBsb3dlci5lbmRzd2l0aCgnLmV4ZScpOgorICAgICAgICBpZiBsb3dlci5lbmRzd2l0aCgnLndpbjMyLmV4ZScpOgorICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0xMF0KKyAgICAgICAgZWxpZiBsb3dlci5zdGFydHN3aXRoKCcud2luMzItcHknLC0xNik6CisgICAgICAgICAgICBweV92ZXIgPSBuYW1lWy03Oi00XQorICAgICAgICAgICAgYmFzZSA9IG5hbWVbOi0xNl0KKworICAgIHJldHVybiBiYXNlLHB5X3ZlcgorCitkZWYgZWdnX2luZm9fZm9yX3VybCh1cmwpOgorICAgIHNjaGVtZSwgc2VydmVyLCBwYXRoLCBwYXJhbWV0ZXJzLCBxdWVyeSwgZnJhZ21lbnQgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmwpCisgICAgYmFzZSA9IHVybGxpYjIudW5xdW90ZShwYXRoLnNwbGl0KCcvJylbLTFdKQorICAgIGlmICcjJyBpbiBiYXNlOiBiYXNlLCBmcmFnbWVudCA9IGJhc2Uuc3BsaXQoJyMnLDEpCisgICAgcmV0dXJuIGJhc2UsZnJhZ21lbnQKKworZGVmIGRpc3Ryb3NfZm9yX3VybCh1cmwsIG1ldGFkYXRhPU5vbmUpOgorICAgICIiIllpZWxkIGVnZyBvciBzb3VyY2UgZGlzdHJpYnV0aW9uIG9iamVjdHMgdGhhdCBtaWdodCBiZSBmb3VuZCBhdCBhIFVSTCIiIgorICAgIGJhc2UsIGZyYWdtZW50ID0gZWdnX2luZm9fZm9yX3VybCh1cmwpCisgICAgZGlzdHMgPSBkaXN0cm9zX2Zvcl9sb2NhdGlvbih1cmwsIGJhc2UsIG1ldGFkYXRhKQorICAgIGlmIGZyYWdtZW50IGFuZCBub3QgZGlzdHM6CisgICAgICAgIG1hdGNoID0gRUdHX0ZSQUdNRU5ULm1hdGNoKGZyYWdtZW50KQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIHJldHVybiBpbnRlcnByZXRfZGlzdHJvX25hbWUoCisgICAgICAgICAgICAgICAgdXJsLCBtYXRjaC5ncm91cCgxKSwgbWV0YWRhdGEsIHByZWNlZGVuY2UgPSBDSEVDS09VVF9ESVNUCisgICAgICAgICAgICApCisgICAgcmV0dXJuIGRpc3RzCisKK2RlZiBkaXN0cm9zX2Zvcl9sb2NhdGlvbihsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhPU5vbmUpOgorICAgICIiIllpZWxkIGVnZyBvciBzb3VyY2UgZGlzdHJpYnV0aW9uIG9iamVjdHMgYmFzZWQgb24gYmFzZW5hbWUiIiIKKyAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aCgnLmVnZy56aXAnKToKKyAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVs6LTRdICAgICMgc3RyaXAgdGhlIC56aXAKKyAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aCgnLmVnZycpOiAgICMgb25seSBvbmUsIHVuYW1iaWd1b3VzIGludGVycHJldGF0aW9uCisgICAgICAgIHJldHVybiBbRGlzdHJpYnV0aW9uLmZyb21fbG9jYXRpb24obG9jYXRpb24sIGJhc2VuYW1lLCBtZXRhZGF0YSldCisKKyAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aCgnLmV4ZScpOgorICAgICAgICB3aW5fYmFzZSwgcHlfdmVyID0gcGFyc2VfYmRpc3Rfd2luaW5zdChiYXNlbmFtZSkKKyAgICAgICAgaWYgd2luX2Jhc2UgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKAorICAgICAgICAgICAgICAgIGxvY2F0aW9uLCB3aW5fYmFzZSwgbWV0YWRhdGEsIHB5X3ZlciwgQklOQVJZX0RJU1QsICJ3aW4zMiIKKyAgICAgICAgICAgICkKKworICAgICMgVHJ5IHNvdXJjZSBkaXN0cm8gZXh0ZW5zaW9ucyAoLnppcCwgLnRneiwgZXRjLikKKyAgICAjCisgICAgZm9yIGV4dCBpbiBFWFRFTlNJT05TOgorICAgICAgICBpZiBiYXNlbmFtZS5lbmRzd2l0aChleHQpOgorICAgICAgICAgICAgYmFzZW5hbWUgPSBiYXNlbmFtZVs6LWxlbihleHQpXQorICAgICAgICAgICAgcmV0dXJuIGludGVycHJldF9kaXN0cm9fbmFtZShsb2NhdGlvbiwgYmFzZW5hbWUsIG1ldGFkYXRhKQorICAgIHJldHVybiBbXSAgIyBubyBleHRlbnNpb24gbWF0Y2hlZAorCisKK2RlZiBkaXN0cm9zX2Zvcl9maWxlbmFtZShmaWxlbmFtZSwgbWV0YWRhdGE9Tm9uZSk6CisgICAgIiIiWWllbGQgcG9zc2libGUgZWdnIG9yIHNvdXJjZSBkaXN0cmlidXRpb24gb2JqZWN0cyBiYXNlZCBvbiBhIGZpbGVuYW1lIiIiCisgICAgcmV0dXJuIGRpc3Ryb3NfZm9yX2xvY2F0aW9uKAorICAgICAgICBub3JtYWxpemVfcGF0aChmaWxlbmFtZSksIG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpLCBtZXRhZGF0YQorICAgICkKKworCitkZWYgaW50ZXJwcmV0X2Rpc3Ryb19uYW1lKGxvY2F0aW9uLCBiYXNlbmFtZSwgbWV0YWRhdGEsCisgICAgcHlfdmVyc2lvbj1Ob25lLCBwcmVjZWRlbmNlPVNPVVJDRV9ESVNULCBwbGF0Zm9ybT1Ob25lCispOgorICAgICIiIkdlbmVyYXRlIGFsdGVybmF0aXZlIGludGVycHJldGF0aW9ucyBvZiBhIHNvdXJjZSBkaXN0cm8gbmFtZQorCisgICAgTm90ZTogaWYgYGxvY2F0aW9uYCBpcyBhIGZpbGVzeXN0ZW0gZmlsZW5hbWUsIHlvdSBzaG91bGQgY2FsbAorICAgIGBgcGtnX3Jlc291cmNlcy5ub3JtYWxpemVfcGF0aCgpYGAgb24gaXQgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhpcworICAgIHJvdXRpbmUhCisgICAgIiIiCisKKyAgICAjIEdlbmVyYXRlIGFsdGVybmF0aXZlIGludGVycHJldGF0aW9ucyBvZiBhIHNvdXJjZSBkaXN0cm8gbmFtZQorICAgICMgQmVjYXVzZSBzb21lIHBhY2thZ2VzIGFyZSBhbWJpZ3VvdXMgYXMgdG8gbmFtZS92ZXJzaW9ucyBzcGxpdAorICAgICMgZS5nLiAiYWRucy1weXRob24tMS4xLjAiLCAiZWdlbml4LW14LWNvbW1lcmNpYWwiLCBldGMuCisgICAgIyBTbywgd2UgZ2VuZXJhdGUgZWFjaCBwb3NzaWJsZSBpbnRlcmVwcmV0YXRpb24gKGUuZy4gImFkbnMsIHB5dGhvbi0xLjEuMCIKKyAgICAjICJhZG5zLXB5dGhvbiwgMS4xLjAiLCBhbmQgImFkbnMtcHl0aG9uLTEuMS4wLCBubyB2ZXJzaW9uIikuICBJbiBwcmFjdGljZSwKKyAgICAjIHRoZSBzcHVyaW91cyBpbnRlcnByZXRhdGlvbnMgc2hvdWxkIGJlIGlnbm9yZWQsIGJlY2F1c2UgaW4gdGhlIGV2ZW50CisgICAgIyB0aGVyZSdzIGFsc28gYW4gImFkbnMiIHBhY2thZ2UsIHRoZSBzcHVyaW91cyAicHl0aG9uLTEuMS4wIiB2ZXJzaW9uIHdpbGwKKyAgICAjIGNvbXBhcmUgbG93ZXIgdGhhbiBhbnkgbnVtZXJpYyB2ZXJzaW9uIG51bWJlciwgYW5kIGlzIHRoZXJlZm9yZSB1bmxpa2VseQorICAgICMgdG8gbWF0Y2ggYSByZXF1ZXN0IGZvciBpdC4gIEl0J3Mgc3RpbGwgYSBwb3RlbnRpYWwgcHJvYmxlbSwgdGhvdWdoLCBhbmQKKyAgICAjIGluIHRoZSBsb25nIHJ1biBQeVBJIGFuZCB0aGUgZGlzdHV0aWxzIHNob3VsZCBnbyBmb3IgInNhZmUiIG5hbWVzIGFuZAorICAgICMgdmVyc2lvbnMgaW4gZGlzdHJpYnV0aW9uIGFyY2hpdmUgbmFtZXMgKHNkaXN0IGFuZCBiZGlzdCkuCisKKyAgICBwYXJ0cyA9IGJhc2VuYW1lLnNwbGl0KCctJykKKyAgICBmb3IgcCBpbiByYW5nZSgxLGxlbihwYXJ0cykrMSk6CisgICAgICAgIHlpZWxkIERpc3RyaWJ1dGlvbigKKyAgICAgICAgICAgIGxvY2F0aW9uLCBtZXRhZGF0YSwgJy0nLmpvaW4ocGFydHNbOnBdKSwgJy0nLmpvaW4ocGFydHNbcDpdKSwKKyAgICAgICAgICAgIHB5X3ZlcnNpb249cHlfdmVyc2lvbiwgcHJlY2VkZW5jZSA9IHByZWNlZGVuY2UsCisgICAgICAgICAgICBwbGF0Zm9ybSA9IHBsYXRmb3JtCisgICAgICAgICkKKworCisKKworCitjbGFzcyBQYWNrYWdlSW5kZXgoRW52aXJvbm1lbnQpOgorICAgICIiIkEgZGlzdHJpYnV0aW9uIGluZGV4IHRoYXQgc2NhbnMgd2ViIHBhZ2VzIGZvciBkb3dubG9hZCBVUkxzIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZixpbmRleF91cmw9Imh0dHA6Ly93d3cucHl0aG9uLm9yZy9weXBpIixob3N0cz0oJyonLCksKmFyZ3MsKiprdyk6CisgICAgICAgIEVudmlyb25tZW50Ll9faW5pdF9fKHNlbGYsKmFyZ3MsKiprdykKKyAgICAgICAgc2VsZi5pbmRleF91cmwgPSBpbmRleF91cmwgKyAiLyJbOm5vdCBpbmRleF91cmwuZW5kc3dpdGgoJy8nKV0KKyAgICAgICAgc2VsZi5zY2FubmVkX3VybHMgPSB7fQorICAgICAgICBzZWxmLmZldGNoZWRfdXJscyA9IHt9CisgICAgICAgIHNlbGYucGFja2FnZV9wYWdlcyA9IHt9CisgICAgICAgIHNlbGYuYWxsb3dzID0gcmUuY29tcGlsZSgnfCcuam9pbihtYXAodHJhbnNsYXRlLGhvc3RzKSkpLm1hdGNoCisgICAgICAgIHNlbGYudG9fc2NhbiA9IFtdCisKKyAgICBkZWYgcHJvY2Vzc191cmwoc2VsZiwgdXJsLCByZXRyaWV2ZT1GYWxzZSk6CisgICAgICAgICIiIkV2YWx1YXRlIGEgVVJMIGFzIGEgcG9zc2libGUgZG93bmxvYWQsIGFuZCBtYXliZSByZXRyaWV2ZSBpdCIiIgorICAgICAgICB1cmwgPSBmaXhfc2ZfdXJsKHVybCkKKyAgICAgICAgaWYgdXJsIGluIHNlbGYuc2Nhbm5lZF91cmxzIGFuZCBub3QgcmV0cmlldmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5zY2FubmVkX3VybHNbdXJsXSA9IFRydWUKKyAgICAgICAgaWYgbm90IFVSTF9TQ0hFTUUodXJsKToKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc19maWxlbmFtZSh1cmwpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRpc3RzID0gbGlzdChkaXN0cm9zX2Zvcl91cmwodXJsKSkKKyAgICAgICAgICAgIGlmIGRpc3RzOgorICAgICAgICAgICAgICAgIGlmIG5vdCBzZWxmLnVybF9vayh1cmwpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBzZWxmLmRlYnVnKCJGb3VuZCBsaW5rOiAlcyIsIHVybCkKKworICAgICAgICBpZiBkaXN0cyBvciBub3QgcmV0cmlldmUgb3IgdXJsIGluIHNlbGYuZmV0Y2hlZF91cmxzOgorICAgICAgICAgICAgbWFwKHNlbGYuYWRkLCBkaXN0cykKKyAgICAgICAgICAgIHJldHVybiAgIyBkb24ndCBuZWVkIHRoZSBhY3R1YWwgcGFnZQorCisgICAgICAgIGlmIG5vdCBzZWxmLnVybF9vayh1cmwpOgorICAgICAgICAgICAgc2VsZi5mZXRjaGVkX3VybHNbdXJsXSA9IFRydWUKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHNlbGYuaW5mbygiUmVhZGluZyAlcyIsIHVybCkKKyAgICAgICAgZiA9IHNlbGYub3Blbl91cmwodXJsKQorICAgICAgICBzZWxmLmZldGNoZWRfdXJsc1t1cmxdID0gc2VsZi5mZXRjaGVkX3VybHNbZi51cmxdID0gVHJ1ZQorCisKKyAgICAgICAgaWYgJ2h0bWwnIG5vdCBpbiBmLmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddLmxvd2VyKCk6CisgICAgICAgICAgICBmLmNsb3NlKCkgICAjIG5vdCBodG1sLCB3ZSBjYW4ndCBwcm9jZXNzIGl0CisgICAgICAgICAgICByZXR1cm4KKworICAgICAgICBiYXNlID0gZi51cmwgICAgICMgaGFuZGxlIHJlZGlyZWN0cworICAgICAgICBwYWdlID0gZi5yZWFkKCkKKyAgICAgICAgZi5jbG9zZSgpCisgICAgICAgIGlmIHVybC5zdGFydHN3aXRoKHNlbGYuaW5kZXhfdXJsKToKKyAgICAgICAgICAgIHBhZ2UgPSBzZWxmLnByb2Nlc3NfaW5kZXgodXJsLCBwYWdlKQorCisgICAgICAgIGZvciBtYXRjaCBpbiBIUkVGLmZpbmRpdGVyKHBhZ2UpOgorICAgICAgICAgICAgbGluayA9IHVybHBhcnNlLnVybGpvaW4oYmFzZSwgbWF0Y2guZ3JvdXAoMSkpCisgICAgICAgICAgICBzZWxmLnByb2Nlc3NfdXJsKGxpbmspCisKKyAgICBkZWYgcHJvY2Vzc19maWxlbmFtZShzZWxmLCBmbiwgbmVzdGVkPUZhbHNlKToKKyAgICAgICAgIyBwcm9jZXNzIGZpbGVuYW1lcyBvciBkaXJlY3RvcmllcworICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZm4pOgorICAgICAgICAgICAgc2VsZi53YXJuKCJOb3QgZm91bmQ6ICVzIiwgdXJsKQorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgaWYgb3MucGF0aC5pc2RpcihmbikgYW5kIG5vdCBuZXN0ZWQ6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5yZWFscGF0aChmbikKKyAgICAgICAgICAgIGZvciBpdGVtIGluIG9zLmxpc3RkaXIocGF0aCk6CisgICAgICAgICAgICAgICAgc2VsZi5wcm9jZXNzX2ZpbGVuYW1lKG9zLnBhdGguam9pbihwYXRoLGl0ZW0pLCBUcnVlKQorCisgICAgICAgIGRpc3RzID0gZGlzdHJvc19mb3JfZmlsZW5hbWUoZm4pCisgICAgICAgIGlmIGRpc3RzOgorICAgICAgICAgICAgc2VsZi5kZWJ1ZygiRm91bmQ6ICVzIiwgZm4pCisgICAgICAgICAgICBtYXAoc2VsZi5hZGQsIGRpc3RzKQorCisgICAgZGVmIHVybF9vayhzZWxmLCB1cmwsIGZhdGFsPUZhbHNlKToKKyAgICAgICAgaWYgc2VsZi5hbGxvd3ModXJscGFyc2UudXJscGFyc2UodXJsKVsxXSk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBtc2cgPSAiXG5MaW5rIHRvICUgcyAqKipCTE9DS0VEKioqIGJ5IC0tYWxsb3ctaG9zdHNcbiIKKyAgICAgICAgaWYgZmF0YWw6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcihtc2cgJSB1cmwpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndhcm4obXNnLCB1cmwpCisKKworCisgICAgZGVmIHByb2Nlc3NfaW5kZXgoc2VsZix1cmwscGFnZSk6CisgICAgICAgICIiIlByb2Nlc3MgdGhlIGNvbnRlbnRzIG9mIGEgUHlQSSBwYWdlIiIiCisgICAgICAgIGRlZiBzY2FuKGxpbmspOgorICAgICAgICAgICAgIyBQcm9jZXNzIGEgVVJMIHRvIHNlZSBpZiBpdCdzIGZvciBhIHBhY2thZ2UgcGFnZQorICAgICAgICAgICAgaWYgbGluay5zdGFydHN3aXRoKHNlbGYuaW5kZXhfdXJsKToKKyAgICAgICAgICAgICAgICBwYXJ0cyA9IG1hcCgKKyAgICAgICAgICAgICAgICAgICAgdXJsbGliMi51bnF1b3RlLCBsaW5rW2xlbihzZWxmLmluZGV4X3VybCk6XS5zcGxpdCgnLycpCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIGlmIGxlbihwYXJ0cyk9PTI6CisgICAgICAgICAgICAgICAgICAgICMgaXQncyBhIHBhY2thZ2UgcGFnZSwgc2FuaXRpemUgYW5kIGluZGV4IGl0CisgICAgICAgICAgICAgICAgICAgIHBrZyA9IHNhZmVfbmFtZShwYXJ0c1swXSkKKyAgICAgICAgICAgICAgICAgICAgdmVyID0gc2FmZV92ZXJzaW9uKHBhcnRzWzFdKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VfcGFnZXMuc2V0ZGVmYXVsdChwa2cubG93ZXIoKSx7fSlbbGlua10gPSBUcnVlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b19maWxlbmFtZShwa2cpLCB0b19maWxlbmFtZSh2ZXIpCisgICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQorCisgICAgICAgIGlmIHVybD09c2VsZi5pbmRleF91cmwgb3IgJ0luZGV4IG9mIFBhY2thZ2VzPC90aXRsZT4nIGluIHBhZ2U6CisgICAgICAgICAgICAjIHByb2Nlc3MgYW4gaW5kZXggcGFnZSBpbnRvIHRoZSBwYWNrYWdlLXBhZ2UgaW5kZXgKKyAgICAgICAgICAgIGZvciBtYXRjaCBpbiBIUkVGLmZpbmRpdGVyKHBhZ2UpOgorICAgICAgICAgICAgICAgIHNjYW4oIHVybHBhcnNlLnVybGpvaW4odXJsLCBtYXRjaC5ncm91cCgxKSkgKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGtnLHZlciA9IHNjYW4odXJsKSAgICMgZW5zdXJlIHRoaXMgcGFnZSBpcyBpbiB0aGUgcGFnZSBpbmRleAorICAgICAgICAgICAgIyBwcm9jZXNzIGluZGl2aWR1YWwgcGFja2FnZSBwYWdlCisgICAgICAgICAgICBmb3IgdGFnIGluICgiPHRoPkhvbWUgUGFnZSIsICI8dGg+RG93bmxvYWQgVVJMIik6CisgICAgICAgICAgICAgICAgcG9zID0gcGFnZS5maW5kKHRhZykKKyAgICAgICAgICAgICAgICBpZiBwb3MhPS0xOgorICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IEhSRUYuc2VhcmNoKHBhZ2UscG9zKQorICAgICAgICAgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICAgICAgICAgICMgUHJvY2VzcyB0aGUgZm91bmQgVVJMCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdfdXJsID0gdXJscGFyc2UudXJsam9pbih1cmwsIG1hdGNoLmdyb3VwKDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwgZnJhZyA9IGVnZ19pbmZvX2Zvcl91cmwobmV3X3VybCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIGJhc2UuZW5kc3dpdGgoJy5weScpIGFuZCBub3QgZnJhZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBwa2cgYW5kIHZlcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X3VybCs9JyNlZ2c9JXMtJXMnICUgKHBrZyx2ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5uZWVkX3ZlcnNpb25faW5mbyh1cmwpCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnNjYW5fdXJsKG5ld191cmwpCisgICAgICAgIHJldHVybiBQWVBJX01ENS5zdWIoCisgICAgICAgICAgICBsYW1iZGEgbTogJzxhIGhyZWY9IiVzI21kNT0lcyI+JXM8L2E+JyAlIG0uZ3JvdXAoMSwzLDIpLCBwYWdlCisgICAgICAgICkKKworICAgIGRlZiBuZWVkX3ZlcnNpb25faW5mbyhzZWxmLCB1cmwpOgorICAgICAgICBzZWxmLnNjYW5fYWxsKAorICAgICAgICAgICAgIlBhZ2UgYXQgJXMgbGlua3MgdG8gLnB5IGZpbGUocykgd2l0aG91dCB2ZXJzaW9uIGluZm87IGFuIGluZGV4ICIKKyAgICAgICAgICAgICJzY2FuIGlzIHJlcXVpcmVkLiIsIHVybAorICAgICAgICApCisKKyAgICBkZWYgc2Nhbl9hbGwoc2VsZiwgbXNnPU5vbmUsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5pbmRleF91cmwgbm90IGluIHNlbGYuZmV0Y2hlZF91cmxzOgorICAgICAgICAgICAgaWYgbXNnOiBzZWxmLndhcm4obXNnLCphcmdzKQorICAgICAgICAgICAgc2VsZi53YXJuKAorICAgICAgICAgICAgICAgICJTY2FubmluZyBpbmRleCBvZiBhbGwgcGFja2FnZXMgKHRoaXMgbWF5IHRha2UgYSB3aGlsZSkiCisgICAgICAgICAgICApCisgICAgICAgIHNlbGYuc2Nhbl91cmwoc2VsZi5pbmRleF91cmwpCisKKyAgICBkZWYgZmluZF9wYWNrYWdlcyhzZWxmLCByZXF1aXJlbWVudCk6CisgICAgICAgIHNlbGYuc2Nhbl91cmwoc2VsZi5pbmRleF91cmwgKyByZXF1aXJlbWVudC51bnNhZmVfbmFtZSsnLycpCisKKyAgICAgICAgaWYgbm90IHNlbGYucGFja2FnZV9wYWdlcy5nZXQocmVxdWlyZW1lbnQua2V5KToKKyAgICAgICAgICAgICMgRmFsbCBiYWNrIHRvIHNhZmUgdmVyc2lvbiBvZiB0aGUgbmFtZQorICAgICAgICAgICAgc2VsZi5zY2FuX3VybChzZWxmLmluZGV4X3VybCArIHJlcXVpcmVtZW50LnByb2plY3RfbmFtZSsnLycpCisKKyAgICAgICAgaWYgbm90IHNlbGYucGFja2FnZV9wYWdlcy5nZXQocmVxdWlyZW1lbnQua2V5KToKKyAgICAgICAgICAgICMgV2UgY291bGRuJ3QgZmluZCB0aGUgdGFyZ2V0IHBhY2thZ2UsIHNvIHNlYXJjaCB0aGUgaW5kZXggcGFnZSB0b28KKyAgICAgICAgICAgIHNlbGYud2FybigKKyAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBpbmRleCBwYWdlIGZvciAlciAobWF5YmUgbWlzc3BlbGxlZD8pIiwKKyAgICAgICAgICAgICAgICByZXF1aXJlbWVudC51bnNhZmVfbmFtZQorICAgICAgICAgICAgKQorICAgICAgICAgICAgc2VsZi5zY2FuX2FsbCgpCisKKyAgICAgICAgZm9yIHVybCBpbiBzZWxmLnBhY2thZ2VfcGFnZXMuZ2V0KHJlcXVpcmVtZW50LmtleSwoKSk6CisgICAgICAgICAgICAjIHNjYW4gZWFjaCBwYWdlIHRoYXQgbWlnaHQgYmUgcmVsYXRlZCB0byB0aGUgZGVzaXJlZCBwYWNrYWdlCisgICAgICAgICAgICBzZWxmLnNjYW5fdXJsKHVybCkKKworICAgIGRlZiBvYnRhaW4oc2VsZiwgcmVxdWlyZW1lbnQsIGluc3RhbGxlcj1Ob25lKToKKyAgICAgICAgc2VsZi5wcmVzY2FuKCk7IHNlbGYuZmluZF9wYWNrYWdlcyhyZXF1aXJlbWVudCkKKyAgICAgICAgZm9yIGRpc3QgaW4gc2VsZltyZXF1aXJlbWVudC5rZXldOgorICAgICAgICAgICAgaWYgZGlzdCBpbiByZXF1aXJlbWVudDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZGlzdAorICAgICAgICAgICAgc2VsZi5kZWJ1ZygiJXMgZG9lcyBub3QgbWF0Y2ggJXMiLCByZXF1aXJlbWVudCwgZGlzdCkKKyAgICAgICAgcmV0dXJuIHN1cGVyKFBhY2thZ2VJbmRleCwgc2VsZikub2J0YWluKHJlcXVpcmVtZW50LGluc3RhbGxlcikKKworICAgIGRlZiBjaGVja19tZDUoc2VsZiwgY3MsIGluZm8sIGZpbGVuYW1lLCB0ZnApOgorICAgICAgICBpZiByZS5tYXRjaCgnbWQ1PVswLTlhLWZdezMyfSQnLCBpbmZvKToKKyAgICAgICAgICAgIHNlbGYuZGVidWcoIlZhbGlkYXRpbmcgbWQ1IGNoZWNrc3VtIGZvciAlcyIsIGZpbGVuYW1lKQorICAgICAgICAgICAgaWYgY3MuaGV4ZGlnZXN0KCk8PmluZm9bNDpdOgorICAgICAgICAgICAgICAgIHRmcC5jbG9zZSgpCisgICAgICAgICAgICAgICAgb3MudW5saW5rKGZpbGVuYW1lKQorICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAorICAgICAgICAgICAgICAgICAgICAiTUQ1IHZhbGlkYXRpb24gZmFpbGVkIGZvciAiK29zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpKworICAgICAgICAgICAgICAgICAgICAiOyBwb3NzaWJsZSBkb3dubG9hZCBwcm9ibGVtPyIKKyAgICAgICAgICAgICAgICApCisKKyAgICBkZWYgYWRkX2ZpbmRfbGlua3Moc2VsZiwgdXJscyk6CisgICAgICAgICIiIkFkZCBgdXJsc2AgdG8gdGhlIGxpc3QgdGhhdCB3aWxsIGJlIHByZXNjYW5uZWQgZm9yIHNlYXJjaGVzIiIiCisgICAgICAgIGZvciB1cmwgaW4gdXJsczoKKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICBzZWxmLnRvX3NjYW4gaXMgTm9uZSAgICAgICAgIyBpZiB3ZSBoYXZlIGFscmVhZHkgImdvbmUgb25saW5lIgorICAgICAgICAgICAgICAgIG9yIG5vdCBVUkxfU0NIRU1FKHVybCkgICAgICAjIG9yIGl0J3MgYSBsb2NhbCBmaWxlL2RpcmVjdG9yeQorICAgICAgICAgICAgICAgIG9yIHVybC5zdGFydHN3aXRoKCdmaWxlOicpCisgICAgICAgICAgICAgICAgb3IgbGlzdChkaXN0cm9zX2Zvcl91cmwodXJsKSkgICAjIG9yIGEgZGlyZWN0IHBhY2thZ2UgbGluaworICAgICAgICAgICAgKToKKyAgICAgICAgICAgICAgICAjIHRoZW4gZ28gYWhlYWQgYW5kIHByb2Nlc3MgaXQgbm93CisgICAgICAgICAgICAgICAgc2VsZi5zY2FuX3VybCh1cmwpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgb3RoZXJ3aXNlLCBkZWZlciByZXRyaWV2YWwgdGlsbCBsYXRlcgorICAgICAgICAgICAgICAgIHNlbGYudG9fc2Nhbi5hcHBlbmQodXJsKQorCisgICAgZGVmIHByZXNjYW4oc2VsZik6CisgICAgICAgICIiIlNjYW4gdXJscyBzY2hlZHVsZWQgZm9yIHByZXNjYW5uaW5nIChlLmcuIC0tZmluZC1saW5rcykiIiIKKyAgICAgICAgaWYgc2VsZi50b19zY2FuOgorICAgICAgICAgICAgbWFwKHNlbGYuc2Nhbl91cmwsIHNlbGYudG9fc2NhbikKKyAgICAgICAgc2VsZi50b19zY2FuID0gTm9uZSAgICAgIyBmcm9tIG5vdyBvbiwgZ28gYWhlYWQgYW5kIHByb2Nlc3MgaW1tZWRpYXRlbHkKKworCisKKworCisKKworCisKKworICAgIGRlZiBkb3dubG9hZChzZWxmLCBzcGVjLCB0bXBkaXIpOgorICAgICAgICAiIiJMb2NhdGUgYW5kL29yIGRvd25sb2FkIGBzcGVjYCB0byBgdG1wZGlyYCwgcmV0dXJuaW5nIGEgbG9jYWwgcGF0aAorCisgICAgICAgIGBzcGVjYCBtYXkgYmUgYSBgYFJlcXVpcmVtZW50YGAgb2JqZWN0LCBvciBhIHN0cmluZyBjb250YWluaW5nIGEgVVJMLAorICAgICAgICBhbiBleGlzdGluZyBsb2NhbCBmaWxlbmFtZSwgb3IgYSBwcm9qZWN0L3ZlcnNpb24gcmVxdWlyZW1lbnQgc3BlYworICAgICAgICAoaS5lLiB0aGUgc3RyaW5nIGZvcm0gb2YgYSBgYFJlcXVpcmVtZW50YGAgb2JqZWN0KS4gIElmIGl0IGlzIHRoZSBVUkwKKyAgICAgICAgb2YgYSAucHkgZmlsZSB3aXRoIGFuIHVuYW1iaWd1b3VzIGBgI2VnZz1uYW1lLXZlcnNpb25gYCB0YWcgKGkuZS4sIG9uZQorICAgICAgICB0aGF0IGVzY2FwZXMgYGAtYGAgYXMgYGBfYGAgdGhyb3VnaG91dCksIGEgdHJpdmlhbCBgYHNldHVwLnB5YGAgaXMKKyAgICAgICAgYXV0b21hdGljYWxseSBjcmVhdGVkIGFsb25nc2lkZSB0aGUgZG93bmxvYWRlZCBmaWxlLgorCisgICAgICAgIElmIGBzcGVjYCBpcyBhIGBgUmVxdWlyZW1lbnRgYCBvYmplY3Qgb3IgYSBzdHJpbmcgY29udGFpbmluZyBhCisgICAgICAgIHByb2plY3QvdmVyc2lvbiByZXF1aXJlbWVudCBzcGVjLCB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBsb2NhdGlvbiBvZgorICAgICAgICBhIG1hdGNoaW5nIGRpc3RyaWJ1dGlvbiAocG9zc2libHkgYWZ0ZXIgZG93bmxvYWRpbmcgaXQgdG8gYHRtcGRpcmApLgorICAgICAgICBJZiBgc3BlY2AgaXMgYSBsb2NhbGx5IGV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5IG5hbWUsIGl0IGlzIHNpbXBseQorICAgICAgICByZXR1cm5lZCB1bmNoYW5nZWQuICBJZiBgc3BlY2AgaXMgYSBVUkwsIGl0IGlzIGRvd25sb2FkZWQgdG8gYSBzdWJwYXRoCisgICAgICAgIG9mIGB0bXBkaXJgLCBhbmQgdGhlIGxvY2FsIGZpbGVuYW1lIGlzIHJldHVybmVkLiAgVmFyaW91cyBlcnJvcnMgbWF5IGJlCisgICAgICAgIHJhaXNlZCBpZiBhIHByb2JsZW0gb2NjdXJzIGR1cmluZyBkb3dubG9hZGluZy4KKyAgICAgICAgIiIiCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHNwZWMsUmVxdWlyZW1lbnQpOgorICAgICAgICAgICAgc2NoZW1lID0gVVJMX1NDSEVNRShzcGVjKQorICAgICAgICAgICAgaWYgc2NoZW1lOgorICAgICAgICAgICAgICAgICMgSXQncyBhIHVybCwgZG93bmxvYWQgaXQgdG8gdG1wZGlyCisgICAgICAgICAgICAgICAgZm91bmQgPSBzZWxmLl9kb3dubG9hZF91cmwoc2NoZW1lLmdyb3VwKDEpLCBzcGVjLCB0bXBkaXIpCisgICAgICAgICAgICAgICAgYmFzZSwgZnJhZ21lbnQgPSBlZ2dfaW5mb19mb3JfdXJsKHNwZWMpCisgICAgICAgICAgICAgICAgaWYgYmFzZS5lbmRzd2l0aCgnLnB5Jyk6CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gc2VsZi5nZW5fc2V0dXAoZm91bmQsZnJhZ21lbnQsdG1wZGlyKQorICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZAorICAgICAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhzcGVjKToKKyAgICAgICAgICAgICAgICAjIEV4aXN0aW5nIGZpbGUgb3IgZGlyZWN0b3J5LCBqdXN0IHJldHVybiBpdAorICAgICAgICAgICAgICAgIHJldHVybiBzcGVjCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc3BlYyA9IFJlcXVpcmVtZW50LnBhcnNlKHNwZWMpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIERpc3R1dGlsc0Vycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgIk5vdCBhIFVSTCwgZXhpc3RpbmcgZmlsZSwgb3IgcmVxdWlyZW1lbnQgc3BlYzogJXIiICUKKyAgICAgICAgICAgICAgICAgICAgICAgIChzcGVjLCkKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLmZldGNoX2Rpc3RyaWJ1dGlvbihzcGVjLCB0bXBkaXIpLCdsb2NhdGlvbicsTm9uZSkKKworCisgICAgZGVmIGZldGNoX2Rpc3RyaWJ1dGlvbihzZWxmLAorICAgICAgICByZXF1aXJlbWVudCwgdG1wZGlyLCBmb3JjZV9zY2FuPUZhbHNlLCBzb3VyY2U9RmFsc2UsIGRldmVsb3Bfb2s9RmFsc2UKKyAgICApOgorICAgICAgICAiIiJPYnRhaW4gYSBkaXN0cmlidXRpb24gc3VpdGFibGUgZm9yIGZ1bGZpbGxpbmcgYHJlcXVpcmVtZW50YAorCisgICAgICAgIGByZXF1aXJlbWVudGAgbXVzdCBiZSBhIGBgcGtnX3Jlc291cmNlcy5SZXF1aXJlbWVudGBgIGluc3RhbmNlLgorICAgICAgICBJZiBuZWNlc3NhcnksIG9yIGlmIHRoZSBgZm9yY2Vfc2NhbmAgZmxhZyBpcyBzZXQsIHRoZSByZXF1aXJlbWVudCBpcworICAgICAgICBzZWFyY2hlZCBmb3IgaW4gdGhlIChvbmxpbmUpIHBhY2thZ2UgaW5kZXggYXMgd2VsbCBhcyB0aGUgbG9jYWxseQorICAgICAgICBpbnN0YWxsZWQgcGFja2FnZXMuICBJZiBhIGRpc3RyaWJ1dGlvbiBtYXRjaGluZyBgcmVxdWlyZW1lbnRgIGlzIGZvdW5kLAorICAgICAgICB0aGUgcmV0dXJuZWQgZGlzdHJpYnV0aW9uJ3MgYGBsb2NhdGlvbmBgIGlzIHRoZSB2YWx1ZSB5b3Ugd291bGQgaGF2ZQorICAgICAgICBnb3R0ZW4gZnJvbSBjYWxsaW5nIHRoZSBgYGRvd25sb2FkKClgYCBtZXRob2Qgd2l0aCB0aGUgbWF0Y2hpbmcKKyAgICAgICAgZGlzdHJpYnV0aW9uJ3MgVVJMIG9yIGZpbGVuYW1lLiAgSWYgbm8gbWF0Y2hpbmcgZGlzdHJpYnV0aW9uIGlzIGZvdW5kLAorICAgICAgICBgYE5vbmVgYCBpcyByZXR1cm5lZC4KKworICAgICAgICBJZiB0aGUgYHNvdXJjZWAgZmxhZyBpcyBzZXQsIG9ubHkgc291cmNlIGRpc3RyaWJ1dGlvbnMgYW5kIHNvdXJjZQorICAgICAgICBjaGVja291dCBsaW5rcyB3aWxsIGJlIGNvbnNpZGVyZWQuICBVbmxlc3MgdGhlIGBkZXZlbG9wX29rYCBmbGFnIGlzCisgICAgICAgIHNldCwgZGV2ZWxvcG1lbnQgYW5kIHN5c3RlbSBlZ2dzIChpLmUuLCB0aG9zZSB1c2luZyB0aGUgYGAuZWdnLWluZm9gYAorICAgICAgICBmb3JtYXQpIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgICAgIiIiCisKKyAgICAgICAgIyBwcm9jZXNzIGEgUmVxdWlyZW1lbnQKKyAgICAgICAgc2VsZi5pbmZvKCJTZWFyY2hpbmcgZm9yICVzIiwgcmVxdWlyZW1lbnQpCisgICAgICAgIHNraXBwZWQgPSB7fQorCisgICAgICAgIGRlZiBmaW5kKHJlcSk6CisgICAgICAgICAgICAjIEZpbmQgYSBtYXRjaGluZyBkaXN0cmlidXRpb247IG1heSBiZSBjYWxsZWQgbW9yZSB0aGFuIG9uY2UKKworICAgICAgICAgICAgZm9yIGRpc3QgaW4gc2VsZltyZXEua2V5XToKKworICAgICAgICAgICAgICAgIGlmIGRpc3QucHJlY2VkZW5jZT09REVWRUxPUF9ESVNUIGFuZCBub3QgZGV2ZWxvcF9vazoKKyAgICAgICAgICAgICAgICAgICAgaWYgZGlzdCBub3QgaW4gc2tpcHBlZDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYud2FybigiU2tpcHBpbmcgZGV2ZWxvcG1lbnQgb3Igc3lzdGVtIGVnZzogJXMiLGRpc3QpCisgICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkW2Rpc3RdID0gMQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgICAgICAgICAgaWYgZGlzdCBpbiByZXEgYW5kIChkaXN0LnByZWNlZGVuY2U8PVNPVVJDRV9ESVNUIG9yIG5vdCBzb3VyY2UpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmluZm8oIkJlc3QgbWF0Y2g6ICVzIiwgZGlzdCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3QuY2xvbmUoCisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbj1zZWxmLmRvd25sb2FkKGRpc3QubG9jYXRpb24sIHRtcGRpcikKKyAgICAgICAgICAgICAgICAgICAgKQorCisgICAgICAgIGlmIGZvcmNlX3NjYW46CisgICAgICAgICAgICBzZWxmLnByZXNjYW4oKQorICAgICAgICAgICAgc2VsZi5maW5kX3BhY2thZ2VzKHJlcXVpcmVtZW50KQorCisgICAgICAgIGRpc3QgPSBmaW5kKHJlcXVpcmVtZW50KQorICAgICAgICBpZiBkaXN0IGlzIE5vbmUgYW5kIHNlbGYudG9fc2NhbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYucHJlc2NhbigpCisgICAgICAgICAgICBkaXN0ID0gZmluZChyZXF1aXJlbWVudCkKKworICAgICAgICBpZiBkaXN0IGlzIE5vbmUgYW5kIG5vdCBmb3JjZV9zY2FuOgorICAgICAgICAgICAgc2VsZi5maW5kX3BhY2thZ2VzKHJlcXVpcmVtZW50KQorICAgICAgICAgICAgZGlzdCA9IGZpbmQocmVxdWlyZW1lbnQpCisKKyAgICAgICAgaWYgZGlzdCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi53YXJuKAorICAgICAgICAgICAgICAgICJObyBsb2NhbCBwYWNrYWdlcyBvciBkb3dubG9hZCBsaW5rcyBmb3VuZCBmb3IgJXMlcyIsCisgICAgICAgICAgICAgICAgKHNvdXJjZSBhbmQgImEgc291cmNlIGRpc3RyaWJ1dGlvbiBvZiAiIG9yICIiKSwKKyAgICAgICAgICAgICAgICByZXF1aXJlbWVudCwKKyAgICAgICAgICAgICkKKyAgICAgICAgcmV0dXJuIGRpc3QKKworICAgIGRlZiBmZXRjaChzZWxmLCByZXF1aXJlbWVudCwgdG1wZGlyLCBmb3JjZV9zY2FuPUZhbHNlLCBzb3VyY2U9RmFsc2UpOgorICAgICAgICAiIiJPYnRhaW4gYSBmaWxlIHN1aXRhYmxlIGZvciBmdWxmaWxsaW5nIGByZXF1aXJlbWVudGAKKworICAgICAgICBERVBSRUNBVEVEOyB1c2UgdGhlIGBgZmV0Y2hfZGlzdHJpYnV0aW9uKClgYCBtZXRob2Qgbm93IGluc3RlYWQuICBGb3IKKyAgICAgICAgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhpcyByb3V0aW5lIGlzIGlkZW50aWNhbCBidXQgcmV0dXJucyB0aGUKKyAgICAgICAgYGBsb2NhdGlvbmBgIG9mIHRoZSBkb3dubG9hZGVkIGRpc3RyaWJ1dGlvbiBpbnN0ZWFkIG9mIGEgZGlzdHJpYnV0aW9uCisgICAgICAgIG9iamVjdC4KKyAgICAgICAgIiIiCisgICAgICAgIGRpc3QgPSBzZWxmLmZldGNoX2Rpc3RyaWJ1dGlvbihyZXF1aXJlbWVudCx0bXBkaXIsZm9yY2Vfc2Nhbixzb3VyY2UpCisgICAgICAgIGlmIGRpc3QgaXMgbm90IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gZGlzdC5sb2NhdGlvbgorICAgICAgICByZXR1cm4gTm9uZQorCisKKworCisKKworCisKKyAgICBkZWYgZ2VuX3NldHVwKHNlbGYsIGZpbGVuYW1lLCBmcmFnbWVudCwgdG1wZGlyKToKKyAgICAgICAgbWF0Y2ggPSBFR0dfRlJBR01FTlQubWF0Y2goZnJhZ21lbnQpOyAjaW1wb3J0IHBkYjsgcGRiLnNldF90cmFjZSgpCisgICAgICAgIGRpc3RzID0gbWF0Y2ggYW5kIFtkIGZvciBkIGluCisgICAgICAgICAgICBpbnRlcnByZXRfZGlzdHJvX25hbWUoZmlsZW5hbWUsIG1hdGNoLmdyb3VwKDEpLCBOb25lKSBpZiBkLnZlcnNpb24KKyAgICAgICAgXSBvciBbXQorCisgICAgICAgIGlmIGxlbihkaXN0cyk9PTE6ICAgIyB1bmFtYmlndW91cyBgYCNlZ2dgYCBmcmFnbWVudAorICAgICAgICAgICAgYmFzZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQorCisgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGUgZmlsZSBoYXMgYmVlbiBkb3dubG9hZGVkIHRvIHRoZSB0ZW1wIGRpci4KKyAgICAgICAgICAgIGlmIG9zLnBhdGguZGlybmFtZShmaWxlbmFtZSkgIT0gdG1wZGlyOgorICAgICAgICAgICAgICAgIGRzdCA9IG9zLnBhdGguam9pbih0bXBkaXIsIGJhc2VuYW1lKQorICAgICAgICAgICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgc2FtZWZpbGUKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2FtZWZpbGUoZmlsZW5hbWUsIGRzdCk6CisgICAgICAgICAgICAgICAgICAgIHNodXRpbC5jb3B5MihmaWxlbmFtZSwgZHN0KQorICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZT1kc3QKKworICAgICAgICAgICAgZmlsZSA9IG9wZW4ob3MucGF0aC5qb2luKHRtcGRpciwgJ3NldHVwLnB5JyksICd3JykKKyAgICAgICAgICAgIGZpbGUud3JpdGUoCisgICAgICAgICAgICAgICAgImZyb20gc2V0dXB0b29scyBpbXBvcnQgc2V0dXBcbiIKKyAgICAgICAgICAgICAgICAic2V0dXAobmFtZT0lciwgdmVyc2lvbj0lciwgcHlfbW9kdWxlcz1bJXJdKVxuIgorICAgICAgICAgICAgICAgICUgKAorICAgICAgICAgICAgICAgICAgICBkaXN0c1swXS5wcm9qZWN0X25hbWUsIGRpc3RzWzBdLnZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguc3BsaXRleHQoYmFzZW5hbWUpWzBdCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKQorICAgICAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgICAgICByZXR1cm4gZmlsZW5hbWUKKworICAgICAgICBlbGlmIG1hdGNoOgorICAgICAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoCisgICAgICAgICAgICAgICAgIkNhbid0IHVuYW1iaWd1b3VzbHkgaW50ZXJwcmV0IHByb2plY3QvdmVyc2lvbiBpZGVudGlmaWVyICVyOyAiCisgICAgICAgICAgICAgICAgImFueSBkYXNoZXMgaW4gdGhlIG5hbWUgb3IgdmVyc2lvbiBzaG91bGQgYmUgZXNjYXBlZCB1c2luZyAiCisgICAgICAgICAgICAgICAgInVuZGVyc2NvcmVzLiAlciIgJSAoZnJhZ21lbnQsZGlzdHMpCisgICAgICAgICAgICApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICAgICAiQ2FuJ3QgcHJvY2VzcyBwbGFpbiAucHkgZmlsZXMgd2l0aG91dCBhbiAnI2VnZz1uYW1lLXZlcnNpb24nIgorICAgICAgICAgICAgICAgICIgc3VmZml4IHRvIGVuYWJsZSBhdXRvbWF0aWMgc2V0dXAgc2NyaXB0IGdlbmVyYXRpb24uIgorICAgICAgICAgICAgKQorCisgICAgZGxfYmxvY2tzaXplID0gODE5MgorICAgIGRlZiBfZG93bmxvYWRfdG8oc2VsZiwgdXJsLCBmaWxlbmFtZSk6CisgICAgICAgIHNlbGYudXJsX29rKHVybCxUcnVlKSAgICMgcmFpc2VzIGVycm9yIGlmIG5vdCBhbGxvd2VkCisgICAgICAgIHNlbGYuaW5mbygiRG93bmxvYWRpbmcgJXMiLCB1cmwpCisgICAgICAgICMgRG93bmxvYWQgdGhlIGZpbGUKKyAgICAgICAgZnAsIHRmcCwgaW5mbyA9IE5vbmUsIE5vbmUsIE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgJyMnIGluIHVybDoKKyAgICAgICAgICAgICAgICB1cmwsIGluZm8gPSB1cmwuc3BsaXQoJyMnLCAxKQorICAgICAgICAgICAgZnAgPSBzZWxmLm9wZW5fdXJsKHVybCkKKyAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UoZnAsIHVybGxpYjIuSFRUUEVycm9yKToKKyAgICAgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigKKyAgICAgICAgICAgICAgICAgICAgIkNhbid0IGRvd25sb2FkICVzOiAlcyAlcyIgJSAodXJsLCBmcC5jb2RlLGZwLm1zZykKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBjcyA9IG1kNSgpCisgICAgICAgICAgICBoZWFkZXJzID0gZnAuaW5mbygpCisgICAgICAgICAgICBibG9ja251bSA9IDAKKyAgICAgICAgICAgIGJzID0gc2VsZi5kbF9ibG9ja3NpemUKKyAgICAgICAgICAgIHNpemUgPSAtMQorICAgICAgICAgICAgaWYgImNvbnRlbnQtbGVuZ3RoIiBpbiBoZWFkZXJzOgorICAgICAgICAgICAgICAgIHNpemUgPSBpbnQoaGVhZGVyc1siQ29udGVudC1MZW5ndGgiXSkKKyAgICAgICAgICAgICAgICBzZWxmLnJlcG9ydGhvb2sodXJsLCBmaWxlbmFtZSwgYmxvY2tudW0sIGJzLCBzaXplKQorICAgICAgICAgICAgdGZwID0gb3BlbihmaWxlbmFtZSwnd2InKQorICAgICAgICAgICAgd2hpbGUgVHJ1ZToKKyAgICAgICAgICAgICAgICBibG9jayA9IGZwLnJlYWQoYnMpCisgICAgICAgICAgICAgICAgaWYgYmxvY2s6CisgICAgICAgICAgICAgICAgICAgIGNzLnVwZGF0ZShibG9jaykKKyAgICAgICAgICAgICAgICAgICAgdGZwLndyaXRlKGJsb2NrKQorICAgICAgICAgICAgICAgICAgICBibG9ja251bSArPSAxCisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVwb3J0aG9vayh1cmwsIGZpbGVuYW1lLCBibG9ja251bSwgYnMsIHNpemUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGlmIGluZm86IHNlbGYuY2hlY2tfbWQ1KGNzLCBpbmZvLCBmaWxlbmFtZSwgdGZwKQorICAgICAgICAgICAgcmV0dXJuIGhlYWRlcnMKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGZwOiBmcC5jbG9zZSgpCisgICAgICAgICAgICBpZiB0ZnA6IHRmcC5jbG9zZSgpCisKKyAgICBkZWYgcmVwb3J0aG9vayhzZWxmLCB1cmwsIGZpbGVuYW1lLCBibG9ja251bSwgYmxrc2l6ZSwgc2l6ZSk6CisgICAgICAgIHBhc3MgICAgIyBuby1vcAorCisgICAgZGVmIHJldHJ5X3NmX2Rvd25sb2FkKHNlbGYsIHVybCwgZmlsZW5hbWUpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfdG8odXJsLCBmaWxlbmFtZSkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2NoZW1lLCBzZXJ2ZXIsIHBhdGgsIHBhcmFtLCBxdWVyeSwgZnJhZyA9IHVybHBhcnNlLnVybHBhcnNlKHVybCkKKyAgICAgICAgICAgIGlmIHNlcnZlciE9J2RsLnNvdXJjZWZvcmdlLm5ldCc6CisgICAgICAgICAgICAgICAgcmFpc2UKKworICAgICAgICBtaXJyb3IgPSBnZXRfc2ZfaXAoKQorCisgICAgICAgIHdoaWxlIF9zZl9taXJyb3JzOgorICAgICAgICAgICAgc2VsZi53YXJuKCJEb3dubG9hZCBmYWlsZWQ6ICVzIiwgc3lzLmV4Y19pbmZvKClbMV0pCisgICAgICAgICAgICB1cmwgPSB1cmxwYXJzZS51cmx1bnBhcnNlKChzY2hlbWUsIG1pcnJvciwgcGF0aCwgcGFyYW0sICcnLCBmcmFnKSkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfdG8odXJsLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBfc2ZfbWlycm9ycy5yZW1vdmUobWlycm9yKSAgIyBkb24ndCByZXRyeSB0aGUgc2FtZSBtaXJyb3IKKyAgICAgICAgICAgICAgICBtaXJyb3IgPSBnZXRfc2ZfaXAoKQorCisgICAgICAgIHJhaXNlICAgIyBmYWlsIGlmIG5vIG1pcnJvciB3b3JrcworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworCisKKworICAgIGRlZiBvcGVuX3VybChzZWxmLCB1cmwpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gdXJsbGliMi51cmxvcGVuKHVybCkKKyAgICAgICAgZXhjZXB0IHVybGxpYjIuSFRUUEVycm9yLCB2OgorICAgICAgICAgICAgcmV0dXJuIHYKKyAgICAgICAgZXhjZXB0IHVybGxpYjIuVVJMRXJyb3IsIHY6CisgICAgICAgICAgICByYWlzZSBEaXN0dXRpbHNFcnJvcigiRG93bmxvYWQgZXJyb3I6ICVzIiAlIHYucmVhc29uKQorCisKKyAgICBkZWYgX2Rvd25sb2FkX3VybChzZWxmLCBzY2hlbWUsIHVybCwgdG1wZGlyKToKKworICAgICAgICAjIERldGVybWluZSBkb3dubG9hZCBmaWxlbmFtZQorICAgICAgICAjCisgICAgICAgIG5hbWUgPSBmaWx0ZXIoTm9uZSx1cmxwYXJzZS51cmxwYXJzZSh1cmwpWzJdLnNwbGl0KCcvJykpCisgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICBuYW1lID0gbmFtZVstMV0KKyAgICAgICAgICAgIHdoaWxlICcuLicgaW4gbmFtZToKKyAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcuLicsJy4nKS5yZXBsYWNlKCdcXCcsJ18nKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZSA9ICJfX2Rvd25sb2FkZWRfXyIgICAgIyBkZWZhdWx0IGlmIFVSTCBoYXMgbm8gcGF0aCBjb250ZW50cworCisgICAgICAgIGlmIG5hbWUuZW5kc3dpdGgoJy5lZ2cuemlwJyk6CisgICAgICAgICAgICBuYW1lID0gbmFtZVs6LTRdICAgICMgc3RyaXAgdGhlIGV4dHJhIC56aXAgYmVmb3JlIGRvd25sb2FkCisKKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLG5hbWUpCisKKyAgICAgICAgIyBEb3dubG9hZCB0aGUgZmlsZQorICAgICAgICAjCisgICAgICAgIGlmIHNjaGVtZT09J3N2bicgb3Igc2NoZW1lLnN0YXJ0c3dpdGgoJ3N2bisnKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9zdm4odXJsLCBmaWxlbmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGhlYWRlcnMgPSBzZWxmLnJldHJ5X3NmX2Rvd25sb2FkKHVybCwgZmlsZW5hbWUpCisgICAgICAgICAgICBpZiAnaHRtbCcgaW4gaGVhZGVyc1snY29udGVudC10eXBlJ10ubG93ZXIoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fZG93bmxvYWRfaHRtbCh1cmwsIGhlYWRlcnMsIGZpbGVuYW1lLCB0bXBkaXIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBmaWxlbmFtZQorCisgICAgZGVmIHNjYW5fdXJsKHNlbGYsIHVybCk6CisgICAgICAgIHNlbGYucHJvY2Vzc191cmwodXJsLCBUcnVlKQorCisKKyAgICBkZWYgX2Rvd25sb2FkX2h0bWwoc2VsZiwgdXJsLCBoZWFkZXJzLCBmaWxlbmFtZSwgdG1wZGlyKToKKyAgICAgICAgZmlsZSA9IG9wZW4oZmlsZW5hbWUpCisgICAgICAgIGZvciBsaW5lIGluIGZpbGU6CisgICAgICAgICAgICBpZiBsaW5lLnN0cmlwKCk6CisgICAgICAgICAgICAgICAgIyBDaGVjayBmb3IgYSBzdWJ2ZXJzaW9uIGluZGV4IHBhZ2UKKyAgICAgICAgICAgICAgICBpZiByZS5zZWFyY2gocic8dGl0bGU+UmV2aXNpb24gXGQrOicsIGxpbmUpOgorICAgICAgICAgICAgICAgICAgICAjIGl0J3MgYSBzdWJ2ZXJzaW9uIGluZGV4IHBhZ2U6CisgICAgICAgICAgICAgICAgICAgIGZpbGUuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBvcy51bmxpbmsoZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9kb3dubG9hZF9zdm4odXJsLCBmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICBicmVhayAgICMgbm90IGFuIGluZGV4IHBhZ2UKKyAgICAgICAgZmlsZS5jbG9zZSgpCisgICAgICAgIG9zLnVubGluayhmaWxlbmFtZSkKKyAgICAgICAgcmFpc2UgRGlzdHV0aWxzRXJyb3IoIlVuZXhwZWN0ZWQgSFRNTCBwYWdlIGZvdW5kIGF0ICIrdXJsKQorCisgICAgZGVmIF9kb3dubG9hZF9zdm4oc2VsZiwgdXJsLCBmaWxlbmFtZSk6CisgICAgICAgIHVybCA9IHVybC5zcGxpdCgnIycsMSlbMF0gICAjIHJlbW92ZSBhbnkgZnJhZ21lbnQgZm9yIHN2bidzIHNha2UKKyAgICAgICAgc2VsZi5pbmZvKCJEb2luZyBzdWJ2ZXJzaW9uIGNoZWNrb3V0IGZyb20gJXMgdG8gJXMiLCB1cmwsIGZpbGVuYW1lKQorICAgICAgICBvcy5zeXN0ZW0oInN2biBjaGVja291dCAtcSAlcyAlcyIgJSAodXJsLCBmaWxlbmFtZSkpCisgICAgICAgIHJldHVybiBmaWxlbmFtZQorCisgICAgZGVmIGRlYnVnKHNlbGYsIG1zZywgKmFyZ3MpOgorICAgICAgICBsb2cuZGVidWcobXNnLCAqYXJncykKKworICAgIGRlZiBpbmZvKHNlbGYsIG1zZywgKmFyZ3MpOgorICAgICAgICBsb2cuaW5mbyhtc2csICphcmdzKQorCisgICAgZGVmIHdhcm4oc2VsZiwgbXNnLCAqYXJncyk6CisgICAgICAgIGxvZy53YXJuKG1zZywgKmFyZ3MpCisKKworCisKKworCisKKworCisKKworCitkZWYgZml4X3NmX3VybCh1cmwpOgorICAgIHNjaGVtZSwgc2VydmVyLCBwYXRoLCBwYXJhbSwgcXVlcnksIGZyYWcgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmwpCisgICAgaWYgc2VydmVyIT0ncHJkb3dubG9hZHMuc291cmNlZm9yZ2UubmV0JzoKKyAgICAgICAgcmV0dXJuIHVybAorICAgIHJldHVybiB1cmxwYXJzZS51cmx1bnBhcnNlKAorICAgICAgICAoc2NoZW1lLCAnZGwuc291cmNlZm9yZ2UubmV0JywgJ3NvdXJjZWZvcmdlJytwYXRoLCBwYXJhbSwgJycsIGZyYWcpCisgICAgKQorCitfc2ZfbWlycm9ycyA9IFtdCisKK2RlZiBnZXRfc2ZfaXAoKToKKyAgICBpZiBub3QgX3NmX21pcnJvcnM6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIF9zZl9taXJyb3JzWzpdID0gc29ja2V0LmdldGhvc3RieW5hbWVfZXgoJ2RsLnNvdXJjZWZvcmdlLm5ldCcpWy0xXQorICAgICAgICBleGNlcHQgc29ja2V0LmVycm9yOgorICAgICAgICAgICAgIyBETlMtYmwwY2sxbjkgZjFyM3c0bGx6IHNVeDBycyEKKyAgICAgICAgICAgIF9zZl9taXJyb3JzWzpdID0gWydkbC5zb3VyY2Vmb3JnZS5uZXQnXQorICAgIHJldHVybiByYW5kb20uY2hvaWNlKF9zZl9taXJyb3JzKQpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvc2FuZGJveC5weSBiL0xpYi9zZXR1cHRvb2xzL3NhbmRib3gucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjA2OTQ0YgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL3NhbmRib3gucHkKQEAgLTAsMCArMSwyMDMgQEAKK2ltcG9ydCBvcywgc3lzLCBfX2J1aWx0aW5fXywgdGVtcGZpbGUKK19vcyA9IHN5cy5tb2R1bGVzW29zLm5hbWVdCitfb3BlbiA9IG9wZW4KK2Zyb20gZGlzdHV0aWxzLmVycm9ycyBpbXBvcnQgRGlzdHV0aWxzRXJyb3IKK19fYWxsX18gPSBbCisgICAgIkFic3RyYWN0U2FuZGJveCIsICJEaXJlY3RvcnlTYW5kYm94IiwgIlNhbmRib3hWaW9sYXRpb24iLCAicnVuX3NldHVwIiwKK10KKworZGVmIHJ1bl9zZXR1cChzZXR1cF9zY3JpcHQsIGFyZ3MpOgorICAgICIiIlJ1biBhIGRpc3R1dGlscyBzZXR1cCBzY3JpcHQsIHNhbmRib3hlZCBpbiBpdHMgZGlyZWN0b3J5IiIiCisKKyAgICBvbGRfZGlyID0gb3MuZ2V0Y3dkKCkKKyAgICBzYXZlX2FyZ3YgPSBzeXMuYXJndls6XQorICAgIHNhdmVfcGF0aCA9IHN5cy5wYXRoWzpdCisgICAgc2V0dXBfZGlyID0gb3MucGF0aC5hYnNwYXRoKG9zLnBhdGguZGlybmFtZShzZXR1cF9zY3JpcHQpKQorICAgIHRlbXBfZGlyID0gb3MucGF0aC5qb2luKHNldHVwX2RpciwndGVtcCcpCisgICAgaWYgbm90IG9zLnBhdGguaXNkaXIodGVtcF9kaXIpOiBvcy5tYWtlZGlycyh0ZW1wX2RpcikKKyAgICBzYXZlX3RtcCA9IHRlbXBmaWxlLnRlbXBkaXIKKworICAgIHRyeToKKyAgICAgICAgdGVtcGZpbGUudGVtcGRpciA9IHRlbXBfZGlyCisgICAgICAgIG9zLmNoZGlyKHNldHVwX2RpcikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc3lzLmFyZ3ZbOl0gPSBbc2V0dXBfc2NyaXB0XStsaXN0KGFyZ3MpCisgICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgc2V0dXBfZGlyKQorICAgICAgICAgICAgRGlyZWN0b3J5U2FuZGJveChzZXR1cF9kaXIpLnJ1bigKKyAgICAgICAgICAgICAgICBsYW1iZGE6IGV4ZWNmaWxlKAorICAgICAgICAgICAgICAgICAgICAic2V0dXAucHkiLAorICAgICAgICAgICAgICAgICAgICB7J19fZmlsZV9fJzpzZXR1cF9zY3JpcHQsICdfX25hbWVfXyc6J19fbWFpbl9fJ30KKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApCisgICAgICAgIGV4Y2VwdCBTeXN0ZW1FeGl0LCB2OgorICAgICAgICAgICAgaWYgdi5hcmdzIGFuZCB2LmFyZ3NbMF06CisgICAgICAgICAgICAgICAgcmFpc2UKKyAgICAgICAgICAgICMgTm9ybWFsIGV4aXQsIGp1c3QgcmV0dXJuCisgICAgZmluYWxseToKKyAgICAgICAgb3MuY2hkaXIob2xkX2RpcikKKyAgICAgICAgc3lzLnBhdGhbOl0gPSBzYXZlX3BhdGgKKyAgICAgICAgc3lzLmFyZ3ZbOl0gPSBzYXZlX2FyZ3YKKyAgICAgICAgdGVtcGZpbGUudGVtcGRpciA9IHNhdmVfdG1wCisKK2NsYXNzIEFic3RyYWN0U2FuZGJveDoKKyAgICAiIiJXcmFwICdvcycgbW9kdWxlIGFuZCAnb3BlbigpJyBidWlsdGluIGZvciB2aXJ0dWFsaXppbmcgc2V0dXAgc2NyaXB0cyIiIgorCisgICAgX2FjdGl2ZSA9IEZhbHNlCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuX2F0dHJzID0gWworICAgICAgICAgICAgbmFtZSBmb3IgbmFtZSBpbiBkaXIoX29zKQorICAgICAgICAgICAgICAgIGlmIG5vdCBuYW1lLnN0YXJ0c3dpdGgoJ18nKSBhbmQgaGFzYXR0cihzZWxmLG5hbWUpCisgICAgICAgIF0KKworICAgIGRlZiBfY29weShzZWxmLCBzb3VyY2UpOgorICAgICAgICBmb3IgbmFtZSBpbiBzZWxmLl9hdHRyczoKKyAgICAgICAgICAgIHNldGF0dHIob3MsIG5hbWUsIGdldGF0dHIoc291cmNlLG5hbWUpKQorCisgICAgZGVmIHJ1bihzZWxmLCBmdW5jKToKKyAgICAgICAgIiIiUnVuICdmdW5jJyB1bmRlciBvcyBzYW5kYm94aW5nIiIiCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuX2NvcHkoc2VsZikKKyAgICAgICAgICAgIF9fYnVpbHRpbl9fLm9wZW4gPSBfX2J1aWx0aW5fXy5maWxlID0gc2VsZi5fb3BlbgorICAgICAgICAgICAgc2VsZi5fYWN0aXZlID0gVHJ1ZQorICAgICAgICAgICAgcmV0dXJuIGZ1bmMoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fYWN0aXZlID0gRmFsc2UKKyAgICAgICAgICAgIF9fYnVpbHRpbl9fLm9wZW4gPSBfX2J1aWx0aW5fXy5maWxlID0gX29wZW4KKyAgICAgICAgICAgIHNlbGYuX2NvcHkoX29zKQorCisKKyAgICBkZWYgX21rX2R1YWxfcGF0aF93cmFwcGVyKG5hbWUpOgorICAgICAgICBvcmlnaW5hbCA9IGdldGF0dHIoX29zLG5hbWUpCisgICAgICAgIGRlZiB3cmFwKHNlbGYsc3JjLGRzdCwqYXJncywqKmt3KToKKyAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKKyAgICAgICAgICAgICAgICBzcmMsZHN0ID0gc2VsZi5fcmVtYXBfcGFpcihuYW1lLHNyYyxkc3QsKmFyZ3MsKiprdykKKyAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbChzcmMsZHN0LCphcmdzLCoqa3cpCisgICAgICAgIHJldHVybiB3cmFwCisKKworICAgIGZvciBuYW1lIGluIFsicmVuYW1lIiwgImxpbmsiLCAic3ltbGluayJdOgorICAgICAgICBpZiBoYXNhdHRyKF9vcyxuYW1lKTogbG9jYWxzKClbbmFtZV0gPSBfbWtfZHVhbF9wYXRoX3dyYXBwZXIobmFtZSkKKworCisgICAgZGVmIF9ta19zaW5nbGVfcGF0aF93cmFwcGVyKG5hbWUsIG9yaWdpbmFsPU5vbmUpOgorICAgICAgICBvcmlnaW5hbCA9IG9yaWdpbmFsIG9yIGdldGF0dHIoX29zLG5hbWUpCisgICAgICAgIGRlZiB3cmFwKHNlbGYscGF0aCwqYXJncywqKmt3KToKKyAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKKyAgICAgICAgICAgICAgICBwYXRoID0gc2VsZi5fcmVtYXBfaW5wdXQobmFtZSxwYXRoLCphcmdzLCoqa3cpCisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwocGF0aCwqYXJncywqKmt3KQorICAgICAgICByZXR1cm4gd3JhcAorCisgICAgX29wZW4gPSBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcignZmlsZScsIF9vcGVuKQorICAgIGZvciBuYW1lIGluIFsKKyAgICAgICAgInN0YXQiLCAibGlzdGRpciIsICJjaGRpciIsICJvcGVuIiwgImNobW9kIiwgImNob3duIiwgIm1rZGlyIiwKKyAgICAgICAgInJlbW92ZSIsICJ1bmxpbmsiLCAicm1kaXIiLCAidXRpbWUiLCAibGNob3duIiwgImNocm9vdCIsICJsc3RhdCIsCisgICAgICAgICJzdGFydGZpbGUiLCAibWtmaWZvIiwgIm1rbm9kIiwgInBhdGhjb25mIiwgImFjY2VzcyIKKyAgICBdOgorICAgICAgICBpZiBoYXNhdHRyKF9vcyxuYW1lKTogbG9jYWxzKClbbmFtZV0gPSBfbWtfc2luZ2xlX3BhdGhfd3JhcHBlcihuYW1lKQorCisKKyAgICBkZWYgX21rX3NpbmdsZV93aXRoX3JldHVybihuYW1lKToKKyAgICAgICAgb3JpZ2luYWwgPSBnZXRhdHRyKF9vcyxuYW1lKQorICAgICAgICBkZWYgd3JhcChzZWxmLHBhdGgsKmFyZ3MsKiprdyk6CisgICAgICAgICAgICBpZiBzZWxmLl9hY3RpdmU6CisgICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYuX3JlbWFwX2lucHV0KG5hbWUscGF0aCwqYXJncywqKmt3KQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLl9yZW1hcF9vdXRwdXQobmFtZSwgb3JpZ2luYWwocGF0aCwqYXJncywqKmt3KSkKKyAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbChwYXRoLCphcmdzLCoqa3cpCisgICAgICAgIHJldHVybiB3cmFwCisKKyAgICBmb3IgbmFtZSBpbiBbJ3JlYWRsaW5rJywgJ3RlbXBuYW0nXToKKyAgICAgICAgaWYgaGFzYXR0cihfb3MsbmFtZSk6IGxvY2FscygpW25hbWVdID0gX21rX3NpbmdsZV93aXRoX3JldHVybihuYW1lKQorCisgICAgZGVmIF9ta19xdWVyeShuYW1lKToKKyAgICAgICAgb3JpZ2luYWwgPSBnZXRhdHRyKF9vcyxuYW1lKQorICAgICAgICBkZWYgd3JhcChzZWxmLCphcmdzLCoqa3cpOgorICAgICAgICAgICAgcmV0dmFsID0gb3JpZ2luYWwoKmFyZ3MsKiprdykKKyAgICAgICAgICAgIGlmIHNlbGYuX2FjdGl2ZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fcmVtYXBfb3V0cHV0KG5hbWUsIHJldHZhbCkKKyAgICAgICAgICAgIHJldHVybiByZXR2YWwKKyAgICAgICAgcmV0dXJuIHdyYXAKKworICAgIGZvciBuYW1lIGluIFsnZ2V0Y3dkJywgJ3RtcG5hbSddOgorICAgICAgICBpZiBoYXNhdHRyKF9vcyxuYW1lKTogbG9jYWxzKClbbmFtZV0gPSBfbWtfcXVlcnkobmFtZSkKKworICAgIGRlZiBfdmFsaWRhdGVfcGF0aChzZWxmLHBhdGgpOgorICAgICAgICAiIiJDYWxsZWQgdG8gcmVtYXAgb3IgdmFsaWRhdGUgYW55IHBhdGgsIHdoZXRoZXIgaW5wdXQgb3Igb3V0cHV0IiIiCisgICAgICAgIHJldHVybiBwYXRoCisKKyAgICBkZWYgX3JlbWFwX2lucHV0KHNlbGYsb3BlcmF0aW9uLHBhdGgsKmFyZ3MsKiprdyk6CisgICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBpbnB1dHMiIiIKKyAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbGlkYXRlX3BhdGgocGF0aCkKKworICAgIGRlZiBfcmVtYXBfb3V0cHV0KHNlbGYsb3BlcmF0aW9uLHBhdGgpOgorICAgICAgICAiIiJDYWxsZWQgZm9yIHBhdGggb3V0cHV0cyIiIgorICAgICAgICByZXR1cm4gc2VsZi5fdmFsaWRhdGVfcGF0aChwYXRoKQorCisgICAgZGVmIF9yZW1hcF9wYWlyKHNlbGYsb3BlcmF0aW9uLHNyYyxkc3QsKmFyZ3MsKiprdyk6CisgICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBwYWlycyBsaWtlIHJlbmFtZSwgbGluaywgYW5kIHN5bWxpbmsgb3BlcmF0aW9ucyIiIgorICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgc2VsZi5fcmVtYXBfaW5wdXQob3BlcmF0aW9uKyctZnJvbScsc3JjLCphcmdzLCoqa3cpLAorICAgICAgICAgICAgc2VsZi5fcmVtYXBfaW5wdXQob3BlcmF0aW9uKyctdG8nLGRzdCwqYXJncywqKmt3KQorICAgICAgICApCisKKworY2xhc3MgRGlyZWN0b3J5U2FuZGJveChBYnN0cmFjdFNhbmRib3gpOgorICAgICIiIlJlc3RyaWN0IG9wZXJhdGlvbnMgdG8gYSBzaW5nbGUgc3ViZGlyZWN0b3J5IC0gcHNldWRvLWNocm9vdCIiIgorCisgICAgd3JpdGVfb3BzID0gZGljdC5mcm9ta2V5cyhbCisgICAgICAgICJvcGVuIiwgImNobW9kIiwgImNob3duIiwgIm1rZGlyIiwgInJlbW92ZSIsICJ1bmxpbmsiLCAicm1kaXIiLAorICAgICAgICAidXRpbWUiLCAibGNob3duIiwgImNocm9vdCIsICJta2ZpZm8iLCAibWtub2QiLCAidGVtcG5hbSIsCisgICAgXSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLHNhbmRib3gpOgorICAgICAgICBzZWxmLl9zYW5kYm94ID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKHNhbmRib3gpKQorICAgICAgICBzZWxmLl9wcmVmaXggPSBvcy5wYXRoLmpvaW4oc2VsZi5fc2FuZGJveCwnJykKKyAgICAgICAgQWJzdHJhY3RTYW5kYm94Ll9faW5pdF9fKHNlbGYpCisKKyAgICBkZWYgX3Zpb2xhdGlvbihzZWxmLCBvcGVyYXRpb24sICphcmdzLCAqKmt3KToKKyAgICAgICAgcmFpc2UgU2FuZGJveFZpb2xhdGlvbihvcGVyYXRpb24sIGFyZ3MsIGt3KQorCisgICAgZGVmIF9vcGVuKHNlbGYsIHBhdGgsIG1vZGU9J3InLCAqYXJncywgKiprdyk6CisgICAgICAgIGlmIG1vZGUgbm90IGluICgncicsICdydCcsICdyYicsICdyVScpIGFuZCBub3Qgc2VsZi5fb2socGF0aCk6CisgICAgICAgICAgICBzZWxmLl92aW9sYXRpb24oIm9wZW4iLCBwYXRoLCBtb2RlLCAqYXJncywgKiprdykKKyAgICAgICAgcmV0dXJuIF9vcGVuKHBhdGgsbW9kZSwqYXJncywqKmt3KQorCisgICAgZGVmIHRtcG5hbShzZWxmKToKKyAgICAgICAgc2VsZi5fdmlvbGF0aW9uKCJ0bXBuYW0iKQorCisgICAgZGVmIF9vayhzZWxmLHBhdGgpOgorICAgICAgICBhY3RpdmUgPSBzZWxmLl9hY3RpdmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5fYWN0aXZlID0gRmFsc2UKKyAgICAgICAgICAgIHJlYWxwYXRoID0gb3MucGF0aC5ub3JtY2FzZShvcy5wYXRoLnJlYWxwYXRoKHBhdGgpKQorICAgICAgICAgICAgaWYgcmVhbHBhdGg9PXNlbGYuX3NhbmRib3ggb3IgcmVhbHBhdGguc3RhcnRzd2l0aChzZWxmLl9wcmVmaXgpOgorICAgICAgICAgICAgICAgIHJldHVybiBUcnVlCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzZWxmLl9hY3RpdmUgPSBhY3RpdmUKKworICAgIGRlZiBfcmVtYXBfaW5wdXQoc2VsZixvcGVyYXRpb24scGF0aCwqYXJncywqKmt3KToKKyAgICAgICAgIiIiQ2FsbGVkIGZvciBwYXRoIGlucHV0cyIiIgorICAgICAgICBpZiBvcGVyYXRpb24gaW4gc2VsZi53cml0ZV9vcHMgYW5kIG5vdCBzZWxmLl9vayhwYXRoKToKKyAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbihvcGVyYXRpb24sIG9zLnBhdGgucmVhbHBhdGgocGF0aCksICphcmdzLCAqKmt3KQorICAgICAgICByZXR1cm4gcGF0aAorCisgICAgZGVmIF9yZW1hcF9wYWlyKHNlbGYsb3BlcmF0aW9uLHNyYyxkc3QsKmFyZ3MsKiprdyk6CisgICAgICAgICIiIkNhbGxlZCBmb3IgcGF0aCBwYWlycyBsaWtlIHJlbmFtZSwgbGluaywgYW5kIHN5bWxpbmsgb3BlcmF0aW9ucyIiIgorICAgICAgICBpZiBub3Qgc2VsZi5fb2soc3JjKSBvciBub3Qgc2VsZi5fb2soZHN0KToKKyAgICAgICAgICAgIHNlbGYuX3Zpb2xhdGlvbihvcGVyYXRpb24sIHNyYywgZHN0LCAqYXJncywgKiprdykKKyAgICAgICAgcmV0dXJuIChzcmMsZHN0KQorCisKK2NsYXNzIFNhbmRib3hWaW9sYXRpb24oRGlzdHV0aWxzRXJyb3IpOgorICAgICIiIkEgc2V0dXAgc2NyaXB0IGF0dGVtcHRlZCB0byBtb2RpZnkgdGhlIGZpbGVzeXN0ZW0gb3V0c2lkZSB0aGUgc2FuZGJveCIiIgorCisgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgIHJldHVybiAiIiJTYW5kYm94VmlvbGF0aW9uOiAlcyVyICVzCisKK1RoZSBwYWNrYWdlIHNldHVwIHNjcmlwdCBoYXMgYXR0ZW1wdGVkIHRvIG1vZGlmeSBmaWxlcyBvbiB5b3VyIHN5c3RlbQordGhhdCBhcmUgbm90IHdpdGhpbiB0aGUgRWFzeUluc3RhbGwgYnVpbGQgYXJlYSwgYW5kIGhhcyBiZWVuIGFib3J0ZWQuCisKK1RoaXMgcGFja2FnZSBjYW5ub3QgYmUgc2FmZWx5IGluc3RhbGxlZCBieSBFYXN5SW5zdGFsbCwgYW5kIG1heSBub3QKK3N1cHBvcnQgYWx0ZXJuYXRlIGluc3RhbGxhdGlvbiBsb2NhdGlvbnMgZXZlbiBpZiB5b3UgcnVuIGl0cyBzZXR1cAorc2NyaXB0IGJ5IGhhbmQuICBQbGVhc2UgaW5mb3JtIHRoZSBwYWNrYWdlJ3MgYXV0aG9yIGFuZCB0aGUgRWFzeUluc3RhbGwKK21haW50YWluZXJzIHRvIGZpbmQgb3V0IGlmIGEgZml4IG9yIHdvcmthcm91bmQgaXMgYXZhaWxhYmxlLiIiIiAlIHNlbGYuYXJncwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvc2l0ZS1wYXRjaC5weSBiL0xpYi9zZXR1cHRvb2xzL3NpdGUtcGF0Y2gucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjFiMjdiOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL3NpdGUtcGF0Y2gucHkKQEAgLTAsMCArMSw3NCBAQAorZGVmIF9fYm9vdCgpOgorICAgIGltcG9ydCBzeXMsIGltcCwgb3MsIG9zLnBhdGgKKyAgICBQWVRIT05QQVRIID0gb3MuZW52aXJvbi5nZXQoJ1BZVEhPTlBBVEgnKQorICAgIGlmIFBZVEhPTlBBVEggaXMgTm9uZSBvciAoc3lzLnBsYXRmb3JtPT0nd2luMzInIGFuZCBub3QgUFlUSE9OUEFUSCk6CisgICAgICAgIFBZVEhPTlBBVEggPSBbXQorICAgIGVsc2U6CisgICAgICAgIFBZVEhPTlBBVEggPSBQWVRIT05QQVRILnNwbGl0KG9zLnBhdGhzZXApCisKKyAgICBwaWMgPSBnZXRhdHRyKHN5cywncGF0aF9pbXBvcnRlcl9jYWNoZScse30pCisgICAgc3RkcGF0aCA9IHN5cy5wYXRoW2xlbihQWVRIT05QQVRIKTpdCisgICAgbXlkaXIgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCisgICAgI3ByaW50ICJzZWFyY2hpbmciLHN0ZHBhdGgsc3lzLnBhdGgKKworICAgIGZvciBpdGVtIGluIHN0ZHBhdGg6CisgICAgICAgIGlmIGl0ZW09PW15ZGlyIG9yIG5vdCBpdGVtOgorICAgICAgICAgICAgY29udGludWUgICAgIyBza2lwIGlmIGN1cnJlbnQgZGlyLiBvbiBXaW5kb3dzLCBvciBteSBvd24gZGlyZWN0b3J5CisgICAgICAgIGltcG9ydGVyID0gcGljLmdldChpdGVtKQorICAgICAgICBpZiBpbXBvcnRlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGxvYWRlciA9IGltcG9ydGVyLmZpbmRfbW9kdWxlKCdzaXRlJykKKyAgICAgICAgICAgIGlmIGxvYWRlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAjIFRoaXMgc2hvdWxkIGFjdHVhbGx5IHJlbG9hZCB0aGUgY3VycmVudCBtb2R1bGUKKyAgICAgICAgICAgICAgICBsb2FkZXIubG9hZF9tb2R1bGUoJ3NpdGUnKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc3RyZWFtLCBwYXRoLCBkZXNjciA9IGltcC5maW5kX21vZHVsZSgnc2l0ZScsW2l0ZW1dKQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBpZiBzdHJlYW0gaXMgTm9uZToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICMgVGhpcyBzaG91bGQgYWN0dWFsbHkgcmVsb2FkIHRoZSBjdXJyZW50IG1vZHVsZQorICAgICAgICAgICAgICAgIGltcC5sb2FkX21vZHVsZSgnc2l0ZScsc3RyZWFtLHBhdGgsZGVzY3IpCisgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpCisgICAgICAgICAgICBicmVhaworICAgIGVsc2U6CisgICAgICAgIHJhaXNlIEltcG9ydEVycm9yKCJDb3VsZG4ndCBmaW5kIHRoZSByZWFsICdzaXRlJyBtb2R1bGUiKQorCisgICAgI3ByaW50ICJsb2FkZWQiLCBfX2ZpbGVfXworCisgICAga25vd25fcGF0aHMgPSBkaWN0KFsobWFrZXBhdGgoaXRlbSlbMV0sMSkgZm9yIGl0ZW0gaW4gc3lzLnBhdGhdKSAjIDIuMiBjb21wCisKKyAgICBvbGRwb3MgPSBnZXRhdHRyKHN5cywnX19lZ2dpbnNlcnQnLDApICAgIyBzYXZlIG9sZCBpbnNlcnRpb24gcG9zaXRpb24KKyAgICBzeXMuX19lZ2dpbnNlcnQgPSAwICAgICAgICAgICAgICAgICAgICAgIyBhbmQgcmVzZXQgdGhlIGN1cnJlbnQgb25lCisKKyAgICBmb3IgaXRlbSBpbiBQWVRIT05QQVRIOgorICAgICAgICBhZGRzaXRlZGlyKGl0ZW0pCisKKyAgICBzeXMuX19lZ2dpbnNlcnQgKz0gb2xkcG9zICAgICAgICAgICAjIHJlc3RvcmUgZWZmZWN0aXZlIG9sZCBwb3NpdGlvbgorCisgICAgZCxuZCA9IG1ha2VwYXRoKHN0ZHBhdGhbMF0pCisgICAgaW5zZXJ0X2F0ID0gTm9uZQorICAgIG5ld19wYXRoID0gW10KKworICAgIGZvciBpdGVtIGluIHN5cy5wYXRoOgorICAgICAgICBwLG5wID0gbWFrZXBhdGgoaXRlbSkKKworICAgICAgICBpZiBucD09bmQgYW5kIGluc2VydF9hdCBpcyBOb25lOgorICAgICAgICAgICAgIyBXZSd2ZSBoaXQgdGhlIGZpcnN0ICdzeXN0ZW0nIHBhdGggZW50cnksIHNvIGFkZGVkIGVudHJpZXMgZ28gaGVyZQorICAgICAgICAgICAgaW5zZXJ0X2F0ID0gbGVuKG5ld19wYXRoKQorCisgICAgICAgIGlmIG5wIGluIGtub3duX3BhdGhzIG9yIGluc2VydF9hdCBpcyBOb25lOgorICAgICAgICAgICAgbmV3X3BhdGguYXBwZW5kKGl0ZW0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIG5ldyBwYXRoIGFmdGVyIHRoZSBpbnNlcnQgcG9pbnQsIGJhY2staW5zZXJ0IGl0CisgICAgICAgICAgICBuZXdfcGF0aC5pbnNlcnQoaW5zZXJ0X2F0LCBpdGVtKQorICAgICAgICAgICAgaW5zZXJ0X2F0ICs9IDEKKworICAgIHN5cy5wYXRoWzpdID0gbmV3X3BhdGgKKworaWYgX19uYW1lX189PSdzaXRlJzoKKyAgICBfX2Jvb3QoKQorICAgIGRlbCBfX2Jvb3QKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL3Rlc3RzL19faW5pdF9fLnB5IGIvTGliL3NldHVwdG9vbHMvdGVzdHMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3NjdkYwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zZXR1cHRvb2xzL3Rlc3RzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMzY0IEBACisiIiJUZXN0cyBmb3IgdGhlICdzZXR1cHRvb2xzJyBwYWNrYWdlIiIiCisKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RTdWl0ZSwgVGVzdENhc2UsIG1ha2VTdWl0ZSwgZGVmYXVsdFRlc3RMb2FkZXIKK2ltcG9ydCBkaXN0dXRpbHMuY29yZSwgZGlzdHV0aWxzLmNtZAorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNPcHRpb25FcnJvciwgRGlzdHV0aWxzUGxhdGZvcm1FcnJvcgorZnJvbSBkaXN0dXRpbHMuZXJyb3JzIGltcG9ydCBEaXN0dXRpbHNTZXR1cEVycm9yCitpbXBvcnQgc2V0dXB0b29scywgc2V0dXB0b29scy5kaXN0Citmcm9tIHNldHVwdG9vbHMgaW1wb3J0IEZlYXR1cmUKK2Zyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IEV4dGVuc2lvbgorZnJvbSBzZXR1cHRvb2xzLmRlcGVuZHMgaW1wb3J0IGV4dHJhY3RfY29uc3RhbnQsIGdldF9tb2R1bGVfY29uc3RhbnQKK2Zyb20gc2V0dXB0b29scy5kZXBlbmRzIGltcG9ydCBmaW5kX21vZHVsZSwgUmVxdWlyZQorZnJvbSBkaXN0dXRpbHMudmVyc2lvbiBpbXBvcnQgU3RyaWN0VmVyc2lvbiwgTG9vc2VWZXJzaW9uCitmcm9tIGRpc3R1dGlscy51dGlsIGltcG9ydCBjb252ZXJ0X3BhdGgKK2ltcG9ydCBzeXMsIG9zLnBhdGgKKworZGVmIGFkZGl0aW9uYWxfdGVzdHMoKToKKyAgICBpbXBvcnQgZG9jdGVzdAorICAgIHJldHVybiBkb2N0ZXN0LkRvY0ZpbGVTdWl0ZSgKKyAgICAgICAgJ2FwaV90ZXN0cy50eHQnLCBvcHRpb25mbGFncz1kb2N0ZXN0LkVMTElQU0lTLCBwYWNrYWdlPV9fbmFtZV9fLAorICAgICkKKworCitkZWYgbWFrZVNldHVwKCoqYXJncyk6CisgICAgIiIiUmV0dXJuIGRpc3RyaWJ1dGlvbiBmcm9tICdzZXR1cCgqKmFyZ3MpJywgd2l0aG91dCBleGVjdXRpbmcgY29tbWFuZHMiIiIKKworICAgIGRpc3R1dGlscy5jb3JlLl9zZXR1cF9zdG9wX2FmdGVyID0gImNvbW1hbmRsaW5lIgorCisgICAgIyBEb24ndCBsZXQgc3lzdGVtIGNvbW1hbmQgbGluZSBsZWFrIGludG8gdGVzdHMhCisgICAgYXJncy5zZXRkZWZhdWx0KCdzY3JpcHRfYXJncycsWydpbnN0YWxsJ10pCisKKyAgICB0cnk6CisgICAgICAgIHJldHVybiBzZXR1cHRvb2xzLnNldHVwKCoqYXJncykKKyAgICBmaW5hbGx5OgorICAgICAgICBkaXN0dXRpbHMuY29yZV9zZXR1cF9zdG9wX2FmdGVyID0gTm9uZQorCisKKworCisKKworCitjbGFzcyBEZXBlbmRzVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RFeHRyYWN0Q29uc3Qoc2VsZik6CisKKyAgICAgICAgZnJvbSBzZXR1cHRvb2xzLmRlcGVuZHMgaW1wb3J0IGV4dHJhY3RfY29uc3RhbnQKKworICAgICAgICBkZWYgZjEoKToKKyAgICAgICAgICAgIGdsb2JhbCB4LHksegorICAgICAgICAgICAgeCA9ICJ0ZXN0IgorICAgICAgICAgICAgeSA9IHoKKworICAgICAgICAjIHVucmVjb2duaXplZCBuYW1lCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0cmFjdF9jb25zdGFudChmMS5mdW5jX2NvZGUsJ3EnLCAtMSksIE5vbmUpCisKKyAgICAgICAgIyBjb25zdGFudCBhc3NpZ25lZAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV4dHJhY3RfY29uc3RhbnQoZjEuZnVuY19jb2RlLCd4JywgLTEpLCAidGVzdCIpCisKKyAgICAgICAgIyBleHByZXNzaW9uIGFzc2lnbmVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0cmFjdF9jb25zdGFudChmMS5mdW5jX2NvZGUsJ3knLCAtMSksIC0xKQorCisgICAgICAgICMgcmVjb2duaXplZCBuYW1lLCBub3QgYXNzaWduZWQKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHRyYWN0X2NvbnN0YW50KGYxLmZ1bmNfY29kZSwneicsIC0xKSwgTm9uZSkKKworCisgICAgZGVmIHRlc3RGaW5kTW9kdWxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbXBvcnRFcnJvciwgZmluZF9tb2R1bGUsICduby1zdWNoLi10aGluZycpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yLCBmaW5kX21vZHVsZSwgJ3NldHVwdG9vbHMubm9uLWV4aXN0ZW50JykKKyAgICAgICAgZixwLGkgPSBmaW5kX21vZHVsZSgnc2V0dXB0b29scy50ZXN0cycpOyBmLmNsb3NlKCkKKworICAgIGRlZiB0ZXN0TW9kdWxlRXh0cmFjdChzZWxmKToKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IF9fdmVyc2lvbl9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBnZXRfbW9kdWxlX2NvbnN0YW50KCdkaXN0dXRpbHMnLCdfX3ZlcnNpb25fXycpLCBfX3ZlcnNpb25fXworICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBnZXRfbW9kdWxlX2NvbnN0YW50KCdzeXMnLCd2ZXJzaW9uJyksIHN5cy52ZXJzaW9uCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGdldF9tb2R1bGVfY29uc3RhbnQoJ3NldHVwdG9vbHMudGVzdHMnLCdfX2RvY19fJyksX19kb2NfXworICAgICAgICApCisKKyAgICBkZWYgdGVzdFJlcXVpcmUoc2VsZik6CisKKyAgICAgICAgcmVxID0gUmVxdWlyZSgnRGlzdHV0aWxzJywnMS4wLjMnLCdkaXN0dXRpbHMnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLm5hbWUsICdEaXN0dXRpbHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5tb2R1bGUsICdkaXN0dXRpbHMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5yZXF1ZXN0ZWRfdmVyc2lvbiwgJzEuMC4zJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuYXR0cmlidXRlLCAnX192ZXJzaW9uX18nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5mdWxsX25hbWUoKSwgJ0Rpc3R1dGlscy0xLjAuMycpCisKKyAgICAgICAgZnJvbSBkaXN0dXRpbHMgaW1wb3J0IF9fdmVyc2lvbl9fCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmdldF92ZXJzaW9uKCksIF9fdmVyc2lvbl9fKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVxLnZlcnNpb25fb2soJzEuMC45JykpCisgICAgICAgIHNlbGYuZmFpbElmKHJlcS52ZXJzaW9uX29rKCcwLjkuMScpKQorICAgICAgICBzZWxmLmZhaWxJZihyZXEudmVyc2lvbl9vaygndW5rbm93bicpKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXEuaXNfcHJlc2VudCgpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVxLmlzX2N1cnJlbnQoKSkKKworICAgICAgICByZXEgPSBSZXF1aXJlKCdEaXN0dXRpbHMgMzAwMCcsJzAzMDAwJywnZGlzdHV0aWxzJyxmb3JtYXQ9TG9vc2VWZXJzaW9uKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MocmVxLmlzX3ByZXNlbnQoKSkKKyAgICAgICAgc2VsZi5mYWlsSWYocmVxLmlzX2N1cnJlbnQoKSkKKyAgICAgICAgc2VsZi5mYWlsSWYocmVxLnZlcnNpb25fb2soJ3Vua25vd24nKSkKKworICAgICAgICByZXEgPSBSZXF1aXJlKCdEby13aGF0LUktbWVhbicsJzEuMCcsJ2Qtdy1pLW0nKQorICAgICAgICBzZWxmLmZhaWxJZihyZXEuaXNfcHJlc2VudCgpKQorICAgICAgICBzZWxmLmZhaWxJZihyZXEuaXNfY3VycmVudCgpKQorCisgICAgICAgIHJlcSA9IFJlcXVpcmUoJ1Rlc3RzJywgTm9uZSwgJ3Rlc3RzJywgaG9tZXBhZ2U9Imh0dHA6Ly9leGFtcGxlLmNvbSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmZvcm1hdCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuYXR0cmlidXRlLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5yZXF1ZXN0ZWRfdmVyc2lvbiwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXEuZnVsbF9uYW1lKCksICdUZXN0cycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxLmhvbWVwYWdlLCAnaHR0cDovL2V4YW1wbGUuY29tJykKKworICAgICAgICBwYXRocyA9IFtvcy5wYXRoLmRpcm5hbWUocCkgZm9yIHAgaW4gX19wYXRoX19dCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXEuaXNfcHJlc2VudChwYXRocykpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhyZXEuaXNfY3VycmVudChwYXRocykpCisKKworCitjbGFzcyBEaXN0cm9UZXN0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZTEgPSBFeHRlbnNpb24oJ2Jhci5leHQnLFsnYmFyLmMnXSkKKyAgICAgICAgc2VsZi5lMiA9IEV4dGVuc2lvbignYy55JywgWyd5LmMnXSkKKworICAgICAgICBzZWxmLmRpc3QgPSBtYWtlU2V0dXAoCisgICAgICAgICAgICBwYWNrYWdlcz1bJ2EnLCAnYS5iJywgJ2EuYi5jJywgJ2InLCAnYyddLAorICAgICAgICAgICAgcHlfbW9kdWxlcz1bJ2IuZCcsJ3gnXSwKKyAgICAgICAgICAgIGV4dF9tb2R1bGVzID0gKHNlbGYuZTEsIHNlbGYuZTIpLAorICAgICAgICAgICAgcGFja2FnZV9kaXIgPSB7fSwKKyAgICAgICAgKQorCisKKyAgICBkZWYgdGVzdERpc3Ryb1R5cGUoc2VsZik6CisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHNlbGYuZGlzdCxzZXR1cHRvb2xzLmRpc3QuRGlzdHJpYnV0aW9uKSkKKworCisgICAgZGVmIHRlc3RFeGNsdWRlUGFja2FnZShzZWxmKToKKyAgICAgICAgc2VsZi5kaXN0LmV4Y2x1ZGVfcGFja2FnZSgnYScpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LnBhY2thZ2VzLCBbJ2InLCdjJ10pCisKKyAgICAgICAgc2VsZi5kaXN0LmV4Y2x1ZGVfcGFja2FnZSgnYicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LnBhY2thZ2VzLCBbJ2MnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpc3QucHlfbW9kdWxlcywgWyd4J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LmV4dF9tb2R1bGVzLCBbc2VsZi5lMSwgc2VsZi5lMl0pCisKKyAgICAgICAgc2VsZi5kaXN0LmV4Y2x1ZGVfcGFja2FnZSgnYycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LnBhY2thZ2VzLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpc3QucHlfbW9kdWxlcywgWyd4J10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LmV4dF9tb2R1bGVzLCBbc2VsZi5lMV0pCisKKyAgICAgICAgIyB0ZXN0IHJlbW92YWxzIGZyb20gdW5zcGVjaWZpZWQgb3B0aW9ucworICAgICAgICBtYWtlU2V0dXAoKS5leGNsdWRlX3BhY2thZ2UoJ3gnKQorCisKKworCisKKworCisgICAgZGVmIHRlc3RJbmNsdWRlRXhjbHVkZShzZWxmKToKKyAgICAgICAgIyByZW1vdmUgYW4gZXh0ZW5zaW9uCisgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlKGV4dF9tb2R1bGVzPVtzZWxmLmUxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpc3QuZXh0X21vZHVsZXMsIFtzZWxmLmUyXSkKKworICAgICAgICAjIGFkZCBpdCBiYWNrIGluCisgICAgICAgIHNlbGYuZGlzdC5pbmNsdWRlKGV4dF9tb2R1bGVzPVtzZWxmLmUxXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpc3QuZXh0X21vZHVsZXMsIFtzZWxmLmUyLCBzZWxmLmUxXSkKKworICAgICAgICAjIHNob3VsZCBub3QgYWRkIGR1cGxpY2F0ZQorICAgICAgICBzZWxmLmRpc3QuaW5jbHVkZShleHRfbW9kdWxlcz1bc2VsZi5lMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5kaXN0LmV4dF9tb2R1bGVzLCBbc2VsZi5lMiwgc2VsZi5lMV0pCisKKyAgICBkZWYgdGVzdEV4Y2x1ZGVQYWNrYWdlcyhzZWxmKToKKyAgICAgICAgc2VsZi5kaXN0LmV4Y2x1ZGUocGFja2FnZXM9WydjJywnYicsJ2EnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpc3QucGFja2FnZXMsIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZGlzdC5weV9tb2R1bGVzLCBbJ3gnXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmRpc3QuZXh0X21vZHVsZXMsIFtzZWxmLmUxXSkKKworICAgIGRlZiB0ZXN0RW1wdHkoc2VsZik6CisgICAgICAgIGRpc3QgPSBtYWtlU2V0dXAoKQorICAgICAgICBkaXN0LmluY2x1ZGUocGFja2FnZXM9WydhJ10sIHB5X21vZHVsZXM9WydiJ10sIGV4dF9tb2R1bGVzPVtzZWxmLmUyXSkKKyAgICAgICAgZGlzdCA9IG1ha2VTZXR1cCgpCisgICAgICAgIGRpc3QuZXhjbHVkZShwYWNrYWdlcz1bJ2EnXSwgcHlfbW9kdWxlcz1bJ2InXSwgZXh0X21vZHVsZXM9W3NlbGYuZTJdKQorCisgICAgZGVmIHRlc3RDb250ZW50cyhzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHNlbGYuZGlzdC5oYXNfY29udGVudHNfZm9yKCdhJykpCisgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlX3BhY2thZ2UoJ2EnKQorICAgICAgICBzZWxmLmZhaWxJZihzZWxmLmRpc3QuaGFzX2NvbnRlbnRzX2ZvcignYScpKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzZWxmLmRpc3QuaGFzX2NvbnRlbnRzX2ZvcignYicpKQorICAgICAgICBzZWxmLmRpc3QuZXhjbHVkZV9wYWNrYWdlKCdiJykKKyAgICAgICAgc2VsZi5mYWlsSWYoc2VsZi5kaXN0Lmhhc19jb250ZW50c19mb3IoJ2InKSkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3Moc2VsZi5kaXN0Lmhhc19jb250ZW50c19mb3IoJ2MnKSkKKyAgICAgICAgc2VsZi5kaXN0LmV4Y2x1ZGVfcGFja2FnZSgnYycpCisgICAgICAgIHNlbGYuZmFpbElmKHNlbGYuZGlzdC5oYXNfY29udGVudHNfZm9yKCdjJykpCisKKworCisKKyAgICBkZWYgdGVzdEludmFsaWRJbmNsdWRlRXhjbHVkZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwKKyAgICAgICAgICAgIHNlbGYuZGlzdC5pbmNsdWRlLCBub25leGlzdGVudF9vcHRpb249J3gnCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwKKyAgICAgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlLCBub25leGlzdGVudF9vcHRpb249J3gnCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwKKyAgICAgICAgICAgIHNlbGYuZGlzdC5pbmNsdWRlLCBwYWNrYWdlcz17J3gnOid5J30KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLAorICAgICAgICAgICAgc2VsZi5kaXN0LmV4Y2x1ZGUsIHBhY2thZ2VzPXsneCc6J3knfQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsCisgICAgICAgICAgICBzZWxmLmRpc3QuaW5jbHVkZSwgZXh0X21vZHVsZXM9eyd4JzoneSd9CisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoRGlzdHV0aWxzU2V0dXBFcnJvciwKKyAgICAgICAgICAgIHNlbGYuZGlzdC5leGNsdWRlLCBleHRfbW9kdWxlcz17J3gnOid5J30KKyAgICAgICAgKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKERpc3R1dGlsc1NldHVwRXJyb3IsCisgICAgICAgICAgICBzZWxmLmRpc3QuaW5jbHVkZSwgcGFja2FnZV9kaXI9WydxJ10KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLAorICAgICAgICAgICAgc2VsZi5kaXN0LmV4Y2x1ZGUsIHBhY2thZ2VfZGlyPVsncSddCisgICAgICAgICkKKworCisKKworCisKKworCisKKworCisKKworCisKK2NsYXNzIEZlYXR1cmVUZXN0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYucmVxID0gUmVxdWlyZSgnRGlzdHV0aWxzJywnMS4wLjMnLCdkaXN0dXRpbHMnKQorICAgICAgICBzZWxmLmRpc3QgPSBtYWtlU2V0dXAoCisgICAgICAgICAgICBmZWF0dXJlcz17CisgICAgICAgICAgICAgICAgJ2Zvbyc6IEZlYXR1cmUoImZvbyIsc3RhbmRhcmQ9VHJ1ZSxyZXF1aXJlX2ZlYXR1cmVzPVsnYmF6JyxzZWxmLnJlcV0pLAorICAgICAgICAgICAgICAgICdiYXInOiBGZWF0dXJlKCJiYXIiLCAgc3RhbmRhcmQ9VHJ1ZSwgcGFja2FnZXM9Wydwa2cuYmFyJ10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlfbW9kdWxlcz1bJ2Jhcl9ldCddLCByZW1vdmU9WydiYXIuZXh0J10sCisgICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgJ2Jheic6IEZlYXR1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICAiYmF6Iiwgb3B0aW9uYWw9RmFsc2UsIHBhY2thZ2VzPVsncGtnLmJheiddLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0cyA9IFsnc2NyaXB0cy9iYXpfaXQnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpYnJhcmllcz1bKCdsaWJmb28nLCdmb28vZm9vZm9vLmMnKV0KKyAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAnZHdpbSc6IEZlYXR1cmUoIkRXSU0iLCBhdmFpbGFibGU9RmFsc2UsIHJlbW92ZT0nYmF6aXNoJyksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgc2NyaXB0X2FyZ3M9WyctLXdpdGhvdXQtYmFyJywgJ2luc3RhbGwnXSwKKyAgICAgICAgICAgIHBhY2thZ2VzID0gWydwa2cuYmFyJywgJ3BrZy5mb28nXSwKKyAgICAgICAgICAgIHB5X21vZHVsZXMgPSBbJ2Jhcl9ldCcsICdiYXppc2gnXSwKKyAgICAgICAgICAgIGV4dF9tb2R1bGVzID0gW0V4dGVuc2lvbignYmFyLmV4dCcsWydiYXIuYyddKV0KKyAgICAgICAgKQorCisgICAgZGVmIHRlc3REZWZhdWx0cyhzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsSWYoCisgICAgICAgICAgICBGZWF0dXJlKAorICAgICAgICAgICAgICAgICJ0ZXN0IixzdGFuZGFyZD1UcnVlLHJlbW92ZT0neCcsYXZhaWxhYmxlPUZhbHNlCisgICAgICAgICAgICApLmluY2x1ZGVfYnlfZGVmYXVsdCgpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKAorICAgICAgICAgICAgRmVhdHVyZSgidGVzdCIsc3RhbmRhcmQ9VHJ1ZSxyZW1vdmU9J3gnKS5pbmNsdWRlX2J5X2RlZmF1bHQoKQorICAgICAgICApCisgICAgICAgICMgRmVhdHVyZSBtdXN0IGhhdmUgZWl0aGVyIGt3YXJncywgcmVtb3Zlcywgb3IgcmVxdWlyZV9mZWF0dXJlcworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNTZXR1cEVycm9yLCBGZWF0dXJlLCAidGVzdCIpCisKKyAgICBkZWYgdGVzdEF2YWlsYWJpbGl0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICBEaXN0dXRpbHNQbGF0Zm9ybUVycm9yLAorICAgICAgICAgICAgc2VsZi5kaXN0LmZlYXR1cmVzWydkd2ltJ10uaW5jbHVkZV9pbiwgc2VsZi5kaXN0CisgICAgICAgICkKKworICAgIGRlZiB0ZXN0RmVhdHVyZU9wdGlvbnMoc2VsZik6CisgICAgICAgIGRpc3QgPSBzZWxmLmRpc3QKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKAorICAgICAgICAgICAgKCd3aXRoLWR3aW0nLE5vbmUsJ2luY2x1ZGUgRFdJTScpIGluIGRpc3QuZmVhdHVyZV9vcHRpb25zCisgICAgICAgICkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKAorICAgICAgICAgICAgKCd3aXRob3V0LWR3aW0nLE5vbmUsJ2V4Y2x1ZGUgRFdJTSAoZGVmYXVsdCknKSBpbiBkaXN0LmZlYXR1cmVfb3B0aW9ucworICAgICAgICApCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygKKyAgICAgICAgICAgICgnd2l0aC1iYXInLE5vbmUsJ2luY2x1ZGUgYmFyIChkZWZhdWx0KScpIGluIGRpc3QuZmVhdHVyZV9vcHRpb25zCisgICAgICAgICkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKAorICAgICAgICAgICAgKCd3aXRob3V0LWJhcicsTm9uZSwnZXhjbHVkZSBiYXInKSBpbiBkaXN0LmZlYXR1cmVfb3B0aW9ucworICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5mZWF0dXJlX25lZ29wdFsnd2l0aG91dC1mb28nXSwnd2l0aC1mb28nKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3QuZmVhdHVyZV9uZWdvcHRbJ3dpdGhvdXQtYmFyJ10sJ3dpdGgtYmFyJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0LmZlYXR1cmVfbmVnb3B0Wyd3aXRob3V0LWR3aW0nXSwnd2l0aC1kd2ltJykKKyAgICAgICAgc2VsZi5mYWlsSWYoJ3dpdGhvdXQtYmF6JyBpbiBkaXN0LmZlYXR1cmVfbmVnb3B0KQorCisgICAgZGVmIHRlc3RVc2VGZWF0dXJlcyhzZWxmKToKKyAgICAgICAgZGlzdCA9IHNlbGYuZGlzdAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRpc3Qud2l0aF9mb28sMSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0LndpdGhfYmFyLDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC53aXRoX2JheiwxKQorICAgICAgICBzZWxmLmZhaWxJZignYmFyX2V0JyBpbiBkaXN0LnB5X21vZHVsZXMpCisgICAgICAgIHNlbGYuZmFpbElmKCdwa2cuYmFyJyBpbiBkaXN0LnBhY2thZ2VzKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJ3BrZy5iYXonIGluIGRpc3QucGFja2FnZXMpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcygnc2NyaXB0cy9iYXpfaXQnIGluIGRpc3Quc2NyaXB0cykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCgnbGliZm9vJywnZm9vL2Zvb2Zvby5jJykgaW4gZGlzdC5saWJyYXJpZXMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGlzdC5leHRfbW9kdWxlcyxbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkaXN0LnJlcXVpcmVfZmVhdHVyZXMsIFtzZWxmLnJlcV0pCisKKyAgICAgICAgIyBJZiB3ZSBhc2sgZm9yIGJhciwgaXQgc2hvdWxkIGZhaWwgYmVjYXVzZSB3ZSBleHBsaWNpdGx5IGRpc2FibGVkCisgICAgICAgICMgaXQgb24gdGhlIGNvbW1hbmQgbGluZQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNPcHRpb25FcnJvciwgZGlzdC5pbmNsdWRlX2ZlYXR1cmUsICdiYXInKQorCisgICAgZGVmIHRlc3RGZWF0dXJlV2l0aEludmFsaWRSZW1vdmUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgU3lzdGVtRXhpdCwgbWFrZVNldHVwLCBmZWF0dXJlcyA9IHsneCc6RmVhdHVyZSgneCcsIHJlbW92ZT0neScpfQorICAgICAgICApCisKK2NsYXNzIFRlc3RDb21tYW5kVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RUZXN0SXNDb21tYW5kKHNlbGYpOgorICAgICAgICB0ZXN0X2NtZCA9IG1ha2VTZXR1cCgpLmdldF9jb21tYW5kX29iaigndGVzdCcpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHRlc3RfY21kLCBkaXN0dXRpbHMuY21kLkNvbW1hbmQpKQorCisgICAgZGVmIHRlc3RMb25nT3B0U3VpdGVXTm9EZWZhdWx0KHNlbGYpOgorICAgICAgICB0czEgPSBtYWtlU2V0dXAoc2NyaXB0X2FyZ3M9Wyd0ZXN0JywnLS10ZXN0LXN1aXRlPWZvby50ZXN0cy5zdWl0ZSddKQorICAgICAgICB0czEgPSB0czEuZ2V0X2NvbW1hbmRfb2JqKCd0ZXN0JykKKyAgICAgICAgdHMxLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzMS50ZXN0X3N1aXRlLCAnZm9vLnRlc3RzLnN1aXRlJykKKworICAgIGRlZiB0ZXN0RGVmYXVsdFN1aXRlKHNlbGYpOgorICAgICAgICB0czIgPSBtYWtlU2V0dXAodGVzdF9zdWl0ZT0nYmFyLnRlc3RzLnN1aXRlJykuZ2V0X2NvbW1hbmRfb2JqKCd0ZXN0JykKKyAgICAgICAgdHMyLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzMi50ZXN0X3N1aXRlLCAnYmFyLnRlc3RzLnN1aXRlJykKKworICAgIGRlZiB0ZXN0RGVmYXVsdFdNb2R1bGVPbkNtZExpbmUoc2VsZik6CisgICAgICAgIHRzMyA9IG1ha2VTZXR1cCgKKyAgICAgICAgICAgIHRlc3Rfc3VpdGU9J2Jhci50ZXN0cycsCisgICAgICAgICAgICBzY3JpcHRfYXJncz1bJ3Rlc3QnLCctbScsJ2Zvby50ZXN0cyddCisgICAgICAgICkuZ2V0X2NvbW1hbmRfb2JqKCd0ZXN0JykKKyAgICAgICAgdHMzLmVuc3VyZV9maW5hbGl6ZWQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHRzMy50ZXN0X21vZHVsZSwgJ2Zvby50ZXN0cycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodHMzLnRlc3Rfc3VpdGUsICAnZm9vLnRlc3RzLnRlc3Rfc3VpdGUnKQorCisgICAgZGVmIHRlc3RDb25mbGljdGluZ09wdGlvbnMoc2VsZik6CisgICAgICAgIHRzNCA9IG1ha2VTZXR1cCgKKyAgICAgICAgICAgIHNjcmlwdF9hcmdzPVsndGVzdCcsJy1tJywnYmFyLnRlc3RzJywgJy1zJywnZm9vLnRlc3RzLnN1aXRlJ10KKyAgICAgICAgKS5nZXRfY29tbWFuZF9vYmooJ3Rlc3QnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhEaXN0dXRpbHNPcHRpb25FcnJvciwgdHM0LmVuc3VyZV9maW5hbGl6ZWQpCisKKyAgICBkZWYgdGVzdE5vU3VpdGUoc2VsZik6CisgICAgICAgIHRzNSA9IG1ha2VTZXR1cCgpLmdldF9jb21tYW5kX29iaigndGVzdCcpCisgICAgICAgIHRzNS5lbnN1cmVfZmluYWxpemVkKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0czUudGVzdF9zdWl0ZSwgTm9uZSkKZGlmZiAtLWdpdCBhL0xpYi9zZXR1cHRvb2xzL3Rlc3RzL2FwaV90ZXN0cy50eHQgYi9MaWIvc2V0dXB0b29scy90ZXN0cy9hcGlfdGVzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjczNWFkOGQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc2V0dXB0b29scy90ZXN0cy9hcGlfdGVzdHMudHh0CkBAIC0wLDAgKzEsMzMwIEBACitQbHVnZ2FibGUgRGlzdHJpYnV0aW9ucyBvZiBQeXRob24gU29mdHdhcmUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitEaXN0cmlidXRpb25zCistLS0tLS0tLS0tLS0tCisKK0EgIkRpc3RyaWJ1dGlvbiIgaXMgYSBjb2xsZWN0aW9uIG9mIGZpbGVzIHRoYXQgcmVwcmVzZW50IGEgIlJlbGVhc2UiIG9mIGEKKyJQcm9qZWN0IiBhcyBvZiBhIHBhcnRpY3VsYXIgcG9pbnQgaW4gdGltZSwgZGVub3RlZCBieSBhCisiVmVyc2lvbiI6OgorCisgICAgPj4+IGltcG9ydCBzeXMsIHBrZ19yZXNvdXJjZXMKKyAgICA+Pj4gZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBEaXN0cmlidXRpb24KKyAgICA+Pj4gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0iRm9vIiwgdmVyc2lvbj0iMS4yIikKKyAgICBGb28gMS4yCisKK0Rpc3RyaWJ1dGlvbnMgaGF2ZSBhIGxvY2F0aW9uLCB3aGljaCBjYW4gYmUgYSBmaWxlbmFtZSwgVVJMLCBvciByZWFsbHkgYW55dGhpbmcKK2Vsc2UgeW91IGNhcmUgdG8gdXNlOjoKKworICAgID4+PiBkaXN0ID0gRGlzdHJpYnV0aW9uKAorICAgIC4uLiAgICAgbG9jYXRpb249Imh0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmciLAorICAgIC4uLiAgICAgcHJvamVjdF9uYW1lPSJCYXIiLCB2ZXJzaW9uPSIwLjkiCisgICAgLi4uICkKKworICAgID4+PiBkaXN0CisgICAgQmFyIDAuOSAoaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZykKKworCitEaXN0cmlidXRpb25zIGhhdmUgdmFyaW91cyBpbnRyb3NwZWN0YWJsZSBhdHRyaWJ1dGVzOjoKKworICAgID4+PiBkaXN0LmxvY2F0aW9uCisgICAgJ2h0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcnCisKKyAgICA+Pj4gZGlzdC5wcm9qZWN0X25hbWUKKyAgICAnQmFyJworCisgICAgPj4+IGRpc3QudmVyc2lvbgorICAgICcwLjknCisKKyAgICA+Pj4gZGlzdC5weV92ZXJzaW9uID09IHN5cy52ZXJzaW9uWzozXQorICAgIFRydWUKKworICAgID4+PiBwcmludCBkaXN0LnBsYXRmb3JtCisgICAgTm9uZQorCitJbmNsdWRpbmcgdmFyaW91cyBjb21wdXRlZCBhdHRyaWJ1dGVzOjoKKworICAgID4+PiBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IHBhcnNlX3ZlcnNpb24KKyAgICA+Pj4gZGlzdC5wYXJzZWRfdmVyc2lvbiA9PSBwYXJzZV92ZXJzaW9uKGRpc3QudmVyc2lvbikKKyAgICBUcnVlCisKKyAgICA+Pj4gZGlzdC5rZXkgICAgIyBjYXNlLWluc2Vuc2l0aXZlIGZvcm0gb2YgdGhlIHByb2plY3QgbmFtZQorICAgICdiYXInCisKK0Rpc3RyaWJ1dGlvbnMgYXJlIGNvbXBhcmVkIChhbmQgaGFzaGVkKSBieSB2ZXJzaW9uIGZpcnN0OjoKKworICAgID4+PiBEaXN0cmlidXRpb24odmVyc2lvbj0nMS4wJykgPT0gRGlzdHJpYnV0aW9uKHZlcnNpb249JzEuMCcpCisgICAgVHJ1ZQorICAgID4+PiBEaXN0cmlidXRpb24odmVyc2lvbj0nMS4wJykgPT0gRGlzdHJpYnV0aW9uKHZlcnNpb249JzEuMScpCisgICAgRmFsc2UKKyAgICA+Pj4gRGlzdHJpYnV0aW9uKHZlcnNpb249JzEuMCcpIDwgIERpc3RyaWJ1dGlvbih2ZXJzaW9uPScxLjEnKQorICAgIFRydWUKKworYnV0IGFsc28gYnkgcHJvamVjdCBuYW1lIChjYXNlLWluc2Vuc2l0aXZlKSwgcGxhdGZvcm0sIFB5dGhvbiB2ZXJzaW9uLAorbG9jYXRpb24sIGV0Yy46OgorCisgICAgPj4+IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9IkZvbyIsdmVyc2lvbj0iMS4wIikgPT0gXAorICAgIC4uLiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLHZlcnNpb249IjEuMCIpCisgICAgVHJ1ZQorCisgICAgPj4+IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9IkZvbyIsdmVyc2lvbj0iMS4wIikgPT0gXAorICAgIC4uLiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJmb28iLHZlcnNpb249IjEuMCIpCisgICAgVHJ1ZQorCisgICAgPj4+IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9IkZvbyIsdmVyc2lvbj0iMS4wIikgPT0gXAorICAgIC4uLiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLHZlcnNpb249IjEuMSIpCisgICAgRmFsc2UKKworICAgID4+PiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLHB5X3ZlcnNpb249IjIuMyIsdmVyc2lvbj0iMS4wIikgPT0gXAorICAgIC4uLiBEaXN0cmlidXRpb24ocHJvamVjdF9uYW1lPSJGb28iLHB5X3ZlcnNpb249IjIuNCIsdmVyc2lvbj0iMS4wIikKKyAgICBGYWxzZQorCisgICAgPj4+IERpc3RyaWJ1dGlvbihsb2NhdGlvbj0ic3BhbSIsdmVyc2lvbj0iMS4wIikgPT0gXAorICAgIC4uLiBEaXN0cmlidXRpb24obG9jYXRpb249InNwYW0iLHZlcnNpb249IjEuMCIpCisgICAgVHJ1ZQorCisgICAgPj4+IERpc3RyaWJ1dGlvbihsb2NhdGlvbj0ic3BhbSIsdmVyc2lvbj0iMS4wIikgPT0gXAorICAgIC4uLiBEaXN0cmlidXRpb24obG9jYXRpb249ImJheiIsdmVyc2lvbj0iMS4wIikKKyAgICBGYWxzZQorCisKKworSGFzaCBhbmQgY29tcGFyZSBkaXN0cmlidXRpb24gYnkgcHJpby9wbGF0CisKK0dldCB2ZXJzaW9uIGZyb20gbWV0YWRhdGEKK3Byb3ZpZGVyIGNhcGFiaWxpdGllcworZWdnX25hbWUoKQorYXNfcmVxdWlyZW1lbnQoKQorZnJvbV9sb2NhdGlvbiwgZnJvbV9maWxlbmFtZSAody9wYXRoIG5vcm1hbGl6YXRpb24pCisKK1JlbGVhc2VzIG1heSBoYXZlIHplcm8gb3IgbW9yZSAiUmVxdWlyZW1lbnRzIiwgd2hpY2ggaW5kaWNhdGUKK3doYXQgcmVsZWFzZXMgb2YgYW5vdGhlciBwcm9qZWN0IHRoZSByZWxlYXNlIHJlcXVpcmVzIGluIG9yZGVyIHRvCitmdW5jdGlvbi4gIEEgUmVxdWlyZW1lbnQgbmFtZXMgdGhlIG90aGVyIHByb2plY3QsIGV4cHJlc3NlcyBzb21lIGNyaXRlcmlhCithcyB0byB3aGF0IHJlbGVhc2VzIG9mIHRoYXQgcHJvamVjdCBhcmUgYWNjZXB0YWJsZSwgYW5kIGxpc3RzIGFueSAiRXh0cmFzIgordGhhdCB0aGUgcmVxdWlyaW5nIHJlbGVhc2UgbWF5IG5lZWQgZnJvbSB0aGF0IHByb2plY3QuICAoQW4gRXh0cmEgaXMgYW4KK29wdGlvbmFsIGZlYXR1cmUgb2YgYSBSZWxlYXNlLCB0aGF0IGNhbiBvbmx5IGJlIHVzZWQgaWYgaXRzIGFkZGl0aW9uYWwKK1JlcXVpcmVtZW50cyBhcmUgc2F0aXNmaWVkLikKKworCisKK1RoZSBXb3JraW5nIFNldAorLS0tLS0tLS0tLS0tLS0tCisKK0EgY29sbGVjdGlvbiBvZiBhY3RpdmUgZGlzdHJpYnV0aW9ucyBpcyBjYWxsZWQgYSBXb3JraW5nIFNldC4gIE5vdGUgdGhhdCBhCitXb3JraW5nIFNldCBjYW4gY29udGFpbiBhbnkgaW1wb3J0YWJsZSBkaXN0cmlidXRpb24sIG5vdCBqdXN0IHBsdWdnYWJsZSBvbmVzLgorRm9yIGV4YW1wbGUsIHRoZSBQeXRob24gc3RhbmRhcmQgbGlicmFyeSBpcyBhbiBpbXBvcnRhYmxlIGRpc3RyaWJ1dGlvbiB0aGF0Cit3aWxsIHVzdWFsbHkgYmUgcGFydCBvZiB0aGUgV29ya2luZyBTZXQsIGV2ZW4gdGhvdWdoIGl0IGlzIG5vdCBwbHVnZ2FibGUuCitTaW1pbGFybHksIHdoZW4geW91IGFyZSBkb2luZyBkZXZlbG9wbWVudCB3b3JrIG9uIGEgcHJvamVjdCwgdGhlIGZpbGVzIHlvdSBhcmUKK2VkaXRpbmcgYXJlIGFsc28gYSBEaXN0cmlidXRpb24uICAoQW5kLCB3aXRoIGEgbGl0dGxlIGF0dGVudGlvbiB0byB0aGUKK2RpcmVjdG9yeSBuYW1lcyB1c2VkLCAgYW5kIGluY2x1ZGluZyBzb21lIGFkZGl0aW9uYWwgbWV0YWRhdGEsIHN1Y2ggYQorImRldmVsb3BtZW50IGRpc3RyaWJ1dGlvbiIgY2FuIGJlIG1hZGUgcGx1Z2dhYmxlIGFzIHdlbGwuKQorCisgICAgPj4+IGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgV29ya2luZ1NldAorCitBIHdvcmtpbmcgc2V0J3MgZW50cmllcyBhcmUgdGhlIHN5cy5wYXRoIGVudHJpZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSBhY3RpdmUKK2Rpc3RyaWJ1dGlvbnMuICBCeSBkZWZhdWx0LCB0aGUgd29ya2luZyBzZXQncyBlbnRyaWVzIGFyZSB0aGUgaXRlbXMgb24KK2Bgc3lzLnBhdGhgYDo6CisKKyAgICA+Pj4gd3MgPSBXb3JraW5nU2V0KCkKKyAgICA+Pj4gd3MuZW50cmllcyA9PSBzeXMucGF0aAorICAgIFRydWUKKworQnV0IHlvdSBjYW4gYWxzbyBjcmVhdGUgYW4gZW1wdHkgd29ya2luZyBzZXQgZXhwbGljaXRseSwgYW5kIGFkZCBkaXN0cmlidXRpb25zCit0byBpdDo6CisKKyAgICA+Pj4gd3MgPSBXb3JraW5nU2V0KFtdKQorICAgID4+PiB3cy5hZGQoZGlzdCkKKyAgICA+Pj4gd3MuZW50cmllcworICAgIFsnaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZyddCisgICAgPj4+IGRpc3QgaW4gd3MKKyAgICBUcnVlCisgICAgPj4+IERpc3RyaWJ1dGlvbignZm9vJyx2ZXJzaW9uPSIiKSBpbiB3cworICAgIEZhbHNlCisKK0FuZCB5b3UgY2FuIGl0ZXJhdGUgb3ZlciBpdHMgZGlzdHJpYnV0aW9uczo6CisKKyAgICA+Pj4gbGlzdCh3cykKKyAgICBbQmFyIDAuOSAoaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZyldCisKK0FkZGluZyB0aGUgc2FtZSBkaXN0cmlidXRpb24gbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcDo6CisKKyAgICA+Pj4gd3MuYWRkKGRpc3QpCisgICAgPj4+IGxpc3Qod3MpCisgICAgW0JhciAwLjkgKGh0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcpXQorCitGb3IgdGhhdCBtYXR0ZXIsIGFkZGluZyBtdWx0aXBsZSBkaXN0cmlidXRpb25zIGZvciB0aGUgc2FtZSBwcm9qZWN0IGFsc28gZG9lcworbm90aGluZywgYmVjYXVzZSBhIHdvcmtpbmcgc2V0IGNhbiBvbmx5IGhvbGQgb25lIGFjdGl2ZSBkaXN0cmlidXRpb24gcGVyCitwcm9qZWN0IC0tIHRoZSBmaXJzdCBvbmUgYWRkZWQgdG8gaXQ6OgorCisgICAgPj4+IHdzLmFkZCgKKyAgICAuLi4gICAgIERpc3RyaWJ1dGlvbigKKyAgICAuLi4gICAgICAgICAnaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZycsIHByb2plY3RfbmFtZT0iQmFyIiwKKyAgICAuLi4gICAgICAgICB2ZXJzaW9uPSI3LjIiCisgICAgLi4uICAgICApCisgICAgLi4uICkKKyAgICA+Pj4gbGlzdCh3cykKKyAgICBbQmFyIDAuOSAoaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZyldCisKK1lvdSBjYW4gYXBwZW5kIGEgcGF0aCBlbnRyeSB0byBhIHdvcmtpbmcgc2V0IHVzaW5nIGBgYWRkX2VudHJ5KClgYDo6CisKKyAgICA+Pj4gd3MuZW50cmllcworICAgIFsnaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZyddCisgICAgPj4+IHdzLmFkZF9lbnRyeShwa2dfcmVzb3VyY2VzLl9fZmlsZV9fKQorICAgID4+PiB3cy5lbnRyaWVzCisgICAgWydodHRwOi8vZXhhbXBsZS5jb20vc29tZXRoaW5nJywgJy4uLnBrZ19yZXNvdXJjZXMucHkuLi4nXQorCitNdWx0aXBsZSBhZGRpdGlvbnMgcmVzdWx0IGluIG11bHRpcGxlIGVudHJpZXMsIGV2ZW4gaWYgdGhlIGVudHJ5IGlzIGFscmVhZHkgaW4KK3RoZSB3b3JraW5nIHNldCAoYmVjYXVzZSBgYHN5cy5wYXRoYGAgY2FuIGNvbnRhaW4gdGhlIHNhbWUgZW50cnkgbW9yZSB0aGFuCitvbmNlKTo6CisKKyAgICA+Pj4gd3MuYWRkX2VudHJ5KHBrZ19yZXNvdXJjZXMuX19maWxlX18pCisgICAgPj4+IHdzLmVudHJpZXMKKyAgICBbJy4uLmV4YW1wbGUuY29tLi4uJywgJy4uLnBrZ19yZXNvdXJjZXMuLi4nLCAnLi4ucGtnX3Jlc291cmNlcy4uLiddCisKK0FuZCB5b3UgY2FuIHNwZWNpZnkgdGhlIHBhdGggZW50cnkgYSBkaXN0cmlidXRpb24gd2FzIGZvdW5kIHVuZGVyLCB1c2luZyB0aGUKK29wdGlvbmFsIHNlY29uZCBwYXJhbWV0ZXIgdG8gYGBhZGQoKWBgOjoKKworICAgID4+PiB3cyA9IFdvcmtpbmdTZXQoW10pCisgICAgPj4+IHdzLmFkZChkaXN0LCJmb28iKQorICAgID4+PiB3cy5lbnRyaWVzCisgICAgWydmb28nXQorCitCdXQgZXZlbiBpZiBhIGRpc3RyaWJ1dGlvbiBpcyBmb3VuZCB1bmRlciBtdWx0aXBsZSBwYXRoIGVudHJpZXMsIGl0IHN0aWxsIG9ubHkKK3Nob3dzIHVwIG9uY2Ugd2hlbiBpdGVyYXRpbmcgdGhlIHdvcmtpbmcgc2V0OgorCisgICAgPj4+IHdzLmFkZF9lbnRyeSh3cy5lbnRyaWVzWzBdKQorICAgID4+PiBsaXN0KHdzKQorICAgIFtCYXIgMC45IChodHRwOi8vZXhhbXBsZS5jb20vc29tZXRoaW5nKV0KKworWW91IGNhbiBhc2sgYSBXb3JraW5nU2V0IHRvIGBgZmluZCgpYGAgYSBkaXN0cmlidXRpb24gbWF0Y2hpbmcgYSByZXF1aXJlbWVudDo6CisKKyAgICA+Pj4gZnJvbSBwa2dfcmVzb3VyY2VzIGltcG9ydCBSZXF1aXJlbWVudAorICAgID4+PiBwcmludCB3cy5maW5kKFJlcXVpcmVtZW50LnBhcnNlKCJGb289PTEuMCIpKSAgICAjIG5vIG1hdGNoLCByZXR1cm4gTm9uZQorICAgIE5vbmUKKworICAgID4+PiB3cy5maW5kKFJlcXVpcmVtZW50LnBhcnNlKCJCYXI9PTAuOSIpKSAgIyBtYXRjaCwgcmV0dXJuIGRpc3RyaWJ1dGlvbgorICAgIEJhciAwLjkgKGh0dHA6Ly9leGFtcGxlLmNvbS9zb21ldGhpbmcpCisKK05vdGUgdGhhdCBhc2tpbmcgZm9yIGEgY29uZmxpY3RpbmcgdmVyc2lvbiBvZiBhIGRpc3RyaWJ1dGlvbiBhbHJlYWR5IGluIGEKK3dvcmtpbmcgc2V0IHRyaWdnZXJzIGEgYGBwa2dfcmVzb3VyY2VzLlZlcnNpb25Db25mbGljdGBgIGVycm9yOgorCisgICAgPj4+IHdzLmZpbmQoUmVxdWlyZW1lbnQucGFyc2UoIkJhcj09MS4wIikpICMgZG9jdGVzdDogK05PUk1BTElaRV9XSElURVNQQUNFCisgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgorICAgICAgLi4uCisgICAgVmVyc2lvbkNvbmZsaWN0OiAoQmFyIDAuOSAoaHR0cDovL2V4YW1wbGUuY29tL3NvbWV0aGluZyksCisgICAgICAgICAgICAgICAgICAgICAgUmVxdWlyZW1lbnQucGFyc2UoJ0Jhcj09MS4wJykpCisKK1lvdSBjYW4gc3Vic2NyaWJlIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gcmVjZWl2ZSBub3RpZmljYXRpb25zIHdoZW5ldmVyIGEgbmV3CitkaXN0cmlidXRpb24gaXMgYWRkZWQgdG8gYSB3b3JraW5nIHNldC4gIFRoZSBjYWxsYmFjayBpcyBpbW1lZGlhdGVseSBpbnZva2VkCitvbmNlIGZvciBlYWNoIGV4aXN0aW5nIGRpc3RyaWJ1dGlvbiBpbiB0aGUgd29ya2luZyBzZXQsIGFuZCB0aGVuIGlzIGNhbGxlZAorYWdhaW4gZm9yIG5ldyBkaXN0cmlidXRpb25zIGFkZGVkIHRoZXJlYWZ0ZXI6OgorCisgICAgPj4+IGRlZiBhZGRlZChkaXN0KTogcHJpbnQgIkFkZGVkIiwgZGlzdAorICAgID4+PiB3cy5zdWJzY3JpYmUoYWRkZWQpCisgICAgQWRkZWQgQmFyIDAuOQorICAgID4+PiBmb28xMiA9IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9IkZvbyIsIHZlcnNpb249IjEuMiIsIGxvY2F0aW9uPSJmMTIiKSAKKyAgICA+Pj4gd3MuYWRkKGZvbzEyKQorICAgIEFkZGVkIEZvbyAxLjIKKworTm90ZSwgaG93ZXZlciwgdGhhdCBvbmx5IHRoZSBmaXJzdCBkaXN0cmlidXRpb24gYWRkZWQgZm9yIGEgZ2l2ZW4gcHJvamVjdCBuYW1lCit3aWxsIHRyaWdnZXIgYSBjYWxsYmFjaywgZXZlbiBkdXJpbmcgdGhlIGluaXRpYWwgYGBzdWJzY3JpYmUoKWBgIGNhbGxiYWNrOjoKKworICAgID4+PiBmb28xNCA9IERpc3RyaWJ1dGlvbihwcm9qZWN0X25hbWU9IkZvbyIsIHZlcnNpb249IjEuNCIsIGxvY2F0aW9uPSJmMTQiKSAKKyAgICA+Pj4gd3MuYWRkKGZvbzE0KSAgICMgbm8gY2FsbGJhY2ssIGJlY2F1c2UgRm9vIDEuMiBpcyBhbHJlYWR5IGFjdGl2ZQorCisgICAgPj4+IHdzID0gV29ya2luZ1NldChbXSkKKyAgICA+Pj4gd3MuYWRkKGZvbzEyKQorICAgID4+PiB3cy5hZGQoZm9vMTQpCisgICAgPj4+IHdzLnN1YnNjcmliZShhZGRlZCkKKyAgICBBZGRlZCBGb28gMS4yCisgICAgCitBbmQgYWRkaW5nIGEgY2FsbGJhY2sgbW9yZSB0aGFuIG9uY2UgaGFzIG5vIGVmZmVjdCwgZWl0aGVyOjoKKworICAgID4+PiB3cy5zdWJzY3JpYmUoYWRkZWQpICAgICAjIG5vIGNhbGxiYWNrcworCisgICAgIyBhbmQgbm8gZG91YmxlLWNhbGxiYWNrcyBvbiBzdWJzZXF1ZW50IGFkZGl0aW9ucywgZWl0aGVyCisgICAgPj4+IGp1c3RfYV90ZXN0ID0gRGlzdHJpYnV0aW9uKHByb2plY3RfbmFtZT0iSnVzdEFUZXN0IiwgdmVyc2lvbj0iMC45OSIpCisgICAgPj4+IHdzLmFkZChqdXN0X2FfdGVzdCkKKyAgICBBZGRlZCBKdXN0QVRlc3QgMC45OQorCisKK0ZpbmRpbmcgUGx1Z2lucworLS0tLS0tLS0tLS0tLS0tCisKK2BgV29ya2luZ1NldGBgIG9iamVjdHMgY2FuIGJlIHVzZWQgdG8gZmlndXJlIG91dCB3aGF0IHBsdWdpbnMgaW4gYW4KK2BgRW52aXJvbm1lbnRgYCBjYW4gYmUgbG9hZGVkIHdpdGhvdXQgYW55IHJlc29sdXRpb24gZXJyb3JzOjoKKworICAgID4+PiBmcm9tIHBrZ19yZXNvdXJjZXMgaW1wb3J0IEVudmlyb25tZW50CisKKyAgICA+Pj4gcGx1Z2lucyA9IEVudmlyb25tZW50KFtdKSAgICMgbm9ybWFsbHksIGEgbGlzdCBvZiBwbHVnaW4gZGlyZWN0b3JpZXMKKyAgICA+Pj4gcGx1Z2lucy5hZGQoZm9vMTIpCisgICAgPj4+IHBsdWdpbnMuYWRkKGZvbzE0KQorICAgID4+PiBwbHVnaW5zLmFkZChqdXN0X2FfdGVzdCkKKyAgICAKK0luIHRoZSBzaW1wbGVzdCBjYXNlLCB3ZSBqdXN0IGdldCB0aGUgbmV3ZXN0IHZlcnNpb24gb2YgZWFjaCBkaXN0cmlidXRpb24gaW4KK3RoZSBwbHVnaW4gZW52aXJvbm1lbnQ6OgorCisgICAgPj4+IHdzID0gV29ya2luZ1NldChbXSkKKyAgICA+Pj4gd3MuZmluZF9wbHVnaW5zKHBsdWdpbnMpCisgICAgKFtKdXN0QVRlc3QgMC45OSwgRm9vIDEuNCAoZjE0KV0sIHt9KQorCitCdXQgaWYgdGhlcmUncyBhIHByb2JsZW0gd2l0aCBhIHZlcnNpb24gY29uZmxpY3Qgb3IgbWlzc2luZyByZXF1aXJlbWVudHMsIHRoZQorbWV0aG9kIGZhbGxzIGJhY2sgdG8gb2xkZXIgdmVyc2lvbnMsIGFuZCB0aGUgZXJyb3IgaW5mbyBkaWN0IHdpbGwgY29udGFpbiBhbgorZXhjZXB0aW9uIGluc3RhbmNlIGZvciBlYWNoIHVubG9hZGFibGUgcGx1Z2luOjoKKworICAgID4+PiB3cy5hZGQoZm9vMTIpICAgIyB0aGlzIHdpbGwgY29uZmxpY3Qgd2l0aCBGb28gMS40CisgICAgPj4+IHdzLmZpbmRfcGx1Z2lucyhwbHVnaW5zKQorICAgIChbSnVzdEFUZXN0IDAuOTksIEZvbyAxLjIgKGYxMildLCB7Rm9vIDEuNCAoZjE0KTogVmVyc2lvbkNvbmZsaWN0KC4uLil9KQorCitCdXQgaWYgeW91IGRpc2FsbG93IGZhbGxiYWNrcywgdGhlIGZhaWxlZCBwbHVnaW4gd2lsbCBiZSBza2lwcGVkIGluc3RlYWQgb2YKK3RyeWluZyBvbGRlciB2ZXJzaW9uczo6CisKKyAgICA+Pj4gd3MuZmluZF9wbHVnaW5zKHBsdWdpbnMsIGZhbGxiYWNrPUZhbHNlKQorICAgIChbSnVzdEFUZXN0IDAuOTldLCB7Rm9vIDEuNCAoZjE0KTogVmVyc2lvbkNvbmZsaWN0KC4uLil9KQorCisKKworUGxhdGZvcm0gQ29tcGF0aWJpbGl0eSBSdWxlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitPbiB0aGUgTWFjLCB0aGVyZSBhcmUgcG90ZW50aWFsIGNvbXBhdGliaWxpdHkgaXNzdWVzIGZvciBtb2R1bGVzIGNvbXBpbGVkCitvbiBuZXdlciB2ZXJzaW9ucyBvZiBNYWMgT1MgWCB0aGFuIHdoYXQgdGhlIHVzZXIgaXMgcnVubmluZy4gQWRkaXRpb25hbGx5LAorTWFjIE9TIFggd2lsbCBzb29uIGhhdmUgdHdvIHBsYXRmb3JtcyB0byBjb250ZW5kIHdpdGg6IEludGVsIGFuZCBQb3dlclBDLgorCitCYXNpYyBlcXVhbGl0eSB3b3JrcyBhcyBvbiBvdGhlciBwbGF0Zm9ybXM6OgorCisgICAgPj4+IGZyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgY29tcGF0aWJsZV9wbGF0Zm9ybXMgYXMgY3AKKyAgICA+Pj4gcmVxZCA9ICdtYWNvc3gtMTAuNC1wcGMnCisgICAgPj4+IGNwKHJlcWQsIHJlcWQpCisgICAgVHJ1ZQorICAgID4+PiBjcCgid2luMzIiLCByZXFkKQorICAgIEZhbHNlCisKK0Rpc3RyaWJ1dGlvbnMgbWFkZSBvbiBvdGhlciBtYWNoaW5lIHR5cGVzIGFyZSBub3QgY29tcGF0aWJsZTo6CisKKyAgICA+Pj4gY3AoIm1hY29zeC0xMC40LWkzODYiLCByZXFkKQorICAgIEZhbHNlCisKK0Rpc3RyaWJ1dGlvbnMgbWFkZSBvbiBlYXJsaWVyIHZlcnNpb25zIG9mIHRoZSBPUyBhcmUgY29tcGF0aWJsZSwgYXMKK2xvbmcgYXMgdGhleSBhcmUgZnJvbSB0aGUgc2FtZSB0b3AtbGV2ZWwgdmVyc2lvbi4gVGhlIHBhdGNobGV2ZWwgdmVyc2lvbgorbnVtYmVyIGRvZXMgbm90IG1hdHRlcjo6CisKKyAgICA+Pj4gY3AoIm1hY29zeC0xMC40LXBwYyIsIHJlcWQpCisgICAgVHJ1ZQorICAgID4+PiBjcCgibWFjb3N4LTEwLjMtcHBjIiwgcmVxZCkKKyAgICBUcnVlCisgICAgPj4+IGNwKCJtYWNvc3gtMTAuNS1wcGMiLCByZXFkKQorICAgIEZhbHNlCisgICAgPj4+IGNwKCJtYWNvc3gtOS41LXBwYyIsIHJlcWQpCisgICAgRmFsc2UKKworQmFja3dhcmRzIGNvbXBhdGliaWxpdHkgZm9yIHBhY2thZ2VzIG1hZGUgdmlhIGVhcmxpZXIgdmVyc2lvbnMgb2YgCitzZXR1cHRvb2xzIGlzIHByb3ZpZGVkIGFzIHdlbGw6OgorCisgICAgPj4+IGNwKCJkYXJ3aW4tOC4yLjAtUG93ZXJfTWFjaW50b3NoIiwgcmVxZCkKKyAgICBUcnVlCisgICAgPj4+IGNwKCJkYXJ3aW4tNy4yLjAtUG93ZXJfTWFjaW50b3NoIiwgcmVxZCkKKyAgICBUcnVlCisgICAgPj4+IGNwKCJkYXJ3aW4tOC4yLjAtUG93ZXJfTWFjaW50b3NoIiwgIm1hY29zeC0xMC4zLXBwYyIpCisgICAgRmFsc2UKKwpkaWZmIC0tZ2l0IGEvTGliL3NldHVwdG9vbHMvdGVzdHMvdGVzdF9yZXNvdXJjZXMucHkgYi9MaWIvc2V0dXB0b29scy90ZXN0cy90ZXN0X3Jlc291cmNlcy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzJjNzJlCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NldHVwdG9vbHMvdGVzdHMvdGVzdF9yZXNvdXJjZXMucHkKQEAgLTAsMCArMSw0ODMgQEAKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IFRlc3RDYXNlLCBtYWtlU3VpdGUKK2Zyb20gcGtnX3Jlc291cmNlcyBpbXBvcnQgKgoraW1wb3J0IHBrZ19yZXNvdXJjZXMsIHN5cworZnJvbSBzZXRzIGltcG9ydCBJbW11dGFibGVTZXQKKworY2xhc3MgTWV0YWRhdGEoRW1wdHlQcm92aWRlcik6CisgICAgIiIiTW9jayBvYmplY3QgdG8gcmV0dXJuIG1ldGFkYXRhIGFzIGlmIGZyb20gYW4gb24tZGlzayBkaXN0cmlidXRpb24iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCpwYWlycyk6CisgICAgICAgIHNlbGYubWV0YWRhdGEgPSBkaWN0KHBhaXJzKQorCisgICAgZGVmIGhhc19tZXRhZGF0YShzZWxmLG5hbWUpOgorICAgICAgICByZXR1cm4gbmFtZSBpbiBzZWxmLm1ldGFkYXRhCisKKyAgICBkZWYgZ2V0X21ldGFkYXRhKHNlbGYsbmFtZSk6CisgICAgICAgIHJldHVybiBzZWxmLm1ldGFkYXRhW25hbWVdCisKKyAgICBkZWYgZ2V0X21ldGFkYXRhX2xpbmVzKHNlbGYsbmFtZSk6CisgICAgICAgIHJldHVybiB5aWVsZF9saW5lcyhzZWxmLmdldF9tZXRhZGF0YShuYW1lKSkKKworCitjbGFzcyBEaXN0cm9UZXN0cyhUZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdENvbGxlY3Rpb24oc2VsZik6CisgICAgICAgICMgZW1wdHkgcGF0aCBzaG91bGQgcHJvZHVjZSBubyBkaXN0cmlidXRpb25zCisgICAgICAgIGFkID0gRW52aXJvbm1lbnQoW10sIHBsYXRmb3JtPU5vbmUsIHB5dGhvbj1Ob25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYWQpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChhZFsnRm9vUGtnJ10sW10pCisKKyAgICAgICAgYWQuYWRkKERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKCJGb29Qa2ctMS4zXzEuZWdnIikpCisgICAgICAgIGFkLmFkZChEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiRm9vUGtnLTEuNC1weTIuNC13aW4zMi5lZ2ciKSkKKyAgICAgICAgYWQuYWRkKERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKCJGb29Qa2ctMS4yLXB5Mi40LmVnZyIpKQorCisgICAgICAgICMgTmFtZSBpcyBpbiB0aGVyZSBub3cKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGFkWydGb29Qa2cnXSkKKworICAgICAgICAjIEJ1dCBvbmx5IDEgcGFja2FnZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoYWQpLCBbJ2Zvb3BrZyddKQorCisKKworICAgICAgICAjIERpc3RyaWJ1dGlvbnMgc29ydCBieSB2ZXJzaW9uCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBbZGlzdC52ZXJzaW9uIGZvciBkaXN0IGluIGFkWydGb29Qa2cnXV0sIFsnMS40JywnMS4zLTEnLCcxLjInXQorICAgICAgICApCisgICAgICAgICMgUmVtb3ZpbmcgYSBkaXN0cmlidXRpb24gbGVhdmVzIHNlcXVlbmNlIGFsb25lCisgICAgICAgIGFkLnJlbW92ZShhZFsnRm9vUGtnJ11bMV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBbZGlzdC52ZXJzaW9uIGZvciBkaXN0IGluIGFkWydGb29Qa2cnXV0sIFsnMS40JywnMS4yJ10KKyAgICAgICAgKQorICAgICAgICAjIEFuZCBpbnNlcnRpbmcgYWRkcyB0aGVtIGluIG9yZGVyCisgICAgICAgIGFkLmFkZChEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiRm9vUGtnLTEuOS5lZ2ciKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIFtkaXN0LnZlcnNpb24gZm9yIGRpc3QgaW4gYWRbJ0Zvb1BrZyddXSwgWycxLjknLCcxLjQnLCcxLjInXQorICAgICAgICApCisKKyAgICAgICAgd3MgPSBXb3JraW5nU2V0KFtdKQorICAgICAgICBmb28xMiA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKCJGb29Qa2ctMS4yLXB5Mi40LmVnZyIpCisgICAgICAgIGZvbzE0ID0gRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoIkZvb1BrZy0xLjQtcHkyLjQtd2luMzIuZWdnIikKKyAgICAgICAgcmVxLCA9IHBhcnNlX3JlcXVpcmVtZW50cygiRm9vUGtnPj0xLjMiKQorCisgICAgICAgICMgTm9taW5hbCBjYXNlOiBubyBkaXN0cm9zIG9uIHBhdGgsIHNob3VsZCB5aWVsZCBhbGwgYXBwbGljYWJsZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGFkLmJlc3RfbWF0Y2gocmVxLHdzKS52ZXJzaW9uLCAnMS45JykKKyAgICAgICAgIyBJZiBhIG1hdGNoaW5nIGRpc3RybyBpcyBhbHJlYWR5IGluc3RhbGxlZCwgc2hvdWxkIHJldHVybiBvbmx5IHRoYXQKKyAgICAgICAgd3MuYWRkKGZvbzE0KTsgc2VsZi5hc3NlcnRFcXVhbChhZC5iZXN0X21hdGNoKHJlcSx3cykudmVyc2lvbiwgJzEuNCcpCisKKyAgICAgICAgIyBJZiB0aGUgZmlyc3QgbWF0Y2hpbmcgZGlzdHJvIGlzIHVuc3VpdGFibGUsIGl0J3MgYSB2ZXJzaW9uIGNvbmZsaWN0CisgICAgICAgIHdzID0gV29ya2luZ1NldChbXSk7IHdzLmFkZChmb28xMik7IHdzLmFkZChmb28xNCkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmVyc2lvbkNvbmZsaWN0LCBhZC5iZXN0X21hdGNoLCByZXEsIHdzKQorCisgICAgICAgICMgSWYgbW9yZSB0aGFuIG9uZSBtYXRjaCBvbiB0aGUgcGF0aCwgdGhlIGZpcnN0IG9uZSB0YWtlcyBwcmVjZWRlbmNlCisgICAgICAgIHdzID0gV29ya2luZ1NldChbXSk7IHdzLmFkZChmb28xNCk7IHdzLmFkZChmb28xMik7IHdzLmFkZChmb28xNCk7CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWQuYmVzdF9tYXRjaChyZXEsd3MpLnZlcnNpb24sICcxLjQnKQorCisgICAgZGVmIGNoZWNrRm9vUGtnKHNlbGYsZCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5wcm9qZWN0X25hbWUsICJGb29Qa2ciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQua2V5LCAiZm9vcGtnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnZlcnNpb24sICIxLjMtMSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZC5weV92ZXJzaW9uLCAiMi40IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkLnBsYXRmb3JtLCAid2luMzIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucGFyc2VkX3ZlcnNpb24sIHBhcnNlX3ZlcnNpb24oIjEuMy0xIikpCisKKyAgICBkZWYgdGVzdERpc3Ryb0Jhc2ljcyhzZWxmKToKKyAgICAgICAgZCA9IERpc3RyaWJ1dGlvbigKKyAgICAgICAgICAgICIvc29tZS9wYXRoIiwKKyAgICAgICAgICAgIHByb2plY3RfbmFtZT0iRm9vUGtnIix2ZXJzaW9uPSIxLjMtMSIscHlfdmVyc2lvbj0iMi40IixwbGF0Zm9ybT0id2luMzIiCisgICAgICAgICkKKyAgICAgICAgc2VsZi5jaGVja0Zvb1BrZyhkKQorCisgICAgICAgIGQgPSBEaXN0cmlidXRpb24oIi9zb21lL3BhdGgiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucHlfdmVyc2lvbiwgc3lzLnZlcnNpb25bOjNdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGQucGxhdGZvcm0sIE5vbmUpCisKKyAgICBkZWYgdGVzdERpc3Ryb1BhcnNlKHNlbGYpOgorICAgICAgICBkID0gRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoIkZvb1BrZy0xLjNfMS1weTIuNC13aW4zMi5lZ2ciKQorICAgICAgICBzZWxmLmNoZWNrRm9vUGtnKGQpCisgICAgICAgIGQgPSBEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiRm9vUGtnLTEuM18xLXB5Mi40LXdpbjMyLmVnZy1pbmZvIikKKyAgICAgICAgc2VsZi5jaGVja0Zvb1BrZyhkKQorCisgICAgZGVmIHRlc3REaXN0cm9NZXRhZGF0YShzZWxmKToKKyAgICAgICAgZCA9IERpc3RyaWJ1dGlvbigKKyAgICAgICAgICAgICIvc29tZS9wYXRoIiwgcHJvamVjdF9uYW1lPSJGb29Qa2ciLCBweV92ZXJzaW9uPSIyLjQiLCBwbGF0Zm9ybT0id2luMzIiLAorICAgICAgICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YSgKKyAgICAgICAgICAgICAgICAoJ1BLRy1JTkZPJywiTWV0YWRhdGEtVmVyc2lvbjogMS4wXG5WZXJzaW9uOiAxLjMtMVxuIikKKyAgICAgICAgICAgICkKKyAgICAgICAgKQorICAgICAgICBzZWxmLmNoZWNrRm9vUGtnKGQpCisKKworICAgIGRlZiBkaXN0UmVxdWlyZXMoc2VsZiwgdHh0KToKKyAgICAgICAgcmV0dXJuIERpc3RyaWJ1dGlvbigiL2ZvbyIsIG1ldGFkYXRhPU1ldGFkYXRhKCgnZGVwZW5kcy50eHQnLCB0eHQpKSkKKworICAgIGRlZiBjaGVja1JlcXVpcmVzKHNlbGYsIGRpc3QsIHR4dCwgZXh0cmFzPSgpKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGxpc3QoZGlzdC5yZXF1aXJlcyhleHRyYXMpKSwKKyAgICAgICAgICAgIGxpc3QocGFyc2VfcmVxdWlyZW1lbnRzKHR4dCkpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0RGlzdHJvRGVwZW5kc1NpbXBsZShzZWxmKToKKyAgICAgICAgZm9yIHYgaW4gIlR3aXN0ZWQ+PTEuNSIsICJUd2lzdGVkPj0xLjVcblpDb25maWc+PTIuMCI6CisgICAgICAgICAgICBzZWxmLmNoZWNrUmVxdWlyZXMoc2VsZi5kaXN0UmVxdWlyZXModiksIHYpCisKKworICAgIGRlZiB0ZXN0UmVzb2x2ZShzZWxmKToKKyAgICAgICAgYWQgPSBFbnZpcm9ubWVudChbXSk7IHdzID0gV29ya2luZ1NldChbXSkKKyAgICAgICAgIyBSZXNvbHZpbmcgbm8gcmVxdWlyZW1lbnRzIC0+IG5vdGhpbmcgdG8gaW5zdGFsbAorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCBsaXN0KHdzLnJlc29sdmUoW10sYWQpKSwgW10gKQorICAgICAgICAjIFJlcXVlc3Qgc29tZXRoaW5nIG5vdCBpbiB0aGUgY29sbGVjdGlvbiAtPiBEaXN0cmlidXRpb25Ob3RGb3VuZAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgIERpc3RyaWJ1dGlvbk5vdEZvdW5kLCB3cy5yZXNvbHZlLCBwYXJzZV9yZXF1aXJlbWVudHMoIkZvbyIpLCBhZAorICAgICAgICApCisgICAgICAgIEZvbyA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKAorICAgICAgICAgICAgIi9mb29fZGlyL0Zvby0xLjIuZWdnIiwKKyAgICAgICAgICAgIG1ldGFkYXRhPU1ldGFkYXRhKCgnZGVwZW5kcy50eHQnLCAiW2Jhcl1cbkJhej49Mi4wIikpCisgICAgICAgICkKKyAgICAgICAgYWQuYWRkKEZvbyk7IGFkLmFkZChEaXN0cmlidXRpb24uZnJvbV9maWxlbmFtZSgiRm9vLTAuOS5lZ2ciKSkKKworICAgICAgICAjIFJlcXVlc3QgdGhpbmcocykgdGhhdCBhcmUgYXZhaWxhYmxlIC0+IGxpc3QgdG8gYWN0aXZhdGUKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICAgICAgICB0YXJnZXRzID0gbGlzdCh3cy5yZXNvbHZlKHBhcnNlX3JlcXVpcmVtZW50cygiRm9vIiksIGFkKSkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodGFyZ2V0cywgW0Zvb10pCisgICAgICAgICAgICBtYXAod3MuYWRkLHRhcmdldHMpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZlcnNpb25Db25mbGljdCwgd3MucmVzb2x2ZSwKKyAgICAgICAgICAgIHBhcnNlX3JlcXVpcmVtZW50cygiRm9vPT0wLjkiKSwgYWQpCisgICAgICAgIHdzID0gV29ya2luZ1NldChbXSkgIyByZXNldAorCisgICAgICAgICMgUmVxdWVzdCBhbiBleHRyYSB0aGF0IGNhdXNlcyBhbiB1bnJlc29sdmVkIGRlcGVuZGVuY3kgZm9yICJCYXoiCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgRGlzdHJpYnV0aW9uTm90Rm91bmQsIHdzLnJlc29sdmUscGFyc2VfcmVxdWlyZW1lbnRzKCJGb29bYmFyXSIpLCBhZAorICAgICAgICApCisgICAgICAgIEJheiA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKAorICAgICAgICAgICAgIi9mb29fZGlyL0Jhei0yLjEuZWdnIiwgbWV0YWRhdGE9TWV0YWRhdGEoKCdkZXBlbmRzLnR4dCcsICJGb28iKSkKKyAgICAgICAgKQorICAgICAgICBhZC5hZGQoQmF6KQorCisgICAgICAgICMgQWN0aXZhdGlvbiBsaXN0IG5vdyBpbmNsdWRlcyByZXNvbHZlZCBkZXBlbmRlbmN5CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBsaXN0KHdzLnJlc29sdmUocGFyc2VfcmVxdWlyZW1lbnRzKCJGb29bYmFyXSIpLCBhZCkpLCBbRm9vLEJhel0KKyAgICAgICAgKQorICAgICAgICAjIFJlcXVlc3RzIGZvciBjb25mbGljdGluZyB2ZXJzaW9ucyBwcm9kdWNlIFZlcnNpb25Db25mbGljdAorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyggVmVyc2lvbkNvbmZsaWN0LAorICAgICAgICAgICAgd3MucmVzb2x2ZSwgcGFyc2VfcmVxdWlyZW1lbnRzKCJGb289PTEuMlxuRm9vIT0xLjIiKSwgYWQKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3REaXN0cm9EZXBlbmRzT3B0aW9ucyhzZWxmKToKKyAgICAgICAgZCA9IHNlbGYuZGlzdFJlcXVpcmVzKCIiIgorICAgICAgICAgICAgVHdpc3RlZD49MS41CisgICAgICAgICAgICBbZG9jZ2VuXQorICAgICAgICAgICAgWkNvbmZpZz49Mi4wCisgICAgICAgICAgICBkb2N1dGlscz49MC4zCisgICAgICAgICAgICBbZmFzdGNnaV0KKyAgICAgICAgICAgIGZjZ2lhcHA+PTAuMSIiIikKKyAgICAgICAgc2VsZi5jaGVja1JlcXVpcmVzKGQsIlR3aXN0ZWQ+PTEuNSIpCisgICAgICAgIHNlbGYuY2hlY2tSZXF1aXJlcygKKyAgICAgICAgICAgIGQsIlR3aXN0ZWQ+PTEuNSBaQ29uZmlnPj0yLjAgZG9jdXRpbHM+PTAuMyIuc3BsaXQoKSwgWyJkb2NnZW4iXQorICAgICAgICApCisgICAgICAgIHNlbGYuY2hlY2tSZXF1aXJlcygKKyAgICAgICAgICAgIGQsIlR3aXN0ZWQ+PTEuNSBmY2dpYXBwPj0wLjEiLnNwbGl0KCksIFsiZmFzdGNnaSJdCisgICAgICAgICkKKyAgICAgICAgc2VsZi5jaGVja1JlcXVpcmVzKAorICAgICAgICAgICAgZCwiVHdpc3RlZD49MS41IFpDb25maWc+PTIuMCBkb2N1dGlscz49MC4zIGZjZ2lhcHA+PTAuMSIuc3BsaXQoKSwKKyAgICAgICAgICAgIFsiZG9jZ2VuIiwiZmFzdGNnaSJdCisgICAgICAgICkKKyAgICAgICAgc2VsZi5jaGVja1JlcXVpcmVzKAorICAgICAgICAgICAgZCwiVHdpc3RlZD49MS41IGZjZ2lhcHA+PTAuMSBaQ29uZmlnPj0yLjAgZG9jdXRpbHM+PTAuMyIuc3BsaXQoKSwKKyAgICAgICAgICAgIFsiZmFzdGNnaSIsICJkb2NnZW4iXQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVua25vd25FeHRyYSwgZC5yZXF1aXJlcywgWyJmb28iXSkKKworCisKKworCisKKworCisKKworCisKKworCisKKworCitjbGFzcyBFbnRyeVBvaW50VGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIGFzc2VydGZpZWxkcyhzZWxmLCBlcCk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAubmFtZSwiZm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcC5tb2R1bGVfbmFtZSwic2V0dXB0b29scy50ZXN0cy50ZXN0X3Jlc291cmNlcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAuYXR0cnMsICgiRW50cnlQb2ludFRlc3RzIiwpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLmV4dHJhcywgKCJ4IiwpKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZXAubG9hZCgpIGlzIEVudHJ5UG9pbnRUZXN0cykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHN0cihlcCksCisgICAgICAgICAgICAiZm9vID0gc2V0dXB0b29scy50ZXN0cy50ZXN0X3Jlc291cmNlczpFbnRyeVBvaW50VGVzdHMgW3hdIgorICAgICAgICApCisKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuZGlzdCA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKAorICAgICAgICAgICAgIkZvb1BrZy0xLjItcHkyLjQuZWdnIiwgbWV0YWRhdGE9TWV0YWRhdGEoKCdyZXF1aXJlcy50eHQnLCdbeF0nKSkpCisKKyAgICBkZWYgdGVzdEJhc2ljcyhzZWxmKToKKyAgICAgICAgZXAgPSBFbnRyeVBvaW50KAorICAgICAgICAgICAgImZvbyIsICJzZXR1cHRvb2xzLnRlc3RzLnRlc3RfcmVzb3VyY2VzIiwgWyJFbnRyeVBvaW50VGVzdHMiXSwKKyAgICAgICAgICAgIFsieCJdLCBzZWxmLmRpc3QKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydGZpZWxkcyhlcCkKKworICAgIGRlZiB0ZXN0UGFyc2Uoc2VsZik6CisgICAgICAgIHMgPSAiZm9vID0gc2V0dXB0b29scy50ZXN0cy50ZXN0X3Jlc291cmNlczpFbnRyeVBvaW50VGVzdHMgW3hdIgorICAgICAgICBlcCA9IEVudHJ5UG9pbnQucGFyc2Uocywgc2VsZi5kaXN0KQorICAgICAgICBzZWxmLmFzc2VydGZpZWxkcyhlcCkKKworICAgICAgICBlcCA9IEVudHJ5UG9pbnQucGFyc2UoImJhciBiYXo9ICBzcGFtbWl0eVtQSU5HXSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAubmFtZSwiYmFyIGJheiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAubW9kdWxlX25hbWUsInNwYW1taXR5IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcC5hdHRycywgKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAuZXh0cmFzLCAoInBpbmciLCkpCisKKyAgICAgICAgZXAgPSBFbnRyeVBvaW50LnBhcnNlKCIgZml6emx5ID0gIHdvY2thOmZvbyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXAubmFtZSwiZml6emx5IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcC5tb2R1bGVfbmFtZSwid29ja2EiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVwLmF0dHJzLCAoImZvbyIsKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlcC5leHRyYXMsICgpKQorCisgICAgZGVmIHRlc3RSZWplY3RzKHNlbGYpOgorICAgICAgICBmb3IgZXAgaW4gWworICAgICAgICAgICAgImZvbyIsICJ4PTE9MiIsICJ4PWE6YjpjIiwgInE9eC9uYSIsICJmZXo9cGlzaDp0dXNoLXoiLCAieD1mW2FdPjIiLAorICAgICAgICBdOgorICAgICAgICAgICAgdHJ5OiBFbnRyeVBvaW50LnBhcnNlKGVwKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6IHBhc3MKKyAgICAgICAgICAgIGVsc2U6IHJhaXNlIEFzc2VydGlvbkVycm9yKCJTaG91bGQndmUgYmVlbiBiYWQiLCBlcCkKKworICAgIGRlZiBjaGVja1N1Yk1hcChzZWxmLCBtKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIobSksCisgICAgICAgICAgICAieyIKKyAgICAgICAgICAgICInZmVhdHVyZTInOiBFbnRyeVBvaW50LnBhcnNlKCIKKyAgICAgICAgICAgICAgICAiJ2ZlYXR1cmUyID0gYW5vdGhlci5tb2R1bGU6U29tZUNsYXNzIFtleHRyYTEsZXh0cmEyXScpLCAiCisgICAgICAgICAgICAiJ2ZlYXR1cmUxJzogRW50cnlQb2ludC5wYXJzZSgiCisgICAgICAgICAgICAgICAgIidmZWF0dXJlMSA9IHNvbWVtb2R1bGU6c29tZWZ1bmN0aW9uJykiCisgICAgICAgICAgICAifSIKKyAgICAgICAgKQorCisgICAgc3VibWFwX3N0ciA9ICIiIgorICAgICAgICAgICAgIyBkZWZpbmUgZmVhdHVyZXMgZm9yIGJsYWggYmxhaAorICAgICAgICAgICAgZmVhdHVyZTEgPSBzb21lbW9kdWxlOnNvbWVmdW5jdGlvbgorICAgICAgICAgICAgZmVhdHVyZTIgPSBhbm90aGVyLm1vZHVsZTpTb21lQ2xhc3MgW2V4dHJhMSxleHRyYTJdCisgICAgIiIiCisKKyAgICBkZWYgdGVzdFBhcnNlTGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5jaGVja1N1Yk1hcChFbnRyeVBvaW50LnBhcnNlX2dyb3VwKCJ4eXoiLCBzZWxmLnN1Ym1hcF9zdHIpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBFbnRyeVBvaW50LnBhcnNlX2dyb3VwLCAieCBhIiwgImZvbz1iYXIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBFbnRyeVBvaW50LnBhcnNlX2dyb3VwLCAieCIsCisgICAgICAgICAgICBbImZvbz1iYXoiLCAiZm9vPWJhciJdKQorCisgICAgZGVmIHRlc3RQYXJzZU1hcChzZWxmKToKKyAgICAgICAgbSA9IEVudHJ5UG9pbnQucGFyc2VfbWFwKHsneHl6JzpzZWxmLnN1Ym1hcF9zdHJ9KQorICAgICAgICBzZWxmLmNoZWNrU3ViTWFwKG1bJ3h5eiddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ua2V5cygpLFsneHl6J10pCisgICAgICAgIG0gPSBFbnRyeVBvaW50LnBhcnNlX21hcCgiW3h5el1cbiIrc2VsZi5zdWJtYXBfc3RyKQorICAgICAgICBzZWxmLmNoZWNrU3ViTWFwKG1bJ3h5eiddKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG0ua2V5cygpLFsneHl6J10pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIEVudHJ5UG9pbnQucGFyc2VfbWFwLCBbIlt4eXpdIiwgIlt4eXpdIl0pCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIEVudHJ5UG9pbnQucGFyc2VfbWFwLCBzZWxmLnN1Ym1hcF9zdHIpCisKKworY2xhc3MgUmVxdWlyZW1lbnRzVGVzdHMoVGVzdENhc2UpOgorCisgICAgZGVmIHRlc3RCYXNpY3Moc2VsZik6CisgICAgICAgIHIgPSBSZXF1aXJlbWVudC5wYXJzZSgiVHdpc3RlZD49MS4yIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIociksIlR3aXN0ZWQ+PTEuMiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihyKSwiUmVxdWlyZW1lbnQucGFyc2UoJ1R3aXN0ZWQ+PTEuMicpIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyLCBSZXF1aXJlbWVudCgiVHdpc3RlZCIsIFsoJz49JywnMS4yJyldLCAoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwociwgUmVxdWlyZW1lbnQoInR3aXNUZWQiLCBbKCc+PScsJzEuMicpXSwgKCkpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHIsIFJlcXVpcmVtZW50KCJUd2lzdGVkIiwgWygnPj0nLCcyLjAnKV0sICgpKSkKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChyLCBSZXF1aXJlbWVudCgiWm9wZSIsIFsoJz49JywnMS4yJyldLCAoKSkpCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwociwgUmVxdWlyZW1lbnQoIlpvcGUiLCBbKCc+PScsJzMuMCcpXSwgKCkpKQorICAgICAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHIsIFJlcXVpcmVtZW50LnBhcnNlKCJUd2lzdGVkW2V4dHJhc10+PTEuMiIpKQorCisgICAgZGVmIHRlc3RPcmRlcmluZyhzZWxmKToKKyAgICAgICAgcjEgPSBSZXF1aXJlbWVudCgiVHdpc3RlZCIsIFsoJz09JywnMS4yYzEnKSwoJz49JywnMS4yJyldLCAoKSkKKyAgICAgICAgcjIgPSBSZXF1aXJlbWVudCgiVHdpc3RlZCIsIFsoJz49JywnMS4yJyksKCc9PScsJzEuMmMxJyldLCAoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyMSxyMikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIocjEpLHN0cihyMikpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKHIyKSwiVHdpc3RlZD09MS4yYzEsPj0xLjIiKQorCisgICAgZGVmIHRlc3RCYXNpY0NvbnRhaW5zKHNlbGYpOgorICAgICAgICByID0gUmVxdWlyZW1lbnQoIlR3aXN0ZWQiLCBbKCc+PScsJzEuMicpXSwgKCkpCisgICAgICAgIGZvb19kaXN0ID0gRGlzdHJpYnV0aW9uLmZyb21fZmlsZW5hbWUoIkZvb1BrZy0xLjNfMS5lZ2ciKQorICAgICAgICB0d2lzdDExICA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKCJUd2lzdGVkLTEuMS5lZ2ciKQorICAgICAgICB0d2lzdDEyICA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lKCJUd2lzdGVkLTEuMi5lZ2ciKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MocGFyc2VfdmVyc2lvbignMS4yJykgaW4gcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHBhcnNlX3ZlcnNpb24oJzEuMScpIG5vdCBpbiByKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoJzEuMicgaW4gcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKCcxLjEnIG5vdCBpbiByKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZm9vX2Rpc3Qgbm90IGluIHIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0d2lzdDExIG5vdCBpbiByKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHdpc3QxMiBpbiByKQorCisgICAgZGVmIHRlc3RBZHZhbmNlZENvbnRhaW5zKHNlbGYpOgorICAgICAgICByLCA9IHBhcnNlX3JlcXVpcmVtZW50cygiRm9vPj0xLjIsPD0xLjMsPT0xLjksPjIuMCwhPTIuNSw8My4wLD09NC41IikKKyAgICAgICAgZm9yIHYgaW4gKCcxLjInLCcxLjIuMicsJzEuMycsJzEuOScsJzIuMC4xJywnMi4zJywnMi42JywnMy4wYzEnLCc0LjUnKToKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyh2IGluIHIsICh2LHIpKQorICAgICAgICBmb3IgdiBpbiAoJzEuMmMxJywnMS4zLjEnLCcxLjUnLCcxLjkuMScsJzIuMCcsJzIuNScsJzMuMCcsJzQuMCcpOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKHYgbm90IGluIHIsICh2LHIpKQorCisKKyAgICBkZWYgdGVzdE9wdGlvbnNBbmRIYXNoaW5nKHNlbGYpOgorICAgICAgICByMSA9IFJlcXVpcmVtZW50LnBhcnNlKCJUd2lzdGVkW2ZvbyxiYXJdPj0xLjIiKQorICAgICAgICByMiA9IFJlcXVpcmVtZW50LnBhcnNlKCJUd2lzdGVkW2JhcixGT09dPj0xLjIiKQorICAgICAgICByMyA9IFJlcXVpcmVtZW50LnBhcnNlKCJUd2lzdGVkW0JBUixGT09dPj0xLjIuMCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocjEscjIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocjEscjMpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocjEuZXh0cmFzLCAoImZvbyIsImJhciIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHIyLmV4dHJhcywgKCJiYXIiLCJmb28iKSkgICMgZXh0cmFzIGFyZSBub3JtYWxpemVkCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaGFzaChyMSksIGhhc2gocjIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgaGFzaChyMSksIGhhc2goKCJ0d2lzdGVkIiwgKCgiPj0iLHBhcnNlX3ZlcnNpb24oIjEuMiIpKSwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZVNldChbImZvbyIsImJhciJdKSkpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0VmVyc2lvbkVxdWFsaXR5KHNlbGYpOgorICAgICAgICByMSA9IFJlcXVpcmVtZW50LnBhcnNlKCJzZXR1cHRvb2xzPT0wLjNhMiIpCisgICAgICAgIHIyID0gUmVxdWlyZW1lbnQucGFyc2UoInNldHVwdG9vbHMhPTAuM2E0IikKKyAgICAgICAgZCA9IERpc3RyaWJ1dGlvbi5mcm9tX2ZpbGVuYW1lCisKKyAgICAgICAgc2VsZi5mYWlsSWYoZCgic2V0dXB0b29scy0wLjNhNC5lZ2ciKSBpbiByMSkKKyAgICAgICAgc2VsZi5mYWlsSWYoZCgic2V0dXB0b29scy0wLjNhMS5lZ2ciKSBpbiByMSkKKyAgICAgICAgc2VsZi5mYWlsSWYoZCgic2V0dXB0b29scy0wLjNhNC5lZ2ciKSBpbiByMikKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZCgic2V0dXB0b29scy0wLjNhMi5lZ2ciKSBpbiByMSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGQoInNldHVwdG9vbHMtMC4zYTIuZWdnIikgaW4gcjIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhkKCJzZXR1cHRvb2xzLTAuM2EzLmVnZyIpIGluIHIyKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoZCgic2V0dXB0b29scy0wLjNhNS5lZ2ciKSBpbiByMikKKworCisKKworCisKKworCisKKworCisKKworCitjbGFzcyBQYXJzZVRlc3RzKFRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0RW1wdHlQYXJzZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHBhcnNlX3JlcXVpcmVtZW50cygnJykpLCBbXSkKKworICAgIGRlZiB0ZXN0WWllbGRpbmcoc2VsZik6CisgICAgICAgIGZvciBpbnAsb3V0IGluIFsKKyAgICAgICAgICAgIChbXSwgW10pLCAoJ3gnLFsneCddKSwgKFtbXV0sW10pLCAoJyB4XG4geScsIFsneCcsJ3knXSksCisgICAgICAgICAgICAoWyd4XG5cbicsJ3knXSwgWyd4JywneSddKSwKKyAgICAgICAgXToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChwa2dfcmVzb3VyY2VzLnlpZWxkX2xpbmVzKGlucCkpLG91dCkKKworICAgIGRlZiB0ZXN0U3BsaXR0aW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbGlzdCgKKyAgICAgICAgICAgICAgICBwa2dfcmVzb3VyY2VzLnNwbGl0X3NlY3Rpb25zKCIiIgorICAgICAgICAgICAgICAgICAgICB4CisgICAgICAgICAgICAgICAgICAgIFtZXQorICAgICAgICAgICAgICAgICAgICB6CisKKyAgICAgICAgICAgICAgICAgICAgYQorICAgICAgICAgICAgICAgICAgICBbYiBdCisgICAgICAgICAgICAgICAgICAgICMgZm9vCisgICAgICAgICAgICAgICAgICAgIGMKKyAgICAgICAgICAgICAgICAgICAgWyBkXQorICAgICAgICAgICAgICAgICAgICBbcV0KKyAgICAgICAgICAgICAgICAgICAgdgorICAgICAgICAgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApLAorICAgICAgICAgICAgWyhOb25lLFsieCJdKSwgKCJZIixbInoiLCJhIl0pLCAoImIiLFsiYyJdKSwgKCJkIixbXSksICgicSIsWyJ2Il0pXQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsbGlzdCxwa2dfcmVzb3VyY2VzLnNwbGl0X3NlY3Rpb25zKCJbZm9vIikpCisKKyAgICBkZWYgdGVzdFNhZmVOYW1lKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNhZmVfbmFtZSgiYWRucy1weXRob24iKSwgImFkbnMtcHl0aG9uIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX25hbWUoIldTR0kgVXRpbHMiKSwgICJXU0dJLVV0aWxzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX25hbWUoIldTR0kgIFV0aWxzIiksICJXU0dJLVV0aWxzIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX25hbWUoIk1vbmV5JCQkTWFrZXIiKSwgIk1vbmV5LU1ha2VyIikKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChzYWZlX25hbWUoInBlYWsud2ViIiksICJwZWFrLXdlYiIpCisKKyAgICBkZWYgdGVzdFNhZmVWZXJzaW9uKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNhZmVfdmVyc2lvbigiMS4yLTEiKSwgIjEuMi0xIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzYWZlX3ZlcnNpb24oIjEuMiBhbHBoYSIpLCAgIjEuMi5hbHBoYSIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2FmZV92ZXJzaW9uKCIyLjMuNCAyMDA1MDUyMSIpLCAiMi4zLjQuMjAwNTA1MjEiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNhZmVfdmVyc2lvbigiTW9uZXkkJCRNYWtlciIpLCAiTW9uZXktTWFrZXIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNhZmVfdmVyc2lvbigicGVhay53ZWIiKSwgInBlYWsud2ViIikKKworICAgIGRlZiB0ZXN0U2ltcGxlUmVxdWlyZW1lbnRzKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbGlzdChwYXJzZV9yZXF1aXJlbWVudHMoJ1R3aXMtVGVkPj0xLjItMScpKSwKKyAgICAgICAgICAgIFtSZXF1aXJlbWVudCgnVHdpcy1UZWQnLFsoJz49JywnMS4yLTEnKV0sICgpKV0KKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICAgbGlzdChwYXJzZV9yZXF1aXJlbWVudHMoJ1R3aXN0ZWQgPj0xLjIsIFwgIyBtb3JlXG48Mi4wJykpLAorICAgICAgICAgICAgW1JlcXVpcmVtZW50KCdUd2lzdGVkJyxbKCc+PScsJzEuMicpLCgnPCcsJzIuMCcpXSwgKCkpXQorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBSZXF1aXJlbWVudC5wYXJzZSgiRm9vQmFyPT0xLjk5YTMiKSwKKyAgICAgICAgICAgIFJlcXVpcmVtZW50KCJGb29CYXIiLCBbKCc9PScsJzEuOTlhMycpXSwgKCkpCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcixSZXF1aXJlbWVudC5wYXJzZSwiPj0yLjMiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLFJlcXVpcmVtZW50LnBhcnNlLCJ4XFwiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLFJlcXVpcmVtZW50LnBhcnNlLCJ4PT0yIHEiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLFJlcXVpcmVtZW50LnBhcnNlLCJYPT0xXG5ZPT0yIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcixSZXF1aXJlbWVudC5wYXJzZSwiIyIpCisKKyAgICBkZWYgdGVzdFZlcnNpb25FcXVhbGl0eShzZWxmKToKKyAgICAgICAgZGVmIGMoczEsczIpOgorICAgICAgICAgICAgcDEsIHAyID0gcGFyc2VfdmVyc2lvbihzMSkscGFyc2VfdmVyc2lvbihzMikKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocDEscDIsIChzMSxzMixwMSxwMikpCisKKyAgICAgICAgYygnMS4yLXJjMScsICcxLjJyYzEnKQorICAgICAgICBjKCcwLjQnLCAnMC40LjAnKQorICAgICAgICBjKCcwLjQuMC4wJywgJzAuNC4wJykKKyAgICAgICAgYygnMC40LjAtMCcsICcwLjQtMCcpCisgICAgICAgIGMoJzBwbDEnLCAnMC4wcGwxJykKKyAgICAgICAgYygnMHByZTEnLCAnMC4wYzEnKQorICAgICAgICBjKCcwLjAuMHByZXZpZXcxJywgJzBjMScpCisgICAgICAgIGMoJzAuMGMxJywgJzAtcmMxJykKKyAgICAgICAgYygnMS4yYTEnLCAnMS4yLmEuMScpOyBjKCcxLjIuLi5hJywgJzEuMmEnKQorCisgICAgZGVmIHRlc3RWZXJzaW9uT3JkZXJpbmcoc2VsZik6CisgICAgICAgIGRlZiBjKHMxLHMyKToKKyAgICAgICAgICAgIHAxLCBwMiA9IHBhcnNlX3ZlcnNpb24oczEpLHBhcnNlX3ZlcnNpb24oczIpCisgICAgICAgICAgICBzZWxmLmZhaWxVbmxlc3MocDE8cDIsIChzMSxzMixwMSxwMikpCisKKyAgICAgICAgYygnMi4xJywnMi4xLjEnKQorICAgICAgICBjKCcyYTEnLCcyYjAnKQorICAgICAgICBjKCcyYTEnLCcyLjEnKQorICAgICAgICBjKCcyLjNhMScsICcyLjMnKQorICAgICAgICBjKCcyLjEtMScsICcyLjEtMicpCisgICAgICAgIGMoJzIuMS0xJywgJzIuMS4xJykKKyAgICAgICAgYygnMi4xJywgJzIuMXBsNCcpCisgICAgICAgIGMoJzIuMWEwLTIwMDQwNTAxJywgJzIuMScpCisgICAgICAgIGMoJzEuMScsICcwMi4xJykKKyAgICAgICAgYygnQTU2JywnQjI3JykKKyAgICAgICAgYygnMy4yJywgJzMuMi5wbDAnKQorICAgICAgICBjKCczLjItMScsICczLjJwbDEnKQorICAgICAgICBjKCczLjJwbDEnLCAnMy4ycGwxLTEnKQorICAgICAgICBjKCcwLjQnLCAnNC4wJykKKyAgICAgICAgYygnMC4wLjQnLCAnMC40LjAnKQorICAgICAgICBjKCcwcGwxJywgJzAuNHBsMScpCisgICAgICAgIGMoJzIuMS4wLXJjMScsJzIuMS4wJykKKworICAgICAgICB0b3J0dXJlID0iIiIKKyAgICAgICAgMC44MC4xLTMgMC44MC4xLTIgMC44MC4xLTEgMC43OS45OTk5KzAuODAuMHByZTQtMQorICAgICAgICAwLjc5Ljk5OTkrMC44MC4wcHJlMi0zIDAuNzkuOTk5OSswLjgwLjBwcmUyLTIKKyAgICAgICAgMC43Ny4yLTEgMC43Ny4xLTEgMC43Ny4wLTEKKyAgICAgICAgIiIiLnNwbGl0KCkKKworICAgICAgICBmb3IgcCx2MSBpbiBlbnVtZXJhdGUodG9ydHVyZSk6CisgICAgICAgICAgICBmb3IgdjIgaW4gdG9ydHVyZVtwKzE6XToKKyAgICAgICAgICAgICAgICBjKHYyLHYxKQpkaWZmIC0tZ2l0IGEvTGliL3NnbWxsaWIucHkgYi9MaWIvc2dtbGxpYi5weQppbmRleCAwOGUzNjViLi4zZTg1YTkxIDEwMDY0NAotLS0gYS9MaWIvc2dtbGxpYi5weQorKysgYi9MaWIvc2dtbGxpYi5weQpAQCAtMjY5LDkgKzI2OSwzNyBAQAogICAgICAgICAgICAgYXR0cm5hbWUsIHJlc3QsIGF0dHJ2YWx1ZSA9IG1hdGNoLmdyb3VwKDEsIDIsIDMpCiAgICAgICAgICAgICBpZiBub3QgcmVzdDoKICAgICAgICAgICAgICAgICBhdHRydmFsdWUgPSBhdHRybmFtZQotICAgICAgICAgICAgZWxpZiBhdHRydmFsdWVbOjFdID09ICdcJycgPT0gYXR0cnZhbHVlWy0xOl0gb3IgXAotICAgICAgICAgICAgICAgICBhdHRydmFsdWVbOjFdID09ICciJyA9PSBhdHRydmFsdWVbLTE6XToKLSAgICAgICAgICAgICAgICBhdHRydmFsdWUgPSBhdHRydmFsdWVbMTotMV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgKGF0dHJ2YWx1ZVs6MV0gPT0gIiciID09IGF0dHJ2YWx1ZVstMTpdIG9yCisgICAgICAgICAgICAgICAgICAgIGF0dHJ2YWx1ZVs6MV0gPT0gJyInID09IGF0dHJ2YWx1ZVstMTpdKToKKyAgICAgICAgICAgICAgICAgICAgIyBzdHJpcCBxdW90ZXMKKyAgICAgICAgICAgICAgICAgICAgYXR0cnZhbHVlID0gYXR0cnZhbHVlWzE6LTFdCisgICAgICAgICAgICAgICAgbCA9IDAKKyAgICAgICAgICAgICAgICBuZXdfYXR0cnZhbHVlID0gJycKKyAgICAgICAgICAgICAgICB3aGlsZSBsIDwgbGVuKGF0dHJ2YWx1ZSk6CisgICAgICAgICAgICAgICAgICAgIGF2X21hdGNoID0gZW50aXR5cmVmLm1hdGNoKGF0dHJ2YWx1ZSwgbCkKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF2X21hdGNoIGFuZCBhdl9tYXRjaC5ncm91cCgxKSBpbiBzZWxmLmVudGl0eWRlZnMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRydmFsdWVbYXZfbWF0Y2guZW5kKDEpXSA9PSAnOycpOgorICAgICAgICAgICAgICAgICAgICAgICAgIyBvbmx5IHN1YnN0aXR1dGUgZW50aXR5cmVmcyBlbmRpbmcgaW4gJzsnIHNpbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAjIG90aGVyd2lzZSB3ZSBtYXkgYnJlYWsgPGEgaHJlZj0nP3A9eCZxPXknPgorICAgICAgICAgICAgICAgICAgICAgICAgIyB3aGljaCBpcyB2ZXJ5IGNvbW1vbgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHJ2YWx1ZSArPSBzZWxmLmVudGl0eWRlZnNbYXZfbWF0Y2guZ3JvdXAoMSldCisgICAgICAgICAgICAgICAgICAgICAgICBsID0gYXZfbWF0Y2guZW5kKDApCisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICBjaF9tYXRjaCA9IGNoYXJyZWYubWF0Y2goYXR0cnZhbHVlLCBsKQorICAgICAgICAgICAgICAgICAgICBpZiBjaF9tYXRjaDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyID0gY2hyKGludChjaF9tYXRjaC5ncm91cCgxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHJ2YWx1ZSArPSBjaGFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IGNoX21hdGNoLmVuZCgwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGludmFsaWQgY2hhcmFjdGVyIHJlZmVyZW5jZSwgZG9uJ3Qgc3Vic3RpdHV0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgICAgICAgICAgIyBhbGwgb3RoZXIgY2FzZXMKKyAgICAgICAgICAgICAgICAgICAgbmV3X2F0dHJ2YWx1ZSArPSBhdHRydmFsdWVbbF0KKyAgICAgICAgICAgICAgICAgICAgbCArPSAxCisgICAgICAgICAgICAgICAgYXR0cnZhbHVlID0gbmV3X2F0dHJ2YWx1ZQogICAgICAgICAgICAgYXR0cnMuYXBwZW5kKChhdHRybmFtZS5sb3dlcigpLCBhdHRydmFsdWUpKQogICAgICAgICAgICAgayA9IG1hdGNoLmVuZCgwKQogICAgICAgICBpZiByYXdkYXRhW2pdID09ICc+JzoKZGlmZiAtLWdpdCBhL0xpYi9zaXRlLnB5IGIvTGliL3NpdGUucHkKaW5kZXggNWU3ZmY3Yi4uNDdlZGEyNCAxMDA2NDQKLS0tIGEvTGliL3NpdGUucHkKKysrIGIvTGliL3NpdGUucHkKQEAgLTY5LDYgKzY5LDggQEAKIGRlZiBhYnNfX2ZpbGVfXygpOgogICAgICIiIlNldCBhbGwgbW9kdWxlJyBfX2ZpbGVfXyBhdHRyaWJ1dGUgdG8gYW4gYWJzb2x1dGUgcGF0aCIiIgogICAgIGZvciBtIGluIHN5cy5tb2R1bGVzLnZhbHVlcygpOgorICAgICAgICBpZiBoYXNhdHRyKG0sICdfX2xvYWRlcl9fJyk6CisgICAgICAgICAgICBjb250aW51ZSAgICMgZG9uJ3QgbWVzcyB3aXRoIGEgUEVQIDMwMi1zdXBwbGllZCBfX2ZpbGVfXwogICAgICAgICB0cnk6CiAgICAgICAgICAgICBtLl9fZmlsZV9fID0gb3MucGF0aC5hYnNwYXRoKG0uX19maWxlX18pCiAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKZGlmZiAtLWdpdCBhL0xpYi9zbXRwbGliLnB5IGIvTGliL3NtdHBsaWIucHkKaW5kZXggNzFkMjVmZC4uMDc5MTZjYyAxMDA3NTUKLS0tIGEvTGliL3NtdHBsaWIucHkKKysrIGIvTGliL3NtdHBsaWIucHkKQEAgLTI1NSw3ICsyNTUsMTEgQEAKICAgICAgICAgICAgICAgICBzZWxmLmxvY2FsX2hvc3RuYW1lID0gZnFkbgogICAgICAgICAgICAgZWxzZToKICAgICAgICAgICAgICAgICAjIFdlIGNhbid0IGZpbmQgYW4gZnFkbiBob3N0bmFtZSwgc28gdXNlIGEgZG9tYWluIGxpdGVyYWwKLSAgICAgICAgICAgICAgICBhZGRyID0gc29ja2V0LmdldGhvc3RieW5hbWUoc29ja2V0LmdldGhvc3RuYW1lKCkpCisgICAgICAgICAgICAgICAgYWRkciA9ICcxMjcuMC4wLjEnCisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBhZGRyID0gc29ja2V0LmdldGhvc3RieW5hbWUoc29ja2V0LmdldGhvc3RuYW1lKCkpCisgICAgICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5nYWllcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcwogICAgICAgICAgICAgICAgIHNlbGYubG9jYWxfaG9zdG5hbWUgPSAnWyVzXScgJSBhZGRyCiAKICAgICBkZWYgc2V0X2RlYnVnbGV2ZWwoc2VsZiwgZGVidWdsZXZlbCk6CmRpZmYgLS1naXQgYS9MaWIvc29ja2V0LnB5IGIvTGliL3NvY2tldC5weQppbmRleCBlZTI0NTdmLi4zMmE5MmI0IDEwMDY0NAotLS0gYS9MaWIvc29ja2V0LnB5CisrKyBiL0xpYi9zb2NrZXQucHkKQEAgLTEyMSwxNCArMTIxLDYgQEAKICAgICByZXR1cm4gbmFtZQogCiAKLSMKLSMgVGhlc2UgY2xhc3NlcyBhcmUgdXNlZCBieSB0aGUgc29ja2V0KCkgZGVmaW5lZCBvbiBXaW5kb3dzIGFuZCBCZU9TCi0jIHBsYXRmb3JtcyB0byBwcm92aWRlIGEgYmVzdC1lZmZvcnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNsZWFudXAKLSMgc2VtYW50aWNzIG5lZWRlZCB3aGVuIHNvY2tldHMgY2FuJ3QgYmUgZHVwKCllZC4KLSMKLSMgVGhlc2UgYXJlIG5vdCBhY3R1YWxseSB1c2VkIG9uIG90aGVyIHBsYXRmb3Jtcy4KLSMKLQogX3NvY2tldG1ldGhvZHMgPSAoCiAgICAgJ2JpbmQnLCAnY29ubmVjdCcsICdjb25uZWN0X2V4JywgJ2ZpbGVubycsICdsaXN0ZW4nLAogICAgICdnZXRwZWVybmFtZScsICdnZXRzb2NrbmFtZScsICdnZXRzb2Nrb3B0JywgJ3NldHNvY2tvcHQnLApAQCAtMTgzLDYgKzE3NSwxMCBAQAogICAgICAgICBhbmQgYnVmc2l6ZSBhcmd1bWVudHMgYXJlIGFzIGZvciB0aGUgYnVpbHQtaW4gb3BlbigpIGZ1bmN0aW9uLiIiIgogICAgICAgICByZXR1cm4gX2ZpbGVvYmplY3Qoc2VsZi5fc29jaywgbW9kZSwgYnVmc2l6ZSkKIAorICAgIGZhbWlseSA9IHByb3BlcnR5KGxhbWJkYSBzZWxmOiBzZWxmLl9zb2NrLmZhbWlseSwgZG9jPSJ0aGUgc29ja2V0IGZhbWlseSIpCisgICAgdHlwZSA9IHByb3BlcnR5KGxhbWJkYSBzZWxmOiBzZWxmLl9zb2NrLnR5cGUsIGRvYz0idGhlIHNvY2tldCB0eXBlIikKKyAgICBwcm90byA9IHByb3BlcnR5KGxhbWJkYSBzZWxmOiBzZWxmLl9zb2NrLnByb3RvLCBkb2M9InRoZSBzb2NrZXQgcHJvdG9jb2wiKQorCiAgICAgX3MgPSAoImRlZiAlcyhzZWxmLCAqYXJncyk6IHJldHVybiBzZWxmLl9zb2NrLiVzKCphcmdzKVxuXG4iCiAgICAgICAgICAgIiVzLl9fZG9jX18gPSBfcmVhbHNvY2tldC4lcy5fX2RvY19fXG4iKQogICAgIGZvciBfbSBpbiBfc29ja2V0bWV0aG9kczoKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL19faW5pdF9fLnB5IGIvTGliL3NxbGl0ZTMvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlZjJiNwotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zcWxpdGUzL19faW5pdF9fLnB5CkBAIC0wLDAgKzEsMjQgQEAKKyMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvX19pbml0X18ucHk6IHRoZSBweXNxbGl0ZTIgcGFja2FnZS4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyMKKyMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisjIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorIworIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitmcm9tIGRiYXBpMiBpbXBvcnQgKgpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvZGJhcGkyLnB5IGIvTGliL3NxbGl0ZTMvZGJhcGkyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYzhhODQKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc3FsaXRlMy9kYmFwaTIucHkKQEAgLTAsMCArMSw4NCBAQAorIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCisjIHB5c3FsaXRlMi9kYmFwaTIucHk6IHRoZSBEQi1BUEkgMi4wIGludGVyZmFjZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworaW1wb3J0IGRhdGV0aW1lCisKK3BhcmFtc3R5bGUgPSAicW1hcmsiCisKK3RocmVhZHNhZmV0eSA9IDEKKworYXBpbGV2ZWwgPSAiMi4wIgorCitmcm9tIF9zcWxpdGUzIGltcG9ydCAqCisKK2ltcG9ydCBkYXRldGltZSwgdGltZQorCitEYXRlID0gZGF0ZXRpbWUuZGF0ZQorCitUaW1lID0gZGF0ZXRpbWUudGltZQorCitUaW1lc3RhbXAgPSBkYXRldGltZS5kYXRldGltZQorCitkZWYgRGF0ZUZyb21UaWNrcyh0aWNrcyk6CisgICAgcmV0dXJuIGFwcGx5KERhdGUsdGltZS5sb2NhbHRpbWUodGlja3MpWzozXSkKKworZGVmIFRpbWVGcm9tVGlja3ModGlja3MpOgorICAgIHJldHVybiBhcHBseShUaW1lLHRpbWUubG9jYWx0aW1lKHRpY2tzKVszOjZdKQorCitkZWYgVGltZXN0YW1wRnJvbVRpY2tzKHRpY2tzKToKKyAgICByZXR1cm4gYXBwbHkoVGltZXN0YW1wLHRpbWUubG9jYWx0aW1lKHRpY2tzKVs6Nl0pCisKK19tYWpvciwgX21pbm9yLCBfbWljcm8gPSB2ZXJzaW9uLnNwbGl0KCIuIikKK3ZlcnNpb25faW5mbyA9IChpbnQoX21ham9yKSwgaW50KF9taW5vciksIF9taWNybykKK19tYWpvciwgX21pbm9yLCBfbWljcm8gPSBzcWxpdGVfdmVyc2lvbi5zcGxpdCgiLiIpCitzcWxpdGVfdmVyc2lvbl9pbmZvID0gKGludChfbWFqb3IpLCBpbnQoX21pbm9yKSwgX21pY3JvKQorCitCaW5hcnkgPSBidWZmZXIKKworZGVmIGFkYXB0X2RhdGUodmFsKToKKyAgICByZXR1cm4gdmFsLmlzb2Zvcm1hdCgpCisKK2RlZiBhZGFwdF9kYXRldGltZSh2YWwpOgorICAgIHJldHVybiB2YWwuaXNvZm9ybWF0KCIgIikKKworZGVmIGNvbnZlcnRfZGF0ZSh2YWwpOgorICAgIHJldHVybiBkYXRldGltZS5kYXRlKCptYXAoaW50LCB2YWwuc3BsaXQoIi0iKSkpCisKK2RlZiBjb252ZXJ0X3RpbWVzdGFtcCh2YWwpOgorICAgIGRhdGVwYXJ0LCB0aW1lcGFydCA9IHZhbC5zcGxpdCgiICIpCisgICAgeWVhciwgbW9udGgsIGRheSA9IG1hcChpbnQsIGRhdGVwYXJ0LnNwbGl0KCItIikpCisgICAgdGltZXBhcnRfZnVsbCA9IHRpbWVwYXJ0LnNwbGl0KCIuIikKKyAgICBob3VycywgbWludXRlcywgc2Vjb25kcyA9IG1hcChpbnQsIHRpbWVwYXJ0X2Z1bGxbMF0uc3BsaXQoIjoiKSkKKyAgICBpZiBsZW4odGltZXBhcnRfZnVsbCkgPT0gMjoKKyAgICAgICAgbWljcm9zZWNvbmRzID0gaW50KGZsb2F0KCIwLiIgKyB0aW1lcGFydF9mdWxsWzFdKSAqIDEwMDAwMDApCisgICAgZWxzZToKKyAgICAgICAgbWljcm9zZWNvbmRzID0gMAorCisgICAgdmFsID0gZGF0ZXRpbWUuZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pY3Jvc2Vjb25kcykKKyAgICByZXR1cm4gdmFsCisKKworcmVnaXN0ZXJfYWRhcHRlcihkYXRldGltZS5kYXRlLCBhZGFwdF9kYXRlKQorcmVnaXN0ZXJfYWRhcHRlcihkYXRldGltZS5kYXRldGltZSwgYWRhcHRfZGF0ZXRpbWUpCityZWdpc3Rlcl9jb252ZXJ0ZXIoImRhdGUiLCBjb252ZXJ0X2RhdGUpCityZWdpc3Rlcl9jb252ZXJ0ZXIoInRpbWVzdGFtcCIsIGNvbnZlcnRfdGltZXN0YW1wKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC9fX2luaXRfXy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvX19pbml0X18ucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvX19pbml0X18ucHkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvZGJhcGkucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOGRhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc3FsaXRlMy90ZXN0L2RiYXBpLnB5CkBAIC0wLDAgKzEsNzMyIEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvZGJhcGkucHk6IHRlc3RzIGZvciBEQi1BUEkgY29tcGxpYW5jZQorIworIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgdGhyZWFkaW5nCitpbXBvcnQgc3FsaXRlMyBhcyBzcWxpdGUKKworY2xhc3MgTW9kdWxlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBDaGVja0FQSUxldmVsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNxbGl0ZS5hcGlsZXZlbCwgIjIuMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgImFwaWxldmVsIGlzICVzLCBzaG91bGQgYmUgMi4wIiAlIHNxbGl0ZS5hcGlsZXZlbCkKKworICAgIGRlZiBDaGVja1RocmVhZFNhZmV0eShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcWxpdGUudGhyZWFkc2FmZXR5LCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRzYWZldHkgaXMgJWQsIHNob3VsZCBiZSAxIiAlIHNxbGl0ZS50aHJlYWRzYWZldHkpCisKKyAgICBkZWYgQ2hlY2tQYXJhbVN0eWxlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNxbGl0ZS5wYXJhbXN0eWxlLCAicW1hcmsiLAorICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJhbXN0eWxlIGlzICclcycsIHNob3VsZCBiZSAncW1hcmsnIiAlCisgICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlLnBhcmFtc3R5bGUpCisKKyAgICBkZWYgQ2hlY2tXYXJuaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhzcWxpdGUuV2FybmluZywgU3RhbmRhcmRFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAiV2FybmluZyBpcyBub3QgYSBzdWJjbGFzcyBvZiBTdGFuZGFyZEVycm9yIikKKworICAgIGRlZiBDaGVja0Vycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuRXJyb3IsIFN0YW5kYXJkRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIFN0YW5kYXJkRXJyb3IiKQorCisgICAgZGVmIENoZWNrSW50ZXJmYWNlRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHNxbGl0ZS5JbnRlcmZhY2VFcnJvciwgc3FsaXRlLkVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlcmZhY2VFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tEYXRhYmFzZUVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuRGF0YWJhc2VFcnJvciwgc3FsaXRlLkVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJEYXRhYmFzZUVycm9yIGlzIG5vdCBhIHN1YmNsYXNzIG9mIEVycm9yIikKKworICAgIGRlZiBDaGVja0RhdGFFcnJvcihzZWxmKToKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzc3ViY2xhc3Moc3FsaXRlLkRhdGFFcnJvciwgc3FsaXRlLkRhdGFiYXNlRXJyb3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgIkRhdGFFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKKworICAgIGRlZiBDaGVja09wZXJhdGlvbmFsRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW9uYWxFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKKworICAgIGRlZiBDaGVja0ludGVncml0eUVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuSW50ZWdyaXR5RXJyb3IsIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJbnRlZ3JpdHlFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKKworICAgIGRlZiBDaGVja0ludGVybmFsRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHNxbGl0ZS5JbnRlcm5hbEVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiSW50ZXJuYWxFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKKworICAgIGRlZiBDaGVja1Byb2dyYW1taW5nRXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc3N1YmNsYXNzKHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiUHJvZ3JhbW1pbmdFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKKworICAgIGRlZiBDaGVja05vdFN1cHBvcnRlZEVycm9yKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNzdWJjbGFzcyhzcWxpdGUuTm90U3VwcG9ydGVkRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNxbGl0ZS5EYXRhYmFzZUVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOb3RTdXBwb3J0ZWRFcnJvciBpcyBub3QgYSBzdWJjbGFzcyBvZiBEYXRhYmFzZUVycm9yIikKKworY2xhc3MgQ29ubmVjdGlvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY3ggPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjdSA9IHNlbGYuY3guY3Vyc29yKCkKKyAgICAgICAgY3UuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaWQgaW50ZWdlciBwcmltYXJ5IGtleSwgbmFtZSB0ZXh0KSIpCisgICAgICAgIGN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICg/KSIsICgiZm9vIiwpKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmN4LmNsb3NlKCkKKworICAgIGRlZiBDaGVja0NvbW1pdChzZWxmKToKKyAgICAgICAgc2VsZi5jeC5jb21taXQoKQorCisgICAgZGVmIENoZWNrQ29tbWl0QWZ0ZXJOb0NoYW5nZXMoc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBBIGNvbW1pdCBzaG91bGQgYWxzbyB3b3JrIHdoZW4gbm8gY2hhbmdlcyB3ZXJlIG1hZGUgdG8gdGhlIGRhdGFiYXNlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jeC5jb21taXQoKQorICAgICAgICBzZWxmLmN4LmNvbW1pdCgpCisKKyAgICBkZWYgQ2hlY2tSb2xsYmFjayhzZWxmKToKKyAgICAgICAgc2VsZi5jeC5yb2xsYmFjaygpCisKKyAgICBkZWYgQ2hlY2tSb2xsYmFja0FmdGVyTm9DaGFuZ2VzKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgQSByb2xsYmFjayBzaG91bGQgYWxzbyB3b3JrIHdoZW4gbm8gY2hhbmdlcyB3ZXJlIG1hZGUgdG8gdGhlIGRhdGFiYXNlLgorICAgICAgICAiIiIKKyAgICAgICAgc2VsZi5jeC5yb2xsYmFjaygpCisgICAgICAgIHNlbGYuY3gucm9sbGJhY2soKQorCisgICAgZGVmIENoZWNrQ3Vyc29yKHNlbGYpOgorICAgICAgICBjdSA9IHNlbGYuY3guY3Vyc29yKCkKKworICAgIGRlZiBDaGVja0ZhaWxlZE9wZW4oc2VsZik6CisgICAgICAgIFlPVV9DQU5OT1RfT1BFTl9USElTID0gIi9mb28vYmFyL2JsYS8yMzUzNC9teWRiLmRiIgorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdChZT1VfQ0FOTk9UX09QRU5fVEhJUykKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorCisgICAgZGVmIENoZWNrQ2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY3guY2xvc2UoKQorCisgICAgZGVmIENoZWNrRXhjZXB0aW9ucyhzZWxmKToKKyAgICAgICAgIyBPcHRpb25hbCBEQi1BUEkgZXh0ZW5zaW9uLgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN4Lldhcm5pbmcsIHNxbGl0ZS5XYXJuaW5nKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN4LkVycm9yLCBzcWxpdGUuRXJyb3IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guSW50ZXJmYWNlRXJyb3IsIHNxbGl0ZS5JbnRlcmZhY2VFcnJvcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5EYXRhYmFzZUVycm9yLCBzcWxpdGUuRGF0YWJhc2VFcnJvcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5EYXRhRXJyb3IsIHNxbGl0ZS5EYXRhRXJyb3IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guT3BlcmF0aW9uYWxFcnJvciwgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3IpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3guSW50ZWdyaXR5RXJyb3IsIHNxbGl0ZS5JbnRlZ3JpdHlFcnJvcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5JbnRlcm5hbEVycm9yLCBzcWxpdGUuSW50ZXJuYWxFcnJvcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5Qcm9ncmFtbWluZ0Vycm9yLCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jeC5Ob3RTdXBwb3J0ZWRFcnJvciwgc3FsaXRlLk5vdFN1cHBvcnRlZEVycm9yKQorCitjbGFzcyBDdXJzb3JUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmN4ID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgc2VsZi5jdSA9IHNlbGYuY3guY3Vyc29yKCkKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpZCBpbnRlZ2VyIHByaW1hcnkga2V5LCBuYW1lIHRleHQsIGluY29tZSBudW1iZXIpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoPykiLCAoImZvbyIsKSkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jdS5jbG9zZSgpCisgICAgICAgIHNlbGYuY3guY2xvc2UoKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZU5vQXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVJbGxlZ2FsU3FsKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBhc2RmIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIE9wZXJhdGlvbmFsRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLk9wZXJhdGlvbmFsRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVUb29NdWNoU3FsKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCA1KzQ7IHNlbGVjdCA0KzUiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBXYXJuaW5nIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5XYXJuaW5nOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlVG9vTXVjaFNxbDIoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IDUrNDsgLS0gZm9vIGJhciIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlVG9vTXVjaFNxbDMoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiIiIKKyAgICAgICAgICAgIHNlbGVjdCA1KzQ7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICBmb28KKyAgICAgICAgICAgICovCisgICAgICAgICAgICAiIiIpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlV3JvbmdTcWxBcmcoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSg0MikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVmFsdWVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbi4iKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZUFyZ0ludChzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIiwgKDQyLCkpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlQXJnRmxvYXQoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpbmNvbWUpIHZhbHVlcyAoPykiLCAoMjUwMC4zMiwpKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZUFyZ1N0cmluZyhzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoPykiLCAoIkh1Z28iLCkpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlV3JvbmdOb09mQXJnczEoc2VsZik6CisgICAgICAgICMgdG9vIG1hbnkgcGFyYW1ldGVycworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaWQpIHZhbHVlcyAoPykiLCAoMTcsICJFZ29uIikpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrRXhlY3V0ZVdyb25nTm9PZkFyZ3MyKHNlbGYpOgorICAgICAgICAjIHRvbyBsaXR0bGUgcGFyYW1ldGVycworICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaWQpIHZhbHVlcyAoPykiKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0V4ZWN1dGVXcm9uZ05vT2ZBcmdzMyhzZWxmKToKKyAgICAgICAgIyBubyBwYXJhbWV0ZXJzLCBwYXJhbWV0ZXJzIGFyZSBuZWVkZWQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlRGljdE1hcHBpbmcoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IHdoZXJlIG5hbWU9Om5hbWUiLCB7Im5hbWUiOiAiZm9vIn0pCisgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sICJmb28iKQorCisgICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nVG9vTGl0dGxlQXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT06bmFtZSBhbmQgaWQ9OmlkIiwgeyJuYW1lIjogImZvbyJ9KQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0V4ZWN1dGVEaWN0TWFwcGluZ05vQXJncyhzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT06bmFtZSIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIENoZWNrRXhlY3V0ZURpY3RNYXBwaW5nVW5uYW1lZChzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgbmFtZSBmcm9tIHRlc3Qgd2hlcmUgbmFtZT0/IiwgeyJuYW1lIjogImZvbyJ9KQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmNsb3NlKCkKKworICAgIGRlZiBDaGVja1Jvd2NvdW50RXhlY3V0ZShzZWxmKToKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2ZvbycpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJ1cGRhdGUgdGVzdCBzZXQgbmFtZT0nYmFyJyIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3Uucm93Y291bnQsIDIpCisKKyAgICBkZWYgQ2hlY2tSb3djb3VudEV4ZWN1dGVtYW55KHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHRlc3QiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoPykiLCBbKDEsKSwgKDIsKSwgKDMsKV0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3Uucm93Y291bnQsIDMpCisKKyAgICBkZWYgQ2hlY2tUb3RhbENoYW5nZXMoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdmb28nKSIpCisgICAgICAgIGlmIHNlbGYuY3gudG90YWxfY2hhbmdlcyA8IDI6CisgICAgICAgICAgICBzZWxmLmZhaWwoInRvdGFsIGNoYW5nZXMgcmVwb3J0ZWQgd3JvbmcgdmFsdWUiKQorCisgICAgIyBDaGVja3MgZm9yIGV4ZWN1dGVtYW55OgorICAgICMgU2VxdWVuY2VzIGFyZSByZXF1aXJlZCBieSB0aGUgREItQVBJLCBpdGVyYXRvcnMKKyAgICAjIGVuaGFuY2VtZW50cyBpbiBweXNxbGl0ZS4KKworICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55U2VxdWVuY2Uoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoaW5jb21lKSB2YWx1ZXMgKD8pIiwgWyh4LCkgZm9yIHggaW4gcmFuZ2UoMTAwLCAxMTApXSkKKworICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55SXRlcmF0b3Ioc2VsZik6CisgICAgICAgIGNsYXNzIE15SXRlcjoKKyAgICAgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbHVlID0gNQorCisgICAgICAgICAgICBkZWYgbmV4dChzZWxmKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLnZhbHVlID09IDEwOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBTdG9wSXRlcmF0aW9uCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi52YWx1ZSArPSAxCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoc2VsZi52YWx1ZSwpCisKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpbmNvbWUpIHZhbHVlcyAoPykiLCBNeUl0ZXIoKSkKKworICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55R2VuZXJhdG9yKHNlbGYpOgorICAgICAgICBkZWYgbXlnZW4oKToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDUpOgorICAgICAgICAgICAgICAgIHlpZWxkIChpLCkKKworICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJpbnNlcnQgaW50byB0ZXN0KGluY29tZSkgdmFsdWVzICg/KSIsIG15Z2VuKCkpCisKKyAgICBkZWYgQ2hlY2tFeGVjdXRlTWFueVdyb25nU3FsQXJnKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KDQyLCBbKDMsKV0pCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFZhbHVlRXJyb3IiKQorICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInJhaXNlZCB3cm9uZyBleGNlcHRpb24uIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55U2VsZWN0KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1LmV4ZWN1dGVtYW55KCJzZWxlY3QgPyIsIFsoMywpXSkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInJhaXNlZCB3cm9uZyBleGNlcHRpb24uIikKKworICAgIGRlZiBDaGVja0V4ZWN1dGVNYW55Tm90SXRlcmFibGUoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYuY3UuZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoaW5jb21lKSB2YWx1ZXMgKD8pIiwgNDIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFR5cGVFcnJvciIpCisgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbiwgZToKKyAgICAgICAgICAgIHByaW50ICJyYWlzZWQiLCBlLl9fY2xhc3NfXworICAgICAgICAgICAgc2VsZi5mYWlsKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uLiIpCisKKyAgICBkZWYgQ2hlY2tGZXRjaEl0ZXIoc2VsZik6CisgICAgICAgICMgT3B0aW9uYWwgREItQVBJIGV4dGVuc2lvbi4KKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIiwgKDUsKSkKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGlkKSB2YWx1ZXMgKD8pIiwgKDYsKSkKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJzZWxlY3QgaWQgZnJvbSB0ZXN0IG9yZGVyIGJ5IGlkIikKKyAgICAgICAgbHN0ID0gW10KKyAgICAgICAgZm9yIHJvdyBpbiBzZWxmLmN1OgorICAgICAgICAgICAgbHN0LmFwcGVuZChyb3dbMF0pCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxzdFswXSwgNSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobHN0WzFdLCA2KQorCisgICAgZGVmIENoZWNrRmV0Y2hvbmUoc2VsZik6CisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgImZvbyIpCisgICAgICAgIHJvdyA9IHNlbGYuY3UuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3csIE5vbmUpCisKKyAgICBkZWYgQ2hlY2tGZXRjaG9uZU5vU3RhdGVtZW50KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmN4LmN1cnNvcigpCisgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvdywgTm9uZSkKKworICAgIGRlZiBDaGVja0FycmF5U2l6ZShzZWxmKToKKyAgICAgICAgIyBtdXN0IGRlZmF1bHQgb3QgMQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChzZWxmLmN1LmFycmF5c2l6ZSwgMSkKKworICAgICAgICAjIG5vdyBzZXQgdG8gMgorICAgICAgICBzZWxmLmN1LmFycmF5c2l6ZSA9IDIKKworICAgICAgICAjIG5vdyBtYWtlIHRoZSBxdWVyeSByZXR1cm4gMyByb3dzCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdBJykiKQorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnQicpIikKKyAgICAgICAgc2VsZi5jdS5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ0MnKSIpCisgICAgICAgIHNlbGYuY3UuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IikKKyAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaG1hbnkoKQorCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihyZXMpLCAyKQorCisgICAgZGVmIENoZWNrRmV0Y2htYW55KHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KDEwMCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHJlcyksIDEpCisgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2htYW55KDEwMCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLCBbXSkKKworICAgIGRlZiBDaGVja0ZldGNoYWxsKHNlbGYpOgorICAgICAgICBzZWxmLmN1LmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3UuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMSkKKyAgICAgICAgcmVzID0gc2VsZi5jdS5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcywgW10pCisKKyAgICBkZWYgQ2hlY2tTZXRpbnB1dHNpemVzKHNlbGYpOgorICAgICAgICBzZWxmLmN1LnNldGlucHV0c2l6ZXMoWzMsIDQsIDVdKQorCisgICAgZGVmIENoZWNrU2V0b3V0cHV0c2l6ZShzZWxmKToKKyAgICAgICAgc2VsZi5jdS5zZXRvdXRwdXRzaXplKDUsIDApCisKKyAgICBkZWYgQ2hlY2tTZXRvdXRwdXRzaXplTm9Db2x1bW4oc2VsZik6CisgICAgICAgIHNlbGYuY3Uuc2V0b3V0cHV0c2l6ZSg0MikKKworICAgIGRlZiBDaGVja0N1cnNvckNvbm5lY3Rpb24oc2VsZik6CisgICAgICAgICMgT3B0aW9uYWwgREItQVBJIGV4dGVuc2lvbi4KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jdS5jb25uZWN0aW9uLCBzZWxmLmN4KQorCisgICAgZGVmIENoZWNrV3JvbmdDdXJzb3JDYWxsYWJsZShzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGVmIGYoKTogcGFzcworICAgICAgICAgICAgY3VyID0gc2VsZi5jeC5jdXJzb3IoZikKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgVHlwZUVycm9yIikKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhIFZhbHVlRXJyb3IiKQorCisgICAgZGVmIENoZWNrQ3Vyc29yV3JvbmdDbGFzcyhzZWxmKToKKyAgICAgICAgY2xhc3MgRm9vOiBwYXNzCisgICAgICAgIGZvbyA9IEZvbygpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ciA9IHNxbGl0ZS5DdXJzb3IoZm9vKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBWYWx1ZUVycm9yIikKKyAgICAgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKworY2xhc3MgVGhyZWFkVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGlkIGludGVnZXIgcHJpbWFyeSBrZXksIG5hbWUgdGV4dCwgYmluIGJpbmFyeSwgcmF0aW8gbnVtYmVyLCB0cyB0aW1lc3RhbXApIikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tDb25DdXJzb3Ioc2VsZik6CisgICAgICAgIGRlZiBydW4oY29uLCBlcnJvcnMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY29uIjogc2VsZi5jb24sICJlcnJvcnMiOiBlcnJvcnN9KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQorCisgICAgZGVmIENoZWNrQ29uQ29tbWl0KHNlbGYpOgorICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb24uY29tbWl0KCkKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgICAgIGVycm9ycyA9IFtdCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImNvbiI6IHNlbGYuY29uLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworICAgIGRlZiBDaGVja0NvblJvbGxiYWNrKHNlbGYpOgorICAgICAgICBkZWYgcnVuKGNvbiwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb24ucm9sbGJhY2soKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY29uIjogc2VsZi5jb24sICJlcnJvcnMiOiBlcnJvcnN9KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQorCisgICAgZGVmIENoZWNrQ29uQ2xvc2Uoc2VsZik6CisgICAgICAgIGRlZiBydW4oY29uLCBlcnJvcnMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvbi5jbG9zZSgpCisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKKworICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjb24iOiBzZWxmLmNvbiwgImVycm9ycyI6IGVycm9yc30pCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LmpvaW4oKQorICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCisKKyAgICBkZWYgQ2hlY2tDdXJJbXBsaWNpdEJlZ2luKHNlbGYpOgorICAgICAgICBkZWYgcnVuKGN1ciwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChuYW1lKSB2YWx1ZXMgKCdhJykiKQorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoImRpZCBub3QgcmFpc2UgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgicmFpc2VkIHdyb25nIGV4Y2VwdGlvbiIpCisKKyAgICAgICAgZXJyb3JzID0gW10KKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY3VyIjogc2VsZi5jdXIsICJlcnJvcnMiOiBlcnJvcnN9KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQorCisgICAgZGVmIENoZWNrQ3VyQ2xvc2Uoc2VsZik6CisgICAgICAgIGRlZiBydW4oY3VyLCBlcnJvcnMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGN1ci5jbG9zZSgpCisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKKworICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICB0ID0gdGhyZWFkaW5nLlRocmVhZCh0YXJnZXQ9cnVuLCBrd2FyZ3M9eyJjdXIiOiBzZWxmLmN1ciwgImVycm9ycyI6IGVycm9yc30pCisgICAgICAgIHQuc3RhcnQoKQorICAgICAgICB0LmpvaW4oKQorICAgICAgICBpZiBsZW4oZXJyb3JzKSA+IDA6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlxuIi5qb2luKGVycm9ycykpCisKKyAgICBkZWYgQ2hlY2tDdXJFeGVjdXRlKHNlbGYpOgorICAgICAgICBkZWYgcnVuKGN1ciwgZXJyb3JzKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IG5hbWUgZnJvbSB0ZXN0IikKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJkaWQgbm90IHJhaXNlIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGVycm9ycy5hcHBlbmQoInJhaXNlZCB3cm9uZyBleGNlcHRpb24iKQorCisgICAgICAgIGVycm9ycyA9IFtdCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QobmFtZSkgdmFsdWVzICgnYScpIikKKyAgICAgICAgdCA9IHRocmVhZGluZy5UaHJlYWQodGFyZ2V0PXJ1biwga3dhcmdzPXsiY3VyIjogc2VsZi5jdXIsICJlcnJvcnMiOiBlcnJvcnN9KQorICAgICAgICB0LnN0YXJ0KCkKKyAgICAgICAgdC5qb2luKCkKKyAgICAgICAgaWYgbGVuKGVycm9ycykgPiAwOgorICAgICAgICAgICAgc2VsZi5mYWlsKCJcbiIuam9pbihlcnJvcnMpKQorCisgICAgZGVmIENoZWNrQ3VySXRlck5leHQoc2VsZik6CisgICAgICAgIGRlZiBydW4oY3VyLCBlcnJvcnMpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJvdyA9IGN1ci5mZXRjaG9uZSgpCisgICAgICAgICAgICAgICAgZXJyb3JzLmFwcGVuZCgiZGlkIG5vdCByYWlzZSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBlcnJvcnMuYXBwZW5kKCJyYWlzZWQgd3JvbmcgZXhjZXB0aW9uIikKKworICAgICAgICBlcnJvcnMgPSBbXQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KG5hbWUpIHZhbHVlcyAoJ2EnKSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBuYW1lIGZyb20gdGVzdCIpCisgICAgICAgIHQgPSB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD1ydW4sIGt3YXJncz17ImN1ciI6IHNlbGYuY3VyLCAiZXJyb3JzIjogZXJyb3JzfSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCisgICAgICAgIGlmIGxlbihlcnJvcnMpID4gMDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiXG4iLmpvaW4oZXJyb3JzKSkKKworY2xhc3MgQ29uc3RydWN0b3JUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIENoZWNrRGF0ZShzZWxmKToKKyAgICAgICAgZCA9IHNxbGl0ZS5EYXRlKDIwMDQsIDEwLCAyOCkKKworICAgIGRlZiBDaGVja1RpbWUoc2VsZik6CisgICAgICAgIHQgPSBzcWxpdGUuVGltZSgxMiwgMzksIDM1KQorCisgICAgZGVmIENoZWNrVGltZXN0YW1wKHNlbGYpOgorICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXAoMjAwNCwgMTAsIDI4LCAxMiwgMzksIDM1KQorCisgICAgZGVmIENoZWNrRGF0ZUZyb21UaWNrcyhzZWxmKToKKyAgICAgICAgZCA9IHNxbGl0ZS5EYXRlRnJvbVRpY2tzKDQyKQorCisgICAgZGVmIENoZWNrVGltZUZyb21UaWNrcyhzZWxmKToKKyAgICAgICAgdCA9IHNxbGl0ZS5UaW1lRnJvbVRpY2tzKDQyKQorCisgICAgZGVmIENoZWNrVGltZXN0YW1wRnJvbVRpY2tzKHNlbGYpOgorICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXBGcm9tVGlja3MoNDIpCisKKyAgICBkZWYgQ2hlY2tCaW5hcnkoc2VsZik6CisgICAgICAgIGIgPSBzcWxpdGUuQmluYXJ5KGNocigwKSArICInIikKKworY2xhc3MgRXh0ZW5zaW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBDaGVja1NjcmlwdFN0cmluZ1NxbChzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlc2NyaXB0KCIiIgorICAgICAgICAgICAgLS0gYmxhIGJsYQorICAgICAgICAgICAgLyogYSBzdHVwaWQgY29tbWVudCAqLworICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGEoaSk7CisgICAgICAgICAgICBpbnNlcnQgaW50byBhKGkpIHZhbHVlcyAoNSk7CisgICAgICAgICAgICAiIiIpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIGEiKQorICAgICAgICByZXMgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXMsIDUpCisKKyAgICBkZWYgQ2hlY2tTY3JpcHRTdHJpbmdVbmljb2RlKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGVzY3JpcHQodSIiIgorICAgICAgICAgICAgY3JlYXRlIHRhYmxlIGEoaSk7CisgICAgICAgICAgICBpbnNlcnQgaW50byBhKGkpIHZhbHVlcyAoNSk7CisgICAgICAgICAgICBzZWxlY3QgaSBmcm9tIGE7CisgICAgICAgICAgICBkZWxldGUgZnJvbSBhOworICAgICAgICAgICAgaW5zZXJ0IGludG8gYShpKSB2YWx1ZXMgKDYpOworICAgICAgICAgICAgIiIiKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSBhIikKKyAgICAgICAgcmVzID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocmVzLCA2KQorCisgICAgZGVmIENoZWNrU2NyaXB0RXJyb3JJbmNvbXBsZXRlKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgcmFpc2VkID0gRmFsc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGVzY3JpcHQoImNyZWF0ZSB0YWJsZSB0ZXN0KHNhZGZzYWRmZHNhIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcmFpc2VkID0gVHJ1ZQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyYWlzZWQsIFRydWUsICJzaG91bGQgaGF2ZSByYWlzZWQgYW4gZXhjZXB0aW9uIikKKworICAgIGRlZiBDaGVja1NjcmlwdEVycm9yTm9ybWFsKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjdXIgPSBjb24uY3Vyc29yKCkKKyAgICAgICAgcmFpc2VkID0gRmFsc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY3VyLmV4ZWN1dGVzY3JpcHQoImNyZWF0ZSB0YWJsZSB0ZXN0KHNhZGZzYWRmZHNhKTsgc2VsZWN0IGZvbyBmcm9tIGh1cno7IikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgorICAgICAgICAgICAgcmFpc2VkID0gVHJ1ZQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyYWlzZWQsIFRydWUsICJzaG91bGQgaGF2ZSByYWlzZWQgYW4gZXhjZXB0aW9uIikKKworICAgIGRlZiBDaGVja0Nvbm5lY3Rpb25FeGVjdXRlKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgic2VsZWN0IDUiKS5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgNSwgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlIikKKworICAgIGRlZiBDaGVja0Nvbm5lY3Rpb25FeGVjdXRlbWFueShzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGZvbykiKQorICAgICAgICBjb24uZXhlY3V0ZW1hbnkoImluc2VydCBpbnRvIHRlc3QoZm9vKSB2YWx1ZXMgKD8pIiwgWygzLCksICg0LCldKQorICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgic2VsZWN0IGZvbyBmcm9tIHRlc3Qgb3JkZXIgYnkgZm9vIikuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHRbMF1bMF0sIDMsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZW1hbnkiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXN1bHRbMV1bMF0sIDQsICJCYXNpYyB0ZXN0IG9mIENvbm5lY3Rpb24uZXhlY3V0ZW1hbnkiKQorCisgICAgZGVmIENoZWNrQ29ubmVjdGlvbkV4ZWN1dGVzY3JpcHQoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5leGVjdXRlc2NyaXB0KCJjcmVhdGUgdGFibGUgdGVzdChmb28pOyBpbnNlcnQgaW50byB0ZXN0KGZvbykgdmFsdWVzICg1KTsiKQorICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgic2VsZWN0IGZvbyBmcm9tIHRlc3QiKS5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlc3VsdCwgNSwgIkJhc2ljIHRlc3Qgb2YgQ29ubmVjdGlvbi5leGVjdXRlc2NyaXB0IikKKworY2xhc3MgQ2xvc2VkVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgQ2hlY2tDbG9zZWRDb25DdXJzb3Ioc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIGNvbi5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ciA9IGNvbi5jdXJzb3IoKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorCisgICAgZGVmIENoZWNrQ2xvc2VkQ29uQ29tbWl0KHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24uY29tbWl0KCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKworICAgIGRlZiBDaGVja0Nsb3NlZENvblJvbGxiYWNrKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY2xvc2UoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24ucm9sbGJhY2soKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJTaG91bGQgaGF2ZSByYWlzZWQgYSBQcm9ncmFtbWluZ0Vycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5Qcm9ncmFtbWluZ0Vycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorCisgICAgZGVmIENoZWNrQ2xvc2VkQ3VyRXhlY3V0ZShzZWxmKToKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gY29uLmN1cnNvcigpCisgICAgICAgIGNvbi5jbG9zZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgNCIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIlNob3VsZCBoYXZlIHJhaXNlZCBhIFByb2dyYW1taW5nRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLlByb2dyYW1taW5nRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgiU2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisKK2RlZiBzdWl0ZSgpOgorICAgIG1vZHVsZV9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShNb2R1bGVUZXN0cywgIkNoZWNrIikKKyAgICBjb25uZWN0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbm5lY3Rpb25UZXN0cywgIkNoZWNrIikKKyAgICBjdXJzb3Jfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ3Vyc29yVGVzdHMsICJDaGVjayIpCisgICAgdGhyZWFkX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRocmVhZFRlc3RzLCAiQ2hlY2siKQorICAgIGNvbnN0cnVjdG9yX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbnN0cnVjdG9yVGVzdHMsICJDaGVjayIpCisgICAgZXh0X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEV4dGVuc2lvblRlc3RzLCAiQ2hlY2siKQorICAgIGNsb3NlZF9zdWl0ZSA9IHVuaXR0ZXN0Lm1ha2VTdWl0ZShDbG9zZWRUZXN0cywgIkNoZWNrIikKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChtb2R1bGVfc3VpdGUsIGNvbm5lY3Rpb25fc3VpdGUsIGN1cnNvcl9zdWl0ZSwgdGhyZWFkX3N1aXRlLCBjb25zdHJ1Y3Rvcl9zdWl0ZSwgZXh0X3N1aXRlLCBjbG9zZWRfc3VpdGUpKQorCitkZWYgdGVzdCgpOgorICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKKyAgICBydW5uZXIucnVuKHN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2ZhY3RvcnkucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc3ODA1NgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvZmFjdG9yeS5weQpAQCAtMCwwICsxLDE2NCBAQAorIy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCisjIHB5c3FsaXRlMi90ZXN0L2ZhY3RvcnkucHk6IHRlc3RzIGZvciB0aGUgdmFyaW91cyBmYWN0b3JpZXMgaW4gcHlzcWxpdGUKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyMKKyMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisjIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorIworIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQorCitjbGFzcyBNeUNvbm5lY3Rpb24oc3FsaXRlLkNvbm5lY3Rpb24pOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBzcWxpdGUuQ29ubmVjdGlvbi5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisKK2RlZiBkaWN0X2ZhY3RvcnkoY3Vyc29yLCByb3cpOgorICAgIGQgPSB7fQorICAgIGZvciBpZHgsIGNvbCBpbiBlbnVtZXJhdGUoY3Vyc29yLmRlc2NyaXB0aW9uKToKKyAgICAgICAgZFtjb2xbMF1dID0gcm93W2lkeF0KKyAgICByZXR1cm4gZAorCitjbGFzcyBNeUN1cnNvcihzcWxpdGUuQ3Vyc29yKToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc3FsaXRlLkN1cnNvci5fX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpCisgICAgICAgIHNlbGYucm93X2ZhY3RvcnkgPSBkaWN0X2ZhY3RvcnkKKworY2xhc3MgQ29ubmVjdGlvbkZhY3RvcnlUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGZhY3Rvcnk9TXlDb25uZWN0aW9uKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tJc0luc3RhbmNlKHNlbGYpOgorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShzZWxmLmNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXlDb25uZWN0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb25uZWN0aW9uIGlzIG5vdCBpbnN0YW5jZSBvZiBNeUNvbm5lY3Rpb24iKQorCitjbGFzcyBDdXJzb3JGYWN0b3J5VGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tJc0luc3RhbmNlKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoZmFjdG9yeT1NeUN1cnNvcikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UoY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeUN1cnNvciksCisgICAgICAgICAgICAgICAgICAgICAgICAiY3Vyc29yIGlzIG5vdCBpbnN0YW5jZSBvZiBNeUN1cnNvciIpCisKK2NsYXNzIFJvd0ZhY3RvcnlUZXN0c0JhY2t3YXJkc0NvbXBhdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisKKyAgICBkZWYgQ2hlY2tJc1Byb2R1Y2VkQnlGYWN0b3J5KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoZmFjdG9yeT1NeUN1cnNvcikKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCA0KzUgYXMgZm9vIikKKyAgICAgICAgcm93ID0gY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2Uocm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJyb3cgaXMgbm90IGluc3RhbmNlIG9mIGRpY3QiKQorICAgICAgICBjdXIuY2xvc2UoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKK2NsYXNzIFJvd0ZhY3RvcnlUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisKKyAgICBkZWYgQ2hlY2tDdXN0b21GYWN0b3J5KHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5yb3dfZmFjdG9yeSA9IGxhbWJkYSBjdXIsIHJvdzogbGlzdChyb3cpCisgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCAxLCAyIikuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoaXNpbnN0YW5jZShyb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgInJvdyBpcyBub3QgaW5zdGFuY2Ugb2YgbGlzdCIpCisKKyAgICBkZWYgQ2hlY2tTcWxpdGVSb3coc2VsZik6CisgICAgICAgIHNlbGYuY29uLnJvd19mYWN0b3J5ID0gc3FsaXRlLlJvdworICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgMSBhcyBhLCAyIGFzIGIiKS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhpc2luc3RhbmNlKHJvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3FsaXRlLlJvdyksCisgICAgICAgICAgICAgICAgICAgICAgICAicm93IGlzIG5vdCBpbnN0YW5jZSBvZiBzcWxpdGUuUm93IikKKworICAgICAgICBjb2wxLCBjb2wyID0gcm93WyJhIl0sIHJvd1siYiJdCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjb2wxID09IDEsICJieSBuYW1lOiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAnYSciKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY29sMiA9PSAyLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ2EnIikKKworICAgICAgICBjb2wxLCBjb2wyID0gcm93WyJBIl0sIHJvd1siQiJdCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyhjb2wxID09IDEsICJieSBuYW1lOiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAnQSciKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3MoY29sMiA9PSAyLCAiYnkgbmFtZTogd3JvbmcgcmVzdWx0IGZvciBjb2x1bW4gJ0InIikKKworICAgICAgICBjb2wxLCBjb2wyID0gcm93WzBdLCByb3dbMV0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNvbDEgPT0gMSwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAwIikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGNvbDIgPT0gMiwgImJ5IGluZGV4OiB3cm9uZyByZXN1bHQgZm9yIGNvbHVtbiAxIikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCitjbGFzcyBUZXh0RmFjdG9yeVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKworICAgIGRlZiBDaGVja1VuaWNvZGUoc2VsZik6CisgICAgICAgIGF1c3RyaWEgPSB1bmljb2RlKCLWc3RlcnJlaWNoIiwgImxhdGluMSIpCisgICAgICAgIHJvdyA9IHNlbGYuY29uLmV4ZWN1dGUoInNlbGVjdCA/IiwgKGF1c3RyaWEsKSkuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShyb3dbMF0pID09IHVuaWNvZGUsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIHVuaWNvZGUiKQorCisgICAgZGVmIENoZWNrU3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBzdHIKKyAgICAgICAgYXVzdHJpYSA9IHVuaWNvZGUoItZzdGVycmVpY2giLCAibGF0aW4xIikKKyAgICAgICAgcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYSwpKS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKHJvd1swXSkgPT0gc3RyLCAidHlwZSBvZiByb3dbMF0gbXVzdCBiZSBzdHIiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocm93WzBdID09IGF1c3RyaWEuZW5jb2RlKCJ1dGYtOCIpLCAiY29sdW1uIG11c3QgZXF1YWwgb3JpZ2luYWwgZGF0YSBpbiBVVEYtOCIpCisKKyAgICBkZWYgQ2hlY2tDdXN0b20oc2VsZik6CisgICAgICAgIHNlbGYuY29uLnRleHRfZmFjdG9yeSA9IGxhbWJkYSB4OiB1bmljb2RlKHgsICJ1dGYtOCIsICJpZ25vcmUiKQorICAgICAgICBhdXN0cmlhID0gdW5pY29kZSgi1nN0ZXJyZWljaCIsICJsYXRpbjEiKQorICAgICAgICByb3cgPSBzZWxmLmNvbi5leGVjdXRlKCJzZWxlY3QgPyIsIChhdXN0cmlhLmVuY29kZSgibGF0aW4xIiksKSkuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3ModHlwZShyb3dbMF0pID09IHVuaWNvZGUsICJ0eXBlIG9mIHJvd1swXSBtdXN0IGJlIHVuaWNvZGUiKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3Mocm93WzBdLmVuZHN3aXRoKHUicmVpY2giKSwgImNvbHVtbiBtdXN0IGNvbnRhaW4gb3JpZ2luYWwgZGF0YSIpCisKKyAgICBkZWYgQ2hlY2tPcHRpbWl6ZWRVbmljb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi50ZXh0X2ZhY3RvcnkgPSBzcWxpdGUuT3B0aW1pemVkVW5pY29kZQorICAgICAgICBhdXN0cmlhID0gdW5pY29kZSgi1nN0ZXJyZWljaCIsICJsYXRpbjEiKQorICAgICAgICBnZXJtYW55ID0gdW5pY29kZSgiRGV1dGNobGFuZCIpCisgICAgICAgIGFfcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoYXVzdHJpYSwpKS5mZXRjaG9uZSgpCisgICAgICAgIGRfcm93ID0gc2VsZi5jb24uZXhlY3V0ZSgic2VsZWN0ID8iLCAoZ2VybWFueSwpKS5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKGFfcm93WzBdKSA9PSB1bmljb2RlLCAidHlwZSBvZiBub24tQVNDSUkgcm93IG11c3QgYmUgdW5pY29kZSIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzcyh0eXBlKGRfcm93WzBdKSA9PSBzdHIsICJ0eXBlIG9mIEFTQ0lJLW9ubHkgcm93IG11c3QgYmUgc3RyIikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCitkZWYgc3VpdGUoKToKKyAgICBjb25uZWN0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKENvbm5lY3Rpb25GYWN0b3J5VGVzdHMsICJDaGVjayIpCisgICAgY3Vyc29yX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEN1cnNvckZhY3RvcnlUZXN0cywgIkNoZWNrIikKKyAgICByb3dfc3VpdGVfY29tcGF0ID0gdW5pdHRlc3QubWFrZVN1aXRlKFJvd0ZhY3RvcnlUZXN0c0JhY2t3YXJkc0NvbXBhdCwgIkNoZWNrIikKKyAgICByb3dfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoUm93RmFjdG9yeVRlc3RzLCAiQ2hlY2siKQorICAgIHRleHRfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoVGV4dEZhY3RvcnlUZXN0cywgIkNoZWNrIikKKyAgICByZXR1cm4gdW5pdHRlc3QuVGVzdFN1aXRlKChjb25uZWN0aW9uX3N1aXRlLCBjdXJzb3Jfc3VpdGUsIHJvd19zdWl0ZV9jb21wYXQsIHJvd19zdWl0ZSwgdGV4dF9zdWl0ZSkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvaG9va3MucHkgYi9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZjdiODgKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc3FsaXRlMy90ZXN0L2hvb2tzLnB5CkBAIC0wLDAgKzEsMTE1IEBACisjLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KKyMgcHlzcWxpdGUyL3Rlc3QvaG9va3MucHk6IHRlc3RzIGZvciB2YXJpb3VzIFNRTGl0ZS1zcGVjaWZpYyBob29rcworIworIyBDb3B5cmlnaHQgKEMpIDIwMDYgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2ltcG9ydCBvcywgdW5pdHRlc3QKK2ltcG9ydCBweXNxbGl0ZTIuZGJhcGkyIGFzIHNxbGl0ZQorCitjbGFzcyBDb2xsYXRpb25UZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0NyZWF0ZUNvbGxhdGlvbk5vdENhbGxhYmxlKHNlbGYpOgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigiWCIsIDQyKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYSBUeXBlRXJyb3IiKQorICAgICAgICBleGNlcHQgVHlwZUVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAicGFyYW1ldGVyIG11c3QgYmUgY2FsbGFibGUiKQorCisgICAgZGVmIENoZWNrQ3JlYXRlQ29sbGF0aW9uTm90QXNjaWkoc2VsZik6CisgICAgICAgIGNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGNvbi5jcmVhdGVfY29sbGF0aW9uKCJjb2xs5CIsIGNtcCkKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGEgUHJvZ3JhbW1pbmdFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuUHJvZ3JhbW1pbmdFcnJvciwgZToKKyAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0NvbGxhdGlvbklzVXNlZChzZWxmKToKKyAgICAgICAgZGVmIG15Y29sbCh4LCB5KToKKyAgICAgICAgICAgICMgcmV2ZXJzZSBvcmRlcgorICAgICAgICAgICAgcmV0dXJuIC1jbXAoeCwgeSkKKworICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgbXljb2xsKQorICAgICAgICBzcWwgPSAiIiIKKyAgICAgICAgICAgIHNlbGVjdCB4IGZyb20gKAorICAgICAgICAgICAgc2VsZWN0ICdhJyBhcyB4CisgICAgICAgICAgICB1bmlvbgorICAgICAgICAgICAgc2VsZWN0ICdiJyBhcyB4CisgICAgICAgICAgICB1bmlvbgorICAgICAgICAgICAgc2VsZWN0ICdjJyBhcyB4CisgICAgICAgICAgICApIG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwKKyAgICAgICAgICAgICIiIgorICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZShzcWwpLmZldGNoYWxsKCkKKyAgICAgICAgaWYgcmVzdWx0WzBdWzBdICE9ICJjIiBvciByZXN1bHRbMV1bMF0gIT0gImIiIG9yIHJlc3VsdFsyXVswXSAhPSAiYSI6CisgICAgICAgICAgICBzZWxmLmZhaWwoInRoZSBleHBlY3RlZCBvcmRlciB3YXMgbm90IHJldHVybmVkIikKKworICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgTm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzdWx0ID0gY29uLmV4ZWN1dGUoc3FsKS5mZXRjaGFsbCgpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgorICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoZS5hcmdzWzBdLCAibm8gc3VjaCBjb2xsYXRpb24gc2VxdWVuY2U6IG15Y29sbCIpCisKKyAgICBkZWYgQ2hlY2tDb2xsYXRpb25SZWdpc3RlclR3aWNlKHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgUmVnaXN0ZXIgdHdvIGRpZmZlcmVudCBjb2xsYXRpb24gZnVuY3Rpb25zIHVuZGVyIHRoZSBzYW1lIG5hbWUuCisgICAgICAgIFZlcmlmeSB0aGF0IHRoZSBsYXN0IG9uZSBpcyBhY3R1YWxseSB1c2VkLgorICAgICAgICAiIiIKKyAgICAgICAgY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIGNtcCkKKyAgICAgICAgY29uLmNyZWF0ZV9jb2xsYXRpb24oIm15Y29sbCIsIGxhbWJkYSB4LCB5OiAtY21wKHgsIHkpKQorICAgICAgICByZXN1bHQgPSBjb24uZXhlY3V0ZSgiIiIKKyAgICAgICAgICAgIHNlbGVjdCB4IGZyb20gKHNlbGVjdCAnYScgYXMgeCB1bmlvbiBzZWxlY3QgJ2InIGFzIHgpIG9yZGVyIGJ5IHggY29sbGF0ZSBteWNvbGwKKyAgICAgICAgICAgICIiIikuZmV0Y2hhbGwoKQorICAgICAgICBpZiByZXN1bHRbMF1bMF0gIT0gJ2InIG9yIHJlc3VsdFsxXVswXSAhPSAnYSc6CisgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIGNvbGxhdGlvbiBmdW5jdGlvbiBpcyB1c2VkIikKKworICAgIGRlZiBDaGVja0RlcmVnaXN0ZXJDb2xsYXRpb24oc2VsZik6CisgICAgICAgICIiIgorICAgICAgICBSZWdpc3RlciBhIGNvbGxhdGlvbiwgdGhlbiBkZXJlZ2lzdGVyIGl0LiBNYWtlIHN1cmUgYW4gZXJyb3IgaXMgcmFpc2VkIGlmIHdlIHRyeQorICAgICAgICB0byB1c2UgaXQuCisgICAgICAgICIiIgorICAgICAgICBjb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgY21wKQorICAgICAgICBjb24uY3JlYXRlX2NvbGxhdGlvbigibXljb2xsIiwgTm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29uLmV4ZWN1dGUoInNlbGVjdCAnYScgYXMgeCB1bmlvbiBzZWxlY3QgJ2InIGFzIHggb3JkZXIgYnkgeCBjb2xsYXRlIG15Y29sbCIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yLCBlOgorICAgICAgICAgICAgaWYgbm90IGUuYXJnc1swXS5zdGFydHN3aXRoKCJubyBzdWNoIGNvbGxhdGlvbiBzZXF1ZW5jZSIpOgorICAgICAgICAgICAgICAgIHNlbGYuZmFpbCgid3JvbmcgT3BlcmF0aW9uYWxFcnJvciByYWlzZWQiKQorCitkZWYgc3VpdGUoKToKKyAgICBjb2xsYXRpb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ29sbGF0aW9uVGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoY29sbGF0aW9uX3N1aXRlLCkpCisKK2RlZiB0ZXN0KCk6CisgICAgcnVubmVyID0gdW5pdHRlc3QuVGV4dFRlc3RSdW5uZXIoKQorICAgIHJ1bm5lci5ydW4oc3VpdGUoKSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvcmVncmVzc2lvbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDhhZGE1Ci0tLSAvZGV2L251bGwKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC9yZWdyZXNzaW9uLnB5CkBAIC0wLDAgKzEsNDggQEAKKyMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvdGVzdC9yZWdyZXNzaW9uLnB5OiBweXNxbGl0ZSByZWdyZXNzaW9uIHRlc3RzCisjCisjIENvcHlyaWdodCAoQykgMjAwNiBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworaW1wb3J0IHVuaXR0ZXN0CitpbXBvcnQgcHlzcWxpdGUyLmRiYXBpMiBhcyBzcWxpdGUKKworY2xhc3MgUmVncmVzc2lvblRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrUHJhZ21hVXNlclZlcnNpb24oc2VsZik6CisgICAgICAgICMgVGhpcyB1c2VkIHRvIGNyYXNoIHB5c3FsaXRlIGJlY2F1c2UgdGhpcyBwcmFnbWEgY29tbWFuZCByZXR1cm5zIE5VTEwgZm9yIHRoZSBjb2x1bW4gbmFtZQorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgicHJhZ21hIHVzZXJfdmVyc2lvbiIpCisKK2RlZiBzdWl0ZSgpOgorICAgIHJlZ3Jlc3Npb25fc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoUmVncmVzc2lvblRlc3RzLCAiQ2hlY2siKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKHJlZ3Jlc3Npb25fc3VpdGUsKSkKKworZGVmIHRlc3QoKToKKyAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCisgICAgcnVubmVyLnJ1bihzdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHkgYi9MaWIvc3FsaXRlMy90ZXN0L3RyYW5zYWN0aW9ucy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjBiMTlhCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NxbGl0ZTMvdGVzdC90cmFuc2FjdGlvbnMucHkKQEAgLTAsMCArMSwxNTYgQEAKKyMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvdGVzdC90cmFuc2FjdGlvbnMucHk6IHRlc3RzIHRyYW5zYWN0aW9ucworIworIyBDb3B5cmlnaHQgKEMpIDIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgorIworIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KKyMKKyMgVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCAnYXMtaXMnLCB3aXRob3V0IGFueSBleHByZXNzIG9yIGltcGxpZWQKKyMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcworIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgorIworIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKKyMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAorIyBmcmVlbHksIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CisjCisjIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CisjICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCisjICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQorIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorIyAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQorIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCisjIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCisKK2ltcG9ydCBvcywgdW5pdHRlc3QKK2ltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQorCitkZWYgZ2V0X2RiX3BhdGgoKToKKyAgICByZXR1cm4gInNxbGl0ZV90ZXN0ZGIiCisKK2NsYXNzIFRyYW5zYWN0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKGdldF9kYl9wYXRoKCkpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKworICAgICAgICBzZWxmLmNvbjEgPSBzcWxpdGUuY29ubmVjdChnZXRfZGJfcGF0aCgpLCB0aW1lb3V0PTAuMSkKKyAgICAgICAgc2VsZi5jdXIxID0gc2VsZi5jb24xLmN1cnNvcigpCisKKyAgICAgICAgc2VsZi5jb24yID0gc3FsaXRlLmNvbm5lY3QoZ2V0X2RiX3BhdGgoKSwgdGltZW91dD0wLjEpCisgICAgICAgIHNlbGYuY3VyMiA9IHNlbGYuY29uMi5jdXJzb3IoKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmN1cjEuY2xvc2UoKQorICAgICAgICBzZWxmLmNvbjEuY2xvc2UoKQorCisgICAgICAgIHNlbGYuY3VyMi5jbG9zZSgpCisgICAgICAgIHNlbGYuY29uMi5jbG9zZSgpCisKKyAgICAgICAgb3MudW5saW5rKGdldF9kYl9wYXRoKCkpCisKKyAgICBkZWYgQ2hlY2tETUxkb2VzQXV0b0NvbW1pdEJlZm9yZShzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdDIoaikiKQorICAgICAgICBzZWxmLmN1cjIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKKyAgICAgICAgcmVzID0gc2VsZi5jdXIyLmZldGNoYWxsKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwobGVuKHJlcyksIDEpCisKKyAgICBkZWYgQ2hlY2tJbnNlcnRTdGFydHNUcmFuc2FjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIxLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY3VyMi5leGVjdXRlKCJzZWxlY3QgaSBmcm9tIHRlc3QiKQorICAgICAgICByZXMgPSBzZWxmLmN1cjIuZmV0Y2hhbGwoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChsZW4ocmVzKSwgMCkKKworICAgIGRlZiBDaGVja1VwZGF0ZVN0YXJ0c1RyYW5zYWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgc2VsZi5jb24xLmNvbW1pdCgpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJ1cGRhdGUgdGVzdCBzZXQgaT02IikKKyAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJlcywgNSkKKworICAgIGRlZiBDaGVja0RlbGV0ZVN0YXJ0c1RyYW5zYWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgc2VsZi5jb24xLmNvbW1pdCgpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKyAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihyZXMpLCAxKQorCisgICAgZGVmIENoZWNrUmVwbGFjZVN0YXJ0c1RyYW5zYWN0aW9uKHNlbGYpOgorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgc2VsZi5jb24xLmNvbW1pdCgpCisgICAgICAgIHNlbGYuY3VyMS5leGVjdXRlKCJyZXBsYWNlIGludG8gdGVzdChpKSB2YWx1ZXMgKDYpIikKKyAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihyZXMpLCAxKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyZXNbMF1bMF0sIDUpCisKKyAgICBkZWYgQ2hlY2tUb2dnbGVBdXRvQ29tbWl0KHNlbGYpOgorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgc2VsZi5jb24xLmlzb2xhdGlvbl9sZXZlbCA9IE5vbmUKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoc2VsZi5jb24xLmlzb2xhdGlvbl9sZXZlbCwgTm9uZSkKKyAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihyZXMpLCAxKQorCisgICAgICAgIHNlbGYuY29uMS5pc29sYXRpb25fbGV2ZWwgPSAiREVGRVJSRUQiCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY29uMS5pc29sYXRpb25fbGV2ZWwgLCAiREVGRVJSRUQiKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJlcyA9IHNlbGYuY3VyMi5mZXRjaGFsbCgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKGxlbihyZXMpLCAxKQorCisgICAgZGVmIENoZWNrUmFpc2VUaW1lb3V0KHNlbGYpOgorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQorICAgICAgICBzZWxmLmN1cjEuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdXIyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKyAgICAgICAgZXhjZXB0IHNxbGl0ZS5PcGVyYXRpb25hbEVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBPcGVyYXRpb25hbEVycm9yIikKKworY2xhc3MgU3BlY2lhbENvbW1hbmRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKworICAgIGRlZiBDaGVja1ZhY3V1bShzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoaSkiKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoNSkiKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJ2YWN1dW0iKQorCisgICAgZGVmIENoZWNrRHJvcFRhYmxlKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpKSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg1KSIpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImRyb3AgdGFibGUgdGVzdCIpCisKKyAgICBkZWYgQ2hlY2tQcmFnbWEoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkpIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKDUpIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgicHJhZ21hIGNvdW50X2NoYW5nZXM9MSIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCitkZWYgc3VpdGUoKToKKyAgICBkZWZhdWx0X3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFRyYW5zYWN0aW9uVGVzdHMsICJDaGVjayIpCisgICAgc3BlY2lhbF9jb21tYW5kX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKFNwZWNpYWxDb21tYW5kVGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoZGVmYXVsdF9zdWl0ZSwgc3BlY2lhbF9jb21tYW5kX3N1aXRlKSkKKworZGVmIHRlc3QoKToKKyAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCisgICAgcnVubmVyLnJ1bihzdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC90eXBlcy5weSBiL0xpYi9zcWxpdGUzL3Rlc3QvdHlwZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ5ZjdkZAotLS0gL2Rldi9udWxsCisrKyBiL0xpYi9zcWxpdGUzL3Rlc3QvdHlwZXMucHkKQEAgLTAsMCArMSwzMzkgQEAKKyMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvdGVzdC90eXBlcy5weTogdGVzdHMgZm9yIHR5cGUgY29udmVyc2lvbiBhbmQgZGV0ZWN0aW9uCisjCisjIENvcHlyaWdodCAoQykgMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CisjCisjIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHB5c3FsaXRlLgorIworIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAorIyB3YXJyYW50eS4gIEluIG5vIGV2ZW50IHdpbGwgdGhlIGF1dGhvcnMgYmUgaGVsZCBsaWFibGUgZm9yIGFueSBkYW1hZ2VzCisjIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCisjCisjIFBlcm1pc3Npb24gaXMgZ3JhbnRlZCB0byBhbnlvbmUgdG8gdXNlIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLAorIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CisjIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKKyMKKyMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKKyMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKKyMgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCisjICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCisjIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCisjICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KKyMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KKworaW1wb3J0IGRhdGV0aW1lCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQorCitjbGFzcyBTcWxpdGVUeXBlVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorICAgICAgICBzZWxmLmN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSB0ZXN0KGkgaW50ZWdlciwgcyB2YXJjaGFyLCBmIG51bWJlciwgYiBibG9iKSIpCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jb24uY2xvc2UoKQorCisgICAgZGVmIENoZWNrU3RyaW5nKHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHMpIHZhbHVlcyAoPykiLCAodSLWc3RlcnJlaWNoIiwpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgcyBmcm9tIHRlc3QiKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgdSLWc3RlcnJlaWNoIikKKworICAgIGRlZiBDaGVja1NtYWxsSW50KHNlbGYpOgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCAoNDIsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIDQyKQorCisgICAgZGVmIENoZWNrTGFyZ2VJbnQoc2VsZik6CisgICAgICAgIG51bSA9IDIqKjQwCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoaSkgdmFsdWVzICg/KSIsIChudW0sKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIG51bSkKKworICAgIGRlZiBDaGVja0Zsb2F0KHNlbGYpOgorICAgICAgICB2YWwgPSAzLjE0CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZikgdmFsdWVzICg/KSIsICh2YWwsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGYgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIHZhbCkKKworICAgIGRlZiBDaGVja0Jsb2Ioc2VsZik6CisgICAgICAgIHZhbCA9IGJ1ZmZlcigiR3VnbGh1cGYiKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGIpIHZhbHVlcyAoPykiLCAodmFsLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBiIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCB2YWwpCisKKyAgICBkZWYgQ2hlY2tVbmljb2RlRXhlY3V0ZShzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSh1InNlbGVjdCAn1nN0ZXJyZWljaCciKQorICAgICAgICByb3cgPSBzZWxmLmN1ci5mZXRjaG9uZSgpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHJvd1swXSwgdSLWc3RlcnJlaWNoIikKKworY2xhc3MgRGVjbFR5cGVzVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGNsYXNzIEZvbzoKKyAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIF92YWwpOgorICAgICAgICAgICAgc2VsZi52YWwgPSBfdmFsCisKKyAgICAgICAgZGVmIF9fY21wX18oc2VsZiwgb3RoZXIpOgorICAgICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIERlY2xUeXBlc1Rlc3RzLkZvbyk6CisgICAgICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcgorICAgICAgICAgICAgaWYgc2VsZi52YWwgPT0gb3RoZXIudmFsOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisKKyAgICAgICAgZGVmIF9fY29uZm9ybV9fKHNlbGYsIHByb3RvY29sKToKKyAgICAgICAgICAgIGlmIHByb3RvY29sIGlzIHNxbGl0ZS5QcmVwYXJlUHJvdG9jb2w6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudmFsCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiBOb25lCisKKyAgICAgICAgZGVmIF9fc3RyX18oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gIjwlcz4iICUgc2VsZi52YWwKKworICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiLCBkZXRlY3RfdHlwZXM9c3FsaXRlLlBBUlNFX0RFQ0xUWVBFUykKKyAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdChpIGludCwgcyBzdHIsIGYgZmxvYXQsIGIgYm9vbCwgdSB1bmljb2RlLCBmb28gZm9vLCBiaW4gYmxvYikiKQorCisgICAgICAgICMgb3ZlcnJpZGUgZmxvYXQsIG1ha2UgdGhlbSBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIG51bWJlcgorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siZmxvYXQiXSA9IGxhbWJkYSB4OiA0Ny4yCisKKyAgICAgICAgIyBhbmQgaW1wbGVtZW50IHR3byBjdXN0b20gb25lcworICAgICAgICBzcWxpdGUuY29udmVydGVyc1siYm9vbCJdID0gbGFtYmRhIHg6IGJvb2woaW50KHgpKQorICAgICAgICBzcWxpdGUuY29udmVydGVyc1siZm9vIl0gPSBEZWNsVHlwZXNUZXN0cy5Gb28KKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJmbG9hdCJdCisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siYm9vbCJdCisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siZm9vIl0KKyAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tTdHJpbmcoc2VsZik6CisgICAgICAgICMgZGVmYXVsdAorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHMpIHZhbHVlcyAoPykiLCAoImZvbyIsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHMgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sICJmb28iKQorCisgICAgZGVmIENoZWNrU21hbGxJbnQoc2VsZik6CisgICAgICAgICMgZGVmYXVsdAorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCAoNDIsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGkgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIDQyKQorCisgICAgZGVmIENoZWNrTGFyZ2VJbnQoc2VsZik6CisgICAgICAgICMgZGVmYXVsdAorICAgICAgICBudW0gPSAyKio0MAorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGkpIHZhbHVlcyAoPykiLCAobnVtLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBpIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCBudW0pCisKKyAgICBkZWYgQ2hlY2tGbG9hdChzZWxmKToKKyAgICAgICAgIyBjdXN0b20KKyAgICAgICAgdmFsID0gMy4xNAorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGYpIHZhbHVlcyAoPykiLCAodmFsLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBmIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCA0Ny4yKQorCisgICAgZGVmIENoZWNrQm9vbChzZWxmKToKKyAgICAgICAgIyBjdXN0b20KKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChiKSB2YWx1ZXMgKD8pIiwgKEZhbHNlLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBiIGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCBGYWxzZSkKKworICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJkZWxldGUgZnJvbSB0ZXN0IikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChiKSB2YWx1ZXMgKD8pIiwgKFRydWUsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IGIgZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIFRydWUpCisKKyAgICBkZWYgQ2hlY2tVbmljb2RlKHNlbGYpOgorICAgICAgICAjIGRlZmF1bHQKKyAgICAgICAgdmFsID0gdSJceGQ2c3RlcnJlaWNoIgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHUpIHZhbHVlcyAoPykiLCAodmFsLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB1IGZyb20gdGVzdCIpCisgICAgICAgIHJvdyA9IHNlbGYuY3VyLmZldGNob25lKCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwocm93WzBdLCB2YWwpCisKKyAgICBkZWYgQ2hlY2tGb28oc2VsZik6CisgICAgICAgIHZhbCA9IERlY2xUeXBlc1Rlc3RzLkZvbygiYmxhIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmb28pIHZhbHVlcyAoPykiLCAodmFsLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBmb28gZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIHZhbCkKKworICAgIGRlZiBDaGVja1Vuc3VwcG9ydGVkU2VxKHNlbGYpOgorICAgICAgICBjbGFzcyBCYXI6IHBhc3MKKyAgICAgICAgdmFsID0gQmFyKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChmKSB2YWx1ZXMgKD8pIiwgKHZhbCwpKQorICAgICAgICAgICAgc2VsZi5mYWlsKCJzaG91bGQgaGF2ZSByYWlzZWQgYW4gSW50ZXJmYWNlRXJyb3IiKQorICAgICAgICBleGNlcHQgc3FsaXRlLkludGVyZmFjZUVycm9yOgorICAgICAgICAgICAgcGFzcworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBJbnRlcmZhY2VFcnJvciIpCisKKyAgICBkZWYgQ2hlY2tVbnN1cHBvcnRlZERpY3Qoc2VsZik6CisgICAgICAgIGNsYXNzIEJhcjogcGFzcworICAgICAgICB2YWwgPSBCYXIoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KGYpIHZhbHVlcyAoOnZhbCkiLCB7InZhbCI6IHZhbH0pCisgICAgICAgICAgICBzZWxmLmZhaWwoInNob3VsZCBoYXZlIHJhaXNlZCBhbiBJbnRlcmZhY2VFcnJvciIpCisgICAgICAgIGV4Y2VwdCBzcWxpdGUuSW50ZXJmYWNlRXJyb3I6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYuZmFpbCgic2hvdWxkIGhhdmUgcmFpc2VkIGFuIEludGVyZmFjZUVycm9yIikKKworICAgIGRlZiBDaGVja0Jsb2Ioc2VsZik6CisgICAgICAgICMgZGVmYXVsdAorICAgICAgICB2YWwgPSBidWZmZXIoIkd1Z2xodXBmIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdChiaW4pIHZhbHVlcyAoPykiLCAodmFsLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBiaW4gZnJvbSB0ZXN0IikKKyAgICAgICAgcm93ID0gc2VsZi5jdXIuZmV0Y2hvbmUoKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChyb3dbMF0sIHZhbCkKKworY2xhc3MgQ29sTmFtZXNUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIsIGRldGVjdF90eXBlcz1zcWxpdGUuUEFSU0VfQ09MTkFNRVN8c3FsaXRlLlBBUlNFX0RFQ0xUWVBFUykKKyAgICAgICAgc2VsZi5jdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJjcmVhdGUgdGFibGUgdGVzdCh4IGZvbykiKQorCisgICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJmb28iXSA9IGxhbWJkYSB4OiAiWyVzXSIgJSB4CisgICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJiYXIiXSA9IGxhbWJkYSB4OiAiPCVzPiIgJSB4CisgICAgICAgIHNxbGl0ZS5jb252ZXJ0ZXJzWyJleGMiXSA9IGxhbWJkYSB4OiA1LzAKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZGVsIHNxbGl0ZS5jb252ZXJ0ZXJzWyJmb28iXQorICAgICAgICBkZWwgc3FsaXRlLmNvbnZlcnRlcnNbImJhciJdCisgICAgICAgIGRlbCBzcWxpdGUuY29udmVydGVyc1siZXhjIl0KKyAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tEZWNsVHlwZShzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh4KSB2YWx1ZXMgKD8pIiwgKCJ4eHgiLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCB4IGZyb20gdGVzdCIpCisgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAiW3h4eF0iKQorCisgICAgZGVmIENoZWNrTm9uZShzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh4KSB2YWx1ZXMgKD8pIiwgKE5vbmUsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHggZnJvbSB0ZXN0IikKKyAgICAgICAgdmFsID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCisKKyAgICBkZWYgQ2hlY2tFeGMoc2VsZik6CisgICAgICAgICMgRXhjZXB0aW9ucyBpbiB0eXBlIGNvbnZlcnRlcnMgcmVzdWx0IGluIHJldHVybmVkIE5vbmVzCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoJ3NlbGVjdCA1IGFzICJ4IFtleGNdIicpCisgICAgICAgIHZhbCA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQorCisgICAgZGVmIENoZWNrQ29sTmFtZShzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh4KSB2YWx1ZXMgKD8pIiwgKCJ4eHgiLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoJ3NlbGVjdCB4IGFzICJ4IFtiYXJdIiBmcm9tIHRlc3QnKQorICAgICAgICB2YWwgPSBzZWxmLmN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgIjx4eHg+IikKKworICAgICAgICAjIENoZWNrIGlmIHRoZSBzdHJpcHBpbmcgb2YgY29sbmFtZXMgd29ya3MuIEV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGZpcnN0CisgICAgICAgICMgd2hpdGVzcGFjZSBzaG91bGQgYmUgc3RyaXBwZWQuCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHNlbGYuY3VyLmRlc2NyaXB0aW9uWzBdWzBdLCAieCIpCisKKyAgICBkZWYgQ2hlY2tDdXJzb3JEZXNjcmlwdGlvbk5vUm93KHNlbGYpOgorICAgICAgICAiIiIKKyAgICAgICAgY3Vyc29yLmRlc2NyaXB0aW9uIHNob3VsZCBhdCBsZWFzdCBwcm92aWRlIHRoZSBjb2x1bW4gbmFtZShzKSwgZXZlbiBpZgorICAgICAgICBubyByb3cgcmV0dXJuZWQuCisgICAgICAgICIiIgorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgKiBmcm9tIHRlc3Qgd2hlcmUgMCA9IDEiKQorICAgICAgICBzZWxmLmFzc2VydF8oc2VsZi5jdXIuZGVzY3JpcHRpb25bMF1bMF0gPT0gIngiKQorCitjbGFzcyBPYmplY3RBZGFwdGF0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBjYXN0KG9iaik6CisgICAgICAgIHJldHVybiBmbG9hdChvYmopCisgICAgY2FzdCA9IHN0YXRpY21ldGhvZChjYXN0KQorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmNvbiA9IHNxbGl0ZS5jb25uZWN0KCI6bWVtb3J5OiIpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGRlbCBzcWxpdGUuYWRhcHRlcnNbaW50XQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIHNxbGl0ZS5yZWdpc3Rlcl9hZGFwdGVyKGludCwgT2JqZWN0QWRhcHRhdGlvblRlc3RzLmNhc3QpCisgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgZGVsIHNxbGl0ZS5hZGFwdGVyc1soaW50LCBzcWxpdGUuUHJlcGFyZVByb3RvY29sKV0KKyAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tDYXN0ZXJJc1VzZWQoc2VsZik6CisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCA/IiwgKDQsKSkKKyAgICAgICAgdmFsID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHZhbCksIGZsb2F0KQorCitjbGFzcyBEYXRlVGltZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IiwgZGV0ZWN0X3R5cGVzPXNxbGl0ZS5QQVJTRV9ERUNMVFlQRVMpCisgICAgICAgIHNlbGYuY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHRlc3QoZCBkYXRlLCB0cyB0aW1lc3RhbXApIikKKworICAgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICAgICAgc2VsZi5jdXIuY2xvc2UoKQorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tTcWxpdGVEYXRlKHNlbGYpOgorICAgICAgICBkID0gc3FsaXRlLkRhdGUoMjAwNCwgMiwgMTQpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QoZCkgdmFsdWVzICg/KSIsIChkLCkpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoInNlbGVjdCBkIGZyb20gdGVzdCIpCisgICAgICAgIGQyID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChkLCBkMikKKworICAgIGRlZiBDaGVja1NxbGl0ZVRpbWVzdGFtcChzZWxmKToKKyAgICAgICAgdHMgPSBzcWxpdGUuVGltZXN0YW1wKDIwMDQsIDIsIDE0LCA3LCAxNSwgMCkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgiaW5zZXJ0IGludG8gdGVzdCh0cykgdmFsdWVzICg/KSIsICh0cywpKQorICAgICAgICBzZWxmLmN1ci5leGVjdXRlKCJzZWxlY3QgdHMgZnJvbSB0ZXN0IikKKyAgICAgICAgdHMyID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0cywgdHMyKQorCisgICAgZGVmIENoZWNrU3FsVGltZXN0YW1wKHNlbGYpOgorICAgICAgICAjIFRoZSBkYXRlIGZ1bmN0aW9ucyBhcmUgb25seSBhdmFpbGFibGUgaW4gU1FMaXRlIHZlcnNpb24gMy4xIG9yIGxhdGVyCisgICAgICAgIGlmIHNxbGl0ZS5zcWxpdGVfdmVyc2lvbl9pbmZvIDwgKDMsIDEpOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgIyBTUUxpdGUncyBjdXJyZW50X3RpbWVzdGFtcCB1c2VzIFVUQyB0aW1lLCB3aGlsZSBkYXRldGltZS5kYXRldGltZS5ub3coKSB1c2VzIGxvY2FsIHRpbWUuCisgICAgICAgIG5vdyA9IGRhdGV0aW1lLmRhdGV0aW1lLm5vdygpCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodHMpIHZhbHVlcyAoY3VycmVudF90aW1lc3RhbXApIikKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHRzIGZyb20gdGVzdCIpCisgICAgICAgIHRzID0gc2VsZi5jdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHRzKSwgZGF0ZXRpbWUuZGF0ZXRpbWUpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHRzLnllYXIsIG5vdy55ZWFyKQorCisgICAgZGVmIENoZWNrRGF0ZVRpbWVTdWJTZWNvbmRzKHNlbGYpOgorICAgICAgICB0cyA9IHNxbGl0ZS5UaW1lc3RhbXAoMjAwNCwgMiwgMTQsIDcsIDE1LCAwLCA1MDAwMDApCisgICAgICAgIHNlbGYuY3VyLmV4ZWN1dGUoImluc2VydCBpbnRvIHRlc3QodHMpIHZhbHVlcyAoPykiLCAodHMsKSkKKyAgICAgICAgc2VsZi5jdXIuZXhlY3V0ZSgic2VsZWN0IHRzIGZyb20gdGVzdCIpCisgICAgICAgIHRzMiA9IHNlbGYuY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHMsIHRzMikKKworZGVmIHN1aXRlKCk6CisgICAgc3FsaXRlX3R5cGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoU3FsaXRlVHlwZVRlc3RzLCAiQ2hlY2siKQorICAgIGRlY2x0eXBlc190eXBlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKERlY2xUeXBlc1Rlc3RzLCAiQ2hlY2siKQorICAgIGNvbG5hbWVzX3R5cGVfc3VpdGUgPSB1bml0dGVzdC5tYWtlU3VpdGUoQ29sTmFtZXNUZXN0cywgIkNoZWNrIikKKyAgICBhZGFwdGF0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKE9iamVjdEFkYXB0YXRpb25UZXN0cywgIkNoZWNrIikKKyAgICBkYXRlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKERhdGVUaW1lVGVzdHMsICJDaGVjayIpCisgICAgcmV0dXJuIHVuaXR0ZXN0LlRlc3RTdWl0ZSgoc3FsaXRlX3R5cGVfc3VpdGUsIGRlY2x0eXBlc190eXBlX3N1aXRlLCBjb2xuYW1lc190eXBlX3N1aXRlLCBhZGFwdGF0aW9uX3N1aXRlLCBkYXRlX3N1aXRlKSkKKworZGVmIHRlc3QoKToKKyAgICBydW5uZXIgPSB1bml0dGVzdC5UZXh0VGVzdFJ1bm5lcigpCisgICAgcnVubmVyLnJ1bihzdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5IGIvTGliL3NxbGl0ZTMvdGVzdC91c2VyZnVuY3Rpb25zLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmN2RiOWMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvc3FsaXRlMy90ZXN0L3VzZXJmdW5jdGlvbnMucHkKQEAgLTAsMCArMSwzMzAgQEAKKyMtKi0gY29kaW5nOiBJU08tODg1OS0xIC0qLQorIyBweXNxbGl0ZTIvdGVzdC91c2VyZnVuY3Rpb25zLnB5OiB0ZXN0cyBmb3IgdXNlci1kZWZpbmVkIGZ1bmN0aW9ucyBhbmQKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlcy4KKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA1IEdlcmhhcmQgSORyaW5nIDxnaEBnaGFlcmluZy5kZT4KKyMKKyMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCisjCisjIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCisjIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKKyMgYXJpc2luZyBmcm9tIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZS4KKyMKKyMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCisjIGluY2x1ZGluZyBjb21tZXJjaWFsIGFwcGxpY2F0aW9ucywgYW5kIHRvIGFsdGVyIGl0IGFuZCByZWRpc3RyaWJ1dGUgaXQKKyMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgorIworIyAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAorIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQorIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKKyMgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KKyMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKKyMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorIyAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgorCitpbXBvcnQgdW5pdHRlc3QKK2ltcG9ydCBzcWxpdGUzIGFzIHNxbGl0ZQorCitkZWYgZnVuY19yZXR1cm50ZXh0KCk6CisgICAgcmV0dXJuICJmb28iCitkZWYgZnVuY19yZXR1cm51bmljb2RlKCk6CisgICAgcmV0dXJuIHUiYmFyIgorZGVmIGZ1bmNfcmV0dXJuaW50KCk6CisgICAgcmV0dXJuIDQyCitkZWYgZnVuY19yZXR1cm5mbG9hdCgpOgorICAgIHJldHVybiAzLjE0CitkZWYgZnVuY19yZXR1cm5udWxsKCk6CisgICAgcmV0dXJuIE5vbmUKK2RlZiBmdW5jX3JldHVybmJsb2IoKToKKyAgICByZXR1cm4gYnVmZmVyKCJibG9iIikKK2RlZiBmdW5jX3JhaXNlZXhjZXB0aW9uKCk6CisgICAgNS8wCisKK2RlZiBmdW5jX2lzc3RyaW5nKHYpOgorICAgIHJldHVybiB0eXBlKHYpIGlzIHVuaWNvZGUKK2RlZiBmdW5jX2lzaW50KHYpOgorICAgIHJldHVybiB0eXBlKHYpIGlzIGludAorZGVmIGZ1bmNfaXNmbG9hdCh2KToKKyAgICByZXR1cm4gdHlwZSh2KSBpcyBmbG9hdAorZGVmIGZ1bmNfaXNub25lKHYpOgorICAgIHJldHVybiB0eXBlKHYpIGlzIHR5cGUoTm9uZSkKK2RlZiBmdW5jX2lzYmxvYih2KToKKyAgICByZXR1cm4gdHlwZSh2KSBpcyBidWZmZXIKKworY2xhc3MgQWdnck5vU3RlcDoKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworY2xhc3MgQWdnck5vRmluYWxpemU6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgc3RlcChzZWxmLCB4KToKKyAgICAgICAgcGFzcworCitjbGFzcyBBZ2dyRXhjZXB0aW9uSW5Jbml0OgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgNS8wCisKKyAgICBkZWYgc3RlcChzZWxmLCB4KToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGZpbmFsaXplKHNlbGYpOgorICAgICAgICBwYXNzCisKK2NsYXNzIEFnZ3JFeGNlcHRpb25JblN0ZXA6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgc3RlcChzZWxmLCB4KToKKyAgICAgICAgNS8wCisKKyAgICBkZWYgZmluYWxpemUoc2VsZik6CisgICAgICAgIHJldHVybiA0MgorCitjbGFzcyBBZ2dyRXhjZXB0aW9uSW5GaW5hbGl6ZToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBzdGVwKHNlbGYsIHgpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZmluYWxpemUoc2VsZik6CisgICAgICAgIDUvMAorCitjbGFzcyBBZ2dyQ2hlY2tUeXBlOgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YWwgPSBOb25lCisKKyAgICBkZWYgc3RlcChzZWxmLCB3aGljaFR5cGUsIHZhbCk6CisgICAgICAgIHRoZVR5cGUgPSB7InN0ciI6IHVuaWNvZGUsICJpbnQiOiBpbnQsICJmbG9hdCI6IGZsb2F0LCAiTm9uZSI6IHR5cGUoTm9uZSksICJibG9iIjogYnVmZmVyfQorICAgICAgICBzZWxmLnZhbCA9IGludCh0aGVUeXBlW3doaWNoVHlwZV0gaXMgdHlwZSh2YWwpKQorCisgICAgZGVmIGZpbmFsaXplKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi52YWwKKworY2xhc3MgQWdnclN1bToKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudmFsID0gMC4wCisKKyAgICBkZWYgc3RlcChzZWxmLCB2YWwpOgorICAgICAgICBzZWxmLnZhbCArPSB2YWwKKworICAgIGRlZiBmaW5hbGl6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudmFsCisKK2NsYXNzIEZ1bmN0aW9uVGVzdHModW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5jb24gPSBzcWxpdGUuY29ubmVjdCgiOm1lbW9yeToiKQorCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmV0dXJudGV4dCIsIDAsIGZ1bmNfcmV0dXJudGV4dCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm51bmljb2RlIiwgMCwgZnVuY19yZXR1cm51bmljb2RlKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybmludCIsIDAsIGZ1bmNfcmV0dXJuaW50KQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybmZsb2F0IiwgMCwgZnVuY19yZXR1cm5mbG9hdCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJyZXR1cm5udWxsIiwgMCwgZnVuY19yZXR1cm5udWxsKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oInJldHVybmJsb2IiLCAwLCBmdW5jX3JldHVybmJsb2IpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmFpc2VleGNlcHRpb24iLCAwLCBmdW5jX3JhaXNlZXhjZXB0aW9uKQorCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigiaXNzdHJpbmciLCAxLCBmdW5jX2lzc3RyaW5nKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzaW50IiwgMSwgZnVuY19pc2ludCkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2Z1bmN0aW9uKCJpc2Zsb2F0IiwgMSwgZnVuY19pc2Zsb2F0KQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzbm9uZSIsIDEsIGZ1bmNfaXNub25lKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfZnVuY3Rpb24oImlzYmxvYiIsIDEsIGZ1bmNfaXNibG9iKQorCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBzZWxmLmNvbi5jbG9zZSgpCisKKyAgICBkZWYgQ2hlY2tGdW5jUmVmQ291bnQoc2VsZik6CisgICAgICAgIGRlZiBnZXRmdW5jKCk6CisgICAgICAgICAgICBkZWYgZigpOgorICAgICAgICAgICAgICAgIHJldHVybiB2YWwKKyAgICAgICAgICAgIHJldHVybiBmCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9mdW5jdGlvbigicmVmdGVzdCIsIDAsIGdldGZ1bmMoKSkKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZWZ0ZXN0KCkiKQorCisgICAgZGVmIENoZWNrRnVuY1JldHVyblRleHQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJudGV4dCgpIikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCB1bmljb2RlKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsICJmb28iKQorCisgICAgZGVmIENoZWNrRnVuY1JldHVyblVuaWNvZGUoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJudW5pY29kZSgpIikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCB1bmljb2RlKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIHUiYmFyIikKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5JbnQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuaW50KCkiKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh0eXBlKHZhbCksIGludCkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCA0MikKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5GbG9hdChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCByZXR1cm5mbG9hdCgpIikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBmbG9hdCkKKyAgICAgICAgaWYgdmFsIDwgMy4xMzkgb3IgdmFsID4gMy4xNDE6CisgICAgICAgICAgICBzZWxmLmZhaWwoIndyb25nIHZhbHVlIikKKworICAgIGRlZiBDaGVja0Z1bmNSZXR1cm5OdWxsKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJldHVybm51bGwoKSIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHR5cGUodmFsKSwgdHlwZShOb25lKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCBOb25lKQorCisgICAgZGVmIENoZWNrRnVuY1JldHVybkJsb2Ioc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgcmV0dXJuYmxvYigpIikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodHlwZSh2YWwpLCBidWZmZXIpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgYnVmZmVyKCJibG9iIikpCisKKyAgICBkZWYgQ2hlY2tGdW5jRXhjZXB0aW9uKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IHJhaXNlZXhjZXB0aW9uKCkiKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCisKKyAgICBkZWYgQ2hlY2tQYXJhbVN0cmluZyhzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc3N0cmluZyg/KSIsICgiZm9vIiwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tQYXJhbUludChzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBpc2ludCg/KSIsICg0MiwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tQYXJhbUZsb2F0KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzZmxvYXQoPykiLCAoMy4xNCwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tQYXJhbU5vbmUoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgaXNub25lKD8pIiwgKE5vbmUsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrUGFyYW1CbG9iKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGlzYmxvYig/KSIsIChidWZmZXIoImJsb2IiKSwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisKK2NsYXNzIEFnZ3JlZ2F0ZVRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgc2V0VXAoc2VsZik6CisgICAgICAgIHNlbGYuY29uID0gc3FsaXRlLmNvbm5lY3QoIjptZW1vcnk6IikKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoIiIiCisgICAgICAgICAgICBjcmVhdGUgdGFibGUgdGVzdCgKKyAgICAgICAgICAgICAgICB0IHRleHQsCisgICAgICAgICAgICAgICAgaSBpbnRlZ2VyLAorICAgICAgICAgICAgICAgIGYgZmxvYXQsCisgICAgICAgICAgICAgICAgbiwKKyAgICAgICAgICAgICAgICBiIGJsb2IKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAiIiIpCisgICAgICAgIGN1ci5leGVjdXRlKCJpbnNlcnQgaW50byB0ZXN0KHQsIGksIGYsIG4sIGIpIHZhbHVlcyAoPywgPywgPywgPywgPykiLAorICAgICAgICAgICAgKCJmb28iLCA1LCAzLjE0LCBOb25lLCBidWZmZXIoImJsb2IiKSwpKQorCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoIm5vc3RlcCIsIDEsIEFnZ3JOb1N0ZXApCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoIm5vZmluYWxpemUiLCAxLCBBZ2dyTm9GaW5hbGl6ZSkKKyAgICAgICAgc2VsZi5jb24uY3JlYXRlX2FnZ3JlZ2F0ZSgiZXhjSW5pdCIsIDEsIEFnZ3JFeGNlcHRpb25JbkluaXQpCisgICAgICAgIHNlbGYuY29uLmNyZWF0ZV9hZ2dyZWdhdGUoImV4Y1N0ZXAiLCAxLCBBZ2dyRXhjZXB0aW9uSW5TdGVwKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJleGNGaW5hbGl6ZSIsIDEsIEFnZ3JFeGNlcHRpb25JbkZpbmFsaXplKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJjaGVja1R5cGUiLCAyLCBBZ2dyQ2hlY2tUeXBlKQorICAgICAgICBzZWxmLmNvbi5jcmVhdGVfYWdncmVnYXRlKCJteXN1bSIsIDEsIEFnZ3JTdW0pCisKKyAgICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgICAgICNzZWxmLmN1ci5jbG9zZSgpCisgICAgICAgICNzZWxmLmNvbi5jbG9zZSgpCisgICAgICAgIHBhc3MKKworICAgIGRlZiBDaGVja0FnZ3JOb1N0ZXAoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3Qgbm9zdGVwKHQpIGZyb20gdGVzdCIpCisKKyAgICBkZWYgQ2hlY2tBZ2dyTm9GaW5hbGl6ZShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBub2ZpbmFsaXplKHQpIGZyb20gdGVzdCIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgTm9uZSkKKworICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JbkluaXQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgZXhjSW5pdCh0KSBmcm9tIHRlc3QiKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIE5vbmUpCisKKyAgICBkZWYgQ2hlY2tBZ2dyRXhjZXB0aW9uSW5TdGVwKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y1N0ZXAodCkgZnJvbSB0ZXN0IikKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCA0MikKKworICAgIGRlZiBDaGVja0FnZ3JFeGNlcHRpb25JbkZpbmFsaXplKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGV4Y0ZpbmFsaXplKHQpIGZyb20gdGVzdCIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgTm9uZSkKKworICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtU3RyKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnc3RyJywgPykiLCAoImZvbyIsKSkKKyAgICAgICAgdmFsID0gY3VyLmZldGNob25lKClbMF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwodmFsLCAxKQorCisgICAgZGVmIENoZWNrQWdnckNoZWNrUGFyYW1JbnQoc2VsZik6CisgICAgICAgIGN1ciA9IHNlbGYuY29uLmN1cnNvcigpCisgICAgICAgIGN1ci5leGVjdXRlKCJzZWxlY3QgY2hlY2tUeXBlKCdpbnQnLCA/KSIsICg0MiwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tQYXJhbUZsb2F0KHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IGNoZWNrVHlwZSgnZmxvYXQnLCA/KSIsICgzLjE0LCkpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKKworICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtTm9uZShzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ05vbmUnLCA/KSIsIChOb25lLCkpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgMSkKKworICAgIGRlZiBDaGVja0FnZ3JDaGVja1BhcmFtQmxvYihzZWxmKToKKyAgICAgICAgY3VyID0gc2VsZi5jb24uY3Vyc29yKCkKKyAgICAgICAgY3VyLmV4ZWN1dGUoInNlbGVjdCBjaGVja1R5cGUoJ2Jsb2InLCA/KSIsIChidWZmZXIoImJsb2IiKSwpKQorICAgICAgICB2YWwgPSBjdXIuZmV0Y2hvbmUoKVswXQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCh2YWwsIDEpCisKKyAgICBkZWYgQ2hlY2tBZ2dyQ2hlY2tBZ2dyU3VtKHNlbGYpOgorICAgICAgICBjdXIgPSBzZWxmLmNvbi5jdXJzb3IoKQorICAgICAgICBjdXIuZXhlY3V0ZSgiZGVsZXRlIGZyb20gdGVzdCIpCisgICAgICAgIGN1ci5leGVjdXRlbWFueSgiaW5zZXJ0IGludG8gdGVzdChpKSB2YWx1ZXMgKD8pIiwgWygxMCwpLCAoMjAsKSwgKDMwLCldKQorICAgICAgICBjdXIuZXhlY3V0ZSgic2VsZWN0IG15c3VtKGkpIGZyb20gdGVzdCIpCisgICAgICAgIHZhbCA9IGN1ci5mZXRjaG9uZSgpWzBdCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKHZhbCwgNjApCisKK2RlZiBzdWl0ZSgpOgorICAgIGZ1bmN0aW9uX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEZ1bmN0aW9uVGVzdHMsICJDaGVjayIpCisgICAgYWdncmVnYXRlX3N1aXRlID0gdW5pdHRlc3QubWFrZVN1aXRlKEFnZ3JlZ2F0ZVRlc3RzLCAiQ2hlY2siKQorICAgIHJldHVybiB1bml0dGVzdC5UZXN0U3VpdGUoKGZ1bmN0aW9uX3N1aXRlLCBhZ2dyZWdhdGVfc3VpdGUpKQorCitkZWYgdGVzdCgpOgorICAgIHJ1bm5lciA9IHVuaXR0ZXN0LlRleHRUZXN0UnVubmVyKCkKKyAgICBydW5uZXIucnVuKHN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdCgpCmRpZmYgLS1naXQgYS9MaWIvc3JlLnB5IGIvTGliL3NyZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTAwOTRhCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3NyZS5weQpAQCAtMCwwICsxLDEwIEBACisiIiJUaGlzIGZpbGUgaXMgb25seSByZXRhaW5lZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCitJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gIHNyZSB3YXMgbW92ZWQgdG8gcmUgaW4gdmVyc2lvbiAyLjUuCisiIiIKKworaW1wb3J0IHdhcm5pbmdzCit3YXJuaW5ncy53YXJuKCJUaGUgc3JlIG1vZHVsZSBpcyBkZXByZWNhdGVkLCBwbGVhc2UgaW1wb3J0IHJlLiIsCisgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywgMikKKworZnJvbSByZSBpbXBvcnQgKgorZnJvbSByZSBpbXBvcnQgX19hbGxfXwpkaWZmIC0tZ2l0IGEvTGliL3N1YnByb2Nlc3MucHkgYi9MaWIvc3VicHJvY2Vzcy5weQppbmRleCA2ODI3MjQ0Li4zY2QwZGY1IDEwMDY0NAotLS0gYS9MaWIvc3VicHJvY2Vzcy5weQorKysgYi9MaWIvc3VicHJvY2Vzcy5weQpAQCAtNDE0LDcgKzQxNCwxMyBAQAogCiBkZWYgX2NsZWFudXAoKToKICAgICBmb3IgaW5zdCBpbiBfYWN0aXZlWzpdOgotICAgICAgICBpbnN0LnBvbGwoKQorICAgICAgICBpZiBpbnN0LnBvbGwoX2RlYWRzdGF0ZT1zeXMubWF4aW50KSA+PSAwOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIF9hY3RpdmUucmVtb3ZlKGluc3QpCisgICAgICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKKyAgICAgICAgICAgICAgICAjIFRoaXMgY2FuIGhhcHBlbiBpZiB0d28gdGhyZWFkcyBjcmVhdGUgYSBuZXcgUG9wZW4gaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgIyBJdCdzIGhhcm1sZXNzIHRoYXQgaXQgd2FzIGFscmVhZHkgcmVtb3ZlZCwgc28gaWdub3JlLgorICAgICAgICAgICAgICAgIHBhc3MKIAogUElQRSA9IC0xCiBTVERPVVQgPSAtMgpAQCAtNTI3LDYgKzUzMyw3IEBACiAgICAgICAgICIiIkNyZWF0ZSBuZXcgUG9wZW4gaW5zdGFuY2UuIiIiCiAgICAgICAgIF9jbGVhbnVwKCkKIAorICAgICAgICBzZWxmLl9jaGlsZF9jcmVhdGVkID0gRmFsc2UKICAgICAgICAgaWYgbm90IGlzaW5zdGFuY2UoYnVmc2l6ZSwgKGludCwgbG9uZykpOgogICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJidWZzaXplIG11c3QgYmUgYW4gaW50ZWdlciIpCiAKQEAgLTU5MiwxNCArNTk5LDI0IEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuc3RkZXJyID0gb3MuZmRvcGVuKGVycnJlYWQsICdyYicsIGJ1ZnNpemUpCiAKLSAgICAgICAgX2FjdGl2ZS5hcHBlbmQoc2VsZikKLQogCiAgICAgZGVmIF90cmFuc2xhdGVfbmV3bGluZXMoc2VsZiwgZGF0YSk6CiAgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoIlxyXG4iLCAiXG4iKQogICAgICAgICBkYXRhID0gZGF0YS5yZXBsYWNlKCJcciIsICJcbiIpCiAgICAgICAgIHJldHVybiBkYXRhCiAKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5fY2hpbGRfY3JlYXRlZDoKKyAgICAgICAgICAgICMgV2UgZGlkbid0IGdldCB0byBzdWNjZXNzZnVsbHkgY3JlYXRlIGEgY2hpbGQgcHJvY2Vzcy4KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIEluIGNhc2UgdGhlIGNoaWxkIGhhc24ndCBiZWVuIHdhaXRlZCBvbiwgY2hlY2sgaWYgaXQncyBkb25lLgorICAgICAgICBzZWxmLnBvbGwoX2RlYWRzdGF0ZT1zeXMubWF4aW50KQorICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgTm9uZToKKyAgICAgICAgICAgICMgQ2hpbGQgaXMgc3RpbGwgcnVubmluZywga2VlcCB1cyBhbGl2ZSB1bnRpbCB3ZSBjYW4gd2FpdCBvbiBpdC4KKyAgICAgICAgICAgIF9hY3RpdmUuYXBwZW5kKHNlbGYpCisKKwogICAgIGRlZiBjb21tdW5pY2F0ZShzZWxmLCBpbnB1dD1Ob25lKToKICAgICAgICAgIiIiSW50ZXJhY3Qgd2l0aCBwcm9jZXNzOiBTZW5kIGRhdGEgdG8gc3RkaW4uICBSZWFkIGRhdGEgZnJvbQogICAgICAgICBzdGRvdXQgYW5kIHN0ZGVyciwgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZC4gIFdhaXQgZm9yCkBAIC03NzcsNiArNzk0LDcgQEAKICAgICAgICAgICAgICAgICByYWlzZSBXaW5kb3dzRXJyb3IoKmUuYXJncykKIAogICAgICAgICAgICAgIyBSZXRhaW4gdGhlIHByb2Nlc3MgaGFuZGxlLCBidXQgY2xvc2UgdGhlIHRocmVhZCBoYW5kbGUKKyAgICAgICAgICAgIHNlbGYuX2NoaWxkX2NyZWF0ZWQgPSBUcnVlCiAgICAgICAgICAgICBzZWxmLl9oYW5kbGUgPSBocAogICAgICAgICAgICAgc2VsZi5waWQgPSBwaWQKICAgICAgICAgICAgIGh0LkNsb3NlKCkKQEAgLTc5NSwxMyArODEzLDEyIEBACiAgICAgICAgICAgICAgICAgZXJyd3JpdGUuQ2xvc2UoKQogCiAKLSAgICAgICAgZGVmIHBvbGwoc2VsZik6CisgICAgICAgIGRlZiBwb2xsKHNlbGYsIF9kZWFkc3RhdGU9Tm9uZSk6CiAgICAgICAgICAgICAiIiJDaGVjayBpZiBjaGlsZCBwcm9jZXNzIGhhcyB0ZXJtaW5hdGVkLiAgUmV0dXJucyByZXR1cm5jb2RlCiAgICAgICAgICAgICBhdHRyaWJ1dGUuIiIiCiAgICAgICAgICAgICBpZiBzZWxmLnJldHVybmNvZGUgaXMgTm9uZToKICAgICAgICAgICAgICAgICBpZiBXYWl0Rm9yU2luZ2xlT2JqZWN0KHNlbGYuX2hhbmRsZSwgMCkgPT0gV0FJVF9PQkpFQ1RfMDoKICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gR2V0RXhpdENvZGVQcm9jZXNzKHNlbGYuX2hhbmRsZSkKLSAgICAgICAgICAgICAgICAgICAgX2FjdGl2ZS5yZW1vdmUoc2VsZikKICAgICAgICAgICAgIHJldHVybiBzZWxmLnJldHVybmNvZGUKIAogCkBAIC04MTEsNyArODI4LDYgQEAKICAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBOb25lOgogICAgICAgICAgICAgICAgIG9iaiA9IFdhaXRGb3JTaW5nbGVPYmplY3Qoc2VsZi5faGFuZGxlLCBJTkZJTklURSkKICAgICAgICAgICAgICAgICBzZWxmLnJldHVybmNvZGUgPSBHZXRFeGl0Q29kZVByb2Nlc3Moc2VsZi5faGFuZGxlKQotICAgICAgICAgICAgICAgIF9hY3RpdmUucmVtb3ZlKHNlbGYpCiAgICAgICAgICAgICByZXR1cm4gc2VsZi5yZXR1cm5jb2RlCiAKIApAQCAtOTU4LDYgKzk3NCw3IEBACiAgICAgICAgICAgICBzZWxmLl9zZXRfY2xvZXhlY19mbGFnKGVycnBpcGVfd3JpdGUpCiAKICAgICAgICAgICAgIHNlbGYucGlkID0gb3MuZm9yaygpCisgICAgICAgICAgICBzZWxmLl9jaGlsZF9jcmVhdGVkID0gVHJ1ZQogICAgICAgICAgICAgaWYgc2VsZi5waWQgPT0gMDoKICAgICAgICAgICAgICAgICAjIENoaWxkCiAgICAgICAgICAgICAgICAgdHJ5OgpAQCAtMTA0MiwxMCArMTA1OSw4IEBACiAgICAgICAgICAgICAgICAgIyBTaG91bGQgbmV2ZXIgaGFwcGVuCiAgICAgICAgICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJVbmtub3duIGNoaWxkIGV4aXQgc3RhdHVzISIpCiAKLSAgICAgICAgICAgIF9hY3RpdmUucmVtb3ZlKHNlbGYpCiAKLQotICAgICAgICBkZWYgcG9sbChzZWxmKToKKyAgICAgICAgZGVmIHBvbGwoc2VsZiwgX2RlYWRzdGF0ZT1Ob25lKToKICAgICAgICAgICAgICIiIkNoZWNrIGlmIGNoaWxkIHByb2Nlc3MgaGFzIHRlcm1pbmF0ZWQuICBSZXR1cm5zIHJldHVybmNvZGUKICAgICAgICAgICAgIGF0dHJpYnV0ZS4iIiIKICAgICAgICAgICAgIGlmIHNlbGYucmV0dXJuY29kZSBpcyBOb25lOgpAQCAtMTA1NCw3ICsxMDY5LDggQEAKICAgICAgICAgICAgICAgICAgICAgaWYgcGlkID09IHNlbGYucGlkOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFuZGxlX2V4aXRzdGF0dXMoc3RzKQogICAgICAgICAgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICBpZiBfZGVhZHN0YXRlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXR1cm5jb2RlID0gX2RlYWRzdGF0ZQogICAgICAgICAgICAgcmV0dXJuIHNlbGYucmV0dXJuY29kZQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZWxuZXRsaWIucHkgYi9MaWIvdGVsbmV0bGliLnB5CmluZGV4IDhhMjUxM2IuLjM1MjMwMzcgMTAwNjQ0Ci0tLSBhL0xpYi90ZWxuZXRsaWIucHkKKysrIGIvTGliL3RlbG5ldGxpYi5weQpAQCAtNDM4LDcgKzQzOCw3IEBACiAgICAgICAgICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlhY3NlcSArPSBjCiAgICAgICAgICAgICAgICAgZWxpZiBsZW4oc2VsZi5pYWNzZXEpID09IDE6Ci0gICAgICAgICAgICAgICAgICAgICdJQUM6IElBQyBDTUQgW09QVElPTiBvbmx5IGZvciBXSUxML1dPTlQvRE8vRE9OVF0nCisgICAgICAgICAgICAgICAgICAgICMgJ0lBQzogSUFDIENNRCBbT1BUSU9OIG9ubHkgZm9yIFdJTEwvV09OVC9ETy9ET05UXScKICAgICAgICAgICAgICAgICAgICAgaWYgYyBpbiAoRE8sIERPTlQsIFdJTEwsIFdPTlQpOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pYWNzZXEgKz0gYwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NoZWNrX3NvdW5kY2FyZC52YnMgYi9MaWIvdGVzdC9jaGVja19zb3VuZGNhcmQudmJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMjE4NTIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9jaGVja19zb3VuZGNhcmQudmJzCkBAIC0wLDAgKzEsMTMgQEAKK3JlbSBDaGVjayBmb3IgYSB3b3JraW5nIHNvdW5kLWNhcmQgLSBleGl0IHdpdGggMCBpZiBPSywgMSBvdGhlcndpc2UuCitzZXQgd21pID0gR2V0T2JqZWN0KCJ3aW5tZ210czoiKQorc2V0IHNjcyA9IHdtaS5JbnN0YW5jZXNPZigid2luMzJfc291bmRkZXZpY2UiKQorZm9yIGVhY2ggc2MgaW4gc2NzCisgICBzZXQgc3RhdHVzID0gc2MuUHJvcGVydGllc18oIlN0YXR1cyIpCisgICB3c2NyaXB0LkVjaG8oc2MuUHJvcGVydGllc18oIk5hbWUiKSArICIvIiArIHN0YXR1cykKKyAgIGlmIHN0YXR1cyA9ICJPSyIgdGhlbgorICAgICAgIHdzY3JpcHQuUXVpdCAwIHJlbSBub3JtYWwgZXhpdAorICAgZW5kIGlmCituZXh0CityZW0gTm8gc291bmQgY2FyZCBmb3VuZCAtIGV4aXQgd2l0aCBzdGF0dXMgY29kZSBvZiAxCit3c2NyaXB0LlF1aXQgMQorCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9jcmFzaGVycy9SRUFETUUgYi9MaWIvdGVzdC9jcmFzaGVycy9SRUFETUUKaW5kZXggOTM2OTI4Mi4uMDcwYzNmMSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvY3Jhc2hlcnMvUkVBRE1FCisrKyBiL0xpYi90ZXN0L2NyYXNoZXJzL1JFQURNRQpAQCAtMTMsMyArMTMsOCBAQAogUHV0IGFzIG11Y2ggaW5mbyBpbnRvIGEgZG9jc3RyaW5nIG9yIGNvbW1lbnRzIHRvIGhlbHAgZGV0ZXJtaW5lCiB0aGUgY2F1c2Ugb2YgdGhlIGZhaWx1cmUuICBQYXJ0aWN1bGFybHkgbm90ZSBpZiB0aGUgY2F1c2UgaXMKIHN5c3RlbSBvciBlbnZpcm9ubWVudCBkZXBlbmRlbnQgYW5kIHdoYXQgdGhlIHZhcmlhYmxlcyBhcmUuCisKK09uY2UgdGhlIGNyYXNoIGlzIGZpeGVkLCB0aGUgdGVzdCBjYXNlIHNob3VsZCBiZSBtb3ZlZCBpbnRvIGFuIGFwcHJvcHJpYXRlCit0ZXN0IChldmVuIGlmIGl0IHdhcyBvcmlnaW5hbGx5IGZyb20gdGhlIHRlc3Qgc3VpdGUpLiAgVGhpcyBlbnN1cmVzIHRoZQorcmVncmVzc2lvbiBkb2Vzbid0IGhhcHBlbiBhZ2Fpbi4gIEFuZCBpZiBpdCBkb2VzLCBpdCBzaG91bGQgYmUgZWFzaWVyCit0byB0cmFjayBkb3duLgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvY3Jhc2hlcnMvZGljdHJlc2l6ZV9hdHRhY2sucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9kaWN0cmVzaXplX2F0dGFjay5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODk1NzkxCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvY3Jhc2hlcnMvZGljdHJlc2l6ZV9hdHRhY2sucHkKQEAgLTAsMCArMSwzMiBAQAorIyBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvMTQ1NjIwOQorCisjIEEgZGljdHJlc2l6ZSgpIGF0dGFjay4gIElmIG9sZHRhYmxlID09IG1wLT5tYV9zbWFsbHRhYmxlIHRoZW4gcHVyZQorIyBQeXRob24gY29kZSBjYW4gbWFuZ2xlIHdpdGggbXAtPm1hX3NtYWxsdGFibGUgd2hpbGUgaXQgaXMgYmVpbmcgd2Fsa2VkCisjIG92ZXIuCisKK2NsYXNzIFgob2JqZWN0KToKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIDUKKworICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBpZiByZXNpemluZzoKKyAgICAgICAgICAgIGQuY2xlYXIoKQorICAgICAgICByZXR1cm4gRmFsc2UKKworCitkID0ge30KKworcmVzaXppbmcgPSBGYWxzZQorCitkW1goKV0gPSAxCitkW1goKV0gPSAyCitkW1goKV0gPSAzCitkW1goKV0gPSA0CitkW1goKV0gPSA1CisKKyMgbm93IHRyaWdnZXIgYSByZXNpemUKK3Jlc2l6aW5nID0gVHJ1ZQorZFs5XSA9IDYKKworIyBeXl4gSSBnZXQgU2VnbWVudGF0aW9uIGZhdWx0IG9yIElsbGVnYWwgaW5zdHJ1Y3Rpb24gaGVyZS4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2NyYXNoZXJzL25hc3R5X2VxX3ZzX2RpY3QucHkgYi9MaWIvdGVzdC9jcmFzaGVycy9uYXN0eV9lcV92c19kaWN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMzA4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9jcmFzaGVycy9uYXN0eV9lcV92c19kaWN0LnB5CkBAIC0wLDAgKzEsNDcgQEAKKyMgZnJvbSBodHRwOi8vbWFpbC5weXRob24ub3JnL3BpcGVybWFpbC9weXRob24tZGV2LzIwMDEtSnVuZS8wMTUyMzkuaHRtbAorCisjIGlmIHlvdSBrZWVwIGNoYW5naW5nIGEgZGljdGlvbmFyeSB3aGlsZSBsb29raW5nIHVwIGEga2V5LCB5b3UgY2FuCisjIHByb3Zva2UgYW4gaW5maW5pdGUgcmVjdXJzaW9uIGluIEMKKworIyBBdCB0aGUgdGltZSBuZWl0aGVyIFRpbSBub3IgTWljaGFlbCBjb3VsZCBiZSBib3RoZXJlZCB0byB0aGluayBvZiBhCisjIHdheSB0byBmaXggaXQuCisKK2NsYXNzIFl1Y2s6CisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmkgPSAwCisKKyAgICBkZWYgbWFrZV9kYW5nZXJvdXMoc2VsZik6CisgICAgICAgIHNlbGYuaSA9IDEKKworICAgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICAgICAgIyBkaXJlY3QgdG8gc2xvdCA0IGluIHRhYmxlIG9mIHNpemUgODsgc2xvdCAxMiB3aGVuIHNpemUgMTYKKyAgICAgICAgcmV0dXJuIDQgKyA4CisKKyAgICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgaWYgc2VsZi5pID09IDA6CisgICAgICAgICAgICAjIGxlYXZlIGRpY3QgYWxvbmUKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxpZiBzZWxmLmkgPT0gMToKKyAgICAgICAgICAgICMgZmlkZGxlIHRvIDE2IHNsb3RzCisgICAgICAgICAgICBzZWxmLl9fZmlsbF9kaWN0KDYpCisgICAgICAgICAgICBzZWxmLmkgPSAyCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIGZpZGRsZSB0byA4IHNsb3RzCisgICAgICAgICAgICBzZWxmLl9fZmlsbF9kaWN0KDQpCisgICAgICAgICAgICBzZWxmLmkgPSAxCisKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBfX2ZpbGxfZGljdChzZWxmLCBuKToKKyAgICAgICAgc2VsZi5pID0gMAorICAgICAgICBkaWN0LmNsZWFyKCkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2Uobik6CisgICAgICAgICAgICBkaWN0W2ldID0gaQorICAgICAgICBkaWN0W3NlbGZdID0gIk9LISIKKworeSA9IFl1Y2soKQorZGljdCA9IHt5OiAiT0shIn0KKworeiA9IFl1Y2soKQoreS5tYWtlX2Rhbmdlcm91cygpCitwcmludCBkaWN0W3pdCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9lbXB0eS52YnMgYi9MaWIvdGVzdC9lbXB0eS52YnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1ZjA3NgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L2VtcHR5LnZicwpAQCAtMCwwICsxIEBACisnRW1wdHkgVkJTIGZpbGUsIGRvZXMgbm90aGluZy4gIEhlbHBlciBmb3IgTGliXHRlc3RcdGVzdF9zdGFydGZpbGUucHkuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvZm9ya193YWl0LnB5IGIvTGliL3Rlc3QvZm9ya193YWl0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDBiZGIKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9mb3JrX3dhaXQucHkKQEAgLTAsMCArMSw3MSBAQAorIiIiVGhpcyB0ZXN0IGNhc2UgcHJvdmlkZXMgc3VwcG9ydCBmb3IgY2hlY2tpbmcgZm9ya2luZyBhbmQgd2FpdCBiZWhhdmlvci4KKworVG8gdGVzdCBkaWZmZXJlbnQgd2FpdCBiZWhhdmlvciwgb3ZlcnJpc2UgdGhlIHdhaXRfaW1wbCBtZXRob2QuCisKK1dlIHdhbnQgZm9yazEoKSBzZW1hbnRpY3MgLS0gb25seSB0aGUgZm9ya2luZyB0aHJlYWQgc3Vydml2ZXMgaW4gdGhlCitjaGlsZCBhZnRlciBhIGZvcmsoKS4KKworT24gc29tZSBzeXN0ZW1zIChlLmcuIFNvbGFyaXMgd2l0aG91dCBwb3NpeCB0aHJlYWRzKSB3ZSBmaW5kIHRoYXQgYWxsCithY3RpdmUgdGhyZWFkcyBzdXJ2aXZlIGluIHRoZSBjaGlsZCBhZnRlciBhIGZvcmsoKTsgdGhpcyBpcyBhbiBlcnJvci4KKworV2hpbGUgQmVPUyBkb2Vzbid0IG9mZmljaWFsbHkgc3VwcG9ydCBmb3JrIGFuZCBuYXRpdmUgdGhyZWFkaW5nIGluCit0aGUgc2FtZSBhcHBsaWNhdGlvbiwgdGhlIHByZXNlbnQgZXhhbXBsZSBzaG91bGQgd29yayBqdXN0IGZpbmUuICBEQworIiIiCisKK2ltcG9ydCBvcywgc3lzLCB0aW1lLCB0aHJlYWQsIHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZAorCitMT05HU0xFRVAgPSAyCitTSE9SVFNMRUVQID0gMC41CitOVU1fVEhSRUFEUyA9IDQKKworY2xhc3MgRm9ya1dhaXQodW5pdHRlc3QuVGVzdENhc2UpOgorCisgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLmFsaXZlID0ge30KKyAgICAgICAgc2VsZi5zdG9wID0gMAorCisgICAgZGVmIGYoc2VsZiwgaWQpOgorICAgICAgICB3aGlsZSBub3Qgc2VsZi5zdG9wOgorICAgICAgICAgICAgc2VsZi5hbGl2ZVtpZF0gPSBvcy5nZXRwaWQoKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRpbWUuc2xlZXAoU0hPUlRTTEVFUCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgIGRlZiB3YWl0X2ltcGwoc2VsZiwgY3BpZCk6CisgICAgICAgIHNwaWQsIHN0YXR1cyA9IG9zLndhaXRwaWQoY3BpZCwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc3BpZCwgY3BpZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoc3RhdHVzLCAwLCAiY2F1c2UgPSAlZCwgZXhpdCA9ICVkIiAlIChzdGF0dXMmMHhmZiwgc3RhdHVzPj44KSkKKworICAgIGRlZiB0ZXN0X3dhaXQoc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKE5VTV9USFJFQURTKToKKyAgICAgICAgICAgIHRocmVhZC5zdGFydF9uZXcoc2VsZi5mLCAoaSwpKQorCisgICAgICAgIHRpbWUuc2xlZXAoTE9OR1NMRUVQKQorCisgICAgICAgIGEgPSBzZWxmLmFsaXZlLmtleXMoKQorICAgICAgICBhLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhLCByYW5nZShOVU1fVEhSRUFEUykpCisKKyAgICAgICAgcHJlZm9ya19saXZlcyA9IHNlbGYuYWxpdmUuY29weSgpCisKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtIGluIFsndW5peHdhcmU3J106CisgICAgICAgICAgICBjcGlkID0gb3MuZm9yazEoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY3BpZCA9IG9zLmZvcmsoKQorCisgICAgICAgIGlmIGNwaWQgPT0gMDoKKyAgICAgICAgICAgICMgQ2hpbGQKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoTE9OR1NMRUVQKQorICAgICAgICAgICAgbiA9IDAKKyAgICAgICAgICAgIGZvciBrZXkgaW4gc2VsZi5hbGl2ZToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmFsaXZlW2tleV0gIT0gcHJlZm9ya19saXZlc1trZXldOgorICAgICAgICAgICAgICAgICAgICBuICs9IDEKKyAgICAgICAgICAgIG9zLl9leGl0KG4pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFBhcmVudAorICAgICAgICAgICAgc2VsZi53YWl0X2ltcGwoY3BpZCkKKyAgICAgICAgICAgICMgVGVsbCB0aHJlYWRzIHRvIGRpZQorICAgICAgICAgICAgc2VsZi5zdG9wID0gMQorICAgICAgICAgICAgdGltZS5zbGVlcCgyKlNIT1JUU0xFRVApICMgV2FpdCBmb3IgdGhyZWFkcyB0byBkaWUKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xlYWtlcnMvUkVBRE1FLnR4dCBiL0xpYi90ZXN0L2xlYWtlcnMvUkVBRE1FLnR4dAppbmRleCA2OWVlMzVhLi5iZWVlZTBlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC9sZWFrZXJzL1JFQURNRS50eHQKKysrIGIvTGliL3Rlc3QvbGVha2Vycy9SRUFETUUudHh0CkBAIC01LDYgKzUsMTUgQEAKIGRvZXNuJ3QgaW5jcmVhc2UsIHRoZSBidWcgaGFzIGJlZW4gZml4ZWQgYW5kIHRoZSBmaWxlIHNob3VsZCBiZSByZW1vdmVkCiBmcm9tIHRoZSByZXBvc2l0b3J5LgogCitOb3RlOiAgYmUgY2FyZWZ1bCB0byBjaGVjayBmb3IgY3ljbGljIGdhcmJhZ2UuICBTb21ldGltZXMgaXQgbWF5IGJlIGhlbHBmdWwKK3RvIGRlZmluZSB0aGUgbGVhayBmdW5jdGlvbiBsaWtlOgorCitkZWYgbGVhaygpOgorICAgIGRlZiBpbm5lcl9sZWFrKCk6CisgICAgICAgICMgdGhpcyBpcyB0aGUgZnVuY3Rpb24gdGhhdCBsZWFrcywgYnV0IGFsc28gY3JlYXRlcyBjeWNsZXMKKyAgICBpbm5lcl9sZWFrKCkKKyAgICBnYy5jb2xsZWN0KCkgOyBnYy5jb2xsZWN0KCkgOyBnYy5jb2xsZWN0KCkKKwogSGVyZSdzIGFuIGV4YW1wbGUgaW50ZXJwcmV0ZXIgc2Vzc2lvbiBmb3IgdGVzdF9nZXN0YWx0IHdoaWNoIHN0aWxsIGxlYWtzOgogCiA+Pj4gZnJvbSB0ZXN0LmxlYWtlcnMudGVzdF9nZXN0YWx0IGltcG9ydCBsZWFrCkBAIC0xNywzICsyNiw3IEBACiBbMjg5NDAgcmVmc10KID4+PiAKIAorT25jZSB0aGUgbGVhayBpcyBmaXhlZCwgdGhlIHRlc3QgY2FzZSBzaG91bGQgYmUgbW92ZWQgaW50byBhbiBhcHByb3ByaWF0ZQordGVzdCAoZXZlbiBpZiBpdCB3YXMgb3JpZ2luYWxseSBmcm9tIHRoZSB0ZXN0IHN1aXRlKS4gIFRoaXMgZW5zdXJlcyB0aGUKK3JlZ3Jlc3Npb24gZG9lc24ndCBoYXBwZW4gYWdhaW4uICBBbmQgaWYgaXQgZG9lcywgaXQgc2hvdWxkIGJlIGVhc2llcgordG8gdHJhY2sgZG93bi4KZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xlYWtlcnMvdGVzdF9jdHlwZXMucHkgYi9MaWIvdGVzdC9sZWFrZXJzL3Rlc3RfY3R5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOWEyY2QKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC9sZWFrZXJzL3Rlc3RfY3R5cGVzLnB5CkBAIC0wLDAgKzEsMTYgQEAKKworIyBUYWtlbiBmcm9tIExpYi9jdHlwZXMvdGVzdC90ZXN0X2tlZXByZWZzLnB5LCBQb2ludGVyVG9TdHJ1Y3R1cmUudGVzdCgpLgorIyBXaGVuIHRoaXMgbGVhayBpcyBmaXhlZCwgcmVtZW1iZXIgdG8gcmVtb3ZlIGZyb20gTWlzYy9idWlsZC5zaCBMRUFLWV9URVNUUy4KKworZnJvbSBjdHlwZXMgaW1wb3J0IFN0cnVjdHVyZSwgY19pbnQsIFBPSU5URVIKK2ltcG9ydCBnYworCitkZWYgbGVha19pbm5lcigpOgorICAgIGNsYXNzIFBPSU5UKFN0cnVjdHVyZSk6CisgICAgICAgIF9maWVsZHNfID0gWygieCIsIGNfaW50KV0KKyAgICBjbGFzcyBSRUNUKFN0cnVjdHVyZSk6CisgICAgICAgIF9maWVsZHNfID0gWygiYSIsIFBPSU5URVIoUE9JTlQpKV0KKworZGVmIGxlYWsoKToKKyAgICBsZWFrX2lubmVyKCkKKyAgICBnYy5jb2xsZWN0KCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xlYWtlcnMvdGVzdF9zZWxmdHlwZS5weSBiL0xpYi90ZXN0L2xlYWtlcnMvdGVzdF9zZWxmdHlwZS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjA3YzMyCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvbGVha2Vycy90ZXN0X3NlbGZ0eXBlLnB5CkBAIC0wLDAgKzEsMTMgQEAKKyMgUmVmZXJlbmNlIGN5Y2xlcyBpbnZvbHZpbmcgb25seSB0aGUgb2JfdHlwZSBmaWVsZCBhcmUgcmF0aGVyIHVuY29tbW9uCisjIGJ1dCBwb3NzaWJsZS4gIEluc3BpcmVkIGJ5IFNGIGJ1ZyAxNDY5NjI5LgorCitpbXBvcnQgZ2MKKworZGVmIGxlYWsoKToKKyAgICBjbGFzcyBUKHR5cGUpOgorICAgICAgICBwYXNzCisgICAgY2xhc3MgVSh0eXBlKToKKyAgICAgICAgX19tZXRhY2xhc3NfXyA9IFQKKyAgICBVLl9fY2xhc3NfXyA9IFUKKyAgICBkZWwgVQorICAgIGdjLmNvbGxlY3QoKTsgZ2MuY29sbGVjdCgpOyBnYy5jb2xsZWN0KCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L2xlYWtlcnMvdGVzdF90ZWUucHkgYi9MaWIvdGVzdC9sZWFrZXJzL3Rlc3RfdGVlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Y2UyNGNhLi4wMDAwMDAwCi0tLSBhL0xpYi90ZXN0L2xlYWtlcnMvdGVzdF90ZWUucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0KLSMgVGVzdCBjYXNlIHRha2VuIGZyb20gdGVzdF9pdGVydG9vbHMKLSMgU2VlIGh0dHA6Ly9tYWlsLnB5dGhvbi5vcmcvcGlwZXJtYWlsL3B5dGhvbi1kZXYvMjAwNS1Ob3ZlbWJlci8wNTgzMzkuaHRtbAotCi1mcm9tIGl0ZXJ0b29scyBpbXBvcnQgdGVlCi0KLWRlZiBsZWFrKCk6Ci0gICAgZGVmIGZpYigpOgotICAgICAgICBkZWYgeWllbGRfaWRlbnRpdHlfZm9yZXZlcihnKToKLSAgICAgICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgICAgICAgeWllbGQgZwotICAgICAgICBkZWYgX2ZpYigpOgotICAgICAgICAgICAgZm9yIGkgaW4geWllbGRfaWRlbnRpdHlfZm9yZXZlcihoZWFkKToKLSAgICAgICAgICAgICAgICB5aWVsZCBpCi0gICAgICAgIGhlYWQsIHRhaWwsIHJlc3VsdCA9IHRlZShfZmliKCksIDMpCi0gICAgICAgIHJldHVybiByZXN1bHQKLQotICAgIHggPSBmaWIoKQotICAgIHgubmV4dCgpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9hdWdhc3NpZ24gYi9MaWIvdGVzdC9vdXRwdXQvdGVzdF9hdWdhc3NpZ24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NmI3ZTUuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfYXVnYXNzaWduCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotdGVzdF9hdWdhc3NpZ24KLTYuMAotNgotWzYuMF0KLTYKLTYuMAotNgotWzEsIDIsIDMsIDQsIDEsIDIsIDMsIDRdCi1bMSwgMiwgMSwgMiwgM10KLVRydWUKLVRydWUKLVRydWUKLTExCi1UcnVlCi0xMgotVHJ1ZQotVHJ1ZQotMTMKLV9fYWRkX18gY2FsbGVkCi1fX3JhZGRfXyBjYWxsZWQKLV9faWFkZF9fIGNhbGxlZAotX19zdWJfXyBjYWxsZWQKLV9fcnN1Yl9fIGNhbGxlZAotX19pc3ViX18gY2FsbGVkCi1fX211bF9fIGNhbGxlZAotX19ybXVsX18gY2FsbGVkCi1fX2ltdWxfXyBjYWxsZWQKLV9fdHJ1ZWRpdl9fIGNhbGxlZAotX19ydHJ1ZWRpdl9fIGNhbGxlZAotX19pdHJ1ZWRpdl9fIGNhbGxlZAotX19mbG9vcmRpdl9fIGNhbGxlZAotX19yZmxvb3JkaXZfXyBjYWxsZWQKLV9faWZsb29yZGl2X18gY2FsbGVkCi1fX21vZF9fIGNhbGxlZAotX19ybW9kX18gY2FsbGVkCi1fX2ltb2RfXyBjYWxsZWQKLV9fcG93X18gY2FsbGVkCi1fX3Jwb3dfXyBjYWxsZWQKLV9faXBvd19fIGNhbGxlZAotX19vcl9fIGNhbGxlZAotX19yb3JfXyBjYWxsZWQKLV9faW9yX18gY2FsbGVkCi1fX2FuZF9fIGNhbGxlZAotX19yYW5kX18gY2FsbGVkCi1fX2lhbmRfXyBjYWxsZWQKLV9feG9yX18gY2FsbGVkCi1fX3J4b3JfXyBjYWxsZWQKLV9faXhvcl9fIGNhbGxlZAotX19yc2hpZnRfXyBjYWxsZWQKLV9fcnJzaGlmdF9fIGNhbGxlZAotX19pcnNoaWZ0X18gY2FsbGVkCi1fX2xzaGlmdF9fIGNhbGxlZAotX19ybHNoaWZ0X18gY2FsbGVkCi1fX2lsc2hpZnRfXyBjYWxsZWQKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L291dHB1dC90ZXN0X2NvZXJjaW9uIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfY29lcmNpb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMzViNjAuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfY29lcmNpb24KKysrIC9kZXYvbnVsbApAQCAtMSwxMDU0ICswLDAgQEAKLXRlc3RfY29lcmNpb24KLTIgKyAyID0gNAotMiArPSAyID0+IDQKLTIgLSAyID0gMAotMiAtPSAyID0+IDAKLTIgKiAyID0gNAotMiAqPSAyID0+IDQKLTIgLyAyID0gMQotMiAvPSAyID0+IDEKLTIgKiogMiA9IDQKLTIgKio9IDIgPT4gNAotMiAlIDIgPSAwCi0yICU9IDIgPT4gMAotMiArIDQuMCA9IDYuMAotMiArPSA0LjAgPT4gNi4wCi0yIC0gNC4wID0gLTIuMAotMiAtPSA0LjAgPT4gLTIuMAotMiAqIDQuMCA9IDguMAotMiAqPSA0LjAgPT4gOC4wCi0yIC8gNC4wID0gMC41Ci0yIC89IDQuMCA9PiAwLjUKLTIgKiogNC4wID0gMTYuMAotMiAqKj0gNC4wID0+IDE2LjAKLTIgJSA0LjAgPSAyLjAKLTIgJT0gNC4wID0+IDIuMAotMiArIDIgPSA0Ci0yICs9IDIgPT4gNAotMiAtIDIgPSAwCi0yIC09IDIgPT4gMAotMiAqIDIgPSA0Ci0yICo9IDIgPT4gNAotMiAvIDIgPSAxCi0yIC89IDIgPT4gMQotMiAqKiAyID0gNAotMiAqKj0gMiA9PiA0Ci0yICUgMiA9IDAKLTIgJT0gMiA9PiAwCi0yICsgKDIrMGopID0gKDQuMCArIDAuMGopCi0yICs9ICgyKzBqKSA9PiAoNC4wICsgMC4waikKLTIgLSAoMiswaikgPSAoMC4wICsgMC4waikKLTIgLT0gKDIrMGopID0+ICgwLjAgKyAwLjBqKQotMiAqICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotMiAqPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi0yIC8gKDIrMGopID0gKDEuMCArIDAuMGopCi0yIC89ICgyKzBqKSA9PiAoMS4wICsgMC4waikKLTIgKiogKDIrMGopID0gKDQuMCArIDAuMGopCi0yICoqPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi0yICUgKDIrMGopID0gKDAuMCArIDAuMGopCi0yICU9ICgyKzBqKSA9PiAoMC4wICsgMC4waikKLTIgKyBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICs9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC09IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiBbMV0gPSBbMSwgMV0KLTIgKj0gWzFdID0+IFsxLCAxXQotMiAvIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICoqPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICUgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAlPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICsgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKz0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAtPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqICgyLCkgPSAoMiwgMikKLTIgKj0gKDIsKSA9PiAoMiwgMikKLTIgLyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAvPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKiAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKj0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgJSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAlPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICs9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAvIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC89IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICoqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICoqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAlIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICU9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICsgPE1ldGhvZE51bWJlciAyPiA9IDQKLTIgKz0gPE1ldGhvZE51bWJlciAyPiA9PiA0Ci0yIC0gPE1ldGhvZE51bWJlciAyPiA9IDAKLTIgLT0gPE1ldGhvZE51bWJlciAyPiA9PiAwCi0yICogPE1ldGhvZE51bWJlciAyPiA9IDQKLTIgKj0gPE1ldGhvZE51bWJlciAyPiA9PiA0Ci0yIC8gPE1ldGhvZE51bWJlciAyPiA9IDEKLTIgLz0gPE1ldGhvZE51bWJlciAyPiA9PiAxCi0yICoqIDxNZXRob2ROdW1iZXIgMj4gPSA0Ci0yICoqPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDQKLTIgJSA8TWV0aG9kTnVtYmVyIDI+ID0gMAotMiAlPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDAKLTIgKyA8Q29lcmNlTnVtYmVyIDI+ID0gNAotMiArPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDQKLTIgLSA8Q29lcmNlTnVtYmVyIDI+ID0gMAotMiAtPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDAKLTIgKiA8Q29lcmNlTnVtYmVyIDI+ID0gNAotMiAqPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDQKLTIgLyA8Q29lcmNlTnVtYmVyIDI+ID0gMQotMiAvPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDEKLTIgKiogPENvZXJjZU51bWJlciAyPiA9IDQKLTIgKio9IDxDb2VyY2VOdW1iZXIgMj4gPT4gNAotMiAlIDxDb2VyY2VOdW1iZXIgMj4gPSAwCi0yICU9IDxDb2VyY2VOdW1iZXIgMj4gPT4gMAotNC4wICsgMiA9IDYuMAotNC4wICs9IDIgPT4gNi4wCi00LjAgLSAyID0gMi4wCi00LjAgLT0gMiA9PiAyLjAKLTQuMCAqIDIgPSA4LjAKLTQuMCAqPSAyID0+IDguMAotNC4wIC8gMiA9IDIuMAotNC4wIC89IDIgPT4gMi4wCi00LjAgKiogMiA9IDE2LjAKLTQuMCAqKj0gMiA9PiAxNi4wCi00LjAgJSAyID0gMC4wCi00LjAgJT0gMiA9PiAwLjAKLTQuMCArIDQuMCA9IDguMAotNC4wICs9IDQuMCA9PiA4LjAKLTQuMCAtIDQuMCA9IDAuMAotNC4wIC09IDQuMCA9PiAwLjAKLTQuMCAqIDQuMCA9IDE2LjAKLTQuMCAqPSA0LjAgPT4gMTYuMAotNC4wIC8gNC4wID0gMS4wCi00LjAgLz0gNC4wID0+IDEuMAotNC4wICoqIDQuMCA9IDI1Ni4wCi00LjAgKio9IDQuMCA9PiAyNTYuMAotNC4wICUgNC4wID0gMC4wCi00LjAgJT0gNC4wID0+IDAuMAotNC4wICsgMiA9IDYuMAotNC4wICs9IDIgPT4gNi4wCi00LjAgLSAyID0gMi4wCi00LjAgLT0gMiA9PiAyLjAKLTQuMCAqIDIgPSA4LjAKLTQuMCAqPSAyID0+IDguMAotNC4wIC8gMiA9IDIuMAotNC4wIC89IDIgPT4gMi4wCi00LjAgKiogMiA9IDE2LjAKLTQuMCAqKj0gMiA9PiAxNi4wCi00LjAgJSAyID0gMC4wCi00LjAgJT0gMiA9PiAwLjAKLTQuMCArICgyKzBqKSA9ICg2LjAgKyAwLjBqKQotNC4wICs9ICgyKzBqKSA9PiAoNi4wICsgMC4waikKLTQuMCAtICgyKzBqKSA9ICgyLjAgKyAwLjBqKQotNC4wIC09ICgyKzBqKSA9PiAoMi4wICsgMC4waikKLTQuMCAqICgyKzBqKSA9ICg4LjAgKyAwLjBqKQotNC4wICo9ICgyKzBqKSA9PiAoOC4wICsgMC4waikKLTQuMCAvICgyKzBqKSA9ICgyLjAgKyAwLjBqKQotNC4wIC89ICgyKzBqKSA9PiAoMi4wICsgMC4waikKLTQuMCAqKiAoMiswaikgPSAoMTYuMCArIDAuMGopCi00LjAgKio9ICgyKzBqKSA9PiAoMTYuMCArIDAuMGopCi00LjAgJSAoMiswaikgPSAoMC4wICsgMC4waikKLTQuMCAlPSAoMiswaikgPT4gKDAuMCArIDAuMGopCi00LjAgKyBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wIC0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wIC09IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAqIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAqPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgLyBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgLz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICoqIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAqKj0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICUgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICU9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCArICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKz0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAtICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgLT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAqICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKj0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAvICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgLz0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAqKiAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICoqPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICUgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAlPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICsgTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCArPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wIC0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAtPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wIC8gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTQuMCAvPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICoqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKio9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgJSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotNC4wICU9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi00LjAgKyA8TWV0aG9kTnVtYmVyIDI+ID0gNi4wCi00LjAgKz0gPE1ldGhvZE51bWJlciAyPiA9PiA2LjAKLTQuMCAtIDxNZXRob2ROdW1iZXIgMj4gPSAyLjAKLTQuMCAtPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDIuMAotNC4wICogPE1ldGhvZE51bWJlciAyPiA9IDguMAotNC4wICo9IDxNZXRob2ROdW1iZXIgMj4gPT4gOC4wCi00LjAgLyA8TWV0aG9kTnVtYmVyIDI+ID0gMi4wCi00LjAgLz0gPE1ldGhvZE51bWJlciAyPiA9PiAyLjAKLTQuMCAqKiA8TWV0aG9kTnVtYmVyIDI+ID0gMTYuMAotNC4wICoqPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDE2LjAKLTQuMCAlIDxNZXRob2ROdW1iZXIgMj4gPSAwLjAKLTQuMCAlPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDAuMAotNC4wICsgPENvZXJjZU51bWJlciAyPiA9IDYuMAotNC4wICs9IDxDb2VyY2VOdW1iZXIgMj4gPT4gNi4wCi00LjAgLSA8Q29lcmNlTnVtYmVyIDI+ID0gMi4wCi00LjAgLT0gPENvZXJjZU51bWJlciAyPiA9PiAyLjAKLTQuMCAqIDxDb2VyY2VOdW1iZXIgMj4gPSA4LjAKLTQuMCAqPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDguMAotNC4wIC8gPENvZXJjZU51bWJlciAyPiA9IDIuMAotNC4wIC89IDxDb2VyY2VOdW1iZXIgMj4gPT4gMi4wCi00LjAgKiogPENvZXJjZU51bWJlciAyPiA9IDE2LjAKLTQuMCAqKj0gPENvZXJjZU51bWJlciAyPiA9PiAxNi4wCi00LjAgJSA8Q29lcmNlTnVtYmVyIDI+ID0gMC4wCi00LjAgJT0gPENvZXJjZU51bWJlciAyPiA9PiAwLjAKLTIgKyAyID0gNAotMiArPSAyID0+IDQKLTIgLSAyID0gMAotMiAtPSAyID0+IDAKLTIgKiAyID0gNAotMiAqPSAyID0+IDQKLTIgLyAyID0gMQotMiAvPSAyID0+IDEKLTIgKiogMiA9IDQKLTIgKio9IDIgPT4gNAotMiAlIDIgPSAwCi0yICU9IDIgPT4gMAotMiArIDQuMCA9IDYuMAotMiArPSA0LjAgPT4gNi4wCi0yIC0gNC4wID0gLTIuMAotMiAtPSA0LjAgPT4gLTIuMAotMiAqIDQuMCA9IDguMAotMiAqPSA0LjAgPT4gOC4wCi0yIC8gNC4wID0gMC41Ci0yIC89IDQuMCA9PiAwLjUKLTIgKiogNC4wID0gMTYuMAotMiAqKj0gNC4wID0+IDE2LjAKLTIgJSA0LjAgPSAyLjAKLTIgJT0gNC4wID0+IDIuMAotMiArIDIgPSA0Ci0yICs9IDIgPT4gNAotMiAtIDIgPSAwCi0yIC09IDIgPT4gMAotMiAqIDIgPSA0Ci0yICo9IDIgPT4gNAotMiAvIDIgPSAxCi0yIC89IDIgPT4gMQotMiAqKiAyID0gNAotMiAqKj0gMiA9PiA0Ci0yICUgMiA9IDAKLTIgJT0gMiA9PiAwCi0yICsgKDIrMGopID0gKDQuMCArIDAuMGopCi0yICs9ICgyKzBqKSA9PiAoNC4wICsgMC4waikKLTIgLSAoMiswaikgPSAoMC4wICsgMC4waikKLTIgLT0gKDIrMGopID0+ICgwLjAgKyAwLjBqKQotMiAqICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotMiAqPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi0yIC8gKDIrMGopID0gKDEuMCArIDAuMGopCi0yIC89ICgyKzBqKSA9PiAoMS4wICsgMC4waikKLTIgKiogKDIrMGopID0gKDQuMCArIDAuMGopCi0yICoqPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi0yICUgKDIrMGopID0gKDAuMCArIDAuMGopCi0yICU9ICgyKzBqKSA9PiAoMC4wICsgMC4waikKLTIgKyBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICs9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC09IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiBbMV0gPSBbMSwgMV0KLTIgKj0gWzFdID0+IFsxLCAxXQotMiAvIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICoqPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICUgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAlPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICsgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKz0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAtPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqICgyLCkgPSAoMiwgMikKLTIgKj0gKDIsKSA9PiAoMiwgMikKLTIgLyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAvPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKiAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqKj0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgJSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAlPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiArIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICs9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgLT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTIgKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAvIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yIC89IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICoqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICoqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotMiAlIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICU9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0yICsgPE1ldGhvZE51bWJlciAyPiA9IDQKLTIgKz0gPE1ldGhvZE51bWJlciAyPiA9PiA0Ci0yIC0gPE1ldGhvZE51bWJlciAyPiA9IDAKLTIgLT0gPE1ldGhvZE51bWJlciAyPiA9PiAwCi0yICogPE1ldGhvZE51bWJlciAyPiA9IDQKLTIgKj0gPE1ldGhvZE51bWJlciAyPiA9PiA0Ci0yIC8gPE1ldGhvZE51bWJlciAyPiA9IDEKLTIgLz0gPE1ldGhvZE51bWJlciAyPiA9PiAxCi0yICoqIDxNZXRob2ROdW1iZXIgMj4gPSA0Ci0yICoqPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDQKLTIgJSA8TWV0aG9kTnVtYmVyIDI+ID0gMAotMiAlPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDAKLTIgKyA8Q29lcmNlTnVtYmVyIDI+ID0gNAotMiArPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDQKLTIgLSA8Q29lcmNlTnVtYmVyIDI+ID0gMAotMiAtPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDAKLTIgKiA8Q29lcmNlTnVtYmVyIDI+ID0gNAotMiAqPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDQKLTIgLyA8Q29lcmNlTnVtYmVyIDI+ID0gMQotMiAvPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDEKLTIgKiogPENvZXJjZU51bWJlciAyPiA9IDQKLTIgKio9IDxDb2VyY2VOdW1iZXIgMj4gPT4gNAotMiAlIDxDb2VyY2VOdW1iZXIgMj4gPSAwCi0yICU9IDxDb2VyY2VOdW1iZXIgMj4gPT4gMAotKDIrMGopICsgMiA9ICg0LjAgKyAwLjBqKQotKDIrMGopICs9IDIgPT4gKDQuMCArIDAuMGopCi0oMiswaikgLSAyID0gKDAuMCArIDAuMGopCi0oMiswaikgLT0gMiA9PiAoMC4wICsgMC4waikKLSgyKzBqKSAqIDIgPSAoNC4wICsgMC4waikKLSgyKzBqKSAqPSAyID0+ICg0LjAgKyAwLjBqKQotKDIrMGopIC8gMiA9ICgxLjAgKyAwLjBqKQotKDIrMGopIC89IDIgPT4gKDEuMCArIDAuMGopCi0oMiswaikgKiogMiA9ICg0LjAgKyAwLjBqKQotKDIrMGopICoqPSAyID0+ICg0LjAgKyAwLjBqKQotKDIrMGopICUgMiA9ICgwLjAgKyAwLjBqKQotKDIrMGopICU9IDIgPT4gKDAuMCArIDAuMGopCi0oMiswaikgKyA0LjAgPSAoNi4wICsgMC4waikKLSgyKzBqKSArPSA0LjAgPT4gKDYuMCArIDAuMGopCi0oMiswaikgLSA0LjAgPSAoLTIuMCArIDAuMGopCi0oMiswaikgLT0gNC4wID0+ICgtMi4wICsgMC4waikKLSgyKzBqKSAqIDQuMCA9ICg4LjAgKyAwLjBqKQotKDIrMGopICo9IDQuMCA9PiAoOC4wICsgMC4waikKLSgyKzBqKSAvIDQuMCA9ICgwLjUgKyAwLjBqKQotKDIrMGopIC89IDQuMCA9PiAoMC41ICsgMC4waikKLSgyKzBqKSAqKiA0LjAgPSAoMTYuMCArIDAuMGopCi0oMiswaikgKio9IDQuMCA9PiAoMTYuMCArIDAuMGopCi0oMiswaikgJSA0LjAgPSAoMi4wICsgMC4waikKLSgyKzBqKSAlPSA0LjAgPT4gKDIuMCArIDAuMGopCi0oMiswaikgKyAyID0gKDQuMCArIDAuMGopCi0oMiswaikgKz0gMiA9PiAoNC4wICsgMC4waikKLSgyKzBqKSAtIDIgPSAoMC4wICsgMC4waikKLSgyKzBqKSAtPSAyID0+ICgwLjAgKyAwLjBqKQotKDIrMGopICogMiA9ICg0LjAgKyAwLjBqKQotKDIrMGopICo9IDIgPT4gKDQuMCArIDAuMGopCi0oMiswaikgLyAyID0gKDEuMCArIDAuMGopCi0oMiswaikgLz0gMiA9PiAoMS4wICsgMC4waikKLSgyKzBqKSAqKiAyID0gKDQuMCArIDAuMGopCi0oMiswaikgKio9IDIgPT4gKDQuMCArIDAuMGopCi0oMiswaikgJSAyID0gKDAuMCArIDAuMGopCi0oMiswaikgJT0gMiA9PiAoMC4wICsgMC4waikKLSgyKzBqKSArICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotKDIrMGopICs9ICgyKzBqKSA9PiAoNC4wICsgMC4waikKLSgyKzBqKSAtICgyKzBqKSA9ICgwLjAgKyAwLjBqKQotKDIrMGopIC09ICgyKzBqKSA9PiAoMC4wICsgMC4waikKLSgyKzBqKSAqICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotKDIrMGopICo9ICgyKzBqKSA9PiAoNC4wICsgMC4waikKLSgyKzBqKSAvICgyKzBqKSA9ICgxLjAgKyAwLjBqKQotKDIrMGopIC89ICgyKzBqKSA9PiAoMS4wICsgMC4waikKLSgyKzBqKSAqKiAoMiswaikgPSAoNC4wICsgMC4waikKLSgyKzBqKSAqKj0gKDIrMGopID0+ICg0LjAgKyAwLjBqKQotKDIrMGopICUgKDIrMGopID0gKDAuMCArIDAuMGopCi0oMiswaikgJT0gKDIrMGopID0+ICgwLjAgKyAwLjBqKQotKDIrMGopICsgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICs9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAtIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAtPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKj0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopIC8gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopIC89IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAqKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKio9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAlIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAlPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICs9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgLSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopIC09ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKiAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICo9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgLyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopIC89ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKiogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAqKj0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAlICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgJT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSArIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAtIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgLT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAvIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiswaikgLz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAqKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICoqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICUgTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyKzBqKSAlPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIrMGopICsgPE1ldGhvZE51bWJlciAyPiA9ICg0LjAgKyAwLjBqKQotKDIrMGopICs9IDxNZXRob2ROdW1iZXIgMj4gPT4gKDQuMCArIDAuMGopCi0oMiswaikgLSA8TWV0aG9kTnVtYmVyIDI+ID0gKDAuMCArIDAuMGopCi0oMiswaikgLT0gPE1ldGhvZE51bWJlciAyPiA9PiAoMC4wICsgMC4waikKLSgyKzBqKSAqIDxNZXRob2ROdW1iZXIgMj4gPSAoNC4wICsgMC4waikKLSgyKzBqKSAqPSA8TWV0aG9kTnVtYmVyIDI+ID0+ICg0LjAgKyAwLjBqKQotKDIrMGopIC8gPE1ldGhvZE51bWJlciAyPiA9ICgxLjAgKyAwLjBqKQotKDIrMGopIC89IDxNZXRob2ROdW1iZXIgMj4gPT4gKDEuMCArIDAuMGopCi0oMiswaikgKiogPE1ldGhvZE51bWJlciAyPiA9ICg0LjAgKyAwLjBqKQotKDIrMGopICoqPSA8TWV0aG9kTnVtYmVyIDI+ID0+ICg0LjAgKyAwLjBqKQotKDIrMGopICUgPE1ldGhvZE51bWJlciAyPiA9ICgwLjAgKyAwLjBqKQotKDIrMGopICU9IDxNZXRob2ROdW1iZXIgMj4gPT4gKDAuMCArIDAuMGopCi0oMiswaikgKyA8Q29lcmNlTnVtYmVyIDI+ID0gKDQuMCArIDAuMGopCi0oMiswaikgKz0gPENvZXJjZU51bWJlciAyPiA9PiAoNC4wICsgMC4waikKLSgyKzBqKSAtIDxDb2VyY2VOdW1iZXIgMj4gPSAoMC4wICsgMC4waikKLSgyKzBqKSAtPSA8Q29lcmNlTnVtYmVyIDI+ID0+ICgwLjAgKyAwLjBqKQotKDIrMGopICogPENvZXJjZU51bWJlciAyPiA9ICg0LjAgKyAwLjBqKQotKDIrMGopICo9IDxDb2VyY2VOdW1iZXIgMj4gPT4gKDQuMCArIDAuMGopCi0oMiswaikgLyA8Q29lcmNlTnVtYmVyIDI+ID0gKDEuMCArIDAuMGopCi0oMiswaikgLz0gPENvZXJjZU51bWJlciAyPiA9PiAoMS4wICsgMC4waikKLSgyKzBqKSAqKiA8Q29lcmNlTnVtYmVyIDI+ID0gKDQuMCArIDAuMGopCi0oMiswaikgKio9IDxDb2VyY2VOdW1iZXIgMj4gPT4gKDQuMCArIDAuMGopCi0oMiswaikgJSA8Q29lcmNlTnVtYmVyIDI+ID0gKDAuMCArIDAuMGopCi0oMiswaikgJT0gPENvZXJjZU51bWJlciAyPiA9PiAoMC4wICsgMC4waikKLVsxXSArIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLT0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqIDIgPSBbMSwgMV0KLVsxXSAqPSAyID0+IFsxLCAxXQotWzFdIC8gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAvPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKio9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gJSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICU9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKyA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKz0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC09IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqPSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLyA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLz0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKj0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICUgNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICU9IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSArIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLT0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqIDIgPSBbMSwgMV0KLVsxXSAqPSAyID0+IFsxLCAxXQotWzFdIC8gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAvPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKio9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gJSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICU9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKyAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKz0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC09ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqPSAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLyAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLz0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKj0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICUgKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICU9ICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSArIFsxXSA9IFsxLCAxXQotWzFdICs9IFsxXSA9PiBbMSwgMV0KLVsxXSAtIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKj0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC8gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC89IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKiBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKio9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICs9ICgyLCkgPT4gWzEsIDJdCi1bMV0gLSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC09ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICo9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC89ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKj0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gJT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSArIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAvIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICUgTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICsgPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSArPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICogPE1ldGhvZE51bWJlciAyPiA9IFsxLCAxXQotWzFdICo9IDxNZXRob2ROdW1iZXIgMj4gPT4gWzEsIDFdCi1bMV0gLyA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdIC89IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKiogPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqKj0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAlIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gJT0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSArIDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKz0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAtIDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gLT0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAqIDxDb2VyY2VOdW1iZXIgMj4gPSBbMSwgMV0KLVsxXSAqPSA8Q29lcmNlTnVtYmVyIDI+ID0+IFsxLCAxXQotWzFdIC8gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLVsxXSAvPSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICoqIDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gKio9IDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1bMV0gJSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotWzFdICU9IDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICsgMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAtPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqIDIgPSAoMiwgMikKLSgyLCkgKj0gMiA9PiAoMiwgMikKLSgyLCkgLyAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAvPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKiAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKj0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSArIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKz0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAtIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLT0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKj0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAvIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLz0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKiA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICoqPSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICUgNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlPSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICsgMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKz0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAtPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqIDIgPSAoMiwgMikKLSgyLCkgKj0gMiA9PiAoMiwgMikKLSgyLCkgLyAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAvPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKiAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKj0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSArICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKz0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAtICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLT0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKj0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAvICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLz0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKiAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICoqPSAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICUgKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlPSAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICsgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSArPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAtPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICogWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC8gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAvPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICoqIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKio9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICU9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKyAoMiwpID0gKDIsIDIpCi0oMiwpICs9ICgyLCkgPT4gKDIsIDIpCi0oMiwpIC0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAvICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC89ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICoqICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICoqPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICU9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICsgTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAtPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICo9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC8gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKiogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKio9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICUgTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKyA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSArPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAtIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC09IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICogPE1ldGhvZE51bWJlciAyPiA9ICgyLCAyKQotKDIsKSAqPSA8TWV0aG9kTnVtYmVyIDI+ID0+ICgyLCAyKQotKDIsKSAvIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpIC89IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICoqIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICoqPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICU9IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi0oMiwpICsgPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgKz0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgLSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAtPSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqIDxDb2VyY2VOdW1iZXIgMj4gPSAoMiwgMikKLSgyLCkgKj0gPENvZXJjZU51bWJlciAyPiA9PiAoMiwgMikKLSgyLCkgLyA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAvPSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKiA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAqKj0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLSgyLCkgJSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotKDIsKSAlPSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICs9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLT0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKiAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC89IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICoqIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICoqPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICU9IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICsgNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArPSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC0gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtPSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICogNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqPSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC8gNC4wIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvPSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICoqIDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKio9IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJSA0LjAgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICU9IDQuMCAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKyAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtIDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC09IDIgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICogMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKj0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLyAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKiAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKj0gMiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlPSAyIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKz0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLT0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKj0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvICgyKzBqKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLz0gKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKiAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICoqPSAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICUgKDIrMGopIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlPSAoMiswaikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICsgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICogWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC8gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICoqIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKio9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICU9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC09ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKj0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKiAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKj0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICs9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC89IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICoqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICoqPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICU9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICsgPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKz0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtPSA8TWV0aG9kTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqIDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICo9IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC8gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLz0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKiogPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKio9IDxNZXRob2ROdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICUgPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJT0gPE1ldGhvZE51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKyA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSArPSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAtIDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lIC09IDxDb2VyY2VOdW1iZXIgMj4gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1Ob25lICogPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgKj0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgLyA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAvPSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKiA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAqKj0gPENvZXJjZU51bWJlciAyPiAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLU5vbmUgJSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotTm9uZSAlPSA8Q29lcmNlTnVtYmVyIDI+IC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiArIDIgPSA0Ci08TWV0aG9kTnVtYmVyIDI+ICs9IDIgPT4gNAotPE1ldGhvZE51bWJlciAyPiAtIDIgPSAwCi08TWV0aG9kTnVtYmVyIDI+IC09IDIgPT4gMAotPE1ldGhvZE51bWJlciAyPiAqIDIgPSA0Ci08TWV0aG9kTnVtYmVyIDI+ICo9IDIgPT4gNAotPE1ldGhvZE51bWJlciAyPiAvIDIgPSAxCi08TWV0aG9kTnVtYmVyIDI+IC89IDIgPT4gMQotPE1ldGhvZE51bWJlciAyPiAqKiAyID0gNAotPE1ldGhvZE51bWJlciAyPiAqKj0gMiA9PiA0Ci08TWV0aG9kTnVtYmVyIDI+ICUgMiA9IDAKLTxNZXRob2ROdW1iZXIgMj4gJT0gMiA9PiAwCi08TWV0aG9kTnVtYmVyIDI+ICsgNC4wID0gNi4wCi08TWV0aG9kTnVtYmVyIDI+ICs9IDQuMCA9PiA2LjAKLTxNZXRob2ROdW1iZXIgMj4gLSA0LjAgPSAtMi4wCi08TWV0aG9kTnVtYmVyIDI+IC09IDQuMCA9PiAtMi4wCi08TWV0aG9kTnVtYmVyIDI+ICogNC4wID0gOC4wCi08TWV0aG9kTnVtYmVyIDI+ICo9IDQuMCA9PiA4LjAKLTxNZXRob2ROdW1iZXIgMj4gLyA0LjAgPSAwLjUKLTxNZXRob2ROdW1iZXIgMj4gLz0gNC4wID0+IDAuNQotPE1ldGhvZE51bWJlciAyPiAqKiA0LjAgPSAxNi4wCi08TWV0aG9kTnVtYmVyIDI+ICoqPSA0LjAgPT4gMTYuMAotPE1ldGhvZE51bWJlciAyPiAlIDQuMCA9IDIuMAotPE1ldGhvZE51bWJlciAyPiAlPSA0LjAgPT4gMi4wCi08TWV0aG9kTnVtYmVyIDI+ICsgMiA9IDQKLTxNZXRob2ROdW1iZXIgMj4gKz0gMiA9PiA0Ci08TWV0aG9kTnVtYmVyIDI+IC0gMiA9IDAKLTxNZXRob2ROdW1iZXIgMj4gLT0gMiA9PiAwCi08TWV0aG9kTnVtYmVyIDI+ICogMiA9IDQKLTxNZXRob2ROdW1iZXIgMj4gKj0gMiA9PiA0Ci08TWV0aG9kTnVtYmVyIDI+IC8gMiA9IDEKLTxNZXRob2ROdW1iZXIgMj4gLz0gMiA9PiAxCi08TWV0aG9kTnVtYmVyIDI+ICoqIDIgPSA0Ci08TWV0aG9kTnVtYmVyIDI+ICoqPSAyID0+IDQKLTxNZXRob2ROdW1iZXIgMj4gJSAyID0gMAotPE1ldGhvZE51bWJlciAyPiAlPSAyID0+IDAKLTxNZXRob2ROdW1iZXIgMj4gKyAoMiswaikgPSAoNC4wICsgMC4waikKLTxNZXRob2ROdW1iZXIgMj4gKz0gKDIrMGopID0+ICg0LjAgKyAwLjBqKQotPE1ldGhvZE51bWJlciAyPiAtICgyKzBqKSA9ICgwLjAgKyAwLjBqKQotPE1ldGhvZE51bWJlciAyPiAtPSAoMiswaikgPT4gKDAuMCArIDAuMGopCi08TWV0aG9kTnVtYmVyIDI+ICogKDIrMGopID0gKDQuMCArIDAuMGopCi08TWV0aG9kTnVtYmVyIDI+ICo9ICgyKzBqKSA9PiAoNC4wICsgMC4waikKLTxNZXRob2ROdW1iZXIgMj4gLyAoMiswaikgPSAoMS4wICsgMC4waikKLTxNZXRob2ROdW1iZXIgMj4gLz0gKDIrMGopID0+ICgxLjAgKyAwLjBqKQotPE1ldGhvZE51bWJlciAyPiAqKiAoMiswaikgPSAoNC4wICsgMC4waikKLTxNZXRob2ROdW1iZXIgMj4gKio9ICgyKzBqKSA9PiAoNC4wICsgMC4waikKLTxNZXRob2ROdW1iZXIgMj4gJSAoMiswaikgPSAoMC4wICsgMC4waikKLTxNZXRob2ROdW1iZXIgMj4gJT0gKDIrMGopID0+ICgwLjAgKyAwLjBqKQotPE1ldGhvZE51bWJlciAyPiArIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gKz0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAtIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gLT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAqIFsxXSA9IFsxLCAxXQotPE1ldGhvZE51bWJlciAyPiAqPSBbMV0gPT4gWzEsIDFdCi08TWV0aG9kTnVtYmVyIDI+IC8gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAvPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICoqIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gKio9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gJSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICU9IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gKyAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiArPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAtICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+IC09ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICogKDIsKSA9ICgyLCAyKQotPE1ldGhvZE51bWJlciAyPiAqPSAoMiwpID0+ICgyLCAyKQotPE1ldGhvZE51bWJlciAyPiAvICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+IC89ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICoqICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICoqPSAoMiwpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAlICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICU9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICsgTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gKz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gLSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAtPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPE1ldGhvZE51bWJlciAyPiAqIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICo9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+IC8gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gLz0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gKiogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gKio9IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08TWV0aG9kTnVtYmVyIDI+ICUgTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gJT0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxNZXRob2ROdW1iZXIgMj4gKyA8TWV0aG9kTnVtYmVyIDI+ID0gNAotPE1ldGhvZE51bWJlciAyPiArPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDQKLTxNZXRob2ROdW1iZXIgMj4gLSA8TWV0aG9kTnVtYmVyIDI+ID0gMAotPE1ldGhvZE51bWJlciAyPiAtPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDAKLTxNZXRob2ROdW1iZXIgMj4gKiA8TWV0aG9kTnVtYmVyIDI+ID0gNAotPE1ldGhvZE51bWJlciAyPiAqPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDQKLTxNZXRob2ROdW1iZXIgMj4gLyA8TWV0aG9kTnVtYmVyIDI+ID0gMQotPE1ldGhvZE51bWJlciAyPiAvPSA8TWV0aG9kTnVtYmVyIDI+ID0+IDEKLTxNZXRob2ROdW1iZXIgMj4gKiogPE1ldGhvZE51bWJlciAyPiA9IDQKLTxNZXRob2ROdW1iZXIgMj4gKio9IDxNZXRob2ROdW1iZXIgMj4gPT4gNAotPE1ldGhvZE51bWJlciAyPiAlIDxNZXRob2ROdW1iZXIgMj4gPSAwCi08TWV0aG9kTnVtYmVyIDI+ICU9IDxNZXRob2ROdW1iZXIgMj4gPT4gMAotPE1ldGhvZE51bWJlciAyPiArIDxDb2VyY2VOdW1iZXIgMj4gPSA0Ci08TWV0aG9kTnVtYmVyIDI+ICs9IDxDb2VyY2VOdW1iZXIgMj4gPT4gNAotPE1ldGhvZE51bWJlciAyPiAtIDxDb2VyY2VOdW1iZXIgMj4gPSAwCi08TWV0aG9kTnVtYmVyIDI+IC09IDxDb2VyY2VOdW1iZXIgMj4gPT4gMAotPE1ldGhvZE51bWJlciAyPiAqIDxDb2VyY2VOdW1iZXIgMj4gPSA0Ci08TWV0aG9kTnVtYmVyIDI+ICo9IDxDb2VyY2VOdW1iZXIgMj4gPT4gNAotPE1ldGhvZE51bWJlciAyPiAvIDxDb2VyY2VOdW1iZXIgMj4gPSAxCi08TWV0aG9kTnVtYmVyIDI+IC89IDxDb2VyY2VOdW1iZXIgMj4gPT4gMQotPE1ldGhvZE51bWJlciAyPiAqKiA8Q29lcmNlTnVtYmVyIDI+ID0gNAotPE1ldGhvZE51bWJlciAyPiAqKj0gPENvZXJjZU51bWJlciAyPiA9PiA0Ci08TWV0aG9kTnVtYmVyIDI+ICUgPENvZXJjZU51bWJlciAyPiA9IDAKLTxNZXRob2ROdW1iZXIgMj4gJT0gPENvZXJjZU51bWJlciAyPiA9PiAwCi08Q29lcmNlTnVtYmVyIDI+ICsgMiA9IDQKLTxDb2VyY2VOdW1iZXIgMj4gKz0gMiA9PiA0Ci08Q29lcmNlTnVtYmVyIDI+IC0gMiA9IDAKLTxDb2VyY2VOdW1iZXIgMj4gLT0gMiA9PiAwCi08Q29lcmNlTnVtYmVyIDI+ICogMiA9IDQKLTxDb2VyY2VOdW1iZXIgMj4gKj0gMiA9PiA0Ci08Q29lcmNlTnVtYmVyIDI+IC8gMiA9IDEKLTxDb2VyY2VOdW1iZXIgMj4gLz0gMiA9PiAxCi08Q29lcmNlTnVtYmVyIDI+ICoqIDIgPSA0Ci08Q29lcmNlTnVtYmVyIDI+ICoqPSAyID0+IDQKLTxDb2VyY2VOdW1iZXIgMj4gJSAyID0gMAotPENvZXJjZU51bWJlciAyPiAlPSAyID0+IDAKLTxDb2VyY2VOdW1iZXIgMj4gKyA0LjAgPSA2LjAKLTxDb2VyY2VOdW1iZXIgMj4gKz0gNC4wID0+IDYuMAotPENvZXJjZU51bWJlciAyPiAtIDQuMCA9IC0yLjAKLTxDb2VyY2VOdW1iZXIgMj4gLT0gNC4wID0+IC0yLjAKLTxDb2VyY2VOdW1iZXIgMj4gKiA0LjAgPSA4LjAKLTxDb2VyY2VOdW1iZXIgMj4gKj0gNC4wID0+IDguMAotPENvZXJjZU51bWJlciAyPiAvIDQuMCA9IDAuNQotPENvZXJjZU51bWJlciAyPiAvPSA0LjAgPT4gMC41Ci08Q29lcmNlTnVtYmVyIDI+ICoqIDQuMCA9IDE2LjAKLTxDb2VyY2VOdW1iZXIgMj4gKio9IDQuMCA9PiAxNi4wCi08Q29lcmNlTnVtYmVyIDI+ICUgNC4wID0gMi4wCi08Q29lcmNlTnVtYmVyIDI+ICU9IDQuMCA9PiAyLjAKLTxDb2VyY2VOdW1iZXIgMj4gKyAyID0gNAotPENvZXJjZU51bWJlciAyPiArPSAyID0+IDQKLTxDb2VyY2VOdW1iZXIgMj4gLSAyID0gMAotPENvZXJjZU51bWJlciAyPiAtPSAyID0+IDAKLTxDb2VyY2VOdW1iZXIgMj4gKiAyID0gNAotPENvZXJjZU51bWJlciAyPiAqPSAyID0+IDQKLTxDb2VyY2VOdW1iZXIgMj4gLyAyID0gMQotPENvZXJjZU51bWJlciAyPiAvPSAyID0+IDEKLTxDb2VyY2VOdW1iZXIgMj4gKiogMiA9IDQKLTxDb2VyY2VOdW1iZXIgMj4gKio9IDIgPT4gNAotPENvZXJjZU51bWJlciAyPiAlIDIgPSAwCi08Q29lcmNlTnVtYmVyIDI+ICU9IDIgPT4gMAotPENvZXJjZU51bWJlciAyPiArICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotPENvZXJjZU51bWJlciAyPiArPSAoMiswaikgPT4gKDQuMCArIDAuMGopCi08Q29lcmNlTnVtYmVyIDI+IC0gKDIrMGopID0gKDAuMCArIDAuMGopCi08Q29lcmNlTnVtYmVyIDI+IC09ICgyKzBqKSA9PiAoMC4wICsgMC4waikKLTxDb2VyY2VOdW1iZXIgMj4gKiAoMiswaikgPSAoNC4wICsgMC4waikKLTxDb2VyY2VOdW1iZXIgMj4gKj0gKDIrMGopID0+ICg0LjAgKyAwLjBqKQotPENvZXJjZU51bWJlciAyPiAvICgyKzBqKSA9ICgxLjAgKyAwLjBqKQotPENvZXJjZU51bWJlciAyPiAvPSAoMiswaikgPT4gKDEuMCArIDAuMGopCi08Q29lcmNlTnVtYmVyIDI+ICoqICgyKzBqKSA9ICg0LjAgKyAwLjBqKQotPENvZXJjZU51bWJlciAyPiAqKj0gKDIrMGopID0+ICg0LjAgKyAwLjBqKQotPENvZXJjZU51bWJlciAyPiAlICgyKzBqKSA9ICgwLjAgKyAwLjBqKQotPENvZXJjZU51bWJlciAyPiAlPSAoMiswaikgPT4gKDAuMCArIDAuMGopCi08Q29lcmNlTnVtYmVyIDI+ICsgWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiArPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+IC0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAtPSBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICogWzFdID0gWzEsIDFdCi08Q29lcmNlTnVtYmVyIDI+ICo9IFsxXSA9PiBbMSwgMV0KLTxDb2VyY2VOdW1iZXIgMj4gLyBbMV0gLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+IC89IFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKiogWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAqKj0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAlIFsxXSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gJT0gWzFdIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiArICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICs9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+IC0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gLT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKiAoMiwpID0gKDIsIDIpCi08Q29lcmNlTnVtYmVyIDI+ICo9ICgyLCkgPT4gKDIsIDIpCi08Q29lcmNlTnVtYmVyIDI+IC8gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gLz0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKiogKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKio9ICgyLCkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICUgKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gJT0gKDIsKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiArPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAtIE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+IC09IE5vbmUgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi08Q29lcmNlTnVtYmVyIDI+ICogTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gLyBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAvPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAqKiBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAqKj0gTm9uZSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLTxDb2VyY2VOdW1iZXIgMj4gJSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiAlPSBOb25lIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotPENvZXJjZU51bWJlciAyPiArIDxNZXRob2ROdW1iZXIgMj4gPSA0Ci08Q29lcmNlTnVtYmVyIDI+ICs9IDxNZXRob2ROdW1iZXIgMj4gPT4gNAotPENvZXJjZU51bWJlciAyPiAtIDxNZXRob2ROdW1iZXIgMj4gPSAwCi08Q29lcmNlTnVtYmVyIDI+IC09IDxNZXRob2ROdW1iZXIgMj4gPT4gMAotPENvZXJjZU51bWJlciAyPiAqIDxNZXRob2ROdW1iZXIgMj4gPSA0Ci08Q29lcmNlTnVtYmVyIDI+ICo9IDxNZXRob2ROdW1iZXIgMj4gPT4gNAotPENvZXJjZU51bWJlciAyPiAvIDxNZXRob2ROdW1iZXIgMj4gPSAxCi08Q29lcmNlTnVtYmVyIDI+IC89IDxNZXRob2ROdW1iZXIgMj4gPT4gMQotPENvZXJjZU51bWJlciAyPiAqKiA8TWV0aG9kTnVtYmVyIDI+ID0gNAotPENvZXJjZU51bWJlciAyPiAqKj0gPE1ldGhvZE51bWJlciAyPiA9PiA0Ci08Q29lcmNlTnVtYmVyIDI+ICUgPE1ldGhvZE51bWJlciAyPiA9IDAKLTxDb2VyY2VOdW1iZXIgMj4gJT0gPE1ldGhvZE51bWJlciAyPiA9PiAwCi08Q29lcmNlTnVtYmVyIDI+ICsgPENvZXJjZU51bWJlciAyPiA9IDQKLTxDb2VyY2VOdW1iZXIgMj4gKz0gPENvZXJjZU51bWJlciAyPiA9PiA0Ci08Q29lcmNlTnVtYmVyIDI+IC0gPENvZXJjZU51bWJlciAyPiA9IDAKLTxDb2VyY2VOdW1iZXIgMj4gLT0gPENvZXJjZU51bWJlciAyPiA9PiAwCi08Q29lcmNlTnVtYmVyIDI+ICogPENvZXJjZU51bWJlciAyPiA9IDQKLTxDb2VyY2VOdW1iZXIgMj4gKj0gPENvZXJjZU51bWJlciAyPiA9PiA0Ci08Q29lcmNlTnVtYmVyIDI+IC8gPENvZXJjZU51bWJlciAyPiA9IDEKLTxDb2VyY2VOdW1iZXIgMj4gLz0gPENvZXJjZU51bWJlciAyPiA9PiAxCi08Q29lcmNlTnVtYmVyIDI+ICoqIDxDb2VyY2VOdW1iZXIgMj4gPSA0Ci08Q29lcmNlTnVtYmVyIDI+ICoqPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDQKLTxDb2VyY2VOdW1iZXIgMj4gJSA8Q29lcmNlTnVtYmVyIDI+ID0gMAotPENvZXJjZU51bWJlciAyPiAlPSA8Q29lcmNlTnVtYmVyIDI+ID0+IDAKLWRpdm1vZCgyLCAyKSA9ICgxLCAwKQotZGl2bW9kKDIsIDQuMCkgPSAoMC4wLCAyLjApCi1kaXZtb2QoMiwgMikgPSAoMUwsIDBMKQotZGl2bW9kKDIsICgyKzBqKSkgPSAoKDErMGopLCAwaikKLWRpdm1vZCgyLCBbMV0pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDIsICgyLCkpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDIsIE5vbmUpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDIsIDxNZXRob2ROdW1iZXIgMj4pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDIsIDxDb2VyY2VOdW1iZXIgMj4pID0gKDEsIDApCi1kaXZtb2QoNC4wLCAyKSA9ICgyLjAsIDAuMCkKLWRpdm1vZCg0LjAsIDQuMCkgPSAoMS4wLCAwLjApCi1kaXZtb2QoNC4wLCAyKSA9ICgyLjAsIDAuMCkKLWRpdm1vZCg0LjAsICgyKzBqKSkgPSAoKDIrMGopLCAwaikKLWRpdm1vZCg0LjAsIFsxXSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoNC4wLCAoMiwpKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg0LjAsIE5vbmUpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDQuMCwgPE1ldGhvZE51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoNC4wLCA8Q29lcmNlTnVtYmVyIDI+KSA9ICgyLjAsIDAuMCkKLWRpdm1vZCgyLCAyKSA9ICgxTCwgMEwpCi1kaXZtb2QoMiwgNC4wKSA9ICgwLjAsIDIuMCkKLWRpdm1vZCgyLCAyKSA9ICgxTCwgMEwpCi1kaXZtb2QoMiwgKDIrMGopKSA9ICgoMSswaiksIDBqKQotZGl2bW9kKDIsIFsxXSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoMiwgKDIsKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoMiwgTm9uZSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoMiwgPE1ldGhvZE51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoMiwgPENvZXJjZU51bWJlciAyPikgPSAoMUwsIDBMKQotZGl2bW9kKCgyKzBqKSwgMikgPSAoKDErMGopLCAwaikKLWRpdm1vZCgoMiswaiksIDQuMCkgPSAoMGosICgyKzBqKSkKLWRpdm1vZCgoMiswaiksIDIpID0gKCgxKzBqKSwgMGopCi1kaXZtb2QoKDIrMGopLCAoMiswaikpID0gKCgxKzBqKSwgMGopCi1kaXZtb2QoKDIrMGopLCBbMV0pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKCgyKzBqKSwgKDIsKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIrMGopLCBOb25lKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgoMiswaiksIDxNZXRob2ROdW1iZXIgMj4pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKCgyKzBqKSwgPENvZXJjZU51bWJlciAyPikgPSAoKDErMGopLCAwaikKLWRpdm1vZChbMV0sIDIpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKFsxXSwgNC4wKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChbMV0sIDIpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKFsxXSwgKDIrMGopKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChbMV0sIFsxXSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoWzFdLCAoMiwpKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChbMV0sIE5vbmUpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKFsxXSwgPE1ldGhvZE51bWJlciAyPikgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoWzFdLCA8Q29lcmNlTnVtYmVyIDI+KSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgoMiwpLCAyKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgoMiwpLCA0LjApIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKCgyLCksIDIpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKCgyLCksICgyKzBqKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoKDIsKSwgWzFdKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgoMiwpLCAoMiwpKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgoMiwpLCBOb25lKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgoMiwpLCA8TWV0aG9kTnVtYmVyIDI+KSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCgoMiwpLCA8Q29lcmNlTnVtYmVyIDI+KSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChOb25lLCAyKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChOb25lLCA0LjApIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKE5vbmUsIDIpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKE5vbmUsICgyKzBqKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoTm9uZSwgWzFdKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChOb25lLCAoMiwpKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChOb25lLCBOb25lKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChOb25lLCA8TWV0aG9kTnVtYmVyIDI+KSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZChOb25lLCA8Q29lcmNlTnVtYmVyIDI+KSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8TWV0aG9kTnVtYmVyIDI+LCAyKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8TWV0aG9kTnVtYmVyIDI+LCA0LjApIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDxNZXRob2ROdW1iZXIgMj4sIDIpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDxNZXRob2ROdW1iZXIgMj4sICgyKzBqKSkgLi4uIGV4Y2VwdGlvbnMuVHlwZUVycm9yCi1kaXZtb2QoPE1ldGhvZE51bWJlciAyPiwgWzFdKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8TWV0aG9kTnVtYmVyIDI+LCAoMiwpKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8TWV0aG9kTnVtYmVyIDI+LCBOb25lKSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8TWV0aG9kTnVtYmVyIDI+LCA8TWV0aG9kTnVtYmVyIDI+KSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8TWV0aG9kTnVtYmVyIDI+LCA8Q29lcmNlTnVtYmVyIDI+KSAuLi4gZXhjZXB0aW9ucy5UeXBlRXJyb3IKLWRpdm1vZCg8Q29lcmNlTnVtYmVyIDI+LCAyKSA9ICgxLCAwKQotZGl2bW9kKDxDb2VyY2VOdW1iZXIgMj4sIDQuMCkgPSAoMC4wLCAyLjApCi1kaXZtb2QoPENvZXJjZU51bWJlciAyPiwgMikgPSAoMUwsIDBMKQotZGl2bW9kKDxDb2VyY2VOdW1iZXIgMj4sICgyKzBqKSkgPSAoKDErMGopLCAwaikKLWRpdm1vZCg8Q29lcmNlTnVtYmVyIDI+LCBbMV0pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDxDb2VyY2VOdW1iZXIgMj4sICgyLCkpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDxDb2VyY2VOdW1iZXIgMj4sIE5vbmUpIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDxDb2VyY2VOdW1iZXIgMj4sIDxNZXRob2ROdW1iZXIgMj4pIC4uLiBleGNlcHRpb25zLlR5cGVFcnJvcgotZGl2bW9kKDxDb2VyY2VOdW1iZXIgMj4sIDxDb2VyY2VOdW1iZXIgMj4pID0gKDEsIDApCmRpZmYgLS1naXQgYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9jb21wYXJlIGIvTGliL3Rlc3Qvb3V0cHV0L3Rlc3RfY29tcGFyZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjEwYmQ5Ny4uMDAwMDAwMAotLS0gYS9MaWIvdGVzdC9vdXRwdXQvdGVzdF9jb21wYXJlCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLXRlc3RfY29tcGFyZQotMiA9PSAyCi0yID09IDIuMAotMiA9PSAyCi0yID09ICgyKzBqKQotMiAhPSBbMV0KLTIgIT0gKDMsKQotMiAhPSBOb25lCi0yICE9IDxFbXB0eT4KLTIgPT0gPENvZXJjZSAyPgotMiA9PSA8Q21wIDIuMD4KLTIuMCA9PSAyCi0yLjAgPT0gMi4wCi0yLjAgPT0gMgotMi4wID09ICgyKzBqKQotMi4wICE9IFsxXQotMi4wICE9ICgzLCkKLTIuMCAhPSBOb25lCi0yLjAgIT0gPEVtcHR5PgotMi4wID09IDxDb2VyY2UgMj4KLTIuMCA9PSA8Q21wIDIuMD4KLTIgPT0gMgotMiA9PSAyLjAKLTIgPT0gMgotMiA9PSAoMiswaikKLTIgIT0gWzFdCi0yICE9ICgzLCkKLTIgIT0gTm9uZQotMiAhPSA8RW1wdHk+Ci0yID09IDxDb2VyY2UgMj4KLTIgPT0gPENtcCAyLjA+Ci0oMiswaikgPT0gMgotKDIrMGopID09IDIuMAotKDIrMGopID09IDIKLSgyKzBqKSA9PSAoMiswaikKLSgyKzBqKSAhPSBbMV0KLSgyKzBqKSAhPSAoMywpCi0oMiswaikgIT0gTm9uZQotKDIrMGopICE9IDxFbXB0eT4KLSgyKzBqKSA9PSA8Q29lcmNlIDI+Ci0oMiswaikgPT0gPENtcCAyLjA+Ci1bMV0gIT0gMgotWzFdICE9IDIuMAotWzFdICE9IDIKLVsxXSAhPSAoMiswaikKLVsxXSA9PSBbMV0KLVsxXSAhPSAoMywpCi1bMV0gIT0gTm9uZQotWzFdICE9IDxFbXB0eT4KLVsxXSAhPSA8Q29lcmNlIDI+Ci1bMV0gIT0gPENtcCAyLjA+Ci0oMywpICE9IDIKLSgzLCkgIT0gMi4wCi0oMywpICE9IDIKLSgzLCkgIT0gKDIrMGopCi0oMywpICE9IFsxXQotKDMsKSA9PSAoMywpCi0oMywpICE9IE5vbmUKLSgzLCkgIT0gPEVtcHR5PgotKDMsKSAhPSA8Q29lcmNlIDI+Ci0oMywpICE9IDxDbXAgMi4wPgotTm9uZSAhPSAyCi1Ob25lICE9IDIuMAotTm9uZSAhPSAyCi1Ob25lICE9ICgyKzBqKQotTm9uZSAhPSBbMV0KLU5vbmUgIT0gKDMsKQotTm9uZSA9PSBOb25lCi1Ob25lICE9IDxFbXB0eT4KLU5vbmUgIT0gPENvZXJjZSAyPgotTm9uZSAhPSA8Q21wIDIuMD4KLTxFbXB0eT4gIT0gMgotPEVtcHR5PiAhPSAyLjAKLTxFbXB0eT4gIT0gMgotPEVtcHR5PiAhPSAoMiswaikKLTxFbXB0eT4gIT0gWzFdCi08RW1wdHk+ICE9ICgzLCkKLTxFbXB0eT4gIT0gTm9uZQotPEVtcHR5PiA9PSA8RW1wdHk+Ci08RW1wdHk+ICE9IDxDb2VyY2UgMj4KLTxFbXB0eT4gIT0gPENtcCAyLjA+Ci08Q29lcmNlIDI+ID09IDIKLTxDb2VyY2UgMj4gPT0gMi4wCi08Q29lcmNlIDI+ID09IDIKLTxDb2VyY2UgMj4gPT0gKDIrMGopCi08Q29lcmNlIDI+ICE9IFsxXQotPENvZXJjZSAyPiAhPSAoMywpCi08Q29lcmNlIDI+ICE9IE5vbmUKLTxDb2VyY2UgMj4gIT0gPEVtcHR5PgotPENvZXJjZSAyPiA9PSA8Q29lcmNlIDI+Ci08Q29lcmNlIDI+ID09IDxDbXAgMi4wPgotPENtcCAyLjA+ID09IDIKLTxDbXAgMi4wPiA9PSAyLjAKLTxDbXAgMi4wPiA9PSAyCi08Q21wIDIuMD4gPT0gKDIrMGopCi08Q21wIDIuMD4gIT0gWzFdCi08Q21wIDIuMD4gIT0gKDMsKQotPENtcCAyLjA+ICE9IE5vbmUKLTxDbXAgMi4wPiAhPSA8RW1wdHk+Ci08Q21wIDIuMD4gPT0gPENvZXJjZSAyPgotPENtcCAyLjA+ID09IDxDbXAgMi4wPgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvcmVncnRlc3QucHkgYi9MaWIvdGVzdC9yZWdydGVzdC5weQppbmRleCA4NWY1N2E2Li41NjZlNTRiIDEwMDc1NQotLS0gYS9MaWIvdGVzdC9yZWdydGVzdC5weQorKysgYi9MaWIvdGVzdC9yZWdydGVzdC5weQpAQCAtNTIwLDcgKzUyMCw3IEBACiAgICAgICAgICAgICAgICAgaW1wb3J0IGdjCiAgICAgICAgICAgICAgICAgZGVmIGNsZWFudXAoKToKICAgICAgICAgICAgICAgICAgICAgaW1wb3J0IF9zdHJwdGltZSwgbGluZWNhY2hlLCB3YXJuaW5ncywgZGlyY2FjaGUKLSAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHVybHBhcnNlLCB1cmxsaWIsIHVybGxpYjIKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IHVybHBhcnNlLCB1cmxsaWIsIHVybGxpYjIsIG1pbWV0eXBlcywgZG9jdGVzdAogICAgICAgICAgICAgICAgICAgICBmcm9tIGRpc3R1dGlscy5kaXJfdXRpbCBpbXBvcnQgX3BhdGhfY3JlYXRlZAogICAgICAgICAgICAgICAgICAgICBfcGF0aF9jcmVhdGVkLmNsZWFyKCkKICAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MuZmlsdGVyc1s6XSA9IGZzCkBAIC01MzYsNiArNTM2LDggQEAKICAgICAgICAgICAgICAgICAgICAgc3lzLnBhdGhfaW1wb3J0ZXJfY2FjaGUudXBkYXRlKHBpYykKICAgICAgICAgICAgICAgICAgICAgZGlyY2FjaGUucmVzZXQoKQogICAgICAgICAgICAgICAgICAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCisgICAgICAgICAgICAgICAgICAgIG1pbWV0eXBlcy5fZGVmYXVsdF9taW1lX3R5cGVzKCkKKyAgICAgICAgICAgICAgICAgICAgZG9jdGVzdC5tYXN0ZXIgPSBOb25lCiAgICAgICAgICAgICAgICAgaWYgaW5kaXJlY3RfdGVzdDoKICAgICAgICAgICAgICAgICAgICAgZGVmIHJ1bl90aGVfdGVzdCgpOgogICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXJlY3RfdGVzdCgpCkBAIC01NDcsNiArNTQ5LDcgQEAKICAgICAgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiYmVnaW5uaW5nIiwgcmVwY291bnQsICJyZXBldGl0aW9ucyIKICAgICAgICAgICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCBcCiAgICAgICAgICAgICAgICAgICAgICAgKCIxMjM0NTY3ODkwIioocmVwY291bnQvLzEwICsgMSkpWzpyZXBjb3VudF0KKyAgICAgICAgICAgICAgICBjbGVhbnVwKCkKICAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShyZXBjb3VudCk6CiAgICAgICAgICAgICAgICAgICAgIHJjID0gc3lzLmdldHRvdGFscmVmY291bnQoKQogICAgICAgICAgICAgICAgICAgICBydW5fdGhlX3Rlc3QoKQpAQCAtNzQ0LDYgKzc0Nyw4IEBACiAgICAgICAgIHRlc3Rfc3VuYXVkaW9kZXYKICAgICAgICAgdGVzdF90aHJlYWRzaWduYWxzCiAgICAgICAgIHRlc3RfdGltaW5nCisgICAgICAgIHRlc3Rfd2FpdDMKKyAgICAgICAgdGVzdF93YWl0NAogICAgICAgICAiIiIsCiAgICAgJ2xpbnV4Mic6CiAgICAgICAgICIiIgpAQCAtNzYxLDYgKzc2Niw4IEBACiAgICAgICAgIHRlc3RfbmlzCiAgICAgICAgIHRlc3RfbnRwYXRoCiAgICAgICAgIHRlc3Rfb3NzYXVkaW9kZXYKKyAgICAgICAgdGVzdF9zcWxpdGUKKyAgICAgICAgdGVzdF9zdGFydGZpbGUKICAgICAgICAgdGVzdF9zdW5hdWRpb2RldgogICAgICAgICAiIiIsCiAgICAnbWFjJzoKQEAgLTgwMCw2ICs4MDcsOCBAQAogICAgICAgICB0ZXN0X3B3ZAogICAgICAgICB0ZXN0X3Jlc291cmNlCiAgICAgICAgIHRlc3Rfc2lnbmFsCisgICAgICAgIHRlc3Rfc3FsaXRlCisgICAgICAgIHRlc3Rfc3RhcnRmaWxlCiAgICAgICAgIHRlc3Rfc3VuYXVkaW9kZXYKICAgICAgICAgdGVzdF9zdW5kcnkKICAgICAgICAgdGVzdF90YXJmaWxlCkBAIC04MjQsNiArODMzLDggQEAKICAgICAgICAgdGVzdF9vcGVucHR5CiAgICAgICAgIHRlc3RfcHlleHBhdAogICAgICAgICB0ZXN0X3NheAorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQorICAgICAgICB0ZXN0X3NxbGl0ZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgIHRlc3Rfc3VuZHJ5CiAgICAgICAgICIiIiwKQEAgLTg0Niw2ICs4NTcsOCBAQAogICAgICAgICB0ZXN0X29wZW5wdHkKICAgICAgICAgdGVzdF9weWV4cGF0CiAgICAgICAgIHRlc3Rfc2F4CisgICAgICAgIHRlc3Rfc3FsaXRlCisgICAgICAgIHRlc3Rfc3RhcnRmaWxlCiAgICAgICAgIHRlc3Rfc3VuYXVkaW9kZXYKICAgICAgICAgdGVzdF9zdW5kcnkKICAgICAgICAgIiIiLApAQCAtODczLDYgKzg4Niw4IEBACiAgICAgICAgIHRlc3RfcHlleHBhdAogICAgICAgICB0ZXN0X3F1ZXVlCiAgICAgICAgIHRlc3Rfc2F4CisgICAgICAgIHRlc3Rfc3FsaXRlCisgICAgICAgIHRlc3Rfc3RhcnRmaWxlCiAgICAgICAgIHRlc3Rfc3VuYXVkaW9kZXYKICAgICAgICAgdGVzdF9zdW5kcnkKICAgICAgICAgdGVzdF90aHJlYWQKQEAgLTkxMyw2ICs5MjgsOCBAQAogICAgICAgICB0ZXN0X3B0eQogICAgICAgICB0ZXN0X3B3ZAogICAgICAgICB0ZXN0X3N0cm9wCisgICAgICAgIHRlc3Rfc3FsaXRlCisgICAgICAgIHRlc3Rfc3RhcnRmaWxlCiAgICAgICAgIHRlc3Rfc3VuYXVkaW9kZXYKICAgICAgICAgdGVzdF9zdW5kcnkKICAgICAgICAgdGVzdF90aHJlYWQKQEAgLTkzMCw3ICs5NDcsNiBAQAogICAgICAgICB0ZXN0X2NkCiAgICAgICAgIHRlc3RfY2wKICAgICAgICAgdGVzdF9jdXJzZXMKLSAgICAgICAgdGVzdF9kbAogICAgICAgICB0ZXN0X2dkYm0KICAgICAgICAgdGVzdF9nbAogICAgICAgICB0ZXN0X2ltZ2ZpbGUKQEAgLTk0Miw2ICs5NTgsOCBAQAogICAgICAgICB0ZXN0X250cGF0aAogICAgICAgICB0ZXN0X29zc2F1ZGlvZGV2CiAgICAgICAgIHRlc3RfcG9sbAorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgICIiIiwKICAgICAnc3Vub3M1JzoKQEAgLTk2MCw2ICs5NzgsOCBAQAogICAgICAgICB0ZXN0X2ltZ2ZpbGUKICAgICAgICAgdGVzdF9saW51eGF1ZGlvZGV2CiAgICAgICAgIHRlc3Rfb3BlbnB0eQorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3ppcGZpbGUKICAgICAgICAgdGVzdF96bGliCiAgICAgICAgICIiIiwKQEAgLTk4Niw2ICsxMDA2LDggQEAKICAgICAgICAgdGVzdF9vcGVucHR5CiAgICAgICAgIHRlc3RfcHlleHBhdAogICAgICAgICB0ZXN0X3NheAorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgIHRlc3RfemlwZmlsZQogICAgICAgICB0ZXN0X3psaWIKQEAgLTEwMTEsNiArMTAzMyw4IEBACiAgICAgICAgIHRlc3RfcG9sbAogICAgICAgICB0ZXN0X3BvcGVuMgogICAgICAgICB0ZXN0X3Jlc291cmNlCisgICAgICAgIHRlc3Rfc3FsaXRlCisgICAgICAgIHRlc3Rfc3RhcnRmaWxlCiAgICAgICAgIHRlc3Rfc3VuYXVkaW9kZXYKICAgICAgICAgIiIiLAogICAgICdjeWd3aW4nOgpAQCAtMTAzMiw2ICsxMDU2LDcgQEAKICAgICAgICAgdGVzdF9uaXMKICAgICAgICAgdGVzdF9vc3NhdWRpb2RldgogICAgICAgICB0ZXN0X3NvY2tldHNlcnZlcgorICAgICAgICB0ZXN0X3NxbGl0ZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgICIiIiwKICAgICAnb3MyZW14JzoKQEAgLTEwNTgsNiArMTA4Myw4IEBACiAgICAgICAgIHRlc3RfcHR5CiAgICAgICAgIHRlc3RfcmVzb3VyY2UKICAgICAgICAgdGVzdF9zaWduYWwKKyAgICAgICAgdGVzdF9zcWxpdGUKKyAgICAgICAgdGVzdF9zdGFydGZpbGUKICAgICAgICAgdGVzdF9zdW5hdWRpb2RldgogICAgICAgICAiIiIsCiAgICAgJ2ZyZWVic2Q0JzoKQEAgLTEwODQsNiArMTExMSw4IEBACiAgICAgICAgIHRlc3Rfc2NyaXB0cGFja2FnZXMKICAgICAgICAgdGVzdF9zb2NrZXRfc3NsCiAgICAgICAgIHRlc3Rfc29ja2V0c2VydmVyCisgICAgICAgIHRlc3Rfc3FsaXRlCisgICAgICAgIHRlc3Rfc3RhcnRmaWxlCiAgICAgICAgIHRlc3Rfc3VuYXVkaW9kZXYKICAgICAgICAgdGVzdF90Y2wKICAgICAgICAgdGVzdF90aW1lb3V0CkBAIC0xMTEzLDYgKzExNDIsOCBAQAogICAgICAgICB0ZXN0X21hY29zdG9vbHMKICAgICAgICAgdGVzdF9uaXMKICAgICAgICAgdGVzdF9vc3NhdWRpb2RldgorICAgICAgICB0ZXN0X3NxbGl0ZQorICAgICAgICB0ZXN0X3N0YXJ0ZmlsZQogICAgICAgICB0ZXN0X3N1bmF1ZGlvZGV2CiAgICAgICAgIHRlc3RfdGNsCiAgICAgICAgIHRlc3Rfd2lucmVnCkBAIC0xMTIwLDYgKzExNTEsMzggQEAKICAgICAgICAgdGVzdF96aXBpbXBvcnQKICAgICAgICAgdGVzdF96bGliCiAgICAgICAgICIiIiwKKyAgICAnb3BlbmJzZDMnOgorICAgICAgICAiIiIKKyAgICAgICAgdGVzdF9hZXBhY2sKKyAgICAgICAgdGVzdF9hbAorICAgICAgICB0ZXN0X2FwcGxlc2luZ2xlCisgICAgICAgIHRlc3RfYnNkZGIKKyAgICAgICAgdGVzdF9ic2RkYjMKKyAgICAgICAgdGVzdF9jZAorICAgICAgICB0ZXN0X2NsCisgICAgICAgIHRlc3RfY3R5cGVzCisgICAgICAgIHRlc3RfZGwKKyAgICAgICAgdGVzdF9nZGJtCisgICAgICAgIHRlc3RfZ2wKKyAgICAgICAgdGVzdF9pbWdmaWxlCisgICAgICAgIHRlc3RfbGludXhhdWRpb2RldgorICAgICAgICB0ZXN0X2xvY2FsZQorICAgICAgICB0ZXN0X21hY2ZzCisgICAgICAgIHRlc3RfbWFjb3N0b29scworICAgICAgICB0ZXN0X25pcworICAgICAgICB0ZXN0X25vcm1hbGl6YXRpb24KKyAgICAgICAgdGVzdF9vc3NhdWRpb2RldgorICAgICAgICB0ZXN0X3BlcDI3NworICAgICAgICB0ZXN0X3BsaXN0bGliCisgICAgICAgIHRlc3Rfc2NyaXB0cGFja2FnZXMKKyAgICAgICAgdGVzdF90Y2wKKyAgICAgICAgdGVzdF9zcWxpdGUKKyAgICAgICAgdGVzdF9zdGFydGZpbGUKKyAgICAgICAgdGVzdF9zdW5hdWRpb2RldgorICAgICAgICB0ZXN0X3VuaWNvZGVfZmlsZQorICAgICAgICB0ZXN0X3dpbnJlZworICAgICAgICB0ZXN0X3dpbnNvdW5kCisgICAgICAgICIiIiwKIH0KIF9leHBlY3RhdGlvbnNbJ2ZyZWVic2Q1J10gPSBfZXhwZWN0YXRpb25zWydmcmVlYnNkNCddCiBfZXhwZWN0YXRpb25zWydmcmVlYnNkNiddID0gX2V4cGVjdGF0aW9uc1snZnJlZWJzZDQnXQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9fX2FsbF9fLnB5IGIvTGliL3Rlc3QvdGVzdF9fX2FsbF9fLnB5CmluZGV4IDBiMmU3ZGEuLmM0NWUxMzkgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfX19hbGxfXy5weQorKysgYi9MaWIvdGVzdC90ZXN0X19fYWxsX18ucHkKQEAgLTUsOCArNSw2IEBACiBpbXBvcnQgc3lzCiBpbXBvcnQgd2FybmluZ3MKIAotd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsICIuKiByZWdzdWIgLioiLCBEZXByZWNhdGlvbldhcm5pbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICByJ15yZWdzdWIkJykKIHdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBnb3BoZXJsaWIgbW9kdWxlIGlzIGRlcHJlY2F0ZWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLApAQCAtMTI4LDggKzEyNiw2IEBACiAgICAgICAgIHNlbGYuY2hlY2tfYWxsKCJxdW9wcmkiKQogICAgICAgICBzZWxmLmNoZWNrX2FsbCgicmFuZG9tIikKICAgICAgICAgc2VsZi5jaGVja19hbGwoInJlIikKLSAgICAgICAgc2VsZi5jaGVja19hbGwoInJlY29udmVydCIpCi0gICAgICAgIHNlbGYuY2hlY2tfYWxsKCJyZWdzdWIiKQogICAgICAgICBzZWxmLmNoZWNrX2FsbCgicmVwciIpCiAgICAgICAgIHNlbGYuY2hlY2tfYWxsKCJyZXhlYyIpCiAgICAgICAgIHNlbGYuY2hlY2tfYWxsKCJyZmM4MjIiKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hcHBsZXNpbmdsZS5weSBiL0xpYi90ZXN0L3Rlc3RfYXBwbGVzaW5nbGUucHkKaW5kZXggMmEyZDYwYS4uZDUzM2YxYSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hcHBsZXNpbmdsZS5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FwcGxlc2luZ2xlLnB5CkBAIC0xNSw4ICsxNSw4IEBACiBkYXRhZm9ya2RhdGEgPSAnaGVsbG9cclwwd29ybGRcbicKIHJlc291cmNlZm9ya2RhdGEgPSAnZ29vZGJ5ZVxuY3J1ZWxcMHdvcmxkXHInCiAKLWFwcGxlc2luZ2xlZGF0YSA9IHN0cnVjdC5wYWNrKCJsbDE2c2giLCBBU19NQUdJQywgQVNfVkVSU0lPTiwgImZvbyIsIDIpICsgXAotICAgIHN0cnVjdC5wYWNrKCJsbGxsbGwiLCAxLCA1MCwgbGVuKGRhdGFmb3JrZGF0YSksCithcHBsZXNpbmdsZWRhdGEgPSBzdHJ1Y3QucGFjaygiPmxsMTZzaCIsIEFTX01BR0lDLCBBU19WRVJTSU9OLCAiZm9vIiwgMikgKyBcCisgICAgc3RydWN0LnBhY2soIj5sbGxsbGwiLCAxLCA1MCwgbGVuKGRhdGFmb3JrZGF0YSksCiAgICAgICAgIDIsIDUwK2xlbihkYXRhZm9ya2RhdGEpLCBsZW4ocmVzb3VyY2Vmb3JrZGF0YSkpICsgXAogICAgIGRhdGFmb3JrZGF0YSArIFwKICAgICByZXNvdXJjZWZvcmtkYXRhCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2FycmF5LnB5IGIvTGliL3Rlc3QvdGVzdF9hcnJheS5weQppbmRleCA4N2QzOTVkLi42MjM2MWZjIDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X2FycmF5LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXJyYXkucHkKQEAgLTYxLDcgKzYxLDcgQEAKICAgICAgICAgYmkgPSBhLmJ1ZmZlcl9pbmZvKCkKICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoYmksIHR1cGxlKSkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYmkpLCAyKQotICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZShiaVswXSwgaW50KSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoYmlbMF0sIChpbnQsIGxvbmcpKSkKICAgICAgICAgc2VsZi5hc3NlcnRfKGlzaW5zdGFuY2UoYmlbMV0sIGludCkpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmlbMV0sIGxlbihhKSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9hc3QucHkgYi9MaWIvdGVzdC90ZXN0X2FzdC5weQppbmRleCBiNDJjYWEzLi5jNjRhZDI4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2FzdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2FzdC5weQpAQCAtMTE5LDcgKzExOSw4IEBACiAjIGV4Y2VwdGhhbmRsZXIsIGFyZ3VtZW50cywga2V5d29yZHMsIGFsaWFzCiAKIGlmIF9fbmFtZV9fPT0nX19tYWluX18nIGFuZCBzeXMuYXJndlsxOl0gPT0gWyctZyddOgotICAgIGZvciBzdGF0ZW1lbnRzLCBraW5kIGluICgoZXhlY190ZXN0cywgImV4ZWMiKSwgKHNpbmdsZV90ZXN0cywgInNpbmdsZSIpLCAoZXZhbF90ZXN0cywgImV2YWwiKSk6CisgICAgZm9yIHN0YXRlbWVudHMsIGtpbmQgaW4gKChleGVjX3Rlc3RzLCAiZXhlYyIpLCAoc2luZ2xlX3Rlc3RzLCAic2luZ2xlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmFsX3Rlc3RzLCAiZXZhbCIpKToKICAgICAgICAgcHJpbnQga2luZCsiX3Jlc3VsdHMgPSBbIgogICAgICAgICBmb3IgcyBpbiBzdGF0ZW1lbnRzOgogICAgICAgICAgICAgcHJpbnQgcmVwcih0b190dXBsZShjb21waWxlKHMsICI/Iiwga2luZCwgMHg0MDApKSkrIiwiCkBAIC0xMzEsNyArMTMyLDcgQEAKIAogICAgIGlmIG5vdCBpc2luc3RhbmNlKGFzdF9ub2RlLCBfYXN0LkFTVCkgb3IgYXN0X25vZGUuX2ZpZWxkcyA9PSBOb25lOgogICAgICAgICByZXR1cm4KLSAgICBpZiBpc2luc3RhbmNlKGFzdF9ub2RlLCAoX2FzdC5leHByLCBfYXN0LnN0bXQpKToKKyAgICBpZiBpc2luc3RhbmNlKGFzdF9ub2RlLCAoX2FzdC5leHByLCBfYXN0LnN0bXQsIF9hc3QuZXhjZXB0aGFuZGxlcikpOgogICAgICAgICBub2RlX3BvcyA9IChhc3Rfbm9kZS5saW5lbm8sIGFzdF9ub2RlLmNvbF9vZmZzZXQpCiAgICAgICAgIGFzc2VydCBub2RlX3BvcyA+PSBwYXJlbnRfcG9zLCAobm9kZV9wb3MsIHBhcmVudF9wb3MpCiAgICAgICAgIHBhcmVudF9wb3MgPSAoYXN0X25vZGUubGluZW5vLCBhc3Rfbm9kZS5jb2xfb2Zmc2V0KQpAQCAtMTQ1LDggKzE0Niw4IEBACiAKIGRlZiBydW5fdGVzdHMoKToKICAgICBmb3IgaW5wdXQsIG91dHB1dCwga2luZCBpbiAoKGV4ZWNfdGVzdHMsIGV4ZWNfcmVzdWx0cywgImV4ZWMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2luZ2xlX3Rlc3RzLCBzaW5nbGVfcmVzdWx0cywgInNpbmdsZSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldmFsX3Rlc3RzLCBldmFsX3Jlc3VsdHMsICJldmFsIikpOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2luZ2xlX3Rlc3RzLCBzaW5nbGVfcmVzdWx0cywgInNpbmdsZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZhbF90ZXN0cywgZXZhbF9yZXN1bHRzLCAiZXZhbCIpKToKICAgICAgICAgZm9yIGksIG8gaW4gaXRlcnRvb2xzLml6aXAoaW5wdXQsIG91dHB1dCk6CiAgICAgICAgICAgICBhc3RfdHJlZSA9IGNvbXBpbGUoaSwgIj8iLCBraW5kLCAweDQwMCkKICAgICAgICAgICAgIGFzc2VydCB0b190dXBsZShhc3RfdHJlZSkgPT0gbwpAQCAtMTY1LDcgKzE2Niw3IEBACiAoJ01vZHVsZScsIFsoJ1doaWxlJywgKDEsIDApLCAoJ05hbWUnLCAoMSwgNiksICd2JywgKCdMb2FkJywpKSwgWygnUGFzcycsICgxLCA4KSldLCBbXSldKSwKICgnTW9kdWxlJywgWygnSWYnLCAoMSwgMCksICgnTmFtZScsICgxLCAzKSwgJ3YnLCAoJ0xvYWQnLCkpLCBbKCdQYXNzJywgKDEsIDUpKV0sIFtdKV0pLAogKCdNb2R1bGUnLCBbKCdSYWlzZScsICgxLCAwKSwgKCdOYW1lJywgKDEsIDYpLCAnRXhjZXB0aW9uJywgKCdMb2FkJywpKSwgKCdTdHInLCAoMSwgMTcpLCAnc3RyaW5nJyksIE5vbmUpXSksCi0oJ01vZHVsZScsIFsoJ1RyeUV4Y2VwdCcsICgxLCAwKSwgWygnUGFzcycsICgyLCAyKSldLCBbKCdleGNlcHRoYW5kbGVyJywgKCdOYW1lJywgKDMsIDcpLCAnRXhjZXB0aW9uJywgKCdMb2FkJywpKSwgTm9uZSwgWygnUGFzcycsICg0LCAyKSldKV0sIFtdKV0pLAorKCdNb2R1bGUnLCBbKCdUcnlFeGNlcHQnLCAoMSwgMCksIFsoJ1Bhc3MnLCAoMiwgMikpXSwgWygnZXhjZXB0aGFuZGxlcicsICgzLCAwKSwgKCdOYW1lJywgKDMsIDcpLCAnRXhjZXB0aW9uJywgKCdMb2FkJywpKSwgTm9uZSwgWygnUGFzcycsICg0LCAyKSldLCAzLCAwKV0sIFtdKV0pLAogKCdNb2R1bGUnLCBbKCdUcnlGaW5hbGx5JywgKDEsIDApLCBbKCdQYXNzJywgKDIsIDIpKV0sIFsoJ1Bhc3MnLCAoNCwgMikpXSldKSwKICgnTW9kdWxlJywgWygnQXNzZXJ0JywgKDEsIDApLCAoJ05hbWUnLCAoMSwgNyksICd2JywgKCdMb2FkJywpKSwgTm9uZSldKSwKICgnTW9kdWxlJywgWygnSW1wb3J0JywgKDEsIDApLCBbKCdhbGlhcycsICdzeXMnLCBOb25lKV0pXSksCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2F1ZGlvb3AucHkgYi9MaWIvdGVzdC90ZXN0X2F1ZGlvb3AucHkKaW5kZXggNDQwYWRhYi4uZjU4NTczMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9hdWRpb29wLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXVkaW9vcC5weQpAQCAtMTM2LDEyICsxMzYsMzAgQEAKICAgICAgICAgcmV0dXJuIDAKICAgICByZXR1cm4gMQogCitkZWYgdGVzdGxpbjJhbGF3KGRhdGEpOgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdsaW4yYWxhdycKKyAgICBpZiBhdWRpb29wLmxpbjJhbGF3KGRhdGFbMF0sIDEpICE9ICdceGQ1XHhjNVx4ZjUnIG9yIFwKKyAgICAgICAgICAgICAgYXVkaW9vcC5saW4yYWxhdyhkYXRhWzFdLCAyKSAhPSAnXHhkNVx4ZDVceGQ1JyBvciBcCisgICAgICAgICAgICAgIGF1ZGlvb3AubGluMmFsYXcoZGF0YVsyXSwgNCkgIT0gJ1x4ZDVceGQ1XHhkNSc6CisgICAgICAgIHJldHVybiAwCisgICAgcmV0dXJuIDEKKworZGVmIHRlc3RhbGF3MmxpbihkYXRhKToKKyAgICBpZiB2ZXJib3NlOgorICAgICAgICBwcmludCAnYWxhdzJsaW4nCisgICAgIyBDdXJzb3J5CisgICAgZCA9IGF1ZGlvb3AubGluMmFsYXcoZGF0YVswXSwgMSkKKyAgICBpZiBhdWRpb29wLmFsYXcybGluKGQsIDEpICE9IGRhdGFbMF06CisgICAgICAgIHJldHVybiAwCisgICAgcmV0dXJuIDEKKwogZGVmIHRlc3RsaW4ydWxhdyhkYXRhKToKICAgICBpZiB2ZXJib3NlOgogICAgICAgICBwcmludCAnbGluMnVsYXcnCi0gICAgaWYgYXVkaW9vcC5saW4ydWxhdyhkYXRhWzBdLCAxKSAhPSAnXDM3N1wzNDdcMzMzJyBvciBcCi0gICAgICAgICAgICAgIGF1ZGlvb3AubGluMnVsYXcoZGF0YVsxXSwgMikgIT0gJ1wzNzdcMzc3XDM3Nycgb3IgXAotICAgICAgICAgICAgICBhdWRpb29wLmxpbjJ1bGF3KGRhdGFbMl0sIDQpICE9ICdcMzc3XDM3N1wzNzcnOgorICAgIGlmIGF1ZGlvb3AubGluMnVsYXcoZGF0YVswXSwgMSkgIT0gJ1x4ZmZceGU3XHhkYicgb3IgXAorICAgICAgICAgICAgICBhdWRpb29wLmxpbjJ1bGF3KGRhdGFbMV0sIDIpICE9ICdceGZmXHhmZlx4ZmYnIG9yIFwKKyAgICAgICAgICAgICAgYXVkaW9vcC5saW4ydWxhdyhkYXRhWzJdLCA0KSAhPSAnXHhmZlx4ZmZceGZmJzoKICAgICAgICAgcmV0dXJuIDAKICAgICByZXR1cm4gMQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2F1Z2Fzc2lnbi5weSBiL0xpYi90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5CmluZGV4IDIyY2NhNDQuLjAzMDlkNmUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYXVnYXNzaWduLnB5CkBAIC0xLDI1OCArMSwzMTIgQEAKICMgQXVnbWVudGVkIGFzc2lnbm1lbnQgdGVzdC4KIAoteCA9IDIKLXggKz0gMQoteCAqPSAyCi14ICoqPSAyCi14IC09IDgKLXggJT0gMTIKLXggPj49IDEKLXggJj0gMgoteCB8PSA1Ci14IF49IDEKLXggPDw9IDIKLXggLz0gMgoteCAvLz0gMgotCi1wcmludCB4Ci1wcmludCBpbnQoeCkKLQoteCA9IFsyXQoteFswXSArPSAxCi14WzBdICo9IDIKLXhbMF0gKio9IDIKLXhbMF0gLT0gOAoteFswXSAlPSAxMgoteFswXSA+Pj0gMQoteFswXSAmPSAyCi14WzBdIHw9IDUKLXhbMF0gXj0gMQoteFswXSA8PD0gMgoteFswXSAvPSAyCi14WzBdIC8vPSAyCi0KLXByaW50IHgKLXByaW50IGludCh4WzBdKQotCi14ID0gezA6IDJ9Ci14WzBdICs9IDEKLXhbMF0gKj0gMgoteFswXSAqKj0gMgoteFswXSAtPSA4Ci14WzBdICU9IDEyCi14WzBdID4+PSAxCi14WzBdICY9IDIKLXhbMF0gfD0gNQoteFswXSBePSAxCi14WzBdIDw8PSAyCi14WzBdIC89IDIKLXhbMF0gLy89IDIKLQotcHJpbnQgeFswXQotcHJpbnQgaW50KHhbMF0pCi0KLXggPSBbMSwyXQoteCArPSBbMyw0XQoteCAqPSAyCi0KLXByaW50IHgKLQoteCA9IFsxLCAyLCAzXQoteSA9IHgKLXhbMToyXSAqPSAyCi15WzE6Ml0gKz0gWzFdCi0KLXByaW50IHgKLXByaW50IHggaXMgeQotCi1jbGFzcyBhdWdfdGVzdDoKLSAgICBkZWYgX19pbml0X18oc2VsZiwgdmFsdWUpOgotICAgICAgICBzZWxmLnZhbCA9IHZhbHVlCi0gICAgZGVmIF9fcmFkZF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHJldHVybiBzZWxmLnZhbCArIHZhbAotICAgIGRlZiBfX2FkZF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHJldHVybiBhdWdfdGVzdChzZWxmLnZhbCArIHZhbCkKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl91bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0CiAKIAotY2xhc3MgYXVnX3Rlc3QyKGF1Z190ZXN0KToKLSAgICBkZWYgX19pYWRkX18oc2VsZiwgdmFsKToKLSAgICAgICAgc2VsZi52YWwgPSBzZWxmLnZhbCArIHZhbAotICAgICAgICByZXR1cm4gc2VsZgorY2xhc3MgQXVnQXNzaWduVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RCYXNpYyhzZWxmKToKKyAgICAgICAgeCA9IDIKKyAgICAgICAgeCArPSAxCisgICAgICAgIHggKj0gMgorICAgICAgICB4ICoqPSAyCisgICAgICAgIHggLT0gOAorICAgICAgICB4IC8vPSA1CisgICAgICAgIHggJT0gMworICAgICAgICB4ICY9IDIKKyAgICAgICAgeCB8PSA1CisgICAgICAgIHggXj0gMQorICAgICAgICB4IC89IDIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeCwgMy4wKQogCi1jbGFzcyBhdWdfdGVzdDMoYXVnX3Rlc3QpOgotICAgIGRlZiBfX2lhZGRfXyhzZWxmLCB2YWwpOgotICAgICAgICByZXR1cm4gYXVnX3Rlc3QzKHNlbGYudmFsICsgdmFsKQorICAgIGRlZiB0ZXN0SW5MaXN0KHNlbGYpOgorICAgICAgICB4ID0gWzJdCisgICAgICAgIHhbMF0gKz0gMQorICAgICAgICB4WzBdICo9IDIKKyAgICAgICAgeFswXSAqKj0gMgorICAgICAgICB4WzBdIC09IDgKKyAgICAgICAgeFswXSAvLz0gNQorICAgICAgICB4WzBdICU9IDMKKyAgICAgICAgeFswXSAmPSAyCisgICAgICAgIHhbMF0gfD0gNQorICAgICAgICB4WzBdIF49IDEKKyAgICAgICAgeFswXSAvPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHhbMF0sIDMuMCkKIAoteCA9IGF1Z190ZXN0KDEpCi15ID0geAoteCArPSAxMAorICAgIGRlZiB0ZXN0SW5EaWN0KHNlbGYpOgorICAgICAgICB4ID0gezA6IDJ9CisgICAgICAgIHhbMF0gKz0gMQorICAgICAgICB4WzBdICo9IDIKKyAgICAgICAgeFswXSAqKj0gMgorICAgICAgICB4WzBdIC09IDgKKyAgICAgICAgeFswXSAvLz0gNQorICAgICAgICB4WzBdICU9IDMKKyAgICAgICAgeFswXSAmPSAyCisgICAgICAgIHhbMF0gfD0gNQorICAgICAgICB4WzBdIF49IDEKKyAgICAgICAgeFswXSAvPSAyCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHhbMF0sIDMuMCkKIAotcHJpbnQgaXNpbnN0YW5jZSh4LCBhdWdfdGVzdCkKLXByaW50IHkgaXMgbm90IHgKLXByaW50IHgudmFsCisgICAgZGVmIHRlc3RTZXF1ZW5jZXMoc2VsZik6CisgICAgICAgIHggPSBbMSwyXQorICAgICAgICB4ICs9IFszLDRdCisgICAgICAgIHggKj0gMgogCi14ID0gYXVnX3Rlc3QyKDIpCi15ID0geAoteCArPSAxMAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LCBbMSwgMiwgMywgNCwgMSwgMiwgMywgNF0pCiAKLXByaW50IHkgaXMgeAotcHJpbnQgeC52YWwKKyAgICAgICAgeCA9IFsxLCAyLCAzXQorICAgICAgICB5ID0geAorICAgICAgICB4WzE6Ml0gKj0gMgorICAgICAgICB5WzE6Ml0gKz0gWzFdCiAKLXggPSBhdWdfdGVzdDMoMykKLXkgPSB4Ci14ICs9IDEwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHgsIFsxLCAyLCAxLCAyLCAzXSkKKyAgICAgICAgc2VsZi5hc3NlcnRfKHggaXMgeSkKIAotcHJpbnQgaXNpbnN0YW5jZSh4LCBhdWdfdGVzdDMpCi1wcmludCB5IGlzIG5vdCB4Ci1wcmludCB4LnZhbAorICAgIGRlZiB0ZXN0Q3VzdG9tTWV0aG9kczEoc2VsZik6CiAKLWNsYXNzIHRlc3RhbGw6CisgICAgICAgIGNsYXNzIGF1Z190ZXN0OgorICAgICAgICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlKToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbCA9IHZhbHVlCisgICAgICAgICAgICBkZWYgX19yYWRkX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi52YWwgKyB2YWwKKyAgICAgICAgICAgIGRlZiBfX2FkZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgcmV0dXJuIGF1Z190ZXN0KHNlbGYudmFsICsgdmFsKQogCi0gICAgZGVmIF9fYWRkX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fYWRkX18gY2FsbGVkIgotICAgIGRlZiBfX3JhZGRfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19yYWRkX18gY2FsbGVkIgotICAgIGRlZiBfX2lhZGRfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19pYWRkX18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBjbGFzcyBhdWdfdGVzdDIoYXVnX3Rlc3QpOgorICAgICAgICAgICAgZGVmIF9faWFkZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgc2VsZi52YWwgPSBzZWxmLnZhbCArIHZhbAorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCiAKLSAgICBkZWYgX19zdWJfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19zdWJfXyBjYWxsZWQiCi0gICAgZGVmIF9fcnN1Yl9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX3JzdWJfXyBjYWxsZWQiCi0gICAgZGVmIF9faXN1Yl9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX2lzdWJfXyBjYWxsZWQiCi0gICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIGNsYXNzIGF1Z190ZXN0MyhhdWdfdGVzdCk6CisgICAgICAgICAgICBkZWYgX19pYWRkX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICByZXR1cm4gYXVnX3Rlc3QzKHNlbGYudmFsICsgdmFsKQogCi0gICAgZGVmIF9fbXVsX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fbXVsX18gY2FsbGVkIgotICAgIGRlZiBfX3JtdWxfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19ybXVsX18gY2FsbGVkIgotICAgIGRlZiBfX2ltdWxfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19pbXVsX18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICB4ID0gYXVnX3Rlc3QoMSkKKyAgICAgICAgeSA9IHgKKyAgICAgICAgeCArPSAxMAogCi0gICAgZGVmIF9fZmxvb3JkaXZfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19mbG9vcmRpdl9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKLSAgICBkZWYgX19pZmxvb3JkaXZfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19pZmxvb3JkaXZfXyBjYWxsZWQiCi0gICAgICAgIHJldHVybiBzZWxmCi0gICAgZGVmIF9fcmZsb29yZGl2X18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcmZsb29yZGl2X18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh4LCBhdWdfdGVzdCkpCisgICAgICAgIHNlbGYuYXNzZXJ0Xyh5IGlzIG5vdCB4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LnZhbCwgMTEpCiAKLSAgICBkZWYgX190cnVlZGl2X18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fdHJ1ZWRpdl9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKLSAgICBkZWYgX19pdHJ1ZWRpdl9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX2l0cnVlZGl2X18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgotICAgIGRlZiBfX3J0cnVlZGl2X18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcnRydWVkaXZfXyBjYWxsZWQiCi0gICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIHggPSBhdWdfdGVzdDIoMikKKyAgICAgICAgeSA9IHgKKyAgICAgICAgeCArPSAxMAogCi0gICAgZGVmIF9fbW9kX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fbW9kX18gY2FsbGVkIgotICAgIGRlZiBfX3Jtb2RfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19ybW9kX18gY2FsbGVkIgotICAgIGRlZiBfX2ltb2RfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19pbW9kX18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyB4KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh4LnZhbCwgMTIpCiAKLSAgICBkZWYgX19wb3dfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19wb3dfXyBjYWxsZWQiCi0gICAgZGVmIF9fcnBvd19fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX3Jwb3dfXyBjYWxsZWQiCi0gICAgZGVmIF9faXBvd19fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX2lwb3dfXyBjYWxsZWQiCi0gICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIHggPSBhdWdfdGVzdDMoMykKKyAgICAgICAgeSA9IHgKKyAgICAgICAgeCArPSAxMAogCi0gICAgZGVmIF9fb3JfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19vcl9fIGNhbGxlZCIKLSAgICBkZWYgX19yb3JfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19yb3JfXyBjYWxsZWQiCi0gICAgZGVmIF9faW9yX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9faW9yX18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh4LCBhdWdfdGVzdDMpKQorICAgICAgICBzZWxmLmFzc2VydF8oeSBpcyBub3QgeCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoeC52YWwsIDEzKQogCi0gICAgZGVmIF9fYW5kX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fYW5kX18gY2FsbGVkIgotICAgIGRlZiBfX3JhbmRfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19yYW5kX18gY2FsbGVkIgotICAgIGRlZiBfX2lhbmRfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19pYW5kX18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgogCi0gICAgZGVmIF9feG9yX18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9feG9yX18gY2FsbGVkIgotICAgIGRlZiBfX3J4b3JfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19yeG9yX18gY2FsbGVkIgotICAgIGRlZiBfX2l4b3JfXyhzZWxmLCB2YWwpOgotICAgICAgICBwcmludCAiX19peG9yX18gY2FsbGVkIgotICAgICAgICByZXR1cm4gc2VsZgorICAgIGRlZiB0ZXN0Q3VzdG9tTWV0aG9kczIodGVzdF9zZWxmKToKKyAgICAgICAgb3V0cHV0ID0gW10KIAotICAgIGRlZiBfX3JzaGlmdF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX3JzaGlmdF9fIGNhbGxlZCIKLSAgICBkZWYgX19ycnNoaWZ0X18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcnJzaGlmdF9fIGNhbGxlZCIKLSAgICBkZWYgX19pcnNoaWZ0X18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9faXJzaGlmdF9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgY2xhc3MgdGVzdGFsbDoKKyAgICAgICAgICAgIGRlZiBfX2FkZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19hZGRfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcmFkZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yYWRkX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lhZGRfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faWFkZF9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAotICAgIGRlZiBfX2xzaGlmdF9fKHNlbGYsIHZhbCk6Ci0gICAgICAgIHByaW50ICJfX2xzaGlmdF9fIGNhbGxlZCIKLSAgICBkZWYgX19ybHNoaWZ0X18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9fcmxzaGlmdF9fIGNhbGxlZCIKLSAgICBkZWYgX19pbHNoaWZ0X18oc2VsZiwgdmFsKToKLSAgICAgICAgcHJpbnQgIl9faWxzaGlmdF9fIGNhbGxlZCIKLSAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgIGRlZiBfX3N1Yl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19zdWJfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcnN1Yl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yc3ViX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lzdWJfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faXN1Yl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCA9IHRlc3RhbGwoKQoteCArIDEKLTEgKyB4Ci14ICs9IDEKKyAgICAgICAgICAgIGRlZiBfX211bF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19tdWxfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcm11bF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19ybXVsX18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2ltdWxfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faW11bF9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCAtIDEKLTEgLSB4Ci14IC09IDEKKyAgICAgICAgICAgIGRlZiBfX2Rpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19kaXZfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcmRpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yZGl2X18gY2FsbGVkIikKKyAgICAgICAgICAgIGRlZiBfX2lkaXZfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faWRpdl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKIAoteCAqIDEKLTEgKiB4Ci14ICo9IDEKKyAgICAgICAgICAgIGRlZiBfX2Zsb29yZGl2X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2Zsb29yZGl2X18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICAgICAgZGVmIF9faWZsb29yZGl2X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2lmbG9vcmRpdl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgIGRlZiBfX3JmbG9vcmRpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19yZmxvb3JkaXZfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCiAKLXggLyAxCi0xIC8geAoteCAvPSAxCisgICAgICAgICAgICBkZWYgX190cnVlZGl2X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3RydWVkaXZfXyBjYWxsZWQiKQorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgICAgICBkZWYgX19ydHJ1ZWRpdl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19ydHJ1ZWRpdl9fIGNhbGxlZCIpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYKKyAgICAgICAgICAgIGRlZiBfX2l0cnVlZGl2X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2l0cnVlZGl2X18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi14IC8vIDEKLTEgLy8geAoteCAvLz0gMQorICAgICAgICAgICAgZGVmIF9fbW9kX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX21vZF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19ybW9kX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3Jtb2RfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9faW1vZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19pbW9kX18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi14ICUgMQotMSAlIHgKLXggJT0gMQorICAgICAgICAgICAgZGVmIF9fcG93X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3Bvd19fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19ycG93X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3Jwb3dfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9faXBvd19fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19pcG93X18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi14ICoqIDEKLTEgKiogeAoteCAqKj0gMQorICAgICAgICAgICAgZGVmIF9fb3JfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9fb3JfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9fcm9yX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3Jvcl9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19pb3JfXyhzZWxmLCB2YWwpOgorICAgICAgICAgICAgICAgIG91dHB1dC5hcHBlbmQoIl9faW9yX18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi14IHwgMQotMSB8IHgKLXggfD0gMQorICAgICAgICAgICAgZGVmIF9fYW5kX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2FuZF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19yYW5kX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3JhbmRfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9faWFuZF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19pYW5kX18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi14ICYgMQotMSAmIHgKLXggJj0gMQorICAgICAgICAgICAgZGVmIF9feG9yX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3hvcl9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19yeG9yX18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3J4b3JfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9faXhvcl9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19peG9yX18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi14IF4gMQotMSBeIHgKLXggXj0gMQorICAgICAgICAgICAgZGVmIF9fcnNoaWZ0X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3JzaGlmdF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19ycnNoaWZ0X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3Jyc2hpZnRfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9faXJzaGlmdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19pcnNoaWZ0X18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi14ID4+IDEKLTEgPj4geAoteCA+Pj0gMQorICAgICAgICAgICAgZGVmIF9fbHNoaWZ0X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX2xzaGlmdF9fIGNhbGxlZCIpCisgICAgICAgICAgICBkZWYgX19ybHNoaWZ0X18oc2VsZiwgdmFsKToKKyAgICAgICAgICAgICAgICBvdXRwdXQuYXBwZW5kKCJfX3Jsc2hpZnRfXyBjYWxsZWQiKQorICAgICAgICAgICAgZGVmIF9faWxzaGlmdF9fKHNlbGYsIHZhbCk6CisgICAgICAgICAgICAgICAgb3V0cHV0LmFwcGVuZCgiX19pbHNoaWZ0X18gY2FsbGVkIikKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgogCi14IDw8IDEKLTEgPDwgeAoteCA8PD0gMQorICAgICAgICB4ID0gdGVzdGFsbCgpCisgICAgICAgIHggKyAxCisgICAgICAgIDEgKyB4CisgICAgICAgIHggKz0gMQorCisgICAgICAgIHggLSAxCisgICAgICAgIDEgLSB4CisgICAgICAgIHggLT0gMQorCisgICAgICAgIHggKiAxCisgICAgICAgIDEgKiB4CisgICAgICAgIHggKj0gMQorCisgICAgICAgIHggLyAxCisgICAgICAgIDEgLyB4CisgICAgICAgIHggLz0gMQorCisgICAgICAgIHggLy8gMQorICAgICAgICAxIC8vIHgKKyAgICAgICAgeCAvLz0gMQorCisgICAgICAgIHggJSAxCisgICAgICAgIDEgJSB4CisgICAgICAgIHggJT0gMQorCisgICAgICAgIHggKiogMQorICAgICAgICAxICoqIHgKKyAgICAgICAgeCAqKj0gMQorCisgICAgICAgIHggfCAxCisgICAgICAgIDEgfCB4CisgICAgICAgIHggfD0gMQorCisgICAgICAgIHggJiAxCisgICAgICAgIDEgJiB4CisgICAgICAgIHggJj0gMQorCisgICAgICAgIHggXiAxCisgICAgICAgIDEgXiB4CisgICAgICAgIHggXj0gMQorCisgICAgICAgIHggPj4gMQorICAgICAgICAxID4+IHgKKyAgICAgICAgeCA+Pj0gMQorCisgICAgICAgIHggPDwgMQorICAgICAgICAxIDw8IHgKKyAgICAgICAgeCA8PD0gMQorCisgICAgICAgIHRlc3Rfc2VsZi5hc3NlcnRFcXVhbHMob3V0cHV0LCAnJydcCitfX2FkZF9fIGNhbGxlZAorX19yYWRkX18gY2FsbGVkCitfX2lhZGRfXyBjYWxsZWQKK19fc3ViX18gY2FsbGVkCitfX3JzdWJfXyBjYWxsZWQKK19faXN1Yl9fIGNhbGxlZAorX19tdWxfXyBjYWxsZWQKK19fcm11bF9fIGNhbGxlZAorX19pbXVsX18gY2FsbGVkCitfX3RydWVkaXZfXyBjYWxsZWQKK19fcnRydWVkaXZfXyBjYWxsZWQKK19faXRydWVkaXZfXyBjYWxsZWQKK19fZmxvb3JkaXZfXyBjYWxsZWQKK19fcmZsb29yZGl2X18gY2FsbGVkCitfX2lmbG9vcmRpdl9fIGNhbGxlZAorX19tb2RfXyBjYWxsZWQKK19fcm1vZF9fIGNhbGxlZAorX19pbW9kX18gY2FsbGVkCitfX3Bvd19fIGNhbGxlZAorX19ycG93X18gY2FsbGVkCitfX2lwb3dfXyBjYWxsZWQKK19fb3JfXyBjYWxsZWQKK19fcm9yX18gY2FsbGVkCitfX2lvcl9fIGNhbGxlZAorX19hbmRfXyBjYWxsZWQKK19fcmFuZF9fIGNhbGxlZAorX19pYW5kX18gY2FsbGVkCitfX3hvcl9fIGNhbGxlZAorX19yeG9yX18gY2FsbGVkCitfX2l4b3JfXyBjYWxsZWQKK19fcnNoaWZ0X18gY2FsbGVkCitfX3Jyc2hpZnRfXyBjYWxsZWQKK19faXJzaGlmdF9fIGNhbGxlZAorX19sc2hpZnRfXyBjYWxsZWQKK19fcmxzaGlmdF9fIGNhbGxlZAorX19pbHNoaWZ0X18gY2FsbGVkCisnJycuc3BsaXRsaW5lcygpKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEF1Z0Fzc2lnblRlc3QpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfYnNkZGIucHkgYi9MaWIvdGVzdC90ZXN0X2JzZGRiLnB5CmluZGV4IDFlYzQ4MDEuLjUxM2U1NDEgMTAwNzU1Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfYnNkZGIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9ic2RkYi5weQpAQCAtMTEsOSArMTEsMTAgQEAKIGZyb20gc2V0cyBpbXBvcnQgU2V0CiAKIGNsYXNzIFRlc3RCU0REQih1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgb3BlbmZsYWcgPSAnYycKIAogICAgIGRlZiBzZXRVcChzZWxmKToKLSAgICAgICAgc2VsZi5mID0gc2VsZi5vcGVubWV0aG9kWzBdKHNlbGYuZm5hbWUsICdjJykKKyAgICAgICAgc2VsZi5mID0gc2VsZi5vcGVubWV0aG9kWzBdKHNlbGYuZm5hbWUsIHNlbGYub3BlbmZsYWcsIGNhY2hlc2l6ZT0zMjc2OCkKICAgICAgICAgc2VsZi5kID0gZGljdChxPSdHdWlkbycsIHc9J3ZhbicsIGU9J1Jvc3N1bScsIHI9J2ludmVudGVkJywgdD0nUHl0aG9uJywgeT0nJykKICAgICAgICAgZm9yIGssIHYgaW4gc2VsZi5kLml0ZXJpdGVtcygpOgogICAgICAgICAgICAgc2VsZi5mW2tdID0gdgpAQCAtMjY3LDYgKzI2OCwxMSBAQAogICAgIGZuYW1lID0gTm9uZQogICAgIG9wZW5tZXRob2QgPSBbYnNkZGIuYnRvcGVuXQogCitjbGFzcyBUZXN0QlRyZWVfSW5NZW1vcnlfVHJ1bmNhdGUoVGVzdEJTRERCKToKKyAgICBmbmFtZSA9IE5vbmUKKyAgICBvcGVuZmxhZyA9ICduJworICAgIG9wZW5tZXRob2QgPSBbYnNkZGIuYnRvcGVuXQorCiBjbGFzcyBUZXN0SGFzaFRhYmxlKFRlc3RCU0REQik6CiAgICAgZm5hbWUgPSB0ZXN0X3N1cHBvcnQuVEVTVEZOCiAgICAgb3Blbm1ldGhvZCA9IFtic2RkYi5oYXNob3Blbl0KQEAgLTI4NSw2ICsyOTEsNyBAQAogICAgICAgICBUZXN0SGFzaFRhYmxlLAogICAgICAgICBUZXN0QlRyZWVfSW5NZW1vcnksCiAgICAgICAgIFRlc3RIYXNoVGFibGVfSW5NZW1vcnksCisgICAgICAgIFRlc3RCVHJlZV9Jbk1lbW9yeV9UcnVuY2F0ZSwKICAgICApCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkgYi9MaWIvdGVzdC90ZXN0X2J1aWx0aW4ucHkKaW5kZXggNmYxMWZkZC4uZWY0ZjQwNyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9idWlsdGluLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfYnVpbHRpbi5weQpAQCAtMTA4LDYgKzEwOCw3IEBACiAgICAgICAgIF9faW1wb3J0X18oJ3N0cmluZycpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEltcG9ydEVycm9yLCBfX2ltcG9ydF9fLCAnc3BhbXNwYW0nKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIF9faW1wb3J0X18sIDEsIDIsIDMsIDQpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIF9faW1wb3J0X18sICcnKQogCiAgICAgZGVmIHRlc3RfYWJzKHNlbGYpOgogICAgICAgICAjIGludApAQCAtMTMxNyw2ICsxMzE4LDkgQEAKIAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJvdW5kKC04LjAsIC0xKSwgLTEwLjApCiAKKyAgICAgICAgIyB0ZXN0IG5ldyBrd2FyZ3MKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyb3VuZChudW1iZXI9LTguMCwgbmRpZ2l0cz0tMSksIC0xMC4wKQorCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcm91bmQpCiAKICAgICBkZWYgdGVzdF9zZXRhdHRyKHNlbGYpOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jYWxlbmRhci5weSBiL0xpYi90ZXN0L3Rlc3RfY2FsZW5kYXIucHkKaW5kZXggMzRkMzY1Yi4uZTQxNDMyNCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jYWxlbmRhci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NhbGVuZGFyLnB5CkBAIC00LDYgKzQsMjAyIEBACiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCiAKK3Jlc3VsdF8yMDA0X3RleHQgPSAiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDA0CisKKyAgICAgIEphbnVhcnkgICAgICAgICAgICAgICAgICAgRmVicnVhcnkgICAgICAgICAgICAgICAgICAgTWFyY2gKK01vIFR1IFdlIFRoIEZyIFNhIFN1ICAgICAgTW8gVHUgV2UgVGggRnIgU2EgU3UgICAgICBNbyBUdSBXZSBUaCBGciBTYSBTdQorICAgICAgICAgIDEgIDIgIDMgIDQgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAxICAyICAzICA0ICA1ICA2ICA3CisgNSAgNiAgNyAgOCAgOSAxMCAxMSAgICAgICAyICAzICA0ICA1ICA2ICA3ICA4ICAgICAgIDggIDkgMTAgMTEgMTIgMTMgMTQKKzEyIDEzIDE0IDE1IDE2IDE3IDE4ICAgICAgIDkgMTAgMTEgMTIgMTMgMTQgMTUgICAgICAxNSAxNiAxNyAxOCAxOSAyMCAyMQorMTkgMjAgMjEgMjIgMjMgMjQgMjUgICAgICAxNiAxNyAxOCAxOSAyMCAyMSAyMiAgICAgIDIyIDIzIDI0IDI1IDI2IDI3IDI4CisyNiAyNyAyOCAyOSAzMCAzMSAgICAgICAgIDIzIDI0IDI1IDI2IDI3IDI4IDI5ICAgICAgMjkgMzAgMzEKKworICAgICAgIEFwcmlsICAgICAgICAgICAgICAgICAgICAgIE1heSAgICAgICAgICAgICAgICAgICAgICAgSnVuZQorTW8gVHUgV2UgVGggRnIgU2EgU3UgICAgICBNbyBUdSBXZSBUaCBGciBTYSBTdSAgICAgIE1vIFR1IFdlIFRoIEZyIFNhIFN1CisgICAgICAgICAgMSAgMiAgMyAgNCAgICAgICAgICAgICAgICAgICAgICAxICAyICAgICAgICAgIDEgIDIgIDMgIDQgIDUgIDYKKyA1ICA2ICA3ICA4ICA5IDEwIDExICAgICAgIDMgIDQgIDUgIDYgIDcgIDggIDkgICAgICAgNyAgOCAgOSAxMCAxMSAxMiAxMworMTIgMTMgMTQgMTUgMTYgMTcgMTggICAgICAxMCAxMSAxMiAxMyAxNCAxNSAxNiAgICAgIDE0IDE1IDE2IDE3IDE4IDE5IDIwCisxOSAyMCAyMSAyMiAyMyAyNCAyNSAgICAgIDE3IDE4IDE5IDIwIDIxIDIyIDIzICAgICAgMjEgMjIgMjMgMjQgMjUgMjYgMjcKKzI2IDI3IDI4IDI5IDMwICAgICAgICAgICAgMjQgMjUgMjYgMjcgMjggMjkgMzAgICAgICAyOCAyOSAzMAorICAgICAgICAgICAgICAgICAgICAgICAgICAzMQorCisgICAgICAgIEp1bHkgICAgICAgICAgICAgICAgICAgICBBdWd1c3QgICAgICAgICAgICAgICAgICBTZXB0ZW1iZXIKK01vIFR1IFdlIFRoIEZyIFNhIFN1ICAgICAgTW8gVHUgV2UgVGggRnIgU2EgU3UgICAgICBNbyBUdSBXZSBUaCBGciBTYSBTdQorICAgICAgICAgIDEgIDIgIDMgIDQgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgICAgICAxICAyICAzICA0ICA1CisgNSAgNiAgNyAgOCAgOSAxMCAxMSAgICAgICAyICAzICA0ICA1ICA2ICA3ICA4ICAgICAgIDYgIDcgIDggIDkgMTAgMTEgMTIKKzEyIDEzIDE0IDE1IDE2IDE3IDE4ICAgICAgIDkgMTAgMTEgMTIgMTMgMTQgMTUgICAgICAxMyAxNCAxNSAxNiAxNyAxOCAxOQorMTkgMjAgMjEgMjIgMjMgMjQgMjUgICAgICAxNiAxNyAxOCAxOSAyMCAyMSAyMiAgICAgIDIwIDIxIDIyIDIzIDI0IDI1IDI2CisyNiAyNyAyOCAyOSAzMCAzMSAgICAgICAgIDIzIDI0IDI1IDI2IDI3IDI4IDI5ICAgICAgMjcgMjggMjkgMzAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMzAgMzEKKworICAgICAgT2N0b2JlciAgICAgICAgICAgICAgICAgICBOb3ZlbWJlciAgICAgICAgICAgICAgICAgIERlY2VtYmVyCitNbyBUdSBXZSBUaCBGciBTYSBTdSAgICAgIE1vIFR1IFdlIFRoIEZyIFNhIFN1ICAgICAgTW8gVHUgV2UgVGggRnIgU2EgU3UKKyAgICAgICAgICAgICAxICAyICAzICAgICAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgICAgICAgICAgICAgMSAgMiAgMyAgNCAgNQorIDQgIDUgIDYgIDcgIDggIDkgMTAgICAgICAgOCAgOSAxMCAxMSAxMiAxMyAxNCAgICAgICA2ICA3ICA4ICA5IDEwIDExIDEyCisxMSAxMiAxMyAxNCAxNSAxNiAxNyAgICAgIDE1IDE2IDE3IDE4IDE5IDIwIDIxICAgICAgMTMgMTQgMTUgMTYgMTcgMTggMTkKKzE4IDE5IDIwIDIxIDIyIDIzIDI0ICAgICAgMjIgMjMgMjQgMjUgMjYgMjcgMjggICAgICAyMCAyMSAyMiAyMyAyNCAyNSAyNgorMjUgMjYgMjcgMjggMjkgMzAgMzEgICAgICAyOSAzMCAgICAgICAgICAgICAgICAgICAgIDI3IDI4IDI5IDMwIDMxCisiIiIKKworcmVzdWx0XzIwMDRfaHRtbCA9ICIiIgorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iYXNjaWkiPz4KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KKzxodG1sPgorPGhlYWQ+Cis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1hc2NpaSIgLz4KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9ImNhbGVuZGFyLmNzcyIgLz4KKzx0aXRsZT5DYWxlbmRhciBmb3IgMjAwNDwvdGl0bGUKKzwvaGVhZD4KKzxib2R5PgorPHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ieWVhciI+Cis8dHI+PHRoIGNvbHNwYW49IjMiIGNsYXNzPSJ5ZWFyIj4yMDA0PC90aD48L3RyPjx0cj48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPkphbnVhcnk8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9InRodSI+MTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4zPC90ZD48dGQgY2xhc3M9InN1biI+NDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+NTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjY8L3RkPjx0ZCBjbGFzcz0id2VkIj43PC90ZD48dGQgY2xhc3M9InRodSI+ODwvdGQ+PHRkIGNsYXNzPSJmcmkiPjk8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xMDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjExPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xMjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjEzPC90ZD48dGQgY2xhc3M9IndlZCI+MTQ8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xNTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE2PC90ZD48dGQgY2xhc3M9InNhdCI+MTc8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xODwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTk8L3RkPjx0ZCBjbGFzcz0idHVlIj4yMDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjIxPC90ZD48dGQgY2xhc3M9InRodSI+MjI8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yMzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI0PC90ZD48dGQgY2xhc3M9InN1biI+MjU8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI2PC90ZD48dGQgY2xhc3M9InR1ZSI+Mjc8L3RkPjx0ZCBjbGFzcz0id2VkIj4yODwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI5PC90ZD48dGQgY2xhc3M9ImZyaSI+MzA8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4zMTwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5GZWJydWFyeTwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yPC90ZD48dGQgY2xhc3M9InR1ZSI+MzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjQ8L3RkPjx0ZCBjbGFzcz0idGh1Ij41PC90ZD48dGQgY2xhc3M9ImZyaSI+NjwvdGQ+PHRkIGNsYXNzPSJzYXQiPjc8L3RkPjx0ZCBjbGFzcz0ic3VuIj44PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj45PC90ZD48dGQgY2xhc3M9InR1ZSI+MTA8L3RkPjx0ZCBjbGFzcz0id2VkIj4xMTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjEyPC90ZD48dGQgY2xhc3M9ImZyaSI+MTM8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xNDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE1PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xNjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjE3PC90ZD48dGQgY2xhc3M9IndlZCI+MTg8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xOTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjIwPC90ZD48dGQgY2xhc3M9InNhdCI+MjE8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yMjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjM8L3RkPjx0ZCBjbGFzcz0idHVlIj4yNDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjI1PC90ZD48dGQgY2xhc3M9InRodSI+MjY8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yNzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI4PC90ZD48dGQgY2xhc3M9InN1biI+Mjk8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPk1hcmNoPC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE8L3RkPjx0ZCBjbGFzcz0idHVlIj4yPC90ZD48dGQgY2xhc3M9IndlZCI+MzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjQ8L3RkPjx0ZCBjbGFzcz0iZnJpIj41PC90ZD48dGQgY2xhc3M9InNhdCI+NjwvdGQ+PHRkIGNsYXNzPSJzdW4iPjc8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjg8L3RkPjx0ZCBjbGFzcz0idHVlIj45PC90ZD48dGQgY2xhc3M9IndlZCI+MTA8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xMTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjEyPC90ZD48dGQgY2xhc3M9InNhdCI+MTM8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xNDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTU8L3RkPjx0ZCBjbGFzcz0idHVlIj4xNjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE3PC90ZD48dGQgY2xhc3M9InRodSI+MTg8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xOTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjIwPC90ZD48dGQgY2xhc3M9InN1biI+MjE8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjIyPC90ZD48dGQgY2xhc3M9InR1ZSI+MjM8L3RkPjx0ZCBjbGFzcz0id2VkIj4yNDwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI1PC90ZD48dGQgY2xhc3M9ImZyaSI+MjY8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yNzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI4PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yOTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjMwPC90ZD48dGQgY2xhc3M9IndlZCI+MzE8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjwvdHI+PHRyPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+QXByaWw8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9InRodSI+MTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4zPC90ZD48dGQgY2xhc3M9InN1biI+NDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+NTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjY8L3RkPjx0ZCBjbGFzcz0id2VkIj43PC90ZD48dGQgY2xhc3M9InRodSI+ODwvdGQ+PHRkIGNsYXNzPSJmcmkiPjk8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xMDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjExPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xMjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjEzPC90ZD48dGQgY2xhc3M9IndlZCI+MTQ8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xNTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE2PC90ZD48dGQgY2xhc3M9InNhdCI+MTc8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xODwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTk8L3RkPjx0ZCBjbGFzcz0idHVlIj4yMDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjIxPC90ZD48dGQgY2xhc3M9InRodSI+MjI8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yMzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI0PC90ZD48dGQgY2xhc3M9InN1biI+MjU8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI2PC90ZD48dGQgY2xhc3M9InR1ZSI+Mjc8L3RkPjx0ZCBjbGFzcz0id2VkIj4yODwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI5PC90ZD48dGQgY2xhc3M9ImZyaSI+MzA8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5NYXk8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4zPC90ZD48dGQgY2xhc3M9InR1ZSI+NDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjU8L3RkPjx0ZCBjbGFzcz0idGh1Ij42PC90ZD48dGQgY2xhc3M9ImZyaSI+NzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjg8L3RkPjx0ZCBjbGFzcz0ic3VuIj45PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xMDwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjExPC90ZD48dGQgY2xhc3M9IndlZCI+MTI8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xMzwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE0PC90ZD48dGQgY2xhc3M9InNhdCI+MTU8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xNjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTc8L3RkPjx0ZCBjbGFzcz0idHVlIj4xODwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE5PC90ZD48dGQgY2xhc3M9InRodSI+MjA8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yMTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjIyPC90ZD48dGQgY2xhc3M9InN1biI+MjM8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI0PC90ZD48dGQgY2xhc3M9InR1ZSI+MjU8L3RkPjx0ZCBjbGFzcz0id2VkIj4yNjwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI3PC90ZD48dGQgY2xhc3M9ImZyaSI+Mjg8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yOTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjMwPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4zMTwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+SnVuZTwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjE8L3RkPjx0ZCBjbGFzcz0id2VkIj4yPC90ZD48dGQgY2xhc3M9InRodSI+MzwvdGQ+PHRkIGNsYXNzPSJmcmkiPjQ8L3RkPjx0ZCBjbGFzcz0ic2F0Ij41PC90ZD48dGQgY2xhc3M9InN1biI+NjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+NzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjg8L3RkPjx0ZCBjbGFzcz0id2VkIj45PC90ZD48dGQgY2xhc3M9InRodSI+MTA8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xMTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjEyPC90ZD48dGQgY2xhc3M9InN1biI+MTM8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE0PC90ZD48dGQgY2xhc3M9InR1ZSI+MTU8L3RkPjx0ZCBjbGFzcz0id2VkIj4xNjwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE3PC90ZD48dGQgY2xhc3M9ImZyaSI+MTg8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xOTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjIwPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yMTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjIyPC90ZD48dGQgY2xhc3M9IndlZCI+MjM8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yNDwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI1PC90ZD48dGQgY2xhc3M9InNhdCI+MjY8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yNzwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+Mjg8L3RkPjx0ZCBjbGFzcz0idHVlIj4yOTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjMwPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48L3RyPjx0cj48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPkp1bHk8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9InRodSI+MTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjI8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4zPC90ZD48dGQgY2xhc3M9InN1biI+NDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+NTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjY8L3RkPjx0ZCBjbGFzcz0id2VkIj43PC90ZD48dGQgY2xhc3M9InRodSI+ODwvdGQ+PHRkIGNsYXNzPSJmcmkiPjk8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xMDwvdGQ+PHRkIGNsYXNzPSJzdW4iPjExPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xMjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjEzPC90ZD48dGQgY2xhc3M9IndlZCI+MTQ8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xNTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE2PC90ZD48dGQgY2xhc3M9InNhdCI+MTc8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xODwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTk8L3RkPjx0ZCBjbGFzcz0idHVlIj4yMDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjIxPC90ZD48dGQgY2xhc3M9InRodSI+MjI8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yMzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI0PC90ZD48dGQgY2xhc3M9InN1biI+MjU8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI2PC90ZD48dGQgY2xhc3M9InR1ZSI+Mjc8L3RkPjx0ZCBjbGFzcz0id2VkIj4yODwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI5PC90ZD48dGQgY2xhc3M9ImZyaSI+MzA8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4zMTwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PHRkPjx0YWJsZSBib3JkZXI9IjAiIGNlbGxwYWRkaW5nPSIwIiBjZWxsc3BhY2luZz0iMCIgY2xhc3M9Im1vbnRoIj4KKzx0cj48dGggY29sc3Bhbj0iNyIgY2xhc3M9Im1vbnRoIj5BdWd1c3Q8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9InN1biI+MTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjM8L3RkPjx0ZCBjbGFzcz0id2VkIj40PC90ZD48dGQgY2xhc3M9InRodSI+NTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjY8L3RkPjx0ZCBjbGFzcz0ic2F0Ij43PC90ZD48dGQgY2xhc3M9InN1biI+ODwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+OTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjEwPC90ZD48dGQgY2xhc3M9IndlZCI+MTE8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xMjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjEzPC90ZD48dGQgY2xhc3M9InNhdCI+MTQ8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xNTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTY8L3RkPjx0ZCBjbGFzcz0idHVlIj4xNzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE4PC90ZD48dGQgY2xhc3M9InRodSI+MTk8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yMDwvdGQ+PHRkIGNsYXNzPSJzYXQiPjIxPC90ZD48dGQgY2xhc3M9InN1biI+MjI8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjIzPC90ZD48dGQgY2xhc3M9InR1ZSI+MjQ8L3RkPjx0ZCBjbGFzcz0id2VkIj4yNTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI2PC90ZD48dGQgY2xhc3M9ImZyaSI+Mjc8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yODwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI5PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4zMDwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjMxPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+U2VwdGVtYmVyPC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0id2VkIj4xPC90ZD48dGQgY2xhc3M9InRodSI+MjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjM8L3RkPjx0ZCBjbGFzcz0ic2F0Ij40PC90ZD48dGQgY2xhc3M9InN1biI+NTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+NjwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjc8L3RkPjx0ZCBjbGFzcz0id2VkIj44PC90ZD48dGQgY2xhc3M9InRodSI+OTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjEwPC90ZD48dGQgY2xhc3M9InNhdCI+MTE8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xMjwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTM8L3RkPjx0ZCBjbGFzcz0idHVlIj4xNDwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE1PC90ZD48dGQgY2xhc3M9InRodSI+MTY8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xNzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjE4PC90ZD48dGQgY2xhc3M9InN1biI+MTk8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjIwPC90ZD48dGQgY2xhc3M9InR1ZSI+MjE8L3RkPjx0ZCBjbGFzcz0id2VkIj4yMjwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjIzPC90ZD48dGQgY2xhc3M9ImZyaSI+MjQ8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yNTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI2PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yNzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjI4PC90ZD48dGQgY2xhc3M9IndlZCI+Mjk8L3RkPjx0ZCBjbGFzcz0idGh1Ij4zMDwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjwvdHI+PHRyPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+T2N0b2JlcjwvdGg+PC90cj4KKzx0cj48dGggY2xhc3M9Im1vbiI+TW9uPC90aD48dGggY2xhc3M9InR1ZSI+VHVlPC90aD48dGggY2xhc3M9IndlZCI+V2VkPC90aD48dGggY2xhc3M9InRodSI+VGh1PC90aD48dGggY2xhc3M9ImZyaSI+RnJpPC90aD48dGggY2xhc3M9InNhdCI+U2F0PC90aD48dGggY2xhc3M9InN1biI+U3VuPC90aD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yPC90ZD48dGQgY2xhc3M9InN1biI+MzwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+NDwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjU8L3RkPjx0ZCBjbGFzcz0id2VkIj42PC90ZD48dGQgY2xhc3M9InRodSI+NzwvdGQ+PHRkIGNsYXNzPSJmcmkiPjg8L3RkPjx0ZCBjbGFzcz0ic2F0Ij45PC90ZD48dGQgY2xhc3M9InN1biI+MTA8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjExPC90ZD48dGQgY2xhc3M9InR1ZSI+MTI8L3RkPjx0ZCBjbGFzcz0id2VkIj4xMzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjE0PC90ZD48dGQgY2xhc3M9ImZyaSI+MTU8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xNjwvdGQ+PHRkIGNsYXNzPSJzdW4iPjE3PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xODwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjE5PC90ZD48dGQgY2xhc3M9IndlZCI+MjA8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yMTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjIyPC90ZD48dGQgY2xhc3M9InNhdCI+MjM8L3RkPjx0ZCBjbGFzcz0ic3VuIj4yNDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjU8L3RkPjx0ZCBjbGFzcz0idHVlIj4yNjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjI3PC90ZD48dGQgY2xhc3M9InRodSI+Mjg8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yOTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjMwPC90ZD48dGQgY2xhc3M9InN1biI+MzE8L3RkPjwvdHI+Cis8L3RhYmxlPgorPC90ZD48dGQ+PHRhYmxlIGJvcmRlcj0iMCIgY2VsbHBhZGRpbmc9IjAiIGNlbGxzcGFjaW5nPSIwIiBjbGFzcz0ibW9udGgiPgorPHRyPjx0aCBjb2xzcGFuPSI3IiBjbGFzcz0ibW9udGgiPk5vdmVtYmVyPC90aD48L3RyPgorPHRyPjx0aCBjbGFzcz0ibW9uIj5Nb248L3RoPjx0aCBjbGFzcz0idHVlIj5UdWU8L3RoPjx0aCBjbGFzcz0id2VkIj5XZWQ8L3RoPjx0aCBjbGFzcz0idGh1Ij5UaHU8L3RoPjx0aCBjbGFzcz0iZnJpIj5Gcmk8L3RoPjx0aCBjbGFzcz0ic2F0Ij5TYXQ8L3RoPjx0aCBjbGFzcz0ic3VuIj5TdW48L3RoPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjE8L3RkPjx0ZCBjbGFzcz0idHVlIj4yPC90ZD48dGQgY2xhc3M9IndlZCI+MzwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjQ8L3RkPjx0ZCBjbGFzcz0iZnJpIj41PC90ZD48dGQgY2xhc3M9InNhdCI+NjwvdGQ+PHRkIGNsYXNzPSJzdW4iPjc8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjg8L3RkPjx0ZCBjbGFzcz0idHVlIj45PC90ZD48dGQgY2xhc3M9IndlZCI+MTA8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xMTwvdGQ+PHRkIGNsYXNzPSJmcmkiPjEyPC90ZD48dGQgY2xhc3M9InNhdCI+MTM8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xNDwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MTU8L3RkPjx0ZCBjbGFzcz0idHVlIj4xNjwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE3PC90ZD48dGQgY2xhc3M9InRodSI+MTg8L3RkPjx0ZCBjbGFzcz0iZnJpIj4xOTwvdGQ+PHRkIGNsYXNzPSJzYXQiPjIwPC90ZD48dGQgY2xhc3M9InN1biI+MjE8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjIyPC90ZD48dGQgY2xhc3M9InR1ZSI+MjM8L3RkPjx0ZCBjbGFzcz0id2VkIj4yNDwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjI1PC90ZD48dGQgY2xhc3M9ImZyaSI+MjY8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4yNzwvdGQ+PHRkIGNsYXNzPSJzdW4iPjI4PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4yOTwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjMwPC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PC90cj4KKzwvdGFibGU+Cis8L3RkPjx0ZD48dGFibGUgYm9yZGVyPSIwIiBjZWxscGFkZGluZz0iMCIgY2VsbHNwYWNpbmc9IjAiIGNsYXNzPSJtb250aCI+Cis8dHI+PHRoIGNvbHNwYW49IjciIGNsYXNzPSJtb250aCI+RGVjZW1iZXI8L3RoPjwvdHI+Cis8dHI+PHRoIGNsYXNzPSJtb24iPk1vbjwvdGg+PHRoIGNsYXNzPSJ0dWUiPlR1ZTwvdGg+PHRoIGNsYXNzPSJ3ZWQiPldlZDwvdGg+PHRoIGNsYXNzPSJ0aHUiPlRodTwvdGg+PHRoIGNsYXNzPSJmcmkiPkZyaTwvdGg+PHRoIGNsYXNzPSJzYXQiPlNhdDwvdGg+PHRoIGNsYXNzPSJzdW4iPlN1bjwvdGg+PC90cj4KKzx0cj48dGQgY2xhc3M9Im5vZGF5Ij4mbmJzcDs8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjE8L3RkPjx0ZCBjbGFzcz0idGh1Ij4yPC90ZD48dGQgY2xhc3M9ImZyaSI+MzwvdGQ+PHRkIGNsYXNzPSJzYXQiPjQ8L3RkPjx0ZCBjbGFzcz0ic3VuIj41PC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj42PC90ZD48dGQgY2xhc3M9InR1ZSI+NzwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjg8L3RkPjx0ZCBjbGFzcz0idGh1Ij45PC90ZD48dGQgY2xhc3M9ImZyaSI+MTA8L3RkPjx0ZCBjbGFzcz0ic2F0Ij4xMTwvdGQ+PHRkIGNsYXNzPSJzdW4iPjEyPC90ZD48L3RyPgorPHRyPjx0ZCBjbGFzcz0ibW9uIj4xMzwvdGQ+PHRkIGNsYXNzPSJ0dWUiPjE0PC90ZD48dGQgY2xhc3M9IndlZCI+MTU8L3RkPjx0ZCBjbGFzcz0idGh1Ij4xNjwvdGQ+PHRkIGNsYXNzPSJmcmkiPjE3PC90ZD48dGQgY2xhc3M9InNhdCI+MTg8L3RkPjx0ZCBjbGFzcz0ic3VuIj4xOTwvdGQ+PC90cj4KKzx0cj48dGQgY2xhc3M9Im1vbiI+MjA8L3RkPjx0ZCBjbGFzcz0idHVlIj4yMTwvdGQ+PHRkIGNsYXNzPSJ3ZWQiPjIyPC90ZD48dGQgY2xhc3M9InRodSI+MjM8L3RkPjx0ZCBjbGFzcz0iZnJpIj4yNDwvdGQ+PHRkIGNsYXNzPSJzYXQiPjI1PC90ZD48dGQgY2xhc3M9InN1biI+MjY8L3RkPjwvdHI+Cis8dHI+PHRkIGNsYXNzPSJtb24iPjI3PC90ZD48dGQgY2xhc3M9InR1ZSI+Mjg8L3RkPjx0ZCBjbGFzcz0id2VkIj4yOTwvdGQ+PHRkIGNsYXNzPSJ0aHUiPjMwPC90ZD48dGQgY2xhc3M9ImZyaSI+MzE8L3RkPjx0ZCBjbGFzcz0ibm9kYXkiPiZuYnNwOzwvdGQ+PHRkIGNsYXNzPSJub2RheSI+Jm5ic3A7PC90ZD48L3RyPgorPC90YWJsZT4KKzwvdGQ+PC90cj48L3RhYmxlPjwvYm9keT4KKzwvaHRtbD4KKyIiIgorCisKK2NsYXNzIE91dHB1dFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgbm9ybWFsaXplX2NhbGVuZGFyKHNlbGYsIHMpOgorICAgICAgICAjIEZpbHRlcnMgb3V0IGxvY2FsZSBkZXBlbmRhbnQgc3RyaW5ncworICAgICAgICBkZWYgbmVpdGhlcnNwYWNlbm9yZGlnaXQoYyk6CisgICAgICAgICAgICByZXR1cm4gbm90IGMuaXNzcGFjZSgpIGFuZCBub3QgYy5pc2RpZ2l0KCkKKworICAgICAgICBsaW5lcyA9IFtdCisgICAgICAgIGZvciBsaW5lIGluIHMuc3BsaXRsaW5lcyhGYWxzZSk6CisgICAgICAgICAgICAjIERyb3AgdGV4dHMsIGFzIHRoZXkgYXJlIGxvY2FsZSBkZXBlbmRlbnQKKyAgICAgICAgICAgIGlmIGxpbmUgYW5kIG5vdCBmaWx0ZXIobmVpdGhlcnNwYWNlbm9yZGlnaXQsIGxpbmUpOgorICAgICAgICAgICAgICAgIGxpbmVzLmFwcGVuZChsaW5lKQorICAgICAgICByZXR1cm4gbGluZXMKKworICAgIGRlZiB0ZXN0X291dHB1dChzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYubm9ybWFsaXplX2NhbGVuZGFyKGNhbGVuZGFyLmNhbGVuZGFyKDIwMDQpKSwKKyAgICAgICAgICAgIHNlbGYubm9ybWFsaXplX2NhbGVuZGFyKHJlc3VsdF8yMDA0X3RleHQpCisgICAgICAgICkKKworICAgIGRlZiB0ZXN0X291dHB1dF90ZXh0Y2FsZW5kYXIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgICAgICBjYWxlbmRhci5UZXh0Q2FsZW5kYXIoKS5mb3JtYXR5ZWFyKDIwMDQpLnN0cmlwKCksCisgICAgICAgICAgICByZXN1bHRfMjAwNF90ZXh0LnN0cmlwKCkKKyAgICAgICAgKQorCisgICAgZGVmIHRlc3Rfb3V0cHV0X2h0bWxjYWxlbmRhcihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIGNhbGVuZGFyLkhUTUxDYWxlbmRhcigpLmZvcm1hdHllYXJwYWdlKDIwMDQpLnN0cmlwKCksCisgICAgICAgICAgICByZXN1bHRfMjAwNF9odG1sLnN0cmlwKCkKKyAgICAgICAgKQorCisKIGNsYXNzIENhbGVuZGFyVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X2lzbGVhcChzZWxmKToKICAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCB0aGUgcmV0dXJuIGlzIHJpZ2h0IGZvciBhIGZldyB5ZWFycywgYW5kCkBAIC03Miw1NyArMjY4LDU3IEBACiAgICAgZmlyc3R3ZWVrZGF5ID0gY2FsZW5kYXIuTU9OREFZCiAKICAgICBkZWYgdGVzdF9mZWJydWFyeShzZWxmKToKLSAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvZiBtb25kYXkgKDcrNys3KzcgZGF5cykKKyAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBtb25kYXkgKDcrNys3KzcgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTk5LCAyLCAoNywgNywgNywgNykpCiAKLSAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvZiB0dWVzZGF5ICg2KzcrNys3KzEgZGF5cykKKyAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiB0dWVzZGF5ICg2KzcrNys3KzEgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygyMDA1LCAyLCAoNiwgNywgNywgNywgMSkpCiAKLSAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvZiBzdW5kYXkgKDErNys3KzcrNiBkYXlzKQorICAgICAgICAjIEEgMjgtZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIHN1bmRheSAoMSs3KzcrNys2IGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk4NywgMiwgKDEsIDcsIDcsIDcsIDYpKQogCi0gICAgICAgICMgQSAyOS1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb2YgbW9uZGF5ICg3KzcrNys3KzEgZGF5cykKKyAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvbiBtb25kYXkgKDcrNys3KzcrMSBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5ODgsIDIsICg3LCA3LCA3LCA3LCAxKSkKIAotICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9mIHR1ZXNkYXkgKDYrNys3KzcrMiBkYXlzKQorICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIHR1ZXNkYXkgKDYrNys3KzcrMiBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NzIsIDIsICg2LCA3LCA3LCA3LCAyKSkKIAotICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9mIHN1bmRheSAoMSs3KzcrNys3IGRheXMpCisgICAgICAgICMgQSAyOS1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gc3VuZGF5ICgxKzcrNys3KzcgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygyMDA0LCAyLCAoMSwgNywgNywgNywgNykpCiAKICAgICBkZWYgdGVzdF9hcHJpbChzZWxmKToKLSAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvZiBtb25kYXkgKDcrNys3KzcrMiBkYXlzKQorICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIG1vbmRheSAoNys3KzcrNysyIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTkzNSwgNCwgKDcsIDcsIDcsIDcsIDIpKQogCi0gICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb2YgdHVlc2RheSAoNis3KzcrNyszIGRheXMpCisgICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb24gdHVlc2RheSAoNis3KzcrNyszIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk3NSwgNCwgKDYsIDcsIDcsIDcsIDMpKQogCi0gICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb2Ygc3VuZGF5ICgxKzcrNys3KzcrMSBkYXlzKQorICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIHN1bmRheSAoMSs3KzcrNys3KzEgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTQ1LCA0LCAoMSwgNywgNywgNywgNywgMSkpCiAKLSAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvZiBzYXR1cmRheSAoMis3KzcrNys3IGRheXMpCisgICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb24gc2F0dXJkYXkgKDIrNys3KzcrNyBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5OTUsIDQsICgyLCA3LCA3LCA3LCA3KSkKIAotICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9mIGZyaWRheSAoMys3KzcrNys2IGRheXMpCisgICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb24gZnJpZGF5ICgzKzcrNys3KzYgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTk0LCA0LCAoMywgNywgNywgNywgNikpCiAKICAgICBkZWYgdGVzdF9kZWNlbWJlcihzZWxmKToKLSAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvZiBtb25kYXkgKDcrNys3KzcrMyBkYXlzKQorICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIG1vbmRheSAoNys3KzcrNyszIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk4MCwgMTIsICg3LCA3LCA3LCA3LCAzKSkKIAotICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9mIHR1ZXNkYXkgKDYrNys3KzcrNCBkYXlzKQorICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIHR1ZXNkYXkgKDYrNys3KzcrNCBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5ODcsIDEyLCAoNiwgNywgNywgNywgNCkpCiAKLSAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvZiBzdW5kYXkgKDErNys3KzcrNysyIGRheXMpCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gc3VuZGF5ICgxKzcrNys3KzcrMiBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NjgsIDEyLCAoMSwgNywgNywgNywgNywgMikpCiAKLSAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvZiB0aHVyc2RheSAoNCs3KzcrNys2IGRheXMpCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gdGh1cnNkYXkgKDQrNys3KzcrNiBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5ODgsIDEyLCAoNCwgNywgNywgNywgNikpCiAKLSAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvZiBmcmlkYXkgKDMrNys3KzcrNyBkYXlzKQorICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIGZyaWRheSAoMys3KzcrNys3IGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMjAxNywgMTIsICgzLCA3LCA3LCA3LCA3KSkKIAotICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9mIHNhdHVyZGF5ICgyKzcrNys3KzcrMSBkYXlzKQorICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9uIHNhdHVyZGF5ICgyKzcrNys3KzcrMSBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDIwNjgsIDEyLCAoMiwgNywgNywgNywgNywgMSkpCiAKIApAQCAtMTMwLDYyICszMjYsNjMgQEAKICAgICBmaXJzdHdlZWtkYXkgPSBjYWxlbmRhci5TVU5EQVkKIAogICAgIGRlZiB0ZXN0X2ZlYnJ1YXJ5KHNlbGYpOgotICAgICAgICAjIEEgMjgtZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9mIHN1bmRheSAoNys3KzcrNyBkYXlzKQorICAgICAgICAjIEEgMjgtZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIHN1bmRheSAoNys3KzcrNyBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDIwMDksIDIsICg3LCA3LCA3LCA3KSkKIAotICAgICAgICAjIEEgMjgtZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9mIG1vbmRheSAoNis3KzcrNysxIGRheXMpCisgICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gbW9uZGF5ICg2KzcrNys3KzEgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTk5LCAyLCAoNiwgNywgNywgNywgMSkpCiAKLSAgICAgICAgIyBBIDI4LWRheSBmZWJydWFyeSBzdGFydGluZyBvZiBzYXR1cmRheSAoMSs3KzcrNys2IGRheXMpCisgICAgICAgICMgQSAyOC1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gc2F0dXJkYXkgKDErNys3KzcrNiBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5OTcsIDIsICgxLCA3LCA3LCA3LCA2KSkKIAotICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9mIHN1bmRheSAoNys3KzcrNysxIGRheXMpCisgICAgICAgICMgQSAyOS1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb24gc3VuZGF5ICg3KzcrNys3KzEgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygyMDA0LCAyLCAoNywgNywgNywgNywgMSkpCiAKLSAgICAgICAgIyBBIDI5LWRheSBmZWJydWFyeSBzdGFydGluZyBvZiBtb25kYXkgKDYrNys3KzcrMiBkYXlzKQorICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIG1vbmRheSAoNis3KzcrNysyIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTk2MCwgMiwgKDYsIDcsIDcsIDcsIDIpKQogCi0gICAgICAgICMgQSAyOS1kYXkgZmVicnVhcnkgc3RhcnRpbmcgb2Ygc2F0dXJkYXkgKDErNys3KzcrNyBkYXlzKQorICAgICAgICAjIEEgMjktZGF5IGZlYnJ1YXJ5IHN0YXJ0aW5nIG9uIHNhdHVyZGF5ICgxKzcrNys3KzcgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTY0LCAyLCAoMSwgNywgNywgNywgNykpCiAKICAgICBkZWYgdGVzdF9hcHJpbChzZWxmKToKLSAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvZiBzdW5kYXkgKDcrNys3KzcrMiBkYXlzKQorICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIHN1bmRheSAoNys3KzcrNysyIGRheXMpCiAgICAgICAgIHNlbGYuY2hlY2tfd2Vla3MoMTkyMywgNCwgKDcsIDcsIDcsIDcsIDIpKQogCi0gICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb2YgbW9uZGF5ICg2KzcrNys3KzMgZGF5cykKKyAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvbiBtb25kYXkgKDYrNys3KzcrMyBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5MTgsIDQsICg2LCA3LCA3LCA3LCAzKSkKIAotICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9mIHNhdHVyZGF5ICgxKzcrNys3KzcrMSBkYXlzKQorICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9uIHNhdHVyZGF5ICgxKzcrNys3KzcrMSBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NTAsIDQsICgxLCA3LCA3LCA3LCA3LCAxKSkKIAotICAgICAgICAjIEEgMzAtZGF5IGFwcmlsIHN0YXJ0aW5nIG9mIGZyaWRheSAoMis3KzcrNys3IGRheXMpCisgICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb24gZnJpZGF5ICgyKzcrNys3KzcgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTYwLCA0LCAoMiwgNywgNywgNywgNykpCiAKLSAgICAgICAgIyBBIDMwLWRheSBhcHJpbCBzdGFydGluZyBvZiB0aHVyc2RheSAoMys3KzcrNys2IGRheXMpCisgICAgICAgICMgQSAzMC1kYXkgYXByaWwgc3RhcnRpbmcgb24gdGh1cnNkYXkgKDMrNys3KzcrNiBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5MDksIDQsICgzLCA3LCA3LCA3LCA2KSkKIAogICAgIGRlZiB0ZXN0X2RlY2VtYmVyKHNlbGYpOgotICAgICAgICAjIEEgMzEtZGF5IGRlY2VtYmVyIHN0YXJ0aW5nIG9mIHN1bmRheSAoNys3KzcrNyszIGRheXMpCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gc3VuZGF5ICg3KzcrNys3KzMgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygyMDgwLCAxMiwgKDcsIDcsIDcsIDcsIDMpKQogCi0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2YgbW9uZGF5ICg2KzcrNys3KzQgZGF5cykKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiBtb25kYXkgKDYrNys3KzcrNCBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NDEsIDEyLCAoNiwgNywgNywgNywgNCkpCiAKLSAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvZiBzYXR1cmRheSAoMSs3KzcrNys3KzIgZGF5cykKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiBzYXR1cmRheSAoMSs3KzcrNys3KzIgZGF5cykKICAgICAgICAgc2VsZi5jaGVja193ZWVrcygxOTIzLCAxMiwgKDEsIDcsIDcsIDcsIDcsIDIpKQogCi0gICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb2Ygd2VkbmVzZGF5ICg0KzcrNys3KzYgZGF5cykKKyAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvbiB3ZWRuZXNkYXkgKDQrNys3KzcrNiBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5NDgsIDEyLCAoNCwgNywgNywgNywgNikpCiAKLSAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvZiB0aHVyc2RheSAoMys3KzcrNys3IGRheXMpCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gdGh1cnNkYXkgKDMrNys3KzcrNyBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5MjcsIDEyLCAoMywgNywgNywgNywgNykpCiAKLSAgICAgICAgIyBBIDMxLWRheSBkZWNlbWJlciBzdGFydGluZyBvZiBmcmlkYXkgKDIrNys3KzcrNysxIGRheXMpCisgICAgICAgICMgQSAzMS1kYXkgZGVjZW1iZXIgc3RhcnRpbmcgb24gZnJpZGF5ICgyKzcrNys3KzcrMSBkYXlzKQogICAgICAgICBzZWxmLmNoZWNrX3dlZWtzKDE5OTUsIDEyLCAoMiwgNywgNywgNywgNywgMSkpCiAKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCisgICAgICAgIE91dHB1dFRlc3RDYXNlLAogICAgICAgICBDYWxlbmRhclRlc3RDYXNlLAogICAgICAgICBNb25kYXlUZXN0Q2FzZSwKICAgICAgICAgU3VuZGF5VGVzdENhc2UKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY2FwaS5weSBiL0xpYi90ZXN0L3Rlc3RfY2FwaS5weQppbmRleCAxZGQyNDYxLi5jZGQ4NGJiIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NhcGkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jYXBpLnB5CkBAIC01LDQ0ICs1LDUxIEBACiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogaW1wb3J0IF90ZXN0Y2FwaQogCi1mb3IgbmFtZSBpbiBkaXIoX3Rlc3RjYXBpKToKLSAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJ3Rlc3RfJyk6Ci0gICAgICAgIHRlc3QgPSBnZXRhdHRyKF90ZXN0Y2FwaSwgbmFtZSkKK2RlZiB0ZXN0X21haW4oKToKKworICAgIGZvciBuYW1lIGluIGRpcihfdGVzdGNhcGkpOgorICAgICAgICBpZiBuYW1lLnN0YXJ0c3dpdGgoJ3Rlc3RfJyk6CisgICAgICAgICAgICB0ZXN0ID0gZ2V0YXR0cihfdGVzdGNhcGksIG5hbWUpCisgICAgICAgICAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKKyAgICAgICAgICAgICAgICBwcmludCAiaW50ZXJuYWwiLCBuYW1lCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdGVzdCgpCisgICAgICAgICAgICBleGNlcHQgX3Rlc3RjYXBpLmVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkLCBzeXMuZXhjX2luZm8oKVsxXQorCisgICAgIyBzb21lIGV4dHJhIHRocmVhZC1zdGF0ZSB0ZXN0cyBkcml2ZW4gdmlhIF90ZXN0Y2FwaQorICAgIGRlZiBUZXN0VGhyZWFkU3RhdGUoKToKKyAgICAgICAgaW1wb3J0IHRocmVhZAorICAgICAgICBpbXBvcnQgdGltZQorCiAgICAgICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgotICAgICAgICAgICAgcHJpbnQgImludGVybmFsIiwgbmFtZQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICB0ZXN0KCkKLSAgICAgICAgZXhjZXB0IF90ZXN0Y2FwaS5lcnJvcjoKLSAgICAgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkLCBzeXMuZXhjX2luZm8oKVsxXQorICAgICAgICAgICAgcHJpbnQgImF1dG8tdGhyZWFkLXN0YXRlIgogCi0jIHNvbWUgZXh0cmEgdGhyZWFkLXN0YXRlIHRlc3RzIGRyaXZlbiB2aWEgX3Rlc3RjYXBpCi1kZWYgVGVzdFRocmVhZFN0YXRlKCk6Ci0gICAgaW1wb3J0IHRocmVhZAotICAgIGltcG9ydCB0aW1lCisgICAgICAgIGlkZW50cyA9IFtdCiAKLSAgICBpZiB0ZXN0X3N1cHBvcnQudmVyYm9zZToKLSAgICAgICAgcHJpbnQgImF1dG8tdGhyZWFkLXN0YXRlIgorICAgICAgICBkZWYgY2FsbGJhY2soKToKKyAgICAgICAgICAgIGlkZW50cy5hcHBlbmQodGhyZWFkLmdldF9pZGVudCgpKQogCi0gICAgaWRlbnRzID0gW10KKyAgICAgICAgX3Rlc3RjYXBpLl90ZXN0X3RocmVhZF9zdGF0ZShjYWxsYmFjaykKKyAgICAgICAgYSA9IGIgPSBjYWxsYmFjaworICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgICAgICMgQ2hlY2sgb3VyIG1haW4gdGhyZWFkIGlzIGluIHRoZSBsaXN0IGV4YWN0bHkgMyB0aW1lcy4KKyAgICAgICAgaWYgaWRlbnRzLmNvdW50KHRocmVhZC5nZXRfaWRlbnQoKSkgIT0gMzoKKyAgICAgICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkLCBcCisgICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBtYWluIHRocmVhZCBjb3JyZWN0bHkgaW4gdGhlIGxpc3QiCiAKLSAgICBkZWYgY2FsbGJhY2soKToKLSAgICAgICAgaWRlbnRzLmFwcGVuZCh0aHJlYWQuZ2V0X2lkZW50KCkpCisgICAgdHJ5OgorICAgICAgICBfdGVzdGNhcGkuX3Rlc3RfdGhyZWFkX3N0YXRlCisgICAgICAgIGhhdmVfdGhyZWFkX3N0YXRlID0gVHJ1ZQorICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgaGF2ZV90aHJlYWRfc3RhdGUgPSBGYWxzZQogCi0gICAgX3Rlc3RjYXBpLl90ZXN0X3RocmVhZF9zdGF0ZShjYWxsYmFjaykKLSAgICB0aW1lLnNsZWVwKDEpCi0gICAgIyBDaGVjayBvdXIgbWFpbiB0aHJlYWQgaXMgaW4gdGhlIGxpc3QgZXhhY3RseSAzIHRpbWVzLgotICAgIGlmIGlkZW50cy5jb3VudCh0aHJlYWQuZ2V0X2lkZW50KCkpICE9IDM6Ci0gICAgICAgIHJhaXNlIHRlc3Rfc3VwcG9ydC5UZXN0RmFpbGVkLCBcCi0gICAgICAgICAgICAgICJDb3VsZG4ndCBmaW5kIG1haW4gdGhyZWFkIGNvcnJlY3RseSBpbiB0aGUgbGlzdCIKKyAgICBpZiBoYXZlX3RocmVhZF9zdGF0ZToKKyAgICAgICAgVGVzdFRocmVhZFN0YXRlKCkKKyAgICAgICAgaW1wb3J0IHRocmVhZGluZworICAgICAgICB0PXRocmVhZGluZy5UaHJlYWQodGFyZ2V0PVRlc3RUaHJlYWRTdGF0ZSkKKyAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHQuam9pbigpCiAKLXRyeToKLSAgICBfdGVzdGNhcGkuX3Rlc3RfdGhyZWFkX3N0YXRlCi0gICAgaGF2ZV90aHJlYWRfc3RhdGUgPSBUcnVlCi1leGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgaGF2ZV90aHJlYWRfc3RhdGUgPSBGYWxzZQotCi1pZiBoYXZlX3RocmVhZF9zdGF0ZToKLSAgICBUZXN0VGhyZWFkU3RhdGUoKQotICAgIGltcG9ydCB0aHJlYWRpbmcKLSAgICB0PXRocmVhZGluZy5UaHJlYWQodGFyZ2V0PVRlc3RUaHJlYWRTdGF0ZSkKLSAgICB0LnN0YXJ0KCkKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkgYi9MaWIvdGVzdC90ZXN0X2NtZF9saW5lLnB5CmluZGV4IGE0YTY1NmQuLjAxOGJlYzYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY21kX2xpbmUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jbWRfbGluZS5weQpAQCAtMTAsNiArMTAsOSBAQAogICAgICAgICBpbmZwLmNsb3NlKCkKICAgICAgICAgZGF0YSA9IG91dGZwLnJlYWQoKQogICAgICAgICBvdXRmcC5jbG9zZSgpCisgICAgICAgICMgdHJ5IHRvIGNsZWFudXAgdGhlIGNoaWxkIHNvIHdlIGRvbid0IGFwcGVhciB0byBsZWFrIHdoZW4gcnVubmluZworICAgICAgICAjIHdpdGggcmVncnRlc3QgLVIuICBUaGlzIHNob3VsZCBiZSBhIG5vLW9wIG9uIFdpbmRvd3MuCisgICAgICAgIHBvcGVuMi5fY2xlYW51cCgpCiAgICAgICAgIHJldHVybiBkYXRhCiAKICAgICBkZWYgZXhpdF9jb2RlKHNlbGYsIGNtZF9saW5lKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29kZWNzLnB5IGIvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKaW5kZXggOTEzYWE5MS4uNmVhNDljYyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb2RlY3MucHkKQEAgLTEsNyArMSw3IEBACiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgY29kZWNzCi1pbXBvcnQgc3lzLCBTdHJpbmdJTworaW1wb3J0IHN5cywgU3RyaW5nSU8sIF90ZXN0Y2FwaQogCiBjbGFzcyBRdWV1ZShvYmplY3QpOgogICAgICIiIgpAQCAtNzgxLDkgKzc4MSwxOCBAQAogICAgICAgICAgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24sZToKICAgICAgICAgICAgICAgICAgICAgcmFpc2UgdGVzdF9zdXBwb3J0LlRlc3RGYWlsZWQoIlRlc3QgMy4lZDogJXMiICUgKHBvcysxLCBzdHIoZSkpKQogCi1jbGFzcyBDb2RlY1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAgIGRlZiB0ZXN0X2J1aWx0aW4oc2VsZik6CitjbGFzcyBJRE5BQ29kZWNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9idWlsdGluX2RlY29kZShzZWxmKToKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModW5pY29kZSgicHl0aG9uLm9yZyIsICJpZG5hIiksIHUicHl0aG9uLm9yZyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHVuaWNvZGUoInB5dGhvbi5vcmcuIiwgImlkbmEiKSwgdSJweXRob24ub3JnLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHVuaWNvZGUoInhuLS1weXRobi1tdWEub3JnIiwgImlkbmEiKSwgdSJweXRoXHhmNm4ub3JnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModW5pY29kZSgieG4tLXB5dGhuLW11YS5vcmcuIiwgImlkbmEiKSwgdSJweXRoXHhmNm4ub3JnLiIpCisKKyAgICBkZWYgdGVzdF9idWlsdGluX2VuY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHModSJweXRob24ub3JnIi5lbmNvZGUoImlkbmEiKSwgInB5dGhvbi5vcmciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygicHl0aG9uLm9yZy4iLmVuY29kZSgiaWRuYSIpLCAicHl0aG9uLm9yZy4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh1InB5dGhceGY2bi5vcmciLmVuY29kZSgiaWRuYSIpLCAieG4tLXB5dGhuLW11YS5vcmciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh1InB5dGhceGY2bi5vcmcuIi5lbmNvZGUoImlkbmEiKSwgInhuLS1weXRobi1tdWEub3JnLiIpCiAKICAgICBkZWYgdGVzdF9zdHJlYW0oc2VsZik6CiAgICAgICAgIGltcG9ydCBTdHJpbmdJTwpAQCAtNzkxLDYgKzgwMCw2NCBAQAogICAgICAgICByLnJlYWQoMykKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoci5yZWFkKCksIHUiIikKIAorICAgIGRlZiB0ZXN0X2luY3JlbWVudGFsX2RlY29kZShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZGVjb2RlKCJweXRob24ub3JnIiwgImlkbmEiKSksCisgICAgICAgICAgICB1InB5dGhvbi5vcmciCisgICAgICAgICkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAiIi5qb2luKGNvZGVjcy5pdGVyZGVjb2RlKCJweXRob24ub3JnLiIsICJpZG5hIikpLAorICAgICAgICAgICAgdSJweXRob24ub3JnLiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgICAgICIiLmpvaW4oY29kZWNzLml0ZXJkZWNvZGUoInhuLS1weXRobi1tdWEub3JnLiIsICJpZG5hIikpLAorICAgICAgICAgICAgdSJweXRoXHhmNm4ub3JnLiIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgICAgICIiLmpvaW4oY29kZWNzLml0ZXJkZWNvZGUoInhuLS1weXRobi1tdWEub3JnLiIsICJpZG5hIikpLAorICAgICAgICAgICAgdSJweXRoXHhmNm4ub3JnLiIKKyAgICAgICAgKQorCisgICAgICAgIGRlY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxkZWNvZGVyKCJpZG5hIikoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWNvZGVyLmRlY29kZSgieG4tLXhhbSIsICksIHUiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVjb2Rlci5kZWNvZGUoInBsZS05dGEubyIsICksIHUiXHhlNHhhbXBsZS4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWNvZGVyLmRlY29kZSh1InJnIiksIHUiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVjb2Rlci5kZWNvZGUodSIiLCBUcnVlKSwgdSJvcmciKQorCisgICAgICAgIGRlY29kZXIucmVzZXQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWNvZGVyLmRlY29kZSgieG4tLXhhbSIsICksIHUiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZGVjb2Rlci5kZWNvZGUoInBsZS05dGEubyIsICksIHUiXHhlNHhhbXBsZS4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhkZWNvZGVyLmRlY29kZSgicmcuIiksIHUib3JnLiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGRlY29kZXIuZGVjb2RlKCIiLCBUcnVlKSwgdSIiKQorCisgICAgZGVmIHRlc3RfaW5jcmVtZW50YWxfZW5jb2RlKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgICAgICIiLmpvaW4oY29kZWNzLml0ZXJlbmNvZGUodSJweXRob24ub3JnIiwgImlkbmEiKSksCisgICAgICAgICAgICAicHl0aG9uLm9yZyIKKyAgICAgICAgKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgICAgICIiLmpvaW4oY29kZWNzLml0ZXJlbmNvZGUodSJweXRob24ub3JnLiIsICJpZG5hIikpLAorICAgICAgICAgICAgInB5dGhvbi5vcmcuIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgIiIuam9pbihjb2RlY3MuaXRlcmVuY29kZSh1InB5dGhceGY2bi5vcmcuIiwgImlkbmEiKSksCisgICAgICAgICAgICAieG4tLXB5dGhuLW11YS5vcmcuIgorICAgICAgICApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgIiIuam9pbihjb2RlY3MuaXRlcmVuY29kZSh1InB5dGhceGY2bi5vcmcuIiwgImlkbmEiKSksCisgICAgICAgICAgICAieG4tLXB5dGhuLW11YS5vcmcuIgorICAgICAgICApCisKKyAgICAgICAgZW5jb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGVuY29kZXIoImlkbmEiKSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVuY29kZXIuZW5jb2RlKHUiXHhlNHgiKSwgIiIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVuY29kZXIuZW5jb2RlKHUiYW1wbGUub3JnIiksICJ4bi0teGFtcGxlLTl0YS4iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhlbmNvZGVyLmVuY29kZSh1IiIsIFRydWUpLCAib3JnIikKKworICAgICAgICBlbmNvZGVyLnJlc2V0KCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZW5jb2Rlci5lbmNvZGUodSJceGU0eCIpLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZW5jb2Rlci5lbmNvZGUodSJhbXBsZS5vcmcuIiksICJ4bi0teGFtcGxlLTl0YS5vcmcuIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZW5jb2Rlci5lbmNvZGUodSIiLCBUcnVlKSwgIiIpCisKIGNsYXNzIENvZGVjc01vZHVsZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfZGVjb2RlKHNlbGYpOgpAQCAtMTAzMiw5ICsxMDk5LDExIEBACiAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gcmVhZGVyLnJlYWQoKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZHJlc3VsdCwgcywgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKGRlY29kZWRyZXN1bHQsIHMsIGVuY29kaW5nKSkKIAotICAgICAgICAgICAgICAgICMgY2hlY2sgaW5jcmVtZW50YWwgZGVjb2Rlci9lbmNvZGVyIGFuZCBpdGVyZW5jb2RlKCkvaXRlcmRlY29kZSgpCisgICAgICAgICAgICAgICAgIyBjaGVjayBpbmNyZW1lbnRhbCBkZWNvZGVyL2VuY29kZXIgKGZldGNoZWQgdmlhIHRoZSBQeXRob24KKyAgICAgICAgICAgICAgICAjIGFuZCBDIEFQSSkgYW5kIGl0ZXJlbmNvZGUoKS9pdGVyZGVjb2RlKCkKICAgICAgICAgICAgICAgICB0cnk6CiAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKGVuY29kaW5nKSgpCisgICAgICAgICAgICAgICAgICAgIGNlbmNvZGVyID0gX3Rlc3RjYXBpLmNvZGVjX2luY3JlbWVudGFsZW5jb2RlcihlbmNvZGluZykKICAgICAgICAgICAgICAgICBleGNlcHQgTG9va3VwRXJyb3I6ICMgbm8gSW5jcmVtZW50YWxFbmNvZGVyCiAgICAgICAgICAgICAgICAgICAgIHBhc3MKICAgICAgICAgICAgICAgICBlbHNlOgpAQCAtMTA0MiwxMCArMTExMSwyNCBAQAogICAgICAgICAgICAgICAgICAgICBlbmNvZGVkcmVzdWx0ID0gIiIKICAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gczoKICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRyZXN1bHQgKz0gZW5jb2Rlci5lbmNvZGUoYykKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCArPSBlbmNvZGVyLmVuY29kZSh1IiIsIFRydWUpCiAgICAgICAgICAgICAgICAgICAgIGRlY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxkZWNvZGVyKGVuY29kaW5nKSgpCiAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgPSB1IiIKICAgICAgICAgICAgICAgICAgICAgZm9yIGMgaW4gZW5jb2RlZHJlc3VsdDoKICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRyZXN1bHQgKz0gZGVjb2Rlci5kZWNvZGUoYykKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCArPSBkZWNvZGVyLmRlY29kZSgiIiwgVHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVkcmVzdWx0LCBzLCAiJXIgIT0gJXIgKGVuY29kaW5nPSVyKSIgJSAoZGVjb2RlZHJlc3VsdCwgcywgZW5jb2RpbmcpKQorCisgICAgICAgICAgICAgICAgICAgICMgY2hlY2sgQyBBUEkKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZHJlc3VsdCA9ICIiCisgICAgICAgICAgICAgICAgICAgIGZvciBjIGluIHM6CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkcmVzdWx0ICs9IGNlbmNvZGVyLmVuY29kZShjKQorICAgICAgICAgICAgICAgICAgICBlbmNvZGVkcmVzdWx0ICs9IGNlbmNvZGVyLmVuY29kZSh1IiIsIFRydWUpCisgICAgICAgICAgICAgICAgICAgIGNkZWNvZGVyID0gX3Rlc3RjYXBpLmNvZGVjX2luY3JlbWVudGFsZGVjb2RlcihlbmNvZGluZykKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCA9IHUiIgorICAgICAgICAgICAgICAgICAgICBmb3IgYyBpbiBlbmNvZGVkcmVzdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCArPSBjZGVjb2Rlci5kZWNvZGUoYykKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZHJlc3VsdCArPSBjZGVjb2Rlci5kZWNvZGUoIiIsIFRydWUpCiAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2RlZHJlc3VsdCwgcywgIiVyICE9ICVyIChlbmNvZGluZz0lcikiICUgKGRlY29kZWRyZXN1bHQsIHMsIGVuY29kaW5nKSkKIAogICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGl0ZXJlbmNvZGUoKS9pdGVyZGVjb2RlKCkKQEAgLTExNDIsNyArMTIyNSw3IEBACiAgICAgICAgIFB1bnljb2RlVGVzdCwKICAgICAgICAgVW5pY29kZUludGVybmFsVGVzdCwKICAgICAgICAgTmFtZXByZXBUZXN0LAotICAgICAgICBDb2RlY1Rlc3QsCisgICAgICAgIElETkFDb2RlY1Rlc3QsCiAgICAgICAgIENvZGVjc01vZHVsZVRlc3QsCiAgICAgICAgIFN0cmVhbVJlYWRlclRlc3QsCiAgICAgICAgIFN0cjJTdHJUZXN0LApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9jb2VyY2lvbi5weSBiL0xpYi90ZXN0L3Rlc3RfY29lcmNpb24ucHkKaW5kZXggZTEyZWYwZC4uOTY0ZjE2MSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb2VyY2lvbi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2NvZXJjaW9uLnB5CkBAIC0xLDYgKzEsOCBAQAogaW1wb3J0IGNvcHkKIGltcG9ydCBzeXMKIGltcG9ydCB3YXJuaW5ncworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QKIAogIyBGYWtlIGEgbnVtYmVyIHRoYXQgaW1wbGVtZW50cyBudW1lcmljIG1ldGhvZHMgdGhyb3VnaCBfX2NvZXJjZV9fCiBjbGFzcyBDb2VyY2VOdW1iZXI6CkBAIC0xNiwxMCArMTgsMTkgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiAoc2VsZi5hcmcsIG90aGVyKQogCisjIE5ldy1zdHlsZSBjbGFzcyB2ZXJzaW9uIG9mIENvZXJjZU51bWJlcgorY2xhc3MgQ29lcmNlVG8ob2JqZWN0KToKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYXJnKToKKyAgICAgICAgc2VsZi5hcmcgPSBhcmcKKyAgICBkZWYgX19jb2VyY2VfXyhzZWxmLCBvdGhlcik6CisgICAgICAgIGlmIGlzaW5zdGFuY2Uob3RoZXIsIENvZXJjZVRvKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmFyZywgb3RoZXIuYXJnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5hcmcsIG90aGVyCisKIAogIyBGYWtlIGEgbnVtYmVyIHRoYXQgaW1wbGVtZW50cyBudW1lcmljIG9wcyB0aHJvdWdoIG1ldGhvZHMuCiBjbGFzcyBNZXRob2ROdW1iZXI6Ci0KICAgICBkZWYgX19pbml0X18oc2VsZixhcmcpOgogICAgICAgICBzZWxmLmFyZyA9IGFyZwogCkBAIC01MCw2ICs2MSwxOCBAQAogICAgIGRlZiBfX3J0cnVlZGl2X18oc2VsZixvdGhlcik6CiAgICAgICAgIHJldHVybiBvdGhlciAvIHNlbGYuYXJnCiAKKyAgICBkZWYgX190cnVlZGl2X18oc2VsZixvdGhlcik6CisgICAgICAgIHJldHVybiBzZWxmLmFyZyAvIG90aGVyCisKKyAgICBkZWYgX19ydHJ1ZWRpdl9fKHNlbGYsb3RoZXIpOgorICAgICAgICByZXR1cm4gb3RoZXIgLyBzZWxmLmFyZworCisgICAgZGVmIF9fZmxvb3JkaXZfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIHNlbGYuYXJnIC8vIG90aGVyCisKKyAgICBkZWYgX19yZmxvb3JkaXZfXyhzZWxmLG90aGVyKToKKyAgICAgICAgcmV0dXJuIG90aGVyIC8vIHNlbGYuYXJnCisKICAgICBkZWYgX19wb3dfXyhzZWxmLG90aGVyKToKICAgICAgICAgcmV0dXJuIHNlbGYuYXJnICoqIG90aGVyCiAKQEAgLTY2LDExICs4OSwxNTcgQEAKICAgICAgICAgcmV0dXJuIGNtcChzZWxmLmFyZywgb3RoZXIpCiAKIAotY2FuZGlkYXRlcyA9IFsgMiwgNC4wLCAyTCwgMiswaiwgWzFdLCAoMiwpLCBOb25lLAotICAgICAgICAgICAgICAgTWV0aG9kTnVtYmVyKDIpLCBDb2VyY2VOdW1iZXIoMildCitjYW5kaWRhdGVzID0gWzIsIDJMLCA0LjAsIDIrMGosIFsxXSwgKDIsKSwgTm9uZSwKKyAgICAgICAgICAgICAgTWV0aG9kTnVtYmVyKDIpLCBDb2VyY2VOdW1iZXIoMildCiAKLWluZml4X2Jpbm9wcyA9IFsgJysnLCAnLScsICcqJywgJy8nLCAnKionLCAnJScgXQoraW5maXhfYmlub3BzID0gWyAnKycsICctJywgJyonLCAnKionLCAnJScsICcvLycsICcvJyBdCisKK1RFID0gVHlwZUVycm9yCisjIGIgPSBib3RoIG5vcm1hbCBhbmQgYXVnbWVudGVkIGdpdmUgc2FtZSByZXN1bHQgbGlzdAorIyBzID0gc2luZ2xlIHJlc3VsdCBsaXN0cyBmb3Igbm9ybWFsIGFuZCBhdWdtZW50ZWQKKyMgZSA9IGVxdWFscyBvdGhlciByZXN1bHRzCisjIHJlc3VsdCBsaXN0czogWycrJywgJy0nLCAnKicsICcqKicsICclJywgJy8vJywgKCdjbGFzc2ljIC8nLCAnbmV3IC8nKV0KKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLXR1cGxlIGlmIHJlc3VsdHMgZGlmZmVyCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Ugb25seSBvbmUgdmFsdWUKK2luZml4X3Jlc3VsdHMgPSB7CisgICAgIyAyCisgICAgKDAsMCk6ICgnYicsIFs0LCAwLCA0LCA0LCAwLCAxLCAoMSwgMS4wKV0pLAorICAgICgwLDEpOiAoJ2UnLCAoMCwwKSksCisgICAgKDAsMik6ICgnYicsIFs2LjAsIC0yLjAsIDguMCwgMTYuMCwgMi4wLCAwLjAsIDAuNV0pLAorICAgICgwLDMpOiAoJ2InLCBbNCswaiwgMCswaiwgNCswaiwgNCswaiwgMCswaiwgMSswaiwgMSswal0pLAorICAgICgwLDQpOiAoJ2InLCBbVEUsIFRFLCBbMSwgMV0sIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDAsNSk6ICgnYicsIFtURSwgVEUsICgyLCAyKSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoMCw2KTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDAsNyk6ICgnZScsICgwLDApKSwKKyAgICAoMCw4KTogKCdlJywgKDAsMCkpLAorCisgICAgIyAyTAorICAgICgxLDApOiAoJ2UnLCAoMCwwKSksCisgICAgKDEsMSk6ICgnZScsICgwLDEpKSwKKyAgICAoMSwyKTogKCdlJywgKDAsMikpLAorICAgICgxLDMpOiAoJ2UnLCAoMCwzKSksCisgICAgKDEsNCk6ICgnZScsICgwLDQpKSwKKyAgICAoMSw1KTogKCdlJywgKDAsNSkpLAorICAgICgxLDYpOiAoJ2UnLCAoMCw2KSksCisgICAgKDEsNyk6ICgnZScsICgwLDcpKSwKKyAgICAoMSw4KTogKCdlJywgKDAsOCkpLAorCisgICAgIyA0LjAKKyAgICAoMiwwKTogKCdiJywgWzYuMCwgMi4wLCA4LjAsIDE2LjAsIDAuMCwgMi4wLCAyLjBdKSwKKyAgICAoMiwxKTogKCdlJywgKDIsMCkpLAorICAgICgyLDIpOiAoJ2InLCBbOC4wLCAwLjAsIDE2LjAsIDI1Ni4wLCAwLjAsIDEuMCwgMS4wXSksCisgICAgKDIsMyk6ICgnYicsIFs2KzBqLCAyKzBqLCA4KzBqLCAxNiswaiwgMCswaiwgMiswaiwgMiswal0pLAorICAgICgyLDQpOiAoJ2InLCBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoMiw1KTogKCdlJywgKDIsNCkpLAorICAgICgyLDYpOiAoJ2UnLCAoMiw0KSksCisgICAgKDIsNyk6ICgnZScsICgyLDApKSwKKyAgICAoMiw4KTogKCdlJywgKDIsMCkpLAorCisgICAgIyAoMiswaikKKyAgICAoMywwKTogKCdiJywgWzQrMGosIDArMGosIDQrMGosIDQrMGosIDArMGosIDErMGosIDErMGpdKSwKKyAgICAoMywxKTogKCdlJywgKDMsMCkpLAorICAgICgzLDIpOiAoJ2InLCBbNiswaiwgLTIrMGosIDgrMGosIDE2KzBqLCAyKzBqLCAwKzBqLCAwLjUrMGpdKSwKKyAgICAoMywzKTogKCdiJywgWzQrMGosIDArMGosIDQrMGosIDQrMGosIDArMGosIDErMGosIDErMGpdKSwKKyAgICAoMyw0KTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDMsNSk6ICgnZScsICgzLDQpKSwKKyAgICAoMyw2KTogKCdlJywgKDMsNCkpLAorICAgICgzLDcpOiAoJ2UnLCAoMywwKSksCisgICAgKDMsOCk6ICgnZScsICgzLDApKSwKKworICAgICMgWzFdCisgICAgKDQsMCk6ICgnYicsIFtURSwgVEUsIFsxLCAxXSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNCwxKTogKCdlJywgKDQsMCkpLAorICAgICg0LDIpOiAoJ2InLCBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNCwzKTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDQsNCk6ICgnYicsIFtbMSwgMV0sIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNCw1KTogKCdzJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSwgW1sxLCAyXSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICg0LDYpOiAoJ2InLCBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNCw3KTogKCdlJywgKDQsMCkpLAorICAgICg0LDgpOiAoJ2UnLCAoNCwwKSksCisKKyAgICAjICgyLCkKKyAgICAoNSwwKTogKCdiJywgW1RFLCBURSwgKDIsIDIpLCBURSwgVEUsIFRFLCBURV0pLAorICAgICg1LDEpOiAoJ2UnLCAoNSwwKSksCisgICAgKDUsMik6ICgnYicsIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICg1LDMpOiAoJ2UnLCAoNSwyKSksCisgICAgKDUsNCk6ICgnZScsICg1LDIpKSwKKyAgICAoNSw1KTogKCdiJywgWygyLCAyKSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0pLAorICAgICg1LDYpOiAoJ2InLCBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdKSwKKyAgICAoNSw3KTogKCdlJywgKDUsMCkpLAorICAgICg1LDgpOiAoJ2UnLCAoNSwwKSksCisKKyAgICAjIE5vbmUKKyAgICAoNiwwKTogKCdiJywgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSksCisgICAgKDYsMSk6ICgnZScsICg2LDApKSwKKyAgICAoNiwyKTogKCdlJywgKDYsMCkpLAorICAgICg2LDMpOiAoJ2UnLCAoNiwwKSksCisgICAgKDYsNCk6ICgnZScsICg2LDApKSwKKyAgICAoNiw1KTogKCdlJywgKDYsMCkpLAorICAgICg2LDYpOiAoJ2UnLCAoNiwwKSksCisgICAgKDYsNyk6ICgnZScsICg2LDApKSwKKyAgICAoNiw4KTogKCdlJywgKDYsMCkpLAorCisgICAgIyBNZXRob2ROdW1iZXIoMikKKyAgICAoNywwKTogKCdlJywgKDAsMCkpLAorICAgICg3LDEpOiAoJ2UnLCAoMCwxKSksCisgICAgKDcsMik6ICgnZScsICgwLDIpKSwKKyAgICAoNywzKTogKCdlJywgKDAsMykpLAorICAgICg3LDQpOiAoJ2UnLCAoMCw0KSksCisgICAgKDcsNSk6ICgnZScsICgwLDUpKSwKKyAgICAoNyw2KTogKCdlJywgKDAsNikpLAorICAgICg3LDcpOiAoJ2UnLCAoMCw3KSksCisgICAgKDcsOCk6ICgnZScsICgwLDgpKSwKKworICAgICMgQ29lcmNlTnVtYmVyKDIpCisgICAgKDgsMCk6ICgnZScsICgwLDApKSwKKyAgICAoOCwxKTogKCdlJywgKDAsMSkpLAorICAgICg4LDIpOiAoJ2UnLCAoMCwyKSksCisgICAgKDgsMyk6ICgnZScsICgwLDMpKSwKKyAgICAoOCw0KTogKCdlJywgKDAsNCkpLAorICAgICg4LDUpOiAoJ2UnLCAoMCw1KSksCisgICAgKDgsNik6ICgnZScsICgwLDYpKSwKKyAgICAoOCw3KTogKCdlJywgKDAsNykpLAorICAgICg4LDgpOiAoJ2UnLCAoMCw4KSksCit9CisKK2RlZiBwcm9jZXNzX2luZml4X3Jlc3VsdHMoKToKKyAgICBmb3Iga2V5IGluIHNvcnRlZChpbmZpeF9yZXN1bHRzKToKKyAgICAgICAgdmFsID0gaW5maXhfcmVzdWx0c1trZXldCisgICAgICAgIGlmIHZhbFswXSA9PSAnZSc6CisgICAgICAgICAgICBpbmZpeF9yZXN1bHRzW2tleV0gPSBpbmZpeF9yZXN1bHRzW3ZhbFsxXV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIHZhbFswXSA9PSAncyc6CisgICAgICAgICAgICAgICAgcmVzID0gKHZhbFsxXSwgdmFsWzJdKQorICAgICAgICAgICAgZWxpZiB2YWxbMF0gPT0gJ2InOgorICAgICAgICAgICAgICAgIHJlcyA9ICh2YWxbMV0sIHZhbFsxXSkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEpOgorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UocmVzW2ldWzZdLCB0dXBsZSk6CisgICAgICAgICAgICAgICAgICAgIGlmIDEvMiA9PSAwOgorICAgICAgICAgICAgICAgICAgICAgICAgIyB0ZXN0aW5nIHdpdGggY2xhc3NpYyAoZmxvb3IpIGRpdmlzaW9uCisgICAgICAgICAgICAgICAgICAgICAgICByZXNbaV1bNl0gPSByZXNbaV1bNl1bMF0KKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICMgdGVzdGluZyB3aXRoIC1RbmV3CisgICAgICAgICAgICAgICAgICAgICAgICByZXNbaV1bNl0gPSByZXNbaV1bNl1bMV0KKyAgICAgICAgICAgIGluZml4X3Jlc3VsdHNba2V5XSA9IHJlcworCisKKworcHJvY2Vzc19pbmZpeF9yZXN1bHRzKCkKKyMgbm93IGluZml4X3Jlc3VsdHMgaGFzIHR3byBsaXN0cyBvZiByZXN1bHRzIGZvciBldmVyeSBwYWlyaW5nLgorCiBwcmVmaXhfYmlub3BzID0gWyAnZGl2bW9kJyBdCitwcmVmaXhfcmVzdWx0cyA9IFsKKyAgICBbKDEsMCksICgxTCwwTCksICgwLjAsMi4wKSwgKCgxKzBqKSwwaiksIFRFLCBURSwgVEUsIFRFLCAoMSwwKV0sCisgICAgWygxTCwwTCksICgxTCwwTCksICgwLjAsMi4wKSwgKCgxKzBqKSwwaiksIFRFLCBURSwgVEUsIFRFLCAoMUwsMEwpXSwKKyAgICBbKDIuMCwwLjApLCAoMi4wLDAuMCksICgxLjAsMC4wKSwgKCgyKzBqKSwwaiksIFRFLCBURSwgVEUsIFRFLCAoMi4wLDAuMCldLAorICAgIFsoKDErMGopLDBqKSwgKCgxKzBqKSwwaiksICgwaiwoMiswaikpLCAoKDErMGopLDBqKSwgVEUsIFRFLCBURSwgVEUsICgoMSswaiksMGopXSwKKyAgICBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0sCisgICAgW1RFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEVdLAorICAgIFtURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFXSwKKyAgICBbVEUsIFRFLCBURSwgVEUsIFRFLCBURSwgVEUsIFRFLCBURV0sCisgICAgWygxLDApLCAoMUwsMEwpLCAoMC4wLDIuMCksICgoMSswaiksMGopLCBURSwgVEUsIFRFLCBURSwgKDEsMCldCitdCiAKIGRlZiBmb3JtYXRfZmxvYXQodmFsdWUpOgogICAgIGlmIGFicyh2YWx1ZSkgPCAwLjAxOgpAQCAtODcsODMgKzI1Niw3NCBAQAogICAgICAgICByZXR1cm4gZm9ybWF0X2Zsb2F0KHZhbHVlKQogICAgIHJldHVybiBzdHIodmFsdWUpCiAKLWRlZiBkb19pbmZpeF9iaW5vcHMoKToKLSAgICBmb3IgYSBpbiBjYW5kaWRhdGVzOgotICAgICAgICBmb3IgYiBpbiBjYW5kaWRhdGVzOgotICAgICAgICAgICAgZm9yIG9wIGluIGluZml4X2Jpbm9wczoKLSAgICAgICAgICAgICAgICBwcmludCAnJXMgJXMgJXMnICUgKGEsIG9wLCBiKSwKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHggPSBldmFsKCdhICVzIGInICUgb3ApCi0gICAgICAgICAgICAgICAgZXhjZXB0OgotICAgICAgICAgICAgICAgICAgICBlcnJvciA9IHN5cy5leGNfaW5mbygpWzoyXQotICAgICAgICAgICAgICAgICAgICBwcmludCAnLi4uICVzLiVzJyAlIChlcnJvclswXS5fX21vZHVsZV9fLCBlcnJvclswXS5fX25hbWVfXykKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBwcmludCAnPScsIGZvcm1hdF9yZXN1bHQoeCkKLSAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgIHogPSBjb3B5LmNvcHkoYSkKLSAgICAgICAgICAgICAgICBleGNlcHQgY29weS5FcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgeiA9IGEgIyBhc3N1bWUgaXQgaGFzIG5vIGlucGxhY2Ugb3BzCi0gICAgICAgICAgICAgICAgcHJpbnQgJyVzICVzPSAlcycgJSAoYSwgb3AsIGIpLAotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgZXhlYygneiAlcz0gYicgJSBvcCkKLSAgICAgICAgICAgICAgICBleGNlcHQ6Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yID0gc3lzLmV4Y19pbmZvKClbOjJdCi0gICAgICAgICAgICAgICAgICAgIHByaW50ICcuLi4gJXMuJXMnICUgKGVycm9yWzBdLl9fbW9kdWxlX18sIGVycm9yWzBdLl9fbmFtZV9fKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ICc9PicsIGZvcm1hdF9yZXN1bHQoeikKK2NsYXNzIENvZXJjaW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfaW5maXhfYmlub3BzKHNlbGYpOgorICAgICAgICBmb3IgaWEsIGEgaW4gZW51bWVyYXRlKGNhbmRpZGF0ZXMpOgorICAgICAgICAgICAgZm9yIGliLCBiIGluIGVudW1lcmF0ZShjYW5kaWRhdGVzKToKKyAgICAgICAgICAgICAgICByZXN1bHRzID0gaW5maXhfcmVzdWx0c1soaWEsIGliKV0KKyAgICAgICAgICAgICAgICBmb3Igb3AsIHJlcywgaXJlcyBpbiB6aXAoaW5maXhfYmlub3BzLCByZXN1bHRzWzBdLCByZXN1bHRzWzFdKToKKyAgICAgICAgICAgICAgICAgICAgaWYgcmVzIGlzIFRFOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2EgJXMgYicgJSBvcCwgeydhJzogYSwgJ2InOiBifSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGZvcm1hdF9yZXN1bHQocmVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdF9yZXN1bHQoZXZhbCgnYSAlcyBiJyAlIG9wKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJXMgJXMgJXMgPT0gJXMgZmFpbGVkJyAlIChhLCBvcCwgYiwgcmVzKSkKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgeiA9IGNvcHkuY29weShhKQorICAgICAgICAgICAgICAgICAgICBleGNlcHQgY29weS5FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHogPSBhICMgYXNzdW1lIGl0IGhhcyBubyBpbnBsYWNlIG9wcworICAgICAgICAgICAgICAgICAgICBpZiBpcmVzIGlzIFRFOgorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMgJ3ogJXM9IGInICUgb3AKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmZhaWwoIlR5cGVFcnJvciBub3QgcmFpc2VkIikKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMoJ3ogJXM9IGInICUgb3ApCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhpcmVzLCB6KQogCi1kZWYgZG9fcHJlZml4X2Jpbm9wcygpOgotICAgIGZvciBhIGluIGNhbmRpZGF0ZXM6Ci0gICAgICAgIGZvciBiIGluIGNhbmRpZGF0ZXM6Ci0gICAgICAgICAgICBmb3Igb3AgaW4gcHJlZml4X2Jpbm9wczoKLSAgICAgICAgICAgICAgICBwcmludCAnJXMoJXMsICVzKScgJSAob3AsIGEsIGIpLAotICAgICAgICAgICAgICAgIHRyeToKLSAgICAgICAgICAgICAgICAgICAgeCA9IGV2YWwoJyVzKGEsIGIpJyAlIG9wKQotICAgICAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBzeXMuZXhjX2luZm8oKVs6Ml0KLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgJy4uLiAlcy4lcycgJSAoZXJyb3JbMF0uX19tb2R1bGVfXywgZXJyb3JbMF0uX19uYW1lX18pCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgJz0nLCBmb3JtYXRfcmVzdWx0KHgpCisgICAgZGVmIHRlc3RfcHJlZml4X2Jpbm9wcyhzZWxmKToKKyAgICAgICAgZm9yIGlhLCBhIGluIGVudW1lcmF0ZShjYW5kaWRhdGVzKToKKyAgICAgICAgICAgIGZvciBpYiwgYiBpbiBlbnVtZXJhdGUoY2FuZGlkYXRlcyk6CisgICAgICAgICAgICAgICAgZm9yIG9wIGluIHByZWZpeF9iaW5vcHM6CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHByZWZpeF9yZXN1bHRzW2lhXVtpYl0KKyAgICAgICAgICAgICAgICAgICAgaWYgcmVzIGlzIFRFOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBldmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzKGEsIGIpJyAlIG9wLCB7J2EnOiBhLCAnYic6IGJ9KQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZm9ybWF0X3Jlc3VsdChyZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0X3Jlc3VsdChldmFsKCclcyhhLCBiKScgJSBvcCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyVzKCVzLCAlcykgPT0gJXMgZmFpbGVkJyAlIChvcCwgYSwgYiwgcmVzKSkKIAotIyBOZXctc3R5bGUgY2xhc3MgdmVyc2lvbiBvZiBDb2VyY2VOdW1iZXIKLWNsYXNzIENvZXJjZVRvKG9iamVjdCk6Ci0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGFyZyk6Ci0gICAgICAgIHNlbGYuYXJnID0gYXJnCi0gICAgZGVmIF9fY29lcmNlX18oc2VsZiwgb3RoZXIpOgotICAgICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBDb2VyY2VUbyk6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5hcmcsIG90aGVyLmFyZwotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuYXJnLCBvdGhlcgorICAgIGRlZiB0ZXN0X2NtcHR5cGVzKHNlbGYpOgorICAgICAgICAjIEJ1aWx0LWluIHRwX2NvbXBhcmUgc2xvdHMgZXhwZWN0IHRoZWlyIGFyZ3VtZW50cyB0byBoYXZlIHRoZQorICAgICAgICAjIHNhbWUgdHlwZSwgYnV0IGEgdXNlci1kZWZpbmVkIF9fY29lcmNlX18gZG9lc24ndCBoYXZlIHRvIG9iZXkuCisgICAgICAgICMgU0YgIzk4MDM1MgorICAgICAgICBldmlsX2NvZXJjZXIgPSBDb2VyY2VUbyg0MikKKyAgICAgICAgIyBNYWtlIHN1cmUgdGhlc2UgZG9uJ3QgY3Jhc2ggYW55IG1vcmUKKyAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbHMoY21wKHUnZmlzaCcsIGV2aWxfY29lcmNlciksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWxzKGNtcChzbGljZSgxKSwgZXZpbF9jb2VyY2VyKSwgMCkKKyAgICAgICAgIyAuLi5idXQgdGhhdCB0aGlzIHN0aWxsIHdvcmtzCisgICAgICAgIGNsYXNzIFdhY2t5Q29tcGFyZXIob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvdGhlciA9PSA0MiwgJ2V4cGVjdGVkIGV2aWxfY29lcmNlciwgZ290ICVyJyAlIG90aGVyKQorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNtcChXYWNreUNvbXBhcmVyKCksIGV2aWxfY29lcmNlciksIDApCisgICAgICAgICMgLi4uYW5kIGNsYXNzaWMgY2xhc3NlcyB0b28sIHNpbmNlIHRoYXQgY29kZSBwYXRoIGlzIGEgbGl0dGxlIGRpZmZlcmVudAorICAgICAgICBjbGFzcyBDbGFzc2ljV2Fja3lDb21wYXJlcjoKKyAgICAgICAgICAgIGRlZiBfX2NtcF9fKHNsZiwgb3RoZXIpOgorICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0XyhvdGhlciA9PSA0MiwgJ2V4cGVjdGVkIGV2aWxfY29lcmNlciwgZ290ICVyJyAlIG90aGVyKQorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNtcChDbGFzc2ljV2Fja3lDb21wYXJlcigpLCBldmlsX2NvZXJjZXIpLCAwKQogCi1kZWYgYXNzZXJ0XyhleHByLCBtc2c9Tm9uZSk6Ci0gICAgaWYgbm90IGV4cHI6Ci0gICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yLCBtc2cKK2RlZiB0ZXN0X21haW4oKToKKyAgICB3YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ2NvbXBsZXggZGl2bW9kXChcKSwgLy8gYW5kICUgYXJlIGRlcHJlY2F0ZWQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlcHJlY2F0aW9uV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByJ3Rlc3QudGVzdF9jb2VyY2lvbiQnKQorICAgIHJ1bl91bml0dGVzdChDb2VyY2lvblRlc3QpCiAKLWRlZiBkb19jbXB0eXBlcygpOgotICAgICMgQnVpbHQtaW4gdHBfY29tcGFyZSBzbG90cyBleHBlY3QgdGhlaXIgYXJndW1lbnRzIHRvIGhhdmUgdGhlCi0gICAgIyBzYW1lIHR5cGUsIGJ1dCBhIHVzZXItZGVmaW5lZCBfX2NvZXJjZV9fIGRvZXNuJ3QgaGF2ZSB0byBvYmV5LgotICAgICMgU0YgIzk4MDM1MgotICAgIGV2aWxfY29lcmNlciA9IENvZXJjZVRvKDQyKQotICAgICMgTWFrZSBzdXJlIHRoZXNlIGRvbid0IGNyYXNoIGFueSBtb3JlCi0gICAgYXNzZXJ0XyhjbXAodSdmaXNoJywgZXZpbF9jb2VyY2VyKSAhPSAwKQotICAgIGFzc2VydF8oY21wKHNsaWNlKDEpLCBldmlsX2NvZXJjZXIpICE9IDApCi0gICAgIyAuLi5idXQgdGhhdCB0aGlzIHN0aWxsIHdvcmtzCi0gICAgY2xhc3MgV2Fja3lDb21wYXJlcihvYmplY3QpOgotICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgICAgICBhc3NlcnRfKG90aGVyID09IDQyLCAnZXhwZWN0ZWQgZXZpbF9jb2VyY2VyLCBnb3QgJXInICUgb3RoZXIpCi0gICAgICAgICAgICByZXR1cm4gMAotICAgIGFzc2VydF8oY21wKFdhY2t5Q29tcGFyZXIoKSwgZXZpbF9jb2VyY2VyKSA9PSAwKQotICAgICMgLi4uYW5kIGNsYXNzaWMgY2xhc3NlcyB0b28sIHNpbmNlIHRoYXQgY29kZSBwYXRoIGlzIGEgbGl0dGxlIGRpZmZlcmVudAotICAgIGNsYXNzIENsYXNzaWNXYWNreUNvbXBhcmVyOgotICAgICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6Ci0gICAgICAgICAgICBhc3NlcnRfKG90aGVyID09IDQyLCAnZXhwZWN0ZWQgZXZpbF9jb2VyY2VyLCBnb3QgJXInICUgb3RoZXIpCi0gICAgICAgICAgICByZXR1cm4gMAotICAgIGFzc2VydF8oY21wKENsYXNzaWNXYWNreUNvbXBhcmVyKCksIGV2aWxfY29lcmNlcikgPT0gMCkKLQotd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICByJ2NvbXBsZXggZGl2bW9kXChcKSwgLy8gYW5kICUgYXJlIGRlcHJlY2F0ZWQnLAotICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRpb25XYXJuaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgcid0ZXN0LnRlc3RfY29lcmNpb24kJykKLWRvX2luZml4X2Jpbm9wcygpCi1kb19wcmVmaXhfYmlub3BzKCkKLWRvX2NtcHR5cGVzKCkKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29tcGFyZS5weSBiL0xpYi90ZXN0L3Rlc3RfY29tcGFyZS5weQppbmRleCA2ODk5OTI2Li4yZmRlNjE0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbXBhcmUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb21wYXJlLnB5CkBAIC0xLDQgKzEsNiBAQAogaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogCiBjbGFzcyBFbXB0eToKICAgICBkZWYgX19yZXByX18oc2VsZik6CkBAIC0yNywyOCArMjksMzEgQEAKICAgICBkZWYgX19jbXBfXyhzZWxmLCBvdGhlcik6CiAgICAgICAgIHJldHVybiBjbXAoc2VsZi5hcmcsIG90aGVyKQogCitjbGFzcyBDb21wYXJpc29uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgc2V0MSA9IFsyLCAyLjAsIDJMLCAyKzBqLCBDb2VyY2UoMiksIENtcCgyLjApXQorICAgIHNldDIgPSBbWzFdLCAoMywpLCBOb25lLCBFbXB0eSgpXQorICAgIGNhbmRpZGF0ZXMgPSBzZXQxICsgc2V0MgogCi1jYW5kaWRhdGVzID0gWzIsIDIuMCwgMkwsIDIrMGosIFsxXSwgKDMsKSwgTm9uZSwgRW1wdHkoKSwgQ29lcmNlKDIpLCBDbXAoMi4wKV0KLQotZGVmIHRlc3QoKToKLSAgICBmb3IgYSBpbiBjYW5kaWRhdGVzOgotICAgICAgICBmb3IgYiBpbiBjYW5kaWRhdGVzOgotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIHggPSBhID09IGIKLSAgICAgICAgICAgIGV4Y2VwdDoKLSAgICAgICAgICAgICAgICBwcmludCAnY21wKCVzLCAlcykgPT4gJXMnICUgKGEsIGIsIHN5cy5leGNfaW5mbygpWzBdKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBpZiB4OgotICAgICAgICAgICAgICAgICAgICBwcmludCAiJXMgPT0gJXMiICUgKGEsIGIpCisgICAgZGVmIHRlc3RfY29tcGFyaXNvbnMoc2VsZik6CisgICAgICAgIGZvciBhIGluIHNlbGYuY2FuZGlkYXRlczoKKyAgICAgICAgICAgIGZvciBiIGluIHNlbGYuY2FuZGlkYXRlczoKKyAgICAgICAgICAgICAgICBpZiAoKGEgaW4gc2VsZi5zZXQxKSBhbmQgKGIgaW4gc2VsZi5zZXQxKSkgb3IgYSBpcyBiOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGEsIGIpCiAgICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgcHJpbnQgIiVzICE9ICVzIiAlIChhLCBiKQotICAgICMgRW5zdXJlIGRlZmF1bHQgY29tcGFyaXNvbiBjb21wYXJlcyBpZCgpIG9mIGFyZ3MKLSAgICBMID0gW10KLSAgICBmb3IgaSBpbiByYW5nZSgxMCk6Ci0gICAgICAgIEwuaW5zZXJ0KGxlbihMKS8vMiwgRW1wdHkoKSkKLSAgICBmb3IgYSBpbiBMOgotICAgICAgICBmb3IgYiBpbiBMOgotICAgICAgICAgICAgaWYgY21wKGEsIGIpICE9IGNtcChpZChhKSwgaWQoYikpOgotICAgICAgICAgICAgICAgIHByaW50ICJFUlJPUjoiLCBjbXAoYSwgYiksIGNtcChpZChhKSwgaWQoYikpLCBpZChhKSwgaWQoYikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChhLCBiKQogCi10ZXN0KCkKKyAgICBkZWYgdGVzdF9pZF9jb21wYXJpc29ucyhzZWxmKToKKyAgICAgICAgIyBFbnN1cmUgZGVmYXVsdCBjb21wYXJpc29uIGNvbXBhcmVzIGlkKCkgb2YgYXJncworICAgICAgICBMID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMTApOgorICAgICAgICAgICAgTC5pbnNlcnQobGVuKEwpLy8yLCBFbXB0eSgpKQorICAgICAgICBmb3IgYSBpbiBMOgorICAgICAgICAgICAgZm9yIGIgaW4gTDoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChhLCBiKSwgY21wKGlkKGEpLCBpZChiKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYT0lciwgYj0lcicgJSAoYSwgYikpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KENvbXBhcmlzb25UZXN0KQorCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGUucHkKaW5kZXggMWQ0N2Y5MS4uNzJjNGY3ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9jb21waWxlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29tcGlsZS5weQpAQCAtMjg0LDYgKzI4NCwxMCBAQAogICAgICAgICBmMSwgZjIgPSBmKCkKICAgICAgICAgc2VsZi5hc3NlcnROb3RFcXVhbChpZChmMS5mdW5jX2NvZGUpLCBpZChmMi5mdW5jX2NvZGUpKQogCisgICAgZGVmIHRlc3RfdW5pY29kZV9lbmNvZGluZyhzZWxmKToKKyAgICAgICAgY29kZSA9IHUiIyAtKi0gY29kaW5nOiB1dGYtOCAtKi1cbnBhc3NcbiIKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3ludGF4RXJyb3IsIGNvbXBpbGUsIGNvZGUsICJ0bXAiLCAiZXhlYyIpCisKICAgICBkZWYgdGVzdF9zdWJzY3JpcHRzKHNlbGYpOgogICAgICAgICAjIFNGIGJ1ZyAxNDQ4ODA0CiAgICAgICAgICMgQ2xhc3MgdG8gbWFrZSB0ZXN0aW5nIHN1YnNjcmlwdCByZXN1bHRzIGVhc3kKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZXIucHkgYi9MaWIvdGVzdC90ZXN0X2NvbXBpbGVyLnB5CmluZGV4IDVlN2IxNWMuLmE1OWQ2YWEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY29tcGlsZXIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb21waWxlci5weQpAQCAtMSwxMCArMSwxMiBAQAogaW1wb3J0IGNvbXBpbGVyCiBmcm9tIGNvbXBpbGVyLmFzdCBpbXBvcnQgZmxhdHRlbgotaW1wb3J0IG9zCitpbXBvcnQgb3MsIHN5cywgdGltZSwgdW5pdHRlc3QKIGltcG9ydCB0ZXN0LnRlc3Rfc3VwcG9ydAotaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHJhbmRvbSBpbXBvcnQgcmFuZG9tCiAKKyMgSG93IG11Y2ggdGltZSBpbiBzZWNvbmRzIGNhbiBwYXNzIGJlZm9yZSB3ZSBwcmludCBhICdTdGlsbCB3b3JraW5nJyBtZXNzYWdlLgorX1BSSU5UX1dPUktJTkdfTVNHX0lOVEVSVkFMID0gNSAqIDYwCisKIGNsYXNzIENvbXBpbGVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKICAgICBkZWYgdGVzdENvbXBpbGVMaWJyYXJ5KHNlbGYpOgpAQCAtMTMsMTEgKzE1LDE4IEBACiAgICAgICAgICMgdGhhdCBhbnkgb2YgdGhlIGNvZGUgaXMgY29ycmVjdCwgbWVyZWx5IHRoZSBjb21waWxlciBpcyBhYmxlCiAgICAgICAgICMgdG8gZ2VuZXJhdGUgc29tZSBraW5kIG9mIGNvZGUgZm9yIGl0LgogCisgICAgICAgIG5leHRfdGltZSA9IHRpbWUudGltZSgpICsgX1BSSU5UX1dPUktJTkdfTVNHX0lOVEVSVkFMCiAgICAgICAgIGxpYmRpciA9IG9zLnBhdGguZGlybmFtZSh1bml0dGVzdC5fX2ZpbGVfXykKICAgICAgICAgdGVzdGRpciA9IG9zLnBhdGguZGlybmFtZSh0ZXN0LnRlc3Rfc3VwcG9ydC5fX2ZpbGVfXykKIAogICAgICAgICBmb3IgZGlyIGluIFtsaWJkaXIsIHRlc3RkaXJdOgogICAgICAgICAgICAgZm9yIGJhc2VuYW1lIGluIG9zLmxpc3RkaXIoZGlyKToKKyAgICAgICAgICAgICAgICAjIFByaW50IHN0aWxsIHdvcmtpbmcgbWVzc2FnZSBzaW5jZSB0aGlzIHRlc3QgY2FuIGJlIHJlYWxseSBzbG93CisgICAgICAgICAgICAgICAgaWYgbmV4dF90aW1lIDw9IHRpbWUudGltZSgpOgorICAgICAgICAgICAgICAgICAgICBuZXh0X3RpbWUgPSB0aW1lLnRpbWUoKSArIF9QUklOVF9XT1JLSU5HX01TR19JTlRFUlZBTAorICAgICAgICAgICAgICAgICAgICBwcmludCA+PnN5cy5fX3N0ZG91dF9fLCBcCisgICAgICAgICAgICAgICAgICAgICAgICcgIHRlc3RDb21waWxlTGlicmFyeSBzdGlsbCB3b3JraW5nLCBiZSBwYXRpZW50Li4uJworCiAgICAgICAgICAgICAgICAgaWYgbm90IGJhc2VuYW1lLmVuZHN3aXRoKCIucHkiKToKICAgICAgICAgICAgICAgICAgICAgY29udGludWUKICAgICAgICAgICAgICAgICBpZiBub3QgVEVTVF9BTEwgYW5kIHJhbmRvbSgpIDwgMC45ODoKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weSBiL0xpYi90ZXN0L3Rlc3RfY29udGV4dGxpYi5weQppbmRleCBmOGRiODhjLi45NzQ3MGM3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvbnRleHRsaWIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9jb250ZXh0bGliLnB5CkBAIC0yLDEyICsyLDE0IEBACiAKIGZyb20gX19mdXR1cmVfXyBpbXBvcnQgd2l0aF9zdGF0ZW1lbnQKIAoraW1wb3J0IHN5cwogaW1wb3J0IG9zCiBpbXBvcnQgZGVjaW1hbAogaW1wb3J0IHRlbXBmaWxlCiBpbXBvcnQgdW5pdHRlc3QKIGltcG9ydCB0aHJlYWRpbmcKIGZyb20gY29udGV4dGxpYiBpbXBvcnQgKiAgIyBUZXN0cyBfX2FsbF9fCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fc3VpdGUKIAogY2xhc3MgQ29udGV4dE1hbmFnZXJUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTQ1LDYgKzQ3LDI4IEBACiAgICAgICAgICAgICBzZWxmLmZhaWwoIkV4cGVjdGVkIFplcm9EaXZpc2lvbkVycm9yIikKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdGF0ZSwgWzEsIDQyLCA5OTldKQogCisgICAgZGVmIHRlc3RfY29udGV4dG1hbmFnZXJfbm9fcmVyYWlzZShzZWxmKToKKyAgICAgICAgQGNvbnRleHRtYW5hZ2VyCisgICAgICAgIGRlZiB3aGVlKCk6CisgICAgICAgICAgICB5aWVsZAorICAgICAgICBjdHggPSB3aGVlKCkuX19jb250ZXh0X18oKQorICAgICAgICBjdHguX19lbnRlcl9fKCkKKyAgICAgICAgIyBDYWxsaW5nIF9fZXhpdF9fIHNob3VsZCBub3QgcmVzdWx0IGluIGFuIGV4Y2VwdGlvbgorICAgICAgICBzZWxmLmZhaWxJZihjdHguX19leGl0X18oVHlwZUVycm9yLCBUeXBlRXJyb3IoImZvbyIpLCBOb25lKSkKKworICAgIGRlZiB0ZXN0X2NvbnRleHRtYW5hZ2VyX3RyYXBfeWllbGRfYWZ0ZXJfdGhyb3coc2VsZik6CisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgd2hvbygpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHlpZWxkCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgeWllbGQKKyAgICAgICAgY3R4ID0gd2hvbygpLl9fY29udGV4dF9fKCkKKyAgICAgICAgY3R4Ll9fZW50ZXJfXygpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgUnVudGltZUVycm9yLCBjdHguX19leGl0X18sIFR5cGVFcnJvciwgVHlwZUVycm9yKCJmb28iKSwgTm9uZQorICAgICAgICApCisKICAgICBkZWYgdGVzdF9jb250ZXh0bWFuYWdlcl9leGNlcHQoc2VsZik6CiAgICAgICAgIHN0YXRlID0gW10KICAgICAgICAgQGNvbnRleHRtYW5hZ2VyCkBAIC02Miw2ICs4NiwyMSBAQAogICAgICAgICAgICAgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IoOTk5KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXRlLCBbMSwgNDIsIDk5OV0pCiAKKyAgICBkZWYgdGVzdF9jb250ZXh0bWFuYWdlcl9hdHRyaWJzKHNlbGYpOgorICAgICAgICBkZWYgYXR0cmlicygqKmt3KToKKyAgICAgICAgICAgIGRlZiBkZWNvcmF0ZShmdW5jKToKKyAgICAgICAgICAgICAgICBmb3Igayx2IGluIGt3Lml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIHNldGF0dHIoZnVuYyxrLHYpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmMKKyAgICAgICAgICAgIHJldHVybiBkZWNvcmF0ZQorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgQGF0dHJpYnMoZm9vPSdiYXInKQorICAgICAgICBkZWYgYmF6KHNwYW0pOgorICAgICAgICAgICAgIiIiV2hlZSEiIiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChiYXouX19uYW1lX18sJ2JheicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmF6LmZvbywgJ2JhcicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoYmF6Ll9fZG9jX18sICJXaGVlISIpCisKIGNsYXNzIE5lc3RlZFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgICMgWFhYIFRoaXMgbmVlZHMgbW9yZSB3b3JrCkBAIC0yNzQsMjEgKzMxMywzMSBAQAogCiAgICAgZGVmIHRlc3RCYXNpYyhzZWxmKToKICAgICAgICAgY3R4ID0gZGVjaW1hbC5nZXRjb250ZXh0KCkKLSAgICAgICAgY3R4LnByZWMgPSBzYXZlX3ByZWMgPSBkZWNpbWFsLkV4dGVuZGVkQ29udGV4dC5wcmVjICsgNQotICAgICAgICB3aXRoIGRlY2ltYWwuRXh0ZW5kZWRDb250ZXh0OgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNpbWFsLmdldGNvbnRleHQoKS5wcmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLkV4dGVuZGVkQ29udGV4dC5wcmVjKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY2ltYWwuZ2V0Y29udGV4dCgpLnByZWMsIHNhdmVfcHJlYykKKyAgICAgICAgb3JpZ19jb250ZXh0ID0gY3R4LmNvcHkoKQogICAgICAgICB0cnk6CisgICAgICAgICAgICBjdHgucHJlYyA9IHNhdmVfcHJlYyA9IGRlY2ltYWwuRXh0ZW5kZWRDb250ZXh0LnByZWMgKyA1CiAgICAgICAgICAgICB3aXRoIGRlY2ltYWwuRXh0ZW5kZWRDb250ZXh0OgogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjaW1hbC5nZXRjb250ZXh0KCkucHJlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwuRXh0ZW5kZWRDb250ZXh0LnByZWMpCi0gICAgICAgICAgICAgICAgMS8wCi0gICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjaW1hbC5nZXRjb250ZXh0KCkucHJlYywgc2F2ZV9wcmVjKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpdGggZGVjaW1hbC5FeHRlbmRlZENvbnRleHQ6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjaW1hbC5nZXRjb250ZXh0KCkucHJlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNpbWFsLkV4dGVuZGVkQ29udGV4dC5wcmVjKQorICAgICAgICAgICAgICAgICAgICAxLzAKKyAgICAgICAgICAgIGV4Y2VwdCBaZXJvRGl2aXNpb25FcnJvcjoKKyAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY2ltYWwuZ2V0Y29udGV4dCgpLnByZWMsIHNhdmVfcHJlYykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5mYWlsKCJEaWRuJ3QgcmFpc2UgWmVyb0RpdmlzaW9uRXJyb3IiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgZGVjaW1hbC5zZXRjb250ZXh0KG9yaWdfY29udGV4dCkKIAogCisjIFRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgdGhlIHRlc3QgYWN0dWFsbHkgcnVuIHVuZGVyIHJlZ3J0ZXN0LnB5IQorZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl9zdWl0ZSgKKyAgICAgICAgdW5pdHRlc3QuZGVmYXVsdFRlc3RMb2FkZXIubG9hZFRlc3RzRnJvbU1vZHVsZShzeXMubW9kdWxlc1tfX25hbWVfX10pCisgICAgKQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotICAgIHVuaXR0ZXN0Lm1haW4oKQorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2NvcHlfcmVnLnB5IGIvTGliL3Rlc3QvdGVzdF9jb3B5X3JlZy5weQppbmRleCBjNDE5NDZhLi5jM2QzOTY0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2NvcHlfcmVnLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY29weV9yZWcucHkKQEAgLTgsNiArOCwyMiBAQAogICAgIHBhc3MKIAogCitjbGFzcyBXaXRob3V0U2xvdHMob2JqZWN0KToKKyAgICBwYXNzCisKK2NsYXNzIFdpdGhXZWFrcmVmKG9iamVjdCk6CisgICAgX19zbG90c19fID0gKCdfX3dlYWtyZWZfXycsKQorCitjbGFzcyBXaXRoUHJpdmF0ZShvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9ICgnX19zcGFtJywpCisKK2NsYXNzIFdpdGhTaW5nbGVTdHJpbmcob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSAnc3BhbScKKworY2xhc3MgV2l0aEluaGVyaXRlZChXaXRoU2luZ2xlU3RyaW5nKToKKyAgICBfX3Nsb3RzX18gPSAoJ2VnZ3MnLCkKKworCiBjbGFzcyBDb3B5UmVnVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogCiAgICAgZGVmIHRlc3RfY2xhc3Moc2VsZik6CkBAIC04NCw2ICsxMDAsMTkgQEAKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIGNvcHlfcmVnLmFkZF9leHRlbnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2QsIGZ1bmMsIGNvZGUpCiAKKyAgICBkZWYgdGVzdF9zbG90bmFtZXMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvcHlfcmVnLl9zbG90bmFtZXMoV2l0aG91dFNsb3RzKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvcHlfcmVnLl9zbG90bmFtZXMoV2l0aFdlYWtyZWYpLCBbXSkKKyAgICAgICAgZXhwZWN0ZWQgPSBbJ19XaXRoUHJpdmF0ZV9fc3BhbSddCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGNvcHlfcmVnLl9zbG90bmFtZXMoV2l0aFByaXZhdGUpLCBleHBlY3RlZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoY29weV9yZWcuX3Nsb3RuYW1lcyhXaXRoU2luZ2xlU3RyaW5nKSwgWydzcGFtJ10pCisgICAgICAgIGV4cGVjdGVkID0gWydlZ2dzJywgJ3NwYW0nXQorICAgICAgICBleHBlY3RlZC5zb3J0KCkKKyAgICAgICAgcmVzdWx0ID0gY29weV9yZWcuX3Nsb3RuYW1lcyhXaXRoSW5oZXJpdGVkKQorICAgICAgICByZXN1bHQuc29ydCgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdCwgZXhwZWN0ZWQpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQ29weVJlZ1Rlc3RDYXNlKQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2N1cnNlcy5weSBiL0xpYi90ZXN0L3Rlc3RfY3Vyc2VzLnB5CmluZGV4IGE0YTQ1YTcuLmRjMmYyMGIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfY3Vyc2VzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfY3Vyc2VzLnB5CkBAIC0yNCw2ICsyNCw5IEBACiBpZiBub3QgdGVybSBvciB0ZXJtID09ICd1bmtub3duJzoKICAgICByYWlzZSBUZXN0U2tpcHBlZCwgIiRURVJNPSVyLCBjYWxsaW5nIGluaXRzY3IoKSBtYXkgY2F1c2UgZXhpdCIgJSB0ZXJtCiAKK2lmIHN5cy5wbGF0Zm9ybSA9PSAiY3lnd2luIjoKKyAgICByYWlzZSBUZXN0U2tpcHBlZCgiY3lnd2luJ3MgY3Vyc2VzIG1vc3RseSBqdXN0IGhhbmdzIikKKwogZGVmIHdpbmRvd19mdW5jcyhzdGRzY3IpOgogICAgICJUZXN0IHRoZSBtZXRob2RzIG9mIHdpbmRvd3MiCiAgICAgd2luID0gY3Vyc2VzLm5ld3dpbigxMCwxMCkKQEAgLTIwMSwxMSArMjA0LDEzIEBACiAgICAgICAgIGN1cnNlcy5oYXNfa2V5KDEzKQogCiAgICAgaWYgaGFzYXR0cihjdXJzZXMsICdnZXRtb3VzZScpOgotICAgICAgICBjdXJzZXMubW91c2VtYXNrKGN1cnNlcy5CVVRUT04xX1BSRVNTRUQpCi0gICAgICAgIGN1cnNlcy5tb3VzZWludGVydmFsKDEwKQotICAgICAgICAjIGp1c3QgdmVyaWZ5IHRoZXNlIGRvbid0IGNhdXNlIGVycm9ycwotICAgICAgICBtID0gY3Vyc2VzLmdldG1vdXNlKCkKLSAgICAgICAgY3Vyc2VzLnVuZ2V0bW91c2UoKm0pCisgICAgICAgIChhdmFpbG1hc2ssIG9sZG1hc2spID0gY3Vyc2VzLm1vdXNlbWFzayhjdXJzZXMuQlVUVE9OMV9QUkVTU0VEKQorICAgICAgICAjIGF2YWlsbWFzayBpbmRpY2F0ZXMgdGhhdCBtb3VzZSBzdHVmZiBub3QgYXZhaWxhYmxlLgorICAgICAgICBpZiBhdmFpbG1hc2sgIT0gMDoKKyAgICAgICAgICAgIGN1cnNlcy5tb3VzZWludGVydmFsKDEwKQorICAgICAgICAgICAgIyBqdXN0IHZlcmlmeSB0aGVzZSBkb24ndCBjYXVzZSBlcnJvcnMKKyAgICAgICAgICAgIG0gPSBjdXJzZXMuZ2V0bW91c2UoKQorICAgICAgICAgICAgY3Vyc2VzLnVuZ2V0bW91c2UoKm0pCiAKIGRlZiB1bml0X3Rlc3RzKCk6CiAgICAgZnJvbSBjdXJzZXMgaW1wb3J0IGFzY2lpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5IGIvTGliL3Rlc3QvdGVzdF9kYXRldGltZS5weQppbmRleCAyN2Y0MmM2Li4yNTI4YjRhIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2RhdGV0aW1lLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGF0ZXRpbWUucHkKQEAgLTExNjgsNiArMTE2OCwxNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGR0MiAtIGR0MSwgdXMpCiAgICAgICAgIHNlbGYuYXNzZXJ0XyhkdDEgPCBkdDIpCiAKKyAgICBkZWYgdGVzdF9zdHJmdGltZV93aXRoX2JhZF90em5hbWVfcmVwbGFjZShzZWxmKToKKyAgICAgICAgIyB2ZXJpZnkgb2sgaWYgdHppbmZvLnR6bmFtZSgpLnJlcGxhY2UoKSByZXR1cm5zIGEgbm9uLXN0cmluZworICAgICAgICBjbGFzcyBNeVR6SW5mbyhGaXhlZE9mZnNldCk6CisgICAgICAgICAgICBkZWYgdHpuYW1lKHNlbGYsIGR0KToKKyAgICAgICAgICAgICAgICBjbGFzcyBNeVN0cihzdHIpOgorICAgICAgICAgICAgICAgICAgICBkZWYgcmVwbGFjZShzZWxmLCAqYXJncyk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICAgICAgICAgIHJldHVybiBNeVN0cignbmFtZScpCisgICAgICAgIHQgPSBzZWxmLnRoZWNsYXNzKDIwMDUsIDMsIDIsIDAsIDAsIDAsIDAsIE15VHpJbmZvKDMsICduYW1lJykpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgdC5zdHJmdGltZSwgJyVaJykKKwogICAgIGRlZiB0ZXN0X2JhZF9jb25zdHJ1Y3Rvcl9hcmd1bWVudHMoc2VsZik6CiAgICAgICAgICMgYmFkIHllYXJzCiAgICAgICAgIHNlbGYudGhlY2xhc3MoTUlOWUVBUiwgMSwgMSkgICMgbm8gZXhjZXB0aW9uCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkgYi9MaWIvdGVzdC90ZXN0X2RlY2ltYWwucHkKaW5kZXggMWQzM2VjNC4uMzQxYWQ2ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kZWNpbWFsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVjaW1hbC5weQpAQCAtMjksNyArMjksOCBAQAogaW1wb3J0IG9zLCBzeXMKIGltcG9ydCBwaWNrbGUsIGNvcHkKIGZyb20gZGVjaW1hbCBpbXBvcnQgKgotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIHJ1bl91bml0dGVzdCwgcnVuX2RvY3Rlc3QsIGlzX3Jlc291cmNlX2VuYWJsZWQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IChUZXN0U2tpcHBlZCwgcnVuX3VuaXR0ZXN0LCBydW5fZG9jdGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19yZXNvdXJjZV9lbmFibGVkKQogaW1wb3J0IHJhbmRvbQogdHJ5OgogICAgIGltcG9ydCB0aHJlYWRpbmcKQEAgLTM5LDEyICs0MCwxNSBAQAogIyBVc2VmdWwgVGVzdCBDb25zdGFudAogU2lnbmFscyA9IGdldGNvbnRleHQoKS5mbGFncy5rZXlzKCkKIAotIyBUZXN0cyBhcmUgYnVpbHQgYXJvdW5kIHRoZXNlIGFzc3VtZWQgY29udGV4dCBkZWZhdWx0cwotRGVmYXVsdENvbnRleHQucHJlYz05Ci1EZWZhdWx0Q29udGV4dC5yb3VuZGluZz1ST1VORF9IQUxGX0VWRU4KLURlZmF1bHRDb250ZXh0LnRyYXBzPWRpY3QuZnJvbWtleXMoU2lnbmFscywgMCkKLXNldGNvbnRleHQoRGVmYXVsdENvbnRleHQpCi0KKyMgVGVzdHMgYXJlIGJ1aWx0IGFyb3VuZCB0aGVzZSBhc3N1bWVkIGNvbnRleHQgZGVmYXVsdHMuCisjIHRlc3RfbWFpbigpIHJlc3RvcmVzIHRoZSBvcmlnaW5hbCBjb250ZXh0LgorZGVmIGluaXQoKToKKyAgICBnbG9iYWwgT1JJR0lOQUxfQ09OVEVYVAorICAgIE9SSUdJTkFMX0NPTlRFWFQgPSBnZXRjb250ZXh0KCkuY29weSgpCisgICAgRGVmYXVsdENvbnRleHQucHJlYyA9IDkKKyAgICBEZWZhdWx0Q29udGV4dC5yb3VuZGluZyA9IFJPVU5EX0hBTEZfRVZFTgorICAgIERlZmF1bHRDb250ZXh0LnRyYXBzID0gZGljdC5mcm9ta2V5cyhTaWduYWxzLCAwKQorICAgIHNldGNvbnRleHQoRGVmYXVsdENvbnRleHQpCiAKIFRFU1REQVRBRElSID0gJ2RlY2ltYWx0ZXN0ZGF0YScKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CkBAIC01MDMsMTYgKzUwNywxNyBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGV2YWwoJ0RlY2ltYWwoMTApICE9IEUoKScpLCAnbmUgMTAnKQogCiAgICAgICAgICMgaW5zZXJ0IG9wZXJhdG9yIG1ldGhvZHMgYW5kIHRoZW4gZXhlcmNpc2UgdGhlbQotICAgICAgICBmb3Igc3ltLCBsb3AsIHJvcCBpbiAoCi0gICAgICAgICAgICAgICAgKCcrJywgJ19fYWRkX18nLCAnX19yYWRkX18nKSwKLSAgICAgICAgICAgICAgICAoJy0nLCAnX19zdWJfXycsICdfX3JzdWJfXycpLAotICAgICAgICAgICAgICAgICgnKicsICdfX211bF9fJywgJ19fcm11bF9fJyksCi0gICAgICAgICAgICAgICAgKCcvJywgJ19fdHJ1ZWRpdl9fJywgJ19fcnRydWVkaXZfXycpLAotICAgICAgICAgICAgICAgICgnJScsICdfX21vZF9fJywgJ19fcm1vZF9fJyksCi0gICAgICAgICAgICAgICAgKCcvLycsICdfX2Zsb29yZGl2X18nLCAnX19yZmxvb3JkaXZfXycpLAotICAgICAgICAgICAgICAgICgnKionLCAnX19wb3dfXycsICdfX3Jwb3dfXycpLAotICAgICAgICAgICAgKToKKyAgICAgICAgb3BsaXN0ID0gWworICAgICAgICAgICAgKCcrJywgJ19fYWRkX18nLCAnX19yYWRkX18nKSwKKyAgICAgICAgICAgICgnLScsICdfX3N1Yl9fJywgJ19fcnN1Yl9fJyksCisgICAgICAgICAgICAoJyonLCAnX19tdWxfXycsICdfX3JtdWxfXycpLAorICAgICAgICAgICAgKCcvJywgJ19fdHJ1ZWRpdl9fJywgJ19fcnRydWVkaXZfXycpCisgICAgICAgICAgICAoJyUnLCAnX19tb2RfXycsICdfX3Jtb2RfXycpLAorICAgICAgICAgICAgKCcvLycsICdfX2Zsb29yZGl2X18nLCAnX19yZmxvb3JkaXZfXycpLAorICAgICAgICAgICAgKCcqKicsICdfX3Bvd19fJywgJ19fcnBvd19fJykKKyAgICAgICAgXQogCisgICAgICAgIGZvciBzeW0sIGxvcCwgcm9wIGluIG9wbGlzdDoKICAgICAgICAgICAgIHNldGF0dHIoRSwgbG9wLCBsYW1iZGEgc2VsZiwgb3RoZXI6ICdzdHInICsgbG9wICsgc3RyKG90aGVyKSkKICAgICAgICAgICAgIHNldGF0dHIoRSwgcm9wLCBsYW1iZGEgc2VsZiwgb3RoZXI6IHN0cihvdGhlcikgKyByb3AgKyAnc3RyJykKICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXZhbCgnRSgpJyArIHN5bSArICdEZWNpbWFsKDEwKScpLApAQCAtMTA1OSw2ICsxMDY0LDcgQEAKICAgICBpcyBlbmFibGVkIGluIHJlZ3J0ZXN0LnB5CiAgICAgIiIiCiAKKyAgICBpbml0KCkKICAgICBnbG9iYWwgVEVTVF9BTEwKICAgICBURVNUX0FMTCA9IGFyaXRoIG9yIGlzX3Jlc291cmNlX2VuYWJsZWQoJ2RlY2ltYWwnKQogCkBAIC0xMDczLDEwICsxMDc5LDEyIEBACiAgICAgICAgIERlY2ltYWxUZXN0LAogICAgIF0KIAotICAgIHJ1bl91bml0dGVzdCgqdGVzdF9jbGFzc2VzKQotICAgIGltcG9ydCBkZWNpbWFsIGFzIERlY2ltYWxNb2R1bGUKLSAgICBydW5fZG9jdGVzdChEZWNpbWFsTW9kdWxlLCB2ZXJib3NlKQotCisgICAgdHJ5OgorICAgICAgICBydW5fdW5pdHRlc3QoKnRlc3RfY2xhc3NlcykKKyAgICAgICAgaW1wb3J0IGRlY2ltYWwgYXMgRGVjaW1hbE1vZHVsZQorICAgICAgICBydW5fZG9jdGVzdChEZWNpbWFsTW9kdWxlLCB2ZXJib3NlKQorICAgIGZpbmFsbHk6CisgICAgICAgIHNldGNvbnRleHQoT1JJR0lOQUxfQ09OVEVYVCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgICAjIENhbGxpbmcgd2l0aCBubyBhcmd1bWVudHMgcnVucyBhbGwgdGVzdHMuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5IGIvTGliL3Rlc3QvdGVzdF9kZXNjci5weQppbmRleCAxODVlZGIzLi44OWNlYmIwIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2Rlc2NyLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGVzY3IucHkKQEAgLTE2MzgsNyArMTYzOCw5IEBACiAgICAgYzEgPSBDKCkKICAgICBjMiA9IEMoKQogICAgIHZlcmlmeShub3Qgbm90IGMxKQotICAgIHZlcmVxKGhhc2goYzEpLCBpZChjMSkpCisgICAgdmVyaWZ5KGlkKGMxKSAhPSBpZChjMikpCisgICAgaGFzaChjMSkKKyAgICBoYXNoKGMyKQogICAgIHZlcmVxKGNtcChjMSwgYzIpLCBjbXAoaWQoYzEpLCBpZChjMikpKQogICAgIHZlcmVxKGMxLCBjMSkKICAgICB2ZXJpZnkoYzEgIT0gYzIpCkBAIC0xNjYwLDcgKzE2NjIsOSBAQAogICAgIGQxID0gRCgpCiAgICAgZDIgPSBEKCkKICAgICB2ZXJpZnkobm90IG5vdCBkMSkKLSAgICB2ZXJlcShoYXNoKGQxKSwgaWQoZDEpKQorICAgIHZlcmlmeShpZChkMSkgIT0gaWQoZDIpKQorICAgIGhhc2goZDEpCisgICAgaGFzaChkMikKICAgICB2ZXJlcShjbXAoZDEsIGQyKSwgY21wKGlkKGQxKSwgaWQoZDIpKSkKICAgICB2ZXJlcShkMSwgZDEpCiAgICAgdmVyaWZ5KGQxICE9IGQyKQpAQCAtMjkxNCw3ICsyOTE4LDcgQEAKICAgICBjbGFzcyBEKEIsIEMpOgogICAgICAgICBwYXNzCiAgICAgZCA9IEQoKQotICAgIHZlcmVxKGhhc2goZCksIGlkKGQpKQorICAgIG9yaWdfaGFzaCA9IGhhc2goZCkgIyByZWxhdGVkIHRvIGlkKGQpIGluIHBsYXRmb3JtLWRlcGVuZGVudCB3YXlzCiAgICAgQS5fX2hhc2hfXyA9IGxhbWJkYSBzZWxmOiA0MgogICAgIHZlcmVxKGhhc2goZCksIDQyKQogICAgIEMuX19oYXNoX18gPSBsYW1iZGEgc2VsZjogMzE0CkBAIC0yOTMwLDcgKzI5MzQsNyBAQAogICAgIGRlbCBDLl9faGFzaF9fCiAgICAgdmVyZXEoaGFzaChkKSwgNDIpCiAgICAgZGVsIEEuX19oYXNoX18KLSAgICB2ZXJlcShoYXNoKGQpLCBpZChkKSkKKyAgICB2ZXJlcShoYXNoKGQpLCBvcmlnX2hhc2gpCiAgICAgZC5mb28gPSA0MgogICAgIGQuYmFyID0gNDIKICAgICB2ZXJlcShkLmZvbywgNDIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RpZmZsaWIucHkgYi9MaWIvdGVzdC90ZXN0X2RpZmZsaWIucHkKaW5kZXggNTJmZWVmMC4uODNmYWQxNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kaWZmbGliLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGlmZmxpYi5weQpAQCAtMTUyLDYgKzE1MiwxMCBAQAogICAgICAgICBkaWZmbGliLlNlcXVlbmNlTWF0Y2hlcihOb25lLCBvbGQsIG5ldykuZ2V0X29wY29kZXMoKQogCiAKLURvY3Rlc3RzID0gZG9jdGVzdC5Eb2NUZXN0U3VpdGUoZGlmZmxpYikKK2RlZiB0ZXN0X21haW4oKToKKyAgICBkaWZmbGliLkh0bWxEaWZmLl9kZWZhdWx0X3ByZWZpeCA9IDAKKyAgICBEb2N0ZXN0cyA9IGRvY3Rlc3QuRG9jVGVzdFN1aXRlKGRpZmZsaWIpCisgICAgcnVuX3VuaXR0ZXN0KFRlc3RTRnBhdGNoZXMsIFRlc3RTRmJ1Z3MsIERvY3Rlc3RzKQogCi1ydW5fdW5pdHRlc3QoVGVzdFNGcGF0Y2hlcywgVGVzdFNGYnVncywgRG9jdGVzdHMpCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RsLnB5IGIvTGliL3Rlc3QvdGVzdF9kbC5weQppbmRleCBkMWY3M2IyLi5iNzBhNGNmIDEwMDc1NQotLS0gYS9MaWIvdGVzdC90ZXN0X2RsLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZGwucHkKQEAgLTEwLDYgKzEwLDcgQEAKICAgICAoJy91c3IvbGliL2xpYmMuc28nLCAnZ2V0cGlkJyksCiAgICAgKCcvbGliL2xpYmMuc28uNicsICdnZXRwaWQnKSwKICAgICAoJy91c3IvYmluL2N5Z3dpbjEuZGxsJywgJ2dldHBpZCcpLAorICAgICgnL3Vzci9saWIvbGliYy5keWxpYicsICdnZXRwaWQnKSwKICAgICBdCiAKIGZvciBzLCBmdW5jIGluIHNoYXJlZGxpYnM6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkgYi9MaWIvdGVzdC90ZXN0X2RvY3Rlc3QucHkKaW5kZXggMWY4OWFjMi4uYjE3NjA3ZCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9kb2N0ZXN0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZG9jdGVzdC5weQpAQCAtNjA0LDggKzYwNCw4IEBACiAgICAgLi4uICAgICA+Pj4gZm9yIHggaW4gcmFuZ2UoMTApOgogICAgIC4uLiAgICAgLi4uICAgICBwcmludCB4LAogICAgIC4uLiAgICAgMCAxIDIgMyA0IDUgNiA3IDggOQotICAgIC4uLiAgICAgPj4+IHgvMgotICAgIC4uLiAgICAgNi4wCisgICAgLi4uICAgICA+Pj4geC8vMgorICAgIC4uLiAgICAgNgogICAgIC4uLiAgICAgJycnCiAgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCiAgICAgPj4+IFtlLmxpbmVubyBmb3IgZSBpbiB0ZXN0LmV4YW1wbGVzXQpAQCAtNjc5LDggKzY3OSw4IEBACiAgICAgLi4uICAgICA+Pj4geCA9IDEyCiAgICAgLi4uICAgICA+Pj4gcHJpbnQgeAogICAgIC4uLiAgICAgMTIKLSAgICAuLi4gICAgID4+PiB4LzIKLSAgICAuLi4gICAgIDYuMAorICAgIC4uLiAgICAgPj4+IHgvLzIKKyAgICAuLi4gICAgIDYKICAgICAuLi4gICAgICcnJwogICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogCkBAIC03MDAsOCArNzAwLDggQEAKICAgICAuLi4gICAgID4+PiB4ID0gMTIKICAgICAuLi4gICAgID4+PiBwcmludCB4CiAgICAgLi4uICAgICAxNAotICAgIC4uLiAgICAgPj4+IHgvMgotICAgIC4uLiAgICAgNi4wCisgICAgLi4uICAgICA+Pj4geC8vMgorICAgIC4uLiAgICAgNgogICAgIC4uLiAgICAgJycnCiAgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCiAgICAgPj4+IGRvY3Rlc3QuRG9jVGVzdFJ1bm5lcih2ZXJib3NlPVRydWUpLnJ1bih0ZXN0KQpAQCAtNzIzLDkgKzcyMyw5IEBACiAgICAgR290OgogICAgICAgICAxMgogICAgIFRyeWluZzoKLSAgICAgICAgeC8yCisgICAgICAgIHgvLzIKICAgICBFeHBlY3Rpbmc6Ci0gICAgICAgIDYuMAorICAgICAgICA2CiAgICAgb2sKICAgICAoMSwgMykKICIiIgpAQCAtNzM4LDggKzczOCw4IEBACiAgICAgLi4uICAgICA+Pj4geCA9IDEyCiAgICAgLi4uICAgICA+Pj4gcHJpbnQgeAogICAgIC4uLiAgICAgMTIKLSAgICAuLi4gICAgID4+PiB4LzIKLSAgICAuLi4gICAgIDYuMAorICAgIC4uLiAgICAgPj4+IHgvLzIKKyAgICAuLi4gICAgIDYKICAgICAuLi4gICAgICcnJwogICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogCkBAIC03NTQsOSArNzU0LDkgQEAKICAgICAgICAgMTIKICAgICBvawogICAgIFRyeWluZzoKLSAgICAgICAgeC8yCisgICAgICAgIHgvLzIKICAgICBFeHBlY3Rpbmc6Ci0gICAgICAgIDYuMAorICAgICAgICA2CiAgICAgb2sKICAgICAoMCwgMykKIApAQCAtNzg0LDkgKzc4NCw5IEBACiAgICAgICAgIDEyCiAgICAgb2sKICAgICBUcnlpbmc6Ci0gICAgICAgIHgvMgorICAgICAgICB4Ly8yCiAgICAgRXhwZWN0aW5nOgotICAgICAgICA2LjAKKyAgICAgICAgNgogICAgIG9rCiAgICAgKDAsIDMpCiAKQEAgLTgwNiw5ICs4MDYsOSBAQAogICAgID4+PiBkZWYgZih4KToKICAgICAuLi4gICAgICcnJwogICAgIC4uLiAgICAgPj4+IHggPSAxMgotICAgIC4uLiAgICAgPj4+IHByaW50IHgvMAorICAgIC4uLiAgICAgPj4+IHByaW50IHgvLzAKICAgICAuLi4gICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKLSAgICAuLi4gICAgIFplcm9EaXZpc2lvbkVycm9yOiBmbG9hdCBkaXZpc2lvbgorICAgIC4uLiAgICAgWmVyb0RpdmlzaW9uRXJyb3I6IGludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm8KICAgICAuLi4gICAgICcnJwogICAgID4+PiB0ZXN0ID0gZG9jdGVzdC5Eb2NUZXN0RmluZGVyKCkuZmluZChmKVswXQogICAgID4+PiBkb2N0ZXN0LkRvY1Rlc3RSdW5uZXIodmVyYm9zZT1GYWxzZSkucnVuKHRlc3QpCkBAIC04MjIsMTAgKzgyMiwxMCBAQAogICAgID4+PiBkZWYgZih4KToKICAgICAuLi4gICAgICcnJwogICAgIC4uLiAgICAgPj4+IHggPSAxMgotICAgIC4uLiAgICAgPj4+IHByaW50ICdwcmUtZXhjZXB0aW9uIG91dHB1dCcsIHgvMAorICAgIC4uLiAgICAgPj4+IHByaW50ICdwcmUtZXhjZXB0aW9uIG91dHB1dCcsIHgvLzAKICAgICAuLi4gICAgIHByZS1leGNlcHRpb24gb3V0cHV0CiAgICAgLi4uICAgICBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6Ci0gICAgLi4uICAgICBaZXJvRGl2aXNpb25FcnJvcjogZmxvYXQgZGl2aXNpb24KKyAgICAuLi4gICAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvCiAgICAgLi4uICAgICAnJycKICAgICA+Pj4gdGVzdCA9IGRvY3Rlc3QuRG9jVGVzdEZpbmRlcigpLmZpbmQoZilbMF0KICAgICA+Pj4gZG9jdGVzdC5Eb2NUZXN0UnVubmVyKHZlcmJvc2U9RmFsc2UpLnJ1bih0ZXN0KQpAQCAtODMzLDEwICs4MzMsMTAgQEAKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgRmlsZSAuLi4sIGxpbmUgNCwgaW4gZgogICAgIEZhaWxlZCBleGFtcGxlOgotICAgICAgICBwcmludCAncHJlLWV4Y2VwdGlvbiBvdXRwdXQnLCB4LzAKKyAgICAgICAgcHJpbnQgJ3ByZS1leGNlcHRpb24gb3V0cHV0JywgeC8vMAogICAgIEV4Y2VwdGlvbiByYWlzZWQ6CiAgICAgICAgIC4uLgotICAgICAgICBaZXJvRGl2aXNpb25FcnJvcjogZmxvYXQgZGl2aXNpb24KKyAgICAgICAgWmVyb0RpdmlzaW9uRXJyb3I6IGludGVnZXIgZGl2aXNpb24gb3IgbW9kdWxvIGJ5IHplcm8KICAgICAoMSwgMikKIAogRXhjZXB0aW9uIG1lc3NhZ2VzIG1heSBjb250YWluIG5ld2xpbmVzOgpAQCAtOTIwLDcgKzkyMCw3IEBACiAKICAgICA+Pj4gZGVmIGYoeCk6CiAgICAgLi4uICAgICByJycnCi0gICAgLi4uICAgICA+Pj4gMS8wCisgICAgLi4uICAgICA+Pj4gMS8vMAogICAgIC4uLiAgICAgMAogICAgIC4uLiAgICAgJycnCiAgICAgPj4+IHRlc3QgPSBkb2N0ZXN0LkRvY1Rlc3RGaW5kZXIoKS5maW5kKGYpWzBdCkBAIC05MjksMTEgKzkyOSwxMSBAQAogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBGaWxlIC4uLiwgbGluZSAzLCBpbiBmCiAgICAgRmFpbGVkIGV4YW1wbGU6Ci0gICAgICAgIDEvMAorICAgICAgICAxLy8wCiAgICAgRXhjZXB0aW9uIHJhaXNlZDoKICAgICAgICAgVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAgICAgICAuLi4KLSAgICAgICAgWmVyb0RpdmlzaW9uRXJyb3I6IGZsb2F0IGRpdmlzaW9uCisgICAgICAgIFplcm9EaXZpc2lvbkVycm9yOiBpbnRlZ2VyIGRpdmlzaW9uIG9yIG1vZHVsbyBieSB6ZXJvCiAgICAgKDEsIDEpCiAiIiIKICAgICBkZWYgb3B0aW9uZmxhZ3MoKTogciIiIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5IGIvTGliL3Rlc3QvdGVzdF9lbWFpbF9yZW5hbWVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYWY1OTgKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X2VtYWlsX3JlbmFtZWQucHkKQEAgLTAsMCArMSwxMyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNiBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbgorIyBlbWFpbCBwYWNrYWdlIHVuaXQgdGVzdHMKKworaW1wb3J0IHVuaXR0ZXN0CisjIFRoZSBzcGVjaWZpYyB0ZXN0cyBub3cgbGl2ZSBpbiBMaWIvZW1haWwvdGVzdAorZnJvbSBlbWFpbC50ZXN0LnRlc3RfZW1haWxfcmVuYW1lZCBpbXBvcnQgc3VpdGUKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHJ1bl9zdWl0ZQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3N1aXRlKHN1aXRlKCkpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3RfZmlsZS5weQppbmRleCBmZDU2NzBhLi5hYjNkYTg2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZpbGUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9maWxlLnB5CkBAIC0xMDAsMTIgKzEwMCwxOCBAQAogICAgIHByaW50ICJ3cml0ZWxpbmVzIGFjY2VwdGVkIHNlcXVlbmNlIG9mIG5vbi1zdHJpbmcgb2JqZWN0cyIKIGYuY2xvc2UoKQogCi10cnk6Ci0gICAgc3lzLnN0ZGluLnNlZWsoLTEpCi1leGNlcHQgSU9FcnJvcjoKLSAgICBwYXNzCisjIFRoaXMgY2F1c2VzIHRoZSBpbnRlcnByZXRlciB0byBleGl0IG9uIE9TRjEgdjUuMS4KK2lmIHN5cy5wbGF0Zm9ybSAhPSAnb3NmMVY1JzoKKyAgICB0cnk6CisgICAgICAgIHN5cy5zdGRpbi5zZWVrKC0xKQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgInNob3VsZCBub3QgYmUgYWJsZSB0byBzZWVrIG9uIHN5cy5zdGRpbiIKIGVsc2U6Ci0gICAgcHJpbnQgInNob3VsZCBub3QgYmUgYWJsZSB0byBzZWVrIG9uIHN5cy5zdGRpbiIKKyAgICBwcmludCA+PnN5cy5fX3N0ZG91dF9fLCAoCisgICAgICAgICcgIFNraXBwaW5nIHN5cy5zdGRpbi5zZWVrKC0xKSwgaXQgbWF5IGNyYXNoIHRoZSBpbnRlcnByZXRlci4nCisgICAgICAgICcgVGVzdCBtYW51YWxseS4nKQogCiB0cnk6CiAgICAgc3lzLnN0ZGluLnRydW5jYXRlKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfZmlsZWlucHV0LnB5IGIvTGliL3Rlc3QvdGVzdF9maWxlaW5wdXQucHkKaW5kZXggZjNhNzg0MS4uMzAxNzY5ZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9maWxlaW5wdXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9maWxlaW5wdXQucHkKQEAgLTE2Miw3ICsxNjIsMTAgQEAKICAgICBwcmludCAiMTUuIFVuaWNvZGUgZmlsZW5hbWVzIgogdHJ5OgogICAgIHQxID0gd3JpdGVUbXAoMSwgWyJBXG5CIl0pCi0gICAgZmkgPSBGaWxlSW5wdXQoZmlsZXM9dW5pY29kZSh0MSwgc3lzLmdldGZpbGVzeXN0ZW1lbmNvZGluZygpKSkKKyAgICBlbmNvZGluZyA9IHN5cy5nZXRmaWxlc3lzdGVtZW5jb2RpbmcoKQorICAgIGlmIGVuY29kaW5nIGlzIE5vbmU6CisgICAgICAgIGVuY29kaW5nID0gJ2FzY2lpJworICAgIGZpID0gRmlsZUlucHV0KGZpbGVzPXVuaWNvZGUodDEsIGVuY29kaW5nKSkKICAgICBsaW5lcyA9IGxpc3QoZmkpCiAgICAgdmVyaWZ5KGxpbmVzID09IFsiQVxuIiwgIkIiXSkKIGZpbmFsbHk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2ZvcmsxLnB5IGIvTGliL3Rlc3QvdGVzdF9mb3JrMS5weQppbmRleCBhY2E3YTg0Li5jYmE1ZmM3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X2ZvcmsxLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZm9yazEucHkKQEAgLTEsNzUgKzEsMjMgQEAKICIiIlRoaXMgdGVzdCBjaGVja3MgZm9yIGNvcnJlY3QgZm9yaygpIGJlaGF2aW9yLgotCi1XZSB3YW50IGZvcmsxKCkgc2VtYW50aWNzIC0tIG9ubHkgdGhlIGZvcmtpbmcgdGhyZWFkIHN1cnZpdmVzIGluIHRoZQotY2hpbGQgYWZ0ZXIgYSBmb3JrKCkuCi0KLU9uIHNvbWUgc3lzdGVtcyAoZS5nLiBTb2xhcmlzIHdpdGhvdXQgcG9zaXggdGhyZWFkcykgd2UgZmluZCB0aGF0IGFsbAotYWN0aXZlIHRocmVhZHMgc3Vydml2ZSBpbiB0aGUgY2hpbGQgYWZ0ZXIgYSBmb3JrKCk7IHRoaXMgaXMgYW4gZXJyb3IuCi0KLVdoaWxlIEJlT1MgZG9lc24ndCBvZmZpY2lhbGx5IHN1cHBvcnQgZm9yayBhbmQgbmF0aXZlIHRocmVhZGluZyBpbgotdGhlIHNhbWUgYXBwbGljYXRpb24sIHRoZSBwcmVzZW50IGV4YW1wbGUgc2hvdWxkIHdvcmsganVzdCBmaW5lLiAgREMKICIiIgogCi1pbXBvcnQgb3MsIHN5cywgdGltZSwgdGhyZWFkCi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJpZnksIHZlcmJvc2UsIFRlc3RTa2lwcGVkCitpbXBvcnQgb3MKK2Zyb20gdGVzdC5mb3JrX3dhaXQgaW1wb3J0IEZvcmtXYWl0Citmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBUZXN0U2tpcHBlZCwgcnVuX3VuaXR0ZXN0CiAKIHRyeToKICAgICBvcy5mb3JrCiBleGNlcHQgQXR0cmlidXRlRXJyb3I6CiAgICAgcmFpc2UgVGVzdFNraXBwZWQsICJvcy5mb3JrIG5vdCBkZWZpbmVkIC0tIHNraXBwaW5nIHRlc3RfZm9yazEiCiAKLUxPTkdTTEVFUCA9IDIKLQotU0hPUlRTTEVFUCA9IDAuNQotCi1OVU1fVEhSRUFEUyA9IDQKLQotYWxpdmUgPSB7fQotCi1zdG9wID0gMAotCi1kZWYgZihpZCk6Ci0gICAgd2hpbGUgbm90IHN0b3A6Ci0gICAgICAgIGFsaXZlW2lkXSA9IG9zLmdldHBpZCgpCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHRpbWUuc2xlZXAoU0hPUlRTTEVFUCkKLSAgICAgICAgZXhjZXB0IElPRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0KLWRlZiBtYWluKCk6Ci0gICAgZm9yIGkgaW4gcmFuZ2UoTlVNX1RIUkVBRFMpOgotICAgICAgICB0aHJlYWQuc3RhcnRfbmV3KGYsIChpLCkpCi0KLSAgICB0aW1lLnNsZWVwKExPTkdTTEVFUCkKLQotICAgIGEgPSBhbGl2ZS5rZXlzKCkKLSAgICBhLnNvcnQoKQotICAgIHZlcmlmeShhID09IHJhbmdlKE5VTV9USFJFQURTKSkKLQotICAgIHByZWZvcmtfbGl2ZXMgPSBhbGl2ZS5jb3B5KCkKLQotICAgIGlmIHN5cy5wbGF0Zm9ybSBpbiBbJ3VuaXh3YXJlNyddOgotICAgICAgICBjcGlkID0gb3MuZm9yazEoKQotICAgIGVsc2U6Ci0gICAgICAgIGNwaWQgPSBvcy5mb3JrKCkKLQotICAgIGlmIGNwaWQgPT0gMDoKLSAgICAgICAgIyBDaGlsZAotICAgICAgICB0aW1lLnNsZWVwKExPTkdTTEVFUCkKLSAgICAgICAgbiA9IDAKLSAgICAgICAgZm9yIGtleSBpbiBhbGl2ZS5rZXlzKCk6Ci0gICAgICAgICAgICBpZiBhbGl2ZVtrZXldICE9IHByZWZvcmtfbGl2ZXNba2V5XToKLSAgICAgICAgICAgICAgICBuID0gbisxCi0gICAgICAgIG9zLl9leGl0KG4pCi0gICAgZWxzZToKLSAgICAgICAgIyBQYXJlbnQKK2NsYXNzIEZvcmtUZXN0KEZvcmtXYWl0KToKKyAgICBkZWYgd2FpdF9pbXBsKHNlbGYsIGNwaWQpOgogICAgICAgICBzcGlkLCBzdGF0dXMgPSBvcy53YWl0cGlkKGNwaWQsIDApCi0gICAgICAgIHZlcmlmeShzcGlkID09IGNwaWQpCi0gICAgICAgIHZlcmlmeShzdGF0dXMgPT0gMCwKLSAgICAgICAgICAgICAgICAiY2F1c2UgPSAlZCwgZXhpdCA9ICVkIiAlIChzdGF0dXMmMHhmZiwgc3RhdHVzPj44KSApCi0gICAgICAgIGdsb2JhbCBzdG9wCi0gICAgICAgICMgVGVsbCB0aHJlYWRzIHRvIGRpZQotICAgICAgICBzdG9wID0gMQotICAgICAgICB0aW1lLnNsZWVwKDIqU0hPUlRTTEVFUCkgIyBXYWl0IGZvciB0aHJlYWRzIHRvIGRpZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwaWQsIGNwaWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdHVzLCAwLCAiY2F1c2UgPSAlZCwgZXhpdCA9ICVkIiAlIChzdGF0dXMmMHhmZiwgc3RhdHVzPj44KSkKIAotbWFpbigpCitkZWYgdGVzdF9tYWluKCk6CisgICAgcnVuX3VuaXR0ZXN0KEZvcmtUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkgYi9MaWIvdGVzdC90ZXN0X2dlbmVyYXRvcnMucHkKaW5kZXggNGJlMWI0Yy4uYTYwYTc2OCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZW5lcmF0b3JzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXJhdG9ycy5weQpAQCAtNDIxLDcgKzQyMSw2IEBACiAuLi4gICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCiAuLi4gICAgICAgICBzZWxmLnBhcmVudCA9IE5vbmUKIC4uLiAgICAgICAgIHNlbGYuZ2VuZXJhdG9yID0gc2VsZi5nZW5lcmF0ZSgpCi0uLi4gICAgICAgICBzZWxmLmNsb3NlID0gc2VsZi5nZW5lcmF0b3IuY2xvc2UKIC4uLgogLi4uICAgICBkZWYgZ2VuZXJhdGUoc2VsZik6CiAuLi4gICAgICAgICB3aGlsZSBub3Qgc2VsZi5wYXJlbnQ6CkBAIC00ODQsOCArNDgzLDYgQEAKIG1lcmdlZCBBIGludG8gRwogQS0+RyBCLT5HIEMtPkcgRC0+RyBFLT5HIEYtPkcgRy0+RyBILT5HIEktPkcgSi0+RyBLLT5HIEwtPkcgTS0+RwogCi0+Pj4gZm9yIHMgaW4gc2V0czogcy5jbG9zZSgpICAgICMgYnJlYWsgY3ljbGVzCi0KICIiIgogIyBFbWFjcyB0dXJkICcKIApAQCAtNTkzLDcgKzU5MCw2IEBACiAuLi4gICAgIGRlZiBfX2luaXRfXyhzZWxmLCBnKToKIC4uLiAgICAgICAgIHNlbGYuc29mYXIgPSBbXQogLi4uICAgICAgICAgc2VsZi5mZXRjaCA9IGcubmV4dAotLi4uICAgICAgICAgc2VsZi5jbG9zZSA9IGcuY2xvc2UKIC4uLgogLi4uICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaSk6CiAuLi4gICAgICAgICBzb2ZhciwgZmV0Y2ggPSBzZWxmLnNvZmFyLCBzZWxmLmZldGNoCkBAIC02MjQsOCArNjIwLDYgQEAKIFsyMDAsIDIxNiwgMjI1LCAyNDAsIDI0MywgMjUwLCAyNTYsIDI3MCwgMjg4LCAzMDAsIDMyMCwgMzI0LCAzNjAsIDM3NSwgMzg0XQogWzQwMCwgNDA1LCA0MzIsIDQ1MCwgNDgwLCA0ODYsIDUwMCwgNTEyLCA1NDAsIDU3NiwgNjAwLCA2MjUsIDY0MCwgNjQ4LCA2NzVdCiAKLT4+PiBtMjM1LmNsb3NlKCkKLQogWWUgb2xkZSBGaWJvbmFjY2kgZ2VuZXJhdG9yLCBMYXp5TGlzdCBzdHlsZS4KIAogPj4+IGRlZiBmaWJnZW4oYSwgYik6CkBAIC02NDgsNyArNjQyLDYgQEAKID4+PiBmaWIgPSBMYXp5TGlzdChmaWJnZW4oMSwgMikpCiA+Pj4gZmlyc3RuKGl0ZXIoZmliKSwgMTcpCiBbMSwgMiwgMywgNSwgOCwgMTMsIDIxLCAzNCwgNTUsIDg5LCAxNDQsIDIzMywgMzc3LCA2MTAsIDk4NywgMTU5NywgMjU4NF0KLT4+PiBmaWIuY2xvc2UoKQogCiAKIFJ1bm5pbmcgYWZ0ZXIgeW91ciB0YWlsIHdpdGggaXRlcnRvb2xzLnRlZSAobmV3IGluIHZlcnNpb24gMi40KQpAQCAtNjg1LDcgKzY3OCw4IEBACiAuLi4gICAgICAgICAgICAgICAgICAgICAgICBtZXJnZSh0aW1lcygzLCBtMyksCiAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcyg1LCBtNSkpKToKIC4uLiAgICAgICAgICAgICB5aWVsZCBuCi0uLi4gICAgIG0yLCBtMywgbTUsIG1SZXMgPSB0ZWUoX20yMzUoKSwgNCkKKy4uLiAgICAgbTEgPSBfbTIzNSgpCisuLi4gICAgIG0yLCBtMywgbTUsIG1SZXMgPSB0ZWUobTEsIDQpCiAuLi4gICAgIHJldHVybiBtUmVzCiAKID4+PiBpdCA9IG0yMzUoKQpAQCAtNzAyLDEwICs2OTYsOSBAQAogaXRlcmF0b3JzLCB3aGVyZXVwb24gaXQgaXMgZGVsZXRlZC4gWW91IGNhbiB0aGVyZWZvcmUgcHJpbnQgdGhlIGhhbW1pbmcKIHNlcXVlbmNlIGR1cmluZyBob3VycyB3aXRob3V0IGluY3JlYXNpbmcgbWVtb3J5IHVzYWdlLCBvciB2ZXJ5IGxpdHRsZS4KIAotVGhlIGJlYXV0eSBvZiBpdCBpcyB0aGF0IHJlY3Vyc2l2ZSBydW5uaW5nIGFmdGVyIHRoZWlyIHRhaWwgRlAgYWxnb3JpdGhtcworVGhlIGJlYXV0eSBvZiBpdCBpcyB0aGF0IHJlY3Vyc2l2ZSBydW5uaW5nLWFmdGVyLXRoZWlyLXRhaWwgRlAgYWxnb3JpdGhtcwogYXJlIHF1aXRlIHN0cmFpZ2h0Zm9yd2FyZGx5IGV4cHJlc3NlZCB3aXRoIHRoaXMgUHl0aG9uIGlkaW9tLgogCi0KIFllIG9sZGUgRmlib25hY2NpIGdlbmVyYXRvciwgdGVlIHN0eWxlLgogCiA+Pj4gZGVmIGZpYigpOgpAQCAtNzIxLDcgKzcxNCw4IEBACiAuLi4gICAgICAgICBmb3IgcmVzIGluIF9pc3VtKGZpYkhlYWQsIGZpYlRhaWwpOgogLi4uICAgICAgICAgICAgIHlpZWxkIHJlcwogLi4uCi0uLi4gICAgIGZpYkhlYWQsIGZpYlRhaWwsIGZpYlJlcyA9IHRlZShfZmliKCksIDMpCisuLi4gICAgIHJlYWxmaWIgPSBfZmliKCkKKy4uLiAgICAgZmliSGVhZCwgZmliVGFpbCwgZmliUmVzID0gdGVlKHJlYWxmaWIsIDMpCiAuLi4gICAgIHJldHVybiBmaWJSZXMKIAogPj4+IGZpcnN0bihmaWIoKSwgMTcpCkBAIC0xNTQ1LDYgKzE1MzksOSBAQAogPj4+IGcudGhyb3coVmFsdWVFcnJvciwgVHlwZUVycm9yKDEpKSAgIyBtaXNtYXRjaGVkIHR5cGUsIHJld3JhcHBlZAogY2F1Z2h0IFZhbHVlRXJyb3IgKDEpCiAKKz4+PiBnLnRocm93KFZhbHVlRXJyb3IsIFZhbHVlRXJyb3IoMSksIE5vbmUpICAgIyBleHBsaWNpdCBOb25lIHRyYWNlYmFjaworY2F1Z2h0IFZhbHVlRXJyb3IgKDEpCisKID4+PiBnLnRocm93KFZhbHVlRXJyb3IoMSksICJmb28iKSAgICAgICAjIGJhZCBhcmdzCiBUcmFjZWJhY2sgKG1vc3QgcmVjZW50IGNhbGwgbGFzdCk6CiAgIC4uLgpAQCAtMTU5Miw4ICsxNTg5LDcgQEAKID4+PiBmKCkudGhyb3coImFiYyIpICAgICAjIHRocm93IG9uIGp1c3Qtb3BlbmVkIGdlbmVyYXRvcgogVHJhY2ViYWNrIChtb3N0IHJlY2VudCBjYWxsIGxhc3QpOgogICAuLi4KLVR5cGVFcnJvcjogZXhjZXB0aW9ucyBtdXN0IGJlIGNsYXNzZXMsIG9yIGluc3RhbmNlcywgbm90IHN0cgotCithYmMKIAogTm93IGxldCdzIHRyeSBjbG9zaW5nIGEgZ2VuZXJhdG9yOgogCkBAIC0xNzExLDYgKzE3MDcsODEgQEAKIAogIiIiCiAKK3JlZmxlYWtzX3Rlc3RzID0gIiIiCitQcmlvciB0byBhZGRpbmcgY3ljbGUtR0Mgc3VwcG9ydCB0byBpdGVydG9vbHMudGVlLCB0aGlzIGNvZGUgd291bGQgbGVhaworcmVmZXJlbmNlcy4gV2UgYWRkIGl0IHRvIHRoZSBzdGFuZGFyZCBzdWl0ZSBzbyB0aGUgcm91dGluZSByZWZsZWFrLXRlc3RzCit3b3VsZCB0cmlnZ2VyIGlmIGl0IHN0YXJ0cyBiZWluZyB1bmNsZWFuYWJsZSBhZ2Fpbi4KKworPj4+IGltcG9ydCBpdGVydG9vbHMKKz4+PiBkZWYgbGVhaygpOgorLi4uICAgICBjbGFzcyBnZW46CisuLi4gICAgICAgICBkZWYgX19pdGVyX18oc2VsZik6CisuLi4gICAgICAgICAgICAgcmV0dXJuIHNlbGYKKy4uLiAgICAgICAgIGRlZiBuZXh0KHNlbGYpOgorLi4uICAgICAgICAgICAgIHJldHVybiBzZWxmLml0ZW0KKy4uLiAgICAgZyA9IGdlbigpCisuLi4gICAgIGhlYWQsIHRhaWwgPSBpdGVydG9vbHMudGVlKGcpCisuLi4gICAgIGcuaXRlbSA9IGhlYWQKKy4uLiAgICAgcmV0dXJuIGhlYWQKKz4+PiBpdCA9IGxlYWsoKQorCitNYWtlIHN1cmUgdG8gYWxzbyB0ZXN0IHRoZSBpbnZvbHZlbWVudCBvZiB0aGUgdGVlLWludGVybmFsIHRlZWRhdGFvYmplY3QsCit3aGljaCBzdG9yZXMgcmV0dXJuZWQgaXRlbXMuCisKKz4+PiBpdGVtID0gaXQubmV4dCgpCisKKworCitUaGlzIHRlc3QgbGVha2VkIGF0IG9uZSBwb2ludCBkdWUgdG8gZ2VuZXJhdG9yIGZpbmFsaXphdGlvbi9kZXN0cnVjdGlvbi4KK0l0IHdhcyBjb3BpZWQgZnJvbSBMaWIvdGVzdC9sZWFrZXJzL3Rlc3RfZ2VuZXJhdG9yX2N5Y2xlLnB5IGJlZm9yZSB0aGUgZmlsZQord2FzIHJlbW92ZWQuCisKKz4+PiBkZWYgbGVhaygpOgorLi4uICAgIGRlZiBnZW4oKToKKy4uLiAgICAgICAgd2hpbGUgVHJ1ZToKKy4uLiAgICAgICAgICAgIHlpZWxkIGcKKy4uLiAgICBnID0gZ2VuKCkKKworPj4+IGxlYWsoKQorCisKKworVGhpcyB0ZXN0IGlzbid0IHJlYWxseSBnZW5lcmF0b3IgcmVsYXRlZCwgYnV0IHJhdGhlciBleGNlcHRpb24taW4tY2xlYW51cAorcmVsYXRlZC4gVGhlIGNvcm91dGluZSB0ZXN0cyAoYWJvdmUpIGp1c3QgaGFwcGVuIHRvIGNhdXNlIGFuIGV4Y2VwdGlvbiBpbgordGhlIGdlbmVyYXRvcidzIF9fZGVsX18gKHRwX2RlbCkgbWV0aG9kLiBXZSBjYW4gYWxzbyB0ZXN0IGZvciB0aGlzCitleHBsaWNpdGx5LCB3aXRob3V0IGdlbmVyYXRvcnMuIFdlIGRvIGhhdmUgdG8gcmVkaXJlY3Qgc3RkZXJyIHRvIGF2b2lkCitwcmludGluZyB3YXJuaW5ncyBhbmQgdG8gZG91YmxlY2hlY2sgdGhhdCB3ZSBhY3R1YWxseSB0ZXN0ZWQgd2hhdCB3ZSB3YW50ZWQKK3RvIHRlc3QuCisKKz4+PiBpbXBvcnQgc3lzLCBTdHJpbmdJTworPj4+IG9sZCA9IHN5cy5zdGRlcnIKKz4+PiB0cnk6CisuLi4gICAgIHN5cy5zdGRlcnIgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisuLi4gICAgIGNsYXNzIExlYWtlcjoKKy4uLiAgICAgICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorLi4uICAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcgorLi4uCisuLi4gICAgIGwgPSBMZWFrZXIoKQorLi4uICAgICBkZWwgbAorLi4uICAgICBlcnIgPSBzeXMuc3RkZXJyLmdldHZhbHVlKCkuc3RyaXAoKQorLi4uICAgICBlcnIuc3RhcnRzd2l0aCgKKy4uLiAgICAgICAgICJFeGNlcHRpb24gZXhjZXB0aW9ucy5SdW50aW1lRXJyb3I6IFJ1bnRpbWVFcnJvcigpIGluIDwiCisuLi4gICAgICkKKy4uLiAgICAgZXJyLmVuZHN3aXRoKCI+IGlnbm9yZWQiKQorLi4uICAgICBsZW4oZXJyLnNwbGl0bGluZXMoKSkKKy4uLiBmaW5hbGx5OgorLi4uICAgICBzeXMuc3RkZXJyID0gb2xkCitUcnVlCitUcnVlCisxCisKKworCitUaGVzZSByZWZsZWFrIHRlc3RzIHNob3VsZCBwZXJoYXBzIGJlIGluIGEgdGVzdGZpbGUgb2YgdGhlaXIgb3duLAordGVzdF9nZW5lcmF0b3JzIGp1c3QgaGFwcGVuZWQgdG8gYmUgdGhlIHRlc3QgdGhhdCBkcmV3IHRoZXNlIG91dC4KKworIiIiCisKIF9fdGVzdF9fID0geyJ0dXQiOiAgICAgIHR1dG9yaWFsX3Rlc3RzLAogICAgICAgICAgICAgInBlcCI6ICAgICAgcGVwX3Rlc3RzLAogICAgICAgICAgICAgImVtYWlsIjogICAgZW1haWxfdGVzdHMsCkBAIC0xNzE5LDYgKzE3OTAsNyBAQAogICAgICAgICAgICAgImNvbmpvaW4iOiAgY29uam9pbl90ZXN0cywKICAgICAgICAgICAgICJ3ZWFrcmVmIjogIHdlYWtyZWZfdGVzdHMsCiAgICAgICAgICAgICAiY29yb3V0aW5lIjogIGNvcm91dGluZV90ZXN0cywKKyAgICAgICAgICAgICJyZWZsZWFrcyI6IHJlZmxlYWtzX3Rlc3RzLAogICAgICAgICAgICAgfQogCiAjIE1hZ2ljIHRlc3QgbmFtZSB0aGF0IHJlZ3J0ZXN0LnB5IGludm9rZXMgKmFmdGVyKiBpbXBvcnRpbmcgdGhpcyBtb2R1bGUuCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dlbmV4cHMucHkgYi9MaWIvdGVzdC90ZXN0X2dlbmV4cHMucHkKaW5kZXggMTU1NjYwNC4uZTQxNDc1NyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZW5leHBzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2VuZXhwcy5weQpAQCAtMTI5LDcgKzEyOSw3IEBACiBWZXJpZnkgcmUtdXNlIG9mIHR1cGxlcyAoYSBzaWRlIGJlbmVmaXQgb2YgdXNpbmcgZ2VuZXhwcyBvdmVyIGxpc3Rjb21wcykKIAogICAgID4+PiB0dXBsZWlkcyA9IG1hcChpZCwgKChpLGkpIGZvciBpIGluIHhyYW5nZSgxMCkpKQotICAgID4+PiBtYXgodHVwbGVpZHMpIC0gbWluKHR1cGxlaWRzKQorICAgID4+PiBpbnQobWF4KHR1cGxlaWRzKSAtIG1pbih0dXBsZWlkcykpCiAgICAgMAogCiBWZXJpZnkgdGhhdCBzeW50YXggZXJyb3IncyBhcmUgcmFpc2VkIGZvciBnZW5leHBzIHVzZWQgYXMgbHZhbHVlcwpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weSBiL0xpYi90ZXN0L3Rlc3RfZ2V0YXJnczIucHkKaW5kZXggZDRjNjgxYS4uNzQ4YWQ0NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nZXRhcmdzMi5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dldGFyZ3MyLnB5CkBAIC00OCw3ICs0OCw3IEBACiBWRVJZX0xBUkdFID0gMHhGRjAwMDAxMjEyMTIxMjEyMTIxMjEyNDJMCiAKIGZyb20gX3Rlc3RjYXBpIGltcG9ydCBVQ0hBUl9NQVgsIFVTSFJUX01BWCwgVUlOVF9NQVgsIFVMT05HX01BWCwgSU5UX01BWCwgXAotICAgICBJTlRfTUlOLCBMT05HX01JTiwgTE9OR19NQVgKKyAgICAgSU5UX01JTiwgTE9OR19NSU4sIExPTkdfTUFYLCBQWV9TU0laRV9UX01JTiwgUFlfU1NJWkVfVF9NQVgKIAogIyBmYWtlLCB0aGV5IGFyZSBub3QgZGVmaW5lZCBpbiBQeXRob24ncyBoZWFkZXIgZmlsZXMKIExMT05HX01BWCA9IDIqKjYzLTEKQEAgLTE4Miw2ICsxODIsMjMgQEAKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3NfbCg0MkwpKQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX2wsIFZFUllfTEFSR0UpCiAKKyAgICBkZWYgdGVzdF9uKHNlbGYpOgorICAgICAgICBmcm9tIF90ZXN0Y2FwaSBpbXBvcnQgZ2V0YXJnc19uCisgICAgICAgICMgbiByZXR1cm5zICdQeV9zc2l6ZV90JywgYW5kIGRvZXMgcmFuZ2UgY2hlY2tpbmcKKyAgICAgICAgIyAoUFlfU1NJWkVfVF9NSU4gLi4uIFBZX1NTSVpFX1RfTUFYKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCgzLCBnZXRhcmdzX24oMy4xNCkpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc0VxdWFsKDk5LCBnZXRhcmdzX24oTG9uZygpKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoOTksIGdldGFyZ3NfbihJbnQoKSkpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT3ZlcmZsb3dFcnJvciwgZ2V0YXJnc19uLCBQWV9TU0laRV9UX01JTi0xKQorICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbChQWV9TU0laRV9UX01JTiwgZ2V0YXJnc19uKFBZX1NTSVpFX1RfTUlOKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoUFlfU1NJWkVfVF9NQVgsIGdldGFyZ3NfbihQWV9TU0laRV9UX01BWCkpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIGdldGFyZ3NfbiwgUFlfU1NJWkVfVF9NQVgrMSkKKworICAgICAgICBzZWxmLmZhaWxVbmxlc3NFcXVhbCg0MiwgZ2V0YXJnc19uKDQyKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzRXF1YWwoNDIsIGdldGFyZ3Nfbig0MkwpKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCBnZXRhcmdzX24sIFZFUllfTEFSR0UpCisKIAogY2xhc3MgTG9uZ0xvbmdfVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgogICAgIGRlZiB0ZXN0X0woc2VsZik6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X2dsb2IucHkgYi9MaWIvdGVzdC90ZXN0X2dsb2IucHkKaW5kZXggOGE2ZWY3Zi4uNWNlMDlmOSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9nbG9iLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfZ2xvYi5weQpAQCAtODAsNiArODAsMTQgQEAKICAgICAgICAgZXEoc2VsZi5nbG9iKCc/YT8nLCAnKkYnKSwgbWFwKHNlbGYubm9ybSwgW29zLnBhdGguam9pbignYWFhJywgJ3p6ekYnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguam9pbignYWFiJywgJ0YnKV0pKQogCisgICAgZGVmIHRlc3RfZ2xvYl9kaXJlY3Rvcnlfd2l0aF90cmFpbGluZ19zbGFzaChzZWxmKToKKyAgICAgICAgIyBXZSBhcmUgdmVyaWZ5aW5nIHRoYXQgd2hlbiB0aGVyZSBpcyB3aWxkY2FyZCBwYXR0ZXJuIHdoaWNoCisgICAgICAgICMgZW5kcyB3aXRoIG9zLnNlcCBkb2Vzbid0IGJsb3cgdXAuCisgICAgICAgIHJlcyA9IGdsb2IuZ2xvYihzZWxmLnRlbXBkaXIgKyAnKicgKyBvcy5zZXApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlcyksIDEpCisgICAgICAgICMgZWl0aGVyIG9mIHRoZXNlIHJlc3VsdHMgYXJlIHJlYXNvbmFibGUKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJlc1swXSBpbiBbc2VsZi50ZW1wZGlyLCBzZWxmLnRlbXBkaXIgKyBvcy5zZXBdKQorCiAgICAgZGVmIHRlc3RfZ2xvYl9icm9rZW5fc3ltbGlua3Moc2VsZik6CiAgICAgICAgIGlmIGhhc2F0dHIob3MsICdzeW1saW5rJyk6CiAgICAgICAgICAgICBlcSA9IHNlbGYuYXNzZXJ0U2VxdWVuY2VzRXF1YWxfbm9vcmRlcgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5IGIvTGliL3Rlc3QvdGVzdF9ncmFtbWFyLnB5CmluZGV4IDViMjBhYjMuLjRiYjRlNDUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfZ3JhbW1hci5weQorKysgYi9MaWIvdGVzdC90ZXN0X2dyYW1tYXIucHkKQEAgLTI1NSw2ICsyNTUsMTAgQEAKIGQyMnYoKigxLCAyLCAzLCA0KSkKIGQyMnYoMSwgMiwgKigzLCA0LCA1KSkKIGQyMnYoMSwgKigyLCAzKSwgKip7J2QnOiA0fSkKK2RlZiBkMzF2KCh4KSk6IHBhc3MKK2QzMXYoMSkKK2RlZiBkMzJ2KCh4LCkpOiBwYXNzCitkMzJ2KCgxLCkpCiAKICMjIyBsYW1iZGVmOiAnbGFtYmRhJyBbdmFyYXJnc2xpc3RdICc6JyB0ZXN0CiBwcmludCAnbGFtYmRlZicKQEAgLTgxMSw2ICs4MTUsMTEgQEAKIHggPSA1OyB0ID0gVHJ1ZTsKIHZlcmlmeShbKGksaikgZm9yIGkgaW4gcmFuZ2UoMTApIGZvciBqIGluIHJhbmdlKDUpXSA9PSBsaXN0KGcpKQogCisjIEdyYW1tYXIgYWxsb3dzIG11bHRpcGxlIGFkamFjZW50ICdpZidzIGluIGxpc3Rjb21wcyBhbmQgZ2VuZXhwcywKKyMgZXZlbiB0aG91Z2ggaXQncyBzaWxseS4gTWFrZSBzdXJlIGl0IHdvcmtzIChpZmVsc2UgYnJva2UgdGhpcy4pCit2ZXJpZnkoWyB4IGZvciB4IGluIHJhbmdlKDEwKSBpZiB4ICUgMiBpZiB4ICUgMyBdLCBbMSwgNSwgN10pCit2ZXJpZnkoKHggZm9yIHggaW4gcmFuZ2UoMTApIGlmIHggJSAyIGlmIHggJSAzKSwgWzEsIDUsIDddKQorCiAjIFRlc3QgaWZlbHNlIGV4cHJlc3Npb25zIGluIHZhcmlvdXMgY2FzZXMKIGRlZiBfY2hlY2tldmFsKG1zZywgcmV0KToKICAgICAiaGVscGVyIHRvIGNoZWNrIHRoYXQgZXZhbHVhdGlvbiBvZiBleHByZXNzaW9ucyBpcyBkb25lIGNvcnJlY3RseSIKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfaW5kZXgucHkgYi9MaWIvdGVzdC90ZXN0X2luZGV4LnB5CmluZGV4IGU2OWRlMjkuLjQ1YjNiMmIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW5kZXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9pbmRleC5weQpAQCAtMCwwICsxLDEzNyBAQAoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAoraW1wb3J0IG9wZXJhdG9yCisKK2NsYXNzIG9sZHN0eWxlOgorICAgIGRlZiBfX2luZGV4X18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmluZAorCitjbGFzcyBuZXdzdHlsZShvYmplY3QpOgorICAgIGRlZiBfX2luZGV4X18oc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmluZAorCitjbGFzcyBCYXNlVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiBzZXRVcChzZWxmKToKKyAgICAgICAgc2VsZi5vID0gb2xkc3R5bGUoKQorICAgICAgICBzZWxmLm4gPSBuZXdzdHlsZSgpCisgICAgICAgIHNlbGYubzIgPSBvbGRzdHlsZSgpCisgICAgICAgIHNlbGYubjIgPSBuZXdzdHlsZSgpCisKKyAgICBkZWYgdGVzdF9iYXNpYyhzZWxmKToKKyAgICAgICAgc2VsZi5vLmluZCA9IC0yCisgICAgICAgIHNlbGYubi5pbmQgPSAyCisgICAgICAgIGFzc2VydChzZWxmLnNlcVtzZWxmLm5dID09IHNlbGYuc2VxWzJdKQorICAgICAgICBhc3NlcnQoc2VsZi5zZXFbc2VsZi5vXSA9PSBzZWxmLnNlcVstMl0pCisgICAgICAgIGFzc2VydChvcGVyYXRvci5pbmRleChzZWxmLm8pID09IC0yKQorICAgICAgICBhc3NlcnQob3BlcmF0b3IuaW5kZXgoc2VsZi5uKSA9PSAyKQorCisgICAgZGVmIHRlc3RfZXJyb3Ioc2VsZik6CisgICAgICAgIHNlbGYuby5pbmQgPSAnZHVtYicKKyAgICAgICAgc2VsZi5uLmluZCA9ICdiYWQnCisgICAgICAgIG15ZnVuYyA9IGxhbWJkYSB4LCBvYmo6IG9iai5zZXFbeF0KKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXgsIHNlbGYubykKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuaW5kZXgsIHNlbGYubikKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgbXlmdW5jLCBzZWxmLm8sIHNlbGYpCisgICAgICAgIHNlbGYuZmFpbFVubGVzc1JhaXNlcyhUeXBlRXJyb3IsIG15ZnVuYywgc2VsZi5uLCBzZWxmKQorCisgICAgZGVmIHRlc3Rfc2xpY2Uoc2VsZik6CisgICAgICAgIHNlbGYuby5pbmQgPSAxCisgICAgICAgIHNlbGYubzIuaW5kID0gMworICAgICAgICBzZWxmLm4uaW5kID0gMgorICAgICAgICBzZWxmLm4yLmluZCA9IDQKKyAgICAgICAgYXNzZXJ0KHNlbGYuc2VxW3NlbGYubzpzZWxmLm8yXSA9PSBzZWxmLnNlcVsxOjNdKQorICAgICAgICBhc3NlcnQoc2VsZi5zZXFbc2VsZi5uOnNlbGYubjJdID09IHNlbGYuc2VxWzI6NF0pCisKKyAgICBkZWYgdGVzdF9yZXBlYXQoc2VsZik6CisgICAgICAgIHNlbGYuby5pbmQgPSAzCisgICAgICAgIHNlbGYubi5pbmQgPSAyCisgICAgICAgIGFzc2VydChzZWxmLnNlcSAqIHNlbGYubyA9PSBzZWxmLnNlcSAqIDMpCisgICAgICAgIGFzc2VydChzZWxmLnNlcSAqIHNlbGYubiA9PSBzZWxmLnNlcSAqIDIpCisgICAgICAgIGFzc2VydChzZWxmLm8gKiBzZWxmLnNlcSA9PSBzZWxmLnNlcSAqIDMpCisgICAgICAgIGFzc2VydChzZWxmLm4gKiBzZWxmLnNlcSA9PSBzZWxmLnNlcSAqIDIpCisKKyAgICBkZWYgdGVzdF93cmFwcGVycyhzZWxmKToKKyAgICAgICAgbiA9IHNlbGYubgorICAgICAgICBuLmluZCA9IDUKKyAgICAgICAgYXNzZXJ0IG4uX19pbmRleF9fKCkgPT0gNQorICAgICAgICBhc3NlcnQgNiAuX19pbmRleF9fKCkgPT0gNgorICAgICAgICBhc3NlcnQgLTdMLl9faW5kZXhfXygpID09IC03CisgICAgICAgIGFzc2VydCBzZWxmLnNlcS5fX2dldGl0ZW1fXyhuKSA9PSBzZWxmLnNlcVs1XQorICAgICAgICBhc3NlcnQgc2VsZi5zZXEuX19tdWxfXyhuKSA9PSBzZWxmLnNlcSAqIDUKKyAgICAgICAgYXNzZXJ0IHNlbGYuc2VxLl9fcm11bF9fKG4pID09IHNlbGYuc2VxICogNQorCisgICAgZGVmIHRlc3RfaW5maW5pdGVfcmVjdXNpb24oc2VsZik6CisgICAgICAgIGNsYXNzIFRyYXAxKGludCk6CisgICAgICAgICAgICBkZWYgX19pbmRleF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisgICAgICAgIGNsYXNzIFRyYXAyKGxvbmcpOgorICAgICAgICAgICAgZGVmIF9faW5kZXhfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorICAgICAgICBzZWxmLmZhaWxVbmxlc3NSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5nZXRpdGVtLCBzZWxmLnNlcSwgVHJhcDEoKSkKKyAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3IuZ2V0aXRlbSwgc2VsZi5zZXEsIFRyYXAyKCkpCisKKworY2xhc3MgTGlzdFRlc3RDYXNlKEJhc2VUZXN0Q2FzZSk6CisgICAgc2VxID0gWzAsMTAsMjAsMzAsNDAsNTBdCisKKyAgICBkZWYgdGVzdF9zZXRkZWxpdGVtKHNlbGYpOgorICAgICAgICBzZWxmLm8uaW5kID0gLTIKKyAgICAgICAgc2VsZi5uLmluZCA9IDIKKyAgICAgICAgbHN0ID0gbGlzdCgnYWIhY2RlZmdoaSFqJykKKyAgICAgICAgZGVsIGxzdFtzZWxmLm9dCisgICAgICAgIGRlbCBsc3Rbc2VsZi5uXQorICAgICAgICBsc3Rbc2VsZi5vXSA9ICdYJworICAgICAgICBsc3Rbc2VsZi5uXSA9ICdZJworICAgICAgICBhc3NlcnQgbHN0ID09IGxpc3QoJ2FiWWRlZmdoWGonKQorCisgICAgICAgIGxzdCA9IFs1LCA2LCA3LCA4LCA5LCAxMCwgMTFdCisgICAgICAgIGxzdC5fX3NldGl0ZW1fXyhzZWxmLm4sICJoZXJlIikKKyAgICAgICAgYXNzZXJ0IGxzdCA9PSBbNSwgNiwgImhlcmUiLCA4LCA5LCAxMCwgMTFdCisgICAgICAgIGxzdC5fX2RlbGl0ZW1fXyhzZWxmLm4pCisgICAgICAgIGFzc2VydCBsc3QgPT0gWzUsIDYsIDgsIDksIDEwLCAxMV0KKworICAgIGRlZiB0ZXN0X2lucGxhY2VfcmVwZWF0KHNlbGYpOgorICAgICAgICBzZWxmLm8uaW5kID0gMgorICAgICAgICBzZWxmLm4uaW5kID0gMworICAgICAgICBsc3QgPSBbNiwgNF0KKyAgICAgICAgbHN0ICo9IHNlbGYubworICAgICAgICBhc3NlcnQgbHN0ID09IFs2LCA0LCA2LCA0XQorICAgICAgICBsc3QgKj0gc2VsZi5uCisgICAgICAgIGFzc2VydCBsc3QgPT0gWzYsIDQsIDYsIDRdICogMworCisgICAgICAgIGxzdCA9IFs1LCA2LCA3LCA4LCA5LCAxMV0KKyAgICAgICAgbDIgPSBsc3QuX19pbXVsX18oc2VsZi5uKQorICAgICAgICBhc3NlcnQgbDIgaXMgbHN0CisgICAgICAgIGFzc2VydCBsc3QgPT0gWzUsIDYsIDcsIDgsIDksIDExXSAqIDMKKworCitjbGFzcyBUdXBsZVRlc3RDYXNlKEJhc2VUZXN0Q2FzZSk6CisgICAgc2VxID0gKDAsMTAsMjAsMzAsNDAsNTApCisKK2NsYXNzIFN0cmluZ1Rlc3RDYXNlKEJhc2VUZXN0Q2FzZSk6CisgICAgc2VxID0gInRoaXMgaXMgYSB0ZXN0IgorCitjbGFzcyBVbmljb2RlVGVzdENhc2UoQmFzZVRlc3RDYXNlKToKKyAgICBzZXEgPSB1InRoaXMgaXMgYSB0ZXN0IgorCisKK2NsYXNzIFhSYW5nZVRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3hyYW5nZShzZWxmKToKKyAgICAgICAgbiA9IG5ld3N0eWxlKCkKKyAgICAgICAgbi5pbmQgPSA1CisgICAgICAgIGFzc2VydCB4cmFuZ2UoMSwgMjApW25dID09IDYKKyAgICAgICAgYXNzZXJ0IHhyYW5nZSgxLCAyMCkuX19nZXRpdGVtX18obikgPT0gNgorCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KAorICAgICAgICBMaXN0VGVzdENhc2UsCisgICAgICAgIFR1cGxlVGVzdENhc2UsCisgICAgICAgIFN0cmluZ1Rlc3RDYXNlLAorICAgICAgICBVbmljb2RlVGVzdENhc2UsCisgICAgICAgIFhSYW5nZVRlc3RDYXNlLAorICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5IGIvTGliL3Rlc3QvdGVzdF9pbnNwZWN0LnB5CmluZGV4IDBiZGY5NTkuLmQ5ZmQ5M2QgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfaW5zcGVjdC5weQorKysgYi9MaWIvdGVzdC90ZXN0X2luc3BlY3QucHkKQEAgLTI5NSwxMCArMjk1LDEyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0QXJnU3BlY0VxdWFscyhBLm0sIFsnc2VsZiddKQogCiAgICAgZGVmIHRlc3RfZ2V0YXJnc3BlY19zdWJsaXN0b2ZvbmUoc2VsZik6Ci0gICAgICAgIGRlZiBzdWJsaXN0T2ZPbmUoKGZvbykpOiByZXR1cm4gMQotCisgICAgICAgIGRlZiBzdWJsaXN0T2ZPbmUoKGZvbywpKTogcmV0dXJuIDEKICAgICAgICAgc2VsZi5hc3NlcnRBcmdTcGVjRXF1YWxzKHN1Ymxpc3RPZk9uZSwgW1snZm9vJ11dKQogCisgICAgICAgIGRlZiBmYWtlU3VibGlzdE9mT25lKChmb28pKTogcmV0dXJuIDEKKyAgICAgICAgc2VsZi5hc3NlcnRBcmdTcGVjRXF1YWxzKGZha2VTdWJsaXN0T2ZPbmUsIFsnZm9vJ10pCisKICAgICBkZWYgdGVzdF9jbGFzc2lmeV9uZXdzdHlsZShzZWxmKToKICAgICAgICAgY2xhc3MgQShvYmplY3QpOgogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X21pbWV0eXBlcy5weSBiL0xpYi90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5CmluZGV4IDU5MzlmZjUuLjhjNTg0YWQgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbWltZXR5cGVzLnB5CkBAIC04LDYgKzgsNyBAQAogIyBUZWxsIGl0IHdlIGRvbid0IGtub3cgYWJvdXQgZXh0ZXJuYWwgZmlsZXM6CiBtaW1ldHlwZXMua25vd25maWxlcyA9IFtdCiBtaW1ldHlwZXMuaW5pdGVkID0gRmFsc2UKK21pbWV0eXBlcy5fZGVmYXVsdF9taW1lX3R5cGVzKCkKIAogCiBjbGFzcyBNaW1lVHlwZXNUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5IGIvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlYy5weQppbmRleCBhZWY3OTMxLi40ZDAyZGVlIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWMucHkKQEAgLTcsMTMgKzcsMTE0IEBACiAKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydAotaW1wb3J0IHVuaXR0ZXN0LCBTdHJpbmdJTywgY29kZWNzCitpbXBvcnQgdW5pdHRlc3QsIFN0cmluZ0lPLCBjb2RlY3MsIHN5cworCitjbGFzcyBUZXN0X011bHRpYnl0ZUNvZGVjKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X251bGxjb2Rpbmcoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycuZGVjb2RlKCdnYjE4MDMwJyksIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKCcnLCAnZ2IxODAzMCcpLCB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodScnLmVuY29kZSgnZ2IxODAzMCcpLCAnJykKKworICAgIGRlZiB0ZXN0X3N0cl9kZWNvZGUoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2FiY2QnLmVuY29kZSgnZ2IxODAzMCcpLCAnYWJjZCcpCisKKyAgICBkZWYgdGVzdF9lcnJvcmNhbGxiYWNrX2xvbmdpbmRleChzZWxmKToKKyAgICAgICAgZGVjID0gY29kZWNzLmdldGRlY29kZXIoJ2V1Yy1rcicpCisgICAgICAgIG15cmVwbGFjZSAgPSBsYW1iZGEgZXhjOiAodScnLCBzeXMubWF4aW50KzEpCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigndGVzdC5jamt0ZXN0JywgbXlyZXBsYWNlKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBkZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICdhcHBsZVx4OTJoYW1ceDkzc3BhbScsICd0ZXN0LmNqa3Rlc3QnKQorCitjbGFzcyBUZXN0X0luY3JlbWVudGFsRW5jb2Rlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9zdGF0ZWxlc3Moc2VsZik6CisgICAgICAgICMgY3A5NDkgZW5jb2RlciBpc24ndCBzdGF0ZWZ1bCBhdCBhbGwuCisgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKCdjcDk0OScpKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1ZDMwY1x1Yzc3NFx1YzM2YyBcdWI5YzhcdWM3NDQnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAnXHhjNlx4YzRceGMwXHhjY1x4YmRceGUzIFx4YjhceGI2XHhjMFx4YmInKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIucmVzZXQoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MjYwNlx1MjIzY1x1MjYwNicsIFRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICdceGExXHhkOVx4YTFceGFkXHhhMVx4ZDknKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIucmVzZXQoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1JycsIFRydWUpLCAnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1JycsIEZhbHNlKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5yZXNldCgpLCBOb25lKQorCisgICAgZGVmIHRlc3Rfc3RhdGVmdWwoc2VsZik6CisgICAgICAgICMgamlzeDAyMTMgZW5jb2RlciBpcyBzdGF0ZWZ1bCBmb3IgYSBmZXcgY29kZXBvaW50cy4gZWcpCisgICAgICAgICMgICBVKzAwRTYgPT4gQTlEQworICAgICAgICAjICAgVSswMEU2IFUrMDMwMCA9PiBBQkM0CisgICAgICAgICMgICBVKzAzMDAgPT4gQUJEQworCisgICAgICAgIGVuY29kZXIgPSBjb2RlY3MuZ2V0aW5jcmVtZW50YWxlbmNvZGVyKCdqaXN4MDIxMycpKCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDBlNlx1MDMwMCcpLCAnXHhhYlx4YzQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMGU2JyksICcnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMzAwJyksICdceGFiXHhjNCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAwZTYnLCBUcnVlKSwgJ1x4YTlceGRjJykKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIucmVzZXQoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDMwMCcpLCAnXHhhYlx4ZGMnKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAwZTYnKSwgJycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUoJycsIFRydWUpLCAnXHhhOVx4ZGMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKCcnLCBUcnVlKSwgJycpCisKKyAgICBkZWYgdGVzdF9zdGF0ZWZ1bF9rZWVwX2J1ZmZlcihzZWxmKToKKyAgICAgICAgZW5jb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGVuY29kZXIoJ2ppc3gwMjEzJykoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMGU2JyksICcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsIGVuY29kZXIuZW5jb2RlLCB1J1x1MDEyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodSdcdTAzMDBcdTAwZTYnKSwgJ1x4YWJceGM0JykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZUVuY29kZUVycm9yLCBlbmNvZGVyLmVuY29kZSwgdSdcdTAxMjMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIucmVzZXQoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlbmNvZGVyLmVuY29kZSh1J1x1MDMwMCcpLCAnXHhhYlx4ZGMnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGVuY29kZXIuZW5jb2RlKHUnXHUwMGU2JyksICcnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsIGVuY29kZXIuZW5jb2RlLCB1J1x1MDEyMycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZW5jb2Rlci5lbmNvZGUodScnLCBUcnVlKSwgJ1x4YTlceGRjJykKKworCitjbGFzcyBUZXN0X0luY3JlbWVudGFsRGVjb2Rlcih1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBkZWYgdGVzdF9kYmNzKHNlbGYpOgorICAgICAgICAjIGNwOTQ5IGRlY29kZXIgaXMgc2ltcGxlIHdpdGggb25seSAxIG9yIDIgYnl0ZXMgc2VxdWVuY2VzLgorICAgICAgICBkZWNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcignY3A5NDknKSgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ1x4YzZceGM0XHhjMFx4Y2NceGJkJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgdSdcdWQzMGNcdWM3NzQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdceGUzIFx4YjhceGI2XHhjMFx4YmInKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1J1x1YzM2YyBcdWI5YzhcdWM3NDQnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCcnKSwgdScnKQorCisgICAgZGVmIHRlc3RfZGJjc19rZWVwX2J1ZmZlcihzZWxmKToKKyAgICAgICAgZGVjb2RlciA9IGNvZGVjcy5nZXRpbmNyZW1lbnRhbGRlY29kZXIoJ2NwOTQ5JykoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdceGM2XHhjNFx4YzAnKSwgdSdcdWQzMGMnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGRlY29kZXIuZGVjb2RlLCAnJywgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnXHhjYycpLCB1J1x1Yzc3NCcpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnXHhjNlx4YzRceGMwJyksIHUnXHVkMzBjJykKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yLCBkZWNvZGVyLmRlY29kZSwgJ1x4Y2NceGJkJywgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnXHhjYycpLCB1J1x1Yzc3NCcpCisKKyAgICBkZWYgdGVzdF9pc28yMDIyKHNlbGYpOgorICAgICAgICBkZWNvZGVyID0gY29kZWNzLmdldGluY3JlbWVudGFsZGVjb2RlcignaXNvMjAyMi1qcCcpKCkKKyAgICAgICAgRVNDID0gJ1x4MWInCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoRVNDICsgJygnKSwgdScnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIuZGVjb2RlKCdCJywgVHJ1ZSksIHUnJykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZShFU0MgKyAnJCcpLCB1JycpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ0JAJCcpLCB1J1x1NGUxNicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJ0AkQCcpLCB1J1x1NGUxNicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoJyQnLCBUcnVlKSwgdSdcdTRlMTYnKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGRlY29kZXIucmVzZXQoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnQCQnKSwgdSdAJCcpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVjb2Rlci5kZWNvZGUoRVNDICsgJyQnKSwgdScnKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRGVjb2RlRXJyb3IsIGRlY29kZXIuZGVjb2RlLCAnJywgVHJ1ZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChkZWNvZGVyLmRlY29kZSgnQkAkJyksIHUnXHU0ZTE2JykKKwogCiBjbGFzcyBUZXN0X1N0cmVhbVdyaXRlcih1bml0dGVzdC5UZXN0Q2FzZSk6CiAgICAgaWYgbGVuKHUnXFUwMDAxMjM0NScpID09IDI6ICMgVUNTMgogICAgICAgICBkZWYgdGVzdF9nYjE4MDMwKHNlbGYpOgogICAgICAgICAgICAgcz0gU3RyaW5nSU8uU3RyaW5nSU8oKQotICAgICAgICAgICAgYyA9IGNvZGVjcy5sb29rdXAoJ2diMTgwMzAnKVszXShzKQorICAgICAgICAgICAgYyA9IGNvZGVjcy5nZXR3cml0ZXIoJ2diMTgwMzAnKShzKQogICAgICAgICAgICAgYy53cml0ZSh1JzEyMycpCiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJzEyMycpCiAgICAgICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NScpCkBAIC0zMCwxNSArMTMxLDE2IEBACiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwKICAgICAgICAgICAgICAgICAgICAgJzEyM1x4OTA3XHg5NTlceDkwN1x4OTU5XHg5MDdceDk1OVx4ODI3XHhjZjVceDgxMFx4ODUxJykKIAotICAgICAgICAjIHN0YW5kYXJkIHV0Zi04IGNvZGVjcyBoYXMgYnJva2VuIFN0cmVhbVJlYWRlcgotICAgICAgICBpZiB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQuX19jamtjb2RlY3NfXzoKLSAgICAgICAgICAgIGRlZiB0ZXN0X3V0Zl84KHNlbGYpOgotICAgICAgICAgICAgICAgIHM9IFN0cmluZ0lPLlN0cmluZ0lPKCkKLSAgICAgICAgICAgICAgICBjID0gY29kZWNzLmxvb2t1cCgndXRmLTgnKVszXShzKQotICAgICAgICAgICAgICAgIGMud3JpdGUodScxMjMnKQotICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnMTIzJykKLSAgICAgICAgICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NScpCi0gICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHZhbHVlKCksICcxMjNceGYwXHg5Mlx4OGRceDg1JykKKyAgICAgICAgZGVmIHRlc3RfdXRmXzgoc2VsZik6CisgICAgICAgICAgICBzPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICBjID0gY29kZWNzLmdldHdyaXRlcigndXRmLTgnKShzKQorICAgICAgICAgICAgYy53cml0ZSh1JzEyMycpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJzEyMycpCisgICAgICAgICAgICBjLndyaXRlKHUnXFUwMDAxMjM0NScpCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMuZ2V0dmFsdWUoKSwgJzEyM1x4ZjBceDkyXHg4ZFx4ODUnKQorCisgICAgICAgICAgICAjIFB5dGhvbiB1dGYtOCBjb2RlYyBjYW4ndCBidWZmZXIgc3Vycm9nYXRlIHBhaXJzIHlldC4KKyAgICAgICAgICAgIGlmIDA6CiAgICAgICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnWzBdKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocy5nZXR2YWx1ZSgpLCAnMTIzXHhmMFx4OTJceDhkXHg4NScpCiAgICAgICAgICAgICAgICAgYy53cml0ZSh1J1xVMDAwMTIzNDUnWzFdICsgdSdcVTAwMDEyMzQ1JyArIHUnXHVhYzAwXHUwMGFjJykKQEAgLTYxLDE0ICsxNjMsNiBAQAogICAgIGVsc2U6ICMgVUNTNAogICAgICAgICBwYXNzCiAKLSAgICBkZWYgdGVzdF9udWxsY29kaW5nKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCcnLmRlY29kZSgnZ2IxODAzMCcpLCB1JycpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pY29kZSgnJywgJ2diMTgwMzAnKSwgdScnKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHUnJy5lbmNvZGUoJ2diMTgwMzAnKSwgJycpCi0KLSAgICBkZWYgdGVzdF9zdHJfZGVjb2RlKHNlbGYpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmNkJy5lbmNvZGUoJ2diMTgwMzAnKSwgJ2FiY2QnKQotCiAgICAgZGVmIHRlc3Rfc3RyZWFtd3JpdGVyX3N0cndyaXRlKHNlbGYpOgogICAgICAgICBzID0gU3RyaW5nSU8uU3RyaW5nSU8oKQogICAgICAgICB3ciA9IGNvZGVjcy5nZXR3cml0ZXIoJ2diMTgwMzAnKShzKQpAQCAtODMsNiArMTc3LDkgQEAKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHN1aXRlID0gdW5pdHRlc3QuVGVzdFN1aXRlKCkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUZXN0X011bHRpYnl0ZUNvZGVjKSkKKyAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUZXN0X0luY3JlbWVudGFsRW5jb2RlcikpCisgICAgc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5tYWtlU3VpdGUoVGVzdF9JbmNyZW1lbnRhbERlY29kZXIpKQogICAgIHN1aXRlLmFkZFRlc3QodW5pdHRlc3QubWFrZVN1aXRlKFRlc3RfU3RyZWFtV3JpdGVyKSkKICAgICBzdWl0ZS5hZGRUZXN0KHVuaXR0ZXN0Lm1ha2VTdWl0ZShUZXN0X0lTTzIwMjIpKQogICAgIHRlc3Rfc3VwcG9ydC5ydW5fc3VpdGUoc3VpdGUpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHkgYi9MaWIvdGVzdC90ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHkKaW5kZXggNDVhNjNlNy4uYmVjMzJkZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfbXVsdGlieXRlY29kZWNfc3VwcG9ydC5weQpAQCAtMywxNSArMywxMiBAQAogIyB0ZXN0X211bHRpYnl0ZWNvZGVjX3N1cHBvcnQucHkKICMgICBDb21tb24gVW5pdHRlc3QgUm91dGluZXMgZm9yIENKSyBjb2RlY3MKICMKLSMgJENKS0NvZGVjczogdGVzdF9tdWx0aWJ5dGVjb2RlY19zdXBwb3J0LnB5LHYgMS42IDIwMDQvMDYvMTkgMDY6MDk6NTUgcGVya3kgRXhwICQKIAogaW1wb3J0IHN5cywgY29kZWNzLCBvcy5wYXRoCiBpbXBvcnQgdW5pdHRlc3QKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBmcm9tIFN0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwogCi1fX2Nqa2NvZGVjc19fID0gMCAjIGRlZmluZSB0aGlzIGFzIDAgZm9yIHB5dGhvbgotCiBjbGFzcyBUZXN0QmFzZToKICAgICBlbmNvZGluZyAgICAgICAgPSAnJyAgICMgY29kZWMgbmFtZQogICAgIGNvZGVjICAgICAgICAgICA9IE5vbmUgIyBjb2RlYyB0dXBsZSAod2l0aCA0IGVsZW1lbnRzKQpAQCAtMjEsMTEgKzE4LDE3IEBACiAgICAgcm91bmR0cmlwdGVzdCAgID0gMSAgICAjIHNldCBpZiByb3VuZHRyaXAgaXMgcG9zc2libGUgd2l0aCB1bmljb2RlCiAgICAgaGFzX2lzbzEwNjQ2ICAgID0gMCAgICAjIHNldCBpZiB0aGlzIGVuY29kaW5nIGNvbnRhaW5zIHdob2xlIGlzbzEwNjQ2IG1hcAogICAgIHhtbGNoYXJuYW1ldGVzdCA9IE5vbmUgIyBzdHJpbmcgdG8gdGVzdCB4bWxjaGFycmVmcmVwbGFjZQorICAgIHVubWFwcGVkdW5pY29kZSA9IHUnXHVkZWVlJyAjIGEgdW5pY29kZSBjb2RlcG9pbnQgdGhhdCBpcyBub3QgbWFwcGVkLgogCiAgICAgZGVmIHNldFVwKHNlbGYpOgogICAgICAgICBpZiBzZWxmLmNvZGVjIGlzIE5vbmU6CiAgICAgICAgICAgICBzZWxmLmNvZGVjID0gY29kZWNzLmxvb2t1cChzZWxmLmVuY29kaW5nKQotICAgICAgICBzZWxmLmVuY29kZSwgc2VsZi5kZWNvZGUsIHNlbGYucmVhZGVyLCBzZWxmLndyaXRlciA9IHNlbGYuY29kZWMKKyAgICAgICAgc2VsZi5lbmNvZGUgPSBzZWxmLmNvZGVjLmVuY29kZQorICAgICAgICBzZWxmLmRlY29kZSA9IHNlbGYuY29kZWMuZGVjb2RlCisgICAgICAgIHNlbGYucmVhZGVyID0gc2VsZi5jb2RlYy5zdHJlYW1yZWFkZXIKKyAgICAgICAgc2VsZi53cml0ZXIgPSBzZWxmLmNvZGVjLnN0cmVhbXdyaXRlcgorICAgICAgICBzZWxmLmluY3JlbWVudGFsZW5jb2RlciA9IHNlbGYuY29kZWMuaW5jcmVtZW50YWxlbmNvZGVyCisgICAgICAgIHNlbGYuaW5jcmVtZW50YWxkZWNvZGVyID0gc2VsZi5jb2RlYy5pbmNyZW1lbnRhbGRlY29kZXIKIAogICAgIGRlZiB0ZXN0X2NodW5rY29kaW5nKHNlbGYpOgogICAgICAgICBmb3IgbmF0aXZlLCB1dGY4IGluIHppcCgqW1N0cmluZ0lPKGYpLnJlYWRsaW5lcygpCkBAIC00Nyw1MSArNTAsMTU1IEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFVuaWNvZGVFcnJvciwgZnVuYywgc291cmNlLCBzY2hlbWUpCiAKLSAgICBpZiBzeXMuaGV4dmVyc2lvbiA+PSAweDAyMDMwMDAwOgotICAgICAgICBkZWYgdGVzdF94bWxjaGFycmVmcmVwbGFjZShzZWxmKToKLSAgICAgICAgICAgIGlmIHNlbGYuaGFzX2lzbzEwNjQ2OgotICAgICAgICAgICAgICAgIHJldHVybgorICAgIGRlZiB0ZXN0X3htbGNoYXJyZWZyZXBsYWNlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhc19pc28xMDY0NjoKKyAgICAgICAgICAgIHJldHVybgogCi0gICAgICAgICAgICBzID0gdSJcdTBiMTNcdTBiMjNcdTBiNjAgbmQgZWdncyIKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICAgICAgICAgc2VsZi5lbmNvZGUocywgInhtbGNoYXJyZWZyZXBsYWNlIilbMF0sCi0gICAgICAgICAgICAgICAgIiYjMjgzNTsmIzI4NTE7JiMyOTEyOyBuZCBlZ2dzIgotICAgICAgICAgICAgKQorICAgICAgICBzID0gdSJcdTBiMTNcdTBiMjNcdTBiNjAgbmQgZWdncyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgICAgIHNlbGYuZW5jb2RlKHMsICJ4bWxjaGFycmVmcmVwbGFjZSIpWzBdLAorICAgICAgICAgICAgIiYjMjgzNTsmIzI4NTE7JiMyOTEyOyBuZCBlZ2dzIgorICAgICAgICApCiAKLSAgICAgICAgZGVmIHRlc3RfY3VzdG9tcmVwbGFjZShzZWxmKToKLSAgICAgICAgICAgIGlmIHNlbGYuaGFzX2lzbzEwNjQ2OgotICAgICAgICAgICAgICAgIHJldHVybgorICAgIGRlZiB0ZXN0X2N1c3RvbXJlcGxhY2VfZW5jb2RlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmhhc19pc28xMDY0NjoKKyAgICAgICAgICAgIHJldHVybgogCi0gICAgICAgICAgICBpbXBvcnQgaHRtbGVudGl0eWRlZnMKKyAgICAgICAgZnJvbSBodG1sZW50aXR5ZGVmcyBpbXBvcnQgY29kZXBvaW50Mm5hbWUKIAotICAgICAgICAgICAgbmFtZXMgPSB7fQotICAgICAgICAgICAgZm9yIChrZXksIHZhbHVlKSBpbiBodG1sZW50aXR5ZGVmcy5lbnRpdHlkZWZzLml0ZW1zKCk6Ci0gICAgICAgICAgICAgICAgaWYgbGVuKHZhbHVlKT09MToKLSAgICAgICAgICAgICAgICAgICAgbmFtZXNbdmFsdWUuZGVjb2RlKCdsYXRpbi0xJyldID0gc2VsZi5kZWNvZGUoa2V5KVswXQorICAgICAgICBkZWYgeG1sY2hhcm5hbWVyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICBpZiBub3QgaXNpbnN0YW5jZShleGMsIFVuaWNvZGVFbmNvZGVFcnJvcik6CisgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgJXIiICUgZXhjKQorICAgICAgICAgICAgbCA9IFtdCisgICAgICAgICAgICBmb3IgYyBpbiBleGMub2JqZWN0W2V4Yy5zdGFydDpleGMuZW5kXToKKyAgICAgICAgICAgICAgICBpZiBvcmQoYykgaW4gY29kZXBvaW50Mm5hbWU6CisgICAgICAgICAgICAgICAgICAgIGwuYXBwZW5kKHUiJiVzOyIgJSBjb2RlcG9pbnQybmFtZVtvcmQoYyldKQogICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIG5hbWVzW3VuaWNocihpbnQodmFsdWVbMjotMV0pKV0gPSBzZWxmLmRlY29kZShrZXkpWzBdCisgICAgICAgICAgICAgICAgICAgIGwuYXBwZW5kKHUiJiMlZDsiICUgb3JkKGMpKQorICAgICAgICAgICAgcmV0dXJuICh1IiIuam9pbihsKSwgZXhjLmVuZCkKIAotICAgICAgICAgICAgZGVmIHhtbGNoYXJuYW1lcmVwbGFjZShleGMpOgotICAgICAgICAgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4YywgVW5pY29kZUVuY29kZUVycm9yKToKLSAgICAgICAgICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yKCJkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgJXIiICUgZXhjKQotICAgICAgICAgICAgICAgIGwgPSBbXQotICAgICAgICAgICAgICAgIGZvciBjIGluIGV4Yy5vYmplY3RbZXhjLnN0YXJ0OmV4Yy5lbmRdOgotICAgICAgICAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICBsLmFwcGVuZCh1IiYlczsiICUgbmFtZXNbY10pCi0gICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGwuYXBwZW5kKHUiJiMlZDsiICUgb3JkKGMpKQotICAgICAgICAgICAgICAgIHJldHVybiAodSIiLmpvaW4obCksIGV4Yy5lbmQpCisgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigidGVzdC54bWxjaGFybmFtZXJlcGxhY2UiLCB4bWxjaGFybmFtZXJlcGxhY2UpCiAKLSAgICAgICAgICAgIGNvZGVjcy5yZWdpc3Rlcl9lcnJvcigKLSAgICAgICAgICAgICAgICAidGVzdC54bWxjaGFybmFtZXJlcGxhY2UiLCB4bWxjaGFybmFtZXJlcGxhY2UpCisgICAgICAgIGlmIHNlbGYueG1sY2hhcm5hbWV0ZXN0OgorICAgICAgICAgICAgc2luLCBzb3V0ID0gc2VsZi54bWxjaGFybmFtZXRlc3QKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNpbiA9IHUiXHhhYlx1MjExY1x4YmIgPSBcdTIzMjlcdTEyMzRcdTIzMmEiCisgICAgICAgICAgICBzb3V0ID0gIiZsYXF1bzsmcmVhbDsmcmFxdW87ID0gJmxhbmc7JiM0NjYwOyZyYW5nOyIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVuY29kZShzaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdC54bWxjaGFybmFtZXJlcGxhY2UiKVswXSwgc291dCkKIAotICAgICAgICAgICAgaWYgc2VsZi54bWxjaGFybmFtZXRlc3Q6Ci0gICAgICAgICAgICAgICAgc2luLCBzb3V0ID0gc2VsZi54bWxjaGFybmFtZXRlc3QKKyAgICBkZWYgdGVzdF9jYWxsYmFja193cm9uZ19vYmplY3RzKHNlbGYpOgorICAgICAgICBkZWYgbXlyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gKHJldCwgZXhjLmVuZCkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmNqa3Rlc3QiLCBteXJlcGxhY2UpCisKKyAgICAgICAgZm9yIHJldCBpbiAoWzEsIDIsIDNdLCBbXSwgTm9uZSwgb2JqZWN0KCksICdzdHJpbmcnLCAnJyk6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNlbGYuZW5jb2RlLCBzZWxmLnVubWFwcGVkdW5pY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LmNqa3Rlc3QnKQorCisgICAgZGVmIHRlc3RfY2FsbGJhY2tfbG9uZ19pbmRleChzZWxmKToKKyAgICAgICAgZGVmIG15cmVwbGFjZShleGMpOgorICAgICAgICAgICAgcmV0dXJuICh1J3gnLCBsb25nKGV4Yy5lbmQpKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QuY2prdGVzdCIsIG15cmVwbGFjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVuY29kZSh1J2FiY2QnICsgc2VsZi51bm1hcHBlZHVuaWNvZGUgKyB1J2VmZ2gnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd0ZXN0LmNqa3Rlc3QnKSwgKCdhYmNkeGVmZ2gnLCA5KSkKKworICAgICAgICBkZWYgbXlyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gKHUneCcsIHN5cy5tYXhpbnQgKyAxKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QuY2prdGVzdCIsIG15cmVwbGFjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgc2VsZi5lbmNvZGUsIHNlbGYudW5tYXBwZWR1bmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC5jamt0ZXN0JykKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX05vbmVfaW5kZXgoc2VsZik6CisgICAgICAgIGRlZiBteXJlcGxhY2UoZXhjKToKKyAgICAgICAgICAgIHJldHVybiAodSd4JywgTm9uZSkKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmNqa3Rlc3QiLCBteXJlcGxhY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2VsZi5lbmNvZGUsIHNlbGYudW5tYXBwZWR1bmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC5jamt0ZXN0JykKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX2JhY2t3YXJkX2luZGV4KHNlbGYpOgorICAgICAgICBkZWYgbXlyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICBpZiBteXJlcGxhY2UubGltaXQgPiAwOgorICAgICAgICAgICAgICAgIG15cmVwbGFjZS5saW1pdCAtPSAxCisgICAgICAgICAgICAgICAgcmV0dXJuICh1J1JFUExBQ0VEJywgMCkKICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2luID0gdSJceGFiXHUyMTFjXHhiYiA9IFx1MjMyOVx1MTIzNFx1MjMyYSIKLSAgICAgICAgICAgICAgICBzb3V0ID0gIiZsYXF1bzsmcmVhbDsmcmFxdW87ID0gJmxhbmc7JiM0NjYwOyZyYW5nOyIKLSAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbmNvZGUoc2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0LnhtbGNoYXJuYW1lcmVwbGFjZSIpWzBdLCBzb3V0KQorICAgICAgICAgICAgICAgIHJldHVybiAodSdURVJNSU5BTCcsIGV4Yy5lbmQpCisgICAgICAgIG15cmVwbGFjZS5saW1pdCA9IDMKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmNqa3Rlc3QiLCBteXJlcGxhY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbmNvZGUodSdhYmNkJyArIHNlbGYudW5tYXBwZWR1bmljb2RlICsgdSdlZmdoJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC5jamt0ZXN0JyksCisgICAgICAgICAgICAgICAgKCdhYmNkUkVQTEFDRURhYmNkUkVQTEFDRURhYmNkUkVQTEFDRURhYmNkVEVSTUlOQUxlZmdoJywgOSkpCisKKyAgICBkZWYgdGVzdF9jYWxsYmFja19mb3J3YXJkX2luZGV4KHNlbGYpOgorICAgICAgICBkZWYgbXlyZXBsYWNlKGV4Yyk6CisgICAgICAgICAgICByZXR1cm4gKHUnUkVQTEFDRUQnLCBleGMuZW5kICsgMikKKyAgICAgICAgY29kZWNzLnJlZ2lzdGVyX2Vycm9yKCJ0ZXN0LmNqa3Rlc3QiLCBteXJlcGxhY2UpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbmNvZGUodSdhYmNkJyArIHNlbGYudW5tYXBwZWR1bmljb2RlICsgdSdlZmdoJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC5jamt0ZXN0JyksICgnYWJjZFJFUExBQ0VEZ2gnLCA5KSkKKworICAgIGRlZiB0ZXN0X2NhbGxiYWNrX2luZGV4X291dG9mYm91bmQoc2VsZik6CisgICAgICAgIGRlZiBteXJlcGxhY2UoZXhjKToKKyAgICAgICAgICAgIHJldHVybiAodSdURVJNJywgMTAwKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoInRlc3QuY2prdGVzdCIsIG15cmVwbGFjZSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgc2VsZi5lbmNvZGUsIHNlbGYudW5tYXBwZWR1bmljb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAndGVzdC5jamt0ZXN0JykKKworICAgIGRlZiB0ZXN0X2luY3JlbWVudGFsZW5jb2RlcihzZWxmKToKKyAgICAgICAgVVRGOFJlYWRlciA9IGNvZGVjcy5nZXRyZWFkZXIoJ3V0Zi04JykKKyAgICAgICAgZm9yIHNpemVoaW50IGluIFtOb25lXSArIHJhbmdlKDEsIDMzKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFs2NCwgMTI4LCAyNTYsIDUxMiwgMTAyNF06CisgICAgICAgICAgICBpc3RyZWFtID0gVVRGOFJlYWRlcihTdHJpbmdJTyhzZWxmLnRzdHJpbmdbMV0pKQorICAgICAgICAgICAgb3N0cmVhbSA9IFN0cmluZ0lPKCkKKyAgICAgICAgICAgIGVuY29kZXIgPSBzZWxmLmluY3JlbWVudGFsZW5jb2RlcigpCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGlmIHNpemVoaW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBkYXRhID0gaXN0cmVhbS5yZWFkKHNpemVoaW50KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBpc3RyZWFtLnJlYWQoKQorCisgICAgICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZSA9IGVuY29kZXIuZW5jb2RlKGRhdGEpCisgICAgICAgICAgICAgICAgb3N0cmVhbS53cml0ZShlKQorCisgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zdHJlYW0uZ2V0dmFsdWUoKSwgc2VsZi50c3RyaW5nWzBdKQorCisgICAgZGVmIHRlc3RfaW5jcmVtZW50YWxkZWNvZGVyKHNlbGYpOgorICAgICAgICBVVEY4V3JpdGVyID0gY29kZWNzLmdldHdyaXRlcigndXRmLTgnKQorICAgICAgICBmb3Igc2l6ZWhpbnQgaW4gW05vbmUsIC0xXSArIHJhbmdlKDEsIDMzKSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIFs2NCwgMTI4LCAyNTYsIDUxMiwgMTAyNF06CisgICAgICAgICAgICBpc3RyZWFtID0gU3RyaW5nSU8oc2VsZi50c3RyaW5nWzBdKQorICAgICAgICAgICAgb3N0cmVhbSA9IFVURjhXcml0ZXIoU3RyaW5nSU8oKSkKKyAgICAgICAgICAgIGRlY29kZXIgPSBzZWxmLmluY3JlbWVudGFsZGVjb2RlcigpCisgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgIGRhdGEgPSBpc3RyZWFtLnJlYWQoc2l6ZWhpbnQpCisgICAgICAgICAgICAgICAgaWYgbm90IGRhdGE6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdSA9IGRlY29kZXIuZGVjb2RlKGRhdGEpCisgICAgICAgICAgICAgICAgICAgIG9zdHJlYW0ud3JpdGUodSkKKworICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChvc3RyZWFtLmdldHZhbHVlKCksIHNlbGYudHN0cmluZ1sxXSkKKworICAgIGRlZiB0ZXN0X2luY3JlbWVudGFsZW5jb2Rlcl9lcnJvcl9jYWxsYmFjayhzZWxmKToKKyAgICAgICAgaW52ID0gc2VsZi51bm1hcHBlZHVuaWNvZGUKKworICAgICAgICBlID0gc2VsZi5pbmNyZW1lbnRhbGVuY29kZXIoKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhVbmljb2RlRW5jb2RlRXJyb3IsIGUuZW5jb2RlLCBpbnYsIFRydWUpCisKKyAgICAgICAgZS5lcnJvcnMgPSAnaWdub3JlJworICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGUuZW5jb2RlKGludiwgVHJ1ZSksICcnKQorCisgICAgICAgIGUucmVzZXQoKQorICAgICAgICBkZWYgdGVtcHJlcGxhY2UoZXhjKToKKyAgICAgICAgICAgIHJldHVybiAodSdjYWxsZWQnLCBleGMuZW5kKQorICAgICAgICBjb2RlY3MucmVnaXN0ZXJfZXJyb3IoJ3Rlc3QuaW5jcmVtZW50YWxfZXJyb3JfY2FsbGJhY2snLCB0ZW1wcmVwbGFjZSkKKyAgICAgICAgZS5lcnJvcnMgPSAndGVzdC5pbmNyZW1lbnRhbF9lcnJvcl9jYWxsYmFjaycKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmVuY29kZShpbnYsIFRydWUpLCAnY2FsbGVkJykKKworICAgICAgICAjIGFnYWluCisgICAgICAgIGUuZXJyb3JzID0gJ2lnbm9yZScKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLmVuY29kZShpbnYsIFRydWUpLCAnJykKIAogICAgIGRlZiB0ZXN0X3N0cmVhbXJlYWRlcihzZWxmKToKICAgICAgICAgVVRGOFdyaXRlciA9IGNvZGVjcy5nZXR3cml0ZXIoJ3V0Zi04JykKQEAgLTExMywxMSArMjIwLDcgQEAKICAgICAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG9zdHJlYW0uZ2V0dmFsdWUoKSwgc2VsZi50c3RyaW5nWzFdKQogCiAgICAgZGVmIHRlc3Rfc3RyZWFtd3JpdGVyKHNlbGYpOgotICAgICAgICBpZiBfX2Nqa2NvZGVjc19fOgotICAgICAgICAgICAgcmVhZGZ1bmNzID0gKCdyZWFkJywgJ3JlYWRsaW5lJywgJ3JlYWRsaW5lcycpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAjIHN0YW5kYXJkIHV0ZjggY29kZWMgaGFzIGJyb2tlbiByZWFkbGluZSBhbmQgcmVhZGxpbmVzLgotICAgICAgICAgICAgcmVhZGZ1bmNzID0gKCdyZWFkJywpCisgICAgICAgIHJlYWRmdW5jcyA9ICgncmVhZCcsICdyZWFkbGluZScsICdyZWFkbGluZXMnKQogICAgICAgICBVVEY4UmVhZGVyID0gY29kZWNzLmdldHJlYWRlcigndXRmLTgnKQogICAgICAgICBmb3IgbmFtZSBpbiByZWFkZnVuY3M6CiAgICAgICAgICAgICBmb3Igc2l6ZWhpbnQgaW4gW05vbmVdICsgcmFuZ2UoMSwgMzMpICsgXApAQCAtMjExLDEwICszMTQsNSBAQAogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmljb2RlKGNzZXRjaCwgc2VsZi5lbmNvZGluZyksIHVuaWNoKQogCiBkZWYgbG9hZF90ZXN0c3RyaW5nKGVuY29kaW5nKToKLSAgICBpZiBfX2Nqa2NvZGVjc19fOgotICAgICAgICBldHh0ID0gb3Blbihvcy5wYXRoLmpvaW4oJ3NhbXBsZXRleHRzJywgZW5jb2RpbmcpICsgJy50eHQnKS5yZWFkKCkKLSAgICAgICAgdXR4dCA9IG9wZW4ob3MucGF0aC5qb2luKCdzYW1wbGV0ZXh0cycsIGVuY29kaW5nKSArICcudXRmOCcpLnJlYWQoKQotICAgICAgICByZXR1cm4gKGV0eHQsIHV0eHQpCi0gICAgZWxzZToKLSAgICAgICAgZnJvbSB0ZXN0IGltcG9ydCBjamtlbmNvZGluZ3NfdGVzdAotICAgICAgICByZXR1cm4gY2prZW5jb2RpbmdzX3Rlc3QudGVzdHN0cmluZ1tlbmNvZGluZ10KKyAgICBmcm9tIHRlc3QgaW1wb3J0IGNqa2VuY29kaW5nc190ZXN0CisgICAgcmV0dXJuIGNqa2VuY29kaW5nc190ZXN0LnRlc3RzdHJpbmdbZW5jb2RpbmddCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5IGIvTGliL3Rlc3QvdGVzdF9vcHRwYXJzZS5weQppbmRleCBjZjgzZDc1Li5mNjU2YjlmIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X29wdHBhcnNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfb3B0cGFyc2UucHkKQEAgLTEzODIsOCArMTM4MiwxNSBAQAogCiBjbGFzcyBUZXN0SGVscChCYXNlVGVzdCk6CiAgICAgZGVmIHNldFVwKHNlbGYpOgorICAgICAgICBzZWxmLm9yaWdfY29sdW1ucyA9IG9zLmVudmlyb24uZ2V0KCdDT0xVTU5TJykKICAgICAgICAgc2VsZi5wYXJzZXIgPSBzZWxmLm1ha2VfcGFyc2VyKDgwKQogCisgICAgZGVmIHRlYXJEb3duKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm9yaWdfY29sdW1ucyBpcyBOb25lOgorICAgICAgICAgICAgZGVsIG9zLmVudmlyb25bJ0NPTFVNTlMnXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgb3MuZW52aXJvblsnQ09MVU1OUyddID0gc2VsZi5vcmlnX2NvbHVtbnMKKwogICAgIGRlZiBtYWtlX3BhcnNlcihzZWxmLCBjb2x1bW5zKToKICAgICAgICAgb3B0aW9ucyA9IFsKICAgICAgICAgICAgIG1ha2Vfb3B0aW9uKCItYSIsIHR5cGU9InN0cmluZyIsIGRlc3Q9J2EnLApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wYXJzZXIucHkgYi9MaWIvdGVzdC90ZXN0X3BhcnNlci5weQppbmRleCA3NzFmZTlkLi44YWExNjU3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BhcnNlci5weQorKysgYi9MaWIvdGVzdC90ZXN0X3BhcnNlci5weQpAQCAtNTEsNiArNTEsMTAgQEAKICAgICAgICAgc2VsZi5jaGVja19leHByKCJbMSwgMiwgM10iKQogICAgICAgICBzZWxmLmNoZWNrX2V4cHIoIlt4KiozIGZvciB4IGluIHJhbmdlKDIwKV0iKQogICAgICAgICBzZWxmLmNoZWNrX2V4cHIoIlt4KiozIGZvciB4IGluIHJhbmdlKDIwKSBpZiB4ICUgM10iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoIlt4KiozIGZvciB4IGluIHJhbmdlKDIwKSBpZiB4ICUgMiBpZiB4ICUgM10iKQorICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImxpc3QoeCoqMyBmb3IgeCBpbiByYW5nZSgyMCkpIikKKyAgICAgICAgc2VsZi5jaGVja19leHByKCJsaXN0KHgqKjMgZm9yIHggaW4gcmFuZ2UoMjApIGlmIHggJSAzKSIpCisgICAgICAgIHNlbGYuY2hlY2tfZXhwcigibGlzdCh4KiozIGZvciB4IGluIHJhbmdlKDIwKSBpZiB4ICUgMiBpZiB4ICUgMykiKQogICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImZvbygqYXJncykiKQogICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImZvbygqYXJncywgKiprdykiKQogICAgICAgICBzZWxmLmNoZWNrX2V4cHIoImZvbygqKmt3KSIpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BsYXRmb3JtLnB5IGIvTGliL3Rlc3QvdGVzdF9wbGF0Zm9ybS5weQppbmRleCAyMDBmYmE1Li4yMjMwN2NkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3BsYXRmb3JtLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcGxhdGZvcm0ucHkKQEAgLTYzLDcgKzYzLDEyIEBACiAgICAgICAgIHJlcyA9IHBsYXRmb3JtLmRpc3QoKQogCiAgICAgZGVmIHRlc3RfbGliY192ZXIoc2VsZik6Ci0gICAgICAgIHJlcyA9IHBsYXRmb3JtLmxpYmNfdmVyKCkKKyAgICAgICAgZnJvbSBzeXMgaW1wb3J0IGV4ZWN1dGFibGUKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIoZXhlY3V0YWJsZSkgYW5kIG9zLnBhdGguZXhpc3RzKGV4ZWN1dGFibGUrJy5leGUnKToKKyAgICAgICAgICAgICMgQ3lnd2luIGhvcnJvcgorICAgICAgICAgICAgZXhlY3V0YWJsZSA9IGV4ZWN1dGFibGUgKyAnLmV4ZScKKyAgICAgICAgcmVzID0gcGxhdGZvcm0ubGliY192ZXIoZXhlY3V0YWJsZSkKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3BvcGVuMi5weSBiL0xpYi90ZXN0L3Rlc3RfcG9wZW4yLnB5CmluZGV4IDE4MTQyZWMuLjRkYjNjZDEgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcG9wZW4yLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfcG9wZW4yLnB5CkBAIC0zNSw2ICszNSw5IEBACiAgICAgIyBzYW1lIHRlc3QgYXMgcG9wZW4yLl90ZXN0KCksIGJ1dCB1c2luZyB0aGUgb3MucG9wZW4qKCkgQVBJCiAgICAgcHJpbnQgIlRlc3Rpbmcgb3MgbW9kdWxlOiIKICAgICBpbXBvcnQgcG9wZW4yCisgICAgIyBXaGVuIHRoZSB0ZXN0IHJ1bnMsIHRoZXJlIHNob3VsZG4ndCBiZSBhbnkgb3BlbiBwaXBlcworICAgIHBvcGVuMi5fY2xlYW51cCgpCisgICAgYXNzZXJ0IG5vdCBwb3BlbjIuX2FjdGl2ZSwgIkFjdGl2ZSBwaXBlcyB3aGVuIHRlc3Qgc3RhcnRzICIgKyByZXByKFtjLmNtZCBmb3IgYyBpbiBwb3BlbjIuX2FjdGl2ZV0pCiAgICAgY21kICA9ICJjYXQiCiAgICAgdGVzdHN0ciA9ICJhYiBjZFxuIgogICAgIGlmIG9zLm5hbWUgPT0gIm50IjoKQEAgLTY1LDYgKzY4LDcgQEAKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigidW5leHBlY3RlZCAlciBvbiBzdGRlcnIiICUgKGdvdCwpKQogICAgIGZvciBpbnN0IGluIHBvcGVuMi5fYWN0aXZlWzpdOgogICAgICAgICBpbnN0LndhaXQoKQorICAgIHBvcGVuMi5fY2xlYW51cCgpCiAgICAgaWYgcG9wZW4yLl9hY3RpdmU6CiAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIl9hY3RpdmUgbm90IGVtcHR5IikKICAgICBwcmludCAiQWxsIE9LIgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wb3NpeC5weSBiL0xpYi90ZXN0L3Rlc3RfcG9zaXgucHkKaW5kZXggMWNjYzYyYi4uZjk4YzcyMyAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9wb3NpeC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3Bvc2l4LnB5CkBAIC03Myw2ICs3MywxMSBAQAogICAgICAgICAgICAgZmluYWxseToKICAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCiAKKyAgICBkZWYgdGVzdF9jb25mc3RyKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnY29uZnN0cicpOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcG9zaXguY29uZnN0ciwgIkNTX2dhcmJhZ2UiKQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocG9zaXguY29uZnN0cigiQ1NfUEFUSCIpKSA+IDAsIFRydWUpCisKICAgICBkZWYgdGVzdF9kdXAyKHNlbGYpOgogICAgICAgICBpZiBoYXNhdHRyKHBvc2l4LCAnZHVwMicpOgogICAgICAgICAgICAgZnAxID0gb3Blbih0ZXN0X3N1cHBvcnQuVEVTVEZOKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9wdHkucHkgYi9MaWIvdGVzdC90ZXN0X3B0eS5weQppbmRleCBmOGFlNDc5Li45OWUwMWI2IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B0eS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3B0eS5weQpAQCAtMTgsNiArMTgsMjcgQEAKICAgICBkZWYgZGVidWcobXNnKToKICAgICAgICAgcGFzcwogCitkZWYgbm9ybWFsaXplX291dHB1dChkYXRhKToKKyAgICAjIFNvbWUgb3BlcmF0aW5nIHN5c3RlbXMgZG8gY29udmVyc2lvbnMgb24gbmV3bGluZS4gIFdlIGNvdWxkIHBvc3NpYmx5CisgICAgIyBmaXggdGhhdCBieSBkb2luZyB0aGUgYXBwcm9wcmlhdGUgdGVybWlvcy50Y3NldGF0dHIoKXMuICBJIGNvdWxkbid0CisgICAgIyBmaWd1cmUgb3V0IHRoZSByaWdodCBjb21ibyBvbiBUcnU2NCBhbmQgSSBkb24ndCBoYXZlIGFuIElSSVggYm94LgorICAgICMgU28ganVzdCBub3JtYWxpemUgdGhlIG91dHB1dCBhbmQgZG9jIHRoZSBwcm9ibGVtIE8vU2VzIGJ5IGFsbG93aW5nCisgICAgIyBjZXJ0YWluIGNvbWJpbmF0aW9ucyBmb3Igc29tZSBwbGF0Zm9ybXMsIGJ1dCBhdm9pZCBhbGxvd2luZyBvdGhlcgorICAgICMgZGlmZmVyZW5jZXMgKGxpa2UgZXh0cmEgd2hpdGVzcGFjZSwgdHJhaWxpbmcgZ2FyYmFnZSwgZXRjLikKKworICAgICMgVGhpcyBpcyBhYm91dCB0aGUgYmVzdCB3ZSBjYW4gZG8gd2l0aG91dCBnZXR0aW5nIHNvbWUgZmVlZGJhY2sKKyAgICAjIGZyb20gc29tZW9uZSBtb3JlIGtub3dsZWRnYWJsZS4KKworICAgICMgT1NGLzEgKFRydTY0KSBhcHBhcmVudGx5IHR1cm5zIFxuIGludG8gXHJcclxuLgorICAgIGlmIGRhdGEuZW5kc3dpdGgoJ1xyXHJcbicpOgorICAgICAgICByZXR1cm4gZGF0YVs6LTNdICsgJ1xuJworCisgICAgIyBJUklYIGFwcGFyZW50bHkgdHVybnMgXG4gaW50byBcclxuLgorICAgIGlmIGRhdGEuZW5kc3dpdGgoJ1xyXG4nKToKKyAgICAgICAgcmV0dXJuIGRhdGFbOi0yXSArICdcbicKKworICAgIHJldHVybiBkYXRhCisKICMgTWFyZ2luYWwgdGVzdGluZyBvZiBwdHkgc3VpdGUuIENhbm5vdCBkbyBleHRlbnNpdmUgJ2RvIG9yIGZhaWwnIHRlc3RpbmcKICMgYmVjYXVzZSBwdHkgY29kZSBpcyBub3QgdG9vIHBvcnRhYmxlLgogCkBAIC0zNiwxOSArNTcsMTYgQEAKICAgICBpZiBub3Qgb3MuaXNhdHR5KHNsYXZlX2ZkKSBhbmQgc3lzLnBsYXRmb3JtIG5vdCBpbiBmaWNrbGVfaXNhdHR5OgogICAgICAgICByYWlzZSBUZXN0RmFpbGVkLCAic2xhdmVfZmQgaXMgbm90IGEgdHR5IgogCi0gICAgIyBJUklYIGFwcGFyZW50bHkgdHVybnMgXG4gaW50byBcclxuLiBBbGxvdyB0aGF0LCBidXQgYXZvaWQgYWxsb3dpbmcgb3RoZXIKLSAgICAjIGRpZmZlcmVuY2VzIChsaWtlIGV4dHJhIHdoaXRlc3BhY2UsIHRyYWlsaW5nIGdhcmJhZ2UsIGV0Yy4pCi0KICAgICBkZWJ1ZygiV3JpdGluZyB0byBzbGF2ZV9mZCIpCiAgICAgb3Mud3JpdGUoc2xhdmVfZmQsIFRFU1RfU1RSSU5HXzEpCiAgICAgczEgPSBvcy5yZWFkKG1hc3Rlcl9mZCwgMTAyNCkKLSAgICBzeXMuc3Rkb3V0LndyaXRlKHMxLnJlcGxhY2UoIlxyXG4iLCAiXG4iKSkKKyAgICBzeXMuc3Rkb3V0LndyaXRlKG5vcm1hbGl6ZV9vdXRwdXQoczEpKQogCiAgICAgZGVidWcoIldyaXRpbmcgY2h1bmtlZCBvdXRwdXQiKQogICAgIG9zLndyaXRlKHNsYXZlX2ZkLCBURVNUX1NUUklOR18yWzo1XSkKICAgICBvcy53cml0ZShzbGF2ZV9mZCwgVEVTVF9TVFJJTkdfMls1Ol0pCiAgICAgczIgPSBvcy5yZWFkKG1hc3Rlcl9mZCwgMTAyNCkKLSAgICBzeXMuc3Rkb3V0LndyaXRlKHMyLnJlcGxhY2UoIlxyXG4iLCAiXG4iKSkKKyAgICBzeXMuc3Rkb3V0LndyaXRlKG5vcm1hbGl6ZV9vdXRwdXQoczIpKQogCiAgICAgb3MuY2xvc2Uoc2xhdmVfZmQpCiAgICAgb3MuY2xvc2UobWFzdGVyX2ZkKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9weWNsYnIucHkgYi9MaWIvdGVzdC90ZXN0X3B5Y2xici5weQppbmRleCAwZWI3ZDkwLi4yNDEwYjAzIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3B5Y2xici5weQorKysgYi9MaWIvdGVzdC90ZXN0X3B5Y2xici5weQpAQCAtOTcsNiArOTcsOSBAQAogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc2luc3RhbmNlKHB5X2l0ZW0sIChGdW5jdGlvblR5cGUsIEJ1aWx0aW5GdW5jdGlvblR5cGUpKSkKICAgICAgICAgICAgIGVsc2U6CiAgICAgICAgICAgICAgICAgc2VsZi5mYWlsVW5sZXNzKGlzaW5zdGFuY2UocHlfaXRlbSwgKENsYXNzVHlwZSwgdHlwZSkpKQorICAgICAgICAgICAgICAgIGlmIHB5X2l0ZW0uX19tb2R1bGVfXyAhPSBtb2R1bGVOYW1lOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZSAgICMgc2tpcCBjbGFzc2VzIHRoYXQgY2FtZSBmcm9tIHNvbWV3aGVyZSBlbHNlCisKICAgICAgICAgICAgICAgICByZWFsX2Jhc2VzID0gW2Jhc2UuX19uYW1lX18gZm9yIGJhc2UgaW4gcHlfaXRlbS5fX2Jhc2VzX19dCiAgICAgICAgICAgICAgICAgcHljbGJyX2Jhc2VzID0gWyBnZXRhdHRyKGJhc2UsICduYW1lJywgYmFzZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBiYXNlIGluIHZhbHVlLnN1cGVyIF0KQEAgLTE3Miw3ICsxNzUsNyBAQAogICAgICAgICBjbSgncHlkb2MnKQogCiAgICAgICAgICMgVGVzdHMgZm9yIG1vZHVsZXMgaW5zaWRlIHBhY2thZ2VzCi0gICAgICAgIGNtKCdlbWFpbC5QYXJzZXInKQorICAgICAgICBjbSgnZW1haWwucGFyc2VyJykKICAgICAgICAgY20oJ3Rlc3QudGVzdF9weWNsYnInKQogCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcXVldWUucHkgYi9MaWIvdGVzdC90ZXN0X3F1ZXVlLnB5CmluZGV4IGI1NWRkMDEuLjY2OTc3ZTYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3RfcXVldWUucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9xdWV1ZS5weQpAQCAtMjIxLDcgKzIyMSw1MSBAQAogICAgIF9kb0Jsb2NraW5nVGVzdChxLmdldCwgKCksIHEucHV0LCAoJ2VtcHR5JywpKQogICAgIF9kb0Jsb2NraW5nVGVzdChxLmdldCwgKFRydWUsIDEwKSwgcS5wdXQsICgnZW1wdHknLCkpCiAKK2N1bSA9IDAKK2N1bWxvY2sgPSB0aHJlYWRpbmcuTG9jaygpCisKK2RlZiB3b3JrZXIocSk6CisgICAgZ2xvYmFsIGN1bQorICAgIHdoaWxlIFRydWU6CisgICAgICAgIHggPSBxLmdldCgpCisgICAgICAgIGlmIHggaXMgTm9uZToKKyAgICAgICAgICAgIHEudGFza19kb25lKCkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBjdW1sb2NrLmFjcXVpcmUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBjdW0gKz0geAorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgY3VtbG9jay5yZWxlYXNlKCkKKyAgICAgICAgcS50YXNrX2RvbmUoKQorCitkZWYgUXVldWVKb2luVGVzdChxKToKKyAgICBnbG9iYWwgY3VtCisgICAgY3VtID0gMAorICAgIGZvciBpIGluICgwLDEpOgorICAgICAgICB0aHJlYWRpbmcuVGhyZWFkKHRhcmdldD13b3JrZXIsIGFyZ3M9KHEsKSkuc3RhcnQoKQorICAgIGZvciBpIGluIHhyYW5nZSgxMDApOgorICAgICAgICBxLnB1dChpKQorICAgIHEuam9pbigpCisgICAgdmVyaWZ5KGN1bT09c3VtKHJhbmdlKDEwMCkpLCAicS5qb2luKCkgZGlkIG5vdCBibG9jayB1bnRpbCBhbGwgdGFza3Mgd2VyZSBkb25lIikKKyAgICBmb3IgaSBpbiAoMCwxKToKKyAgICAgICAgcS5wdXQoTm9uZSkgICAgICAgICAjIGluc3RydWN0IHRoZSB0aHJlYWRzIHRvIGNsb3NlCisgICAgcS5qb2luKCkgICAgICAgICAgICAgICAgIyB2ZXJpZnkgdGhhdCB5b3UgY2FuIGpvaW4gdHdpY2UKKworZGVmIFF1ZXVlVGFza0RvbmVUZXN0KHEpOgorICAgIHRyeToKKyAgICAgICAgcS50YXNrX2RvbmUoKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgcmFpc2UgVGVzdEZhaWxlZCgiRGlkIG5vdCBkZXRlY3QgdGFzayBjb3VudCBnb2luZyBuZWdhdGl2ZSIpCisKIGRlZiB0ZXN0KCk6CisgICAgcSA9IFF1ZXVlLlF1ZXVlKCkKKyAgICBRdWV1ZVRhc2tEb25lVGVzdChxKQorICAgIFF1ZXVlSm9pblRlc3QocSkKKyAgICBRdWV1ZUpvaW5UZXN0KHEpCisgICAgUXVldWVUYXNrRG9uZVRlc3QocSkKKwogICAgIHEgPSBRdWV1ZS5RdWV1ZShRVUVVRV9TSVpFKQogICAgICMgRG8gaXQgYSBjb3VwbGUgb2YgdGltZXMgb24gdGhlIHNhbWUgcXVldWUKICAgICBTaW1wbGVRdWV1ZVRlc3QocSkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfcXVvcHJpLnB5IGIvTGliL3Rlc3QvdGVzdF9xdW9wcmkucHkKaW5kZXggZWQ2NmRmYy4uNjMxYzk3NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9xdW9wcmkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9xdW9wcmkucHkKQEAgLTEsNyArMSw3IEBACiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogaW1wb3J0IHVuaXR0ZXN0CiAKLWltcG9ydCBzeXMsIG9zLCBjU3RyaW5nSU8KK2ltcG9ydCBzeXMsIG9zLCBjU3RyaW5nSU8sIHN1YnByb2Nlc3MKIGltcG9ydCBxdW9wcmkKIAogCkBAIC0xNzYsMTcgKzE3NiwyMCBAQAogCiAgICAgZGVmIHRlc3Rfc2NyaXB0ZW5jb2RlKHNlbGYpOgogICAgICAgICAocCwgZSkgPSBzZWxmLlNUUklOR1NbLTFdCi0gICAgICAgIChjaW4sIGNvdXQpID0gb3MucG9wZW4yKCIlcyAtbXF1b3ByaSIgJSBzeXMuZXhlY3V0YWJsZSkKLSAgICAgICAgY2luLndyaXRlKHApCi0gICAgICAgIGNpbi5jbG9zZSgpCi0gICAgICAgIHNlbGYuYXNzZXJ0Xyhjb3V0LnJlYWQoKSA9PSBlKQorICAgICAgICBwcm9jZXNzID0gc3VicHJvY2Vzcy5Qb3Blbihbc3lzLmV4ZWN1dGFibGUsICItbXF1b3ByaSJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUpCisgICAgICAgIGNvdXQsIGNlcnIgPSBwcm9jZXNzLmNvbW11bmljYXRlKHApCisgICAgICAgICMgT24gV2luZG93cywgUHl0aG9uIHdpbGwgb3V0cHV0IHRoZSByZXN1bHQgdG8gc3Rkb3V0IHVzaW5nCisgICAgICAgICMgQ1JMRiwgYXMgdGhlIG1vZGUgb2Ygc3Rkb3V0IGlzIHRleHQgbW9kZS4gVG8gY29tcGFyZSB0aGlzCisgICAgICAgICMgd2l0aCB0aGUgZXhwZWN0ZWQgcmVzdWx0LCB3ZSBuZWVkIHRvIGRvIGEgbGluZS1ieS1saW5lIGNvbXBhcmlzb24uCisgICAgICAgIHNlbGYuYXNzZXJ0Xyhjb3V0LnNwbGl0bGluZXMoKSA9PSBlLnNwbGl0bGluZXMoKSkKIAogICAgIGRlZiB0ZXN0X3NjcmlwdGRlY29kZShzZWxmKToKICAgICAgICAgKHAsIGUpID0gc2VsZi5TVFJJTkdTWy0xXQotICAgICAgICAoY2luLCBjb3V0KSA9IG9zLnBvcGVuMigiJXMgLW1xdW9wcmkgLWQiICUgc3lzLmV4ZWN1dGFibGUpCi0gICAgICAgIGNpbi53cml0ZShlKQotICAgICAgICBjaW4uY2xvc2UoKQotICAgICAgICBzZWxmLmFzc2VydF8oY291dC5yZWFkKCkgPT0gcCkKKyAgICAgICAgcHJvY2VzcyA9IHN1YnByb2Nlc3MuUG9wZW4oW3N5cy5leGVjdXRhYmxlLCAiLW1xdW9wcmkiLCAiLWQiXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRvdXQ9c3VicHJvY2Vzcy5QSVBFKQorICAgICAgICBjb3V0LCBjZXJyID0gcHJvY2Vzcy5jb21tdW5pY2F0ZShlKQorICAgICAgICBzZWxmLmFzc2VydF8oY291dC5zcGxpdGxpbmVzKCkgPT0gcC5zcGxpdGxpbmVzKCkpCiAKIGRlZiB0ZXN0X21haW4oKToKICAgICB0ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFF1b3ByaVRlc3RDYXNlKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yYW5kb20ucHkgYi9MaWIvdGVzdC90ZXN0X3JhbmRvbS5weQppbmRleCA5YzJlMGQwLi5iYmE0YzdjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3JhbmRvbS5weQorKysgYi9MaWIvdGVzdC90ZXN0X3JhbmRvbS5weQpAQCAtOTMsMTAgKzkzLDI5IEBACiAgICAgICAgIHNlbGYuZ2VuLnNhbXBsZShzZXQocmFuZ2UoMjApKSwgMikKICAgICAgICAgc2VsZi5nZW4uc2FtcGxlKHJhbmdlKDIwKSwgMikKICAgICAgICAgc2VsZi5nZW4uc2FtcGxlKHhyYW5nZSgyMCksIDIpCi0gICAgICAgIHNlbGYuZ2VuLnNhbXBsZShkaWN0LmZyb21rZXlzKCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpLCAyKQogICAgICAgICBzZWxmLmdlbi5zYW1wbGUoc3RyKCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpLCAyKQogICAgICAgICBzZWxmLmdlbi5zYW1wbGUodHVwbGUoJ2FiY2RlZmdoaWprbG1ub3BxcnN0JyksIDIpCiAKKyAgICBkZWYgdGVzdF9zYW1wbGVfb25fZGljdHMoc2VsZik6CisgICAgICAgIHNlbGYuZ2VuLnNhbXBsZShkaWN0LmZyb21rZXlzKCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpLCAyKQorCisgICAgICAgICMgU0YgYnVnICMxNDYwMzQwIC0tIHJhbmRvbS5zYW1wbGUgY2FuIHJhaXNlIEtleUVycm9yCisgICAgICAgIGEgPSBkaWN0LmZyb21rZXlzKHJhbmdlKDEwKStyYW5nZSgxMCwxMDAsMikrcmFuZ2UoMTAwLDExMCkpCisgICAgICAgIHNlbGYuZ2VuLnNhbXBsZShhLCAzKQorCisgICAgICAgICMgQSBmb2xsb3d1cCB0byBidWcgIzE0NjAzNDA6ICBzYW1wbGluZyBmcm9tIGEgZGljdCBjb3VsZCByZXR1cm4KKyAgICAgICAgIyBhIHN1YnNldCBvZiBpdHMga2V5cyBvciBvZiBpdHMgdmFsdWVzLCBkZXBlbmRpbmcgb24gdGhlIHNpemUgb2YKKyAgICAgICAgIyB0aGUgc3Vic2V0IHJlcXVlc3RlZC4KKyAgICAgICAgTiA9IDMwCisgICAgICAgIGQgPSBkaWN0KChpLCBjb21wbGV4KGksIGkpKSBmb3IgaSBpbiB4cmFuZ2UoTikpCisgICAgICAgIGZvciBrIGluIHhyYW5nZShOKzEpOgorICAgICAgICAgICAgc2FtcCA9IHNlbGYuZ2VuLnNhbXBsZShkLCBrKQorICAgICAgICAgICAgIyBWZXJpZnkgdGhhdCB3ZSBnb3QgaW50cyBiYWNrIChrZXlzKTsgdGhlIHZhbHVlcyBhcmUgY29tcGxleC4KKyAgICAgICAgICAgIGZvciB4IGluIHNhbXA6CisgICAgICAgICAgICAgICAgc2VsZi5hc3NlcnRfKHR5cGUoeCkgaXMgaW50KQorICAgICAgICBzYW1wLnNvcnQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNhbXAsIHJhbmdlKE4pKQorCiAgICAgZGVmIHRlc3RfZ2F1c3Moc2VsZik6CiAgICAgICAgICMgRW5zdXJlIHRoYXQgdGhlIHNlZWQoKSBtZXRob2QgaW5pdGlhbGl6ZXMgYWxsIHRoZSBoaWRkZW4gc3RhdGUuICBJbgogICAgICAgICAjIHBhcnRpY3VsYXIsIHRocm91Z2ggMi4yLjEgaXQgZmFpbGVkIHRvIHJlc2V0IGEgcGllY2Ugb2Ygc3RhdGUgdXNlZApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9yZWdleC5weSBiL0xpYi90ZXN0L3Rlc3RfcmVnZXgucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlMmM4ZjYuLjAwMDAwMDAKLS0tIGEvTGliL3Rlc3QvdGVzdF9yZWdleC5weQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi1mcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJib3NlLCBzb3J0ZGljdAotaW1wb3J0IHdhcm5pbmdzCi13YXJuaW5ncy5maWx0ZXJ3YXJuaW5ncygiaWdub3JlIiwgInRoZSByZWdleCBtb2R1bGUgaXMgZGVwcmVjYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXByZWNhdGlvbldhcm5pbmcsIF9fbmFtZV9fKQotaW1wb3J0IHJlZ2V4Ci1mcm9tIHJlZ2V4X3N5bnRheCBpbXBvcnQgKgotCi1yZSA9ICdhK2IrYysnCi1wcmludCAnbm8gbWF0Y2g6JywgcmVnZXgubWF0Y2gocmUsICdoZWxsbyBhYWFhYmNjY2Mgd29ybGQnKQotcHJpbnQgJ3N1Y2Nlc3NmdWwgc2VhcmNoOicsIHJlZ2V4LnNlYXJjaChyZSwgJ2hlbGxvIGFhYWFiY2NjYyB3b3JsZCcpCi10cnk6Ci0gICAgY3JlID0gcmVnZXguY29tcGlsZSgnXCgnICsgcmUpCi1leGNlcHQgcmVnZXguZXJyb3I6Ci0gICAgcHJpbnQgJ2NhdWdodCBleHBlY3RlZCBleGNlcHRpb24nCi1lbHNlOgotICAgIHByaW50ICdleHBlY3RlZCByZWdleC5lcnJvciBub3QgcmFpc2VkJwotCi1wcmludCAnZmFpbGVkIGF3ayBzeW50YXg6JywgcmVnZXguc2VhcmNoKCcoYSspfChiKyknLCAnY2RiJykKLXByZXYgPSByZWdleC5zZXRfc3ludGF4KFJFX1NZTlRBWF9BV0spCi1wcmludCAnc3VjY2Vzc2Z1bCBhd2sgc3ludGF4OicsIHJlZ2V4LnNlYXJjaCgnKGErKXwoYispJywgJ2NkYicpCi1yZWdleC5zZXRfc3ludGF4KHByZXYpCi1wcmludCAnZmFpbGVkIGF3ayBzeW50YXg6JywgcmVnZXguc2VhcmNoKCcoYSspfChiKyknLCAnY2RiJykKLQotcmUgPSAnXCg8b25lPlswLTldK1wpICpcKDx0d28+WzAtOV0rXCknCi1wcmludCAnbWF0Y2hpbmcgd2l0aCBncm91cCBuYW1lcyBhbmQgY29tcGlsZSgpJwotY3JlID0gcmVnZXguY29tcGlsZShyZSkKLXByaW50IGNyZS5tYXRjaCgnODAxIDk5OScpCi10cnk6Ci0gICAgcHJpbnQgY3JlLmdyb3VwKCdvbmUnKQotZXhjZXB0IHJlZ2V4LmVycm9yOgotICAgIHByaW50ICdjYXVnaHQgZXhwZWN0ZWQgZXhjZXB0aW9uJwotZWxzZToKLSAgICBwcmludCAnZXhwZWN0ZWQgcmVnZXguZXJyb3Igbm90IHJhaXNlZCcKLQotcHJpbnQgJ21hdGNoaW5nIHdpdGggZ3JvdXAgbmFtZXMgYW5kIHN5bWNvbXAoKScKLWNyZSA9IHJlZ2V4LnN5bWNvbXAocmUpCi1wcmludCBjcmUubWF0Y2goJzgwMSA5OTknKQotcHJpbnQgY3JlLmdyb3VwKDApCi1wcmludCBjcmUuZ3JvdXAoJ29uZScpCi1wcmludCBjcmUuZ3JvdXAoMSwgMikKLXByaW50IGNyZS5ncm91cCgnb25lJywgJ3R3bycpCi1wcmludCAncmVhbHBhdDonLCBjcmUucmVhbHBhdAotcHJpbnQgJ2dyb3VwaW5kZXg6Jywgc29ydGRpY3QoY3JlLmdyb3VwaW5kZXgpCi0KLXJlID0gJ3dvcmxkJwotY3JlID0gcmVnZXguY29tcGlsZShyZSkKLXByaW50ICdub3QgY2FzZSBmb2xkZWQgc2VhcmNoOicsIGNyZS5zZWFyY2goJ0hFTExPIFdPUkxEJykKLWNyZSA9IHJlZ2V4LmNvbXBpbGUocmUsIHJlZ2V4LmNhc2Vmb2xkKQotcHJpbnQgJ2Nhc2UgZm9sZGVkIHNlYXJjaDonLCBjcmUuc2VhcmNoKCdIRUxMTyBXT1JMRCcpCi0KLXByaW50ICdfX21lbWJlcnNfXzonLCBjcmUuX19tZW1iZXJzX18KLXByaW50ICdyZWdzOicsIGNyZS5yZWdzCi1wcmludCAnbGFzdDonLCBjcmUubGFzdAotcHJpbnQgJ3RyYW5zbGF0ZTonLCBsZW4oY3JlLnRyYW5zbGF0ZSkKLXByaW50ICdnaXZlbnBhdDonLCBjcmUuZ2l2ZW5wYXQKLQotcHJpbnQgJ21hdGNoIHdpdGggcG9zOicsIGNyZS5tYXRjaCgnaGVsbG8gd29ybGQnLCA3KQotcHJpbnQgJ3NlYXJjaCB3aXRoIHBvczonLCBjcmUuc2VhcmNoKCdoZWxsbyB3b3JsZCB0aGVyZSB3b3JsZCcsIDcpCi1wcmludCAnYm9ndXMgZ3JvdXA6JywgY3JlLmdyb3VwKDAsIDEsIDMpCi10cnk6Ci0gICAgcHJpbnQgJ25vIG5hbWU6JywgY3JlLmdyb3VwKCdvbmUnKQotZXhjZXB0IHJlZ2V4LmVycm9yOgotICAgIHByaW50ICdjYXVnaHQgZXhwZWN0ZWQgZXhjZXB0aW9uJwotZWxzZToKLSAgICBwcmludCAnZXhwZWN0ZWQgcmVnZXguZXJyb3Igbm90IHJhaXNlZCcKLQotZnJvbSByZWdleF90ZXN0cyBpbXBvcnQgKgotaWYgdmVyYm9zZTogcHJpbnQgJ1J1bm5pbmcgcmVnZXhfdGVzdHMgdGVzdCBzdWl0ZScKLQotZm9yIHQgaW4gdGVzdHM6Ci0gICAgcGF0dGVybj1zPW91dGNvbWU9cmVwbD1leHBlY3RlZD1Ob25lCi0gICAgaWYgbGVuKHQpPT01OgotICAgICAgICBwYXR0ZXJuLCBzLCBvdXRjb21lLCByZXBsLCBleHBlY3RlZCA9IHQKLSAgICBlbGlmIGxlbih0KT09MzoKLSAgICAgICAgcGF0dGVybiwgcywgb3V0Y29tZSA9IHQKLSAgICBlbHNlOgotICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAoJ1Rlc3QgdHVwbGVzIHNob3VsZCBoYXZlIDMgb3IgNSBmaWVsZHMnLHQpCi0KLSAgICB0cnk6Ci0gICAgICAgIG9iaj1yZWdleC5jb21waWxlKHBhdHRlcm4pCi0gICAgZXhjZXB0IHJlZ2V4LmVycm9yOgotICAgICAgICBpZiBvdXRjb21lPT1TWU5UQVhfRVJST1I6IHBhc3MgICAgIyBFeHBlY3RlZCBhIHN5bnRheCBlcnJvcgotICAgICAgICBlbHNlOgotICAgICAgICAgICAgIyBSZWdleCBzeW50YXggZXJyb3JzIGFyZW4ndCB5ZXQgcmVwb3J0ZWQsIHNvIGZvcgotICAgICAgICAgICAgIyB0aGUgb2ZmaWNpYWwgdGVzdCBzdWl0ZSB0aGV5J2xsIGJlIHF1aWV0bHkgaWdub3JlZC4KLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgICAgICNwcmludCAnPT09IFN5bnRheCBlcnJvcjonLCB0Ci0gICAgZWxzZToKLSAgICAgICAgdHJ5OgotICAgICAgICAgICAgcmVzdWx0PW9iai5zZWFyY2gocykKLSAgICAgICAgZXhjZXB0IHJlZ2V4LmVycm9yLCBtc2c6Ci0gICAgICAgICAgICBwcmludCAnPT09IFVuZXhwZWN0ZWQgZXhjZXB0aW9uJywgdCwgcmVwcihtc2cpCi0gICAgICAgIGlmIG91dGNvbWU9PVNZTlRBWF9FUlJPUjoKLSAgICAgICAgICAgICMgVGhpcyBzaG91bGQgaGF2ZSBiZWVuIGEgc3ludGF4IGVycm9yOyBmb3JnZXQgaXQuCi0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsaWYgb3V0Y29tZT09RkFJTDoKLSAgICAgICAgICAgIGlmIHJlc3VsdD09LTE6IHBhc3MgICAjIE5vIG1hdGNoLCBhcyBleHBlY3RlZAotICAgICAgICAgICAgZWxzZTogcHJpbnQgJz09PSBTdWNjZWVkZWQgaW5jb3JyZWN0bHknLCB0Ci0gICAgICAgIGVsaWYgb3V0Y29tZT09U1VDQ0VFRDoKLSAgICAgICAgICAgIGlmIHJlc3VsdCE9LTE6Ci0gICAgICAgICAgICAgICAgIyBNYXRjaGVkLCBhcyBleHBlY3RlZCwgc28gbm93IHdlIGNvbXB1dGUgdGhlCi0gICAgICAgICAgICAgICAgIyByZXN1bHQgc3RyaW5nIGFuZCBjb21wYXJlIGl0IHRvIG91ciBleHBlY3RlZCByZXN1bHQuCi0gICAgICAgICAgICAgICAgc3RhcnQsIGVuZCA9IG9iai5yZWdzWzBdCi0gICAgICAgICAgICAgICAgZm91bmQ9c1tzdGFydDplbmRdCi0gICAgICAgICAgICAgICAgZ3JvdXBzPW9iai5ncm91cCgxLDIsMyw0LDUsNiw3LDgsOSwxMCkKLSAgICAgICAgICAgICAgICB2YXJkaWN0PXZhcnMoKQotICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihncm91cHMpKToKLSAgICAgICAgICAgICAgICAgICAgdmFyZGljdFsnZycrc3RyKGkrMSldPXN0cihncm91cHNbaV0pCi0gICAgICAgICAgICAgICAgcmVwbD1ldmFsKHJlcGwpCi0gICAgICAgICAgICAgICAgaWYgcmVwbCE9ZXhwZWN0ZWQ6Ci0gICAgICAgICAgICAgICAgICAgIHByaW50ICc9PT0gZ3JvdXBpbmcgZXJyb3InLCB0LCByZXByKHJlcGwpKycgc2hvdWxkIGJlICcrcmVwcihleHBlY3RlZCkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgcHJpbnQgJz09PSBGYWlsZWQgaW5jb3JyZWN0bHknLCB0CmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NldC5weSBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CmluZGV4IDZmZjEyMTUuLjAyNjhiZTIgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CisrKyBiL0xpYi90ZXN0L3Rlc3Rfc2V0LnB5CkBAIC0yMjQsNyArMjI0LDcgQEAKICAgICAgICAgIyBCdWcgIzEyNTc3MzEKICAgICAgICAgY2xhc3MgSChzZWxmLnRoZXR5cGUpOgogICAgICAgICAgICAgZGVmIF9faGFzaF9fKHNlbGYpOgotICAgICAgICAgICAgICAgIHJldHVybiBpZChzZWxmKQorICAgICAgICAgICAgICAgIHJldHVybiBpbnQoaWQoc2VsZikgJiAweDdmZmZmZmZmKQogICAgICAgICBzPUgoKQogICAgICAgICBmPXNldCgpCiAgICAgICAgIGYuYWRkKHMpCkBAIC00MjEsNyArNDIxLDcgQEAKICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoUmVmZXJlbmNlRXJyb3IsIHN0ciwgcCkKIAogICAgICMgQyBBUEkgdGVzdCBvbmx5IGF2YWlsYWJsZSBpbiBhIGRlYnVnIGJ1aWxkCi0gICAgaWYgaGFzYXR0cihzeXMsICJnZXR0b3RhbHJlZmNvdW50Iik6CisgICAgaWYgaGFzYXR0cihzZXQsICJ0ZXN0X2NfYXBpIik6CiAgICAgICAgIGRlZiB0ZXN0X2NfYXBpKHNlbGYpOgogICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzZXQoJ2FiYycpLnRlc3RfY19hcGkoKSwgVHJ1ZSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZXR1cHRvb2xzLnB5IGIvTGliL3Rlc3QvdGVzdF9zZXR1cHRvb2xzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ODgzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X3NldHVwdG9vbHMucHkKQEAgLTAsMCArMSwxNiBAQAorIiIiVGVzdHMgZm9yIHNldHVwdG9vbHMuCisKK1RoZSB0ZXN0cyBmb3Igc2V0dXB0b29scyBhcmUgZGVmaW5lZCBpbiB0aGUgc2V0dXB0b29scy50ZXN0cyBwYWNrYWdlOwordGhpcyBydW5zIHRoZW0gZnJvbSB0aGVyZS4KKyIiIgorCitpbXBvcnQgdGVzdC50ZXN0X3N1cHBvcnQKK2Zyb20gc2V0dXB0b29scy5jb21tYW5kLnRlc3QgaW1wb3J0IFNjYW5uaW5nTG9hZGVyCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICB0ZXN0LnRlc3Rfc3VwcG9ydC5ydW5fc3VpdGUoCisgICAgICAgIFNjYW5uaW5nTG9hZGVyKCkubG9hZFRlc3RzRnJvbU5hbWUoJ3NldHVwdG9vbHMudGVzdHMnKQorICAgICkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICB0ZXN0X21haW4oKQpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zZ21sbGliLnB5IGIvTGliL3Rlc3QvdGVzdF9zZ21sbGliLnB5CmluZGV4IGJjMjViZDAuLjhlOGIwMmYgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc2dtbGxpYi5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NnbWxsaWIucHkKQEAgLTIxNCw2ICsyMTQsMjAgQEAKICAgICAgICAgICAgICgic3RhcnR0YWciLCAiZSIsIFsoImEiLCAicmdiKDEsMiwzKSIpXSksCiAgICAgICAgICAgICBdKQogCisgICAgZGVmIHRlc3RfYXR0cl92YWx1ZXNfZW50aXRpZXMoc2VsZik6CisgICAgICAgICIiIlN1YnN0aXR1dGlvbiBvZiBlbnRpdGllcyBhbmQgY2hhcnJlZnMgaW4gYXR0cmlidXRlIHZhbHVlcyIiIgorICAgICAgICAjIFNGIGJ1ZyAjMTQ1MjI0NgorICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiIiI8YSBiPSZsdDsgYz0mbHQ7Jmd0OyBkPSZsdC0mZ3Q7IGU9JyZsdDsgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmPSImeHh4OyIgZz0nJiMzMjsmIzMzOycgaD0nJiM1MDA7JyBpPSd4P2E9YiZjPWQ7Jz4iIiIsCisgICAgICAgICAgICBbKCJzdGFydHRhZyIsICJhIiwgWygiYiIsICI8IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYyIsICI8PiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImQiLCAiJmx0LT4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJlIiwgIjwgIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiZiIsICImeHh4OyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImciLCAiICEiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJoIiwgIiYjNTAwOyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImkiLCAieD9hPWImYz1kOyIpLCBdKV0pCisKICAgICBkZWYgdGVzdF9hdHRyX2Z1bmt5X25hbWVzKHNlbGYpOgogICAgICAgICBzZWxmLmNoZWNrX2V2ZW50cygiIiI8YSBhLmI9J3YnIGM6ZD12IGUtZj12PiIiIiwgWwogICAgICAgICAgICAgKCJzdGFydHRhZyIsICJhIiwgWygiYS5iIiwgInYiKSwgKCJjOmQiLCAidiIpLCAoImUtZiIsICJ2IildKSwKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0LnB5IGIvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkKaW5kZXggMTg5OWU3OC4uNjk0MzA4MCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zb2NrZXQucHkKQEAgLTI2OCw5ICsyNjgsOSBAQAogICAgICAgICAgICAgIyBQcm9iYWJseSBhIHNpbWlsYXIgcHJvYmxlbSBhcyBhYm92ZTsgc2tpcCB0aGlzIHRlc3QKICAgICAgICAgICAgIHJldHVybgogICAgICAgICBhbGxfaG9zdF9uYW1lcyA9IFtob3N0bmFtZSwgaG5hbWVdICsgYWxpYXNlcwotICAgICAgICBmcWhuID0gc29ja2V0LmdldGZxZG4oKQorICAgICAgICBmcWhuID0gc29ja2V0LmdldGZxZG4oaXApCiAgICAgICAgIGlmIG5vdCBmcWhuIGluIGFsbF9ob3N0X25hbWVzOgotICAgICAgICAgICAgc2VsZi5mYWlsKCJFcnJvciB0ZXN0aW5nIGhvc3QgcmVzb2x1dGlvbiBtZWNoYW5pc21zLiIpCisgICAgICAgICAgICBzZWxmLmZhaWwoIkVycm9yIHRlc3RpbmcgaG9zdCByZXNvbHV0aW9uIG1lY2hhbmlzbXMuIChmcWRuOiAlcywgYWxsOiAlcykiICUgKGZxaG4sIHJlcHIoYWxsX2hvc3RfbmFtZXMpKSkKIAogICAgIGRlZiB0ZXN0UmVmQ291bnRHZXROYW1lSW5mbyhzZWxmKToKICAgICAgICAgIyBUZXN0aW5nIHJlZmVyZW5jZSBjb3VudCBmb3IgZ2V0bmFtZWluZm8KQEAgLTQ2OSw2ICs0NjksMTQgQEAKICAgICAgICAgc29jay5jbG9zZSgpCiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHNvY2tldC5lcnJvciwgc29jay5zZW5kLCAic3BhbSIpCiAKKyAgICBkZWYgdGVzdE5ld0F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgICMgdGVzdGluZyAuZmFtaWx5LCAudHlwZSBhbmQgLnByb3RvY29sCisgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc29jay5mYW1pbHksIHNvY2tldC5BRl9JTkVUKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvY2sudHlwZSwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNvY2sucHJvdG8sIDApCisgICAgICAgIHNvY2suY2xvc2UoKQorCiBjbGFzcyBCYXNpY1RDUFRlc3QoU29ja2V0Q29ubmVjdGVkVGVzdCk6CiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kTmFtZT0ncnVuVGVzdCcpOgpAQCAtODE3LDYgKzgyNSwzMiBAQAogICAgICAgICBzZWxmLmFzc2VydF8oaXNzdWJjbGFzcyhzb2NrZXQuZ2FpZXJyb3IsIHNvY2tldC5lcnJvcikpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhpc3N1YmNsYXNzKHNvY2tldC50aW1lb3V0LCBzb2NrZXQuZXJyb3IpKQogCitjbGFzcyBUZXN0TGludXhBYnN0cmFjdE5hbWVzcGFjZSh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgICBVTklYX1BBVEhfTUFYID0gMTA4CisKKyAgICBkZWYgdGVzdExpbnV4QWJzdHJhY3ROYW1lc3BhY2Uoc2VsZik6CisgICAgICAgIGFkZHJlc3MgPSAiXHgwMHB5dGhvbi10ZXN0LWhlbGxvXHgwMFx4ZmYiCisgICAgICAgIHMxID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfVU5JWCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzMS5iaW5kKGFkZHJlc3MpCisgICAgICAgIHMxLmxpc3RlbigxKQorICAgICAgICBzMiA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX1VOSVgsIHNvY2tldC5TT0NLX1NUUkVBTSkKKyAgICAgICAgczIuY29ubmVjdChzMS5nZXRzb2NrbmFtZSgpKQorICAgICAgICBzMS5hY2NlcHQoKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHMxLmdldHNvY2tuYW1lKCksIGFkZHJlc3MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoczIuZ2V0cGVlcm5hbWUoKSwgYWRkcmVzcykKKworICAgIGRlZiB0ZXN0TWF4TmFtZShzZWxmKToKKyAgICAgICAgYWRkcmVzcyA9ICJceDAwIiArICJoIiAqIChzZWxmLlVOSVhfUEFUSF9NQVggLSAxKQorICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfVU5JWCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzLmJpbmQoYWRkcmVzcykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzLmdldHNvY2tuYW1lKCksIGFkZHJlc3MpCisKKyAgICBkZWYgdGVzdE5hbWVPdmVyZmxvdyhzZWxmKToKKyAgICAgICAgYWRkcmVzcyA9ICJceDAwIiArICJoIiAqIHNlbGYuVU5JWF9QQVRIX01BWAorICAgICAgICBzID0gc29ja2V0LnNvY2tldChzb2NrZXQuQUZfVU5JWCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhzb2NrZXQuZXJyb3IsIHMuYmluZCwgYWRkcmVzcykKKwogCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdHMgPSBbR2VuZXJhbE1vZHVsZVRlc3RzLCBCYXNpY1RDUFRlc3QsIFRDUFRpbWVvdXRUZXN0LCBUZXN0RXhjZXB0aW9uc10KQEAgLTgzMiw2ICs4NjYsOCBAQAogICAgIF0pCiAgICAgaWYgaGFzYXR0cihzb2NrZXQsICJzb2NrZXRwYWlyIik6CiAgICAgICAgIHRlc3RzLmFwcGVuZChCYXNpY1NvY2tldFBhaXJUZXN0KQorICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnbGludXgyJzoKKyAgICAgICAgdGVzdHMuYXBwZW5kKFRlc3RMaW51eEFic3RyYWN0TmFtZXNwYWNlKQogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoKnRlc3RzKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zb2NrZXRfc3NsLnB5IGIvTGliL3Rlc3QvdGVzdF9zb2NrZXRfc3NsLnB5CmluZGV4IDk4NjgwYjkuLjEwOTEzODMgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfc29ja2V0X3NzbC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3NvY2tldF9zc2wucHkKQEAgLTEsNSArMSw2IEBACiAjIFRlc3QganVzdCB0aGUgU1NMIHN1cHBvcnQgaW4gdGhlIHNvY2tldCBtb2R1bGUsIGluIGEgbW9kZXJhdGVseSBib2d1cyB3YXkuCiAKK2ltcG9ydCBzeXMKIGZyb20gdGVzdCBpbXBvcnQgdGVzdF9zdXBwb3J0CiBpbXBvcnQgc29ja2V0CiAKQEAgLTEzLDYgKzE0LDkgQEAKIAogICAgIGltcG9ydCB1cmxsaWIKIAorICAgIGlmIHRlc3Rfc3VwcG9ydC52ZXJib3NlOgorICAgICAgICBwcmludCAidGVzdF9iYXNpYyAuLi4iCisKICAgICBzb2NrZXQuUkFORF9zdGF0dXMoKQogICAgIHRyeToKICAgICAgICAgc29ja2V0LlJBTkRfZWdkKDEpCkBAIC0yNiw3ICszMCw0MSBAQAogICAgIGJ1ZiA9IGYucmVhZCgpCiAgICAgZi5jbG9zZSgpCiAKK2RlZiB0ZXN0X3RpbWVvdXQoKToKKyAgICB0ZXN0X3N1cHBvcnQucmVxdWlyZXMoJ25ldHdvcmsnKQorCisgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgIHByaW50ICJ0ZXN0X3RpbWVvdXQgLi4uIgorCisgICAgIyBBIHNlcnZpY2Ugd2hpY2ggaXNzdWVzIGEgd2VsY29tZSBiYW5uZXIgKHdpdGhvdXQgbmVlZCB0byB3cml0ZQorICAgICMgYW55dGhpbmcpLgorICAgICMgWFhYICgiZ21haWwub3JnIiwgOTk1KSBoYXMgYmVlbiB1bnJlbGlhYmxlIHNvIGZhciwgZnJvbSB0aW1lIHRvIHRpbWUKKyAgICAjIFhYWCBub24tcmVzcG9uc2l2ZSBmb3IgaG91cnMgb24gZW5kICgmIGFjcm9zcyBhbGwgYnVpbGRib3Qgc2xhdmVzLAorICAgICMgWFhYIHNvIHRoYXQncyBub3QganVzdCBhIGxvY2FsIHRoaW5nKS4KKyAgICBBRERSID0gImdtYWlsLm9yZyIsIDk5NQorCisgICAgcyA9IHNvY2tldC5zb2NrZXQoKQorICAgIHMuc2V0dGltZW91dCgzMC4wKQorICAgIHRyeToKKyAgICAgICAgcy5jb25uZWN0KEFERFIpCisgICAgZXhjZXB0IHNvY2tldC50aW1lb3V0OgorICAgICAgICBwcmludCA+PiBzeXMuc3RkZXJyLCAiIiJcCisgICAgV0FSTklORzogIGFuIGF0dGVtcHQgdG8gY29ubmVjdCB0byAlciB0aW1lZCBvdXQsIGluCisgICAgdGVzdF90aW1lb3V0LiAgVGhhdCBtYXkgYmUgbGVnaXRpbWF0ZSwgYnV0IGlzIG5vdCB0aGUgb3V0Y29tZSB3ZSBob3BlZAorICAgIGZvci4gIElmIHRoaXMgbWVzc2FnZSBpcyBzZWVuIG9mdGVuLCB0ZXN0X3RpbWVvdXQgc2hvdWxkIGJlIGNoYW5nZWQgdG8KKyAgICB1c2UgYSBtb3JlIHJlbGlhYmxlIGFkZHJlc3MuIiIiICUgKEFERFIsKQorICAgICAgICByZXR1cm4KKworICAgIHNzID0gc29ja2V0LnNzbChzKQorICAgICMgUmVhZCBwYXJ0IG9mIHJldHVybiB3ZWxjb21lIGJhbm5lciB0d2ljZS4KKyAgICBzcy5yZWFkKDEpCisgICAgc3MucmVhZCgxKQorICAgIHMuY2xvc2UoKQorCiBkZWYgdGVzdF9ydWRlX3NodXRkb3duKCk6CisgICAgaWYgdGVzdF9zdXBwb3J0LnZlcmJvc2U6CisgICAgICAgIHByaW50ICJ0ZXN0X3J1ZGVfc2h1dGRvd24gLi4uIgorCiAgICAgdHJ5OgogICAgICAgICBpbXBvcnQgdGhyZWFkaW5nCiAgICAgZXhjZXB0IEltcG9ydEVycm9yOgpAQCAtNzQsNiArMTEyLDcgQEAKICAgICAgICAgcmFpc2UgdGVzdF9zdXBwb3J0LlRlc3RTa2lwcGVkKCJzb2NrZXQgbW9kdWxlIGhhcyBubyBzc2wgc3VwcG9ydCIpCiAgICAgdGVzdF9ydWRlX3NodXRkb3duKCkKICAgICB0ZXN0X2Jhc2ljKCkKKyAgICB0ZXN0X3RpbWVvdXQoKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3NxbGl0ZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc3FsaXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMWQwZTUKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X3NxbGl0ZS5weQpAQCAtMCwwICsxLDE2IEBACitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCBydW5fdW5pdHRlc3QsIFRlc3RTa2lwcGVkCitpbXBvcnQgdW5pdHRlc3QKKwordHJ5OgorICAgIGltcG9ydCBfc3FsaXRlMworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIHJhaXNlIFRlc3RTa2lwcGVkKCdubyBzcWxpdGUgYXZhaWxhYmxlJykKK2Zyb20gc3FsaXRlMy50ZXN0IGltcG9ydCAoZGJhcGksIHR5cGVzLCB1c2VyZnVuY3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5LCB0cmFuc2FjdGlvbnMpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoZGJhcGkuc3VpdGUoKSwgdHlwZXMuc3VpdGUoKSwgdXNlcmZ1bmN0aW9ucy5zdWl0ZSgpLAorICAgICAgICAgICAgICAgICBmYWN0b3J5LnN1aXRlKCksIHRyYW5zYWN0aW9ucy5zdWl0ZSgpKQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3N0YXJ0ZmlsZS5weSBiL0xpYi90ZXN0L3Rlc3Rfc3RhcnRmaWxlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZDEyZDcKLS0tIC9kZXYvbnVsbAorKysgYi9MaWIvdGVzdC90ZXN0X3N0YXJ0ZmlsZS5weQpAQCAtMCwwICsxLDM3IEBACisjIFJpZGljdWxvdXNseSBzaW1wbGUgdGVzdCBvZiB0aGUgb3Muc3RhcnRmaWxlIGZ1bmN0aW9uIGZvciBXaW5kb3dzLgorIworIyBlbXB0eS52YnMgaXMgYW4gZW1wdHkgZmlsZSAoZXhjZXB0IGZvciBhIGNvbW1lbnQpLCB3aGljaCBkb2VzCisjIG5vdGhpbmcgd2hlbiBydW4gd2l0aCBjc2NyaXB0IG9yIHdzY3JpcHQuCisjCisjIEEgcG9zc2libGUgaW1wcm92ZW1lbnQgd291bGQgYmUgdG8gaGF2ZSBlbXB0eS52YnMgZG8gc29tZXRoaW5nIHRoYXQKKyMgd2UgY2FuIGRldGVjdCBoZXJlLCB0byBtYWtlIHN1cmUgdGhhdCBub3Qgb25seSB0aGUgb3Muc3RhcnRmaWxlKCkKKyMgY2FsbCBzdWNjZWVkZWQsIGJ1dCBhbHNvIHRoZSB0aGUgc2NyaXB0IGFjdHVhbGx5IGhhcyBydW4uCisKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3N1cHBvcnQKKworIyB1c2UgdGhpcyBmb3JtIHNvIHRoYXQgdGhlIHRlc3QgaXMgc2tpcHBlZCB3aGVuIHN0YXJ0ZmlsZSBpcyBub3QgYXZhaWxhYmxlOgorZnJvbSBvcyBpbXBvcnQgc3RhcnRmaWxlLCBwYXRoCisKK2NsYXNzIFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdGVzdF9ub25leGlzdGluZyhzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvciwgc3RhcnRmaWxlLCAibm9uZXhpc3RpbmcudmJzIikKKworICAgIGRlZiB0ZXN0X25vbmV4aXN0aW5nX3Uoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE9TRXJyb3IsIHN0YXJ0ZmlsZSwgdSJub25leGlzdGluZy52YnMiKQorCisgICAgZGVmIHRlc3RfZW1wdHkoc2VsZik6CisgICAgICAgIGVtcHR5ID0gcGF0aC5qb2luKHBhdGguZGlybmFtZShfX2ZpbGVfXyksICJlbXB0eS52YnMiKQorICAgICAgICBzdGFydGZpbGUoZW1wdHkpCisgICAgICAgIHN0YXJ0ZmlsZShlbXB0eSwgIm9wZW4iKQorCisgICAgZGVmIHRlc3RfZW1wdHlfdShzZWxmKToKKyAgICAgICAgZW1wdHkgPSBwYXRoLmpvaW4ocGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwgImVtcHR5LnZicyIpCisgICAgICAgIHN0YXJ0ZmlsZSh1bmljb2RlKGVtcHR5LCAibWJjcyIpKQorICAgICAgICBzdGFydGZpbGUodW5pY29kZShlbXB0eSwgIm1iY3MiKSwgIm9wZW4iKQorCitkZWYgdGVzdF9tYWluKCk6CisgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0Q2FzZSkKKworaWYgX19uYW1lX189PSJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc3VuZHJ5LnB5IGIvTGliL3Rlc3QvdGVzdF9zdW5kcnkucHkKaW5kZXggZmQxMGI2OC4uYWYxMzY4NCAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zdW5kcnkucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zdW5kcnkucHkKQEAgLTEyLDc1ICsxMiw1MCBAQAogZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyYm9zZQogCiBpbXBvcnQgQmFzZUhUVFBTZXJ2ZXIKK2ltcG9ydCBEb2NYTUxSUENTZXJ2ZXIKIGltcG9ydCBDR0lIVFRQU2VydmVyCi1pbXBvcnQgUXVldWUKIGltcG9ydCBTaW1wbGVIVFRQU2VydmVyCi1pbXBvcnQgU29ja2V0U2VydmVyCitpbXBvcnQgU2ltcGxlWE1MUlBDU2VydmVyCiBpbXBvcnQgYWlmYwotaW1wb3J0IGFueWRibQogaW1wb3J0IGF1ZGlvZGV2CiBpbXBvcnQgYmRiCitpbXBvcnQgY2dpdGIKIGltcG9ydCBjbWQKIGltcG9ydCBjb2RlCi1pbXBvcnQgY29kZW9wCi1pbXBvcnQgY29sb3JzeXMKLWltcG9ydCBjb21tYW5kcwogaW1wb3J0IGNvbXBpbGVhbGwKLXRyeToKLSAgICBpbXBvcnQgY3Vyc2VzICAgIyBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBpZiB2ZXJib3NlOgotICAgICAgICBwcmludCAic2tpcHBpbmcgY3Vyc2VzIgotaW1wb3J0IGRpcmNhY2hlCi1pbXBvcnQgZGlzCi1pbXBvcnQgZGlzdHV0aWxzCi1pbXBvcnQgZG9jdGVzdAotaW1wb3J0IGR1bWJkYm0KIGltcG9ydCBlbmNvZGluZ3MKLWltcG9ydCBmbm1hdGNoCiBpbXBvcnQgZm9ybWF0dGVyCi1pbXBvcnQgZnBmb3JtYXQKIGltcG9ydCBmdHBsaWIKIGltcG9ydCBnZXRwYXNzCi1pbXBvcnQgZ2xvYgogaW1wb3J0IGdvcGhlcmxpYgogaW1wb3J0IGh0bWxlbnRpdHlkZWZzCi1pbXBvcnQgaHRtbGxpYgotaW1wb3J0IGh0dHBsaWIKLWltcG9ydCBpbWFwbGliCitpbXBvcnQgaWhvb2tzCiBpbXBvcnQgaW1naGRyCiBpbXBvcnQgaW1wdXRpbAogaW1wb3J0IGtleXdvcmQKLWltcG9ydCBtYWNwYXRoCitpbXBvcnQgbGluZWNhY2hlCiBpbXBvcnQgbWFjdXJsMnBhdGgKIGltcG9ydCBtYWlsY2FwCi1pbXBvcnQgbWhsaWIKLWltcG9ydCBtaW1ldHlwZXMKIGltcG9ydCBtaW1pZnkKLWltcG9ydCBtdWx0aWZpbGUKIGltcG9ydCBtdXRleAogaW1wb3J0IG5udHBsaWIKIGltcG9ydCBudHVybDJwYXRoCitpbXBvcnQgb3Bjb2RlCitpbXBvcnQgb3MyZW14cGF0aAogaW1wb3J0IHBkYgogaW1wb3J0IHBpcGVzCiAjaW1wb3J0IHBvcGxpYgogaW1wb3J0IHBvc2l4ZmlsZQotaW1wb3J0IHByb2ZpbGUKIGltcG9ydCBwc3RhdHMKIGltcG9ydCBweV9jb21waWxlCi0jaW1wb3J0IHJlY29udmVydAotaW1wb3J0IHJlcHIKK2ltcG9ydCBweWRvYworaW1wb3J0IHJleGVjCiB0cnk6CiAgICAgaW1wb3J0IHJsY29tcGxldGVyICAgIyBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MKIGV4Y2VwdCBJbXBvcnRFcnJvcjoKICAgICBpZiB2ZXJib3NlOgogICAgICAgICBwcmludCAic2tpcHBpbmcgcmxjb21wbGV0ZXIiCi1pbXBvcnQgcm9ib3RwYXJzZXIKIGltcG9ydCBzY2hlZAotaW1wb3J0IHNnbWxsaWIKLWltcG9ydCBzaGVsdmUKLWltcG9ydCBzaGxleAotaW1wb3J0IHNodXRpbAogaW1wb3J0IHNtdHBsaWIKIGltcG9ydCBzbmRoZHIKIGltcG9ydCBzdGF0dmZzCkBAIC05MCwxMiArNjUsMTcgQEAKIGltcG9ydCBzeW1ib2wKIGltcG9ydCB0YWJuYW5ueQogaW1wb3J0IHRlbG5ldGxpYgotaW1wb3J0IHRlc3QKK2ltcG9ydCB0aW1laXQKIGltcG9ydCB0b2FpZmYKLWltcG9ydCB1cmxsaWIyCitpbXBvcnQgdG9rZW4KK3RyeToKKyAgICBpbXBvcnQgdHR5ICAgICAjIG5vdCBhdmFpbGFibGUgb24gV2luZG93cworZXhjZXB0IEltcG9ydEVycm9yOgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICJza2lwcGluZyB0dHkiCisKICMgQ2FuJ3QgdGVzdCB0aGUgInVzZXIiIG1vZHVsZSAtLSBpZiB0aGUgdXNlciBoYXMgYSB+Ly5weXRob25yYy5weSwgaXQKICMgY2FuIHNjcmV3IHVwIGFsbCBzb3J0cyBvZiB0aGluZ3MgKGVzcC4gaWYgaXQgcHJpbnRzISkuCiAjaW1wb3J0IHVzZXIKIGltcG9ydCB3ZWJicm93c2VyCi1pbXBvcnQgd2hpY2hkYgogaW1wb3J0IHhtbApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9zeXMucHkgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQppbmRleCBiOThjNjQ4Li5hZTJhMWM4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3N5cy5weQorKysgYi9MaWIvdGVzdC90ZXN0X3N5cy5weQpAQCAtMjYxLDYgKzI2MSwxMSBAQAogICAgICAgICBzZWxmLmFzc2VydF8odmlbM10gaW4gKCJhbHBoYSIsICJiZXRhIiwgImNhbmRpZGF0ZSIsICJmaW5hbCIpKQogICAgICAgICBzZWxmLmFzc2VydF8oaXNpbnN0YW5jZSh2aVs0XSwgaW50KSkKIAorICAgIGRlZiB0ZXN0XzQzNTgxKHNlbGYpOgorICAgICAgICAjIENhbid0IHVzZSBzeXMuc3Rkb3V0LCBhcyB0aGlzIGlzIGEgY1N0cmluZ0lPIG9iamVjdCB3aGVuCisgICAgICAgICMgdGhlIHRlc3QgcnVucyB1bmRlciByZWdydGVzdC4KKyAgICAgICAgc2VsZi5hc3NlcnRfKHN5cy5fX3N0ZG91dF9fLmVuY29kaW5nID09IHN5cy5fX3N0ZGVycl9fLmVuY29kaW5nKQorCiBkZWYgdGVzdF9tYWluKCk6CiAgICAgdGVzdC50ZXN0X3N1cHBvcnQucnVuX3VuaXR0ZXN0KFN5c01vZHVsZVRlc3QpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdGltZW91dC5weSBiL0xpYi90ZXN0L3Rlc3RfdGltZW91dC5weQppbmRleCBjYjE5ZDllLi40MzA5ZThjIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RpbWVvdXQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90aW1lb3V0LnB5CkBAIC0xMTMsOCArMTEzLDkgQEAKIAogICAgICAgICAjIElmIHdlIGFyZSB0b28gY2xvc2UgdG8gd3d3LnB5dGhvbi5vcmcsIHRoaXMgdGVzdCB3aWxsIGZhaWwuCiAgICAgICAgICMgUGljayBhIGhvc3QgdGhhdCBzaG91bGQgYmUgZmFydGhlciBhd2F5LgotICAgICAgICBpZiBzb2NrZXQuZ2V0ZnFkbigpLnNwbGl0KCcuJylbLTI6XSA9PSBbJ3B5dGhvbicsICdvcmcnXToKLSAgICAgICAgICAgIHNlbGYuYWRkcl9yZW1vdGUgPSAoJ3B5dGhvbi5uZXQnLCA4MCkKKyAgICAgICAgaWYgKHNvY2tldC5nZXRmcWRuKCkuc3BsaXQoJy4nKVstMjpdID09IFsncHl0aG9uJywgJ29yZyddIG9yCisgICAgICAgICAgICBzb2NrZXQuZ2V0ZnFkbigpLnNwbGl0KCcuJylbLTI6LTFdID09IFsneHM0YWxsJ10pOgorICAgICAgICAgICAgc2VsZi5hZGRyX3JlbW90ZSA9ICgndHV0LmZpJywgODApCiAKICAgICAgICAgX3QxID0gdGltZS50aW1lKCkKICAgICAgICAgc2VsZi5mYWlsVW5sZXNzUmFpc2VzKHNvY2tldC5lcnJvciwgc2VsZi5zb2NrLmNvbm5lY3QsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5IGIvTGliL3Rlc3QvdGVzdF90b2tlbml6ZS5weQppbmRleCBkM2MxY2M0Li5iMDY0OTY3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3Rva2VuaXplLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdG9rZW5pemUucHkKQEAgLTEsNzAgKzEsMzAgQEAKLWZyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IHZlcmJvc2UsIGZpbmRmaWxlLCBpc19yZXNvdXJjZV9lbmFibGVkLCBUZXN0RmFpbGVkCiBpbXBvcnQgb3MsIGdsb2IsIHJhbmRvbQorZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCitmcm9tIHRlc3QudGVzdF9zdXBwb3J0IGltcG9ydCAodmVyYm9zZSwgZmluZGZpbGUsIGlzX3Jlc291cmNlX2VuYWJsZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEZhaWxlZCkKIGZyb20gdG9rZW5pemUgaW1wb3J0ICh0b2tlbml6ZSwgZ2VuZXJhdGVfdG9rZW5zLCB1bnRva2VuaXplLAogICAgICAgICAgICAgICAgICAgICAgIE5VTUJFUiwgTkFNRSwgT1AsIFNUUklORykKIAotaWYgdmVyYm9zZToKLSAgICBwcmludCAnc3RhcnRpbmcuLi4nCi0KLWYgPSBmaWxlKGZpbmRmaWxlKCd0b2tlbml6ZV90ZXN0cycgKyBvcy5leHRzZXAgKyAndHh0JykpCi10b2tlbml6ZShmLnJlYWRsaW5lKQotZi5jbG9zZSgpCi0KLQotCi0jIyMjIyMgVGVzdCByb3VuZHRyaXAgZm9yIHVudG9rZW5pemUgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQorIyBUZXN0IHJvdW5kdHJpcCBmb3IgYHVudG9rZW5pemVgLiAgYGZgIGlzIGEgZmlsZSBwYXRoLiAgVGhlIHNvdXJjZSBjb2RlIGluIGYKKyMgaXMgdG9rZW5pemVkLCBjb252ZXJ0ZWQgYmFjayB0byBzb3VyY2UgY29kZSB2aWEgdG9rZW5pemUudW50b2tlbml6ZSgpLAorIyBhbmQgdG9rZW5pemVkIGFnYWluIGZyb20gdGhlIGxhdHRlci4gIFRoZSB0ZXN0IGZhaWxzIGlmIHRoZSBzZWNvbmQKKyMgdG9rZW5pemF0aW9uIGRvZXNuJ3QgbWF0Y2ggdGhlIGZpcnN0LgogZGVmIHRlc3Rfcm91bmR0cmlwKGYpOgogICAgICMjIHByaW50ICdUZXN0aW5nOicsIGYKLSAgICBmID0gZmlsZShmKQorICAgIGZvYmogPSBvcGVuKGYpCiAgICAgdHJ5OgotICAgICAgICBmdWxsdG9rID0gbGlzdChnZW5lcmF0ZV90b2tlbnMoZi5yZWFkbGluZSkpCisgICAgICAgIGZ1bGx0b2sgPSBsaXN0KGdlbmVyYXRlX3Rva2Vucyhmb2JqLnJlYWRsaW5lKSkKICAgICBmaW5hbGx5OgotICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgZm9iai5jbG9zZSgpCiAKICAgICB0MSA9IFt0b2tbOjJdIGZvciB0b2sgaW4gZnVsbHRva10KICAgICBuZXd0ZXh0ID0gdW50b2tlbml6ZSh0MSkKICAgICByZWFkbGluZSA9IGl0ZXIobmV3dGV4dC5zcGxpdGxpbmVzKDEpKS5uZXh0CiAgICAgdDIgPSBbdG9rWzoyXSBmb3IgdG9rIGluIGdlbmVyYXRlX3Rva2VucyhyZWFkbGluZSldCi0gICAgYXNzZXJ0IHQxID09IHQyCisgICAgaWYgdDEgIT0gdDI6CisgICAgICAgIHJhaXNlIFRlc3RGYWlsZWQoInVudG9rZW5pemUoKSByb3VuZHRyaXAgZmFpbGVkIGZvciAlciIgJSBmKQogCi0KLWYgPSBmaW5kZmlsZSgndG9rZW5pemVfdGVzdHMnICsgb3MuZXh0c2VwICsgJ3R4dCcpCi10ZXN0X3JvdW5kdHJpcChmKQotCi10ZXN0ZGlyID0gb3MucGF0aC5kaXJuYW1lKGYpIG9yIG9zLmN1cmRpcgotdGVzdGZpbGVzID0gZ2xvYi5nbG9iKHRlc3RkaXIgKyBvcy5zZXAgKyAndGVzdCoucHknKQotaWYgbm90IGlzX3Jlc291cmNlX2VuYWJsZWQoJ2NvbXBpbGVyJyk6Ci0gICAgdGVzdGZpbGVzID0gcmFuZG9tLnNhbXBsZSh0ZXN0ZmlsZXMsIDEwKQotCi1mb3IgZiBpbiB0ZXN0ZmlsZXM6Ci0gICAgdGVzdF9yb3VuZHRyaXAoZikKLQotCi0jIyMjIyMgVGVzdCBkZXRlY3RvbiBvZiBJbmRlbnRhdGlvbkVycm9yICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCi0KLXNhbXBsZUJhZFRleHQgPSAiIiIKLWRlZiBmb28oKToKLSAgICBiYXIKLSAgYmF6Ci0iIiIKLQotdHJ5OgotICAgIGZvciB0b2sgaW4gZ2VuZXJhdGVfdG9rZW5zKFN0cmluZ0lPKHNhbXBsZUJhZFRleHQpLnJlYWRsaW5lKToKLSAgICAgICAgcGFzcwotZXhjZXB0IEluZGVudGF0aW9uRXJyb3I6Ci0gICAgcGFzcwotZWxzZToKLSAgICByYWlzZSBUZXN0RmFpbGVkKCJEaWQgbm90IGRldGVjdCBJbmRlbnRhdGlvbkVycm9yOiIpCi0KLQotIyMjIyMjIFRlc3QgZXhhbXBsZSBpbiB0aGUgZG9jcyAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWZyb20gZGVjaW1hbCBpbXBvcnQgRGVjaW1hbAotZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCi0KKyMgVGhpcyBpcyBhbiBleGFtcGxlIGZyb20gdGhlIGRvY3MsIHNldCB1cCBhcyBhIGRvY3Rlc3QuCiBkZWYgZGVjaXN0bXQocyk6CiAgICAgIiIiU3Vic3RpdHV0ZSBEZWNpbWFscyBmb3IgZmxvYXRzIGluIGEgc3RyaW5nIG9mIHN0YXRlbWVudHMuCiAKQEAgLTczLDEyICszMywyMSBAQAogICAgID4+PiBkZWNpc3RtdChzKQogICAgICJwcmludCArRGVjaW1hbCAoJzIxLjNlLTUnKSotRGVjaW1hbCAoJy4xMjM0JykvRGVjaW1hbCAoJzgxLjcnKSIKIAotICAgID4+PiBleGVjKHMpCi0gICAgLTMuMjE3MTYwMzQyNzJlLTAwNworICAgIFRoZSBmb3JtYXQgb2YgdGhlIGV4cG9uZW50IGlzIGluaGVyaXRlZCBmcm9tIHRoZSBwbGF0Zm9ybSBDIGxpYnJhcnkuCisgICAgS25vd24gY2FzZXMgYXJlICJlLTAwNyIgKFdpbmRvd3MpIGFuZCAiZS0wNyIgKG5vdCBXaW5kb3dzKS4gIFNpbmNlCisgICAgd2UncmUgb25seSBzaG93aW5nIDEyIGRpZ2l0cywgYW5kIHRoZSAxM3RoIGlzbid0IGNsb3NlIHRvIDUsIHRoZQorICAgIHJlc3Qgb2YgdGhlIG91dHB1dCBzaG91bGQgYmUgcGxhdGZvcm0taW5kZXBlbmRlbnQuCisKKyAgICA+Pj4gZXhlYyhzKSAjZG9jdGVzdDogK0VMTElQU0lTCisgICAgLTMuMjE3MTYwMzQyNzJlLTAuLi43CisKKyAgICBPdXRwdXQgZnJvbSBjYWxjdWxhdGlvbnMgd2l0aCBEZWNpbWFsIHNob3VsZCBiZSBpZGVudGljYWwgYWNyb3NzIGFsbAorICAgIHBsYXRmb3Jtcy4KKwogICAgID4+PiBleGVjKGRlY2lzdG10KHMpKQogICAgIC0zLjIxNzE2MDM0MjcxNzI1ODI2MTkzMzkwNDUyOUUtNwotCiAgICAgIiIiCisKICAgICByZXN1bHQgPSBbXQogICAgIGcgPSBnZW5lcmF0ZV90b2tlbnMoU3RyaW5nSU8ocykucmVhZGxpbmUpICAgIyB0b2tlbml6ZSB0aGUgc3RyaW5nCiAgICAgZm9yIHRva251bSwgdG9rdmFsLCBfLCBfLCBfICBpbiBnOgpAQCAtOTMsOCArNjIsNTMgQEAKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoKHRva251bSwgdG9rdmFsKSkKICAgICByZXR1cm4gdW50b2tlbml6ZShyZXN1bHQpCiAKLWltcG9ydCBkb2N0ZXN0Ci1kb2N0ZXN0LnRlc3Rtb2QoKQorZGVmIHRlc3RfbWFpbigpOgorICAgIGlmIHZlcmJvc2U6CisgICAgICAgIHByaW50ICdzdGFydGluZy4uLicKIAotaWYgdmVyYm9zZToKLSAgICBwcmludCAnZmluaXNoZWQnCisgICAgIyBUaGlzIGRpc3BsYXlzIHRoZSB0b2tlbml6YXRpb24gb2YgdG9rZW5pemVfdGVzdHMucHkgdG8gc3Rkb3V0LCBhbmQKKyAgICAjIHJlZ3J0ZXN0LnB5IGNoZWNrcyB0aGF0IHRoaXMgZXF1YWxzIHRoZSBleHBlY3RlZCBvdXRwdXQgKGluIHRoZQorICAgICMgdGVzdC9vdXRwdXQvIGRpcmVjdG9yeSkuCisgICAgZiA9IG9wZW4oZmluZGZpbGUoJ3Rva2VuaXplX3Rlc3RzJyArIG9zLmV4dHNlcCArICd0eHQnKSkKKyAgICB0b2tlbml6ZShmLnJlYWRsaW5lKQorICAgIGYuY2xvc2UoKQorCisgICAgIyBOb3cgcnVuIHRlc3Rfcm91bmR0cmlwKCkgb3ZlciB0b2tlbml6ZV90ZXN0LnB5IHRvbywgYW5kIG92ZXIgYWxsCisgICAgIyAoaWYgdGhlICJjb21waWxlciIgcmVzb3VyY2UgaXMgZW5hYmxlZCkgb3IgYSBzbWFsbCByYW5kb20gc2FtcGxlIChpZgorICAgICMgImNvbXBpbGVyIiBpcyBub3QgZW5hYmxlZCkgb2YgdGhlIHRlc3QqLnB5IGZpbGVzLgorICAgIGYgPSBmaW5kZmlsZSgndG9rZW5pemVfdGVzdHMnICsgb3MuZXh0c2VwICsgJ3R4dCcpCisgICAgdGVzdF9yb3VuZHRyaXAoZikKKworICAgIHRlc3RkaXIgPSBvcy5wYXRoLmRpcm5hbWUoZikgb3Igb3MuY3VyZGlyCisgICAgdGVzdGZpbGVzID0gZ2xvYi5nbG9iKHRlc3RkaXIgKyBvcy5zZXAgKyAndGVzdCoucHknKQorICAgIGlmIG5vdCBpc19yZXNvdXJjZV9lbmFibGVkKCdjb21waWxlcicpOgorICAgICAgICB0ZXN0ZmlsZXMgPSByYW5kb20uc2FtcGxlKHRlc3RmaWxlcywgMTApCisKKyAgICBmb3IgZiBpbiB0ZXN0ZmlsZXM6CisgICAgICAgIHRlc3Rfcm91bmR0cmlwKGYpCisKKyAgICAjIFRlc3QgZGV0ZWN0b24gb2YgSW5kZW50YXRpb25FcnJvci4KKyAgICBzYW1wbGVCYWRUZXh0ID0gIiIiXAorZGVmIGZvbygpOgorICAgIGJhcgorICBiYXoKKyIiIgorCisgICAgdHJ5OgorICAgICAgICBmb3IgdG9rIGluIGdlbmVyYXRlX3Rva2VucyhTdHJpbmdJTyhzYW1wbGVCYWRUZXh0KS5yZWFkbGluZSk6CisgICAgICAgICAgICBwYXNzCisgICAgZXhjZXB0IEluZGVudGF0aW9uRXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICByYWlzZSBUZXN0RmFpbGVkKCJEaWQgbm90IGRldGVjdCBJbmRlbnRhdGlvbkVycm9yOiIpCisKKyAgICAjIFJ1biB0aGUgZG9jdGVzdHMgaW4gdGhpcyBtb2R1bGUuCisgICAgZnJvbSB0ZXN0IGltcG9ydCB0ZXN0X3Rva2VuaXplICAjIGkuZS4sIHRoaXMgbW9kdWxlCisgICAgZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgcnVuX2RvY3Rlc3QKKyAgICBydW5fZG9jdGVzdCh0ZXN0X3Rva2VuaXplKQorCisgICAgaWYgdmVyYm9zZToKKyAgICAgICAgcHJpbnQgJ2ZpbmlzaGVkJworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5IGIvTGliL3Rlc3QvdGVzdF90cmFjZS5weQppbmRleCA5NDRmZjlhLi40Zjk0NmY3IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3RyYWNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdHJhY2UucHkKQEAgLTEzLDcgKzEzLDE1IEBACiAgICAgICAgICAgICAgICAgKDEsICdsaW5lJyksCiAgICAgICAgICAgICAgICAgKDEsICdyZXR1cm4nKV0KIAotIyBBcm1pbiBSaWdvJ3MgZmFpbGluZyBleGFtcGxlOgorIyBNYW55IG9mIHRoZSB0ZXN0cyBiZWxvdyBhcmUgdHJpY2t5IGJlY2F1c2UgdGhleSBpbnZvbHZlIHBhc3Mgc3RhdGVtZW50cy4KKyMgSWYgdGhlcmUgaXMgaW1wbGljaXQgY29udHJvbCBmbG93IGFyb3VuZCBhIHBhc3Mgc3RhdGVtZW50IChpbiBhbiBleGNlcHQKKyMgY2xhdXNlIG9yIGVsc2UgY2FsdXNlKSB1bmRlciB3aGF0IGNvbmRpdGlvbnMgZG8geW91IHNldCBhIGxpbmUgbnVtYmVyCisjIGZvbGxvd2luZyB0aGF0IGNsYXVzZT8KKworCisjIFRoZSBlbnRpcmUgIndoaWxlIDA6IiBzdGF0ZW1lbnQgaXMgb3B0aW1pemVkIGF3YXkuICBObyBjb2RlCisjIGV4aXN0cyBmb3IgaXQsIHNvIHRoZSBsaW5lIG51bWJlcnMgc2tpcCBkaXJlY3RseSBmcm9tICJkZWwgeCIKKyMgdG8gInggPSAxIi4KIGRlZiBhcmlnb19leGFtcGxlKCk6CiAgICAgeCA9IDEKICAgICBkZWwgeApAQCAtMjQsNyArMzIsNiBAQAogYXJpZ29fZXhhbXBsZS5ldmVudHMgPSBbKDAsICdjYWxsJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAoMSwgJ2xpbmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgyLCAnbGluZScpLAotICAgICAgICAgICAgICAgICAgICAgICAgKDMsICdsaW5lJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAoNSwgJ2xpbmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICg1LCAncmV0dXJuJyldCiAKQEAgLTYwLDE0ICs2NywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICgyLCAncmV0dXJuJyldCiAKIGRlZiBub19wb3BfYmxvY2tzKCk6Ci0gICAgd2hpbGUgMDoKKyAgICB5ID0gMQorICAgIHdoaWxlIG5vdCB5OgogICAgICAgICBibGEKICAgICB4ID0gMQogCiBub19wb3BfYmxvY2tzLmV2ZW50cyA9IFsoMCwgJ2NhbGwnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICgxLCAnbGluZScpLAotICAgICAgICAgICAgICAgICAgICAgICAgKDMsICdsaW5lJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAoMywgJ3JldHVybicpXQorICAgICAgICAgICAgICAgICAgICAgICAgKDIsICdsaW5lJyksCisgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICg0LCAncmV0dXJuJyldCiAKIGRlZiBjYWxsZWQoKTogIyBsaW5lIC0zCiAgICAgeCA9IDEKQEAgLTEyNyw2ICsxMzYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDQsICdyZXR1cm4nKV0KIAogIyBpbXBsaWNpdCByZXR1cm4gZXhhbXBsZQorIyBUaGlzIHRlc3QgaXMgaW50ZXJlc3RpbmcgYmVjYXVzZSBvZiB0aGUgZWxzZTogcGFzcworIyBwYXJ0IG9mIHRoZSBjb2RlLiAgVGhlIGNvZGUgZ2VuZXJhdGUgZm9yIHRoZSB0cnVlCisjIHBhcnQgb2YgdGhlIGlmIGNvbnRhaW5zIGEganVtcCBwYXN0IHRoZSBlbHNlIGJyYW5jaC4KKyMgVGhlIGNvbXBpbGVyIHRoZW4gZ2VuZXJhdGVzIGFuIGltcGxpY2l0ICJyZXR1cm4gTm9uZSIKKyMgSW50ZXJuYWxseSwgdGhlIGNvbXBpbGVyIHZpc2l0cyB0aGUgcGFzcyBzdGF0ZW1lbnQKKyMgYW5kIHN0b3JlcyBpdHMgbGluZSBudW1iZXIgZm9yIHVzZSBvbiB0aGUgbmV4dCBpbnN0cnVjdGlvbi4KKyMgVGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgdGhlIGltcGxpY2l0IHJldHVybiBOb25lLgogZGVmIGlyZXR1cm5fZXhhbXBsZSgpOgogICAgIGEgPSA1CiAgICAgYiA9IDUKQEAgLTE0MCw3ICsxNTYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAoMiwgJ2xpbmUnKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMsICdsaW5lJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICg0LCAnbGluZScpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoNCwgJ3JldHVybicpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAoNiwgJ2xpbmUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKDYsICdyZXR1cm4nKV0KIAogIyBUaWdodCBsb29wIHdpdGggd2hpbGUoMSkgZXhhbXBsZSAoU0YgIzc2NTYyNCkKIGRlZiB0aWdodGxvb3BfZXhhbXBsZSgpOgpAQCAtMjIxLDE0ICsyMzgsMTIgQEAKIAogICAgIGRlZiB0ZXN0XzAxX2Jhc2ljKHNlbGYpOgogICAgICAgICBzZWxmLnJ1bl90ZXN0KGJhc2ljKQotIyMgWFhYOiBUaGVzZSB0ZXN0cyBmYWlsIHdpdGggdGhlIG5ldyBhc3QgY29tcGlsZXIuICBUaGV5IG11c3QKLSMjIGJlIGZpeGVkIGJlZm9yZSBhIHJlbGVhc2UuCi0jIyAgICBkZWYgdGVzdF8wMl9hcmlnbyhzZWxmKToKLSMjICAgICAgICBzZWxmLnJ1bl90ZXN0KGFyaWdvX2V4YW1wbGUpCisgICAgZGVmIHRlc3RfMDJfYXJpZ28oc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3QoYXJpZ29fZXhhbXBsZSkKICAgICBkZWYgdGVzdF8wM19vbmVfaW5zdHIoc2VsZik6CiAgICAgICAgIHNlbGYucnVuX3Rlc3Qob25lX2luc3RyX2xpbmUpCi0jIyAgICBkZWYgdGVzdF8wNF9ub19wb3BfYmxvY2tzKHNlbGYpOgotIyMgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fcG9wX2Jsb2NrcykKKyAgICBkZWYgdGVzdF8wNF9ub19wb3BfYmxvY2tzKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX3BvcF9ibG9ja3MpCiAjIyAgICBkZWYgdGVzdF8wNV9ub19wb3BfdG9wcyhzZWxmKToKICMjICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX3BvcF90b3BzKQogICAgIGRlZiB0ZXN0XzA2X2NhbGwoc2VsZik6CkBAIC0yNDAsOCArMjU1LDggQEAKICAgICAgICAgc2VsZi5ydW5fdGVzdDIoc2V0dHJhY2VfYW5kX3JldHVybikKICAgICBkZWYgdGVzdF8wOV9zZXR0cmFjZV9hbmRfcmFpc2Uoc2VsZik6CiAgICAgICAgIHNlbGYucnVuX3Rlc3QyKHNldHRyYWNlX2FuZF9yYWlzZSkKLSMjICAgIGRlZiB0ZXN0XzEwX2lyZXR1cm4oc2VsZik6Ci0jIyAgICAgICAgc2VsZi5ydW5fdGVzdChpcmV0dXJuX2V4YW1wbGUpCisgICAgZGVmIHRlc3RfMTBfaXJldHVybihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChpcmV0dXJuX2V4YW1wbGUpCiAgICAgZGVmIHRlc3RfMTFfdGlnaHRsb29wKHNlbGYpOgogICAgICAgICBzZWxmLnJ1bl90ZXN0KHRpZ2h0bG9vcF9leGFtcGxlKQogICAgIGRlZiB0ZXN0XzEyX3RpZ2h0ZXJsb29wKHNlbGYpOgpAQCAtNTc5LDE3ICs1OTQsMTQgQEAKICAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX3Rvb19mYXJfZm9yd2FyZHMpCiAgICAgZGVmIHRlc3RfMDlfbm9fanVtcF90b29fZmFyX2JhY2t3YXJkcyhzZWxmKToKICAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX3Rvb19mYXJfYmFja3dhcmRzKQotIyBYWFg6IFRoZXNlIHRlc3RzIGNhdXNlIHRoZSBpbnRlcnByZXRlciB0byBjcmFzaC4gIFRoZSBmcmFtZV9zZXRsaW5lbm8oKQotIyBmdW5jdGlvbiBubyBsb25nZXIgd29ya3MgY29ycmVjdGx5IGJlY2F1c2UgdGhlIGxpbmVubyB0YWJsZSBnZW5lcmF0ZWQgYnkKLSMgdGhlIEFTVCBjb21waWxlciBpcyBzbGlnaHRseSBkaWZmZXJlbnQgdGhhbiB3aXRoIHRoZSBvbGQgY29tcGlsZXIuCi0jICAgIGRlZiB0ZXN0XzEwX25vX2p1bXBfdG9fZXhjZXB0XzEoc2VsZik6Ci0jICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9fZXhjZXB0XzEpCi0jICAgIGRlZiB0ZXN0XzExX25vX2p1bXBfdG9fZXhjZXB0XzIoc2VsZik6Ci0jICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9fZXhjZXB0XzIpCi0jICAgIGRlZiB0ZXN0XzEyX25vX2p1bXBfdG9fZXhjZXB0XzMoc2VsZik6Ci0jICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9fZXhjZXB0XzMpCi0jICAgIGRlZiB0ZXN0XzEzX25vX2p1bXBfdG9fZXhjZXB0XzQoc2VsZik6Ci0jICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9fZXhjZXB0XzQpCisgICAgZGVmIHRlc3RfMTBfbm9fanVtcF90b19leGNlcHRfMShzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX3RvX2V4Y2VwdF8xKQorICAgIGRlZiB0ZXN0XzExX25vX2p1bXBfdG9fZXhjZXB0XzIoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3Rlc3Qobm9fanVtcF90b19leGNlcHRfMikKKyAgICBkZWYgdGVzdF8xMl9ub19qdW1wX3RvX2V4Y2VwdF8zKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bl90ZXN0KG5vX2p1bXBfdG9fZXhjZXB0XzMpCisgICAgZGVmIHRlc3RfMTNfbm9fanVtcF90b19leGNlcHRfNChzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX3RvX2V4Y2VwdF80KQogICAgIGRlZiB0ZXN0XzE0X25vX2p1bXBfZm9yd2FyZHNfaW50b19ibG9jayhzZWxmKToKICAgICAgICAgc2VsZi5ydW5fdGVzdChub19qdW1wX2ZvcndhcmRzX2ludG9fYmxvY2spCiAgICAgZGVmIHRlc3RfMTVfbm9fanVtcF9iYWNrd2FyZHNfaW50b19ibG9jayhzZWxmKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdHJhY2ViYWNrLnB5IGIvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKaW5kZXggMjlhMTIwZi4uMjJjMDQ1NiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKKysrIGIvTGliL3Rlc3QvdGVzdF90cmFjZWJhY2sucHkKQEAgLTI0LDYgKzI0LDkgQEAKICAgICAgICAgIyBYWFggd2h5IGRvZXNuJ3QgY29tcGlsZSByYWlzZSB0aGUgc2FtZSB0cmFjZWJhY2s/CiAgICAgICAgIGltcG9ydCB0ZXN0LmJhZHN5bnRheF9ub2NhcmV0CiAKKyAgICBkZWYgc3ludGF4X2Vycm9yX2JhZF9pbmRlbnRhdGlvbihzZWxmKToKKyAgICAgICAgY29tcGlsZSgiZGVmIHNwYW0oKTpcbiAgcHJpbnQgMVxuIHByaW50IDIiLCAiPyIsICJleGVjIikKKwogICAgIGRlZiB0ZXN0X2NhcmV0KHNlbGYpOgogICAgICAgICBlcnIgPSBzZWxmLmdldF9leGNlcHRpb25fZm9ybWF0KHNlbGYuc3ludGF4X2Vycm9yX3dpdGhfY2FyZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4RXJyb3IpCkBAIC00MCw2ICs0MywxMyBAQAogICAgICAgICBzZWxmLmFzc2VydF8obGVuKGVycikgPT0gMykKICAgICAgICAgc2VsZi5hc3NlcnRfKGVyclsxXS5zdHJpcCgpID09ICJbeCBmb3IgeCBpbiB4XSA9IHgiKQogCisgICAgZGVmIHRlc3RfYmFkX2luZGVudGF0aW9uKHNlbGYpOgorICAgICAgICBlcnIgPSBzZWxmLmdldF9leGNlcHRpb25fZm9ybWF0KHNlbGYuc3ludGF4X2Vycm9yX2JhZF9pbmRlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRlbnRhdGlvbkVycm9yKQorICAgICAgICBzZWxmLmFzc2VydF8obGVuKGVycikgPT0gNCkKKyAgICAgICAgc2VsZi5hc3NlcnRfKCJeIiBpbiBlcnJbMl0pCisgICAgICAgIHNlbGYuYXNzZXJ0XyhlcnJbMV0uc3RyaXAoKSA9PSAicHJpbnQgMiIpCisKICAgICBkZWYgdGVzdF9idWc3Mzc0NzMoc2VsZik6CiAgICAgICAgIGltcG9ydCBzeXMsIG9zLCB0ZW1wZmlsZSwgdGltZQogCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkgYi9MaWIvdGVzdC90ZXN0X3VuaWNvZGUucHkKaW5kZXggNDllZjI5ZC4uYzcxMTNiNSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF91bmljb2RlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdW5pY29kZS5weQpAQCAtODEwLDYgKzgxMCwyMiBAQAogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihGb285KCJmb28iKSksICJzdHJpbmciKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVuaWNvZGUoRm9vOSgiZm9vIikpLCB1Im5vdCB1bmljb2RlIikKIAorICAgIGRlZiB0ZXN0X3VuaWNvZGVfcmVwcihzZWxmKToKKyAgICAgICAgY2xhc3MgczE6CisgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuICdcXG4nCisKKyAgICAgICAgY2xhc3MgczI6CisgICAgICAgICAgICBkZWYgX19yZXByX18oc2VsZik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHUnXFxuJworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihzMSgpKSwgJ1xcbicpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVwcihzMigpKSwgJ1xcbicpCisKKworCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVW5pY29kZVRlc3QpCiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weSBiL0xpYi90ZXN0L3Rlc3RfdXJsbGliMi5weQppbmRleCAyODQzMTM4Li42NGEyZWU5IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VybGxpYjIucHkKKysrIGIvTGliL3Rlc3QvdGVzdF91cmxsaWIyLnB5CkBAIC0xMyw4ICsxMyw3IEBACiAjIHBhcnNlX2tlcXZfbGlzdCwgcGFyc2VfaHR0cF9saXN0IChJJ20gbGVhdmluZyB0aGlzIGZvciBBbnRob255IEJheHRlcgogIyAgYW5kIEdyZWcgU3RlaW4sIHNpbmNlIHRoZXkncmUgZG9pbmcgRGlnZXN0IEF1dGhlbnRpY2F0aW9uKQogIyBBdXRoZW50aWNhdGlvbiBzdHVmZiAoZGl0dG8pCi0jIFByb3h5SGFuZGxlciwgQ3VzdG9tUHJveHksIEN1c3RvbVByb3h5SGFuZGxlciAoSSBkb24ndCB1c2UgYSBwcm94eSkKLSMgR29waGVySGFuZGxlciAoaGF2ZW4ndCB1c2VkIGdvcGhlciBmb3IgYSBkZWNhZGUgb3Igc28uLi4pCisjIEN1c3RvbVByb3h5LCBDdXN0b21Qcm94eUhhbmRsZXIKIAogY2xhc3MgVHJpdmlhbFRlc3RzKHVuaXR0ZXN0LlRlc3RDYXNlKToKICAgICBkZWYgdGVzdF90cml2aWFsKHNlbGYpOgpAQCAtOTAsNiArODksNyBAQAogICAgICAgICByZXR1cm4gc2VsZi5oYW5kbGUoc2VsZi5tZXRoX25hbWUsIHNlbGYuYWN0aW9uLCAqYXJncykKIAogY2xhc3MgTW9ja0hhbmRsZXI6CisgICAgaGFuZGxlcl9vcmRlciA9IDUwMAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2RzKToKICAgICAgICAgc2VsZi5fZGVmaW5lX21ldGhvZHMobWV0aG9kcykKICAgICBkZWYgX2RlZmluZV9tZXRob2RzKHNlbGYsIG1ldGhvZHMpOgpAQCAtMTU0LDcgKzE1NCw3IEBACiAgICAgZm9yIG1ldGhzIGluIG1ldGhfc3BlYzoKICAgICAgICAgY2xhc3MgTW9ja0hhbmRsZXJTdWJjbGFzcyhNb2NrSGFuZGxlcik6IHBhc3MKICAgICAgICAgaCA9IE1vY2tIYW5kbGVyU3ViY2xhc3MobWV0aHMpCi0gICAgICAgIGguaGFuZGxlcl9vcmRlciA9IGNvdW50CisgICAgICAgIGguaGFuZGxlcl9vcmRlciArPSBjb3VudAogICAgICAgICBoLmFkZF9wYXJlbnQob3BlbmVyKQogICAgICAgICBjb3VudCA9IGNvdW50ICsgMQogICAgICAgICBoYW5kbGVycy5hcHBlbmQoaCkKQEAgLTM0OSwxMyArMzQ5LDE5IEBACiAgICAgICAgIFRFU1RGTiA9IHRlc3Rfc3VwcG9ydC5URVNURk4KICAgICAgICAgdXJscGF0aCA9IHNhbmVwYXRobmFtZTJ1cmwob3MucGF0aC5hYnNwYXRoKFRFU1RGTikpCiAgICAgICAgIHRvd3JpdGUgPSAiaGVsbG8sIHdvcmxkXG4iCi0gICAgICAgIGZvciB1cmwgaW4gWworICAgICAgICB1cmxzID0gWwogICAgICAgICAgICAgImZpbGU6Ly9sb2NhbGhvc3QlcyIgJSB1cmxwYXRoLAogICAgICAgICAgICAgImZpbGU6Ly8lcyIgJSB1cmxwYXRoLAogICAgICAgICAgICAgImZpbGU6Ly8lcyVzIiAlIChzb2NrZXQuZ2V0aG9zdGJ5bmFtZSgnbG9jYWxob3N0JyksIHVybHBhdGgpLAotICAgICAgICAgICAgImZpbGU6Ly8lcyVzIiAlIChzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybHBhdGgpLAotICAgICAgICAgICAgXToKKyAgICAgICAgICAgIF0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbG9jYWxhZGRyID0gc29ja2V0LmdldGhvc3RieW5hbWUoc29ja2V0LmdldGhvc3RuYW1lKCkpCisgICAgICAgIGV4Y2VwdCBzb2NrZXQuZ2FpZXJyb3I6CisgICAgICAgICAgICBsb2NhbGFkZHIgPSAnJworICAgICAgICBpZiBsb2NhbGFkZHI6CisgICAgICAgICAgICB1cmxzLmFwcGVuZCgiZmlsZTovLyVzJXMiICUgKGxvY2FsYWRkciwgdXJscGF0aCkpCisKKyAgICAgICAgZm9yIHVybCBpbiB1cmxzOgogICAgICAgICAgICAgZiA9IG9wZW4oVEVTVEZOLCAid2IiKQogICAgICAgICAgICAgdHJ5OgogICAgICAgICAgICAgICAgIHRyeToKQEAgLTYzNiw2ICs2NDIsMjMgQEAKICAgICAgICAgby5vcGVuKCJodHRwOi8vd3d3LmV4YW1wbGUuY29tLyIpCiAgICAgICAgIHNlbGYuYXNzZXJ0Xyhub3QgaGgucmVxLmhhc19oZWFkZXIoIkNvb2tpZSIpKQogCisgICAgZGVmIHRlc3RfcHJveHkoc2VsZik6CisgICAgICAgIG8gPSBPcGVuZXJEaXJlY3RvcigpCisgICAgICAgIHBoID0gdXJsbGliMi5Qcm94eUhhbmRsZXIoZGljdChodHRwPSJwcm94eS5leGFtcGxlLmNvbTozMTI4IikpCisgICAgICAgIG8uYWRkX2hhbmRsZXIocGgpCisgICAgICAgIG1ldGhfc3BlYyA9IFsKKyAgICAgICAgICAgIFsoImh0dHBfb3BlbiIsICJyZXR1cm4gcmVzcG9uc2UiKV0KKyAgICAgICAgICAgIF0KKyAgICAgICAgaGFuZGxlcnMgPSBhZGRfb3JkZXJlZF9tb2NrX2hhbmRsZXJzKG8sIG1ldGhfc3BlYykKKworICAgICAgICByZXEgPSBSZXF1ZXN0KCJodHRwOi8vYWNtZS5leGFtcGxlLmNvbS8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfaG9zdCgpLCAiYWNtZS5leGFtcGxlLmNvbSIpCisgICAgICAgIHIgPSBvLm9wZW4ocmVxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlcS5nZXRfaG9zdCgpLCAicHJveHkuZXhhbXBsZS5jb206MzEyOCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChbKGhhbmRsZXJzWzBdLCAiaHR0cF9vcGVuIildLAorICAgICAgICAgICAgICAgICAgICAgICAgIFt0dXBbMDoyXSBmb3IgdHVwIGluIG8uY2FsbHNdKQorCiAKIGNsYXNzIE1pc2NUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKQEAgLTgyMSw2ICs4NDQsNyBAQAogCiAKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICB0ZXN0X3N1cHBvcnQucnVuX2RvY3Rlc3QodXJsbGliMiwgdmVyYm9zZSkKICAgICB0ZXN0cyA9IChUcml2aWFsVGVzdHMsCiAgICAgICAgICAgICAgT3BlbmVyRGlyZWN0b3JUZXN0cywKICAgICAgICAgICAgICBIYW5kbGVyVGVzdHMsCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3VybHBhcnNlLnB5IGIvTGliL3Rlc3QvdGVzdF91cmxwYXJzZS5weQppbmRleCAzOWFkYTA2Li41Y2VlNDU4IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3VybHBhcnNlLnB5CisrKyBiL0xpYi90ZXN0L3Rlc3RfdXJscGFyc2UucHkKQEAgLTEyLDE1ICsxMiw1MyBAQAogICAgIGRlZiBjaGVja1JvdW5kdHJpcHMoc2VsZiwgdXJsLCBwYXJzZWQsIHNwbGl0KToKICAgICAgICAgcmVzdWx0ID0gdXJscGFyc2UudXJscGFyc2UodXJsKQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgcGFyc2VkKQorICAgICAgICB0ID0gKHJlc3VsdC5zY2hlbWUsIHJlc3VsdC5uZXRsb2MsIHJlc3VsdC5wYXRoLAorICAgICAgICAgICAgIHJlc3VsdC5wYXJhbXMsIHJlc3VsdC5xdWVyeSwgcmVzdWx0LmZyYWdtZW50KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHQsIHBhcnNlZCkKICAgICAgICAgIyBwdXQgaXQgYmFjayB0b2dldGhlciBhbmQgaXQgc2hvdWxkIGJlIHRoZSBzYW1lCiAgICAgICAgIHJlc3VsdDIgPSB1cmxwYXJzZS51cmx1bnBhcnNlKHJlc3VsdCkKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQyLCB1cmwpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0MiwgcmVzdWx0LmdldHVybCgpKQorCisgICAgICAgICMgdGhlIHJlc3VsdCBvZiBnZXR1cmwoKSBpcyBhIGZpeHBvaW50OyB3ZSBjYW4gYWx3YXlzIHBhcnNlIGl0CisgICAgICAgICMgYWdhaW4gdG8gZ2V0IHRoZSBzYW1lIHJlc3VsdDoKKyAgICAgICAgcmVzdWx0MyA9IHVybHBhcnNlLnVybHBhcnNlKHJlc3VsdC5nZXR1cmwoKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLmdldHVybCgpLCByZXN1bHQuZ2V0dXJsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0MywgICAgICAgICAgcmVzdWx0KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMuc2NoZW1lLCAgIHJlc3VsdC5zY2hlbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5uZXRsb2MsICAgcmVzdWx0Lm5ldGxvYykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnBhdGgsICAgICByZXN1bHQucGF0aCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnBhcmFtcywgICByZXN1bHQucGFyYW1zKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucXVlcnksICAgIHJlc3VsdC5xdWVyeSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLmZyYWdtZW50LCByZXN1bHQuZnJhZ21lbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My51c2VybmFtZSwgcmVzdWx0LnVzZXJuYW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMucGFzc3dvcmQsIHJlc3VsdC5wYXNzd29yZCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLmhvc3RuYW1lLCByZXN1bHQuaG9zdG5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5wb3J0LCAgICAgcmVzdWx0LnBvcnQpCiAKICAgICAgICAgIyBjaGVjayB0aGUgcm91bmR0cmlwIHVzaW5nIHVybHNwbGl0KCkgYXMgd2VsbAogICAgICAgICByZXN1bHQgPSB1cmxwYXJzZS51cmxzcGxpdCh1cmwpCiAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LCBzcGxpdCkKKyAgICAgICAgdCA9IChyZXN1bHQuc2NoZW1lLCByZXN1bHQubmV0bG9jLCByZXN1bHQucGF0aCwKKyAgICAgICAgICAgICByZXN1bHQucXVlcnksIHJlc3VsdC5mcmFnbWVudCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0LCBzcGxpdCkKICAgICAgICAgcmVzdWx0MiA9IHVybHBhcnNlLnVybHVuc3BsaXQocmVzdWx0KQogICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDIsIHVybCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQyLCByZXN1bHQuZ2V0dXJsKCkpCisKKyAgICAgICAgIyBjaGVjayB0aGUgZml4cG9pbnQgcHJvcGVydHkgb2YgcmUtcGFyc2luZyB0aGUgcmVzdWx0IG9mIGdldHVybCgpCisgICAgICAgIHJlc3VsdDMgPSB1cmxwYXJzZS51cmxzcGxpdChyZXN1bHQuZ2V0dXJsKCkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5nZXR1cmwoKSwgcmVzdWx0LmdldHVybCgpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMsICAgICAgICAgIHJlc3VsdCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnNjaGVtZSwgICByZXN1bHQuc2NoZW1lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMubmV0bG9jLCAgIHJlc3VsdC5uZXRsb2MpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5wYXRoLCAgICAgcmVzdWx0LnBhdGgpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5xdWVyeSwgICAgcmVzdWx0LnF1ZXJ5KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMuZnJhZ21lbnQsIHJlc3VsdC5mcmFnbWVudCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnVzZXJuYW1lLCByZXN1bHQudXNlcm5hbWUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0My5wYXNzd29yZCwgcmVzdWx0LnBhc3N3b3JkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdDMuaG9zdG5hbWUsIHJlc3VsdC5ob3N0bmFtZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQzLnBvcnQsICAgICByZXN1bHQucG9ydCkKIAogICAgIGRlZiB0ZXN0X3JvdW5kdHJpcHMoc2VsZik6CiAgICAgICAgIHRlc3RjYXNlcyA9IFsKQEAgLTE4Nyw2ICsyMjUsNjkgQEAKICAgICAgICAgICAgIF06CiAgICAgICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHVybHBhcnNlLnVybGRlZnJhZyh1cmwpLCAoZGVmcmFnLCBmcmFnKSkKIAorICAgIGRlZiB0ZXN0X3VybHNwbGl0X2F0dHJpYnV0ZXMoc2VsZik6CisgICAgICAgIHVybCA9ICJIVFRQOi8vV1dXLlBZVEhPTi5PUkcvZG9jLyNmcmFnIgorICAgICAgICBwID0gdXJscGFyc2UudXJsc3BsaXQodXJsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc2NoZW1lLCAiaHR0cCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICJXV1cuUFlUSE9OLk9SRyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wYXRoLCAiL2RvYy8iKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucXVlcnksICIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZnJhZ21lbnQsICJmcmFnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnVzZXJuYW1lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGFzc3dvcmQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5ob3N0bmFtZSwgInd3dy5weXRob24ub3JnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIE5vbmUpCisgICAgICAgICMgZ2V0dXJsKCkgd29uJ3QgcmV0dXJuIGV4YWN0bHkgdGhlIG9yaWdpbmFsIFVSTCBpbiB0aGlzIGNhc2UKKyAgICAgICAgIyBzaW5jZSB0aGUgc2NoZW1lIGlzIGFsd2F5cyBjYXNlLW5vcm1hbGl6ZWQKKyAgICAgICAgI3NlbGYuYXNzZXJ0RXF1YWwocC5nZXR1cmwoKSwgdXJsKQorCisgICAgICAgIHVybCA9ICJodHRwOi8vVXNlcjpQYXNzQHd3dy5weXRob24ub3JnOjA4MC9kb2MvP3F1ZXJ5PXllcyNmcmFnIgorICAgICAgICBwID0gdXJscGFyc2UudXJsc3BsaXQodXJsKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuc2NoZW1lLCAiaHR0cCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICJVc2VyOlBhc3NAd3d3LnB5dGhvbi5vcmc6MDgwIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBhdGgsICIvZG9jLyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5xdWVyeSwgInF1ZXJ5PXllcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5mcmFnbWVudCwgImZyYWciKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAudXNlcm5hbWUsICJVc2VyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBhc3N3b3JkLCAiUGFzcyIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5ob3N0bmFtZSwgInd3dy5weXRob24ub3JnIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIDgwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAuZ2V0dXJsKCksIHVybCkKKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXNfYmFkX3BvcnQoc2VsZik6CisgICAgICAgICIiIkNoZWNrIGhhbmRsaW5nIG9mIG5vbi1pbnRlZ2VyIHBvcnRzLiIiIgorICAgICAgICBwID0gdXJscGFyc2UudXJsc3BsaXQoImh0dHA6Ly93d3cuZXhhbXBsZS5uZXQ6Zm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgInd3dy5leGFtcGxlLm5ldDpmb28iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IHAucG9ydCkKKworICAgICAgICBwID0gdXJscGFyc2UudXJscGFyc2UoImh0dHA6Ly93d3cuZXhhbXBsZS5uZXQ6Zm9vIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLm5ldGxvYywgInd3dy5leGFtcGxlLm5ldDpmb28iKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBsYW1iZGE6IHAucG9ydCkKKworICAgIGRlZiB0ZXN0X2F0dHJpYnV0ZXNfd2l0aG91dF9uZXRsb2Moc2VsZik6CisgICAgICAgICMgVGhpcyBleGFtcGxlIGlzIHN0cmFpZ2h0IGZyb20gUkZDIDMyNjEuICBJdCBsb29rcyBsaWtlIGl0CisgICAgICAgICMgc2hvdWxkIGFsbG93IHRoZSB1c2VybmFtZSwgaG9zdG5hbWUsIGFuZCBwb3J0IHRvIGJlIGZpbGxlZAorICAgICAgICAjIGluLCBidXQgZG9lc24ndC4gIFNpbmNlIGl0J3MgYSBVUkkgYW5kIGRvZXNuJ3QgdXNlIHRoZQorICAgICAgICAjIHNjaGVtZTovL25ldGxvYyBzeW50YXgsIHRoZSBuZXRsb2MgYW5kIHJlbGF0ZWQgYXR0cmlidXRlcworICAgICAgICAjIHNob3VsZCBiZSBsZWZ0IGVtcHR5LgorICAgICAgICB1cmkgPSAic2lwOmFsaWNlQGF0bGFudGEuY29tO21hZGRyPTIzOS4yNTUuMjU1LjE7dHRsPTE1IgorICAgICAgICBwID0gdXJscGFyc2UudXJsc3BsaXQodXJpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAubmV0bG9jLCAiIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnVzZXJuYW1lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucGFzc3dvcmQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5ob3N0bmFtZSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLnBvcnQsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5nZXR1cmwoKSwgdXJpKQorCisgICAgICAgIHAgPSB1cmxwYXJzZS51cmxwYXJzZSh1cmkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5uZXRsb2MsICIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAudXNlcm5hbWUsIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwocC5wYXNzd29yZCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmhvc3RuYW1lLCBOb25lKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHAucG9ydCwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChwLmdldHVybCgpLCB1cmkpCisKKwogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoVXJsUGFyc2VUZXN0Q2FzZSkKIApkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93YWl0My5weSBiL0xpYi90ZXN0L3Rlc3Rfd2FpdDMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhNDFhNgotLS0gL2Rldi9udWxsCisrKyBiL0xpYi90ZXN0L3Rlc3Rfd2FpdDMucHkKQEAgLTAsMCArMSwzMiBAQAorIiIiVGhpcyB0ZXN0IGNoZWNrcyBmb3IgY29ycmVjdCB3YWl0MygpIGJlaGF2aW9yLgorIiIiCisKK2ltcG9ydCBvcworZnJvbSB0ZXN0LmZvcmtfd2FpdCBpbXBvcnQgRm9ya1dhaXQKK2Zyb20gdGVzdC50ZXN0X3N1cHBvcnQgaW1wb3J0IFRlc3RTa2lwcGVkLCBydW5fdW5pdHRlc3QKKwordHJ5OgorICAgIG9zLmZvcmsKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICByYWlzZSBUZXN0U2tpcHBlZCwgIm9zLmZvcmsgbm90IGRlZmluZWQgLS0gc2tpcHBpbmcgdGVzdF93YWl0MyIKKwordHJ5OgorICAgIG9zLndhaXQzCitleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgcmFpc2UgVGVzdFNraXBwZWQsICJvcy53YWl0MyBub3QgZGVmaW5lZCAtLSBza2lwcGluZyB0ZXN0X3dhaXQzIgorCitjbGFzcyBXYWl0M1Rlc3QoRm9ya1dhaXQpOgorICAgIGRlZiB3YWl0X2ltcGwoc2VsZiwgY3BpZCk6CisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBzcGlkLCBzdGF0dXMsIHJ1c2FnZSA9IG9zLndhaXQzKDApCisgICAgICAgICAgICBpZiBzcGlkID09IGNwaWQ6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChzcGlkLCBjcGlkKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHN0YXR1cywgMCwgImNhdXNlID0gJWQsIGV4aXQgPSAlZCIgJSAoc3RhdHVzJjB4ZmYsIHN0YXR1cz4+OCkpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShydXNhZ2UpCisKK2RlZiB0ZXN0X21haW4oKToKKyAgICBydW5fdW5pdHRlc3QoV2FpdDNUZXN0KQorCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHRlc3RfbWFpbigpCmRpZmYgLS1naXQgYS9MaWIvdGVzdC90ZXN0X3dhaXQ0LnB5IGIvTGliL3Rlc3QvdGVzdF93YWl0NC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjdlNWMzCi0tLSAvZGV2L251bGwKKysrIGIvTGliL3Rlc3QvdGVzdF93YWl0NC5weQpAQCAtMCwwICsxLDI5IEBACisiIiJUaGlzIHRlc3QgY2hlY2tzIGZvciBjb3JyZWN0IHdhaXQ0KCkgYmVoYXZpb3IuCisiIiIKKworaW1wb3J0IG9zCitmcm9tIHRlc3QuZm9ya193YWl0IGltcG9ydCBGb3JrV2FpdAorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgVGVzdFNraXBwZWQsIHJ1bl91bml0dGVzdAorCit0cnk6CisgICAgb3MuZm9yaworZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgorICAgIHJhaXNlIFRlc3RTa2lwcGVkLCAib3MuZm9yayBub3QgZGVmaW5lZCAtLSBza2lwcGluZyB0ZXN0X3dhaXQ0IgorCit0cnk6CisgICAgb3Mud2FpdDQKK2V4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICByYWlzZSBUZXN0U2tpcHBlZCwgIm9zLndhaXQ0IG5vdCBkZWZpbmVkIC0tIHNraXBwaW5nIHRlc3Rfd2FpdDQiCisKK2NsYXNzIFdhaXQ0VGVzdChGb3JrV2FpdCk6CisgICAgZGVmIHdhaXRfaW1wbChzZWxmLCBjcGlkKToKKyAgICAgICAgc3BpZCwgc3RhdHVzLCBydXNhZ2UgPSBvcy53YWl0NChjcGlkLCAwKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNwaWQsIGNwaWQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RhdHVzLCAwLCAiY2F1c2UgPSAlZCwgZXhpdCA9ICVkIiAlIChzdGF0dXMmMHhmZiwgc3RhdHVzPj44KSkKKyAgICAgICAgc2VsZi5hc3NlcnRUcnVlKHJ1c2FnZSkKKworZGVmIHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChXYWl0NFRlc3QpCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgdGVzdF9tYWluKCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MucHkgYi9MaWIvdGVzdC90ZXN0X3dhcm5pbmdzLnB5CmluZGV4IGI3MDYxYzEuLjVkMDUxYTUgMTAwNjQ0Ci0tLSBhL0xpYi90ZXN0L3Rlc3Rfd2FybmluZ3MucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93YXJuaW5ncy5weQpAQCAtODIsNiArODIsMTAgQEAKICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cuY2F0ZWdvcnksICdVc2VyV2FybmluZycpCiAKIGRlZiB0ZXN0X21haW4odmVyYm9zZT1Ob25lKToKKyAgICAjIE9ic2N1cmUgaGFjayBzbyB0aGF0IHRoaXMgdGVzdCBwYXNzZXMgYWZ0ZXIgcmVsb2FkcyBvciByZXBlYXRlZCBjYWxscworICAgICMgdG8gdGVzdF9tYWluIChyZWdydGVzdCAtUikuCisgICAgaWYgJ19fd2FybmluZ3JlZ2lzdHJ5X18nIGluIGdsb2JhbHMoKToKKyAgICAgICAgZGVsIGdsb2JhbHMoKVsnX193YXJuaW5ncmVnaXN0cnlfXyddCiAgICAgdGVzdF9zdXBwb3J0LnJ1bl91bml0dGVzdChUZXN0TW9kdWxlKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF93aW5zb3VuZC5weSBiL0xpYi90ZXN0L3Rlc3Rfd2luc291bmQucHkKaW5kZXggNzdjNDMyYS4uMTlkNDQ1OSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF93aW5zb3VuZC5weQorKysgYi9MaWIvdGVzdC90ZXN0X3dpbnNvdW5kLnB5CkBAIC0zLDYgKzMsOSBAQAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHRlc3QgaW1wb3J0IHRlc3Rfc3VwcG9ydAogaW1wb3J0IHdpbnNvdW5kLCB0aW1lCitpbXBvcnQgb3MKK2ltcG9ydCBzdWJwcm9jZXNzCisKIAogY2xhc3MgQmVlcFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgogCkBAIC00NCw2ICs0Nyw3IEBACiAgICAgZGVmIHRlc3RfcXVlc3Rpb24oc2VsZik6CiAgICAgICAgIHdpbnNvdW5kLk1lc3NhZ2VCZWVwKHdpbnNvdW5kLk1CX0lDT05RVUVTVElPTikKIAorCiBjbGFzcyBQbGF5U291bmRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKIAogICAgIGRlZiB0ZXN0X2Vycm9ycyhzZWxmKToKQEAgLTU2LDE5ICs2MCw1NCBAQAogICAgICAgICApCiAKICAgICBkZWYgdGVzdF9hbGlhc19hc3RlcmlzayhzZWxmKToKLSAgICAgICAgd2luc291bmQuUGxheVNvdW5kKCdTeXN0ZW1Bc3RlcmlzaycsIHdpbnNvdW5kLlNORF9BTElBUykKKyAgICAgICAgaWYgX2hhdmVfc291bmRjYXJkKCk6CisgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoJ1N5c3RlbUFzdGVyaXNrJywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICAgICAgUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCwKKyAgICAgICAgICAgICAgICAnU3lzdGVtQXN0ZXJpc2snLCB3aW5zb3VuZC5TTkRfQUxJQVMKKyAgICAgICAgICAgICkKIAogICAgIGRlZiB0ZXN0X2FsaWFzX2V4Y2xhbWF0aW9uKHNlbGYpOgotICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoJ1N5c3RlbUV4Y2xhbWF0aW9uJywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICBpZiBfaGF2ZV9zb3VuZGNhcmQoKToKKyAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgnU3lzdGVtRXhjbGFtYXRpb24nLCB3aW5zb3VuZC5TTkRfQUxJQVMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kLAorICAgICAgICAgICAgICAgICdTeXN0ZW1FeGNsYW1hdGlvbicsIHdpbnNvdW5kLlNORF9BTElBUworICAgICAgICAgICAgKQogCiAgICAgZGVmIHRlc3RfYWxpYXNfZXhpdChzZWxmKToKLSAgICAgICAgd2luc291bmQuUGxheVNvdW5kKCdTeXN0ZW1FeGl0Jywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICBpZiBfaGF2ZV9zb3VuZGNhcmQoKToKKyAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgnU3lzdGVtRXhpdCcsIHdpbnNvdW5kLlNORF9BTElBUykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQsCisgICAgICAgICAgICAgICAgJ1N5c3RlbUV4aXQnLCB3aW5zb3VuZC5TTkRfQUxJQVMKKyAgICAgICAgICAgICkKIAogICAgIGRlZiB0ZXN0X2FsaWFzX2hhbmQoc2VsZik6Ci0gICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgnU3lzdGVtSGFuZCcsIHdpbnNvdW5kLlNORF9BTElBUykKKyAgICAgICAgaWYgX2hhdmVfc291bmRjYXJkKCk6CisgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoJ1N5c3RlbUhhbmQnLCB3aW5zb3VuZC5TTkRfQUxJQVMpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kLAorICAgICAgICAgICAgICAgICdTeXN0ZW1IYW5kJywgd2luc291bmQuU05EX0FMSUFTCisgICAgICAgICAgICApCiAKICAgICBkZWYgdGVzdF9hbGlhc19xdWVzdGlvbihzZWxmKToKLSAgICAgICAgd2luc291bmQuUGxheVNvdW5kKCdTeXN0ZW1RdWVzdGlvbicsIHdpbnNvdW5kLlNORF9BTElBUykKKyAgICAgICAgaWYgX2hhdmVfc291bmRjYXJkKCk6CisgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQoJ1N5c3RlbVF1ZXN0aW9uJywgd2luc291bmQuU05EX0FMSUFTKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoCisgICAgICAgICAgICAgICAgUnVudGltZUVycm9yLAorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCwKKyAgICAgICAgICAgICAgICAnU3lzdGVtUXVlc3Rpb24nLCB3aW5zb3VuZC5TTkRfQUxJQVMKKyAgICAgICAgICAgICkKIAogICAgIGRlZiB0ZXN0X2FsaWFzX2ZhbGxiYWNrKHNlbGYpOgogICAgICAgICAjIFRoaXMgdGVzdCBjYW4ndCBiZSBleHBlY3RlZCB0byB3b3JrIG9uIGFsbCBzeXN0ZW1zLiAgVGhlIE1TCkBAIC04NSw0MSArMTI0LDgzIEBACiAgICAgICAgIHJldHVybgogCiAgICAgZGVmIHRlc3RfYWxpYXNfbm9mYWxsYmFjayhzZWxmKToKLSAgICAgICAgIyBOb3RlIHRoYXQgdGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgYXNzZXJ0aW5nIFJ1bnRpbWVFcnJvcgotICAgICAgICAjIHdpbGwgZ2V0IHJhaXNlZDogIHlvdSBjYW5ub3QgY29udmVydCB0aGlzIHRvCi0gICAgICAgICMgc2VsZi5hc3NlcnRSYWlzZXMoLi4uKSBmb3JtLiAgVGhlIGF0dGVtcHQgbWF5IG9yIG1heSBub3QKLSAgICAgICAgIyByYWlzZSBSdW50aW1lRXJyb3IsIGJ1dCBpdCBzaG91bGRuJ3QgcmFpc2UgYW55dGhpbmcgb3RoZXIKLSAgICAgICAgIyB0aGFuIFJ1bnRpbWVFcnJvciwgYW5kIHRoYXQncyBhbGwgd2UncmUgdHJ5aW5nIHRvIHRlc3QgaGVyZS4KLSAgICAgICAgIyBUaGUgTVMgZG9jcyBhcmVuJ3QgY2xlYXIgYWJvdXQgd2hldGhlciB0aGUgU0RLIFBsYXlTb3VuZCgpCi0gICAgICAgICMgd2l0aCBTTkRfQUxJQVMgYW5kIFNORF9OT0RFRkFVTFQgd2lsbCByZXR1cm4gVHJ1ZSBvciBGYWxzZSB3aGVuCi0gICAgICAgICMgdGhlIGFsaWFzIGlzIHVua25vd24uICBPbiBUaW0ncyBXaW5YUCBib3ggdG9kYXksIGl0IHJldHVybnMKLSAgICAgICAgIyBUcnVlIChubyBleGNlcHRpb24gaXMgcmFpc2VkKS4gIFdoYXQgd2UnZCByZWFsbHkgbGlrZSB0byB0ZXN0Ci0gICAgICAgICMgaXMgdGhhdCBubyBzb3VuZCBpcyBwbGF5ZWQsIGJ1dCB0aGF0IHJlcXVpcmVzIGZpcnN0IHdpcmluZyBhbgotICAgICAgICAjIGVhcmRydW0gY2xhc3MgaW50byB1bml0dGVzdCA8d2luaz4uCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgKLSAgICAgICAgICAgICAgICAnISIkJSYvKCMrKicsCi0gICAgICAgICAgICAgICAgd2luc291bmQuU05EX0FMSUFTIHwgd2luc291bmQuU05EX05PREVGQVVMVAorICAgICAgICBpZiBfaGF2ZV9zb3VuZGNhcmQoKToKKyAgICAgICAgICAgICMgTm90ZSB0aGF0IHRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIGFzc2VydGluZyBSdW50aW1lRXJyb3IKKyAgICAgICAgICAgICMgd2lsbCBnZXQgcmFpc2VkOiAgeW91IGNhbm5vdCBjb252ZXJ0IHRoaXMgdG8KKyAgICAgICAgICAgICMgc2VsZi5hc3NlcnRSYWlzZXMoLi4uKSBmb3JtLiAgVGhlIGF0dGVtcHQgbWF5IG9yIG1heSBub3QKKyAgICAgICAgICAgICMgcmFpc2UgUnVudGltZUVycm9yLCBidXQgaXQgc2hvdWxkbid0IHJhaXNlIGFueXRoaW5nIG90aGVyCisgICAgICAgICAgICAjIHRoYW4gUnVudGltZUVycm9yLCBhbmQgdGhhdCdzIGFsbCB3ZSdyZSB0cnlpbmcgdG8gdGVzdAorICAgICAgICAgICAgIyBoZXJlLiAgVGhlIE1TIGRvY3MgYXJlbid0IGNsZWFyIGFib3V0IHdoZXRoZXIgdGhlIFNESworICAgICAgICAgICAgIyBQbGF5U291bmQoKSB3aXRoIFNORF9BTElBUyBhbmQgU05EX05PREVGQVVMVCB3aWxsIHJldHVybgorICAgICAgICAgICAgIyBUcnVlIG9yIEZhbHNlIHdoZW4gdGhlIGFsaWFzIGlzIHVua25vd24uICBPbiBUaW0ncyBXaW5YUAorICAgICAgICAgICAgIyBib3ggdG9kYXksIGl0IHJldHVybnMgVHJ1ZSAobm8gZXhjZXB0aW9uIGlzIHJhaXNlZCkuICBXaGF0CisgICAgICAgICAgICAjIHdlJ2QgcmVhbGx5IGxpa2UgdG8gdGVzdCBpcyB0aGF0IG5vIHNvdW5kIGlzIHBsYXllZCwgYnV0CisgICAgICAgICAgICAjIHRoYXQgcmVxdWlyZXMgZmlyc3Qgd2lyaW5nIGFuIGVhcmRydW0gY2xhc3MgaW50byB1bml0dGVzdAorICAgICAgICAgICAgIyA8d2luaz4uCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKAorICAgICAgICAgICAgICAgICAgICAnISIkJSYvKCMrKicsCisgICAgICAgICAgICAgICAgICAgIHdpbnNvdW5kLlNORF9BTElBUyB8IHdpbnNvdW5kLlNORF9OT0RFRkFVTFQKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICBleGNlcHQgUnVudGltZUVycm9yOgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAorICAgICAgICAgICAgICAgIFJ1bnRpbWVFcnJvciwKKyAgICAgICAgICAgICAgICB3aW5zb3VuZC5QbGF5U291bmQsCisgICAgICAgICAgICAgICAgJyEiJCUmLygjKyonLCB3aW5zb3VuZC5TTkRfQUxJQVMgfCB3aW5zb3VuZC5TTkRfTk9ERUZBVUxUCiAgICAgICAgICAgICApCi0gICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCiAKICAgICBkZWYgdGVzdF9zdG9wYXN5bmMoc2VsZik6Ci0gICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgKLSAgICAgICAgICAgICdTeXN0ZW1RdWVzdGlvbicsCi0gICAgICAgICAgICB3aW5zb3VuZC5TTkRfQUxJQVMgfCB3aW5zb3VuZC5TTkRfQVNZTkMgfCB3aW5zb3VuZC5TTkRfTE9PUAotICAgICAgICApCi0gICAgICAgIHRpbWUuc2xlZXAoMC41KQotICAgICAgICB0cnk6CisgICAgICAgIGlmIF9oYXZlX3NvdW5kY2FyZCgpOgogICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kKAogICAgICAgICAgICAgICAgICdTeXN0ZW1RdWVzdGlvbicsCi0gICAgICAgICAgICAgICAgd2luc291bmQuU05EX0FMSUFTIHwgd2luc291bmQuU05EX05PU1RPUAorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlNORF9BTElBUyB8IHdpbnNvdW5kLlNORF9BU1lOQyB8IHdpbnNvdW5kLlNORF9MT09QCiAgICAgICAgICAgICApCi0gICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6Ci0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsc2U6ICMgdGhlIGZpcnN0IHNvdW5kIG1pZ2h0IGFscmVhZHkgYmUgZmluaXNoZWQKLSAgICAgICAgICAgIHBhc3MKLSAgICAgICAgd2luc291bmQuUGxheVNvdW5kKE5vbmUsIHdpbnNvdW5kLlNORF9QVVJHRSkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMC41KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZCgKKyAgICAgICAgICAgICAgICAgICAgJ1N5c3RlbVF1ZXN0aW9uJywKKyAgICAgICAgICAgICAgICAgICAgd2luc291bmQuU05EX0FMSUFTIHwgd2luc291bmQuU05EX05PU1RPUAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIGV4Y2VwdCBSdW50aW1lRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZTogIyB0aGUgZmlyc3Qgc291bmQgbWlnaHQgYWxyZWFkeSBiZSBmaW5pc2hlZAorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgICAgIHdpbnNvdW5kLlBsYXlTb3VuZChOb25lLCB3aW5zb3VuZC5TTkRfUFVSR0UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmFzc2VydFJhaXNlcygKKyAgICAgICAgICAgICAgICBSdW50aW1lRXJyb3IsCisgICAgICAgICAgICAgICAgd2luc291bmQuUGxheVNvdW5kLAorICAgICAgICAgICAgICAgIE5vbmUsIHdpbnNvdW5kLlNORF9QVVJHRQorICAgICAgICAgICAgKQorCisKK2RlZiBfZ2V0X2NzY3JpcHRfcGF0aCgpOgorICAgICIiIlJldHVybiB0aGUgZnVsbCBwYXRoIHRvIGNzY3JpcHQuZXhlIG9yIE5vbmUuIiIiCisgICAgZm9yIGRpciBpbiBvcy5lbnZpcm9uLmdldCgiUEFUSCIsICIiKS5zcGxpdChvcy5wYXRoc2VwKToKKyAgICAgICAgY3NjcmlwdF9wYXRoID0gb3MucGF0aC5qb2luKGRpciwgImNzY3JpcHQuZXhlIikKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoY3NjcmlwdF9wYXRoKToKKyAgICAgICAgICAgIHJldHVybiBjc2NyaXB0X3BhdGgKKworX19oYXZlX3NvdW5kY2FyZF9jYWNoZSA9IE5vbmUKK2RlZiBfaGF2ZV9zb3VuZGNhcmQoKToKKyAgICAiIiJSZXR1cm4gVHJ1ZSBpZmYgdGhpcyBjb21wdXRlciBoYXMgYSBzb3VuZGNhcmQuIiIiCisgICAgZ2xvYmFsIF9faGF2ZV9zb3VuZGNhcmRfY2FjaGUKKyAgICBpZiBfX2hhdmVfc291bmRjYXJkX2NhY2hlIGlzIE5vbmU6CisgICAgICAgIGNzY3JpcHRfcGF0aCA9IF9nZXRfY3NjcmlwdF9wYXRoKCkKKyAgICAgICAgaWYgY3NjcmlwdF9wYXRoIGlzIE5vbmU6CisgICAgICAgICAgICAjIENvdWxkIG5vdCBmaW5kIGNzY3JpcHQuZXhlIHRvIHJ1biBvdXIgVkJTY3JpcHQgaGVscGVyLiBEZWZhdWx0CisgICAgICAgICAgICAjIHRvIFRydWU6IG1vc3QgY29tcHV0ZXJzIHRoZXNlIGRheXMgKmRvKiBoYXZlIGEgc291bmRjYXJkLgorICAgICAgICAgICAgcmV0dXJuIFRydWUKKworICAgICAgICBjaGVja19zY3JpcHQgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5kaXJuYW1lKF9fZmlsZV9fKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGVja19zb3VuZGNhcmQudmJzIikKKyAgICAgICAgcCA9IHN1YnByb2Nlc3MuUG9wZW4oW2NzY3JpcHRfcGF0aCwgY2hlY2tfc2NyaXB0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSkKKyAgICAgICAgX19oYXZlX3NvdW5kY2FyZF9jYWNoZSA9IG5vdCBwLndhaXQoKQorICAgIHJldHVybiBfX2hhdmVfc291bmRjYXJkX2NhY2hlCisKIAogZGVmIHRlc3RfbWFpbigpOgogICAgIHRlc3Rfc3VwcG9ydC5ydW5fdW5pdHRlc3QoQmVlcFRlc3QsIE1lc3NhZ2VCZWVwVGVzdCwgUGxheVNvdW5kVGVzdCkKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weSBiL0xpYi90ZXN0L3Rlc3Rfd2l0aC5weQppbmRleCA0ODU0NDM2Li40OGUwMGY0IDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X3dpdGgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF93aXRoLnB5CkBAIC00OTQsNiArNDk0LDYyIEBACiAgICAgICAgIHNlbGYuYXNzZXJ0QWZ0ZXJXaXRoR2VuZXJhdG9ySW52YXJpYW50c1dpdGhFcnJvcihzZWxmLmZvbykKICAgICAgICAgc2VsZi5hc3NlcnRBZnRlcldpdGhHZW5lcmF0b3JJbnZhcmlhbnRzTm9FcnJvcihzZWxmLmJhcikKIAorICAgIGRlZiB0ZXN0UmFpc2VkU3RvcEl0ZXJhdGlvbjEoc2VsZik6CisgICAgICAgIEBjb250ZXh0bWFuYWdlcgorICAgICAgICBkZWYgY20oKToKKyAgICAgICAgICAgIHlpZWxkCisKKyAgICAgICAgZGVmIHNob3VsZFRocm93KCk6CisgICAgICAgICAgICB3aXRoIGNtKCk6CisgICAgICAgICAgICAgICAgcmFpc2UgU3RvcEl0ZXJhdGlvbigiZnJvbSB3aXRoIikKKworICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTdG9wSXRlcmF0aW9uLCBzaG91bGRUaHJvdykKKworICAgIGRlZiB0ZXN0UmFpc2VkU3RvcEl0ZXJhdGlvbjIoc2VsZik6CisgICAgICAgIGNsYXNzIGNtIChvYmplY3QpOgorICAgICAgICAgICAgZGVmIF9fY29udGV4dF9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICAgICAgICAgIGRlZiBfX2VudGVyX18oc2VsZik6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgICAgICBkZWYgX19leGl0X18oc2VsZiwgdHlwZSwgdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgICAgICAgICAgcGFzcworCisgICAgICAgIGRlZiBzaG91bGRUaHJvdygpOgorICAgICAgICAgICAgd2l0aCBjbSgpOgorICAgICAgICAgICAgICAgIHJhaXNlIFN0b3BJdGVyYXRpb24oImZyb20gd2l0aCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgc2hvdWxkVGhyb3cpCisKKyAgICBkZWYgdGVzdFJhaXNlZEdlbmVyYXRvckV4aXQxKHNlbGYpOgorICAgICAgICBAY29udGV4dG1hbmFnZXIKKyAgICAgICAgZGVmIGNtKCk6CisgICAgICAgICAgICB5aWVsZAorCisgICAgICAgIGRlZiBzaG91bGRUaHJvdygpOgorICAgICAgICAgICAgd2l0aCBjbSgpOgorICAgICAgICAgICAgICAgIHJhaXNlIEdlbmVyYXRvckV4aXQoImZyb20gd2l0aCIpCisKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoR2VuZXJhdG9yRXhpdCwgc2hvdWxkVGhyb3cpCisKKyAgICBkZWYgdGVzdFJhaXNlZEdlbmVyYXRvckV4aXQyKHNlbGYpOgorICAgICAgICBjbGFzcyBjbSAob2JqZWN0KToKKyAgICAgICAgICAgIGRlZiBfX2NvbnRleHRfXyhzZWxmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZgorCisgICAgICAgICAgICBkZWYgX19lbnRlcl9fKHNlbGYpOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgZGVmIF9fZXhpdF9fKHNlbGYsIHR5cGUsIHZhbHVlLCB0cmFjZWJhY2spOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICBkZWYgc2hvdWxkVGhyb3coKToKKyAgICAgICAgICAgIHdpdGggY20oKToKKyAgICAgICAgICAgICAgICByYWlzZSBHZW5lcmF0b3JFeGl0KCJmcm9tIHdpdGgiKQorCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEdlbmVyYXRvckV4aXQsIHNob3VsZFRocm93KQorCiAKIGNsYXNzIE5vbkxvY2FsRmxvd0NvbnRyb2xUZXN0Q2FzZSh1bml0dGVzdC5UZXN0Q2FzZSk6CiAKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfeHJhbmdlLnB5IGIvTGliL3Rlc3QvdGVzdF94cmFuZ2UucHkKaW5kZXggNDA1OTBjZC4uYzBkMWRiZSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF94cmFuZ2UucHkKKysrIGIvTGliL3Rlc3QvdGVzdF94cmFuZ2UucHkKQEAgLTU3LDEyICs1Nyw3IEBACiAgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKE92ZXJmbG93RXJyb3IsIHhyYW5nZSwgMCwgMipzeXMubWF4aW50KQogCiAgICAgICAgIHIgPSB4cmFuZ2UoLXN5cy5tYXhpbnQsIHN5cy5tYXhpbnQsIDIpCi0gICAgICAgIGlmIHN5cy5tYXhpbnQgPiAweDdmZmZmZmZmOgotICAgICAgICAgICAgIyBYWFggcmFpc2luZyBWYWx1ZUVycm9yIGlzIGxlc3MgdGhhbiBpZGVhbCwgYnV0IHRoaXMgY2FuJ3QKLSAgICAgICAgICAgICMgYmUgZml4ZWQgdW50aWwgcmFuZ2VfbGVuZ3RoKCkgcmV0dXJucyBhIGxvbmcgaW4gcmFuZ2VvYmplY3QuYwotICAgICAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgbGVuLCByKQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ociksIHN5cy5tYXhpbnQpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHIpLCBzeXMubWF4aW50KQogICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhPdmVyZmxvd0Vycm9yLCB4cmFuZ2UsIC1zeXMubWF4aW50LTEsIHN5cy5tYXhpbnQsIDIpCiAKIGRlZiB0ZXN0X21haW4oKToKZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3RfemlwaW1wb3J0LnB5IGIvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkKaW5kZXggZWI3Y2JmNi4uNGUxYTg0NSAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkKKysrIGIvTGliL3Rlc3QvdGVzdF96aXBpbXBvcnQucHkKQEAgLTEyLDcgKzEyLDEyIEBACiBmcm9tIHRlc3QudGVzdF9pbXBvcnRob29rcyBpbXBvcnQgSW1wb3J0SG9va3NCYXNlVGVzdENhc2UsIHRlc3Rfc3JjLCB0ZXN0X2NvCiAKIGltcG9ydCB6aXBpbXBvcnQKLQoraW1wb3J0IGxpbmVjYWNoZQoraW1wb3J0IGRvY3Rlc3QKK2ltcG9ydCBpbnNwZWN0CitpbXBvcnQgU3RyaW5nSU8KK2Zyb20gdHJhY2ViYWNrIGltcG9ydCBleHRyYWN0X3RiLCBleHRyYWN0X3N0YWNrLCBwcmludF90YgorcmFpc2Vfc3JjID0gJ2RlZiBkb19yYWlzZSgpOiByYWlzZSBUeXBlRXJyb3JcbicKIAogIyBzbyB3ZSBvbmx5IHJ1biB0ZXN0QUZha2VabGliIG9uY2UgaWYgdGhpcyB0ZXN0IGlzIHJ1biByZXBlYXRlZGx5CiAjIHdoaWNoIGhhcHBlbnMgd2hlbiB3ZSBsb29rIGZvciByZWYgbGVha3MKQEAgLTU0LDcgKzU5LDggQEAKIAogICAgIGRlZiBzZXRVcChzZWxmKToKICAgICAgICAgIyBXZSdyZSByZXVzaW5nIHRoZSB6aXAgYXJjaGl2ZSBwYXRoLCBzbyB3ZSBtdXN0IGNsZWFyIHRoZQotICAgICAgICAjIGNhY2hlZCBkaXJlY3RvcnkgaW5mby4KKyAgICAgICAgIyBjYWNoZWQgZGlyZWN0b3J5IGluZm8gYW5kIGxpbmVjYWNoZQorICAgICAgICBsaW5lY2FjaGUuY2xlYXJjYWNoZSgpCiAgICAgICAgIHppcGltcG9ydC5femlwX2RpcmVjdG9yeV9jYWNoZS5jbGVhcigpCiAgICAgICAgIEltcG9ydEhvb2tzQmFzZVRlc3RDYXNlLnNldFVwKHNlbGYpCiAKQEAgLTgzLDYgKzg5LDExIEBACiAKICAgICAgICAgICAgIG1vZCA9IF9faW1wb3J0X18oIi4iLmpvaW4obW9kdWxlcyksIGdsb2JhbHMoKSwgbG9jYWxzKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiX19kdW1teV9fIl0pCisKKyAgICAgICAgICAgIGNhbGwgPSBrdy5nZXQoJ2NhbGwnKQorICAgICAgICAgICAgaWYgY2FsbCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBjYWxsKG1vZCkKKwogICAgICAgICAgICAgaWYgZXhwZWN0ZWRfZXh0OgogICAgICAgICAgICAgICAgIGZpbGUgPSBtb2QuZ2V0X2ZpbGUoKQogICAgICAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGZpbGUsIG9zLnBhdGguam9pbihURU1QX1pJUCwKQEAgLTI0OSw2ICsyNjAsNzQgQEAKICAgICAgICAgc2VsZi5kb1Rlc3QoIi5weSIsIGZpbGVzLCBURVNUTU9ELAogICAgICAgICAgICAgICAgICAgICBzdHVmZj0iU29tZSBTdHVmZiIqMzEpCiAKKyAgICBkZWYgYXNzZXJ0TW9kdWxlU291cmNlKHNlbGYsIG1vZHVsZSk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW5zcGVjdC5nZXRzb3VyY2UobW9kdWxlKSwgdGVzdF9zcmMpCisKKyAgICBkZWYgdGVzdEdldFNvdXJjZShzZWxmKToKKyAgICAgICAgZmlsZXMgPSB7VEVTVE1PRCArICIucHkiOiAoTk9XLCB0ZXN0X3NyYyl9CisgICAgICAgIHNlbGYuZG9UZXN0KCIucHkiLCBmaWxlcywgVEVTVE1PRCwgY2FsbD1zZWxmLmFzc2VydE1vZHVsZVNvdXJjZSkKKworICAgIGRlZiB0ZXN0R2V0Q29tcGlsZWRTb3VyY2Uoc2VsZik6CisgICAgICAgIHB5YyA9IG1ha2VfcHljKGNvbXBpbGUodGVzdF9zcmMsICI8Pz8/PiIsICJleGVjIiksIE5PVykKKyAgICAgICAgZmlsZXMgPSB7VEVTVE1PRCArICIucHkiOiAoTk9XLCB0ZXN0X3NyYyksCisgICAgICAgICAgICAgICAgIFRFU1RNT0QgKyBweWNfZXh0OiAoTk9XLCBweWMpfQorICAgICAgICBzZWxmLmRvVGVzdChweWNfZXh0LCBmaWxlcywgVEVTVE1PRCwgY2FsbD1zZWxmLmFzc2VydE1vZHVsZVNvdXJjZSkKKworICAgIGRlZiBydW5Eb2N0ZXN0KHNlbGYsIGNhbGxiYWNrKToKKyAgICAgICAgZmlsZXMgPSB7VEVTVE1PRCArICIucHkiOiAoTk9XLCB0ZXN0X3NyYyksCisgICAgICAgICAgICAgICAgICJ4eXoudHh0IjogKE5PVywgIj4+PiBsb2cuYXBwZW5kKFRydWUpXG4iKX0KKyAgICAgICAgc2VsZi5kb1Rlc3QoIi5weSIsIGZpbGVzLCBURVNUTU9ELCBjYWxsPWNhbGxiYWNrKQorCisgICAgZGVmIGRvRG9jdGVzdEZpbGUoc2VsZiwgbW9kdWxlKToKKyAgICAgICAgbG9nID0gW10KKyAgICAgICAgb2xkX21hc3RlciwgZG9jdGVzdC5tYXN0ZXIgPSBkb2N0ZXN0Lm1hc3RlciwgTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBkb2N0ZXN0LnRlc3RmaWxlKAorICAgICAgICAgICAgICAgICd4eXoudHh0JywgcGFja2FnZT1tb2R1bGUsIG1vZHVsZV9yZWxhdGl2ZT1UcnVlLAorICAgICAgICAgICAgICAgIGdsb2JzPWxvY2FscygpCisgICAgICAgICAgICApCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBkb2N0ZXN0Lm1hc3RlciA9IG9sZF9tYXN0ZXIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsb2csW1RydWVdKQorCisgICAgZGVmIHRlc3REb2N0ZXN0RmlsZShzZWxmKToKKyAgICAgICAgc2VsZi5ydW5Eb2N0ZXN0KHNlbGYuZG9Eb2N0ZXN0RmlsZSkKKworICAgIGRlZiBkb0RvY3Rlc3RTdWl0ZShzZWxmLCBtb2R1bGUpOgorICAgICAgICBsb2cgPSBbXQorICAgICAgICBkb2N0ZXN0LkRvY0ZpbGVUZXN0KAorICAgICAgICAgICAgJ3h5ei50eHQnLCBwYWNrYWdlPW1vZHVsZSwgbW9kdWxlX3JlbGF0aXZlPVRydWUsCisgICAgICAgICAgICBnbG9icz1sb2NhbHMoKQorICAgICAgICApLnJ1bigpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobG9nLFtUcnVlXSkKKworICAgIGRlZiB0ZXN0RG9jdGVzdFN1aXRlKHNlbGYpOgorICAgICAgICBzZWxmLnJ1bkRvY3Rlc3Qoc2VsZi5kb0RvY3Rlc3RTdWl0ZSkKKworCisgICAgZGVmIGRvVHJhY2ViYWNrKHNlbGYsIG1vZHVsZSk6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG1vZHVsZS5kb19yYWlzZSgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHRiID0gc3lzLmV4Y19pbmZvKClbMl0udGJfbmV4dAorCisgICAgICAgICAgICBmLGxubyxuLGxpbmUgPSBleHRyYWN0X3RiKHRiLCAxKVswXQorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaW5lLCByYWlzZV9zcmMuc3RyaXAoKSkKKworICAgICAgICAgICAgZixsbm8sbixsaW5lID0gZXh0cmFjdF9zdGFjayh0Yi50Yl9mcmFtZSwgMSlbMF0KKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGluZSwgcmFpc2Vfc3JjLnN0cmlwKCkpCisKKyAgICAgICAgICAgIHMgPSBTdHJpbmdJTy5TdHJpbmdJTygpCisgICAgICAgICAgICBwcmludF90Yih0YiwgMSwgcykKKyAgICAgICAgICAgIHNlbGYuZmFpbFVubGVzcyhzLmdldHZhbHVlKCkuZW5kc3dpdGgocmFpc2Vfc3JjKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIEFzc2VydGlvbkVycm9yKCJUaGlzIG91Z2h0IHRvIGJlIGltcG9zc2libGUiKQorCisgICAgZGVmIHRlc3RUcmFjZWJhY2soc2VsZik6CisgICAgICAgIGZpbGVzID0ge1RFU1RNT0QgKyAiLnB5IjogKE5PVywgcmFpc2Vfc3JjKX0KKyAgICAgICAgc2VsZi5kb1Rlc3QoTm9uZSwgZmlsZXMsIFRFU1RNT0QsIGNhbGw9c2VsZi5kb1RyYWNlYmFjaykKKworCiBjbGFzcyBDb21wcmVzc2VkWmlwSW1wb3J0VGVzdENhc2UoVW5jb21wcmVzc2VkWmlwSW1wb3J0VGVzdENhc2UpOgogICAgIGNvbXByZXNzaW9uID0gWklQX0RFRkxBVEVECiAKZGlmZiAtLWdpdCBhL0xpYi90b2tlbml6ZS5weSBiL0xpYi90b2tlbml6ZS5weQppbmRleCAyYjQwZTZmLi5hMzA3OTFjIDEwMDY0NAotLS0gYS9MaWIvdG9rZW5pemUucHkKKysrIGIvTGliL3Rva2VuaXplLnB5CkBAIC0xODIsNyArMTgyLDcgQEAKICAgICBmb3IgdG9rIGluIGl0ZXJhYmxlOgogICAgICAgICB0b2tudW0sIHRva3ZhbCA9IHRva1s6Ml0KIAotICAgICAgICBpZiB0b2tudW0gPT0gTkFNRToKKyAgICAgICAgaWYgdG9rbnVtIGluIChOQU1FLCBOVU1CRVIpOgogICAgICAgICAgICAgdG9rdmFsICs9ICcgJwogCiAgICAgICAgIGlmIHRva251bSA9PSBJTkRFTlQ6CmRpZmYgLS1naXQgYS9MaWIvdHJhY2ViYWNrLnB5IGIvTGliL3RyYWNlYmFjay5weQppbmRleCA5M2E2NGI3Li5hYmRhNDIyIDEwMDY0NAotLS0gYS9MaWIvdHJhY2ViYWNrLnB5CisrKyBiL0xpYi90cmFjZWJhY2sucHkKQEAgLTY2LDcgKzY2LDcgQEAKICAgICAgICAgX3ByaW50KGZpbGUsCiAgICAgICAgICAgICAgICAnICBGaWxlICIlcyIsIGxpbmUgJWQsIGluICVzJyAlIChmaWxlbmFtZSxsaW5lbm8sbmFtZSkpCiAgICAgICAgIGxpbmVjYWNoZS5jaGVja2NhY2hlKGZpbGVuYW1lKQotICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8sIGYuZl9nbG9iYWxzKQogICAgICAgICBpZiBsaW5lOiBfcHJpbnQoZmlsZSwgJyAgICAnICsgbGluZS5zdHJpcCgpKQogICAgICAgICB0YiA9IHRiLnRiX25leHQKICAgICAgICAgbiA9IG4rMQpAQCAtOTgsNyArOTgsNyBAQAogICAgICAgICBmaWxlbmFtZSA9IGNvLmNvX2ZpbGVuYW1lCiAgICAgICAgIG5hbWUgPSBjby5jb19uYW1lCiAgICAgICAgIGxpbmVjYWNoZS5jaGVja2NhY2hlKGZpbGVuYW1lKQotICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8sIGYuZl9nbG9iYWxzKQogICAgICAgICBpZiBsaW5lOiBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgIGVsc2U6IGxpbmUgPSBOb25lCiAgICAgICAgIGxpc3QuYXBwZW5kKChmaWxlbmFtZSwgbGluZW5vLCBuYW1lLCBsaW5lKSkKQEAgLTE1OCwxNCArMTU4LDE0IEBACiAgICAgIiIiCiAgICAgbGlzdCA9IFtdCiAgICAgaWYgKHR5cGUoZXR5cGUpID09IHR5cGVzLkNsYXNzVHlwZQotICAgICAgICBvciBpc3N1YmNsYXNzKGV0eXBlLCBFeGNlcHRpb24pKToKKyAgICAgICAgb3IgKGlzaW5zdGFuY2UoZXR5cGUsIHR5cGUpIGFuZCBpc3N1YmNsYXNzKGV0eXBlLCBFeGNlcHRpb24pKSk6CiAgICAgICAgIHN0eXBlID0gZXR5cGUuX19uYW1lX18KICAgICBlbHNlOgogICAgICAgICBzdHlwZSA9IGV0eXBlCiAgICAgaWYgdmFsdWUgaXMgTm9uZToKICAgICAgICAgbGlzdC5hcHBlbmQoc3RyKHN0eXBlKSArICdcbicpCiAgICAgZWxzZToKLSAgICAgICAgaWYgZXR5cGUgaXMgU3ludGF4RXJyb3I6CisgICAgICAgIGlmIGlzc3ViY2xhc3MoZXR5cGUsIFN5bnRheEVycm9yKToKICAgICAgICAgICAgIHRyeToKICAgICAgICAgICAgICAgICBtc2csIChmaWxlbmFtZSwgbGluZW5vLCBvZmZzZXQsIGxpbmUpID0gdmFsdWUKICAgICAgICAgICAgIGV4Y2VwdDoKQEAgLTI3OSw3ICsyNzksNyBAQAogICAgICAgICBmaWxlbmFtZSA9IGNvLmNvX2ZpbGVuYW1lCiAgICAgICAgIG5hbWUgPSBjby5jb19uYW1lCiAgICAgICAgIGxpbmVjYWNoZS5jaGVja2NhY2hlKGZpbGVuYW1lKQotICAgICAgICBsaW5lID0gbGluZWNhY2hlLmdldGxpbmUoZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgbGluZSA9IGxpbmVjYWNoZS5nZXRsaW5lKGZpbGVuYW1lLCBsaW5lbm8sIGYuZl9nbG9iYWxzKQogICAgICAgICBpZiBsaW5lOiBsaW5lID0gbGluZS5zdHJpcCgpCiAgICAgICAgIGVsc2U6IGxpbmUgPSBOb25lCiAgICAgICAgIGxpc3QuYXBwZW5kKChmaWxlbmFtZSwgbGluZW5vLCBuYW1lLCBsaW5lKSkKZGlmZiAtLWdpdCBhL0xpYi91cmxsaWIucHkgYi9MaWIvdXJsbGliLnB5CmluZGV4IDEzNmY0MmUuLmQ2NWMwYjAgMTAwNjQ0Ci0tLSBhL0xpYi91cmxsaWIucHkKKysrIGIvTGliL3VybGxpYi5weQpAQCAtNDQyLDkgKzQ0Miw5IEBACiAgICAgICAgIHJldHVybiBhZGRpbmZvdXJsKGZwLCBub2hlYWRlcnMoKSwgImdvcGhlcjoiICsgdXJsKQogCiAgICAgZGVmIG9wZW5fZmlsZShzZWxmLCB1cmwpOgorICAgICAgICAiIiJVc2UgbG9jYWwgZmlsZSBvciBGVFAgZGVwZW5kaW5nIG9uIGZvcm0gb2YgVVJMLiIiIgogICAgICAgICBpZiBub3QgaXNpbnN0YW5jZSh1cmwsIHN0cik6CiAgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAoJ2ZpbGUgZXJyb3InLCAncHJveHkgc3VwcG9ydCBmb3IgZmlsZSBwcm90b2NvbCBjdXJyZW50bHkgbm90IGltcGxlbWVudGVkJykKLSAgICAgICAgIiIiVXNlIGxvY2FsIGZpbGUgb3IgRlRQIGRlcGVuZGluZyBvbiBmb3JtIG9mIFVSTC4iIiIKICAgICAgICAgaWYgdXJsWzoyXSA9PSAnLy8nIGFuZCB1cmxbMjozXSAhPSAnLycgYW5kIHVybFsyOjEyXS5sb3dlcigpICE9ICdsb2NhbGhvc3QvJzoKICAgICAgICAgICAgIHJldHVybiBzZWxmLm9wZW5fZnRwKHVybCkKICAgICAgICAgZWxzZToKQEAgLTEwMzIsNyArMTAzMiw3IEBACiAgICAgZ2xvYmFsIF9ob3N0cHJvZwogICAgIGlmIF9ob3N0cHJvZyBpcyBOb25lOgogICAgICAgICBpbXBvcnQgcmUKLSAgICAgICAgX2hvc3Rwcm9nID0gcmUuY29tcGlsZSgnXi8vKFteL10qKSguKikkJykKKyAgICAgICAgX2hvc3Rwcm9nID0gcmUuY29tcGlsZSgnXi8vKFteLz9dKikoLiopJCcpCiAKICAgICBtYXRjaCA9IF9ob3N0cHJvZy5tYXRjaCh1cmwpCiAgICAgaWYgbWF0Y2g6IHJldHVybiBtYXRjaC5ncm91cCgxLCAyKQpkaWZmIC0tZ2l0IGEvTGliL3VybGxpYjIucHkgYi9MaWIvdXJsbGliMi5weQppbmRleCA0YzgzYmZjLi5lYzAxYzhmIDEwMDY0NAotLS0gYS9MaWIvdXJsbGliMi5weQorKysgYi9MaWIvdXJsbGliMi5weQpAQCAtMTQsNyArMTQsNyBAQAogSFRUUCAzMDEsIDMwMiwgMzAzIGFuZCAzMDcgcmVkaXJlY3QgZXJyb3JzLCBhbmQgdGhlIEhUVFBEaWdlc3RBdXRoSGFuZGxlcgogZGVhbHMgd2l0aCBkaWdlc3QgYXV0aGVudGljYXRpb24uCiAKLXVybG9wZW4odXJsLCBkYXRhPU5vbmUpIC0tIGJhc2ljIHVzYWdlIGlzIHRoYXQgc2FtZSBhcyBvcmlnaW5hbAordXJsb3Blbih1cmwsIGRhdGE9Tm9uZSkgLS0gYmFzaWMgdXNhZ2UgaXMgdGhlIHNhbWUgYXMgb3JpZ2luYWwKIHVybGxpYi4gIHBhc3MgdGhlIHVybCBhbmQgb3B0aW9uYWxseSBkYXRhIHRvIHBvc3QgdG8gYW4gSFRUUCBVUkwsIGFuZAogZ2V0IGEgZmlsZS1saWtlIG9iamVjdCBiYWNrLiAgT25lIGRpZmZlcmVuY2UgaXMgdGhhdCB5b3UgY2FuIGFsc28gcGFzcwogYSBSZXF1ZXN0IGluc3RhbmNlIGluc3RlYWQgb2YgVVJMLiAgUmFpc2VzIGEgVVJMRXJyb3IgKHN1YmNsYXNzIG9mCkBAIC03NywxNiArNzcsMTMgQEAKICMgdGhlIGhhbmRsZXIga25vd3MgdGhhdCB0aGUgcHJvYmxlbSB3YXMsIGUuZy4sIHRoYXQgaXQgZGlkbid0IGtub3cKICMgdGhhdCBoYXNoIGFsZ28gdGhhdCByZXF1ZXN0ZWQgaW4gdGhlIGNoYWxsZW5nZSwgaXQgd291bGQgYmUgZ29vZCB0bwogIyBwYXNzIHRoYXQgaW5mb3JtYXRpb24gYWxvbmcgdG8gdGhlIGNsaWVudCwgdG9vLgotCi0jIFhYWCB0byBkbzoKLSMgbmFtZSEKLSMgZG9jdW1lbnRhdGlvbiAoZ2V0dGluZyB0aGVyZSkKLSMgY29tcGxleCBwcm94aWVzCi0jIGFic3RyYWN0IGZhY3RvcnkgZm9yIG9wZW5lcgogIyBmdHAgZXJyb3JzIGFyZW4ndCBoYW5kbGVkIGNsZWFubHkKLSMgZ29waGVyIGNhbiByZXR1cm4gYSBzb2NrZXQuZXJyb3IKICMgY2hlY2sgZGlnZXN0IGFnYWluc3QgY29ycmVjdCAoaS5lLiBub24tYXBhY2hlKSBpbXBsZW1lbnRhdGlvbgogCisjIFBvc3NpYmxlIGV4dGVuc2lvbnM6CisjIGNvbXBsZXggcHJveGllcyAgWFhYIG5vdCBzdXJlIHdoYXQgZXhhY3RseSB3YXMgbWVhbnQgYnkgdGhpcworIyBhYnN0cmFjdCBmYWN0b3J5IGZvciBvcGVuZXIKKwogaW1wb3J0IGJhc2U2NAogaW1wb3J0IGZ0cGxpYgogaW1wb3J0IGh0dHBsaWIKQEAgLTExMSwxNSArMTA4LDE1IEBACiBleGNlcHQgSW1wb3J0RXJyb3I6CiAgICAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KIAotIyBub3Qgc3VyZSBob3cgbWFueSBvZiB0aGVzZSBuZWVkIHRvIGJlIGdvdHRlbiByaWQgb2YKLWZyb20gdXJsbGliIGltcG9ydCAodW53cmFwLCB1bnF1b3RlLCBzcGxpdHR5cGUsIHNwbGl0aG9zdCwKK2Zyb20gdXJsbGliIGltcG9ydCAodW53cmFwLCB1bnF1b3RlLCBzcGxpdHR5cGUsIHNwbGl0aG9zdCwgcXVvdGUsCiAgICAgIGFkZGluZm91cmwsIHNwbGl0cG9ydCwgc3BsaXRnb3BoZXJ0eXBlLCBzcGxpdHF1ZXJ5LAogICAgICBzcGxpdGF0dHIsIGZ0cHdyYXBwZXIsIG5vaGVhZGVycywgc3BsaXR1c2VyLCBzcGxpdHBhc3N3ZCwgc3BsaXR2YWx1ZSkKIAogIyBzdXBwb3J0IGZvciBGaWxlSGFuZGxlciwgcHJveGllcyB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzCiBmcm9tIHVybGxpYiBpbXBvcnQgbG9jYWxob3N0LCB1cmwycGF0aG5hbWUsIGdldHByb3hpZXMKIAotX192ZXJzaW9uX18gPSAiMi40IgorIyB1c2VkIGluIFVzZXItQWdlbnQgaGVhZGVyIHNlbnQKK19fdmVyc2lvbl9fID0gc3lzLnZlcnNpb25bOjNdCiAKIF9vcGVuZXIgPSBOb25lCiBkZWYgdXJsb3Blbih1cmwsIGRhdGE9Tm9uZSk6CkBAIC0zMzAsOCArMzI3LDkgQEAKICAgICAgICAgcGFzcwogCiAgICAgZGVmIF9jYWxsX2NoYWluKHNlbGYsIGNoYWluLCBraW5kLCBtZXRoX25hbWUsICphcmdzKToKLSAgICAgICAgIyBYWFggcmFpc2UgYW4gZXhjZXB0aW9uIGlmIG5vIG9uZSBlbHNlIHNob3VsZCB0cnkgdG8gaGFuZGxlCi0gICAgICAgICMgdGhpcyB1cmwuICByZXR1cm4gTm9uZSBpZiB5b3UgY2FuJ3QgYnV0IHNvbWVvbmUgZWxzZSBjb3VsZC4KKyAgICAgICAgIyBIYW5kbGVycyByYWlzZSBhbiBleGNlcHRpb24gaWYgbm8gb25lIGVsc2Ugc2hvdWxkIHRyeSB0byBoYW5kbGUKKyAgICAgICAgIyB0aGUgcmVxdWVzdCwgb3IgcmV0dXJuIE5vbmUgaWYgdGhleSBjYW4ndCBidXQgYW5vdGhlciBoYW5kbGVyCisgICAgICAgICMgY291bGQuICBPdGhlcndpc2UsIHRoZXkgcmV0dXJuIHRoZSByZXNwb25zZS4KICAgICAgICAgaGFuZGxlcnMgPSBjaGFpbi5nZXQoa2luZCwgKCkpCiAgICAgICAgIGZvciBoYW5kbGVyIGluIGhhbmRsZXJzOgogICAgICAgICAgICAgZnVuYyA9IGdldGF0dHIoaGFuZGxlciwgbWV0aF9uYW1lKQpAQCAtNTA3LDYgKzUwNSw4IEBACiAgICAgICAgICAgICAjIGZyb20gdGhlIHVzZXIgKG9mIHVybGxpYjIsIGluIHRoaXMgY2FzZSkuICBJbiBwcmFjdGljZSwKICAgICAgICAgICAgICMgZXNzZW50aWFsbHkgYWxsIGNsaWVudHMgZG8gcmVkaXJlY3QgaW4gdGhpcyBjYXNlLCBzbyB3ZQogICAgICAgICAgICAgIyBkbyB0aGUgc2FtZS4KKyAgICAgICAgICAgICMgYmUgY29uY2lsaWFudCB3aXRoIFVSSXMgY29udGFpbmluZyBhIHNwYWNlCisgICAgICAgICAgICBuZXd1cmwgPSBuZXd1cmwucmVwbGFjZSgnICcsICclMjAnKQogICAgICAgICAgICAgcmV0dXJuIFJlcXVlc3QobmV3dXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycz1yZXEuaGVhZGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbl9yZXFfaG9zdD1yZXEuZ2V0X29yaWdpbl9yZXFfaG9zdCgpLApAQCAtNTYxLDYgKzU2MSw4MCBAQAogICAgICAgICAgICAgICAibGVhZCB0byBhbiBpbmZpbml0ZSBsb29wLlxuIiBcCiAgICAgICAgICAgICAgICJUaGUgbGFzdCAzMHggZXJyb3IgbWVzc2FnZSB3YXM6XG4iCiAKKworZGVmIF9wYXJzZV9wcm94eShwcm94eSk6CisgICAgIiIiUmV0dXJuIChzY2hlbWUsIHVzZXIsIHBhc3N3b3JkLCBob3N0L3BvcnQpIGdpdmVuIGEgVVJMIG9yIGFuIGF1dGhvcml0eS4KKworICAgIElmIGEgVVJMIGlzIHN1cHBsaWVkLCBpdCBtdXN0IGhhdmUgYW4gYXV0aG9yaXR5IChob3N0OnBvcnQpIGNvbXBvbmVudC4KKyAgICBBY2NvcmRpbmcgdG8gUkZDIDM5ODYsIGhhdmluZyBhbiBhdXRob3JpdHkgY29tcG9uZW50IG1lYW5zIHRoZSBVUkwgbXVzdAorICAgIGhhdmUgdHdvIHNsYXNoZXMgYWZ0ZXIgdGhlIHNjaGVtZToKKworICAgID4+PiBfcGFyc2VfcHJveHkoJ2ZpbGU6L2Z0cC5leGFtcGxlLmNvbS8nKQorICAgIFRyYWNlYmFjayAobW9zdCByZWNlbnQgY2FsbCBsYXN0KToKKyAgICBWYWx1ZUVycm9yOiBwcm94eSBVUkwgd2l0aCBubyBhdXRob3JpdHk6ICdmaWxlOi9mdHAuZXhhbXBsZS5jb20vJworCisgICAgVGhlIGZpcnN0IHRocmVlIGl0ZW1zIG9mIHRoZSByZXR1cm5lZCB0dXBsZSBtYXkgYmUgTm9uZS4KKworICAgIEV4YW1wbGVzIG9mIGF1dGhvcml0eSBwYXJzaW5nOgorCisgICAgPj4+IF9wYXJzZV9wcm94eSgncHJveHkuZXhhbXBsZS5jb20nKQorICAgIChOb25lLCBOb25lLCBOb25lLCAncHJveHkuZXhhbXBsZS5jb20nKQorICAgID4+PiBfcGFyc2VfcHJveHkoJ3Byb3h5LmV4YW1wbGUuY29tOjMxMjgnKQorICAgIChOb25lLCBOb25lLCBOb25lLCAncHJveHkuZXhhbXBsZS5jb206MzEyOCcpCisKKyAgICBUaGUgYXV0aG9yaXR5IGNvbXBvbmVudCBtYXkgb3B0aW9uYWxseSBpbmNsdWRlIHVzZXJpbmZvIChhc3N1bWVkIHRvIGJlCisgICAgdXNlcm5hbWU6cGFzc3dvcmQpOgorCisgICAgPj4+IF9wYXJzZV9wcm94eSgnam9lOnBhc3N3b3JkQHByb3h5LmV4YW1wbGUuY29tJykKKyAgICAoTm9uZSwgJ2pvZScsICdwYXNzd29yZCcsICdwcm94eS5leGFtcGxlLmNvbScpCisgICAgPj4+IF9wYXJzZV9wcm94eSgnam9lOnBhc3N3b3JkQHByb3h5LmV4YW1wbGUuY29tOjMxMjgnKQorICAgIChOb25lLCAnam9lJywgJ3Bhc3N3b3JkJywgJ3Byb3h5LmV4YW1wbGUuY29tOjMxMjgnKQorCisgICAgU2FtZSBleGFtcGxlcywgYnV0IHdpdGggVVJMcyBpbnN0ZWFkOgorCisgICAgPj4+IF9wYXJzZV9wcm94eSgnaHR0cDovL3Byb3h5LmV4YW1wbGUuY29tLycpCisgICAgKCdodHRwJywgTm9uZSwgTm9uZSwgJ3Byb3h5LmV4YW1wbGUuY29tJykKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdodHRwOi8vcHJveHkuZXhhbXBsZS5jb206MzEyOC8nKQorICAgICgnaHR0cCcsIE5vbmUsIE5vbmUsICdwcm94eS5leGFtcGxlLmNvbTozMTI4JykKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdodHRwOi8vam9lOnBhc3N3b3JkQHByb3h5LmV4YW1wbGUuY29tLycpCisgICAgKCdodHRwJywgJ2pvZScsICdwYXNzd29yZCcsICdwcm94eS5leGFtcGxlLmNvbScpCisgICAgPj4+IF9wYXJzZV9wcm94eSgnaHR0cDovL2pvZTpwYXNzd29yZEBwcm94eS5leGFtcGxlLmNvbTozMTI4JykKKyAgICAoJ2h0dHAnLCAnam9lJywgJ3Bhc3N3b3JkJywgJ3Byb3h5LmV4YW1wbGUuY29tOjMxMjgnKQorCisgICAgRXZlcnl0aGluZyBhZnRlciB0aGUgYXV0aG9yaXR5IGlzIGlnbm9yZWQ6CisKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdmdHA6Ly9qb2U6cGFzc3dvcmRAcHJveHkuZXhhbXBsZS5jb20vcnViYmlzaDozMTI4JykKKyAgICAoJ2Z0cCcsICdqb2UnLCAncGFzc3dvcmQnLCAncHJveHkuZXhhbXBsZS5jb20nKQorCisgICAgVGVzdCBmb3Igbm8gdHJhaWxpbmcgJy8nIGNhc2U6CisKKyAgICA+Pj4gX3BhcnNlX3Byb3h5KCdodHRwOi8vam9lOnBhc3N3b3JkQHByb3h5LmV4YW1wbGUuY29tJykKKyAgICAoJ2h0dHAnLCAnam9lJywgJ3Bhc3N3b3JkJywgJ3Byb3h5LmV4YW1wbGUuY29tJykKKworICAgICIiIgorICAgIGZyb20gdXJscGFyc2UgaW1wb3J0IF9zcGxpdG5ldGxvYworICAgIHNjaGVtZSwgcl9zY2hlbWUgPSBzcGxpdHR5cGUocHJveHkpCisgICAgaWYgbm90IHJfc2NoZW1lLnN0YXJ0c3dpdGgoIi8iKToKKyAgICAgICAgIyBhdXRob3JpdHkKKyAgICAgICAgc2NoZW1lID0gTm9uZQorICAgICAgICBhdXRob3JpdHkgPSBwcm94eQorICAgIGVsc2U6CisgICAgICAgICMgVVJMCisgICAgICAgIGlmIG5vdCByX3NjaGVtZS5zdGFydHN3aXRoKCIvLyIpOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigicHJveHkgVVJMIHdpdGggbm8gYXV0aG9yaXR5OiAlciIgJSBwcm94eSkKKyAgICAgICAgIyBXZSBoYXZlIGFuIGF1dGhvcml0eSwgc28gZm9yIFJGQyAzOTg2LWNvbXBsaWFudCBVUkxzIChieSBzcyAzLgorICAgICAgICAjIGFuZCAzLjMuKSwgcGF0aCBpcyBlbXB0eSBvciBzdGFydHMgd2l0aCAnLycKKyAgICAgICAgZW5kID0gcl9zY2hlbWUuZmluZCgiLyIsIDIpCisgICAgICAgIGlmIGVuZCA9PSAtMToKKyAgICAgICAgICAgIGVuZCA9IE5vbmUKKyAgICAgICAgYXV0aG9yaXR5ID0gcl9zY2hlbWVbMjplbmRdCisgICAgdXNlcmluZm8sIGhvc3Rwb3J0ID0gc3BsaXR1c2VyKGF1dGhvcml0eSkKKyAgICBpZiB1c2VyaW5mbyBpcyBub3QgTm9uZToKKyAgICAgICAgdXNlciwgcGFzc3dvcmQgPSBzcGxpdHBhc3N3ZCh1c2VyaW5mbykKKyAgICBlbHNlOgorICAgICAgICB1c2VyID0gcGFzc3dvcmQgPSBOb25lCisgICAgcmV0dXJuIHNjaGVtZSwgdXNlciwgcGFzc3dvcmQsIGhvc3Rwb3J0CisKIGNsYXNzIFByb3h5SGFuZGxlcihCYXNlSGFuZGxlcik6CiAgICAgIyBQcm94aWVzIG11c3QgYmUgaW4gZnJvbnQKICAgICBoYW5kbGVyX29yZGVyID0gMTAwCkBAIC01NzcsNzYgKzY1MSwyNyBAQAogCiAgICAgZGVmIHByb3h5X29wZW4oc2VsZiwgcmVxLCBwcm94eSwgdHlwZSk6CiAgICAgICAgIG9yaWdfdHlwZSA9IHJlcS5nZXRfdHlwZSgpCi0gICAgICAgIHR5cGUsIHJfdHlwZSA9IHNwbGl0dHlwZShwcm94eSkKLSAgICAgICAgaWYgbm90IHR5cGUgb3Igcl90eXBlLmlzZGlnaXQoKToKLSAgICAgICAgICAgICMgcHJveHkgaXMgc3BlY2lmaWVkIHdpdGhvdXQgcHJvdG9jb2wKLSAgICAgICAgICAgIHR5cGUgPSBvcmlnX3R5cGUKLSAgICAgICAgICAgIGhvc3QgPSBwcm94eQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgaG9zdCwgcl9ob3N0ID0gc3BsaXRob3N0KHJfdHlwZSkKLSAgICAgICAgdXNlcl9wYXNzLCBob3N0ID0gc3BsaXR1c2VyKGhvc3QpCi0gICAgICAgIHVzZXIsIHBhc3N3b3JkID0gc3BsaXRwYXNzd2QodXNlcl9wYXNzKQorICAgICAgICBwcm94eV90eXBlLCB1c2VyLCBwYXNzd29yZCwgaG9zdHBvcnQgPSBfcGFyc2VfcHJveHkocHJveHkpCisgICAgICAgIGlmIHByb3h5X3R5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIHByb3h5X3R5cGUgPSBvcmlnX3R5cGUKICAgICAgICAgaWYgdXNlciBhbmQgcGFzc3dvcmQ6Ci0gICAgICAgICAgICB1c2VyLCBwYXNzd29yZCA9IHVzZXJfcGFzcy5zcGxpdCgnOicsIDEpCi0gICAgICAgICAgICB1c2VyX3Bhc3MgPSBiYXNlNjQuZW5jb2Rlc3RyaW5nKCclczolcycgJSAodW5xdW90ZSh1c2VyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5xdW90ZShwYXNzd29yZCkpKS5zdHJpcCgpCi0gICAgICAgICAgICByZXEuYWRkX2hlYWRlcignUHJveHktYXV0aG9yaXphdGlvbicsICdCYXNpYyAnICsgdXNlcl9wYXNzKQotICAgICAgICBob3N0ID0gdW5xdW90ZShob3N0KQotICAgICAgICByZXEuc2V0X3Byb3h5KGhvc3QsIHR5cGUpCi0gICAgICAgIGlmIG9yaWdfdHlwZSA9PSB0eXBlOgorICAgICAgICAgICAgdXNlcl9wYXNzID0gJyVzOiVzJyAlICh1bnF1b3RlKHVzZXIpLCB1bnF1b3RlKHBhc3N3b3JkKSkKKyAgICAgICAgICAgIGNyZWRzID0gYmFzZTY0LmVuY29kZXN0cmluZyh1c2VyX3Bhc3MpLnN0cmlwKCkKKyAgICAgICAgICAgIHJlcS5hZGRfaGVhZGVyKCdQcm94eS1hdXRob3JpemF0aW9uJywgJ0Jhc2ljICcgKyBjcmVkcykKKyAgICAgICAgaG9zdHBvcnQgPSB1bnF1b3RlKGhvc3Rwb3J0KQorICAgICAgICByZXEuc2V0X3Byb3h5KGhvc3Rwb3J0LCBwcm94eV90eXBlKQorICAgICAgICBpZiBvcmlnX3R5cGUgPT0gcHJveHlfdHlwZToKICAgICAgICAgICAgICMgbGV0IG90aGVyIGhhbmRsZXJzIHRha2UgY2FyZSBvZiBpdAotICAgICAgICAgICAgIyBYWFggdGhpcyBvbmx5IG1ha2VzIHNlbnNlIGlmIHRoZSBwcm94eSBpcyBiZWZvcmUgdGhlCi0gICAgICAgICAgICAjIG90aGVyIGhhbmRsZXJzCiAgICAgICAgICAgICByZXR1cm4gTm9uZQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgIyBuZWVkIHRvIHN0YXJ0IG92ZXIsIGJlY2F1c2UgdGhlIG90aGVyIGhhbmRsZXJzIGRvbid0CiAgICAgICAgICAgICAjIGdyb2sgdGhlIHByb3h5J3MgVVJMIHR5cGUKKyAgICAgICAgICAgICMgZS5nLiBpZiB3ZSBoYXZlIGEgY29uc3RydWN0b3IgYXJnIHByb3hpZXMgbGlrZSBzbzoKKyAgICAgICAgICAgICMgeydodHRwJzogJ2Z0cDovL3Byb3h5LmV4YW1wbGUuY29tJ30sIHdlIG1heSBlbmQgdXAgdHVybmluZworICAgICAgICAgICAgIyBhIHJlcXVlc3QgZm9yIGh0dHA6Ly9hY21lLmV4YW1wbGUuY29tL2EgaW50byBvbmUgZm9yCisgICAgICAgICAgICAjIGZ0cDovL3Byb3h5LmV4YW1wbGUuY29tL2EKICAgICAgICAgICAgIHJldHVybiBzZWxmLnBhcmVudC5vcGVuKHJlcSkKIAotIyBmZWF0dXJlIHN1Z2dlc3RlZCBieSBEdW5jYW4gQm9vdGgKLSMgWFhYIGN1c3RvbSBpcyBub3QgYSBnb29kIG5hbWUKLWNsYXNzIEN1c3RvbVByb3h5OgotICAgICMgZWl0aGVyIHBhc3MgYSBmdW5jdGlvbiB0byB0aGUgY29uc3RydWN0b3Igb3Igb3ZlcnJpZGUgaGFuZGxlCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIHByb3RvLCBmdW5jPU5vbmUsIHByb3h5X2FkZHI9Tm9uZSk6Ci0gICAgICAgIHNlbGYucHJvdG8gPSBwcm90bwotICAgICAgICBzZWxmLmZ1bmMgPSBmdW5jCi0gICAgICAgIHNlbGYuYWRkciA9IHByb3h5X2FkZHIKLQotICAgIGRlZiBoYW5kbGUoc2VsZiwgcmVxKToKLSAgICAgICAgaWYgc2VsZi5mdW5jIGFuZCBzZWxmLmZ1bmMocmVxKToKLSAgICAgICAgICAgIHJldHVybiAxCi0KLSAgICBkZWYgZ2V0X3Byb3h5KHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5hZGRyCi0KLWNsYXNzIEN1c3RvbVByb3h5SGFuZGxlcihCYXNlSGFuZGxlcik6Ci0gICAgIyBQcm94aWVzIG11c3QgYmUgaW4gZnJvbnQKLSAgICBoYW5kbGVyX29yZGVyID0gMTAwCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgKnByb3hpZXMpOgotICAgICAgICBzZWxmLnByb3hpZXMgPSB7fQotCi0gICAgZGVmIHByb3h5X29wZW4oc2VsZiwgcmVxKToKLSAgICAgICAgcHJvdG8gPSByZXEuZ2V0X3R5cGUoKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBwcm94aWVzID0gc2VsZi5wcm94aWVzW3Byb3RvXQotICAgICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgICAgICByZXR1cm4gTm9uZQotICAgICAgICBmb3IgcCBpbiBwcm94aWVzOgotICAgICAgICAgICAgaWYgcC5oYW5kbGUocmVxKToKLSAgICAgICAgICAgICAgICByZXEuc2V0X3Byb3h5KHAuZ2V0X3Byb3h5KCkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYucGFyZW50Lm9wZW4ocmVxKQotICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgZGVmIGRvX3Byb3h5KHNlbGYsIHAsIHJlcSk6Ci0gICAgICAgIHJldHVybiBzZWxmLnBhcmVudC5vcGVuKHJlcSkKLQotICAgIGRlZiBhZGRfcHJveHkoc2VsZiwgY3BvKToKLSAgICAgICAgaWYgY3BvLnByb3RvIGluIHNlbGYucHJveGllczoKLSAgICAgICAgICAgIHNlbGYucHJveGllc1tjcG8ucHJvdG9dLmFwcGVuZChjcG8pCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgICBzZWxmLnByb3hpZXNbY3BvLnByb3RvXSA9IFtjcG9dCi0KIGNsYXNzIEhUVFBQYXNzd29yZE1ncjoKICAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgIHNlbGYucGFzc3dkID0ge30KQEAgLTExMjgsOCArMTE1MywxMSBAQAogICAgIG5hbWVzID0gTm9uZQogICAgIGRlZiBnZXRfbmFtZXMoc2VsZik6CiAgICAgICAgIGlmIEZpbGVIYW5kbGVyLm5hbWVzIGlzIE5vbmU6Ci0gICAgICAgICAgICBGaWxlSGFuZGxlci5uYW1lcyA9IChzb2NrZXQuZ2V0aG9zdGJ5bmFtZSgnbG9jYWxob3N0JyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQuZ2V0aG9zdGJ5bmFtZShzb2NrZXQuZ2V0aG9zdG5hbWUoKSkpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgRmlsZUhhbmRsZXIubmFtZXMgPSAoc29ja2V0LmdldGhvc3RieW5hbWUoJ2xvY2FsaG9zdCcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0LmdldGhvc3RieW5hbWUoc29ja2V0LmdldGhvc3RuYW1lKCkpKQorICAgICAgICAgICAgZXhjZXB0IHNvY2tldC5nYWllcnJvcjoKKyAgICAgICAgICAgICAgICBGaWxlSGFuZGxlci5uYW1lcyA9IChzb2NrZXQuZ2V0aG9zdGJ5bmFtZSgnbG9jYWxob3N0JyksKQogICAgICAgICByZXR1cm4gRmlsZUhhbmRsZXIubmFtZXMKIAogICAgICMgbm90IGVudGlyZWx5IHN1cmUgd2hhdCB0aGUgcnVsZXMgYXJlIGhlcmUKQEAgLTEyNTgsNiArMTI4Niw3IEBACiAKIGNsYXNzIEdvcGhlckhhbmRsZXIoQmFzZUhhbmRsZXIpOgogICAgIGRlZiBnb3BoZXJfb3BlbihzZWxmLCByZXEpOgorICAgICAgICAjIFhYWCBjYW4gcmFpc2Ugc29ja2V0LmVycm9yCiAgICAgICAgIGltcG9ydCBnb3BoZXJsaWIgICMgdGhpcyByYWlzZXMgRGVwcmVjYXRpb25XYXJuaW5nIGluIDIuNQogICAgICAgICBob3N0ID0gcmVxLmdldF9ob3N0KCkKICAgICAgICAgaWYgbm90IGhvc3Q6CkBAIC0xMjczLDI1ICsxMzAyLDMgQEAKICAgICAgICAgZWxzZToKICAgICAgICAgICAgIGZwID0gZ29waGVybGliLnNlbmRfc2VsZWN0b3Ioc2VsZWN0b3IsIGhvc3QpCiAgICAgICAgIHJldHVybiBhZGRpbmZvdXJsKGZwLCBub2hlYWRlcnMoKSwgcmVxLmdldF9mdWxsX3VybCgpKQotCi0jYmxlY2shIGRvbid0IHVzZSB0aGlzIHlldAotY2xhc3MgT3BlbmVyRmFjdG9yeToKLQotICAgIGRlZmF1bHRfaGFuZGxlcnMgPSBbVW5rbm93bkhhbmRsZXIsIEhUVFBIYW5kbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgSFRUUERlZmF1bHRFcnJvckhhbmRsZXIsIEhUVFBSZWRpcmVjdEhhbmRsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBGVFBIYW5kbGVyLCBGaWxlSGFuZGxlcl0KLSAgICBoYW5kbGVycyA9IFtdCi0gICAgcmVwbGFjZW1lbnRfaGFuZGxlcnMgPSBbXQotCi0gICAgZGVmIGFkZF9oYW5kbGVyKHNlbGYsIGgpOgotICAgICAgICBzZWxmLmhhbmRsZXJzID0gc2VsZi5oYW5kbGVycyArIFtoXQotCi0gICAgZGVmIHJlcGxhY2VfaGFuZGxlcihzZWxmLCBoKToKLSAgICAgICAgcGFzcwotCi0gICAgZGVmIGJ1aWxkX29wZW5lcihzZWxmKToKLSAgICAgICAgb3BlbmVyID0gT3BlbmVyRGlyZWN0b3IoKQotICAgICAgICBmb3IgcGggaW4gc2VsZi5kZWZhdWx0X2hhbmRsZXJzOgotICAgICAgICAgICAgaWYgaW5zcGVjdC5pc2NsYXNzKHBoKToKLSAgICAgICAgICAgICAgICBwaCA9IHBoKCkKLSAgICAgICAgICAgIG9wZW5lci5hZGRfaGFuZGxlcihwaCkKZGlmZiAtLWdpdCBhL0xpYi91cmxwYXJzZS5weSBiL0xpYi91cmxwYXJzZS5weQppbmRleCA4Yjc1MDUxLi5lYWRlMDQwIDEwMDY0NAotLS0gYS9MaWIvdXJscGFyc2UucHkKKysrIGIvTGliL3VybHBhcnNlLnB5CkBAIC0xNiwxMiArMTYsMTIgQEAKICAgICAgICAgICAgICAgICdzbmV3cycsICdwcm9zcGVybycsICdydHNwJywgJ3J0c3B1JywgJ3JzeW5jJywgJycsCiAgICAgICAgICAgICAgICAnc3ZuJywgJ3N2bitzc2gnLCAnc2Z0cCddCiBub25faGllcmFyY2hpY2FsID0gWydnb3BoZXInLCAnaGRsJywgJ21haWx0bycsICduZXdzJywKLSAgICAgICAgICAgICAgICAgICAgJ3RlbG5ldCcsICd3YWlzJywgJ2ltYXAnLCAnc25ld3MnLCAnc2lwJ10KKyAgICAgICAgICAgICAgICAgICAgJ3RlbG5ldCcsICd3YWlzJywgJ2ltYXAnLCAnc25ld3MnLCAnc2lwJywgJ3NpcHMnXQogdXNlc19wYXJhbXMgPSBbJ2Z0cCcsICdoZGwnLCAncHJvc3Blcm8nLCAnaHR0cCcsICdpbWFwJywKLSAgICAgICAgICAgICAgICdodHRwcycsICdzaHR0cCcsICdydHNwJywgJ3J0c3B1JywgJ3NpcCcsCisgICAgICAgICAgICAgICAnaHR0cHMnLCAnc2h0dHAnLCAncnRzcCcsICdydHNwdScsICdzaXAnLCAnc2lwcycsCiAgICAgICAgICAgICAgICAnbW1zJywgJycsICdzZnRwJ10KIHVzZXNfcXVlcnkgPSBbJ2h0dHAnLCAnd2FpcycsICdpbWFwJywgJ2h0dHBzJywgJ3NodHRwJywgJ21tcycsCi0gICAgICAgICAgICAgICdnb3BoZXInLCAncnRzcCcsICdydHNwdScsICdzaXAnLCAnJ10KKyAgICAgICAgICAgICAgJ2dvcGhlcicsICdydHNwJywgJ3J0c3B1JywgJ3NpcCcsICdzaXBzJywgJyddCiB1c2VzX2ZyYWdtZW50ID0gWydmdHAnLCAnaGRsJywgJ2h0dHAnLCAnZ29waGVyJywgJ25ld3MnLAogICAgICAgICAgICAgICAgICAnbm50cCcsICd3YWlzJywgJ2h0dHBzJywgJ3NodHRwJywgJ3NuZXdzJywKICAgICAgICAgICAgICAgICAgJ2ZpbGUnLCAncHJvc3Blcm8nLCAnJ10KQEAgLTQxLDcgKzQxLDExMSBAQAogICAgIF9wYXJzZV9jYWNoZSA9IHt9CiAKIAotZGVmIHVybHBhcnNlKHVybCwgc2NoZW1lPScnLCBhbGxvd19mcmFnbWVudHM9MSk6CitjbGFzcyBCYXNlUmVzdWx0KHR1cGxlKToKKyAgICAiIiJCYXNlIGNsYXNzIGZvciB0aGUgcGFyc2VkIHJlc3VsdCBvYmplY3RzLgorCisgICAgVGhpcyBwcm92aWRlcyB0aGUgYXR0cmlidXRlcyBzaGFyZWQgYnkgdGhlIHR3byBkZXJpdmVkIHJlc3VsdAorICAgIG9iamVjdHMgYXMgcmVhZC1vbmx5IHByb3BlcnRpZXMuICBUaGUgZGVyaXZlZCBjbGFzc2VzIGFyZQorICAgIHJlc3BvbnNpYmxlIGZvciBjaGVja2luZyB0aGUgcmlnaHQgbnVtYmVyIG9mIGFyZ3VtZW50cyB3ZXJlCisgICAgc3VwcGxpZWQgdG8gdGhlIGNvbnN0cnVjdG9yLgorCisgICAgIiIiCisKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgIyBBdHRyaWJ1dGVzIHRoYXQgYWNjZXNzIHRoZSBiYXNpYyBjb21wb25lbnRzIG9mIHRoZSBVUkw6CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgc2NoZW1lKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZlswXQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIG5ldGxvYyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGZbMV0KKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwYXRoKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZlsyXQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHF1ZXJ5KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZlstMl0KKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBmcmFnbWVudChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGZbLTFdCisKKyAgICAjIEFkZGl0aW9uYWwgYXR0cmlidXRlcyB0aGF0IHByb3ZpZGUgYWNjZXNzIHRvIHBhcnNlZC1vdXQgcG9ydGlvbnMKKyAgICAjIG9mIHRoZSBuZXRsb2M6CisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgdXNlcm5hbWUoc2VsZik6CisgICAgICAgIG5ldGxvYyA9IHNlbGYubmV0bG9jCisgICAgICAgIGlmICJAIiBpbiBuZXRsb2M6CisgICAgICAgICAgICB1c2VyaW5mbyA9IG5ldGxvYy5zcGxpdCgiQCIsIDEpWzBdCisgICAgICAgICAgICBpZiAiOiIgaW4gdXNlcmluZm86CisgICAgICAgICAgICAgICAgdXNlcmluZm8gPSB1c2VyaW5mby5zcGxpdCgiOiIsIDEpWzBdCisgICAgICAgICAgICByZXR1cm4gdXNlcmluZm8KKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIEBwcm9wZXJ0eQorICAgIGRlZiBwYXNzd29yZChzZWxmKToKKyAgICAgICAgbmV0bG9jID0gc2VsZi5uZXRsb2MKKyAgICAgICAgaWYgIkAiIGluIG5ldGxvYzoKKyAgICAgICAgICAgIHVzZXJpbmZvID0gbmV0bG9jLnNwbGl0KCJAIiwgMSlbMF0KKyAgICAgICAgICAgIGlmICI6IiBpbiB1c2VyaW5mbzoKKyAgICAgICAgICAgICAgICByZXR1cm4gdXNlcmluZm8uc3BsaXQoIjoiLCAxKVsxXQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGhvc3RuYW1lKHNlbGYpOgorICAgICAgICBuZXRsb2MgPSBzZWxmLm5ldGxvYworICAgICAgICBpZiAiQCIgaW4gbmV0bG9jOgorICAgICAgICAgICAgbmV0bG9jID0gbmV0bG9jLnNwbGl0KCJAIiwgMSlbMV0KKyAgICAgICAgaWYgIjoiIGluIG5ldGxvYzoKKyAgICAgICAgICAgIG5ldGxvYyA9IG5ldGxvYy5zcGxpdCgiOiIsIDEpWzBdCisgICAgICAgIHJldHVybiBuZXRsb2MubG93ZXIoKSBvciBOb25lCisKKyAgICBAcHJvcGVydHkKKyAgICBkZWYgcG9ydChzZWxmKToKKyAgICAgICAgbmV0bG9jID0gc2VsZi5uZXRsb2MKKyAgICAgICAgaWYgIkAiIGluIG5ldGxvYzoKKyAgICAgICAgICAgIG5ldGxvYyA9IG5ldGxvYy5zcGxpdCgiQCIsIDEpWzFdCisgICAgICAgIGlmICI6IiBpbiBuZXRsb2M6CisgICAgICAgICAgICBwb3J0ID0gbmV0bG9jLnNwbGl0KCI6IiwgMSlbMV0KKyAgICAgICAgICAgIHJldHVybiBpbnQocG9ydCwgMTApCisgICAgICAgIHJldHVybiBOb25lCisKKworY2xhc3MgU3BsaXRSZXN1bHQoQmFzZVJlc3VsdCk6CisKKyAgICBfX3Nsb3RzX18gPSAoKQorCisgICAgZGVmIF9fbmV3X18oY2xzLCBzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIGZyYWdtZW50KToKKyAgICAgICAgcmV0dXJuIEJhc2VSZXN1bHQuX19uZXdfXygKKyAgICAgICAgICAgIGNscywgKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBxdWVyeSwgZnJhZ21lbnQpKQorCisgICAgZGVmIGdldHVybChzZWxmKToKKyAgICAgICAgcmV0dXJuIHVybHVuc3BsaXQoc2VsZikKKworCitjbGFzcyBQYXJzZVJlc3VsdChCYXNlUmVzdWx0KToKKworICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBkZWYgX19uZXdfXyhjbHMsIHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCk6CisgICAgICAgIHJldHVybiBCYXNlUmVzdWx0Ll9fbmV3X18oCisgICAgICAgICAgICBjbHMsIChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQpKQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIHBhcmFtcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGZbM10KKworICAgIGRlZiBnZXR1cmwoc2VsZik6CisgICAgICAgIHJldHVybiB1cmx1bnBhcnNlKHNlbGYpCisKKworZGVmIHVybHBhcnNlKHVybCwgc2NoZW1lPScnLCBhbGxvd19mcmFnbWVudHM9VHJ1ZSk6CiAgICAgIiIiUGFyc2UgYSBVUkwgaW50byA2IGNvbXBvbmVudHM6CiAgICAgPHNjaGVtZT46Ly88bmV0bG9jPi88cGF0aD47PHBhcmFtcz4/PHF1ZXJ5PiM8ZnJhZ21lbnQ+CiAgICAgUmV0dXJuIGEgNi10dXBsZTogKHNjaGVtZSwgbmV0bG9jLCBwYXRoLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCkuCkBAIC01Myw3ICsxNTcsNyBAQAogICAgICAgICB1cmwsIHBhcmFtcyA9IF9zcGxpdHBhcmFtcyh1cmwpCiAgICAgZWxzZToKICAgICAgICAgcGFyYW1zID0gJycKLSAgICByZXR1cm4gc2NoZW1lLCBuZXRsb2MsIHVybCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQKKyAgICByZXR1cm4gUGFyc2VSZXN1bHQoc2NoZW1lLCBuZXRsb2MsIHVybCwgcGFyYW1zLCBxdWVyeSwgZnJhZ21lbnQpCiAKIGRlZiBfc3BsaXRwYXJhbXModXJsKToKICAgICBpZiAnLycgIGluIHVybDoKQEAgLTczLDEyICsxNzcsMTMgQEAKICAgICAgICAgZGVsaW0gPSBsZW4odXJsKQogICAgIHJldHVybiB1cmxbc3RhcnQ6ZGVsaW1dLCB1cmxbZGVsaW06XQogCi1kZWYgdXJsc3BsaXQodXJsLCBzY2hlbWU9JycsIGFsbG93X2ZyYWdtZW50cz0xKToKK2RlZiB1cmxzcGxpdCh1cmwsIHNjaGVtZT0nJywgYWxsb3dfZnJhZ21lbnRzPVRydWUpOgogICAgICIiIlBhcnNlIGEgVVJMIGludG8gNSBjb21wb25lbnRzOgogICAgIDxzY2hlbWU+Oi8vPG5ldGxvYz4vPHBhdGg+PzxxdWVyeT4jPGZyYWdtZW50PgogICAgIFJldHVybiBhIDUtdHVwbGU6IChzY2hlbWUsIG5ldGxvYywgcGF0aCwgcXVlcnksIGZyYWdtZW50KS4KICAgICBOb3RlIHRoYXQgd2UgZG9uJ3QgYnJlYWsgdGhlIGNvbXBvbmVudHMgdXAgaW4gc21hbGxlciBiaXRzCiAgICAgKGUuZy4gbmV0bG9jIGlzIGEgc2luZ2xlIHN0cmluZykgYW5kIHdlIGRvbid0IGV4cGFuZCAlIGVzY2FwZXMuIiIiCisgICAgYWxsb3dfZnJhZ21lbnRzID0gYm9vbChhbGxvd19mcmFnbWVudHMpCiAgICAga2V5ID0gdXJsLCBzY2hlbWUsIGFsbG93X2ZyYWdtZW50cwogICAgIGNhY2hlZCA9IF9wYXJzZV9jYWNoZS5nZXQoa2V5LCBOb25lKQogICAgIGlmIGNhY2hlZDoKQEAgLTk3LDkgKzIwMiw5IEBACiAgICAgICAgICAgICAgICAgdXJsLCBmcmFnbWVudCA9IHVybC5zcGxpdCgnIycsIDEpCiAgICAgICAgICAgICBpZiAnPycgaW4gdXJsOgogICAgICAgICAgICAgICAgIHVybCwgcXVlcnkgPSB1cmwuc3BsaXQoJz8nLCAxKQotICAgICAgICAgICAgdHVwbGUgPSBzY2hlbWUsIG5ldGxvYywgdXJsLCBxdWVyeSwgZnJhZ21lbnQKLSAgICAgICAgICAgIF9wYXJzZV9jYWNoZVtrZXldID0gdHVwbGUKLSAgICAgICAgICAgIHJldHVybiB0dXBsZQorICAgICAgICAgICAgdiA9IFNwbGl0UmVzdWx0KHNjaGVtZSwgbmV0bG9jLCB1cmwsIHF1ZXJ5LCBmcmFnbWVudCkKKyAgICAgICAgICAgIF9wYXJzZV9jYWNoZVtrZXldID0gdgorICAgICAgICAgICAgcmV0dXJuIHYKICAgICAgICAgZm9yIGMgaW4gdXJsWzppXToKICAgICAgICAgICAgIGlmIGMgbm90IGluIHNjaGVtZV9jaGFyczoKICAgICAgICAgICAgICAgICBicmVhawpAQCAtMTExLDkgKzIxNiw5IEBACiAgICAgICAgIHVybCwgZnJhZ21lbnQgPSB1cmwuc3BsaXQoJyMnLCAxKQogICAgIGlmIHNjaGVtZSBpbiB1c2VzX3F1ZXJ5IGFuZCAnPycgaW4gdXJsOgogICAgICAgICB1cmwsIHF1ZXJ5ID0gdXJsLnNwbGl0KCc/JywgMSkKLSAgICB0dXBsZSA9IHNjaGVtZSwgbmV0bG9jLCB1cmwsIHF1ZXJ5LCBmcmFnbWVudAotICAgIF9wYXJzZV9jYWNoZVtrZXldID0gdHVwbGUKLSAgICByZXR1cm4gdHVwbGUKKyAgICB2ID0gU3BsaXRSZXN1bHQoc2NoZW1lLCBuZXRsb2MsIHVybCwgcXVlcnksIGZyYWdtZW50KQorICAgIF9wYXJzZV9jYWNoZVtrZXldID0gdgorICAgIHJldHVybiB2CiAKIGRlZiB1cmx1bnBhcnNlKChzY2hlbWUsIG5ldGxvYywgdXJsLCBwYXJhbXMsIHF1ZXJ5LCBmcmFnbWVudCkpOgogICAgICIiIlB1dCBhIHBhcnNlZCBVUkwgYmFjayB0b2dldGhlciBhZ2Fpbi4gIFRoaXMgbWF5IHJlc3VsdCBpbiBhCkBAIC0xMzYsNyArMjQxLDcgQEAKICAgICAgICAgdXJsID0gdXJsICsgJyMnICsgZnJhZ21lbnQKICAgICByZXR1cm4gdXJsCiAKLWRlZiB1cmxqb2luKGJhc2UsIHVybCwgYWxsb3dfZnJhZ21lbnRzID0gMSk6CitkZWYgdXJsam9pbihiYXNlLCB1cmwsIGFsbG93X2ZyYWdtZW50cz1UcnVlKToKICAgICAiIiJKb2luIGEgYmFzZSBVUkwgYW5kIGEgcG9zc2libHkgcmVsYXRpdmUgVVJMIHRvIGZvcm0gYW4gYWJzb2x1dGUKICAgICBpbnRlcnByZXRhdGlvbiBvZiB0aGUgbGF0dGVyLiIiIgogICAgIGlmIG5vdCBiYXNlOgpkaWZmIC0tZ2l0IGEvTGliL3V1LnB5IGIvTGliL3V1LnB5CmluZGV4IDQwZThiZjAuLjNjY2VkYjAgMTAwNzU1Ci0tLSBhL0xpYi91dS5weQorKysgYi9MaWIvdXUucHkKQEAgLTEzMiw3ICsxMzIsNyBAQAogICAgICAgICAgICAgZGF0YSA9IGJpbmFzY2lpLmEyYl91dShzKQogICAgICAgICBleGNlcHQgYmluYXNjaWkuRXJyb3IsIHY6CiAgICAgICAgICAgICAjIFdvcmthcm91bmQgZm9yIGJyb2tlbiB1dWVuY29kZXJzIGJ5IC9GcmVkcmlrIEx1bmRoCi0gICAgICAgICAgICBuYnl0ZXMgPSAoKChvcmQoc1swXSktMzIpICYgNjMpICogNCArIDUpIC8gMworICAgICAgICAgICAgbmJ5dGVzID0gKCgob3JkKHNbMF0pLTMyKSAmIDYzKSAqIDQgKyA1KSAvLyAzCiAgICAgICAgICAgICBkYXRhID0gYmluYXNjaWkuYTJiX3V1KHNbOm5ieXRlc10pCiAgICAgICAgICAgICBpZiBub3QgcXVpZXQ6CiAgICAgICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiV2FybmluZzogJXNcbiIgJSB2KQpAQCAtMTUxLDcgKzE1MSw3IEBACiAKICAgICAob3B0aW9ucywgYXJncykgPSBwYXJzZXIucGFyc2VfYXJncygpCiAgICAgaWYgbGVuKGFyZ3MpID4gMjoKLSAgICAgICAgcC5lcnJvcignaW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMnKQorICAgICAgICBwYXJzZXIuZXJyb3IoJ2luY29ycmVjdCBudW1iZXIgb2YgYXJndW1lbnRzJykKICAgICAgICAgc3lzLmV4aXQoMSkKIAogICAgIGlucHV0ID0gc3lzLnN0ZGluCmRpZmYgLS1naXQgYS9MaWIvd2FybmluZ3MucHkgYi9MaWIvd2FybmluZ3MucHkKaW5kZXggZTYyMmI5YS4uYmMwYjgxOCAxMDA2NDQKLS0tIGEvTGliL3dhcm5pbmdzLnB5CisrKyBiL0xpYi93YXJuaW5ncy5weQpAQCAtNTgsMTAgKzU4LDExIEBACiAgICAgICAgIGlmIG5vdCBmaWxlbmFtZToKICAgICAgICAgICAgIGZpbGVuYW1lID0gbW9kdWxlCiAgICAgcmVnaXN0cnkgPSBnbG9iYWxzLnNldGRlZmF1bHQoIl9fd2FybmluZ3JlZ2lzdHJ5X18iLCB7fSkKLSAgICB3YXJuX2V4cGxpY2l0KG1lc3NhZ2UsIGNhdGVnb3J5LCBmaWxlbmFtZSwgbGluZW5vLCBtb2R1bGUsIHJlZ2lzdHJ5KQorICAgIHdhcm5fZXhwbGljaXQobWVzc2FnZSwgY2F0ZWdvcnksIGZpbGVuYW1lLCBsaW5lbm8sIG1vZHVsZSwgcmVnaXN0cnksCisgICAgICAgICAgICAgICAgICBnbG9iYWxzKQogCiBkZWYgd2Fybl9leHBsaWNpdChtZXNzYWdlLCBjYXRlZ29yeSwgZmlsZW5hbWUsIGxpbmVubywKLSAgICAgICAgICAgICAgICAgIG1vZHVsZT1Ob25lLCByZWdpc3RyeT1Ob25lKToKKyAgICAgICAgICAgICAgICAgIG1vZHVsZT1Ob25lLCByZWdpc3RyeT1Ob25lLCBtb2R1bGVfZ2xvYmFscz1Ob25lKToKICAgICBpZiBtb2R1bGUgaXMgTm9uZToKICAgICAgICAgbW9kdWxlID0gZmlsZW5hbWUgb3IgIjx1bmtub3duPiIKICAgICAgICAgaWYgbW9kdWxlWy0zOl0ubG93ZXIoKSA9PSAiLnB5IjoKQEAgLTkyLDYgKzkzLDExIEBACiAgICAgaWYgYWN0aW9uID09ICJpZ25vcmUiOgogICAgICAgICByZWdpc3RyeVtrZXldID0gMQogICAgICAgICByZXR1cm4KKworICAgICMgUHJpbWUgdGhlIGxpbmVjYWNoZSBmb3IgZm9ybWF0dGluZywgaW4gY2FzZSB0aGUKKyAgICAjICJmaWxlIiBpcyBhY3R1YWxseSBpbiBhIHppcGZpbGUgb3Igc29tZXRoaW5nLgorICAgIGxpbmVjYWNoZS5nZXRsaW5lcyhmaWxlbmFtZSwgbW9kdWxlX2dsb2JhbHMpCisKICAgICBpZiBhY3Rpb24gPT0gImVycm9yIjoKICAgICAgICAgcmFpc2UgbWVzc2FnZQogICAgICMgT3RoZXIgYWN0aW9ucwpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL2V4cGF0YnVpbGRlci5weSBiL0xpYi94bWxjb3JlL2RvbS9leHBhdGJ1aWxkZXIucHkKaW5kZXggODFkOWMyYi4uMzJmZmE0MSAxMDA2NDQKLS0tIGEvTGliL3htbGNvcmUvZG9tL2V4cGF0YnVpbGRlci5weQorKysgYi9MaWIveG1sY29yZS9kb20vZXhwYXRidWlsZGVyLnB5CkBAIC01OSw3ICs1OSw3IEBACiAgICAgIk5NVE9LRU5TIjogbWluaWRvbS5UeXBlSW5mbyhOb25lLCAibm10b2tlbnMiKSwKICAgICB9CiAKLWNsYXNzIEVsZW1lbnRJbmZvKE5ld1N0eWxlKToKK2NsYXNzIEVsZW1lbnRJbmZvKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gJ19hdHRyX2luZm8nLCAnX21vZGVsJywgJ3RhZ05hbWUnCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgdGFnTmFtZSwgbW9kZWw9Tm9uZSk6CkBAIC00NjAsNyArNDYwLDcgQEAKICMgd2hlcmUgYWxsb3dlZC4KIF9BTExPV0VEX0ZJTFRFUl9SRVRVUk5TID0gKEZJTFRFUl9BQ0NFUFQsIEZJTFRFUl9SRUpFQ1QsIEZJTFRFUl9TS0lQKQogCi1jbGFzcyBGaWx0ZXJWaXNpYmlsaXR5Q29udHJvbGxlcihOZXdTdHlsZSk6CitjbGFzcyBGaWx0ZXJWaXNpYmlsaXR5Q29udHJvbGxlcihvYmplY3QpOgogICAgICIiIldyYXBwZXIgYXJvdW5kIGEgRE9NQnVpbGRlckZpbHRlciB3aGljaCBpbXBsZW1lbnRzIHRoZSBjaGVja3MKICAgICB0byBtYWtlIHRoZSB3aGF0VG9TaG93IGZpbHRlciBhdHRyaWJ1dGUgd29yay4iIiIKIApAQCAtNTE4LDcgKzUxOCw3IEBACiAgICAgICAgIH0KIAogCi1jbGFzcyBGaWx0ZXJDcnV0Y2goTmV3U3R5bGUpOgorY2xhc3MgRmlsdGVyQ3J1dGNoKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gJ19idWlsZGVyJywgJ19sZXZlbCcsICdfb2xkX3N0YXJ0JywgJ19vbGRfZW5kJwogCiAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ1aWxkZXIpOgpAQCAtOTA4LDcgKzkwOCw3IEBACiAgICAgICAgIHJhaXNlIFBhcnNlRXNjYXBlKCkKIAogCi1kZWYgcGFyc2UoZmlsZSwgbmFtZXNwYWNlcz0xKToKK2RlZiBwYXJzZShmaWxlLCBuYW1lc3BhY2VzPVRydWUpOgogICAgICIiIlBhcnNlIGEgZG9jdW1lbnQsIHJldHVybmluZyB0aGUgcmVzdWx0aW5nIERvY3VtZW50IG5vZGUuCiAKICAgICAnZmlsZScgbWF5IGJlIGVpdGhlciBhIGZpbGUgbmFtZSBvciBhbiBvcGVuIGZpbGUgb2JqZWN0LgpAQCAtOTI5LDcgKzkyOSw3IEBACiAgICAgcmV0dXJuIHJlc3VsdAogCiAKLWRlZiBwYXJzZVN0cmluZyhzdHJpbmcsIG5hbWVzcGFjZXM9MSk6CitkZWYgcGFyc2VTdHJpbmcoc3RyaW5nLCBuYW1lc3BhY2VzPVRydWUpOgogICAgICIiIlBhcnNlIGEgZG9jdW1lbnQgZnJvbSBhIHN0cmluZywgcmV0dXJuaW5nIHRoZSByZXN1bHRpbmcKICAgICBEb2N1bWVudCBub2RlLgogICAgICIiIgpAQCAtOTQwLDcgKzk0MCw3IEBACiAgICAgcmV0dXJuIGJ1aWxkZXIucGFyc2VTdHJpbmcoc3RyaW5nKQogCiAKLWRlZiBwYXJzZUZyYWdtZW50KGZpbGUsIGNvbnRleHQsIG5hbWVzcGFjZXM9MSk6CitkZWYgcGFyc2VGcmFnbWVudChmaWxlLCBjb250ZXh0LCBuYW1lc3BhY2VzPVRydWUpOgogICAgICIiIlBhcnNlIGEgZnJhZ21lbnQgb2YgYSBkb2N1bWVudCwgZ2l2ZW4gdGhlIGNvbnRleHQgZnJvbSB3aGljaCBpdAogICAgIHdhcyBvcmlnaW5hbGx5IGV4dHJhY3RlZC4gIGNvbnRleHQgc2hvdWxkIGJlIHRoZSBwYXJlbnQgb2YgdGhlCiAgICAgbm9kZShzKSB3aGljaCBhcmUgaW4gdGhlIGZyYWdtZW50LgpAQCAtOTYzLDcgKzk2Myw3IEBACiAgICAgcmV0dXJuIHJlc3VsdAogCiAKLWRlZiBwYXJzZUZyYWdtZW50U3RyaW5nKHN0cmluZywgY29udGV4dCwgbmFtZXNwYWNlcz0xKToKK2RlZiBwYXJzZUZyYWdtZW50U3RyaW5nKHN0cmluZywgY29udGV4dCwgbmFtZXNwYWNlcz1UcnVlKToKICAgICAiIiJQYXJzZSBhIGZyYWdtZW50IG9mIGEgZG9jdW1lbnQgZnJvbSBhIHN0cmluZywgZ2l2ZW4gdGhlIGNvbnRleHQKICAgICBmcm9tIHdoaWNoIGl0IHdhcyBvcmlnaW5hbGx5IGV4dHJhY3RlZC4gIGNvbnRleHQgc2hvdWxkIGJlIHRoZQogICAgIHBhcmVudCBvZiB0aGUgbm9kZShzKSB3aGljaCBhcmUgaW4gdGhlIGZyYWdtZW50LgpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL21pbmljb21wYXQucHkgYi9MaWIveG1sY29yZS9kb20vbWluaWNvbXBhdC5weQppbmRleCAzNjRjYTQ1Li5mOTliN2ZlIDEwMDY0NAotLS0gYS9MaWIveG1sY29yZS9kb20vbWluaWNvbXBhdC5weQorKysgYi9MaWIveG1sY29yZS9kb20vbWluaWNvbXBhdC5weQpAQCAtNCwxMCArNCw2IEBACiAjCiAjIFRoZSBmb2xsb3dpbmcgbmFtZXMgYXJlIGRlZmluZWQ6CiAjCi0jICAgaXNpbnN0YW5jZSAgICAtLSB2ZXJzaW9uIG9mIHRoZSBpc2luc3RhbmNlKCkgZnVuY3Rpb24gdGhhdCBhY2NlcHRzCi0jICAgICAgICAgICAgICAgICAgICB0dXBsZXMgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgcmVnYXJkbGVzcyBvZiB0aGUKLSMgICAgICAgICAgICAgICAgICAgIFB5dGhvbiB2ZXJzaW9uCi0jCiAjICAgTm9kZUxpc3QgICAgICAtLSBsaWdodGVzdCBwb3NzaWJsZSBOb2RlTGlzdCBpbXBsZW1lbnRhdGlvbgogIwogIyAgIEVtcHR5Tm9kZUxpc3QgLS0gbGlnaHRlc3QgcG9zc2libGUgTm9kZUxpc3QgdGhhdCBpcyBndWFyYXRlZWQgdG8KQEAgLTE1LDggKzExLDYgQEAKICMKICMgICBTdHJpbmdUeXBlcyAgIC0tIHR1cGxlIG9mIGRlZmluZWQgc3RyaW5nIHR5cGVzCiAjCi0jICAgR2V0YXR0ck1hZ2ljICAtLSBiYXNlIGNsYXNzIHVzZWQgdG8gbWFrZSBfZ2V0XzxhdHRyPiBiZSBtYWdpY2FsbHkKLSMgICAgICAgICAgICAgICAgICAgIGludm9rZWQgd2hlbiBhdmFpbGFibGUKICMgICBkZWZwcm9wZXJ0eSAgIC0tIGZ1bmN0aW9uIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBHZXRhdHRyTWFnaWM7CiAjICAgICAgICAgICAgICAgICAgICB1c2luZyB0aGVzZSB0b2dldGhlciBpcyBuZWVkZWQgdG8gbWFrZSB0aGVtIHdvcmsKICMgICAgICAgICAgICAgICAgICAgIGFzIGVmZmljaWVudGx5IGFzIHBvc3NpYmxlIGluIGJvdGggUHl0aG9uIDIuMisKQEAgLTQxLDE0ICszNSw4IEBACiAjCiAjICAgICAgICAgICAgICAgICAgICBkZWZwcm9wZXJ0eSgpIHNob3VsZCBiZSB1c2VkIGZvciBlYWNoIHZlcnNpb24gb2YKICMgICAgICAgICAgICAgICAgICAgIHRoZSByZWxldmFudCBfZ2V0Xzxwcm9wZXJ0eT4oKSBmdW5jdGlvbi4KLSMKLSMgICBOZXdTdHlsZSAgICAgIC0tIGJhc2UgY2xhc3MgdG8gY2F1c2UgX19zbG90c19fIHRvIGJlIGhvbm9yZWQgaW4KLSMgICAgICAgICAgICAgICAgICAgIHRoZSBuZXcgd29ybGQKLSMKLSMgICBUcnVlLCBGYWxzZSAgIC0tIG9ubHkgZm9yIFB5dGhvbiAyLjIgYW5kIGVhcmxpZXIKIAotX19hbGxfXyA9IFsiTm9kZUxpc3QiLCAiRW1wdHlOb2RlTGlzdCIsICJOZXdTdHlsZSIsCi0gICAgICAgICAgICJTdHJpbmdUeXBlcyIsICJkZWZwcm9wZXJ0eSIsICJHZXRhdHRyTWFnaWMiXQorX19hbGxfXyA9IFsiTm9kZUxpc3QiLCAiRW1wdHlOb2RlTGlzdCIsICJTdHJpbmdUeXBlcyIsICJkZWZwcm9wZXJ0eSJdCiAKIGltcG9ydCB4bWxjb3JlLmRvbQogCkBAIC02MCwxMjUgKzQ4LDYyIEBACiAgICAgU3RyaW5nVHlwZXMgPSB0eXBlKCcnKSwgdHlwZSh1bmljb2RlKCcnKSkKIAogCi0jIGRlZmluZSBUcnVlIGFuZCBGYWxzZSBvbmx5IGlmIG5vdCBkZWZpbmVkIGFzIGJ1aWx0LWlucwotdHJ5OgotICAgIFRydWUKLWV4Y2VwdCBOYW1lRXJyb3I6Ci0gICAgVHJ1ZSA9IDEKLSAgICBGYWxzZSA9IDAKLSAgICBfX2FsbF9fLmV4dGVuZChbIlRydWUiLCAiRmFsc2UiXSkKK2NsYXNzIE5vZGVMaXN0KGxpc3QpOgorICAgIF9fc2xvdHNfXyA9ICgpCisKKyAgICBkZWYgaXRlbShzZWxmLCBpbmRleCk6CisgICAgICAgIGlmIDAgPD0gaW5kZXggPCBsZW4oc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZltpbmRleF0KKworICAgIGRlZiBfZ2V0X2xlbmd0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmKQorCisgICAgZGVmIF9zZXRfbGVuZ3RoKHNlbGYsIHZhbHVlKToKKyAgICAgICAgcmFpc2UgeG1sLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCisgICAgICAgICAgICAiYXR0ZW1wdCB0byBtb2RpZnkgcmVhZC1vbmx5IGF0dHJpYnV0ZSAnbGVuZ3RoJyIpCisKKyAgICBsZW5ndGggPSBwcm9wZXJ0eShfZ2V0X2xlbmd0aCwgX3NldF9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgZG9jPSJUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBOb2RlTGlzdC4iKQorCisgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxpc3Qoc2VsZikKKworICAgIGRlZiBfX3NldHN0YXRlX18oc2VsZiwgc3RhdGUpOgorICAgICAgICBzZWxmWzpdID0gc3RhdGUKKworY2xhc3MgRW1wdHlOb2RlTGlzdCh0dXBsZSk6CisgICAgX19zbG90c19fID0gKCkKKworICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKKyAgICAgICAgTkwgPSBOb2RlTGlzdCgpCisgICAgICAgIE5MLmV4dGVuZChvdGhlcikKKyAgICAgICAgcmV0dXJuIE5MCisKKyAgICBkZWYgX19yYWRkX18oc2VsZiwgb3RoZXIpOgorICAgICAgICBOTCA9IE5vZGVMaXN0KCkKKyAgICAgICAgTkwuZXh0ZW5kKG90aGVyKQorICAgICAgICByZXR1cm4gTkwKKworICAgIGRlZiBpdGVtKHNlbGYsIGluZGV4KToKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGRlZiBfZ2V0X2xlbmd0aChzZWxmKToKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBfc2V0X2xlbmd0aChzZWxmLCB2YWx1ZSk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAorICAgICAgICAgICAgImF0dGVtcHQgdG8gbW9kaWZ5IHJlYWQtb25seSBhdHRyaWJ1dGUgJ2xlbmd0aCciKQorCisgICAgbGVuZ3RoID0gcHJvcGVydHkoX2dldF9sZW5ndGgsIF9zZXRfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgIGRvYz0iVGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgTm9kZUxpc3QuIikKIAogCi10cnk6Ci0gICAgaXNpbnN0YW5jZSgnJywgU3RyaW5nVHlwZXMpCi1leGNlcHQgVHlwZUVycm9yOgotICAgICMKLSAgICAjIFdyYXAgaXNpbnN0YW5jZSgpIHRvIG1ha2UgaXQgY29tcGF0aWJsZSB3aXRoIHRoZSB2ZXJzaW9uIGluCi0gICAgIyBQeXRob24gMi4yIGFuZCBuZXdlci4KLSAgICAjCi0gICAgX2lzaW5zdGFuY2UgPSBpc2luc3RhbmNlCi0gICAgZGVmIGlzaW5zdGFuY2Uob2JqLCB0eXBlX29yX3NlcSk6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIHJldHVybiBfaXNpbnN0YW5jZShvYmosIHR5cGVfb3Jfc2VxKQotICAgICAgICBleGNlcHQgVHlwZUVycm9yOgotICAgICAgICAgICAgZm9yIHQgaW4gdHlwZV9vcl9zZXE6Ci0gICAgICAgICAgICAgICAgaWYgX2lzaW5zdGFuY2Uob2JqLCB0KToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDEKLSAgICAgICAgICAgIHJldHVybiAwCi0gICAgX19hbGxfXy5hcHBlbmQoImlzaW5zdGFuY2UiKQotCi0KLWlmIGxpc3QgaXMgdHlwZShbXSk6Ci0gICAgY2xhc3MgTm9kZUxpc3QobGlzdCk6Ci0gICAgICAgIF9fc2xvdHNfXyA9ICgpCi0KLSAgICAgICAgZGVmIGl0ZW0oc2VsZiwgaW5kZXgpOgotICAgICAgICAgICAgaWYgMCA8PSBpbmRleCA8IGxlbihzZWxmKToKLSAgICAgICAgICAgICAgICByZXR1cm4gc2VsZltpbmRleF0KLQotICAgICAgICBkZWYgX2dldF9sZW5ndGgoc2VsZik6Ci0gICAgICAgICAgICByZXR1cm4gbGVuKHNlbGYpCi0KLSAgICAgICAgZGVmIF9zZXRfbGVuZ3RoKHNlbGYsIHZhbHVlKToKLSAgICAgICAgICAgIHJhaXNlIHhtbGNvcmUuZG9tLk5vTW9kaWZpY2F0aW9uQWxsb3dlZEVycigKLSAgICAgICAgICAgICAgICAiYXR0ZW1wdCB0byBtb2RpZnkgcmVhZC1vbmx5IGF0dHJpYnV0ZSAnbGVuZ3RoJyIpCi0KLSAgICAgICAgbGVuZ3RoID0gcHJvcGVydHkoX2dldF9sZW5ndGgsIF9zZXRfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkb2M9IlRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlIE5vZGVMaXN0LiIpCi0KLSAgICAgICAgZGVmIF9fZ2V0c3RhdGVfXyhzZWxmKToKLSAgICAgICAgICAgIHJldHVybiBsaXN0KHNlbGYpCi0KLSAgICAgICAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6Ci0gICAgICAgICAgICBzZWxmWzpdID0gc3RhdGUKLQotICAgIGNsYXNzIEVtcHR5Tm9kZUxpc3QodHVwbGUpOgotICAgICAgICBfX3Nsb3RzX18gPSAoKQotCi0gICAgICAgIGRlZiBfX2FkZF9fKHNlbGYsIG90aGVyKToKLSAgICAgICAgICAgIE5MID0gTm9kZUxpc3QoKQotICAgICAgICAgICAgTkwuZXh0ZW5kKG90aGVyKQotICAgICAgICAgICAgcmV0dXJuIE5MCi0KLSAgICAgICAgZGVmIF9fcmFkZF9fKHNlbGYsIG90aGVyKToKLSAgICAgICAgICAgIE5MID0gTm9kZUxpc3QoKQotICAgICAgICAgICAgTkwuZXh0ZW5kKG90aGVyKQotICAgICAgICAgICAgcmV0dXJuIE5MCi0KLSAgICAgICAgZGVmIGl0ZW0oc2VsZiwgaW5kZXgpOgotICAgICAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgICAgICBkZWYgX2dldF9sZW5ndGgoc2VsZik6Ci0gICAgICAgICAgICByZXR1cm4gMAotCi0gICAgICAgIGRlZiBfc2V0X2xlbmd0aChzZWxmLCB2YWx1ZSk6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCi0gICAgICAgICAgICAgICAgImF0dGVtcHQgdG8gbW9kaWZ5IHJlYWQtb25seSBhdHRyaWJ1dGUgJ2xlbmd0aCciKQotCi0gICAgICAgIGxlbmd0aCA9IHByb3BlcnR5KF9nZXRfbGVuZ3RoLCBfc2V0X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jPSJUaGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBOb2RlTGlzdC4iKQotCi1lbHNlOgotICAgIGRlZiBOb2RlTGlzdCgpOgotICAgICAgICByZXR1cm4gW10KLQotICAgIGRlZiBFbXB0eU5vZGVMaXN0KCk6Ci0gICAgICAgIHJldHVybiBbXQotCi0KLXRyeToKLSAgICBwcm9wZXJ0eQotZXhjZXB0IE5hbWVFcnJvcjoKLSAgICBkZWYgZGVmcHJvcGVydHkoa2xhc3MsIG5hbWUsIGRvYyk6Ci0gICAgICAgICMgdGFrZW4gY2FyZSBvZiBieSB0aGUgYmFzZSBfX2dldGF0dHJfXygpCi0gICAgICAgIHBhc3MKLQotICAgIGNsYXNzIEdldGF0dHJNYWdpYzoKLSAgICAgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGtleSk6Ci0gICAgICAgICAgICBpZiBrZXkuc3RhcnRzd2l0aCgiXyIpOgotICAgICAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBrZXkKLQotICAgICAgICAgICAgdHJ5OgotICAgICAgICAgICAgICAgIGdldCA9IGdldGF0dHIoc2VsZiwgIl9nZXRfIiArIGtleSkKLSAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwga2V5Ci0gICAgICAgICAgICByZXR1cm4gZ2V0KCkKLQotICAgIGNsYXNzIE5ld1N0eWxlOgotICAgICAgICBwYXNzCi0KLWVsc2U6Ci0gICAgZGVmIGRlZnByb3BlcnR5KGtsYXNzLCBuYW1lLCBkb2MpOgotICAgICAgICBnZXQgPSBnZXRhdHRyKGtsYXNzLCAoIl9nZXRfIiArIG5hbWUpKS5pbV9mdW5jCi0gICAgICAgIGRlZiBzZXQoc2VsZiwgdmFsdWUsIG5hbWU9bmFtZSk6Ci0gICAgICAgICAgICByYWlzZSB4bWxjb3JlLmRvbS5Ob01vZGlmaWNhdGlvbkFsbG93ZWRFcnIoCi0gICAgICAgICAgICAgICAgImF0dGVtcHQgdG8gbW9kaWZ5IHJlYWQtb25seSBhdHRyaWJ1dGUgIiArIHJlcHIobmFtZSkpCi0gICAgICAgIGFzc2VydCBub3QgaGFzYXR0cihrbGFzcywgIl9zZXRfIiArIG5hbWUpLCBcCi0gICAgICAgICAgICAgICAiZXhwZWN0ZWQgbm90IHRvIGZpbmQgX3NldF8iICsgbmFtZQotICAgICAgICBwcm9wID0gcHJvcGVydHkoZ2V0LCBzZXQsIGRvYz1kb2MpCi0gICAgICAgIHNldGF0dHIoa2xhc3MsIG5hbWUsIHByb3ApCi0KLSAgICBjbGFzcyBHZXRhdHRyTWFnaWM6Ci0gICAgICAgIHBhc3MKLQotICAgIE5ld1N0eWxlID0gb2JqZWN0CitkZWYgZGVmcHJvcGVydHkoa2xhc3MsIG5hbWUsIGRvYyk6CisgICAgZ2V0ID0gZ2V0YXR0cihrbGFzcywgKCJfZ2V0XyIgKyBuYW1lKSkuaW1fZnVuYworICAgIGRlZiBzZXQoc2VsZiwgdmFsdWUsIG5hbWU9bmFtZSk6CisgICAgICAgIHJhaXNlIHhtbC5kb20uTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyKAorICAgICAgICAgICAgImF0dGVtcHQgdG8gbW9kaWZ5IHJlYWQtb25seSBhdHRyaWJ1dGUgIiArIHJlcHIobmFtZSkpCisgICAgYXNzZXJ0IG5vdCBoYXNhdHRyKGtsYXNzLCAiX3NldF8iICsgbmFtZSksIFwKKyAgICAgICAgICAgImV4cGVjdGVkIG5vdCB0byBmaW5kIF9zZXRfIiArIG5hbWUKKyAgICBwcm9wID0gcHJvcGVydHkoZ2V0LCBzZXQsIGRvYz1kb2MpCisgICAgc2V0YXR0cihrbGFzcywgbmFtZSwgcHJvcCkKZGlmZiAtLWdpdCBhL0xpYi94bWxjb3JlL2RvbS9taW5pZG9tLnB5IGIvTGliL3htbGNvcmUvZG9tL21pbmlkb20ucHkKaW5kZXggNTQ2MjBlMS4uYThhYmQxNCAxMDA2NDQKLS0tIGEvTGliL3htbGNvcmUvZG9tL21pbmlkb20ucHkKKysrIGIvTGliL3htbGNvcmUvZG9tL21pbmlkb20ucHkKQEAgLTIwLDggKzIwLDYgQEAKIGZyb20geG1sY29yZS5kb20ubWluaWNvbXBhdCBpbXBvcnQgKgogZnJvbSB4bWxjb3JlLmRvbS54bWxidWlsZGVyIGltcG9ydCBET01JbXBsZW1lbnRhdGlvbkxTLCBEb2N1bWVudExTCiAKLV9UdXBsZVR5cGUgPSB0eXBlKCgpKQotCiAjIFRoaXMgaXMgdXNlZCBieSB0aGUgSUQtY2FjaGUgaW52YWxpZGF0aW9uIGNoZWNrczsgdGhlIGxpc3QgaXNuJ3QKICMgYWN0dWFsbHkgY29tcGxldGUsIHNpbmNlIHRoZSBub2RlcyBiZWluZyBjaGVja2VkIHdpbGwgbmV2ZXIgYmUgdGhlCiAjIERPQ1VNRU5UX05PREUgb3IgRE9DVU1FTlRfRlJBR01FTlRfTk9ERS4gIChUaGUgbm9kZSBiZWluZyBjaGVja2VkIGlzCkBAIC0zMSw3ICsyOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sY29yZS5kb20uTm9kZS5FTlRJVFlfUkVGRVJFTkNFX05PREUpCiAKIAotY2xhc3MgTm9kZSh4bWxjb3JlLmRvbS5Ob2RlLCBHZXRhdHRyTWFnaWMpOgorY2xhc3MgTm9kZSh4bWxjb3JlLmRvbS5Ob2RlKToKICAgICBuYW1lc3BhY2VVUkkgPSBOb25lICMgdGhpcyBpcyBub24tbnVsbCBvbmx5IGZvciBlbGVtZW50cyBhbmQgYXR0cmlidXRlcwogICAgIHBhcmVudE5vZGUgPSBOb25lCiAgICAgb3duZXJEb2N1bWVudCA9IE5vbmUKQEAgLTQ1OSw3ICs0NTcsNyBAQAogZGVmcHJvcGVydHkoQXR0ciwgInNjaGVtYVR5cGUiLCBkb2M9IlNjaGVtYSB0eXBlIGZvciB0aGlzIGF0dHJpYnV0ZS4iKQogCiAKLWNsYXNzIE5hbWVkTm9kZU1hcChOZXdTdHlsZSwgR2V0YXR0ck1hZ2ljKToKK2NsYXNzIE5hbWVkTm9kZU1hcChvYmplY3QpOgogICAgICIiIlRoZSBhdHRyaWJ1dGUgbGlzdCBpcyBhIHRyYW5zaWVudCBpbnRlcmZhY2UgdG8gdGhlIHVuZGVybHlpbmcKICAgICBkaWN0aW9uYXJpZXMuICBNdXRhdGlvbnMgaGVyZSB3aWxsIGNoYW5nZSB0aGUgdW5kZXJseWluZyBlbGVtZW50J3MKICAgICBkaWN0aW9uYXJ5LgpAQCAtNTIzLDcgKzUyMSw3IEBACiAgICAgICAgICAgICByZXR1cm4gY21wKGlkKHNlbGYpLCBpZChvdGhlcikpCiAKICAgICBkZWYgX19nZXRpdGVtX18oc2VsZiwgYXR0bmFtZV9vcl90dXBsZSk6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2UoYXR0bmFtZV9vcl90dXBsZSwgX1R1cGxlVHlwZSk6CisgICAgICAgIGlmIGlzaW5zdGFuY2UoYXR0bmFtZV9vcl90dXBsZSwgdHVwbGUpOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2F0dHJzTlNbYXR0bmFtZV9vcl90dXBsZV0KICAgICAgICAgZWxzZToKICAgICAgICAgICAgIHJldHVybiBzZWxmLl9hdHRyc1thdHRuYW1lX29yX3R1cGxlXQpAQCAtNjEzLDcgKzYxMSw3IEBACiBBdHRyaWJ1dGVMaXN0ID0gTmFtZWROb2RlTWFwCiAKIAotY2xhc3MgVHlwZUluZm8oTmV3U3R5bGUpOgorY2xhc3MgVHlwZUluZm8ob2JqZWN0KToKICAgICBfX3Nsb3RzX18gPSAnbmFtZXNwYWNlJywgJ25hbWUnCiAKICAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZXNwYWNlLCBuYW1lKToKQEAgLTExNDYsNyArMTE0NCw3IEBACiAgICAgICAgIHdyaXRlci53cml0ZSgiPCFbQ0RBVEFbJXNdXT4iICUgc2VsZi5kYXRhKQogCiAKLWNsYXNzIFJlYWRPbmx5U2VxdWVudGlhbE5hbWVkTm9kZU1hcChOZXdTdHlsZSwgR2V0YXR0ck1hZ2ljKToKK2NsYXNzIFJlYWRPbmx5U2VxdWVudGlhbE5hbWVkTm9kZU1hcChvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9ICdfc2VxJywKIAogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBzZXE9KCkpOgpAQCAtMTE3MCw3ICsxMTY4LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gbgogCiAgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIG5hbWVfb3JfdHVwbGUpOgotICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWVfb3JfdHVwbGUsIF9UdXBsZVR5cGUpOgorICAgICAgICBpZiBpc2luc3RhbmNlKG5hbWVfb3JfdHVwbGUsIHR1cGxlKToKICAgICAgICAgICAgIG5vZGUgPSBzZWxmLmdldE5hbWVkSXRlbU5TKCpuYW1lX29yX3R1cGxlKQogICAgICAgICBlbHNlOgogICAgICAgICAgICAgbm9kZSA9IHNlbGYuZ2V0TmFtZWRJdGVtKG5hbWVfb3JfdHVwbGUpCkBAIC0xNDE4LDcgKzE0MTYsNyBAQAogICAgIGRlZiBfY3JlYXRlX2RvY3VtZW50KHNlbGYpOgogICAgICAgICByZXR1cm4gRG9jdW1lbnQoKQogCi1jbGFzcyBFbGVtZW50SW5mbyhOZXdTdHlsZSk6CitjbGFzcyBFbGVtZW50SW5mbyhvYmplY3QpOgogICAgICIiIk9iamVjdCB0aGF0IHJlcHJlc2VudHMgY29udGVudC1tb2RlbCBpbmZvcm1hdGlvbiBmb3IgYW4gZWxlbWVudC4KIAogICAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IGV4cGVjdGVkIHRvIGJlIHVzZWQgaW4gcHJhY3RpY2U7IERPTQpkaWZmIC0tZ2l0IGEvTGliL3htbGNvcmUvZG9tL3htbGJ1aWxkZXIucHkgYi9MaWIveG1sY29yZS9kb20veG1sYnVpbGRlci5weQppbmRleCBkNThjNzIzLi42NTY2ZDNjIDEwMDY0NAotLS0gYS9MaWIveG1sY29yZS9kb20veG1sYnVpbGRlci5weQorKysgYi9MaWIveG1sY29yZS9kb20veG1sYnVpbGRlci5weQpAQCAtMyw4ICszLDYgQEAKIGltcG9ydCBjb3B5CiBpbXBvcnQgeG1sY29yZS5kb20KIAotZnJvbSB4bWxjb3JlLmRvbS5taW5pY29tcGF0IGltcG9ydCAqCi0KIGZyb20geG1sY29yZS5kb20uTm9kZUZpbHRlciBpbXBvcnQgTm9kZUZpbHRlcgogCiAKQEAgLTIxMSw3ICsyMDksNyBAQAogICAgIHJldHVybiBuYW1lLmxvd2VyKCkucmVwbGFjZSgnLScsICdfJykKIAogCi1jbGFzcyBET01FbnRpdHlSZXNvbHZlcihOZXdTdHlsZSk6CitjbGFzcyBET01FbnRpdHlSZXNvbHZlcihvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9ICdfb3BlbmVyJywKIAogICAgIGRlZiByZXNvbHZlRW50aXR5KHNlbGYsIHB1YmxpY0lkLCBzeXN0ZW1JZCk6CkBAIC0yNTUsNyArMjUzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtLnNwbGl0KCI9IiwgMSlbMV0ubG93ZXIoKQogCiAKLWNsYXNzIERPTUlucHV0U291cmNlKE5ld1N0eWxlKToKK2NsYXNzIERPTUlucHV0U291cmNlKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gKCdieXRlU3RyZWFtJywgJ2NoYXJhY3RlclN0cmVhbScsICdzdHJpbmdEYXRhJywKICAgICAgICAgICAgICAgICAgJ2VuY29kaW5nJywgJ3B1YmxpY0lkJywgJ3N5c3RlbUlkJywgJ2Jhc2VVUkknKQogCg==