IyAtKi0gY29kaW5nOiBpc28tODg1OS0xIC0qLQojIHB5c3FsaXRlMi9kYmFwaTIucHk6IHRoZSBEQi1BUEkgMi4wIGludGVyZmFjZQojCiMgQ29weXJpZ2h0IChDKSAyMDA0LTIwMDUgR2VyaGFyZCBI5HJpbmcgPGdoQGdoYWVyaW5nLmRlPgojCiMgVGhpcyBmaWxlIGlzIHBhcnQgb2YgcHlzcWxpdGUuCiMKIyBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAojIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKIyBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgojCiMgUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIGFueW9uZSB0byB1c2UgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UsCiMgaW5jbHVkaW5nIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLCBhbmQgdG8gYWx0ZXIgaXQgYW5kIHJlZGlzdHJpYnV0ZSBpdAojIGZyZWVseSwgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIHJlc3RyaWN0aW9uczoKIwojIDEuIFRoZSBvcmlnaW4gb2YgdGhpcyBzb2Z0d2FyZSBtdXN0IG5vdCBiZSBtaXNyZXByZXNlbnRlZDsgeW91IG11c3Qgbm90CiMgICAgY2xhaW0gdGhhdCB5b3Ugd3JvdGUgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLiBJZiB5b3UgdXNlIHRoaXMgc29mdHdhcmUKIyAgICBpbiBhIHByb2R1Y3QsIGFuIGFja25vd2xlZGdtZW50IGluIHRoZSBwcm9kdWN0IGRvY3VtZW50YXRpb24gd291bGQgYmUKIyAgICBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgojIDIuIEFsdGVyZWQgc291cmNlIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCwgYW5kIG11c3Qgbm90IGJlCiMgICAgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgojIDMuIFRoaXMgbm90aWNlIG1heSBub3QgYmUgcmVtb3ZlZCBvciBhbHRlcmVkIGZyb20gYW55IHNvdXJjZSBkaXN0cmlidXRpb24uCgppbXBvcnQgZGF0ZXRpbWUKaW1wb3J0IHRpbWUKCmZyb20gX3NxbGl0ZTMgaW1wb3J0ICoKCnBhcmFtc3R5bGUgPSAicW1hcmsiCgp0aHJlYWRzYWZldHkgPSAxCgphcGlsZXZlbCA9ICIyLjAiCgpEYXRlID0gZGF0ZXRpbWUuZGF0ZQoKVGltZSA9IGRhdGV0aW1lLnRpbWUKClRpbWVzdGFtcCA9IGRhdGV0aW1lLmRhdGV0aW1lCgpkZWYgRGF0ZUZyb21UaWNrcyh0aWNrcyk6CiAgICByZXR1cm4gRGF0ZSgqdGltZS5sb2NhbHRpbWUodGlja3MpWzozXSkKCmRlZiBUaW1lRnJvbVRpY2tzKHRpY2tzKToKICAgIHJldHVybiBUaW1lKCp0aW1lLmxvY2FsdGltZSh0aWNrcylbMzo2XSkKCmRlZiBUaW1lc3RhbXBGcm9tVGlja3ModGlja3MpOgogICAgcmV0dXJuIFRpbWVzdGFtcCgqdGltZS5sb2NhbHRpbWUodGlja3MpWzo2XSkKCnZlcnNpb25faW5mbyA9IHR1cGxlKFtpbnQoeCkgZm9yIHggaW4gdmVyc2lvbi5zcGxpdCgiLiIpXSkKc3FsaXRlX3ZlcnNpb25faW5mbyA9IHR1cGxlKFtpbnQoeCkgZm9yIHggaW4gc3FsaXRlX3ZlcnNpb24uc3BsaXQoIi4iKV0pCgpCaW5hcnkgPSBidWZmZXIKCmRlZiByZWdpc3Rlcl9hZGFwdGVyc19hbmRfY29udmVydGVycygpOgogICAgZGVmIGFkYXB0X2RhdGUodmFsKToKICAgICAgICByZXR1cm4gdmFsLmlzb2Zvcm1hdCgpCgogICAgZGVmIGFkYXB0X2RhdGV0aW1lKHZhbCk6CiAgICAgICAgcmV0dXJuIHZhbC5pc29mb3JtYXQoIiAiKQoKICAgIGRlZiBjb252ZXJ0X2RhdGUodmFsKToKICAgICAgICByZXR1cm4gZGF0ZXRpbWUuZGF0ZSgqbWFwKGludCwgdmFsLnNwbGl0KCItIikpKQoKICAgIGRlZiBjb252ZXJ0X3RpbWVzdGFtcCh2YWwpOgogICAgICAgIGRhdGVwYXJ0LCB0aW1lcGFydCA9IHZhbC5zcGxpdCgiICIpCiAgICAgICAgeWVhciwgbW9udGgsIGRheSA9IG1hcChpbnQsIGRhdGVwYXJ0LnNwbGl0KCItIikpCiAgICAgICAgdGltZXBhcnRfZnVsbCA9IHRpbWVwYXJ0LnNwbGl0KCIuIikKICAgICAgICBob3VycywgbWludXRlcywgc2Vjb25kcyA9IG1hcChpbnQsIHRpbWVwYXJ0X2Z1bGxbMF0uc3BsaXQoIjoiKSkKICAgICAgICBpZiBsZW4odGltZXBhcnRfZnVsbCkgPT0gMjoKICAgICAgICAgICAgbWljcm9zZWNvbmRzID0gaW50KCd7OjA8Ni42fScuZm9ybWF0KHRpbWVwYXJ0X2Z1bGxbMV0uZGVjb2RlKCkpKQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIG1pY3Jvc2Vjb25kcyA9IDAKCiAgICAgICAgdmFsID0gZGF0ZXRpbWUuZGF0ZXRpbWUoeWVhciwgbW9udGgsIGRheSwgaG91cnMsIG1pbnV0ZXMsIHNlY29uZHMsIG1pY3Jvc2Vjb25kcykKICAgICAgICByZXR1cm4gdmFsCgoKICAgIHJlZ2lzdGVyX2FkYXB0ZXIoZGF0ZXRpbWUuZGF0ZSwgYWRhcHRfZGF0ZSkKICAgIHJlZ2lzdGVyX2FkYXB0ZXIoZGF0ZXRpbWUuZGF0ZXRpbWUsIGFkYXB0X2RhdGV0aW1lKQogICAgcmVnaXN0ZXJfY29udmVydGVyKCJkYXRlIiwgY29udmVydF9kYXRlKQogICAgcmVnaXN0ZXJfY29udmVydGVyKCJ0aW1lc3RhbXAiLCBjb252ZXJ0X3RpbWVzdGFtcCkKCnJlZ2lzdGVyX2FkYXB0ZXJzX2FuZF9jb252ZXJ0ZXJzKCkKCiMgQ2xlYW4gdXAgbmFtZXNwYWNlCgpkZWwocmVnaXN0ZXJfYWRhcHRlcnNfYW5kX2NvbnZlcnRlcnMpCg==