LyoKICoJTmF0aW9uYWwgTGFuZ3VhZ2UgU3VwcG9ydCBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqICAgICAgQ29weXJpZ2h0IDIwMDAgIEp1bGlvIEPpc2FyIEfhenF1ZXoKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bG9jYWxlLmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndpbnRlcm5sLmgiCiNpbmNsdWRlICJ3aW5lL3VuaWNvZGUuaCIKI2luY2x1ZGUgIndpbnZlci5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChubHMpOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbnZlcnREZWZhdWx0TG9jYWxlIChLRVJORUwzMi5AKQogKi8KTENJRCBXSU5BUEkgQ29udmVydERlZmF1bHRMb2NhbGUgKExDSUQgbGNpZCkKewlzd2l0Y2ggKGxjaWQpCgl7ICBjYXNlIExPQ0FMRV9TWVNURU1fREVGQVVMVDoKCSAgICAgcmV0dXJuIEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgICBjYXNlIExPQ0FMRV9VU0VSX0RFRkFVTFQ6CgkgICAgIHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCSAgIGNhc2UgTE9DQUxFX05FVVRSQUw6CgkgICAgIHJldHVybiBNQUtFTENJRCAoTEFOR19ORVVUUkFMLCBTVUJMQU5HX05FVVRSQUwpOwoJfQoJcmV0dXJuIE1BS0VMQU5HSUQoIFBSSU1BUllMQU5HSUQobGNpZCksIFNVQkxBTkdfTkVVVFJBTCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJc1ZhbGlkTG9jYWxlCVtLRVJORUwzMi5AXQogKi8KQk9PTCBXSU5BUEkgSXNWYWxpZExvY2FsZShMQ0lEIGxjaWQsRFdPUkQgZmxhZ3MpCnsKICAgIC8qIGNoZWNrIGlmIGxhbmd1YWdlIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIGtlcm5lbDMyIHJlc291cmNlcyAqLwogICAgaWYoIUZpbmRSZXNvdXJjZUV4VyhHZXRNb2R1bGVIYW5kbGVBKCJLRVJORUwzMiIpLCBSVF9TVFJJTkdXLCAoTFBDV1NUUilMT0NBTEVfSUxBTkdVQUdFLCBMT1dPUkQobGNpZCkpKQoJcmV0dXJuIEZBTFNFOwogICAgZWxzZQoJcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBCT09MIENBTExCQUNLIEVudW1SZXNvdXJjZUxhbmd1YWdlc1Byb2NXKEhNT0RVTEUgaE1vZHVsZSwgTFBDV1NUUiB0eXBlLAoJCUxQQ1dTVFIgbmFtZSwgV09SRCBMYW5nSUQsIExPTkcgbFBhcmFtKQp7CiAgICBDSEFSIGJ1ZkFbMjBdOwogICAgV0NIQVIgYnVmV1syMF07CiAgICBMT0NBTEVfRU5VTVBST0NXIGxwZm5Mb2NhbGVFbnVtID0gKExPQ0FMRV9FTlVNUFJPQ1cpbFBhcmFtOwogICAgc3ByaW50ZihidWZBLCAiJTA4eCIsIChVSU5UKUxhbmdJRCk7CiAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYnVmQSwgLTEsIGJ1ZlcsIHNpemVvZihidWZXKS9zaXplb2YoYnVmV1swXSkpOwogICAgcmV0dXJuIGxwZm5Mb2NhbGVFbnVtKGJ1ZlcpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFbnVtU3lzdGVtTG9jYWxlc1cJW0tFUk5FTDMyLkBdCiAqLwpCT09MIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlc1coIExPQ0FMRV9FTlVNUFJPQ1cgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzICkKewogICAgVFJBQ0UoIiglcCwlMDhseClcbiIsIGxwZm5Mb2NhbGVFbnVtLGZsYWdzKTsKCiAgICBFbnVtUmVzb3VyY2VMYW5ndWFnZXNXKEdldE1vZHVsZUhhbmRsZUEoIktFUk5FTDMyIiksIFJUX1NUUklOR1csCgkgICAgKExQQ1dTVFIpTE9DQUxFX0lMQU5HVUFHRSwgRW51bVJlc291cmNlTGFuZ3VhZ2VzUHJvY1csCgkgICAgKExPTkcpbHBmbkxvY2FsZUVudW0pOwoKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgQk9PTCBDQUxMQkFDSyBFbnVtUmVzb3VyY2VMYW5ndWFnZXNQcm9jQShITU9EVUxFIGhNb2R1bGUsIExQQ1NUUiB0eXBlLAoJCUxQQ1NUUiBuYW1lLCBXT1JEIExhbmdJRCwgTE9ORyBsUGFyYW0pCnsKICAgIENIQVIgYnVmQVsyMF07CiAgICBMT0NBTEVfRU5VTVBST0NBIGxwZm5Mb2NhbGVFbnVtID0gKExPQ0FMRV9FTlVNUFJPQ0EpbFBhcmFtOwogICAgc3ByaW50ZihidWZBLCAiJTA4eCIsIChVSU5UKUxhbmdJRCk7CiAgICByZXR1cm4gbHBmbkxvY2FsZUVudW0oYnVmQSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1TeXN0ZW1Mb2NhbGVzQQlbS0VSTkVMMzIuQF0KICovCkJPT0wgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzQShMT0NBTEVfRU5VTVBST0NBIGxwZm5Mb2NhbGVFbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzKQp7CiAgICBUUkFDRSgiKCVwLCUwOGx4KVxuIiwgbHBmbkxvY2FsZUVudW0sZmxhZ3MpOwoKICAgIEVudW1SZXNvdXJjZUxhbmd1YWdlc0EoR2V0TW9kdWxlSGFuZGxlQSgiS0VSTkVMMzIiKSwgUlRfU1RSSU5HQSwKCSAgICAoTFBDU1RSKUxPQ0FMRV9JTEFOR1VBR0UsIEVudW1SZXNvdXJjZUxhbmd1YWdlc1Byb2NBLAoJICAgIChMT05HKWxwZm5Mb2NhbGVFbnVtKTsKCiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBWZXJMYW5ndWFnZU5hbWVBICAgICAgICAgICAgICBbS0VSTkVMMzIuQF0KICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWVBKCBVSU5UIHdMYW5nLCBMUFNUUiBzekxhbmcsIFVJTlQgblNpemUgKQp7CiAgICBpZighc3pMYW5nKQoJcmV0dXJuIDA7CgogICAgcmV0dXJuIEdldExvY2FsZUluZm9BKE1BS0VMQ0lEKHdMYW5nLCBTT1JUX0RFRkFVTFQpLCBMT0NBTEVfU0VOR0xBTkdVQUdFLCBzekxhbmcsIG5TaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBWZXJMYW5ndWFnZU5hbWVXICAgICAgICAgICAgICBbS0VSTkVMMzIuQF0KICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWVXKCBVSU5UIHdMYW5nLCBMUFdTVFIgc3pMYW5nLCBVSU5UIG5TaXplICkKewogICAgaWYoIXN6TGFuZykKCXJldHVybiAwOwoKICAgIHJldHVybiBHZXRMb2NhbGVJbmZvVyhNQUtFTENJRCh3TGFuZywgU09SVF9ERUZBVUxUKSwgTE9DQUxFX1NFTkdMQU5HVUFHRSwgc3pMYW5nLCBuU2l6ZSk7Cn0KCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fVW5pY29kZV9MVVRbXSA9IHsKICA2ICAgICAgLCAgIDMsIC8qICAgLSAgIDEgKi8KICA2ICAgICAgLCAgIDQsIC8qICAgLSAgIDIgKi8KICA2ICAgICAgLCAgIDUsIC8qICAgLSAgIDMgKi8KICA2ICAgICAgLCAgIDYsIC8qICAgLSAgIDQgKi8KICA2ICAgICAgLCAgIDcsIC8qICAgLSAgIDUgKi8KICA2ICAgICAgLCAgIDgsIC8qICAgLSAgIDYgKi8KICA2ICAgICAgLCAgIDksIC8qICAgLSAgIDcgKi8KICA2ICAgICAgLCAgMTAsIC8qICAgLSAgIDggKi8KICA3ICAgICAgLCAgIDUsIC8qICAgLSAgIDkgKi8KICA3ICAgICAgLCAgIDYsIC8qICAgLSAgMTAgKi8KICA3ICAgICAgLCAgIDcsIC8qICAgLSAgMTEgKi8KICA3ICAgICAgLCAgIDgsIC8qICAgLSAgMTIgKi8KICA3ICAgICAgLCAgIDksIC8qICAgLSAgMTMgKi8KICA2ICAgICAgLCAgMTEsIC8qICAgLSAgMTQgKi8KICA2ICAgICAgLCAgMTIsIC8qICAgLSAgMTUgKi8KICA2ICAgICAgLCAgMTMsIC8qICAgLSAgMTYgKi8KICA2ICAgICAgLCAgMTQsIC8qICAgLSAgMTcgKi8KICA2ICAgICAgLCAgMTUsIC8qICAgLSAgMTggKi8KICA2ICAgICAgLCAgMTYsIC8qICAgLSAgMTkgKi8KICA2ICAgICAgLCAgMTcsIC8qICAgLSAgMjAgKi8KICA2ICAgICAgLCAgMTgsIC8qICAgLSAgMjEgKi8KICA2ICAgICAgLCAgMTksIC8qICAgLSAgMjIgKi8KICA2ICAgICAgLCAgMjAsIC8qICAgLSAgMjMgKi8KICA2ICAgICAgLCAgMjEsIC8qICAgLSAgMjQgKi8KICA2ICAgICAgLCAgMjIsIC8qICAgLSAgMjUgKi8KICA2ICAgICAgLCAgMjMsIC8qICAgLSAgMjYgKi8KICA2ICAgICAgLCAgMjQsIC8qICAgLSAgMjcgKi8KICA2ICAgICAgLCAgMjUsIC8qICAgLSAgMjggKi8KICA2ICAgICAgLCAgMjYsIC8qICAgLSAgMjkgKi8KICA2ICAgICAgLCAgMjcsIC8qICAgLSAgMzAgKi8KICA2ICAgICAgLCAgMjgsIC8qICAgLSAgMzEgKi8KICA3ICAgICAgLCAgIDIsIC8qICAgLSAgMzIgKi8KICA3ICAgICAgLCAgMjgsIC8qICEgLSAgMzMgKi8KICA3ICAgICAgLCAgMjksIC8qICIgLSAgMzQgKi8gLyogIiAqLwogIDcgICAgICAsICAzMSwgLyogIyAtICAzNSAqLwogIDcgICAgICAsICAzMywgLyogJCAtICAzNiAqLwogIDcgICAgICAsICAzNSwgLyogJSAtICAzNyAqLwogIDcgICAgICAsICAzNywgLyogJiAtICAzOCAqLwogIDYgICAgICAsIDEyOCwgLyogJyAtICAzOSAqLwogIDcgICAgICAsICAzOSwgLyogKCAtICA0MCAqLwogIDcgICAgICAsICA0MiwgLyogKSAtICA0MSAqLwogIDcgICAgICAsICA0NSwgLyogKiAtICA0MiAqLwogIDggICAgICAsICAgMywgLyogKyAtICA0MyAqLwogIDcgICAgICAsICA0NywgLyogLCAtICA0NCAqLwogIDYgICAgICAsIDEzMCwgLyogLSAtICA0NSAqLwogIDcgICAgICAsICA1MSwgLyogLiAtICA0NiAqLwogIDcgICAgICAsICA1MywgLyogLyAtICA0NyAqLwogMTIgICAgICAsICAgMywgLyogMCAtICA0OCAqLwogMTIgICAgICAsICAzMywgLyogMSAtICA0OSAqLwogMTIgICAgICAsICA1MSwgLyogMiAtICA1MCAqLwogMTIgICAgICAsICA3MCwgLyogMyAtICA1MSAqLwogMTIgICAgICAsICA4OCwgLyogNCAtICA1MiAqLwogMTIgICAgICAsIDEwNiwgLyogNSAtICA1MyAqLwogMTIgICAgICAsIDEyNSwgLyogNiAtICA1NCAqLwogMTIgICAgICAsIDE0NCwgLyogNyAtICA1NSAqLwogMTIgICAgICAsIDE2MiwgLyogOCAtICA1NiAqLwogMTIgICAgICAsIDE4MCwgLyogOSAtICA1NyAqLwogIDcgICAgICAsICA1NSwgLyogOiAtICA1OCAqLwogIDcgICAgICAsICA1OCwgLyogOyAtICA1OSAqLwogIDggICAgICAsICAxNCwgLyogPCAtICA2MCAqLwogIDggICAgICAsICAxOCwgLyogPSAtICA2MSAqLwogIDggICAgICAsICAyMCwgLyogPiAtICA2MiAqLwogIDcgICAgICAsICA2MCwgLyogPyAtICA2MyAqLwogIDcgICAgICAsICA2MiwgLyogQCAtICA2NCAqLwogMTQgICAgICAsICAgMiwgLyogQSAtICA2NSAqLwogMTQgICAgICAsICAgOSwgLyogQiAtICA2NiAqLwogMTQgICAgICAsICAxMCwgLyogQyAtICA2NyAqLwogMTQgICAgICAsICAyNiwgLyogRCAtICA2OCAqLwogMTQgICAgICAsICAzMywgLyogRSAtICA2OSAqLwogMTQgICAgICAsICAzNSwgLyogRiAtICA3MCAqLwogMTQgICAgICAsICAzNywgLyogRyAtICA3MSAqLwogMTQgICAgICAsICA0NCwgLyogSCAtICA3MiAqLwogMTQgICAgICAsICA1MCwgLyogSSAtICA3MyAqLwogMTQgICAgICAsICA1MywgLyogSiAtICA3NCAqLwogMTQgICAgICAsICA1NCwgLyogSyAtICA3NSAqLwogMTQgICAgICAsICA3MiwgLyogTCAtICA3NiAqLwogMTQgICAgICAsICA4MSwgLyogTSAtICA3NyAqLwogMTQgICAgICAsIDExMiwgLyogTiAtICA3OCAqLwogMTQgICAgICAsIDEyNCwgLyogTyAtICA3OSAqLwogMTQgICAgICAsIDEyNiwgLyogUCAtICA4MCAqLwogMTQgICAgICAsIDEzNywgLyogUSAtICA4MSAqLwogMTQgICAgICAsIDEzOCwgLyogUiAtICA4MiAqLwogMTQgICAgICAsIDE0NSwgLyogUyAtICA4MyAqLwogMTQgICAgICAsIDE1MywgLyogVCAtICA4NCAqLwogMTQgICAgICAsIDE1OSwgLyogVSAtICA4NSAqLwogMTQgICAgICAsIDE2MiwgLyogViAtICA4NiAqLwogMTQgICAgICAsIDE2NCwgLyogVyAtICA4NyAqLwogMTQgICAgICAsIDE2NiwgLyogWCAtICA4OCAqLwogMTQgICAgICAsIDE2NywgLyogWSAtICA4OSAqLwogMTQgICAgICAsIDE2OSwgLyogWiAtICA5MCAqLwogIDcgICAgICAsICA2MywgLyogWyAtICA5MSAqLwogIDcgICAgICAsICA2NSwgLyogXCAtICA5MiAqLwogIDcgICAgICAsICA2NiwgLyogXSAtICA5MyAqLwogIDcgICAgICAsICA2NywgLyogXiAtICA5NCAqLwogIDcgICAgICAsICA2OCwgLyogXyAtICA5NSAqLwogIDcgICAgICAsICA3MiwgLyogYCAtICA5NiAqLwogMTQgICAgICAsICAgMiwgLyogYSAtICA5NyAqLwogMTQgICAgICAsICAgOSwgLyogYiAtICA5OCAqLwogMTQgICAgICAsICAxMCwgLyogYyAtICA5OSAqLwogMTQgICAgICAsICAyNiwgLyogZCAtIDEwMCAqLwogMTQgICAgICAsICAzMywgLyogZSAtIDEwMSAqLwogMTQgICAgICAsICAzNSwgLyogZiAtIDEwMiAqLwogMTQgICAgICAsICAzNywgLyogZyAtIDEwMyAqLwogMTQgICAgICAsICA0NCwgLyogaCAtIDEwNCAqLwogMTQgICAgICAsICA1MCwgLyogaSAtIDEwNSAqLwogMTQgICAgICAsICA1MywgLyogaiAtIDEwNiAqLwogMTQgICAgICAsICA1NCwgLyogayAtIDEwNyAqLwogMTQgICAgICAsICA3MiwgLyogbCAtIDEwOCAqLwogMTQgICAgICAsICA4MSwgLyogbSAtIDEwOSAqLwogMTQgICAgICAsIDExMiwgLyogbiAtIDExMCAqLwogMTQgICAgICAsIDEyNCwgLyogbyAtIDExMSAqLwogMTQgICAgICAsIDEyNiwgLyogcCAtIDExMiAqLwogMTQgICAgICAsIDEzNywgLyogcSAtIDExMyAqLwogMTQgICAgICAsIDEzOCwgLyogciAtIDExNCAqLwogMTQgICAgICAsIDE0NSwgLyogcyAtIDExNSAqLwogMTQgICAgICAsIDE1MywgLyogdCAtIDExNiAqLwogMTQgICAgICAsIDE1OSwgLyogdSAtIDExNyAqLwogMTQgICAgICAsIDE2MiwgLyogdiAtIDExOCAqLwogMTQgICAgICAsIDE2NCwgLyogdyAtIDExOSAqLwogMTQgICAgICAsIDE2NiwgLyogeCAtIDEyMCAqLwogMTQgICAgICAsIDE2NywgLyogeSAtIDEyMSAqLwogMTQgICAgICAsIDE2OSwgLyogeiAtIDEyMiAqLwogIDcgICAgICAsICA3NCwgLyogeyAtIDEyMyAqLwogIDcgICAgICAsICA3NiwgLyogfCAtIDEyNCAqLwogIDcgICAgICAsICA3OCwgLyogfSAtIDEyNSAqLwogIDcgICAgICAsICA4MCwgLyogfiAtIDEyNiAqLwogIDYgICAgICAsICAyOSwgLyogfyAtIDEyNyAqLwogIDYgICAgICAsICAzMCwgLyoggCAtIDEyOCAqLwogIDYgICAgICAsICAzMSwgLyoggSAtIDEyOSAqLwogIDcgICAgICAsIDEyMywgLyoggiAtIDEzMCAqLwogMTQgICAgICAsICAzNSwgLyoggyAtIDEzMSAqLwogIDcgICAgICAsIDEyNywgLyoghCAtIDEzMiAqLwogMTAgICAgICAsICAyMSwgLyoghSAtIDEzMyAqLwogMTAgICAgICAsICAxNSwgLyoghiAtIDEzNCAqLwogMTAgICAgICAsICAxNiwgLyoghyAtIDEzNSAqLwogIDcgICAgICAsICA2NywgLyogiCAtIDEzNiAqLwogMTAgICAgICAsICAyMiwgLyogiSAtIDEzNyAqLwogMTQgICAgICAsIDE0NSwgLyogiiAtIDEzOCAqLwogIDcgICAgICAsIDEzNiwgLyogiyAtIDEzOSAqLwogMTQgKyAxNiAsIDEyNCwgLyogjCAtIDE0MCAqLwogIDYgICAgICAsICA0MywgLyogjSAtIDE0MSAqLwogIDYgICAgICAsICA0NCwgLyogjiAtIDE0MiAqLwogIDYgICAgICAsICA0NSwgLyogjyAtIDE0MyAqLwogIDYgICAgICAsICA0NiwgLyogkCAtIDE0NCAqLwogIDcgICAgICAsIDEyMSwgLyogkSAtIDE0NSAqLwogIDcgICAgICAsIDEyMiwgLyogkiAtIDE0NiAqLwogIDcgICAgICAsIDEyNSwgLyogkyAtIDE0NyAqLwogIDcgICAgICAsIDEyNiwgLyoglCAtIDE0OCAqLwogMTAgICAgICAsICAxNywgLyoglSAtIDE0OSAqLwogIDYgICAgICAsIDEzNywgLyogliAtIDE1MCAqLwogIDYgICAgICAsIDEzOSwgLyoglyAtIDE1MSAqLwogIDcgICAgICAsICA5MywgLyogmCAtIDE1MiAqLwogMTQgICAgICAsIDE1NiwgLyogmSAtIDE1MyAqLwogMTQgICAgICAsIDE0NSwgLyogmiAtIDE1NCAqLwogIDcgICAgICAsIDEzNywgLyogmyAtIDE1NSAqLwogMTQgKyAxNiAsIDEyNCwgLyognCAtIDE1NiAqLwogIDYgICAgICAsICA1OSwgLyognSAtIDE1NyAqLwogIDYgICAgICAsICA2MCwgLyogniAtIDE1OCAqLwogMTQgICAgICAsIDE2NywgLyognyAtIDE1OSAqLwogIDcgICAgICAsICAgNCwgLyogoCAtIDE2MCAqLwogIDcgICAgICAsICA4MSwgLyogoSAtIDE2MSAqLwogMTAgICAgICAsICAgMiwgLyogoiAtIDE2MiAqLwogMTAgICAgICAsICAgMywgLyogoyAtIDE2MyAqLwogMTAgICAgICAsICAgNCwgLyogpCAtIDE2NCAqLwogMTAgICAgICAsICAgNSwgLyogpSAtIDE2NSAqLwogIDcgICAgICAsICA4MiwgLyogpiAtIDE2NiAqLwogMTAgICAgICAsICAgNiwgLyogpyAtIDE2NyAqLwogIDcgICAgICAsICA4MywgLyogqCAtIDE2OCAqLwogMTAgICAgICAsICAgNywgLyogqSAtIDE2OSAqLwogMTQgICAgICAsICAgMiwgLyogqiAtIDE3MCAqLwogIDggICAgICAsICAyNCwgLyogqyAtIDE3MSAqLwogMTAgICAgICAsICAgOCwgLyogrCAtIDE3MiAqLwogIDYgICAgICAsIDEzMSwgLyogrSAtIDE3MyAqLwogMTAgICAgICAsICAgOSwgLyogriAtIDE3NCAqLwogIDcgICAgICAsICA4NCwgLyogryAtIDE3NSAqLwogMTAgICAgICAsICAxMCwgLyogsCAtIDE3NiAqLwogIDggICAgICAsICAyMywgLyogsSAtIDE3NyAqLwogMTIgICAgICAsICA1MSwgLyogsiAtIDE3OCAqLwogMTIgICAgICAsICA3MCwgLyogsyAtIDE3OSAqLwogIDcgICAgICAsICA4NSwgLyogtCAtIDE4MCAqLwogMTAgICAgICAsICAxMSwgLyogtSAtIDE4MSAqLwogMTAgICAgICAsICAxMiwgLyogtiAtIDE4MiAqLwogMTAgICAgICAsICAxMywgLyogtyAtIDE4MyAqLwogIDcgICAgICAsICA4NiwgLyoguCAtIDE4NCAqLwogMTIgICAgICAsICAzMywgLyoguSAtIDE4NSAqLwogMTQgICAgICAsIDEyNCwgLyoguiAtIDE4NiAqLwogIDggICAgICAsICAyNiwgLyoguyAtIDE4NyAqLwogMTIgICAgICAsICAyMSwgLyogvCAtIDE4OCAqLwogMTIgICAgICAsICAyNSwgLyogvSAtIDE4OSAqLwogMTIgICAgICAsICAyOSwgLyogviAtIDE5MCAqLwogIDcgICAgICAsICA4NywgLyogvyAtIDE5MSAqLwogMTQgICAgICAsICAgMiwgLyogwCAtIDE5MiAqLwogMTQgICAgICAsICAgMiwgLyogwSAtIDE5MyAqLwogMTQgICAgICAsICAgMiwgLyogwiAtIDE5NCAqLwogMTQgICAgICAsICAgMiwgLyogwyAtIDE5NSAqLwogMTQgICAgICAsICAgMiwgLyogxCAtIDE5NiAqLwogMTQgICAgICAsICAgMiwgLyogxSAtIDE5NyAqLwogMTQgKyAxNiAsICAgMiwgLyogxiAtIDE5OCAqLwogMTQgICAgICAsICAxMCwgLyogxyAtIDE5OSAqLwogMTQgICAgICAsICAzMywgLyogyCAtIDIwMCAqLwogMTQgICAgICAsICAzMywgLyogySAtIDIwMSAqLwogMTQgICAgICAsICAzMywgLyogyiAtIDIwMiAqLwogMTQgICAgICAsICAzMywgLyogyyAtIDIwMyAqLwogMTQgICAgICAsICA1MCwgLyogzCAtIDIwNCAqLwogMTQgICAgICAsICA1MCwgLyogzSAtIDIwNSAqLwogMTQgICAgICAsICA1MCwgLyogziAtIDIwNiAqLwogMTQgICAgICAsICA1MCwgLyogzyAtIDIwNyAqLwogMTQgICAgICAsICAyNiwgLyog0CAtIDIwOCAqLwogMTQgICAgICAsIDExMiwgLyog0SAtIDIwOSAqLwogMTQgICAgICAsIDEyNCwgLyog0iAtIDIxMCAqLwogMTQgICAgICAsIDEyNCwgLyog0yAtIDIxMSAqLwogMTQgICAgICAsIDEyNCwgLyog1CAtIDIxMiAqLwogMTQgICAgICAsIDEyNCwgLyog1SAtIDIxMyAqLwogMTQgICAgICAsIDEyNCwgLyog1iAtIDIxNCAqLwogIDggICAgICAsICAyOCwgLyog1yAtIDIxNSAqLwogMTQgICAgICAsIDEyNCwgLyog2CAtIDIxNiAqLwogMTQgICAgICAsIDE1OSwgLyog2SAtIDIxNyAqLwogMTQgICAgICAsIDE1OSwgLyog2iAtIDIxOCAqLwogMTQgICAgICAsIDE1OSwgLyog2yAtIDIxOSAqLwogMTQgICAgICAsIDE1OSwgLyog3CAtIDIyMCAqLwogMTQgICAgICAsIDE2NywgLyog3SAtIDIyMSAqLwogMTQgKyAzMiAsIDE1MywgLyog3iAtIDIyMiAqLwogMTQgKyA0OCAsIDE0NSwgLyog3yAtIDIyMyAqLwogMTQgICAgICAsICAgMiwgLyog4CAtIDIyNCAqLwogMTQgICAgICAsICAgMiwgLyog4SAtIDIyNSAqLwogMTQgICAgICAsICAgMiwgLyog4iAtIDIyNiAqLwogMTQgICAgICAsICAgMiwgLyog4yAtIDIyNyAqLwogMTQgICAgICAsICAgMiwgLyog5CAtIDIyOCAqLwogMTQgICAgICAsICAgMiwgLyog5SAtIDIyOSAqLwogMTQgKyAxNiAsICAgMiwgLyog5iAtIDIzMCAqLwogMTQgICAgICAsICAxMCwgLyog5yAtIDIzMSAqLwogMTQgICAgICAsICAzMywgLyog6CAtIDIzMiAqLwogMTQgICAgICAsICAzMywgLyog6SAtIDIzMyAqLwogMTQgICAgICAsICAzMywgLyog6iAtIDIzNCAqLwogMTQgICAgICAsICAzMywgLyog6yAtIDIzNSAqLwogMTQgICAgICAsICA1MCwgLyog7CAtIDIzNiAqLwogMTQgICAgICAsICA1MCwgLyog7SAtIDIzNyAqLwogMTQgICAgICAsICA1MCwgLyog7iAtIDIzOCAqLwogMTQgICAgICAsICA1MCwgLyog7yAtIDIzOSAqLwogMTQgICAgICAsICAyNiwgLyog8CAtIDI0MCAqLwogMTQgICAgICAsIDExMiwgLyog8SAtIDI0MSAqLwogMTQgICAgICAsIDEyNCwgLyog8iAtIDI0MiAqLwogMTQgICAgICAsIDEyNCwgLyog8yAtIDI0MyAqLwogMTQgICAgICAsIDEyNCwgLyog9CAtIDI0NCAqLwogMTQgICAgICAsIDEyNCwgLyog9SAtIDI0NSAqLwogMTQgICAgICAsIDEyNCwgLyog9iAtIDI0NiAqLwogIDggICAgICAsICAyOSwgLyog9yAtIDI0NyAqLwogMTQgICAgICAsIDEyNCwgLyog+CAtIDI0OCAqLwogMTQgICAgICAsIDE1OSwgLyog+SAtIDI0OSAqLwogMTQgICAgICAsIDE1OSwgLyog+iAtIDI1MCAqLwogMTQgICAgICAsIDE1OSwgLyog+yAtIDI1MSAqLwogMTQgICAgICAsIDE1OSwgLyog/CAtIDI1MiAqLwogMTQgICAgICAsIDE2NywgLyog/SAtIDI1MyAqLwogMTQgKyAzMiAsIDE1MywgLyog/iAtIDI1NCAqLwogMTQgICAgICAsIDE2NyAgLyog/yAtIDI1NSAqLyB9OwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTENNX1VuaWNvZGVfTFVUXzJbXSA9IHsgMzMsIDQ0LCAxNDUgfTsKCiNkZWZpbmUgTENNX0RpYWNyaXRpY19TdGFydCAxMzEKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9EaWFjcml0aWNfTFVUW10gPSB7CjEyMywgIC8qIIMgLSAxMzEgKi8KICAyLCAgLyoghCAtIDEzMiAqLwogIDIsICAvKiCFIC0gMTMzICovCiAgMiwgIC8qIIYgLSAxMzQgKi8KICAyLCAgLyoghyAtIDEzNSAqLwogIDMsICAvKiCIIC0gMTM2ICovCiAgMiwgIC8qIIkgLSAxMzcgKi8KIDIwLCAgLyogiiAtIDEzOCAqLwogIDIsICAvKiCLIC0gMTM5ICovCiAgMiwgIC8qIIwgLSAxNDAgKi8KICAyLCAgLyogjSAtIDE0MSAqLwogIDIsICAvKiCOIC0gMTQyICovCiAgMiwgIC8qII8gLSAxNDMgKi8KICAyLCAgLyogkCAtIDE0NCAqLwogIDIsICAvKiCRIC0gMTQ1ICovCiAgMiwgIC8qIJIgLSAxNDYgKi8KICAyLCAgLyogkyAtIDE0NyAqLwogIDIsICAvKiCUIC0gMTQ4ICovCiAgMiwgIC8qIJUgLSAxNDkgKi8KICAyLCAgLyogliAtIDE1MCAqLwogIDIsICAvKiCXIC0gMTUxICovCiAgMiwgIC8qIJggLSAxNTIgKi8KICAyLCAgLyogmSAtIDE1MyAqLwogMjAsICAvKiCaIC0gMTU0ICovCiAgMiwgIC8qIJsgLSAxNTUgKi8KICAyLCAgLyognCAtIDE1NiAqLwogIDIsICAvKiCdIC0gMTU3ICovCiAgMiwgIC8qIJ4gLSAxNTggKi8KIDE5LCAgLyognyAtIDE1OSAqLwogIDIsICAvKiCgIC0gMTYwICovCiAgMiwgIC8qIKEgLSAxNjEgKi8KICAyLCAgLyogoiAtIDE2MiAqLwogIDIsICAvKiCjIC0gMTYzICovCiAgMiwgIC8qIKQgLSAxNjQgKi8KICAyLCAgLyogpSAtIDE2NSAqLwogIDIsICAvKiCmIC0gMTY2ICovCiAgMiwgIC8qIKcgLSAxNjcgKi8KICAyLCAgLyogqCAtIDE2OCAqLwogIDIsICAvKiCpIC0gMTY5ICovCiAgMywgIC8qIKogLSAxNzAgKi8KICAyLCAgLyogqyAtIDE3MSAqLwogIDIsICAvKiCsIC0gMTcyICovCiAgMiwgIC8qIK0gLSAxNzMgKi8KICAyLCAgLyogriAtIDE3NCAqLwogIDIsICAvKiCvIC0gMTc1ICovCiAgMiwgIC8qILAgLSAxNzYgKi8KICAyLCAgLyogsSAtIDE3NyAqLwogIDIsICAvKiCyIC0gMTc4ICovCiAgMiwgIC8qILMgLSAxNzkgKi8KICAyLCAgLyogtCAtIDE4MCAqLwogIDIsICAvKiC1IC0gMTgxICovCiAgMiwgIC8qILYgLSAxODIgKi8KICAyLCAgLyogtyAtIDE4MyAqLwogIDIsICAvKiC4IC0gMTg0ICovCiAgMiwgIC8qILkgLSAxODUgKi8KICAzLCAgLyoguiAtIDE4NiAqLwogIDIsICAvKiC7IC0gMTg3ICovCiAgMiwgIC8qILwgLSAxODggKi8KICAyLCAgLyogvSAtIDE4OSAqLwogIDIsICAvKiC+IC0gMTkwICovCiAgMiwgIC8qIL8gLSAxOTEgKi8KIDE1LCAgLyogwCAtIDE5MiAqLwogMTQsICAvKiDBIC0gMTkzICovCiAxOCwgIC8qIMIgLSAxOTQgKi8KIDI1LCAgLyogwyAtIDE5NSAqLwogMTksICAvKiDEIC0gMTk2ICovCiAyNiwgIC8qIMUgLSAxOTcgKi8KICAyLCAgLyogxiAtIDE5OCAqLwogMjgsICAvKiDHIC0gMTk5ICovCiAxNSwgIC8qIMggLSAyMDAgKi8KIDE0LCAgLyogySAtIDIwMSAqLwogMTgsICAvKiDKIC0gMjAyICovCiAxOSwgIC8qIMsgLSAyMDMgKi8KIDE1LCAgLyogzCAtIDIwNCAqLwogMTQsICAvKiDNIC0gMjA1ICovCiAxOCwgIC8qIM4gLSAyMDYgKi8KIDE5LCAgLyogzyAtIDIwNyAqLwoxMDQsICAvKiDQIC0gMjA4ICovCiAyNSwgIC8qINEgLSAyMDkgKi8KIDE1LCAgLyog0iAtIDIxMCAqLwogMTQsICAvKiDTIC0gMjExICovCiAxOCwgIC8qINQgLSAyMTIgKi8KIDI1LCAgLyog1SAtIDIxMyAqLwogMTksICAvKiDWIC0gMjE0ICovCiAgMiwgIC8qINcgLSAyMTUgKi8KIDMzLCAgLyog2CAtIDIxNiAqLwogMTUsICAvKiDZIC0gMjE3ICovCiAxNCwgIC8qINogLSAyMTggKi8KIDE4LCAgLyog2yAtIDIxOSAqLwogMTksICAvKiDcIC0gMjIwICovCiAxNCwgIC8qIN0gLSAyMjEgKi8KICAyLCAgLyog3iAtIDIyMiAqLwogIDIsICAvKiDfIC0gMjIzICovCiAxNSwgIC8qIOAgLSAyMjQgKi8KIDE0LCAgLyog4SAtIDIyNSAqLwogMTgsICAvKiDiIC0gMjI2ICovCiAyNSwgIC8qIOMgLSAyMjcgKi8KIDE5LCAgLyog5CAtIDIyOCAqLwogMjYsICAvKiDlIC0gMjI5ICovCiAgMiwgIC8qIOYgLSAyMzAgKi8KIDI4LCAgLyog5yAtIDIzMSAqLwogMTUsICAvKiDoIC0gMjMyICovCiAxNCwgIC8qIOkgLSAyMzMgKi8KIDE4LCAgLyog6iAtIDIzNCAqLwogMTksICAvKiDrIC0gMjM1ICovCiAxNSwgIC8qIOwgLSAyMzYgKi8KIDE0LCAgLyog7SAtIDIzNyAqLwogMTgsICAvKiDuIC0gMjM4ICovCiAxOSwgIC8qIO8gLSAyMzkgKi8KMTA0LCAgLyog8CAtIDI0MCAqLwogMjUsICAvKiDxIC0gMjQxICovCiAxNSwgIC8qIPIgLSAyNDIgKi8KIDE0LCAgLyog8yAtIDI0MyAqLwogMTgsICAvKiD0IC0gMjQ0ICovCiAyNSwgIC8qIPUgLSAyNDUgKi8KIDE5LCAgLyog9iAtIDI0NiAqLwogIDIsICAvKiD3IC0gMjQ3ICovCiAzMywgIC8qIPggLSAyNDggKi8KIDE1LCAgLyog+SAtIDI0OSAqLwogMTQsICAvKiD6IC0gMjUwICovCiAxOCwgIC8qIPsgLSAyNTEgKi8KIDE5LCAgLyog/CAtIDI1MiAqLwogMTQsICAvKiD9IC0gMjUzICovCiAgMiwgIC8qIP4gLSAyNTQgKi8KIDE5LCAgLyog/yAtIDI1NSAqLwp9IDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc1B1bmN0dWF0aW9uIFtJTlRFUk5BTF0KICovCnN0YXRpYyBpbnQgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHVuc2lnbmVkIGNoYXIgYykKewogIC8qICJwdW5jdHVhdGlvbiBjaGFyYWN0ZXIiIGluIHRoaXMgY29udGV4dCBpcyBhIGNoYXJhY3RlciB3aGljaCBpcwogICAgIGNvbnNpZGVyZWQgImxlc3MgaW1wb3J0YW50IiBkdXJpbmcgd29yZCBzb3J0IGNvbXBhcmlzb24uCiAgICAgU2VlIExDTWFwU3RyaW5nIGltcGxlbWVudGF0aW9uIGZvciB0aGUgcHJlY2lzZSBkZWZpbml0aW9uCiAgICAgb2YgImxlc3MgaW1wb3J0YW50Ii4gKi8KCiAgcmV0dXJuIChMQ01fVW5pY29kZV9MVVRbLTIrMipjXT09Nik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc05vblNwYWNpbmcgW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzTm9uU3BhY2luZyh1bnNpZ25lZCBjaGFyIGMpCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycwogICAgIGZvciB3aGljaCBpdCByZXR1cm5zIHRydWUgYXJlIGlnbm9yZWQgd2hlbiBtYXBwaW5nIGEKICAgICBzdHJpbmcgd2l0aCBOT1JNX0lHTk9SRU5PTlNQQUNFICovCiAgcmV0dXJuICgoYz09MTM2KSB8fCAoYz09MTcwKSB8fCAoYz09MTg2KSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc1N5bWJvbCBbSU5URVJOQUxdCiAqIEZJWE1FOiBoYW5kbGUgY3VycmVudCBsb2NhbGUKICovCnN0YXRpYyBpbnQgT0xFMk5MU19pc1N5bWJvbCh1bnNpZ25lZCBjaGFyIGMpCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycwogICAgIGZvciB3aGljaCBpdCByZXR1cm5zIHRydWUgYXJlIGlnbm9yZWQgd2hlbiBtYXBwaW5nIGEKICAgICBzdHJpbmcgd2l0aCBOT1JNX0lHTk9SRVNZTUJPTFMgKi8KICByZXR1cm4gKCAoYyE9MCkgJiYgIShpc2FscGhhKGMpIHx8IGlzZGlnaXQoYykpICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCWlkZW50aXR5CVtJbnRlcm5hbF0KICovCnN0YXRpYyBpbnQgaWRlbnRpdHkoaW50IGMpCnsKICByZXR1cm4gYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuQF0KICoKICogQ29udmVydCBhIHN0cmluZywgb3IgZ2VuZXJhdGUgYSBzb3J0IGtleSBmcm9tIGl0LgogKgogKiBJZiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSwgdGhlIGZ1bmN0aW9uIHdpbGwgZ2VuZXJhdGUKICogYSBzb3J0IGtleSBmb3IgdGhlIHNvdXJjZSBzdHJpbmcuICBFbHNlLCBpdCB3aWxsIGNvbnZlcnQgaXQKICogYWNjb3JkaW5nbHkgdG8gdGhlIGZsYWdzIExDTUFQX1VQUEVSQ0FTRSwgTENNQVBfTE9XRVJDQVNFLC4uLgogKgogKiBSRVRVUk5TCiAqICAgIEVycm9yIDogMC4KICogICAgU3VjY2VzcyA6IGxlbmd0aCBvZiB0aGUgcmVzdWx0IHN0cmluZy4KICoKICogTk9URVMKICogICAgSWYgY2FsbGVkIHdpdGggc2NybGVuID0gLTEsIHRoZSBmdW5jdGlvbiB3aWxsIGNvbXB1dGUgdGhlIGxlbmd0aAogKiAgICAgIG9mIHRoZSAwLXRlcm1pbmF0ZWQgc3RyaW5nIHN0cnNyYyBieSBpdHNlbGYuCiAqCiAqICAgIElmIGNhbGxlZCB3aXRoIGRzdGxlbiA9IDAsIHJldHVybnMgdGhlIGJ1ZmZlciBsZW5ndGggdGhhdAogKiAgICAgIHdvdWxkIGJlIHJlcXVpcmVkLgogKgogKiAgICBOT1JNX0lHTk9SRVdJRFRIIG1lYW5zIHRvIGNvbXBhcmUgQVNDSUkgYW5kIHdpZGUgY2hhcmFjdGVycwogKiAgICBhcyBpZiB0aGV5IGFyZSBlcXVhbC4KICogICAgSW4gdGhlIG9ubHkgY29kZSBwYWdlIGltcGxlbWVudGVkIHNvIGZhciwgdGhlcmUgbWF5IG5vdCBiZQogKiAgICB3aWRlIGNoYXJhY3RlcnMgaW4gc3RyaW5ncyBwYXNzZWQgdG8gTENNYXBTdHJpbmdBLAogKiAgICBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIGRvbmUgZm9yIHRoaXMgZmxhZy4KICovCklOVCBXSU5BUEkgTENNYXBTdHJpbmdBKAoJTENJRCBsY2lkLCAgICAgIC8qIFtpbl0gbG9jYWxlIGlkZW50aWZpZXIgY3JlYXRlZCB3aXRoIE1BS0VMQ0lEOwoJCSAgICAgICAgICAgICAgICBMT0NBTEVfU1lTVEVNX0RFRkFVTFQgYW5kIExPQ0FMRV9VU0VSX0RFRkFVTFQgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVmaW5lZCB2YWx1ZXMuICovCglEV09SRCBtYXBmbGFncywgLyogW2luXSBmbGFncyAqLwoJTFBDU1RSIHNyY3N0ciwgIC8qIFtpbl0gc291cmNlIGJ1ZmZlciAqLwoJSU5UIHNyY2xlbiwgICAgIC8qIFtpbl0gc291cmNlIGxlbmd0aCAqLwoJTFBTVFIgZHN0c3RyLCAgIC8qIFtvdXRdIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLwoJSU5UIGRzdGxlbikgICAgIC8qIFtpbl0gZGVzdGluYXRpb24gYnVmZmVyIGxlbmd0aCAqLwp7CiAgaW50IGk7CgogIFRSQUNFKCIoMHglMDRseCwweCUwOGx4LCVzLCVkLCVwLCVkKVxuIiwKCWxjaWQsbWFwZmxhZ3MsZGVidWdzdHJfYW4oc3Jjc3RyLHNyY2xlbiksc3JjbGVuLGRzdHN0cixkc3RsZW4pOwoKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIEVSUigiKHNyYz0lcyxkZXN0PSVzKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwKCWRlYnVnc3RyX2FuKHNyY3N0cixzcmNsZW4pLCBkc3RzdHIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KICBpZiAoc3JjbGVuID09IC0xKQogICAgc3JjbGVuID0gc3RybGVuKHNyY3N0cikgKyAxIDsgICAgLyogKGluY2x1ZGUgZmluYWwgJ1wwJykgKi8KCiNkZWZpbmUgTENNQVBTVFJJTkdBX1NVUFBPUlRFRF9GTEFHUyAoTENNQVBfVVBQRVJDQVNFICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExDTUFQX0xPV0VSQ0FTRSAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ01BUF9TT1JUS0VZICAgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVDQVNFICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFTk9OU1BBQ0UgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT1JUX1NUUklOR1NPUlQgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVXSURUSCAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFS0FOQVRZUEUpCiAgLyogRklYTUU6IGFzIGxvbmcgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBLYXRha2FuYSBub3IgSGlyYWdhbmEKICAgKiBjaGFyYWN0ZXJzLCB3ZSBjYW4gc3VwcG9ydCBOT1JNX0lHTk9SRUtBTkFUWVBFCiAgICovCiAgaWYgKG1hcGZsYWdzICYgfkxDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MpCiAgewogICAgRklYTUUoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLAoJICBtYXBmbGFncywKCSAgc3Jjc3RyLAoJICBzcmNsZW4sCgkgIGRzdHN0ciwKCSAgZHN0bGVuLAoJICBtYXBmbGFncyAmIH5MQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTCiAgICAgKTsKICB9CgogIGlmICggIShtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICkKICB7CiAgICBpbnQgaSxqOwogICAgaW50ICgqZikoaW50KSA9IGlkZW50aXR5OwogICAgaW50IGZsYWdfaWdub3Jlbm9uc3BhY2UgPSBtYXBmbGFncyAmIE5PUk1fSUdOT1JFTk9OU1BBQ0U7CiAgICBpbnQgZmxhZ19pZ25vcmVzeW1ib2xzID0gbWFwZmxhZ3MgJiBOT1JNX0lHTk9SRVNZTUJPTFM7CgogICAgaWYgKGZsYWdfaWdub3Jlbm9uc3BhY2UgfHwgZmxhZ19pZ25vcmVzeW1ib2xzKQogICAgewogICAgICAvKiBGb3Igc29tZSB2YWx1ZXMgb2YgbWFwZmxhZ3MsIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZwoJIHN0cmluZyBpcyBub3Qga25vd24gYXQgdGhpcyBwb2ludC4gIFdpbmRvd3MgZG9lcyBtYXAgdGhlIHN0cmluZwoJIGFuZCBkb2VzIG5vdCBTZXRMYXN0RXJyb3IgRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiBpbgoJIHRoZXNlIGNhc2VzLiAqLwogICAgICBpZiAoZHN0bGVuPT0wKQogICAgICB7CgkvKiBDb21wdXRlIHJlcXVpcmVkIGxlbmd0aCAqLwoJZm9yIChpPWo9MDsgaSA8IHNyY2xlbjsgaSsrKQoJewoJICBpZiAoICEoZmxhZ19pZ25vcmVub25zcGFjZSAmJiBPTEUyTkxTX2lzTm9uU3BhY2luZyhzcmNzdHJbaV0pKQoJICAgICAgICYmICEoZmxhZ19pZ25vcmVzeW1ib2xzICYmIE9MRTJOTFNfaXNTeW1ib2woc3Jjc3RyW2ldKSkgKQoJICAgIGorKzsKCX0KCXJldHVybiBqOwogICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGlmIChkc3RsZW49PTApCglyZXR1cm4gc3JjbGVuOwogICAgICBpZiAoZHN0bGVuPHNyY2xlbikKCSAgIHsKCSAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICAgICByZXR1cm4gMDsKCSAgIH0KICAgIH0KICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKICAgICAgZiA9IHRvdXBwZXI7CiAgICBlbHNlIGlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkKICAgICAgZiA9IHRvbG93ZXI7CiAgICAvKiBGSVhNRTogTk9STV9JR05PUkVOT05TUEFDRSByZXF1aXJlcyBhbm90aGVyIGNvbnZlcnNpb24gKi8KICAgIGZvciAoaT1qPTA7IChpPHNyY2xlbikgJiYgKGo8ZHN0bGVuKSA7IGkrKykKICAgIHsKICAgICAgaWYgKCAhKGZsYWdfaWdub3Jlbm9uc3BhY2UgJiYgT0xFMk5MU19pc05vblNwYWNpbmcoc3Jjc3RyW2ldKSkKCSAgICYmICEoZmxhZ19pZ25vcmVzeW1ib2xzICYmIE9MRTJOTFNfaXNTeW1ib2woc3Jjc3RyW2ldKSkgKQogICAgICB7Cglkc3RzdHJbal0gPSAoQ0hBUikgZihzcmNzdHJbaV0pOwoJaisrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gajsKICB9CgogIC8qIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIGNvbXBsZXRlbHkgaWdub3JlcyB0aGUgImxjaWQiIHBhcmFtZXRlci4gKi8KICAvKiBlbHNlIC4uLiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSAgKi8KICB7CiAgICBpbnQgdW5pY29kZV9sZW49MDsKICAgIGludCBjYXNlX2xlbj0wOwogICAgaW50IGRpYWNyaXRpY19sZW49MDsKICAgIGludCBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbj0wOwogICAgY2hhciAqY2FzZV9jb21wb25lbnQ7CiAgICBjaGFyICpkaWFjcml0aWNfY29tcG9uZW50OwogICAgY2hhciAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQ7CiAgICBpbnQgcm9vbSxjb3VudDsKICAgIGludCBmbGFnX3N0cmluZ3NvcnQgPSBtYXBmbGFncyAmIFNPUlRfU1RSSU5HU09SVDsKCiAgICAvKiBjb21wdXRlIGhvdyBtdWNoIHJvb20gd2Ugd2lsbCBuZWVkICovCiAgICBmb3IgKGk9MDtpPHNyY2xlbjtpKyspCiAgICB7CiAgICAgIGludCBvZnM7CiAgICAgIHVuc2lnbmVkIGNoYXIgc291cmNlX2NoYXIgPSBzcmNzdHJbaV07CiAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykKICAgICAgewoJaWYgKGZsYWdfc3RyaW5nc29ydCB8fCAhT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkKCXsKCSAgdW5pY29kZV9sZW4rKzsKCSAgaWYgKCBMQ01fVW5pY29kZV9MVVRbLTIrMipzb3VyY2VfY2hhcl0gJiB+MTUgKQoJICAgIHVuaWNvZGVfbGVuKys7ICAgICAgICAgICAgIC8qIGRvdWJsZSBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4rKzsKCX0KICAgICAgfQoKICAgICAgaWYgKGlzdXBwZXIoc291cmNlX2NoYXIpKQoJY2FzZV9sZW49dW5pY29kZV9sZW47CgogICAgICBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CiAgICAgIGlmICgob2ZzPj0wKSAmJiAoTENNX0RpYWNyaXRpY19MVVRbb2ZzXSE9MikpCglkaWFjcml0aWNfbGVuPXVuaWNvZGVfbGVuOwogICAgfQoKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFQ0FTRSkKICAgICAgY2FzZV9sZW49MDsKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCiAgICAgIGRpYWNyaXRpY19sZW49MDsKCiAgICByb29tID0gIDIgKiB1bmljb2RlX2xlbiAgICAgICAgICAgICAgLyogInVuaWNvZGUiIGNvbXBvbmVudCAqLwogICAgICArICAgICBkaWFjcml0aWNfbGVuICAgICAgICAgICAgICAgIC8qICJkaWFjcml0aWMiIGNvbXBvbmVudCAqLwogICAgICArICAgICBjYXNlX2xlbiAgICAgICAgICAgICAgICAgICAgIC8qICJjYXNlIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgNCAqIGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuICAvKiBwdW5jdHVhdGlvbiBpbiB3b3JkIHNvcnQgbW9kZSAqLwogICAgICArICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdXIgJ1wxJyBzZXBhcmF0b3JzICovCiAgICAgICsgICAgIDEgIDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYWwgJ1wwJyAqLwogICAgaWYgKGRzdGxlbj09MCkKICAgICAgcmV0dXJuIHJvb207CiAgICBlbHNlIGlmIChkc3RsZW48cm9vbSkKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICByZXR1cm4gMDsKICAgIH0KI2lmIDAKICAgIC8qRklYTUUgdGhlIFBvaW50ZXJjaGVjayBzaG91bGQgbm90IGJlIG5lc3Nlc2FyeSAqLwogICAgaWYgKElzQmFkV3JpdGVQdHIgKGRzdHN0cixyb29tKSkKICAgIHsgRVJSKCJiYWQgZGVzdGluYXRpb24gYnVmZmVyIChkc3RzdHIpIDogJXAsJWRcbiIsZHN0c3RyLGRzdGxlbik7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbmRpZgogICAgLyogbG9jYXRlIGVhY2ggY29tcG9uZW50LCB3cml0ZSBzZXBhcmF0b3JzICovCiAgICBkaWFjcml0aWNfY29tcG9uZW50ID0gZHN0c3RyICsgMip1bmljb2RlX2xlbiA7CiAgICAqZGlhY3JpdGljX2NvbXBvbmVudCsrID0gJ1wxJzsKICAgIGNhc2VfY29tcG9uZW50ID0gZGlhY3JpdGljX2NvbXBvbmVudCArIGRpYWNyaXRpY19sZW4gOwogICAgKmNhc2VfY29tcG9uZW50KysgPSAnXDEnOwogICAgZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQgPSBjYXNlX2NvbXBvbmVudCArIGNhc2VfbGVuIDsKICAgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gJ1wxJzsKICAgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gJ1wxJzsKCiAgICAvKiByZWFkIHNvdXJjZSBzdHJpbmcgY2hhciBieSBjaGFyLCB3cml0ZQogICAgICAgY29ycmVzcG9uZGluZyB3ZWlnaHQgaW4gZWFjaCBjb21wb25lbnQuICovCiAgICBmb3IgKGk9MCxjb3VudD0wO2k8c3JjbGVuO2krKykKICAgIHsKICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhcj1zcmNzdHJbaV07CiAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykKICAgICAgewoJaW50IHR5cGUsbG9uZ2NvZGU7Cgl0eXBlID0gTENNX1VuaWNvZGVfTFVUWy0yKzIqc291cmNlX2NoYXJdOwoJbG9uZ2NvZGUgPSB0eXBlID4+IDQ7Cgl0eXBlICY9IDE1OwoJaWYgKCFmbGFnX3N0cmluZ3NvcnQgJiYgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkKCXsKCSAgV09SRCBlbmNyeXB0ZWRfbG9jYXRpb24gPSAoMTw8MTUpICsgNyArIDQqY291bnQ7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gKHVuc2lnbmVkIGNoYXIpIChlbmNyeXB0ZWRfbG9jYXRpb24+PjgpOwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uJjI1NSk7CiAgICAgICAgICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gaXMgdXNlZCBoZXJlIGJlY2F1c2UgaXQgbGV0cyBzdHJpbmcgY29tcGFyaXNvbiBiZQoJCQljb21wYXRpYmxlIHdpdGggbnVtZXJpY2FsIGNvbXBhcmlzb24gKi8KCgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gdHlwZTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07CiAgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtcHRpb24gOiBhIHB1bmN0dWF0aW9uIGNoYXJhY3RlciBpcyBuZXZlciBhCgkJCWRvdWJsZSBvciBhY2NlbnRlZCBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgZHN0c3RyWzIqY291bnQrMV0gPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07CgkgIGlmIChsb25nY29kZSkKCSAgewoJICAgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CgkgICAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgICAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IDI7IC8qIGFzc3VtcHRpb246IGEgZG91YmxlIGxldHRlcgoJCQkJCQkgaXMgbmV2ZXIgYWNjZW50ZWQgKi8KCSAgICBjb3VudCsrOwoKCSAgICBkc3RzdHJbMipjb3VudF0gPSB0eXBlOwoJICAgIGRzdHN0clsyKmNvdW50KzFdID0gKihMQ01fVW5pY29kZV9MVVRfMiAtIDEgKyBsb25nY29kZSk7CgkgICAgLyogMTYgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAxCgkgICAgICAgMzIgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAyCgkgICAgICAgNDggaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAzICovCgkgIH0KCgkgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICBjYXNlX2NvbXBvbmVudFtjb3VudF0gPSAoIGlzdXBwZXIoc291cmNlX2NoYXIpID8gMTggOiAyICkgOwoJICBpZiAoY291bnQ8ZGlhY3JpdGljX2xlbikKCSAgewoJICAgIGludCBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CgkgICAgZGlhY3JpdGljX2NvbXBvbmVudFtjb3VudF0gPSAob2ZzPj0wID8gTENNX0RpYWNyaXRpY19MVVRbb2ZzXSA6IDIpOwoJICB9CgkgIGNvdW50Kys7Cgl9CiAgICAgIH0KICAgIH0KICAgIGRzdHN0cltyb29tLTFdID0gJ1wwJzsKICAgIHJldHVybiByb29tOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nVyAgICAgICAgICAgICAgICBbS0VSTkVMMzIuQF0KICoKICogQ29udmVydCBhIHN0cmluZywgb3IgZ2VuZXJhdGUgYSBzb3J0IGtleSBmcm9tIGl0LgogKgogKiBOT1RFCiAqCiAqIFNlZSBMQ01hcFN0cmluZ0EgZm9yIGRvY3VtZW50YXRpb24KICovCklOVCBXSU5BUEkgTENNYXBTdHJpbmdXKAoJTENJRCBsY2lkLERXT1JEIG1hcGZsYWdzLExQQ1dTVFIgc3Jjc3RyLElOVCBzcmNsZW4sTFBXU1RSIGRzdHN0ciwKCUlOVCBkc3RsZW4pCnsKICBpbnQgaTsKCiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpXG4iLAogICAgICAgICAgICAgICAgIGxjaWQsIG1hcGZsYWdzLCBzcmNzdHIsIHNyY2xlbiwgZHN0c3RyLCBkc3RsZW4pOwoKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIEVSUigiKHNyYz0lcCxkc3Q9JXApOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzcmNzdHIsIGRzdHN0cik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChzcmNsZW49PS0xKQogICAgc3JjbGVuID0gc3RybGVuVyhzcmNzdHIpKzE7CgogIC8qIEZJWE1FOiBCb3RoIHRoaXMgZnVuY3Rpb24gYW5kIGl0J3MgY29tcGFuaW9uIExDTWFwU3RyaW5nQSgpCiAgICogY29tcGxldGVseSBpZ25vcmUgdGhlICJsY2lkIiBwYXJhbWV0ZXIuICBJbiBwbGFjZSBvZiB0aGUgImxjaWQiCiAgICogcGFyYW1ldGVyIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHNldCB0aGUgIkxDX0NPTExBVEUiIG9yICJMQ19BTEwiCiAgICogZW52aXJvbm1lbnQgdmFyaWFibGUgcHJpb3IgdG8gaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4gICovCiAgaWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkKICB7CiAgICAgIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiBMQ19DT0xMQVRFLiAqLwogICAgICBjaGFyICpsY19jb2xsYXRlX2RlZmF1bHQgPSAwOyAvKiB2YWx1ZSBwcmlvciB0byB0aGlzIGZ1bmN0aW9uICovCiAgICAgIGNoYXIgKmxjX2NvbGxhdGVfZW52ID0gMDsgICAgIC8qIHZhbHVlIHJldHJpZXZlZCBmcm9tIHRoZSBlbnZpcm9ubWVudCAqLwoKICAgICAgLyogR2VuZXJhbCBwdXJwb3NlIGluZGV4IGludG8gc3RyaW5ncyBvZiBhbnkgdHlwZS4gKi8KICAgICAgaW50IHN0cl9pZHggPSAwOwoKICAgICAgLyogTGVuZ3RocyBvZiB2YXJpb3VzIHN0cmluZ3Mgd2hlcmUgdGhlIGxlbmd0aCBpcyBtZWFzdXJlZCBpbgogICAgICAgKiB3aWRlIGNoYXJhY3RlcnMgZm9yIHdpZGUgY2hhcmFjdGVyIHN0cmluZ3MgYW5kIGluIGJ5dGVzIGZvcgogICAgICAgKiBuYXRpdmUgc3RyaW5ncy4gIFRoZSBsZW5ndGhzIGluY2x1ZGUgdGhlIE5VTEwgdGVybWluYXRvci4gICovCiAgICAgIHNpemVfdCByZXR1cm5lZF9sZW4gICAgPSAwOwogICAgICBzaXplX3Qgc3JjX25hdGl2ZV9sZW4gID0gMDsKICAgICAgc2l6ZV90IGRzdF9uYXRpdmVfbGVuICA9IDA7CiAgICAgIHNpemVfdCBkc3RzdHJfbGliY19sZW4gPSAwOwoKICAgICAgLyogTmF0aXZlIChjaGFyYWN0ZXIgc2V0IGRldGVybWluZWQgYnkgbG9jYWxlKSB2ZXJzaW9ucyBvZiB0aGUKICAgICAgICogc3RyaW5ncyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHN0cmluZ3MuICAqLwogICAgICBMUFNUUiBzcmNfbmF0aXZlID0gMDsKICAgICAgTFBTVFIgZHN0X25hdGl2ZSA9IDA7CgogICAgICAvKiBWZXJzaW9uIG9mIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHN0cmluZ3MgdXNpbmcgdGhlCiAgICAgICAqICJ3Y2hhcl90IiBVbmljb2RlIGRhdGEgdHlwZSBuZWVkZWQgYnkgdmFyaW91cyBsaWJjIGZ1bmN0aW9ucy4gICovCiAgICAgIHdjaGFyX3QgKnNyY3N0cl9saWJjID0gMDsKICAgICAgd2NoYXJfdCAqZHN0c3RyX2xpYmMgPSAwOwoKICAgICAgaWYoIShzcmNzdHJfbGliYyA9ICh3Y2hhcl90ICopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2xlbiAqIHNpemVvZih3Y2hhcl90KSkpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3Igc3Jjc3RyX2xpYmNcbiIsCiAgICAgICAgICAgICAgc3JjbGVuICogc2l6ZW9mKHdjaGFyX3QpKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgLyogQ29udmVydCBzb3VyY2Ugc3RyaW5nIHRvIGEgbGliYyBVbmljb2RlIHN0cmluZy4gKi8KICAgICAgZm9yKHN0cl9pZHggPSAwOyBzdHJfaWR4IDwgc3JjbGVuOyBzdHJfaWR4KyspCiAgICAgIHsKICAgICAgICAgIHNyY3N0cl9saWJjW3N0cl9pZHhdID0gc3Jjc3RyW3N0cl9pZHhdOwogICAgICB9CgogICAgICAvKiBzcmNfbmF0aXZlIHNob3VsZCBjb250YWluIGF0IG1vc3QgMyBieXRlcyBmb3IgZWFjaAogICAgICAgKiBtdWx0aWJ5dGUgY2hhcmFjdGVycyBpbiB0aGUgb3JpZ2luYWwgc3Jjc3RyIHN0cmluZy4gICovCiAgICAgIHNyY19uYXRpdmVfbGVuID0gMyAqIHNyY2xlbjsKICAgICAgaWYoIShzcmNfbmF0aXZlID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfbmF0aXZlX2xlbikpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3Igc3JjX25hdGl2ZVxuIiwgc3JjX25hdGl2ZV9sZW4pOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgLyogRklYTUU6IFByaW9yIHRvIHRvIHNldHRpbmcgdGhlIExDX0NPTExBVEUgbG9jYWxlIGNhdGVnb3J5IHRoZQogICAgICAgKiBjdXJyZW50IHZhbHVlIGlzIGJhY2tlZCB1cCBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgYWZ0ZXIgdGhlCiAgICAgICAqIGxhc3QgTENfQ09MTEFURSBzZW5zaXRpdmUgZnVuY3Rpb24gcmV0dXJucy4KICAgICAgICoKICAgICAgICogRXZlbiB0aG91Z2ggdGhlIGxvY2FsZSBpcyBhZGp1c3RlZCBmb3IgYSBtaW5pbXVtIGFtb3VudCBvZgogICAgICAgKiB0aW1lIGEgcmFjZSBjb25kaXRpb24gZXhpc3RzIHdoZXJlIG90aGVyIHRocmVhZHMgbWF5IGJlCiAgICAgICAqIGFmZmVjdGVkIGlmIHRoZXkgaW52b2tlIExDX0NPTExBVEUgc2Vuc2l0aXZlIGZ1bmN0aW9ucy4gIE9uZQogICAgICAgKiBwb3NzaWJsZSBzb2x1dGlvbiBpcyB0byB3cmFwIGFsbCBMQ19DT0xMQVRFIHNlbnNpdGl2ZSBXaW5lCiAgICAgICAqIGZ1bmN0aW9ucywgbGlrZSBMQ01hcFN0cmluZ1coKSwgaW4gYSBtdXRleC4KICAgICAgICoKICAgICAgICogQW5vdGhlciBlbmhhbmNlbWVudCB0byB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHRvIHNldCB0aGUKICAgICAgICogTENfQ09MTEFURSBsb2NhbGUgY2F0ZWdvcnkgYXMgYSBmdW5jdGlvbiBvZiB0aGUgImxjaWQiCiAgICAgICAqIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSAiTENfQ09MTEFURSIgZW52aXJvbm1lbnQgdmFyaWFibGUuICovCiAgICAgIGlmKCEobGNfY29sbGF0ZV9kZWZhdWx0ID0gc2V0bG9jYWxlKExDX0NPTExBVEUsIE5VTEwpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gcXVlcnkgdGhlIExDX0NPTExBVEUgY2F0YWdvcnlcbiIpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICBpZighKGxjX2NvbGxhdGVfZW52ID0gc2V0bG9jYWxlKExDX0NPTExBVEUsICIiKSkpCiAgICAgIHsKICAgICAgICAgIEVSUigiVW5hYmxlIHRvIGluaGVyaXQgdGhlIExDX0NPTExBVEUgbG9jYWxlIGNhdGVnb3J5IGZyb20gdGhlICIKICAgICAgICAgICAgICAiZW52aXJvbm1lbnQuICBUaGUgXCJMQ19DT0xMQVRFXCIgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgIgogICAgICAgICAgICAgICJcIiVzXCIuXG4iLCBnZXRlbnYoIkxDX0NPTExBVEUiKSA/CiAgICAgICAgICAgICAgZ2V0ZW52KCJMQ19DT0xMQVRFIikgOiAiPHVuc2V0PiIpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICBUUkFDRSgibGNfY29sbGF0ZV9kZWZhdWx0ID0gJXNcbiIsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgIFRSQUNFKCJsY19jb2xsYXRlX2VudiA9ICVzXG4iLCBsY19jb2xsYXRlX2Vudik7CgogICAgICAvKiBDb252ZXJ0IHRoZSBsaWJjIFVuaWNvZGUgc3RyaW5nIHRvIGEgbmF0aXZlIG11bHRpYnl0ZSBjaGFyYWN0ZXIKICAgICAgICogc3RyaW5nLiAqLwogICAgICByZXR1cm5lZF9sZW4gPSB3Y3N0b21icyhzcmNfbmF0aXZlLCBzcmNzdHJfbGliYywgc3JjX25hdGl2ZV9sZW4pICsgMTsKICAgICAgaWYocmV0dXJuZWRfbGVuID09IDApCiAgICAgIHsKICAgICAgICAgIEVSUigid2NzdG9tYnMgZmFpbGVkLiAgVGhlIHN0cmluZyBzcGVjaWZpZWQgKCVzKSBtYXkgY29udGFpbiBhbiBpbnZhbGlkIGNoYXJhY3Rlci5cbiIsCiAgICAgICAgICAgICAgZGVidWdzdHJfdyhzcmNzdHIpKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIGVsc2UgaWYocmV0dXJuZWRfbGVuID4gc3JjX25hdGl2ZV9sZW4pCiAgICAgIHsKICAgICAgICAgIHNyY19uYXRpdmVbc3JjX25hdGl2ZV9sZW4gLSAxXSA9IDA7CiAgICAgICAgICBFUlIoIndjc3RvbWJzIHJldHVybmVkIGEgc3RyaW5nICglcykgdGhhdCB3YXMgbG9uZ2VyICglZCBieXRlcykgIgogICAgICAgICAgICAgICJ0aGFuIGV4cGVjdGVkICglZCBieXRlcykuXG4iLCBzcmNfbmF0aXZlLCByZXR1cm5lZF9sZW4sCiAgICAgICAgICAgICAgZHN0X25hdGl2ZV9sZW4pOwoKICAgICAgICAgIC8qIFNpbmNlIHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgSSdtIG5vdCBzdXJlIHdoYXQgdGhlIGNvcnJlY3QKICAgICAgICAgICAqIGVycm9yIGNvZGUgaXMuICAqLwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKCiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHNyY19uYXRpdmVfbGVuID0gcmV0dXJuZWRfbGVuOwoKICAgICAgVFJBQ0UoInNyY19uYXRpdmUgPSAlcyAgc3JjX25hdGl2ZV9sZW4gPSAlZFxuIiwKICAgICAgICAgICAgIHNyY19uYXRpdmUsIHNyY19uYXRpdmVfbGVuKTsKCiAgICAgIC8qIGRzdF9uYXRpdmUgc2VlbXMgdG8gY29udGFpbiBhdCBtb3N0IDQgYnl0ZXMgZm9yIGVhY2ggYnl0ZSBpbgogICAgICAgKiB0aGUgb3JpZ2luYWwgc3JjX25hdGl2ZSBzdHJpbmcuICBDaGFuZ2UgaWYgbmVlZCBiZSBzaW5jZSB0aGlzCiAgICAgICAqIGlzbid0IGRvY3VtZW50ZWQgYnkgdGhlIHN0cnhmcm0oKSBtYW4gcGFnZS4gKi8KICAgICAgZHN0X25hdGl2ZV9sZW4gPSA0ICogc3JjX25hdGl2ZV9sZW47CiAgICAgIGlmKCEoZHN0X25hdGl2ZSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZV9sZW4pKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGRzdF9uYXRpdmVcbiIsIGRzdF9uYXRpdmVfbGVuKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBUaGUgYWN0dWFsIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlIGZvbGxvd2luZyBjYWxsIHRvCiAgICAgICAqIHN0cnhmcm0oKS4gIFRoZSBzdXJyb3VuZGluZyBjb2RlIGNvdWxkIGhhdmUgYmVlbiBzaW1wbGlmaWVkCiAgICAgICAqIGJ5IGNhbGxpbmcgd2NzeGZybSgpIGluc3RlYWQgZXhjZXB0IHRoYXQgd2NzeGZybSgpIGlzIG5vdAogICAgICAgKiBhdmFpbGFibGUgb24gb2xkZXIgTGludXggc3lzdGVtcyAoUmVkSGF0IDQuMSB3aXRoCiAgICAgICAqIGxpYmMtNS4zLjEyLTE3KS4KICAgICAgICoKICAgICAgICogQWxzbywgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgdHJhbnNsYXRpb24gY291bGQgYmUgZG9uZSBieQogICAgICAgKiB2YXJpb3VzIHRhYmxlcyBhcyBpdCBpcyBkb25lIGluIExDTWFwU3RyaW5nQSgpLiAgSG93ZXZlciwgSSdtCiAgICAgICAqIG5vdCBzdXJlIHdoYXQgdGhvc2UgdGFibGVzIGFyZS4gKi8KICAgICAgcmV0dXJuZWRfbGVuID0gc3RyeGZybShkc3RfbmF0aXZlLCBzcmNfbmF0aXZlLCBkc3RfbmF0aXZlX2xlbikgKyAxOwoKICAgICAgaWYocmV0dXJuZWRfbGVuID4gZHN0X25hdGl2ZV9sZW4pCiAgICAgIHsKICAgICAgICAgIGRzdF9uYXRpdmVbZHN0X25hdGl2ZV9sZW4gLSAxXSA9IDA7CiAgICAgICAgICBFUlIoInN0cnhmcm0gcmV0dXJuZWQgYSBzdHJpbmcgKCVzKSB0aGF0IHdhcyBsb25nZXIgKCVkIGJ5dGVzKSAiCiAgICAgICAgICAgICAgInRoYW4gZXhwZWN0ZWQgKCVkIGJ5dGVzKS5cbiIsIGRzdF9uYXRpdmUsIHJldHVybmVkX2xlbiwKICAgICAgICAgICAgICBkc3RfbmF0aXZlX2xlbik7CgogICAgICAgICAgLyogU2luY2UgdGhpcyBpcyBhbiBpbnRlcm5hbCBlcnJvciBJJ20gbm90IHN1cmUgd2hhdCB0aGUgY29ycmVjdAogICAgICAgICAgICogZXJyb3IgY29kZSBpcy4gICovCiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwoKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIGlmKGRzdF9uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdF9uYXRpdmUpOwogICAgICAgICAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBkc3RfbmF0aXZlX2xlbiA9IHJldHVybmVkX2xlbjsKCiAgICAgIFRSQUNFKCJkc3RfbmF0aXZlID0gJXMgIGRzdF9uYXRpdmVfbGVuID0gJWRcbiIsCiAgICAgICAgICAgICBkc3RfbmF0aXZlLCBkc3RfbmF0aXZlX2xlbik7CgogICAgICBkc3RzdHJfbGliY19sZW4gPSBkc3RfbmF0aXZlX2xlbjsKICAgICAgaWYoIShkc3RzdHJfbGliYyA9ICh3Y2hhcl90ICopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHN0cl9saWJjX2xlbiAqIHNpemVvZih3Y2hhcl90KSkpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgZHN0c3RyX2xpYmNcbiIsCiAgICAgICAgICAgICAgZHN0c3RyX2xpYmNfbGVuICogc2l6ZW9mKHdjaGFyX3QpKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIC8qIENvbnZlcnQgdGhlIG5hdGl2ZSBtdWx0aWJ5dGUgc3RyaW5nIHRvIGEgbGliYyBVbmljb2RlIHN0cmluZy4gKi8KICAgICAgcmV0dXJuZWRfbGVuID0gbWJzdG93Y3MoZHN0c3RyX2xpYmMsIGRzdF9uYXRpdmUsIGRzdF9uYXRpdmVfbGVuKSArIDE7CgogICAgICAvKiBSZXN0b3JlIExDX0NPTExBVEUgbm93IHRoYXQgdGhlIGxhc3QgTENfQ09MTEFURSBzZW5zaXRpdmUKICAgICAgICogZnVuY3Rpb24gaGFzIHJldHVybmVkLiAqLwogICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKCiAgICAgIGlmKHJldHVybmVkX2xlbiA9PSAwKQogICAgICB7CiAgICAgICAgICBFUlIoIm1ic3Rvd2NzIGZhaWxlZC4gIFRoZSBuYXRpdmUgdmVyc2lvbiBvZiB0aGUgdHJhbnNsYXRlZCBzdHJpbmcgIgogICAgICAgICAgICAgICIoJXMpIG1heSBjb250YWluIGFuIGludmFsaWQgY2hhcmFjdGVyLlxuIiwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgaWYoZHN0bGVuKQogICAgICB7CiAgICAgICAgICBpZihyZXR1cm5lZF9sZW4gPiBkc3RsZW4pCiAgICAgICAgICB7CiAgICAgICAgICAgICAgRVJSKCJtYnN0b3djcyByZXR1cm5lZCBhIHN0cmluZyB0aGF0IHdhcyBsb25nZXIgKCVkIGNoYXJzKSAiCiAgICAgICAgICAgICAgICAgICJ0aGFuIHRoZSBidWZmZXIgcHJvdmlkZWQgKCVkIGNoYXJzKS5cbiIsIHJldHVybmVkX2xlbiwKICAgICAgICAgICAgICAgICAgZHN0bGVuKTsKICAgICAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgZHN0bGVuID0gcmV0dXJuZWRfbGVuOwoKICAgICAgICAgIC8qIENvbnZlcnQgYSBsaWJjIFVuaWNvZGUgc3RyaW5nIHRvIHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcuICovCiAgICAgICAgICBmb3Ioc3RyX2lkeCA9IDA7IHN0cl9pZHggPCBkc3RsZW47IHN0cl9pZHgrKykKICAgICAgICAgIHsKICAgICAgICAgICAgICBkc3RzdHJbc3RyX2lkeF0gPSBkc3RzdHJfbGliY1tzdHJfaWR4XTsKICAgICAgICAgIH0KICAgICAgICAgIFRSQUNFKCIxc3QgNCBpbnQgc2l6ZWQgY2h1bmtzIG9mIGRzdHN0ciA9ICV4ICV4ICV4ICV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKigoKGludCAqKWRzdHN0cikgKyAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICooKChpbnQgKilkc3RzdHIpICsgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAqKCgoaW50ICopZHN0c3RyKSArIDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgKigoKGludCAqKWRzdHN0cikgKyAzKSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgICBkc3RsZW4gPSByZXR1cm5lZF9sZW47CiAgICAgIH0KICAgICAgVFJBQ0UoImRzdGxlbiAocmV0dXJuKSA9ICVkXG4iLCBkc3RsZW4pOwogICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgIGlmKGRzdHN0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RzdHJfbGliYyk7CiAgICAgIHJldHVybiBkc3RsZW47CiAgfQogIGVsc2UKICB7CiAgICBpbnQgKCpmKShpbnQpPWlkZW50aXR5OwoKICAgIGlmIChkc3RsZW49PTApCiAgICAgICAgcmV0dXJuIHNyY2xlbjsKICAgIGlmIChkc3RsZW48c3JjbGVuKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9VUFBFUkNBU0UpCiAgICAgIGYgPSB0b3VwcGVyOwogICAgZWxzZSBpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpCiAgICAgIGYgPSB0b2xvd2VyOwogICAgZm9yIChpPTA7IGkgPCBzcmNsZW47IGkrKykKICAgICAgZHN0c3RyW2ldID0gKFdDSEFSKSBmKHNyY3N0cltpXSk7CiAgICByZXR1cm4gc3JjbGVuOwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgKICoKICogRXN0aW1hdGVzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZXF1aXJlZCB0byBob2xkIHRoZSBzdHJpbmcKICogY29tcHV0ZWQgYnkgTENNYXBTdHJpbmdBLgogKgogKiBUaGUgc2l6ZSBpcyBhbHdheXMgb3Zlci1lc3RpbWF0ZWQsIHdpdGggYSBmaXhlZCBsaW1pdCBvbiB0aGUKICogYW1vdW50IG9mIGVzdGltYXRpb24gZXJyb3IuCiAqCiAqIE5vdGUgdGhhdCBsZW4gPT0gLTEgaXMgbm90IHBlcm1pdHRlZC4KICovCnN0YXRpYyBpbmxpbmUgaW50IE9MRTJOTFNfRXN0aW1hdGVNYXBwaW5nTGVuZ3RoKExDSUQgbGNpZCwgRFdPUkQgZHdNYXBGbGFncywKCQkJCQkJTFBDU1RSIHN0ciwgRFdPUkQgbGVuKQp7CiAgICAvKiBFc3RpbWF0ZSBvbmx5IGZvciBzbWFsbCBzdHJpbmdzIHRvIGtlZXAgdGhlIGVzdGltYXRpb24gZXJyb3IgZnJvbQogICAgICogYmVjb21pbmcgdG9vIGxhcmdlLiAqLwogICAgaWYgKGxlbiA8IDEyOCkgcmV0dXJuIGxlbiAqIDggKyA1OwogICAgZWxzZSByZXR1cm4gTENNYXBTdHJpbmdBKGxjaWQsIGR3TWFwRmxhZ3MsIHN0ciwgbGVuLCBOVUxMLCAwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ29tcGFyZVN0cmluZ0EJW0tFUk5FTDMyLkBdCiAqIENvbXBhcmVzIHR3byBzdHJpbmdzIHVzaW5nIGxvY2FsZQogKgogKiBSRVRVUk5TCiAqCiAqIHN1Y2Nlc3M6IENTVFJfTEVTU19USEFOLCBDU1RSX0VRVUFMLCBDU1RSX0dSRUFURVJfVEhBTgogKiBmYWlsdXJlOiAwCiAqCiAqIE5PVEVTCiAqCiAqIERlZmF1bHRzIHRvIGEgd29yZCBzb3J0LCBidXQgdXNlcyBhIHN0cmluZyBzb3J0IGlmCiAqIFNPUlRfU1RSSU5HU09SVCBpcyBzZXQuCiAqIENhbGxzIFNldExhc3RFcnJvciBmb3IgRVJST1JfSU5WQUxJRF9GTEFHUywgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIuCiAqCiAqIEJVR1MKICoKICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKICoKICogRklYTUUKICoKICogUXVpdGUgaW5lZmZpY2llbnQuCiAqLwppbnQgV0lOQVBJIENvbXBhcmVTdHJpbmdBKAogICAgTENJRCBsY2lkLCAgICAgIC8qIFtpbl0gbG9jYWxlIElEICovCiAgICBEV09SRCBmZHdTdHlsZSwgLyogW2luXSBjb21wYXJpc29uLXN0eWxlIG9wdGlvbnMgKi8KICAgIExQQ1NUUiBzMSwgICAgICAvKiBbaW5dIGZpcnN0IHN0cmluZyAqLwogICAgaW50IGwxLCAgICAgICAgIC8qIFtpbl0gbGVuZ3RoIG9mIGZpcnN0IHN0cmluZyAqLwogICAgTFBDU1RSIHMyLCAgICAgIC8qIFtpbl0gc2Vjb25kIHN0cmluZyAqLwogICAgaW50IGwyKSAgICAgICAgIC8qIFtpbl0gbGVuZ3RoIG9mIHNlY29uZCBzdHJpbmcgKi8KewogIGludCBtYXBzdHJpbmdfZmxhZ3M7CiAgaW50IGxlbjEsbGVuMjsKICBpbnQgcmVzdWx0OwogIExQU1RSIHNrMSxzazI7CiAgVFJBQ0UoIiVzIGFuZCAlc1xuIiwKCWRlYnVnc3RyX2FuIChzMSxsMSksIGRlYnVnc3RyX2FuIChzMixsMikpOwoKICBpZiAoIChzMT09TlVMTCkgfHwgKHMyPT1OVUxMKSApCiAgewogICAgRVJSKCIoczE9JXMsczI9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLAoJZGVidWdzdHJfYW4oczEsbDEpLCBkZWJ1Z3N0cl9hbihzMixsMikpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCiAgICBGSVhNRSgiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCiAgaWYgKGwxID09IC0xKSBsMSA9IHN0cmxlbihzMSk7CiAgaWYgKGwyID09IC0xKSBsMiA9IHN0cmxlbihzMik7CgogIG1hcHN0cmluZ19mbGFncyA9IExDTUFQX1NPUlRLRVkgfCBmZHdTdHlsZSA7CiAgbGVuMSA9IE9MRTJOTFNfRXN0aW1hdGVNYXBwaW5nTGVuZ3RoKGxjaWQsIG1hcHN0cmluZ19mbGFncywgczEsIGwxKTsKICBsZW4yID0gT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgobGNpZCwgbWFwc3RyaW5nX2ZsYWdzLCBzMiwgbDIpOwoKICBpZiAoKGxlbjE9PTApfHwobGVuMj09MCkpCiAgICByZXR1cm4gMDsgICAgIC8qIHNvbWV0aGluZyB3cm9uZyBoYXBwZW5lZCAqLwoKICBzazEgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbjEgKyBsZW4yKTsKICBzazIgPSBzazEgKyBsZW4xOwogIGlmICggKCFMQ01hcFN0cmluZ0EobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczEsbDEsc2sxLGxlbjEpKQoJIHx8ICghTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMyLGwyLHNrMixsZW4yKSkgKQogIHsKICAgIEVSUigiQnVnIGluIExDbWFwU3RyaW5nQS5cbiIpOwogICAgcmVzdWx0ID0gMDsKICB9CiAgZWxzZQogIHsKICAgIC8qIHN0cmNtcCBkb2Vzbid0IG5lY2Vzc2FyaWx5IHJldHVybiAtMSwgMCwgb3IgMSAqLwogICAgcmVzdWx0ID0gc3RyY21wKHNrMSxzazIpOwogIH0KICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc2sxKTsKCiAgaWYgKHJlc3VsdCA8IDApCiAgICByZXR1cm4gMTsKICBpZiAocmVzdWx0ID09IDApCiAgICByZXR1cm4gMjsKCiAgLyogbXVzdCBiZSBncmVhdGVyLCBpZiB3ZSByZWFjaCB0aGlzIHBvaW50ICovCiAgcmV0dXJuIDM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbXBhcmVTdHJpbmdXCVtLRVJORUwzMi5AXQogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKiBGSVhNRSA6ICBEb2VzIG9ubHkgc3RyaW5nIHNvcnQuICBTaG91bGQKICogYmUgcmVpbXBsZW1lbnRlZCB0aGUgc2FtZSB3YXkgYXMgQ29tcGFyZVN0cmluZ0EuCiAqLwppbnQgV0lOQVBJIENvbXBhcmVTdHJpbmdXKExDSUQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBzMSwgaW50IGwxLCBMUENXU1RSIHMyLCBpbnQgbDIpCnsKCWludCBsZW4scmV0OwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQoJCUZJWE1FKCJJR05PUkVOT05TUEFDRSBub3Qgc3VwcG9ydGVkXG4iKTsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCUZJWE1FKCJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwoKICAgIGlmKHMxPT1OVUxMIHx8IHMyPT1OVUxMKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgkvKiBJcyBzdHJjbXAgZGVmYXVsdGluZyB0byBzdHJpbmcgc29ydCBvciB0byB3b3JkIHNvcnQ/PyAqLwoJLyogRklYTUU6IEhhbmRsZSBOT1JNX1NUUklOR1NPUlQgKi8KCWwxID0gKGwxPT0tMSk/c3RybGVuVyhzMSk6bDE7CglsMiA9IChsMj09LTEpP3N0cmxlblcoczIpOmwyOwoJbGVuID0gbDE8bDIgPyBsMTpsMjsKCXJldCA9IChmZHdTdHlsZSAmIE5PUk1fSUdOT1JFQ0FTRSkgPyBzdHJuY21waVcoczEsczIsbGVuKSA6IHN0cm5jbXBXKHMxLHMyLGxlbik7CgkvKiBub3QgZXF1YWwsIHJldHVybiAxIG9yIDMgKi8KCWlmKHJldCE9MCkgewoJCS8qIG5lZWQgdG8gdHJhbnNsYXRlIHJlc3VsdCAqLwoJCXJldHVybiAoKGludClyZXQgPCAwKSA/IDEgOiAzOwoJfQoJLyogc2FtZSBsZW4sIHJldHVybiAyICovCglpZihsMT09bDIpIHJldHVybiAyOwoJLyogdGhlIGxvbmdlciBvbmUgaXMgbGV4aWNhbGx5IGdyZWF0ZXIgKi8KCXJldHVybiAobDE8bDIpPyAxIDogMzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBsc3RyY21wICAgIChLRVJORUwzMi5AKQogKiAgICAgICAgICAgbHN0cmNtcEEgICAoS0VSTkVMMzIuQCkKICovCklOVCBXSU5BUEkgbHN0cmNtcEEoIExQQ1NUUiBzdHIxLCBMUENTVFIgc3RyMiApCnsKICAgIHJldHVybiBDb21wYXJlU3RyaW5nQShMT0NBTEVfU1lTVEVNX0RFRkFVTFQsMCxzdHIxLC0xLHN0cjIsLTEpIC0gMiA7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIGxzdHJjbXBXICAgKEtFUk5FTDMyLkApCiAqIEZJWE1FIDogc2hvdWxkIGNhbGwgQ29tcGFyZVN0cmluZ1csIHdoZW4gaXQgaXMgaW1wbGVtZW50ZWQuCiAqICAgIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90ICJ3b3JkIHNvcnQiLCBhcyBpdCBzaG91bGQuCiAqLwpJTlQgV0lOQVBJIGxzdHJjbXBXKCBMUENXU1RSIHN0cjEsIExQQ1dTVFIgc3RyMiApCnsKICAgIFRSQUNFKCIlcyBhbmQgJXNcbiIsCgkJICAgZGVidWdzdHJfdyAoc3RyMSksIGRlYnVnc3RyX3cgKHN0cjIpKTsKICAgIGlmICghc3RyMSB8fCAhc3RyMikgewogICAgCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gMDsKICAgIH0KICAgIHdoaWxlICgqc3RyMSAmJiAoKnN0cjEgPT0gKnN0cjIpKSB7IHN0cjErKzsgc3RyMisrOyB9CiAgICByZXR1cm4gKElOVCkoKnN0cjEgLSAqc3RyMik7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIGxzdHJjbXBpICAgIChLRVJORUwzMi5AKQogKiAgICAgICAgICAgbHN0cmNtcGlBICAgKEtFUk5FTDMyLkApCiAqLwpJTlQgV0lOQVBJIGxzdHJjbXBpQSggTFBDU1RSIHN0cjEsIExQQ1NUUiBzdHIyICkKeyAgICBUUkFDRSgic3RyY21waSAlcyBhbmQgJXNcbiIsCgkJICAgZGVidWdzdHJfYSAoc3RyMSksIGRlYnVnc3RyX2EgKHN0cjIpKTsKICAgIHJldHVybiBDb21wYXJlU3RyaW5nQShMT0NBTEVfU1lTVEVNX0RFRkFVTFQsTk9STV9JR05PUkVDQVNFLHN0cjEsLTEsc3RyMiwtMSktMjsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgbHN0cmNtcGlXICAgKEtFUk5FTDMyLkApCiAqLwpJTlQgV0lOQVBJIGxzdHJjbXBpVyggTFBDV1NUUiBzdHIxLCBMUENXU1RSIHN0cjIgKQp7CiAgICBpZiAoIXN0cjEgfHwgIXN0cjIpIHsKICAgIAlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIDA7CiAgICB9CiAgICByZXR1cm4gc3RyY21waVcoIHN0cjEsIHN0cjIgKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU9MRV9HZXRGb3JtYXRXCVtJbnRlcm5hbF0KICoKICogZGF0ZWZvcm1hdCBpcyBzZXQgVFJVRSBpZiBiZWluZyBjYWxsZWQgZm9yIGEgZGF0ZSwgZmFsc2UgZm9yIGEgdGltZQoKIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBzdHVmZiBmb3IgR2V0RGF0ZUZvcm1hdCgpIGFuZAogR2V0VGltZUZvcm1hdCgpLgoKICBkICAgIHNpbmdsZS1kaWdpdCAobm8gbGVhZGluZyB6ZXJvKSBkYXkgKG9mIG1vbnRoKQogIGRkICAgdHdvLWRpZ2l0IGRheSAob2YgbW9udGgpCiAgZGRkICBzaG9ydCBkYXktb2Ytd2VlayBuYW1lCiAgZGRkZCBsb25nIGRheS1vZi13ZWVrIG5hbWUKICBNICAgIHNpbmdsZS1kaWdpdCBtb250aAogIE1NICAgdHdvLWRpZ2l0IG1vbnRoCiAgTU1NICBzaG9ydCBtb250aCBuYW1lCiAgTU1NTSBmdWxsIG1vbnRoIG5hbWUKICB5ICAgIHR3by1kaWdpdCB5ZWFyLCBubyBsZWFkaW5nIDAKICB5eSAgIHR3by1kaWdpdCB5ZWFyCiAgeXl5eSBmb3VyLWRpZ2l0IHllYXIKICBnZyAgIGVyYSBzdHJpbmcKICBoICAgIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyKQogIGhoICAgaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICBIICAgIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgyNC1ob3VyKQogIEhIICAgaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICBtICAgIG1pbnV0ZXMgd2l0aCBubyBsZWFkaW5nIHplcm8KICBtbSAgIG1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICBzICAgIHNlY29uZHMgd2l0aCBubyBsZWFkaW5nIHplcm8KICBzcyAgIHNlY29uZHMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICB0ICAgIHRpbWUgbWFya2VyIChBIG9yIFApCiAgdHQgICB0aW1lIG1hcmtlciAoQU0sIFBNKQogICcnICAgdXNlZCB0byBxdW90ZSBsaXRlcmFsIGNoYXJhY3RlcnMKICAnJyAgICh3aXRoaW4gYSBxdW90ZWQgc3RyaW5nKSBpbmRpY2F0ZXMgYSBsaXRlcmFsICcKCiBJZiBUSU1FX05PTUlOVVRFU09SU0VDT05EUyBvciBUSU1FX05PU0VDT05EUyBpcyBzcGVjaWZpZWQsIHRoZSBmdW5jdGlvbiAKICByZW1vdmVzIHRoZSBzZXBhcmF0b3IocykgcHJlY2VkaW5nIHRoZSBtaW51dGVzIGFuZC9vciBzZWNvbmRzIGVsZW1lbnQocykuCgogSWYgVElNRV9OT1RJTUVNQVJLRVIgaXMgc3BlY2lmaWVkLCB0aGUgZnVuY3Rpb24gcmVtb3ZlcyB0aGUgc2VwYXJhdG9yKHMpIAogIHByZWNlZGluZyBhbmQgZm9sbG93aW5nIHRoZSB0aW1lIG1hcmtlci4KCiBJZiBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUIGlzIHNwZWNpZmllZCwgdGhlIGZ1bmN0aW9uIGRpc3BsYXlzIGFueSBleGlzdGluZyAKICB0aW1lIG1hcmtlciwgdW5sZXNzIHRoZSBUSU1FX05PVElNRU1BUktFUiBmbGFnIGlzIGFsc28gc2V0LgoKIFRoZXNlIGZ1bmN0aW9ucyBSRVFVSVJFIHZhbGlkIGxvY2FsZSwgZGF0ZSwgIGFuZCBmb3JtYXQuCgogSWYgdGhlIHRpbWUgb3IgZGF0ZSBpcyBpbnZhbGlkLCByZXR1cm4gMCBhbmQgc2V0IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSCgogUmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBvciBpZiBvdXRsZW4gaXMgemVybwoJaXQgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlcXVpcmVkIGZvciB0aGUgb3V0cHV0IGluY2x1ZGluZwoJdGhlIHRlcm1pbmF0aW5nIG51bGwuCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXRGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBmbGFncywgRFdPUkQgdGZsYWdzLAoJCQkgICAgY29uc3QgU1lTVEVNVElNRSogeHRpbWUsCgkJCSAgICBMUENXU1RSIGZvcm1hdCwKCQkJICAgIExQV1NUUiBvdXRwdXQsIElOVCBvdXRsZW4sIGludCBkYXRlZm9ybWF0KQp7CiAgIElOVCAgICAgb3V0cG9zOwogICBJTlQJICAgbGFzdEZvcm1hdFBvczsgLyogdGhlIHBvc2l0aW9uIGluIHRoZSBvdXRwdXQgYnVmZmVyIG9mICovCgkJCSAgLyogdGhlIGVuZCBvZiB0aGUgb3V0cHV0IGZyb20gdGhlIGxhc3QgZm9ybWF0dGluZyAqLwoJCQkgIC8qIGNoYXJhY3RlciAqLwogICBCT09MCSAgIGRyb3BVbnRpbE5leHRGb3JtYXR0aW5nQ2hhciA9IEZBTFNFOyAvKiBUSU1FX05PVElNRU1BUktFUiBkcm9wcyAKCQkJCWFsbCBvZiB0aGUgdGV4dCBhcm91bmQgdGhlIGRyb3BwZWQgbWFya2VyLAoJCQkJZWcuICJoQCF0QCFtIiBiZWNvbWVzICJobSIgKi8KCiAgIC8qIG1ha2UgYSBkZWJ1ZyByZXBvcnQgKi8KICAgVFJBQ0UoImFyZ3M6IDB4JWx4LCAweCVseCwgMHglbHgsIHRpbWUoZD0lZCxoPSVkLG09JWQscz0lZCksIGZtdDolcyAoYXQgJXApLCAiCiAgIAkgICAgICAiJXAgd2l0aCBtYXggbGVuICVkXG4iLAoJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgZGVidWdzdHJfdyhmb3JtYXQpLCBmb3JtYXQsIG91dHB1dCwgb3V0bGVuKTsKCiAgIC8qIGluaXRpYWxpemUgc3RhdGUgdmFyaWFibGVzICovCiAgIG91dHBvcyA9IDA7CiAgIGxhc3RGb3JtYXRQb3MgPSAwOwoKICAgd2hpbGUgKCpmb3JtYXQpIHsKICAgICAgLyogTGl0ZXJhbCBzdHJpbmc6IE1heWJlIHRlcm1pbmF0ZWQgZWFybHkgYnkgYSBcMCAqLwogICAgICBpZiAoKmZvcm1hdCA9PSAoV0NIQVIpICdcJycpCiAgICAgIHsKICAgICAgICAgZm9ybWF0Kys7CgoJIC8qIFdlIGxvb3Agd2hpbGUgd2UgaGF2ZW4ndCByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZvcm1hdCBzdHJpbmcgKi8KCSAvKiBhbmQgdW50aWwgd2UgaGF2ZW4ndCBmb3VuZCBhbm90aGVyICInIiBjaGFyYWN0ZXIgKi8KCSB3aGlsZSAoKmZvcm1hdCkKICAgICAgICAgewoJICAgIC8qIHdlIGZvdW5kIHdoYXQgbWlnaHQgYmUgdGhlIGNsb3NlIHNpbmdsZSBxdW90ZSBtYXJrICovCgkgICAgLyogd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlcmUgaXNuJ3QgYW5vdGhlciBzaW5nbGUgcXVvdGUgKi8KCSAgICAvKiBhZnRlciBpdCwgaWYgdGhlcmUgaXMgd2UgbmVlZCB0byBza2lwIG92ZXIgdGhpcyBxdW90ZSBtYXJrICovCgkgICAgLyogYXMgdGhlIHVzZXIgaXMgdHJ5aW5nIHRvIHB1dCBhIHNpbmdsZSBxdW90ZSBtYXJrIGluIHRoZWlyIG91dHB1dCAqLwogICAgICAgICAgICBpZiAoKmZvcm1hdCA9PSAoV0NIQVIpICdcJycpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgZm9ybWF0Kys7CiAgICAgICAgICAgICAgIGlmICgqZm9ybWF0ICE9ICdcJycpCiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIEl0IHdhcyBhIHRlcm1pbmF0aW5nIHF1b3RlICovCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKCSAgICAvKiBpZiBvdXRsZW4gaXMgemVybyB0aGVuIHdlIGFyZSBjb3V0aW5nIHRoZSBudW1iZXIgb2YgKi8KCSAgICAvKiBjaGFyYWN0ZXJzIG9mIHNwYWNlIHdlIG5lZWQgdG8gb3V0cHV0IHRoaXMgdGV4dCwgZG9uJ3QgKi8KCSAgICAvKiBtb2RpZnkgdGhlIG91dHB1dCBidWZmZXIgKi8KICAgICAgICAgICAgaWYgKCFvdXRsZW4pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgb3V0cG9zKys7ICAgLyogV2UgYXJlIGNvdW50aW5nICovOwogICAgICAgICAgICB9ICBlbHNlIGlmIChvdXRwb3MgPj0gb3V0bGVuKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgIGdvdG8gdG9vX3Nob3J0OwogICAgICAgICAgICB9IGVsc2UgCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgLyogZXZlbiBkcm9wIGxpdGVyYWwgc3RyaW5ncyAqLwoJICAgICAgIGlmKCFkcm9wVW50aWxOZXh0Rm9ybWF0dGluZ0NoYXIpCiAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBvdXRwdXRbb3V0cG9zXSA9ICpmb3JtYXQ7CiAgICAgICAgICAgICAgICAgb3V0cG9zKys7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JtYXQrKzsKICAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCAoZGF0ZWZvcm1hdCAmJiAgKCpmb3JtYXQ9PSdkJyB8fAoJCQkJICAgKmZvcm1hdD09J00nIHx8CgkJCQkgICAqZm9ybWF0PT0neScgfHwKCQkJCSAgICpmb3JtYXQ9PSdnJykgICkgfHwKCQkgICghZGF0ZWZvcm1hdCAmJiAoKmZvcm1hdD09J0gnIHx8CgkJCQkgICAqZm9ybWF0PT0naCcgfHwKCQkJCSAgICpmb3JtYXQ9PSdtJyB8fAoJCQkJICAgKmZvcm1hdD09J3MnIHx8CgkJCQkgICAqZm9ybWF0PT0ndCcpICkgICAgKSAKICAgICAvKiBpZiBwcm9jZXNzaW5nIGEgZGF0ZSBhbmQgd2UgaGF2ZSBhIGRhdGUgZm9ybWF0dGluZyBjaGFyYWN0ZXIsIE9SICovCiAgICAgLyogaWYgd2UgYXJlIHByb2Nlc3NpbmcgYSB0aW1lIGFuZCB3ZSBoYXZlIGEgdGltZSBmb3JtYXR0aW5nIGNoYXJhY3RlciAqLwogICAgIHsKICAgICAgICAgaW50IHR5cGUsIGNvdW50OwogICAgICAgICBjaGFyICAgIHRtcFsxNl07CiAgICAgICAgIFdDSEFSICAgYnVmWzQwXTsKICAgICAgICAgaW50ICAgICBidWZsZW49MDsKICAgICAgICAgdHlwZSA9ICpmb3JtYXQ7CiAgICAgICAgIGZvcm1hdCsrOwoKCSAvKiBjbGVhciBvdXQgdGhlIGRyb3AgdGV4dCBmbGFnIGlmIHdlIGFyZSBpbiBoZXJlICovCgkgZHJvcFVudGlsTmV4dEZvcm1hdHRpbmdDaGFyID0gRkFMU0U7CgogICAgICAgICAvKiBjb3VudCB1cCB0aGUgbnVtYmVyIG9mIHRoZSBzYW1lIGxldHRlciB2YWx1ZXMgaW4gYSByb3cgdGhhdCAqLwoJIC8qIHdlIGdldCwgdGhpcyBsZXRzIHVzIGRpc3Rpbmd1aXNoIGJldHdlZW4gInMiIGFuZCAic3MiIGFuZCBpdCAqLwoJIC8qIGVsaW1pbmF0ZXMgdGhlIGR1cGxpY2F0ZSB0byBzaW1wbGlmeSB0aGUgYmVsb3cgY2FzZSBzdGF0ZW1lbnQgKi8KICAgICAgICAgZm9yIChjb3VudCA9IDE7ICpmb3JtYXQgPT0gdHlwZTsgZm9ybWF0KyspCiAgICAgICAgICAgIGNvdW50Kys7CgoJIGJ1ZlswXSA9IDA7IC8qIGFsd2F5cyBudWxsIHRlcm1pbmF0ZSB0aGUgYnVmZmVyICovCgogICAgICAgICBzd2l0Y2godHlwZSkKICAgICAgICAgewogICAgICAgICAgY2FzZSAnZCc6CgkgICAgaWYgICAgICAgIChjb3VudCA+PSA0KSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLAoJCQkgICAgIExPQ0FMRV9TREFZTkFNRTEgKyAoeHRpbWUtPndEYXlPZldlZWsgKzYpJTcsCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLAoJCQkJTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSArCgkJCQkoeHRpbWUtPndEYXlPZldlZWsgKzYpJTcsCgkJCQlidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCB4dGltZS0+d0RheSApOwogICAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ00nOgoJICAgIGlmICAgICAgICAoY291bnQgPj0gNCkgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgIExPQ0FMRV9TTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAgTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxICsKCQkJCXh0aW1lLT53TW9udGggLTEsIGJ1ZiwKCQkJCXNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50LCB4dGltZS0+d01vbnRoICk7CiAgICAgICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHRtcCwgLTEsIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICd5JzoKCSAgICBpZiAgICAgICAgKGNvdW50ID49IDQpIHsKICAgICAgICAgICAgICAgIHNwcmludGYoIHRtcCwgIiVkIiwgeHRpbWUtPndZZWFyICk7CgkgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHNwcmludGYoIHRtcCwgIiUuKmQiLCBjb3VudCA+IDIgPyAyIDogY291bnQsIHh0aW1lLT53WWVhciAlIDEwMCApOwoJICAgIH0KICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSAnZyc6CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAyKSB7CgkgICAgICAgRklYTUUoIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wbGVtZW50ZWRcbiIpOwogICAgICAgICAgICAgICBzdHJjcHkoIHRtcCwgIkFEIiApOwoJICAgIH0gZWxzZSB7CgkgICAgICAgLyogV2luIEFQSSBzZXogd2UgY29weSBpdCB2ZXJiYXRpbSAqLwogICAgICAgICAgICAgICAgc3RyY3B5KCB0bXAsICJnIiApOwoJICAgIH0KICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSAnaCc6CgkgICAgICAvKiBmYWxsdGhyb3VnaCBpZiB3ZSBhcmUgZm9yY2VkIHRvIG91dHB1dCBpbiAyNCBob3VyIGZvcm1hdCAqLwoJICAgICAgaWYoISh0ZmxhZ3MgJiBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUKSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBob3VycyAxOjAwLTEyOjAwIC0tLSBpcyB0aGlzIHJpZ2h0PyAqLwoJCS8qIE5PVEU6IDAwMDAgaG91cnMgaXMgYWxzbyAxMiBtaWRuaWdodCAqLwogICAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50ID4gMiA/IDIgOiBjb3VudCwgCgkJCXh0aW1lLT53SG91ciA9PSAwID8gMTIgOiAoeHRpbWUtPndIb3VyLTEpJTEyICsxKTsKICAgICAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgdG1wLCAtMSwgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICB9CiAgICAgICAgICBjYXNlICdIJzoKICAgICAgICAgICAgICBzcHJpbnRmKCB0bXAsICIlLipkIiwgY291bnQgPiAyID8gMiA6IGNvdW50LCB4dGltZS0+d0hvdXIgKTsKICAgICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHRtcCwgLTEsIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ20nOgoJICAgICAgLyogaWYgVElNRV9OT01JTlVURVNPUlNFQ09ORFMgZG9uJ3QgZGlzcGxheSBtaW51dGVzICovCgkgICAgICBpZighKHRmbGFncyAmIFRJTUVfTk9NSU5VVEVTT1JTRUNPTkRTKSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzcHJpbnRmKCB0bXAsICIlLipkIiwgY291bnQgPiAyID8gMiA6IGNvdW50LCB4dGltZS0+d01pbnV0ZSApOwogICAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICAgIH0gZWxzZQoJICAgICAgewoJCW91dHBvcyA9IGxhc3RGb3JtYXRQb3M7CgkgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSAncyc6CgkgICAgICAvKiBpZiB3ZSBoYXZlIGEgVElNRV9OT1NFQ09ORFMgb3IgVElNRV9OT01JTlVURVNPUlNFQ09ORFMgCgkJCWZsYWcgdGhlbiBkb24ndCBkaXNwbGF5IHNlY29uZHMgKi8KCSAgICAgIGlmKCEodGZsYWdzICYgVElNRV9OT1NFQ09ORFMpICYmICEodGZsYWdzICYgCgkJCVRJTUVfTk9NSU5VVEVTT1JTRUNPTkRTKSkKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzcHJpbnRmKCB0bXAsICIlLipkIiwgY291bnQgPiAyID8gMiA6IGNvdW50LCB4dGltZS0+d1NlY29uZCApOwogICAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICAgIH0gZWxzZQoJICAgICAgewoJCW91dHBvcyA9IGxhc3RGb3JtYXRQb3M7CgkgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSAndCc6CgkgICAgaWYoISh0ZmxhZ3MgJiBUSU1FX05PVElNRU1BUktFUikpCgkgICAgewogIAkgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsICh4dGltZS0+d0hvdXIgPCAxMikgPwoJCQkgICAgIExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKCQkJICAgICBidWYsIHNpemVvZihidWYpICk7CiAgCSAgICAgIGlmIChjb3VudCA9PSAxKQoJICAgICAgewoJICAgICAgICAgYnVmWzFdID0gMDsKCSAgICAgIH0KICAgICAgICAgICAgfSBlbHNlCgkgICAgewoJCW91dHBvcyA9IGxhc3RGb3JtYXRQb3M7IC8qIHJlbW92ZSBhbnkgcHJpb3IgdGV4dCB1cCB1bnRpbCAKCQkJdGhlIG91dHB1dCBkdWUgdG8gZm9ybWF0dGluZyBjaGFyYWN0ZXJzICovCiAJCWRyb3BVbnRpbE5leHRGb3JtYXR0aW5nQ2hhciA9IFRSVUU7IC8qIGRyb3AgZXZlcnl0aGluZyAKCQkJdW50aWwgd2UgaGl0IHRoZSBuZXh0IGZvcm1hdHRpbmcgY2hhcmFjdGVyICovCgkgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgfQoKCSAvKiBjYXQgYnVmIG9udG8gdGhlIG91dHB1dCAqLwoJIGJ1ZmxlbiA9IHN0cmxlblcoYnVmKTsKCgkgLyogd2UgYXJlIGNvdW50aW5nIGhvdyBtYW55IGNoYXJhY3RlcnMgd2UgbmVlZCBmb3Igb3V0cHV0ICovCgkgLyogZG9uJ3QgbW9kaWZ5IHRoZSBvdXRwdXQgYnVmZmVyLi4uICovCiAgICAgICAgIGlmICghb3V0bGVuKQogICAgICAgICAgICAvKiBXZSBhcmUgY291bnRpbmcgKi87CiAgICAgICAgIGVsc2UgaWYgKG91dHBvcyArIGJ1ZmxlbiA8IG91dGxlbikgewogICAgICAgICAgICBzdHJjcHlXKCBvdXRwdXQgKyBvdXRwb3MsIGJ1ZiApOwoJIH0gZWxzZSB7CiAgICAgICAgICAgIGxzdHJjcHluVyggb3V0cHV0ICsgb3V0cG9zLCBidWYsIG91dGxlbiAtIG91dHBvcyApOwogICAgICAgICAgICAvKiBJcyB0aGlzIGFuIHVuZG9jdW1lbnRlZCBmZWF0dXJlIHdlIGFyZSBzdXBwb3J0aW5nPyAqLwogICAgICAgICAgICBnb3RvIHRvb19zaG9ydDsKCSB9Cgkgb3V0cG9zICs9IGJ1ZmxlbjsKCSBsYXN0Rm9ybWF0UG9zID0gb3V0cG9zOyAvKiByZWNvcmQgdGhlIGVuZCBvZiB0aGUgZm9ybWF0dGluZyB0ZXh0IHdlIGp1c3Qgb3V0cHV0ICovCiAgICAgIH0gZWxzZSAvKiB3ZSBhcmUgcHJvY2Vzc2luZyBhIE5PTiBmb3JtYXR0aW5nIGNoYXJhY3RlciAqLwogICAgICB7CiAgICAgICAgIC8qIGEgbGl0ZXJhbCBjaGFyYWN0ZXIgKi8KICAgICAgICAgaWYgKCFvdXRsZW4pCiAgICAgICAgIHsKICAgICAgICAgICAgb3V0cG9zKys7ICAgLyogV2UgYXJlIGNvdW50aW5nICovOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgaWYgKG91dHBvcyA+PSBvdXRsZW4pCiAgICAgICAgIHsKICAgICAgICAgICAgZ290byB0b29fc2hvcnQ7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSAvKiBqdXN0IGNvcHkgdGhlIGNoYXJhY3RlciBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyICovCiAgICAgICAgIHsKCSAgICAvKiB1bmxlc3Mgd2UgYXJlIGRyb3BwaW5nIGNoYXJhY3RlcnMgKi8KCSAgICBpZighZHJvcFVudGlsTmV4dEZvcm1hdHRpbmdDaGFyKQoJICAgIHsKCSAgICAgICBvdXRwdXRbb3V0cG9zXSA9ICpmb3JtYXQ7CiAgICAgICAgICAgICAgIG91dHBvcysrOwogICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZm9ybWF0Kys7CiAgICAgIH0KICAgfQoKICAgLyogZmluYWwgc3RyaW5nIHRlcm1pbmF0b3IgYW5kIHNhbml0eSBjaGVjayAqLwogICBpZiAoIW91dGxlbikKICAgICAgLyogV2UgYXJlIGNvdW50aW5nICovOwogICBlbHNlIGlmIChvdXRwb3MgPj0gb3V0bGVuKQogICAgICBnb3RvIHRvb19zaG9ydDsKICAgZWxzZQogICAgICBvdXRwdXRbb3V0cG9zXSA9ICdcMCc7CgogICBvdXRwb3MrKzsgLyogYWRkIG9uZSBmb3IgdGhlIHRlcm1pbmF0aW5nIG51bGwgY2hhcmFjdGVyICovCgogICBUUkFDRSgiIHJldHVybmluZyAlZCAlc1xuIiwgb3V0cG9zLCBkZWJ1Z3N0cl93KG91dHB1dCkpOwogICByZXR1cm4gb3V0cG9zOwoKdG9vX3Nob3J0OgogICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgIFdBUk4oIiBidWZmZXIgb3ZlcmZsb3dcbiIpOwogICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldERhdGVGb3JtYXRBCVtLRVJORUwzMi5AXQogKiBNYWtlcyBhbiBBU0NJSSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogQWN0cyB0aGUgc2FtZSBhcyBHZXREYXRlRm9ybWF0VygpLCAgZXhjZXB0IHRoYXQgaXQncyBBU0NJSS4KICovCklOVCBXSU5BUEkgR2V0RGF0ZUZvcm1hdEEoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIGNvbnN0IFNZU1RFTVRJTUUqIHh0aW1lLAoJCQkgICAgICBMUENTVFIgZm9ybWF0LCBMUFNUUiBkYXRlLCBJTlQgZGF0ZWxlbikKewogIElOVCByZXQ7CiAgTFBXU1RSIHdmb3JtYXQgPSBOVUxMOwogIExQV1NUUiB3ZGF0ZSA9IE5VTEw7ICAKCiAgaWYgKGZvcm1hdCkKICB7CiAgICB3Zm9ybWF0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIChzdHJsZW4oZm9ybWF0KSArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKCiAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgZm9ybWF0LCAtMSwgd2Zvcm1hdCwgc3RybGVuKGZvcm1hdCkgKyAxKTsKICB9CgogIGlmIChkYXRlICYmIGRhdGVsZW4pCiAgewogICAgd2RhdGUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgIChkYXRlbGVuICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOwogIH0KCiAgcmV0ID0gR2V0RGF0ZUZvcm1hdFcobG9jYWxlLCBmbGFncywgeHRpbWUsIHdmb3JtYXQsIHdkYXRlLCBkYXRlbGVuKTsKCiAgaWYgKHdkYXRlKQogIHsKICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCB3ZGF0ZSwgcmV0LCBkYXRlLCBkYXRlbGVuLCBOVUxMLCBOVUxMKTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdkYXRlKTsKICB9CgogIGlmICh3Zm9ybWF0KQogIHsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdmb3JtYXQpOwogIH0KCiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0RGF0ZUZvcm1hdFcJW0tFUk5FTDMyLkBdCiAqIE1ha2VzIGEgVW5pY29kZSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogVGhpcyBmdW5jdGlvbiB1c2VzIGZvcm1hdCB0byBmb3JtYXQgdGhlIGRhdGUsICBvciwgIGlmIGZvcm1hdAogKiBpcyBOVUxMLCB1c2VzIHRoZSBkZWZhdWx0IGZvciB0aGUgbG9jYWxlLiAgZm9ybWF0IGlzIGEgc3RyaW5nCiAqIG9mIGxpdGVyYWwgZmllbGRzIGFuZCBjaGFyYWN0ZXJzIGFzIGZvbGxvd3M6CiAqCiAqIC0gZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICogLSBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogKiAtIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogKiAtIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAqIC0gTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICogLSBNTSAgIHR3by1kaWdpdCBtb250aAogKiAtIE1NTSAgc2hvcnQgbW9udGggbmFtZQogKiAtIE1NTU0gZnVsbCBtb250aCBuYW1lCiAqIC0geSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAqIC0geXkgICB0d28tZGlnaXQgeWVhcgogKiAtIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAqIC0gZ2cgICBlcmEgc3RyaW5nCiAqCiAqIEFjY2VwdHMgJiByZXR1cm5zIHNpemVzIGFzIGNvdW50cyBvZiBVbmljb2RlIGNoYXJhY3RlcnMuCiAqLwpJTlQgV0lOQVBJIEdldERhdGVGb3JtYXRXKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBjb25zdCBTWVNURU1USU1FKiB4dGltZSwKCQkJICAgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICAgIExQV1NUUiBkYXRlLCBJTlQgZGF0ZWxlbikKewogICAgV0NIQVIgZm9ybWF0X2J1Zls0MF07CiAgICBMUENXU1RSIHRoaXNmb3JtYXQ7CiAgICBTWVNURU1USU1FIHQ7CiAgICBMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CiAgICBMQ0lEIHRoaXNsb2NhbGU7CiAgICBJTlQgcmV0OwogICAgRklMRVRJTUUgZnQ7CiAgICBCT09MIHJlczsKICAgIAogICAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLAoJICBsb2NhbGUsZmxhZ3MseHRpbWUsZGVidWdzdHJfdyhmb3JtYXQpLGRhdGUsZGF0ZWxlbik7CiAgICAKICAgIC8qIFRlc3RzICovCiAgICBpZiAoZmxhZ3MgJiYgZm9ybWF0KSAvKiBpZiBscEZvcm1hdCBpcyBub24tbnVsbCB0aGVuIGZsYWdzIG11c3QgYmUgemVybyAqLwogICAgewkJCSAKICAgICAgICBTZXRMYXN0RXJyb3IgKEVSUk9SX0lOVkFMSURfRkxBR1MpOwoJcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoZGF0ZWxlbiAmJiAhZGF0ZSkKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IgKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiAwOwogICAgfQogICAgaWYgKCFsb2NhbGUpCiAgICB7Cglsb2NhbGUgPSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ7CiAgICB9OwogICAgCiAgICBpZiAobG9jYWxlID09IExPQ0FMRV9TWVNURU1fREVGQVVMVCkKICAgIHsKCXRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogICAgfSBlbHNlIGlmIChsb2NhbGUgPT0gTE9DQUxFX1VTRVJfREVGQVVMVCkKICAgIHsKCXRoaXNsb2NhbGUgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKICAgIH0gZWxzZQogICAgewoJdGhpc2xvY2FsZSA9IGxvY2FsZTsKICAgIH07CgogICAgLyogY2hlY2sgZm9yIGludmFsaWQgZmxhZyBjb21iaW5hdGlvbnMgKi8KICAgIGlmKChmbGFncyAmIERBVEVfTFRSUkVBRElORykgJiYgKGZsYWdzICYgREFURV9SVExSRUFESU5HKSkKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IgKEVSUk9SX0lOVkFMSURfRkxBR1MpOwoJcmV0dXJuIDA7CiAgICB9CgogICAgLyogREFURV9TSE9SVERBVEUsIERBVEVfTE9OR0RBVEUgYW5kIERBVEVfWUVBUk1PTlRIIGFyZSBtdXR1YWxseSAqLwogICAgLyogZXhjbHVzaXZlICovICAgIAogICAgaWYoKGZsYWdzICYgKERBVEVfU0hPUlREQVRFfERBVEVfTE9OR0RBVEV8REFURV9ZRUFSTU9OVEgpKQoJICYmICEoKGZsYWdzICYgREFURV9TSE9SVERBVEUpIF4gKGZsYWdzICYgCiAgICAgICAgREFURV9MT05HREFURSkgXiAoZmxhZ3MgJiBEQVRFX1lFQVJNT05USCkpKQogICAgewogICAgICAgIFNldExhc3RFcnJvciAoRVJST1JfSU5WQUxJRF9GTEFHUyk7CglyZXR1cm4gMDsKICAgIH0KCiAgICAvKiBpZiB0aGUgdXNlciBkaWRuJ3QgcGFzcyBpbiBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgdGltZSB3ZSByZWFkIGl0ICovICAgIAogICAgLyogaGVyZSAqLwogICAgaWYgKHh0aW1lID09IE5VTEwpCiAgICB7CglHZXRTeXN0ZW1UaW1lKCZ0KTsKICAgIH0gZWxzZQogICAgewogICAgICAgIC8qIE5PVEU6IGNoZWNrIGhlcmUgYmVmb3JlIHdlIHBlcmZvcm0gdGhlIFN5c3RlbVRpbWVUb0ZpbGVUaW1lIGNvbnZlcnNpb24gKi8KICAgICAgICAvKiAgYmVjYXVzZSB0aGlzIGNvbnZlcnNpb24gd2lsbCBmaXggaW52YWxpZCB0aW1lIHZhbHVlcyAqLwogICAgICAgIC8qIGNoZWNrIHRvIHNlZSBpZiB0aGUgdGltZS9kYXRlIGlzIHZhbGlkICovCiAgICAgICAgLyogc2V0IEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSIGFuZCByZXR1cm4gMCBpZiBpbnZhbGlkICovCiAgICAgICAgaWYoKHh0aW1lLT53RGF5ID4gMzEpIHx8ICh4dGltZS0+d01vbnRoID4gMTIpKQogICAgICAgIHsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgLyogRm9yIGFsbCB3ZSBrbm93IHRoZSBkYXkgb2Ygd2VlayBhbmQgdGhlIHRpbWUgbWF5IGJlIGFic29sdXRlCiAgICAgICAgICogcnViYmlzaC4gIFRoZXJlZm9yZSBpZiB3ZSBhcmUgZ29pbmcgdG8gdXNlIGNvbnZlcnNpb24gdGhyb3VnaAogICAgICAgICAqIEZpbGVUaW1lIHdlIGhhZCBiZXR0ZXIgdXNlIGEgY2xlYW4gdGltZSAoYW5kIGhvcGVmdWxseSB3ZSB3b24ndAogICAgICAgICAqIGZhbGwgb3ZlciBhbnkgdGltZXpvbmUgY29tcGxpY2F0aW9ucykuCiAgICAgICAgICogSWYgd2UgZ28gd2l0aCBhbiBhbHRlcm5hdGl2ZSBtZXRob2Qgb2YgY29ycmVjdGluZyB0aGUgZGF5IG9mIHdlZWsKICAgICAgICAgKiAoZS5nLiBaZWxsZXIncyBjb25ncnVlbmNlKSB0aGVuIHdlIHdvbid0IG5lZWQgdG8sIGJ1dCB3ZSB3aWxsIG5lZWQKICAgICAgICAgKiB0byBjaGVjayB0aGUgZGF0ZS4KICAgICAgICAgKi8KICAgICAgICBtZW1zZXQgKCZ0LCAwLCBzaXplb2YodCkpOwogICAgICAgIHQud1llYXIgPSB4dGltZS0+d1llYXI7CiAgICAgICAgdC53TW9udGggPSB4dGltZS0+d01vbnRoOwogICAgICAgIHQud0RheSA9IHh0aW1lLT53RGF5OwoKCS8qIFNpbGVudGx5IGNvcnJlY3Qgd0RheU9mV2VlayBieSB0cmFuc2Zvcm1pbmcgdG8gRmlsZVRpbWUgYW5kIGJhY2sgYWdhaW4gKi8KCXJlcz1TeXN0ZW1UaW1lVG9GaWxlVGltZSgmdCwmZnQpOwoKCS8qIENoZWNrIHllYXIoPykvbW9udGggYW5kIGRhdGUgZm9yIHJhbmdlIGFuZCBzZXQgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgIG9uIGVycm9yICovCglpZighcmVzKQoJewoJICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CgkgICAgcmV0dXJuIDA7Cgl9CglGaWxlVGltZVRvU3lzdGVtVGltZSgmZnQsJnQpOwoJCiAgICB9OwogICAgdGhpc3RpbWUgPSAmdDsKICAgIAogICAgaWYgKGZvcm1hdCA9PSBOVUxMKQogICAgewoJR2V0TG9jYWxlSW5mb1codGhpc2xvY2FsZSwgKChmbGFncyZEQVRFX0xPTkdEQVRFKQoJCQkJICAgID8gTE9DQUxFX1NMT05HREFURQoJCQkJICAgIDogTE9DQUxFX1NTSE9SVERBVEUpLAoJCSAgICAgICBmb3JtYXRfYnVmLCBzaXplb2YoZm9ybWF0X2J1Zikvc2l6ZW9mKCpmb3JtYXRfYnVmKSk7Cgl0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICAgIH0gZWxzZQogICAgewoJdGhpc2Zvcm1hdCA9IGZvcm1hdDsKICAgIH07CiAgICAKICAgIAogICAgcmV0ID0gT0xFX0dldEZvcm1hdFcodGhpc2xvY2FsZSwgZmxhZ3MsIDAsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LAoJCQkgZGF0ZSwgZGF0ZWxlbiwgMSk7CiAgICAKICAgIAogICAgVFJBQ0UoIkdldERhdGVGb3JtYXRXKCkgcmV0dXJuaW5nICVkLCB3aXRoIGRhdGE9JXNcbiIsCgkgIHJldCwgZGVidWdzdHJfdyhkYXRlKSk7CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0c0EJKEtFUk5FTDMyLkApCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNBKAogIERBVEVGTVRfRU5VTVBST0NBIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgIERXT1JEIGR3RmxhZ3MpCnsKICBMQ0lEIExvYyA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwogIGlmKCFscERhdGVGbXRFbnVtUHJvYykKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICBzd2l0Y2goIExvYyApCiB7CgogICBjYXNlIDB4MDAwMDA0MDc6ICAvKiAoTG9jLCJkZV9ERSIpICovCiAgIHsKICAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC5NTS55eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTU0ueXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTS55eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGQuIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuIE1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgIH0KICAgfQoKICAgY2FzZSAweDAwMDAwNDBjOiAgLyogKExvYywiZnJfRlIiKSAqLwogICB7CiAgICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC1NTS15eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkIGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU0geXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgICB9CiAgIH0KCiAgIGNhc2UgMHgwMDAwMGMwYzogIC8qIChMb2MsImZyX0NBIikgKi8KICAgewogICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5LU1NLWRkIikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC1NTS15eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXkgTU0gZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICAgfQogICB9CgogICBjYXNlIDB4MDAwMDA4MDk6ICAvKiAoTG9jLCJlbl9VSyIpICovCiAgewogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMGMwOTogIC8qIChMb2MsImVuX0FVIikgKi8KICB7CiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDEwMDk6ICAvKiAoTG9jLCJlbl9DQSIpICovCiAgewogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXktTU0tZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZGQveXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC1NTU0teXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAxNDA5OiAgLyogKExvYywiZW5fTloiKSAqLwogIHsKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAxODA5OiAgLyogKExvYywiZW5fSUUiKSAqLwogIHsKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTS55eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDFjMDk6ICAvKiAoTG9jLCJlbl9aQSIpICovCiAgewogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXkvTU0vZGQiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMjAwOTogIC8qIChMb2MsImVuX0pNIikgKi8KICB7CiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsTU1NTSBkZCx5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU1NTSBkZCx5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxkZCBNTU1NLHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NLHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAyODA5OiAgLyogKExvYywiZW5fQloiKSAqLwogICBjYXNlIDB4MDAwMDJjMDk6ICAvKiAoTG9jLCJlbl9UVCIpICovCiAgewogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBkZWZhdWx0OiAgLyogZGVmYXVsdCB0byBVUyBFbmdsaXNoICJlbl9VUyIgKi8KICB7CiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2QveXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZC95eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTS9kZC95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU0vZGQveXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXkvTU0vZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLU1NTS15eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBNTU1NIGRkLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU1NTSBkZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIGRkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtRGF0ZUZvcm1hdHNXCShLRVJORUwzMi5AKQogKi8KQk9PTCBXSU5BUEkgRW51bURhdGVGb3JtYXRzVygKICBEQVRFRk1UX0VOVU1QUk9DVyBscERhdGVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRSgiKCVwLCAlbGQsICVsZCk6IHN0dWJcbiIsIGxwRGF0ZUZtdEVudW1Qcm9jLCBMb2NhbGUsIGR3RmxhZ3MpOwogIFNldExhc3RFcnJvcihFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCk7CiAgcmV0dXJuIEZBTFNFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1UaW1lRm9ybWF0c0EJKEtFUk5FTDMyLkApCiAqLwpCT09MIFdJTkFQSSBFbnVtVGltZUZvcm1hdHNBKAogIFRJTUVGTVRfRU5VTVBST0NBIGxwVGltZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIExDSUQgTG9jID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CiAgaWYoIWxwVGltZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CiAgaWYoZHdGbGFncykKICAgIHsKICAgICAgRklYTUUoIlVua25vd24gdGltZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwogICAgfQoKICBzd2l0Y2goIExvYyApCiB7CiAgIGNhc2UgMHgwMDAwMDQwNzogIC8qIChMb2MsImRlX0RFIikgKi8KICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISC5tbSIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkgubW0iKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkgubW0nVWhyJyIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CgogICBjYXNlIDB4MDAwMDA0MGM6ICAvKiAoTG9jLCJmcl9GUiIpICovCiAgIGNhc2UgMHgwMDAwMGMwYzogIC8qIChMb2MsImZyX0NBIikgKi8KICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEgubW0iKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIJ2gnbW0iKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfQoKICAgY2FzZSAweDAwMDAwODA5OiAgLyogKExvYywiZW5fVUsiKSAqLwogICBjYXNlIDB4MDAwMDBjMDk6ICAvKiAoTG9jLCJlbl9BVSIpICovCiAgIGNhc2UgMHgwMDAwMTQwOTogIC8qIChMb2MsImVuX05aIikgKi8KICAgY2FzZSAweDAwMDAxODA5OiAgLyogKExvYywiZW5fSUUiKSAqLwogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgcmV0dXJuIFRSVUU7CiAgIH0KCiAgIGNhc2UgMHgwMDAwMWMwOTogIC8qIChMb2MsImVuX1pBIikgKi8KICAgY2FzZSAweDAwMDAyODA5OiAgLyogKExvYywiZW5fQloiKSAqLwogICBjYXNlIDB4MDAwMDJjMDk6ICAvKiAoTG9jLCJlbl9UVCIpICovCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaGg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfQoKICAgZGVmYXVsdDogIC8qIGRlZmF1bHQgdG8gVVMgc3R5bGUgImVuX1VTIiAqLwogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImhoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CiB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzVwkoS0VSTkVMMzIuQCkKICovCkJPT0wgV0lOQVBJIEVudW1UaW1lRm9ybWF0c1coCiAgVElNRUZNVF9FTlVNUFJPQ1cgbHBUaW1lRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgRklYTUUoIiglcCwlbGQsJWxkKTogc3R1YlxuIiwgbHBUaW1lRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGp1c3QgbG9jYWxseSAhCiAqICBEZXNjcmlwdGlvbjogSW52ZXJ0cyBhIHN0cmluZy4KICovCnN0YXRpYyB2b2lkIE9MRV9JbnZlcnRTdHJpbmcoY2hhciogc3RyaW5nKQp7CiAgICBjaGFyICAgIHNUbXBBcnJheVsxMjhdOwogICAgSU5UICAgICBjb3VudGVyLCBpID0gMDsKCiAgICBmb3IgKGNvdW50ZXIgPSBzdHJsZW4oc3RyaW5nKTsgY291bnRlciA+IDA7IGNvdW50ZXItLSkKICAgIHsKICAgICAgICBtZW1jcHkoc1RtcEFycmF5ICsgaSwgc3RyaW5nICsgY291bnRlci0xLCAxKTsKICAgICAgICBpKys7CiAgICB9CiAgICBtZW1jcHkoc1RtcEFycmF5ICsgaSwgIlwwIiwgMSk7CiAgICBzdHJjcHkoc3RyaW5nLCBzVG1wQXJyYXkpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQganVzdCBsb2NhbGx5ICEKICogIERlc2NyaXB0aW9uOiBUZXN0IGlmIHRoZSBnaXZlbiBzdHJpbmcgKHBzTnVtYmVyKSBpcyB2YWxpZCBvciBub3QuCiAqICAgICAgICAgICAgICAgVGhlIHZhbGlkIGNoYXJhY3RlcnMgYXJlIHRoZSBmb2xsb3dpbmc6CiAqICAgICAgICAgICAgICAgLSBDaGFyYWN0ZXJzICcwJyB0aHJvdWdoICc5Jy4KICogICAgICAgICAgICAgICAtIE9uZSBkZWNpbWFsIHBvaW50IChkb3QpIGlmIHRoZSBudW1iZXIgaXMgYSBmbG9hdGluZy1wb2ludCB2YWx1ZS4KICogICAgICAgICAgICAgICAtIEEgbWludXMgc2lnbiBpbiB0aGUgZmlyc3QgY2hhcmFjdGVyIHBvc2l0aW9uIGlmIHRoZSBudW1iZXIgaXMKICogICAgICAgICAgICAgICAgIGEgbmVnYXRpdmUgdmFsdWUuCiAqICAgICAgICAgICAgICBJZiB0aGUgZnVuY3Rpb24gc3VjY2VlZHMsIHBzQmVmb3JlL3BzQWZ0ZXIgd2lsbCBwb2ludCB0byB0aGUgc3RyaW5nCiAqICAgICAgICAgICAgICBvbiB0aGUgcmlnaHQvbGVmdCBvZiB0aGUgZGVjaW1hbCBzeW1ib2wuIHBiTmVnYXRpdmUgaW5kaWNhdGVzIGlmIHRoZQogKiAgICAgICAgICAgICAgbnVtYmVyIGlzIG5lZ2F0aXZlLgogKi8Kc3RhdGljIElOVCBPTEVfR2V0TnVtYmVyQ29tcG9uZW50cyhjaGFyKiBwSW5wdXQsIGNoYXIqIHBzQmVmb3JlLCBjaGFyKiBwc0FmdGVyLCBCT09MKiBwYk5lZ2F0aXZlKQp7CmNoYXIJc051bWJlclNldFtdID0gIjAxMjM0NTY3ODkiOwpCT09MCWJJbkRlY2ltYWwgPSBGQUxTRTsKCgkvKiBUZXN0IGlmIHdlIGRvIGhhdmUgYSBtaW51cyBzaWduICovCglpZiAoICpwSW5wdXQgPT0gJy0nICkKCXsKCQkqcGJOZWdhdGl2ZSA9IFRSVUU7CgkJcElucHV0Kys7IC8qIEp1bXAgdG8gdGhlIG5leHQgY2hhcmFjdGVyLiAqLwoJfQoKCXdoaWxlKCpwSW5wdXQgIT0gJ1wwJykKCXsKCQkvKiBEbyB3ZSBoYXZlIGEgdmFsaWQgbnVtZXJpYyBjaGFyYWN0ZXIgKi8KCQlpZiAoIHN0cmNocihzTnVtYmVyU2V0LCAqcElucHV0KSAhPSBOVUxMICkKCQl7CgkJCWlmIChiSW5EZWNpbWFsID09IFRSVUUpCiAgICAgICAgICAgICAgICAqcHNBZnRlcisrID0gKnBJbnB1dDsKCQkJZWxzZQogICAgICAgICAgICAgICAgKnBzQmVmb3JlKysgPSAqcElucHV0OwoJCX0KCQllbHNlCgkJewoJCQkvKiBJcyB0aGlzIGEgZGVjaW1hbCBwb2ludCAoZG90KSAqLwoJCQlpZiAoICpwSW5wdXQgPT0gJy4nICkKCQkJewoJCQkJLyogSXMgaXQgdGhlIGZpcnN0IHRpbWUgd2UgZmluZCBpdCAqLwoJCQkJaWYgKChiSW5EZWNpbWFsID09IEZBTFNFKSkKCQkJCQliSW5EZWNpbWFsID0gVFJVRTsKCQkJCWVsc2UKCQkJCQlyZXR1cm4gLTE7IC8qIEVSUk9SOiBJbnZhbGlkIHBhcmFtZXRlciAqLwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJLyogSXQncyBuZWl0aGVyIGEgbnVtZXJpYyBjaGFyYWN0ZXIsIG5vciBhIGRlY2ltYWwgcG9pbnQuCgkJCQkgKiBUaHVzLCByZXR1cm4gYW4gZXJyb3IuCiAgICAgICAgICAgICAgICAgKi8KCQkJCXJldHVybiAtMTsKCQkJfQoJCX0KICAgICAgICBwSW5wdXQrKzsKCX0KCgkvKiBBZGQgYW4gRW5kIG9mIExpbmUgY2hhcmFjdGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVycyAqLwoJKnBzQmVmb3JlID0gJ1wwJzsKCSpwc0FmdGVyID0gJ1wwJzsKCglyZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQganVzdCBsb2NhbGx5ICEKICogIERlc2NyaXB0aW9uOiBBIG51bWJlciBjb3VsZCBiZSBmb3JtYXR0ZWQgdXNpbmcgZGlmZmVyZW50IG51bWJlcnMKICogICAgICAgICAgICAgICBvZiAiZGlnaXRzIGluIGdyb3VwIiAoZXhhbXBsZTogNDszOzI7MCkuCiAqICAgICAgICAgICAgICAgVGhlIGZpcnN0IHBhcmFtZXRlciBvZiB0aGlzIGZ1bmN0aW9uIGlzIGFuIGFycmF5CiAqICAgICAgICAgICAgICAgY29udGFpbmluZyB0aGUgcnVsZSB0byBiZSB1c2VkLiBJdHMgZm9ybWF0IGlzIHRoZSBmb2xsb3dpbmc6CiAqICAgICAgICAgICAgICAgfE5ER3xERzF8REcyfC4uLnwwfAogKiAgICAgICAgICAgICAgIHdoZXJlIE5ERyBpcyB0aGUgbnVtYmVyIG9mIHVzZWQgImRpZ2l0cyBpbiBncm91cCIgYW5kIERHMSwgREcyLAogKiAgICAgICAgICAgICAgIGFyZSB0aGUgY29ycmVzcG9uZGluZyAiZGlnaXRzIGluIGdyb3VwIi4KICogICAgICAgICAgICAgICBUaHVzLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGdyb3VwaW5nIHZhbHVlIGluIHRoZSBhcnJheQogKiAgICAgICAgICAgICAgIHBvaW50ZWQgYnkgdGhlIHNlY29uZCBwYXJhbWV0ZXIuCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXRHcm91cGluZyhjaGFyKiBzUnVsZSwgSU5UIGluZGV4KQp7CiAgICBjaGFyICAgIHNEYXRhWzJdLCBzUnVsZVNpemVbMl07CiAgICBJTlQgICAgIG5EYXRhLCBuUnVsZVNpemU7CgogICAgbWVtY3B5KHNSdWxlU2l6ZSwgc1J1bGUsIDEpOwogICAgbWVtY3B5KHNSdWxlU2l6ZSsxLCAiXDAiLCAxKTsKICAgIG5SdWxlU2l6ZSA9IGF0b2koc1J1bGVTaXplKTsKCiAgICBpZiAoaW5kZXggPiAwICYmIGluZGV4IDwgblJ1bGVTaXplKQogICAgewogICAgICAgIG1lbWNweShzRGF0YSwgc1J1bGUraW5kZXgsIDEpOwogICAgICAgIG1lbWNweShzRGF0YSsxLCAiXDAiLCAxKTsKICAgICAgICBuRGF0YSA9IGF0b2koc0RhdGEpOwogICAgfQoKICAgIGVsc2UKICAgIHsKICAgICAgICBtZW1jcHkoc0RhdGEsIHNSdWxlK25SdWxlU2l6ZS0xLCAxKTsKICAgICAgICBtZW1jcHkoc0RhdGErMSwgIlwwIiwgMSk7CiAgICAgICAgbkRhdGEgPSBhdG9pKHNEYXRhKTsKICAgIH0KCiAgICByZXR1cm4gbkRhdGE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0QQkoS0VSTkVMMzIuQCkKICovCklOVCBXSU5BUEkgR2V0TnVtYmVyRm9ybWF0QShMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1NUUiBscHZhbHVlLCAgIGNvbnN0IE5VTUJFUkZNVEEgKiBscEZvcm1hdCwKCQkJICAgICAgIExQU1RSIGxwTnVtYmVyU3RyLCBpbnQgY2NoTnVtYmVyKQp7CiAgICBjaGFyICAgc051bWJlckRpZ2l0c1szXSwgc0RlY2ltYWxTeW1ib2xbNV0sIHNEaWdpdHNJbkdyb3VwWzExXSwgc0RpZ2l0R3JvdXBTeW1ib2xbNV0sIHNJTFplcm9bMl07CiAgICBJTlQgICAgbk51bWJlckRpZ2l0cywgbk51bWJlckRlY2ltYWwsIGksIGosIG5Db3VudGVyLCBuU3RlcCwgblJ1bGVJbmRleCwgbkdyb3VwaW5nLCBuRGlnaXRzLCByZXRWYWwsIG5MWjsKICAgIGNoYXIgICBzTnVtYmVyWzEyOF0sIHNEZXN0aW5hdGlvblsxMjhdLCBzRGlnaXRzQWZ0ZXJEZWNpbWFsWzEwXSwgc0RpZ2l0c0JlZm9yZURlY2ltYWxbMTI4XTsKICAgIGNoYXIgICBzUnVsZVsxMF0sIHNTZW1pQ29sdW1uW109IjsiLCBzQnVmZmVyWzVdLCBzTmVnTnVtYmVyWzJdOwogICAgY2hhciAgICpwU3RyID0gTlVMTCwgKnBUbXBTdHIgPSBOVUxMOwogICAgTENJRCAgIHN5c3RlbURlZmF1bHRMQ0lEOwogICAgQk9PTCAgIGJOZWdhdGl2ZSA9IEZBTFNFOwogICAgZW51bSAgIE9wZXJhdGlvbnMKICAgIHsKICAgICAgICBVU0VfUEFSQU1FVEVSLAogICAgICAgIFVTRV9MT0NBTEVJTkZPLAogICAgICAgIFVTRV9TWVNURU1ERUZBVUxULAogICAgICAgIFJFVFVSTl9FUlJPUgogICAgfSB1c2VkX29wZXJhdGlvbjsKCiAgICBzdHJuY3B5KHNOdW1iZXIsIGxwdmFsdWUsIDEyOCk7CiAgICBzTnVtYmVyWzEyN10gPSAnXDAnOwoKICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgaW5wdXQgc3RyaW5nLCBnZXQgdGhlIG51bWJlcgogICAgICogb2YgZGlnaXRzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGRlY2ltYWwgc3ltYm9sLCBhbmQgY2hlY2sKICAgICAqIGlmIHRoaXMgaXMgYSBuZWdhdGl2ZSBudW1iZXIuCiAgICAgKi8KICAgIGlmICggT0xFX0dldE51bWJlckNvbXBvbmVudHMoc051bWJlciwgc0RpZ2l0c0JlZm9yZURlY2ltYWwsIHNEaWdpdHNBZnRlckRlY2ltYWwsICZiTmVnYXRpdmUpICE9IC0xKQogICAgewogICAgICAgIG5OdW1iZXJEZWNpbWFsID0gc3RybGVuKHNEaWdpdHNCZWZvcmVEZWNpbWFsKTsKICAgICAgICBuRGlnaXRzID0gc3RybGVuKHNEaWdpdHNBZnRlckRlY2ltYWwpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogV2hpY2ggc291cmNlIHdpbGwgd2UgdXNlIHRvIGZvcm1hdCB0aGUgc3RyaW5nICovCiAgICB1c2VkX29wZXJhdGlvbiA9IFJFVFVSTl9FUlJPUjsKICAgIGlmIChscEZvcm1hdCAhPSBOVUxMKQogICAgewogICAgICAgIGlmIChkd2ZsYWdzID09IDApCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1BBUkFNRVRFUjsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAoZHdmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfU1lTVEVNREVGQVVMVDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX0xPQ0FMRUlORk87CiAgICB9CgogICAgLyogTG9hZCB0aGUgZmllbGRzIHdlIG5lZWQgKi8KICAgIHN3aXRjaCh1c2VkX29wZXJhdGlvbikKICAgIHsKICAgIGNhc2UgVVNFX0xPQ0FMRUlORk86CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSURJR0lUUywgc051bWJlckRpZ2l0cywgc2l6ZW9mKHNOdW1iZXJEaWdpdHMpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9TREVDSU1BTCwgc0RlY2ltYWxTeW1ib2wsIHNpemVvZihzRGVjaW1hbFN5bWJvbCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX1NHUk9VUElORywgc0RpZ2l0c0luR3JvdXAsIHNpemVvZihzRGlnaXRzSW5Hcm91cCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX1NUSE9VU0FORCwgc0RpZ2l0R3JvdXBTeW1ib2wsIHNpemVvZihzRGlnaXRHcm91cFN5bWJvbCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lMWkVSTywgc0lMWmVybywgc2l6ZW9mKHNJTFplcm8pKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JTkVHTlVNQkVSLCBzTmVnTnVtYmVyLCBzaXplb2Yoc05lZ051bWJlcikpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVU0VfUEFSQU1FVEVSOgogICAgICAgIHNwcmludGYoc051bWJlckRpZ2l0cywgIiVkIixscEZvcm1hdC0+TnVtRGlnaXRzKTsKICAgICAgICBzdHJjcHkoc0RlY2ltYWxTeW1ib2wsIGxwRm9ybWF0LT5scERlY2ltYWxTZXApOwogICAgICAgIHNwcmludGYoc0RpZ2l0c0luR3JvdXAsICIlZDswIixscEZvcm1hdC0+R3JvdXBpbmcpOwogICAgICAgIC8qIFdpbjk1LVdpbk1FIG9ubHkgYWxsb3cgMC05IGZvciBncm91cGluZywgbm8gbWF0dGVyIHdoYXQgTVNETiBzYXlzLiAqLwogICAgICAgIHN0cmNweShzRGlnaXRHcm91cFN5bWJvbCwgbHBGb3JtYXQtPmxwVGhvdXNhbmRTZXApOwogICAgICAgIHNwcmludGYoc0lMWmVybywgIiVkIixscEZvcm1hdC0+TGVhZGluZ1plcm8pOwogICAgICAgIHNwcmludGYoc05lZ051bWJlciwgIiVkIixscEZvcm1hdC0+TmVnYXRpdmVPcmRlcik7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVTRV9TWVNURU1ERUZBVUxUOgogICAgICAgIHN5c3RlbURlZmF1bHRMQ0lEID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lESUdJVFMsIHNOdW1iZXJEaWdpdHMsIHNpemVvZihzTnVtYmVyRGlnaXRzKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TREVDSU1BTCwgc0RlY2ltYWxTeW1ib2wsIHNpemVvZihzRGVjaW1hbFN5bWJvbCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfU0dST1VQSU5HLCBzRGlnaXRzSW5Hcm91cCwgc2l6ZW9mKHNEaWdpdHNJbkdyb3VwKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TVEhPVVNBTkQsIHNEaWdpdEdyb3VwU3ltYm9sLCBzaXplb2Yoc0RpZ2l0R3JvdXBTeW1ib2wpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lMWkVSTywgc0lMWmVybywgc2l6ZW9mKHNJTFplcm8pKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lORUdOVU1CRVIsIHNOZWdOdW1iZXIsIHNpemVvZihzTmVnTnVtYmVyKSk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgbk51bWJlckRpZ2l0cyA9IGF0b2koc051bWJlckRpZ2l0cyk7CgogICAgLyogUmVtb3ZlIHRoZSAiOyIgKi8KICAgIGk9MDsKICAgIGogPSAxOwogICAgZm9yIChuQ291bnRlcj0wOyBuQ291bnRlcjxzdHJsZW4oc0RpZ2l0c0luR3JvdXApOyBuQ291bnRlcisrKQogICAgewogICAgICAgIGlmICggbWVtY21wKHNEaWdpdHNJbkdyb3VwICsgbkNvdW50ZXIsIHNTZW1pQ29sdW1uLCAxKSAhPSAwICkKICAgICAgICB7CiAgICAgICAgICAgIG1lbWNweShzUnVsZSArIGosIHNEaWdpdHNJbkdyb3VwICsgbkNvdW50ZXIsIDEpOwogICAgICAgICAgICBpKys7CiAgICAgICAgICAgIGorKzsKICAgICAgICB9CiAgICB9CiAgICBzcHJpbnRmKHNCdWZmZXIsICIlZCIsIGkpOwogICAgbWVtY3B5KHNSdWxlLCBzQnVmZmVyLCAxKTsgLyogTnVtYmVyIG9mIGRpZ2l0cyBpbiB0aGUgZ3JvdXBzICggdXNlZCBieSBPTEVfR2V0R3JvdXBpbmcoKSApICovCiAgICBtZW1jcHkoc1J1bGUgKyBqLCAiXDAiLCAxKTsKCiAgICAvKiBGaXJzdCwgZm9ybWF0IHRoZSBkaWdpdHMgYmVmb3JlIHRoZSBkZWNpbWFsLiAqLwogICAgaWYgKChuTnVtYmVyRGVjaW1hbD4wKSAmJiAoYXRvaShzRGlnaXRzQmVmb3JlRGVjaW1hbCkgIT0gMCkpCiAgICB7CiAgICAgICAgLyogV29ya2luZyBvbiBhbiBpbnZlcnRlZCBzdHJpbmcgaXMgZWFzaWVyICEgKi8KICAgICAgICBPTEVfSW52ZXJ0U3RyaW5nKHNEaWdpdHNCZWZvcmVEZWNpbWFsKTsKCiAgICAgICAgblN0ZXAgPSBuQ291bnRlciA9IGkgPSBqID0gMDsKICAgICAgICBuUnVsZUluZGV4ID0gMTsKICAgICAgICBuR3JvdXBpbmcgPSBPTEVfR2V0R3JvdXBpbmcoc1J1bGUsIG5SdWxlSW5kZXgpOwogICAgICAgIGlmIChuR3JvdXBpbmcgPT0gMCkgLyogSWYgdGhlIGZpcnN0IGdyb3VwaW5nIGlzIHplcm8gKi8KICAgICAgICAgICAgbkdyb3VwaW5nID0gbk51bWJlckRlY2ltYWw7IC8qIERvbid0IGRvIGdyb3VwaW5nICovCgogICAgICAgIC8qIEhlcmUsIHdlIHdpbGwgbG9vcCB1bnRpbCB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCiAgICAgICAgICogQW4gaW50ZXJuYWwgY291bnRlciAoaikgaXMgdXNlZCBpbiBvcmRlciB0byBrbm93IHdoZW4gdG8KICAgICAgICAgKiBpbnNlcnQgdGhlICJkaWdpdCBncm91cCBzeW1ib2wiLgogICAgICAgICAqLwogICAgICAgIHdoaWxlIChuTnVtYmVyRGVjaW1hbCA+IDApCiAgICAgICAgewogICAgICAgICAgICBpID0gbkNvdW50ZXIgKyBuU3RlcDsKICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiArIGksIHNEaWdpdHNCZWZvcmVEZWNpbWFsICsgbkNvdW50ZXIsIDEpOwogICAgICAgICAgICBuQ291bnRlcisrOwogICAgICAgICAgICBqKys7CiAgICAgICAgICAgIGlmIChqID49IG5Hcm91cGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgICAgICBpZiAoblJ1bGVJbmRleCA8IHNSdWxlWzBdKQogICAgICAgICAgICAgICAgICAgIG5SdWxlSW5kZXgrKzsKICAgICAgICAgICAgICAgIG5Hcm91cGluZyA9IE9MRV9HZXRHcm91cGluZyhzUnVsZSwgblJ1bGVJbmRleCk7CiAgICAgICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uICsgaSsxLCBzRGlnaXRHcm91cFN5bWJvbCwgc3RybGVuKHNEaWdpdEdyb3VwU3ltYm9sKSk7CiAgICAgICAgICAgICAgICBuU3RlcCs9IHN0cmxlbihzRGlnaXRHcm91cFN5bWJvbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5OdW1iZXJEZWNpbWFsLS07CiAgICAgICAgfQoKICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uICsgaSsxLCAiXDAiLCAxKTsKICAgICAgICAvKiBHZXQgdGhlIHN0cmluZyBpbiB0aGUgcmlnaHQgb3JkZXIgISAqLwogICAgICAgIE9MRV9JbnZlcnRTdHJpbmcoc0Rlc3RpbmF0aW9uKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICBuTFogPSBhdG9pKHNJTFplcm8pOwogICAgICAgIGlmIChuTFogIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIC8qIFVzZSAwLnh4eCBpbnN0ZWFkIG9mIC54eHggKi8KICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiwgIjAiLCAxKTsKICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbisxLCAiXDAiLCAxKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uLCAiXDAiLCAxKTsKCiAgICAgfQoKICAgIC8qIFNlY29uZCwgZm9ybWF0IHRoZSBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwuICovCiAgICBqID0gMDsKICAgIG5Db3VudGVyID0gbk51bWJlckRpZ2l0czsKICAgIGlmICggKG5EaWdpdHM+MCkgJiYgKHBTdHIgPSBzdHJzdHIgKHNOdW1iZXIsICIuIikpICkKICAgIHsKICAgICAgICBpID0gc3RybGVuKHNOdW1iZXIpIC0gc3RybGVuKHBTdHIpICsgMTsKICAgICAgICBzdHJuY3B5ICggc0RpZ2l0c0FmdGVyRGVjaW1hbCwgc051bWJlciArIGksIG5OdW1iZXJEaWdpdHMpOwogICAgICAgIGogPSBzdHJsZW4oc0RpZ2l0c0FmdGVyRGVjaW1hbCk7CiAgICAgICAgaWYgKGogPCBuTnVtYmVyRGlnaXRzKQogICAgICAgICAgICBuQ291bnRlciA9IG5OdW1iZXJEaWdpdHMtajsKICAgIH0KICAgIGZvciAoaT0wO2k8bkNvdW50ZXI7aSsrKQogICAgICAgICBtZW1jcHkoc0RpZ2l0c0FmdGVyRGVjaW1hbCtpK2osICIwIiwgMSk7CiAgICBtZW1jcHkoc0RpZ2l0c0FmdGVyRGVjaW1hbCArIG5OdW1iZXJEaWdpdHMsICJcMCIsIDEpOwoKICAgIGkgPSBzdHJsZW4oc0Rlc3RpbmF0aW9uKTsKICAgIGogPSBzdHJsZW4oc0RpZ2l0c0FmdGVyRGVjaW1hbCk7CiAgICAvKiBGaW5hbGx5LCBjb25zdHJ1Y3QgdGhlIHJlc3VsdGluZyBmb3JtYXR0ZWQgc3RyaW5nLiAqLwoKICAgIGZvciAobkNvdW50ZXI9MDsgbkNvdW50ZXI8aTsgbkNvdW50ZXIrKykKICAgICAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyLCBzRGVzdGluYXRpb24gKyBuQ291bnRlciwgMSk7CgogICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlciwgc0RlY2ltYWxTeW1ib2wsIHN0cmxlbihzRGVjaW1hbFN5bWJvbCkpOwoKICAgIGZvciAoaT0wOyBpPGo7IGkrKykKICAgICAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyK2krc3RybGVuKHNEZWNpbWFsU3ltYm9sKSwgc0RpZ2l0c0FmdGVyRGVjaW1hbCArIGksIDEpOwogICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlcitpKyAoaSA/IHN0cmxlbihzRGVjaW1hbFN5bWJvbCkgOiAwKSwgIlwwIiwgMSk7CgogICAgLyogSXMgaXQgYSBuZWdhdGl2ZSBudW1iZXIgKi8KICAgIGlmIChiTmVnYXRpdmUgPT0gVFJVRSkKICAgIHsKICAgICAgICBpID0gYXRvaShzTmVnTnVtYmVyKTsKICAgICAgICBwU3RyID0gc0Rlc3RpbmF0aW9uOwogICAgICAgIHBUbXBTdHIgPSBzTnVtYmVyOwogICAgICAgIHN3aXRjaCAoaSkKICAgICAgICB7CiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAqcFN0cisrID0gJygnOwogICAgICAgICAgICB3aGlsZSAoKnNOdW1iZXIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgKnBTdHIrKyA9ICcpJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAqcFN0cisrID0gJy0nOwogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAqcFN0cisrID0gJy0nOwogICAgICAgICAgICAqcFN0cisrID0gJyAnOwogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgKnBTdHIrKyA9ICcgJzsKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgICBzdHJjcHkoc0Rlc3RpbmF0aW9uLCBzTnVtYmVyKTsKCiAgICAvKiBJZiBjY2hOdW1iZXIgaXMgemVybywgdGhlbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb3IgY2hhcmFjdGVycwogICAgICogcmVxdWlyZWQgdG8gaG9sZCB0aGUgZm9ybWF0dGVkIG51bWJlciBzdHJpbmcKICAgICAqLwogICAgcmV0VmFsID0gc3RybGVuKHNEZXN0aW5hdGlvbikgKyAxOwogICAgaWYgKGNjaE51bWJlciE9MCkKICAgIHsKICAgICAgICBtZW1jcHkoIGxwTnVtYmVyU3RyLCBzRGVzdGluYXRpb24sIG1pbihjY2hOdW1iZXIsIHJldFZhbCkgKTsKICAgICAgICBpZiAoY2NoTnVtYmVyIDwgcmV0VmFsKSB7CiAgICAgICAgICAgIHJldFZhbCA9IDA7CiAgICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmV0VmFsOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldE51bWJlckZvcm1hdFcJKEtFUk5FTDMyLkApCiAqLwpJTlQgV0lOQVBJIEdldE51bWJlckZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENXU1RSIGxwdmFsdWUsICBjb25zdCBOVU1CRVJGTVRXICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFdTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hOdW1iZXIpCnsKIEZJWE1FKCIlczogc3R1Yiwgbm8gcmVmb3JtYXR0aW5nIGRvbmVcbiIsZGVidWdzdHJfdyhscHZhbHVlKSk7CgogbHN0cmNweW5XKCBscE51bWJlclN0ciwgbHB2YWx1ZSwgY2NoTnVtYmVyICk7CiByZXR1cm4gY2NoTnVtYmVyPyBzdHJsZW5XKCBscE51bWJlclN0ciApIDogMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRDdXJyZW5jeUZvcm1hdEEJKEtFUk5FTDMyLkApCiAqLwpJTlQgV0lOQVBJIEdldEN1cnJlbmN5Rm9ybWF0QShMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1NUUiBscHZhbHVlLCAgIGNvbnN0IENVUlJFTkNZRk1UQSAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBTVFIgbHBDdXJyZW5jeVN0ciwgaW50IGNjaEN1cnJlbmN5KQp7CiAgICBVSU5UICAgblBvc09yZGVyLCBuTmVnT3JkZXI7CiAgICBJTlQgICAgcmV0VmFsOwogICAgY2hhciAgIHNEZXN0aW5hdGlvblsxMjhdLCBzTmVnT3JkZXJbOF0sIHNQb3NPcmRlcls4XSwgc0N1cnJlbmN5U3ltYm9sWzhdOwogICAgY2hhciAgICpwRGVzdGluYXRpb24gPSBzRGVzdGluYXRpb247CiAgICBjaGFyICAgc051bWJlckZvcm1hdGVkWzEyOF07CiAgICBjaGFyICAgKnBOdW1iZXJGb3JtYXRlZCA9IHNOdW1iZXJGb3JtYXRlZDsKICAgIExDSUQgICBzeXN0ZW1EZWZhdWx0TENJRDsKICAgIEJPT0wgICBiSXNQb3NpdGl2ZSA9IEZBTFNFLCBiVmFsaWRGb3JtYXQgPSBGQUxTRTsKICAgIGVudW0gICBPcGVyYXRpb25zCiAgICB7CiAgICAgICAgVVNFX1BBUkFNRVRFUiwKICAgICAgICBVU0VfTE9DQUxFSU5GTywKICAgICAgICBVU0VfU1lTVEVNREVGQVVMVCwKICAgICAgICBSRVRVUk5fRVJST1IKICAgIH0gdXNlZF9vcGVyYXRpb247CgogICAgTlVNQkVSRk1UQSAgbnVtYmVyRm10OwoKICAgIC8qIFdoaWNoIHNvdXJjZSB3aWxsIHdlIHVzZSB0byBmb3JtYXQgdGhlIHN0cmluZyAqLwogICAgdXNlZF9vcGVyYXRpb24gPSBSRVRVUk5fRVJST1I7CiAgICBpZiAobHBGb3JtYXQgIT0gTlVMTCkKICAgIHsKICAgICAgICBpZiAoZHdmbGFncyA9PSAwKQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9QQVJBTUVURVI7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKGR3ZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1NZU1RFTURFRkFVTFQ7CiAgICAgICAgZWxzZQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9MT0NBTEVJTkZPOwogICAgfQoKICAgIC8qIExvYWQgdGhlIGZpZWxkcyB3ZSBuZWVkICovCiAgICBzd2l0Y2godXNlZF9vcGVyYXRpb24pCiAgICB7CiAgICBjYXNlIFVTRV9MT0NBTEVJTkZPOgogICAgICAgIC8qIFNwZWNpZmljIHRvIENVUlJFTkNZRk1UQSAqLwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lORUdDVVJSLCBzTmVnT3JkZXIsIHNpemVvZihzTmVnT3JkZXIpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JQ1VSUkVOQ1ksIHNQb3NPcmRlciwgc2l6ZW9mKHNQb3NPcmRlcikpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX1NDVVJSRU5DWSwgc0N1cnJlbmN5U3ltYm9sLCBzaXplb2Yoc0N1cnJlbmN5U3ltYm9sKSk7CgogICAgICAgIG5Qb3NPcmRlciA9IGF0b2koc1Bvc09yZGVyKTsKICAgICAgICBuTmVnT3JkZXIgPSBhdG9pKHNOZWdPcmRlcik7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVTRV9QQVJBTUVURVI6CiAgICAgICAgLyogU3BlY2lmaWMgdG8gQ1VSUkVOQ1lGTVRBICovCiAgICAgICAgbk5lZ09yZGVyID0gbHBGb3JtYXQtPk5lZ2F0aXZlT3JkZXI7CiAgICAgICAgblBvc09yZGVyID0gbHBGb3JtYXQtPlBvc2l0aXZlT3JkZXI7CiAgICAgICAgc3RyY3B5KHNDdXJyZW5jeVN5bWJvbCwgbHBGb3JtYXQtPmxwQ3VycmVuY3lTeW1ib2wpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVU0VfU1lTVEVNREVGQVVMVDoKICAgICAgICBzeXN0ZW1EZWZhdWx0TENJRCA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CiAgICAgICAgLyogU3BlY2lmaWMgdG8gQ1VSUkVOQ1lGTVRBICovCiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9JTkVHQ1VSUiwgc05lZ09yZGVyLCBzaXplb2Yoc05lZ09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9JQ1VSUkVOQ1ksIHNQb3NPcmRlciwgc2l6ZW9mKHNQb3NPcmRlcikpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfU0NVUlJFTkNZLCBzQ3VycmVuY3lTeW1ib2wsIHNpemVvZihzQ3VycmVuY3lTeW1ib2wpKTsKCiAgICAgICAgblBvc09yZGVyID0gYXRvaShzUG9zT3JkZXIpOwogICAgICAgIG5OZWdPcmRlciA9IGF0b2koc05lZ09yZGVyKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKiBDb25zdHJ1Y3QgYSB0ZW1wb3JhcnkgbnVtYmVyIGZvcm1hdCBzdHJ1Y3R1cmUgKi8KICAgIGlmIChscEZvcm1hdCAhPSBOVUxMKQogICAgewogICAgICAgIG51bWJlckZtdC5OdW1EaWdpdHMgICAgID0gbHBGb3JtYXQtPk51bURpZ2l0czsKICAgICAgICBudW1iZXJGbXQuTGVhZGluZ1plcm8gICA9IGxwRm9ybWF0LT5MZWFkaW5nWmVybzsKICAgICAgICBudW1iZXJGbXQuR3JvdXBpbmcgICAgICA9IGxwRm9ybWF0LT5Hcm91cGluZzsKICAgICAgICBudW1iZXJGbXQuTmVnYXRpdmVPcmRlciA9IDA7CiAgICAgICAgbnVtYmVyRm10LmxwRGVjaW1hbFNlcCA9IGxwRm9ybWF0LT5scERlY2ltYWxTZXA7CiAgICAgICAgbnVtYmVyRm10LmxwVGhvdXNhbmRTZXAgPSBscEZvcm1hdC0+bHBUaG91c2FuZFNlcDsKICAgICAgICBiVmFsaWRGb3JtYXQgPSBUUlVFOwogICAgfQoKICAgIC8qIE1ha2UgYSBjYWxsIHRvIEdldE51bWJlckZvcm1hdEEoKSAqLwogICAgaWYgKCpscHZhbHVlID09ICctJykKICAgIHsKICAgICAgICBiSXNQb3NpdGl2ZSA9IEZBTFNFOwogICAgICAgIHJldFZhbCA9IEdldE51bWJlckZvcm1hdEEobG9jYWxlLDAsbHB2YWx1ZSsxLChiVmFsaWRGb3JtYXQpPyZudW1iZXJGbXQ6TlVMTCxwTnVtYmVyRm9ybWF0ZWQsMTI4KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBiSXNQb3NpdGl2ZSA9IFRSVUU7CiAgICAgICAgcmV0VmFsID0gR2V0TnVtYmVyRm9ybWF0QShsb2NhbGUsMCxscHZhbHVlLChiVmFsaWRGb3JtYXQpPyZudW1iZXJGbXQ6TlVMTCxwTnVtYmVyRm9ybWF0ZWQsMTI4KTsKICAgIH0KCiAgICBpZiAocmV0VmFsID09IDApCiAgICAgICAgcmV0dXJuIDA7CgogICAgLyogY29uc3RydWN0IHRoZSBmb3JtYXR0ZWQgc3RyaW5nICovCiAgICBpZiAoYklzUG9zaXRpdmUpCiAgICB7CiAgICAgICAgc3dpdGNoIChuUG9zT3JkZXIpCiAgICAgICAgewogICAgICAgIGNhc2UgMDogICAvKiBQcmVmaXgsIG5vIHNlcGFyYXRpb24gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6ICAgLyogU3VmZml4LCBubyBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOiAgIC8qIFByZWZpeCwgMSBjaGFyIHNlcGFyYXRpb24gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOiAgIC8qIFN1ZmZpeCwgMSBjaGFyIHNlcGFyYXRpb24gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgZWxzZSAgLyogbmVnYXRpdmUgbnVtYmVyICovCiAgICB7CiAgICAgICAgc3dpdGNoIChuTmVnT3JkZXIpCiAgICAgICAgewogICAgICAgIGNhc2UgMDogICAvKiBmb3JtYXQ6ICgkMS4xKSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIigiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIikiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOiAgIC8qIGZvcm1hdDogLSQxLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOiAgIC8qIGZvcm1hdDogJC0xLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOiAgIC8qIGZvcm1hdDogJDEuMS0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OiAgIC8qIGZvcm1hdDogKDEuMSQpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiKSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDU6ICAgLyogZm9ybWF0OiAtMS4xJCAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDY6ICAgLyogZm9ybWF0OiAxLjEtJCAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDc6ICAgLyogZm9ybWF0OiAxLjEkLSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDg6ICAgLyogZm9ybWF0OiAtMS4xICQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgOTogICAvKiBmb3JtYXQ6IC0kIDEuMSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMDogICAvKiBmb3JtYXQ6IDEuMSAkLSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMTogICAvKiBmb3JtYXQ6ICQgMS4xLSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMjogICAvKiBmb3JtYXQ6ICQgLTEuMSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxMzogICAvKiBmb3JtYXQ6IDEuMS0gJCAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxNDogICAvKiBmb3JtYXQ6ICgkIDEuMSkgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICIoIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiKSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE1OiAgIC8qIGZvcm1hdDogKDEuMSAkKSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIigiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICByZXRWYWwgPSBzdHJsZW4ocERlc3RpbmF0aW9uKSArIDE7CgogICAgaWYgKGNjaEN1cnJlbmN5KQogICAgewogICAgICAgIG1lbWNweSggbHBDdXJyZW5jeVN0ciwgcERlc3RpbmF0aW9uLCBtaW4oY2NoQ3VycmVuY3ksIHJldFZhbCkgKTsKICAgICAgICBpZiAoY2NoQ3VycmVuY3kgPCByZXRWYWwpIHsKICAgICAgICAgICAgcmV0VmFsID0gMDsKICAgICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXRWYWw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0Q3VycmVuY3lGb3JtYXRXCShLRVJORUwzMi5AKQogKi8KSU5UIFdJTkFQSSBHZXRDdXJyZW5jeUZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENXU1RSIGxwdmFsdWUsICAgY29uc3QgQ1VSUkVOQ1lGTVRXICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFdTVFIgbHBDdXJyZW5jeVN0ciwgaW50IGNjaEN1cnJlbmN5KQp7CiAgICBGSVhNRSgiVGhpcyBBUEkgZnVuY3Rpb24gaXMgTk9UIGltcGxlbWVudGVkICFcbiIpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU9MRTJOTFNfQ2hlY2tMb2NhbGUJW2ludGVybl0KICovCnN0YXRpYyBMQ0lEIE9MRTJOTFNfQ2hlY2tMb2NhbGUgKExDSUQgbG9jYWxlKQp7CglpZiAoIWxvY2FsZSkKCXsgbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwoJfQoKCWlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKQogIAl7IHJldHVybiBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJfQoJZWxzZSBpZiAobG9jYWxlID09IExPQ0FMRV9VU0VSX0RFRkFVTFQpCgl7IHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCX0KCWVsc2UKCXsgcmV0dXJuIGxvY2FsZTsKCX0KfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0QQlbS0VSTkVMMzIuQF0KICogTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSB0aW1lCiAqCiAqIEZvcm1hdHMgZGF0ZSBhY2NvcmRpbmcgdG8gZm9ybWF0LCAgb3IgbG9jYWxlIGRlZmF1bHQgaWYgZm9ybWF0IGlzCiAqIE5VTEwuIFRoZSBmb3JtYXQgY29uc2lzdHMgb2YgbGl0ZXJhbCBjaGFyYWN0ZXJzIGFuZCBmaWVsZHMgYXMgZm9sbG93czoKICoKICogaCAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCiAqIGhoIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIEggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgyNC1ob3VyKQogKiBISCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBtICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqIG1tIG1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogcyAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBzcyBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHQgIHRpbWUgbWFya2VyIChBIG9yIFApCiAqIHR0IHRpbWUgbWFya2VyIChBTSwgUE0pCiAqCiAqLwpJTlQgV0lOQVBJCkdldFRpbWVGb3JtYXRBKExDSUQgbG9jYWxlLCAgICAgICAgLyogW2luXSAgKi8KCSAgICAgICBEV09SRCBmbGFncywgICAgICAgIC8qIFtpbl0gICovCgkgICAgICAgY29uc3QgU1lTVEVNVElNRSogeHRpbWUsIC8qIFtpbl0gICovCgkgICAgICAgTFBDU1RSIGZvcm1hdCwgICAgICAvKiBbaW5dICAqLwoJICAgICAgIExQU1RSIHRpbWVzdHIsICAgICAgLyogW291dF0gKi8KCSAgICAgICBJTlQgdGltZWxlbiAgICAgICAgIC8qIFtpbl0gICovKQp7CiAgSU5UIHJldDsKICBMUFdTVFIgd2Zvcm1hdCA9IE5VTEw7CiAgTFBXU1RSIHd0aW1lID0gTlVMTDsgIAoKICBpZiAoZm9ybWF0KQogIHsKICAgIHdmb3JtYXQgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmxlbihmb3JtYXQpICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOwogICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGZvcm1hdCwgLTEsIHdmb3JtYXQsIHN0cmxlbihmb3JtYXQpICsgMSk7CiAgfQoKICBpZiAodGltZXN0ciAmJiB0aW1lbGVuKQogIHsKICAgIHd0aW1lID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAodGltZWxlbiArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKICB9CgogIHJldCA9IEdldFRpbWVGb3JtYXRXKGxvY2FsZSwgZmxhZ3MsIHh0aW1lLCB3Zm9ybWF0LCB3dGltZSwgdGltZWxlbik7CgogIGlmICh3dGltZSkKICB7CiAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgd3RpbWUsIHJldCwgdGltZXN0ciwgdGltZWxlbiwgTlVMTCwgTlVMTCk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB3dGltZSk7CiAgfQoKICBpZiAod2Zvcm1hdCkKICB7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB3Zm9ybWF0KTsKICB9CgogIHJldHVybiByZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0VwlbS0VSTkVMMzIuQF0KICogTWFrZXMgYSBVbmljb2RlIHN0cmluZyBvZiB0aGUgdGltZQogKgogKiBOT1RFOiBTZWUgT0xFX0dldEZvcm1hdFcoKSBmb3IgZnVydGhlciBkb2N1bWVudGF0aW9uCiAqLwpJTlQgV0lOQVBJCkdldFRpbWVGb3JtYXRXKExDSUQgbG9jYWxlLCAgICAgICAgLyogW2luXSAgKi8KCSAgICAgICBEV09SRCBmbGFncywgICAgICAgIC8qIFtpbl0gICovCgkgICAgICAgY29uc3QgU1lTVEVNVElNRSogeHRpbWUsIC8qIFtpbl0gICovCgkgICAgICAgTFBDV1NUUiBmb3JtYXQsICAgICAvKiBbaW5dICAqLwoJICAgICAgIExQV1NUUiB0aW1lc3RyLCAgICAgLyogW291dF0gKi8KCSAgICAgICBJTlQgdGltZWxlbiAgICAgICAgIC8qIFtpbl0gICovKQp7CVdDSEFSIGZvcm1hdF9idWZbNDBdOwoJTFBDV1NUUiB0aGlzZm9ybWF0OwoJU1lTVEVNVElNRSB0OwoJY29uc3QgU1lTVEVNVElNRSogdGhpc3RpbWU7CglMQ0lEIHRoaXNsb2NhbGU9MDsKCURXT1JEIHRoaXNmbGFncz1MT0NBTEVfU1RJTUVGT1JNQVQ7IC8qIHN0YW5kYXJkIHRpbWVmb3JtYXQgKi8KCUlOVCByZXQ7CgoJVFJBQ0UoIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsb2NhbGUsZmxhZ3MsCgl4dGltZSxkZWJ1Z3N0cl93KGZvcm1hdCksdGltZXN0cix0aW1lbGVuKTsKCgl0aGlzbG9jYWxlID0gT0xFMk5MU19DaGVja0xvY2FsZSAoIGxvY2FsZSApOwoKCS8qIGlmIHRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgZm9ybWF0IHdlIHVzZSB0aGUgZGVmYXVsdCAqLwogICAgICAgIC8qIGZvcm1hdCBmb3IgdGhpcyBsb2NhbGUgKi8KCWlmIChmb3JtYXQgPT0gTlVMTCkKCXsKCSAgaWYgKGZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSAgLyogdXNlIHN5c3RlbSBkZWZhdWx0ICovCgkgIHsgCiAgICAgICAgICAgIHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJICB9CgkgIEdldExvY2FsZUluZm9XKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZm9ybWF0X2J1ZiwgNDApOwoJICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKCX0KCWVsc2UKCXsKCSAgLyogaWYgbm9uLW51bGwgZm9ybWF0IGFuZCBMT0NBTEVfTk9VU0VST1ZFUlJJREUgdGhlbiBmYWlsICovIAoJICAvKiBOT1RFOiB0aGlzIGNvdWxkIGJlIGVpdGhlciBpbnZhbGlkIGZsYWdzIG9yIGludmFsaWQgcGFyYW1ldGVyICovCgkgIC8qICB3aW5kb3dzIHNldHMgaXQgdG8gaW52YWxpZCBmbGFncyAqLwoJICBpZiAoZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpCiAgICAgICAgICB7CgkgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfRkxBR1MpOwoJICAgIHJldHVybiAwOwogICAgICAgICAgfQoKICAgICAgICAgIHRoaXNmb3JtYXQgPSBmb3JtYXQ7Cgl9CgoJaWYgKHh0aW1lID09IE5VTEwpIC8qIE5VTEwgbWVhbnMgdXNlIHRoZSBjdXJyZW50IGxvY2FsIHRpbWUgKi8KCXsgR2V0TG9jYWxUaW1lKCZ0KTsKCSAgdGhpc3RpbWUgPSAmdDsKCX0KCWVsc2UKCXsKICAgICAgICAgIC8qIGNoZWNrIHRpbWUgdmFsdWVzICovCiAgICAgICAgICBpZigoeHRpbWUtPndIb3VyID4gMjQpIHx8ICh4dGltZS0+d01pbnV0ZSA+PSA2MCkgfHwgKHh0aW1lLT53U2Vjb25kID49IDYwKSkKICAgICAgICAgIHsKICAgICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CgogICAgICAgICAgdGhpc3RpbWUgPSB4dGltZTsKCX0KCglyZXQgPSBPTEVfR2V0Rm9ybWF0Vyh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZsYWdzLCB0aGlzdGltZSwgdGhpc2Zvcm1hdCwKICAJCQkgdGltZXN0ciwgdGltZWxlbiwgMCk7CglyZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFbnVtQ2FsZW5kYXJJbmZvQQlbS0VSTkVMMzIuQF0KICovCkJPT0wgV0lOQVBJIEVudW1DYWxlbmRhckluZm9BKAoJQ0FMSU5GT19FTlVNUFJPQ0EgY2FsaW5mb3Byb2MsTENJRCBsb2NhbGUsQ0FMSUQgY2FsZW5kYXIsQ0FMVFlQRSBjYWx0eXBlCikgewoJRklYTUUoIiglcCwweCUwNGx4LDB4JTA4bHgsMHglMDhseCksc3R1YiFcbiIsY2FsaW5mb3Byb2MsbG9jYWxlLGNhbGVuZGFyLGNhbHR5cGUpOwoJcmV0dXJuIEZBTFNFOwp9Cg==