LyoKICoJTmF0aW9uYWwgTGFuZ3VhZ2UgU3VwcG9ydCBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqICAgICAgQ29weXJpZ2h0IDIwMDAgIEp1bGlvIEPpc2FyIEfhenF1ZXoKICovCgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8bG9jYWxlLmg+CiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAid2luZS91bmljb2RlLmgiCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJvcHRpb25zLmgiCiNpbmNsdWRlICJ3aW52ZXIuaCIKI2luY2x1ZGUgIndpbm5scy5oIgojaW5jbHVkZSAid2lucmVnLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAiZGVidWd0b29scy5oIgojaW5jbHVkZSAibWFpbi5oIgoKREVGQVVMVF9ERUJVR19DSEFOTkVMKHN0cmluZyk7CgovKiBMb2NhbGUgbmFtZSB0byBpZCBtYXAuIHVzZWQgYnkgRW51bVN5c3RlbUxvY2FsZXMsIEdldExvY2FsZUluZm9BIAogKiBNVVNUIGNvbnRhaW4gYWxsICNkZWZpbmVzIGZyb20gd2lubmxzLmgKICogbGFzdCBlbnRyeSBoYXMgTlVMTCBuYW1lLCAwIGlkLgogKi8gCiNkZWZpbmUgTE9DQUxFX0VOVFJZKHgpCXsjeCxMT0NBTEVfIyN4fQpzdGF0aWMgY29uc3Qgc3RydWN0IHRhZ0xPQ0FMRV9OQU1FMklEIHsKICAgIGNvbnN0IGNoYXIJKm5hbWU7CiAgICBMQ1RZUEUJaWQ7Cn0gbG9jYWxlX25hbWUyaWRbXT0gewoJTE9DQUxFX0VOVFJZKElMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0xBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTRU5HTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoU05BVElWRUxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShJQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0NPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNFTkdDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWQ1RSWU5BTUUpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVDVFJZTkFNRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVENPREVQQUdFKSwKCUxPQ0FMRV9FTlRSWShJREVGQVVMVEFOU0lDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRNQUNDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoU0xJU1QpLAoJTE9DQUxFX0VOVFJZKElNRUFTVVJFKSwKCUxPQ0FMRV9FTlRSWShTREVDSU1BTCksCglMT0NBTEVfRU5UUlkoU1RIT1VTQU5EKSwKCUxPQ0FMRV9FTlRSWShTR1JPVVBJTkcpLAoJTE9DQUxFX0VOVFJZKElESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElMWkVSTyksCglMT0NBTEVfRU5UUlkoSU5FR05VTUJFUiksCglMT0NBTEVfRU5UUlkoU05BVElWRURJR0lUUyksCglMT0NBTEVfRU5UUlkoU0NVUlJFTkNZKSwKCUxPQ0FMRV9FTlRSWShTSU5UTFNZTUJPTCksCglMT0NBTEVfRU5UUlkoU01PTkRFQ0lNQUxTRVApLAoJTE9DQUxFX0VOVFJZKFNNT05USE9VU0FORFNFUCksCglMT0NBTEVfRU5UUlkoU01PTkdST1VQSU5HKSwKCUxPQ0FMRV9FTlRSWShJQ1VSUkRJR0lUUyksCglMT0NBTEVfRU5UUlkoSUlOVExDVVJSRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJQ1VSUkVOQ1kpLAoJTE9DQUxFX0VOVFJZKElORUdDVVJSKSwKCUxPQ0FMRV9FTlRSWShTREFURSksCglMT0NBTEVfRU5UUlkoU1RJTUUpLAoJTE9DQUxFX0VOVFJZKFNTSE9SVERBVEUpLAoJTE9DQUxFX0VOVFJZKFNMT05HREFURSksCglMT0NBTEVfRU5UUlkoU1RJTUVGT1JNQVQpLAoJTE9DQUxFX0VOVFJZKElEQVRFKSwKCUxPQ0FMRV9FTlRSWShJTERBVEUpLAoJTE9DQUxFX0VOVFJZKElUSU1FKSwKCUxPQ0FMRV9FTlRSWShJVElNRU1BUktQT1NOKSwKCUxPQ0FMRV9FTlRSWShJQ0VOVFVSWSksCglMT0NBTEVfRU5UUlkoSVRMWkVSTyksCglMT0NBTEVfRU5UUlkoSURBWUxaRVJPKSwKCUxPQ0FMRV9FTlRSWShJTU9OTFpFUk8pLAoJTE9DQUxFX0VOVFJZKFMxMTU5KSwKCUxPQ0FMRV9FTlRSWShTMjM1OSksCglMT0NBTEVfRU5UUlkoSUNBTEVOREFSVFlQRSksCglMT0NBTEVfRU5UUlkoSU9QVElPTkFMQ0FMRU5EQVIpLAoJTE9DQUxFX0VOVFJZKElGSVJTVERBWU9GV0VFSyksCglMT0NBTEVfRU5UUlkoSUZJUlNUV0VFS09GWUVBUiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMyksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNiksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMiksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FOCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTkpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTExKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTIpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTQpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTcpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU4KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FOSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEwKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTEpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTEzKSwKCUxPQ0FMRV9FTlRSWShTUE9TSVRJVkVTSUdOKSwKCUxPQ0FMRV9FTlRSWShTTkVHQVRJVkVTSUdOKSwKCUxPQ0FMRV9FTlRSWShJUE9TU0lHTlBPU04pLAoJTE9DQUxFX0VOVFJZKElORUdTSUdOUE9TTiksCglMT0NBTEVfRU5UUlkoSVBPU1NZTVBSRUNFREVTKSwKCUxPQ0FMRV9FTlRSWShJUE9TU0VQQllTUEFDRSksCglMT0NBTEVfRU5UUlkoSU5FR1NZTVBSRUNFREVTKSwKCUxPQ0FMRV9FTlRSWShJTkVHU0VQQllTUEFDRSksCglMT0NBTEVfRU5UUlkoRk9OVFNJR05BVFVSRSksCglMT0NBTEVfRU5UUlkoU0lTTzYzOUxBTkdOQU1FKSwKCUxPQ0FMRV9FTlRSWShTSVNPMzE2NkNUUllOQU1FKSwKCXtOVUxMLDB9Cn07CgpzdGF0aWMgY2hhciAqR2V0TG9jYWxlU3Via2V5TmFtZSggRFdPUkQgbGN0eXBlICk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIEdldFVzZXJEZWZhdWx0TENJRCAgICAgICBbS0VSTkVMMzIuNDI1XQogKi8KTENJRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMQ0lEKHZvaWQpCnsKCXJldHVybiBNQUtFTENJRCggR2V0VXNlckRlZmF1bHRMYW5nSUQoKSAsIFNPUlRfREVGQVVMVCApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TENJRCAgICAgICBbS0VSTkVMMzIuNDAwXQogKi8KTENJRCBXSU5BUEkgR2V0U3lzdGVtRGVmYXVsdExDSUQodm9pZCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TENJRCgpOwp9CgojZGVmaW5lIE5MU19NQVhfTEFOR1VBR0VTIDIwCnR5cGVkZWYgc3RydWN0IHsKICAgIGNoYXIgbGFuZ1sxMjhdOwogICAgY2hhciBjb3VudHJ5WzEyOF07CiAgICBMQU5HSUQgZm91bmRfbGFuZ19pZFtOTFNfTUFYX0xBTkdVQUdFU107CiAgICBjaGFyIGZvdW5kX2xhbmd1YWdlW05MU19NQVhfTEFOR1VBR0VTXVszXTsKICAgIGNoYXIgZm91bmRfY291bnRyeVtOTFNfTUFYX0xBTkdVQUdFU11bM107CiAgICBpbnQgbl9mb3VuZDsKfSBMQU5HX0ZJTkRfREFUQTsKCnN0YXRpYyBCT09MIENBTExCQUNLIE5MU19GaW5kTGFuZ3VhZ2VJRF9Qcm9jQShITU9EVUxFIGhNb2R1bGUsIExQQ1NUUiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIG5hbWUsIFdPUkQgTGFuZ0lELCBMT05HIGxQYXJhbSkKewogICAgTEFOR19GSU5EX0RBVEEgKmxfZGF0YSA9IChMQU5HX0ZJTkRfREFUQSAqKWxQYXJhbTsKICAgIExDSUQgbGNpZCA9IE1BS0VMQ0lEKExhbmdJRCwgU09SVF9ERUZBVUxUKTsKICAgIGNoYXIgYnVmX2xhbmd1YWdlWzEyOF07CiAgICBjaGFyIGJ1Zl9jb3VudHJ5WzEyOF07CiAgICBjaGFyIGJ1Zl9lbl9sYW5ndWFnZVsxMjhdOwoKICAgIFRSQUNFKCIlMDRYXG4iLCAoVUlOVClMYW5nSUQpOwogICAgaWYoUFJJTUFSWUxBTkdJRChMYW5nSUQpID09IExBTkdfTkVVVFJBTCkKICAgICAgICByZXR1cm4gVFJVRTsgLyogY29udGludWUgc2VhcmNoICovCgogICAgYnVmX2xhbmd1YWdlWzBdID0gMDsKICAgIGJ1Zl9jb3VudHJ5WzBdID0gMDsKCiAgICBHZXRMb2NhbGVJbmZvQShsY2lkLCBMT0NBTEVfU0lTTzYzOUxBTkdOQU1FfExPQ0FMRV9OT1VTRVJPVkVSUklERSwKICAgICAgICAgICAgICAgICAgIGJ1Zl9sYW5ndWFnZSwgc2l6ZW9mKGJ1Zl9sYW5ndWFnZSkpOwogICAgVFJBQ0UoIkxPQ0FMRV9TSVNPNjM5TEFOR05BTUU6ICVzXG4iLCBidWZfbGFuZ3VhZ2UpOwoKICAgIEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TSVNPMzE2NkNUUllOQU1FfExPQ0FMRV9OT1VTRVJPVkVSUklERSwKICAgICAgICAgICAgICAgICAgIGJ1Zl9jb3VudHJ5LCBzaXplb2YoYnVmX2NvdW50cnkpKTsKICAgIFRSQUNFKCJMT0NBTEVfU0lTTzMxNjZDVFJZTkFNRTogJXNcbiIsIGJ1Zl9jb3VudHJ5KTsKCiAgICBpZihsX2RhdGEtPmxhbmcgJiYgc3RybGVuKGxfZGF0YS0+bGFuZykgPiAwICYmICFzdHJjYXNlY21wKGxfZGF0YS0+bGFuZywgYnVmX2xhbmd1YWdlKSkKICAgIHsKCWlmKGxfZGF0YS0+Y291bnRyeSAmJiBzdHJsZW4obF9kYXRhLT5jb3VudHJ5KSA+IDApCgl7CgkgICAgaWYoIXN0cmNhc2VjbXAobF9kYXRhLT5jb3VudHJ5LCBidWZfY291bnRyeSkpCgkgICAgewoJCWxfZGF0YS0+Zm91bmRfbGFuZ19pZFswXSA9IExhbmdJRDsKCQlsX2RhdGEtPm5fZm91bmQgPSAxOwoJCVRSQUNFKCJGb3VuZCBsYW5nX2lkICUwNFggZm9yICVzXyVzXG4iLCBMYW5nSUQsIGxfZGF0YS0+bGFuZywgbF9kYXRhLT5jb3VudHJ5KTsKCQlyZXR1cm4gRkFMU0U7IC8qIHN0b3AgZW51bWVyYXRpb24gKi8KCSAgICB9Cgl9CgllbHNlIC8qIGxfZGF0YS0+Y291bnRyeSBub3Qgc3BlY2lmaWVkICovCgl7CgkgICAgaWYobF9kYXRhLT5uX2ZvdW5kIDwgTkxTX01BWF9MQU5HVUFHRVMpCgkgICAgewoJCWxfZGF0YS0+Zm91bmRfbGFuZ19pZFtsX2RhdGEtPm5fZm91bmRdID0gTGFuZ0lEOwoJCXN0cm5jcHkobF9kYXRhLT5mb3VuZF9jb3VudHJ5W2xfZGF0YS0+bl9mb3VuZF0sIGJ1Zl9jb3VudHJ5LCAzKTsKCQlzdHJuY3B5KGxfZGF0YS0+Zm91bmRfbGFuZ3VhZ2VbbF9kYXRhLT5uX2ZvdW5kXSwgYnVmX2xhbmd1YWdlLCAzKTsKCQlsX2RhdGEtPm5fZm91bmQrKzsKCQlUUkFDRSgiRm91bmQgbGFuZ19pZCAlMDRYIGZvciAlc1xuIiwgTGFuZ0lELCBsX2RhdGEtPmxhbmcpOwoJCXJldHVybiBUUlVFOyAvKiBjb250aW51ZSBzZWFyY2ggKi8KCSAgICB9Cgl9CiAgICB9CgogICAgLyogSnVzdCBpbiBjYXNlLCBjaGVjayBMT0NBTEVfU0VOR0xBTkdVQUdFIHRvbywKICAgICAqIGluIGhvcGUgdGhhdCBwb3NzaWJsZSBhbGlhcyBuYW1lIG1pZ2h0IGhhdmUgdGhhdCB2YWx1ZS4KICAgICAqLwogICAgYnVmX2VuX2xhbmd1YWdlWzBdID0gMDsKICAgIEdldExvY2FsZUluZm9BKGxjaWQsIExPQ0FMRV9TRU5HTEFOR1VBR0V8TE9DQUxFX05PVVNFUk9WRVJSSURFLAogICAgICAgICAgICAgICAgICAgYnVmX2VuX2xhbmd1YWdlLCBzaXplb2YoYnVmX2VuX2xhbmd1YWdlKSk7CiAgICBUUkFDRSgiTE9DQUxFX1NFTkdMQU5HVUFHRTogJXNcbiIsIGJ1Zl9lbl9sYW5ndWFnZSk7CgogICAgaWYobF9kYXRhLT5sYW5nICYmIHN0cmxlbihsX2RhdGEtPmxhbmcpID4gMCAmJiAhc3RyY2FzZWNtcChsX2RhdGEtPmxhbmcsIGJ1Zl9lbl9sYW5ndWFnZSkpCiAgICB7CglsX2RhdGEtPmZvdW5kX2xhbmdfaWRbbF9kYXRhLT5uX2ZvdW5kXSA9IExhbmdJRDsKCXN0cm5jcHkobF9kYXRhLT5mb3VuZF9jb3VudHJ5W2xfZGF0YS0+bl9mb3VuZF0sIGJ1Zl9jb3VudHJ5LCAzKTsKCXN0cm5jcHkobF9kYXRhLT5mb3VuZF9sYW5ndWFnZVtsX2RhdGEtPm5fZm91bmRdLCBidWZfbGFuZ3VhZ2UsIDMpOwoJbF9kYXRhLT5uX2ZvdW5kKys7CglUUkFDRSgiRm91bmQgbGFuZ19pZCAlMDRYIGZvciAlc1xuIiwgTGFuZ0lELCBsX2RhdGEtPmxhbmcpOwogICAgfQoKICAgIHJldHVybiBUUlVFOyAvKiBjb250aW51ZSBzZWFyY2ggKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBOTFNfR2V0TGFuZ3VhZ2VJRAogKgogKiBJTlBVVDoKICoJTGFuZzogYSBzdHJpbmcgd2hvc2UgdHdvIGZpcnN0IGNoYXJzIGFyZSB0aGUgaXNvIG5hbWUgb2YgYSBsYW5ndWFnZS4KICoJQ291bnRyeTogYSBzdHJpbmcgd2hvc2UgdHdvIGZpcnN0IGNoYXJzIGFyZSB0aGUgaXNvIG5hbWUgb2YgY291bnRyeQogKglDaGFyc2V0OiBhIHN0cmluZyBkZWZpbmluZyB0aGUgY2hvc3NlbiBjaGFyc2V0IGVuY29kaW5nCiAqCURpYWxlY3Q6IGEgc3RyaW5nIGRlZmluaW5nIGEgdmFyaWF0aW9uIG9mIHRoZSBsb2NhbGUKICoKICoJYWxsIHRob3NlIHZhbHVlcyBhcmUgZnJvbSB0aGUgc3RhbmRhcmRpemVkIGZvcm1hdCBvZiBsb2NhbGUKICoJbmFtZSBpbiB1bml4IHdoaWNoIGlzOiBMYW5nW19Db3VudHJ5XVsuQ2hhcnNldF1bQERpYWxlY3RdCiAqCiAqIFJFVFVSTlM6CiAqCXRoZSBudW1lcmljIGNvZGUgb2YgdGhlIGxhbmd1YWdlIHVzZWQgYnkgV2luZG93cwogKgogKiBGSVhNRTogQ2hhcnNldCBhbmQgRGlhbGVjdCBhcmUgbm90IGhhbmRsZWQKICovCnN0YXRpYyBMQU5HSUQgTkxTX0dldExhbmd1YWdlSUQoTFBDU1RSIExhbmcsIExQQ1NUUiBDb3VudHJ5LCBMUENTVFIgQ2hhcnNldCwgTFBDU1RSIERpYWxlY3QpCnsKICAgIExBTkdfRklORF9EQVRBIGxfZGF0YTsKICAgIGNoYXIgbGFuZ19zdHJpbmdbMjU2XTsKCiAgICBpZighTGFuZykKICAgIHsKCWxfZGF0YS5mb3VuZF9sYW5nX2lkWzBdID0gTUFLRUxBTkdJRChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfREVGQVVMVCk7Cglnb3RvIEVORDsKICAgIH0KCiAgICBtZW1zZXQoJmxfZGF0YSwgMCwgc2l6ZW9mKExBTkdfRklORF9EQVRBKSk7CiAgICBzdHJuY3B5KGxfZGF0YS5sYW5nLCBMYW5nLCBzaXplb2YobF9kYXRhLmxhbmcpKTsKCiAgICBpZihDb3VudHJ5ICYmIHN0cmxlbihDb3VudHJ5KSA+IDApCglzdHJuY3B5KGxfZGF0YS5jb3VudHJ5LCBDb3VudHJ5LCBzaXplb2YobF9kYXRhLmNvdW50cnkpKTsKCiAgICBFbnVtUmVzb3VyY2VMYW5ndWFnZXNBKEdldE1vZHVsZUhhbmRsZUEoIktFUk5FTDMyIiksIFJUX1NUUklOR0EsCgkoTFBDU1RSKUxPQ0FMRV9JTEFOR1VBR0UsIE5MU19GaW5kTGFuZ3VhZ2VJRF9Qcm9jQSwgKExPTkcpJmxfZGF0YSk7CgogICAgc3RyY3B5KGxhbmdfc3RyaW5nLCBsX2RhdGEubGFuZyk7CiAgICBpZihsX2RhdGEuY291bnRyeSAmJiBzdHJsZW4obF9kYXRhLmNvdW50cnkpID4gMCkKICAgIHsKCXN0cmNhdChsYW5nX3N0cmluZywgIl8iKTsKCXN0cmNhdChsYW5nX3N0cmluZywgbF9kYXRhLmNvdW50cnkpOwogICAgfQoKICAgIGlmKCFsX2RhdGEubl9mb3VuZCkKICAgIHsKCWlmKGxfZGF0YS5jb3VudHJ5ICYmIHN0cmxlbihsX2RhdGEuY291bnRyeSkgPiAwKQoJewoJICAgIE1FU1NBR0UoIldhcm5pbmc6IExhbmd1YWdlICclcycgd2FzIG5vdCBmb3VuZCwgcmV0cnlpbmcgd2l0aG91dCBjb3VudHJ5IG5hbWUuLi5cbiIsIGxhbmdfc3RyaW5nKTsKCSAgICBsX2RhdGEuY291bnRyeVswXSA9IDA7CgkgICAgRW51bVJlc291cmNlTGFuZ3VhZ2VzQShHZXRNb2R1bGVIYW5kbGVBKCJLRVJORUwzMiIpLCBSVF9TVFJJTkdBLAoJCShMUENTVFIpTE9DQUxFX0lMQU5HVUFHRSwgTkxTX0ZpbmRMYW5ndWFnZUlEX1Byb2NBLCAoTE9ORykmbF9kYXRhKTsKCX0KICAgIH0KCiAgICAvKiBSZS1ldmFsdWF0ZSBsYW5nX3N0cmluZyAqLwogICAgc3RyY3B5KGxhbmdfc3RyaW5nLCBsX2RhdGEubGFuZyk7CiAgICBpZihsX2RhdGEuY291bnRyeSAmJiBzdHJsZW4obF9kYXRhLmNvdW50cnkpID4gMCkKICAgIHsKCXN0cmNhdChsYW5nX3N0cmluZywgIl8iKTsKCXN0cmNhdChsYW5nX3N0cmluZywgbF9kYXRhLmNvdW50cnkpOwogICAgfQoKICAgIGlmKCFsX2RhdGEubl9mb3VuZCkKICAgIHsKCU1FU1NBR0UoIldhcm5pbmc6IExhbmd1YWdlICclcycgd2FzIG5vdCByZWNvZ25pemVkLCBkZWZhdWx0aW5nIHRvIEVuZ2xpc2hcbiIsIGxhbmdfc3RyaW5nKTsKCWxfZGF0YS5mb3VuZF9sYW5nX2lkWzBdID0gTUFLRUxBTkdJRChMQU5HX0VOR0xJU0gsIFNVQkxBTkdfREVGQVVMVCk7CiAgICB9CiAgICBlbHNlCiAgICB7CglpZihsX2RhdGEubl9mb3VuZCA9PSAxKQoJICAgIFRSQUNFKCJGb3IgbGFuZ3VhZ2UgJyVzJyBsYW5nX2lkICUwNFggd2FzIGZvdW5kXG4iLCBsYW5nX3N0cmluZywgbF9kYXRhLmZvdW5kX2xhbmdfaWRbMF0pOwoJZWxzZSAvKiBsX2RhdGEtPm5fZm91bmQgPiAxICovCgl7CgkgICAgaW50IGk7CgkgICAgTUVTU0FHRSgiRm9yIGxhbmd1YWdlICclcycgc2V2ZXJhbCBsYW5ndWFnZSBpZHMgd2VyZSBmb3VuZDpcbiIsIGxhbmdfc3RyaW5nKTsKCSAgICBmb3IoaSA9IDA7IGkgPCBsX2RhdGEubl9mb3VuZDsgaSsrKQoJCU1FU1NBR0UoIiVzXyVzIC0gJTA0WDsgIiwgbF9kYXRhLmZvdW5kX2xhbmd1YWdlW2ldLCBsX2RhdGEuZm91bmRfY291bnRyeVtpXSwgbF9kYXRhLmZvdW5kX2xhbmdfaWRbaV0pOwoKCSAgICBNRVNTQUdFKCJcbkluc3RlYWQgb2YgdXNpbmcgZmlyc3QgaW4gdGhlIGxpc3QsIHN1Z2dlc3QgdG8gZGVmaW5lXG4iCgkJICAgICJ5b3VyIExBTkcgZW52aXJvbm1lbnQgdmFyaWFibGUgbGlrZSB0aGlzOiBMQU5HPSVzXyVzXG4iLAoJCSAgICBsX2RhdGEuZm91bmRfbGFuZ3VhZ2VbMF0sIGxfZGF0YS5mb3VuZF9jb3VudHJ5WzBdKTsKCX0KICAgIH0KRU5EOgogICAgVFJBQ0UoIlJldHVybmluZyAlMDRYXG4iLCBsX2RhdGEuZm91bmRfbGFuZ19pZFswXSk7CiAgICByZXR1cm4gbF9kYXRhLmZvdW5kX2xhbmdfaWRbMF07Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFVzZXJEZWZhdWx0TGFuZ0lEICAgICAgIFtLRVJORUwzMi40MjZdCiAqLwpMQU5HSUQgV0lOQVBJIEdldFVzZXJEZWZhdWx0TGFuZ0lEKHZvaWQpCnsKCS8qIGNhY2hpbmcgcmVzdWx0LCBpZiBkZWZpbmVkIGZyb20gZW52aXJvbm1lbnQsIHdoaWNoIHNob3VsZCAoPykgbm90IGNoYW5nZSBkdXJpbmcgYSBXSU5FIHNlc3Npb24gKi8KCXN0YXRpYwlMQU5HSUQJdXNlckxDSUQgPSAwOwoKCWlmICh1c2VyTENJRCA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgICAgIGNoYXIgYnVmWzI1Nl07CgkJY2hhciAqbGFuZywqY291bnRyeSwqY2hhcnNldCwqZGlhbGVjdCwqbmV4dDsKCgkJaWYgKEdldEVudmlyb25tZW50VmFyaWFibGVBKCAiTEFOR1VBR0UiLCBidWYsIHNpemVvZihidWYpICkpIGdvdG8gb2s7CgkJaWYgKEdldEVudmlyb25tZW50VmFyaWFibGVBKCAiTEFORyIsIGJ1Ziwgc2l6ZW9mKGJ1ZikgKSkgZ290byBvazsKCQlpZiAoR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEoICJMQ19BTEwiLCBidWYsIHNpemVvZihidWYpICkpIGdvdG8gb2s7CgkJaWYgKEdldEVudmlyb25tZW50VmFyaWFibGVBKCAiTENfTUVTU0FHRVMiLCBidWYsIHNpemVvZihidWYpICkpIGdvdG8gb2s7CgkJaWYgKEdldEVudmlyb25tZW50VmFyaWFibGVBKCAiTENfQ1RZUEUiLCBidWYsIHNpemVvZihidWYpICkpIGdvdG8gb2s7CgoJCXJldHVybiB1c2VyTENJRCA9IE1BS0VMQU5HSUQoIExBTkdfRU5HTElTSCwgU1VCTEFOR19ERUZBVUxUICk7CgogICAgICAgIG9rOgoJCWlmICghc3RyY21wKGJ1ZiwiUE9TSVgiKSB8fCAhc3RyY21wKGJ1ZiwiQyIpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VyTENJRCA9IE1BS0VMQU5HSUQoIExBTkdfRU5HTElTSCwgU1VCTEFOR19ERUZBVUxUICk7CgkJCgkJbGFuZz1idWY7CgkJCgkJZG8gewoJCQluZXh0PXN0cmNocihsYW5nLCc6Jyk7IGlmIChuZXh0KSAqbmV4dCsrPSdcMCc7CgkJCWRpYWxlY3Q9c3RyY2hyKGxhbmcsJ0AnKTsgaWYgKGRpYWxlY3QpICpkaWFsZWN0Kys9J1wwJzsKCQkJY2hhcnNldD1zdHJjaHIobGFuZywnLicpOyBpZiAoY2hhcnNldCkgKmNoYXJzZXQrKz0nXDAnOwoJCQljb3VudHJ5PXN0cmNocihsYW5nLCdfJyk7IGlmIChjb3VudHJ5KSAqY291bnRyeSsrPSdcMCc7CgkJCQoJCQl1c2VyTENJRCA9IE5MU19HZXRMYW5ndWFnZUlEKGxhbmcsIGNvdW50cnksIGNoYXJzZXQsIGRpYWxlY3QpOwoJCQkKCQkJbGFuZz1uZXh0OwoJCX0gd2hpbGUgKGxhbmcgJiYgIXVzZXJMQ0lEKTsKCgkJaWYgKCF1c2VyTENJRCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBNRVNTQUdFKCAiV2FybmluZzogbGFuZ3VhZ2UgJyVzJyBub3QgcmVjb2duaXplZCwgZGVmYXVsdGluZyB0byBFbmdsaXNoXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiApOwogICAgICAgICAgICAgICAgICAgIHVzZXJMQ0lEID0gTUFLRUxBTkdJRCggTEFOR19FTkdMSVNILCBTVUJMQU5HX0RFRkFVTFQgKTsKICAgICAgICAgICAgICAgIH0KCX0KCXJldHVybiB1c2VyTENJRDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgR2V0U3lzdGVtRGVmYXVsdExhbmdJRCAgICAgW0tFUk5FTDMyLjQwMV0KICovCkxBTkdJRCBXSU5BUEkgR2V0U3lzdGVtRGVmYXVsdExhbmdJRCh2b2lkKQp7CglyZXR1cm4gR2V0VXNlckRlZmF1bHRMYW5nSUQoKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb252ZXJ0RGVmYXVsdExvY2FsZSBbS0VSTkVMMzIuMTQ3XQogKi8KTENJRCBXSU5BUEkgQ29udmVydERlZmF1bHRMb2NhbGUgKExDSUQgbGNpZCkKewlzd2l0Y2ggKGxjaWQpCgl7ICBjYXNlIExPQ0FMRV9TWVNURU1fREVGQVVMVDoKCSAgICAgcmV0dXJuIEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CgkgICBjYXNlIExPQ0FMRV9VU0VSX0RFRkFVTFQ6CgkgICAgIHJldHVybiBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCSAgIGNhc2UgTE9DQUxFX05FVVRSQUw6CgkgICAgIHJldHVybiBNQUtFTENJRCAoTEFOR19ORVVUUkFMLCBTVUJMQU5HX05FVVRSQUwpOwoJfSAgCglyZXR1cm4gTUFLRUxBTkdJRCggUFJJTUFSWUxBTkdJRChsY2lkKSwgU1VCTEFOR19ORVVUUkFMKTsKfQoKLyogRW5oYW5jZWQgdmVyc2lvbiBvZiBMb2FkU3RyaW5nVy4KICogSXQgdGFrZXMgTGFuZ3VhZ2VJZCB0byBmaW5kIGFuZCBsb2FkIGxhbmd1YWdlIGRlcGVuZGFudCByZXNvdXJjZXMuCiAqIFJlc291cmNlIGlzIGNvcGllZCBhcyBpczogImJpbmFyeSIgc3RyaW5ncyBhcmUgbm90IHRydW5jYXRlZC4KICogUmV0dXJuOiBsZW5ndGggb2YgcmVzb3VyY2UgKyAxIHRvIGRpc3Rpbmd1aXNoIGFic2VudCByZXNvdXJjZXMKICogZnJvbSB0aGUgcmVzb3VyY2VzIHdpdGggemVybyBsZW5ndGguCiAqLwpzdGF0aWMgSU5UIE5MU19Mb2FkU3RyaW5nRXhXKEhNT0RVTEUgaE1vZHVsZSwgTEFOR0lEIGxhbmdfaWQsIFVJTlQgcmVzX2lkLCBMUFdTVFIgYnVmZmVyLCBJTlQgYnVmbGVuKQp7CiAgICBIUlNSQyBocnNyYzsKICAgIEhHTE9CQUwgaG1lbTsKICAgIFdDSEFSICpwOwogICAgaW50IHN0cmluZ19udW07CiAgICBpbnQgaTsKCiAgICBocnNyYyA9IEZpbmRSZXNvdXJjZUV4VyhoTW9kdWxlLCBSVF9TVFJJTkdXLCAoTFBDV1NUUikoKHJlc19pZCA+PiA0KSArIDEpLCBsYW5nX2lkKTsKCiAgICBpZighaHJzcmMpIHJldHVybiAwOwogICAgaG1lbSA9IExvYWRSZXNvdXJjZShoTW9kdWxlLCBocnNyYyk7CiAgICBpZighaG1lbSkgcmV0dXJuIDA7CiAgICAKICAgIHAgPSBMb2NrUmVzb3VyY2UoaG1lbSk7CiAgICBzdHJpbmdfbnVtID0gcmVzX2lkICYgMHgwMDBmOwogICAgZm9yKGkgPSAwOyBpIDwgc3RyaW5nX251bTsgaSsrKQoJcCArPSAqcCArIDE7CiAgICAKICAgIFRSQUNFKCJzdHJsZW4gPSAlZFxuIiwgKGludCkqcCApOwogICAgCiAgICBpZiAoYnVmZmVyID09IE5VTEwpIHJldHVybiAqcDsKICAgIGkgPSBtaW4oYnVmbGVuIC0gMSwgKnApOwogICAgaWYgKGkgPiAwKSB7CgltZW1jcHkoYnVmZmVyLCBwICsgMSwgaSAqIHNpemVvZiAoV0NIQVIpKTsKCWJ1ZmZlcltpXSA9IChXQ0hBUikgMDsKICAgIH0gZWxzZSB7CglpZiAoYnVmbGVuID4gMSkKCSAgICBidWZmZXJbMF0gPSAoV0NIQVIpIDA7CiAgICB9CgogICAgRnJlZVJlc291cmNlKGhtZW0pOwogICAgVFJBQ0UoIlwiJXNcIiBsb2FkZWQhXG4iLCBkZWJ1Z3N0cl93KGJ1ZmZlcikpOwogICAgcmV0dXJuIChpICsgMSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogR2V0TG9jYWxlSW5mb0EgW0tFUk5FTDMyLjM0Ml0KICoKICogTk9URVMgCiAqICBMQU5HX05FVVRSQUwgaXMgZXF1YWwgdG8gTE9DQUxFX1NZU1RFTV9ERUZBVUxUCiAqCiAqICBNUyBvbmxpbmUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGUgc3RyaW5nIHJldHVybmVkIGlzIE5VTEwgdGVybWluYXRlZAogKiAgZXhjZXB0IGZvciBMT0NBTEVfRk9OVFNJR05BVFVSRSAgd2hpY2ggIndpbGwgcmV0dXJuIGEgbm9uLU5VTEwKICogIHRlcm1pbmF0ZWQgc3RyaW5nIi4KICovCklOVCBXSU5BUEkgR2V0TG9jYWxlSW5mb0EoTENJRCBsY2lkLExDVFlQRSBMQ1R5cGUsTFBTVFIgYnVmLElOVCBsZW4pCnsKICAgIExQQ1NUUiAgcmV0U3RyaW5nID0gTlVMTDsKICAgIGludAlmb3VuZCA9IDAsIGk7CiAgICBjaGFyICAgICpwYWNLZXk7CiAgICBjaGFyICAgIGFjQnVmZmVyWzEyOF07CiAgICBEV09SRCAgIGR3QnVmZmVyU2l6ZT0xMjg7CiAgICBCT09MIE5vVXNlck92ZXJyaWRlOwoKICBUUkFDRSgiKGxjaWQ9MHglbHgsbGN0eXBlPTB4JWx4LCVwLCV4KVxuIixsY2lkLExDVHlwZSxidWYsbGVuKTsKCiAgaWYgKGxlbiAmJiAoISBidWYpICkgewogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJCXJldHVybiAwOwoJfQoKCWlmIChsY2lkID09IExPQ0FMRV9ORVVUUkFMIHx8IGxjaWQgPT0gTEFOR19TWVNURU1fREVGQVVMVCkKCXsKICAgICAgICAgICAgbGNpZCA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7Cgl9IAoJZWxzZSBpZiAobGNpZCA9PSBMQU5HX1VTRVJfREVGQVVMVCkgLyoweDgwMCovCgl7CiAgICAgICAgICAgIGxjaWQgPSBHZXRVc2VyRGVmYXVsdExDSUQoKTsKCX0KCiAgICAvKiBMT0NBTEVfTk9VU0VST1ZFUlJJREUgbWVhbnM6IGRvIG5vdCBnZXQgdXNlciByZWRlZmluZWQgc2V0dGluZ3MKICAgICAgIGZyb20gdGhlIHJlZ2lzdHJ5LiBJbnN0ZWFkLCB1c2Ugc3lzdGVtIGRlZmF1bHQgdmFsdWVzLiAqLwogICAgTm9Vc2VyT3ZlcnJpZGUgPSAoTENUeXBlICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSAhPSAwOwoKCUxDVHlwZSAmPSB+KExPQ0FMRV9OT1VTRVJPVkVSUklERXxMT0NBTEVfVVNFX0NQX0FDUCk7CgogICAgLyogRmlyc3QsIGNoZWNrIGlmIGl0J3MgaW4gdGhlIHJlZ2lzdHJ5LiAqLwogICAgLyogQWxsIHVzZXIgY3VzdG9taXplZCB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgcmVnaXN0cnkgYnkgU2V0TG9jYWxlSW5mbyAqLwogICAgaWYgKCAhTm9Vc2VyT3ZlcnJpZGUgJiYgKHBhY0tleSA9IEdldExvY2FsZVN1YmtleU5hbWUoTENUeXBlKSkgKQogICAgewogICAgICAgIGNoYXIgICAgYWNSZWFsS2V5WzEyOF07CiAgICAgICAgSEtFWSAgICBoS2V5OwoKICAgICAgICBzcHJpbnRmKCBhY1JlYWxLZXksICJDb250cm9sIFBhbmVsXFxJbnRlcm5hdGlvbmFsXFwlcyIsIHBhY0tleSApOwoKICAgICAgICBpZiAoIFJlZ09wZW5LZXlFeEEoIEhLRVlfQ1VSUkVOVF9VU0VSLCBhY1JlYWxLZXksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgS0VZX1JFQUQsICZoS2V5KSA9PSBFUlJPUl9TVUNDRVNTICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggUmVnUXVlcnlWYWx1ZUV4QSggaEtleSwgTlVMTCwgTlVMTCwgTlVMTCwgKExQQllURSlhY0J1ZmZlciwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR3QnVmZmVyU2l6ZSApID09IEVSUk9SX1NVQ0NFU1MgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXRTdHJpbmcgPSBhY0J1ZmZlcjsKICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBSZWdDbG9zZUtleShoS2V5KTsKICAgICAgICB9CiAgICB9CgogICAgLyogSWYgbm90IGluIHRoZSByZWdpc3RyeSwgZ2V0IGl0IGZyb20gdGhlIE5MUyBlbnRyaWVzLiAqLwogICAgaWYoIWZvdW5kKSB7CglXQ0hBUiB3Y0J1ZmZlclsxMjhdOwoJaW50IHJlc19zaXplOwoKCS8qIGNoZWNrIGlmIGxhbmd1YWdlIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIGtlcm5lbDMyIHJlc291cmNlcyAqLwoJaWYoKHJlc19zaXplID0gTkxTX0xvYWRTdHJpbmdFeFcoR2V0TW9kdWxlSGFuZGxlQSgiS0VSTkVMMzIiKSwgTEFOR0lERlJPTUxDSUQobGNpZCksCgkJTENUeXBlLCB3Y0J1ZmZlciwgc2l6ZW9mKHdjQnVmZmVyKS9zaXplb2Yod2NCdWZmZXJbMF0pKSkpIHsKCSAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKENQX0FDUCwgMCwgd2NCdWZmZXIsIHJlc19zaXplLCBhY0J1ZmZlciwgZHdCdWZmZXJTaXplLCBOVUxMLCBOVUxMKTsKCSAgICByZXRTdHJpbmcgPSBhY0J1ZmZlcjsKCSAgICBmb3VuZCA9IDE7Cgl9CiAgICB9CgogICAgLyogaWYgbm90IGZvdW5kIHJlcG9ydCBhIG1vc3QgZGVzY3JpcHRpdmUgZXJyb3IgKi8KICAgIGlmKCFmb3VuZCkgewoJcmV0U3RyaW5nPTA7CgkvKiBJZiB3ZSBhcmUgdGhyb3VnaCBhbGwgb2YgdGhpcywgcmV0TGVuIHNob3VsZCBub3QgYmUgemVybyBhbnltb3JlLgoJICAgSWYgaXQgaXMsIHRoZSB2YWx1ZSBpcyBub3Qgc3VwcG9ydGVkICovCglpPTA7Cgl3aGlsZSAobG9jYWxlX25hbWUyaWRbaV0ubmFtZSE9TlVMTCkgewoJICAgIGlmIChMQ1R5cGUgPT0gbG9jYWxlX25hbWUyaWRbaV0uaWQpIHsKCQlyZXRTdHJpbmcgPSBsb2NhbGVfbmFtZTJpZFtpXS5uYW1lOwoJCWJyZWFrOwoJICAgIH0KCSAgICBpKys7Cgl9CglpZighcmV0U3RyaW5nKQoJICAgIEZJWE1FKCJVbmtvd24gTEMgdHlwZSAlbFhcbiIsIExDVHlwZSk7CgllbHNlCgkgICAgRklYTUUoIiclcycgaXMgbm90IGRlZmluZWQgZm9yIHlvdXIgbGFuZ3VhZ2UgKCUwNFgpLlxuIgoJCSJQbGVhc2UgZGVmaW5lIGl0IGluIGRsbHMva2VybmVsL25scy9Zb3VyTGFuZ3VhZ2UubmxzXG4iCgkJImFuZCBzdWJtaXQgcGF0Y2ggZm9yIGluY2x1c2lvbiBpbnRvIHRoZSBuZXh0IFdpbmUgcmVsZWFzZS5cbiIsCgkJCXJldFN0cmluZywgTE9XT1JEKGxjaWQpKTsKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gMDsJCQkKICAgIH0KCiAgICAvKiBhIEZPTlRTSUdOQVRVUkUgaXMgbm90IGEgc3RyaW5nLCBqdXN0IDYgRFdPUkRzICAqLwogICAgaWYgKExDVHlwZSA9PSBMT0NBTEVfRk9OVFNJR05BVFVSRSkgewogICAgICAgIGlmIChsZW4pIHsKCSAgICBsZW4gPSAobGVuIDwgc2l6ZW9mKEZPTlRTSUdOQVRVUkUpKSA/IGxlbiA6IHNpemVvZihGT05UU0lHTkFUVVJFKTsKICAgICAgICAgICAgbWVtY3B5KGJ1ZiwgcmV0U3RyaW5nLCBsZW4pOwoJICAgIHJldHVybiBsZW47Cgl9CiAgICAgICAgcmV0dXJuIHNpemVvZihGT05UU0lHTkFUVVJFKTsKICAgIH0KICAgIC8qIGlmIGxlbj0wIHJldHVybiBvbmx5IHRoZSBsZW5ndGgsIGRvbid0IHRvdWNoIHRoZSBidWZmZXIqLwogICAgaWYgKGxlbikgewoJbHN0cmNweW5BKGJ1ZixyZXRTdHJpbmcsbGVuKTsKCXJldHVybiBzdHJsZW4oYnVmKSArIDE7CiAgICB9CiAgICByZXR1cm4gc3RybGVuKHJldFN0cmluZykrMTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0TG9jYWxlSW5mb1cJW0tFUk5FTDMyLjM0M10KICoKICogTk9URVMKICogIE1TIGRvY3VtZW50YXRpb24gc3RhdGVzIHRoYXQgbGVuICJzcGVjaWZpZXMgdGhlIHNpemUsIGluIGJ5dGVzIChBTlNJIHZlcnNpb24pCiAqICBvciBjaGFyYWN0ZXJzIChVbmljb2RlIHZlcnNpb24pLCBvZiIgd2J1Zi4gVGh1cyB0aGUgbnVtYmVyIHJldHVybmVkIGlzCiAqICB0aGUgc2FtZSBiZXR3ZWVuIEdldExvY2FsZUluZm9XIGFuZCBHZXRMb2NhbGVJbmZvQS4KICovCklOVCBXSU5BUEkgR2V0TG9jYWxlSW5mb1coTENJRCBsY2lkLExDVFlQRSBMQ1R5cGUsTFBXU1RSIHdidWYsSU5UIGxlbikKewlXT1JEIHdsZW47CglMUFNUUiBhYnVmOwoJCglpZiAobGVuICYmICghIHdidWYpICkKCXsgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICByZXR1cm4gMDsKCX0KCglhYnVmID0gKExQU1RSKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLDAsbGVuKTsKCXdsZW4gPSBHZXRMb2NhbGVJbmZvQShsY2lkLCBMQ1R5cGUsIGFidWYsIGxlbik7CgoJaWYgKHdsZW4gJiYgbGVuKQkvKiBpZiBsZW49MCByZXR1cm4gb25seSB0aGUgbGVuZ3RoKi8KCSAgbHN0cmNweW5BdG9XKHdidWYsYWJ1ZixsZW4pOwoKCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxhYnVmKTsKCXJldHVybiB3bGVuOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqCQlHZXRMb2NhbGVTdWJrZXlOYW1lIFtoZWxwZXIgZnVuY3Rpb25dCiAqCiAqICAgICAgICAgIC0gRm9yIHVzZSB3aXRoIHRoZSByZWdpc3RyeS4KICogICAgICAgICAgLSBHZXRzIHRoZSByZWdpc3RyeSBzdWJrZXkgbmFtZSBmb3IgYSBnaXZlbiBsY3R5cGUuCiAqLwpzdGF0aWMgY2hhciAqR2V0TG9jYWxlU3Via2V5TmFtZSggRFdPUkQgbGN0eXBlICkKewogICAgY2hhciAgICAqcGFjS2V5PU5VTEw7CgogICAgc3dpdGNoICggbGN0eXBlICkKICAgIHsKICAgIC8qIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCBieSBTZXRMb2NhbGVJbmZvIGFuZCBHZXRMb2NhbGVJbmZvLCBhbmQKICAgICAqIHRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiB0aGUgcmVnaXN0cnksIGNvbmZpcm1lZCB1bmRlciBXaW5kb3dzLAogICAgICogZm9yIHRoZSBvbmVzIHRoYXQgYWN0dWFsbHkgYXNzaWduIHBhY0tleS4gQ2FzZXMgdGhhdCBhcmVuJ3QgZmluaXNoZWQKICAgICAqIGhhdmUgbm90IGJlZW4gY29uZmlybWVkLCBzbyB0aGF0IG11c3QgYmUgZG9uZSBiZWZvcmUgdGhleSBjYW4gYmUKICAgICAqIGFkZGVkLgogICAgICovCiAgICBjYXNlIExPQ0FMRV9TREFURSA6ICAgICAgICAvKiBUaGUgZGF0ZSBzZXBhcmF0b3IuICovCiAgICAgICAgcGFjS2V5ID0gInNEYXRlIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lDVVJSRElHSVRTOgogICAgICAgIHBhY0tleSA9ICJpQ3VyckRpZ2l0cyI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TREVDSU1BTCA6CiAgICAgICAgcGFjS2V5ID0gInNEZWNpbWFsIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lDVVJSRU5DWToKICAgICAgICBwYWNLZXkgPSAiaUN1cnJlbmN5IjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NHUk9VUElORyA6CiAgICAgICAgcGFjS2V5ID0gInNHcm91cGluZyI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JRElHSVRTOgogICAgICAgIHBhY0tleSA9ICJpRGlnaXRzIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NMSVNUIDoKICAgICAgICBwYWNLZXkgPSAic0xpc3QiOwogICAgICAgIGJyZWFrOwogICAgLyogY2FzZSBMT0NBTEVfSUNBTEVOREFSVFlQRTogKi8KICAgIC8qIGNhc2UgTE9DQUxFX0lGSVJTVERBWU9GV0VFSzogKi8KICAgIC8qIGNhc2UgTE9DQUxFX0lGSVJTVFdFRUtPRllFQVI6ICovCiAgICAvKiBjYXNlIExPQ0FMRV9TWUVBUk1PTlRIIDogKi8KICAgIC8qIGNhc2UgTE9DQUxFX1NQT1NJVElWRVNJR04gOiAqLwogICAgLyogY2FzZSBMT0NBTEVfSVBBUEVSU0laRTogKi8KICAgIC8qICAgICBicmVhazsgKi8KICAgIGNhc2UgTE9DQUxFX1NMT05HREFURSA6CiAgICAgICAgcGFjS2V5ID0gInNMb25nRGF0ZSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TTU9OREVDSU1BTFNFUCA6CiAgICAgICAgcGFjS2V5ID0gInNNb25EZWNpbWFsU2VwIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NNT05HUk9VUElORzoKICAgICAgICBwYWNLZXkgPSAic01vbkdyb3VwaW5nIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lNRUFTVVJFOgogICAgICAgIHBhY0tleSA9ICJpTWVhc3VyZSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TTU9OVEhPVVNBTkRTRVAgOgogICAgICAgIHBhY0tleSA9ICJzTW9uVGhvdXNhbmRTZXAiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSU5FR0NVUlI6CiAgICAgICAgcGFjS2V5ID0gImlOZWdDdXJyIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NORUdBVElWRVNJR04gOgogICAgICAgIHBhY0tleSA9ICJzTmVnYXRpdmVTaWduIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lORUdOVU1CRVI6CiAgICAgICAgcGFjS2V5ID0gImlOZWdOdW1iZXIiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfU1NIT1JUREFURSA6CiAgICAgICAgcGFjS2V5ID0gInNTaG9ydERhdGUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSUxEQVRFOiAgICAgICAgLyogTG9uZyBEYXRlIGZvcm1hdCBvcmRlcmluZyBzcGVjaWZpZXIuICovCiAgICAgICAgcGFjS2V5ID0gImlMRGF0ZSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JTFpFUk86CiAgICAgICAgcGFjS2V5ID0gImlMWmVybyI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9JVExaRVJPOgogICAgICAgIHBhY0tleSA9ICJpVExaZXJvIjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX0lUSU1FOiAgICAgICAgLyogVGltZSBmb3JtYXQgc3BlY2lmaWVyLiAqLwogICAgICAgIHBhY0tleSA9ICJpVGltZSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TVEhPVVNBTkQgOgogICAgICAgIHBhY0tleSA9ICJzVGhvdXNhbmQiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfUzExNTk6ICAgICAgICAvKiBBTSAqLwogICAgICAgIHBhY0tleSA9ICJzMTE1OSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TVElNRToKICAgICAgICBwYWNLZXkgPSAic1RpbWUiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfUzIzNTk6ICAgICAgICAvKiBQTSAqLwogICAgICAgIHBhY0tleSA9ICJzMjM1OSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TVElNRUZPUk1BVCA6CiAgICAgICAgcGFjS2V5ID0gInNUaW1lRm9ybWF0IjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NDVVJSRU5DWToKICAgICAgICBwYWNLZXkgPSAic0N1cnJlbmN5IjsKICAgICAgICBicmVhazsKCiAgICAvKiBUaGUgZm9sbG93aW5nIGFyZSBub3QgbGlzdGVkIHVuZGVyIE1TRE4gYXMgc3VwcG9ydGVkLCAKICAgICAqIGJ1dCBzZWVtIHRvIGJlIHVzZWQgYW5kIGFsc28gc3RvcmVkIGluIHRoZSByZWdpc3RyeS4KICAgICAqLwoKICAgIGNhc2UgTE9DQUxFX0lEQVRFOgogICAgICAgIHBhY0tleSA9ICJpRGF0ZSI7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIExPQ0FMRV9TQ09VTlRSWToKICAgICAgICBwYWNLZXkgPSAic0NvdW50cnkiOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBMT0NBTEVfSUNPVU5UUlk6CiAgICAgICAgcGFjS2V5ID0gImlDb3VudHJ5IjsKICAgICAgICBicmVhazsKICAgIGNhc2UgTE9DQUxFX1NMQU5HVUFHRToKICAgICAgICBwYWNLZXkgPSAic0xhbmd1YWdlIjsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIGJyZWFrOwogICAgfQoKICAgIHJldHVybiggcGFjS2V5ICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCVNldExvY2FsZUluZm9BCVtLRVJORUwzMi42NTZdCiAqLwpCT09MMTYgV0lOQVBJIFNldExvY2FsZUluZm9BKERXT1JEIGxjaWQsIERXT1JEIGxjdHlwZSwgTFBDU1RSIGRhdGEpCnsKICAgIEhLRVkgICAgaEtleTsKICAgIGNoYXIgICAgKnBhY0tleTsKICAgIGNoYXIgICAgYWNSZWFsS2V5WzEyOF07CgogICAgaWYgKCAocGFjS2V5ID0gR2V0TG9jYWxlU3Via2V5TmFtZShsY3R5cGUpKSApCiAgICB7CiAgICAgICAgc3ByaW50ZiggYWNSZWFsS2V5LCAiQ29udHJvbCBQYW5lbFxcSW50ZXJuYXRpb25hbFxcJXMiLCBwYWNLZXkgKTsKICAgICAgICBpZiAoIFJlZ0NyZWF0ZUtleUEoIEhLRVlfQ1VSUkVOVF9VU0VSLCBhY1JlYWxLZXksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmhLZXkgKSA9PSBFUlJPUl9TVUNDRVNTICkKICAgICAgICB7CiAgICAgICAgICAgIGlmICggUmVnU2V0VmFsdWVFeEEoIGhLZXksIE5VTEwsIDAsIFJFR19TWiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsIHN0cmxlbihkYXRhKSsxICkgIT0gRVJST1JfU1VDQ0VTUyApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEVSUigiU2V0TG9jYWxlSW5mb0E6ICVzIGRpZCBub3Qgd29ya1xuIiwgcGFjS2V5ICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgUmVnQ2xvc2VLZXkoIGhLZXkgKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICBGSVhNRSgiKCVsZCwlbGQsJXMpOiBzdHViXG4iLGxjaWQsbGN0eXBlLGRhdGEpOwogICAgfQogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUlzVmFsaWRMb2NhbGUJW0tFUk5FTDMyLjQ4OV0KICovCkJPT0wgV0lOQVBJIElzVmFsaWRMb2NhbGUoTENJRCBsY2lkLERXT1JEIGZsYWdzKQp7CiAgICAvKiBjaGVjayBpZiBsYW5ndWFnZSBpcyByZWdpc3RlcmVkIGluIHRoZSBrZXJuZWwzMiByZXNvdXJjZXMgKi8KICAgIGlmKCFGaW5kUmVzb3VyY2VFeFcoR2V0TW9kdWxlSGFuZGxlQSgiS0VSTkVMMzIiKSwgUlRfU1RSSU5HVywgKExQQ1dTVFIpTE9DQUxFX0lMQU5HVUFHRSwgTE9XT1JEKGxjaWQpKSkKCXJldHVybiBGQUxTRTsKICAgIGVsc2UKCXJldHVybiBUUlVFOwp9CgpzdGF0aWMgQk9PTCBDQUxMQkFDSyBFbnVtUmVzb3VyY2VMYW5ndWFnZXNQcm9jVyhITU9EVUxFIGhNb2R1bGUsIExQQ1dTVFIgdHlwZSwKCQlMUENXU1RSIG5hbWUsIFdPUkQgTGFuZ0lELCBMT05HIGxQYXJhbSkKewogICAgQ0hBUiBidWZBWzIwXTsKICAgIFdDSEFSIGJ1ZldbMjBdOwogICAgTE9DQUxFX0VOVU1QUk9DVyBscGZuTG9jYWxlRW51bSA9IChMT0NBTEVfRU5VTVBST0NXKWxQYXJhbTsKICAgIHNwcmludGYoYnVmQSwgIiUwOFgiLCAoVUlOVClMYW5nSUQpOwogICAgTXVsdGlCeXRlVG9XaWRlQ2hhcihDUF9BQ1AsIDAsIGJ1ZkEsIC0xLCBidWZXLCBzaXplb2YoYnVmVykvc2l6ZW9mKGJ1ZldbMF0pKTsKICAgIHJldHVybiBscGZuTG9jYWxlRW51bShidWZXKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJRW51bVN5c3RlbUxvY2FsZXNXCVtLRVJORUwzMi4yMDldCiAqLwpCT09MIFdJTkFQSSBFbnVtU3lzdGVtTG9jYWxlc1coIExPQ0FMRV9FTlVNUFJPQ1cgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGZsYWdzICkKewogICAgVFJBQ0UoIiglcCwlMDhseClcbiIsIGxwZm5Mb2NhbGVFbnVtLGZsYWdzKTsKCiAgICBFbnVtUmVzb3VyY2VMYW5ndWFnZXNXKEdldE1vZHVsZUhhbmRsZUEoIktFUk5FTDMyIiksIFJUX1NUUklOR1csCgkgICAgKExQQ1dTVFIpTE9DQUxFX0lMQU5HVUFHRSwgRW51bVJlc291cmNlTGFuZ3VhZ2VzUHJvY1csCgkgICAgKExPTkcpbHBmbkxvY2FsZUVudW0pOwoKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgQk9PTCBDQUxMQkFDSyBFbnVtUmVzb3VyY2VMYW5ndWFnZXNQcm9jQShITU9EVUxFIGhNb2R1bGUsIExQQ1NUUiB0eXBlLAoJCUxQQ1NUUiBuYW1lLCBXT1JEIExhbmdJRCwgTE9ORyBsUGFyYW0pCnsKICAgIENIQVIgYnVmQVsyMF07CiAgICBMT0NBTEVfRU5VTVBST0NBIGxwZm5Mb2NhbGVFbnVtID0gKExPQ0FMRV9FTlVNUFJPQ0EpbFBhcmFtOwogICAgc3ByaW50ZihidWZBLCAiJTA4WCIsIChVSU5UKUxhbmdJRCk7CiAgICByZXR1cm4gbHBmbkxvY2FsZUVudW0oYnVmQSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1TeXN0ZW1Mb2NhbGVzQQlbS0VSTkVMMzIuMjA4XQogKi8KQk9PTCBXSU5BUEkgRW51bVN5c3RlbUxvY2FsZXNBKExPQ0FMRV9FTlVNUFJPQ0EgbHBmbkxvY2FsZUVudW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MpCnsKICAgIFRSQUNFKCIoJXAsJTA4bHgpXG4iLCBscGZuTG9jYWxlRW51bSxmbGFncyk7CgogICAgRW51bVJlc291cmNlTGFuZ3VhZ2VzQShHZXRNb2R1bGVIYW5kbGVBKCJLRVJORUwzMiIpLCBSVF9TVFJJTkdBLAoJICAgIChMUENTVFIpTE9DQUxFX0lMQU5HVUFHRSwgRW51bVJlc291cmNlTGFuZ3VhZ2VzUHJvY0EsCgkgICAgKExPTkcpbHBmbkxvY2FsZUVudW0pOwoKICAgIHJldHVybiBUUlVFOwp9CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBDVF9DVHlwZTJfTFVUW10gPSB7CiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICAyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgMyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDQgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA1ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAgNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgIDcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gICA4ICovCiAgQzJfU0VHTUVOVFNFUEFSQVRPUiwgLyogICAtICAgOSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTAgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDExICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxMiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTMgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE0ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxNSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDE3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAxOCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMTkgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIwICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyMSAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjIgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDIzICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjUgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI2ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAyNyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMjggKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiAgIC0gIDI5ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogICAtICAzMCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qICAgLSAgMzEgKi8KICBDMl9XSElURVNQQUNFLCAvKiAgIC0gIDMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAhIC0gIDMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAjIC0gIDM1ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogJCAtICAzNiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICUgLSAgMzcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogJiAtICAzOCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogJyAtICAzOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKCAtICA0MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKSAtICA0MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogKiAtICA0MiAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qICsgLSAgNDMgKi8KICBDMl9DT01NT05TRVBBUkFUT1IsIC8qICwgLSAgNDQgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiAtIC0gIDQ1ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAuIC0gIDQ2ICovCiAgQzJfRVVST1BFU0VQQVJBVE9SLCAvKiAvIC0gIDQ3ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAwIC0gIDQ4ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAxIC0gIDQ5ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAyIC0gIDUwICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiAzIC0gIDUxICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA0IC0gIDUyICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA1IC0gIDUzICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA2IC0gIDU0ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA3IC0gIDU1ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA4IC0gIDU2ICovCiAgQzJfRVVST1BFTlVNQkVSLCAvKiA5IC0gIDU3ICovCiAgQzJfQ09NTU9OU0VQQVJBVE9SLCAvKiA6IC0gIDU4ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA7IC0gIDU5ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA8IC0gIDYwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA9IC0gIDYxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA+IC0gIDYyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiA/IC0gIDYzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEAgLSAgNjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogQSAtICA2NSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBCIC0gIDY2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEMgLSAgNjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRCAtICA2OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBFIC0gIDY5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEYgLSAgNzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogRyAtICA3MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBIIC0gIDcyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEkgLSAgNzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogSiAtICA3NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBLIC0gIDc1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIEwgLSAgNzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogTSAtICA3NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBOIC0gIDc4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIE8gLSAgNzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUCAtICA4MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBRIC0gIDgxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFIgLSAgODIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogUyAtICA4MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBUIC0gIDg0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFUgLSAgODUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogViAtICA4NiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBXIC0gIDg3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIFggLSAgODggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogWSAtICA4OSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBaIC0gIDkwICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBbIC0gIDkxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBcIC0gIDkyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBdIC0gIDkzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBeIC0gIDk0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBfIC0gIDk1ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiBgIC0gIDk2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGEgLSAgOTcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogYiAtICA5OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBjIC0gIDk5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGQgLSAxMDAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogZSAtIDEwMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBmIC0gMTAyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGcgLSAxMDMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogaCAtIDEwNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBpIC0gMTA1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIGogLSAxMDYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogayAtIDEwNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBsIC0gMTA4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIG0gLSAxMDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogbiAtIDExMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiBvIC0gMTExICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHAgLSAxMTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogcSAtIDExMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiByIC0gMTE0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHMgLSAxMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdCAtIDExNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB1IC0gMTE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHYgLSAxMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogdyAtIDExOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiB4IC0gMTIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIHkgLSAxMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogeiAtIDEyMiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogeyAtIDEyMyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfCAtIDEyNCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfSAtIDEyNSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogfiAtIDEyNiAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIH8gLSAxMjcgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCAIC0gMTI4ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyoggSAtIDEyOSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoggiAtIDEzMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCDIC0gMTMxICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCEIC0gMTMyICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCFIC0gMTMzICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCGIC0gMTM0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCHIC0gMTM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIggLSAxMzYgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCJIC0gMTM3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIIogLSAxMzggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIIsgLSAxMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogjCAtIDE0MCAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qII0gLSAxNDEgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCOIC0gMTQyICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogjyAtIDE0MyAqLwogIEMyX05PVEFQUExJQ0FCTEUsIC8qIJAgLSAxNDQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJEgLSAxNDUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJIgLSAxNDYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJMgLSAxNDcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJQgLSAxNDggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJUgLSAxNDkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJYgLSAxNTAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIJcgLSAxNTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogmCAtIDE1MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogmSAtIDE1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCaIC0gMTU0ICovCiAgQzJfT1RIRVJORVVUUkFMLCAvKiCbIC0gMTU1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIJwgLSAxNTYgKi8KICBDMl9OT1RBUFBMSUNBQkxFLCAvKiCdIC0gMTU3ICovCiAgQzJfTk9UQVBQTElDQUJMRSwgLyogniAtIDE1OCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiCfIC0gMTU5ICovCiAgQzJfV0hJVEVTUEFDRSwgLyogoCAtIDE2MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogoSAtIDE2MSAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKIgLSAxNjIgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCjIC0gMTYzICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogpCAtIDE2NCAqLwogIEMyX0VVUk9QRVRFUk1JTkFUT1IsIC8qIKUgLSAxNjUgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKYgLSAxNjYgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKcgLSAxNjcgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKggLSAxNjggKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKkgLSAxNjkgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKogLSAxNzAgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKsgLSAxNzEgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIKwgLSAxNzIgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK0gLSAxNzMgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK4gLSAxNzQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qIK8gLSAxNzUgKi8KICBDMl9FVVJPUEVURVJNSU5BVE9SLCAvKiCwIC0gMTc2ICovCiAgQzJfRVVST1BFVEVSTUlOQVRPUiwgLyogsSAtIDE3NyAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsiAtIDE3OCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyogsyAtIDE3OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtCAtIDE4MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtSAtIDE4MSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtiAtIDE4MiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogtyAtIDE4MyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguCAtIDE4NCAqLwogIEMyX0VVUk9QRU5VTUJFUiwgLyoguSAtIDE4NSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguiAtIDE4NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyoguyAtIDE4NyAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvCAtIDE4OCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvSAtIDE4OSAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogviAtIDE5MCAqLwogIEMyX09USEVSTkVVVFJBTCwgLyogvyAtIDE5MSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDAIC0gMTkyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMEgLSAxOTMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogwiAtIDE5NCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDDIC0gMTk1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMQgLSAxOTYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogxSAtIDE5NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDGIC0gMTk4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMcgLSAxOTkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyCAtIDIwMCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDJIC0gMjAxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIMogLSAyMDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogyyAtIDIwMyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDMIC0gMjA0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIM0gLSAyMDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyogziAtIDIwNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDPIC0gMjA3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINAgLSAyMDggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog0SAtIDIwOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDSIC0gMjEwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINMgLSAyMTEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog1CAtIDIxMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDVIC0gMjEzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINYgLSAyMTQgKi8KICBDMl9PVEhFUk5FVVRSQUwsIC8qINcgLSAyMTUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2CAtIDIxNiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDZIC0gMjE3ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qINogLSAyMTggKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog2yAtIDIxOSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDcIC0gMjIwICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIN0gLSAyMjEgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog3iAtIDIyMiAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDfIC0gMjIzICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOAgLSAyMjQgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog4SAtIDIyNSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDiIC0gMjI2ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOMgLSAyMjcgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5CAtIDIyOCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDlIC0gMjI5ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOYgLSAyMzAgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog5yAtIDIzMSAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDoIC0gMjMyICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOkgLSAyMzMgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog6iAtIDIzNCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDrIC0gMjM1ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIOwgLSAyMzYgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog7SAtIDIzNyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDuIC0gMjM4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIO8gLSAyMzkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8CAtIDI0MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiDxIC0gMjQxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPIgLSAyNDIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog8yAtIDI0MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD0IC0gMjQ0ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPUgLSAyNDUgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog9iAtIDI0NiAqLwogIEMyX09USEVSTkVVVFJBTCwgLyog9yAtIDI0NyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD4IC0gMjQ4ICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPkgLSAyNDkgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog+iAtIDI1MCAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD7IC0gMjUxICovCiAgQzJfTEVGVFRPUklHSFQsIC8qIPwgLSAyNTIgKi8KICBDMl9MRUZUVE9SSUdIVCwgLyog/SAtIDI1MyAqLwogIEMyX0xFRlRUT1JJR0hULCAvKiD+IC0gMjU0ICovCiAgQzJfTEVGVFRPUklHSFQgLyog/yAtIDI1NSAqLwp9OwoKY29uc3QgV09SRCBPTEUyTkxTX0NUX0NUeXBlM19MVVRbXSA9IHsgCiAgMHgwMDAwLCAvKiAgIC0gICAwICovCiAgMHgwMDAwLCAvKiAgIC0gICAxICovCiAgMHgwMDAwLCAvKiAgIC0gICAyICovCiAgMHgwMDAwLCAvKiAgIC0gICAzICovCiAgMHgwMDAwLCAvKiAgIC0gICA0ICovCiAgMHgwMDAwLCAvKiAgIC0gICA1ICovCiAgMHgwMDAwLCAvKiAgIC0gICA2ICovCiAgMHgwMDAwLCAvKiAgIC0gICA3ICovCiAgMHgwMDAwLCAvKiAgIC0gICA4ICovCiAgMHgwMDA4LCAvKiAgIC0gICA5ICovCiAgMHgwMDA4LCAvKiAgIC0gIDEwICovCiAgMHgwMDA4LCAvKiAgIC0gIDExICovCiAgMHgwMDA4LCAvKiAgIC0gIDEyICovCiAgMHgwMDA4LCAvKiAgIC0gIDEzICovCiAgMHgwMDAwLCAvKiAgIC0gIDE0ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE1ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE2ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE3ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE4ICovCiAgMHgwMDAwLCAvKiAgIC0gIDE5ICovCiAgMHgwMDAwLCAvKiAgIC0gIDIwICovCiAgMHgwMDAwLCAvKiAgIC0gIDIxICovCiAgMHgwMDAwLCAvKiAgIC0gIDIyICovCiAgMHgwMDAwLCAvKiAgIC0gIDIzICovCiAgMHgwMDAwLCAvKiAgIC0gIDI0ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI1ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI2ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI3ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI4ICovCiAgMHgwMDAwLCAvKiAgIC0gIDI5ICovCiAgMHgwMDAwLCAvKiAgIC0gIDMwICovCiAgMHgwMDAwLCAvKiAgIC0gIDMxICovCiAgMHgwMDQ4LCAvKiAgIC0gIDMyICovCiAgMHgwMDQ4LCAvKiAhIC0gIDMzICovCiAgMHgwNDQ4LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICAweDAwNDgsIC8qICMgLSAgMzUgKi8KICAweDA0NDgsIC8qICQgLSAgMzYgKi8KICAweDAwNDgsIC8qICUgLSAgMzcgKi8KICAweDAwNDgsIC8qICYgLSAgMzggKi8KICAweDA0NDAsIC8qICcgLSAgMzkgKi8KICAweDAwNDgsIC8qICggLSAgNDAgKi8KICAweDAwNDgsIC8qICkgLSAgNDEgKi8KICAweDAwNDgsIC8qICogLSAgNDIgKi8KICAweDAwNDgsIC8qICsgLSAgNDMgKi8KICAweDAwNDgsIC8qICwgLSAgNDQgKi8KICAweDA0NDAsIC8qIC0gLSAgNDUgKi8KICAweDAwNDgsIC8qIC4gLSAgNDYgKi8KICAweDA0NDgsIC8qIC8gLSAgNDcgKi8KICAweDAwNDAsIC8qIDAgLSAgNDggKi8KICAweDAwNDAsIC8qIDEgLSAgNDkgKi8KICAweDAwNDAsIC8qIDIgLSAgNTAgKi8KICAweDAwNDAsIC8qIDMgLSAgNTEgKi8KICAweDAwNDAsIC8qIDQgLSAgNTIgKi8KICAweDAwNDAsIC8qIDUgLSAgNTMgKi8KICAweDAwNDAsIC8qIDYgLSAgNTQgKi8KICAweDAwNDAsIC8qIDcgLSAgNTUgKi8KICAweDAwNDAsIC8qIDggLSAgNTYgKi8KICAweDAwNDAsIC8qIDkgLSAgNTcgKi8KICAweDAwNDgsIC8qIDogLSAgNTggKi8KICAweDAwNDgsIC8qIDsgLSAgNTkgKi8KICAweDAwNDgsIC8qIDwgLSAgNjAgKi8KICAweDA0NDgsIC8qID0gLSAgNjEgKi8KICAweDAwNDgsIC8qID4gLSAgNjIgKi8KICAweDAwNDgsIC8qID8gLSAgNjMgKi8KICAweDA0NDgsIC8qIEAgLSAgNjQgKi8KICAweDgwNDAsIC8qIEEgLSAgNjUgKi8KICAweDgwNDAsIC8qIEIgLSAgNjYgKi8KICAweDgwNDAsIC8qIEMgLSAgNjcgKi8KICAweDgwNDAsIC8qIEQgLSAgNjggKi8KICAweDgwNDAsIC8qIEUgLSAgNjkgKi8KICAweDgwNDAsIC8qIEYgLSAgNzAgKi8KICAweDgwNDAsIC8qIEcgLSAgNzEgKi8KICAweDgwNDAsIC8qIEggLSAgNzIgKi8KICAweDgwNDAsIC8qIEkgLSAgNzMgKi8KICAweDgwNDAsIC8qIEogLSAgNzQgKi8KICAweDgwNDAsIC8qIEsgLSAgNzUgKi8KICAweDgwNDAsIC8qIEwgLSAgNzYgKi8KICAweDgwNDAsIC8qIE0gLSAgNzcgKi8KICAweDgwNDAsIC8qIE4gLSAgNzggKi8KICAweDgwNDAsIC8qIE8gLSAgNzkgKi8KICAweDgwNDAsIC8qIFAgLSAgODAgKi8KICAweDgwNDAsIC8qIFEgLSAgODEgKi8KICAweDgwNDAsIC8qIFIgLSAgODIgKi8KICAweDgwNDAsIC8qIFMgLSAgODMgKi8KICAweDgwNDAsIC8qIFQgLSAgODQgKi8KICAweDgwNDAsIC8qIFUgLSAgODUgKi8KICAweDgwNDAsIC8qIFYgLSAgODYgKi8KICAweDgwNDAsIC8qIFcgLSAgODcgKi8KICAweDgwNDAsIC8qIFggLSAgODggKi8KICAweDgwNDAsIC8qIFkgLSAgODkgKi8KICAweDgwNDAsIC8qIFogLSAgOTAgKi8KICAweDAwNDgsIC8qIFsgLSAgOTEgKi8KICAweDA0NDgsIC8qIFwgLSAgOTIgKi8KICAweDAwNDgsIC8qIF0gLSAgOTMgKi8KICAweDA0NDgsIC8qIF4gLSAgOTQgKi8KICAweDA0NDgsIC8qIF8gLSAgOTUgKi8KICAweDA0NDgsIC8qIGAgLSAgOTYgKi8KICAweDgwNDAsIC8qIGEgLSAgOTcgKi8KICAweDgwNDAsIC8qIGIgLSAgOTggKi8KICAweDgwNDAsIC8qIGMgLSAgOTkgKi8KICAweDgwNDAsIC8qIGQgLSAxMDAgKi8KICAweDgwNDAsIC8qIGUgLSAxMDEgKi8KICAweDgwNDAsIC8qIGYgLSAxMDIgKi8KICAweDgwNDAsIC8qIGcgLSAxMDMgKi8KICAweDgwNDAsIC8qIGggLSAxMDQgKi8KICAweDgwNDAsIC8qIGkgLSAxMDUgKi8KICAweDgwNDAsIC8qIGogLSAxMDYgKi8KICAweDgwNDAsIC8qIGsgLSAxMDcgKi8KICAweDgwNDAsIC8qIGwgLSAxMDggKi8KICAweDgwNDAsIC8qIG0gLSAxMDkgKi8KICAweDgwNDAsIC8qIG4gLSAxMTAgKi8KICAweDgwNDAsIC8qIG8gLSAxMTEgKi8KICAweDgwNDAsIC8qIHAgLSAxMTIgKi8KICAweDgwNDAsIC8qIHEgLSAxMTMgKi8KICAweDgwNDAsIC8qIHIgLSAxMTQgKi8KICAweDgwNDAsIC8qIHMgLSAxMTUgKi8KICAweDgwNDAsIC8qIHQgLSAxMTYgKi8KICAweDgwNDAsIC8qIHUgLSAxMTcgKi8KICAweDgwNDAsIC8qIHYgLSAxMTggKi8KICAweDgwNDAsIC8qIHcgLSAxMTkgKi8KICAweDgwNDAsIC8qIHggLSAxMjAgKi8KICAweDgwNDAsIC8qIHkgLSAxMjEgKi8KICAweDgwNDAsIC8qIHogLSAxMjIgKi8KICAweDAwNDgsIC8qIHsgLSAxMjMgKi8KICAweDAwNDgsIC8qIHwgLSAxMjQgKi8KICAweDAwNDgsIC8qIH0gLSAxMjUgKi8KICAweDA0NDgsIC8qIH4gLSAxMjYgKi8KICAweDAwMDAsIC8qIH8gLSAxMjcgKi8KICAweDAwMDAsIC8qIIAgLSAxMjggKi8KICAweDAwMDAsIC8qIIEgLSAxMjkgKi8KICAweDAwMDgsIC8qIIIgLSAxMzAgKi8KICAweDgwMDAsIC8qIIMgLSAxMzEgKi8KICAweDAwMDgsIC8qIIQgLSAxMzIgKi8KICAweDAwMDgsIC8qIIUgLSAxMzMgKi8KICAweDAwMDgsIC8qIIYgLSAxMzQgKi8KICAweDAwMDgsIC8qIIcgLSAxMzUgKi8KICAweDAwMDEsIC8qIIggLSAxMzYgKi8KICAweDAwMDgsIC8qIIkgLSAxMzcgKi8KICAweDgwMDMsIC8qIIogLSAxMzggKi8KICAweDAwMDgsIC8qIIsgLSAxMzkgKi8KICAweDgwMDAsIC8qIIwgLSAxNDAgKi8KICAweDAwMDAsIC8qII0gLSAxNDEgKi8KICAweDAwMDAsIC8qII4gLSAxNDIgKi8KICAweDAwMDAsIC8qII8gLSAxNDMgKi8KICAweDAwMDAsIC8qIJAgLSAxNDQgKi8KICAweDAwODgsIC8qIJEgLSAxNDUgKi8KICAweDAwODgsIC8qIJIgLSAxNDYgKi8KICAweDAwODgsIC8qIJMgLSAxNDcgKi8KICAweDAwODgsIC8qIJQgLSAxNDggKi8KICAweDAwMDgsIC8qIJUgLSAxNDkgKi8KICAweDA0MDAsIC8qIJYgLSAxNTAgKi8KICAweDA0MDAsIC8qIJcgLSAxNTEgKi8KICAweDA0MDgsIC8qIJggLSAxNTIgKi8KICAweDAwMDAsIC8qIJkgLSAxNTMgKi8KICAweDgwMDMsIC8qIJogLSAxNTQgKi8KICAweDAwMDgsIC8qIJsgLSAxNTUgKi8KICAweDgwMDAsIC8qIJwgLSAxNTYgKi8KICAweDAwMDAsIC8qIJ0gLSAxNTcgKi8KICAweDAwMDAsIC8qIJ4gLSAxNTggKi8KICAweDgwMDMsIC8qIJ8gLSAxNTkgKi8KICAweDAwMDgsIC8qIKAgLSAxNjAgKi8KICAweDAwMDgsIC8qIKEgLSAxNjEgKi8KICAweDAwNDgsIC8qIKIgLSAxNjIgKi8KICAweDAwNDgsIC8qIKMgLSAxNjMgKi8KICAweDAwMDgsIC8qIKQgLSAxNjQgKi8KICAweDAwNDgsIC8qIKUgLSAxNjUgKi8KICAweDAwNDgsIC8qIKYgLSAxNjYgKi8KICAweDAwMDgsIC8qIKcgLSAxNjcgKi8KICAweDA0MDgsIC8qIKggLSAxNjggKi8KICAweDAwMDgsIC8qIKkgLSAxNjkgKi8KICAweDA0MDAsIC8qIKogLSAxNzAgKi8KICAweDAwMDgsIC8qIKsgLSAxNzEgKi8KICAweDAwNDgsIC8qIKwgLSAxNzIgKi8KICAweDA0MDgsIC8qIK0gLSAxNzMgKi8KICAweDAwMDgsIC8qIK4gLSAxNzQgKi8KICAweDA0NDgsIC8qIK8gLSAxNzUgKi8KICAweDAwMDgsIC8qILAgLSAxNzYgKi8KICAweDAwMDgsIC8qILEgLSAxNzcgKi8KICAweDAwMDAsIC8qILIgLSAxNzggKi8KICAweDAwMDAsIC8qILMgLSAxNzkgKi8KICAweDA0MDgsIC8qILQgLSAxODAgKi8KICAweDAwMDgsIC8qILUgLSAxODEgKi8KICAweDAwMDgsIC8qILYgLSAxODIgKi8KICAweDAwMDgsIC8qILcgLSAxODMgKi8KICAweDA0MDgsIC8qILggLSAxODQgKi8KICAweDAwMDAsIC8qILkgLSAxODUgKi8KICAweDA0MDAsIC8qILogLSAxODYgKi8KICAweDAwMDgsIC8qILsgLSAxODcgKi8KICAweDAwMDAsIC8qILwgLSAxODggKi8KICAweDAwMDAsIC8qIL0gLSAxODkgKi8KICAweDAwMDAsIC8qIL4gLSAxOTAgKi8KICAweDAwMDgsIC8qIL8gLSAxOTEgKi8KICAweDgwMDMsIC8qIMAgLSAxOTIgKi8KICAweDgwMDMsIC8qIMEgLSAxOTMgKi8KICAweDgwMDMsIC8qIMIgLSAxOTQgKi8KICAweDgwMDMsIC8qIMMgLSAxOTUgKi8KICAweDgwMDMsIC8qIMQgLSAxOTYgKi8KICAweDgwMDMsIC8qIMUgLSAxOTcgKi8KICAweDgwMDAsIC8qIMYgLSAxOTggKi8KICAweDgwMDMsIC8qIMcgLSAxOTkgKi8KICAweDgwMDMsIC8qIMggLSAyMDAgKi8KICAweDgwMDMsIC8qIMkgLSAyMDEgKi8KICAweDgwMDMsIC8qIMogLSAyMDIgKi8KICAweDgwMDMsIC8qIMsgLSAyMDMgKi8KICAweDgwMDMsIC8qIMwgLSAyMDQgKi8KICAweDgwMDMsIC8qIM0gLSAyMDUgKi8KICAweDgwMDMsIC8qIM4gLSAyMDYgKi8KICAweDgwMDMsIC8qIM8gLSAyMDcgKi8KICAweDgwMDAsIC8qINAgLSAyMDggKi8KICAweDgwMDMsIC8qINEgLSAyMDkgKi8KICAweDgwMDMsIC8qINIgLSAyMTAgKi8KICAweDgwMDMsIC8qINMgLSAyMTEgKi8KICAweDgwMDMsIC8qINQgLSAyMTIgKi8KICAweDgwMDMsIC8qINUgLSAyMTMgKi8KICAweDgwMDMsIC8qINYgLSAyMTQgKi8KICAweDAwMDgsIC8qINcgLSAyMTUgKi8KICAweDgwMDMsIC8qINggLSAyMTYgKi8KICAweDgwMDMsIC8qINkgLSAyMTcgKi8KICAweDgwMDMsIC8qINogLSAyMTggKi8KICAweDgwMDMsIC8qINsgLSAyMTkgKi8KICAweDgwMDMsIC8qINwgLSAyMjAgKi8KICAweDgwMDMsIC8qIN0gLSAyMjEgKi8KICAweDgwMDAsIC8qIN4gLSAyMjIgKi8KICAweDgwMDAsIC8qIN8gLSAyMjMgKi8KICAweDgwMDMsIC8qIOAgLSAyMjQgKi8KICAweDgwMDMsIC8qIOEgLSAyMjUgKi8KICAweDgwMDMsIC8qIOIgLSAyMjYgKi8KICAweDgwMDMsIC8qIOMgLSAyMjcgKi8KICAweDgwMDMsIC8qIOQgLSAyMjggKi8KICAweDgwMDMsIC8qIOUgLSAyMjkgKi8KICAweDgwMDAsIC8qIOYgLSAyMzAgKi8KICAweDgwMDMsIC8qIOcgLSAyMzEgKi8KICAweDgwMDMsIC8qIOggLSAyMzIgKi8KICAweDgwMDMsIC8qIOkgLSAyMzMgKi8KICAweDgwMDMsIC8qIOogLSAyMzQgKi8KICAweDgwMDMsIC8qIOsgLSAyMzUgKi8KICAweDgwMDMsIC8qIOwgLSAyMzYgKi8KICAweDgwMDMsIC8qIO0gLSAyMzcgKi8KICAweDgwMDMsIC8qIO4gLSAyMzggKi8KICAweDgwMDMsIC8qIO8gLSAyMzkgKi8KICAweDgwMDAsIC8qIPAgLSAyNDAgKi8KICAweDgwMDMsIC8qIPEgLSAyNDEgKi8KICAweDgwMDMsIC8qIPIgLSAyNDIgKi8KICAweDgwMDMsIC8qIPMgLSAyNDMgKi8KICAweDgwMDMsIC8qIPQgLSAyNDQgKi8KICAweDgwMDMsIC8qIPUgLSAyNDUgKi8KICAweDgwMDMsIC8qIPYgLSAyNDYgKi8KICAweDAwMDgsIC8qIPcgLSAyNDcgKi8KICAweDgwMDMsIC8qIPggLSAyNDggKi8KICAweDgwMDMsIC8qIPkgLSAyNDkgKi8KICAweDgwMDMsIC8qIPogLSAyNTAgKi8KICAweDgwMDMsIC8qIPsgLSAyNTEgKi8KICAweDgwMDMsIC8qIPwgLSAyNTIgKi8KICAweDgwMDMsIC8qIP0gLSAyNTMgKi8KICAweDgwMDAsIC8qIP4gLSAyNTQgKi8KICAweDgwMDMgIC8qIP8gLSAyNTUgKi8KfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGVBCVtLRVJORUwzMi4zOTZdCiAqLwpCT09MIFdJTkFQSSBHZXRTdHJpbmdUeXBlQShMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJcmV0dXJuIEdldFN0cmluZ1R5cGVFeEEobG9jYWxlLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFN0cmluZ1R5cGVFeEEJW0tFUk5FTDMyLjM5N10KICoKICogRklYTUU6IElnbm9yZXMgdGhlIGxvY2FsZS4KICovCkJPT0wgV0lOQVBJIEdldFN0cmluZ1R5cGVFeEEoTENJRCBsb2NhbGUsRFdPUkQgZHdJbmZvVHlwZSxMUENTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQgY2NoU3JjLExQV09SRCBjaGFydHlwZSkKewoJaW50CWk7CgkKCWlmICgoc3JjPT1OVUxMKSB8fCAoY2hhcnR5cGU9PU5VTEwpIHx8IChzcmM9PShMUFNUUiljaGFydHlwZSkpCgl7CgkgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CgkgIHJldHVybiBGQUxTRTsKCX0KCglpZiAoY2NoU3JjPT0tMSkKCSAgY2NoU3JjPXN0cmxlbihzcmMpKzE7CgkgIAoJc3dpdGNoIChkd0luZm9UeXBlKSB7CgljYXNlIENUX0NUWVBFMToKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldID0gMDsKCSAgICBpZiAoaXNkaWdpdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfRElHSVQ7CgkgICAgaWYgKGlzYWxwaGEoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0FMUEhBOwoJICAgIGlmIChpc2xvd2VyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9MT1dFUjsKCSAgICBpZiAoaXN1cHBlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfVVBQRVI7CgkgICAgaWYgKGlzc3BhY2Uoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1NQQUNFOwoJICAgIGlmIChpc3B1bmN0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9QVU5DVDsKCSAgICBpZiAoaXNjbnRybChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQ05UUkw7Ci8qIEZJWE1FOiBpc2JsYW5rKCkgaXMgYSBHTlUgZXh0ZW5zaW9uICovCi8qCQlpZiAoaXNibGFuayhzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7ICovCgkgICAgaWYgKChzcmNbaV0gPT0gJyAnKSB8fCAoc3JjW2ldID09ICdcdCcpKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CgkgICAgLyogQzFfWERJR0lUICovCgl9CglyZXR1cm4gVFJVRTsKCgljYXNlIENUX0NUWVBFMjoKCSAgZm9yIChpPTA7aTxjY2hTcmM7aSsrKSAKCSAgewoJICAgIGNoYXJ0eXBlW2ldPShXT1JEKUNUX0NUeXBlMl9MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJY2FzZSBDVF9DVFlQRTM6CgkgIGZvciAoaT0wO2k8Y2NoU3JjO2krKykgCgkgIHsKCSAgICBjaGFydHlwZVtpXT1PTEUyTkxTX0NUX0NUeXBlM19MVVRbaV07CgkgIH0KCSAgcmV0dXJuIFRSVUU7CgoJZGVmYXVsdDoKCSAgRVJSKCJVbmtub3duIGR3SW5mb1R5cGU6JWxkXG4iLGR3SW5mb1R5cGUpOwoJICByZXR1cm4gRkFMU0U7Cgl9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVmVyTGFuZ3VhZ2VOYW1lQSAgICAgICAgICAgICAgW0tFUk5FTDMyLjcwOV1bVkVSU0lPTi45XQogKi8KRFdPUkQgV0lOQVBJIFZlckxhbmd1YWdlTmFtZUEoIFVJTlQgd0xhbmcsIExQU1RSIHN6TGFuZywgVUlOVCBuU2l6ZSApCnsKICAgIGlmKCFzekxhbmcpCglyZXR1cm4gMDsKCiAgICByZXR1cm4gR2V0TG9jYWxlSW5mb0EoTUFLRUxDSUQod0xhbmcsIFNPUlRfREVGQVVMVCksIExPQ0FMRV9TRU5HTEFOR1VBR0UsIHN6TGFuZywgblNpemUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFZlckxhbmd1YWdlTmFtZVcgICAgICAgICAgICAgIFtLRVJORUwzMi43MTBdW1ZFUlNJT04uMTBdCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lVyggVUlOVCB3TGFuZywgTFBXU1RSIHN6TGFuZywgVUlOVCBuU2l6ZSApCnsKICAgIGlmKCFzekxhbmcpCglyZXR1cm4gMDsKCiAgICByZXR1cm4gR2V0TG9jYWxlSW5mb1coTUFLRUxDSUQod0xhbmcsIFNPUlRfREVGQVVMVCksIExPQ0FMRV9TRU5HTEFOR1VBR0UsIHN6TGFuZywgblNpemUpOwp9CgogCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVFtdID0gewogIDYgICAgICAsICAgMywgLyogICAtICAgMSAqLyAgCiAgNiAgICAgICwgICA0LCAvKiAgIC0gICAyICovICAKICA2ICAgICAgLCAgIDUsIC8qICAgLSAgIDMgKi8gIAogIDYgICAgICAsICAgNiwgLyogICAtICAgNCAqLyAgCiAgNiAgICAgICwgICA3LCAvKiAgIC0gICA1ICovICAKICA2ICAgICAgLCAgIDgsIC8qICAgLSAgIDYgKi8gIAogIDYgICAgICAsICAgOSwgLyogICAtICAgNyAqLyAgCiAgNiAgICAgICwgIDEwLCAvKiAgIC0gICA4ICovICAKICA3ICAgICAgLCAgIDUsIC8qICAgLSAgIDkgKi8gIAogIDcgICAgICAsICAgNiwgLyogICAtICAxMCAqLyAgCiAgNyAgICAgICwgICA3LCAvKiAgIC0gIDExICovICAKICA3ICAgICAgLCAgIDgsIC8qICAgLSAgMTIgKi8gIAogIDcgICAgICAsICAgOSwgLyogICAtICAxMyAqLyAgCiAgNiAgICAgICwgIDExLCAvKiAgIC0gIDE0ICovICAKICA2ICAgICAgLCAgMTIsIC8qICAgLSAgMTUgKi8gIAogIDYgICAgICAsICAxMywgLyogICAtICAxNiAqLyAgCiAgNiAgICAgICwgIDE0LCAvKiAgIC0gIDE3ICovICAKICA2ICAgICAgLCAgMTUsIC8qICAgLSAgMTggKi8gIAogIDYgICAgICAsICAxNiwgLyogICAtICAxOSAqLyAgCiAgNiAgICAgICwgIDE3LCAvKiAgIC0gIDIwICovICAKICA2ICAgICAgLCAgMTgsIC8qICAgLSAgMjEgKi8gIAogIDYgICAgICAsICAxOSwgLyogICAtICAyMiAqLyAgCiAgNiAgICAgICwgIDIwLCAvKiAgIC0gIDIzICovICAKICA2ICAgICAgLCAgMjEsIC8qICAgLSAgMjQgKi8gIAogIDYgICAgICAsICAyMiwgLyogICAtICAyNSAqLyAgCiAgNiAgICAgICwgIDIzLCAvKiAgIC0gIDI2ICovICAKICA2ICAgICAgLCAgMjQsIC8qICAgLSAgMjcgKi8gIAogIDYgICAgICAsICAyNSwgLyogICAtICAyOCAqLyAgCiAgNiAgICAgICwgIDI2LCAvKiAgIC0gIDI5ICovICAKICA2ICAgICAgLCAgMjcsIC8qICAgLSAgMzAgKi8gIAogIDYgICAgICAsICAyOCwgLyogICAtICAzMSAqLyAgCiAgNyAgICAgICwgICAyLCAvKiAgIC0gIDMyICovCiAgNyAgICAgICwgIDI4LCAvKiAhIC0gIDMzICovCiAgNyAgICAgICwgIDI5LCAvKiAiIC0gIDM0ICovIC8qICIgKi8KICA3ICAgICAgLCAgMzEsIC8qICMgLSAgMzUgKi8KICA3ICAgICAgLCAgMzMsIC8qICQgLSAgMzYgKi8KICA3ICAgICAgLCAgMzUsIC8qICUgLSAgMzcgKi8KICA3ICAgICAgLCAgMzcsIC8qICYgLSAgMzggKi8KICA2ICAgICAgLCAxMjgsIC8qICcgLSAgMzkgKi8KICA3ICAgICAgLCAgMzksIC8qICggLSAgNDAgKi8KICA3ICAgICAgLCAgNDIsIC8qICkgLSAgNDEgKi8KICA3ICAgICAgLCAgNDUsIC8qICogLSAgNDIgKi8KICA4ICAgICAgLCAgIDMsIC8qICsgLSAgNDMgKi8KICA3ICAgICAgLCAgNDcsIC8qICwgLSAgNDQgKi8KICA2ICAgICAgLCAxMzAsIC8qIC0gLSAgNDUgKi8KICA3ICAgICAgLCAgNTEsIC8qIC4gLSAgNDYgKi8KICA3ICAgICAgLCAgNTMsIC8qIC8gLSAgNDcgKi8KIDEyICAgICAgLCAgIDMsIC8qIDAgLSAgNDggKi8KIDEyICAgICAgLCAgMzMsIC8qIDEgLSAgNDkgKi8KIDEyICAgICAgLCAgNTEsIC8qIDIgLSAgNTAgKi8KIDEyICAgICAgLCAgNzAsIC8qIDMgLSAgNTEgKi8KIDEyICAgICAgLCAgODgsIC8qIDQgLSAgNTIgKi8KIDEyICAgICAgLCAxMDYsIC8qIDUgLSAgNTMgKi8KIDEyICAgICAgLCAxMjUsIC8qIDYgLSAgNTQgKi8KIDEyICAgICAgLCAxNDQsIC8qIDcgLSAgNTUgKi8KIDEyICAgICAgLCAxNjIsIC8qIDggLSAgNTYgKi8KIDEyICAgICAgLCAxODAsIC8qIDkgLSAgNTcgKi8KICA3ICAgICAgLCAgNTUsIC8qIDogLSAgNTggKi8KICA3ICAgICAgLCAgNTgsIC8qIDsgLSAgNTkgKi8KICA4ICAgICAgLCAgMTQsIC8qIDwgLSAgNjAgKi8KICA4ICAgICAgLCAgMTgsIC8qID0gLSAgNjEgKi8KICA4ICAgICAgLCAgMjAsIC8qID4gLSAgNjIgKi8KICA3ICAgICAgLCAgNjAsIC8qID8gLSAgNjMgKi8KICA3ICAgICAgLCAgNjIsIC8qIEAgLSAgNjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIEEgLSAgNjUgKi8KIDE0ICAgICAgLCAgIDksIC8qIEIgLSAgNjYgKi8KIDE0ICAgICAgLCAgMTAsIC8qIEMgLSAgNjcgKi8KIDE0ICAgICAgLCAgMjYsIC8qIEQgLSAgNjggKi8KIDE0ICAgICAgLCAgMzMsIC8qIEUgLSAgNjkgKi8KIDE0ICAgICAgLCAgMzUsIC8qIEYgLSAgNzAgKi8KIDE0ICAgICAgLCAgMzcsIC8qIEcgLSAgNzEgKi8KIDE0ICAgICAgLCAgNDQsIC8qIEggLSAgNzIgKi8KIDE0ICAgICAgLCAgNTAsIC8qIEkgLSAgNzMgKi8KIDE0ICAgICAgLCAgNTMsIC8qIEogLSAgNzQgKi8KIDE0ICAgICAgLCAgNTQsIC8qIEsgLSAgNzUgKi8KIDE0ICAgICAgLCAgNzIsIC8qIEwgLSAgNzYgKi8KIDE0ICAgICAgLCAgODEsIC8qIE0gLSAgNzcgKi8KIDE0ICAgICAgLCAxMTIsIC8qIE4gLSAgNzggKi8KIDE0ICAgICAgLCAxMjQsIC8qIE8gLSAgNzkgKi8KIDE0ICAgICAgLCAxMjYsIC8qIFAgLSAgODAgKi8KIDE0ICAgICAgLCAxMzcsIC8qIFEgLSAgODEgKi8KIDE0ICAgICAgLCAxMzgsIC8qIFIgLSAgODIgKi8KIDE0ICAgICAgLCAxNDUsIC8qIFMgLSAgODMgKi8KIDE0ICAgICAgLCAxNTMsIC8qIFQgLSAgODQgKi8KIDE0ICAgICAgLCAxNTksIC8qIFUgLSAgODUgKi8KIDE0ICAgICAgLCAxNjIsIC8qIFYgLSAgODYgKi8KIDE0ICAgICAgLCAxNjQsIC8qIFcgLSAgODcgKi8KIDE0ICAgICAgLCAxNjYsIC8qIFggLSAgODggKi8KIDE0ICAgICAgLCAxNjcsIC8qIFkgLSAgODkgKi8KIDE0ICAgICAgLCAxNjksIC8qIFogLSAgOTAgKi8KICA3ICAgICAgLCAgNjMsIC8qIFsgLSAgOTEgKi8KICA3ICAgICAgLCAgNjUsIC8qIFwgLSAgOTIgKi8KICA3ICAgICAgLCAgNjYsIC8qIF0gLSAgOTMgKi8KICA3ICAgICAgLCAgNjcsIC8qIF4gLSAgOTQgKi8KICA3ICAgICAgLCAgNjgsIC8qIF8gLSAgOTUgKi8KICA3ICAgICAgLCAgNzIsIC8qIGAgLSAgOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIGEgLSAgOTcgKi8KIDE0ICAgICAgLCAgIDksIC8qIGIgLSAgOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIGMgLSAgOTkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIGQgLSAxMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIGUgLSAxMDEgKi8KIDE0ICAgICAgLCAgMzUsIC8qIGYgLSAxMDIgKi8KIDE0ICAgICAgLCAgMzcsIC8qIGcgLSAxMDMgKi8KIDE0ICAgICAgLCAgNDQsIC8qIGggLSAxMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIGkgLSAxMDUgKi8KIDE0ICAgICAgLCAgNTMsIC8qIGogLSAxMDYgKi8KIDE0ICAgICAgLCAgNTQsIC8qIGsgLSAxMDcgKi8KIDE0ICAgICAgLCAgNzIsIC8qIGwgLSAxMDggKi8KIDE0ICAgICAgLCAgODEsIC8qIG0gLSAxMDkgKi8KIDE0ICAgICAgLCAxMTIsIC8qIG4gLSAxMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qIG8gLSAxMTEgKi8KIDE0ICAgICAgLCAxMjYsIC8qIHAgLSAxMTIgKi8KIDE0ICAgICAgLCAxMzcsIC8qIHEgLSAxMTMgKi8KIDE0ICAgICAgLCAxMzgsIC8qIHIgLSAxMTQgKi8KIDE0ICAgICAgLCAxNDUsIC8qIHMgLSAxMTUgKi8KIDE0ICAgICAgLCAxNTMsIC8qIHQgLSAxMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qIHUgLSAxMTcgKi8KIDE0ICAgICAgLCAxNjIsIC8qIHYgLSAxMTggKi8KIDE0ICAgICAgLCAxNjQsIC8qIHcgLSAxMTkgKi8KIDE0ICAgICAgLCAxNjYsIC8qIHggLSAxMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIHkgLSAxMjEgKi8KIDE0ICAgICAgLCAxNjksIC8qIHogLSAxMjIgKi8KICA3ICAgICAgLCAgNzQsIC8qIHsgLSAxMjMgKi8KICA3ICAgICAgLCAgNzYsIC8qIHwgLSAxMjQgKi8KICA3ICAgICAgLCAgNzgsIC8qIH0gLSAxMjUgKi8KICA3ICAgICAgLCAgODAsIC8qIH4gLSAxMjYgKi8KICA2ICAgICAgLCAgMjksIC8qIH8gLSAxMjcgKi8KICA2ICAgICAgLCAgMzAsIC8qIIAgLSAxMjggKi8KICA2ICAgICAgLCAgMzEsIC8qIIEgLSAxMjkgKi8KICA3ICAgICAgLCAxMjMsIC8qIIIgLSAxMzAgKi8KIDE0ICAgICAgLCAgMzUsIC8qIIMgLSAxMzEgKi8KICA3ICAgICAgLCAxMjcsIC8qIIQgLSAxMzIgKi8KIDEwICAgICAgLCAgMjEsIC8qIIUgLSAxMzMgKi8KIDEwICAgICAgLCAgMTUsIC8qIIYgLSAxMzQgKi8KIDEwICAgICAgLCAgMTYsIC8qIIcgLSAxMzUgKi8KICA3ICAgICAgLCAgNjcsIC8qIIggLSAxMzYgKi8KIDEwICAgICAgLCAgMjIsIC8qIIkgLSAxMzcgKi8KIDE0ICAgICAgLCAxNDUsIC8qIIogLSAxMzggKi8KICA3ICAgICAgLCAxMzYsIC8qIIsgLSAxMzkgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIIwgLSAxNDAgKi8KICA2ICAgICAgLCAgNDMsIC8qII0gLSAxNDEgKi8KICA2ICAgICAgLCAgNDQsIC8qII4gLSAxNDIgKi8KICA2ICAgICAgLCAgNDUsIC8qII8gLSAxNDMgKi8KICA2ICAgICAgLCAgNDYsIC8qIJAgLSAxNDQgKi8KICA3ICAgICAgLCAxMjEsIC8qIJEgLSAxNDUgKi8KICA3ICAgICAgLCAxMjIsIC8qIJIgLSAxNDYgKi8KICA3ICAgICAgLCAxMjUsIC8qIJMgLSAxNDcgKi8KICA3ICAgICAgLCAxMjYsIC8qIJQgLSAxNDggKi8KIDEwICAgICAgLCAgMTcsIC8qIJUgLSAxNDkgKi8KICA2ICAgICAgLCAxMzcsIC8qIJYgLSAxNTAgKi8KICA2ICAgICAgLCAxMzksIC8qIJcgLSAxNTEgKi8KICA3ICAgICAgLCAgOTMsIC8qIJggLSAxNTIgKi8KIDE0ICAgICAgLCAxNTYsIC8qIJkgLSAxNTMgKi8KIDE0ICAgICAgLCAxNDUsIC8qIJogLSAxNTQgKi8KICA3ICAgICAgLCAxMzcsIC8qIJsgLSAxNTUgKi8KIDE0ICsgMTYgLCAxMjQsIC8qIJwgLSAxNTYgKi8KICA2ICAgICAgLCAgNTksIC8qIJ0gLSAxNTcgKi8KICA2ICAgICAgLCAgNjAsIC8qIJ4gLSAxNTggKi8KIDE0ICAgICAgLCAxNjcsIC8qIJ8gLSAxNTkgKi8KICA3ICAgICAgLCAgIDQsIC8qIKAgLSAxNjAgKi8KICA3ICAgICAgLCAgODEsIC8qIKEgLSAxNjEgKi8KIDEwICAgICAgLCAgIDIsIC8qIKIgLSAxNjIgKi8KIDEwICAgICAgLCAgIDMsIC8qIKMgLSAxNjMgKi8KIDEwICAgICAgLCAgIDQsIC8qIKQgLSAxNjQgKi8KIDEwICAgICAgLCAgIDUsIC8qIKUgLSAxNjUgKi8KICA3ICAgICAgLCAgODIsIC8qIKYgLSAxNjYgKi8KIDEwICAgICAgLCAgIDYsIC8qIKcgLSAxNjcgKi8KICA3ICAgICAgLCAgODMsIC8qIKggLSAxNjggKi8KIDEwICAgICAgLCAgIDcsIC8qIKkgLSAxNjkgKi8KIDE0ICAgICAgLCAgIDIsIC8qIKogLSAxNzAgKi8KICA4ICAgICAgLCAgMjQsIC8qIKsgLSAxNzEgKi8KIDEwICAgICAgLCAgIDgsIC8qIKwgLSAxNzIgKi8KICA2ICAgICAgLCAxMzEsIC8qIK0gLSAxNzMgKi8KIDEwICAgICAgLCAgIDksIC8qIK4gLSAxNzQgKi8KICA3ICAgICAgLCAgODQsIC8qIK8gLSAxNzUgKi8KIDEwICAgICAgLCAgMTAsIC8qILAgLSAxNzYgKi8KICA4ICAgICAgLCAgMjMsIC8qILEgLSAxNzcgKi8KIDEyICAgICAgLCAgNTEsIC8qILIgLSAxNzggKi8KIDEyICAgICAgLCAgNzAsIC8qILMgLSAxNzkgKi8KICA3ICAgICAgLCAgODUsIC8qILQgLSAxODAgKi8KIDEwICAgICAgLCAgMTEsIC8qILUgLSAxODEgKi8KIDEwICAgICAgLCAgMTIsIC8qILYgLSAxODIgKi8KIDEwICAgICAgLCAgMTMsIC8qILcgLSAxODMgKi8KICA3ICAgICAgLCAgODYsIC8qILggLSAxODQgKi8KIDEyICAgICAgLCAgMzMsIC8qILkgLSAxODUgKi8KIDE0ICAgICAgLCAxMjQsIC8qILogLSAxODYgKi8KICA4ICAgICAgLCAgMjYsIC8qILsgLSAxODcgKi8KIDEyICAgICAgLCAgMjEsIC8qILwgLSAxODggKi8KIDEyICAgICAgLCAgMjUsIC8qIL0gLSAxODkgKi8KIDEyICAgICAgLCAgMjksIC8qIL4gLSAxOTAgKi8KICA3ICAgICAgLCAgODcsIC8qIL8gLSAxOTEgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMAgLSAxOTIgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMEgLSAxOTMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMIgLSAxOTQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMMgLSAxOTUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMQgLSAxOTYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIMUgLSAxOTcgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIMYgLSAxOTggKi8KIDE0ICAgICAgLCAgMTAsIC8qIMcgLSAxOTkgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMggLSAyMDAgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMkgLSAyMDEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMogLSAyMDIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIMsgLSAyMDMgKi8KIDE0ICAgICAgLCAgNTAsIC8qIMwgLSAyMDQgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM0gLSAyMDUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM4gLSAyMDYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIM8gLSAyMDcgKi8KIDE0ICAgICAgLCAgMjYsIC8qINAgLSAyMDggKi8KIDE0ICAgICAgLCAxMTIsIC8qINEgLSAyMDkgKi8KIDE0ICAgICAgLCAxMjQsIC8qINIgLSAyMTAgKi8KIDE0ICAgICAgLCAxMjQsIC8qINMgLSAyMTEgKi8KIDE0ICAgICAgLCAxMjQsIC8qINQgLSAyMTIgKi8KIDE0ICAgICAgLCAxMjQsIC8qINUgLSAyMTMgKi8KIDE0ICAgICAgLCAxMjQsIC8qINYgLSAyMTQgKi8KICA4ICAgICAgLCAgMjgsIC8qINcgLSAyMTUgKi8KIDE0ICAgICAgLCAxMjQsIC8qINggLSAyMTYgKi8KIDE0ICAgICAgLCAxNTksIC8qINkgLSAyMTcgKi8KIDE0ICAgICAgLCAxNTksIC8qINogLSAyMTggKi8KIDE0ICAgICAgLCAxNTksIC8qINsgLSAyMTkgKi8KIDE0ICAgICAgLCAxNTksIC8qINwgLSAyMjAgKi8KIDE0ICAgICAgLCAxNjcsIC8qIN0gLSAyMjEgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIN4gLSAyMjIgKi8KIDE0ICsgNDggLCAxNDUsIC8qIN8gLSAyMjMgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOAgLSAyMjQgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOEgLSAyMjUgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOIgLSAyMjYgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOMgLSAyMjcgKi8KIDE0ICAgICAgLCAgIDIsIC8qIOQgLSAyMjggKi8KIDE0ICAgICAgLCAgIDIsIC8qIOUgLSAyMjkgKi8KIDE0ICsgMTYgLCAgIDIsIC8qIOYgLSAyMzAgKi8KIDE0ICAgICAgLCAgMTAsIC8qIOcgLSAyMzEgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOggLSAyMzIgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOkgLSAyMzMgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOogLSAyMzQgKi8KIDE0ICAgICAgLCAgMzMsIC8qIOsgLSAyMzUgKi8KIDE0ICAgICAgLCAgNTAsIC8qIOwgLSAyMzYgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO0gLSAyMzcgKi8KIDE0ICAgICAgLCAgNTAsIC8qIO4gLSAyMzggKi8KIDE0ICAgICAgLCAgNTAsIC8qIO8gLSAyMzkgKi8KIDE0ICAgICAgLCAgMjYsIC8qIPAgLSAyNDAgKi8KIDE0ICAgICAgLCAxMTIsIC8qIPEgLSAyNDEgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPIgLSAyNDIgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPMgLSAyNDMgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPQgLSAyNDQgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPUgLSAyNDUgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPYgLSAyNDYgKi8KICA4ICAgICAgLCAgMjksIC8qIPcgLSAyNDcgKi8KIDE0ICAgICAgLCAxMjQsIC8qIPggLSAyNDggKi8KIDE0ICAgICAgLCAxNTksIC8qIPkgLSAyNDkgKi8KIDE0ICAgICAgLCAxNTksIC8qIPogLSAyNTAgKi8KIDE0ICAgICAgLCAxNTksIC8qIPsgLSAyNTEgKi8KIDE0ICAgICAgLCAxNTksIC8qIPwgLSAyNTIgKi8KIDE0ICAgICAgLCAxNjcsIC8qIP0gLSAyNTMgKi8KIDE0ICsgMzIgLCAxNTMsIC8qIP4gLSAyNTQgKi8KIDE0ICAgICAgLCAxNjcgIC8qIP8gLSAyNTUgKi8gfTsKCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVF8yW10gPSB7IDMzLCA0NCwgMTQ1IH07CgojZGVmaW5lIExDTV9EaWFjcml0aWNfU3RhcnQgMTMxCgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fRGlhY3JpdGljX0xVVFtdID0geyAKMTIzLCAgLyoggyAtIDEzMSAqLwogIDIsICAvKiCEIC0gMTMyICovCiAgMiwgIC8qIIUgLSAxMzMgKi8KICAyLCAgLyoghiAtIDEzNCAqLwogIDIsICAvKiCHIC0gMTM1ICovCiAgMywgIC8qIIggLSAxMzYgKi8KICAyLCAgLyogiSAtIDEzNyAqLwogMjAsICAvKiCKIC0gMTM4ICovCiAgMiwgIC8qIIsgLSAxMzkgKi8KICAyLCAgLyogjCAtIDE0MCAqLwogIDIsICAvKiCNIC0gMTQxICovCiAgMiwgIC8qII4gLSAxNDIgKi8KICAyLCAgLyogjyAtIDE0MyAqLwogIDIsICAvKiCQIC0gMTQ0ICovCiAgMiwgIC8qIJEgLSAxNDUgKi8KICAyLCAgLyogkiAtIDE0NiAqLwogIDIsICAvKiCTIC0gMTQ3ICovCiAgMiwgIC8qIJQgLSAxNDggKi8KICAyLCAgLyoglSAtIDE0OSAqLwogIDIsICAvKiCWIC0gMTUwICovCiAgMiwgIC8qIJcgLSAxNTEgKi8KICAyLCAgLyogmCAtIDE1MiAqLwogIDIsICAvKiCZIC0gMTUzICovCiAyMCwgIC8qIJogLSAxNTQgKi8KICAyLCAgLyogmyAtIDE1NSAqLwogIDIsICAvKiCcIC0gMTU2ICovCiAgMiwgIC8qIJ0gLSAxNTcgKi8KICAyLCAgLyogniAtIDE1OCAqLwogMTksICAvKiCfIC0gMTU5ICovCiAgMiwgIC8qIKAgLSAxNjAgKi8KICAyLCAgLyogoSAtIDE2MSAqLwogIDIsICAvKiCiIC0gMTYyICovCiAgMiwgIC8qIKMgLSAxNjMgKi8KICAyLCAgLyogpCAtIDE2NCAqLwogIDIsICAvKiClIC0gMTY1ICovCiAgMiwgIC8qIKYgLSAxNjYgKi8KICAyLCAgLyogpyAtIDE2NyAqLwogIDIsICAvKiCoIC0gMTY4ICovCiAgMiwgIC8qIKkgLSAxNjkgKi8KICAzLCAgLyogqiAtIDE3MCAqLwogIDIsICAvKiCrIC0gMTcxICovCiAgMiwgIC8qIKwgLSAxNzIgKi8KICAyLCAgLyogrSAtIDE3MyAqLwogIDIsICAvKiCuIC0gMTc0ICovCiAgMiwgIC8qIK8gLSAxNzUgKi8KICAyLCAgLyogsCAtIDE3NiAqLwogIDIsICAvKiCxIC0gMTc3ICovCiAgMiwgIC8qILIgLSAxNzggKi8KICAyLCAgLyogsyAtIDE3OSAqLwogIDIsICAvKiC0IC0gMTgwICovCiAgMiwgIC8qILUgLSAxODEgKi8KICAyLCAgLyogtiAtIDE4MiAqLwogIDIsICAvKiC3IC0gMTgzICovCiAgMiwgIC8qILggLSAxODQgKi8KICAyLCAgLyoguSAtIDE4NSAqLwogIDMsICAvKiC6IC0gMTg2ICovCiAgMiwgIC8qILsgLSAxODcgKi8KICAyLCAgLyogvCAtIDE4OCAqLwogIDIsICAvKiC9IC0gMTg5ICovCiAgMiwgIC8qIL4gLSAxOTAgKi8KICAyLCAgLyogvyAtIDE5MSAqLwogMTUsICAvKiDAIC0gMTkyICovCiAxNCwgIC8qIMEgLSAxOTMgKi8KIDE4LCAgLyogwiAtIDE5NCAqLwogMjUsICAvKiDDIC0gMTk1ICovCiAxOSwgIC8qIMQgLSAxOTYgKi8KIDI2LCAgLyogxSAtIDE5NyAqLwogIDIsICAvKiDGIC0gMTk4ICovCiAyOCwgIC8qIMcgLSAxOTkgKi8KIDE1LCAgLyogyCAtIDIwMCAqLwogMTQsICAvKiDJIC0gMjAxICovCiAxOCwgIC8qIMogLSAyMDIgKi8KIDE5LCAgLyogyyAtIDIwMyAqLwogMTUsICAvKiDMIC0gMjA0ICovCiAxNCwgIC8qIM0gLSAyMDUgKi8KIDE4LCAgLyogziAtIDIwNiAqLwogMTksICAvKiDPIC0gMjA3ICovCjEwNCwgIC8qINAgLSAyMDggKi8KIDI1LCAgLyog0SAtIDIwOSAqLwogMTUsICAvKiDSIC0gMjEwICovCiAxNCwgIC8qINMgLSAyMTEgKi8KIDE4LCAgLyog1CAtIDIxMiAqLwogMjUsICAvKiDVIC0gMjEzICovCiAxOSwgIC8qINYgLSAyMTQgKi8KICAyLCAgLyog1yAtIDIxNSAqLwogMzMsICAvKiDYIC0gMjE2ICovCiAxNSwgIC8qINkgLSAyMTcgKi8KIDE0LCAgLyog2iAtIDIxOCAqLwogMTgsICAvKiDbIC0gMjE5ICovCiAxOSwgIC8qINwgLSAyMjAgKi8KIDE0LCAgLyog3SAtIDIyMSAqLwogIDIsICAvKiDeIC0gMjIyICovCiAgMiwgIC8qIN8gLSAyMjMgKi8KIDE1LCAgLyog4CAtIDIyNCAqLwogMTQsICAvKiDhIC0gMjI1ICovCiAxOCwgIC8qIOIgLSAyMjYgKi8KIDI1LCAgLyog4yAtIDIyNyAqLwogMTksICAvKiDkIC0gMjI4ICovCiAyNiwgIC8qIOUgLSAyMjkgKi8KICAyLCAgLyog5iAtIDIzMCAqLwogMjgsICAvKiDnIC0gMjMxICovCiAxNSwgIC8qIOggLSAyMzIgKi8KIDE0LCAgLyog6SAtIDIzMyAqLwogMTgsICAvKiDqIC0gMjM0ICovCiAxOSwgIC8qIOsgLSAyMzUgKi8KIDE1LCAgLyog7CAtIDIzNiAqLwogMTQsICAvKiDtIC0gMjM3ICovCiAxOCwgIC8qIO4gLSAyMzggKi8KIDE5LCAgLyog7yAtIDIzOSAqLwoxMDQsICAvKiDwIC0gMjQwICovCiAyNSwgIC8qIPEgLSAyNDEgKi8KIDE1LCAgLyog8iAtIDI0MiAqLwogMTQsICAvKiDzIC0gMjQzICovCiAxOCwgIC8qIPQgLSAyNDQgKi8KIDI1LCAgLyog9SAtIDI0NSAqLwogMTksICAvKiD2IC0gMjQ2ICovCiAgMiwgIC8qIPcgLSAyNDcgKi8KIDMzLCAgLyog+CAtIDI0OCAqLwogMTUsICAvKiD5IC0gMjQ5ICovCiAxNCwgIC8qIPogLSAyNTAgKi8KIDE4LCAgLyog+yAtIDI1MSAqLwogMTksICAvKiD8IC0gMjUyICovCiAxNCwgIC8qIP0gLSAyNTMgKi8KICAyLCAgLyog/iAtIDI1NCAqLwogMTksICAvKiD/IC0gMjU1ICovCn0gOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzUHVuY3R1YXRpb24gW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzUHVuY3R1YXRpb24odW5zaWduZWQgY2hhciBjKSAKewogIC8qICJwdW5jdHVhdGlvbiBjaGFyYWN0ZXIiIGluIHRoaXMgY29udGV4dCBpcyBhIGNoYXJhY3RlciB3aGljaCBpcyAKICAgICBjb25zaWRlcmVkICJsZXNzIGltcG9ydGFudCIgZHVyaW5nIHdvcmQgc29ydCBjb21wYXJpc29uLgogICAgIFNlZSBMQ01hcFN0cmluZyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHByZWNpc2UgZGVmaW5pdGlvbiAKICAgICBvZiAibGVzcyBpbXBvcnRhbnQiLiAqLwoKICByZXR1cm4gKExDTV9Vbmljb2RlX0xVVFstMisyKmNdPT02KTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBPTEUyTkxTX2lzTm9uU3BhY2luZyBbSU5URVJOQUxdCiAqLwpzdGF0aWMgaW50IE9MRTJOTFNfaXNOb25TcGFjaW5nKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycyAKICAgICBmb3Igd2hpY2ggaXQgcmV0dXJucyB0cnVlIGFyZSBpZ25vcmVkIHdoZW4gbWFwcGluZyBhCiAgICAgc3RyaW5nIHdpdGggTk9STV9JR05PUkVOT05TUEFDRSAqLwogIHJldHVybiAoKGM9PTEzNikgfHwgKGM9PTE3MCkgfHwgKGM9PTE4NikpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9MRTJOTFNfaXNTeW1ib2wgW0lOVEVSTkFMXQogKi8Kc3RhdGljIGludCBPTEUyTkxTX2lzU3ltYm9sKHVuc2lnbmVkIGNoYXIgYykgCnsKICAvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkgTENNYXBTdHJpbmdBLiAgQ2hhcmFjdGVycyAKICAgICBmb3Igd2hpY2ggaXQgcmV0dXJucyB0cnVlIGFyZSBpZ25vcmVkIHdoZW4gbWFwcGluZyBhCiAgICAgc3RyaW5nIHdpdGggTk9STV9JR05PUkVTWU1CT0xTICovCiAgcmV0dXJuICggKGMhPTApICYmICFJc0NoYXJBbHBoYU51bWVyaWNBKGMpICk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCWlkZW50aXR5CVtJbnRlcm5hbF0KICovCnN0YXRpYyBpbnQgaWRlbnRpdHkoaW50IGMpCnsKICByZXR1cm4gYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuNDkyXQogKgogKiBDb252ZXJ0IGEgc3RyaW5nLCBvciBnZW5lcmF0ZSBhIHNvcnQga2V5IGZyb20gaXQuCiAqCiAqIElmIChtYXBmbGFncyAmIExDTUFQX1NPUlRLRVkpLCB0aGUgZnVuY3Rpb24gd2lsbCBnZW5lcmF0ZQogKiBhIHNvcnQga2V5IGZvciB0aGUgc291cmNlIHN0cmluZy4gIEVsc2UsIGl0IHdpbGwgY29udmVydCBpdAogKiBhY2NvcmRpbmdseSB0byB0aGUgZmxhZ3MgTENNQVBfVVBQRVJDQVNFLCBMQ01BUF9MT1dFUkNBU0UsLi4uCiAqCiAqIFJFVFVSTlMKICogICAgRXJyb3IgOiAwLgogKiAgICBTdWNjZXNzIDogbGVuZ3RoIG9mIHRoZSByZXN1bHQgc3RyaW5nLgogKgogKiBOT1RFUwogKiAgICBJZiBjYWxsZWQgd2l0aCBzY3JsZW4gPSAtMSwgdGhlIGZ1bmN0aW9uIHdpbGwgY29tcHV0ZSB0aGUgbGVuZ3RoCiAqICAgICAgb2YgdGhlIDAtdGVybWluYXRlZCBzdHJpbmcgc3Ryc3JjIGJ5IGl0c2VsZi4gICAgICAKICogCiAqICAgIElmIGNhbGxlZCB3aXRoIGRzdGxlbiA9IDAsIHJldHVybnMgdGhlIGJ1ZmZlciBsZW5ndGggdGhhdCAKICogICAgICB3b3VsZCBiZSByZXF1aXJlZC4KICoKICogICAgTk9STV9JR05PUkVXSURUSCBtZWFucyB0byBjb21wYXJlIEFTQ0lJIGFuZCB3aWRlIGNoYXJhY3RlcnMKICogICAgYXMgaWYgdGhleSBhcmUgZXF1YWwuICAKICogICAgSW4gdGhlIG9ubHkgY29kZSBwYWdlIGltcGxlbWVudGVkIHNvIGZhciwgdGhlcmUgbWF5IG5vdCBiZQogKiAgICB3aWRlIGNoYXJhY3RlcnMgaW4gc3RyaW5ncyBwYXNzZWQgdG8gTENNYXBTdHJpbmdBLAogKiAgICBzbyB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIGRvbmUgZm9yIHRoaXMgZmxhZy4KICovCklOVCBXSU5BUEkgTENNYXBTdHJpbmdBKAoJTENJRCBsY2lkIC8qIGxvY2FsZSBpZGVudGlmaWVyIGNyZWF0ZWQgd2l0aCBNQUtFTENJRDsgCgkJICAgICBMT0NBTEVfU1lTVEVNX0RFRkFVTFQgYW5kIExPQ0FMRV9VU0VSX0RFRkFVTFQgYXJlIAogICAgICAgICAgICAgICAgICAgICBwcmVkZWZpbmVkIHZhbHVlcy4gKi8sCglEV09SRCBtYXBmbGFncyAvKiBmbGFncyAqLywKCUxQQ1NUUiBzcmNzdHIgIC8qIHNvdXJjZSBidWZmZXIgKi8sCglJTlQgc3JjbGVuICAgLyogc291cmNlIGxlbmd0aCAqLywKCUxQU1RSIGRzdHN0ciAgIC8qIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLywKCUlOVCBkc3RsZW4gICAvKiBkZXN0aW5hdGlvbiBidWZmZXIgbGVuZ3RoICovKSAKewogIGludCBpOwoKICBUUkFDRSgiKDB4JTA0bHgsMHglMDhseCwlcywlZCwlcCwlZClcbiIsCglsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbik7CgogIGlmICggKChkc3RsZW4hPTApICYmIChkc3RzdHI9PU5VTEwpKSB8fCAoc3Jjc3RyPT1OVUxMKSApCiAgewogICAgRVJSKCIoc3JjPSVzLGRlc3Q9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzcmNzdHIsIGRzdHN0cik7CiAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgcmV0dXJuIDA7CiAgfQogIGlmIChzcmNsZW4gPT0gLTEpIAogICAgc3JjbGVuID0gc3RybGVuKHNyY3N0cikgKyAxIDsgICAgLyogKGluY2x1ZGUgZmluYWwgJ1wwJykgKi8KCiNkZWZpbmUgTENNQVBTVFJJTkdBX1NVUFBPUlRFRF9GTEFHUyAoTENNQVBfVVBQRVJDQVNFICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExDTUFQX0xPV0VSQ0FTRSAgICAgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMQ01BUF9TT1JUS0VZICAgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVDQVNFICAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFTk9OU1BBQ0UgfCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT1JUX1NUUklOR1NPUlQgICAgIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9STV9JR05PUkVXSURUSCAgICB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PUk1fSUdOT1JFS0FOQVRZUEUpCiAgLyogRklYTUU6IGFzIGxvbmcgYXMgd2UgZG9uJ3Qgc3VwcG9ydCBLYW5ha2FuYSBub3IgSGlyaWdhbmEgCiAgICogY2hhcmFjdGVycywgd2UgY2FuIHN1cHBvcnQgTk9STV9JR05PUkVLQU5BVFlQRQogICAqLwogIGlmIChtYXBmbGFncyAmIH5MQ01BUFNUUklOR0FfU1VQUE9SVEVEX0ZMQUdTKQogIHsKICAgIEZJWE1FKCIoMHglMDRseCwweCUwOGx4LCVwLCVkLCVwLCVkKTogIgoJICAidW5pbXBsZW1lbnRlZCBmbGFnczogMHglMDhseFxuIiwKCSAgbGNpZCwKCSAgbWFwZmxhZ3MsCgkgIHNyY3N0ciwKCSAgc3JjbGVuLAoJICBkc3RzdHIsCgkgIGRzdGxlbiwKCSAgbWFwZmxhZ3MgJiB+TENNQVBTVFJJTkdBX1NVUFBPUlRFRF9GTEFHUwogICAgICk7CiAgfQoKICBpZiAoICEobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSApCiAgewogICAgaW50IGksajsKICAgIGludCAoKmYpKGludCkgPSBpZGVudGl0eTsgCiAgICBpbnQgZmxhZ19pZ25vcmVub25zcGFjZSA9IG1hcGZsYWdzICYgTk9STV9JR05PUkVOT05TUEFDRTsKICAgIGludCBmbGFnX2lnbm9yZXN5bWJvbHMgPSBtYXBmbGFncyAmIE5PUk1fSUdOT1JFU1lNQk9MUzsKCiAgICBpZiAoZmxhZ19pZ25vcmVub25zcGFjZSB8fCBmbGFnX2lnbm9yZXN5bWJvbHMpCiAgICB7CiAgICAgIC8qIEZvciBzb21lIHZhbHVlcyBvZiBtYXBmbGFncywgdGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIAoJIHN0cmluZyBpcyBub3Qga25vd24gYXQgdGhpcyBwb2ludC4gIFdpbmRvd3MgZG9lcyBtYXAgdGhlIHN0cmluZwoJIGFuZCBkb2VzIG5vdCBTZXRMYXN0RXJyb3IgRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUiBpbgoJIHRoZXNlIGNhc2VzLiAqLwogICAgICBpZiAoZHN0bGVuPT0wKQogICAgICB7CgkvKiBDb21wdXRlIHJlcXVpcmVkIGxlbmd0aCAqLwoJZm9yIChpPWo9MDsgaSA8IHNyY2xlbjsgaSsrKQoJewoJICBpZiAoICEoZmxhZ19pZ25vcmVub25zcGFjZSAmJiBPTEUyTkxTX2lzTm9uU3BhY2luZyhzcmNzdHJbaV0pKQoJICAgICAgICYmICEoZmxhZ19pZ25vcmVzeW1ib2xzICYmIE9MRTJOTFNfaXNTeW1ib2woc3Jjc3RyW2ldKSkgKQoJICAgIGorKzsKCX0KCXJldHVybiBqOwogICAgICB9CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIGlmIChkc3RsZW49PTApCglyZXR1cm4gc3JjbGVuOyAgCiAgICAgIGlmIChkc3RsZW48c3JjbGVuKSAKCSAgIHsKCSAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICAgICByZXR1cm4gMDsKCSAgIH0KICAgIH0KICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKICAgICAgZiA9IHRvdXBwZXI7CiAgICBlbHNlIGlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkKICAgICAgZiA9IHRvbG93ZXI7CiAgICAvKiBGSVhNRTogTk9STV9JR05PUkVOT05TUEFDRSByZXF1aXJlcyBhbm90aGVyIGNvbnZlcnNpb24gKi8KICAgIGZvciAoaT1qPTA7IChpPHNyY2xlbikgJiYgKGo8ZHN0bGVuKSA7IGkrKykKICAgIHsKICAgICAgaWYgKCAhKGZsYWdfaWdub3Jlbm9uc3BhY2UgJiYgT0xFMk5MU19pc05vblNwYWNpbmcoc3Jjc3RyW2ldKSkKCSAgICYmICEoZmxhZ19pZ25vcmVzeW1ib2xzICYmIE9MRTJOTFNfaXNTeW1ib2woc3Jjc3RyW2ldKSkgKQogICAgICB7Cglkc3RzdHJbal0gPSAoQ0hBUikgZihzcmNzdHJbaV0pOwoJaisrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gajsKICB9CgogIC8qIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIGNvbXBsZXRlbHkgaWdub3JlcyB0aGUgImxjaWQiIHBhcmFtZXRlci4gKi8KICAvKiBlbHNlIC4uLiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSAgKi8KICB7CiAgICBpbnQgdW5pY29kZV9sZW49MDsKICAgIGludCBjYXNlX2xlbj0wOwogICAgaW50IGRpYWNyaXRpY19sZW49MDsKICAgIGludCBkZWxheWVkX3B1bmN0dWF0aW9uX2xlbj0wOwogICAgY2hhciAqY2FzZV9jb21wb25lbnQ7CiAgICBjaGFyICpkaWFjcml0aWNfY29tcG9uZW50OwogICAgY2hhciAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQ7CiAgICBpbnQgcm9vbSxjb3VudDsKICAgIGludCBmbGFnX3N0cmluZ3NvcnQgPSBtYXBmbGFncyAmIFNPUlRfU1RSSU5HU09SVDsKCiAgICAvKiBjb21wdXRlIGhvdyBtdWNoIHJvb20gd2Ugd2lsbCBuZWVkICovCiAgICBmb3IgKGk9MDtpPHNyY2xlbjtpKyspCiAgICB7CiAgICAgIGludCBvZnM7CiAgICAgIHVuc2lnbmVkIGNoYXIgc291cmNlX2NoYXIgPSBzcmNzdHJbaV07CiAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykgCiAgICAgIHsKCWlmIChmbGFnX3N0cmluZ3NvcnQgfHwgIU9MRTJOTFNfaXNQdW5jdHVhdGlvbihzb3VyY2VfY2hhcikpCgl7CgkgIHVuaWNvZGVfbGVuKys7CgkgIGlmICggTENNX1VuaWNvZGVfTFVUWy0yKzIqc291cmNlX2NoYXJdICYgfjE1ICkKCSAgICB1bmljb2RlX2xlbisrOyAgICAgICAgICAgICAvKiBkb3VibGUgbGV0dGVyICovCgl9CgllbHNlCgl7CgkgIGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuKys7Cgl9CSAgCiAgICAgIH0KCSAgCiAgICAgIGlmIChpc3VwcGVyKHNvdXJjZV9jaGFyKSkKCWNhc2VfbGVuPXVuaWNvZGVfbGVuOyAKCiAgICAgIG9mcyA9IHNvdXJjZV9jaGFyIC0gTENNX0RpYWNyaXRpY19TdGFydDsKICAgICAgaWYgKChvZnM+PTApICYmIChMQ01fRGlhY3JpdGljX0xVVFtvZnNdIT0yKSkKCWRpYWNyaXRpY19sZW49dW5pY29kZV9sZW47CiAgICB9CgogICAgaWYgKG1hcGZsYWdzICYgTk9STV9JR05PUkVDQVNFKQogICAgICBjYXNlX2xlbj0wOyAgICAgICAgICAgICAgICAgICAKICAgIGlmIChtYXBmbGFncyAmIE5PUk1fSUdOT1JFTk9OU1BBQ0UpCiAgICAgIGRpYWNyaXRpY19sZW49MDsKCiAgICByb29tID0gIDIgKiB1bmljb2RlX2xlbiAgICAgICAgICAgICAgLyogInVuaWNvZGUiIGNvbXBvbmVudCAqLwogICAgICArICAgICBkaWFjcml0aWNfbGVuICAgICAgICAgICAgICAgIC8qICJkaWFjcml0aWMiIGNvbXBvbmVudCAqLwogICAgICArICAgICBjYXNlX2xlbiAgICAgICAgICAgICAgICAgICAgIC8qICJjYXNlIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgNCAqIGRlbGF5ZWRfcHVuY3R1YXRpb25fbGVuICAvKiBwdW5jdHVhdGlvbiBpbiB3b3JkIHNvcnQgbW9kZSAqLwogICAgICArICAgICA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGZvdXIgJ1wxJyBzZXBhcmF0b3JzICovCiAgICAgICsgICAgIDEgIDsgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYWwgJ1wwJyAqLwogICAgaWYgKGRzdGxlbj09MCkKICAgICAgcmV0dXJuIHJvb207ICAgICAgCiAgICBlbHNlIGlmIChkc3RsZW48cm9vbSkKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICByZXR1cm4gMDsKICAgIH0KI2lmIDAKICAgIC8qRklYTUUgdGhlIFBvaW50ZXJjaGVjayBzaG91bGQgbm90IGJlIG5lc3Nlc2FyeSAqLwogICAgaWYgKElzQmFkV3JpdGVQdHIgKGRzdHN0cixyb29tKSkKICAgIHsgRVJSKCJiYWQgZGVzdGluYXRpb24gYnVmZmVyIChkc3RzdHIpIDogJXAsJWRcbiIsZHN0c3RyLGRzdGxlbik7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgcmV0dXJuIDA7CiAgICB9CiNlbmRpZgogICAgLyogbG9jYXRlIGVhY2ggY29tcG9uZW50LCB3cml0ZSBzZXBhcmF0b3JzICovCiAgICBkaWFjcml0aWNfY29tcG9uZW50ID0gZHN0c3RyICsgMip1bmljb2RlX2xlbiA7CiAgICAqZGlhY3JpdGljX2NvbXBvbmVudCsrID0gJ1wxJzsgCiAgICBjYXNlX2NvbXBvbmVudCA9IGRpYWNyaXRpY19jb21wb25lbnQgKyBkaWFjcml0aWNfbGVuIDsKICAgICpjYXNlX2NvbXBvbmVudCsrID0gJ1wxJzsgCiAgICBkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCA9IGNhc2VfY29tcG9uZW50ICsgY2FzZV9sZW4gOwogICAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAnXDEnOwogICAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAnXDEnOwoKICAgIC8qIHJlYWQgc291cmNlIHN0cmluZyBjaGFyIGJ5IGNoYXIsIHdyaXRlIAogICAgICAgY29ycmVzcG9uZGluZyB3ZWlnaHQgaW4gZWFjaCBjb21wb25lbnQuICovCiAgICBmb3IgKGk9MCxjb3VudD0wO2k8c3JjbGVuO2krKykKICAgIHsKICAgICAgdW5zaWduZWQgY2hhciBzb3VyY2VfY2hhcj1zcmNzdHJbaV07CiAgICAgIGlmIChzb3VyY2VfY2hhciE9J1wwJykgCiAgICAgIHsKCWludCB0eXBlLGxvbmdjb2RlOwoJdHlwZSA9IExDTV9Vbmljb2RlX0xVVFstMisyKnNvdXJjZV9jaGFyXTsKCWxvbmdjb2RlID0gdHlwZSA+PiA0OwoJdHlwZSAmPSAxNTsKCWlmICghZmxhZ19zdHJpbmdzb3J0ICYmIE9MRTJOTFNfaXNQdW5jdHVhdGlvbihzb3VyY2VfY2hhcikpIAoJewoJICBVSU5UMTYgZW5jcnlwdGVkX2xvY2F0aW9uID0gKDE8PDE1KSArIDcgKyA0KmNvdW50OwoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9ICh1bnNpZ25lZCBjaGFyKSAoZW5jcnlwdGVkX2xvY2F0aW9uPj44KTsKCSAgKmRlbGF5ZWRfcHVuY3R1YXRpb25fY29tcG9uZW50KysgPSAodW5zaWduZWQgY2hhcikgKGVuY3J5cHRlZF9sb2NhdGlvbiYyNTUpOwogICAgICAgICAgICAgICAgICAgICAvKiBiaWctZW5kaWFuIGlzIHVzZWQgaGVyZSBiZWNhdXNlIGl0IGxldHMgc3RyaW5nIGNvbXBhcmlzb24gYmUKCQkJY29tcGF0aWJsZSB3aXRoIG51bWVyaWNhbCBjb21wYXJpc29uICovCgoJICAqZGVsYXllZF9wdW5jdHVhdGlvbl9jb21wb25lbnQrKyA9IHR5cGU7CgkgICpkZWxheWVkX3B1bmN0dWF0aW9uX2NvbXBvbmVudCsrID0gTENNX1VuaWNvZGVfTFVUWy0xKzIqc291cmNlX2NoYXJdOyAgCiAgICAgICAgICAgICAgICAgICAgIC8qIGFzc3VtcHRpb24gOiBhIHB1bmN0dWF0aW9uIGNoYXJhY3RlciBpcyBuZXZlciBhIAoJCQlkb3VibGUgb3IgYWNjZW50ZWQgbGV0dGVyICovCgl9CgllbHNlCgl7CgkgIGRzdHN0clsyKmNvdW50XSA9IHR5cGU7CgkgIGRzdHN0clsyKmNvdW50KzFdID0gTENNX1VuaWNvZGVfTFVUWy0xKzIqc291cmNlX2NoYXJdOyAgCgkgIGlmIChsb25nY29kZSkKCSAgewoJICAgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CgkgICAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgICAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IDI7IC8qIGFzc3VtcHRpb246IGEgZG91YmxlIGxldHRlcgoJCQkJCQkgaXMgbmV2ZXIgYWNjZW50ZWQgKi8KCSAgICBjb3VudCsrOwoJICAgIAoJICAgIGRzdHN0clsyKmNvdW50XSA9IHR5cGU7CgkgICAgZHN0c3RyWzIqY291bnQrMV0gPSAqKExDTV9Vbmljb2RlX0xVVF8yIC0gMSArIGxvbmdjb2RlKTsgCgkgICAgLyogMTYgaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAxIAoJICAgICAgIDMyIGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMiAKCSAgICAgICA0OCBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDMgKi8KCSAgfQoKCSAgaWYgKGNvdW50PGNhc2VfbGVuKQoJICAgIGNhc2VfY29tcG9uZW50W2NvdW50XSA9ICggaXN1cHBlcihzb3VyY2VfY2hhcikgPyAxOCA6IDIgKSA7CgkgIGlmIChjb3VudDxkaWFjcml0aWNfbGVuKQoJICB7CgkgICAgaW50IG9mcyA9IHNvdXJjZV9jaGFyIC0gTENNX0RpYWNyaXRpY19TdGFydDsKCSAgICBkaWFjcml0aWNfY29tcG9uZW50W2NvdW50XSA9IChvZnM+PTAgPyBMQ01fRGlhY3JpdGljX0xVVFtvZnNdIDogMik7CgkgIH0KCSAgY291bnQrKzsKCX0KICAgICAgfQogICAgfQogICAgZHN0c3RyW3Jvb20tMV0gPSAnXDAnOwogICAgcmV0dXJuIHJvb207CiAgfQp9CgkJICAgICAKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIExDTWFwU3RyaW5nVyAgICAgICAgICAgICAgICBbS0VSTkVMMzIuNDkzXQogKgogKiBDb252ZXJ0IGEgc3RyaW5nLCBvciBnZW5lcmF0ZSBhIHNvcnQga2V5IGZyb20gaXQuCiAqCiAqIE5PVEUKICoKICogU2VlIExDTWFwU3RyaW5nQSBmb3IgZG9jdW1lbnRhdGlvbgogKi8KSU5UIFdJTkFQSSBMQ01hcFN0cmluZ1coCglMQ0lEIGxjaWQsRFdPUkQgbWFwZmxhZ3MsTFBDV1NUUiBzcmNzdHIsSU5UIHNyY2xlbixMUFdTVFIgZHN0c3RyLAoJSU5UIGRzdGxlbikKewogIGludCBpOwogCiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpXG4iLAogICAgICAgICAgICAgICAgIGxjaWQsIG1hcGZsYWdzLCBzcmNzdHIsIHNyY2xlbiwgZHN0c3RyLCBkc3RsZW4pOwogIAogIGlmICggKChkc3RsZW4hPTApICYmIChkc3RzdHI9PU5VTEwpKSB8fCAoc3Jjc3RyPT1OVUxMKSApCiAgewogICAgRVJSKCIoc3JjPSVwLGRzdD0lcCk6IEludmFsaWQgTlVMTCBzdHJpbmdcbiIsIHNyY3N0ciwgZHN0c3RyKTsKICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICByZXR1cm4gMDsKICB9CiAgaWYgKHNyY2xlbj09LTEpIAogICAgc3JjbGVuID0gc3RybGVuVyhzcmNzdHIpKzE7CgogIC8qIEZJWE1FOiBCb3RoIHRoaXMgZnVuY3Rpb24gYW5kIGl0J3MgY29tcGFuaW9uIExDTWFwU3RyaW5nQSgpCiAgICogY29tcGxldGVseSBpZ25vcmUgdGhlICJsY2lkIiBwYXJhbWV0ZXIuICBJbiBwbGFjZSBvZiB0aGUgImxjaWQiCiAgICogcGFyYW1ldGVyIHRoZSBhcHBsaWNhdGlvbiBtdXN0IHNldCB0aGUgIkxDX0NPTExBVEUiIG9yICJMQ19BTEwiCiAgICogZW52aXJvbm1lbnQgdmFyaWFibGUgcHJpb3IgdG8gaW52b2tpbmcgdGhpcyBmdW5jdGlvbi4gICovCiAgaWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgCiAgewogICAgICAvKiBQb3NzaWJsZSB2YWx1ZXMgb2YgTENfQ09MTEFURS4gKi8KICAgICAgY2hhciAqbGNfY29sbGF0ZV9kZWZhdWx0ID0gMDsgLyogdmFsdWUgcHJpb3IgdG8gdGhpcyBmdW5jdGlvbiAqLwogICAgICBjaGFyICpsY19jb2xsYXRlX2VudiA9IDA7ICAgICAvKiB2YWx1ZSByZXRyaWV2ZWQgZnJvbSB0aGUgZW52aXJvbm1lbnQgKi8KCiAgICAgIC8qIEdlbmVyYWwgcHVycG9zZSBpbmRleCBpbnRvIHN0cmluZ3Mgb2YgYW55IHR5cGUuICovCiAgICAgIGludCBzdHJfaWR4ID0gMDsKCiAgICAgIC8qIExlbmd0aHMgb2YgdmFyaW91cyBzdHJpbmdzIHdoZXJlIHRoZSBsZW5ndGggaXMgbWVhc3VyZWQgaW4KICAgICAgICogd2lkZSBjaGFyYWN0ZXJzIGZvciB3aWRlIGNoYXJhY3RlciBzdHJpbmdzIGFuZCBpbiBieXRlcyBmb3IKICAgICAgICogbmF0aXZlIHN0cmluZ3MuICBUaGUgbGVuZ3RocyBpbmNsdWRlIHRoZSBOVUxMIHRlcm1pbmF0b3IuICAqLwogICAgICBzaXplX3QgcmV0dXJuZWRfbGVuICAgID0gMDsKICAgICAgc2l6ZV90IHNyY19uYXRpdmVfbGVuICA9IDA7CiAgICAgIHNpemVfdCBkc3RfbmF0aXZlX2xlbiAgPSAwOwogICAgICBzaXplX3QgZHN0c3RyX2xpYmNfbGVuID0gMDsKCiAgICAgIC8qIE5hdGl2ZSAoY2hhcmFjdGVyIHNldCBkZXRlcm1pbmVkIGJ5IGxvY2FsZSkgdmVyc2lvbnMgb2YgdGhlCiAgICAgICAqIHN0cmluZ3Mgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBzdHJpbmdzLiAgKi8KICAgICAgTFBTVFIgc3JjX25hdGl2ZSA9IDA7CiAgICAgIExQU1RSIGRzdF9uYXRpdmUgPSAwOwoKICAgICAgLyogVmVyc2lvbiBvZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBzdHJpbmdzIHVzaW5nIHRoZQogICAgICAgKiAid2NoYXJfdCIgVW5pY29kZSBkYXRhIHR5cGUgbmVlZGVkIGJ5IHZhcmlvdXMgbGliYyBmdW5jdGlvbnMuICAqLwogICAgICB3Y2hhcl90ICpzcmNzdHJfbGliYyA9IDA7CiAgICAgIHdjaGFyX3QgKmRzdHN0cl9saWJjID0gMDsKCiAgICAgIGlmKCEoc3Jjc3RyX2xpYmMgPSAod2NoYXJfdCAqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNsZW4gKiBzaXplb2Yod2NoYXJfdCkpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIHNyY3N0cl9saWJjXG4iLAogICAgICAgICAgICAgIHNyY2xlbiAqIHNpemVvZih3Y2hhcl90KSk7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIC8qIENvbnZlcnQgc291cmNlIHN0cmluZyB0byBhIGxpYmMgVW5pY29kZSBzdHJpbmcuICovCiAgICAgIGZvcihzdHJfaWR4ID0gMDsgc3RyX2lkeCA8IHNyY2xlbjsgc3RyX2lkeCsrKQogICAgICB7CiAgICAgICAgICBzcmNzdHJfbGliY1tzdHJfaWR4XSA9IHNyY3N0cltzdHJfaWR4XTsKICAgICAgfQoKICAgICAgLyogc3JjX25hdGl2ZSBzaG91bGQgY29udGFpbiBhdCBtb3N0IDMgYnl0ZXMgZm9yIGVhY2gKICAgICAgICogbXVsdGlieXRlIGNoYXJhY3RlcnMgaW4gdGhlIG9yaWdpbmFsIHNyY3N0ciBzdHJpbmcuICAqLwogICAgICBzcmNfbmF0aXZlX2xlbiA9IDMgKiBzcmNsZW47CiAgICAgIGlmKCEoc3JjX25hdGl2ZSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX25hdGl2ZV9sZW4pKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIHNyY19uYXRpdmVcbiIsIHNyY19uYXRpdmVfbGVuKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIC8qIEZJWE1FOiBQcmlvciB0byB0byBzZXR0aW5nIHRoZSBMQ19DT0xMQVRFIGxvY2FsZSBjYXRlZ29yeSB0aGUKICAgICAgICogY3VycmVudCB2YWx1ZSBpcyBiYWNrZWQgdXAgc28gaXQgY2FuIGJlIHJlc3RvcmVkIGFmdGVyIHRoZQogICAgICAgKiBsYXN0IExDX0NPTExBVEUgc2Vuc2l0aXZlIGZ1bmN0aW9uIHJldHVybnMuCiAgICAgICAqIAogICAgICAgKiBFdmVuIHRob3VnaCB0aGUgbG9jYWxlIGlzIGFkanVzdGVkIGZvciBhIG1pbmltdW0gYW1vdW50IG9mCiAgICAgICAqIHRpbWUgYSByYWNlIGNvbmRpdGlvbiBleGlzdHMgd2hlcmUgb3RoZXIgdGhyZWFkcyBtYXkgYmUKICAgICAgICogYWZmZWN0ZWQgaWYgdGhleSBpbnZva2UgTENfQ09MTEFURSBzZW5zaXRpdmUgZnVuY3Rpb25zLiAgT25lCiAgICAgICAqIHBvc3NpYmxlIHNvbHV0aW9uIGlzIHRvIHdyYXAgYWxsIExDX0NPTExBVEUgc2Vuc2l0aXZlIFdpbmUKICAgICAgICogZnVuY3Rpb25zLCBsaWtlIExDTWFwU3RyaW5nVygpLCBpbiBhIG11dGV4LgogICAgICAgKgogICAgICAgKiBBbm90aGVyIGVuaGFuY2VtZW50IHRvIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgdG8gc2V0IHRoZQogICAgICAgKiBMQ19DT0xMQVRFIGxvY2FsZSBjYXRlZ29yeSBhcyBhIGZ1bmN0aW9uIG9mIHRoZSAibGNpZCIKICAgICAgICogcGFyYW1ldGVyIGluc3RlYWQgb2YgdGhlICJMQ19DT0xMQVRFIiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gKi8KICAgICAgaWYoIShsY19jb2xsYXRlX2RlZmF1bHQgPSBzZXRsb2NhbGUoTENfQ09MTEFURSwgTlVMTCkpKQogICAgICB7CiAgICAgICAgICBFUlIoIlVuYWJsZSB0byBxdWVyeSB0aGUgTENfQ09MTEFURSBjYXRhZ29yeVxuIik7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIGlmKCEobGNfY29sbGF0ZV9lbnYgPSBzZXRsb2NhbGUoTENfQ09MTEFURSwgIiIpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gaW5oZXJpdCB0aGUgTENfQ09MTEFURSBsb2NhbGUgY2F0ZWdvcnkgZnJvbSB0aGUgIgogICAgICAgICAgICAgICJlbnZpcm9ubWVudC4gIFRoZSBcIkxDX0NPTExBVEVcIiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyAiCiAgICAgICAgICAgICAgIlwiJXNcIi5cbiIsIGdldGVudigiTENfQ09MTEFURSIpID8KICAgICAgICAgICAgICBnZXRlbnYoIkxDX0NPTExBVEUiKSA6ICI8dW5zZXQ+Iik7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KCiAgICAgIFRSQUNFKCJsY19jb2xsYXRlX2RlZmF1bHQgPSAlc1xuIiwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgVFJBQ0UoImxjX2NvbGxhdGVfZW52ID0gJXNcbiIsIGxjX2NvbGxhdGVfZW52KTsKCiAgICAgIC8qIENvbnZlcnQgdGhlIGxpYmMgVW5pY29kZSBzdHJpbmcgdG8gYSBuYXRpdmUgbXVsdGlieXRlIGNoYXJhY3RlcgogICAgICAgKiBzdHJpbmcuICovCiAgICAgIHJldHVybmVkX2xlbiA9IHdjc3RvbWJzKHNyY19uYXRpdmUsIHNyY3N0cl9saWJjLCBzcmNfbmF0aXZlX2xlbikgKyAxOwogICAgICBpZihyZXR1cm5lZF9sZW4gPT0gMCkKICAgICAgewogICAgICAgICAgTFBTVFIgc3Jjc3RyX2FzY2lpID0gKExQU1RSKUhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLAoJCQkJCSAgIDAsIHNyY3N0cik7CiAgICAgICAgICBFUlIoIndjc3RvbWJzIGZhaWxlZC4gIFRoZSBzdHJpbmcgc3BlY2lmaWVkICglcykgbWF5IGNvbnRhaW5zIGFuICIKICAgICAgICAgICAgICAiaW52YWxpZCBjaGFyYWN0ZXIuXG4iLCBzcmNzdHJfYXNjaWkpOwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgICAgIGlmKHNyY3N0cl9hc2NpaSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2FzY2lpKTsKICAgICAgICAgIGlmKHNyY3N0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNzdHJfbGliYyk7CiAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgZWxzZSBpZihyZXR1cm5lZF9sZW4gPiBzcmNfbmF0aXZlX2xlbikKICAgICAgewogICAgICAgICAgc3JjX25hdGl2ZVtzcmNfbmF0aXZlX2xlbiAtIDFdID0gMDsKICAgICAgICAgIEVSUigid2NzdG9tYnMgcmV0dXJuZWQgYSBzdHJpbmcgKCVzKSB0aGF0IHdhcyBsb25nZXIgKCVkIGJ5dGVzKSAiIAogICAgICAgICAgICAgICJ0aGFuIGV4cGVjdGVkICglZCBieXRlcykuXG4iLCBzcmNfbmF0aXZlLCByZXR1cm5lZF9sZW4sCiAgICAgICAgICAgICAgZHN0X25hdGl2ZV9sZW4pOwoKICAgICAgICAgIC8qIFNpbmNlIHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgSSdtIG5vdCBzdXJlIHdoYXQgdGhlIGNvcnJlY3QKICAgICAgICAgICAqIGVycm9yIGNvZGUgaXMuICAqLwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKCiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CiAgICAgIHNyY19uYXRpdmVfbGVuID0gcmV0dXJuZWRfbGVuOwoKICAgICAgVFJBQ0UoInNyY19uYXRpdmUgPSAlcyAgc3JjX25hdGl2ZV9sZW4gPSAlZFxuIiwKICAgICAgICAgICAgIHNyY19uYXRpdmUsIHNyY19uYXRpdmVfbGVuKTsKCiAgICAgIC8qIGRzdF9uYXRpdmUgc2VlbXMgdG8gY29udGFpbiBhdCBtb3N0IDQgYnl0ZXMgZm9yIGVhY2ggYnl0ZSBpbgogICAgICAgKiB0aGUgb3JpZ2luYWwgc3JjX25hdGl2ZSBzdHJpbmcuICBDaGFuZ2UgaWYgbmVlZCBiZSBzaW5jZSB0aGlzCiAgICAgICAqIGlzbid0IGRvY3VtZW50ZWQgYnkgdGhlIHN0cnhmcm0oKSBtYW4gcGFnZS4gKi8KICAgICAgZHN0X25hdGl2ZV9sZW4gPSA0ICogc3JjX25hdGl2ZV9sZW47CiAgICAgIGlmKCEoZHN0X25hdGl2ZSA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZV9sZW4pKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGRzdF9uYXRpdmVcbiIsIGRzdF9uYXRpdmVfbGVuKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9OT1RfRU5PVUdIX01FTU9SWSk7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBUaGUgYWN0dWFsIHRyYW5zbGF0aW9uIGlzIGRvbmUgYnkgdGhlIGZvbGxvd2luZyBjYWxsIHRvCiAgICAgICAqIHN0cnhmcm0oKS4gIFRoZSBzdXJyb3VuZGluZyBjb2RlIGNvdWxkIGhhdmUgYmVlbiBzaW1wbGlmaWVkCiAgICAgICAqIGJ5IGNhbGxpbmcgd2NzeGZybSgpIGluc3RlYWQgZXhjZXB0IHRoYXQgd2NzeGZybSgpIGlzIG5vdAogICAgICAgKiBhdmFpbGFibGUgb24gb2xkZXIgTGludXggc3lzdGVtcyAoUmVkSGF0IDQuMSB3aXRoCiAgICAgICAqIGxpYmMtNS4zLjEyLTE3KS4KICAgICAgICoKICAgICAgICogQWxzbywgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgdHJhbnNsYXRpb24gY291bGQgYmUgZG9uZSBieQogICAgICAgKiB2YXJpb3VzIHRhYmxlcyBhcyBpdCBpcyBkb25lIGluIExDTWFwU3RyaW5nQSgpLiAgSG93ZXZlciwgSSdtCiAgICAgICAqIG5vdCBzdXJlIHdoYXQgdGhvc2UgdGFibGVzIGFyZS4gKi8KICAgICAgcmV0dXJuZWRfbGVuID0gc3RyeGZybShkc3RfbmF0aXZlLCBzcmNfbmF0aXZlLCBkc3RfbmF0aXZlX2xlbikgKyAxOwogICAgICAKICAgICAgaWYocmV0dXJuZWRfbGVuID4gZHN0X25hdGl2ZV9sZW4pCiAgICAgIHsKICAgICAgICAgIGRzdF9uYXRpdmVbZHN0X25hdGl2ZV9sZW4gLSAxXSA9IDA7CiAgICAgICAgICBFUlIoInN0cnhmcm0gcmV0dXJuZWQgYSBzdHJpbmcgKCVzKSB0aGF0IHdhcyBsb25nZXIgKCVkIGJ5dGVzKSAiIAogICAgICAgICAgICAgICJ0aGFuIGV4cGVjdGVkICglZCBieXRlcykuXG4iLCBkc3RfbmF0aXZlLCByZXR1cm5lZF9sZW4sCiAgICAgICAgICAgICAgZHN0X25hdGl2ZV9sZW4pOwoKICAgICAgICAgIC8qIFNpbmNlIHRoaXMgaXMgYW4gaW50ZXJuYWwgZXJyb3IgSSdtIG5vdCBzdXJlIHdoYXQgdGhlIGNvcnJlY3QKICAgICAgICAgICAqIGVycm9yIGNvZGUgaXMuICAqLwogICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX05PVF9FTk9VR0hfTUVNT1JZKTsKCiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIHNldGxvY2FsZShMQ19DT0xMQVRFLCBsY19jb2xsYXRlX2RlZmF1bHQpOwogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgICAgZHN0X25hdGl2ZV9sZW4gPSByZXR1cm5lZF9sZW47CiAgICAgIAogICAgICBUUkFDRSgiZHN0X25hdGl2ZSA9ICVzICBkc3RfbmF0aXZlX2xlbiA9ICVkXG4iLAogICAgICAgICAgICAgZHN0X25hdGl2ZSwgZHN0X25hdGl2ZV9sZW4pOwoKICAgICAgZHN0c3RyX2xpYmNfbGVuID0gZHN0X25hdGl2ZV9sZW47CiAgICAgIGlmKCEoZHN0c3RyX2xpYmMgPSAod2NoYXJfdCAqKUhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RzdHJfbGliY19sZW4gKiBzaXplb2Yod2NoYXJfdCkpKSkKICAgICAgewogICAgICAgICAgRVJSKCJVbmFibGUgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZm9yIGRzdHN0cl9saWJjXG4iLAogICAgICAgICAgICAgIGRzdHN0cl9saWJjX2xlbiAqIHNpemVvZih3Y2hhcl90KSk7CiAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfTk9UX0VOT1VHSF9NRU1PUlkpOwogICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgIGlmKHNyY19uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY19uYXRpdmUpOwogICAgICAgICAgaWYoZHN0X25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0X25hdGl2ZSk7CiAgICAgICAgICBzZXRsb2NhbGUoTENfQ09MTEFURSwgbGNfY29sbGF0ZV9kZWZhdWx0KTsKICAgICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICAvKiBDb252ZXJ0IHRoZSBuYXRpdmUgbXVsdGlieXRlIHN0cmluZyB0byBhIGxpYmMgVW5pY29kZSBzdHJpbmcuICovCiAgICAgIHJldHVybmVkX2xlbiA9IG1ic3Rvd2NzKGRzdHN0cl9saWJjLCBkc3RfbmF0aXZlLCBkc3RfbmF0aXZlX2xlbikgKyAxOwoKICAgICAgLyogUmVzdG9yZSBMQ19DT0xMQVRFIG5vdyB0aGF0IHRoZSBsYXN0IExDX0NPTExBVEUgc2Vuc2l0aXZlCiAgICAgICAqIGZ1bmN0aW9uIGhhcyByZXR1cm5lZC4gKi8KICAgICAgc2V0bG9jYWxlKExDX0NPTExBVEUsIGxjX2NvbGxhdGVfZGVmYXVsdCk7IAoKICAgICAgaWYocmV0dXJuZWRfbGVuID09IDApCiAgICAgIHsKICAgICAgICAgIEVSUigibWJzdG93Y3MgZmFpbGVkLiAgVGhlIG5hdGl2ZSB2ZXJzaW9uIG9mIHRoZSB0cmFuc2xhdGVkIHN0cmluZyAiCiAgICAgICAgICAgICAgIiglcykgbWF5IGNvbnRhaW4gYW4gaW52YWxpZCBjaGFyYWN0ZXIuXG4iLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICBpZihzcmNzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3Jjc3RyX2xpYmMpOwogICAgICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgIGlmKGRzdHN0cl9saWJjKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RzdHJfbGliYyk7CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBpZihkc3RsZW4pCiAgICAgIHsKICAgICAgICAgIGlmKHJldHVybmVkX2xlbiA+IGRzdGxlbikKICAgICAgICAgIHsKICAgICAgICAgICAgICBFUlIoIm1ic3Rvd2NzIHJldHVybmVkIGEgc3RyaW5nIHRoYXQgd2FzIGxvbmdlciAoJWQgY2hhcnMpICIgCiAgICAgICAgICAgICAgICAgICJ0aGFuIHRoZSBidWZmZXIgcHJvdmlkZWQgKCVkIGNoYXJzKS5cbiIsIHJldHVybmVkX2xlbiwKICAgICAgICAgICAgICAgICAgZHN0bGVuKTsKICAgICAgICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgICAgICAgICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgICAgICAgICBpZihzcmNfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzcmNfbmF0aXZlKTsKICAgICAgICAgICAgICBpZihkc3RfbmF0aXZlKSBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBkc3RfbmF0aXZlKTsKICAgICAgICAgICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICAgICAgICAgIHJldHVybiAwOyAgICAgICAgICAKICAgICAgICAgIH0KICAgICAgICAgIGRzdGxlbiA9IHJldHVybmVkX2xlbjsKCiAgICAgICAgICAvKiBDb252ZXJ0IGEgbGliYyBVbmljb2RlIHN0cmluZyB0byB0aGUgZGVzdGluYXRpb24gc3RyaW5nLiAqLwogICAgICAgICAgZm9yKHN0cl9pZHggPSAwOyBzdHJfaWR4IDwgZHN0bGVuOyBzdHJfaWR4KyspCiAgICAgICAgICB7CiAgICAgICAgICAgICAgZHN0c3RyW3N0cl9pZHhdID0gZHN0c3RyX2xpYmNbc3RyX2lkeF07CiAgICAgICAgICB9CiAgICAgICAgICBUUkFDRSgiMXN0IDQgaW50IHNpemVkIGNodW5rcyBvZiBkc3RzdHIgPSAleCAleCAleCAleFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICooKChpbnQgKilkc3RzdHIpICsgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAqKCgoaW50ICopZHN0c3RyKSArIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgKigoKGludCAqKWRzdHN0cikgKyAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICooKChpbnQgKilkc3RzdHIpICsgMykpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgICAgZHN0bGVuID0gcmV0dXJuZWRfbGVuOwogICAgICB9CiAgICAgIFRSQUNFKCJkc3RsZW4gKHJldHVybikgPSAlZFxuIiwgZHN0bGVuKTsKICAgICAgaWYoc3Jjc3RyX2xpYmMpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHNyY3N0cl9saWJjKTsKICAgICAgaWYoc3JjX25hdGl2ZSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3JjX25hdGl2ZSk7CiAgICAgIGlmKGRzdF9uYXRpdmUpIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIGRzdF9uYXRpdmUpOwogICAgICBpZihkc3RzdHJfbGliYykgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZHN0c3RyX2xpYmMpOwogICAgICByZXR1cm4gZHN0bGVuOwogIH0KICBlbHNlCiAgewogICAgaW50ICgqZikoaW50KT1pZGVudGl0eTsgCgogICAgaWYgKGRzdGxlbj09MCkKICAgICAgICByZXR1cm4gc3JjbGVuOyAgCiAgICBpZiAoZHN0bGVuPHNyY2xlbikgCiAgICB7CiAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIGlmIChtYXBmbGFncyAmIExDTUFQX1VQUEVSQ0FTRSkKICAgICAgZiA9IHRvdXBwZXI7CiAgICBlbHNlIGlmIChtYXBmbGFncyAmIExDTUFQX0xPV0VSQ0FTRSkKICAgICAgZiA9IHRvbG93ZXI7CiAgICBmb3IgKGk9MDsgaSA8IHNyY2xlbjsgaSsrKQogICAgICBkc3RzdHJbaV0gPSAoV0NIQVIpIGYoc3Jjc3RyW2ldKTsKICAgIHJldHVybiBzcmNsZW47CiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBPTEUyTkxTX0VzdGltYXRlTWFwcGluZ0xlbmd0aAogKgogKiBFc3RpbWF0ZXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlcXVpcmVkIHRvIGhvbGQgdGhlIHN0cmluZwogKiBjb21wdXRlZCBieSBMQ01hcFN0cmluZ0EuCiAqCiAqIFRoZSBzaXplIGlzIGFsd2F5cyBvdmVyLWVzdGltYXRlZCwgd2l0aCBhIGZpeGVkIGxpbWl0IG9uIHRoZQogKiBhbW91bnQgb2YgZXN0aW1hdGlvbiBlcnJvci4KICoKICogTm90ZSB0aGF0IGxlbiA9PSAtMSBpcyBub3QgcGVybWl0dGVkLgogKi8Kc3RhdGljIGlubGluZSBpbnQgT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgoTENJRCBsY2lkLCBEV09SRCBkd01hcEZsYWdzLAoJCQkJCQlMUENTVFIgc3RyLCBEV09SRCBsZW4pCnsKICAgIC8qIEVzdGltYXRlIG9ubHkgZm9yIHNtYWxsIHN0cmluZ3MgdG8ga2VlcCB0aGUgZXN0aW1hdGlvbiBlcnJvciBmcm9tCiAgICAgKiBiZWNvbWluZyB0b28gbGFyZ2UuICovCiAgICBpZiAobGVuIDwgMTI4KSByZXR1cm4gbGVuICogOCArIDU7CiAgICBlbHNlIHJldHVybiBMQ01hcFN0cmluZ0EobGNpZCwgZHdNYXBGbGFncywgc3RyLCBsZW4sIE5VTEwsIDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlDb21wYXJlU3RyaW5nQQlbS0VSTkVMMzIuMTQzXQogKiBDb21wYXJlcyB0d28gc3RyaW5ncyB1c2luZyBsb2NhbGUKICoKICogUkVUVVJOUwogKgogKiBzdWNjZXNzOiBDU1RSX0xFU1NfVEhBTiwgQ1NUUl9FUVVBTCwgQ1NUUl9HUkVBVEVSX1RIQU4KICogZmFpbHVyZTogMAogKgogKiBOT1RFUwogKgogKiBEZWZhdWx0cyB0byBhIHdvcmQgc29ydCwgYnV0IHVzZXMgYSBzdHJpbmcgc29ydCBpZgogKiBTT1JUX1NUUklOR1NPUlQgaXMgc2V0LgogKiBDYWxscyBTZXRMYXN0RXJyb3IgZm9yIEVSUk9SX0lOVkFMSURfRkxBR1MsIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSLgogKiAKICogQlVHUwogKgogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZQogKgogKiBGSVhNRQogKiAKICogUXVpdGUgaW5lZmZpY2llbnQuCiAqLwpVSU5UIFdJTkFQSSBDb21wYXJlU3RyaW5nQSgKICAgIERXT1JEIGxjaWQsICAgICAvKiBsb2NhbGUgSUQgKi8KICAgIERXT1JEIGZkd1N0eWxlLCAvKiBjb21wYXJpc29uLXN0eWxlIG9wdGlvbnMgKi8KICAgIExQQ1NUUiBzMSwgICAgICAvKiBmaXJzdCBzdHJpbmcgKi8KICAgIERXT1JEIGwxLCAgICAgICAvKiBsZW5ndGggb2YgZmlyc3Qgc3RyaW5nICovCiAgICBMUENTVFIgczIsICAgICAgLyogc2Vjb25kIHN0cmluZyAqLwogICAgRFdPUkQgbDIpICAgICAgIC8qIGxlbmd0aCBvZiBzZWNvbmQgc3RyaW5nICovCnsKICBpbnQgbWFwc3RyaW5nX2ZsYWdzOwogIGludCBsZW4xLGxlbjI7CiAgaW50IHJlc3VsdDsKICBMUFNUUiBzazEsc2syOwogIFRSQUNFKCIlcyBhbmQgJXNcbiIsCglkZWJ1Z3N0cl9hIChzMSksIGRlYnVnc3RyX2EgKHMyKSk7CgogIGlmICggKHMxPT1OVUxMKSB8fCAoczI9PU5VTEwpICkKICB7ICAgIAogICAgRVJSKCIoczE9JXMsczI9JXMpOiBJbnZhbGlkIE5VTEwgc3RyaW5nXG4iLCBzMSwgczIpOwogICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRVNZTUJPTFMpCiAgICBGSVhNRSgiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCiAgaWYgKGwxID09IC0xKSBsMSA9IHN0cmxlbihzMSk7CiAgaWYgKGwyID09IC0xKSBsMiA9IHN0cmxlbihzMik7CiAgCQogIG1hcHN0cmluZ19mbGFncyA9IExDTUFQX1NPUlRLRVkgfCBmZHdTdHlsZSA7CiAgbGVuMSA9IE9MRTJOTFNfRXN0aW1hdGVNYXBwaW5nTGVuZ3RoKGxjaWQsIG1hcHN0cmluZ19mbGFncywgczEsIGwxKTsKICBsZW4yID0gT0xFMk5MU19Fc3RpbWF0ZU1hcHBpbmdMZW5ndGgobGNpZCwgbWFwc3RyaW5nX2ZsYWdzLCBzMiwgbDIpOwoKICBpZiAoKGxlbjE9PTApfHwobGVuMj09MCkpCiAgICByZXR1cm4gMDsgICAgIC8qIHNvbWV0aGluZyB3cm9uZyBoYXBwZW5lZCAqLwoKICBzazEgPSAoTFBTVFIpSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIGxlbjEgKyBsZW4yKTsKICBzazIgPSBzazEgKyBsZW4xOwogIGlmICggKCFMQ01hcFN0cmluZ0EobGNpZCxtYXBzdHJpbmdfZmxhZ3MsczEsbDEsc2sxLGxlbjEpKQoJIHx8ICghTENNYXBTdHJpbmdBKGxjaWQsbWFwc3RyaW5nX2ZsYWdzLHMyLGwyLHNrMixsZW4yKSkgKQogIHsKICAgIEVSUigiQnVnIGluIExDbWFwU3RyaW5nQS5cbiIpOwogICAgcmVzdWx0ID0gMDsKICB9CiAgZWxzZQogIHsKICAgIC8qIHN0cmNtcCBkb2Vzbid0IG5lY2Vzc2FyaWx5IHJldHVybiAtMSwgMCwgb3IgMSAqLwogICAgcmVzdWx0ID0gc3RyY21wKHNrMSxzazIpOwogIH0KICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc2sxKTsKCiAgaWYgKHJlc3VsdCA8IDApCiAgICByZXR1cm4gMTsKICBpZiAocmVzdWx0ID09IDApCiAgICByZXR1cm4gMjsKCiAgLyogbXVzdCBiZSBncmVhdGVyLCBpZiB3ZSByZWFjaCB0aGlzIHBvaW50ICovCiAgcmV0dXJuIDM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUNvbXBhcmVTdHJpbmdXCVtLRVJORUwzMi4xNDRdCiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgbG9jYWxlCiAqIEZJWE1FIDogIERvZXMgb25seSBzdHJpbmcgc29ydC4gIFNob3VsZAogKiBiZSByZWltcGxlbWVudGVkIHRoZSBzYW1lIHdheSBhcyBDb21wYXJlU3RyaW5nQS4KICovClVJTlQgV0lOQVBJIENvbXBhcmVTdHJpbmdXKERXT1JEIGxjaWQsIERXT1JEIGZkd1N0eWxlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQQ1dTVFIgczEsIERXT1JEIGwxLCBMUENXU1RSIHMyLERXT1JEIGwyKQp7CglpbnQgbGVuLHJldDsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVOT05TUEFDRSkKCQlGSVhNRSgiSUdOT1JFTk9OU1BBQ0Ugbm90IHN1cHBydGVkXG4iKTsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCUZJWE1FKCJJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwoKCS8qIElzIHN0cmNtcCBkZWZhdWx0aW5nIHRvIHN0cmluZyBzb3J0IG9yIHRvIHdvcmQgc29ydD8/ICovCgkvKiBGSVhNRTogSGFuZGxlIE5PUk1fU1RSSU5HU09SVCAqLwoJbDEgPSAobDE9PS0xKT9zdHJsZW5XKHMxKTpsMTsKCWwyID0gKGwyPT0tMSk/c3RybGVuVyhzMik6bDI7CglsZW4gPSBsMTxsMiA/IGwxOmwyOwoJcmV0ID0gKGZkd1N0eWxlICYgTk9STV9JR05PUkVDQVNFKSA/IHN0cm5jbXBpVyhzMSxzMixsZW4pIDogc3RybmNtcFcoczEsczIsbGVuKTsKCS8qIG5vdCBlcXVhbCwgcmV0dXJuIDEgb3IgMyAqLwoJaWYocmV0IT0wKSByZXR1cm4gcmV0KzI7CgkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KCWlmKGwxPT1sMikgcmV0dXJuIDI7CgkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLwoJcmV0dXJuIChsMTxsMik/IDEgOiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlPTEVfR2V0Rm9ybWF0QQlbSW50ZXJuYWxdCiAqCiAqIEZJWE1FCiAqICAgIElmIGRhdGVsZW4gPT0gMCwgaXQgc2hvdWxkIHJldHVybiB0aGUgcmVndWlyZWQgc3RyaW5nIGxlbmd0aC4KICoKIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBzdHVmZiBmb3IgR2V0RGF0ZUZvcm1hdCgpIGFuZCAKIEdldFRpbWVGb3JtYXQoKS4KCiAgZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAgTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICBNTSAgIHR3by1kaWdpdCBtb250aAogIE1NTSAgc2hvcnQgbW9udGggbmFtZQogIE1NTU0gZnVsbCBtb250aCBuYW1lCiAgeSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAgeXkgICB0d28tZGlnaXQgeWVhcgogIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAgZ2cgICBlcmEgc3RyaW5nCiAgaCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMTItaG91cikKICBoaCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgSCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICBISCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgbSAgICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgbW0gICBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgcyAgICBzZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgc3MgICBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgdCAgICB0aW1lIG1hcmtlciAoQSBvciBQKQogIHR0ICAgdGltZSBtYXJrZXIgKEFNLCBQTSkKICAnJyAgIHVzZWQgdG8gcXVvdGUgbGl0ZXJhbCBjaGFyYWN0ZXJzCiAgJycgICAod2l0aGluIGEgcXVvdGVkIHN0cmluZykgaW5kaWNhdGVzIGEgbGl0ZXJhbCAnCgogVGhlc2UgZnVuY3Rpb25zIFJFUVVJUkUgdmFsaWQgbG9jYWxlLCBkYXRlLCAgYW5kIGZvcm1hdC4gCiAqLwpzdGF0aWMgSU5UIE9MRV9HZXRGb3JtYXRBKExDSUQgbG9jYWxlLAoJCQkgICAgRFdPUkQgZmxhZ3MsCgkJCSAgICBEV09SRCB0ZmxhZ3MsCgkJCSAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICBMUENTVFIgX2Zvcm1hdCwgCS8qaW4qLwoJCQkgICAgTFBTVFIgZGF0ZSwJCS8qb3V0Ki8KCQkJICAgIElOVCBkYXRlbGVuKQp7CiAgIElOVCBpbnBvcywgb3V0cG9zOwogICBpbnQgY291bnQsIHR5cGUsIGlucXVvdGUsIE92ZXJmbG93OwogICBjaGFyIGJ1Zls0MF07CiAgIGNoYXIgZm9ybWF0WzQwXTsKICAgY2hhciAqIHBvczsKICAgaW50IGJ1ZmxlbjsKCiAgIGNvbnN0IGNoYXIgKiBfZGdmbXRbXSA9IHsgIiVkIiwgIiUwMmQiIH07CiAgIGNvbnN0IGNoYXIgKiogZGdmbXQgPSBfZGdmbXQgLSAxOyAKCiAgIC8qIHJlcG9ydCwgZm9yIGRlYnVnZ2luZyAqLwogICBUUkFDRSgiKDB4JWx4LDB4JWx4LCAweCVseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10PSVwIFwnJXNcJyAsICVwLCBsZW49JWQpXG4iLAogICAJIGxvY2FsZSwgZmxhZ3MsIHRmbGFncywKCSB4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgX2Zvcm1hdCwgX2Zvcm1hdCwgZGF0ZSwgZGF0ZWxlbik7CiAgCiAgIGlmKGRhdGVsZW4gPT0gMCkgewogICAgIEZJWE1FKCJkYXRlbGVuID0gMCwgcmV0dXJuaW5nIDI1NVxuIik7CiAgICAgcmV0dXJuIDI1NTsKICAgfQoKICAgLyogaW5pdGFsaXplIHN0YXRlIHZhcmlhYmxlcyBhbmQgb3V0cHV0IGJ1ZmZlciAqLwogICBpbnBvcyA9IG91dHBvcyA9IDA7CiAgIGNvdW50ID0gMDsgaW5xdW90ZSA9IDA7IE92ZXJmbG93ID0gMDsKICAgdHlwZSA9ICdcMCc7CiAgIGRhdGVbMF0gPSBidWZbMF0gPSAnXDAnOwogICAgICAKICAgc3RyY3B5KGZvcm1hdCxfZm9ybWF0KTsKCiAgIC8qIGFsdGVyIHRoZSBmb3JtYXRzdHJpbmcsIHdoaWxlIGl0IHdvcmtzIGZvciBhbGwgbGFuZ3VhZ2VzIG5vdyBpbiB3aW5lCiAgIGl0cyBwb3NzaWJsZSB0aGF0IGl0IGZhaWxzIHdoZW4gdGhlIHRpbWUgbG9va3MgbGlrZSBzczptbTpoaCBhcyBleGFtcGxlKi8gICAKICAgaWYgKHRmbGFncyAmIChUSU1FX05PTUlOVVRFU09SU0VDT05EUykpCiAgIHsgaWYgKChwb3MgPSBzdHJzdHIgKCBmb3JtYXQsICI6bW0iKSkpCiAgICAgeyBtZW1jcHkgKCBwb3MsIHBvcyszLCBzdHJsZW4oZm9ybWF0KS0ocG9zLWZvcm1hdCktMiApOwogICAgIH0KICAgfQogICBpZiAodGZsYWdzICYgKFRJTUVfTk9TRUNPTkRTKSkKICAgeyBpZiAoKHBvcyA9IHN0cnN0ciAoIGZvcm1hdCwgIjpzcyIpKSkKICAgICB7IG1lbWNweSAoIHBvcywgcG9zKzMsIHN0cmxlbihmb3JtYXQpLShwb3MtZm9ybWF0KS0yICk7CiAgICAgfQogICB9CiAgIAogICBmb3IgKGlucG9zID0gMDs7IGlucG9zKyspIHsKICAgICAgLyogVFJBQ0UoIlNUQVRFIGlucG9zPSUyZCBvdXRwb3M9JTJkIGNvdW50PSVkIGlucXVvdGU9JWQgdHlwZT0lYyBidWYsZGF0ZSA9ICVjLCVjXG4iLCBpbnBvcywgb3V0cG9zLCBjb3VudCwgaW5xdW90ZSwgdHlwZSwgYnVmW2lucG9zXSwgZGF0ZVtvdXRwb3NdKTsgKi8KICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MgKz0gMTsKCSAgICAgICBkYXRlW291dHBvcysrXSA9ICdcJyc7CgkgICAgfSBlbHNlIHsKCSAgICAgICBpbnF1b3RlID0gMDsKCSAgICAgICBjb250aW51ZTsgLyogd2UgZGlkIG5vdGhpbmcgdG8gdGhlIG91dHB1dCAqLwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wwJykgewoJICAgIGRhdGVbb3V0cG9zKytdID0gJ1wwJzsKCSAgICBpZiAob3V0cG9zID4gZGF0ZWxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOwoJIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSB7CgkgICAgICAgT3ZlcmZsb3cgPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zLTFdID0gJ1wwJzsgLyogdGhpcyBpcyB0aGUgbGFzdCBwbGFjZSB3aGVyZQoJCQkJCSBpdCdzIHNhZmUgdG8gd3JpdGUgKi8KCSAgICAgICBicmVhazsKCSAgICB9CgkgfQogICAgICB9IGVsc2UgaWYgKCAgKGNvdW50ICYmIChmb3JtYXRbaW5wb3NdICE9IHR5cGUpKQoJCSAgIHx8IGNvdW50ID09IDQKCQkgICB8fCAoY291bnQgPT0gMiAmJiBzdHJjaHIoImdoSG1zdCIsIHR5cGUpKSApCiAgICAgICB7CgkgICAgaWYgICAgICAgICAodHlwZSA9PSAnZCcpIHsKCSAgICAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwKCQkJCSAgIExPQ0FMRV9TREFZTkFNRTEKCQkJCSAgICsgeHRpbWUtPndEYXlPZldlZWsgLSAxLAoJCQkJICAgYnVmLCBzaXplb2YoYnVmKSk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkJCSAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgCgkJCQkJICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTEgCgkJCQkJICAgICsgeHRpbWUtPndEYXlPZldlZWsgLSAxLAoJCQkJCSAgICBidWYsIHNpemVvZihidWYpKTsKCQkgICAgICB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndEYXkpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ00nKSB7CgkgICAgICAgaWYgKGNvdW50ID09IDMpIHsKCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgCgkJCQkgICBMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEKCQkJCSAgICsgeHRpbWUtPndNb250aCAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDQpIHsKCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwKCQkJCSAgIExPQ0FMRV9TTU9OVEhOQU1FMQoJCQkJICAgKyB4dGltZS0+d01vbnRoIC0gMSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJCSB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndNb250aCk7CgkgICAgICAgfQoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAneScpIHsKCSAgICAgICBpZiAoY291bnQgPT0gNCkgewoJCSAgICAgIHNwcmludGYoYnVmLCAiJWQiLCB4dGltZS0+d1llYXIpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJCSAgc3RyY3B5KGJ1ZiwgInl5eSIpOwoJCSAgV0FSTigidW5rbm93biBmb3JtYXQsIGM9JWMsIG49JWRcbiIsICB0eXBlLCBjb3VudCk7CgkJIH0gZWxzZSB7CgkJICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d1llYXIgJSAxMDApOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2cnKSB7CgkgICAgICAgaWYgICAgICAgIChjb3VudCA9PSAyKSB7CgkJICBGSVhNRSgiTE9DQUxFX0lDQUxFTkRBUlRZUEUgdW5pbXAuXG4iKTsKCQkgIHN0cmNweShidWYsICJBRCIpOwoJICAgIH0gZWxzZSB7CgkJICBzdHJjcHkoYnVmLCAiZyIpOwoJCSAgV0FSTigidW5rbm93biBmb3JtYXQsIGM9JWMsIG49JWRcbiIsIHR5cGUsIGNvdW50KTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdoJykgewoJICAgICAgIC8qIGdpdmVzIHVzIGhvdXJzIDE6MDAgLS0gMTI6MDAgKi8KCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCAoeHRpbWUtPndIb3VyLTEpJTEyICsxKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ0gnKSB7CgkgICAgICAgLyogMjQtaG91ciB0aW1lICovCgkgICAgICAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndIb3VyKTsKCSAgICB9IGVsc2UgaWYgKCB0eXBlID09ICdtJykgewoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53TWludXRlKTsKCSAgICB9IGVsc2UgaWYgKCB0eXBlID09ICdzJykgewoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53U2Vjb25kKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3QnKSB7CgkgICAgICAgaWYgICAgICAgIChjb3VudCA9PSAxKSB7CgkJICBzcHJpbnRmKGJ1ZiwgIiVjIiwgKHh0aW1lLT53SG91ciA8IDEyKSA/ICdBJyA6ICdQJyk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAyKSB7CgkJICAvKiBzcHJpbnRmKGJ1ZiwgIiVzIiwgKHh0aW1lLT53SG91ciA8IDEyKSA/ICJBTSIgOiAiUE0iKTsgKi8KCQkgIEdldExvY2FsZUluZm9BKGxvY2FsZSwKCQkJCSAgICh4dGltZS0+d0hvdXI8MTIpIAoJCQkJICAgPyBMT0NBTEVfUzExNTkgOiBMT0NBTEVfUzIzNTksCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCSAgICAgICB9CgkgICAgfTsKCgkgICAgLyogd2UgbmVlZCB0byBjaGVjayB0aGUgbmV4dCBjaGFyIGluIHRoZSBmb3JtYXQgc3RyaW5nIAoJICAgICAgIGFnYWluLCBubyBtYXR0ZXIgd2hhdCBoYXBwZW5lZCAqLwoJICAgIGlucG9zLS07CgkgICAgCgkgICAgLyogYWRkIHRoZSBjb250ZW50cyBvZiBidWYgdG8gdGhlIG91dHB1dCAqLwoJICAgIGJ1ZmxlbiA9IHN0cmxlbihidWYpOwoJICAgIGlmIChvdXRwb3MgKyBidWZsZW4gPCBkYXRlbGVuKSB7CgkgICAgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsgLyogZm9yIHN0cmNhdCB0byBob29rIG9udG8gKi8KCQkgc3RyY2F0KGRhdGUsIGJ1Zik7CgkgICAgICAgb3V0cG9zICs9IGJ1ZmxlbjsKCSAgICB9IGVsc2UgewoJICAgICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CgkgICAgICAgc3RybmNhdChkYXRlLCBidWYsIGRhdGVsZW4gLSBvdXRwb3MpOwoJCSBkYXRlW2RhdGVsZW4gLSAxXSA9ICdcMCc7CgkJIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKCSAgICAgICBXQVJOKCJpbnN1ZmZpY2llbnQgYnVmZmVyXG4iKTsKCQkgcmV0dXJuIDA7CgkgICAgfQoKCSAgICAvKiByZXNldCB0aGUgdmFyaWFibGVzIHdlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiB0aGlzIGl0ZW0gKi8KCSAgICBjb3VudCA9IDA7CgkgICAgdHlwZSA9ICdcMCc7CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcMCcpIHsKCSAgICAvKiB3ZSBjYW4ndCBjaGVjayBmb3IgdGhpcyBhdCB0aGUgbG9vcC1oZWFkLCBiZWNhdXNlCgkgICAgICAgdGhhdCBicmVha3MgdGhlIHByaW50aW5nIG9mIHRoZSBsYXN0IGZvcm1hdC1pdGVtICovCgkgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKCSAgICBicmVhazsKICAgICAgICAgfSBlbHNlIGlmIChjb3VudCkgewoJICAgIC8qIGNvbnRpbnVpbmcgYSBjb2RlIGZvciBhbiBpdGVtICovCgkgICAgY291bnQgKz0xOwoJICAgIGNvbnRpbnVlOwoJIH0gZWxzZSBpZiAoc3RyY2hyKCJoSG1zdHlNZGciLCBmb3JtYXRbaW5wb3NdKSkgewoJICAgIHR5cGUgPSBmb3JtYXRbaW5wb3NdOwoJICAgIGNvdW50ID0gMTsKCSAgICBjb250aW51ZTsKCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgewoJICAgIGlucXVvdGUgPSAxOwoJICAgIGNvbnRpbnVlOwogICAgICAgfSBlbHNlIHsKCSAgICBkYXRlW291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CgkgfQogICAgICAvKiBub3cgZGVhbCB3aXRoIGEgcG9zc2libGUgYnVmZmVyIG92ZXJmbG93ICovCiAgICAgIGlmIChvdXRwb3MgPj0gZGF0ZWxlbikgewogICAgICAgZGF0ZVtkYXRlbGVuIC0gMV0gPSAnXDAnOwogICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICAgcmV0dXJuIDA7CiAgICAgIH0KICAgfQogICAKICAgaWYgKE92ZXJmbG93KSB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgfTsKCiAgIC8qIGZpbmlzaCBpdCBvZmYgd2l0aCBhIHN0cmluZyB0ZXJtaW5hdG9yICovCiAgIG91dHBvcysrOwogICAvKiBzYW5pdHkgY2hlY2sgKi8KICAgaWYgKG91dHBvcyA+IGRhdGVsZW4tMSkgb3V0cG9zID0gZGF0ZWxlbi0xOwogICBkYXRlW291dHBvc10gPSAnXDAnOwogICAKICAgVFJBQ0UoIk9MRV9HZXRGb3JtYXRBIHJldHVybnMgc3RyaW5nICclcycsIGxlbiAlZFxuIiwKCSAgICAgICBkYXRlLCBvdXRwb3MpOwogICByZXR1cm4gb3V0cG9zOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE9MRV9HZXRGb3JtYXRXIFtJTlRFUk5BTF0KICovCnN0YXRpYyBJTlQgT0xFX0dldEZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGZsYWdzLCBEV09SRCB0ZmxhZ3MsCgkJCSAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICBMUENXU1RSIGZvcm1hdCwKCQkJICAgIExQV1NUUiBvdXRwdXQsIElOVCBvdXRsZW4pCnsKICAgSU5UICAgaW5wb3MsIG91dHBvczsKICAgaW50ICAgICBjb3VudCwgdHlwZT0wLCBpbnF1b3RlOwogICBpbnQgICAgIE92ZXJmbG93OyAvKiBsb29wIGNoZWNrICovCiAgIFdDSEFSICAgYnVmWzQwXTsKICAgaW50ICAgICBidWZsZW49MDsKICAgV0NIQVIgICBhcmcwW10gPSB7MH0sIGFyZzFbXSA9IHsnJScsJ2QnLDB9OwogICBXQ0hBUiAgIGFyZzJbXSA9IHsnJScsJzAnLCcyJywnZCcsMH07CiAgIFdDSEFSICAqYXJnYXJyWzNdOwogICBpbnQgICAgIGRhdGV2YXJzPTAsIHRpbWV2YXJzPTA7CgogICBhcmdhcnJbMF0gPSBhcmcwOwogICBhcmdhcnJbMV0gPSBhcmcxOwogICBhcmdhcnJbMl0gPSBhcmcyOwoKICAgLyogbWFrZSBhIGRlYnVnIHJlcG9ydCAqLwogICBUUkFDRSgiYXJnczogMHglbHgsIDB4JWx4LCAweCVseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10OiVzIChhdCAlcCksICIKICAgCSAgICAgICIlcCB3aXRoIG1heCBsZW4gJWRcbiIsCgkgbG9jYWxlLCBmbGFncywgdGZsYWdzLAoJIHh0aW1lLT53RGF5LCB4dGltZS0+d0hvdXIsIHh0aW1lLT53TWludXRlLCB4dGltZS0+d1NlY29uZCwKCSBkZWJ1Z3N0cl93KGZvcm1hdCksIGZvcm1hdCwgb3V0cHV0LCBvdXRsZW4pOwogICAKICAgaWYob3V0bGVuID09IDApIHsKICAgICBGSVhNRSgib3V0bGVuID0gMCwgcmV0dXJuaW5nIDI1NVxuIik7CiAgICAgcmV0dXJuIDI1NTsKICAgfQoKICAgLyogaW5pdGlhbGl6ZSBzdGF0ZSB2YXJpYWJsZXMgKi8KICAgaW5wb3MgPSBvdXRwb3MgPSAwOwogICBjb3VudCA9IDA7CiAgIGlucXVvdGUgPSBPdmVyZmxvdyA9IDA7CiAgIC8qIHRoaXMgaXMgcmVhbGx5IGp1c3QgYSBzYW5pdHkgY2hlY2sgKi8KICAgb3V0cHV0WzBdID0gYnVmWzBdID0gMDsKICAgCiAgIC8qIHRoaXMgbG9vcCBpcyB0aGUgY29yZSBvZiB0aGUgZnVuY3Rpb24gKi8KICAgZm9yIChpbnBvcyA9IDA7IC8qIHdlIGhhdmUgc2V2ZXJhbCBicmVhayBwb2ludHMgKi8gOyBpbnBvcysrKSB7CiAgICAgIGlmIChpbnF1b3RlKSB7CgkgaWYgKGZvcm1hdFtpbnBvc10gPT0gKFdDSEFSKSAnXCcnKSB7CgkgICAgaWYgKGZvcm1hdFtpbnBvcysxXSA9PSAnXCcnKSB7CgkgICAgICAgaW5wb3MrKzsKCSAgICAgICBvdXRwdXRbb3V0cG9zKytdID0gJ1wnJzsKCSAgICB9IGVsc2UgewoJICAgICAgIGlucXVvdGUgPSAwOwoJICAgICAgIGNvbnRpbnVlOwoJICAgIH0KCSB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gMCkgewoJICAgIG91dHB1dFtvdXRwb3MrK10gPSAwOwoJICAgIGlmIChvdXRwb3MgPiBvdXRsZW4pIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsgIC8qICBub3JtYWwgZXhpdCAod2l0aGluIGEgcXVvdGUpICovCgkgfSBlbHNlIHsKCSAgICBvdXRwdXRbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsgLyogY29weSBpbnB1dCAqLwoJICAgIGlmIChvdXRwb3MgPiBvdXRsZW4pIHsKCSAgICAgICBPdmVyZmxvdyA9IDE7CgkgICAgICAgb3V0cHV0W291dHBvcy0xXSA9IDA7IAoJICAgICAgIGJyZWFrOwoJICAgIH0KCSB9CiAgICAgIH0gZWxzZSBpZiAoICAoY291bnQgJiYgKGZvcm1hdFtpbnBvc10gIT0gdHlwZSkpCgkJICAgfHwgKCAoY291bnQ9PTQgJiYgdHlwZSA9PSd5JykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nTScpIHx8CgkJCShjb3VudD09NCAmJiB0eXBlID09J2QnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdnJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0naCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J0gnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdtJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ncycpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J3QnKSApICApIHsKCSBpZiAgICAgICAgKHR5cGUgPT0gJ2QnKSB7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mb1cobG9jYWxlLAoJCQkgICAgIExPQ0FMRV9TREFZTkFNRTEgKyB4dGltZS0+d0RheU9mV2VlayAtMSwKCQkJICAgICBidWYsIHNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsCgkJCQlMT0NBTEVfU0FCQlJFVkRBWU5BTUUxICsKCQkJCXh0aW1lLT53RGF5T2ZXZWVrIC0xLAoJCQkJYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgeHRpbWUtPndEYXkgKTsKCSAgICB9OwoJIH0gZWxzZSBpZiAodHlwZSA9PSAnTScpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvVyhsb2NhbGUsICBMT0NBTEVfU01PTlRITkFNRTEgKwoJCQkJeHRpbWUtPndNb250aCAtMSwgYnVmLAoJCQkJc2l6ZW9mKGJ1Zikvc2l6ZW9mKFdDSEFSKSApOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgeHRpbWUtPndNb250aCk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAneScpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDQpIHsKCSAgICAgICB3c25wcmludGZXKGJ1ZiwgNiwgYXJnYXJyWzFdIC8qICIlZCIgKi8sCgkJCSB4dGltZS0+d1llYXIpOwoJICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJ5eXkiLCA1KTsKCSAgICB9IGVsc2UgewoJICAgICAgIHdzbnByaW50ZlcoYnVmLCA2LCBhcmdhcnJbY291bnRdLAoJCQkgICAgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJICAgICAgIEZJWE1FKCJMT0NBTEVfSUNBTEVOREFSVFlQRSB1bmltcGxlbWVudGVkXG4iKTsKCSAgICAgICBsc3RyY3B5bkF0b1coYnVmLCAiQUQiLCA1KTsKCSAgICB9IGVsc2UgewoJICAgICAgIC8qIFdpbiBBUEkgc2V6IHdlIGNvcHkgaXQgdmVyYmF0aW0gKi8KCSAgICAgICBsc3RyY3B5bkF0b1coYnVmLCAiZyIsIDUpOwoJICAgIH0KCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ2gnKSB7CgkgICAgLyogaG91cnMgMTowMC0xMjowMCAtLS0gaXMgdGhpcyByaWdodD8gKi8KCSAgICB3c25wcmludGZXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwgCgkJCSAoeHRpbWUtPndIb3VyLTEpJTEyICsxKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ0gnKSB7CgkgICAgd3NucHJpbnRmVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIAoJCQkgeHRpbWUtPndIb3VyKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ20nICkgewoJICAgIHdzbnByaW50ZlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLAoJCQkgeHRpbWUtPndNaW51dGUpOwoJIH0gZWxzZSBpZiAodHlwZSA9PSAncycgKSB7CgkgICAgd3NucHJpbnRmVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sCgkJCSB4dGltZS0+d1NlY29uZCk7CgkgfSBlbHNlIGlmICh0eXBlID09ICd0JykgewoJICAgIEdldExvY2FsZUluZm9XKGxvY2FsZSwgKHh0aW1lLT53SG91ciA8IDEyKSA/CgkJCSAgICAgTE9DQUxFX1MxMTU5IDogTE9DQUxFX1MyMzU5LAoJCQkgICAgIGJ1Ziwgc2l6ZW9mKGJ1ZikgKTsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDEpIHsKCSAgICAgICBidWZbMV0gPSAwOwoJICAgIH0KfQoKCSAvKiBubyBtYXR0ZXIgd2hhdCBoYXBwZW5lZCwgIHdlIG5lZWQgdG8gY2hlY2sgdGhpcyBuZXh0IAoJICAgIGNoYXJhY3RlciB0aGUgbmV4dCB0aW1lIHdlIGxvb3AgdGhyb3VnaCAqLwoJIGlucG9zLS07CgoJIC8qIGNhdCBidWYgb250byB0aGUgb3V0cHV0ICovCgkgb3V0bGVuID0gc3RybGVuVyhidWYpOwoJIGlmIChvdXRwb3MgKyBidWZsZW4gPCBvdXRsZW4pIHsKICAgICAgICAgICAgc3RyY3B5Vyggb3V0cHV0ICsgb3V0cG9zLCBidWYgKTsKCSAgICBvdXRwb3MgKz0gYnVmbGVuOwoJIH0gZWxzZSB7CiAgICAgICAgICAgIGxzdHJjcHluVyggb3V0cHV0ICsgb3V0cG9zLCBidWYsIG91dGxlbiAtIG91dHBvcyApOwoJICAgIE92ZXJmbG93ID0gMTsKCSAgICBicmVhazsgLyogQWJub3JtYWwgZXhpdCAqLwoJIH0KCgkgLyogcmVzZXQgdGhlIHZhcmlhYmxlcyB3ZSB1c2VkIHRoaXMgdGltZSAqLwoJIGNvdW50ID0gMDsKCSB0eXBlID0gJ1wwJzsKICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09IDApIHsKCSAvKiB3ZSBjYW4ndCBjaGVjayBmb3IgdGhpcyBhdCB0aGUgYmVnaW5uaW5nLCAgYmVjYXVzZSB0aGF0IAoJIHdvdWxkIGtlZXAgdXMgZnJvbSBwcmludGluZyBhIGZvcm1hdCBzcGVjIHRoYXQgZW5kZWQgdGhlIAoJIHN0cmluZyAqLwoJIG91dHB1dFtvdXRwb3NdID0gMDsKCSBicmVhazsgIC8qICBOT1JNQUwgRVhJVCAgKi8KICAgICAgfSBlbHNlIGlmIChjb3VudCkgewoJIC8qIGhvdyB3ZSBrZWVwIHRyYWNrIG9mIHRoZSBtaWRkbGUgb2YgYSBmb3JtYXQgc3BlYyAqLwoJIGNvdW50Kys7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoIChkYXRldmFycyAmJiAoZm9ybWF0W2lucG9zXT09J2QnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0nTScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSd5JyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J2cnKSAgKSB8fAoJCSAgKHRpbWV2YXJzICYmIChmb3JtYXRbaW5wb3NdPT0nSCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdoJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J20nIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0ncycgfHwKCQkJCWZvcm1hdFtpbnBvc109PSd0JykgKSAgICApIHsKCSB0eXBlID0gZm9ybWF0W2lucG9zXTsKCSBjb3VudCA9IDE7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXCcnKSB7CgkgaW5xdW90ZSA9IDE7CgkgY29udGludWU7CiAgICAgIH0gZWxzZSB7CgkgLyogdW5xdW90ZWQgbGl0ZXJhbHMgKi8KCSBvdXRwdXRbb3V0cG9zKytdID0gZm9ybWF0W2lucG9zXTsKICAgICAgfQogICB9CgogICBpZiAoT3ZlcmZsb3cpIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwogICAgICBXQVJOKCIgYnVmZmVyIG92ZXJmbG93XG4iKTsKICAgfTsKCiAgIC8qIGZpbmFsIHN0cmluZyB0ZXJtaW5hdG9yIGFuZCBzYW5pdHkgY2hlY2sgKi8KICAgb3V0cG9zKys7CiAgIGlmIChvdXRwb3MgPiBvdXRsZW4tMSkgb3V0cG9zID0gb3V0bGVuLTE7CiAgIG91dHB1dFtvdXRwb3NdID0gJzAnOwoKICAgVFJBQ0UoIiByZXR1cm5pbmcgJXNcbiIsIGRlYnVnc3RyX3cob3V0cHV0KSk7CgkKICAgcmV0dXJuICghT3ZlcmZsb3cpID8gb3V0bGVuIDogMDsKICAgCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXREYXRlRm9ybWF0QQlbS0VSTkVMMzIuMzEwXQogKiBNYWtlcyBhbiBBU0NJSSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogVGhpcyBmdW5jdGlvbiB1c2VzIGZvcm1hdCB0byBmb3JtYXQgdGhlIGRhdGUsICBvciwgIGlmIGZvcm1hdAogKiBpcyBOVUxMLCB1c2VzIHRoZSBkZWZhdWx0IGZvciB0aGUgbG9jYWxlLiAgZm9ybWF0IGlzIGEgc3RyaW5nCiAqIG9mIGxpdGVyYWwgZmllbGRzIGFuZCBjaGFyYWN0ZXJzIGFzIGZvbGxvd3M6CiAqCiAqIC0gZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICogLSBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogKiAtIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogKiAtIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAqIC0gTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICogLSBNTSAgIHR3by1kaWdpdCBtb250aAogKiAtIE1NTSAgc2hvcnQgbW9udGggbmFtZQogKiAtIE1NTU0gZnVsbCBtb250aCBuYW1lCiAqIC0geSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAqIC0geXkgICB0d28tZGlnaXQgeWVhcgogKiAtIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAqIC0gZ2cgICBlcmEgc3RyaW5nCiAqCiAqLwpJTlQgV0lOQVBJIEdldERhdGVGb3JtYXRBKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICAgIExQQ1NUUiBmb3JtYXQsIExQU1RSIGRhdGUsSU5UIGRhdGVsZW4pIAp7CiAgIAogIGNoYXIgZm9ybWF0X2J1Zls0MF07CiAgTFBDU1RSIHRoaXNmb3JtYXQ7CiAgU1lTVEVNVElNRSB0OwogIExQU1lTVEVNVElNRSB0aGlzdGltZTsKICBMQ0lEIHRoaXNsb2NhbGU7CiAgSU5UIHJldDsKCiAgVFJBQ0UoIigweCUwNGx4LDB4JTA4bHgsJXAsJXMsJXAsJWQpXG4iLAoJICAgICAgbG9jYWxlLGZsYWdzLHh0aW1lLGZvcm1hdCxkYXRlLGRhdGVsZW4pOwogIAogIGlmICghbG9jYWxlKSB7CiAgICAgbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwogICAgIH07CiAgCiAgaWYgKGxvY2FsZSA9PSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQpIHsKICAgICB0aGlzbG9jYWxlID0gR2V0U3lzdGVtRGVmYXVsdExDSUQoKTsKICB9IGVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKSB7CiAgICAgdGhpc2xvY2FsZSA9IEdldFVzZXJEZWZhdWx0TENJRCgpOwogIH0gZWxzZSB7CiAgICAgdGhpc2xvY2FsZSA9IGxvY2FsZTsKICAgfTsKCiAgaWYgKHh0aW1lID09IE5VTEwpIHsKICAgICBHZXRTeXN0ZW1UaW1lKCZ0KTsKICAgICB0aGlzdGltZSA9ICZ0OwogIH0gZWxzZSB7CiAgICAgdGhpc3RpbWUgPSB4dGltZTsKICB9OwoKICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKICAgICBHZXRMb2NhbGVJbmZvQSh0aGlzbG9jYWxlLCAoKGZsYWdzJkRBVEVfTE9OR0RBVEUpIAoJCQkJICAgPyBMT0NBTEVfU0xPTkdEQVRFCgkJCQkgICA6IExPQ0FMRV9TU0hPUlREQVRFKSwKCQkgICAgICBmb3JtYXRfYnVmLCBzaXplb2YoZm9ybWF0X2J1ZikpOwogICAgIHRoaXNmb3JtYXQgPSBmb3JtYXRfYnVmOwogIH0gZWxzZSB7CiAgICAgdGhpc2Zvcm1hdCA9IGZvcm1hdDsKICB9OwoKICAKICByZXQgPSBPTEVfR2V0Rm9ybWF0QSh0aGlzbG9jYWxlLCBmbGFncywgMCwgdGhpc3RpbWUsIHRoaXNmb3JtYXQsIAoJCSAgICAgICBkYXRlLCBkYXRlbGVuKTsKICAKCiAgIFRSQUNFKAoJICAgICAgICJHZXREYXRlRm9ybWF0QSgpIHJldHVybmluZyAlZCwgd2l0aCBkYXRhPSVzXG4iLAoJICAgICAgIHJldCwgZGF0ZSk7CiAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJR2V0RGF0ZUZvcm1hdFcJW0tFUk5FTDMyLjMxMV0KICogTWFrZXMgYSBVbmljb2RlIHN0cmluZyBvZiB0aGUgZGF0ZQogKgogKiBBY3RzIHRoZSBzYW1lIGFzIEdldERhdGVGb3JtYXRBKCksICBleGNlcHQgdGhhdCBpdCdzIFVuaWNvZGUuCiAqIEFjY2VwdHMgJiByZXR1cm5zIHNpemVzIGFzIGNvdW50cyBvZiBVbmljb2RlIGNoYXJhY3RlcnMuCiAqCiAqLwpJTlQgV0lOQVBJIEdldERhdGVGb3JtYXRXKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICAgIExQQ1dTVFIgZm9ybWF0LAoJCQkgICAgICBMUFdTVFIgZGF0ZSwgSU5UIGRhdGVsZW4pCnsKICAgdW5zaWduZWQgc2hvcnQgZGF0ZWFycltdID0geycxJywnOScsJzknLCc0JywnLScsJzEnLCctJywnMScsMH07CgogICBGSVhNRSgiU1RVQiAoc2hvdWxkIGNhbGwgT0xFX0dldEZvcm1hdFcpXG4iKTsgICAKICAgbHN0cmNweW5XKGRhdGUsIGRhdGVhcnIsIGRhdGVsZW4pOwogICByZXR1cm4gKCAgZGF0ZWxlbiA8IDkpID8gZGF0ZWxlbiA6IDk7CiAgIAogICAKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtRGF0ZUZvcm1hdHNBCShLRVJORUwzMi4xOTgpCiAqLwpCT09MIFdJTkFQSSBFbnVtRGF0ZUZvcm1hdHNBKAogIERBVEVGTVRfRU5VTVBST0NBIGxwRGF0ZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgIERXT1JEIGR3RmxhZ3MpCnsKICBMQ0lEIExvYyA9IEdldFVzZXJEZWZhdWx0TENJRCgpOyAKICBpZighbHBEYXRlRm10RW51bVByb2MpCiAgICB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgc3dpdGNoKCBMb2MgKQogewoKICAgY2FzZSAweDAwMDAwNDA3OiAgLyogKExvYywiZGVfREUiKSAqLwogICB7CiAgICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQuTU0ueXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTS55eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk0ueXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxkLiBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLiBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLiBNTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICAgfQogICB9ICAgICAgIAoKICAgY2FzZSAweDAwMDAwNDBjOiAgLyogKExvYywiZnJfRlIiKSAqLwogICB7CiAgICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC1NTS15eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkIGQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZCBNTU0geXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICAgfQogICB9CgogICBjYXNlIDB4MDAwMDBjMGM6ICAvKiAoTG9jLCJmcl9DQSIpICovCiAgIHsKICAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJ5eS1NTS1kZCIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQtTU0teXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5IE1NIGRkIikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0sIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgICB9CiAgIH0KCiAgIGNhc2UgMHgwMDAwMDgwOTogIC8qIChMb2MsImVuX1VLIikgKi8gCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC9NTS95eXl5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQuTS55eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAwYzA5OiAgLyogKExvYywiZW5fQVUiKSAqLyAgIAogIHsgICAgCiAgIHN3aXRjaChkd0ZsYWdzKQogICAgewogICAgICBjYXNlIERBVEVfU0hPUlREQVRFOgoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkL00veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkZGQsZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAxMDA5OiAgLyogKExvYywiZW5fQ0EiKSAqLyAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgieXktTU0tZGQiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk0vZGQveXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC1NTU0teXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMTQwOTogIC8qIChMb2MsImVuX05aIikgKi8gCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkLk1NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgZCBNTU1NIHl5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgZGVmYXVsdDoKCUZJWE1FKCJVbmtub3duIGRhdGUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCglTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwoJcmV0dXJuIEZBTFNFOwogICAgfQogIH0KCiAgIGNhc2UgMHgwMDAwMTgwOTogIC8qIChMb2MsImVuX0lFIikgKi8gICAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQvTS95eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZC5NLnl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImQgTU1NTSB5eXl5IikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGRlZmF1bHQ6CglGSVhNRSgiVW5rbm93biBkYXRlIGZvcm1hdCAoJWxkKVxuIiwgZHdGbGFncyk7IAoJU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKCXJldHVybiBGQUxTRTsKICAgIH0KICB9CgogICBjYXNlIDB4MDAwMDFjMDk6ICAvKiAoTG9jLCJlbl9aQSIpICovICAgCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5L01NL2RkIikpIHJldHVybiBUUlVFOwoJcmV0dXJuIFRSVUU7CiAgICAgIGNhc2UgREFURV9MT05HREFURToKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAyMDA5OiAgLyogKExvYywiZW5fSk0iKSAqLyAgCiAgeyAgICAKICAgc3dpdGNoKGR3RmxhZ3MpCiAgICB7CiAgICAgIGNhc2UgREFURV9TSE9SVERBVEU6CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkL01NL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCxNTU1NIGRkLHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNTU1NIGRkLHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGRkIE1NTU0seXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoImRkIE1NTU0seXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgY2FzZSAweDAwMDAyODA5OiAgLyogKExvYywiZW5fQloiKSAqLwogICBjYXNlIDB4MDAwMDJjMDk6ICAvKiAoTG9jLCJlbl9UVCIpICovICAKICB7ICAgIAogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQvTU0veXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBjYXNlIERBVEVfTE9OR0RBVEU6CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLGRkIE1NTU0geXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQoKICAgZGVmYXVsdDogIC8qIGRlZmF1bHQgdG8gVVMgRW5nbGlzaCAiZW5fVVMiICovCiAgewogICBzd2l0Y2goZHdGbGFncykKICAgIHsKICAgICAgY2FzZSBEQVRFX1NIT1JUREFURToKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTS9kL3l5IikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJNL2QveXl5eSIpKSByZXR1cm4gVFJVRTsKCWlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiTU0vZGQveXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NL2RkL3l5eXkiKSkgcmV0dXJuIFRSVUU7CglpZighKCpscERhdGVGbXRFbnVtUHJvYykoInl5L01NL2RkIikpIHJldHVybiBUUlVFOwoJaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZC1NTU0teXkiKSkgcmV0dXJuIFRSVUU7CglyZXR1cm4gVFJVRTsKICAgICAgY2FzZSBEQVRFX0xPTkdEQVRFOgogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGRkZCwgTU1NTSBkZCwgeXl5eSIpKSByZXR1cm4gVFJVRTsKICAgICAgICBpZighKCpscERhdGVGbXRFbnVtUHJvYykoIk1NTU0gZGQsIHl5eXkiKSkgcmV0dXJuIFRSVUU7CiAgICAgICAgaWYoISgqbHBEYXRlRm10RW51bVByb2MpKCJkZGRkLCBkZCBNTU1NLCB5eXl5IikpIHJldHVybiBUUlVFOwogICAgICAgIGlmKCEoKmxwRGF0ZUZtdEVudW1Qcm9jKSgiZGQgTU1NTSwgeXl5eSIpKSByZXR1cm4gVFJVRTsKCXJldHVybiBUUlVFOwogICAgICBkZWZhdWx0OgoJRklYTUUoIlVua25vd24gZGF0ZSBmb3JtYXQgKCVsZClcbiIsIGR3RmxhZ3MpOyAKCVNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CglyZXR1cm4gRkFMU0U7CiAgICB9CiAgfQogfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1EYXRlRm9ybWF0c1cJKEtFUk5FTDMyLjE5OSkKICovCkJPT0wgV0lOQVBJIEVudW1EYXRlRm9ybWF0c1coCiAgREFURUZNVF9FTlVNUFJPQ1cgbHBEYXRlRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgRklYTUUoIiglcCwgJWxkLCAlbGQpOiBzdHViXG4iLCBscERhdGVGbXRFbnVtUHJvYywgTG9jYWxlLCBkd0ZsYWdzKTsKICBTZXRMYXN0RXJyb3IoRVJST1JfQ0FMTF9OT1RfSU1QTEVNRU5URUQpOwogIHJldHVybiBGQUxTRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtVGltZUZvcm1hdHNBCShLRVJORUwzMi4yMTApCiAqLwpCT09MIFdJTkFQSSBFbnVtVGltZUZvcm1hdHNBKAogIFRJTUVGTVRfRU5VTVBST0NBIGxwVGltZUZtdEVudW1Qcm9jLCBMQ0lEIExvY2FsZSwgRFdPUkQgZHdGbGFncykKewogIExDSUQgTG9jID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7IAogIGlmKCFscFRpbWVGbXRFbnVtUHJvYykKICAgIHsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSKTsKICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogIGlmKGR3RmxhZ3MpCiAgICB7CiAgICAgIEZJWE1FKCJVbmtub3duIHRpbWUgZm9ybWF0ICglbGQpXG4iLCBkd0ZsYWdzKTsgCiAgICB9CgogIHN3aXRjaCggTG9jICkKIHsKICAgY2FzZSAweDAwMDAwNDA3OiAgLyogKExvYywiZGVfREUiKSAqLwogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhILm1tIikpIHJldHVybiBUUlVFOyAKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkgubW0iKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkgubW0nVWhyJyIpKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBUUlVFOwogICB9ICAgICAgIAoKICAgY2FzZSAweDAwMDAwNDBjOiAgLyogKExvYywiZnJfRlIiKSAqLwogICBjYXNlIDB4MDAwMDBjMGM6ICAvKiAoTG9jLCJmcl9DQSIpICovCiAgIHsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbSIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhILm1tIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJISCdoJ21tIikpIHJldHVybiBUUlVFOwogICAgcmV0dXJuIFRSVUU7CiAgIH0KCiAgIGNhc2UgMHgwMDAwMDgwOTogIC8qIChMb2MsImVuX1VLIikgKi8KICAgY2FzZSAweDAwMDAwYzA5OiAgLyogKExvYywiZW5fQVUiKSAqLyAKICAgY2FzZSAweDAwMDAxNDA5OiAgLyogKExvYywiZW5fTloiKSAqLwogICBjYXNlIDB4MDAwMDE4MDk6ICAvKiAoTG9jLCJlbl9JRSIpICovIAogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoIkhIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJIOm1tOnNzIikpIHJldHVybiBUUlVFOwogICAgcmV0dXJuIFRSVUU7CiAgIH0KCiAgIGNhc2UgMHgwMDAwMWMwOTogIC8qIChMb2MsImVuX1pBIikgKi8gICAKICAgY2FzZSAweDAwMDAyODA5OiAgLyogKExvYywiZW5fQloiKSAqLwogICBjYXNlIDB4MDAwMDJjMDk6ICAvKiAoTG9jLCJlbl9UVCIpICovIAogICB7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImg6bW06c3MgdHQiKSkgcmV0dXJuIFRSVUU7CiAgICBpZighKCpscFRpbWVGbXRFbnVtUHJvYykoImhoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOyAKICAgIHJldHVybiBUUlVFOyAgCiAgIH0KCiAgIGRlZmF1bHQ6ICAvKiBkZWZhdWx0IHRvIFVTIHN0eWxlICJlbl9VUyIgKi8gICAKICAgewogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoOm1tOnNzIHR0IikpIHJldHVybiBUUlVFOwogICAgaWYoISgqbHBUaW1lRm10RW51bVByb2MpKCJoaDptbTpzcyB0dCIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSDptbTpzcyIpKSByZXR1cm4gVFJVRTsKICAgIGlmKCEoKmxwVGltZUZtdEVudW1Qcm9jKSgiSEg6bW06c3MiKSkgcmV0dXJuIFRSVUU7CiAgICByZXR1cm4gVFJVRTsKICAgfQogfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1UaW1lRm9ybWF0c1cJKEtFUk5FTDMyLjIxMSkKICovCkJPT0wgV0lOQVBJIEVudW1UaW1lRm9ybWF0c1coCiAgVElNRUZNVF9FTlVNUFJPQ1cgbHBUaW1lRm10RW51bVByb2MsIExDSUQgTG9jYWxlLCBEV09SRCBkd0ZsYWdzKQp7CiAgRklYTUUoIiglcCwlbGQsJWxkKTogc3R1YlxuIiwgbHBUaW1lRm10RW51bVByb2MsIExvY2FsZSwgZHdGbGFncyk7CiAgU2V0TGFzdEVycm9yKEVSUk9SX0NBTExfTk9UX0lNUExFTUVOVEVEKTsKICByZXR1cm4gRkFMU0U7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGp1c3QgbG9jYWxseSAhCiAqICBEZXNjcmlwdGlvbjogSW52ZXJ0cyBhIHN0cmluZy4KICovIApzdGF0aWMgdm9pZCBPTEVfSW52ZXJ0U3RyaW5nKGNoYXIqIHN0cmluZykKeyAgICAKICAgIGNoYXIgICAgc1RtcEFycmF5WzEyOF07CiAgICBJTlQgICAgIGNvdW50ZXIsIGkgPSAwOwoKICAgIGZvciAoY291bnRlciA9IHN0cmxlbihzdHJpbmcpOyBjb3VudGVyID4gMDsgY291bnRlci0tKQogICAgewogICAgICAgIG1lbWNweShzVG1wQXJyYXkgKyBpLCBzdHJpbmcgKyBjb3VudGVyLTEsIDEpOwogICAgICAgIGkrKzsKICAgIH0KICAgIG1lbWNweShzVG1wQXJyYXkgKyBpLCAiXDAiLCAxKTsKICAgIHN0cmNweShzdHJpbmcsIHNUbXBBcnJheSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBqdXN0IGxvY2FsbHkgIQogKiAgRGVzY3JpcHRpb246IFRlc3QgaWYgdGhlIGdpdmVuIHN0cmluZyAocHNOdW1iZXIpIGlzIHZhbGlkIG9yIG5vdC4KICogICAgICAgICAgICAgICBUaGUgdmFsaWQgY2hhcmFjdGVycyBhcmUgdGhlIGZvbGxvd2luZzoKICogICAgICAgICAgICAgICAtIENoYXJhY3RlcnMgJzAnIHRocm91Z2ggJzknLiAKICogICAgICAgICAgICAgICAtIE9uZSBkZWNpbWFsIHBvaW50IChkb3QpIGlmIHRoZSBudW1iZXIgaXMgYSBmbG9hdGluZy1wb2ludCB2YWx1ZS4gCiAqICAgICAgICAgICAgICAgLSBBIG1pbnVzIHNpZ24gaW4gdGhlIGZpcnN0IGNoYXJhY3RlciBwb3NpdGlvbiBpZiB0aGUgbnVtYmVyIGlzIAogKiAgICAgICAgICAgICAgICAgYSBuZWdhdGl2ZSB2YWx1ZS4KICogICAgICAgICAgICAgIElmIHRoZSBmdW5jdGlvbiBzdWNjZWVkcywgcHNCZWZvcmUvcHNBZnRlciB3aWxsIHBvaW50IHRvIHRoZSBzdHJpbmcKICogICAgICAgICAgICAgIG9uIHRoZSByaWdodC9sZWZ0IG9mIHRoZSBkZWNpbWFsIHN5bWJvbC4gcGJOZWdhdGl2ZSBpbmRpY2F0ZXMgaWYgdGhlIAogKiAgICAgICAgICAgICAgbnVtYmVyIGlzIG5lZ2F0aXZlLgogKi8Kc3RhdGljIElOVCBPTEVfR2V0TnVtYmVyQ29tcG9uZW50cyhjaGFyKiBwSW5wdXQsIGNoYXIqIHBzQmVmb3JlLCBjaGFyKiBwc0FmdGVyLCBCT09MKiBwYk5lZ2F0aXZlKQp7CmNoYXIJc051bWJlclNldFtdID0gIjAxMjM0NTY3ODkiOwpCT09MCWJJbkRlY2ltYWwgPSBGQUxTRTsKCgkvKiBUZXN0IGlmIHdlIGRvIGhhdmUgYSBtaW51cyBzaWduICovCglpZiAoICpwSW5wdXQgPT0gJy0nICkKCXsKCQkqcGJOZWdhdGl2ZSA9IFRSVUU7CgkJcElucHV0Kys7IC8qIEp1bXAgdG8gdGhlIG5leHQgY2hhcmFjdGVyLiAqLwoJfQoJCgl3aGlsZSgqcElucHV0ICE9ICdcMCcpCgl7CgkJLyogRG8gd2UgaGF2ZSBhIHZhbGlkIG51bWVyaWMgY2hhcmFjdGVyICovCgkJaWYgKCBzdHJjaHIoc051bWJlclNldCwgKnBJbnB1dCkgIT0gTlVMTCApCgkJewoJCQlpZiAoYkluRGVjaW1hbCA9PSBUUlVFKQogICAgICAgICAgICAgICAgKnBzQWZ0ZXIrKyA9ICpwSW5wdXQ7CgkJCWVsc2UKICAgICAgICAgICAgICAgICpwc0JlZm9yZSsrID0gKnBJbnB1dDsKCQl9CgkJZWxzZQoJCXsKCQkJLyogSXMgdGhpcyBhIGRlY2ltYWwgcG9pbnQgKGRvdCkgKi8KCQkJaWYgKCAqcElucHV0ID09ICcuJyApCgkJCXsKCQkJCS8qIElzIGl0IHRoZSBmaXJzdCB0aW1lIHdlIGZpbmQgaXQgKi8KCQkJCWlmICgoYkluRGVjaW1hbCA9PSBGQUxTRSkpCgkJCQkJYkluRGVjaW1hbCA9IFRSVUU7CgkJCQllbHNlCgkJCQkJcmV0dXJuIC0xOyAvKiBFUlJPUjogSW52YWxpZCBwYXJhbWV0ZXIgKi8KCQkJfQoJCQllbHNlCgkJCXsKCQkJCS8qIEl0J3MgbmVpdGhlciBhIG51bWVyaWMgY2hhcmFjdGVyLCBub3IgYSBkZWNpbWFsIHBvaW50LgoJCQkJICogVGh1cywgcmV0dXJuIGFuIGVycm9yLgogICAgICAgICAgICAgICAgICovCgkJCQlyZXR1cm4gLTE7CgkJCX0KCQl9CiAgICAgICAgcElucHV0Kys7Cgl9CgkKCS8qIEFkZCBhbiBFbmQgb2YgTGluZSBjaGFyYWN0ZXIgdG8gdGhlIG91dHB1dCBidWZmZXJzICovCgkqcHNCZWZvcmUgPSAnXDAnOwoJKnBzQWZ0ZXIgPSAnXDAnOwoKCXJldHVybiAwOyAKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQganVzdCBsb2NhbGx5ICEKICogIERlc2NyaXB0aW9uOiBBIG51bWJlciBjb3VsZCBiZSBmb3JtYXR0ZWQgdXNpbmcgZGlmZmVyZW50IG51bWJlcnMgCiAqICAgICAgICAgICAgICAgb2YgImRpZ2l0cyBpbiBncm91cCIgKGV4YW1wbGU6IDQ7MzsyOzApLgogKiAgICAgICAgICAgICAgIFRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgdGhpcyBmdW5jdGlvbiBpcyBhbiBhcnJheQogKiAgICAgICAgICAgICAgIGNvbnRhaW5pbmcgdGhlIHJ1bGUgdG8gYmUgdXNlZC4gSXQncyBmb3JtYXQgaXMgdGhlIGZvbGxvd2luZzoKICogICAgICAgICAgICAgICB8TkRHfERHMXxERzJ8Li4ufDB8CiAqICAgICAgICAgICAgICAgd2hlcmUgTkRHIGlzIHRoZSBudW1iZXIgb2YgdXNlZCAiZGlnaXRzIGluIGdyb3VwIiBhbmQgREcxLCBERzIsCiAqICAgICAgICAgICAgICAgYXJlIHRoZSBjb3JyZXNwb25kaW5nICJkaWdpdHMgaW4gZ3JvdXAiLgogKiAgICAgICAgICAgICAgIFRodXMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZ3JvdXBpbmcgdmFsdWUgaW4gdGhlIGFycmF5CiAqICAgICAgICAgICAgICAgcG9pbnRlZCBieSB0aGUgc2Vjb25kIHBhcmFtZXRlci4KICovCnN0YXRpYyBJTlQgT0xFX0dldEdyb3VwaW5nKGNoYXIqIHNSdWxlLCBJTlQgaW5kZXgpCnsKICAgIGNoYXIgICAgc0RhdGFbMl0sIHNSdWxlU2l6ZVsyXTsKICAgIElOVCAgICAgbkRhdGEsIG5SdWxlU2l6ZTsKCiAgICBtZW1jcHkoc1J1bGVTaXplLCBzUnVsZSwgMSk7CiAgICBtZW1jcHkoc1J1bGVTaXplKzEsICJcMCIsIDEpOwogICAgblJ1bGVTaXplID0gYXRvaShzUnVsZVNpemUpOwoKICAgIGlmIChpbmRleCA+IDAgJiYgaW5kZXggPCBuUnVsZVNpemUpCiAgICB7CiAgICAgICAgbWVtY3B5KHNEYXRhLCBzUnVsZStpbmRleCwgMSk7CiAgICAgICAgbWVtY3B5KHNEYXRhKzEsICJcMCIsIDEpOwogICAgICAgIG5EYXRhID0gYXRvaShzRGF0YSk7ICAgICAgICAgICAgCiAgICB9CiAgICAgICAgCiAgICBlbHNlCiAgICB7CiAgICAgICAgbWVtY3B5KHNEYXRhLCBzUnVsZStuUnVsZVNpemUtMSwgMSk7CiAgICAgICAgbWVtY3B5KHNEYXRhKzEsICJcMCIsIDEpOwogICAgICAgIG5EYXRhID0gYXRvaShzRGF0YSk7ICAgICAgICAgICAgCiAgICB9CiAgICAKICAgIHJldHVybiBuRGF0YTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXRBCShLRVJORUwzMi4zNTUpCiAqLwpJTlQgV0lOQVBJIEdldE51bWJlckZvcm1hdEEoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENTVFIgbHB2YWx1ZSwgICBjb25zdCBOVU1CRVJGTVRBICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFNUUiBscE51bWJlclN0ciwgaW50IGNjaE51bWJlcikKewogICAgY2hhciAgIHNOdW1iZXJEaWdpdHNbM10sIHNEZWNpbWFsU3ltYm9sWzVdLCBzRGlnaXRzSW5Hcm91cFsxMV0sIHNEaWdpdEdyb3VwU3ltYm9sWzVdLCBzSUxaZXJvWzJdOwogICAgSU5UICAgIG5OdW1iZXJEaWdpdHMsIG5OdW1iZXJEZWNpbWFsLCBpLCBqLCBuQ291bnRlciwgblN0ZXAsIG5SdWxlSW5kZXgsIG5Hcm91cGluZywgbkRpZ2l0cywgcmV0VmFsLCBuTFo7CiAgICBjaGFyICAgc051bWJlclsxMjhdLCBzRGVzdGluYXRpb25bMTI4XSwgc0RpZ2l0c0FmdGVyRGVjaW1hbFsxMF0sIHNEaWdpdHNCZWZvcmVEZWNpbWFsWzEyOF07CiAgICBjaGFyICAgc1J1bGVbMTBdLCBzU2VtaUNvbHVtbltdPSI7Iiwgc0J1ZmZlcls1XSwgc05lZ051bWJlclsyXTsgICAgCiAgICBjaGFyICAgKnBTdHIgPSBOVUxMLCAqcFRtcFN0ciA9IE5VTEw7CiAgICBMQ0lEICAgc3lzdGVtRGVmYXVsdExDSUQ7CiAgICBCT09MICAgYk5lZ2F0aXZlID0gRkFMU0U7CiAgICBlbnVtICAgT3BlcmF0aW9ucyAKICAgIHsKICAgICAgICBVU0VfUEFSQU1FVEVSLAogICAgICAgIFVTRV9MT0NBTEVJTkZPLAogICAgICAgIFVTRV9TWVNURU1ERUZBVUxULAogICAgICAgIFJFVFVSTl9FUlJPUgogICAgfSB1c2VkX29wZXJhdGlvbjsKCiAgICBzdHJuY3B5KHNOdW1iZXIsIGxwdmFsdWUsIDEyOCk7CiAgICBzTnVtYmVyWzEyN10gPSAnXDAnOwoKICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgdmFsaWQgaW5wdXQgc3RyaW5nLCBnZXQgdGhlIG51bWJlcgogICAgICogb2YgZGlnaXRzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGRlY2ltYWwgc3ltYm9sLCBhbmQgY2hlY2sKICAgICAqIGlmIHRoaXMgaXMgYSBuZWdhdGl2ZSBudW1iZXIuCiAgICAgKi8KICAgIGlmICggT0xFX0dldE51bWJlckNvbXBvbmVudHMoc051bWJlciwgc0RpZ2l0c0JlZm9yZURlY2ltYWwsIHNEaWdpdHNBZnRlckRlY2ltYWwsICZiTmVnYXRpdmUpICE9IC0xKQogICAgewogICAgICAgIG5OdW1iZXJEZWNpbWFsID0gc3RybGVuKHNEaWdpdHNCZWZvcmVEZWNpbWFsKTsKICAgICAgICBuRGlnaXRzID0gc3RybGVuKHNEaWdpdHNBZnRlckRlY2ltYWwpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgLyogV2hpY2ggc291cmNlIHdpbGwgd2UgdXNlIHRvIGZvcm1hdCB0aGUgc3RyaW5nICovCiAgICB1c2VkX29wZXJhdGlvbiA9IFJFVFVSTl9FUlJPUjsKICAgIGlmIChscEZvcm1hdCAhPSBOVUxMKQogICAgewogICAgICAgIGlmIChkd2ZsYWdzID09IDApCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1BBUkFNRVRFUjsgCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKGR3ZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX0xPQ0FMRUlORk87CiAgICAgICAgZWxzZQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9TWVNURU1ERUZBVUxUOwogICAgfQoKICAgIC8qIExvYWQgdGhlIGZpZWxkcyB3ZSBuZWVkICovCiAgICBzd2l0Y2godXNlZF9vcGVyYXRpb24pCiAgICB7CiAgICBjYXNlIFVTRV9MT0NBTEVJTkZPOgogICAgICAgIEdldExvY2FsZUluZm9BKGxvY2FsZSwgTE9DQUxFX0lESUdJVFMsIHNOdW1iZXJEaWdpdHMsIHNpemVvZihzTnVtYmVyRGlnaXRzKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfU0RFQ0lNQUwsIHNEZWNpbWFsU3ltYm9sLCBzaXplb2Yoc0RlY2ltYWxTeW1ib2wpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9TR1JPVVBJTkcsIHNEaWdpdHNJbkdyb3VwLCBzaXplb2Yoc0RpZ2l0c0luR3JvdXApKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9TVEhPVVNBTkQsIHNEaWdpdEdyb3VwU3ltYm9sLCBzaXplb2Yoc0RpZ2l0R3JvdXBTeW1ib2wpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JTFpFUk8sIHNJTFplcm8sIHNpemVvZihzSUxaZXJvKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSU5FR05VTUJFUiwgc05lZ051bWJlciwgc2l6ZW9mKHNOZWdOdW1iZXIpKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVVNFX1BBUkFNRVRFUjoKICAgICAgICBzcHJpbnRmKHNOdW1iZXJEaWdpdHMsICIlZCIsbHBGb3JtYXQtPk51bURpZ2l0cyk7CiAgICAgICAgc3RyY3B5KHNEZWNpbWFsU3ltYm9sLCBscEZvcm1hdC0+bHBEZWNpbWFsU2VwKTsKICAgICAgICBzcHJpbnRmKHNEaWdpdHNJbkdyb3VwLCAiJWQ7MCIsbHBGb3JtYXQtPkdyb3VwaW5nKTsKICAgICAgICBzdHJjcHkoc0RpZ2l0R3JvdXBTeW1ib2wsIGxwRm9ybWF0LT5scFRob3VzYW5kU2VwKTsKICAgICAgICBzcHJpbnRmKHNJTFplcm8sICIlZCIsbHBGb3JtYXQtPkxlYWRpbmdaZXJvKTsKICAgICAgICBzcHJpbnRmKHNOZWdOdW1iZXIsICIlZCIsbHBGb3JtYXQtPk5lZ2F0aXZlT3JkZXIpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBVU0VfU1lTVEVNREVGQVVMVDoKICAgICAgICBzeXN0ZW1EZWZhdWx0TENJRCA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9JRElHSVRTLCBzTnVtYmVyRGlnaXRzLCBzaXplb2Yoc051bWJlckRpZ2l0cykpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfU0RFQ0lNQUwsIHNEZWNpbWFsU3ltYm9sLCBzaXplb2Yoc0RlY2ltYWxTeW1ib2wpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX1NHUk9VUElORywgc0RpZ2l0c0luR3JvdXAsIHNpemVvZihzRGlnaXRzSW5Hcm91cCkpOwogICAgICAgIEdldExvY2FsZUluZm9BKHN5c3RlbURlZmF1bHRMQ0lELCBMT0NBTEVfU1RIT1VTQU5ELCBzRGlnaXRHcm91cFN5bWJvbCwgc2l6ZW9mKHNEaWdpdEdyb3VwU3ltYm9sKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9JTFpFUk8sIHNJTFplcm8sIHNpemVvZihzSUxaZXJvKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9JTkVHTlVNQkVSLCBzTmVnTnVtYmVyLCBzaXplb2Yoc05lZ051bWJlcikpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOwogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIG5OdW1iZXJEaWdpdHMgPSBhdG9pKHNOdW1iZXJEaWdpdHMpOwogICAgCiAgICAvKiBSZW1vdmUgdGhlICI7IiAqLwogICAgaT0wOwogICAgaiA9IDE7CiAgICBmb3IgKG5Db3VudGVyPTA7IG5Db3VudGVyPHN0cmxlbihzRGlnaXRzSW5Hcm91cCk7IG5Db3VudGVyKyspCiAgICB7CiAgICAgICAgaWYgKCBtZW1jbXAoc0RpZ2l0c0luR3JvdXAgKyBuQ291bnRlciwgc1NlbWlDb2x1bW4sIDEpICE9IDAgKQogICAgICAgIHsKICAgICAgICAgICAgbWVtY3B5KHNSdWxlICsgaiwgc0RpZ2l0c0luR3JvdXAgKyBuQ291bnRlciwgMSk7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgaisrOwogICAgICAgIH0KICAgIH0KICAgIHNwcmludGYoc0J1ZmZlciwgIiVkIiwgaSk7CiAgICBtZW1jcHkoc1J1bGUsIHNCdWZmZXIsIDEpOyAvKiBOdW1iZXIgb2YgZGlnaXRzIGluIHRoZSBncm91cHMgKCB1c2VkIGJ5IE9MRV9HZXRHcm91cGluZygpICkgKi8KICAgIG1lbWNweShzUnVsZSArIGosICJcMCIsIDEpOwogICAgCiAgICAvKiBGaXJzdCwgZm9ybWF0IHRoZSBkaWdpdHMgYmVmb3JlIHRoZSBkZWNpbWFsLiAqLwogICAgaWYgKChuTnVtYmVyRGVjaW1hbD4wKSAmJiAoYXRvaShzRGlnaXRzQmVmb3JlRGVjaW1hbCkgIT0gMCkpIAogICAgewogICAgICAgIC8qIFdvcmtpbmcgb24gYW4gaW52ZXJ0ZWQgc3RyaW5nIGlzIGVhc2llciAhICovCiAgICAgICAgT0xFX0ludmVydFN0cmluZyhzRGlnaXRzQmVmb3JlRGVjaW1hbCk7CgogICAgICAgIG5TdGVwID0gbkNvdW50ZXIgPSBpID0gaiA9IDA7CiAgICAgICAgblJ1bGVJbmRleCA9IDE7CiAgICAgICAgbkdyb3VwaW5nID0gT0xFX0dldEdyb3VwaW5nKHNSdWxlLCBuUnVsZUluZGV4KTsKICAgICAgICAKICAgICAgICAvKiBIZXJlLCB3ZSB3aWxsIGxvb3AgdW50aWwgd2UgcmVhY2ggdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgogICAgICAgICAqIEFuIGludGVybmFsIGNvdW50ZXIgKGopIGlzIHVzZWQgaW4gb3JkZXIgdG8ga25vdyB3aGVuIHRvIAogICAgICAgICAqIGluc2VydCB0aGUgImRpZ2l0IGdyb3VwIHN5bWJvbCIuCiAgICAgICAgICovCiAgICAgICAgd2hpbGUgKG5OdW1iZXJEZWNpbWFsID4gMCkKICAgICAgICB7CiAgICAgICAgICAgIGkgPSBuQ291bnRlciArIG5TdGVwOwogICAgICAgICAgICBtZW1jcHkoc0Rlc3RpbmF0aW9uICsgaSwgc0RpZ2l0c0JlZm9yZURlY2ltYWwgKyBuQ291bnRlciwgMSk7CiAgICAgICAgICAgIG5Db3VudGVyKys7CiAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgaWYgKGogPj0gbkdyb3VwaW5nKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBqID0gMDsKICAgICAgICAgICAgICAgIGlmIChuUnVsZUluZGV4IDwgc1J1bGVbMF0pCiAgICAgICAgICAgICAgICAgICAgblJ1bGVJbmRleCsrOwogICAgICAgICAgICAgICAgbkdyb3VwaW5nID0gT0xFX0dldEdyb3VwaW5nKHNSdWxlLCBuUnVsZUluZGV4KTsKICAgICAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24gKyBpKzEsIHNEaWdpdEdyb3VwU3ltYm9sLCBzdHJsZW4oc0RpZ2l0R3JvdXBTeW1ib2wpKTsKICAgICAgICAgICAgICAgIG5TdGVwKz0gc3RybGVuKHNEaWdpdEdyb3VwU3ltYm9sKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbk51bWJlckRlY2ltYWwtLTsKICAgICAgICB9CgogICAgICAgIG1lbWNweShzRGVzdGluYXRpb24gKyBpKzEsICJcMCIsIDEpOwogICAgICAgIC8qIEdldCB0aGUgc3RyaW5nIGluIHRoZSByaWdodCBvcmRlciAhICovCiAgICAgICAgT0xFX0ludmVydFN0cmluZyhzRGVzdGluYXRpb24pOwogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgIG5MWiA9IGF0b2koc0lMWmVybyk7CiAgICAgICAgaWYgKG5MWiAhPSAwKQogICAgICAgIHsgICAgICAgIAogICAgICAgICAgICAvKiBVc2UgMC54eHggaW5zdGVhZCBvZiAueHh4ICovCiAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24sICIwIiwgMSk7CiAgICAgICAgICAgIG1lbWNweShzRGVzdGluYXRpb24rMSwgIlwwIiwgMSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgbWVtY3B5KHNEZXN0aW5hdGlvbiwgIlwwIiwgMSk7CgogICAgIH0KCiAgICAvKiBTZWNvbmQsIGZvcm1hdCB0aGUgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsLiAqLwogICAgaiA9IDA7CiAgICBuQ291bnRlciA9IG5OdW1iZXJEaWdpdHM7CiAgICBpZiAoIChuRGlnaXRzPjApICYmIChwU3RyID0gc3Ryc3RyIChzTnVtYmVyLCAiLiIpKSApCiAgICB7CiAgICAgICAgaSA9IHN0cmxlbihzTnVtYmVyKSAtIHN0cmxlbihwU3RyKSArIDE7ICAgICAgICAKICAgICAgICBzdHJuY3B5ICggc0RpZ2l0c0FmdGVyRGVjaW1hbCwgc051bWJlciArIGksIG5OdW1iZXJEaWdpdHMpOwogICAgICAgIGogPSBzdHJsZW4oc0RpZ2l0c0FmdGVyRGVjaW1hbCk7CiAgICAgICAgaWYgKGogPCBuTnVtYmVyRGlnaXRzKQogICAgICAgICAgICBuQ291bnRlciA9IG5OdW1iZXJEaWdpdHMtajsgICAgICAgICAgICAKICAgIH0KICAgIGZvciAoaT0wO2k8bkNvdW50ZXI7aSsrKQogICAgICAgICBtZW1jcHkoc0RpZ2l0c0FmdGVyRGVjaW1hbCtpK2osICIwIiwgMSk7ICAgIAogICAgbWVtY3B5KHNEaWdpdHNBZnRlckRlY2ltYWwgKyBuTnVtYmVyRGlnaXRzLCAiXDAiLCAxKTsgICAgCgogICAgaSA9IHN0cmxlbihzRGVzdGluYXRpb24pOwogICAgaiA9IHN0cmxlbihzRGlnaXRzQWZ0ZXJEZWNpbWFsKTsKICAgIC8qIEZpbmFsbHksIGNvbnN0cnVjdCB0aGUgcmVzdWx0aW5nIGZvcm1hdHRlZCBzdHJpbmcuICovCiAgICAgICAgCiAgICBmb3IgKG5Db3VudGVyPTA7IG5Db3VudGVyPGk7IG5Db3VudGVyKyspCiAgICAgICAgbWVtY3B5KHNOdW1iZXIgKyBuQ291bnRlciwgc0Rlc3RpbmF0aW9uICsgbkNvdW50ZXIsIDEpOwogICAgICAgCiAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyLCBzRGVjaW1hbFN5bWJvbCwgc3RybGVuKHNEZWNpbWFsU3ltYm9sKSk7CgogICAgZm9yIChpPTA7IGk8ajsgaSsrKQogICAgICAgIG1lbWNweShzTnVtYmVyICsgbkNvdW50ZXIraStzdHJsZW4oc0RlY2ltYWxTeW1ib2wpLCBzRGlnaXRzQWZ0ZXJEZWNpbWFsICsgaSwgMSk7CiAgICBtZW1jcHkoc051bWJlciArIG5Db3VudGVyK2krc3RybGVuKHNEZWNpbWFsU3ltYm9sKSwgIlwwIiwgMSk7CiAgICAgICAgCiAgICAvKiBJcyBpdCBhIG5lZ2F0aXZlIG51bWJlciAqLwogICAgaWYgKGJOZWdhdGl2ZSA9PSBUUlVFKQogICAgewogICAgICAgIGkgPSBhdG9pKHNOZWdOdW1iZXIpOwogICAgICAgIHBTdHIgPSBzRGVzdGluYXRpb247CiAgICAgICAgcFRtcFN0ciA9IHNOdW1iZXI7CiAgICAgICAgc3dpdGNoIChpKQogICAgICAgIHsgICAgICAgICAgCiAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAqcFN0cisrID0gJygnOwogICAgICAgICAgICB3aGlsZSAoKnNOdW1iZXIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgKnBTdHIrKyA9ICcpJzsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGJyZWFrOyAgCiAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAqcFN0cisrID0gJy0nOwogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAqcFN0cisrID0gJy0nOwogICAgICAgICAgICAqcFN0cisrID0gJyAnOwogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA0OgogICAgICAgICAgICB3aGlsZSAoKnBUbXBTdHIgIT0gJ1wwJykKICAgICAgICAgICAgICAgICpwU3RyKysgPSAgKnBUbXBTdHIrKzsKICAgICAgICAgICAgKnBTdHIrKyA9ICcgJzsKICAgICAgICAgICAgKnBTdHIrKyA9ICctJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgd2hpbGUgKCpwVG1wU3RyICE9ICdcMCcpCiAgICAgICAgICAgICAgICAqcFN0cisrID0gICpwVG1wU3RyKys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgICAgICBzdHJjcHkoc0Rlc3RpbmF0aW9uLCBzTnVtYmVyKTsKCiAgICAvKiBJZiBjY2hOdW1iZXIgaXMgemVybywgdGhlbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgb3IgY2hhcmFjdGVycyAKICAgICAqIHJlcXVpcmVkIHRvIGhvbGQgdGhlIGZvcm1hdHRlZCBudW1iZXIgc3RyaW5nCiAgICAgKi8KICAgIGlmIChjY2hOdW1iZXI9PTApCiAgICAgICAgcmV0VmFsID0gc3RybGVuKHNEZXN0aW5hdGlvbikgKyAxOwogICAgZWxzZSAgICAgICAgICAgCiAgICB7CiAgICAgICAgc3RybmNweSAobHBOdW1iZXJTdHIsIHNEZXN0aW5hdGlvbiwgY2NoTnVtYmVyLTEpOwogICAgICAgICoobHBOdW1iZXJTdHIrY2NoTnVtYmVyLTEpID0gJ1wwJzsgICAvKiBlbnN1cmUgd2UgZ290IGEgTlVMTCBhdCB0aGUgZW5kICovCiAgICAgICAgcmV0VmFsID0gc3RybGVuKGxwTnVtYmVyU3RyKTsKICAgIH0KICAgICAgICAgIAogICAgcmV0dXJuIHJldFZhbDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXRXCShLRVJORUwzMi54eHgpCiAqLwpJTlQgV0lOQVBJIEdldE51bWJlckZvcm1hdFcoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENXU1RSIGxwdmFsdWUsICBjb25zdCBOVU1CRVJGTVRXICogbHBGb3JtYXQsCgkJCSAgICAgICBMUFdTVFIgbHBOdW1iZXJTdHIsIGludCBjY2hOdW1iZXIpCnsKIEZJWE1FKCIlczogc3R1Yiwgbm8gcmVmb3JtYXRpbmcgZG9uZVxuIixkZWJ1Z3N0cl93KGxwdmFsdWUpKTsKCiBsc3RyY3B5blcoIGxwTnVtYmVyU3RyLCBscHZhbHVlLCBjY2hOdW1iZXIgKTsKIHJldHVybiBjY2hOdW1iZXI/IHN0cmxlblcoIGxwTnVtYmVyU3RyICkgOiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldEN1cnJlbmN5Rm9ybWF0QQkoS0VSTkVMMzIuMzAyKQogKi8KSU5UIFdJTkFQSSBHZXRDdXJyZW5jeUZvcm1hdEEoTENJRCBsb2NhbGUsIERXT1JEIGR3ZmxhZ3MsCgkJCSAgICAgICBMUENTVFIgbHB2YWx1ZSwgICBjb25zdCBDVVJSRU5DWUZNVEEgKiBscEZvcm1hdCwKCQkJICAgICAgIExQU1RSIGxwQ3VycmVuY3lTdHIsIGludCBjY2hDdXJyZW5jeSkKewogICAgVUlOVCAgIG5Qb3NPcmRlciwgbk5lZ09yZGVyOwogICAgSU5UICAgIHJldFZhbDsKICAgIGNoYXIgICBzRGVzdGluYXRpb25bMTI4XSwgc05lZ09yZGVyWzhdLCBzUG9zT3JkZXJbOF0sIHNDdXJyZW5jeVN5bWJvbFs4XTsKICAgIGNoYXIgICAqcERlc3RpbmF0aW9uID0gc0Rlc3RpbmF0aW9uOwogICAgY2hhciAgIHNOdW1iZXJGb3JtYXRlZFsxMjhdOwogICAgY2hhciAgICpwTnVtYmVyRm9ybWF0ZWQgPSBzTnVtYmVyRm9ybWF0ZWQ7CiAgICBMQ0lEICAgc3lzdGVtRGVmYXVsdExDSUQ7CiAgICBCT09MICAgYklzUG9zaXRpdmUgPSBGQUxTRSwgYlZhbGlkRm9ybWF0ID0gRkFMU0U7CiAgICBlbnVtICAgT3BlcmF0aW9ucyAKICAgIHsKICAgICAgICBVU0VfUEFSQU1FVEVSLAogICAgICAgIFVTRV9MT0NBTEVJTkZPLAogICAgICAgIFVTRV9TWVNURU1ERUZBVUxULAogICAgICAgIFJFVFVSTl9FUlJPUgogICAgfSB1c2VkX29wZXJhdGlvbjsKCiAgICBOVU1CRVJGTVRBICBudW1iZXJGbXQ7CgogICAgLyogV2hpY2ggc291cmNlIHdpbGwgd2UgdXNlIHRvIGZvcm1hdCB0aGUgc3RyaW5nICovCiAgICB1c2VkX29wZXJhdGlvbiA9IFJFVFVSTl9FUlJPUjsKICAgIGlmIChscEZvcm1hdCAhPSBOVUxMKQogICAgewogICAgICAgIGlmIChkd2ZsYWdzID09IDApCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX1BBUkFNRVRFUjsgCiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKGR3ZmxhZ3MgJiBMT0NBTEVfTk9VU0VST1ZFUlJJREUpCiAgICAgICAgICAgIHVzZWRfb3BlcmF0aW9uID0gVVNFX0xPQ0FMRUlORk87CiAgICAgICAgZWxzZQogICAgICAgICAgICB1c2VkX29wZXJhdGlvbiA9IFVTRV9TWVNURU1ERUZBVUxUOwogICAgfQoKICAgIC8qIExvYWQgdGhlIGZpZWxkcyB3ZSBuZWVkICovCiAgICBzd2l0Y2godXNlZF9vcGVyYXRpb24pCiAgICB7CiAgICBjYXNlIFVTRV9MT0NBTEVJTkZPOiAgICAgICAgCiAgICAgICAgLyogU3BlY2lmaWMgdG8gQ1VSUkVOQ1lGTVRBKi8KICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9JTkVHQ1VSUiwgc05lZ09yZGVyLCBzaXplb2Yoc05lZ09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0EobG9jYWxlLCBMT0NBTEVfSUNVUlJFTkNZLCBzUG9zT3JkZXIsIHNpemVvZihzUG9zT3JkZXIpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShsb2NhbGUsIExPQ0FMRV9TQ1VSUkVOQ1ksIHNDdXJyZW5jeVN5bWJvbCwgc2l6ZW9mKHNDdXJyZW5jeVN5bWJvbCkpOwogICAgICAgIAogICAgICAgIG5Qb3NPcmRlciA9IGF0b2koc1Bvc09yZGVyKTsKICAgICAgICBuTmVnT3JkZXIgPSBhdG9pKHNOZWdPcmRlcik7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFVTRV9QQVJBTUVURVI6ICAgICAgICAKICAgICAgICAvKiBTcGVjaWZpYyB0byBDVVJSRU5DWUZNVEEqLwogICAgICAgIG5OZWdPcmRlciA9IGxwRm9ybWF0LT5OZWdhdGl2ZU9yZGVyOwogICAgICAgIG5Qb3NPcmRlciA9IGxwRm9ybWF0LT5Qb3NpdGl2ZU9yZGVyOwogICAgICAgIHN0cmNweShzQ3VycmVuY3lTeW1ib2wsIGxwRm9ybWF0LT5scEN1cnJlbmN5U3ltYm9sKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVVNFX1NZU1RFTURFRkFVTFQ6CiAgICAgICAgc3lzdGVtRGVmYXVsdExDSUQgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOyAgICAgICAgCiAgICAgICAgLyogU3BlY2lmaWMgdG8gQ1VSUkVOQ1lGTVRBKi8KICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lORUdDVVJSLCBzTmVnT3JkZXIsIHNpemVvZihzTmVnT3JkZXIpKTsKICAgICAgICBHZXRMb2NhbGVJbmZvQShzeXN0ZW1EZWZhdWx0TENJRCwgTE9DQUxFX0lDVVJSRU5DWSwgc1Bvc09yZGVyLCBzaXplb2Yoc1Bvc09yZGVyKSk7CiAgICAgICAgR2V0TG9jYWxlSW5mb0Eoc3lzdGVtRGVmYXVsdExDSUQsIExPQ0FMRV9TQ1VSUkVOQ1ksIHNDdXJyZW5jeVN5bWJvbCwgc2l6ZW9mKHNDdXJyZW5jeVN5bWJvbCkpOwogICAgICAgIAogICAgICAgIG5Qb3NPcmRlciA9IGF0b2koc1Bvc09yZGVyKTsKICAgICAgICBuTmVnT3JkZXIgPSBhdG9pKHNOZWdPcmRlcik7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAKICAgIC8qIENvbnN0cnVjdCBhIHRlbXBvcmFyeSBudW1iZXIgZm9ybWF0IHN0cnVjdHVyZSAqLwogICAgaWYgKGxwRm9ybWF0ICE9IE5VTEwpCiAgICB7CiAgICAgICAgbnVtYmVyRm10Lk51bURpZ2l0cyAgICAgPSBscEZvcm1hdC0+TnVtRGlnaXRzOwogICAgICAgIG51bWJlckZtdC5MZWFkaW5nWmVybyAgID0gbHBGb3JtYXQtPkxlYWRpbmdaZXJvOwogICAgICAgIG51bWJlckZtdC5Hcm91cGluZyAgICAgID0gbHBGb3JtYXQtPkdyb3VwaW5nOwogICAgICAgIG51bWJlckZtdC5OZWdhdGl2ZU9yZGVyID0gMDsKICAgICAgICBudW1iZXJGbXQubHBEZWNpbWFsU2VwID0gbHBGb3JtYXQtPmxwRGVjaW1hbFNlcDsKICAgICAgICBudW1iZXJGbXQubHBUaG91c2FuZFNlcCA9IGxwRm9ybWF0LT5scFRob3VzYW5kU2VwOwogICAgICAgIGJWYWxpZEZvcm1hdCA9IFRSVUU7CiAgICB9CgogICAgLyogTWFrZSBhIGNhbGwgdG8gR2V0TnVtYmVyRm9ybWF0QSgpICovCiAgICBpZiAoKmxwdmFsdWUgPT0gJy0nKQogICAgewogICAgICAgIGJJc1Bvc2l0aXZlID0gRkFMU0U7CiAgICAgICAgcmV0VmFsID0gR2V0TnVtYmVyRm9ybWF0QShsb2NhbGUsMCxscHZhbHVlKzEsKGJWYWxpZEZvcm1hdCk/Jm51bWJlckZtdDpOVUxMLHBOdW1iZXJGb3JtYXRlZCwxMjgpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGJJc1Bvc2l0aXZlID0gVFJVRTsKICAgICAgICByZXRWYWwgPSBHZXROdW1iZXJGb3JtYXRBKGxvY2FsZSwwLGxwdmFsdWUsKGJWYWxpZEZvcm1hdCk/Jm51bWJlckZtdDpOVUxMLHBOdW1iZXJGb3JtYXRlZCwxMjgpOwogICAgfQogICAgICAgIAogICAgaWYgKHJldFZhbCA9PSAwKQogICAgICAgIHJldHVybiAwOwoKICAgIC8qIGNvbnN0cnVjdCB0aGUgZm9ybWF0dGVkIHN0cmluZyAqLwogICAgaWYgKGJJc1Bvc2l0aXZlKQogICAgewogICAgICAgIHN3aXRjaCAoblBvc09yZGVyKQogICAgICAgIHsKICAgICAgICBjYXNlIDA6ICAgLyogUHJlZml4LCBubyBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAxOiAgIC8qIFN1ZmZpeCwgbm8gc2VwYXJhdGlvbiAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjogICAvKiBQcmVmaXgsIDEgY2hhciBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzogICAvKiBTdWZmaXgsIDEgY2hhciBzZXBhcmF0aW9uICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgIC8qIG5lZ2F0aXZlIG51bWJlciAqLwogICAgewogICAgICAgIHN3aXRjaCAobk5lZ09yZGVyKQogICAgICAgIHsKICAgICAgICBjYXNlIDA6ICAgLyogZm9ybWF0OiAoJDEuMSkgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICIoIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTogICAvKiBmb3JtYXQ6IC0kMS4xICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjogICAvKiBmb3JtYXQ6ICQtMS4xICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzogICAvKiBmb3JtYXQ6ICQxLjEtICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDogICAvKiBmb3JtYXQ6ICgxLjEkKSAqLwogICAgICAgICAgICBzdHJjcHkgKHBEZXN0aW5hdGlvbiwgIigiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIikiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA1OiAgIC8qIGZvcm1hdDogLTEuMSQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBwTnVtYmVyRm9ybWF0ZWQpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA2OiAgIC8qIGZvcm1hdDogMS4xLSQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA3OiAgIC8qIGZvcm1hdDogMS4xJC0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA4OiAgIC8qIGZvcm1hdDogLTEuMSAkICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIgIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDk6ICAgLyogZm9ybWF0OiAtJCAxLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCBzQ3VycmVuY3lTeW1ib2wpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTA6ICAgLyogZm9ybWF0OiAxLjEgJC0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTE6ICAgLyogZm9ybWF0OiAkIDEuMS0gKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICItIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTI6ICAgLyogZm9ybWF0OiAkIC0xLjEgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIi0iKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTM6ICAgLyogZm9ybWF0OiAxLjEtICQgKi8KICAgICAgICAgICAgc3RyY3B5IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiLSIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgIiAiKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTQ6ICAgLyogZm9ybWF0OiAoJCAxLjEpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOyAKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHNDdXJyZW5jeVN5bWJvbCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgcE51bWJlckZvcm1hdGVkKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTU6ICAgLyogZm9ybWF0OiAoMS4xICQpICovCiAgICAgICAgICAgIHN0cmNweSAocERlc3RpbmF0aW9uLCAiKCIpOyAKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sIHBOdW1iZXJGb3JtYXRlZCk7CiAgICAgICAgICAgIHN0cmNhdCAocERlc3RpbmF0aW9uLCAiICIpOwogICAgICAgICAgICBzdHJjYXQgKHBEZXN0aW5hdGlvbiwgc0N1cnJlbmN5U3ltYm9sKTsKICAgICAgICAgICAgc3RyY2F0IChwRGVzdGluYXRpb24sICIpIik7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX1BBUkFNRVRFUik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoY2NoQ3VycmVuY3kgPT0gMCkKICAgICAgICByZXR1cm4gc3RybGVuKHBEZXN0aW5hdGlvbikgKyAxOwoKICAgIGVsc2UKICAgIHsKICAgICAgICBzdHJuY3B5IChscEN1cnJlbmN5U3RyLCBwRGVzdGluYXRpb24sIGNjaEN1cnJlbmN5LTEpOwogICAgICAgICoobHBDdXJyZW5jeVN0citjY2hDdXJyZW5jeS0xKSA9ICdcMCc7ICAgLyogZW5zdXJlIHdlIGdvdCBhIE5VTEwgYXQgdGhlIGVuZCAqLwogICAgICAgIHJldHVybiAgc3RybGVuKGxwQ3VycmVuY3lTdHIpOwogICAgfSAgICAKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRDdXJyZW5jeUZvcm1hdFcJKEtFUk5FTDMyLjMwMykKICovCklOVCBXSU5BUEkgR2V0Q3VycmVuY3lGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBkd2ZsYWdzLAoJCQkgICAgICAgTFBDV1NUUiBscHZhbHVlLCAgIGNvbnN0IENVUlJFTkNZRk1UVyAqIGxwRm9ybWF0LAoJCQkgICAgICAgTFBXU1RSIGxwQ3VycmVuY3lTdHIsIGludCBjY2hDdXJyZW5jeSkKewogICAgRklYTUUoIlRoaXMgQVBJIGZ1bmN0aW9uIGlzIE5PVCBpbXBsZW1lbnRlZCAhXG4iKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlPTEUyTkxTX0NoZWNrTG9jYWxlCVtpbnRlcm5dCiAqLyAKc3RhdGljIExDSUQgT0xFMk5MU19DaGVja0xvY2FsZSAoTENJRCBsb2NhbGUpCnsKCWlmICghbG9jYWxlKSAKCXsgbG9jYWxlID0gTE9DQUxFX1NZU1RFTV9ERUZBVUxUOwoJfQogIAoJaWYgKGxvY2FsZSA9PSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQpIAogIAl7IHJldHVybiBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJfSAKCWVsc2UgaWYgKGxvY2FsZSA9PSBMT0NBTEVfVVNFUl9ERUZBVUxUKSAKCXsgcmV0dXJuIEdldFVzZXJEZWZhdWx0TENJRCgpOwoJfQoJZWxzZQoJeyByZXR1cm4gbG9jYWxlOwoJfQp9Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUdldFRpbWVGb3JtYXRBCVtLRVJORUwzMi40MjJdCiAqIE1ha2VzIGFuIEFTQ0lJIHN0cmluZyBvZiB0aGUgdGltZQogKgogKiBGb3JtYXRzIGRhdGUgYWNjb3JkaW5nIHRvIGZvcm1hdCwgIG9yIGxvY2FsZSBkZWZhdWx0IGlmIGZvcm1hdCBpcwogKiBOVUxMLiBUaGUgZm9ybWF0IGNvbnNpc3RzIG9mIGxpdGVyYWwgY2hhcmFjdGVycyBhbmQgZmllbGRzIGFzIGZvbGxvd3M6CiAqCiAqIGggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgxMi1ob3VyKQogKiBoaCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBIICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICogSEggaG91cnMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogbSAgbWludXRlcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBtbSBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHMgIHNlY29uZHMgd2l0aCBubyBsZWFkaW5nIHplcm8KICogc3Mgc2Vjb25kcyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiB0ICB0aW1lIG1hcmtlciAoQSBvciBQKQogKiB0dCB0aW1lIG1hcmtlciAoQU0sIFBNKQogKgogKi8KSU5UIFdJTkFQSSAKR2V0VGltZUZvcm1hdEEoTENJRCBsb2NhbGUsICAgICAgICAvKiBpbiAgKi8KCQkgRFdPUkQgZmxhZ3MsICAgICAgICAvKiBpbiAgKi8KCQkgTFBTWVNURU1USU1FIHh0aW1lLCAvKiBpbiAgKi8gCgkJIExQQ1NUUiBmb3JtYXQsICAgICAgLyogaW4gICovCgkJIExQU1RSIHRpbWVzdHIsICAgICAgLyogb3V0ICovCgkJIElOVCB0aW1lbGVuICAgICAgIC8qIGluICAqLykgCnsgY2hhciBmb3JtYXRfYnVmWzQwXTsKICBMUENTVFIgdGhpc2Zvcm1hdDsKICBTWVNURU1USU1FIHQ7CiAgTFBTWVNURU1USU1FIHRoaXN0aW1lOwogIExDSUQgdGhpc2xvY2FsZT0wOwogIERXT1JEIHRoaXNmbGFncz1MT0NBTEVfU1RJTUVGT1JNQVQ7IC8qIHN0YW5kYXJ0IHRpbWVmb3JtYXQgKi8KICBJTlQgcmV0OwogICAgCiAgVFJBQ0UoIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIixsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LHRpbWVzdHIsdGltZWxlbik7CgogIHRoaXNsb2NhbGUgPSBPTEUyTkxTX0NoZWNrTG9jYWxlICggbG9jYWxlICk7CgogIGlmICggZmxhZ3MgJiAoVElNRV9OT1RJTUVNQVJLRVIgfCBUSU1FX0ZPUkNFMjRIT1VSRk9STUFUICkpCiAgeyBGSVhNRSgiVElNRV9OT1RJTUVNQVJLRVIgb3IgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCBub3QgaW1wbGVtZW50ZWRcbiIpOwogIH0KICAKICBmbGFncyAmPSAoVElNRV9OT1NFQ09ORFMgfCBUSU1FX05PTUlOVVRFU09SU0VDT05EUyk7IC8qIG1hc2sgZm9yIE9MRV9HZXRGb3JtYXRBKi8KCiAgaWYgKGZvcm1hdCA9PSBOVUxMKSAKICB7IGlmIChmbGFncyAmIExPQ0FMRV9OT1VTRVJPVkVSUklERSkgIC8qdXNlIHN5c3RlbSBkZWZhdWx0Ki8KICAgIHsgdGhpc2xvY2FsZSA9IEdldFN5c3RlbURlZmF1bHRMQ0lEKCk7CiAgICB9CiAgICBHZXRMb2NhbGVJbmZvQSh0aGlzbG9jYWxlLCB0aGlzZmxhZ3MsIGZvcm1hdF9idWYsIHNpemVvZihmb3JtYXRfYnVmKSk7CiAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9CiAgZWxzZSAKICB7IHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfQogIAogIGlmICh4dGltZSA9PSBOVUxMKSAvKiBOVUxMIG1lYW5zIHVzZSB0aGUgY3VycmVudCBsb2NhbCB0aW1lKi8KICB7IEdldExvY2FsVGltZSgmdCk7CiAgICB0aGlzdGltZSA9ICZ0OwogIH0gCiAgZWxzZQogIHsgdGhpc3RpbWUgPSB4dGltZTsKICB9CiAgcmV0ID0gT0xFX0dldEZvcm1hdEEodGhpc2xvY2FsZSwgdGhpc2ZsYWdzLCBmbGFncywgdGhpc3RpbWUsIHRoaXNmb3JtYXQsCiAgCQkJIHRpbWVzdHIsIHRpbWVsZW4pOwogIHJldHVybiByZXQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQlHZXRUaW1lRm9ybWF0VwlbS0VSTkVMMzIuNDIzXQogKiBNYWtlcyBhIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSB0aW1lCiAqLwpJTlQgV0lOQVBJIApHZXRUaW1lRm9ybWF0VyhMQ0lEIGxvY2FsZSwgICAgICAgIC8qIGluICAqLwoJCSBEV09SRCBmbGFncywgICAgICAgIC8qIGluICAqLwoJCSBMUFNZU1RFTVRJTUUgeHRpbWUsIC8qIGluICAqLyAKCQkgTFBDV1NUUiBmb3JtYXQsICAgICAvKiBpbiAgKi8KCQkgTFBXU1RSIHRpbWVzdHIsICAgICAvKiBvdXQgKi8KCQkgSU5UIHRpbWVsZW4gICAgICAgLyogaW4gICovKSAKewlXQ0hBUiBmb3JtYXRfYnVmWzQwXTsKCUxQQ1dTVFIgdGhpc2Zvcm1hdDsKCVNZU1RFTVRJTUUgdDsKCUxQU1lTVEVNVElNRSB0aGlzdGltZTsKCUxDSUQgdGhpc2xvY2FsZT0wOwoJRFdPUkQgdGhpc2ZsYWdzPUxPQ0FMRV9TVElNRUZPUk1BVDsgLyogc3RhbmRhcnQgdGltZWZvcm1hdCAqLwoJSU5UIHJldDsKCSAgICAKCVRSQUNFKCJHZXRUaW1lRm9ybWF0KDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsbG9jYWxlLGZsYWdzLAoJeHRpbWUsZGVidWdzdHJfdyhmb3JtYXQpLHRpbWVzdHIsdGltZWxlbik7CgoJdGhpc2xvY2FsZSA9IE9MRTJOTFNfQ2hlY2tMb2NhbGUgKCBsb2NhbGUgKTsKCglpZiAoIGZsYWdzICYgKFRJTUVfTk9USU1FTUFSS0VSIHwgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCApKQoJeyBGSVhNRSgiVElNRV9OT1RJTUVNQVJLRVIgb3IgVElNRV9GT1JDRTI0SE9VUkZPUk1BVCBub3QgaW1wbGVtZW50ZWRcbiIpOwoJfQogIAoJZmxhZ3MgJj0gKFRJTUVfTk9TRUNPTkRTIHwgVElNRV9OT01JTlVURVNPUlNFQ09ORFMpOyAvKiBtYXNrIGZvciBPTEVfR2V0Rm9ybWF0QSovCgoJaWYgKGZvcm1hdCA9PSBOVUxMKSAKCXsgaWYgKGZsYWdzICYgTE9DQUxFX05PVVNFUk9WRVJSSURFKSAgLyp1c2Ugc3lzdGVtIGRlZmF1bHQqLwoJICB7IHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoJICB9CgkgIEdldExvY2FsZUluZm9XKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZm9ybWF0X2J1ZiwgNDApOwoJICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKCX0JICAKCWVsc2UgCgl7IHRoaXNmb3JtYXQgPSBmb3JtYXQ7Cgl9CiAKCWlmICh4dGltZSA9PSBOVUxMKSAvKiBOVUxMIG1lYW5zIHVzZSB0aGUgY3VycmVudCBsb2NhbCB0aW1lKi8KCXsgR2V0U3lzdGVtVGltZSgmdCk7CgkgIHRoaXN0aW1lID0gJnQ7Cgl9IAoJZWxzZQoJeyB0aGlzdGltZSA9IHh0aW1lOwoJfQoKCXJldCA9IE9MRV9HZXRGb3JtYXRXKHRoaXNsb2NhbGUsIHRoaXNmbGFncywgZmxhZ3MsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LAogIAkJCSB0aW1lc3RyLCB0aW1lbGVuKTsKCXJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCUVudW1DYWxlbmRhckluZm9BCVtLRVJORUwzMi4xOTZdCiAqLwpCT09MIFdJTkFQSSBFbnVtQ2FsZW5kYXJJbmZvQSgKCUNBTElORk9fRU5VTVBST0NBIGNhbGluZm9wcm9jLExDSUQgbG9jYWxlLENBTElEIGNhbGVuZGFyLENBTFRZUEUgY2FsdHlwZQopIHsKCUZJWE1FKCIoJXAsMHglMDRseCwweCUwOGx4LDB4JTA4bHgpLHN0dWIhXG4iLGNhbGluZm9wcm9jLGxvY2FsZSxjYWxlbmRhcixjYWx0eXBlKTsKCXJldHVybiBGQUxTRTsKfQo=