ZGlmZiAtLWdpdCBhL0xpYi90ZXN0L3Rlc3Rfc2F4LnB5IGIvTGliL3Rlc3QvdGVzdF9zYXgucHkKaW5kZXggNWIwNzFkZC4uMGQ3NmNiYiAxMDA2NDQKLS0tIGEvTGliL3Rlc3QvdGVzdF9zYXgucHkKKysrIGIvTGliL3Rlc3QvdGVzdF9zYXgucHkKQEAgLTEzLDI2ICsxMyw2NiBAQAogZnJvbSB4bWwuc2F4LmV4cGF0cmVhZGVyIGltcG9ydCBjcmVhdGVfcGFyc2VyCiBmcm9tIHhtbC5zYXgueG1scmVhZGVyIGltcG9ydCBJbnB1dFNvdXJjZSwgQXR0cmlidXRlc0ltcGwsIEF0dHJpYnV0ZXNOU0ltcGwKIGZyb20gY1N0cmluZ0lPIGltcG9ydCBTdHJpbmdJTwotZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgdmVyaWZ5LCB2ZXJib3NlLCBUZXN0RmFpbGVkLCBmaW5kZmlsZQorZnJvbSB0ZXN0LnRlc3Rfc3VwcG9ydCBpbXBvcnQgZmluZGZpbGUsIHJ1bl91bml0dGVzdAoraW1wb3J0IHVuaXR0ZXN0CiBpbXBvcnQgb3MKIAotIyA9PT09PSBVdGlsaXRpZXMKK25zX3VyaSA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmcveG1sLW5zL3NheHRlc3QvIgogCi10ZXN0cyA9IDAKLWZhaWx1cmVzID0gW10KK2NsYXNzIFhtbFRlc3RCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgICBkZWYgdmVyaWZ5X2VtcHR5X2F0dHJzKHNlbGYsIGF0dHJzKToKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGF0dHJzLmdldFZhbHVlLCAiYXR0ciIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBhdHRycy5nZXRWYWx1ZUJ5UU5hbWUsICJhdHRyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGF0dHJzLmdldE5hbWVCeVFOYW1lLCAiYXR0ciIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBhdHRycy5nZXRRTmFtZUJ5TmFtZSwgImF0dHIiKQorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgYXR0cnMuX19nZXRpdGVtX18sICJhdHRyIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXR0cnMuZ2V0TGVuZ3RoKCksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLmdldE5hbWVzKCksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRycy5nZXRRTmFtZXMoKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihhdHRycyksIDApCisgICAgICAgIHNlbGYuYXNzZXJ0RmFsc2UoImF0dHIiIGluIGF0dHJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsaXN0KGF0dHJzLmtleXMoKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRycy5nZXQoImF0dHJzIiksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLmdldCgiYXR0cnMiLCAyNSksIDI1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsaXN0KGF0dHJzLml0ZW1zKCkpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGlzdChhdHRycy52YWx1ZXMoKSksIFtdKQogCi1kZWYgY29uZmlybShvdXRjb21lLCBuYW1lKToKLSAgICBnbG9iYWwgdGVzdHMKKyAgICBkZWYgdmVyaWZ5X2VtcHR5X25zYXR0cnMoc2VsZiwgYXR0cnMpOgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgYXR0cnMuZ2V0VmFsdWUsIChuc191cmksICJhdHRyIikpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBhdHRycy5nZXRWYWx1ZUJ5UU5hbWUsICJuczphdHRyIikKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGF0dHJzLmdldE5hbWVCeVFOYW1lLCAibnM6YXR0ciIpCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBhdHRycy5nZXRRTmFtZUJ5TmFtZSwgKG5zX3VyaSwgImF0dHIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGF0dHJzLl9fZ2V0aXRlbV9fLCAobnNfdXJpLCAiYXR0ciIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRycy5nZXRMZW5ndGgoKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXR0cnMuZ2V0TmFtZXMoKSwgW10pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLmdldFFOYW1lcygpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGVuKGF0dHJzKSwgMCkKKyAgICAgICAgc2VsZi5hc3NlcnRGYWxzZSgobnNfdXJpLCAiYXR0ciIpIGluIGF0dHJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsaXN0KGF0dHJzLmtleXMoKSksIFtdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLmdldCgobnNfdXJpLCAiYXR0ciIpLCAyNSksIDI1KQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsaXN0KGF0dHJzLml0ZW1zKCkpLCBbXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGlzdChhdHRycy52YWx1ZXMoKSksIFtdKQogCi0gICAgdGVzdHMgPSB0ZXN0cyArIDEKLSAgICBpZiBvdXRjb21lOgotICAgICAgICBpZiB2ZXJib3NlOgotICAgICAgICAgICAgcHJpbnQoIlBhc3NlZCIsIG5hbWUpCi0gICAgZWxzZToKLSAgICAgICAgZmFpbHVyZXMuYXBwZW5kKG5hbWUpCisgICAgZGVmIHZlcmlmeV9hdHRyc193YXR0cihzZWxmLCBhdHRycyk6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRycy5nZXROYW1lcygpLCBbImF0dHIiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXR0cnMuZ2V0UU5hbWVzKCksIFsiYXR0ciJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYXR0cnMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoImF0dHIiIGluIGF0dHJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsaXN0KGF0dHJzLmtleXMoKSksIFsiYXR0ciJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRycy5nZXQoImF0dHIiKSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLmdldCgiYXR0ciIsIDI1KSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxpc3QoYXR0cnMuaXRlbXMoKSksIFsoImF0dHIiLCAidmFsIildKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsaXN0KGF0dHJzLnZhbHVlcygpKSwgWyJ2YWwiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXR0cnMuZ2V0VmFsdWUoImF0dHIiKSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLmdldFZhbHVlQnlRTmFtZSgiYXR0ciIpLCAidmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXR0cnMuZ2V0TmFtZUJ5UU5hbWUoImF0dHIiKSwgImF0dHIiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRyc1siYXR0ciJdLCAidmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXR0cnMuZ2V0UU5hbWVCeU5hbWUoImF0dHIiKSwgImF0dHIiKQogCi1kZWYgdGVzdF9tYWtlX3BhcnNlcjIoKToKLSAgICB0cnk6CitjbGFzcyBNYWtlUGFyc2VyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfbWFrZV9wYXJzZXIyKHNlbGYpOgogICAgICAgICAjIENyZWF0aW5nIHBhcnNlcnMgc2V2ZXJhbCB0aW1lcyBpbiBhIHJvdyBzaG91bGQgc3VjY2VlZC4KICAgICAgICAgIyBUZXN0aW5nIHRoaXMgYmVjYXVzZSB0aGVyZSBoYXZlIGJlZW4gZmFpbHVyZXMgb2YgdGhpcyBraW5kCiAgICAgICAgICMgYmVmb3JlLgpAQCAtNDgsMTAgKzg4LDYgQEAKICAgICAgICAgcCA9IG1ha2VfcGFyc2VyKCkKICAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgogICAgICAgICBwID0gbWFrZV9wYXJzZXIoKQotICAgIGV4Y2VwdDoKLSAgICAgICAgcmV0dXJuIDAKLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gcAogCiAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC02MCwyMTUgKzk2LDIxNCBAQAogIwogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotIyA9PT09PSBlc2NhcGUKK2NsYXNzIFNheHV0aWxzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgIyA9PT09PSBlc2NhcGUKKyAgICBkZWYgdGVzdF9lc2NhcGVfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVzY2FwZSgiRG9uYWxkIER1Y2sgJiBDbyIpLCAiRG9uYWxkIER1Y2sgJmFtcDsgQ28iKQogCi1kZWYgdGVzdF9lc2NhcGVfYmFzaWMoKToKLSAgICByZXR1cm4gZXNjYXBlKCJEb25hbGQgRHVjayAmIENvIikgPT0gIkRvbmFsZCBEdWNrICZhbXA7IENvIgorICAgIGRlZiB0ZXN0X2VzY2FwZV9hbGwoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGVzY2FwZSgiPERvbmFsZCBEdWNrICYgQ28+IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICImbHQ7RG9uYWxkIER1Y2sgJmFtcDsgQ28mZ3Q7IikKIAotZGVmIHRlc3RfZXNjYXBlX2FsbCgpOgotICAgIHJldHVybiBlc2NhcGUoIjxEb25hbGQgRHVjayAmIENvPiIpID09ICImbHQ7RG9uYWxkIER1Y2sgJmFtcDsgQ28mZ3Q7IgorICAgIGRlZiB0ZXN0X2VzY2FwZV9leHRyYShzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZXNjYXBlKCJIZWkgcOUgZGVnIiwgeyLlIiA6ICImYXJpbmc7In0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVpIHAmYXJpbmc7IGRlZyIpCiAKLWRlZiB0ZXN0X2VzY2FwZV9leHRyYSgpOgotICAgIHJldHVybiBlc2NhcGUoIkhlaSBw5SBkZWciLCB7IuUiIDogIiZhcmluZzsifSkgPT0gIkhlaSBwJmFyaW5nOyBkZWciCisgICAgIyA9PT09PSB1bmVzY2FwZQorICAgIGRlZiB0ZXN0X3VuZXNjYXBlX2Jhc2ljKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh1bmVzY2FwZSgiRG9uYWxkIER1Y2sgJmFtcDsgQ28iKSwgIkRvbmFsZCBEdWNrICYgQ28iKQogCi0jID09PT09IHVuZXNjYXBlCisgICAgZGVmIHRlc3RfdW5lc2NhcGVfYWxsKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh1bmVzY2FwZSgiJmx0O0RvbmFsZCBEdWNrICZhbXA7IENvJmd0OyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiPERvbmFsZCBEdWNrICYgQ28+IikKIAotZGVmIHRlc3RfdW5lc2NhcGVfYmFzaWMoKToKLSAgICByZXR1cm4gdW5lc2NhcGUoIkRvbmFsZCBEdWNrICZhbXA7IENvIikgPT0gIkRvbmFsZCBEdWNrICYgQ28iCisgICAgZGVmIHRlc3RfdW5lc2NhcGVfZXh0cmEoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHVuZXNjYXBlKCJIZWkgcOUgZGVnIiwgeyLlIiA6ICImYXJpbmc7In0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiSGVpIHAmYXJpbmc7IGRlZyIpCiAKLWRlZiB0ZXN0X3VuZXNjYXBlX2FsbCgpOgotICAgIHJldHVybiB1bmVzY2FwZSgiJmx0O0RvbmFsZCBEdWNrICZhbXA7IENvJmd0OyIpID09ICI8RG9uYWxkIER1Y2sgJiBDbz4iCisgICAgZGVmIHRlc3RfdW5lc2NhcGVfYW1wX2V4dHJhKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyh1bmVzY2FwZSgiJmFtcDtmb287IiwgeyImZm9vOyI6ICJzcGxhdCJ9KSwgIiZmb287IikKIAotZGVmIHRlc3RfdW5lc2NhcGVfZXh0cmEoKToKLSAgICByZXR1cm4gdW5lc2NhcGUoIkhlaSBw5SBkZWciLCB7IuUiIDogIiZhcmluZzsifSkgPT0gIkhlaSBwJmFyaW5nOyBkZWciCisgICAgIyA9PT09PSBxdW90ZWF0dHIKKyAgICBkZWYgdGVzdF9xdW90ZWF0dHJfYmFzaWMoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHF1b3RlYXR0cigiRG9uYWxkIER1Y2sgJiBDbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAnIkRvbmFsZCBEdWNrICZhbXA7IENvIicpCiAKLWRlZiB0ZXN0X3VuZXNjYXBlX2FtcF9leHRyYSgpOgotICAgIHJldHVybiB1bmVzY2FwZSgiJmFtcDtmb287IiwgeyImZm9vOyI6ICJzcGxhdCJ9KSA9PSAiJmZvbzsiCisgICAgZGVmIHRlc3Rfc2luZ2xlX3F1b3RlYXR0cihzZWxmKToKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocXVvdGVhdHRyKCdJbmNsdWRlcyAiZG91YmxlIiBxdW90ZXMnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wnSW5jbHVkZXMgImRvdWJsZSIgcXVvdGVzXCcnKQogCi0jID09PT09IHF1b3RlYXR0cgorICAgIGRlZiB0ZXN0X2RvdWJsZV9xdW90ZWF0dHIoc2VsZik6CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHF1b3RlYXR0cigiSW5jbHVkZXMgJ3NpbmdsZScgcXVvdGVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICJcIkluY2x1ZGVzICdzaW5nbGUnIHF1b3Rlc1wiIikKIAotZGVmIHRlc3RfcXVvdGVhdHRyX2Jhc2ljKCk6Ci0gICAgcmV0dXJuIHF1b3RlYXR0cigiRG9uYWxkIER1Y2sgJiBDbyIpID09ICciRG9uYWxkIER1Y2sgJmFtcDsgQ28iJworICAgIGRlZiB0ZXN0X3NpbmdsZV9kb3VibGVfcXVvdGVhdHRyKHNlbGYpOgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhxdW90ZWF0dHIoIkluY2x1ZGVzICdzaW5nbGUnIGFuZCBcImRvdWJsZVwiIHF1b3RlcyIpLAorICAgICAgICAgICAgICAgICAgICAiXCJJbmNsdWRlcyAnc2luZ2xlJyBhbmQgJnF1b3Q7ZG91YmxlJnF1b3Q7IHF1b3Rlc1wiIikKIAotZGVmIHRlc3Rfc2luZ2xlX3F1b3RlYXR0cigpOgotICAgIHJldHVybiAocXVvdGVhdHRyKCdJbmNsdWRlcyAiZG91YmxlIiBxdW90ZXMnKQotICAgICAgICAgICAgPT0gJ1wnSW5jbHVkZXMgImRvdWJsZSIgcXVvdGVzXCcnKQotCi1kZWYgdGVzdF9kb3VibGVfcXVvdGVhdHRyKCk6Ci0gICAgcmV0dXJuIChxdW90ZWF0dHIoIkluY2x1ZGVzICdzaW5nbGUnIHF1b3RlcyIpCi0gICAgICAgICAgICA9PSAiXCJJbmNsdWRlcyAnc2luZ2xlJyBxdW90ZXNcIiIpCi0KLWRlZiB0ZXN0X3NpbmdsZV9kb3VibGVfcXVvdGVhdHRyKCk6Ci0gICAgcmV0dXJuIChxdW90ZWF0dHIoIkluY2x1ZGVzICdzaW5nbGUnIGFuZCBcImRvdWJsZVwiIHF1b3RlcyIpCi0gICAgICAgICAgICA9PSAiXCJJbmNsdWRlcyAnc2luZ2xlJyBhbmQgJnF1b3Q7ZG91YmxlJnF1b3Q7IHF1b3Rlc1wiIikKLQotIyA9PT09PSBtYWtlX3BhcnNlcgotCi1kZWYgdGVzdF9tYWtlX3BhcnNlcigpOgotICAgIHRyeToKKyAgICAjID09PT09IG1ha2VfcGFyc2VyCisgICAgZGVmIHRlc3RfbWFrZV9wYXJzZXIoc2VsZik6CiAgICAgICAgICMgQ3JlYXRpbmcgYSBwYXJzZXIgc2hvdWxkIHN1Y2NlZWQgLSBpdCBzaG91bGQgZmFsbCBiYWNrCiAgICAgICAgICMgdG8gdGhlIGV4cGF0cmVhZGVyCiAgICAgICAgIHAgPSBtYWtlX3BhcnNlcihbJ3htbC5wYXJzZXJzLm5vX3N1Y2hfcGFyc2VyJ10pCi0gICAgZXhjZXB0OgotICAgICAgICByZXR1cm4gMAotICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiBwCiAKIAogIyA9PT09PSBYTUxHZW5lcmF0b3IKIAogc3RhcnQgPSAnPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/PlxuJwogCi1kZWYgdGVzdF94bWxnZW5fYmFzaWMoKToKLSAgICByZXN1bHQgPSBTdHJpbmdJTygpCi0gICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKLSAgICBnZW4uc3RhcnREb2N1bWVudCgpCi0gICAgZ2VuLnN0YXJ0RWxlbWVudCgiZG9jIiwge30pCi0gICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCi0gICAgZ2VuLmVuZERvY3VtZW50KCkKK2NsYXNzIFhtbGdlblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X3htbGdlbl9iYXNpYyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorICAgICAgICBnZW4uc3RhcnREb2N1bWVudCgpCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQorICAgICAgICBnZW4uZW5kRWxlbWVudCgiZG9jIikKKyAgICAgICAgZ2VuLmVuZERvY3VtZW50KCkKIAotICAgIHJldHVybiByZXN1bHQuZ2V0dmFsdWUoKSA9PSBzdGFydCArICI8ZG9jPjwvZG9jPiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjxkb2M+PC9kb2M+IikKIAotZGVmIHRlc3RfeG1sZ2VuX2NvbnRlbnQoKToKLSAgICByZXN1bHQgPSBTdHJpbmdJTygpCi0gICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKyAgICBkZWYgdGVzdF94bWxnZW5fY29udGVudChzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQogCi0gICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQotICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQotICAgIGdlbi5jaGFyYWN0ZXJzKCJodWhlaSIpCi0gICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCi0gICAgZ2VuLmVuZERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKKyAgICAgICAgZ2VuLmNoYXJhY3RlcnMoImh1aGVpIikKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCisgICAgICAgIGdlbi5lbmREb2N1bWVudCgpCiAKLSAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0gc3RhcnQgKyAiPGRvYz5odWhlaTwvZG9jPiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjxkb2M+aHVoZWk8L2RvYz4iKQogCi1kZWYgdGVzdF94bWxnZW5fcGkoKToKLSAgICByZXN1bHQgPSBTdHJpbmdJTygpCi0gICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKyAgICBkZWYgdGVzdF94bWxnZW5fcGkoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKIAotICAgIGdlbi5zdGFydERvY3VtZW50KCkKLSAgICBnZW4ucHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ0ZXN0IiwgImRhdGEiKQotICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQotICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQotICAgIGdlbi5lbmREb2N1bWVudCgpCisgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnByb2Nlc3NpbmdJbnN0cnVjdGlvbigidGVzdCIsICJkYXRhIikKKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudCgiZG9jIiwge30pCisgICAgICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQorICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQogCi0gICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0ICsgIjw/dGVzdCBkYXRhPz48ZG9jPjwvZG9jPiIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjw/dGVzdCBkYXRhPz48ZG9jPjwvZG9jPiIpCiAKLWRlZiB0ZXN0X3htbGdlbl9jb250ZW50X2VzY2FwZSgpOgotICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKLSAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorICAgIGRlZiB0ZXN0X3htbGdlbl9jb250ZW50X2VzY2FwZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQogCi0gICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQotICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQotICAgIGdlbi5jaGFyYWN0ZXJzKCI8aHVoZWkmIikKLSAgICBnZW4uZW5kRWxlbWVudCgiZG9jIikKLSAgICBnZW4uZW5kRG9jdW1lbnQoKQorICAgICAgICBnZW4uc3RhcnREb2N1bWVudCgpCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQorICAgICAgICBnZW4uY2hhcmFjdGVycygiPGh1aGVpJiIpCisgICAgICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQorICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQogCi0gICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0ICsgIjxkb2M+Jmx0O2h1aGVpJmFtcDs8L2RvYz4iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXR2YWx1ZSgpLAorICAgICAgICAgICAgc3RhcnQgKyAiPGRvYz4mbHQ7aHVoZWkmYW1wOzwvZG9jPiIpCiAKLWRlZiB0ZXN0X3htbGdlbl9hdHRyX2VzY2FwZSgpOgotICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKLSAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorICAgIGRlZiB0ZXN0X3htbGdlbl9hdHRyX2VzY2FwZShzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQogCi0gICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQotICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHsiYSI6ICciJ30pCi0gICAgZ2VuLnN0YXJ0RWxlbWVudCgiZSIsIHsiYSI6ICInIn0pCi0gICAgZ2VuLmVuZEVsZW1lbnQoImUiKQotICAgIGdlbi5zdGFydEVsZW1lbnQoImUiLCB7ImEiOiAiJ1wiIn0pCi0gICAgZ2VuLmVuZEVsZW1lbnQoImUiKQotICAgIGdlbi5zdGFydEVsZW1lbnQoImUiLCB7ImEiOiAiXG5cclx0In0pCi0gICAgZ2VuLmVuZEVsZW1lbnQoImUiKQotICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQotICAgIGdlbi5lbmREb2N1bWVudCgpCisgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudCgiZG9jIiwgeyJhIjogJyInfSkKKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudCgiZSIsIHsiYSI6ICInIn0pCisgICAgICAgIGdlbi5lbmRFbGVtZW50KCJlIikKKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudCgiZSIsIHsiYSI6ICInXCIifSkKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnQoImUiKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJlIiwgeyJhIjogIlxuXHJcdCJ9KQorICAgICAgICBnZW4uZW5kRWxlbWVudCgiZSIpCisgICAgICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQorICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQogCi0gICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0ICsgKCI8ZG9jIGE9J1wiJz48ZSBhPVwiJ1wiPjwvZT4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZSBhPVwiJyZxdW90O1wiPjwvZT4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZSBhPVwiJiMxMDsmIzEzOyYjOTtcIj48L2U+PC9kb2M+IikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsKKyAgICAgICAgICAgICgiPGRvYyBhPSdcIic+PGUgYT1cIidcIj48L2U+IgorICAgICAgICAgICAgICI8ZSBhPVwiJyZxdW90O1wiPjwvZT4iCisgICAgICAgICAgICAgIjxlIGE9XCImIzEwOyYjMTM7JiM5O1wiPjwvZT48L2RvYz4iKSkKIAotZGVmIHRlc3RfeG1sZ2VuX2lnbm9yYWJsZSgpOgotICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKLSAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorICAgIGRlZiB0ZXN0X3htbGdlbl9pZ25vcmFibGUoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKIAotICAgIGdlbi5zdGFydERvY3VtZW50KCkKLSAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKLSAgICBnZW4uaWdub3JhYmxlV2hpdGVzcGFjZSgiICIpCi0gICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCi0gICAgZ2VuLmVuZERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKKyAgICAgICAgZ2VuLmlnbm9yYWJsZVdoaXRlc3BhY2UoIiAiKQorICAgICAgICBnZW4uZW5kRWxlbWVudCgiZG9jIikKKyAgICAgICAgZ2VuLmVuZERvY3VtZW50KCkKIAotICAgIHJldHVybiByZXN1bHQuZ2V0dmFsdWUoKSA9PSBzdGFydCArICI8ZG9jPiA8L2RvYz4iCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXR2YWx1ZSgpLCBzdGFydCArICI8ZG9jPiA8L2RvYz4iKQogCi1uc191cmkgPSAiaHR0cDovL3d3dy5weXRob24ub3JnL3htbC1ucy9zYXh0ZXN0LyIKKyAgICBkZWYgdGVzdF94bWxnZW5fbnMoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKIAotZGVmIHRlc3RfeG1sZ2VuX25zKCk6Ci0gICAgcmVzdWx0ID0gU3RyaW5nSU8oKQotICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnN0YXJ0UHJlZml4TWFwcGluZygibnMxIiwgbnNfdXJpKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50TlMoKG5zX3VyaSwgImRvYyIpLCAibnMxOmRvYyIsIHt9KQorICAgICAgICAjIGFkZCBhbiB1bnF1YWxpZmllZCBuYW1lCisgICAgICAgIGdlbi5zdGFydEVsZW1lbnROUygoTm9uZSwgInVkb2MiKSwgTm9uZSwge30pCisgICAgICAgIGdlbi5lbmRFbGVtZW50TlMoKE5vbmUsICJ1ZG9jIiksIE5vbmUpCisgICAgICAgIGdlbi5lbmRFbGVtZW50TlMoKG5zX3VyaSwgImRvYyIpLCAibnMxOmRvYyIpCisgICAgICAgIGdlbi5lbmRQcmVmaXhNYXBwaW5nKCJuczEiKQorICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQogCi0gICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQotICAgIGdlbi5zdGFydFByZWZpeE1hcHBpbmcoIm5zMSIsIG5zX3VyaSkKLSAgICBnZW4uc3RhcnRFbGVtZW50TlMoKG5zX3VyaSwgImRvYyIpLCAibnMxOmRvYyIsIHt9KQotICAgICMgYWRkIGFuIHVucXVhbGlmaWVkIG5hbWUKLSAgICBnZW4uc3RhcnRFbGVtZW50TlMoKE5vbmUsICJ1ZG9jIiksIE5vbmUsIHt9KQotICAgIGdlbi5lbmRFbGVtZW50TlMoKE5vbmUsICJ1ZG9jIiksIE5vbmUpCi0gICAgZ2VuLmVuZEVsZW1lbnROUygobnNfdXJpLCAiZG9jIiksICJuczE6ZG9jIikKLSAgICBnZW4uZW5kUHJlZml4TWFwcGluZygibnMxIikKLSAgICBnZW4uZW5kRG9jdW1lbnQoKQotCi0gICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0ICsgXAorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQgKyBcCiAgICAgICAgICAgICgnPG5zMTpkb2MgeG1sbnM6bnMxPSIlcyI+PHVkb2M+PC91ZG9jPjwvbnMxOmRvYz4nICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNfdXJpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc191cmkpKQogCi1kZWYgdGVzdF8xNDYzMDI2XzEoKToKLSAgICByZXN1bHQgPSBTdHJpbmdJTygpCi0gICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKyAgICBkZWYgdGVzdF8xNDYzMDI2XzEoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKIAotICAgIGdlbi5zdGFydERvY3VtZW50KCkKLSAgICBnZW4uc3RhcnRFbGVtZW50TlMoKE5vbmUsICdhJyksICdhJywgeyhOb25lLCAnYicpOidjJ30pCi0gICAgZ2VuLmVuZEVsZW1lbnROUygoTm9uZSwgJ2EnKSwgJ2EnKQotICAgIGdlbi5lbmREb2N1bWVudCgpCisgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudE5TKChOb25lLCAnYScpLCAnYScsIHsoTm9uZSwgJ2InKTonYyd9KQorICAgICAgICBnZW4uZW5kRWxlbWVudE5TKChOb25lLCAnYScpLCAnYScpCisgICAgICAgIGdlbi5lbmREb2N1bWVudCgpCiAKLSAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0gc3RhcnQrJzxhIGI9ImMiPjwvYT4nCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXR2YWx1ZSgpLCBzdGFydCsnPGEgYj0iYyI+PC9hPicpCiAKLWRlZiB0ZXN0XzE0NjMwMjZfMigpOgotICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKLSAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorICAgIGRlZiB0ZXN0XzE0NjMwMjZfMihzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQogCi0gICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQotICAgIGdlbi5zdGFydFByZWZpeE1hcHBpbmcoTm9uZSwgJ3F1eCcpCi0gICAgZ2VuLnN0YXJ0RWxlbWVudE5TKCgncXV4JywgJ2EnKSwgJ2EnLCB7fSkKLSAgICBnZW4uZW5kRWxlbWVudE5TKCgncXV4JywgJ2EnKSwgJ2EnKQotICAgIGdlbi5lbmRQcmVmaXhNYXBwaW5nKE5vbmUpCi0gICAgZ2VuLmVuZERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQorICAgICAgICBnZW4uc3RhcnRQcmVmaXhNYXBwaW5nKE5vbmUsICdxdXgnKQorICAgICAgICBnZW4uc3RhcnRFbGVtZW50TlMoKCdxdXgnLCAnYScpLCAnYScsIHt9KQorICAgICAgICBnZW4uZW5kRWxlbWVudE5TKCgncXV4JywgJ2EnKSwgJ2EnKQorICAgICAgICBnZW4uZW5kUHJlZml4TWFwcGluZyhOb25lKQorICAgICAgICBnZW4uZW5kRG9jdW1lbnQoKQogCi0gICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0Kyc8YSB4bWxucz0icXV4Ij48L2E+JworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQrJzxhIHhtbG5zPSJxdXgiPjwvYT4nKQogCi1kZWYgdGVzdF8xNDYzMDI2XzMoKToKLSAgICByZXN1bHQgPSBTdHJpbmdJTygpCi0gICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKyAgICBkZWYgdGVzdF8xNDYzMDI2XzMoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKIAotICAgIGdlbi5zdGFydERvY3VtZW50KCkKLSAgICBnZW4uc3RhcnRQcmVmaXhNYXBwaW5nKCdteScsICdxdXgnKQotICAgIGdlbi5zdGFydEVsZW1lbnROUygoJ3F1eCcsICdhJyksICdhJywgeyhOb25lLCAnYicpOidjJ30pCi0gICAgZ2VuLmVuZEVsZW1lbnROUygoJ3F1eCcsICdhJyksICdhJykKLSAgICBnZW4uZW5kUHJlZml4TWFwcGluZygnbXknKQotICAgIGdlbi5lbmREb2N1bWVudCgpCisgICAgICAgIGdlbi5zdGFydERvY3VtZW50KCkKKyAgICAgICAgZ2VuLnN0YXJ0UHJlZml4TWFwcGluZygnbXknLCAncXV4JykKKyAgICAgICAgZ2VuLnN0YXJ0RWxlbWVudE5TKCgncXV4JywgJ2EnKSwgJ2EnLCB7KE5vbmUsICdiJyk6J2MnfSkKKyAgICAgICAgZ2VuLmVuZEVsZW1lbnROUygoJ3F1eCcsICdhJyksICdhJykKKyAgICAgICAgZ2VuLmVuZFByZWZpeE1hcHBpbmcoJ215JykKKyAgICAgICAgZ2VuLmVuZERvY3VtZW50KCkKIAotICAgIHJldHVybiByZXN1bHQuZ2V0dmFsdWUoKSA9PSBzdGFydCsnPG15OmEgeG1sbnM6bXk9InF1eCIgYj0iYyI+PC9teTphPicKLSAgICAKLSMgPT09PT0gWG1sZmlsdGVyYmFzZQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0dmFsdWUoKSwKKyAgICAgICAgICAgIHN0YXJ0Kyc8bXk6YSB4bWxuczpteT0icXV4IiBiPSJjIj48L215OmE+JykKIAotZGVmIHRlc3RfZmlsdGVyX2Jhc2ljKCk6Ci0gICAgcmVzdWx0ID0gU3RyaW5nSU8oKQotICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCi0gICAgZmlsdGVyID0gWE1MRmlsdGVyQmFzZSgpCi0gICAgZmlsdGVyLnNldENvbnRlbnRIYW5kbGVyKGdlbikKIAotICAgIGZpbHRlci5zdGFydERvY3VtZW50KCkKLSAgICBmaWx0ZXIuc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKLSAgICBmaWx0ZXIuY2hhcmFjdGVycygiY29udGVudCIpCi0gICAgZmlsdGVyLmlnbm9yYWJsZVdoaXRlc3BhY2UoIiAiKQotICAgIGZpbHRlci5lbmRFbGVtZW50KCJkb2MiKQotICAgIGZpbHRlci5lbmREb2N1bWVudCgpCitjbGFzcyBYTUxGaWx0ZXJCYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisgICAgZGVmIHRlc3RfZmlsdGVyX2Jhc2ljKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisgICAgICAgIGZpbHRlciA9IFhNTEZpbHRlckJhc2UoKQorICAgICAgICBmaWx0ZXIuc2V0Q29udGVudEhhbmRsZXIoZ2VuKQogCi0gICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0ICsgIjxkb2M+Y29udGVudCA8L2RvYz4iCisgICAgICAgIGZpbHRlci5zdGFydERvY3VtZW50KCkKKyAgICAgICAgZmlsdGVyLnN0YXJ0RWxlbWVudCgiZG9jIiwge30pCisgICAgICAgIGZpbHRlci5jaGFyYWN0ZXJzKCJjb250ZW50IikKKyAgICAgICAgZmlsdGVyLmlnbm9yYWJsZVdoaXRlc3BhY2UoIiAiKQorICAgICAgICBmaWx0ZXIuZW5kRWxlbWVudCgiZG9jIikKKyAgICAgICAgZmlsdGVyLmVuZERvY3VtZW50KCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQgKyAiPGRvYz5jb250ZW50IDwvZG9jPiIpCiAKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAjCkBAIC0yNzYsMjI5ICszMTEsMjMzIEBACiAjCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0jID09PT09IFhNTFJlYWRlciBzdXBwb3J0Ci0KLWRlZiB0ZXN0X2V4cGF0X2ZpbGUoKToKLSAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKLSAgICByZXN1bHQgPSBTdHJpbmdJTygpCi0gICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKLQotICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCi0gICAgcGFyc2VyLnBhcnNlKG9wZW4oZmluZGZpbGUoInRlc3QiK29zLmV4dHNlcCsieG1sIikpKQotCi0gICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHhtbF90ZXN0X291dAotCi0jID09PT09IERUREhhbmRsZXIgc3VwcG9ydAotCi1jbGFzcyBUZXN0RFRESGFuZGxlcjoKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5fbm90YXRpb25zID0gW10KLSAgICAgICAgc2VsZi5fZW50aXRpZXMgID0gW10KLQotICAgIGRlZiBub3RhdGlvbkRlY2woc2VsZiwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKToKLSAgICAgICAgc2VsZi5fbm90YXRpb25zLmFwcGVuZCgobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKSkKLQotICAgIGRlZiB1bnBhcnNlZEVudGl0eURlY2woc2VsZiwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBuZGF0YSk6Ci0gICAgICAgIHNlbGYuX2VudGl0aWVzLmFwcGVuZCgobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBuZGF0YSkpCi0KLWRlZiB0ZXN0X2V4cGF0X2R0ZGhhbmRsZXIoKToKLSAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKLSAgICBoYW5kbGVyID0gVGVzdERUREhhbmRsZXIoKQotICAgIHBhcnNlci5zZXREVERIYW5kbGVyKGhhbmRsZXIpCi0KLSAgICBwYXJzZXIuZmVlZCgnPCFET0NUWVBFIGRvYyBbXG4nKQotICAgIHBhcnNlci5mZWVkKCcgIDwhRU5USVRZIGltZyBTWVNURU0gImV4cGF0LmdpZiIgTkRBVEEgR0lGPlxuJykKLSAgICBwYXJzZXIuZmVlZCgnICA8IU5PVEFUSU9OIEdJRiBQVUJMSUMgIi0vL0NvbXB1U2VydmUvL05PVEFUSU9OIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdCA4OWEvL0VOIj5cbicpCi0gICAgcGFyc2VyLmZlZWQoJ10+XG4nKQotICAgIHBhcnNlci5mZWVkKCc8ZG9jPjwvZG9jPicpCi0gICAgcGFyc2VyLmNsb3NlKCkKLQotICAgIHJldHVybiBoYW5kbGVyLl9ub3RhdGlvbnMgPT0gWygiR0lGIiwgIi0vL0NvbXB1U2VydmUvL05PVEFUSU9OIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdCA4OWEvL0VOIiwgTm9uZSldIGFuZCBcCi0gICAgICAgICAgIGhhbmRsZXIuX2VudGl0aWVzID09IFsoImltZyIsIE5vbmUsICJleHBhdC5naWYiLCAiR0lGIildCi0KLSMgPT09PT0gRW50aXR5UmVzb2x2ZXIgc3VwcG9ydAotCi1jbGFzcyBUZXN0RW50aXR5UmVzb2x2ZXI6Ci0KLSAgICBkZWYgcmVzb2x2ZUVudGl0eShzZWxmLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgotICAgICAgICBpbnBzcmMgPSBJbnB1dFNvdXJjZSgpCi0gICAgICAgIGlucHNyYy5zZXRCeXRlU3RyZWFtKFN0cmluZ0lPKCI8ZW50aXR5Lz4iKSkKLSAgICAgICAgcmV0dXJuIGlucHNyYwotCi1kZWYgdGVzdF9leHBhdF9lbnRpdHlyZXNvbHZlcigpOgotICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQotICAgIHBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihUZXN0RW50aXR5UmVzb2x2ZXIoKSkKLSAgICByZXN1bHQgPSBTdHJpbmdJTygpCi0gICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKFhNTEdlbmVyYXRvcihyZXN1bHQpKQotCi0gICAgcGFyc2VyLmZlZWQoJzwhRE9DVFlQRSBkb2MgW1xuJykKLSAgICBwYXJzZXIuZmVlZCgnICA8IUVOVElUWSB0ZXN0IFNZU1RFTSAid2hhdGV2ZXIiPlxuJykKLSAgICBwYXJzZXIuZmVlZCgnXT5cbicpCi0gICAgcGFyc2VyLmZlZWQoJzxkb2M+JnRlc3Q7PC9kb2M+JykKLSAgICBwYXJzZXIuY2xvc2UoKQotCi0gICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0ICsgIjxkb2M+PGVudGl0eT48L2VudGl0eT48L2RvYz4iCi0KLSMgPT09PT0gQXR0cmlidXRlcyBzdXBwb3J0Ci0KLWNsYXNzIEF0dHJHYXRoZXJlcihDb250ZW50SGFuZGxlcik6Ci0KLSAgICBkZWYgc3RhcnRFbGVtZW50KHNlbGYsIG5hbWUsIGF0dHJzKToKLSAgICAgICAgc2VsZi5fYXR0cnMgPSBhdHRycwotCi0gICAgZGVmIHN0YXJ0RWxlbWVudE5TKHNlbGYsIG5hbWUsIHFuYW1lLCBhdHRycyk6Ci0gICAgICAgIHNlbGYuX2F0dHJzID0gYXR0cnMKLQotZGVmIHRlc3RfZXhwYXRfYXR0cnNfZW1wdHkoKToKLSAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKLSAgICBnYXRoZXIgPSBBdHRyR2F0aGVyZXIoKQotICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihnYXRoZXIpCi0KLSAgICBwYXJzZXIuZmVlZCgiPGRvYy8+IikKLSAgICBwYXJzZXIuY2xvc2UoKQotCi0gICAgcmV0dXJuIHZlcmlmeV9lbXB0eV9hdHRycyhnYXRoZXIuX2F0dHJzKQotCi1kZWYgdGVzdF9leHBhdF9hdHRyc193YXR0cigpOgotICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQotICAgIGdhdGhlciA9IEF0dHJHYXRoZXJlcigpCi0gICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKGdhdGhlcikKLQotICAgIHBhcnNlci5mZWVkKCI8ZG9jIGF0dHI9J3ZhbCcvPiIpCi0gICAgcGFyc2VyLmNsb3NlKCkKLQotICAgIHJldHVybiB2ZXJpZnlfYXR0cnNfd2F0dHIoZ2F0aGVyLl9hdHRycykKLQotZGVmIHRlc3RfZXhwYXRfbnNhdHRyc19lbXB0eSgpOgotICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoMSkKLSAgICBnYXRoZXIgPSBBdHRyR2F0aGVyZXIoKQotICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihnYXRoZXIpCi0KLSAgICBwYXJzZXIuZmVlZCgiPGRvYy8+IikKLSAgICBwYXJzZXIuY2xvc2UoKQotCi0gICAgcmV0dXJuIHZlcmlmeV9lbXB0eV9uc2F0dHJzKGdhdGhlci5fYXR0cnMpCi0KLWRlZiB0ZXN0X2V4cGF0X25zYXR0cnNfd2F0dHIoKToKLSAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKDEpCi0gICAgZ2F0aGVyID0gQXR0ckdhdGhlcmVyKCkKLSAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoZ2F0aGVyKQotCi0gICAgcGFyc2VyLmZlZWQoIjxkb2MgeG1sbnM6bnM9JyVzJyBuczphdHRyPSd2YWwnLz4iICUgbnNfdXJpKQotICAgIHBhcnNlci5jbG9zZSgpCi0KLSAgICBhdHRycyA9IGdhdGhlci5fYXR0cnMKLQotICAgIHJldHVybiBhdHRycy5nZXRMZW5ndGgoKSA9PSAxIGFuZCBcCi0gICAgICAgICAgIGF0dHJzLmdldE5hbWVzKCkgPT0gWyhuc191cmksICJhdHRyIildIGFuZCBcCi0gICAgICAgICAgIChhdHRycy5nZXRRTmFtZXMoKSA9PSBbXSBvciBhdHRycy5nZXRRTmFtZXMoKSA9PSBbIm5zOmF0dHIiXSkgYW5kIFwKLSAgICAgICAgICAgbGVuKGF0dHJzKSA9PSAxIGFuZCBcCi0gICAgICAgICAgIChuc191cmksICJhdHRyIikgaW4gYXR0cnMgYW5kIFwKLSAgICAgICAgICAgbGlzdChhdHRycy5rZXlzKCkpID09IFsobnNfdXJpLCAiYXR0ciIpXSBhbmQgXAotICAgICAgICAgICBhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSkgPT0gInZhbCIgYW5kIFwKLSAgICAgICAgICAgYXR0cnMuZ2V0KChuc191cmksICJhdHRyIiksIDI1KSA9PSAidmFsIiBhbmQgXAotICAgICAgICAgICBsaXN0KGF0dHJzLml0ZW1zKCkpID09IFsoKG5zX3VyaSwgImF0dHIiKSwgInZhbCIpXSBhbmQgXAotICAgICAgICAgICBsaXN0KGF0dHJzLnZhbHVlcygpKSA9PSBbInZhbCJdIGFuZCBcCi0gICAgICAgICAgIGF0dHJzLmdldFZhbHVlKChuc191cmksICJhdHRyIikpID09ICJ2YWwiIGFuZCBcCi0gICAgICAgICAgIGF0dHJzWyhuc191cmksICJhdHRyIildID09ICJ2YWwiCi0KLSMgPT09PT0gSW5wdXRTb3VyY2Ugc3VwcG9ydAotCiB4bWxfdGVzdF9vdXQgPSBvcGVuKGZpbmRmaWxlKCJ0ZXN0Iitvcy5leHRzZXArInhtbCIrb3MuZXh0c2VwKyJvdXQiKSkucmVhZCgpCiAKLWRlZiB0ZXN0X2V4cGF0X2lucHNvdXJjZV9maWxlbmFtZSgpOgotICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQotICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKLSAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorY2xhc3MgRXhwYXRSZWFkZXJUZXN0KFhtbFRlc3RCYXNlKToKIAotICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCi0gICAgcGFyc2VyLnBhcnNlKGZpbmRmaWxlKCJ0ZXN0Iitvcy5leHRzZXArInhtbCIpKQorICAgICMgPT09PT0gWE1MUmVhZGVyIHN1cHBvcnQKIAotICAgIHJldHVybiByZXN1bHQuZ2V0dmFsdWUoKSA9PSB4bWxfdGVzdF9vdXQKKyAgICBkZWYgdGVzdF9leHBhdF9maWxlKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQogCi1kZWYgdGVzdF9leHBhdF9pbnBzb3VyY2Vfc3lzaWQoKToKLSAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKLSAgICByZXN1bHQgPSBTdHJpbmdJTygpCi0gICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKKyAgICAgICAgcGFyc2VyLnBhcnNlKG9wZW4oZmluZGZpbGUoInRlc3QiK29zLmV4dHNlcCsieG1sIikpKQogCi0gICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKLSAgICBwYXJzZXIucGFyc2UoSW5wdXRTb3VyY2UoZmluZGZpbGUoInRlc3QiK29zLmV4dHNlcCsieG1sIikpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0dmFsdWUoKSwgeG1sX3Rlc3Rfb3V0KQogCi0gICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHhtbF90ZXN0X291dAorICAgICMgPT09PT0gRFRESGFuZGxlciBzdXBwb3J0CiAKLWRlZiB0ZXN0X2V4cGF0X2lucHNvdXJjZV9zdHJlYW0oKToKLSAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKLSAgICByZXN1bHQgPSBTdHJpbmdJTygpCi0gICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKyAgICBjbGFzcyBUZXN0RFRESGFuZGxlcjoKIAotICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCi0gICAgaW5wc3JjID0gSW5wdXRTb3VyY2UoKQotICAgIGlucHNyYy5zZXRCeXRlU3RyZWFtKG9wZW4oZmluZGZpbGUoInRlc3QiK29zLmV4dHNlcCsieG1sIikpKQotICAgIHBhcnNlci5wYXJzZShpbnBzcmMpCisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgICAgIHNlbGYuX25vdGF0aW9ucyA9IFtdCisgICAgICAgICAgICBzZWxmLl9lbnRpdGllcyAgPSBbXQogCi0gICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHhtbF90ZXN0X291dAorICAgICAgICBkZWYgbm90YXRpb25EZWNsKHNlbGYsIG5hbWUsIHB1YmxpY0lkLCBzeXN0ZW1JZCk6CisgICAgICAgICAgICBzZWxmLl9ub3RhdGlvbnMuYXBwZW5kKChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpKQogCi0jID09PT09IEluY3JlbWVudGFsUGFyc2VyIHN1cHBvcnQKKyAgICAgICAgZGVmIHVucGFyc2VkRW50aXR5RGVjbChzZWxmLCBuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG5kYXRhKToKKyAgICAgICAgICAgIHNlbGYuX2VudGl0aWVzLmFwcGVuZCgobmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBuZGF0YSkpCiAKLWRlZiB0ZXN0X2V4cGF0X2luY3JlbWVudGFsKCk6Ci0gICAgcmVzdWx0ID0gU3RyaW5nSU8oKQotICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCi0gICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCi0gICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKKyAgICBkZWYgdGVzdF9leHBhdF9kdGRoYW5kbGVyKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICAgICAgaGFuZGxlciA9IHNlbGYuVGVzdERUREhhbmRsZXIoKQorICAgICAgICBwYXJzZXIuc2V0RFRESGFuZGxlcihoYW5kbGVyKQogCi0gICAgcGFyc2VyLmZlZWQoIjxkb2M+IikKLSAgICBwYXJzZXIuZmVlZCgiPC9kb2M+IikKLSAgICBwYXJzZXIuY2xvc2UoKQorICAgICAgICBwYXJzZXIuZmVlZCgnPCFET0NUWVBFIGRvYyBbXG4nKQorICAgICAgICBwYXJzZXIuZmVlZCgnICA8IUVOVElUWSBpbWcgU1lTVEVNICJleHBhdC5naWYiIE5EQVRBIEdJRj5cbicpCisgICAgICAgIHBhcnNlci5mZWVkKCcgIDwhTk9UQVRJT04gR0lGIFBVQkxJQyAiLS8vQ29tcHVTZXJ2ZS8vTk9UQVRJT04gR3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0IDg5YS8vRU4iPlxuJykKKyAgICAgICAgcGFyc2VyLmZlZWQoJ10+XG4nKQorICAgICAgICBwYXJzZXIuZmVlZCgnPGRvYz48L2RvYz4nKQorICAgICAgICBwYXJzZXIuY2xvc2UoKQogCi0gICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0ICsgIjxkb2M+PC9kb2M+IgorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhoYW5kbGVyLl9ub3RhdGlvbnMsCisgICAgICAgICAgICBbKCJHSUYiLCAiLS8vQ29tcHVTZXJ2ZS8vTk9UQVRJT04gR3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0IDg5YS8vRU4iLCBOb25lKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGhhbmRsZXIuX2VudGl0aWVzLCBbKCJpbWciLCBOb25lLCAiZXhwYXQuZ2lmIiwgIkdJRiIpXSkKIAotZGVmIHRlc3RfZXhwYXRfaW5jcmVtZW50YWxfcmVzZXQoKToKLSAgICByZXN1bHQgPSBTdHJpbmdJTygpCi0gICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKLSAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKLSAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorICAgICMgPT09PT0gRW50aXR5UmVzb2x2ZXIgc3VwcG9ydAogCi0gICAgcGFyc2VyLmZlZWQoIjxkb2M+IikKLSAgICBwYXJzZXIuZmVlZCgidGV4dCIpCisgICAgY2xhc3MgVGVzdEVudGl0eVJlc29sdmVyOgogCi0gICAgcmVzdWx0ID0gU3RyaW5nSU8oKQotICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCi0gICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKLSAgICBwYXJzZXIucmVzZXQoKQorICAgICAgICBkZWYgcmVzb2x2ZUVudGl0eShzZWxmLCBwdWJsaWNJZCwgc3lzdGVtSWQpOgorICAgICAgICAgICAgaW5wc3JjID0gSW5wdXRTb3VyY2UoKQorICAgICAgICAgICAgaW5wc3JjLnNldEJ5dGVTdHJlYW0oU3RyaW5nSU8oIjxlbnRpdHkvPiIpKQorICAgICAgICAgICAgcmV0dXJuIGlucHNyYwogCi0gICAgcGFyc2VyLmZlZWQoIjxkb2M+IikKLSAgICBwYXJzZXIuZmVlZCgidGV4dCIpCi0gICAgcGFyc2VyLmZlZWQoIjwvZG9jPiIpCi0gICAgcGFyc2VyLmNsb3NlKCkKKyAgICBkZWYgdGVzdF9leHBhdF9lbnRpdHlyZXNvbHZlcihzZWxmKToKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHBhcnNlci5zZXRFbnRpdHlSZXNvbHZlcihzZWxmLlRlc3RFbnRpdHlSZXNvbHZlcigpKQorICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihYTUxHZW5lcmF0b3IocmVzdWx0KSkKIAotICAgIHJldHVybiByZXN1bHQuZ2V0dmFsdWUoKSA9PSBzdGFydCArICI8ZG9jPnRleHQ8L2RvYz4iCisgICAgICAgIHBhcnNlci5mZWVkKCc8IURPQ1RZUEUgZG9jIFtcbicpCisgICAgICAgIHBhcnNlci5mZWVkKCcgIDwhRU5USVRZIHRlc3QgU1lTVEVNICJ3aGF0ZXZlciI+XG4nKQorICAgICAgICBwYXJzZXIuZmVlZCgnXT5cbicpCisgICAgICAgIHBhcnNlci5mZWVkKCc8ZG9jPiZ0ZXN0OzwvZG9jPicpCisgICAgICAgIHBhcnNlci5jbG9zZSgpCiAKLSMgPT09PT0gTG9jYXRvciBzdXBwb3J0CisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXR2YWx1ZSgpLCBzdGFydCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZG9jPjxlbnRpdHk+PC9lbnRpdHk+PC9kb2M+IikKIAotZGVmIHRlc3RfZXhwYXRfbG9jYXRvcl9ub2luZm8oKToKLSAgICByZXN1bHQgPSBTdHJpbmdJTygpCi0gICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKLSAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKLSAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorICAgICMgPT09PT0gQXR0cmlidXRlcyBzdXBwb3J0CiAKLSAgICBwYXJzZXIuZmVlZCgiPGRvYz4iKQotICAgIHBhcnNlci5mZWVkKCI8L2RvYz4iKQotICAgIHBhcnNlci5jbG9zZSgpCisgICAgY2xhc3MgQXR0ckdhdGhlcmVyKENvbnRlbnRIYW5kbGVyKToKIAotICAgIHJldHVybiBwYXJzZXIuZ2V0U3lzdGVtSWQoKSBpcyBOb25lIGFuZCBcCi0gICAgICAgICAgIHBhcnNlci5nZXRQdWJsaWNJZCgpIGlzIE5vbmUgYW5kIFwKLSAgICAgICAgICAgcGFyc2VyLmdldExpbmVOdW1iZXIoKSA9PSAxCisgICAgICAgIGRlZiBzdGFydEVsZW1lbnQoc2VsZiwgbmFtZSwgYXR0cnMpOgorICAgICAgICAgICAgc2VsZi5fYXR0cnMgPSBhdHRycwogCi1kZWYgdGVzdF9leHBhdF9sb2NhdG9yX3dpdGhpbmZvKCk6Ci0gICAgcmVzdWx0ID0gU3RyaW5nSU8oKQotICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCi0gICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCi0gICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKLSAgICBwYXJzZXIucGFyc2UoZmluZGZpbGUoInRlc3QueG1sIikpCisgICAgICAgIGRlZiBzdGFydEVsZW1lbnROUyhzZWxmLCBuYW1lLCBxbmFtZSwgYXR0cnMpOgorICAgICAgICAgICAgc2VsZi5fYXR0cnMgPSBhdHRycwogCi0gICAgcmV0dXJuIHBhcnNlci5nZXRTeXN0ZW1JZCgpID09IGZpbmRmaWxlKCJ0ZXN0LnhtbCIpIGFuZCBcCi0gICAgICAgICAgIHBhcnNlci5nZXRQdWJsaWNJZCgpIGlzIE5vbmUKKyAgICBkZWYgdGVzdF9leHBhdF9hdHRyc19lbXB0eShzZWxmKToKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIGdhdGhlciA9IHNlbGYuQXR0ckdhdGhlcmVyKCkKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKGdhdGhlcikKKworICAgICAgICBwYXJzZXIuZmVlZCgiPGRvYy8+IikKKyAgICAgICAgcGFyc2VyLmNsb3NlKCkKKworICAgICAgICBzZWxmLnZlcmlmeV9lbXB0eV9hdHRycyhnYXRoZXIuX2F0dHJzKQorCisgICAgZGVmIHRlc3RfZXhwYXRfYXR0cnNfd2F0dHIoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICBnYXRoZXIgPSBzZWxmLkF0dHJHYXRoZXJlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihnYXRoZXIpCisKKyAgICAgICAgcGFyc2VyLmZlZWQoIjxkb2MgYXR0cj0ndmFsJy8+IikKKyAgICAgICAgcGFyc2VyLmNsb3NlKCkKKworICAgICAgICBzZWxmLnZlcmlmeV9hdHRyc193YXR0cihnYXRoZXIuX2F0dHJzKQorCisgICAgZGVmIHRlc3RfZXhwYXRfbnNhdHRyc19lbXB0eShzZWxmKToKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigxKQorICAgICAgICBnYXRoZXIgPSBzZWxmLkF0dHJHYXRoZXJlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihnYXRoZXIpCisKKyAgICAgICAgcGFyc2VyLmZlZWQoIjxkb2MvPiIpCisgICAgICAgIHBhcnNlci5jbG9zZSgpCisKKyAgICAgICAgc2VsZi52ZXJpZnlfZW1wdHlfbnNhdHRycyhnYXRoZXIuX2F0dHJzKQorCisgICAgZGVmIHRlc3RfZXhwYXRfbnNhdHRyc193YXR0cihzZWxmKToKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigxKQorICAgICAgICBnYXRoZXIgPSBzZWxmLkF0dHJHYXRoZXJlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihnYXRoZXIpCisKKyAgICAgICAgcGFyc2VyLmZlZWQoIjxkb2MgeG1sbnM6bnM9JyVzJyBuczphdHRyPSd2YWwnLz4iICUgbnNfdXJpKQorICAgICAgICBwYXJzZXIuY2xvc2UoKQorCisgICAgICAgIGF0dHJzID0gZ2F0aGVyLl9hdHRycworCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLmdldExlbmd0aCgpLCAxKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRycy5nZXROYW1lcygpLCBbKG5zX3VyaSwgImF0dHIiKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgoYXR0cnMuZ2V0UU5hbWVzKCkgPT0gW10gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5nZXRRTmFtZXMoKSA9PSBbIm5zOmF0dHIiXSkpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxlbihhdHRycyksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgobnNfdXJpLCAiYXR0ciIpIGluIGF0dHJzKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSksICJ2YWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSwgMjUpLCAidmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGlzdChhdHRycy5pdGVtcygpKSwgWygobnNfdXJpLCAiYXR0ciIpLCAidmFsIildKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsaXN0KGF0dHJzLnZhbHVlcygpKSwgWyJ2YWwiXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXR0cnMuZ2V0VmFsdWUoKG5zX3VyaSwgImF0dHIiKSksICJ2YWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRyc1sobnNfdXJpLCAiYXR0ciIpXSwgInZhbCIpCisKKyAgICAjID09PT09IElucHV0U291cmNlIHN1cHBvcnQKKworICAgIGRlZiB0ZXN0X2V4cGF0X2lucHNvdXJjZV9maWxlbmFtZShzZWxmKToKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKworICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorICAgICAgICBwYXJzZXIucGFyc2UoZmluZGZpbGUoInRlc3QiK29zLmV4dHNlcCsieG1sIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LmdldHZhbHVlKCksIHhtbF90ZXN0X291dCkKKworICAgIGRlZiB0ZXN0X2V4cGF0X2lucHNvdXJjZV9zeXNpZChzZWxmKToKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKworICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorICAgICAgICBwYXJzZXIucGFyc2UoSW5wdXRTb3VyY2UoZmluZGZpbGUoInRlc3QiK29zLmV4dHNlcCsieG1sIikpKQorCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXR2YWx1ZSgpLCB4bWxfdGVzdF9vdXQpCisKKyAgICBkZWYgdGVzdF9leHBhdF9pbnBzb3VyY2Vfc3RyZWFtKHNlbGYpOgorICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCisgICAgICAgIGlucHNyYyA9IElucHV0U291cmNlKCkKKyAgICAgICAgaW5wc3JjLnNldEJ5dGVTdHJlYW0ob3BlbihmaW5kZmlsZSgidGVzdCIrb3MuZXh0c2VwKyJ4bWwiKSkpCisgICAgICAgIHBhcnNlci5wYXJzZShpbnBzcmMpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LmdldHZhbHVlKCksIHhtbF90ZXN0X291dCkKKworICAgICMgPT09PT0gSW5jcmVtZW50YWxQYXJzZXIgc3VwcG9ydAorCisgICAgZGVmIHRlc3RfZXhwYXRfaW5jcmVtZW50YWwoc2VsZik6CisgICAgICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKKyAgICAgICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCisKKyAgICAgICAgcGFyc2VyLmZlZWQoIjxkb2M+IikKKyAgICAgICAgcGFyc2VyLmZlZWQoIjwvZG9jPiIpCisgICAgICAgIHBhcnNlci5jbG9zZSgpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocmVzdWx0LmdldHZhbHVlKCksIHN0YXJ0ICsgIjxkb2M+PC9kb2M+IikKKworICAgIGRlZiB0ZXN0X2V4cGF0X2luY3JlbWVudGFsX3Jlc2V0KHNlbGYpOgorICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorCisgICAgICAgIHBhcnNlci5mZWVkKCI8ZG9jPiIpCisgICAgICAgIHBhcnNlci5mZWVkKCJ0ZXh0IikKKworICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCisgICAgICAgIHBhcnNlci5yZXNldCgpCisKKyAgICAgICAgcGFyc2VyLmZlZWQoIjxkb2M+IikKKyAgICAgICAgcGFyc2VyLmZlZWQoInRleHQiKQorICAgICAgICBwYXJzZXIuZmVlZCgiPC9kb2M+IikKKyAgICAgICAgcGFyc2VyLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhyZXN1bHQuZ2V0dmFsdWUoKSwgc3RhcnQgKyAiPGRvYz50ZXh0PC9kb2M+IikKKworICAgICMgPT09PT0gTG9jYXRvciBzdXBwb3J0CisKKyAgICBkZWYgdGVzdF9leHBhdF9sb2NhdG9yX25vaW5mbyhzZWxmKToKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nSU8oKQorICAgICAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQorICAgICAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKKyAgICAgICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKKworICAgICAgICBwYXJzZXIuZmVlZCgiPGRvYz4iKQorICAgICAgICBwYXJzZXIuZmVlZCgiPC9kb2M+IikKKyAgICAgICAgcGFyc2VyLmNsb3NlKCkKKworICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwYXJzZXIuZ2V0U3lzdGVtSWQoKSwgTm9uZSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VyLmdldFB1YmxpY0lkKCksIE5vbmUpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHBhcnNlci5nZXRMaW5lTnVtYmVyKCksIDEpCisKKyAgICBkZWYgdGVzdF9leHBhdF9sb2NhdG9yX3dpdGhpbmZvKHNlbGYpOgorICAgICAgICByZXN1bHQgPSBTdHJpbmdJTygpCisgICAgICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQorICAgICAgICBwYXJzZXIucGFyc2UoZmluZGZpbGUoInRlc3QueG1sIikpCisKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMocGFyc2VyLmdldFN5c3RlbUlkKCksIGZpbmRmaWxlKCJ0ZXN0LnhtbCIpKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhwYXJzZXIuZ2V0UHVibGljSWQoKSwgTm9uZSkKIAogCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtNTA3LDYzICs1NDYsNTkgQEAKICMKICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLWRlZiB0ZXN0X2V4cGF0X2lucHNvdXJjZV9sb2NhdGlvbigpOgotICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQotICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihDb250ZW50SGFuZGxlcigpKSAjIGRvIG5vdGhpbmcKLSAgICBzb3VyY2UgPSBJbnB1dFNvdXJjZSgpCi0gICAgc291cmNlLnNldEJ5dGVTdHJlYW0oU3RyaW5nSU8oIjxmb28gYmFyIGZvb2Jhcj4iKSkgICAjaWxsLWZvcm1lZAotICAgIG5hbWUgPSAiYSBmaWxlIG5hbWUiCi0gICAgc291cmNlLnNldFN5c3RlbUlkKG5hbWUpCi0gICAgdHJ5OgotICAgICAgICBwYXJzZXIucGFyc2Uoc291cmNlKQotICAgIGV4Y2VwdCBTQVhFeGNlcHRpb24gYXMgZToKLSAgICAgICAgcmV0dXJuIGUuZ2V0U3lzdGVtSWQoKSA9PSBuYW1lCitjbGFzcyBFcnJvclJlcG9ydGluZ1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgorICAgIGRlZiB0ZXN0X2V4cGF0X2lucHNvdXJjZV9sb2NhdGlvbihzZWxmKToKKyAgICAgICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCisgICAgICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihDb250ZW50SGFuZGxlcigpKSAjIGRvIG5vdGhpbmcKKyAgICAgICAgc291cmNlID0gSW5wdXRTb3VyY2UoKQorICAgICAgICBzb3VyY2Uuc2V0Qnl0ZVN0cmVhbShTdHJpbmdJTygiPGZvbyBiYXIgZm9vYmFyPiIpKSAgICNpbGwtZm9ybWVkCisgICAgICAgIG5hbWUgPSAiYSBmaWxlIG5hbWUiCisgICAgICAgIHNvdXJjZS5zZXRTeXN0ZW1JZChuYW1lKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwYXJzZXIucGFyc2Uoc291cmNlKQorICAgICAgICAgICAgc2VsZi5mYWlsKCkKKyAgICAgICAgZXhjZXB0IFNBWEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoZS5nZXRTeXN0ZW1JZCgpLCBuYW1lKQogCi1kZWYgdGVzdF9leHBhdF9pbmNvbXBsZXRlKCk6Ci0gICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCi0gICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKENvbnRlbnRIYW5kbGVyKCkpICMgZG8gbm90aGluZwotICAgIHRyeToKLSAgICAgICAgcGFyc2VyLnBhcnNlKFN0cmluZ0lPKCI8Zm9vPiIpKQotICAgIGV4Y2VwdCBTQVhQYXJzZUV4Y2VwdGlvbjoKLSAgICAgICAgcmV0dXJuIDEgIyBvaywgZXJyb3IgZm91bmQKLSAgICBlbHNlOgotICAgICAgICByZXR1cm4gMAorICAgIGRlZiB0ZXN0X2V4cGF0X2luY29tcGxldGUoc2VsZik6CisgICAgICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQorICAgICAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoQ29udGVudEhhbmRsZXIoKSkgIyBkbyBub3RoaW5nCisgICAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFNBWFBhcnNlRXhjZXB0aW9uLCBwYXJzZXIucGFyc2UsIFN0cmluZ0lPKCI8Zm9vPiIpKQogCi1kZWYgdGVzdF9zYXhfcGFyc2VfZXhjZXB0aW9uX3N0cigpOgotICAgICMgcGFzcyB2YXJpb3VzIHZhbHVlcyBmcm9tIGEgbG9jYXRvciB0byB0aGUgU0FYUGFyc2VFeGNlcHRpb24gdG8KLSAgICAjIG1ha2Ugc3VyZSB0aGF0IHRoZSBfX3N0cl9fKCkgZG9lc24ndCBmYWxsIGFwYXJ0IHdoZW4gTm9uZSBpcwotICAgICMgcGFzc2VkIGluc3RlYWQgb2YgYW4gaW50ZWdlciBsaW5lIGFuZCBjb2x1bW4gbnVtYmVyCi0gICAgIwotICAgICMgdXNlICJub3JtYWwiIHZhbHVlcyBmb3IgdGhlIGxvY2F0b3I6Ci0gICAgc3RyKFNBWFBhcnNlRXhjZXB0aW9uKCJtZXNzYWdlIiwgTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRHVtbXlMb2NhdG9yKDEsIDEpKSkKLSAgICAjIHVzZSBOb25lIGZvciB0aGUgbGluZSBudW1iZXI6Ci0gICAgc3RyKFNBWFBhcnNlRXhjZXB0aW9uKCJtZXNzYWdlIiwgTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRHVtbXlMb2NhdG9yKE5vbmUsIDEpKSkKLSAgICAjIHVzZSBOb25lIGZvciB0aGUgY29sdW1uIG51bWJlcjoKLSAgICBzdHIoU0FYUGFyc2VFeGNlcHRpb24oIm1lc3NhZ2UiLCBOb25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBEdW1teUxvY2F0b3IoMSwgTm9uZSkpKQotICAgICMgdXNlIE5vbmUgZm9yIGJvdGg6Ci0gICAgc3RyKFNBWFBhcnNlRXhjZXB0aW9uKCJtZXNzYWdlIiwgTm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgRHVtbXlMb2NhdG9yKE5vbmUsIE5vbmUpKSkKLSAgICByZXR1cm4gMQorICAgIGRlZiB0ZXN0X3NheF9wYXJzZV9leGNlcHRpb25fc3RyKHNlbGYpOgorICAgICAgICAjIHBhc3MgdmFyaW91cyB2YWx1ZXMgZnJvbSBhIGxvY2F0b3IgdG8gdGhlIFNBWFBhcnNlRXhjZXB0aW9uIHRvCisgICAgICAgICMgbWFrZSBzdXJlIHRoYXQgdGhlIF9fc3RyX18oKSBkb2Vzbid0IGZhbGwgYXBhcnQgd2hlbiBOb25lIGlzCisgICAgICAgICMgcGFzc2VkIGluc3RlYWQgb2YgYW4gaW50ZWdlciBsaW5lIGFuZCBjb2x1bW4gbnVtYmVyCisgICAgICAgICMKKyAgICAgICAgIyB1c2UgIm5vcm1hbCIgdmFsdWVzIGZvciB0aGUgbG9jYXRvcjoKKyAgICAgICAgc3RyKFNBWFBhcnNlRXhjZXB0aW9uKCJtZXNzYWdlIiwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRHVtbXlMb2NhdG9yKDEsIDEpKSkKKyAgICAgICAgIyB1c2UgTm9uZSBmb3IgdGhlIGxpbmUgbnVtYmVyOgorICAgICAgICBzdHIoU0FYUGFyc2VFeGNlcHRpb24oIm1lc3NhZ2UiLCBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5EdW1teUxvY2F0b3IoTm9uZSwgMSkpKQorICAgICAgICAjIHVzZSBOb25lIGZvciB0aGUgY29sdW1uIG51bWJlcjoKKyAgICAgICAgc3RyKFNBWFBhcnNlRXhjZXB0aW9uKCJtZXNzYWdlIiwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRHVtbXlMb2NhdG9yKDEsIE5vbmUpKSkKKyAgICAgICAgIyB1c2UgTm9uZSBmb3IgYm90aDoKKyAgICAgICAgc3RyKFNBWFBhcnNlRXhjZXB0aW9uKCJtZXNzYWdlIiwgTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuRHVtbXlMb2NhdG9yKE5vbmUsIE5vbmUpKSkKIAotY2xhc3MgRHVtbXlMb2NhdG9yOgotICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lbm8sIGNvbG5vKToKLSAgICAgICAgc2VsZi5fbGluZW5vID0gbGluZW5vCi0gICAgICAgIHNlbGYuX2NvbG5vID0gY29sbm8KKyAgICBjbGFzcyBEdW1teUxvY2F0b3I6CisgICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lbm8sIGNvbG5vKToKKyAgICAgICAgICAgIHNlbGYuX2xpbmVubyA9IGxpbmVubworICAgICAgICAgICAgc2VsZi5fY29sbm8gPSBjb2xubwogCi0gICAgZGVmIGdldFB1YmxpY0lkKHNlbGYpOgotICAgICAgICByZXR1cm4gInB1YmlkIgorICAgICAgICBkZWYgZ2V0UHVibGljSWQoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gInB1YmlkIgogCi0gICAgZGVmIGdldFN5c3RlbUlkKHNlbGYpOgotICAgICAgICByZXR1cm4gInN5c2lkIgorICAgICAgICBkZWYgZ2V0U3lzdGVtSWQoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gInN5c2lkIgogCi0gICAgZGVmIGdldExpbmVOdW1iZXIoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLl9saW5lbm8KKyAgICAgICAgZGVmIGdldExpbmVOdW1iZXIoc2VsZik6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fbGluZW5vCiAKLSAgICBkZWYgZ2V0Q29sdW1uTnVtYmVyKHNlbGYpOgotICAgICAgICByZXR1cm4gc2VsZi5fY29sbm8KKyAgICAgICAgZGVmIGdldENvbHVtbk51bWJlcihzZWxmKToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9jb2xubwogCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIwpAQCAtNTcxLDIxNyArNjA2LDkxIEBACiAjCiAjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0jID09PT09IEF0dHJpYnV0ZXNJbXBsCitjbGFzcyBYbWxSZWFkZXJUZXN0KFhtbFRlc3RCYXNlKToKIAotZGVmIHZlcmlmeV9lbXB0eV9hdHRycyhhdHRycyk6Ci0gICAgdHJ5OgotICAgICAgICBhdHRycy5nZXRWYWx1ZSgiYXR0ciIpCi0gICAgICAgIGd2ayA9IDAKLSAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgIGd2ayA9IDEKKyAgICAjID09PT09IEF0dHJpYnV0ZXNJbXBsCisgICAgZGVmIHRlc3RfYXR0cnNfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYudmVyaWZ5X2VtcHR5X2F0dHJzKEF0dHJpYnV0ZXNJbXBsKHt9KSkKIAotICAgIHRyeToKLSAgICAgICAgYXR0cnMuZ2V0VmFsdWVCeVFOYW1lKCJhdHRyIikKLSAgICAgICAgZ3ZxayA9IDAKLSAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgIGd2cWsgPSAxCisgICAgZGVmIHRlc3RfYXR0cnNfd2F0dHIoc2VsZik6CisgICAgICAgIHNlbGYudmVyaWZ5X2F0dHJzX3dhdHRyKEF0dHJpYnV0ZXNJbXBsKHsiYXR0ciIgOiAidmFsIn0pKQogCi0gICAgdHJ5OgotICAgICAgICBhdHRycy5nZXROYW1lQnlRTmFtZSgiYXR0ciIpCi0gICAgICAgIGducWsgPSAwCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICBnbnFrID0gMQorICAgIGRlZiB0ZXN0X25zYXR0cnNfZW1wdHkoc2VsZik6CisgICAgICAgIHNlbGYudmVyaWZ5X2VtcHR5X25zYXR0cnMoQXR0cmlidXRlc05TSW1wbCh7fSwge30pKQogCi0gICAgdHJ5OgotICAgICAgICBhdHRycy5nZXRRTmFtZUJ5TmFtZSgiYXR0ciIpCi0gICAgICAgIGdxbmsgPSAwCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICBncW5rID0gMQorICAgIGRlZiB0ZXN0X25zYXR0cnNfd2F0dHIoc2VsZik6CisgICAgICAgIGF0dHJzID0gQXR0cmlidXRlc05TSW1wbCh7KG5zX3VyaSwgImF0dHIiKSA6ICJ2YWwifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsobnNfdXJpLCAiYXR0ciIpIDogIm5zOmF0dHIifSkKIAotICAgIHRyeToKLSAgICAgICAgYXR0cnNbImF0dHIiXQotICAgICAgICBnaWsgPSAwCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICBnaWsgPSAxCi0KLSAgICByZXR1cm4gYXR0cnMuZ2V0TGVuZ3RoKCkgPT0gMCBhbmQgXAotICAgICAgICAgICBhdHRycy5nZXROYW1lcygpID09IFtdIGFuZCBcCi0gICAgICAgICAgIGF0dHJzLmdldFFOYW1lcygpID09IFtdIGFuZCBcCi0gICAgICAgICAgIGxlbihhdHRycykgPT0gMCBhbmQgXAotICAgICAgICAgICAiYXR0ciIgbm90IGluICBhdHRycyBhbmQgXAotICAgICAgICAgICBhdHRycy5rZXlzKCkgPT0gW10gYW5kIFwKLSAgICAgICAgICAgYXR0cnMuZ2V0KCJhdHRycyIpIGlzIE5vbmUgYW5kIFwKLSAgICAgICAgICAgYXR0cnMuZ2V0KCJhdHRycyIsIDI1KSA9PSAyNSBhbmQgXAotICAgICAgICAgICBhdHRycy5pdGVtcygpID09IFtdIGFuZCBcCi0gICAgICAgICAgIGF0dHJzLnZhbHVlcygpID09IFtdIGFuZCBcCi0gICAgICAgICAgIGd2ayBhbmQgZ3ZxayBhbmQgZ25xayBhbmQgZ2lrIGFuZCBncW5rCi0KLWRlZiB2ZXJpZnlfYXR0cnNfd2F0dHIoYXR0cnMpOgotICAgIHJldHVybiBhdHRycy5nZXRMZW5ndGgoKSA9PSAxIGFuZCBcCi0gICAgICAgICAgIGF0dHJzLmdldE5hbWVzKCkgPT0gWyJhdHRyIl0gYW5kIFwKLSAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWVzKCkgPT0gWyJhdHRyIl0gYW5kIFwKLSAgICAgICAgICAgbGVuKGF0dHJzKSA9PSAxIGFuZCBcCi0gICAgICAgICAgICJhdHRyIiBpbiBhdHRycyBhbmQgXAotICAgICAgICAgICBhdHRycy5rZXlzKCkgPT0gWyJhdHRyIl0gYW5kIFwKLSAgICAgICAgICAgYXR0cnMuZ2V0KCJhdHRyIikgPT0gInZhbCIgYW5kIFwKLSAgICAgICAgICAgYXR0cnMuZ2V0KCJhdHRyIiwgMjUpID09ICJ2YWwiIGFuZCBcCi0gICAgICAgICAgIGF0dHJzLml0ZW1zKCkgPT0gWygiYXR0ciIsICJ2YWwiKV0gYW5kIFwKLSAgICAgICAgICAgYXR0cnMudmFsdWVzKCkgPT0gWyJ2YWwiXSBhbmQgXAotICAgICAgICAgICBhdHRycy5nZXRWYWx1ZSgiYXR0ciIpID09ICJ2YWwiIGFuZCBcCi0gICAgICAgICAgIGF0dHJzLmdldFZhbHVlQnlRTmFtZSgiYXR0ciIpID09ICJ2YWwiIGFuZCBcCi0gICAgICAgICAgIGF0dHJzLmdldE5hbWVCeVFOYW1lKCJhdHRyIikgPT0gImF0dHIiIGFuZCBcCi0gICAgICAgICAgIGF0dHJzWyJhdHRyIl0gPT0gInZhbCIgYW5kIFwKLSAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWVCeU5hbWUoImF0dHIiKSA9PSAiYXR0ciIKLQotZGVmIHRlc3RfYXR0cnNfZW1wdHkoKToKLSAgICByZXR1cm4gdmVyaWZ5X2VtcHR5X2F0dHJzKEF0dHJpYnV0ZXNJbXBsKHt9KSkKLQotZGVmIHRlc3RfYXR0cnNfd2F0dHIoKToKLSAgICByZXR1cm4gdmVyaWZ5X2F0dHJzX3dhdHRyKEF0dHJpYnV0ZXNJbXBsKHsiYXR0ciIgOiAidmFsIn0pKQotCi0jID09PT09IEF0dHJpYnV0ZXNJbXBsCi0KLWRlZiB2ZXJpZnlfZW1wdHlfbnNhdHRycyhhdHRycyk6Ci0gICAgdHJ5OgotICAgICAgICBhdHRycy5nZXRWYWx1ZSgobnNfdXJpLCAiYXR0ciIpKQotICAgICAgICBndmsgPSAwCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICBndmsgPSAxCi0KLSAgICB0cnk6Ci0gICAgICAgIGF0dHJzLmdldFZhbHVlQnlRTmFtZSgibnM6YXR0ciIpCi0gICAgICAgIGd2cWsgPSAwCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICBndnFrID0gMQotCi0gICAgdHJ5OgotICAgICAgICBhdHRycy5nZXROYW1lQnlRTmFtZSgibnM6YXR0ciIpCi0gICAgICAgIGducWsgPSAwCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICBnbnFrID0gMQotCi0gICAgdHJ5OgotICAgICAgICBhdHRycy5nZXRRTmFtZUJ5TmFtZSgobnNfdXJpLCAiYXR0ciIpKQotICAgICAgICBncW5rID0gMAotICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgZ3FuayA9IDEKLQotICAgIHRyeToKLSAgICAgICAgYXR0cnNbKG5zX3VyaSwgImF0dHIiKV0KLSAgICAgICAgZ2lrID0gMAotICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgZ2lrID0gMQotCi0gICAgcmV0dXJuIGF0dHJzLmdldExlbmd0aCgpID09IDAgYW5kIFwKLSAgICAgICAgICAgYXR0cnMuZ2V0TmFtZXMoKSA9PSBbXSBhbmQgXAotICAgICAgICAgICBhdHRycy5nZXRRTmFtZXMoKSA9PSBbXSBhbmQgXAotICAgICAgICAgICBsZW4oYXR0cnMpID09IDAgYW5kIFwKLSAgICAgICAgICAgKG5zX3VyaSwgImF0dHIiKSBub3QgaW4gYXR0cnMgYW5kIFwKLSAgICAgICAgICAgYXR0cnMua2V5cygpID09IFtdIGFuZCBcCi0gICAgICAgICAgIGF0dHJzLmdldCgobnNfdXJpLCAiYXR0ciIpKSBpcyBOb25lIGFuZCBcCi0gICAgICAgICAgIGF0dHJzLmdldCgobnNfdXJpLCAiYXR0ciIpLCAyNSkgPT0gMjUgYW5kIFwKLSAgICAgICAgICAgYXR0cnMuaXRlbXMoKSA9PSBbXSBhbmQgXAotICAgICAgICAgICBhdHRycy52YWx1ZXMoKSA9PSBbXSBhbmQgXAotICAgICAgICAgICBndmsgYW5kIGd2cWsgYW5kIGducWsgYW5kIGdpayBhbmQgZ3FuawotCi1kZWYgdGVzdF9uc2F0dHJzX2VtcHR5KCk6Ci0gICAgcmV0dXJuIHZlcmlmeV9lbXB0eV9uc2F0dHJzKEF0dHJpYnV0ZXNOU0ltcGwoe30sIHt9KSkKLQotZGVmIHRlc3RfbnNhdHRyc193YXR0cigpOgotICAgIGF0dHJzID0gQXR0cmlidXRlc05TSW1wbCh7KG5zX3VyaSwgImF0dHIiKSA6ICJ2YWwifSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhuc191cmksICJhdHRyIikgOiAibnM6YXR0ciJ9KQotCi0gICAgcmV0dXJuIGF0dHJzLmdldExlbmd0aCgpID09IDEgYW5kIFwKLSAgICAgICAgICAgYXR0cnMuZ2V0TmFtZXMoKSA9PSBbKG5zX3VyaSwgImF0dHIiKV0gYW5kIFwKLSAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWVzKCkgPT0gWyJuczphdHRyIl0gYW5kIFwKLSAgICAgICAgICAgbGVuKGF0dHJzKSA9PSAxIGFuZCBcCi0gICAgICAgICAgIChuc191cmksICJhdHRyIikgaW4gYXR0cnMgYW5kIFwKLSAgICAgICAgICAgYXR0cnMua2V5cygpID09IFsobnNfdXJpLCAiYXR0ciIpXSBhbmQgXAotICAgICAgICAgICBhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSkgPT0gInZhbCIgYW5kIFwKLSAgICAgICAgICAgYXR0cnMuZ2V0KChuc191cmksICJhdHRyIiksIDI1KSA9PSAidmFsIiBhbmQgXAotICAgICAgICAgICBhdHRycy5pdGVtcygpID09IFsoKG5zX3VyaSwgImF0dHIiKSwgInZhbCIpXSBhbmQgXAotICAgICAgICAgICBhdHRycy52YWx1ZXMoKSA9PSBbInZhbCJdIGFuZCBcCi0gICAgICAgICAgIGF0dHJzLmdldFZhbHVlKChuc191cmksICJhdHRyIikpID09ICJ2YWwiIGFuZCBcCi0gICAgICAgICAgIGF0dHJzLmdldFZhbHVlQnlRTmFtZSgibnM6YXR0ciIpID09ICJ2YWwiIGFuZCBcCi0gICAgICAgICAgIGF0dHJzLmdldE5hbWVCeVFOYW1lKCJuczphdHRyIikgPT0gKG5zX3VyaSwgImF0dHIiKSBhbmQgXAotICAgICAgICAgICBhdHRyc1sobnNfdXJpLCAiYXR0ciIpXSA9PSAidmFsIiBhbmQgXAotICAgICAgICAgICBhdHRycy5nZXRRTmFtZUJ5TmFtZSgobnNfdXJpLCAiYXR0ciIpKSA9PSAibnM6YXR0ciIKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXR0cnMuZ2V0TGVuZ3RoKCksIDEpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLmdldE5hbWVzKCksIFsobnNfdXJpLCAiYXR0ciIpXSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXR0cnMuZ2V0UU5hbWVzKCksIFsibnM6YXR0ciJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsZW4oYXR0cnMpLCAxKQorICAgICAgICBzZWxmLmFzc2VydFRydWUoKG5zX3VyaSwgImF0dHIiKSBpbiBhdHRycykKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMobGlzdChhdHRycy5rZXlzKCkpLCBbKG5zX3VyaSwgImF0dHIiKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLmdldCgobnNfdXJpLCAiYXR0ciIpKSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLmdldCgobnNfdXJpLCAiYXR0ciIpLCAyNSksICJ2YWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhsaXN0KGF0dHJzLml0ZW1zKCkpLCBbKChuc191cmksICJhdHRyIiksICJ2YWwiKV0pCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGxpc3QoYXR0cnMudmFsdWVzKCkpLCBbInZhbCJdKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRycy5nZXRWYWx1ZSgobnNfdXJpLCAiYXR0ciIpKSwgInZhbCIpCisgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGF0dHJzLmdldFZhbHVlQnlRTmFtZSgibnM6YXR0ciIpLCAidmFsIikKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXR0cnMuZ2V0TmFtZUJ5UU5hbWUoIm5zOmF0dHIiKSwgKG5zX3VyaSwgImF0dHIiKSkKKyAgICAgICAgc2VsZi5hc3NlcnRFcXVhbHMoYXR0cnNbKG5zX3VyaSwgImF0dHIiKV0sICJ2YWwiKQorICAgICAgICBzZWxmLmFzc2VydEVxdWFscyhhdHRycy5nZXRRTmFtZUJ5TmFtZSgobnNfdXJpLCAiYXR0ciIpKSwgIm5zOmF0dHIiKQogCiAKLSMgRHVyaW5nIHRoZSBkZXZlbG9wbWVudCBvZiBQeXRob24gMi41LCBhbiBhdHRlbXB0IHRvIG1vdmUgdGhlICJ4bWwiCi0jIHBhY2thZ2UgaW1wbGVtZW50YXRpb24gdG8gYSBuZXcgcGFja2FnZSAoInhtbGNvcmUiKSBwcm92ZWQgcGFpbmZ1bC4KLSMgVGhlIGdvYWwgb2YgdGhpcyBjaGFuZ2Ugd2FzIHRvIGFsbG93IGFwcGxpY2F0aW9ucyB0byBiZSBhYmxlIHRvCi0jIG9idGFpbiBhbmQgcmVseSBvbiBiZWhhdmlvciBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeSBpbXBsZW1lbnRhdGlvbgotIyBvZiB0aGUgWE1MIHN1cHBvcnQgd2l0aG91dCBuZWVkaW5nIHRvIGJlIGNvbmNlcm5lZCBhYm91dCB0aGUKLSMgYXZhaWxhYmlsaXR5IG9mIHRoZSBQeVhNTCBpbXBsZW1lbnRhdGlvbi4KLSMKLSMgV2hpbGUgdGhlIGV4aXN0aW5nIGltcG9ydCBoYWNrZXJ5IGluIExpYi94bWwvX19pbml0X18ucHkgY2FuIGNhdXNlCi0jIFB5WE1MJ3MgX3htbHB1cyBwYWNrYWdlIHRvIHN1cHBsYW50IHRoZSAieG1sIiBwYWNrYWdlLCB0aGF0IG9ubHkKLSMgd29ya3MgYmVjYXVzZSBlaXRoZXIgaW1wbGVtZW50YXRpb24gdXNlcyB0aGUgInhtbCIgcGFja2FnZSBuYW1lIGZvcgotIyBpbXBvcnRzLgotIwotIyBUaGUgbW92ZSByZXN1bHRlZCBpbiBhIG51bWJlciBvZiBwcm9ibGVtcyByZWxhdGVkIHRvIHRoZSBmYWN0IHRoYXQKLSMgdGhlIGltcG9ydCBtYWNoaW5lcnkncyAicGFja2FnZSBjb250ZXh0IiBpcyBiYXNlZCBvbiB0aGUgbmFtZSB0aGF0J3MKLSMgYmVpbmcgaW1wb3J0ZWQgcmF0aGVyIHRoYW4gdGhlIF9fbmFtZV9fIG9mIHRoZSBhY3R1YWwgcGFja2FnZQotIyBjb250YWlubWVudDsgaXQgd2Fzbid0IHBvc3NpYmxlIGZvciB0aGUgInhtbCIgcGFja2FnZSB0byBiZSByZXBsYWNlZAotIyBieSBhIHNpbXBsZSBtb2R1bGUgdGhhdCBpbmRpcmVjdGVkIGltcG9ydHMgdG8gdGhlICJ4bWxjb3JlIiBwYWNrYWdlLgotIwotIyBUaGUgZm9sbG93aW5nIHR3byB0ZXN0cyBleGVyY2lzZWQgYnVncyB0aGF0IHdlcmUgaW50cm9kdWNlZCBpbiB0aGF0Ci0jIGF0dGVtcHQuICBLZWVwaW5nIHRoZXNlIHRlc3RzIGFyb3VuZCB3aWxsIGhlbHAgZGV0ZWN0IHByb2JsZW1zIHdpdGgKLSMgb3RoZXIgYXR0ZW1wdHMgdG8gcHJvdmlkZSByZWxpYWJsZSBhY2Nlc3MgdG8gdGhlIHN0YW5kYXJkIGxpYnJhcnkncwotIyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgWE1MIHN1cHBvcnQuCisgICAgIyBEdXJpbmcgdGhlIGRldmVsb3BtZW50IG9mIFB5dGhvbiAyLjUsIGFuIGF0dGVtcHQgdG8gbW92ZSB0aGUgInhtbCIKKyAgICAjIHBhY2thZ2UgaW1wbGVtZW50YXRpb24gdG8gYSBuZXcgcGFja2FnZSAoInhtbGNvcmUiKSBwcm92ZWQgcGFpbmZ1bC4KKyAgICAjIFRoZSBnb2FsIG9mIHRoaXMgY2hhbmdlIHdhcyB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gYmUgYWJsZSB0bworICAgICMgb2J0YWluIGFuZCByZWx5IG9uIGJlaGF2aW9yIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGltcGxlbWVudGF0aW9uCisgICAgIyBvZiB0aGUgWE1MIHN1cHBvcnQgd2l0aG91dCBuZWVkaW5nIHRvIGJlIGNvbmNlcm5lZCBhYm91dCB0aGUKKyAgICAjIGF2YWlsYWJpbGl0eSBvZiB0aGUgUHlYTUwgaW1wbGVtZW50YXRpb24uCisgICAgIworICAgICMgV2hpbGUgdGhlIGV4aXN0aW5nIGltcG9ydCBoYWNrZXJ5IGluIExpYi94bWwvX19pbml0X18ucHkgY2FuIGNhdXNlCisgICAgIyBQeVhNTCdzIF94bWxwdXMgcGFja2FnZSB0byBzdXBwbGFudCB0aGUgInhtbCIgcGFja2FnZSwgdGhhdCBvbmx5CisgICAgIyB3b3JrcyBiZWNhdXNlIGVpdGhlciBpbXBsZW1lbnRhdGlvbiB1c2VzIHRoZSAieG1sIiBwYWNrYWdlIG5hbWUgZm9yCisgICAgIyBpbXBvcnRzLgorICAgICMKKyAgICAjIFRoZSBtb3ZlIHJlc3VsdGVkIGluIGEgbnVtYmVyIG9mIHByb2JsZW1zIHJlbGF0ZWQgdG8gdGhlIGZhY3QgdGhhdAorICAgICMgdGhlIGltcG9ydCBtYWNoaW5lcnkncyAicGFja2FnZSBjb250ZXh0IiBpcyBiYXNlZCBvbiB0aGUgbmFtZSB0aGF0J3MKKyAgICAjIGJlaW5nIGltcG9ydGVkIHJhdGhlciB0aGFuIHRoZSBfX25hbWVfXyBvZiB0aGUgYWN0dWFsIHBhY2thZ2UKKyAgICAjIGNvbnRhaW5tZW50OyBpdCB3YXNuJ3QgcG9zc2libGUgZm9yIHRoZSAieG1sIiBwYWNrYWdlIHRvIGJlIHJlcGxhY2VkCisgICAgIyBieSBhIHNpbXBsZSBtb2R1bGUgdGhhdCBpbmRpcmVjdGVkIGltcG9ydHMgdG8gdGhlICJ4bWxjb3JlIiBwYWNrYWdlLgorICAgICMKKyAgICAjIFRoZSBmb2xsb3dpbmcgdHdvIHRlc3RzIGV4ZXJjaXNlZCBidWdzIHRoYXQgd2VyZSBpbnRyb2R1Y2VkIGluIHRoYXQKKyAgICAjIGF0dGVtcHQuICBLZWVwaW5nIHRoZXNlIHRlc3RzIGFyb3VuZCB3aWxsIGhlbHAgZGV0ZWN0IHByb2JsZW1zIHdpdGgKKyAgICAjIG90aGVyIGF0dGVtcHRzIHRvIHByb3ZpZGUgcmVsaWFibGUgYWNjZXNzIHRvIHRoZSBzdGFuZGFyZCBsaWJyYXJ5J3MKKyAgICAjIGltcGxlbWVudGF0aW9uIG9mIHRoZSBYTUwgc3VwcG9ydC4KIAotZGVmIHRlc3Rfc2ZfMTUxMTQ5NygpOgotICAgICMgQnVnIHJlcG9ydDogaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzE1MTE0OTcKLSAgICBpbXBvcnQgc3lzCi0gICAgb2xkX21vZHVsZXMgPSBzeXMubW9kdWxlcy5jb3B5KCkKLSAgICBmb3IgbW9kbmFtZSBpbiBsaXN0KHN5cy5tb2R1bGVzLmtleXMoKSk6Ci0gICAgICAgIGlmIG1vZG5hbWUuc3RhcnRzd2l0aCgieG1sLiIpOgotICAgICAgICAgICAgZGVsIHN5cy5tb2R1bGVzW21vZG5hbWVdCi0gICAgdHJ5OgotICAgICAgICBpbXBvcnQgeG1sLnNheC5leHBhdHJlYWRlcgotICAgICAgICBtb2R1bGUgPSB4bWwuc2F4LmV4cGF0cmVhZGVyCi0gICAgICAgIHJldHVybiBtb2R1bGUuX19uYW1lX18gPT0gInhtbC5zYXguZXhwYXRyZWFkZXIiCi0gICAgZmluYWxseToKLSAgICAgICAgc3lzLm1vZHVsZXMudXBkYXRlKG9sZF9tb2R1bGVzKQorICAgIGRlZiB0ZXN0X3NmXzE1MTE0OTcoc2VsZik6CisgICAgICAgICMgQnVnIHJlcG9ydDogaHR0cDovL3d3dy5weXRob24ub3JnL3NmLzE1MTE0OTcKKyAgICAgICAgaW1wb3J0IHN5cworICAgICAgICBvbGRfbW9kdWxlcyA9IHN5cy5tb2R1bGVzLmNvcHkoKQorICAgICAgICBmb3IgbW9kbmFtZSBpbiBsaXN0KHN5cy5tb2R1bGVzLmtleXMoKSk6CisgICAgICAgICAgICBpZiBtb2RuYW1lLnN0YXJ0c3dpdGgoInhtbC4iKToKKyAgICAgICAgICAgICAgICBkZWwgc3lzLm1vZHVsZXNbbW9kbmFtZV0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaW1wb3J0IHhtbC5zYXguZXhwYXRyZWFkZXIKKyAgICAgICAgICAgIG1vZHVsZSA9IHhtbC5zYXguZXhwYXRyZWFkZXIKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1vZHVsZS5fX25hbWVfXywgInhtbC5zYXguZXhwYXRyZWFkZXIiKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc3lzLm1vZHVsZXMudXBkYXRlKG9sZF9tb2R1bGVzKQogCi1kZWYgdGVzdF9zZl8xNTEzNjExKCk6Ci0gICAgIyBCdWcgcmVwb3J0OiBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvMTUxMzYxMQotICAgIHNpbyA9IFN0cmluZ0lPKCJpbnZhbGlkIikKLSAgICBwYXJzZXIgPSBtYWtlX3BhcnNlcigpCi0gICAgZnJvbSB4bWwuc2F4IGltcG9ydCBTQVhQYXJzZUV4Y2VwdGlvbgotICAgIHRyeToKLSAgICAgICAgcGFyc2VyLnBhcnNlKHNpbykKLSAgICBleGNlcHQgU0FYUGFyc2VFeGNlcHRpb246Ci0gICAgICAgIHJldHVybiBUcnVlCi0gICAgZWxzZToKLSAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgZGVmIHRlc3Rfc2ZfMTUxMzYxMShzZWxmKToKKyAgICAgICAgIyBCdWcgcmVwb3J0OiBodHRwOi8vd3d3LnB5dGhvbi5vcmcvc2YvMTUxMzYxMQorICAgICAgICBzaW8gPSBTdHJpbmdJTygiaW52YWxpZCIpCisgICAgICAgIHBhcnNlciA9IG1ha2VfcGFyc2VyKCkKKyAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBTQVhQYXJzZUV4Y2VwdGlvbgorICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhTQVhQYXJzZUV4Y2VwdGlvbiwgcGFyc2VyLnBhcnNlLCBzaW8pCiAKLSMgPT09PT0gTWFpbiBwcm9ncmFtCiAKLWRlZiBtYWtlX3Rlc3Rfb3V0cHV0KCk6Ci0gICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCi0gICAgcmVzdWx0ID0gU3RyaW5nSU8oKQotICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCitkZWYgdW5pdHRlc3RfbWFpbigpOgorICAgIHJ1bl91bml0dGVzdChNYWtlUGFyc2VyVGVzdCwKKyAgICAgICAgICAgICAgICAgU2F4dXRpbHNUZXN0LAorICAgICAgICAgICAgICAgICBYbWxnZW5UZXN0LAorICAgICAgICAgICAgICAgICBFeHBhdFJlYWRlclRlc3QsCisgICAgICAgICAgICAgICAgIEVycm9yUmVwb3J0aW5nVGVzdCwKKyAgICAgICAgICAgICAgICAgWG1sUmVhZGVyVGVzdCkKIAotICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCi0gICAgcGFyc2VyLnBhcnNlKGZpbmRmaWxlKCJ0ZXN0Iitvcy5leHRzZXArInhtbCIpKQotCi0gICAgb3V0ZiA9IG9wZW4oZmluZGZpbGUoInRlc3QiK29zLmV4dHNlcCsieG1sIitvcy5leHRzZXArIm91dCIpLCAidyIpCi0gICAgb3V0Zi53cml0ZShyZXN1bHQuZ2V0dmFsdWUoKSkKLSAgICBvdXRmLmNsb3NlKCkKLQotaXRlbXMgPSBzb3J0ZWQobG9jYWxzKCkuaXRlbXMoKSkKLWZvciAobmFtZSwgdmFsdWUpIGluIGl0ZW1zOgotICAgIGlmIG5hbWVbIDogNV0gPT0gInRlc3RfIjoKLSAgICAgICAgY29uZmlybSh2YWx1ZSgpLCBuYW1lKQotIyBXZSBkZWxldGUgdGhlIGl0ZW1zIHZhcmlhYmxlIHNvIHRoYXQgdGhlIGFzc2lnbm1lbnQgdG8gaXRlbXMgYWJvdmUKLSMgZG9lc24ndCBwaWNrIHVwIHRoZSBvbGQgdmFsdWUgb2YgaXRlbXMgKHdoaWNoIG1lc3NlcyB3aXRoIGF0dGVtcHRzCi0jIHRvIGZpbmQgcmVmZXJlbmNlIGxlYWtzKS4KLWRlbCBpdGVtcwotCi1pZiB2ZXJib3NlOgotICAgIHByaW50KCIlZCB0ZXN0cywgJWQgZmFpbHVyZXMiICUgKHRlc3RzLCBsZW4oZmFpbHVyZXMpKSkKLWlmIGZhaWx1cmVzOgotICAgIHJhaXNlIFRlc3RGYWlsZWQoIiVkIG9mICVkIHRlc3RzIGZhaWxlZDogJXMiCi0gICAgICAgICAgICAgICAgICAgICAlIChsZW4oZmFpbHVyZXMpLCB0ZXN0cywgIiwgIi5qb2luKGZhaWx1cmVzKSkpCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHVuaXR0ZXN0X21haW4oKQo=