LyoKICoJTmF0aW9uYWwgTGFuZ3VhZ2UgU3VwcG9ydCBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqICAgICAgQ29weXJpZ2h0IDIwMDAgIEp1bGlvIEPpc2FyIEfhenF1ZXoKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSAid2luZS9wb3J0LmgiCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bG9jYWxlLmg+CgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5nZGkuaCIKI2luY2x1ZGUgIndpbnVzZXIuaCIKI2luY2x1ZGUgIndpbnRlcm5sLmgiCiNpbmNsdWRlICJ3aW5lL3VuaWNvZGUuaCIKI2luY2x1ZGUgIndpbnZlci5oIgojaW5jbHVkZSAid2lubmxzLmgiCiNpbmNsdWRlICJ3aW5yZWcuaCIKI2luY2x1ZGUgIndpbmVycm9yLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChubHMpOwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbnZlcnREZWZhdWx0TG9jYWxlIChLRVJORUwzMi5AKQogKi8KTENJRCBXSU5BUEkgQ29udmVydERlZmF1bHRMb2NhbGUgKExDSUQgbGNpZCkKewlzd2l0Y2ggKGxjaWQpCgl7ICBjYXNlIExPQ0FMRV9TWVNURU1fREVGQVVMVDoKCSAgICAgcmV0dXJuIEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgICBjYXNlIExPQ0FMRV9VU0VSX0RFRkFVTFQ6CgkgICAgIHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCSAgIGNhc2UgTE9DQUxFX05FVVRSQUw6CgkgICAgIHJldHVybiBNQUtFTENJRCAoTEFOR19ORVVUUkFMLCBTVUJMQU5HX05FVVRSQUwpOwoJfQoJcmV0dXJuIE1BS0VMQU5HSUQoIFBSSU1BUllMQU5HSUQobGNpZCksIFNVQkxBTkdfTkVVVFJBTCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlJc1ZhbGlkTG9jYWxlCVtLRVJORUwzMi5AXQogKi8KQk9PTCBXSU5BUEkgSXNWYWxpZExvY2FsZShMQ0lEIGxjaWQsRFdPUkQgZmxhZ3MpCnsKICAgIC8qIGNoZWNrIGlmIGxhbmd1YWdlIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIGtlcm5lbDMyIHJlc291cmNlcyAqLwogICAgaWYoIUZpbmRSZXNvdXJjZUV4VyhHZXRNb2R1bGVIYW5kbGVBKCJLRVJORUwzMiIpLCBSVF9TVFJJTkdXLCAoTFBDV1NUUilMT0NBTEVfSUxBTkdVQUdFLCBMT1dPUkQobGNpZCkpKQoJcmV0dXJuIEZBTFNFOwogICAgZWxzZQoJcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBCT09MIENBTExCQUNLIEVudW1SZXNvdXJjZUxhbmd1YWdlc1Byb2NXKEhNT0RVTEUgaE1vZHVsZSwgTFBDV1NUUiB0eXBlLAoJCUxQQ1dTVFIgbmFtZSwgV09SRCBMYW5nSUQsIExPTkcgbFBhcmFtKQp7CiAgICBDSEFSIGJ1ZkFbMjBdOwogICAgV0NIQVIgYnVmV1syMF07CiAgICBMT0NBTEVfRU5VTVBST0NXIGxwZm5Mb2NhbGVFbnVtID0gKExPQ0FMRV9FTlVNUFJPQ1cpbFBhcmFtOwogICAgc3ByaW50ZihidWZBLCAiJTA4eCIsIChVSU5UKUxhbmdJRCk7CiAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgYnVmQSwgLTEsIGJ1ZlcsIHNpemVvZihidWZXKS9zaXplb2YoYnVmV1swXSkpOwogICAgcmV0dXJuIGxwZm5Mb2NhbGVFbnVtKGJ1ZlcpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlFbnVtU3lzdGVtTG9jYWxlc1cJW0tFUk5FTDMyLkBdCiAqLwpCT09MIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlc1coIExPQ0FMRV9FTlVNUFJPQ1cgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzICkKewogICAgVFJBQ0UoIiglcCwlMDhseClcbiIsIGxwZm5Mb2NhbGVFbnVtLGZsYWdzKTsKCiAgICBFbnVtUmVzb3VyY2VMYW5ndWFnZXNXKEdldE1vZHVsZUhhbmRsZUEoIktFUk5FTDMyIiksIFJUX1NUUklOR1csCgkgICAgKExQQ1dTVFIpTE9DQUxFX0lMQU5HVUFHRSwgRW51bVJlc291cmNlTGFuZ3VhZ2VzUHJvY1csCgkgICAgKExPTkcpbHBmbkxvY2FsZUVudW0pOwoKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgQk9PTCBDQUxMQkFDSyBFbnVtUmVzb3VyY2VMYW5ndWFnZXNQcm9jQShITU9EVUxFIGhNb2R1bGUsIExQQ1NUUiB0eXBlLAoJCUxQQ1NUUiBuYW1lLCBXT1JEIExhbmdJRCwgTE9ORyBsUGFyYW0pCnsKICAgIENIQVIgYnVmQVsyMF07CiAgICBMT0NBTEVfRU5VTVBST0NBIGxwZm5Mb2NhbGVFbnVtID0gKExPQ0FMRV9FTlVNUFJPQ0EpbFBhcmFtOwogICAgc3ByaW50ZihidWZBLCAiJTA4eCIsIChVSU5UKUxhbmdJRCk7CiAgICByZXR1cm4gbHBmbkxvY2FsZUVudW0oYnVmQSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1TeXN0ZW1Mb2NhbGVzQQlbS0VSTkVMMzIuQF0KICovCkJPT0wgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzQShMT0NBTEVfRU5VTVBST0NBIGxwZm5Mb2NhbGVFbnVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzKQp7CiAgICBUUkFDRSgiKCVwLCUwOGx4KVxuIiwgbHBmbkxvY2FsZUVudW0sZmxhZ3MpOwoKICAgIEVudW1SZXNvdXJjZUxhbmd1YWdlc0EoR2V0TW9kdWxlSGFuZGxlQSgiS0VSTkVMMzIiKSwgUlRfU1RSSU5HQSwKCSAgICAoTFBDU1RSKUxPQ0FMRV9JTEFOR1VBR0UsIEVudW1SZXNvdXJjZUxhbmd1YWdlc1Byb2NBLAoJICAgIChMT05HKWxwZm5Mb2NhbGVFbnVtKTsKCiAgICByZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBWZXJMYW5ndWFnZU5hbWVBICAgICAgICAgICAgICBbS0VSTkVMMzIuQF0KICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWVBKCBVSU5UIHdMYW5nLCBMUFNUUiBzekxhbmcsIFVJTlQgblNpemUgKQp7CiAgICBpZighc3pMYW5nKQoJcmV0dXJuIDA7CgogICAgcmV0dXJuIEdldExvY2FsZUluZm9BKE1BS0VMQ0lEKHdMYW5nLCBTT1JUX0RFRkFVTFQpLCBMT0NBTEVfU0VOR0xBTkdVQUdFLCBzekxhbmcsIG5TaXplKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBWZXJMYW5ndWFnZU5hbWVXICAgICAgICAgICAgICBbS0VSTkVMMzIuQF0KICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWVXKCBVSU5UIHdMYW5nLCBMUFdTVFIgc3pMYW5nLCBVSU5UIG5TaXplICkKewogICAgaWYoIXN6TGFuZykKCXJldHVybiAwOwoKICAgIHJldHVybiBHZXRMb2NhbGVJbmZvVyhNQUtFTENJRCh3TGFuZywgU09SVF9ERUZBVUxUKSwgTE9DQUxFX1NFTkdMQU5HVUFHRSwgc3pMYW5nLCBuU2l6ZSk7Cn0KCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fVW5pY29kZV9MVVRbXSA9IHsKICA2ICAgICAgLCAgIDMsIC8qICAgLSAgIDEgKi8KICA2ICAgICAgLCAgIDQsIC8qICAgLSAgIDIgKi8KICA2ICAgICAgLCAgIDUsIC8qICAgLSAgIDMgKi8KICA2ICAgICAgLCAgIDYsIC8qICAgLSAgIDQgKi8KICA2ICAgICAgLCAgIDcsIC8qICAgLSAgIDUgKi8KICA2ICAgICAgLCAgIDgsIC8qICAgLSAgIDYgKi8KICA2ICAgICAgLCAgIDksIC8qICAgLSAgIDcgKi8KICA2ICAgICAgLCAgMTAsIC8qICAgLSAgIDggKi8KICA3ICAgICAgLCAgIDUsIC8qICAgLSAgIDkgKi8KICA3ICAgICAgLCAgIDYsIC8qICAgLSAgMTAgKi8KICA3ICAgICAgLCAgIDcsIC8qICAgLSAgMTEgKi8KICA3ICAgICAgLCAgIDgsIC8qICAgLSAgMTIgKi8KICA3ICAgICAgLCAgIDksIC8qICAgLSAgMTMgKi8KICA2ICAgICAgLCAgMTEsIC8qICAgLSAgMTQgKi8KICA2ICAgICAgLCAgMTIsIC8qICAgLSAgMTUgKi8KICA2ICAgICAgLCAgMTMsIC8qICAgLSAgMTYgKi8KICA2ICAgICAgLCAgMTQsIC8qICAgLSAgMTcgKi8KICA2ICAgICAgLCAgMTUsIC8qICAgLSAgMTggKi8KICA2ICAgICAgLCAgMTYsIC8qICAgLSAgMTkgKi8KICA2ICAgICAgLCAgMTcsIC8qICAgLSAgMjAgKi8KICA2ICAgICAgLCAgMTgsIC8qICAgLSAgMjEgKi8KICA2ICAgICAgLCAgMTksIC8qICAgLSAgMjIgKi8KICA2ICAgICAgLCAgMjAsIC8qICAgLSAgMjMgKi8KICA2ICAgICAgLCAgMjEsIC8qICAgLSAgMjQgKi8KICA2ICAgICAgLCAgMjIsIC8qICAgLSAgMjUgKi8KICA2ICAgICAgLCAgMjMsIC8qICAgLSAgMjYgKi8KICA2ICAgICAgLCAgMjQsIC8qICAgLSAgMjcgKi8KICA2ICAgICAgLCAgMjUsIC8qICAgLSAgMjggKi8KICA2ICAgICAgLCAgMjYsIC8qICAgLSAgMjkgKi8KICA2ICAgICAgLCAgMjcsIC8qICAgLSAgMzAgKi8KICA2ICAgICAgLCAgMjgsIC8qICAgLSAgMzEgKi8KICA3ICAgICAgLCAgIDIsIC8qICAgLSAgMzIgKi8KICA3ICAgICAgLCAgMjgsIC8qICEgLSAgMzMgKi8KICA3ICAgICAgLCAgMjksIC8qICIgLSAgMzQgKi8gLyogIiAqLwogIDcgICAgICAsICAzMSwgLyogIyAtICAzNSAqLwogIDcgICAgICAsICAzMywgLyogJCAtICAzNiAqLwogIDcgICAgICAsICAzNSwgLyogJSAtICAzNyAqLwogIDcgICAgICAsICAzNywgLyogJiAtICAzOCAqLwogIDYgICAgICAsIDEyOCwgLyogJyAtICAzOSAqLwogIDcgICAgICAsICAzOSwgLyogKCAtICA0MCAqLwogIDcgICAgICAsICA0MiwgLyogKSAtICA0MSAqLwogIDcgICAgICAsICA0NSwgLyogKiAtICA0MiAqLwogIDggICAgICAsICAgMywgLyogKyAtICA0MyAqLwogIDcgICAgICAsICA0NywgLyogLCAtICA0NCAqLwogIDYgICAgICAsIDEzMCwgLyogLSAtICA0NSAqLwogIDcgICAgICAsICA1MSwgLyogLiAtICA0NiAqLwogIDcgICAgICAsICA1MywgLyogLyAtICA0NyAqLwogMTIgICAgICAsICAgMywgLyogMCAtICA0OCAqLwogMTIgICAgICAsICAzMywgLyogMSAtICA0OSAqLwogMTIgICAgICAsICA1MSwgLyogMiAtICA1MCAqLwogMTIgICAgICAsICA3MCwgLyogMyAtICA1MSAqLwogMTIgICAgICAsICA4OCwgLyogNCAtICA1MiAqLwogMTIgICAgICAsIDEwNiwgLyogNSAtICA1MyAqLwogMTIgICAgICAsIDEyNSwgLyogNiAtICA1NCAqLwogMTIgICAgICAsIDE0NCwgLyogNyAtICA1NSAqLwogMTIgICAgICAsIDE2MiwgLyogOCAtICA1NiAqLwogMTIgICAgICAsIDE4MCwgLyogOSAtICA1NyAqLwogIDcgICAgICAsICA1NSwgLyogOiAtICA1OCAqLwogIDcgICAgICAsICA1OCwgLyogOyAtICA1OSAqLwogIDggICAgICAsICAxNCwgLyogPCAtICA2MCAqLwogIDggICAgICAsICAxOCwgLyogPSAtICA2MSAqLwogIDggICAgICAsICAyMCwgLyogPiAtICA2MiAqLwogIDcgICAgICAsICA2MCwgLyogPyAtICA2MyAqLwogIDcgICAgICAsICA2MiwgLyogQCAtICA2NCAqLwogMTQgICAgICAsICAgMiwgLyogQSAtICA2NSAqLwogMTQgICAgICAsICAgOSwgLyogQiAtICA2NiAqLwogMTQgICAgICAsICAxMCwgLyogQyAtICA2NyAqLwogMTQgICAgICAsICAyNiwgLyogRCAtICA2OCAqLwogMTQgICAgICAsICAzMywgLyogRSAtICA2OSAqLwogMTQgICAgICAsICAzNSwgLyogRiAtICA3MCAqLwogMTQgICAgICAsICAzNywgLyogRyAtICA3MSAqLwogMTQgICAgICAsICA0NCwgLyogSCAtICA3MiAqLwogMTQgICAgICAsICA1MCwgLyogSSAtICA3MyAqLwogMTQgICAgICAsICA1MywgLyogSiAtICA3NCAqLwogMTQgICAgICAsICA1NCwgLyogSyAtICA3NSAqLwogMTQgICAgICAsICA3MiwgLyogTCAtICA3NiAqLwogMTQgICAgICAsICA4MSwgLyogTSAtICA3NyAqLwogMTQgICAgICAsIDExMiwgLyogTiAtICA3OCAqLwogMTQgICAgICAsIDEyNCwgLyogTyAtICA3OSAqLwogMTQgICAgICAsIDEyNiwgLyogUCAtICA4MCAqLwogMTQgICAgICAsIDEzNywgLyogUSAtICA4MSAqLwogMTQgICAgICAsIDEzOCwgLyogUiAtICA4MiAqLwogMTQgICAgICAsIDE0NSwgLyogUyAtICA4MyAqLwogMTQgICAgICAsIDE1MywgLyogVCAtICA4NCAqLwogMTQgICAgICAsIDE1OSwgLyogVSAtICA4NSAqLwogMTQgICAgICAsIDE2MiwgLyogViAtICA4NiAqLwogMTQgICAgICAsIDE2NCwgLyogVyAtICA4NyAqLwogMTQgICAgICAsIDE2NiwgLyogWCAtICA4OCAqLwogMTQgICAgICAsIDE2NywgLyogWSAtICA4OSAqLwogMTQgICAgICAsIDE2OSwgLyogWiAtICA5MCAqLwogIDcgICAgICAsICA2MywgLyogWyAtICA5MSAqLwogIDcgICAgICAsICA2NSwgLyogXCAtICA5MiAqLwogIDcgICAgICAsICA2NiwgLyogXSAtICA5MyAqLwogIDcgICAgICAsICA2NywgLyogXiAtICA5NCAqLwogIDcgICAgICAsICA2OCwgLyogXyAtICA5NSAqLwogIDcgICAgICAsICA3MiwgLyogYCAtICA5NiAqLwogMTQgICAgICAsICAgMiwgLyogYSAtICA5NyAqLwogMTQgICAgICAsICAgOSwgLyogYiAtICA5OCAqLwogMTQgICAgICAsICAxMCwgLyogYyAtICA5OSAqLwogMTQgICAgICAsICAyNiwgLyogZCAtIDEwMCAqLwogMTQgICAgICAsICAzMywgLyogZSAtIDEwMSAqLwogMTQgICAgICAsICAzNSwgLyogZiAtIDEwMiAqLwogMTQgICAgICAsICAzNywgLyogZyAtIDEwMyAqLwogMTQgICAgICAsICA0NCwgLyogaCAtIDEwNCAqLwogMTQgICAgICAsICA1MCwgLyogaSAtIDEwNSAqLwogMTQgICAgICAsICA1MywgLyogaiAtIDEwNiAqLwogMTQgICAgICAsICA1NCwgLyogayAtIDEwNyAqLwogMTQgICAgICAsICA3MiwgLyogbCAtIDEwOCAqLwogMTQgICAgICAsICA4MSwgLyogbSAtIDEwOSAqLwogMTQgICAgICAsIDExMiwgLyogbiAtIDExMCAqLwogMTQgICAgICAsIDEyNCwgLyogbyAtIDExMSAqLwogMTQgICAgICAsIDEyNiwgLyogcCAtIDExMiAqLwogMTQgICAgICAsIDEzNywgLyogcSAtIDExMyAqLwogMTQgICAgICAsIDEzOCwgLyogciAtIDExNCAqLwogMTQgICAgICAsIDE0NSwgLyogcyAtIDExNSAqLwogMTQgICAgICAsIDE1MywgLyogdCAtIDExNiAqLwogMTQgICAgICAsIDE1OSwgLyogdSAtIDExNyAqLwogMTQgICAgICAsIDE2MiwgLyogdiAtIDExOCAqLwogMTQgICAgICAsIDE2NCwgLyogdyAtIDExOSAqLwogMTQgICAgICAsIDE2NiwgLyogeCAtIDEyMCAqLwogMTQgICAgICAsIDE2NywgLyogeSAtIDEyMSAqLwogMTQgICAgICAsIDE2OSwgLyogeiAtIDEyMiAqLwogIDcgICAgICAsICA3NCwgLyogeyAtIDEyMyAqLwogIDcgICAgICAsICA3NiwgLyogfCAtIDEyNCAqLwogIDcgICAgICAsICA3OCwgLyogfSAtIDEyNSAqLwogIDcgICAgICAsICA4MCwgLyogfiAtIDEyNiAqLwogIDYgICAgICAsICAyOSwgLyogfyAtIDEyNyAqLwogIDYgICAgICAsICAzMCwgLyoggCAtIDEyOCAqLwogIDYgICAgICAsICAzMSwgLyoggSAtIDEyOSAqLwogIDcgICAgICAsIDEyMywgLyoggiAtIDEzMCAqLwogMTQgICAgICAsICAzNSwgLyoggyAtIDEzMSAqLwogIDcgICAgICAsIDEyNywgLyoghCAtIDEzMiAqLwogMTAgICAgICAsICAyMSwgLyoghSAtIDEzMyAqLwogMTAgICAgICAsICAxNSwgLyoghiAtIDEzNCAqLwogMTAgICAgICAsICAxNiwgLyoghyAtIDEzNSAqLwogIDcgICAgICAsICA2NywgLyogiCAtIDEzNiAqLwogMTAgICAgICAsICAyMiwgLyogiSAtIDEzNyAqLwogMTQgICAgICAsIDE0NSwgLyogiiAtIDEzOCAqLwogIDcgICAgICAsIDEzNiwgLyogiyAtIDEzOSAqLwogMTQgKyAxNiAsIDEyNCwgLyogjCAtIDE0MCAqLwogIDYgICAgICAsICA0MywgLyogjSAtIDE0MSAqLwogIDYgICAgICAsICA0NCwgLyogjiAtIDE0MiAqLwogIDYgICAgICAsICA0NSwgLyogjyAtIDE0MyAqLwogIDYgICAgICAsICA0NiwgLyogkCAtIDE0NCAqLwogIDcgICAgICAsIDEyMSwgLyogkSAtIDE0NSAqLwogIDcgICAgICAsIDEyMiwgLyogkiAtIDE0NiAqLwogIDcgICAgICAsIDEyNSwgLyogkyAtIDE0NyAqLwogIDcgICAgICAsIDEyNiwgLyoglCAtIDE0OCAqLwogMTAgICAgICAsICAxNywgLyoglSAtIDE0OSAqLwogIDYgICAgICAsIDEzNywgLyogliAtIDE1MCAqLwogIDYgICAgICAsIDEzOSwgLyoglyAtIDE1MSAqLwogIDcgICAgICAsICA5MywgLyogmCAtIDE1MiAqLwogMTQgICAgICAsIDE1NiwgLyogmSAtIDE1MyAqLwogMTQgICAgICAsIDE0NSwgLyogmiAtIDE1NCAqLwogIDcgICAgICAsIDEzNywgLyogmyAtIDE1NSAqLwogMTQgKyAxNiAsIDEyNCwgLyognCAtIDE1NiAqLwogIDYgICAgICAsICA1OSwgLyognSAtIDE1NyAqLwogIDYgICAgICAsICA2MCwgLyogniAtIDE1OCAqLwogMTQgICAgICAsIDE2NywgLyognyAtIDE1OSAqLwogIDcgICAgICAsICAgNCwgLyogoCAtIDE2MCAqLwogIDcgICAgICAsICA4MSwgLyogoSAtIDE2MSAqLwogMTAgICAgICAsICAgMiwgLyogoiAtIDE2MiAqLwogMTAgICAgICAsICAgMywgLyogoyAtIDE2MyAqLwogMTAgICAgICAsICAgNCwgLyogpCAtIDE2NCAqLwogMTAgICAgICAsICAgNSwgLyogpSAtIDE2NSAqLwogIDcgICAgICAsICA4MiwgLyogpiAtIDE2NiAqLwogMTAgICAgICAsICAgNiwgLyogpyAtIDE2NyAqLwogIDcgICAgICAsICA4MywgLyogqCAtIDE2OCAqLwogMTAgICAgICAsICAgNywgLyogqSAtIDE2OSAqLwogMTQgICAgICAsICAgMiwgLyogqiAtIDE3MCAqLwogIDggICAgICAsICAyNCwgLyogqyAtIDE3MSAqLwogMTAgICAgICAsICAgOCwgLyogrCAtIDE3MiAqLwogIDYgICAgICAsIDEzMSwgLyogrSAtIDE3MyAqLwogMTAgICAgICAsICAgOSwgLyogriAtIDE3NCAqLwogIDcgICAgICAsICA4NCwgLyogryAtIDE3NSAqLwogMTAgICAgICAsICAxMCwgLyogsCAtIDE3NiAqLwogIDggICAgICAsICAyMywgLyogsSAtIDE3NyAqLwogMTIgICAgICAsICA1MSwgLyogsiAtIDE3OCAqLwogMTIgICAgICAsICA3MCwgLyogsyAtIDE3OSAqLwogIDcgICAgICAsICA4NSwgLyogtCAtIDE4MCAqLwogMTAgICAgICAsICAxMSwgLyogtSAtIDE4MSAqLwogMTAgICAgICAsICAxMiwgLyogtiAtIDE4MiAqLwogMTAgICAgICAsICAxMywgLyogtyAtIDE4MyAqLwogIDcgICAgICAsICA4NiwgLyoguCAtIDE4NCAqLwogMTIgICAgICAsICAzMywgLyoguSAtIDE4NSAqLwogMTQgICAgICAsIDEyNCwgLyoguiAtIDE4NiAqLwogIDggICAgICAsICAyNiwgLyoguyAtIDE4NyAqLwogMTIgICAgICAsICAyMSwgLyogvCAtIDE4OCAqLwogMTIgICAgICAsICAyNSwgLyogvSAtIDE4OSAqLwogMTIgICAgICAsICAyOSwgLyogviAtIDE5MCAqLwogIDcgICAgICAsICA4NywgLyogvyAtIDE5MSAqLwogMTQgICAgICAsICAgMiwgLyogwCAtIDE5MiAqLwogMTQgICAgICAsICAgMiwgLyogwSAtIDE5MyAqLwogMTQgICAgICAsICAgMiwgLyogwiAtIDE5NCAqLwogMTQgICAgICAsICAgMiwgLyogwyAtIDE5NSAqLwogMTQgICAgICAsICAgMiwgLyogxCAtIDE5NiAqLwogMTQgICAgICAsICAgMiwgLyogxSAtIDE5NyAqLwogMTQgKyAxNiAsICAgMiwgLyogxiAtIDE5OCAqLwogMTQgICAgICAsICAxMCwgLyogxyAtIDE5OSAqLwogMTQgICAgICAsICAzMywgLyogyCAtIDIwMCAqLwogMTQgICAgICAsICAzMywgLyogySAtIDIwMSAqLwogMTQgICAgICAsICAzMywgLyogyiAtIDIwMiAqLwogMTQgICAgICAsICAzMywgLyogyyAtIDIwMyAqLwogMTQgICAgICAsICA1MCwgLyogzCAtIDIwNCAqLwogMTQgICAgICAsICA1MCwgLyogzSAtIDIwNSAqLwogMTQgICAgICAsICA1MCwgLyogziAtIDIwNiAqLwogMTQgICAgICAsICA1MCwgLyogzyAtIDIwNyAqLwogMTQgICAgICAsICAyNiwgLyog0CAtIDIwOCAqLwogMTQgICAgICAsIDExMiwgLyog0SAtIDIwOSAqLwogMTQgICAgICAsIDEyNCwgLyog0iAtIDIxMCAqLwogMTQgICAgICAsIDEyNCwgLyog0yAtIDIxMSAqLwogMTQgICAgICAsIDEyNCwgLyog1CAtIDIxMiAqLwogMTQgICAgICAsIDEyNCwgLyog1SAtIDIxMyAqLwogMTQgICAgICAsIDEyNCwgLyog1iAtIDIxNCAqLwogIDggICAgICAsICAyOCwgLyog1yAtIDIxNSAqLwogMTQgICAgICAsIDEyNCwgLyog2CAtIDIxNiAqLwogMTQgICAgICAsIDE1OSwgLyog2SAtIDIxNyAqLwogMTQgICAgICAsIDE1OSwgLyog2iAtIDIxOCAqLwogMTQgICAgICAsIDE1OSwgLyog2yAtIDIxOSAqLwogMTQgICAgICAsIDE1OSwgLyog3CAtIDIyMCAqLwogMTQgICAgICAsIDE2NywgLyog3SAtIDIyMSAqLwogMTQgKyAzMiAsIDE1MywgLyog3iAtIDIyMiAqLwogMTQgKyA0OCAsIDE0NSwgLyog3yAtIDIyMyAqLwogMTQgICAgICAsICAgMiwgLyog4CAtIDIyNCAqLwogMTQgICAgICAsICAgMiwgLyog4SAtIDIyNSAqLwogMTQgICAgICAsICAgMiwgLyog4iAtIDIyNiAqLwogMTQgICAgICAsICAgMiwgLyog4yAtIDIyNyAqLwogMTQgICAgICAsICAgMiwgLyog5CAtIDIyOCAqLwogMTQgICAgICAsICAgMiwgLyog5SAtIDIyOSAqLwogMTQgKyAxNiAsICAgMiwgLyog5iAtIDIzMCAqLwogMTQgICAgICAsICAxMCwgLyog5yAtIDIzMSAqLwogMTQgICAgICAsICAzMywgLyog6CAtIDIzMiAqLwogMTQgICAgICAsICAzMywgLyog6SAtIDIzMyAqLwogMTQgICAgICAsICAzMywgLyog6iAtIDIzNCAqLwogMTQgICAgICAsICAzMywgLyog6yAtIDIzNSAqLwogMTQgICAgICAsICA1MCwgLyog7CAtIDIzNiAqLwogMTQgICAgICAsICA1MCwgLyog7SAtIDIzNyAqLwogMTQgICAgICAsICA1MCwgLyog7iAtIDIzOCAqLwogMTQgICAgICAsICA1MCwgLyog7yAtIDIzOSAqLwogMTQgICAgICAsICAyNiwgLyog8CAtIDI0MCAqLwogMTQgICAgICAsIDExMiwgLyog8SAtIDI0MSAqLwogMTQgICAgICAsIDEyNCwgLyog8iAtIDI0MiAqLwogMTQgICAgICAsIDEyNCwgLyog8yAtIDI0MyAqLwogMTQgICAgICAsIDEyNCwgLyog9CAtIDI0NCAqLwogMTQgICAgICAsIDEyNCwgLyog9SAtIDI0NSAqLwogMTQgICAgICAsIDEyNCwgLyog9iAtIDI0NiAqLwogIDggICAgICAsICAyOSwgLyog9yAtIDI0NyAqLwogMTQgICAgICAsIDEyNCwgLyog+CAtIDI0OCAqLwogMTQgICAgICAsIDE1OSwgLyog+SAtIDI0OSAqLwogMTQgICAgICAsIDE1OSwgLyog+iAtIDI1MCAqLwogMTQgICAgICAsIDE1OSwgLyog+yAtIDI1MSAqLwogMTQgICAgICAsIDE1OSwgLyog/CAtIDI1MiAqLwogMTQgICAgICAsIDE2NywgLyog/SAtIDI1MyAqLwogMTQgKyAzMiAsIDE1MywgLyog/iAtIDI1NCAqLwogMTQgICAgICAsIDE2NyAgLyog/yAtIDI1NSAqLyB9OwoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTENNX1VuaWNvZGVfTFVUXzJbXSA9IHsgMzMsIDQ0LCAxNDUgfTsKCiNkZWZpbmUgTENNX0RpYWNyaXRpY19TdGFydCAxMzEKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9EaWFjcml0aWNfTFVUW10gPSB7CjEyMywgIC8qIIMgLSAxMzEgKi8KICAyLCAgLyoghCAtIDEzMiAqLwogIDIsICAvKiCFIC0gMTMzICovCiAgMiwgIC8qIIYgLSAxMzQgKi8KICAyLCAgLyoghyAtIDEzNSAqLwogIDMsICAvKiCIIC0gMTM2ICovCiAgMiwgIC8qIIkgLSAxMzcgKi8KIDIwLCAgLyogiiAtIDEzOCAqLwogIDIsICAvKiCLIC0gMTM5ICovCiAgMiwgIC8qIIwgLSAxNDAgKi8KICAyLCAgLyogjSAtIDE0MSAqLwogIDIsICAvKiCOIC0gMTQyICovCiAgMiwgIC8qII8gLSAxNDMgKi8KICAyLCAgLyogkCAtIDE0NCAqLwogIDIsICAvKiCRIC0gMTQ1ICovCiAgMiwgIC8qIJIgLSAxNDYgKi8KICAyLCAgLyogkyAtIDE0NyAqLwogIDIsICAvKiCUIC0gMTQ4ICovCiAgMiwgIC8qIJUgLSAxNDkgKi8KICAyLCAgLyogliAtIDE1MCAqLwogIDIsICAvKiCXIC0gMTUxICovCiAgMiwgIC8qIJggLSAxNTIgKi8KICAyLCAgLyogmSAtIDE1MyAqLwogMjAsICAvKiCaIC0gMTU0ICovCiAgMiwgIC8qIJsgLSAxNTUgKi8KICAyLCAgLyognCAtIDE1NiAqLwogIDIsICAvKiCdIC0gMTU3ICovCiAgMiwgIC8qIJ4gLSAxNTggKi8KIDE5LCAgLyognyAtIDE1OSAqLwogIDIsICAvKiCgIC0gMTYwICovCiAgMiwgIC8qIKEgLSAxNjEgKi8KICAyLCAgLyogoiAtIDE2MiAqLwogIDIsICAvKiCjIC0gMTYzICovCiAgMiwgIC8qIKQgLSAxNjQgKi8KICAyLCAgLyogpSAtIDE2NSAqLwogIDIsICAvKiCmIC0gMTY2ICovCiAgMiwgIC8qIKcgLSAxNjcgKi8KICAyLCAgLyogqCAtIDE2OCAqLwogIDIsICAvKiCpIC0gMTY5ICovCiAgMywgIC8qIKogLSAxNzAgKi8KICAyLCAgLyogqyAtIDE3MSAqLwogIDIsICAvKiCsIC0gMTcyICovCiAgMiwgIC8qIK0gLSAxNzMgKi8KICAyLCAgLyogriAtIDE3NCAqLwogIDIsICAvKiCvIC0gMTc1ICovCiAgMiwgIC8qILAgLSAxNzYgKi8KICAyLCAgLyogsSAtIDE3NyAqLwogIDIsICAvKiCyIC0gMTc4ICovCiAgMiwgIC8qILMgLSAxNzkgKi8KICAyLCAgLyogtCAtIDE4MCAqLwogIDIsICAvKiC1IC0gMTgxICovCiAgMiwgIC8qILYgLSAxODIgKi8KICAyLCAgLyogtyAtIDE4MyAqLwogIDIsICAvKiC4IC0gMTg0ICovCiAgMiwgIC8qILkgLSAxODUgKi8KICAzLCAgLyoguiAtIDE4NiAqLwogIDIsICAvKiC7IC0gMTg3ICovCiAgMiwgIC8qILwgLSAxODggKi8KICAyLCAgLyogvSAtIDE4OSAqLwogIDIsICAvKiC+IC0gMTkwICovCiAgMiwgIC8qIL8gLSAxOTEgKi8KIDE1LCAgLyogwCAtIDE5MiAqLwogMTQsICAvKiDBIC0gMTkzICovCiAxOCwgIC8qIMIgLSAxOTQgKi8KIDI1LCAgLyogwyAtIDE5NSAqLwogMTksICAvKiDEIC0gMTk2ICovCiAyNiwgIC8qIMUgLSAxOTcgKi8KICAyLCAgLyogxiAtIDE5OCAqLwogMjgsICAvKiDHIC0gMTk5ICovCiAxNSwgIC8qIMggLSAyMDAgKi8KIDE0LCAgLyogySAtIDIwMSAqLwogMTgsICAvKiDKIC0gMjAyICovCiAxOSwgIC8qIMsgLSAyMDMgKi8KIDE1LCAgLyogzCAtIDIwNCAqLwogMTQsICAvKiDNIC0gMjA1ICovCiAxOCwgIC8qIM4gLSAyMDYgKi8KIDE5LCAgLyogzyAtIDIwNyAqLwoxMDQsICAvKiDQIC0gMjA4ICovCiAyNSwgIC8qINEgLSAyMDkgKi8KIDE1LCAgLyog0iAtIDIxMCAqLwogMTQsICAvKiDTIC0gMjExICovCiAxOCwgIC8qINQgLSAyMTIgKi8KIDI1LCAgLyog1SAtIDIxMyAqLwogMTksICAvKiDWIC0gMjE0ICovCiAgMiwgIC8qINcgLSAyMTUgKi8KIDMzLCAgLyog2CAtIDIxNiAqLwogMTUsICAvKiDZIC0gMjE3ICovCiAxNCwgIC8qINogLSAyMTggKi8KIDE4LCAgLyog2yAtIDIxOSAqLwogMTksICAvKiDcIC0gMjIwICovCiAxNCwgIC8qIN0gLSAyMjEgKi8KICAyLCAgLyog3iAtIDIyMiAqLwogIDIsICAvKiDfIC0gMjIzICovCiAxNSwgIC8qIOAgLSAyMjQgKi8KIDE0LCAgLyog4SAtIDIyNSAqLwogMTgsICAvKiDiIC0gMjI2ICovCiAyNSwgIC8qIOMgLSAyMjcgKi8KIDE5LCAgLyog5CAtIDIyOCAqLwogMjYsICAvKiDlIC0gMjI5ICovCiAgMiwgIC8qIOYgLSAyMzAgKi8KIDI4LCAgLyog5yAtIDIzMSAqLwogMTUsICAvKiDoIC0gMjMyICovCiAxNCwgIC8qIOkgLSAyMzMgKi8KIDE4LCAgLyog6iAtIDIzNCAqLwogMTksICAvKiDrIC0gMjM1ICovCiAxNSwgIC8qIOwgLSAyMzYgKi8KIDE0LCAgLyog7SAtIDIzNyAqLwogMTgsICAvKiDuIC0gMjM4ICovCiAxOSwgIC8qIO8gLSAyMzkgKi8KMTA0LCAgLyog8CAtIDI0MCAqLwogMjUsICAvKiDxIC0gMjQxICovCiAxNSwgIC8qIPIgLSAyNDIgKi8KIDE0LCAgLyog8yAtIDI0MyAqLwogMTgsICAvKiD0IC0gMjQ0ICovCiAyNSwgIC8qIPUgLSAyNDUgKi8KIDE5LCAgLyog9iAtIDI0NiAqLwogIDIsICAvKiD3IC0gMjQ3ICovCiAzMywgIC8qIPggLSAyNDggKi8KIDE1LCAgLyog+SAtIDI0OSAqLwogMTQsICAvKiD6IC0gMjUwICovCiAxOCwgIC8qIPsgLSAyNTEgKi8KIDE5LCAgLyog/CAtIDI1MiAqLwogMTQsICAvKiD9IC0gMjUzICovCiAgMiwgIC8qIP4gLSAyNTQgKi8KIDE5LCAgLyog/yAtIDI1NSAqLwp9IDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc1B1bmN0dWF0aW9uIFtJTlRFUk5BTF0KICovCnN0YXRpYyBpbnQgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHVuc2lnbmVkIGNoYXIgYykKewogIC8qICJwdW5jdHVhdGlvbiBjaGFyYWN0ZXIiIGluIHRoaXMgY29udGV4dCBpcyBhIGNoYXJhY3RlciB3aGljaCBpcwogICAgIGNvbnNpZGVyZWQgImxlc3MgaW1wb3J0YW50IiBkdXJpbmcgd29yZCBzb3J0IGNvbXBhcmlzb24uCiAgICAgU2VlIExDTWFwU3RyaW5nIGltcGxlbWVudGF0aW9uIGZvciB0aGUgcHJlY2lzZSBkZWZpbml0aW9uCiAgICAgb2YgImxlc3MgaW1wb3J0YW50Ii4gKi8KCiAgcmV0dXJuIChMQ01fVW5pY29kZV9MVVRbLTIrMipjXT09Nik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc05vblNwYWNpbmcgW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzTm9uU3BhY2luZyh1bnNpZ25lZCBjaGFyIGMpCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycwogICAgIGZvciB3aGljaCBpdCByZXR1cm5zIHRydWUgYXJlIGlnbm9yZWQgd2hlbiBtYXBwaW5nIGEKICAgICBzdHJpbmcgd2l0aCBOT1JNX0lHTk9SRU5PTlNQQUNFICovCiAgcmV0dXJuICgoYz09MTM2KSB8fCAoYz09MTcwKSB8fCAoYz09MTg2KSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFMk5MU19pc1N5bWJvbCBbSU5URVJOQUxdCiAqIEZJWE1FOiBoYW5kbGUgY3VycmVudCBsb2NhbGUKICovCnN0YXRpYyBpbnQgT0xFMk5MU19pc1N5bWJvbCh1bnNpZ25lZCBjaGFyIGMpCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycwogICAgIGZvciB3aGljaCBpdCByZXR1cm5zIHRydWUgYXJlIGlnbm9yZWQgd2hlbiBtYXBwaW5nIGEKICAgICBzdHJpbmcgd2l0aCBOT1JNX0lHTk9SRVNZTUJPTFMgKi8KICByZXR1cm4gKCAoYyE9MCkgJiYgIShpc2FscGhhKGMpIHx8IGlzZGlnaXQoYykpICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCWlkZW50aXR5CVtJbnRlcm5hbF0KICovCnN0YXRpYyBpbnQgaWRlbnRpdHkoaW50IGMpCnsKICByZXR1cm4gYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuQF0KICoKICogQ29udmVydCBhIHN0cmluZywgb3IgZ2VuZXJhdGUgYSBzb3J0IGtleSBmcm9tIGl0LgogKgogKiBJZiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSwgdGhlIGZ1bmN0aW9uIHdpbGwgZ2VuZXJhdGUKICogYSBzb3J0IGtleSBmb3IgdGhlIHNvdXJjZSBzdHJpbmcuICBFbHNlLCBpdCB3aWxsIGNvbnZlcnQgaXQKICogYWNjb3JkaW5nbHkgdG8gdGhlIGZsYWdzIExDTUFQX1VQUEVSQ0FTRSwgTENNQVBfTE9XRVJDQVNFLC4uLgogKgogKiBSRVRVUk5TCiAqICAgIEVycm9yIDogMC4KICogICAgU3VjY2VzcyA6IGxlbmd0aCBvZiB0aGUgcmVzdWx0IHN0cmluZy4KICoKICogTk9URVMKICogICAgSWYgY2FsbGVkIHdpdGggc2NybGVuID0gLTEsIHRoZSBmdW5jdGlvbiB3aWxsIGNvbXB1dGUgdGhlIGxlbmd0aAogKiAgICAgIG9mIHRoZSAwLXRlcm1pbmF0ZWQgc3RyaW5nIHN0cnNyYyBieSBpdHNlbGYuCiAqCiAqICAgIElmIGNhbGxlZCB3aXRoIGRzdGxlbiA9IDAsIHJldHVybnMgdGhlIGJ1ZmZlciBsZW5ndGggdGhhdAogKiAgICAgIHdvdWxkIGJlIHJlcXVpcmVkLgogKgogKiAgICBOT1JNX0lHTk9SRVdJRFRIIG1lYW5zIHRvIGNvbXBhcmUgQVNDSUkgYW5kIHdpZGUgY2hhcmFjdGVycwogKiAgICBhcyBpZiB0aGV5IGFyZSBlcXVhbC4KICogICAgSW4gdGhlIG9ubHkgY29kZSBwYWdlIGltcGxlbWVudGVkIHNvIGZhciwgdGhlcmUgbWF5IG5vdCBiZQogKiAgICB3aWRlIGNoYXJhY3RlcnMgaW4gc3RyaW5ncyBwYXNzZWQgdG8gTENNYXBTdHJpbmdBLAogKiAgICBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIGRvbmUgZm9yIHRoaXMgZmxhZy4KICovCklOVCBXSU5BUEkgTENNYXBTdHJpbmdBKAoJTENJRCBsY2lkLCAgICAgIC8qIFtpbl0gbG9jYWxlIGlkZW50aWZpZXIgY3JlYXRlZCB3aXRoIE1BS0VMQ0lEOwoJCSAgICAgICAgICAgICAgICBMT0NBTEVfU1lTVEVNX0RFRkFVTFQgYW5kIExPQ0FMRV9VU0VSX0RFRkFVTFQgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZGVmaW5lZCB2YWx1ZXMuICovCglEV09SRCBtYXBmbGFncywgLyogW2luXSBmbGFncyAqLwoJTFBDU1RSIHNyY3N0ciwgIC8qIFtpbl0gc291cmNlIGJ1ZmZlciAqLwoJSU5UIHNyY2xlbiwgICAgIC8qIFtpbl0gc291cmNlIGxlbmd0aCAqLwoJTFBTVFIgZHN0c3RyLCAgIC8qIFtvdXRdIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLwoJSU5UIGRzdGxlbikgICAgIC8qIFtpbl0gZGVzdGluYXRpb24gYnVmZmVyIGxlbmd0aCAqLwp7CiAgaW50IGk7CgogIFRSQUNFKCIoMHglMDRseCwweCUwOGx4LCVzLCVkLCVwLCVkKVxuIiwKCWxjaWQsbWFwZmxhZ3MsZGVidWdzdHJfYW4oc3Jjc3RyLHNyY2xlbiksc3JjbGVuLGRzdHN0cixkc3RsZW4pOwoKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIEVSUigiKHNyYz0lcyxkZXN0PSVzKTogSW52YWxpZCBOVUxMIHN0cmluZ1xuIiwKCWRlYnVnc3RyX2FuKHNyY3N0cixzcmNsZW4pLCBkc3RzdHIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KICBpZiAoc3JjbGVuID09IC0xKQogICAgc3JjbGVuID0gc3RybGVuKHNyY3N0cikgKyAxIDsgICAgLyogKGluY2x1ZGUgZmluYWwgJ1wwJykgKi8KCiNkZWZpbmUgTENNQVBTVFJJTkdBX1NVUFBPUlRFRF9GTEFHUyAoTENNQVBfVVBQRVJDQVNFICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExDTUFQX0xPV0VSQ0FTRSAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ01BUF9TT1JUS0VZICAgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVDQVNFICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFTk9OU1BBQ0UgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT1JUX1NUUklOR1NPUlQgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVXSURUSCAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFS0FOQVRZUEUpCiAgLyogRklYTUU6IGFzIGxvbmcgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBLYXRha2FuYSBub3IgSGlyYWdhbmEKICAgKiBjaGFyYWN0ZXJzLCB3ZSBjYW4gc3VwcG9ydCBOT1JNX0lHTk9SRUtBTkFUWVBFCiAgICovCiAgaWYgKG1hcGZsYWdzICYgfkxDTUFQU1RSSU5HQV9TVVBQT1JURURfRkxBR1MpCiAgewogICAgRklYTUUoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLAoJICBtYXBmbGFncywKCSAgc3Jjc3RyLAoJICBzcmNsZW4sCgkgIGRzdHN0ciwKCSAgZHN0bGVuLAoJICBtYXBmbGFncyAmIH5MQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTCiAgICAgKTsKICB9CgogIGlmICggIShtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpICkKICB7CiAgICBpbnQgaSxqOwogICAgaW50ICgqZikoaW50KSA9IGlkZW50aXR5OwogICAgaW50IGZsYWdfaWdub3Jlbm9uc3BhY2UgPSBtYXBmbGFncyAmIE5PUk1fSUdOT1JFTk9OU1BBQ0U7CiAgICBpbnQgZmxhZ19pZ25vcmVzeW1ib2xzID0gbWFwZmxhZ3MgJiBOT1JNX0lHTk9SRVNZTUJPTFM7CgogICAgaWYgKGZsYWdfaWdub3Jlbm9uc3BhY2UgfHwgZmxhZ19pZ25vcmVzeW1ib2xzKQogICAgewogICAgICAvKiBGb3Igc29tZSB2YWx1ZXMgb2YgbWFwZmxhZ3MsIHRoZSBsZW5ndGggb2YgdGhlIHJlc3VsdGluZwoJIHN0cmluZyBpcyBub3Qga25vd24gYXQgdGhpcyBwb2ludC4gIFdpbmRvd3MgZG9lcyBtYXAgdGhlIHN0cmluZwoJIGFuZCBkb2VzIG5vdCBTZXRMYXN0RXJyb3IgRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiBpbgoJIHRoZXNlIGNhc2VzLiAqLwogICAgICBpZiAoZHN0bGVuPT0wKQogICAgICB7CgkvKiBDb21wdXRlIHJlcXVpcmVkIGxlbmd0aCAqLwoJZm9yIChpPWo9MDsgaSA8IHNyY2xlbjsgaSsrKQoJewoJICBpZiAoICEoZmxhZ19pZ25vcmVub25zcGFjZSAmJiBPTEUyTkxTX2lzTm9uU3BhY2luZyhzcmNzdHJbaV0pKQoJICAgICAgICYmICEoZmxhZ19pZ25vcmVzeW1ib2xzICYmIE9MRTJOTFNfaXNTeW1ib2woc3Jjc3RyW2ldKSkgKQoJICAgIGorKzsKCX0KCXJldHVybiBqOwogICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGlmIChkc3RsZW49PTApCglyZXR1cm4gc3JjbGVuOwogICAgICBpZiAoZHN0bGVuPHNyY2xlbikKCSAgIHsKCSAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICAgICByZXR1cm4gMDsKCSAgIH0KICAgIH0KICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKICAgICAgZiA9IHRvdXBwZXI7CiAgICBlbHNlIGlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkKICAgICAgZiA9IHRvbG93ZXI7CiAgICAvKiBGSVhNRTogTk9STV9JR05PUkVOT05TUEFDRSByZXF1aXJlcyBhbm90aGVyIGNvbnZlcnNpb24gKi8KICAgIGZvciAoaT1qPTA7IChpPHNyY2xlbikgJiYgKGo8ZHN0bGVuKSA7IGkrKykKICAgIHsKICAgICAgaWYgKCAhKGZsYWdfaWdub3Jlbm9uc3BhY2UgJiYgT0xFMk5MU19pc05vblNwYWNpbmcoc3Jjc3RyW2ldKSkKCSAgICYmICEoZmxhZ19pZ25vcmVzeW1ib2xzICYmIE9MRTJOTFNfaXNTeW1ib2woc3Jjc3RyW2ldKSkgKQogICAgICB7Cglkc3RzdHJbal0gPSAoQ0hBUikgZihzcmNzdHJbaV0pOwoJaisrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gajsKICB9CgogIC8qIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIGNvbXBsZXRlbHkgaWdub3JlcyB0aGUgImxjaWQiIHBhcmFtZXRlci4gKi8KICAvKiBlbHNlIC4uLiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSAgKi8KICB7CiAgICBpbnQgdW5pY29kZV9sZW49MDsKICAgIGludCBjYXNlX2xlbj0wOwogICAgaW50IGRpYWNyaXRpY19sZW49MDsKICAgIGludCBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbj0wOwogICAgY2hhciAqY2FzZV9jb21wb25lbnQ7CiAgICBjaGFyICpkaWFjcml0aWNfY29tcG9uZW50OwogICAgY2hhciAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQ7CiAgICBpbnQgcm9vbSxjb3VudDsKICAgIGludCBmbGFnX3N0cmluZ3NvcnQgPSBtYXBmbGFncyAmIFNPUlRfU1RSSU5HU09SVDsKCiAgICAvKiBjb21wdXRlIGhvdyBtdWNoIHJvb20gd2Ugd2lsbCBuZWVkICovCiAgICBmb3IgKGk9MDtpPHNyY2xlbjtpKyspCiAgICB7CiAgICAgIGludCBvZnM7CiAgICAgIHVuc2lnbmVkIGNoYXIgc291cmNlX2NoYXIgPSBzcmNzdHJbaV07CiAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykKICAgICAgewoJaWYgKGZsYWdfc3RyaW5nc29ydCB8fCAhT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkKCXsKCSAgdW5pY29kZV9sZW4rKzsKCSAgaWYgKCBMQ01fVW5pY29kZV9MVVRbLTIrMipzb3VyY2VfY2hhcl0gJiB+MTUgKQoJICAgIHVuaWNvZGVfbGVuKys7ICAgICAgICAgICAgIC8qIGRvdWJsZSBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZGVsYXllZF9wdW5jdHVhdGlvbl9sZW4rKzsKCX0KICAgICAgfQoKICAgICAgaWYgKGlzdXBwZXIoc291cmNlX2NoYXIpKQoJY2FzZV9sZW49dW5pY29kZV9sZW47CgogICAgICBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CiAgICAgIGlmICgob2ZzPj0wKSAmJiAoTENNX0RpYWNyaXRpY19MVVRbb2ZzXSE9MikpCglkaWFjcml0aWNfbGVuPXVuaWNvZGVfbGVuOwogICAgfQoKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFQ0FTRSkKICAgICAgY2FzZV9sZW49MDsKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCiAgICAgIGRpYWNyaXRpY19sZW49MDsKCiAgICByb29tID0gIDIgKiB1bmljb2RlX2xlbiAgICAgICAgICAgICAgLyogInVuaWNvZGUiIGNvbXBvbmVudCAqLwogICAgICArICAgICBkaWFjcml0aWNfbGVuICAgICAgICAgICAgICAgIC8qICJkaWFjcml0aWMiIGNvbXBvbmVudCAqLwogICAgICArICAgICBjYXNlX2xlbiAgICAgICAgICAgICAgICAgICAgIC8qICJjYXNlIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgNCAqIGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuICAvKiBwdW5jdHVhdGlvbiBpbiB3b3JkIHNvcnQgbW9kZSAqLwogICAgICArICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdXIgJ1wxJyBzZXBhcmF0b3JzICovCiAgICAgICsgICAgIDEgIDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYWwgJ1wwJyAqLwogICAgaWYgKGRzdGxlbj09MCkKICAgICAgcmV0dXJuIHJvb207CiAgICBlbHNlIGlmIChkc3RsZW48cm9vbSkKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICByZXR1cm4gMDsKICAgIH0KI2lmIDAKICAgIC8qRklYTUUgdGhlIFBvaW50ZXJjaGVjayBzaG91bGQgbm90IGJlIG5lc3Nlc2FyeSAqLwogICAgaWYgKElzQmFkV3JpdGVQdHIgKGRzdHN0cixyb29tKSkKICAgIHsgRVJSKCJiYWQgZGVzdGluYXRpb24gYnVmZmVyIChkc3RzdHIpIDogJXAsJWRcbiIsZHN0c3RyLGRzdGxlbik7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbmRpZgogICAgLyogbG9jYXRlIGVhY2ggY29tcG9uZW50LCB3cml0ZSBzZXBhcmF0b3JzICovCiAgICBkaWFjcml0aWNfY29tcG9uZW50ID0gZHN0c3RyICsgMip1bmljb2RlX2xlbiA7CiAgICAqZGlhY3JpdGljX2NvbXBvbmVudCsrID0gJ1wxJzsKICAgIGNhc2VfY29tcG9uZW50ID0gZGlhY3JpdGljX2NvbXBvbmVudCArIGRpYWNyaXRpY19sZW4gOwogICAgKmNhc2VfY29tcG9uZW50KysgPSAnXDEnOwogICAgZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQgPSBjYXNlX2NvbXBvbmVudCArIGNhc2VfbGVuIDsKICAgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gJ1wxJzsKICAgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gJ1wxJzsKCiAgICAvKiByZWFkIHNvdXJjZSBzdHJpbmcgY2hhciBieSBjaGFyLCB3cml0ZQogICAgICAgY29ycmVzcG9uZGluZyB3ZWlnaHQgaW4gZWFjaCBjb21wb25lbnQuICovCiAgICBmb3IgKGk9MCxjb3VudD0wO2k8c3JjbGVuO2krKykKICAgIHsKICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhcj1zcmNzdHJbaV07CiAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykKICAgICAgewoJaW50IHR5cGUsbG9uZ2NvZGU7Cgl0eXBlID0gTENNX1VuaWNvZGVfTFVUWy0yKzIqc291cmNlX2NoYXJdOwoJbG9uZ2NvZGUgPSB0eXBlID4+IDQ7Cgl0eXBlICY9IDE1OwoJaWYgKCFmbGFnX3N0cmluZ3NvcnQgJiYgT0xFMk5MU19pc1B1bmN0dWF0aW9uKHNvdXJjZV9jaGFyKSkKCXsKCSAgV09SRCBlbmNyeXB0ZWRfbG9jYXRpb24gPSAoMTw8MTUpICsgNyArIDQqY291bnQ7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gKHVuc2lnbmVkIGNoYXIpIChlbmNyeXB0ZWRfbG9jYXRpb24+PjgpOwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uJjI1NSk7CiAgICAgICAgICAgICAgICAgICAgIC8qIGJpZy1lbmRpYW4gaXMgdXNlZCBoZXJlIGJlY2F1c2UgaXQgbGV0cyBzdHJpbmcgY29tcGFyaXNvbiBiZQoJCQljb21wYXRpYmxlIHdpdGggbnVtZXJpY2FsIGNvbXBhcmlzb24gKi8KCgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gdHlwZTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07CiAgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtcHRpb24gOiBhIHB1bmN0dWF0aW9uIGNoYXJhY3RlciBpcyBuZXZlciBhCgkJCWRvdWJsZSBvciBhY2NlbnRlZCBsZXR0ZXIgKi8KCX0KCWVsc2UKCXsKCSAgZHN0c3RyWzIqY291bnRdID0gdHlwZTsKCSAgZHN0c3RyWzIqY291bnQrMV0gPSBMQ01fVW5pY29kZV9MVVRbLTErMipzb3VyY2VfY2hhcl07CgkgIGlmIChsb25nY29kZSkKCSAgewoJICAgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CgkgICAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgICAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IDI7IC8qIGFzc3VtcHRpb246IGEgZG91YmxlIGxldHRlcgoJCQkJCQkgaXMgbmV2ZXIgYWNjZW50ZWQgKi8KCSAgICBjb3VudCsrOwoKCSAgICBkc3RzdHJbMipjb3VudF0gPSB0eXBlOwoJICAgIGRzdHN0clsyKmNvdW50KzFdID0gKihMQ01fVW5pY29kZV9MVVRfMiAtIDEgKyBsb25nY29kZSk7CgkgICAgLyogMTYgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAxCgkgICAgICAgMzIgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAyCgkgICAgICAgNDggaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAzICovCgkgIH0KCgkgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICBjYXNlX2NvbXBvbmVudFtjb3VudF0gPSAoIGlzdXBwZXIoc291cmNlX2NoYXIpID8gMTggOiAyICkgOwoJICBpZiAoY291bnQ8ZGlhY3JpdGljX2xlbikKCSAgewoJICAgIGludCBvZnMgPSBzb3VyY2VfY2hhciAtIExDTV9EaWFjcml0aWNfU3RhcnQ7CgkgICAgZGlhY3JpdGljX2NvbXBvbmVudFtjb3VudF0gPSAob2ZzPj0wID8gTENNX0RpYWNyaXRpY19MVVRbb2ZzXSA6IDIpOwoJICB9CgkgIGNvdW50Kys7Cgl9CiAgICAgIH0KICAgIH0KICAgIGRzdHN0cltyb29tLTFdID0gJ1wwJzsKICAgIHJldHVybiByb29tOwogIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nVyAgICAgICAgICAgICAgICBbS0VSTkVMMzIuQF0KICoKICogQ29udmVydCBhIHN0cmluZywgb3IgZ2VuZXJhdGUgYSBzb3J0IGtleSBmcm9tIGl0LgogKgogKiBOT1RFCiAqCiAqIFNlZSBMQ01hcFN0cmluZ0EgZm9yIGRvY3VtZW50YXRpb24KICovCklOVCBXSU5BUEkgTENNYXBTdHJpbmdXKAoJTENJRCBsY2lkLERXT1JEIG1hcGZsYWdzLExQQ1dTVFIgc3Jjc3RyLElOVCBzcmNsZW4sTFBXU1RSIGRzdHN0ciwKCUlOVCBkc3RsZW4pCnsKICBpbnQgaTsKCiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpXG4iLAogICAgICAgICAgICAgICAgIGxjaWQsIG1hcGZsYWdzLCBzcmNzdHIsIHNyY2xlbiwgZHN0c3RyLCBkc3RsZW4pOwoKICBpZiAoICgoZHN0bGVuIT0wKSAmJiAoZHN0c3RyPT1OVUxMKSkgfHwgKHNyY3N0cj09TlVMTCkgKQogIHsKICAgIEVSUigiKHNyYz0lcCxkc3Q9JXApOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzcmNzdHIsIGRzdHN0cik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChzcmNsZW49PS0xKQogICAgc3JjbGVuID0gc3RybGVuVyhzcmNzdHIpKzE7CgogIC8qIEZJWE1FOiBCb3RoIHRoaXMgZnVuY3Rpb24gYW5kIGl0J3MgY29tcGFuaW9uIExDTWFwU3RyaW5nQSgpCiAgICogY29tcGxldGVseSBpZ25vcmUgdGhlICJsY2lkIiBwYXJhbWV0ZXIuICBJbiBwbGFjZSBvZiB0aGUgImxjaWQiCiAgICogcGFyYW1ldGVyIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHNldCB0aGUgIkxDX0NPTExBVEUiIG9yICJMQ19BTEwiCiAgICogZW52aXJvbm1lbnQgdmFyaWFibGUgcHJpb3IgdG8gaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4gICovCiAgaWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkKICB7CiAgICAgIC8qIFBvc3NpYmxlIHZhbHVlcyBvZiBMQ19DT0xMQVRFLiAqLwogICAgICBjaGFyICpsY19jb2xsYXRlX2RlZmF1bHQgPSAwOyAvKiB2YWx1ZSBwcmlvciB0byB0aGlzIGZ1bmN0aW9uICovCiAgICAgIGNoYXIgKmxjX2NvbGxhdGVfZW52ID0gMDsgICAgIC8qIHZhbHVlIHJldHJpZXZlZCBmcm9tIHRoZSBlbnZpcm9ubWVudCAqLwoKICAgICAgLyogR2VuZXJhbCBwdXJwb3NlIGluZGV4IGludG8gc3RyaW5ncyBvZiBhbnkgdHlwZS4gKi8KICAgICAgaW50IHN0cl9pZHggPSAwOwoKICAgICAgLyogTGVuZ3RocyBvZiB2YXJpb3VzIHN0cmluZ3Mgd2hlcmUgdGhlIGxlbmd0aCBpcyBtZWFzdXJlZCBpbgogICAgICAgKiB3aWRlIGNoYXJhY3RlcnMgZm9yIHdpZGUgY2hhcmFjdGVyIHN0cmluZ3MgYW5kIGluIGJ5dGVzIGZvcgogICAgICAgKiBuYXRpdmUgc3RyaW5ncy4gIFRoZSBsZW5ndGhzIGluY2x1ZGUgdGhlIE5VTEwgdGVybWluYXRvci4gICovCiAgICAgIHNpemVfdCByZXR1cm5lZF9sZW4gICAgPSAwOwogICAgICBzaXplX3Qgc3JjX25hdGl2ZV9sZW4gID0gMDsKICAgICAgc2l6ZV90IGRzdF9uYXRpdmVfbGVuICA9IDA7CiAgICAgIHNpemVfdCBkc3RzdHJfbGliY19sZW4gPSAwOwoKICAgICAgLyogTmF0aXZlIChjaGFyYWN0ZXIgc2V0IGRldGVybWluZWQgYnkgbG9jYWxlKSB2ZXJzaW9ucyBvZiB0aGUKICAgICAgICogc3RyaW5ncyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHN0cmluZ3MuICAqLwogICAgICBMUFNUUiBzcmNfbmF0aXZlID0gMDsKICAgICAgTFBTVFIgZHN0X25hdGl2ZSA9IDA7CgogICAgICAvKiBWZXJzaW9uIG9mIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIHN0cmluZ3MgdXNpbmcgdGhlCiAgICAgICAqICJ3Y2hhcl90IiBVbmljb2RlIGRhdGEgdHlwZSBuZWVkZWQgYnkgdmFyaW91cyBsaWJjIGZ1bmN0aW9ucy4gICovCiAgICAgIHdjaGFyX3QgKnNyY3N0cl9saWJjID0gMDsKICAgICAgd2NoYXJfdCAqZHN0c3RyX2xpYmMgPSAwOwoKICAgICAgaWYoIShzcmNzdHJfbGliYyA9ICh3Y2hhcl90ICopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY2xlbiAqIHNpemVvZih3Y2hhcl90KSkpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3Igc3Jjc3RyX2xpYmNcbiIsCiAgICAgICAgICAgICAgc3JjbGVuICogc2l6ZW9mKHdjaGFyX3QpKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgLyogQ29udmVydCBzb3VyY2Ugc3RyaW5nIHRvIGEgbGliYyBVbmljb2RlIHN0cmluZy4gKi8KICAgICAgZm9yKHN0cl9pZHggPSAwOyBzdHJfaWR4IDwgc3JjbGVuOyBzdHJfaWR4KyspCiAgICAgIHsKICAgICAgICAgIHNyY3N0cl9saWJjW3N0cl9pZHhdID0gc3Jjc3RyW3N0cl9pZHhdOwogICAgICB9CgogICAgICAvKiBzcmNfbmF0aXZlIHNob3VsZCBjb250YWluIGF0IG1vc3QgMyBieXRlcyBmb3IgZWFjaAogICAgICAgKiBtdWx0aWJ5dGUgY2hhcmFjdGVycyBpbiB0aGUgb3JpZ2luYWwgc3Jjc3RyIHN0cmluZy4gICovCiAgICAgIHNyY19uYXRpdmVfbGVuID0gMyAqIHNyY2xlbjsKICAgICAgaWYoIShzcmNfbmF0aXZlID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfbmF0aXZlX2xlbikpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3Igc3JjX25hdGl2ZVxuIiwgc3JjX25hdGl2ZV9sZW4pOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQoKICAgICAgLyogRklYTUU6IFByaW9yIHRvIHRvIHNldHRpbmcgdGhlIExDX0NPTExBVEUgbG9jYWxlIGNhdGVnb3J5IHRoZQogICAgICAgKiBjdXJyZW50IHZhbHVlIGlzIGJhY2tlZCB1cCBzbyBpdCBjYW4gYmUgcmVzdG9yZWQgYWZ0ZXIgdGhlCiAgICAgICAqIGxhc3QgTENfQ09MTEFURSBzZW5zaXRpdmUgZnVuY3Rpb24gcmV0dXJucy4KICAgICAgICoKICAgICAgICogRXZlbiB0aG91Z2ggdGhlIGxvY2FsZSBpcyBhZGp1c3RlZCBmb3IgYSBtaW5pbXVtIGFtb3VudCBvZgogICAgICAgKiB0aW1lIGEgcmFjZSBjb25kaXRpb24gZXhpc3RzIHdoZXJlIG90aGVyIHRocmVhZHMgbWF5IGJlCiAgICAgICAqIGFmZmVjdGVkIGlmIHRoZXkgaW52b2tlIExDX0NPTExBVEUgc2Vuc2l0aXZlIGZ1bmN0aW9ucy4gIE9uZQogICAgICAgKiBwb3NzaWJsZSBzb2x1dGlvbiBpcyB0byB3cmFwIGFsbCBMQ19DT0xMQVRFIHNlbnNpdGl2ZSBXaW5lCiAgICAgICAqIGZ1bmN0aW9ucywgbGlrZSBMQ01hcFN0cmluZ1coKSwgaW4gYSBtdXRleC4KICAgICAgICoKICAgICAgICogQW5vdGhlciBlbmhhbmNlbWVudCB0byB0aGUgZm9sbG93aW5nIHdvdWxkIGJlIHRvIHNldCB0aGUKICAgICAgICogTENfQ09MTEFURSBsb2NhbGUgY2F0ZWdvcnkgYXMgYSBmdW5jdGlvbiBvZiB0aGUgImxjaWQiCiAgICAgICAqIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHRoZSAiTENfQ09MTEFURSIgZW52aXJvbm1lbnQgdmFyaWFibGUuICovCiAgICAgIGlmKCEobGNfY29sbGF0ZV9kZWZhdWx0ID0gc2V0bG9jYWxlKExDX0NPTExBVEUsIE5VTEwpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gcXVlcnkgdGhlIExDX0NPTExBVEUgY2F0YWdvcnlcbiIpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICBpZighKGxjX2NvbGxhdGVfZW52ID0gc2V0bG9jYWxlKExDX0NPTExBVEUsICIiKSkpCiAgICAgIHsKICAgICAgICAgIEVSUigiVW5hYmxlIHRvIGluaGVyaXQgdGhlIExDX0NPTExBVEUgbG9jYWxlIGNhdGVnb3J5IGZyb20gdGhlICIKICAgICAgICAgICAgICAiZW52aXJvbm1lbnQuICBUaGUgXCJMQ19DT0xMQVRFXCIgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgIgogICAgICAgICAgICAgICJcIiVzXCIuXG4iLCBnZXRlbnYoIkxDX0NPTExBVEUiKSA/CiAgICAgICAgICAgICAgZ2V0ZW52KCJMQ19DT0xMQVRFIikgOiAiPHVuc2V0PiIpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICBUUkFDRSgibGNfY29sbGF0ZV9kZWZhdWx0ID0gJXNcbiIsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgIFRSQUNFKCJsY19jb2xsYXRlX2VudiA9ICVzXG4iLCBsY19jb2xsYXRlX2Vudik7CgogICAgICAvKiBDb252ZXJ0IHRoZSBsaWJjIFVuaWNvZGUgc3RyaW5nIHRvIGEgbmF0aXZlIG11bHRpYnl0ZSBjaGFyYWN0ZXIKICAgICAgICogc3RyaW5nLiAqLwogICAgICByZXR1cm5lZF9sZW4gPSB3Y3N0b21icyhzcmNfbmF0aXZlLCBzcmNzdHJfbGliYywgc3JjX25hdGl2ZV9sZW4pICsgMTsKICAgICAgaWYocmV0dXJuZWRfbGVuID09IDApCiAgICAgIHsKICAgICAgICAgIEVSUigid2NzdG9tYnMgZmFpbGVkLiAgVGhlIHN0cmluZyBzcGVjaWZpZWQgKCVzKSBtYXkgY29udGFpbiBhbiBpbnZhbGlkIGNoYXJhY3Rlci5cbiIsCiAgICAgICAgICAgICAgZGVidWdzdHJfdyhzcmNzdHIpKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIGVsc2UgaWYocmV0dXJuZWRfbGVuID4gc3JjX25hdGl2ZV9sZW4pCiAgICAgIHsKICAgICAgICAgIHNyY19uYXRpdmVbc3JjX25hdGl2ZV9sZW4gLSAxXSA9IDA7CiAgICAgICAgICBFUlIoIndjc3RvbWJzIHJldHVybmVkIGEgc3RyaW5nICglcykgdGhhdCB3YXMgbG9uZ2VyICglZCBieXRlcykgIgogICAgICAgICAgICAgICJ0aGFuIGV4cGVjdGVkICglZCBieXRlcykuXG4iLCBzcmNfbmF0aXZlLCByZXR1cm5lZF9sZW4sCiAgICAgICAgICAgICAgZHN0X25hdGl2ZV9sZW4pOwoKICAgICAgICAgIC8qIFNpbmNlIHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgSSdtIG5vdCBzdXJlIHdoYXQgdGhlIGNvcnJlY3QKICAgICAgICAgICAqIGVycm9yIGNvZGUgaXMuICAqLwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKCiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHNyY19uYXRpdmVfbGVuID0gcmV0dXJuZWRfbGVuOwoKICAgICAgVFJBQ0UoInNyY19uYXRpdmUgPSAlcyAgc3JjX25hdGl2ZV9sZW4gPSAlZFxuIiwKICAgICAgICAgICAgIHNyY19uYXRpdmUsIHNyY19uYXRpdmVfbGVuKTsKCiAgICAgIC8qIGRzdF9uYXRpdmUgc2VlbXMgdG8gY29udGFpbiBhdCBtb3N0IDQgYnl0ZXMgZm9yIGVhY2ggYnl0ZSBpbgogICAgICAgKiB0aGUgb3JpZ2luYWwgc3JjX25hdGl2ZSBzdHJpbmcuICBDaGFuZ2UgaWYgbmVlZCBiZSBzaW5jZSB0aGlzCiAgICAgICAqIGlzbid0IGRvY3VtZW50ZWQgYnkgdGhlIHN0cnhmcm0oKSBtYW4gcGFnZS4gKi8KICAgICAgZHN0X25hdGl2ZV9sZW4gPSA0ICogc3JjX25hdGl2ZV9sZW47CiAgICAgIGlmKCEoZHN0X25hdGl2ZSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZV9sZW4pKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGRzdF9uYXRpdmVcbiIsIGRzdF9uYXRpdmVfbGVuKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBUaGUgYWN0dWFsIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlIGZvbGxvd2luZyBjYWxsIHRvCiAgICAgICAqIHN0cnhmcm0oKS4gIFRoZSBzdXJyb3VuZGluZyBjb2RlIGNvdWxkIGhhdmUgYmVlbiBzaW1wbGlmaWVkCiAgICAgICAqIGJ5IGNhbGxpbmcgd2NzeGZybSgpIGluc3RlYWQgZXhjZXB0IHRoYXQgd2NzeGZybSgpIGlzIG5vdAogICAgICAgKiBhdmFpbGFibGUgb24gb2xkZXIgTGludXggc3lzdGVtcyAoUmVkSGF0IDQuMSB3aXRoCiAgICAgICAqIGxpYmMtNS4zLjEyLTE3KS4KICAgICAgICoKICAgICAgICogQWxzbywgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgdHJhbnNsYXRpb24gY291bGQgYmUgZG9uZSBieQogICAgICAgKiB2YXJpb3VzIHRhYmxlcyBhcyBpdCBpcyBkb25lIGluIExDTWFwU3RyaW5nQSgpLiAgSG93ZXZlciwgSSdtCiAgICAgICAqIG5vdCBzdXJlIHdoYXQgdGhvc2UgdGFibGVzIGFyZS4gKi8KICAgICAgcmV0dXJuZWRfbGVuID0gc3RyeGZybShkc3RfbmF0aXZlLCBzcmNfbmF0aXZlLCBkc3RfbmF0aXZlX2xlbikgKyAxOwoKICAgICAgaWYocmV0dXJuZWRfbGVuID4gZHN0X25hdGl2ZV9sZW4pCiAgICAgIHsKICAgICAgICAgIGRzdF9uYXRpdmVbZHN0X25hdGl2ZV9sZW4gLSAxXSA9IDA7CiAgICAgICAgICBFUlIoInN0cnhmcm0gcmV0dXJuZWQgYSBzdHJpbmcgKCVzKSB0aGF0IHdhcyBsb25nZXIgKCVkIGJ5dGVzKSAiCiAgICAgICAgICAgICAgInRoYW4gZXhwZWN0ZWQgKCVkIGJ5dGVzKS5cbiIsIGRzdF9uYXRpdmUsIHJldHVybmVkX2xlbiwKICAgICAgICAgICAgICBkc3RfbmF0aXZlX2xlbik7CgogICAgICAgICAgLyogU2luY2UgdGhpcyBpcyBhbiBpbnRlcm5hbCBlcnJvciBJJ20gbm90IHN1cmUgd2hhdCB0aGUgY29ycmVjdAogICAgICAgICAgICogZXJyb3IgY29kZSBpcy4gICovCiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwoKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIGlmKGRzdF9uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdF9uYXRpdmUpOwogICAgICAgICAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxjX2NvbGxhdGVfZGVmYXVsdCk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBkc3RfbmF0aXZlX2xlbiA9IHJldHVybmVkX2xlbjsKCiAgICAgIFRSQUNFKCJkc3RfbmF0aXZlID0gJXMgIGRzdF9uYXRpdmVfbGVuID0gJWRcbiIsCiAgICAgICAgICAgICBkc3RfbmF0aXZlLCBkc3RfbmF0aXZlX2xlbik7CgogICAgICBkc3RzdHJfbGliY19sZW4gPSBkc3RfbmF0aXZlX2xlbjsKICAgICAgaWYoIShkc3RzdHJfbGliYyA9ICh3Y2hhcl90ICopSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdHN0cl9saWJjX2xlbiAqIHNpemVvZih3Y2hhcl90KSkpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSAlZCBieXRlcyBmb3IgZHN0c3RyX2xpYmNcbiIsCiAgICAgICAgICAgICAgZHN0c3RyX2xpYmNfbGVuICogc2l6ZW9mKHdjaGFyX3QpKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIC8qIENvbnZlcnQgdGhlIG5hdGl2ZSBtdWx0aWJ5dGUgc3RyaW5nIHRvIGEgbGliYyBVbmljb2RlIHN0cmluZy4gKi8KICAgICAgcmV0dXJuZWRfbGVuID0gbWJzdG93Y3MoZHN0c3RyX2xpYmMsIGRzdF9uYXRpdmUsIGRzdF9uYXRpdmVfbGVuKSArIDE7CgogICAgICAvKiBSZXN0b3JlIExDX0NPTExBVEUgbm93IHRoYXQgdGhlIGxhc3QgTENfQ09MTEFURSBzZW5zaXRpdmUKICAgICAgICogZnVuY3Rpb24gaGFzIHJldHVybmVkLiAqLwogICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKCiAgICAgIGlmKHJldHVybmVkX2xlbiA9PSAwKQogICAgICB7CiAgICAgICAgICBFUlIoIm1ic3Rvd2NzIGZhaWxlZC4gIFRoZSBuYXRpdmUgdmVyc2lvbiBvZiB0aGUgdHJhbnNsYXRlZCBzdHJpbmcgIgogICAgICAgICAgICAgICIoJXMpIG1heSBjb250YWluIGFuIGludmFsaWQgY2hhcmFjdGVyLlxuIiwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgaWYoZHN0bGVuKQogICAgICB7CiAgICAgICAgICBpZihyZXR1cm5lZF9sZW4gPiBkc3RsZW4pCiAgICAgICAgICB7CiAgICAgICAgICAgICAgRVJSKCJtYnN0b3djcyByZXR1cm5lZCBhIHN0cmluZyB0aGF0IHdhcyBsb25nZXIgKCVkIGNoYXJzKSAiCiAgICAgICAgICAgICAgICAgICJ0aGFuIHRoZSBidWZmZXIgcHJvdmlkZWQgKCVkIGNoYXJzKS5cbiIsIHJldHVybmVkX2xlbiwKICAgICAgICAgICAgICAgICAgZHN0bGVuKTsKICAgICAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQogICAgICAgICAgZHN0bGVuID0gcmV0dXJuZWRfbGVuOwoKICAgICAgICAgIC8qIENvbnZlcnQgYSBsaWJjIFVuaWNvZGUgc3RyaW5nIHRvIHRoZSBkZXN0aW5hdGlvbiBzdHJpbmcuICovCiAgICAgICAgICBmb3Ioc3RyX2lkeCA9IDA7IHN0cl9pZHggPCBkc3RsZW47IHN0cl9pZHgrKykKICAgICAgICAgIHsKICAgICAgICAgICAgICBkc3RzdHJbc3RyX2lkeF0gPSBkc3RzdHJfbGliY1tzdHJfaWR4XTsKICAgICAgICAgIH0KICAgICAgICAgIFRSQUNFKCIxc3QgNCBpbnQgc2l6ZWQgY2h1bmtzIG9mIGRzdHN0ciA9ICV4ICV4ICV4ICV4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgKigoKGludCAqKWRzdHN0cikgKyAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICooKChpbnQgKilkc3RzdHIpICsgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAqKCgoaW50ICopZHN0c3RyKSArIDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgKigoKGludCAqKWRzdHN0cikgKyAzKSk7CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgICBkc3RsZW4gPSByZXR1cm5lZF9sZW47CiAgICAgIH0KICAgICAgVFJBQ0UoImRzdGxlbiAocmV0dXJuKSA9ICVkXG4iLCBkc3RsZW4pOwogICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgIGlmKGRzdHN0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RzdHJfbGliYyk7CiAgICAgIHJldHVybiBkc3RsZW47CiAgfQogIGVsc2UKICB7CiAgICBpbnQgKCpmKShpbnQpPWlkZW50aXR5OwoKICAgIGlmIChkc3RsZW49PTApCiAgICAgICAgcmV0dXJuIHNyY2xlbjsKICAgIGlmIChkc3RsZW48c3JjbGVuKQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9VUFBFUkNBU0UpCiAgICAgIGYgPSB0b3VwcGVyOwogICAgZWxzZSBpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpCiAgICAgIGYgPSB0b2xvd2VyOwogICAgZm9yIChpPTA7IGkgPCBzcmNsZW47IGkrKykKICAgICAgZHN0c3RyW2ldID0gKFdDSEFSKSBmKHNyY3N0cltpXSk7CiAgICByZXR1cm4gc3JjbGVuOwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgKICoKICogRXN0aW1hdGVzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZXF1aXJlZCB0byBob2xkIHRoZSBzdHJpbmcKICogY29tcHV0ZWQgYnkgTENNYXBTdHJpbmdBLgogKgogKiBUaGUgc2l6ZSBpcyBhbHdheXMgb3Zlci1lc3RpbWF0ZWQsIHdpdGggYSBmaXhlZCBsaW1pdCBvbiB0aGUKICogYW1vdW50IG9mIGVzdGltYXRpb24gZXJyb3IuCiAqCiAqIE5vdGUgdGhhdCBsZW4gPT0gLTEgaXMgbm90IHBlcm1pdHRlZC4KICovCnN0YXRpYyBpbmxpbmUgaW50IE9MRTJOTFNfRXN0aW1hdGVNYXBwaW5nTGVuZ3RoKExDSUQgbGNpZCwgRFdPUkQgZHdNYXBGbGFncywKCQkJCQkJTFBDU1RSIHN0ciwgRFdPUkQgbGVuKQp7CiAgICAvKiBFc3RpbWF0ZSBvbmx5IGZvciBzbWFsbCBzdHJpbmdzIHRvIGtlZXAgdGhlIGVzdGltYXRpb24gZXJyb3IgZnJvbQogICAgICogYmVjb21pbmcgdG9vIGxhcmdlLiAqLwogICAgaWYgKGxlbiA8IDEyOCkgcmV0dXJuIGxlbiAqIDggKyA1OwogICAgZWxzZSByZXR1cm4gTENNYXBTdHJpbmdBKGxjaWQsIGR3TWFwRmxhZ3MsIHN0ciwgbGVuLCBOVUxMLCAwKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJQ29tcGFyZVN0cmluZ0EJW0tFUk5FTDMyLkBdCiAqIENvbXBhcmVzIHR3byBzdHJpbmdzIHVzaW5nIGxvY2FsZQogKgogKiBSRVRVUk5TCiAqCiAqIHN1Y2Nlc3M6IENTVFJfTEVTU19USEFOLCBDU1RSX0VRVUFMLCBDU1RSX0dSRUFURVJfVEhBTgogKiBmYWlsdXJlOiAwCiAqCiAqIE5PVEVTCiAqCiAqIERlZmF1bHRzIHRvIGEgd29yZCBzb3J0LCBidXQgdXNlcyBhIHN0cmluZyBzb3J0IGlmCiAqIFNPUlRfU1RSSU5HU09SVCBpcyBzZXQuCiAqIENhbGxzIFNldExhc3RFcnJvciBmb3IgRVJST1JfSU5WQUxJRF9GTEFHUywgRVJST1JfSU5WQUxJRF9QQVJBTUVURVIuCiAqCiAqIEJVR1MKICoKICogVGhpcyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIHRoZSBsb2NhbGUKICoKICogRklYTUUKICoKICogUXVpdGUgaW5lZmZpY2llbnQuCiAqLwppbnQgV0lOQVBJIENvbXBhcmVTdHJpbmdBKAogICAgTENJRCBsY2lkLCAgICAgIC8qIFtpbl0gbG9jYWxlIElEICovCiAgICBEV09SRCBmZHdTdHlsZSwgLyogW2luXSBjb21wYXJpc29uLXN0eWxlIG9wdGlvbnMgKi8KICAgIExQQ1NUUiBzMSwgICAgICAvKiBbaW5dIGZpcnN0IHN0cmluZyAqLwogICAgaW50IGwxLCAgICAgICAgIC8qIFtpbl0gbGVuZ3RoIG9mIGZpcnN0IHN0cmluZyAqLwogICAgTFBDU1RSIHMyLCAgICAgIC8qIFtpbl0gc2Vjb25kIHN0cmluZyAqLwogICAgaW50IGwyKSAgICAgICAgIC8qIFtpbl0gbGVuZ3RoIG9mIHNlY29uZCBzdHJpbmcgKi8KewogIGludCBtYXBzdHJpbmdfZmxhZ3M7CiAgaW50IGxlbjEsbGVuMjsKICBpbnQgcmVzdWx0OwogIExQU1RSIHNrMSxzazI7CiAgVFJBQ0UoIiVzIGFuZCAlc1xuIiwKCWRlYnVnc3RyX2FuIChzMSxsMSksIGRlYnVnc3RyX2FuIChzMixsMikpOwoKICBpZiAoIChzMT09TlVMTCkgfHwgKHMyPT1OVUxMKSApCiAgewogICAgRVJSKCIoczE9JXMsczI9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLAoJZGVidWdzdHJfYW4oczEsbDEpLCBkZWJ1Z3N0cl9hbihzMixsMikpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCiAgICBGSVhNRSgiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCiAgaWYgKGwxID09IC0xKSBsMSA9IHN0cmxlbihzMSk7CiAgaWYgKGwyID09IC0xKSBsMiA9IHN0cmxlbihzMik7CgogIG1hcHN0cmluZ19mbGFncyA9IExDTUFQX1NPUlRLRVkgfCBmZHdTdHlsZSA7CiAgbGVuMSA9IE9MRTJOTFNfRXN0aW1hdGVNYXBwaW5nTGVuZ3RoKGxjaWQsIG1hcHN0cmluZ19mbGFncywgczEsIGwxKTsKICBsZW4yID0gT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgobGNpZCwgbWFwc3RyaW5nX2ZsYWdzLCBzMiwgbDIpOwoKICBpZiAoKGxlbjE9PTApfHwobGVuMj09MCkpCiAgICByZXR1cm4gMDsgICAgIC8qIHNvbWV0aGluZyB3cm9uZyBoYXBwZW5lZCAqLwoKICBzazEgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbjEgKyBsZW4yKTsKICBzazIgPSBzazEgKyBsZW4xOwogIGlmICggKCFMQ01hcFN0cmluZ0EobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczEsbDEsc2sxLGxlbjEpKQoJIHx8ICghTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMyLGwyLHNrMixsZW4yKSkgKQogIHsKICAgIEVSUigiQnVnIGluIExDbWFwU3RyaW5nQS5cbiIpOwogICAgcmVzdWx0ID0gMDsKICB9CiAgZWxzZQogIHsKICAgIC8qIHN0cmNtcCBkb2Vzbid0IG5lY2Vzc2FyaWx5IHJldHVybiAtMSwgMCwgb3IgMSAqLwogICAgcmVzdWx0ID0gc3RyY21wKHNrMSxzazIpOwogIH0KICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc2sxKTsKCiAgaWYgKHJlc3VsdCA8IDApCiAgICByZXR1cm4gMTsKICBpZiAocmVzdWx0ID09IDApCiAgICByZXR1cm4gMjsKCiAgLyogbXVzdCBiZSBncmVhdGVyLCBpZiB3ZSByZWFjaCB0aGlzIHBvaW50ICovCiAgcmV0dXJuIDM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbXBhcmVTdHJpbmdXCVtLRVJORUwzMi5AXQogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKiBGSVhNRSA6ICBEb2VzIG9ubHkgc3RyaW5nIHNvcnQuICBTaG91bGQKICogYmUgcmVpbXBsZW1lbnRlZCB0aGUgc2FtZSB3YXkgYXMgQ29tcGFyZVN0cmluZ0EuCiAqLwppbnQgV0lOQVBJIENvbXBhcmVTdHJpbmdXKExDSUQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBzMSwgaW50IGwxLCBMUENXU1RSIHMyLCBpbnQgbDIpCnsKCWludCBsZW4scmV0OwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQoJCUZJWE1FKCJJR05PUkVOT05TUEFDRSBub3Qgc3VwcG9ydGVkXG4iKTsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCUZJWE1FKCJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwoKCS8qIElzIHN0cmNtcCBkZWZhdWx0aW5nIHRvIHN0cmluZyBzb3J0IG9yIHRvIHdvcmQgc29ydD8/ICovCgkvKiBGSVhNRTogSGFuZGxlIE5PUk1fU1RSSU5HU09SVCAqLwoJbDEgPSAobDE9PS0xKT9zdHJsZW5XKHMxKTpsMTsKCWwyID0gKGwyPT0tMSk/c3RybGVuVyhzMik6bDI7CglsZW4gPSBsMTxsMiA/IGwxOmwyOwoJcmV0ID0gKGZkd1N0eWxlICYgTk9STV9JR05PUkVDQVNFKSA/IHN0cm5jbXBpVyhzMSxzMixsZW4pIDogc3RybmNtcFcoczEsczIsbGVuKTsKCS8qIG5vdCBlcXVhbCwgcmV0dXJuIDEgb3IgMyAqLwoJaWYocmV0IT0wKSB7CgkJLyogbmVlZCB0byB0cmFuc2xhdGUgcmVzdWx0ICovCgkJcmV0dXJuICgoaW50KXJldCA8IDApID8gMSA6IDM7Cgl9CgkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KCWlmKGwxPT1sMikgcmV0dXJuIDI7CgkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLwoJcmV0dXJuIChsMTxsMik/IDEgOiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIGxzdHJjbXAgICAgKEtFUk5FTDMyLkApCiAqICAgICAgICAgICBsc3RyY21wQSAgIChLRVJORUwzMi5AKQogKi8KSU5UIFdJTkFQSSBsc3RyY21wQSggTFBDU1RSIHN0cjEsIExQQ1NUUiBzdHIyICkKewogICAgcmV0dXJuIENvbXBhcmVTdHJpbmdBKExPQ0FMRV9TWVNURU1fREVGQVVMVCwwLHN0cjEsLTEsc3RyMiwtMSkgLSAyIDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgbHN0cmNtcFcgICAoS0VSTkVMMzIuQCkKICogRklYTUUgOiBzaG91bGQgY2FsbCBDb21wYXJlU3RyaW5nVywgd2hlbiBpdCBpcyBpbXBsZW1lbnRlZC4KICogICAgVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3QgIndvcmQgc29ydCIsIGFzIGl0IHNob3VsZC4KICovCklOVCBXSU5BUEkgbHN0cmNtcFcoIExQQ1dTVFIgc3RyMSwgTFBDV1NUUiBzdHIyICkKewogICAgVFJBQ0UoIiVzIGFuZCAlc1xuIiwKCQkgICBkZWJ1Z3N0cl93IChzdHIxKSwgZGVidWdzdHJfdyAoc3RyMikpOwogICAgaWYgKCFzdHIxIHx8ICFzdHIyKSB7CiAgICAJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiAwOwogICAgfQogICAgd2hpbGUgKCpzdHIxICYmICgqc3RyMSA9PSAqc3RyMikpIHsgc3RyMSsrOyBzdHIyKys7IH0KICAgIHJldHVybiAoSU5UKSgqc3RyMSAtICpzdHIyKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgbHN0cmNtcGkgICAgKEtFUk5FTDMyLkApCiAqICAgICAgICAgICBsc3RyY21waUEgICAoS0VSTkVMMzIuQCkKICovCklOVCBXSU5BUEkgbHN0cmNtcGlBKCBMUENTVFIgc3RyMSwgTFBDU1RSIHN0cjIgKQp7ICAgIFRSQUNFKCJzdHJjbXBpICVzIGFuZCAlc1xuIiwKCQkgICBkZWJ1Z3N0cl9hIChzdHIxKSwgZGVidWdzdHJfYSAoc3RyMikpOwogICAgcmV0dXJuIENvbXBhcmVTdHJpbmdBKExPQ0FMRV9TWVNURU1fREVGQVVMVCxOT1JNX0lHTk9SRUNBU0Usc3RyMSwtMSxzdHIyLC0xKS0yOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBsc3RyY21waVcgICAoS0VSTkVMMzIuQCkKICovCklOVCBXSU5BUEkgbHN0cmNtcGlXKCBMUENXU1RSIHN0cjEsIExQQ1dTVFIgc3RyMiApCnsKICAgIGlmICghc3RyMSB8fCAhc3RyMikgewogICAgCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gMDsKICAgIH0KICAgIHJldHVybiBzdHJjbXBpVyggc3RyMSwgc3RyMiApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJT0xFX0dldEZvcm1hdFcJW0ludGVybmFsXQogKgogKiBkYXRlZm9ybWF0IGlzIHNldCBUUlVFIGlmIGJlaW5nIGNhbGxlZCBmb3IgYSBkYXRlLCBmYWxzZSBmb3IgYSB0aW1lCgogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHN0dWZmIGZvciBHZXREYXRlRm9ybWF0KCkgYW5kCiBHZXRUaW1lRm9ybWF0KCkuCgogIGQgICAgc2luZ2xlLWRpZ2l0IChubyBsZWFkaW5nIHplcm8pIGRheSAob2YgbW9udGgpCiAgZGQgICB0d28tZGlnaXQgZGF5IChvZiBtb250aCkKICBkZGQgIHNob3J0IGRheS1vZi13ZWVrIG5hbWUKICBkZGRkIGxvbmcgZGF5LW9mLXdlZWsgbmFtZQogIE0gICAgc2luZ2xlLWRpZ2l0IG1vbnRoCiAgTU0gICB0d28tZGlnaXQgbW9udGgKICBNTU0gIHNob3J0IG1vbnRoIG5hbWUKICBNTU1NIGZ1bGwgbW9udGggbmFtZQogIHkgICAgdHdvLWRpZ2l0IHllYXIsIG5vIGxlYWRpbmcgMAogIHl5ICAgdHdvLWRpZ2l0IHllYXIKICB5eXl5IGZvdXItZGlnaXQgeWVhcgogIGdnICAgZXJhIHN0cmluZwogIGggICAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCiAgaGggICBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIEggICAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDI0LWhvdXIpCiAgSEggICBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIG0gICAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogIG1tICAgbWludXRlcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIHMgICAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogIHNzICAgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogIHQgICAgdGltZSBtYXJrZXIgKEEgb3IgUCkKICB0dCAgIHRpbWUgbWFya2VyIChBTSwgUE0pCiAgJycgICB1c2VkIHRvIHF1b3RlIGxpdGVyYWwgY2hhcmFjdGVycwogICcnICAgKHdpdGhpbiBhIHF1b3RlZCBzdHJpbmcpIGluZGljYXRlcyBhIGxpdGVyYWwgJwoKIFRoZXNlIGZ1bmN0aW9ucyBSRVFVSVJFIHZhbGlkIGxvY2FsZSwgZGF0ZSwgIGFuZCBmb3JtYXQuCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXRGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBmbGFncywgRFdPUkQgdGZsYWdzLAoJCQkgICAgY29uc3QgU1lTVEVNVElNRSogeHRpbWUsCgkJCSAgICBMUENXU1RSIGZvcm1hdCwKCQkJICAgIExQV1NUUiBvdXRwdXQsIElOVCBvdXRsZW4sIGludCBkYXRlZm9ybWF0KQp7CiAgIElOVCAgICAgb3V0cG9zOwoKICAgLyogbWFrZSBhIGRlYnVnIHJlcG9ydCAqLwogICBUUkFDRSgiYXJnczogMHglbHgsIDB4JWx4LCAweCVseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10OiVzIChhdCAlcCksICIKICAgCSAgICAgICIlcCB3aXRoIG1heCBsZW4gJWRcbiIsCgkgbG9jYWxlLCBmbGFncywgdGZsYWdzLAoJIHh0aW1lLT53RGF5LCB4dGltZS0+d0hvdXIsIHh0aW1lLT53TWludXRlLCB4dGltZS0+d1NlY29uZCwKCSBkZWJ1Z3N0cl93KGZvcm1hdCksIGZvcm1hdCwgb3V0cHV0LCBvdXRsZW4pOwoKICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KICAgb3V0cG9zID0gMDsKCiAgIHdoaWxlICgqZm9ybWF0KSB7CiAgICAgIC8qIExpdGVyYWwgc3RyaW5nOiBNYXliZSB0ZXJtaW5hdGVkIGVhcmx5IGJ5IGEgXDAgKi8KICAgICAgaWYgKCpmb3JtYXQgPT0gKFdDSEFSKSAnXCcnKSB7CiAgICAgICAgIGZvcm1hdCsrOwogICAgICAgICB3aGlsZSAoKmZvcm1hdCkgewogICAgICAgICAgICBpZiAoKmZvcm1hdCA9PSAoV0NIQVIpICdcJycpIHsKICAgICAgICAgICAgICAgZm9ybWF0Kys7CiAgICAgICAgICAgICAgIGlmICgqZm9ybWF0ICE9ICdcJycpIHsKICAgICAgICAgICAgICAgICAgYnJlYWs7IC8qIEl0IHdhcyBhIHRlcm1pbmF0aW5nIHF1b3RlICovCiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW91dGxlbikKICAgICAgICAgICAgICAgLyogV2UgYXJlIGNvdW50aW5nICovOwogICAgICAgICAgICBlbHNlIGlmIChvdXRwb3MgPj0gb3V0bGVuKQogICAgICAgICAgICAgICBnb3RvIHRvb19zaG9ydDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICBvdXRwdXRbb3V0cG9zXSA9ICpmb3JtYXQ7CiAgICAgICAgICAgIG91dHBvcysrOwogICAgICAgICAgICBmb3JtYXQrKzsKICAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCAoZGF0ZWZvcm1hdCAmJiAgKCpmb3JtYXQ9PSdkJyB8fAoJCQkJICAgKmZvcm1hdD09J00nIHx8CgkJCQkgICAqZm9ybWF0PT0neScgfHwKCQkJCSAgICpmb3JtYXQ9PSdnJykgICkgfHwKCQkgICghZGF0ZWZvcm1hdCAmJiAoKmZvcm1hdD09J0gnIHx8CgkJCQkgICAqZm9ybWF0PT0naCcgfHwKCQkJCSAgICpmb3JtYXQ9PSdtJyB8fAoJCQkJICAgKmZvcm1hdD09J3MnIHx8CgkJCQkgICAqZm9ybWF0PT0ndCcpICkgICAgKSB7CiAgICAgICAgIGludCB0eXBlLCBjb3VudDsKICAgICAgICAgY2hhciAgICB0bXBbMTZdOwogICAgICAgICBXQ0hBUiAgIGJ1Zls0MF07CiAgICAgICAgIGludCAgICAgYnVmbGVuPTA7CiAgICAgICAgIHR5cGUgPSAqZm9ybWF0OwogICAgICAgICBmb3JtYXQrKzsKICAgICAgICAgZm9yIChjb3VudCA9IDE7ICpmb3JtYXQgPT0gdHlwZTsgZm9ybWF0KyspCiAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgIHN3aXRjaCh0eXBlKQogICAgICAgICB7CiAgICAgICAgICBjYXNlICdkJzoKCSAgICBpZiAgICAgICAgKGNvdW50ID49IDQpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsCgkJCSAgICAgTE9DQUxFX1NEQVlOQU1FMSArICh4dGltZS0+d0RheU9mV2VlayArNiklNywKCQkJICAgICBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsCgkJCQlMT0NBTEVfU0FCQlJFVkRBWU5BTUUxICsKCQkJCSh4dGltZS0+d0RheU9mV2VlayArNiklNywKCQkJCWJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzcHJpbnRmKCB0bXAsICIlLipkIiwgY291bnQsIHh0aW1lLT53RGF5ICk7CiAgICAgICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHRtcCwgLTEsIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSAnTSc6CgkgICAgaWYgICAgICAgIChjb3VudCA+PSA0KSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLCAgTE9DQUxFX1NNT05USE5BTUUxICsKCQkJCXh0aW1lLT53TW9udGggLTEsIGJ1ZiwKCQkJCXNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEgKwoJCQkJeHRpbWUtPndNb250aCAtMSwgYnVmLAoJCQkJc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzcHJpbnRmKCB0bXAsICIlLipkIiwgY291bnQsIHh0aW1lLT53TW9udGggKTsKICAgICAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgdG1wLCAtMSwgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ3knOgoJICAgIGlmICAgICAgICAoY291bnQgPj0gNCkgewogICAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJWQiLCB4dGltZS0+d1llYXIgKTsKCSAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50ID4gMiA/IDIgOiBjb3VudCwgeHRpbWUtPndZZWFyICUgMTAwICk7CgkgICAgfQogICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHRtcCwgLTEsIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICdnJzoKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDIpIHsKCSAgICAgICBGSVhNRSgiTE9DQUxFX0lDQUxFTkRBUlRZUEUgdW5pbXBsZW1lbnRlZFxuIik7CiAgICAgICAgICAgICAgIHN0cmNweSggdG1wLCAiQUQiICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICAvKiBXaW4gQVBJIHNleiB3ZSBjb3B5IGl0IHZlcmJhdGltICovCiAgICAgICAgICAgICAgICBzdHJjcHkoIHRtcCwgImciICk7CgkgICAgfQogICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHRtcCwgLTEsIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgICAvKiBob3VycyAxOjAwLTEyOjAwIC0tLSBpcyB0aGlzIHJpZ2h0PyAqLwogICAgICAgICAgICAgIHNwcmludGYoIHRtcCwgIiUuKmQiLCBjb3VudCA+IDIgPyAyIDogY291bnQsICh4dGltZS0+d0hvdXItMSklMTIgKzEpOwogICAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgdG1wLCAtMSwgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50ID4gMiA/IDIgOiBjb3VudCwgeHRpbWUtPndIb3VyICk7CiAgICAgICAgICAgICAgTXVsdGlCeXRlVG9XaWRlQ2hhciggQ1BfQUNQLCAwLCB0bXAsIC0xLCBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICBzcHJpbnRmKCB0bXAsICIlLipkIiwgY291bnQgPiAyID8gMiA6IGNvdW50LCB4dGltZS0+d01pbnV0ZSApOwogICAgICAgICAgICAgIE11bHRpQnl0ZVRvV2lkZUNoYXIoIENQX0FDUCwgMCwgdG1wLCAtMSwgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgc3ByaW50ZiggdG1wLCAiJS4qZCIsIGNvdW50ID4gMiA/IDIgOiBjb3VudCwgeHRpbWUtPndTZWNvbmQgKTsKICAgICAgICAgICAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKCBDUF9BQ1AsIDAsIHRtcCwgLTEsIGJ1Ziwgc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGNhc2UgJ3QnOgoJICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgKHh0aW1lLT53SG91ciA8IDEyKSA/CgkJCSAgICAgTE9DQUxFX1MxMTU5IDogTE9DQUxFX1MyMzU5LAoJCQkgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikgKTsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDEpIHsKCSAgICAgICBidWZbMV0gPSAwOwoJICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KCgkgLyogY2F0IGJ1ZiBvbnRvIHRoZSBvdXRwdXQgKi8KCSBidWZsZW4gPSBzdHJsZW5XKGJ1Zik7CiAgICAgICAgIGlmICghb3V0bGVuKQogICAgICAgICAgICAvKiBXZSBhcmUgY291bnRpbmcgKi87CiAgICAgICAgIGVsc2UgaWYgKG91dHBvcyArIGJ1ZmxlbiA8IG91dGxlbikgewogICAgICAgICAgICBzdHJjcHlXKCBvdXRwdXQgKyBvdXRwb3MsIGJ1ZiApOwoJIH0gZWxzZSB7CiAgICAgICAgICAgIGxzdHJjcHluVyggb3V0cHV0ICsgb3V0cG9zLCBidWYsIG91dGxlbiAtIG91dHBvcyApOwogICAgICAgICAgICAvKiBJcyB0aGlzIGFuIHVuZG9jdW1lbnRlZCBmZWF0dXJlIHdlIGFyZSBzdXBwb3J0aW5nPyAqLwogICAgICAgICAgICBnb3RvIHRvb19zaG9ydDsKCSB9Cgkgb3V0cG9zICs9IGJ1ZmxlbjsKICAgICAgfSBlbHNlIHsKICAgICAgICAgLyogYSBsaXRlcmFsIGNoYXJhY3RlciAqLwogICAgICAgICBpZiAoIW91dGxlbikKICAgICAgICAgICAgLyogV2UgYXJlIGNvdW50aW5nICovOwogICAgICAgICBlbHNlIGlmIChvdXRwb3MgPj0gb3V0bGVuKQogICAgICAgICAgICBnb3RvIHRvb19zaG9ydDsKICAgICAgICAgZWxzZQogICAgICAgICAgICBvdXRwdXRbb3V0cG9zXSA9ICpmb3JtYXQ7CiAgICAgICAgIG91dHBvcysrOwogICAgICAgICBmb3JtYXQrKzsKICAgICAgfQogICB9CgogICAvKiBmaW5hbCBzdHJpbmcgdGVybWluYXRvciBhbmQgc2FuaXR5IGNoZWNrICovCiAgIGlmICghb3V0bGVuKQogICAgICAvKiBXZSBhcmUgY291bnRpbmcgKi87CiAgIGVsc2UgaWYgKG91dHBvcyA+PSBvdXRsZW4pCiAgICAgIGdvdG8gdG9vX3Nob3J0OwogICBlbHNlCiAgICAgIG91dHB1dFtvdXRwb3NdID0gJ1wwJzsKICAgb3V0cG9zKys7CgogICBUUkFDRSgiIHJldHVybmluZyAlZCAlc1xuIiwgb3V0cG9zLCBkZWJ1Z3N0cl93KG91dHB1dCkpOwogICByZXR1cm4gb3V0cG9zOwoKdG9vX3Nob3J0OgogICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgIFdBUk4oIiBidWZmZXIgb3ZlcmZsb3dcbiIpOwogICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldERhdGVGb3JtYXRBCVtLRVJORUwzMi5AXQogKiBNYWtlcyBhbiBBU0NJSSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogQWN0cyB0aGUgc2FtZSBhcyBHZXREYXRlRm9ybWF0VygpLCAgZXhjZXB0IHRoYXQgaXQncyBBU0NJSS4KICovCklOVCBXSU5BUEkgR2V0RGF0ZUZvcm1hdEEoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIGNvbnN0IFNZU1RFTVRJTUUqIHh0aW1lLAoJCQkgICAgICBMUENTVFIgZm9ybWF0LCBMUFNUUiBkYXRlLCBJTlQgZGF0ZWxlbikKewogIElOVCByZXQ7CiAgTFBXU1RSIHdmb3JtYXQgPSBOVUxMOwogIExQV1NUUiB3ZGF0ZSA9IE5VTEw7ICAKCiAgaWYgKGZvcm1hdCkKICB7CiAgICB3Zm9ybWF0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgIChzdHJsZW4oZm9ybWF0KSArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKCiAgICBNdWx0aUJ5dGVUb1dpZGVDaGFyKENQX0FDUCwgMCwgZm9ybWF0LCAtMSwgd2Zvcm1hdCwgc3RybGVuKGZvcm1hdCkgKyAxKTsKICB9CgogIGlmIChkYXRlICYmIGRhdGVsZW4pCiAgewogICAgd2RhdGUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgIChkYXRlbGVuICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOwogIH0KCiAgcmV0ID0gR2V0RGF0ZUZvcm1hdFcobG9jYWxlLCBmbGFncywgeHRpbWUsIHdmb3JtYXQsIHdkYXRlLCBkYXRlbGVuKTsKCiAgaWYgKHdkYXRlKQogIHsKICAgIFdpZGVDaGFyVG9NdWx0aUJ5dGUoQ1BfQUNQLCAwLCB3ZGF0ZSwgcmV0LCBkYXRlLCBkYXRlbGVuLCBOVUxMLCBOVUxMKTsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdkYXRlKTsKICB9CgogIGlmICh3Zm9ybWF0KQogIHsKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHdmb3JtYXQpOwogIH0KCiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0RGF0ZUZvcm1hdFcJW0tFUk5FTDMyLkBdCiAqIE1ha2VzIGEgVW5pY29kZSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogVGhpcyBmdW5jdGlvbiB1c2VzIGZvcm1hdCB0byBmb3JtYXQgdGhlIGRhdGUsICBvciwgIGlmIGZvcm1hdAogKiBpcyBOVUxMLCB1c2VzIHRoZSBkZWZhdWx0IGZvciB0aGUgbG9jYWxlLiAgZm9ybWF0IGlzIGEgc3RyaW5nCiAqIG9mIGxpdGVyYWwgZmllbGRzIGFuZCBjaGFyYWN0ZXJzIGFzIGZvbGxvd3M6CiAqCiAqIC0gZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICogLSBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogKiAtIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogKiAtIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAqIC0gTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICogLSBNTSAgIHR3by1kaWdpdCBtb250aAogKiAtIE1NTSAgc2hvcnQgbW9udGggbmFtZQogKiAtIE1NTU0gZnVsbCBtb250aCBuYW1lCiAqIC0geSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAqIC0geXkgICB0d28tZGlnaXQgeWVhcgogKiAtIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAqIC0gZ2cgICBlcmEgc3RyaW5nCiAqCiAqIEFjY2VwdHMgJiByZXR1cm5zIHNpemVzIGFzIGNvdW50cyBvZiBVbmljb2RlIGNoYXJhY3RlcnMuCiAqLwpJTlQgV0lOQVBJIEdldERhdGVGb3JtYXRXKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBjb25zdCBTWVNURU1USU1FKiB4dGltZSwKCQkJICAgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICAgIExQV1NUUiBkYXRlLCBJTlQgZGF0ZWxlbikKewogICAgV0NIQVIgZm9ybWF0X2J1Zls0MF07CiAgICBMUENXU1RSIHRoaXNmb3JtYXQ7CiAgICBTWVNURU1USU1FIHQ7CiAgICBMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CiAgICBMQ0lEIHRoaXNsb2NhbGU7CiAgICBJTlQgcmV0OwogICAgRklMRVRJTUUgZnQ7CiAgICBCT09MIHJlczsKICAgIAogICAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLAoJICBsb2NhbGUsZmxhZ3MseHRpbWUsZGVidWdzdHJfdyhmb3JtYXQpLGRhdGUsZGF0ZWxlbik7CiAgICAKICAgIC8qIFRlc3RzIChjb3VsZCBiZSBsZWZ0IHVudGlsIE9MRV9HZXRGb3JtYXRXKSAqLwogICAgaWYgKGZsYWdzICYmIGZvcm1hdCkKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IgKEVSUk9SX0lOVkFMSURfRkxBR1MpOwoJcmV0dXJuIDA7CiAgICB9CiAgICBpZiAoZGF0ZWxlbiAmJiAhZGF0ZSkKICAgIHsKICAgICAgICBTZXRMYXN0RXJyb3IgKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiAwOwogICAgfQogICAgaWYgKCFsb2NhbGUpIHsKCWxvY2FsZSA9IExPQ0FMRV9TWVNURU1fREVGQVVMVDsKICAgIH07CiAgICAKICAgIGlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKSB7Cgl0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICAgIH0gZWxzZSBpZiAobG9jYWxlID09IExPQ0FMRV9VU0VSX0RFRkFVTFQpIHsKCXRoaXNsb2NhbGUgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKICAgIH0gZWxzZSB7Cgl0aGlzbG9jYWxlID0gbG9jYWxlOwogICAgfTsKICAgIAogICAgaWYgKHh0aW1lID09IE5VTEwpIHsKCUdldFN5c3RlbVRpbWUoJnQpOwogICAgfSBlbHNlIHsKCS8qIFNpbGVudGx5IGNvcnJlY3Qgd0RheU9mV2VlayBieSB0cmFuc2Zvcm1pbmcgdG8gRmlsZVRpbWUgYW5kIGJhY2sgYWdhaW4gKi8KCXJlcz1TeXN0ZW1UaW1lVG9GaWxlVGltZSh4dGltZSwmZnQpOwoJLyogQ2hlY2sgeWVhcig/KS9tb250aCBhbmQgZGF0ZSBmb3IgcmFuZ2UgYW5kIHNldCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiAgb24gZXJyb3IgKi8KCS8qRklYTUU6IFN5c3RlbVRpbWVUb0ZpbGVUaW1lIGRvZXNuJ3QgeWV0IGRvIHRoYXQgY2hlY2sgKi8KCWlmKCFyZXMpIHsKCSAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJICAgIHJldHVybiAwOwoJfQoJRmlsZVRpbWVUb1N5c3RlbVRpbWUoJmZ0LCZ0KTsKCQogICAgfTsKICAgIHRoaXN0aW1lID0gJnQ7CiAgICAKICAgIGlmIChmb3JtYXQgPT0gTlVMTCkgewoJR2V0TG9jYWxlSW5mb1codGhpc2xvY2FsZSwgKChmbGFncyZEQVRFX0xPTkdEQVRFKQoJCQkJICAgID8gTE9DQUxFX1NMT05HREFURQoJCQkJICAgIDogTE9DQUxFX1NTSE9SVERBVEUpLAoJCSAgICAgICBmb3JtYXRfYnVmLCBzaXplb2YoZm9ybWF0X2J1Zikvc2l6ZW9mKCpmb3JtYXRfYnVmKSk7Cgl0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICAgIH0gZWxzZSB7Cgl0aGlzZm9ybWF0ID0gZm9ybWF0OwogICAgfTsKICAgIAogICAgCiAgICByZXQgPSBPTEVfR2V0Rm9ybWF0Vyh0aGlzbG9jYWxlLCBmbGFncywgMCwgdGhpc3RpbWUsIHRoaXNmb3JtYXQsCgkJCSBkYXRlLCBkYXRlbGVuLCAxKTsKICAgIAogICAgCiAgICBUUkFDRSgiR2V0RGF0ZUZvcm1hdFcoKSByZXR1cm5pbmcgJWQsIHdpdGggZGF0YT0lc1xuIiwKCSAgcmV0LCBkZWJ1Z3N0cl93KGRhdGUpKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bURhdGVGb3JtYXRzQQkoS0VSTkVMMzIuQCkKICovCkJPT0wgV0lOQVBJIEVudW1EYXRlRm9ybWF0c0EoCiAgREFURUZNVF9FTlVNUFJPQ0EgbHBEYXRlRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCAgRFdPUkQgZHdGbGFncykKewogIExDSUQgTG9jID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CiAgaWYoIWxwRGF0ZUZtdEVudW1Qcm9jKQogICAgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICByZXR1cm4gRkFMU0U7CiAgICB9CgogIHN3aXRjaCggTG9jICkKIHsKCiAgIGNhc2UgMHgwMDAwMDQwNzogIC8qIChMb2MsImRlX0RFIikgKi8KICAgewogICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk0ueXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NTS55eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsZC4gTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC4gTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC4gTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICAgfQogICB9CgogICBjYXNlIDB4MDAwMDA0MGM6ICAvKiAoTG9jLCJmcl9GUiIpICovCiAgIHsKICAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQuTU0ueXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLU1NLXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQgZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTSB5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgIH0KICAgfQoKICAgY2FzZSAweDAwMDAwYzBjOiAgLyogKExvYywiZnJfQ0EiKSAqLwogICB7CiAgICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXktTU0tZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLU1NLXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eSBNTSBkZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgICB9CiAgIH0KCiAgIGNhc2UgMHgwMDAwMDgwOTogIC8qIChMb2MsImVuX1VLIikgKi8KICB7CiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk0ueXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAwYzA5OiAgLyogKExvYywiZW5fQVUiKSAqLwogIHsKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMTAwOTogIC8qIChMb2MsImVuX0NBIikgKi8KICB7CiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS1NTS1kZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTS9kZC95eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLU1NTS15eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NTU0gZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDE0MDk6ICAvKiAoTG9jLCJlbl9OWiIpICovCiAgewogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTU0ueXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDE4MDk6ICAvKiAoTG9jLCJlbl9JRSIpICovCiAgewogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMWMwOTogIC8qIChMb2MsImVuX1pBIikgKi8KICB7CiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS9NTS9kZCIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAyMDA5OiAgLyogKExvYywiZW5fSk0iKSAqLwogIHsKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxNTU1NIGRkLHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGRkLHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGRkIE1NTU0seXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0seXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOwoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDI4MDk6ICAvKiAoTG9jLCJlbl9CWiIpICovCiAgIGNhc2UgMHgwMDAwMmMwOTogIC8qIChMb2MsImVuX1RUIikgKi8KICB7CiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsZGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGRlZmF1bHQ6ICAvKiBkZWZhdWx0IHRvIFVTIEVuZ2xpc2ggImVuX1VTIiAqLwogIHsKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZC95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTS9kL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NL2RkL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTS9kZC95eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS9NTS9kZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQtTU1NLXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsIE1NTU0gZGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGRkLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgZGQgTU1NTSwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQogfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0c1cJKEtFUk5FTDMyLkApCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNXKAogIERBVEVGTVRfRU5VTVBST0NXIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIEZJWE1FKCIoJXAsICVsZCwgJWxkKTogc3R1YlxuIiwgbHBEYXRlRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgRW51bVRpbWVGb3JtYXRzQQkoS0VSTkVMMzIuQCkKICovCkJPT0wgV0lOQVBJIEVudW1UaW1lRm9ybWF0c0EoCiAgVElNRUZNVF9FTlVNUFJPQ0EgbHBUaW1lRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgTENJRCBMb2MgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKICBpZighbHBUaW1lRm10RW51bVByb2MpCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KICBpZihkd0ZsYWdzKQogICAgewogICAgICBGSVhNRSgiVW5rbm93biB0aW1lIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7CiAgICB9CgogIHN3aXRjaCggTG9jICkKIHsKICAgY2FzZSAweDAwMDAwNDA3OiAgLyogKExvYywiZGVfREUiKSAqLwogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhILm1tIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSC5tbSIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSC5tbSdVaHInIikpIHJldHVybiBUUlVFOwogICAgcmV0dXJuIFRSVUU7CiAgIH0KCiAgIGNhc2UgMHgwMDAwMDQwYzogIC8qIChMb2MsImZyX0ZSIikgKi8KICAgY2FzZSAweDAwMDAwYzBjOiAgLyogKExvYywiZnJfQ0EiKSAqLwogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW0iKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISC5tbSIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEgnaCdtbSIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CgogICBjYXNlIDB4MDAwMDA4MDk6ICAvKiAoTG9jLCJlbl9VSyIpICovCiAgIGNhc2UgMHgwMDAwMGMwOTogIC8qIChMb2MsImVuX0FVIikgKi8KICAgY2FzZSAweDAwMDAxNDA5OiAgLyogKExvYywiZW5fTloiKSAqLwogICBjYXNlIDB4MDAwMDE4MDk6ICAvKiAoTG9jLCJlbl9JRSIpICovCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfQoKICAgY2FzZSAweDAwMDAxYzA5OiAgLyogKExvYywiZW5fWkEiKSAqLwogICBjYXNlIDB4MDAwMDI4MDk6ICAvKiAoTG9jLCJlbl9CWiIpICovCiAgIGNhc2UgMHgwMDAwMmMwOTogIC8qIChMb2MsImVuX1RUIikgKi8KICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9CgogICBkZWZhdWx0OiAgLyogZGVmYXVsdCB0byBVUyBzdHlsZSAiZW5fVVMiICovCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiaGg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgcmV0dXJuIFRSVUU7CiAgIH0KIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtVGltZUZvcm1hdHNXCShLRVJORUwzMi5AKQogKi8KQk9PTCBXSU5BUEkgRW51bVRpbWVGb3JtYXRzVygKICBUSU1FRk1UX0VOVU1QUk9DVyBscFRpbWVGbXRFbnVtUHJvYywgTENJRCBMb2NhbGUsIERXT1JEIGR3RmxhZ3MpCnsKICBGSVhNRSgiKCVwLCVsZCwlbGQpOiBzdHViXG4iLCBscFRpbWVGbXRFbnVtUHJvYywgTG9jYWxlLCBkd0ZsYWdzKTsKICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQganVzdCBsb2NhbGx5ICEKICogIERlc2NyaXB0aW9uOiBJbnZlcnRzIGEgc3RyaW5nLgogKi8Kc3RhdGljIHZvaWQgT0xFX0ludmVydFN0cmluZyhjaGFyKiBzdHJpbmcpCnsKICAgIGNoYXIgICAgc1RtcEFycmF5WzEyOF07CiAgICBJTlQgICAgIGNvdW50ZXIsIGkgPSAwOwoKICAgIGZvciAoY291bnRlciA9IHN0cmxlbihzdHJpbmcpOyBjb3VudGVyID4gMDsgY291bnRlci0tKQogICAgewogICAgICAgIG1lbWNweShzVG1wQXJyYXkgKyBpLCBzdHJpbmcgKyBjb3VudGVyLTEsIDEpOwogICAgICAgIGkrKzsKICAgIH0KICAgIG1lbWNweShzVG1wQXJyYXkgKyBpLCAiXDAiLCAxKTsKICAgIHN0cmNweShzdHJpbmcsIHNUbXBBcnJheSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBqdXN0IGxvY2FsbHkgIQogKiAgRGVzY3JpcHRpb246IFRlc3QgaWYgdGhlIGdpdmVuIHN0cmluZyAocHNOdW1iZXIpIGlzIHZhbGlkIG9yIG5vdC4KICogICAgICAgICAgICAgICBUaGUgdmFsaWQgY2hhcmFjdGVycyBhcmUgdGhlIGZvbGxvd2luZzoKICogICAgICAgICAgICAgICAtIENoYXJhY3RlcnMgJzAnIHRocm91Z2ggJzknLgogKiAgICAgICAgICAgICAgIC0gT25lIGRlY2ltYWwgcG9pbnQgKGRvdCkgaWYgdGhlIG51bWJlciBpcyBhIGZsb2F0aW5nLXBvaW50IHZhbHVlLgogKiAgICAgICAgICAgICAgIC0gQSBtaW51cyBzaWduIGluIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcG9zaXRpb24gaWYgdGhlIG51bWJlciBpcwogKiAgICAgICAgICAgICAgICAgYSBuZWdhdGl2ZSB2YWx1ZS4KICogICAgICAgICAgICAgIElmIHRoZSBmdW5jdGlvbiBzdWNjZWVkcywgcHNCZWZvcmUvcHNBZnRlciB3aWxsIHBvaW50IHRvIHRoZSBzdHJpbmcKICogICAgICAgICAgICAgIG9uIHRoZSByaWdodC9sZWZ0IG9mIHRoZSBkZWNpbWFsIHN5bWJvbC4gcGJOZWdhdGl2ZSBpbmRpY2F0ZXMgaWYgdGhlCiAqICAgICAgICAgICAgICBudW1iZXIgaXMgbmVnYXRpdmUuCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXROdW1iZXJDb21wb25lbnRzKGNoYXIqIHBJbnB1dCwgY2hhciogcHNCZWZvcmUsIGNoYXIqIHBzQWZ0ZXIsIEJPT0wqIHBiTmVnYXRpdmUpCnsKY2hhcglzTnVtYmVyU2V0W10gPSAiMDEyMzQ1Njc4OSI7CkJPT0wJYkluRGVjaW1hbCA9IEZBTFNFOwoKCS8qIFRlc3QgaWYgd2UgZG8gaGF2ZSBhIG1pbnVzIHNpZ24gKi8KCWlmICggKnBJbnB1dCA9PSAnLScgKQoJewoJCSpwYk5lZ2F0aXZlID0gVFJVRTsKCQlwSW5wdXQrKzsgLyogSnVtcCB0byB0aGUgbmV4dCBjaGFyYWN0ZXIuICovCgl9CgoJd2hpbGUoKnBJbnB1dCAhPSAnXDAnKQoJewoJCS8qIERvIHdlIGhhdmUgYSB2YWxpZCBudW1lcmljIGNoYXJhY3RlciAqLwoJCWlmICggc3RyY2hyKHNOdW1iZXJTZXQsICpwSW5wdXQpICE9IE5VTEwgKQoJCXsKCQkJaWYgKGJJbkRlY2ltYWwgPT0gVFJVRSkKICAgICAgICAgICAgICAgICpwc0FmdGVyKysgPSAqcElucHV0OwoJCQllbHNlCiAgICAgICAgICAgICAgICAqcHNCZWZvcmUrKyA9ICpwSW5wdXQ7CgkJfQoJCWVsc2UKCQl7CgkJCS8qIElzIHRoaXMgYSBkZWNpbWFsIHBvaW50IChkb3QpICovCgkJCWlmICggKnBJbnB1dCA9PSAnLicgKQoJCQl7CgkJCQkvKiBJcyBpdCB0aGUgZmlyc3QgdGltZSB3ZSBmaW5kIGl0ICovCgkJCQlpZiAoKGJJbkRlY2ltYWwgPT0gRkFMU0UpKQoJCQkJCWJJbkRlY2ltYWwgPSBUUlVFOwoJCQkJZWxzZQoJCQkJCXJldHVybiAtMTsgLyogRVJST1I6IEludmFsaWQgcGFyYW1ldGVyICovCgkJCX0KCQkJZWxzZQoJCQl7CgkJCQkvKiBJdCdzIG5laXRoZXIgYSBudW1lcmljIGNoYXJhY3Rlciwgbm9yIGEgZGVjaW1hbCBwb2ludC4KCQkJCSAqIFRodXMsIHJldHVybiBhbiBlcnJvci4KICAgICAgICAgICAgICAgICAqLwoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJfQogICAgICAgIHBJbnB1dCsrOwoJfQoKCS8qIEFkZCBhbiBFbmQgb2YgTGluZSBjaGFyYWN0ZXIgdG8gdGhlIG91dHB1dCBidWZmZXJzICovCgkqcHNCZWZvcmUgPSAnXDAnOwoJKnBzQWZ0ZXIgPSAnXDAnOwoKCXJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBqdXN0IGxvY2FsbHkgIQogKiAgRGVzY3JpcHRpb246IEEgbnVtYmVyIGNvdWxkIGJlIGZvcm1hdHRlZCB1c2luZyBkaWZmZXJlbnQgbnVtYmVycwogKiAgICAgICAgICAgICAgIG9mICJkaWdpdHMgaW4gZ3JvdXAiIChleGFtcGxlOiA0OzM7MjswKS4KICogICAgICAgICAgICAgICBUaGUgZmlyc3QgcGFyYW1ldGVyIG9mIHRoaXMgZnVuY3Rpb24gaXMgYW4gYXJyYXkKICogICAgICAgICAgICAgICBjb250YWluaW5nIHRoZSBydWxlIHRvIGJlIHVzZWQuIEl0cyBmb3JtYXQgaXMgdGhlIGZvbGxvd2luZzoKICogICAgICAgICAgICAgICB8TkRHfERHMXxERzJ8Li4ufDB8CiAqICAgICAgICAgICAgICAgd2hlcmUgTkRHIGlzIHRoZSBudW1iZXIgb2YgdXNlZCAiZGlnaXRzIGluIGdyb3VwIiBhbmQgREcxLCBERzIsCiAqICAgICAgICAgICAgICAgYXJlIHRoZSBjb3JyZXNwb25kaW5nICJkaWdpdHMgaW4gZ3JvdXAiLgogKiAgICAgICAgICAgICAgIFRodXMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZ3JvdXBpbmcgdmFsdWUgaW4gdGhlIGFycmF5CiAqICAgICAgICAgICAgICAgcG9pbnRlZCBieSB0aGUgc2Vjb25kIHBhcmFtZXRlci4KICovCnN0YXRpYyBJTlQgT0xFX0dldEdyb3VwaW5nKGNoYXIqIHNSdWxlLCBJTlQgaW5kZXgpCnsKICAgIGNoYXIgICAgc0RhdGFbMl0sIHNSdWxlU2l6ZVsyXTsKICAgIElOVCAgICAgbkRhdGEsIG5SdWxlU2l6ZTsKCiAgICBtZW1jcHkoc1J1bGVTaXplLCBzUnVsZSwgMSk7CiAgICBtZW1jcHkoc1J1bGVTaXplKzEsICJcMCIsIDEpOwogICAgblJ1bGVTaXplID0gYXRvaShzUnVsZVNpemUpOwoKICAgIGlmIChpbmRleCA+IDAgJiYgaW5kZXggPCBuUnVsZVNpemUpCiAgICB7CiAgICAgICAgbWVtY3B5KHNEYXRhLCBzUnVsZStpbmRleCwgMSk7CiAgICAgICAgbWVtY3B5KHNEYXRhKzEsICJcMCIsIDEpOwogICAgICAgIG5EYXRhID0gYXRvaShzRGF0YSk7CiAgICB9CgogICAgZWxzZQogICAgewogICAgICAgIG1lbWNweShzRGF0YSwgc1J1bGUrblJ1bGVTaXplLTEsIDEpOwogICAgICAgIG1lbWNweShzRGF0YSsxLCAiXDAiLCAxKTsKICAgICAgICBuRGF0YSA9IGF0b2koc0RhdGEpOwogICAgfQoKICAgIHJldHVybiBuRGF0YTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXRBCShLRVJORUwzMi5AKQogKi8KSU5UIFdJTkFQSSBHZXROdW1iZXJGb3JtYXRBKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDU1RSIGxwdmFsdWUsICAgY29uc3QgTlVNQkVSRk1UQSAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hOdW1iZXIpCnsKICAgIGNoYXIgICBzTnVtYmVyRGlnaXRzWzNdLCBzRGVjaW1hbFN5bWJvbFs1XSwgc0RpZ2l0c0luR3JvdXBbMTFdLCBzRGlnaXRHcm91cFN5bWJvbFs1XSwgc0lMWmVyb1syXTsKICAgIElOVCAgICBuTnVtYmVyRGlnaXRzLCBuTnVtYmVyRGVjaW1hbCwgaSwgaiwgbkNvdW50ZXIsIG5TdGVwLCBuUnVsZUluZGV4LCBuR3JvdXBpbmcsIG5EaWdpdHMsIHJldFZhbCwgbkxaOwogICAgY2hhciAgIHNOdW1iZXJbMTI4XSwgc0Rlc3RpbmF0aW9uWzEyOF0sIHNEaWdpdHNBZnRlckRlY2ltYWxbMTBdLCBzRGlnaXRzQmVmb3JlRGVjaW1hbFsxMjhdOwogICAgY2hhciAgIHNSdWxlWzEwXSwgc1NlbWlDb2x1bW5bXT0iOyIsIHNCdWZmZXJbNV0sIHNOZWdOdW1iZXJbMl07CiAgICBjaGFyICAgKnBTdHIgPSBOVUxMLCAqcFRtcFN0ciA9IE5VTEw7CiAgICBMQ0lEICAgc3lzdGVtRGVmYXVsdExDSUQ7CiAgICBCT09MICAgYk5lZ2F0aXZlID0gRkFMU0U7CiAgICBlbnVtICAgT3BlcmF0aW9ucwogICAgewogICAgICAgIFVTRV9QQVJBTUVURVIsCiAgICAgICAgVVNFX0xPQ0FMRUlORk8sCiAgICAgICAgVVNFX1NZU1RFTURFRkFVTFQsCiAgICAgICAgUkVUVVJOX0VSUk9SCiAgICB9IHVzZWRfb3BlcmF0aW9uOwoKICAgIHN0cm5jcHkoc051bWJlciwgbHB2YWx1ZSwgMTI4KTsKICAgIHNOdW1iZXJbMTI3XSA9ICdcMCc7CgogICAgLyogTWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBpbnB1dCBzdHJpbmcsIGdldCB0aGUgbnVtYmVyCiAgICAgKiBvZiBkaWdpdHMgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGVjaW1hbCBzeW1ib2wsIGFuZCBjaGVjawogICAgICogaWYgdGhpcyBpcyBhIG5lZ2F0aXZlIG51bWJlci4KICAgICAqLwogICAgaWYgKCBPTEVfR2V0TnVtYmVyQ29tcG9uZW50cyhzTnVtYmVyLCBzRGlnaXRzQmVmb3JlRGVjaW1hbCwgc0RpZ2l0c0FmdGVyRGVjaW1hbCwgJmJOZWdhdGl2ZSkgIT0gLTEpCiAgICB7CiAgICAgICAgbk51bWJlckRlY2ltYWwgPSBzdHJsZW4oc0RpZ2l0c0JlZm9yZURlY2ltYWwpOwogICAgICAgIG5EaWdpdHMgPSBzdHJsZW4oc0RpZ2l0c0FmdGVyRGVjaW1hbCk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICAvKiBXaGljaCBzb3VyY2Ugd2lsbCB3ZSB1c2UgdG8gZm9ybWF0IHRoZSBzdHJpbmcgKi8KICAgIHVzZWRfb3BlcmF0aW9uID0gUkVUVVJOX0VSUk9SOwogICAgaWYgKGxwRm9ybWF0ICE9IE5VTEwpCiAgICB7CiAgICAgICAgaWYgKGR3ZmxhZ3MgPT0gMCkKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfUEFSQU1FVEVSOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGlmIChkd2ZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9TWVNURU1ERUZBVUxUOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfTE9DQUxFSU5GTzsKICAgIH0KCiAgICAvKiBMb2FkIHRoZSBmaWVsZHMgd2UgbmVlZCAqLwogICAgc3dpdGNoKHVzZWRfb3BlcmF0aW9uKQogICAgewogICAgY2FzZSBVU0VfTE9DQUxFSU5GTzoKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JRElHSVRTLCBzTnVtYmVyRGlnaXRzLCBzaXplb2Yoc051bWJlckRpZ2l0cykpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX1NERUNJTUFMLCBzRGVjaW1hbFN5bWJvbCwgc2l6ZW9mKHNEZWNpbWFsU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU0dST1VQSU5HLCBzRGlnaXRzSW5Hcm91cCwgc2l6ZW9mKHNEaWdpdHNJbkdyb3VwKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU1RIT1VTQU5ELCBzRGlnaXRHcm91cFN5bWJvbCwgc2l6ZW9mKHNEaWdpdEdyb3VwU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSUxaRVJPLCBzSUxaZXJvLCBzaXplb2Yoc0lMWmVybykpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lORUdOVU1CRVIsIHNOZWdOdW1iZXIsIHNpemVvZihzTmVnTnVtYmVyKSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVTRV9QQVJBTUVURVI6CiAgICAgICAgc3ByaW50ZihzTnVtYmVyRGlnaXRzLCAiJWQiLGxwRm9ybWF0LT5OdW1EaWdpdHMpOwogICAgICAgIHN0cmNweShzRGVjaW1hbFN5bWJvbCwgbHBGb3JtYXQtPmxwRGVjaW1hbFNlcCk7CiAgICAgICAgc3ByaW50ZihzRGlnaXRzSW5Hcm91cCwgIiVkOzAiLGxwRm9ybWF0LT5Hcm91cGluZyk7CiAgICAgICAgc3RyY3B5KHNEaWdpdEdyb3VwU3ltYm9sLCBscEZvcm1hdC0+bHBUaG91c2FuZFNlcCk7CiAgICAgICAgc3ByaW50ZihzSUxaZXJvLCAiJWQiLGxwRm9ybWF0LT5MZWFkaW5nWmVybyk7CiAgICAgICAgc3ByaW50ZihzTmVnTnVtYmVyLCAiJWQiLGxwRm9ybWF0LT5OZWdhdGl2ZU9yZGVyKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVVNFX1NZU1RFTURFRkFVTFQ6CiAgICAgICAgc3lzdGVtRGVmYXVsdExDSUQgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSURJR0lUUywgc051bWJlckRpZ2l0cywgc2l6ZW9mKHNOdW1iZXJEaWdpdHMpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX1NERUNJTUFMLCBzRGVjaW1hbFN5bWJvbCwgc2l6ZW9mKHNEZWNpbWFsU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TR1JPVVBJTkcsIHNEaWdpdHNJbkdyb3VwLCBzaXplb2Yoc0RpZ2l0c0luR3JvdXApKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX1NUSE9VU0FORCwgc0RpZ2l0R3JvdXBTeW1ib2wsIHNpemVvZihzRGlnaXRHcm91cFN5bWJvbCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSUxaRVJPLCBzSUxaZXJvLCBzaXplb2Yoc0lMWmVybykpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfSU5FR05VTUJFUiwgc05lZ051bWJlciwgc2l6ZW9mKHNOZWdOdW1iZXIpKTsKICAgICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBuTnVtYmVyRGlnaXRzID0gYXRvaShzTnVtYmVyRGlnaXRzKTsKCiAgICAvKiBSZW1vdmUgdGhlICI7IiAqLwogICAgaT0wOwogICAgaiA9IDE7CiAgICBmb3IgKG5Db3VudGVyPTA7IG5Db3VudGVyPHN0cmxlbihzRGlnaXRzSW5Hcm91cCk7IG5Db3VudGVyKyspCiAgICB7CiAgICAgICAgaWYgKCBtZW1jbXAoc0RpZ2l0c0luR3JvdXAgKyBuQ291bnRlciwgc1NlbWlDb2x1bW4sIDEpICE9IDAgKQogICAgICAgIHsKICAgICAgICAgICAgbWVtY3B5KHNSdWxlICsgaiwgc0RpZ2l0c0luR3JvdXAgKyBuQ291bnRlciwgMSk7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgaisrOwogICAgICAgIH0KICAgIH0KICAgIHNwcmludGYoc0J1ZmZlciwgIiVkIiwgaSk7CiAgICBtZW1jcHkoc1J1bGUsIHNCdWZmZXIsIDEpOyAvKiBOdW1iZXIgb2YgZGlnaXRzIGluIHRoZSBncm91cHMgKCB1c2VkIGJ5IE9MRV9HZXRHcm91cGluZygpICkgKi8KICAgIG1lbWNweShzUnVsZSArIGosICJcMCIsIDEpOwoKICAgIC8qIEZpcnN0LCBmb3JtYXQgdGhlIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwuICovCiAgICBpZiAoKG5OdW1iZXJEZWNpbWFsPjApICYmIChhdG9pKHNEaWdpdHNCZWZvcmVEZWNpbWFsKSAhPSAwKSkKICAgIHsKICAgICAgICAvKiBXb3JraW5nIG9uIGFuIGludmVydGVkIHN0cmluZyBpcyBlYXNpZXIgISAqLwogICAgICAgIE9MRV9JbnZlcnRTdHJpbmcoc0RpZ2l0c0JlZm9yZURlY2ltYWwpOwoKICAgICAgICBuU3RlcCA9IG5Db3VudGVyID0gaSA9IGogPSAwOwogICAgICAgIG5SdWxlSW5kZXggPSAxOwogICAgICAgIG5Hcm91cGluZyA9IE9MRV9HZXRHcm91cGluZyhzUnVsZSwgblJ1bGVJbmRleCk7CgogICAgICAgIC8qIEhlcmUsIHdlIHdpbGwgbG9vcCB1bnRpbCB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCiAgICAgICAgICogQW4gaW50ZXJuYWwgY291bnRlciAoaikgaXMgdXNlZCBpbiBvcmRlciB0byBrbm93IHdoZW4gdG8KICAgICAgICAgKiBpbnNlcnQgdGhlICJkaWdpdCBncm91cCBzeW1ib2wiLgogICAgICAgICAqLwogICAgICAgIHdoaWxlIChuTnVtYmVyRGVjaW1hbCA+IDApCiAgICAgICAgewogICAgICAgICAgICBpID0gbkNvdW50ZXIgKyBuU3RlcDsKICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiArIGksIHNEaWdpdHNCZWZvcmVEZWNpbWFsICsgbkNvdW50ZXIsIDEpOwogICAgICAgICAgICBuQ291bnRlcisrOwogICAgICAgICAgICBqKys7CiAgICAgICAgICAgIGlmIChqID49IG5Hcm91cGluZykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaiA9IDA7CiAgICAgICAgICAgICAgICBpZiAoblJ1bGVJbmRleCA8IHNSdWxlWzBdKQogICAgICAgICAgICAgICAgICAgIG5SdWxlSW5kZXgrKzsKICAgICAgICAgICAgICAgIG5Hcm91cGluZyA9IE9MRV9HZXRHcm91cGluZyhzUnVsZSwgblJ1bGVJbmRleCk7CiAgICAgICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uICsgaSsxLCBzRGlnaXRHcm91cFN5bWJvbCwgc3RybGVuKHNEaWdpdEdyb3VwU3ltYm9sKSk7CiAgICAgICAgICAgICAgICBuU3RlcCs9IHN0cmxlbihzRGlnaXRHcm91cFN5bWJvbCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5OdW1iZXJEZWNpbWFsLS07CiAgICAgICAgfQoKICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uICsgaSsxLCAiXDAiLCAxKTsKICAgICAgICAvKiBHZXQgdGhlIHN0cmluZyBpbiB0aGUgcmlnaHQgb3JkZXIgISAqLwogICAgICAgIE9MRV9JbnZlcnRTdHJpbmcoc0Rlc3RpbmF0aW9uKTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICBuTFogPSBhdG9pKHNJTFplcm8pOwogICAgICAgIGlmIChuTFogIT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIC8qIFVzZSAwLnh4eCBpbnN0ZWFkIG9mIC54eHggKi8KICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiwgIjAiLCAxKTsKICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbisxLCAiXDAiLCAxKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uLCAiXDAiLCAxKTsKCiAgICAgfQoKICAgIC8qIFNlY29uZCwgZm9ybWF0IHRoZSBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwuICovCiAgICBqID0gMDsKICAgIG5Db3VudGVyID0gbk51bWJlckRpZ2l0czsKICAgIGlmICggKG5EaWdpdHM+MCkgJiYgKHBTdHIgPSBzdHJzdHIgKHNOdW1iZXIsICIuIikpICkKICAgIHsKICAgICAgICBpID0gc3RybGVuKHNOdW1iZXIpIC0gc3RybGVuKHBTdHIpICsgMTsKICAgICAgICBzdHJuY3B5ICggc0RpZ2l0c0FmdGVyRGVjaW1hbCwgc051bWJlciArIGksIG5OdW1iZXJEaWdpdHMpOwogICAgICAgIGogPSBzdHJsZW4oc0RpZ2l0c0FmdGVyRGVjaW1hbCk7CiAgICAgICAgaWYgKGogPCBuTnVtYmVyRGlnaXRzKQogICAgICAgICAgICBuQ291bnRlciA9IG5OdW1iZXJEaWdpdHMtajsKICAgIH0KICAgIGZvciAoaT0wO2k8bkNvdW50ZXI7aSsrKQogICAgICAgICBtZW1jcHkoc0RpZ2l0c0FmdGVyRGVjaW1hbCtpK2osICIwIiwgMSk7CiAgICBtZW1jcHkoc0RpZ2l0c0FmdGVyRGVjaW1hbCArIG5OdW1iZXJEaWdpdHMsICJcMCIsIDEpOwoKICAgIGkgPSBzdHJsZW4oc0Rlc3RpbmF0aW9uKTsKICAgIGogPSBzdHJsZW4oc0RpZ2l0c0FmdGVyRGVjaW1hbCk7CiAgICAvKiBGaW5hbGx5LCBjb25zdHJ1Y3QgdGhlIHJlc3VsdGluZyBmb3JtYXR0ZWQgc3RyaW5nLiAqLwoKICAgIGZvciAobkNvdW50ZXI9MDsgbkNvdW50ZXI8aTsgbkNvdW50ZXIrKykKICAgICAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyLCBzRGVzdGluYXRpb24gKyBuQ291bnRlciwgMSk7CgogICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlciwgc0RlY2ltYWxTeW1ib2wsIHN0cmxlbihzRGVjaW1hbFN5bWJvbCkpOwoKICAgIGZvciAoaT0wOyBpPGo7IGkrKykKICAgICAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyK2krc3RybGVuKHNEZWNpbWFsU3ltYm9sKSwgc0RpZ2l0c0FmdGVyRGVjaW1hbCArIGksIDEpOwogICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlcitpK3N0cmxlbihzRGVjaW1hbFN5bWJvbCksICJcMCIsIDEpOwoKICAgIC8qIElzIGl0IGEgbmVnYXRpdmUgbnVtYmVyICovCiAgICBpZiAoYk5lZ2F0aXZlID09IFRSVUUpCiAgICB7CiAgICAgICAgaSA9IGF0b2koc05lZ051bWJlcik7CiAgICAgICAgcFN0ciA9IHNEZXN0aW5hdGlvbjsKICAgICAgICBwVG1wU3RyID0gc051bWJlcjsKICAgICAgICBzd2l0Y2ggKGkpCiAgICAgICAgewogICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgKnBTdHIrKyA9ICcoJzsKICAgICAgICAgICAgd2hpbGUgKCpzTnVtYmVyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgICpwU3RyKysgPSAnKSc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMToKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgKnBTdHIrKyA9ICcgJzsKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgICpwU3RyKysgPSAnLSc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgICpwU3RyKysgPSAnICc7CiAgICAgICAgICAgICpwU3RyKysgPSAnLSc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHdoaWxlICgqcFRtcFN0ciAhPSAnXDAnKQogICAgICAgICAgICAgICAgKnBTdHIrKyA9ICAqcFRtcFN0cisrOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICAgICAgc3RyY3B5KHNEZXN0aW5hdGlvbiwgc051bWJlcik7CgogICAgLyogSWYgY2NoTnVtYmVyIGlzIHplcm8sIHRoZW4gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9yIGNoYXJhY3RlcnMKICAgICAqIHJlcXVpcmVkIHRvIGhvbGQgdGhlIGZvcm1hdHRlZCBudW1iZXIgc3RyaW5nCiAgICAgKi8KICAgIHJldFZhbCA9IHN0cmxlbihzRGVzdGluYXRpb24pICsgMTsKICAgIGlmIChjY2hOdW1iZXIhPTApCiAgICB7CiAgICAgICAgbWVtY3B5KCBscE51bWJlclN0ciwgc0Rlc3RpbmF0aW9uLCBtaW4oY2NoTnVtYmVyLCByZXRWYWwpICk7CiAgICAgICAgaWYgKGNjaE51bWJlciA8IHJldFZhbCkgcmV0VmFsID0gMDsKICAgIH0KICAgIHJldHVybiByZXRWYWw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0TnVtYmVyRm9ybWF0VwkoS0VSTkVMMzIuQCkKICovCklOVCBXSU5BUEkgR2V0TnVtYmVyRm9ybWF0VyhMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1dTVFIgbHB2YWx1ZSwgIGNvbnN0IE5VTUJFUkZNVFcgKiBscEZvcm1hdCwKCQkJICAgICAgIExQV1NUUiBscE51bWJlclN0ciwgaW50IGNjaE51bWJlcikKewogRklYTUUoIiVzOiBzdHViLCBubyByZWZvcm1hdHRpbmcgZG9uZVxuIixkZWJ1Z3N0cl93KGxwdmFsdWUpKTsKCiBsc3RyY3B5blcoIGxwTnVtYmVyU3RyLCBscHZhbHVlLCBjY2hOdW1iZXIgKTsKIHJldHVybiBjY2hOdW1iZXI/IHN0cmxlblcoIGxwTnVtYmVyU3RyICkgOiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldEN1cnJlbmN5Rm9ybWF0QQkoS0VSTkVMMzIuQCkKICovCklOVCBXSU5BUEkgR2V0Q3VycmVuY3lGb3JtYXRBKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDU1RSIGxwdmFsdWUsICAgY29uc3QgQ1VSUkVOQ1lGTVRBICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFNUUiBscEN1cnJlbmN5U3RyLCBpbnQgY2NoQ3VycmVuY3kpCnsKICAgIFVJTlQgICBuUG9zT3JkZXIsIG5OZWdPcmRlcjsKICAgIElOVCAgICByZXRWYWw7CiAgICBjaGFyICAgc0Rlc3RpbmF0aW9uWzEyOF0sIHNOZWdPcmRlcls4XSwgc1Bvc09yZGVyWzhdLCBzQ3VycmVuY3lTeW1ib2xbOF07CiAgICBjaGFyICAgKnBEZXN0aW5hdGlvbiA9IHNEZXN0aW5hdGlvbjsKICAgIGNoYXIgICBzTnVtYmVyRm9ybWF0ZWRbMTI4XTsKICAgIGNoYXIgICAqcE51bWJlckZvcm1hdGVkID0gc051bWJlckZvcm1hdGVkOwogICAgTENJRCAgIHN5c3RlbURlZmF1bHRMQ0lEOwogICAgQk9PTCAgIGJJc1Bvc2l0aXZlID0gRkFMU0UsIGJWYWxpZEZvcm1hdCA9IEZBTFNFOwogICAgZW51bSAgIE9wZXJhdGlvbnMKICAgIHsKICAgICAgICBVU0VfUEFSQU1FVEVSLAogICAgICAgIFVTRV9MT0NBTEVJTkZPLAogICAgICAgIFVTRV9TWVNURU1ERUZBVUxULAogICAgICAgIFJFVFVSTl9FUlJPUgogICAgfSB1c2VkX29wZXJhdGlvbjsKCiAgICBOVU1CRVJGTVRBICBudW1iZXJGbXQ7CgogICAgLyogV2hpY2ggc291cmNlIHdpbGwgd2UgdXNlIHRvIGZvcm1hdCB0aGUgc3RyaW5nICovCiAgICB1c2VkX29wZXJhdGlvbiA9IFJFVFVSTl9FUlJPUjsKICAgIGlmIChscEZvcm1hdCAhPSBOVUxMKQogICAgewogICAgICAgIGlmIChkd2ZsYWdzID09IDApCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1BBUkFNRVRFUjsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBpZiAoZHdmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkKICAgICAgICAgICAgdXNlZF9vcGVyYXRpb24gPSBVU0VfU1lTVEVNREVGQVVMVDsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX0xPQ0FMRUlORk87CiAgICB9CgogICAgLyogTG9hZCB0aGUgZmllbGRzIHdlIG5lZWQgKi8KICAgIHN3aXRjaCh1c2VkX29wZXJhdGlvbikKICAgIHsKICAgIGNhc2UgVVNFX0xPQ0FMRUlORk86CiAgICAgICAgLyogU3BlY2lmaWMgdG8gQ1VSUkVOQ1lGTVRBICovCiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSU5FR0NVUlIsIHNOZWdPcmRlciwgc2l6ZW9mKHNOZWdPcmRlcikpOwogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lDVVJSRU5DWSwgc1Bvc09yZGVyLCBzaXplb2Yoc1Bvc09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU0NVUlJFTkNZLCBzQ3VycmVuY3lTeW1ib2wsIHNpemVvZihzQ3VycmVuY3lTeW1ib2wpKTsKCiAgICAgICAgblBvc09yZGVyID0gYXRvaShzUG9zT3JkZXIpOwogICAgICAgIG5OZWdPcmRlciA9IGF0b2koc05lZ09yZGVyKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVVNFX1BBUkFNRVRFUjoKICAgICAgICAvKiBTcGVjaWZpYyB0byBDVVJSRU5DWUZNVEEgKi8KICAgICAgICBuTmVnT3JkZXIgPSBscEZvcm1hdC0+TmVnYXRpdmVPcmRlcjsKICAgICAgICBuUG9zT3JkZXIgPSBscEZvcm1hdC0+UG9zaXRpdmVPcmRlcjsKICAgICAgICBzdHJjcHkoc0N1cnJlbmN5U3ltYm9sLCBscEZvcm1hdC0+bHBDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVTRV9TWVNURU1ERUZBVUxUOgogICAgICAgIHN5c3RlbURlZmF1bHRMQ0lEID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICAgICAgICAvKiBTcGVjaWZpYyB0byBDVVJSRU5DWUZNVEEgKi8KICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lORUdDVVJSLCBzTmVnT3JkZXIsIHNpemVvZihzTmVnT3JkZXIpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lDVVJSRU5DWSwgc1Bvc09yZGVyLCBzaXplb2Yoc1Bvc09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TQ1VSUkVOQ1ksIHNDdXJyZW5jeVN5bWJvbCwgc2l6ZW9mKHNDdXJyZW5jeVN5bWJvbCkpOwoKICAgICAgICBuUG9zT3JkZXIgPSBhdG9pKHNQb3NPcmRlcik7CiAgICAgICAgbk5lZ09yZGVyID0gYXRvaShzTmVnT3JkZXIpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIENvbnN0cnVjdCBhIHRlbXBvcmFyeSBudW1iZXIgZm9ybWF0IHN0cnVjdHVyZSAqLwogICAgaWYgKGxwRm9ybWF0ICE9IE5VTEwpCiAgICB7CiAgICAgICAgbnVtYmVyRm10Lk51bURpZ2l0cyAgICAgPSBscEZvcm1hdC0+TnVtRGlnaXRzOwogICAgICAgIG51bWJlckZtdC5MZWFkaW5nWmVybyAgID0gbHBGb3JtYXQtPkxlYWRpbmdaZXJvOwogICAgICAgIG51bWJlckZtdC5Hcm91cGluZyAgICAgID0gbHBGb3JtYXQtPkdyb3VwaW5nOwogICAgICAgIG51bWJlckZtdC5OZWdhdGl2ZU9yZGVyID0gMDsKICAgICAgICBudW1iZXJGbXQubHBEZWNpbWFsU2VwID0gbHBGb3JtYXQtPmxwRGVjaW1hbFNlcDsKICAgICAgICBudW1iZXJGbXQubHBUaG91c2FuZFNlcCA9IGxwRm9ybWF0LT5scFRob3VzYW5kU2VwOwogICAgICAgIGJWYWxpZEZvcm1hdCA9IFRSVUU7CiAgICB9CgogICAgLyogTWFrZSBhIGNhbGwgdG8gR2V0TnVtYmVyRm9ybWF0QSgpICovCiAgICBpZiAoKmxwdmFsdWUgPT0gJy0nKQogICAgewogICAgICAgIGJJc1Bvc2l0aXZlID0gRkFMU0U7CiAgICAgICAgcmV0VmFsID0gR2V0TnVtYmVyRm9ybWF0QShsb2NhbGUsMCxscHZhbHVlKzEsKGJWYWxpZEZvcm1hdCk/Jm51bWJlckZtdDpOVUxMLHBOdW1iZXJGb3JtYXRlZCwxMjgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGJJc1Bvc2l0aXZlID0gVFJVRTsKICAgICAgICByZXRWYWwgPSBHZXROdW1iZXJGb3JtYXRBKGxvY2FsZSwwLGxwdmFsdWUsKGJWYWxpZEZvcm1hdCk/Jm51bWJlckZtdDpOVUxMLHBOdW1iZXJGb3JtYXRlZCwxMjgpOwogICAgfQoKICAgIGlmIChyZXRWYWwgPT0gMCkKICAgICAgICByZXR1cm4gMDsKCiAgICAvKiBjb25zdHJ1Y3QgdGhlIGZvcm1hdHRlZCBzdHJpbmcgKi8KICAgIGlmIChiSXNQb3NpdGl2ZSkKICAgIHsKICAgICAgICBzd2l0Y2ggKG5Qb3NPcmRlcikKICAgICAgICB7CiAgICAgICAgY2FzZSAwOiAgIC8qIFByZWZpeCwgbm8gc2VwYXJhdGlvbiAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTogICAvKiBTdWZmaXgsIG5vIHNlcGFyYXRpb24gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6ICAgLyogUHJlZml4LCAxIGNoYXIgc2VwYXJhdGlvbiAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6ICAgLyogU3VmZml4LCAxIGNoYXIgc2VwYXJhdGlvbiAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBlbHNlICAvKiBuZWdhdGl2ZSBudW1iZXIgKi8KICAgIHsKICAgICAgICBzd2l0Y2ggKG5OZWdPcmRlcikKICAgICAgICB7CiAgICAgICAgY2FzZSAwOiAgIC8qIGZvcm1hdDogKCQxLjEpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiKSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE6ICAgLyogZm9ybWF0OiAtJDEuMSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDI6ICAgLyogZm9ybWF0OiAkLTEuMSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDM6ICAgLyogZm9ybWF0OiAkMS4xLSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDQ6ICAgLyogZm9ybWF0OiAoMS4xJCkgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICIoIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNTogICAvKiBmb3JtYXQ6IC0xLjEkICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNjogICAvKiBmb3JtYXQ6IDEuMS0kICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNzogICAvKiBmb3JtYXQ6IDEuMSQtICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgODogICAvKiBmb3JtYXQ6IC0xLjEgJCAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA5OiAgIC8qIGZvcm1hdDogLSQgMS4xICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDEwOiAgIC8qIGZvcm1hdDogMS4xICQtICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDExOiAgIC8qIGZvcm1hdDogJCAxLjEtICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDEyOiAgIC8qIGZvcm1hdDogJCAtMS4xICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDEzOiAgIC8qIGZvcm1hdDogMS4xLSAkICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDE0OiAgIC8qIGZvcm1hdDogKCQgMS4xKSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIigiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTU6ICAgLyogZm9ybWF0OiAoMS4xICQpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIikiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQoKICAgIHJldFZhbCA9IHN0cmxlbihwRGVzdGluYXRpb24pICsgMTsKCiAgICBpZiAoY2NoQ3VycmVuY3kpCiAgICB7CiAgICAgICAgbWVtY3B5KCBscEN1cnJlbmN5U3RyLCBwRGVzdGluYXRpb24sIG1pbihjY2hDdXJyZW5jeSwgcmV0VmFsKSApOwogICAgICAgIGlmIChjY2hDdXJyZW5jeSA8IHJldFZhbCkgcmV0VmFsID0gMDsKICAgIH0KICAgIHJldHVybiByZXRWYWw7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgR2V0Q3VycmVuY3lGb3JtYXRXCShLRVJORUwzMi5AKQogKi8KSU5UIFdJTkFQSSBHZXRDdXJyZW5jeUZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENXU1RSIGxwdmFsdWUsICAgY29uc3QgQ1VSUkVOQ1lGTVRXICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFdTVFIgbHBDdXJyZW5jeVN0ciwgaW50IGNjaEN1cnJlbmN5KQp7CiAgICBGSVhNRSgiVGhpcyBBUEkgZnVuY3Rpb24gaXMgTk9UIGltcGxlbWVudGVkICFcbiIpOwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU9MRTJOTFNfQ2hlY2tMb2NhbGUJW2ludGVybl0KICovCnN0YXRpYyBMQ0lEIE9MRTJOTFNfQ2hlY2tMb2NhbGUgKExDSUQgbG9jYWxlKQp7CglpZiAoIWxvY2FsZSkKCXsgbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwoJfQoKCWlmIChsb2NhbGUgPT0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUKQogIAl7IHJldHVybiBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJfQoJZWxzZSBpZiAobG9jYWxlID09IExPQ0FMRV9VU0VSX0RFRkFVTFQpCgl7IHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCX0KCWVsc2UKCXsgcmV0dXJuIGxvY2FsZTsKCX0KfQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0QQlbS0VSTkVMMzIuQF0KICogTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSB0aW1lCiAqCiAqIEZvcm1hdHMgZGF0ZSBhY2NvcmRpbmcgdG8gZm9ybWF0LCAgb3IgbG9jYWxlIGRlZmF1bHQgaWYgZm9ybWF0IGlzCiAqIE5VTEwuIFRoZSBmb3JtYXQgY29uc2lzdHMgb2YgbGl0ZXJhbCBjaGFyYWN0ZXJzIGFuZCBmaWVsZHMgYXMgZm9sbG93czoKICoKICogaCAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCiAqIGhoIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIEggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgyNC1ob3VyKQogKiBISCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBtICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqIG1tIG1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogcyAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBzcyBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHQgIHRpbWUgbWFya2VyIChBIG9yIFApCiAqIHR0IHRpbWUgbWFya2VyIChBTSwgUE0pCiAqCiAqLwpJTlQgV0lOQVBJCkdldFRpbWVGb3JtYXRBKExDSUQgbG9jYWxlLCAgICAgICAgLyogW2luXSAgKi8KCSAgICAgICBEV09SRCBmbGFncywgICAgICAgIC8qIFtpbl0gICovCgkgICAgICAgY29uc3QgU1lTVEVNVElNRSogeHRpbWUsIC8qIFtpbl0gICovCgkgICAgICAgTFBDU1RSIGZvcm1hdCwgICAgICAvKiBbaW5dICAqLwoJICAgICAgIExQU1RSIHRpbWVzdHIsICAgICAgLyogW291dF0gKi8KCSAgICAgICBJTlQgdGltZWxlbiAgICAgICAgIC8qIFtpbl0gICovKQp7CiAgSU5UIHJldDsKICBMUFdTVFIgd2Zvcm1hdCA9IE5VTEw7CiAgTFBXU1RSIHd0aW1lID0gTlVMTDsgIAoKICBpZiAoZm9ybWF0KQogIHsKICAgIHdmb3JtYXQgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmxlbihmb3JtYXQpICsgMSkgKiBzaXplb2Yod2NoYXJfdCkpOwogICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGZvcm1hdCwgLTEsIHdmb3JtYXQsIHN0cmxlbihmb3JtYXQpICsgMSk7CiAgfQoKICBpZiAodGltZXN0ciAmJiB0aW1lbGVuKQogIHsKICAgIHd0aW1lID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsCiAgICAgICAgICAgICAgICAgICAgICAodGltZWxlbiArIDEpICogc2l6ZW9mKHdjaGFyX3QpKTsKICB9CgogIHJldCA9IEdldFRpbWVGb3JtYXRXKGxvY2FsZSwgZmxhZ3MsIHh0aW1lLCB3Zm9ybWF0LCB3dGltZSwgdGltZWxlbik7CgogIGlmICh3dGltZSkKICB7CiAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgd3RpbWUsIHJldCwgdGltZXN0ciwgdGltZWxlbiwgTlVMTCwgTlVMTCk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB3dGltZSk7CiAgfQoKICBpZiAod2Zvcm1hdCkKICB7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB3Zm9ybWF0KTsKICB9CgogIHJldHVybiByZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0VwlbS0VSTkVMMzIuQF0KICogTWFrZXMgYSBVbmljb2RlIHN0cmluZyBvZiB0aGUgdGltZQogKi8KSU5UIFdJTkFQSQpHZXRUaW1lRm9ybWF0VyhMQ0lEIGxvY2FsZSwgICAgICAgIC8qIFtpbl0gICovCgkgICAgICAgRFdPUkQgZmxhZ3MsICAgICAgICAvKiBbaW5dICAqLwoJICAgICAgIGNvbnN0IFNZU1RFTVRJTUUqIHh0aW1lLCAvKiBbaW5dICAqLwoJICAgICAgIExQQ1dTVFIgZm9ybWF0LCAgICAgLyogW2luXSAgKi8KCSAgICAgICBMUFdTVFIgdGltZXN0ciwgICAgIC8qIFtvdXRdICovCgkgICAgICAgSU5UIHRpbWVsZW4gICAgICAgICAvKiBbaW5dICAqLykKewlXQ0hBUiBmb3JtYXRfYnVmWzQwXTsKCUxQQ1dTVFIgdGhpc2Zvcm1hdDsKCVNZU1RFTVRJTUUgdDsKCWNvbnN0IFNZU1RFTVRJTUUqIHRoaXN0aW1lOwoJTENJRCB0aGlzbG9jYWxlPTA7CglEV09SRCB0aGlzZmxhZ3M9TE9DQUxFX1NUSU1FRk9STUFUOyAvKiBzdGFuZGFyZCB0aW1lZm9ybWF0ICovCglJTlQgcmV0OwoKCVRSQUNFKCJHZXRUaW1lRm9ybWF0KDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsbG9jYWxlLGZsYWdzLAoJeHRpbWUsZGVidWdzdHJfdyhmb3JtYXQpLHRpbWVzdHIsdGltZWxlbik7CgoJdGhpc2xvY2FsZSA9IE9MRTJOTFNfQ2hlY2tMb2NhbGUgKCBsb2NhbGUgKTsKCglpZiAoZm9ybWF0ID09IE5VTEwpCgl7IGlmIChmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgIC8qIHVzZSBzeXN0ZW0gZGVmYXVsdCAqLwoJICB7IHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJICB9CgkgIEdldExvY2FsZUluZm9XKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZm9ybWF0X2J1ZiwgNDApOwoJICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKCX0KCWVsc2UKCXsgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKCX0KCglpZiAoeHRpbWUgPT0gTlVMTCkgLyogTlVMTCBtZWFucyB1c2UgdGhlIGN1cnJlbnQgbG9jYWwgdGltZSAqLwoJeyBHZXRMb2NhbFRpbWUoJnQpOwoJICB0aGlzdGltZSA9ICZ0OwoJfQoJZWxzZQoJeyB0aGlzdGltZSA9IHh0aW1lOwoJfQoKCXJldCA9IE9MRV9HZXRGb3JtYXRXKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZmxhZ3MsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LAogIAkJCSB0aW1lc3RyLCB0aW1lbGVuLCAwKTsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1DYWxlbmRhckluZm9BCVtLRVJORUwzMi5AXQogKi8KQk9PTCBXSU5BUEkgRW51bUNhbGVuZGFySW5mb0EoCglDQUxJTkZPX0VOVU1QUk9DQSBjYWxpbmZvcHJvYyxMQ0lEIGxvY2FsZSxDQUxJRCBjYWxlbmRhcixDQUxUWVBFIGNhbHR5cGUKKSB7CglGSVhNRSgiKCVwLDB4JTA0bHgsMHglMDhseCwweCUwOGx4KSxzdHViIVxuIixjYWxpbmZvcHJvYyxsb2NhbGUsY2FsZW5kYXIsY2FsdHlwZSk7CglyZXR1cm4gRkFMU0U7Cn0K