IyByZWdyZXNzaW9uIHRlc3QgZm9yIFNBWCAyLjAKIyAkSWQkCgpmcm9tIHhtbC5zYXggaW1wb3J0IG1ha2VfcGFyc2VyLCBDb250ZW50SGFuZGxlciwgXAogICAgICAgICAgICAgICAgICAgIFNBWEV4Y2VwdGlvbiwgU0FYUmVhZGVyTm90QXZhaWxhYmxlLCBTQVhQYXJzZUV4Y2VwdGlvbgp0cnk6CiAgICBtYWtlX3BhcnNlcigpCmV4Y2VwdCBTQVhSZWFkZXJOb3RBdmFpbGFibGU6CiAgICAjIGRvbid0IHRyeSB0byB0ZXN0IHRoaXMgbW9kdWxlIGlmIHdlIGNhbm5vdCBjcmVhdGUgYSBwYXJzZXIKICAgIHJhaXNlIEltcG9ydEVycm9yKCJubyBYTUwgcGFyc2VycyBhdmFpbGFibGUiKQpmcm9tIHhtbC5zYXguc2F4dXRpbHMgaW1wb3J0IFhNTEdlbmVyYXRvciwgZXNjYXBlLCBYTUxGaWx0ZXJCYXNlCmZyb20geG1sLnNheC5leHBhdHJlYWRlciBpbXBvcnQgY3JlYXRlX3BhcnNlcgpmcm9tIHhtbC5zYXgueG1scmVhZGVyIGltcG9ydCBJbnB1dFNvdXJjZSwgQXR0cmlidXRlc0ltcGwsIEF0dHJpYnV0ZXNOU0ltcGwKZnJvbSBjU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCmZyb20gdGVzdF9zdXBwb3J0IGltcG9ydCB2ZXJpZnksIHZlcmJvc2UsIFRlc3RGYWlsZWQsIGZpbmRmaWxlCgojID09PT09IFV0aWxpdGllcwoKdGVzdHMgPSAwCmZhaWxzID0gMAoKZGVmIGNvbmZpcm0ob3V0Y29tZSwgbmFtZSk6CiAgICBnbG9iYWwgdGVzdHMsIGZhaWxzCgogICAgdGVzdHMgPSB0ZXN0cyArIDEKICAgIGlmIG91dGNvbWU6CiAgICAgICAgcHJpbnQgIlBhc3NlZCIsIG5hbWUKICAgIGVsc2U6CiAgICAgICAgcHJpbnQgIkZhaWxlZCIsIG5hbWUKICAgICAgICBmYWlscyA9IGZhaWxzICsgMQoKZGVmIHRlc3RfbWFrZV9wYXJzZXIyKCk6CiAgICB0cnk6CiAgICAgICAgIyBDcmVhdGluZyBwYXJzZXJzIHNldmVyYWwgdGltZXMgaW4gYSByb3cgc2hvdWxkIHN1Y2NlZWQuCiAgICAgICAgIyBUZXN0aW5nIHRoaXMgYmVjYXVzZSB0aGVyZSBoYXZlIGJlZW4gZmFpbHVyZXMgb2YgdGhpcyBraW5kCiAgICAgICAgIyBiZWZvcmUuCiAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgogICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCiAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgogICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCiAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgogICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCiAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgogICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCiAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgogICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCiAgICAgICAgZnJvbSB4bWwuc2F4IGltcG9ydCBtYWtlX3BhcnNlcgogICAgICAgIHAgPSBtYWtlX3BhcnNlcigpCiAgICBleGNlcHQ6CiAgICAgICAgcmV0dXJuIDAKICAgIGVsc2U6CiAgICAgICAgcmV0dXJuIHAKCgojID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQojCiMgICBzYXh1dGlscyB0ZXN0cwojCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojID09PT09IGVzY2FwZQoKZGVmIHRlc3RfZXNjYXBlX2Jhc2ljKCk6CiAgICByZXR1cm4gZXNjYXBlKCJEb25hbGQgRHVjayAmIENvIikgPT0gIkRvbmFsZCBEdWNrICZhbXA7IENvIgoKZGVmIHRlc3RfZXNjYXBlX2FsbCgpOgogICAgcmV0dXJuIGVzY2FwZSgiPERvbmFsZCBEdWNrICYgQ28+IikgPT0gIiZsdDtEb25hbGQgRHVjayAmYW1wOyBDbyZndDsiCgpkZWYgdGVzdF9lc2NhcGVfZXh0cmEoKToKICAgIHJldHVybiBlc2NhcGUoIkhlaSBw5SBkZWciLCB7IuUiIDogIiZhcmluZzsifSkgPT0gIkhlaSBwJmFyaW5nOyBkZWciCgpkZWYgdGVzdF9tYWtlX3BhcnNlcigpOgogICAgdHJ5OgogICAgICAgICMgQ3JlYXRpbmcgYSBwYXJzZXIgc2hvdWxkIHN1Y2NlZWQgLSBpdCBzaG91bGQgZmFsbCBiYWNrCiAgICAgICAgIyB0byB0aGUgZXhwYXRyZWFkZXIKICAgICAgICBwID0gbWFrZV9wYXJzZXIoWyd4bWwucGFyc2Vycy5ub19zdWNoX3BhcnNlciddKQogICAgZXhjZXB0OgogICAgICAgIHJldHVybiAwCiAgICBlbHNlOgogICAgICAgIHJldHVybiBwCgoKIyA9PT09PSBYTUxHZW5lcmF0b3IKCnN0YXJ0ID0gJzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiPz5cbicKCmRlZiB0ZXN0X3htbGdlbl9iYXNpYygpOgogICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKICAgIGdlbi5zdGFydERvY3VtZW50KCkKICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQogICAgZ2VuLmVuZEVsZW1lbnQoImRvYyIpCiAgICBnZW4uZW5kRG9jdW1lbnQoKQoKICAgIHJldHVybiByZXN1bHQuZ2V0dmFsdWUoKSA9PSBzdGFydCArICI8ZG9jPjwvZG9jPiIKCmRlZiB0ZXN0X3htbGdlbl9jb250ZW50KCk6CiAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQoKICAgIGdlbi5zdGFydERvY3VtZW50KCkKICAgIGdlbi5zdGFydEVsZW1lbnQoImRvYyIsIHt9KQogICAgZ2VuLmNoYXJhY3RlcnMoImh1aGVpIikKICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQogICAgZ2VuLmVuZERvY3VtZW50KCkKCiAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0gc3RhcnQgKyAiPGRvYz5odWhlaTwvZG9jPiIKCmRlZiB0ZXN0X3htbGdlbl9waSgpOgogICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKCiAgICBnZW4uc3RhcnREb2N1bWVudCgpCiAgICBnZW4ucHJvY2Vzc2luZ0luc3RydWN0aW9uKCJ0ZXN0IiwgImRhdGEiKQogICAgZ2VuLnN0YXJ0RWxlbWVudCgiZG9jIiwge30pCiAgICBnZW4uZW5kRWxlbWVudCgiZG9jIikKICAgIGdlbi5lbmREb2N1bWVudCgpCgogICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0ICsgIjw/dGVzdCBkYXRhPz48ZG9jPjwvZG9jPiIKCmRlZiB0ZXN0X3htbGdlbl9jb250ZW50X2VzY2FwZSgpOgogICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKCiAgICBnZW4uc3RhcnREb2N1bWVudCgpCiAgICBnZW4uc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKICAgIGdlbi5jaGFyYWN0ZXJzKCI8aHVoZWkmIikKICAgIGdlbi5lbmRFbGVtZW50KCJkb2MiKQogICAgZ2VuLmVuZERvY3VtZW50KCkKCiAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0gc3RhcnQgKyAiPGRvYz4mbHQ7aHVoZWkmYW1wOzwvZG9jPiIKCmRlZiB0ZXN0X3htbGdlbl9pZ25vcmFibGUoKToKICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKICAgIGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCgogICAgZ2VuLnN0YXJ0RG9jdW1lbnQoKQogICAgZ2VuLnN0YXJ0RWxlbWVudCgiZG9jIiwge30pCiAgICBnZW4uaWdub3JhYmxlV2hpdGVzcGFjZSgiICIpCiAgICBnZW4uZW5kRWxlbWVudCgiZG9jIikKICAgIGdlbi5lbmREb2N1bWVudCgpCgogICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0ICsgIjxkb2M+IDwvZG9jPiIKCm5zX3VyaSA9ICJodHRwOi8vd3d3LnB5dGhvbi5vcmcveG1sLW5zL3NheHRlc3QvIgoKZGVmIHRlc3RfeG1sZ2VuX25zKCk6CiAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICBnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQoKICAgIGdlbi5zdGFydERvY3VtZW50KCkKICAgIGdlbi5zdGFydFByZWZpeE1hcHBpbmcoIm5zMSIsIG5zX3VyaSkKICAgIGdlbi5zdGFydEVsZW1lbnROUygobnNfdXJpLCAiZG9jIiksICJuczE6ZG9jIiwge30pCiAgICAjIGFkZCBhbiB1bnF1YWxpZmllZCBuYW1lCiAgICBnZW4uc3RhcnRFbGVtZW50TlMoKE5vbmUsICJ1ZG9jIiksIE5vbmUsIHt9KQogICAgZ2VuLmVuZEVsZW1lbnROUygoTm9uZSwgInVkb2MiKSwgTm9uZSkKICAgIGdlbi5lbmRFbGVtZW50TlMoKG5zX3VyaSwgImRvYyIpLCAibnMxOmRvYyIpCiAgICBnZW4uZW5kUHJlZml4TWFwcGluZygibnMxIikKICAgIGdlbi5lbmREb2N1bWVudCgpCgogICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0ICsgXAogICAgICAgICAgICgnPG5zMTpkb2MgeG1sbnM6bnMxPSIlcyI+PHVkb2M+PC91ZG9jPjwvbnMxOmRvYz4nICUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc191cmkpCgojID09PT09IFhNTEZpbHRlckJhc2UKCmRlZiB0ZXN0X2ZpbHRlcl9iYXNpYygpOgogICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKICAgIGZpbHRlciA9IFhNTEZpbHRlckJhc2UoKQogICAgZmlsdGVyLnNldENvbnRlbnRIYW5kbGVyKGdlbikKCiAgICBmaWx0ZXIuc3RhcnREb2N1bWVudCgpCiAgICBmaWx0ZXIuc3RhcnRFbGVtZW50KCJkb2MiLCB7fSkKICAgIGZpbHRlci5jaGFyYWN0ZXJzKCJjb250ZW50IikKICAgIGZpbHRlci5pZ25vcmFibGVXaGl0ZXNwYWNlKCIgIikKICAgIGZpbHRlci5lbmRFbGVtZW50KCJkb2MiKQogICAgZmlsdGVyLmVuZERvY3VtZW50KCkKCiAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0gc3RhcnQgKyAiPGRvYz5jb250ZW50IDwvZG9jPiIKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMKIyAgIGV4cGF0cmVhZGVyIHRlc3RzCiMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiMgPT09PT0gWE1MUmVhZGVyIHN1cHBvcnQKCmRlZiB0ZXN0X2V4cGF0X2ZpbGUoKToKICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKCiAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQogICAgcGFyc2VyLnBhcnNlKG9wZW4oZmluZGZpbGUoInRlc3QueG1sIikpKQoKICAgIHJldHVybiByZXN1bHQuZ2V0dmFsdWUoKSA9PSB4bWxfdGVzdF9vdXQKCiMgPT09PT0gRFRESGFuZGxlciBzdXBwb3J0CgpjbGFzcyBUZXN0RFRESGFuZGxlcjoKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc2VsZi5fbm90YXRpb25zID0gW10KICAgICAgICBzZWxmLl9lbnRpdGllcyAgPSBbXQoKICAgIGRlZiBub3RhdGlvbkRlY2woc2VsZiwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkKToKICAgICAgICBzZWxmLl9ub3RhdGlvbnMuYXBwZW5kKChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQpKQoKICAgIGRlZiB1bnBhcnNlZEVudGl0eURlY2woc2VsZiwgbmFtZSwgcHVibGljSWQsIHN5c3RlbUlkLCBuZGF0YSk6CiAgICAgICAgc2VsZi5fZW50aXRpZXMuYXBwZW5kKChuYW1lLCBwdWJsaWNJZCwgc3lzdGVtSWQsIG5kYXRhKSkKCmRlZiB0ZXN0X2V4cGF0X2R0ZGhhbmRsZXIoKToKICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgaGFuZGxlciA9IFRlc3REVERIYW5kbGVyKCkKICAgIHBhcnNlci5zZXREVERIYW5kbGVyKGhhbmRsZXIpCgogICAgcGFyc2VyLmZlZWQoJzwhRE9DVFlQRSBkb2MgW1xuJykKICAgIHBhcnNlci5mZWVkKCcgIDwhRU5USVRZIGltZyBTWVNURU0gImV4cGF0LmdpZiIgTkRBVEEgR0lGPlxuJykKICAgIHBhcnNlci5mZWVkKCcgIDwhTk9UQVRJT04gR0lGIFBVQkxJQyAiLS8vQ29tcHVTZXJ2ZS8vTk9UQVRJT04gR3JhcGhpY3MgSW50ZXJjaGFuZ2UgRm9ybWF0IDg5YS8vRU4iPlxuJykKICAgIHBhcnNlci5mZWVkKCddPlxuJykKICAgIHBhcnNlci5mZWVkKCc8ZG9jPjwvZG9jPicpCiAgICBwYXJzZXIuY2xvc2UoKQoKICAgIHJldHVybiBoYW5kbGVyLl9ub3RhdGlvbnMgPT0gWygiR0lGIiwgIi0vL0NvbXB1U2VydmUvL05PVEFUSU9OIEdyYXBoaWNzIEludGVyY2hhbmdlIEZvcm1hdCA4OWEvL0VOIiwgTm9uZSldIGFuZCBcCiAgICAgICAgICAgaGFuZGxlci5fZW50aXRpZXMgPT0gWygiaW1nIiwgTm9uZSwgImV4cGF0LmdpZiIsICJHSUYiKV0KCiMgPT09PT0gRW50aXR5UmVzb2x2ZXIgc3VwcG9ydAoKY2xhc3MgVGVzdEVudGl0eVJlc29sdmVyOgoKICAgIGRlZiByZXNvbHZlRW50aXR5KHNlbGYsIHB1YmxpY0lkLCBzeXN0ZW1JZCk6CiAgICAgICAgaW5wc3JjID0gSW5wdXRTb3VyY2UoKQogICAgICAgIGlucHNyYy5zZXRCeXRlU3RyZWFtKFN0cmluZ0lPKCI8ZW50aXR5Lz4iKSkKICAgICAgICByZXR1cm4gaW5wc3JjCgpkZWYgdGVzdF9leHBhdF9lbnRpdHlyZXNvbHZlcigpOgogICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCiAgICBwYXJzZXIuc2V0RW50aXR5UmVzb2x2ZXIoVGVzdEVudGl0eVJlc29sdmVyKCkpCiAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoWE1MR2VuZXJhdG9yKHJlc3VsdCkpCgogICAgcGFyc2VyLmZlZWQoJzwhRE9DVFlQRSBkb2MgW1xuJykKICAgIHBhcnNlci5mZWVkKCcgIDwhRU5USVRZIHRlc3QgU1lTVEVNICJ3aGF0ZXZlciI+XG4nKQogICAgcGFyc2VyLmZlZWQoJ10+XG4nKQogICAgcGFyc2VyLmZlZWQoJzxkb2M+JnRlc3Q7PC9kb2M+JykKICAgIHBhcnNlci5jbG9zZSgpCgogICAgcmV0dXJuIHJlc3VsdC5nZXR2YWx1ZSgpID09IHN0YXJ0ICsgIjxkb2M+PGVudGl0eT48L2VudGl0eT48L2RvYz4iCgojID09PT09IEF0dHJpYnV0ZXMgc3VwcG9ydAoKY2xhc3MgQXR0ckdhdGhlcmVyKENvbnRlbnRIYW5kbGVyKToKCiAgICBkZWYgc3RhcnRFbGVtZW50KHNlbGYsIG5hbWUsIGF0dHJzKToKICAgICAgICBzZWxmLl9hdHRycyA9IGF0dHJzCgogICAgZGVmIHN0YXJ0RWxlbWVudE5TKHNlbGYsIG5hbWUsIHFuYW1lLCBhdHRycyk6CiAgICAgICAgc2VsZi5fYXR0cnMgPSBhdHRycwoKZGVmIHRlc3RfZXhwYXRfYXR0cnNfZW1wdHkoKToKICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgZ2F0aGVyID0gQXR0ckdhdGhlcmVyKCkKICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcihnYXRoZXIpCgogICAgcGFyc2VyLmZlZWQoIjxkb2MvPiIpCiAgICBwYXJzZXIuY2xvc2UoKQoKICAgIHJldHVybiB2ZXJpZnlfZW1wdHlfYXR0cnMoZ2F0aGVyLl9hdHRycykKCmRlZiB0ZXN0X2V4cGF0X2F0dHJzX3dhdHRyKCk6CiAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKICAgIGdhdGhlciA9IEF0dHJHYXRoZXJlcigpCiAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoZ2F0aGVyKQoKICAgIHBhcnNlci5mZWVkKCI8ZG9jIGF0dHI9J3ZhbCcvPiIpCiAgICBwYXJzZXIuY2xvc2UoKQoKICAgIHJldHVybiB2ZXJpZnlfYXR0cnNfd2F0dHIoZ2F0aGVyLl9hdHRycykKCmRlZiB0ZXN0X2V4cGF0X25zYXR0cnNfZW1wdHkoKToKICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoMSkKICAgIGdhdGhlciA9IEF0dHJHYXRoZXJlcigpCiAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoZ2F0aGVyKQoKICAgIHBhcnNlci5mZWVkKCI8ZG9jLz4iKQogICAgcGFyc2VyLmNsb3NlKCkKCiAgICByZXR1cm4gdmVyaWZ5X2VtcHR5X25zYXR0cnMoZ2F0aGVyLl9hdHRycykKCmRlZiB0ZXN0X2V4cGF0X25zYXR0cnNfd2F0dHIoKToKICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoMSkKICAgIGdhdGhlciA9IEF0dHJHYXRoZXJlcigpCiAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoZ2F0aGVyKQoKICAgIHBhcnNlci5mZWVkKCI8ZG9jIHhtbG5zOm5zPSclcycgbnM6YXR0cj0ndmFsJy8+IiAlIG5zX3VyaSkKICAgIHBhcnNlci5jbG9zZSgpCgogICAgYXR0cnMgPSBnYXRoZXIuX2F0dHJzCgogICAgcmV0dXJuIGF0dHJzLmdldExlbmd0aCgpID09IDEgYW5kIFwKICAgICAgICAgICBhdHRycy5nZXROYW1lcygpID09IFsobnNfdXJpLCAiYXR0ciIpXSBhbmQgXAogICAgICAgICAgIGF0dHJzLmdldFFOYW1lcygpID09IFtdIGFuZCBcCiAgICAgICAgICAgbGVuKGF0dHJzKSA9PSAxIGFuZCBcCiAgICAgICAgICAgYXR0cnMuaGFzX2tleSgobnNfdXJpLCAiYXR0ciIpKSBhbmQgXAogICAgICAgICAgIGF0dHJzLmtleXMoKSA9PSBbKG5zX3VyaSwgImF0dHIiKV0gYW5kIFwKICAgICAgICAgICBhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSkgPT0gInZhbCIgYW5kIFwKICAgICAgICAgICBhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSwgMjUpID09ICJ2YWwiIGFuZCBcCiAgICAgICAgICAgYXR0cnMuaXRlbXMoKSA9PSBbKChuc191cmksICJhdHRyIiksICJ2YWwiKV0gYW5kIFwKICAgICAgICAgICBhdHRycy52YWx1ZXMoKSA9PSBbInZhbCJdIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0VmFsdWUoKG5zX3VyaSwgImF0dHIiKSkgPT0gInZhbCIgYW5kIFwKICAgICAgICAgICBhdHRyc1sobnNfdXJpLCAiYXR0ciIpXSA9PSAidmFsIgoKIyA9PT09PSBJbnB1dFNvdXJjZSBzdXBwb3J0Cgp4bWxfdGVzdF9vdXQgPSBvcGVuKGZpbmRmaWxlKCJ0ZXN0LnhtbC5vdXQiKSkucmVhZCgpCgpkZWYgdGVzdF9leHBhdF9pbnBzb3VyY2VfZmlsZW5hbWUoKToKICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKCiAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQogICAgcGFyc2VyLnBhcnNlKGZpbmRmaWxlKCJ0ZXN0LnhtbCIpKQoKICAgIHJldHVybiByZXN1bHQuZ2V0dmFsdWUoKSA9PSB4bWxfdGVzdF9vdXQKCmRlZiB0ZXN0X2V4cGF0X2lucHNvdXJjZV9zeXNpZCgpOgogICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCiAgICByZXN1bHQgPSBTdHJpbmdJTygpCiAgICB4bWxnZW4gPSBYTUxHZW5lcmF0b3IocmVzdWx0KQoKICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCiAgICBwYXJzZXIucGFyc2UoSW5wdXRTb3VyY2UoZmluZGZpbGUoInRlc3QueG1sIikpKQoKICAgIHJldHVybiByZXN1bHQuZ2V0dmFsdWUoKSA9PSB4bWxfdGVzdF9vdXQKCmRlZiB0ZXN0X2V4cGF0X2lucHNvdXJjZV9zdHJlYW0oKToKICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKCiAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQogICAgaW5wc3JjID0gSW5wdXRTb3VyY2UoKQogICAgaW5wc3JjLnNldEJ5dGVTdHJlYW0ob3BlbihmaW5kZmlsZSgidGVzdC54bWwiKSkpCiAgICBwYXJzZXIucGFyc2UoaW5wc3JjKQoKICAgIHJldHVybiByZXN1bHQuZ2V0dmFsdWUoKSA9PSB4bWxfdGVzdF9vdXQKCiMgPT09PT0gSW5jcmVtZW50YWxQYXJzZXIgc3VwcG9ydAoKZGVmIHRlc3RfZXhwYXRfaW5jcmVtZW50YWwoKToKICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCiAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCgogICAgcGFyc2VyLmZlZWQoIjxkb2M+IikKICAgIHBhcnNlci5mZWVkKCI8L2RvYz4iKQogICAgcGFyc2VyLmNsb3NlKCkKCiAgICByZXR1cm4gcmVzdWx0LmdldHZhbHVlKCkgPT0gc3RhcnQgKyAiPGRvYz48L2RvYz4iCgpkZWYgdGVzdF9leHBhdF9pbmNyZW1lbnRhbF9yZXNldCgpOgogICAgcmVzdWx0ID0gU3RyaW5nSU8oKQogICAgeG1sZ2VuID0gWE1MR2VuZXJhdG9yKHJlc3VsdCkKICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKCiAgICBwYXJzZXIuZmVlZCgiPGRvYz4iKQogICAgcGFyc2VyLmZlZWQoInRleHQiKQoKICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCiAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoeG1sZ2VuKQogICAgcGFyc2VyLnJlc2V0KCkKCiAgICBwYXJzZXIuZmVlZCgiPGRvYz4iKQogICAgcGFyc2VyLmZlZWQoInRleHQiKQogICAgcGFyc2VyLmZlZWQoIjwvZG9jPiIpCiAgICBwYXJzZXIuY2xvc2UoKQoKICAgIHJldHVybiByZXN1bHQuZ2V0dmFsdWUoKSA9PSBzdGFydCArICI8ZG9jPnRleHQ8L2RvYz4iCgojID09PT09IExvY2F0b3Igc3VwcG9ydAoKZGVmIHRlc3RfZXhwYXRfbG9jYXRvcl9ub2luZm8oKToKICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCiAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCgogICAgcGFyc2VyLmZlZWQoIjxkb2M+IikKICAgIHBhcnNlci5mZWVkKCI8L2RvYz4iKQogICAgcGFyc2VyLmNsb3NlKCkKCiAgICByZXR1cm4gcGFyc2VyLmdldFN5c3RlbUlkKCkgaXMgTm9uZSBhbmQgXAogICAgICAgICAgIHBhcnNlci5nZXRQdWJsaWNJZCgpIGlzIE5vbmUgYW5kIFwKICAgICAgICAgICBwYXJzZXIuZ2V0TGluZU51bWJlcigpID09IDEKCmRlZiB0ZXN0X2V4cGF0X2xvY2F0b3Jfd2l0aGluZm8oKToKICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCiAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKICAgIHBhcnNlci5zZXRDb250ZW50SGFuZGxlcih4bWxnZW4pCiAgICBwYXJzZXIucGFyc2UoZmluZGZpbGUoInRlc3QueG1sIikpCgogICAgcmV0dXJuIHBhcnNlci5nZXRTeXN0ZW1JZCgpID09IGZpbmRmaWxlKCJ0ZXN0LnhtbCIpIGFuZCBcCiAgICAgICAgICAgcGFyc2VyLmdldFB1YmxpY0lkKCkgaXMgTm9uZQoKCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiMKIyAgIGVycm9yIHJlcG9ydGluZwojCiMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgpkZWYgdGVzdF9leHBhdF9pbnBzb3VyY2VfbG9jYXRpb24oKToKICAgIHBhcnNlciA9IGNyZWF0ZV9wYXJzZXIoKQogICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKENvbnRlbnRIYW5kbGVyKCkpICMgZG8gbm90aGluZwogICAgc291cmNlID0gSW5wdXRTb3VyY2UoKQogICAgc291cmNlLnNldEJ5dGVTdHJlYW0oU3RyaW5nSU8oIjxmb28gYmFyIGZvb2Jhcj4iKSkgICAjaWxsLWZvcm1lZAogICAgbmFtZSA9ICJhIGZpbGUgbmFtZSIKICAgIHNvdXJjZS5zZXRTeXN0ZW1JZChuYW1lKQogICAgdHJ5OgogICAgICAgIHBhcnNlci5wYXJzZShzb3VyY2UpCiAgICBleGNlcHQgU0FYRXhjZXB0aW9uLCBlOgogICAgICAgIHJldHVybiBlLmdldFN5c3RlbUlkKCkgPT0gbmFtZQoKZGVmIHRlc3RfZXhwYXRfaW5jb21wbGV0ZSgpOgogICAgcGFyc2VyID0gY3JlYXRlX3BhcnNlcigpCiAgICBwYXJzZXIuc2V0Q29udGVudEhhbmRsZXIoQ29udGVudEhhbmRsZXIoKSkgIyBkbyBub3RoaW5nCiAgICB0cnk6CiAgICAgICAgcGFyc2VyLnBhcnNlKFN0cmluZ0lPKCI8Zm9vPiIpKQogICAgZXhjZXB0IFNBWFBhcnNlRXhjZXB0aW9uOgogICAgICAgIHJldHVybiAxICMgb2ssIGVycm9yIGZvdW5kCiAgICBlbHNlOgogICAgICAgIHJldHVybiAwCgoKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIwojICAgeG1scmVhZGVyIHRlc3RzCiMKIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiMgPT09PT0gQXR0cmlidXRlc0ltcGwKCmRlZiB2ZXJpZnlfZW1wdHlfYXR0cnMoYXR0cnMpOgogICAgdHJ5OgogICAgICAgIGF0dHJzLmdldFZhbHVlKCJhdHRyIikKICAgICAgICBndmsgPSAwCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgZ3ZrID0gMQoKICAgIHRyeToKICAgICAgICBhdHRycy5nZXRWYWx1ZUJ5UU5hbWUoImF0dHIiKQogICAgICAgIGd2cWsgPSAwCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgZ3ZxayA9IDEKCiAgICB0cnk6CiAgICAgICAgYXR0cnMuZ2V0TmFtZUJ5UU5hbWUoImF0dHIiKQogICAgICAgIGducWsgPSAwCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgZ25xayA9IDEKCiAgICB0cnk6CiAgICAgICAgYXR0cnMuZ2V0UU5hbWVCeU5hbWUoImF0dHIiKQogICAgICAgIGdxbmsgPSAwCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgZ3FuayA9IDEKCiAgICB0cnk6CiAgICAgICAgYXR0cnNbImF0dHIiXQogICAgICAgIGdpayA9IDAKICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBnaWsgPSAxCgogICAgcmV0dXJuIGF0dHJzLmdldExlbmd0aCgpID09IDAgYW5kIFwKICAgICAgICAgICBhdHRycy5nZXROYW1lcygpID09IFtdIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWVzKCkgPT0gW10gYW5kIFwKICAgICAgICAgICBsZW4oYXR0cnMpID09IDAgYW5kIFwKICAgICAgICAgICBub3QgYXR0cnMuaGFzX2tleSgiYXR0ciIpIGFuZCBcCiAgICAgICAgICAgYXR0cnMua2V5cygpID09IFtdIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0KCJhdHRycyIpIGlzIE5vbmUgYW5kIFwKICAgICAgICAgICBhdHRycy5nZXQoImF0dHJzIiwgMjUpID09IDI1IGFuZCBcCiAgICAgICAgICAgYXR0cnMuaXRlbXMoKSA9PSBbXSBhbmQgXAogICAgICAgICAgIGF0dHJzLnZhbHVlcygpID09IFtdIGFuZCBcCiAgICAgICAgICAgZ3ZrIGFuZCBndnFrIGFuZCBnbnFrIGFuZCBnaWsgYW5kIGdxbmsKCmRlZiB2ZXJpZnlfYXR0cnNfd2F0dHIoYXR0cnMpOgogICAgcmV0dXJuIGF0dHJzLmdldExlbmd0aCgpID09IDEgYW5kIFwKICAgICAgICAgICBhdHRycy5nZXROYW1lcygpID09IFsiYXR0ciJdIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWVzKCkgPT0gWyJhdHRyIl0gYW5kIFwKICAgICAgICAgICBsZW4oYXR0cnMpID09IDEgYW5kIFwKICAgICAgICAgICBhdHRycy5oYXNfa2V5KCJhdHRyIikgYW5kIFwKICAgICAgICAgICBhdHRycy5rZXlzKCkgPT0gWyJhdHRyIl0gYW5kIFwKICAgICAgICAgICBhdHRycy5nZXQoImF0dHIiKSA9PSAidmFsIiBhbmQgXAogICAgICAgICAgIGF0dHJzLmdldCgiYXR0ciIsIDI1KSA9PSAidmFsIiBhbmQgXAogICAgICAgICAgIGF0dHJzLml0ZW1zKCkgPT0gWygiYXR0ciIsICJ2YWwiKV0gYW5kIFwKICAgICAgICAgICBhdHRycy52YWx1ZXMoKSA9PSBbInZhbCJdIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0VmFsdWUoImF0dHIiKSA9PSAidmFsIiBhbmQgXAogICAgICAgICAgIGF0dHJzLmdldFZhbHVlQnlRTmFtZSgiYXR0ciIpID09ICJ2YWwiIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0TmFtZUJ5UU5hbWUoImF0dHIiKSA9PSAiYXR0ciIgYW5kIFwKICAgICAgICAgICBhdHRyc1siYXR0ciJdID09ICJ2YWwiIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWVCeU5hbWUoImF0dHIiKSA9PSAiYXR0ciIKCmRlZiB0ZXN0X2F0dHJzX2VtcHR5KCk6CiAgICByZXR1cm4gdmVyaWZ5X2VtcHR5X2F0dHJzKEF0dHJpYnV0ZXNJbXBsKHt9KSkKCmRlZiB0ZXN0X2F0dHJzX3dhdHRyKCk6CiAgICByZXR1cm4gdmVyaWZ5X2F0dHJzX3dhdHRyKEF0dHJpYnV0ZXNJbXBsKHsiYXR0ciIgOiAidmFsIn0pKQoKIyA9PT09PSBBdHRyaWJ1dGVzSW1wbAoKZGVmIHZlcmlmeV9lbXB0eV9uc2F0dHJzKGF0dHJzKToKICAgIHRyeToKICAgICAgICBhdHRycy5nZXRWYWx1ZSgobnNfdXJpLCAiYXR0ciIpKQogICAgICAgIGd2ayA9IDAKICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBndmsgPSAxCgogICAgdHJ5OgogICAgICAgIGF0dHJzLmdldFZhbHVlQnlRTmFtZSgibnM6YXR0ciIpCiAgICAgICAgZ3ZxayA9IDAKICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBndnFrID0gMQoKICAgIHRyeToKICAgICAgICBhdHRycy5nZXROYW1lQnlRTmFtZSgibnM6YXR0ciIpCiAgICAgICAgZ25xayA9IDAKICAgIGV4Y2VwdCBLZXlFcnJvcjoKICAgICAgICBnbnFrID0gMQoKICAgIHRyeToKICAgICAgICBhdHRycy5nZXRRTmFtZUJ5TmFtZSgobnNfdXJpLCAiYXR0ciIpKQogICAgICAgIGdxbmsgPSAwCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgZ3FuayA9IDEKCiAgICB0cnk6CiAgICAgICAgYXR0cnNbKG5zX3VyaSwgImF0dHIiKV0KICAgICAgICBnaWsgPSAwCiAgICBleGNlcHQgS2V5RXJyb3I6CiAgICAgICAgZ2lrID0gMQoKICAgIHJldHVybiBhdHRycy5nZXRMZW5ndGgoKSA9PSAwIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0TmFtZXMoKSA9PSBbXSBhbmQgXAogICAgICAgICAgIGF0dHJzLmdldFFOYW1lcygpID09IFtdIGFuZCBcCiAgICAgICAgICAgbGVuKGF0dHJzKSA9PSAwIGFuZCBcCiAgICAgICAgICAgbm90IGF0dHJzLmhhc19rZXkoKG5zX3VyaSwgImF0dHIiKSkgYW5kIFwKICAgICAgICAgICBhdHRycy5rZXlzKCkgPT0gW10gYW5kIFwKICAgICAgICAgICBhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSkgaXMgTm9uZSBhbmQgXAogICAgICAgICAgIGF0dHJzLmdldCgobnNfdXJpLCAiYXR0ciIpLCAyNSkgPT0gMjUgYW5kIFwKICAgICAgICAgICBhdHRycy5pdGVtcygpID09IFtdIGFuZCBcCiAgICAgICAgICAgYXR0cnMudmFsdWVzKCkgPT0gW10gYW5kIFwKICAgICAgICAgICBndmsgYW5kIGd2cWsgYW5kIGducWsgYW5kIGdpayBhbmQgZ3FuawoKZGVmIHRlc3RfbnNhdHRyc19lbXB0eSgpOgogICAgcmV0dXJuIHZlcmlmeV9lbXB0eV9uc2F0dHJzKEF0dHJpYnV0ZXNOU0ltcGwoe30sIHt9KSkKCmRlZiB0ZXN0X25zYXR0cnNfd2F0dHIoKToKICAgIGF0dHJzID0gQXR0cmlidXRlc05TSW1wbCh7KG5zX3VyaSwgImF0dHIiKSA6ICJ2YWwifSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KG5zX3VyaSwgImF0dHIiKSA6ICJuczphdHRyIn0pCgogICAgcmV0dXJuIGF0dHJzLmdldExlbmd0aCgpID09IDEgYW5kIFwKICAgICAgICAgICBhdHRycy5nZXROYW1lcygpID09IFsobnNfdXJpLCAiYXR0ciIpXSBhbmQgXAogICAgICAgICAgIGF0dHJzLmdldFFOYW1lcygpID09IFsibnM6YXR0ciJdIGFuZCBcCiAgICAgICAgICAgbGVuKGF0dHJzKSA9PSAxIGFuZCBcCiAgICAgICAgICAgYXR0cnMuaGFzX2tleSgobnNfdXJpLCAiYXR0ciIpKSBhbmQgXAogICAgICAgICAgIGF0dHJzLmtleXMoKSA9PSBbKG5zX3VyaSwgImF0dHIiKV0gYW5kIFwKICAgICAgICAgICBhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSkgPT0gInZhbCIgYW5kIFwKICAgICAgICAgICBhdHRycy5nZXQoKG5zX3VyaSwgImF0dHIiKSwgMjUpID09ICJ2YWwiIGFuZCBcCiAgICAgICAgICAgYXR0cnMuaXRlbXMoKSA9PSBbKChuc191cmksICJhdHRyIiksICJ2YWwiKV0gYW5kIFwKICAgICAgICAgICBhdHRycy52YWx1ZXMoKSA9PSBbInZhbCJdIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0VmFsdWUoKG5zX3VyaSwgImF0dHIiKSkgPT0gInZhbCIgYW5kIFwKICAgICAgICAgICBhdHRycy5nZXRWYWx1ZUJ5UU5hbWUoIm5zOmF0dHIiKSA9PSAidmFsIiBhbmQgXAogICAgICAgICAgIGF0dHJzLmdldE5hbWVCeVFOYW1lKCJuczphdHRyIikgPT0gKG5zX3VyaSwgImF0dHIiKSBhbmQgXAogICAgICAgICAgIGF0dHJzWyhuc191cmksICJhdHRyIildID09ICJ2YWwiIGFuZCBcCiAgICAgICAgICAgYXR0cnMuZ2V0UU5hbWVCeU5hbWUoKG5zX3VyaSwgImF0dHIiKSkgPT0gIm5zOmF0dHIiCgoKIyA9PT09PSBNYWluIHByb2dyYW0KCmRlZiBtYWtlX3Rlc3Rfb3V0cHV0KCk6CiAgICBwYXJzZXIgPSBjcmVhdGVfcGFyc2VyKCkKICAgIHJlc3VsdCA9IFN0cmluZ0lPKCkKICAgIHhtbGdlbiA9IFhNTEdlbmVyYXRvcihyZXN1bHQpCgogICAgcGFyc2VyLnNldENvbnRlbnRIYW5kbGVyKHhtbGdlbikKICAgIHBhcnNlci5wYXJzZShmaW5kZmlsZSgidGVzdC54bWwiKSkKCiAgICBvdXRmID0gb3BlbihmaW5kZmlsZSgidGVzdC54bWwub3V0IiksICJ3IikKICAgIG91dGYud3JpdGUocmVzdWx0LmdldHZhbHVlKCkpCiAgICBvdXRmLmNsb3NlKCkKCml0ZW1zID0gbG9jYWxzKCkuaXRlbXMoKQppdGVtcy5zb3J0KCkKZm9yIChuYW1lLCB2YWx1ZSkgaW4gaXRlbXM6CiAgICBpZiBuYW1lWyA6IDVdID09ICJ0ZXN0XyI6CiAgICAgICAgY29uZmlybSh2YWx1ZSgpLCBuYW1lKQoKcHJpbnQgIiVkIHRlc3RzLCAlZCBmYWlsdXJlcyIgJSAodGVzdHMsIGZhaWxzKQppZiBmYWlscyAhPSAwOgogICAgcmFpc2UgVGVzdEZhaWxlZCwgIiVkIG9mICVkIHRlc3RzIGZhaWxlZCIgJSAoZmFpbHMsIHRlc3RzKQo=