Iy0qLSBjb2Rpbmc6IElTTy04ODU5LTEgLSotCiMgcHlzcWxpdGUyL2RiYXBpMi5weTogdGhlIERCLUFQSSAyLjAgaW50ZXJmYWNlCiMKIyBDb3B5cmlnaHQgKEMpIDIwMDQtMjAwNSBHZXJoYXJkIEjkcmluZyA8Z2hAZ2hhZXJpbmcuZGU+CiMKIyBUaGlzIGZpbGUgaXMgcGFydCBvZiBweXNxbGl0ZS4KIwojIFRoaXMgc29mdHdhcmUgaXMgcHJvdmlkZWQgJ2FzLWlzJywgd2l0aG91dCBhbnkgZXhwcmVzcyBvciBpbXBsaWVkCiMgd2FycmFudHkuICBJbiBubyBldmVudCB3aWxsIHRoZSBhdXRob3JzIGJlIGhlbGQgbGlhYmxlIGZvciBhbnkgZGFtYWdlcwojIGFyaXNpbmcgZnJvbSB0aGUgdXNlIG9mIHRoaXMgc29mdHdhcmUuCiMKIyBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKIyBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiMgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgojCiMgMS4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdCBub3QKIyAgICBjbGFpbSB0aGF0IHlvdSB3cm90ZSB0aGUgb3JpZ2luYWwgc29mdHdhcmUuIElmIHlvdSB1c2UgdGhpcyBzb2Z0d2FyZQojICAgIGluIGEgcHJvZHVjdCwgYW4gYWNrbm93bGVkZ21lbnQgaW4gdGhlIHByb2R1Y3QgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZQojICAgIGFwcHJlY2lhdGVkIGJ1dCBpcyBub3QgcmVxdWlyZWQuCiMgMi4gQWx0ZXJlZCBzb3VyY2UgdmVyc2lvbnMgbXVzdCBiZSBwbGFpbmx5IG1hcmtlZCBhcyBzdWNoLCBhbmQgbXVzdCBub3QgYmUKIyAgICBtaXNyZXByZXNlbnRlZCBhcyBiZWluZyB0aGUgb3JpZ2luYWwgc29mdHdhcmUuCiMgMy4gVGhpcyBub3RpY2UgbWF5IG5vdCBiZSByZW1vdmVkIG9yIGFsdGVyZWQgZnJvbSBhbnkgc291cmNlIGRpc3RyaWJ1dGlvbi4KCmltcG9ydCBkYXRldGltZQppbXBvcnQgdGltZQoKZnJvbSBfc3FsaXRlMyBpbXBvcnQgKgoKcGFyYW1zdHlsZSA9ICJxbWFyayIKCnRocmVhZHNhZmV0eSA9IDEKCmFwaWxldmVsID0gIjIuMCIKCkRhdGUgPSBkYXRldGltZS5kYXRlCgpUaW1lID0gZGF0ZXRpbWUudGltZQoKVGltZXN0YW1wID0gZGF0ZXRpbWUuZGF0ZXRpbWUKCmRlZiBEYXRlRnJvbVRpY2tzKHRpY2tzKToKICAgIHJldHVybiBEYXRlKCp0aW1lLmxvY2FsdGltZSh0aWNrcylbOjNdKQoKZGVmIFRpbWVGcm9tVGlja3ModGlja3MpOgogICAgcmV0dXJuIFRpbWUoKnRpbWUubG9jYWx0aW1lKHRpY2tzKVszOjZdKQoKZGVmIFRpbWVzdGFtcEZyb21UaWNrcyh0aWNrcyk6CiAgICByZXR1cm4gVGltZXN0YW1wKCp0aW1lLmxvY2FsdGltZSh0aWNrcylbOjZdKQoKdmVyc2lvbl9pbmZvID0gdHVwbGUoW2ludCh4KSBmb3IgeCBpbiB2ZXJzaW9uLnNwbGl0KCIuIildKQpzcWxpdGVfdmVyc2lvbl9pbmZvID0gdHVwbGUoW2ludCh4KSBmb3IgeCBpbiBzcWxpdGVfdmVyc2lvbi5zcGxpdCgiLiIpXSkKCkJpbmFyeSA9IGJ1ZmZlcgoKZGVmIHJlZ2lzdGVyX2FkYXB0ZXJzX2FuZF9jb252ZXJ0ZXJzKCk6CiAgICBkZWYgYWRhcHRfZGF0ZSh2YWwpOgogICAgICAgIHJldHVybiB2YWwuaXNvZm9ybWF0KCkKCiAgICBkZWYgYWRhcHRfZGF0ZXRpbWUodmFsKToKICAgICAgICByZXR1cm4gdmFsLmlzb2Zvcm1hdCgiICIpCgogICAgZGVmIGNvbnZlcnRfZGF0ZSh2YWwpOgogICAgICAgIHJldHVybiBkYXRldGltZS5kYXRlKCptYXAoaW50LCB2YWwuc3BsaXQoIi0iKSkpCgogICAgZGVmIGNvbnZlcnRfdGltZXN0YW1wKHZhbCk6CiAgICAgICAgZGF0ZXBhcnQsIHRpbWVwYXJ0ID0gdmFsLnNwbGl0KCIgIikKICAgICAgICB5ZWFyLCBtb250aCwgZGF5ID0gbWFwKGludCwgZGF0ZXBhcnQuc3BsaXQoIi0iKSkKICAgICAgICB0aW1lcGFydF9mdWxsID0gdGltZXBhcnQuc3BsaXQoIi4iKQogICAgICAgIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzID0gbWFwKGludCwgdGltZXBhcnRfZnVsbFswXS5zcGxpdCgiOiIpKQogICAgICAgIGlmIGxlbih0aW1lcGFydF9mdWxsKSA9PSAyOgogICAgICAgICAgICBtaWNyb3NlY29uZHMgPSBpbnQodGltZXBhcnRfZnVsbFsxXSkKICAgICAgICBlbHNlOgogICAgICAgICAgICBtaWNyb3NlY29uZHMgPSAwCgogICAgICAgIHZhbCA9IGRhdGV0aW1lLmRhdGV0aW1lKHllYXIsIG1vbnRoLCBkYXksIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzLCBtaWNyb3NlY29uZHMpCiAgICAgICAgcmV0dXJuIHZhbAoKCiAgICByZWdpc3Rlcl9hZGFwdGVyKGRhdGV0aW1lLmRhdGUsIGFkYXB0X2RhdGUpCiAgICByZWdpc3Rlcl9hZGFwdGVyKGRhdGV0aW1lLmRhdGV0aW1lLCBhZGFwdF9kYXRldGltZSkKICAgIHJlZ2lzdGVyX2NvbnZlcnRlcigiZGF0ZSIsIGNvbnZlcnRfZGF0ZSkKICAgIHJlZ2lzdGVyX2NvbnZlcnRlcigidGltZXN0YW1wIiwgY29udmVydF90aW1lc3RhbXApCgpyZWdpc3Rlcl9hZGFwdGVyc19hbmRfY29udmVydGVycygpCgojIENsZWFuIHVwIG5hbWVzcGFjZQoKZGVsKHJlZ2lzdGVyX2FkYXB0ZXJzX2FuZF9jb252ZXJ0ZXJzKQo=