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+d0RheU9mV2VlayA+IDYpIHx8ICh4dGltZS0+d01vbnRoID4gMTIpKQogICAgICAgIHsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgoJLyogU2lsZW50bHkgY29ycmVjdCB3RGF5T2ZXZWVrIGJ5IHRyYW5zZm9ybWluZyB0byBGaWxlVGltZSBhbmQgYmFjayBhZ2FpbiAqLwoJcmVzPVN5c3RlbVRpbWVUb0ZpbGVUaW1lKHh0aW1lLCZmdCk7CgoJLyogQ2hlY2sgeWVhcig/KS9tb250aCBhbmQgZGF0ZSBmb3IgcmFuZ2UgYW5kIHNldCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiAgb24gZXJyb3IgKi8KCWlmKCFyZXMpCgl7CgkgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCSAgICByZXR1cm4gMDsKCX0KCUZpbGVUaW1lVG9TeXN0ZW1UaW1lKCZmdCwmdCk7CgkKICAgIH07CiAgICB0aGlzdGltZSA9ICZ0OwogICAgCiAgICBpZiAoZm9ybWF0ID09IE5VTEwpCiAgICB7CglHZXRMb2NhbGVJbmZvVyh0aGlzbG9jYWxlLCAoKGZsYWdzJkRBVEVfTE9OR0RBVEUpCgkJCQkgICAgPyBMT0NBTEVfU0xPTkdEQVRFCgkJCQkgICAgOiBMT0NBTEVfU1NIT1JUREFURSksCgkJICAgICAgIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKS9zaXplb2YoKmZvcm1hdF9idWYpKTsKCXRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwogICAgfSBlbHNlCiAgICB7Cgl0aGlzZm9ybWF0ID0gZm9ybWF0OwogICAgfTsKICAgIAogICAgCiAgICByZXQgPSBPTEVfR2V0Rm9ybWF0Vyh0aGlzbG9jYWxlLCBmbGFncywgMCwgdGhpc3RpbWUsIHRoaXNmb3JtYXQsCgkJCSBkYXRlLCBkYXRlbGVuLCAxKTsKICAgIAogICAgCiAgICBUUkFDRSgiR2V0RGF0ZUZvcm1hdFcoKSByZXR1cm5pbmcgJWQsIHdpdGggZGF0YT0lc1xuIiwKCSAgcmV0LCBkZWJ1Z3N0cl93KGRhdGUpKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzQQkoS0VSTkVMMzIuQCkKICovCkJPT0wgV0lOQVBJIEVudW1EYXRlRm9ybWF0c0EoCiAgREFURUZNVF9FTlVNUFJPQ0EgbHBEYXRlRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCAgRFdPUkQgZHdGbGFncykKewogIExDSUQgTG9jID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CiAgaWYoIWxwRGF0ZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogIHN3aXRjaCggTG9jICkKIHsKCiAgIGNhc2UgMHgwMDAwMDQwNzogIC8qIChMb2MsImRlX0RFIikgKi8KICAgewogICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk0ueXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NTS55eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsZC4gTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC4gTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC4gTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICAgfQogICB9CgogICBjYXNlIDB4MDAwMDA0MGM6ICAvKiAoTG9jLCJmcl9GUiIpICovCiAgIHsKICAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQuTU0ueXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLU1NLXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQgZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTSB5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgIH0KICAgfQoKICAgY2FzZSAweDAwMDAwYzBjOiAgLyogKExvYywiZnJfQ0EiKSAqLwogICB7CiAgICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXktTU0tZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLU1NLXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eSBNTSBkZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgICB9CiAgIH0KCiAgIGNhc2UgMHgwMDAwMDgwOTogIC8qIChMb2MsImVuX1VLIikgKi8KICB7CiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk0ueXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAwYzA5OiAgLyogKExvYywiZW5fQVUiKSAqLwogIHsKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMTAwOTogIC8qIChMb2MsImVuX0NBIikgKi8KICB7CiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS1NTS1kZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTS9kZC95eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLU1NTS15eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NTU0gZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDE0MDk6ICAvKiAoTG9jLCJlbl9OWiIpICovCiAgewogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTU0ueXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDE4MDk6ICAvKiAoTG9jLCJlbl9JRSIpICovCiAgewogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMWMwOTogIC8qIChMb2MsImVuX1pBIikgKi8KICB7CiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS9NTS9kZCIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAyMDA5OiAgLyogKExvYywiZW5fSk0iKSAqLwogIHsKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxNTU1NIGRkLHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGRkLHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGRkIE1NTU0seXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0seXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDI4MDk6ICAvKiAoTG9jLCJlbl9CWiIpICovCiAgIGNhc2UgMHgwMDAwMmMwOTogIC8qIChMb2MsImVuX1RUIikgKi8KICB7CiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsZGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGRlZmF1bHQ6ICAvKiBkZWZhdWx0IHRvIFVTIEVuZ2xpc2ggImVuX1VTIiAqLwogIHsKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZC95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTS9kL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NL2RkL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTS9kZC95eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS9NTS9kZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQtTU1NLXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIE1NTU0gZGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGRkLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgZGQgTU1NTSwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQogfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0c1cJKEtFUk5FTDMyLkApCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNXKAogIERBVEVGTVRfRU5VTVBST0NXIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FKCIoJXAsICVsZCwgJWxkKTogc3R1YlxuIiwgbHBEYXRlRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzQQkoS0VSTkVMMzIuQCkKICovCkJPT0wgV0lOQVBJIEVudW1UaW1lRm9ybWF0c0EoCiAgVElNRUZNVF9FTlVNUFJPQ0EgbHBUaW1lRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgTENJRCBMb2MgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKICBpZighbHBUaW1lRm10RW51bVByb2MpCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICBpZihkd0ZsYWdzKQogICAgewogICAgICBGSVhNRSgiVW5rbm93biB0aW1lIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CiAgICB9CgogIHN3aXRjaCggTG9jICkKIHsKICAgY2FzZSAweDAwMDAwNDA3OiAgLyogKExvYywiZGVfREUiKSAqLwogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhILm1tIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSC5tbSIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSC5tbSdVaHInIikpIHJldHVybiBUUlVFOwogICAgcmV0dXJuIFRSVUU7CiAgIH0KCiAgIGNhc2UgMHgwMDAwMDQwYzogIC8qIChMb2MsImZyX0ZSIikgKi8KICAgY2FzZSAweDAwMDAwYzBjOiAgLyogKExvYywiZnJfQ0EiKSAqLwogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW0iKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISC5tbSIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEgnaCdtbSIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CgogICBjYXNlIDB4MDAwMDA4MDk6ICAvKiAoTG9jLCJlbl9VSyIpICovCiAgIGNhc2UgMHgwMDAwMGMwOTogIC8qIChMb2MsImVuX0FVIikgKi8KICAgY2FzZSAweDAwMDAxNDA5OiAgLyogKExvYywiZW5fTloiKSAqLwogICBjYXNlIDB4MDAwMDE4MDk6ICAvKiAoTG9jLCJlbl9JRSIpICovCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfQoKICAgY2FzZSAweDAwMDAxYzA5OiAgLyogKExvYywiZW5fWkEiKSAqLwogICBjYXNlIDB4MDAwMDI4MDk6ICAvKiAoTG9jLCJlbl9CWiIpICovCiAgIGNhc2UgMHgwMDAwMmMwOTogIC8qIChMb2MsImVuX1RUIikgKi8KICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CgogICBkZWZhdWx0OiAgLyogZGVmYXVsdCB0byBVUyBzdHlsZSAiZW5fVVMiICovCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaGg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgcmV0dXJuIFRSVUU7CiAgIH0KIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtVGltZUZvcm1hdHNXCShLRVJORUwzMi5AKQogKi8KQk9PTCBXSU5BUEkgRW51bVRpbWVGb3JtYXRzVygKICBUSU1FRk1UX0VOVU1QUk9DVyBscFRpbWVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRSgiKCVwLCVsZCwlbGQpOiBzdHViXG4iLCBscFRpbWVGbXRFbnVtUHJvYywgTG9jYWxlLCBkd0ZsYWdzKTsKICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQganVzdCBsb2NhbGx5ICEKICogIERlc2NyaXB0aW9uOiBJbnZlcnRzIGEgc3RyaW5nLgogKi8Kc3RhdGljIHZvaWQgT0xFX0ludmVydFN0cmluZyhjaGFyKiBzdHJpbmcpCnsKICAgIGNoYXIgICAgc1RtcEFycmF5WzEyOF07CiAgICBJTlQgICAgIGNvdW50ZXIsIGkgPSAwOwoKICAgIGZvciAoY291bnRlciA9IHN0cmxlbihzdHJpbmcpOyBjb3VudGVyID4gMDsgY291bnRlci0tKQogICAgewogICAgICAgIG1lbWNweShzVG1wQXJyYXkgKyBpLCBzdHJpbmcgKyBjb3VudGVyLTEsIDEpOwogICAgICAgIGkrKzsKICAgIH0KICAgIG1lbWNweShzVG1wQXJyYXkgKyBpLCAiXDAiLCAxKTsKICAgIHN0cmNweShzdHJpbmcsIHNUbXBBcnJheSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBqdXN0IGxvY2FsbHkgIQogKiAgRGVzY3JpcHRpb246IFRlc3QgaWYgdGhlIGdpdmVuIHN0cmluZyAocHNOdW1iZXIpIGlzIHZhbGlkIG9yIG5vdC4KICogICAgICAgICAgICAgICBUaGUgdmFsaWQgY2hhcmFjdGVycyBhcmUgdGhlIGZvbGxvd2luZzoKICogICAgICAgICAgICAgICAtIENoYXJhY3RlcnMgJzAnIHRocm91Z2ggJzknLgogKiAgICAgICAgICAgICAgIC0gT25lIGRlY2ltYWwgcG9pbnQgKGRvdCkgaWYgdGhlIG51bWJlciBpcyBhIGZsb2F0aW5nLXBvaW50IHZhbHVlLgogKiAgICAgICAgICAgICAgIC0gQSBtaW51cyBzaWduIGluIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaWYgdGhlIG51bWJlciBpcwogKiAgICAgICAgICAgICAgICAgYSBuZWdhdGl2ZSB2YWx1ZS4KICogICAgICAgICAgICAgIElmIHRoZSBmdW5jdGlvbiBzdWNjZWVkcywgcHNCZWZvcmUvcHNBZnRlciB3aWxsIHBvaW50IHRvIHRoZSBzdHJpbmcKICogICAgICAgICAgICAgIG9uIHRoZSByaWdodC9sZWZ0IG9mIHRoZSBkZWNpbWFsIHN5bWJvbC4gcGJOZWdhdGl2ZSBpbmRpY2F0ZXMgaWYgdGhlCiAqICAgICAgICAgICAgICBudW1iZXIgaXMgbmVnYXRpdmUuCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXROdW1iZXJDb21wb25lbnRzKGNoYXIqIHBJbnB1dCwgY2hhciogcHNCZWZvcmUsIGNoYXIqIHBzQWZ0ZXIsIEJPT0wqIHBiTmVnYXRpdmUpCnsKY2hhcglzTnVtYmVyU2V0W10gPSAiMDEyMzQ1Njc4OSI7CkJPT0wJYkluRGVjaW1hbCA9IEZBTFNFOwoKCS8qIFRlc3QgaWYgd2UgZG8gaGF2ZSBhIG1pbnVzIHNpZ24gKi8KCWlmICggKnBJbnB1dCA9PSAnLScgKQoJewoJCSpwYk5lZ2F0aXZlID0gVFJVRTsKCQlwSW5wdXQrKzsgLyogSnVtcCB0byB0aGUgbmV4dCBjaGFyYWN0ZXIuICovCgl9CgoJd2hpbGUoKnBJbnB1dCAhPSAnXDAnKQoJewoJCS8qIERvIHdlIGhhdmUgYSB2YWxpZCBudW1lcmljIGNoYXJhY3RlciAqLwoJCWlmICggc3RyY2hyKHNOdW1iZXJTZXQsICpwSW5wdXQpICE9IE5VTEwgKQoJCXsKCQkJaWYgKGJJbkRlY2ltYWwgPT0gVFJVRSkKICAgICAgICAgICAgICAgICpwc0FmdGVyKysgPSAqcElucHV0OwoJCQllbHNlCiAgICAgICAgICAgICAgICAqcHNCZWZvcmUrKyA9ICpwSW5wdXQ7CgkJfQoJCWVsc2UKCQl7CgkJCS8qIElzIHRoaXMgYSBkZWNpbWFsIHBvaW50IChkb3QpICovCgkJCWlmICggKnBJbnB1dCA9PSAnLicgKQoJCQl7CgkJCQkvKiBJcyBpdCB0aGUgZmlyc3QgdGltZSB3ZSBmaW5kIGl0ICovCgkJCQlpZiAoKGJJbkRlY2ltYWwgPT0gRkFMU0UpKQoJCQkJCWJJbkRlY2ltYWwgPSBUUlVFOwoJCQkJZWxzZQoJCQkJCXJldHVybiAtMTsgLyogRVJST1I6IEludmFsaWQgcGFyYW1ldGVyICovCgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkvKiBJdCdzIG5laXRoZXIgYSBudW1lcmljIGNoYXJhY3Rlciwgbm9yIGEgZGVjaW1hbCBwb2ludC4KCQkJCSAqIFRodXMsIHJldHVybiBhbiBlcnJvci4KICAgICAgICAgICAgICAgICAqLwoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQogICAgICAgIHBJbnB1dCsrOwoJfQoKCS8qIEFkZCBhbiBFbmQgb2YgTGluZSBjaGFyYWN0ZXIgdG8gdGhlIG91dHB1dCBidWZmZXJzICovCgkqcHNCZWZvcmUgPSAnXDAnOwoJKnBzQWZ0ZXIgPSAnXDAnOwoKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBqdXN0IGxvY2FsbHkgIQogKiAgRGVzY3JpcHRpb246IEEgbnVtYmVyIGNvdWxkIGJlIGZvcm1hdHRlZCB1c2luZyBkaWZmZXJlbnQgbnVtYmVycwogKiAgICAgICAgICAgICAgIG9mICJkaWdpdHMgaW4gZ3JvdXAiIChleGFtcGxlOiA0OzM7MjswKS4KICogICAgICAgICAgICAgICBUaGUgZmlyc3QgcGFyYW1ldGVyIG9mIHRoaXMgZnVuY3Rpb24gaXMgYW4gYXJyYXkKICogICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBydWxlIHRvIGJlIHVzZWQuIEl0cyBmb3JtYXQgaXMgdGhlIGZvbGxvd2luZzoKICogICAgICAgICAgICAgICB8TkRHfERHMXxERzJ8Li4ufDB8CiAqICAgICAgICAgICAgICAgd2hlcmUgTkRHIGlzIHRoZSBudW1iZXIgb2YgdXNlZCAiZGlnaXRzIGluIGdyb3VwIiBhbmQgREcxLCBERzIsCiAqICAgICAgICAgICAgICAgYXJlIHRoZSBjb3JyZXNwb25kaW5nICJkaWdpdHMgaW4gZ3JvdXAiLgogKiAgICAgICAgICAgICAgIFRodXMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZ3JvdXBpbmcgdmFsdWUgaW4gdGhlIGFycmF5CiAqICAgICAgICAgICAgICAgcG9pbnRlZCBieSB0aGUgc2Vjb25kIHBhcmFtZXRlci4KICovCnN0YXRpYyBJTlQgT0xFX0dldEdyb3VwaW5nKGNoYXIqIHNSdWxlLCBJTlQgaW5kZXgpCnsKICAgIGNoYXIgICAgc0RhdGFbMl0sIHNSdWxlU2l6ZVsyXTsKICAgIElOVCAgICAgbkRhdGEsIG5SdWxlU2l6ZTsKCiAgICBtZW1jcHkoc1J1bGVTaXplLCBzUnVsZSwgMSk7CiAgICBtZW1jcHkoc1J1bGVTaXplKzEsICJcMCIsIDEpOwogICAgblJ1bGVTaXplID0gYXRvaShzUnVsZVNpemUpOwoKICAgIGlmIChpbmRleCA+IDAgJiYgaW5kZXggPCBuUnVsZVNpemUpCiAgICB7CiAgICAgICAgbWVtY3B5KHNEYXRhLCBzUnVsZStpbmRleCwgMSk7CiAgICAgICAgbWVtY3B5KHNEYXRhKzEsICJcMCIsIDEpOwogICAgICAgIG5EYXRhID0gYXRvaShzRGF0YSk7CiAgICB9CgogICAgZWxzZQogICAgewogICAgICAgIG1lbWNweShzRGF0YSwgc1J1bGUrblJ1bGVTaXplLTEsIDEpOwogICAgICAgIG1lbWNweShzRGF0YSsxLCAiXDAiLCAxKTsKICAgICAgICBuRGF0YSA9IGF0b2koc0RhdGEpOwogICAgfQoKICAgIHJldHVybiBuRGF0YTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXRBCShLRVJORUwzMi5AKQogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRBKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDU1RSIGxwdmFsdWUsICAgY29uc3QgTlVNQkVSRk1UQSAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hOdW1iZXIpCnsKICAgIGNoYXIgICBzTnVtYmVyRGlnaXRzWzNdLCBzRGVjaW1hbFN5bWJvbFs1XSwgc0RpZ2l0c0luR3JvdXBbMTFdLCBzRGlnaXRHcm91cFN5bWJvbFs1XSwgc0lMWmVyb1syXTsKICAgIElOVCAgICBuTnVtYmVyRGlnaXRzLCBuTnVtYmVyRGVjaW1hbCwgaSwgaiwgbkNvdW50ZXIsIG5TdGVwLCBuUnVsZUluZGV4LCBuR3JvdXBpbmcsIG5EaWdpdHMsIHJldFZhbCwgbkxaOwogICAgY2hhciAgIHNOdW1iZXJbMTI4XSwgc0Rlc3RpbmF0aW9uWzEyOF0sIHNEaWdpdHNBZnRlckRlY2ltYWxbMTBdLCBzRGlnaXRzQmVmb3JlRGVjaW1hbFsxMjhdOwogICAgY2hhciAgIHNSdWxlWzEwXSwgc1NlbWlDb2x1bW5bXT0iOyIsIHNCdWZmZXJbNV0sIHNOZWdOdW1iZXJbMl07CiAgICBjaGFyICAgKnBTdHIgPSBOVUxMLCAqcFRtcFN0ciA9IE5VTEw7CiAgICBMQ0lEICAgc3lzdGVtRGVmYXVsdExDSUQ7CiAgICBCT09MICAgYk5lZ2F0aXZlID0gRkFMU0U7CiAgICBlbnVtICAgT3BlcmF0aW9ucwogICAgewogICAgICAgIFVTRV9QQVJBTUVURVIsCiAgICAgICAgVVNFX0xPQ0FMRUlORk8sCiAgICAgICAgVVNFX1NZU1RFTURFRkFVTFQsCiAgICAgICAgUkVUVVJOX0VSUk9SCiAgICB9IHVzZWRfb3BlcmF0aW9uOwoKICAgIHN0cm5jcHkoc051bWJlciwgbHB2YWx1ZSwgMTI4KTsKICAgIHNOdW1iZXJbMTI3XSA9ICdcMCc7CgogICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBpbnB1dCBzdHJpbmcsIGdldCB0aGUgbnVtYmVyCiAgICAgKiBvZiBkaWdpdHMgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGVjaW1hbCBzeW1ib2wsIGFuZCBjaGVjawogICAgICogaWYgdGhpcyBpcyBhIG5lZ2F0aXZlIG51bWJlci4KICAgICAqLwogICAgaWYgKCBPTEVfR2V0TnVtYmVyQ29tcG9uZW50cyhzTnVtYmVyLCBzRGlnaXRzQmVmb3JlRGVjaW1hbCwgc0RpZ2l0c0FmdGVyRGVjaW1hbCwgJmJOZWdhdGl2ZSkgIT0gLTEpCiAgICB7CiAgICAgICAgbk51bWJlckRlY2ltYWwgPSBzdHJsZW4oc0RpZ2l0c0JlZm9yZURlY2ltYWwpOwogICAgICAgIG5EaWdpdHMgPSBzdHJsZW4oc0RpZ2l0c0FmdGVyRGVjaW1hbCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKiBXaGljaCBzb3VyY2Ugd2lsbCB3ZSB1c2UgdG8gZm9ybWF0IHRoZSBzdHJpbmcgKi8KICAgIHVzZWRfb3BlcmF0aW9uID0gUkVUVVJOX0VSUk9SOwogICAgaWYgKGxwRm9ybWF0ICE9IE5VTEwpCiAgICB7CiAgICAgICAgaWYgKGR3ZmxhZ3MgPT0gMCkKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfUEFSQU1FVEVSOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmIChkd2ZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9TWVNURU1ERUZBVUxUOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfTE9DQUxFSU5GTzsKICAgIH0KCiAgICAvKiBMb2FkIHRoZSBmaWVsZHMgd2UgbmVlZCAqLwogICAgc3dpdGNoKHVzZWRfb3BlcmF0aW9uKQogICAgewogICAgY2FzZSBVU0VfTE9DQUxFSU5GTzoKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JRElHSVRTLCBzTnVtYmVyRGlnaXRzLCBzaXplb2Yoc051bWJlckRpZ2l0cykpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX1NERUNJTUFMLCBzRGVjaW1hbFN5bWJvbCwgc2l6ZW9mKHNEZWNpbWFsU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU0dST1VQSU5HLCBzRGlnaXRzSW5Hcm91cCwgc2l6ZW9mKHNEaWdpdHNJbkdyb3VwKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU1RIT1VTQU5ELCBzRGlnaXRHcm91cFN5bWJvbCwgc2l6ZW9mKHNEaWdpdEdyb3VwU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSUxaRVJPLCBzSUxaZXJvLCBzaXplb2Yoc0lMWmVybykpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lORUdOVU1CRVIsIHNOZWdOdW1iZXIsIHNpemVvZihzTmVnTnVtYmVyKSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVTRV9QQVJBTUVURVI6CiAgICAgICAgc3ByaW50ZihzTnVtYmVyRGlnaXRzLCAiJWQiLGxwRm9ybWF0LT5OdW1EaWdpdHMpOwogICAgICAgIHN0cmNweShzRGVjaW1hbFN5bWJvbCwgbHBGb3JtYXQtPmxwRGVjaW1hbFNlcCk7CiAgICAgICAgc3ByaW50ZihzRGlnaXRzSW5Hcm91cCwgIiVkOzAiLGxwRm9ybWF0LT5Hcm91cGluZyk7CiAgICAgICAgLyogV2luOTUtV2luTUUgb25seSBhbGxvdyAwLTkgZm9yIGdyb3VwaW5nLCBubyBtYXR0ZXIgd2hhdCBNU0ROIHNheXMuICovCiAgICAgICAgc3RyY3B5KHNEaWdpdEdyb3VwU3ltYm9sLCBscEZvcm1hdC0+bHBUaG91c2FuZFNlcCk7CiAgICAgICAgc3ByaW50ZihzSUxaZXJvLCAiJWQiLGxwRm9ybWF0LT5MZWFkaW5nWmVybyk7CiAgICAgICAgc3ByaW50ZihzTmVnTnVtYmVyLCAiJWQiLGxwRm9ybWF0LT5OZWdhdGl2ZU9yZGVyKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVVNFX1NZU1RFTURFRkFVTFQ6CiAgICAgICAgc3lzdGVtRGVmYXVsdExDSUQgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSURJR0lUUywgc051bWJlckRpZ2l0cywgc2l6ZW9mKHNOdW1iZXJEaWdpdHMpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX1NERUNJTUFMLCBzRGVjaW1hbFN5bWJvbCwgc2l6ZW9mKHNEZWNpbWFsU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TR1JPVVBJTkcsIHNEaWdpdHNJbkdyb3VwLCBzaXplb2Yoc0RpZ2l0c0luR3JvdXApKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX1NUSE9VU0FORCwgc0RpZ2l0R3JvdXBTeW1ib2wsIHNpemVvZihzRGlnaXRHcm91cFN5bWJvbCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSUxaRVJPLCBzSUxaZXJvLCBzaXplb2Yoc0lMWmVybykpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSU5FR05VTUJFUiwgc05lZ051bWJlciwgc2l6ZW9mKHNOZWdOdW1iZXIpKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBuTnVtYmVyRGlnaXRzID0gYXRvaShzTnVtYmVyRGlnaXRzKTsKCiAgICAvKiBSZW1vdmUgdGhlICI7IiAqLwogICAgaT0wOwogICAgaiA9IDE7CiAgICBmb3IgKG5Db3VudGVyPTA7IG5Db3VudGVyPHN0cmxlbihzRGlnaXRzSW5Hcm91cCk7IG5Db3VudGVyKyspCiAgICB7CiAgICAgICAgaWYgKCBtZW1jbXAoc0RpZ2l0c0luR3JvdXAgKyBuQ291bnRlciwgc1NlbWlDb2x1bW4sIDEpICE9IDAgKQogICAgICAgIHsKICAgICAgICAgICAgbWVtY3B5KHNSdWxlICsgaiwgc0RpZ2l0c0luR3JvdXAgKyBuQ291bnRlciwgMSk7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgaisrOwogICAgICAgIH0KICAgIH0KICAgIHNwcmludGYoc0J1ZmZlciwgIiVkIiwgaSk7CiAgICBtZW1jcHkoc1J1bGUsIHNCdWZmZXIsIDEpOyAvKiBOdW1iZXIgb2YgZGlnaXRzIGluIHRoZSBncm91cHMgKCB1c2VkIGJ5IE9MRV9HZXRHcm91cGluZygpICkgKi8KICAgIG1lbWNweShzUnVsZSArIGosICJcMCIsIDEpOwoKICAgIC8qIEZpcnN0LCBmb3JtYXQgdGhlIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwuICovCiAgICBpZiAoKG5OdW1iZXJEZWNpbWFsPjApICYmIChhdG9pKHNEaWdpdHNCZWZvcmVEZWNpbWFsKSAhPSAwKSkKICAgIHsKICAgICAgICAvKiBXb3JraW5nIG9uIGFuIGludmVydGVkIHN0cmluZyBpcyBlYXNpZXIgISAqLwogICAgICAgIE9MRV9JbnZlcnRTdHJpbmcoc0RpZ2l0c0JlZm9yZURlY2ltYWwpOwoKICAgICAgICBuU3RlcCA9IG5Db3VudGVyID0gaSA9IGogPSAwOwogICAgICAgIG5SdWxlSW5kZXggPSAxOwogICAgICAgIG5Hcm91cGluZyA9IE9MRV9HZXRHcm91cGluZyhzUnVsZSwgblJ1bGVJbmRleCk7CiAgICAgICAgaWYgKG5Hcm91cGluZyA9PSAwKSAvKiBJZiB0aGUgZmlyc3QgZ3JvdXBpbmcgaXMgemVybyAqLwogICAgICAgICAgICBuR3JvdXBpbmcgPSBuTnVtYmVyRGVjaW1hbDsgLyogRG9uJ3QgZG8gZ3JvdXBpbmcgKi8KCiAgICAgICAgLyogSGVyZSwgd2Ugd2lsbCBsb29wIHVudGlsIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KICAgICAgICAgKiBBbiBpbnRlcm5hbCBjb3VudGVyIChqKSBpcyB1c2VkIGluIG9yZGVyIHRvIGtub3cgd2hlbiB0bwogICAgICAgICAqIGluc2VydCB0aGUgImRpZ2l0IGdyb3VwIHN5bWJvbCIuCiAgICAgICAgICovCiAgICAgICAgd2hpbGUgKG5OdW1iZXJEZWNpbWFsID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGkgPSBuQ291bnRlciArIG5TdGVwOwogICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uICsgaSwgc0RpZ2l0c0JlZm9yZURlY2ltYWwgKyBuQ291bnRlciwgMSk7CiAgICAgICAgICAgIG5Db3VudGVyKys7CiAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgaWYgKGogPj0gbkdyb3VwaW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBqID0gMDsKICAgICAgICAgICAgICAgIGlmIChuUnVsZUluZGV4IDwgc1J1bGVbMF0pCiAgICAgICAgICAgICAgICAgICAgblJ1bGVJbmRleCsrOwogICAgICAgICAgICAgICAgbkdyb3VwaW5nID0gT0xFX0dldEdyb3VwaW5nKHNSdWxlLCBuUnVsZUluZGV4KTsKICAgICAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24gKyBpKzEsIHNEaWdpdEdyb3VwU3ltYm9sLCBzdHJsZW4oc0RpZ2l0R3JvdXBTeW1ib2wpKTsKICAgICAgICAgICAgICAgIG5TdGVwKz0gc3RybGVuKHNEaWdpdEdyb3VwU3ltYm9sKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbk51bWJlckRlY2ltYWwtLTsKICAgICAgICB9CgogICAgICAgIG1lbWNweShzRGVzdGluYXRpb24gKyBpKzEsICJcMCIsIDEpOwogICAgICAgIC8qIEdldCB0aGUgc3RyaW5nIGluIHRoZSByaWdodCBvcmRlciAhICovCiAgICAgICAgT0xFX0ludmVydFN0cmluZyhzRGVzdGluYXRpb24pOwogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgIG5MWiA9IGF0b2koc0lMWmVybyk7CiAgICAgICAgaWYgKG5MWiAhPSAwKQogICAgICAgIHsKICAgICAgICAgICAgLyogVXNlIDAueHh4IGluc3RlYWQgb2YgLnh4eCAqLwogICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uLCAiMCIsIDEpOwogICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uKzEsICJcMCIsIDEpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24sICJcMCIsIDEpOwoKICAgICB9CgogICAgLyogU2Vjb25kLCBmb3JtYXQgdGhlIGRpZ2l0cyBhZnRlciB0aGUgZGVjaW1hbC4gKi8KICAgIGogPSAwOwogICAgbkNvdW50ZXIgPSBuTnVtYmVyRGlnaXRzOwogICAgaWYgKCAobkRpZ2l0cz4wKSAmJiAocFN0ciA9IHN0cnN0ciAoc051bWJlciwgIi4iKSkgKQogICAgewogICAgICAgIGkgPSBzdHJsZW4oc051bWJlcikgLSBzdHJsZW4ocFN0cikgKyAxOwogICAgICAgIHN0cm5jcHkgKCBzRGlnaXRzQWZ0ZXJEZWNpbWFsLCBzTnVtYmVyICsgaSwgbk51bWJlckRpZ2l0cyk7CiAgICAgICAgaiA9IHN0cmxlbihzRGlnaXRzQWZ0ZXJEZWNpbWFsKTsKICAgICAgICBpZiAoaiA8IG5OdW1iZXJEaWdpdHMpCiAgICAgICAgICAgIG5Db3VudGVyID0gbk51bWJlckRpZ2l0cy1qOwogICAgfQogICAgZm9yIChpPTA7aTxuQ291bnRlcjtpKyspCiAgICAgICAgIG1lbWNweShzRGlnaXRzQWZ0ZXJEZWNpbWFsK2kraiwgIjAiLCAxKTsKICAgIG1lbWNweShzRGlnaXRzQWZ0ZXJEZWNpbWFsICsgbk51bWJlckRpZ2l0cywgIlwwIiwgMSk7CgogICAgaSA9IHN0cmxlbihzRGVzdGluYXRpb24pOwogICAgaiA9IHN0cmxlbihzRGlnaXRzQWZ0ZXJEZWNpbWFsKTsKICAgIC8qIEZpbmFsbHksIGNvbnN0cnVjdCB0aGUgcmVzdWx0aW5nIGZvcm1hdHRlZCBzdHJpbmcuICovCgogICAgZm9yIChuQ291bnRlcj0wOyBuQ291bnRlcjxpOyBuQ291bnRlcisrKQogICAgICAgIG1lbWNweShzTnVtYmVyICsgbkNvdW50ZXIsIHNEZXN0aW5hdGlvbiArIG5Db3VudGVyLCAxKTsKCiAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyLCBzRGVjaW1hbFN5bWJvbCwgc3RybGVuKHNEZWNpbWFsU3ltYm9sKSk7CgogICAgZm9yIChpPTA7IGk8ajsgaSsrKQogICAgICAgIG1lbWNweShzTnVtYmVyICsgbkNvdW50ZXIraStzdHJsZW4oc0RlY2ltYWxTeW1ib2wpLCBzRGlnaXRzQWZ0ZXJEZWNpbWFsICsgaSwgMSk7CiAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyK2krIChpID8gc3RybGVuKHNEZWNpbWFsU3ltYm9sKSA6IDApLCAiXDAiLCAxKTsKCiAgICAvKiBJcyBpdCBhIG5lZ2F0aXZlIG51bWJlciAqLwogICAgaWYgKGJOZWdhdGl2ZSA9PSBUUlVFKQogICAgewogICAgICAgIGkgPSBhdG9pKHNOZWdOdW1iZXIpOwogICAgICAgIHBTdHIgPSBzRGVzdGluYXRpb247CiAgICAgICAgcFRtcFN0ciA9IHNOdW1iZXI7CiAgICAgICAgc3dpdGNoIChpKQogICAgICAgIHsKICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICpwU3RyKysgPSAnKCc7CiAgICAgICAgICAgIHdoaWxlICgqc051bWJlciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICAqcFN0cisrID0gJyknOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICpwU3RyKysgPSAnLSc7CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICpwU3RyKysgPSAnLSc7CiAgICAgICAgICAgICpwU3RyKysgPSAnICc7CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICAqcFN0cisrID0gJy0nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICAqcFN0cisrID0gJyAnOwogICAgICAgICAgICAqcFN0cisrID0gJy0nOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgICAgIHN0cmNweShzRGVzdGluYXRpb24sIHNOdW1iZXIpOwoKICAgIC8qIElmIGNjaE51bWJlciBpcyB6ZXJvLCB0aGVuIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBvciBjaGFyYWN0ZXJzCiAgICAgKiByZXF1aXJlZCB0byBob2xkIHRoZSBmb3JtYXR0ZWQgbnVtYmVyIHN0cmluZwogICAgICovCiAgICByZXRWYWwgPSBzdHJsZW4oc0Rlc3RpbmF0aW9uKSArIDE7CiAgICBpZiAoY2NoTnVtYmVyIT0wKQogICAgewogICAgICAgIG1lbWNweSggbHBOdW1iZXJTdHIsIHNEZXN0aW5hdGlvbiwgbWluKGNjaE51bWJlciwgcmV0VmFsKSApOwogICAgICAgIGlmIChjY2hOdW1iZXIgPCByZXRWYWwpIHsKICAgICAgICAgICAgcmV0VmFsID0gMDsKICAgICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiByZXRWYWw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0VwkoS0VSTkVMMzIuQCkKICovCklOVCBXSU5BUEkgR2V0TnVtYmVyRm9ybWF0VyhMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1dTVFIgbHB2YWx1ZSwgIGNvbnN0IE5VTUJFUkZNVFcgKiBscEZvcm1hdCwKCQkJICAgICAgIExQV1NUUiBscE51bWJlclN0ciwgaW50IGNjaE51bWJlcikKewogRklYTUUoIiVzOiBzdHViLCBubyByZWZvcm1hdHRpbmcgZG9uZVxuIixkZWJ1Z3N0cl93KGxwdmFsdWUpKTsKCiBsc3RyY3B5blcoIGxwTnVtYmVyU3RyLCBscHZhbHVlLCBjY2hOdW1iZXIgKTsKIHJldHVybiBjY2hOdW1iZXI/IHN0cmxlblcoIGxwTnVtYmVyU3RyICkgOiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldEN1cnJlbmN5Rm9ybWF0QQkoS0VSTkVMMzIuQCkKICovCklOVCBXSU5BUEkgR2V0Q3VycmVuY3lGb3JtYXRBKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDU1RSIGxwdmFsdWUsICAgY29uc3QgQ1VSUkVOQ1lGTVRBICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFNUUiBscEN1cnJlbmN5U3RyLCBpbnQgY2NoQ3VycmVuY3kpCnsKICAgIFVJTlQgICBuUG9zT3JkZXIsIG5OZWdPcmRlcjsKICAgIElOVCAgICByZXRWYWw7CiAgICBjaGFyICAgc0Rlc3RpbmF0aW9uWzEyOF0sIHNOZWdPcmRlcls4XSwgc1Bvc09yZGVyWzhdLCBzQ3VycmVuY3lTeW1ib2xbOF07CiAgICBjaGFyICAgKnBEZXN0aW5hdGlvbiA9IHNEZXN0aW5hdGlvbjsKICAgIGNoYXIgICBzTnVtYmVyRm9ybWF0ZWRbMTI4XTsKICAgIGNoYXIgICAqcE51bWJlckZvcm1hdGVkID0gc051bWJlckZvcm1hdGVkOwogICAgTENJRCAgIHN5c3RlbURlZmF1bHRMQ0lEOwogICAgQk9PTCAgIGJJc1Bvc2l0aXZlID0gRkFMU0UsIGJWYWxpZEZvcm1hdCA9IEZBTFNFOwogICAgZW51bSAgIE9wZXJhdGlvbnMKICAgIHsKICAgICAgICBVU0VfUEFSQU1FVEVSLAogICAgICAgIFVTRV9MT0NBTEVJTkZPLAogICAgICAgIFVTRV9TWVNURU1ERUZBVUxULAogICAgICAgIFJFVFVSTl9FUlJPUgogICAgfSB1c2VkX29wZXJhdGlvbjsKCiAgICBOVU1CRVJGTVRBICBudW1iZXJGbXQ7CgogICAgLyogV2hpY2ggc291cmNlIHdpbGwgd2UgdXNlIHRvIGZvcm1hdCB0aGUgc3RyaW5nICovCiAgICB1c2VkX29wZXJhdGlvbiA9IFJFVFVSTl9FUlJPUjsKICAgIGlmIChscEZvcm1hdCAhPSBOVUxMKQogICAgewogICAgICAgIGlmIChkd2ZsYWdzID09IDApCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1BBUkFNRVRFUjsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAoZHdmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfU1lTVEVNREVGQVVMVDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX0xPQ0FMRUlORk87CiAgICB9CgogICAgLyogTG9hZCB0aGUgZmllbGRzIHdlIG5lZWQgKi8KICAgIHN3aXRjaCh1c2VkX29wZXJhdGlvbikKICAgIHsKICAgIGNhc2UgVVNFX0xPQ0FMRUlORk86CiAgICAgICAgLyogU3BlY2lmaWMgdG8gQ1VSUkVOQ1lGTVRBICovCiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSU5FR0NVUlIsIHNOZWdPcmRlciwgc2l6ZW9mKHNOZWdPcmRlcikpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lDVVJSRU5DWSwgc1Bvc09yZGVyLCBzaXplb2Yoc1Bvc09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU0NVUlJFTkNZLCBzQ3VycmVuY3lTeW1ib2wsIHNpemVvZihzQ3VycmVuY3lTeW1ib2wpKTsKCiAgICAgICAgblBvc09yZGVyID0gYXRvaShzUG9zT3JkZXIpOwogICAgICAgIG5OZWdPcmRlciA9IGF0b2koc05lZ09yZGVyKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVVNFX1BBUkFNRVRFUjoKICAgICAgICAvKiBTcGVjaWZpYyB0byBDVVJSRU5DWUZNVEEgKi8KICAgICAgICBuTmVnT3JkZXIgPSBscEZvcm1hdC0+TmVnYXRpdmVPcmRlcjsKICAgICAgICBuUG9zT3JkZXIgPSBscEZvcm1hdC0+UG9zaXRpdmVPcmRlcjsKICAgICAgICBzdHJjcHkoc0N1cnJlbmN5U3ltYm9sLCBscEZvcm1hdC0+bHBDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVTRV9TWVNURU1ERUZBVUxUOgogICAgICAgIHN5c3RlbURlZmF1bHRMQ0lEID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICAgICAgICAvKiBTcGVjaWZpYyB0byBDVVJSRU5DWUZNVEEgKi8KICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lORUdDVVJSLCBzTmVnT3JkZXIsIHNpemVvZihzTmVnT3JkZXIpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lDVVJSRU5DWSwgc1Bvc09yZGVyLCBzaXplb2Yoc1Bvc09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TQ1VSUkVOQ1ksIHNDdXJyZW5jeVN5bWJvbCwgc2l6ZW9mKHNDdXJyZW5jeVN5bWJvbCkpOwoKICAgICAgICBuUG9zT3JkZXIgPSBhdG9pKHNQb3NPcmRlcik7CiAgICAgICAgbk5lZ09yZGVyID0gYXRvaShzTmVnT3JkZXIpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIENvbnN0cnVjdCBhIHRlbXBvcmFyeSBudW1iZXIgZm9ybWF0IHN0cnVjdHVyZSAqLwogICAgaWYgKGxwRm9ybWF0ICE9IE5VTEwpCiAgICB7CiAgICAgICAgbnVtYmVyRm10Lk51bURpZ2l0cyAgICAgPSBscEZvcm1hdC0+TnVtRGlnaXRzOwogICAgICAgIG51bWJlckZtdC5MZWFkaW5nWmVybyAgID0gbHBGb3JtYXQtPkxlYWRpbmdaZXJvOwogICAgICAgIG51bWJlckZtdC5Hcm91cGluZyAgICAgID0gbHBGb3JtYXQtPkdyb3VwaW5nOwogICAgICAgIG51bWJlckZtdC5OZWdhdGl2ZU9yZGVyID0gMDsKICAgICAgICBudW1iZXJGbXQubHBEZWNpbWFsU2VwID0gbHBGb3JtYXQtPmxwRGVjaW1hbFNlcDsKICAgICAgICBudW1iZXJGbXQubHBUaG91c2FuZFNlcCA9IGxwRm9ybWF0LT5scFRob3VzYW5kU2VwOwogICAgICAgIGJWYWxpZEZvcm1hdCA9IFRSVUU7CiAgICB9CgogICAgLyogTWFrZSBhIGNhbGwgdG8gR2V0TnVtYmVyRm9ybWF0QSgpICovCiAgICBpZiAoKmxwdmFsdWUgPT0gJy0nKQogICAgewogICAgICAgIGJJc1Bvc2l0aXZlID0gRkFMU0U7CiAgICAgICAgcmV0VmFsID0gR2V0TnVtYmVyRm9ybWF0QShsb2NhbGUsMCxscHZhbHVlKzEsKGJWYWxpZEZvcm1hdCk/Jm51bWJlckZtdDpOVUxMLHBOdW1iZXJGb3JtYXRlZCwxMjgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGJJc1Bvc2l0aXZlID0gVFJVRTsKICAgICAgICByZXRWYWwgPSBHZXROdW1iZXJGb3JtYXRBKGxvY2FsZSwwLGxwdmFsdWUsKGJWYWxpZEZvcm1hdCk/Jm51bWJlckZtdDpOVUxMLHBOdW1iZXJGb3JtYXRlZCwxMjgpOwogICAgfQoKICAgIGlmIChyZXRWYWwgPT0gMCkKICAgICAgICByZXR1cm4gMDsKCiAgICAvKiBjb25zdHJ1Y3QgdGhlIGZvcm1hdHRlZCBzdHJpbmcgKi8KICAgIGlmIChiSXNQb3NpdGl2ZSkKICAgIHsKICAgICAgICBzd2l0Y2ggKG5Qb3NPcmRlcikKICAgICAgICB7CiAgICAgICAgY2FzZSAwOiAgIC8qIFByZWZpeCwgbm8gc2VwYXJhdGlvbiAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTogICAvKiBTdWZmaXgsIG5vIHNlcGFyYXRpb24gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6ICAgLyogUHJlZml4LCAxIGNoYXIgc2VwYXJhdGlvbiAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6ICAgLyogU3VmZml4LCAxIGNoYXIgc2VwYXJhdGlvbiAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBlbHNlICAvKiBuZWdhdGl2ZSBudW1iZXIgKi8KICAgIHsKICAgICAgICBzd2l0Y2ggKG5OZWdPcmRlcikKICAgICAgICB7CiAgICAgICAgY2FzZSAwOiAgIC8qIGZvcm1hdDogKCQxLjEpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiKSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6ICAgLyogZm9ybWF0OiAtJDEuMSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6ICAgLyogZm9ybWF0OiAkLTEuMSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6ICAgLyogZm9ybWF0OiAkMS4xLSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6ICAgLyogZm9ybWF0OiAoMS4xJCkgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICIoIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNTogICAvKiBmb3JtYXQ6IC0xLjEkICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNjogICAvKiBmb3JtYXQ6IDEuMS0kICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNzogICAvKiBmb3JtYXQ6IDEuMSQtICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgODogICAvKiBmb3JtYXQ6IC0xLjEgJCAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA5OiAgIC8qIGZvcm1hdDogLSQgMS4xICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDEwOiAgIC8qIGZvcm1hdDogMS4xICQtICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDExOiAgIC8qIGZvcm1hdDogJCAxLjEtICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDEyOiAgIC8qIGZvcm1hdDogJCAtMS4xICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDEzOiAgIC8qIGZvcm1hdDogMS4xLSAkICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE0OiAgIC8qIGZvcm1hdDogKCQgMS4xKSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIigiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTU6ICAgLyogZm9ybWF0OiAoMS4xICQpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIikiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldFZhbCA9IHN0cmxlbihwRGVzdGluYXRpb24pICsgMTsKCiAgICBpZiAoY2NoQ3VycmVuY3kpCiAgICB7CiAgICAgICAgbWVtY3B5KCBscEN1cnJlbmN5U3RyLCBwRGVzdGluYXRpb24sIG1pbihjY2hDdXJyZW5jeSwgcmV0VmFsKSApOwogICAgICAgIGlmIChjY2hDdXJyZW5jeSA8IHJldFZhbCkgewogICAgICAgICAgICByZXRWYWwgPSAwOwogICAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHJldFZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRDdXJyZW5jeUZvcm1hdFcJKEtFUk5FTDMyLkApCiAqLwpJTlQgV0lOQVBJIEdldEN1cnJlbmN5Rm9ybWF0VyhMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1dTVFIgbHB2YWx1ZSwgICBjb25zdCBDVVJSRU5DWUZNVFcgKiBscEZvcm1hdCwKCQkJICAgICAgIExQV1NUUiBscEN1cnJlbmN5U3RyLCBpbnQgY2NoQ3VycmVuY3kpCnsKICAgIEZJWE1FKCJUaGlzIEFQSSBmdW5jdGlvbiBpcyBOT1QgaW1wbGVtZW50ZWQgIVxuIik7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJT0xFMk5MU19DaGVja0xvY2FsZQlbaW50ZXJuXQogKi8Kc3RhdGljIExDSUQgT0xFMk5MU19DaGVja0xvY2FsZSAoTENJRCBsb2NhbGUpCnsKCWlmICghbG9jYWxlKQoJeyBsb2NhbGUgPSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ7Cgl9CgoJaWYgKGxvY2FsZSA9PSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQpCiAgCXsgcmV0dXJuIEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7Cgl9CgllbHNlIGlmIChsb2NhbGUgPT0gTE9DQUxFX1VTRVJfREVGQVVMVCkKCXsgcmV0dXJuIEdldFVzZXJEZWZhdWx0TENJRCgpOwoJfQoJZWxzZQoJeyByZXR1cm4gbG9jYWxlOwoJfQp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFRpbWVGb3JtYXRBCVtLRVJORUwzMi5AXQogKiBNYWtlcyBhbiBBU0NJSSBzdHJpbmcgb2YgdGhlIHRpbWUKICoKICogRm9ybWF0cyBkYXRlIGFjY29yZGluZyB0byBmb3JtYXQsICBvciBsb2NhbGUgZGVmYXVsdCBpZiBmb3JtYXQgaXMKICogTlVMTC4gVGhlIGZvcm1hdCBjb25zaXN0cyBvZiBsaXRlcmFsIGNoYXJhY3RlcnMgYW5kIGZpZWxkcyBhcyBmb2xsb3dzOgogKgogKiBoICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMTItaG91cikKICogaGggaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogSCAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDI0LWhvdXIpCiAqIEhIIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIG0gIG1pbnV0ZXMgd2l0aCBubyBsZWFkaW5nIHplcm8KICogbW0gbWludXRlcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBzICBzZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqIHNzIHNlY29uZHMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogdCAgdGltZSBtYXJrZXIgKEEgb3IgUCkKICogdHQgdGltZSBtYXJrZXIgKEFNLCBQTSkKICoKICovCklOVCBXSU5BUEkKR2V0VGltZUZvcm1hdEEoTENJRCBsb2NhbGUsICAgICAgICAvKiBbaW5dICAqLwoJICAgICAgIERXT1JEIGZsYWdzLCAgICAgICAgLyogW2luXSAgKi8KCSAgICAgICBjb25zdCBTWVNURU1USU1FKiB4dGltZSwgLyogW2luXSAgKi8KCSAgICAgICBMUENTVFIgZm9ybWF0LCAgICAgIC8qIFtpbl0gICovCgkgICAgICAgTFBTVFIgdGltZXN0ciwgICAgICAvKiBbb3V0XSAqLwoJICAgICAgIElOVCB0aW1lbGVuICAgICAgICAgLyogW2luXSAgKi8pCnsKICBJTlQgcmV0OwogIExQV1NUUiB3Zm9ybWF0ID0gTlVMTDsKICBMUFdTVFIgd3RpbWUgPSBOVUxMOyAgCgogIGlmIChmb3JtYXQpCiAgewogICAgd2Zvcm1hdCA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAoc3RybGVuKGZvcm1hdCkgKyAxKSAqIHNpemVvZih3Y2hhcl90KSk7CiAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgZm9ybWF0LCAtMSwgd2Zvcm1hdCwgc3RybGVuKGZvcm1hdCkgKyAxKTsKICB9CgogIGlmICh0aW1lc3RyICYmIHRpbWVsZW4pCiAgewogICAgd3RpbWUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICh0aW1lbGVuICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOwogIH0KCiAgcmV0ID0gR2V0VGltZUZvcm1hdFcobG9jYWxlLCBmbGFncywgeHRpbWUsIHdmb3JtYXQsIHd0aW1lLCB0aW1lbGVuKTsKCiAgaWYgKHd0aW1lKQogIHsKICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCB3dGltZSwgcmV0LCB0aW1lc3RyLCB0aW1lbGVuLCBOVUxMLCBOVUxMKTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHd0aW1lKTsKICB9CgogIGlmICh3Zm9ybWF0KQogIHsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdmb3JtYXQpOwogIH0KCiAgcmV0dXJuIHJldDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFRpbWVGb3JtYXRXCVtLRVJORUwzMi5AXQogKiBNYWtlcyBhIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSB0aW1lCiAqCiAqIE5PVEU6IFNlZSBPTEVfR2V0Rm9ybWF0VygpIGZvciBmdXJ0aGVyIGRvY3VtZW50YXRpb24KICovCklOVCBXSU5BUEkKR2V0VGltZUZvcm1hdFcoTENJRCBsb2NhbGUsICAgICAgICAvKiBbaW5dICAqLwoJICAgICAgIERXT1JEIGZsYWdzLCAgICAgICAgLyogW2luXSAgKi8KCSAgICAgICBjb25zdCBTWVNURU1USU1FKiB4dGltZSwgLyogW2luXSAgKi8KCSAgICAgICBMUENXU1RSIGZvcm1hdCwgICAgIC8qIFtpbl0gICovCgkgICAgICAgTFBXU1RSIHRpbWVzdHIsICAgICAvKiBbb3V0XSAqLwoJICAgICAgIElOVCB0aW1lbGVuICAgICAgICAgLyogW2luXSAgKi8pCnsJV0NIQVIgZm9ybWF0X2J1Zls0MF07CglMUENXU1RSIHRoaXNmb3JtYXQ7CglTWVNURU1USU1FIHQ7Cgljb25zdCBTWVNURU1USU1FKiB0aGlzdGltZTsKCUxDSUQgdGhpc2xvY2FsZT0wOwoJRFdPUkQgdGhpc2ZsYWdzPUxPQ0FMRV9TVElNRUZPUk1BVDsgLyogc3RhbmRhcmQgdGltZWZvcm1hdCAqLwoJSU5UIHJldDsKCglUUkFDRSgiR2V0VGltZUZvcm1hdCgweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLGxvY2FsZSxmbGFncywKCXh0aW1lLGRlYnVnc3RyX3coZm9ybWF0KSx0aW1lc3RyLHRpbWVsZW4pOwoKCXRoaXNsb2NhbGUgPSBPTEUyTkxTX0NoZWNrTG9jYWxlICggbG9jYWxlICk7CgoJLyogaWYgdGhlIHVzZXIgZGlkbid0IHNwZWNpZnkgYSBmb3JtYXQgd2UgdXNlIHRoZSBkZWZhdWx0ICovCiAgICAgICAgLyogZm9ybWF0IGZvciB0aGlzIGxvY2FsZSAqLwoJaWYgKGZvcm1hdCA9PSBOVUxMKQoJewoJICBpZiAoZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpICAvKiB1c2Ugc3lzdGVtIGRlZmF1bHQgKi8KCSAgeyAKICAgICAgICAgICAgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgIH0KCSAgR2V0TG9jYWxlSW5mb1codGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmb3JtYXRfYnVmLCA0MCk7CgkgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwoJfQoJZWxzZQoJewoJICAvKiBpZiBub24tbnVsbCBmb3JtYXQgYW5kIExPQ0FMRV9OT1VTRVJPVkVSUklERSB0aGVuIGZhaWwgKi8gCgkgIC8qIE5PVEU6IHRoaXMgY291bGQgYmUgZWl0aGVyIGludmFsaWQgZmxhZ3Mgb3IgaW52YWxpZCBwYXJhbWV0ZXIgKi8KCSAgLyogIHdpbmRvd3Mgc2V0cyBpdCB0byBpbnZhbGlkIGZsYWdzICovCgkgIGlmIChmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkKICAgICAgICAgIHsKCSAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9GTEFHUyk7CgkgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CgogICAgICAgICAgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKCX0KCglpZiAoeHRpbWUgPT0gTlVMTCkgLyogTlVMTCBtZWFucyB1c2UgdGhlIGN1cnJlbnQgbG9jYWwgdGltZSAqLwoJeyBHZXRMb2NhbFRpbWUoJnQpOwoJICB0aGlzdGltZSA9ICZ0OwoJfQoJZWxzZQoJewogICAgICAgICAgLyogY2hlY2sgdGltZSB2YWx1ZXMgKi8KICAgICAgICAgIGlmKCh4dGltZS0+d0hvdXIgPiAyNCkgfHwgKHh0aW1lLT53TWludXRlID49IDYwKSB8fCAoeHRpbWUtPndTZWNvbmQgPj0gNjApKQogICAgICAgICAgewogICAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgIH0KCiAgICAgICAgICB0aGlzdGltZSA9IHh0aW1lOwoJfQoKCXJldCA9IE9MRV9HZXRGb3JtYXRXKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZmxhZ3MsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LAogIAkJCSB0aW1lc3RyLCB0aW1lbGVuLCAwKTsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1DYWxlbmRhckluZm9BCVtLRVJORUwzMi5AXQogKi8KQk9PTCBXSU5BUEkgRW51bUNhbGVuZGFySW5mb0EoCglDQUxJTkZPX0VOVU1QUk9DQSBjYWxpbmZvcHJvYyxMQ0lEIGxvY2FsZSxDQUxJRCBjYWxlbmRhcixDQUxUWVBFIGNhbHR5cGUKKSB7CglGSVhNRSgiKCVwLDB4JTA0bHgsMHglMDhseCwweCUwOGx4KSxzdHViIVxuIixjYWxpbmZvcHJvYyxsb2NhbGUsY2FsZW5kYXIsY2FsdHlwZSk7CglyZXR1cm4gRkFMU0U7Cn0K