LyogLSotIHRhYi13aWR0aDogODsgYy1iYXNpYy1vZmZzZXQ6IDQgLSotICovCi8qCiAqIE1NSU8gZnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAxOTk4IEFuZHJldyBUYXlsb3IKICogQ29weXJpZ2h0IDE5OTggT3ZlIEvldmVuCiAqIENvcHlyaWdodCAyMDAwIEVyaWMgUG91ZWNoCiAqLwoKLyogU3RpbGwgdG8gYmUgZG9uZToKICogCSsgY29ycmVjdCBoYW5kbGluZyBvZiBnbG9iYWwvbG9jYWwgSU9Qcm9jcwogKgkrIG1vZGUgb2YgbW1pbyBvYmplY3RzIGlzIG5vdCB1c2VkIChyZWFkIHZzIHdyaXRlIHZzIHJlYWR3cml0ZSkKICoJKyBJTyBidWZmZXJpbmcgaXMgbGltaXRlZCB0byA2NGsKICoJKyBvcHRpbWl6YXRpb24gb2YgaW50ZXJuYWwgYnVmZmVycyAoc2VnIC8gbGluKQogKgkrIGV2ZW4gaW4gMzIgYml0IG9ubHksIGEgc2VnIHB0ciBJTyBidWZmZXIgaXMgYWxsb2NhdGVkIChhZnRlciB0aGlzIGlzIAogKgkgIGZpeGVkLCB3ZSdsbCBoYXZlIGEgcHJvcGVyIDMyLzE2IHNlcGFyYXRpb24pCiAqCSsgdGhyZWFkIHNhZmVuZXNzCiAqCSsgcmVuYW1lIG9wZXJhdGlvbiBpcyBicm9rZW4KICovCgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmUvd2luYmFzZTE2LmgiCiNpbmNsdWRlICJoZWFwLmgiCiNpbmNsdWRlICJzZWxlY3RvcnMuaCIKI2luY2x1ZGUgImZpbGUuaCIKI2luY2x1ZGUgIm1tc3lzdGVtLmgiCiNpbmNsdWRlICJkZWJ1Z3Rvb2xzLmgiCiNpbmNsdWRlICJ3aW5lbW0uaCIKCkRFRkFVTFRfREVCVUdfQ0hBTk5FTChtbWlvKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgIAltbWlvRG9zSU9Qcm9jICAgICAgICAgICAJCVtpbnRlcm5hbF0KICovCnN0YXRpYyBMUkVTVUxUIG1taW9Eb3NJT1Byb2MoTFBNTUlPSU5GTyBscG1taW9pbmZvLCBVSU5UIHVNZXNzYWdlLCAKCQkJICAgICBMUEFSQU0gbFBhcmFtMSwgTFBBUkFNIGxQYXJhbTIpIAp7CiAgICBMUkVTVUxUCXJldCA9IE1NU1lTRVJSX05PRVJST1I7CgogICAgVFJBQ0UoIiglcCwgJVgsICVsZCwgJWxkKTtcbiIsIGxwbW1pb2luZm8sIHVNZXNzYWdlLCBsUGFyYW0xLCBsUGFyYW0yKTsKICAgIAogICAgc3dpdGNoICh1TWVzc2FnZSkgewogICAgY2FzZSBNTUlPTV9PUEVOOiAKCXsKCSAgICAvKiBQYXJhbWV0ZXJzOgoJICAgICAqIGxQYXJhbTEgPSBzekZpbGVOYW1lIHBhcmFtZXRlciBmcm9tIG1taW9PcGVuCgkgICAgICogbFBhcmFtMiA9IHJlc2VydmVkICh3ZSB1c2UgaXQgZm9yIDE2LWJpdG5lc3MpCgkgICAgICogUmV0dXJuczogemVybyBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG9uIGVycm9yCgkgICAgICogTk9URTogbERpc2tPZmZzZXQgYXV0b21hdGljYWxseSBzZXQgdG8gemVybwoJICAgICAqLwoJICAgIE9GU1RSVUNUIG9mczsKCSAgICBMUENTVFIgc3pGaWxlTmFtZSA9IChMUENTVFIpbFBhcmFtMTsKCSAgICAKCSAgICBpZiAobHBtbWlvaW5mby0+ZHdGbGFncyAmIE1NSU9fR0VUVEVNUCkgewoJCUZJWE1FKCJNTUlPX0dFVFRFTVAgbm90IGltcGxlbWVudGVkXG4iKTsKCQlyZXR1cm4gTU1JT0VSUl9DQU5OT1RPUEVOOwoJICAgIH0KCSAgICAKCSAgICAvKiBpZiBmaWxlbmFtZSBOVUxMLCBhc3N1bWUgb3BlbiBmaWxlIGhhbmRsZSBpbiBhZHdJbmZvWzBdICovCgkgICAgaWYgKCFzekZpbGVOYW1lKSB7CgkJaWYgKGxQYXJhbTIpIAoJCSAgICBscG1taW9pbmZvLT5hZHdJbmZvWzBdID0gRklMRV9HZXRIYW5kbGUobHBtbWlvaW5mby0+YWR3SW5mb1swXSk7CgkJYnJlYWs7CgkgICAgfQoJICAgIAoJICAgIGxwbW1pb2luZm8tPmFkd0luZm9bMF0gPSAoRFdPUkQpT3BlbkZpbGUoc3pGaWxlTmFtZSwgJm9mcywgCgkJCQkJCSAgICAgbHBtbWlvaW5mby0+ZHdGbGFncyk7CgkgICAgaWYgKGxwbW1pb2luZm8tPmFkd0luZm9bMF0gPT0gLTEpCgkJcmV0ID0gTU1JT0VSUl9DQU5OT1RPUEVOOwoJfQoJYnJlYWs7CiAgICAKICAgIGNhc2UgTU1JT01fQ0xPU0U6IAoJLyogUGFyYW1ldGVyczoKCSAqIGxQYXJhbTEgPSB3RmxhZ3MgcGFyYW1ldGVyIGZyb20gbW1pb0Nsb3NlCgkgKiBsUGFyYW0yID0gdW51c2VkCgkgKiBSZXR1cm5zOiB6ZXJvIG9uIHN1Y2Nlc3MsIGVycm9yIGNvZGUgb24gZXJyb3IKCSAqLwoJaWYgKCEobFBhcmFtMSAmIE1NSU9fRkhPUEVOKSkKCSAgICBfbGNsb3NlKChIRklMRSlscG1taW9pbmZvLT5hZHdJbmZvWzBdKTsKCWJyZWFrOwoJICAgIAogICAgY2FzZSBNTUlPTV9SRUFEOiAKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gaHVnZSBwb2ludGVyIHRvIHJlYWQgYnVmZmVyCgkgKiBsUGFyYW0yID0gbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQKCSAqIFJldHVybnM6IG51bWJlciBvZiBieXRlcyByZWFkLCAwIGZvciBFT0YsIC0xIGZvciBlcnJvciAoZXJyb3IgY29kZQoJICoJICAgaW4gd0Vycm9yUmV0KQoJICovCglyZXQgPSBfbHJlYWQoKEhGSUxFKWxwbW1pb2luZm8tPmFkd0luZm9bMF0sIChIUFNUUilsUGFyYW0xLCAoTE9ORylsUGFyYW0yKTsKCWlmIChyZXQgIT0gLTEpCgkgICAgbHBtbWlvaW5mby0+bERpc2tPZmZzZXQgKz0gcmV0OwoJCglicmVhazsKICAgIAogICAgY2FzZSBNTUlPTV9XUklURToKICAgIGNhc2UgTU1JT01fV1JJVEVGTFVTSDogCgkvKiBubyBpbnRlcm5hbCBidWZmZXJpbmcsIHNvIFdSSVRFRkxVU0ggaGFuZGxlZCBzYW1lIGFzIFdSSVRFICovCgkKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gaHVnZSBwb2ludGVyIHRvIHdyaXRlIGJ1ZmZlcgoJICogbFBhcmFtMiA9IG51bWJlciBvZiBieXRlcyB0byB3cml0ZQoJICogUmV0dXJuczogbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIC0xIGZvciBlcnJvciAoZXJyb3IgY29kZSBpbgoJICoJCXdFcnJvclJldCkKCSAqLwoJcmV0ID0gX2h3cml0ZSgoSEZJTEUpbHBtbWlvaW5mby0+YWR3SW5mb1swXSwgKEhQU1RSKWxQYXJhbTEsIChMT05HKWxQYXJhbTIpOwoJaWYgKHJldCAhPSAtMSkKCSAgICBscG1taW9pbmZvLT5sRGlza09mZnNldCArPSByZXQ7CglicmVhazsKICAgIAogICAgY2FzZSBNTUlPTV9TRUVLOiAKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gbmV3IHBvc2l0aW9uCgkgKiBsUGFyYW0yID0gZnJvbSB3aGVuY2UgdG8gc2VlayAoU0VFS19TRVQsIFNFRUtfQ1VSLCBTRUVLX0VORCkKCSAqIFJldHVybnM6IG5ldyBmaWxlIHBvc3Rpb24sIC0xIG9uIGVycm9yCgkgKi8KCXJldCA9IF9sbHNlZWsoKEhGSUxFKWxwbW1pb2luZm8tPmFkd0luZm9bMF0sIChMT05HKWxQYXJhbTEsIChMT05HKWxQYXJhbTIpOwoJaWYgKHJldCAhPSAtMSkKCSAgICBscG1taW9pbmZvLT5sRGlza09mZnNldCA9IHJldDsKCXJldHVybiByZXQ7CiAgICAKICAgIGNhc2UgTU1JT01fUkVOQU1FOiAKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gb2xkIG5hbWUKCSAqIGxQYXJhbTIgPSBuZXcgbmFtZQoJICogUmV0dXJuczogemVybyBvbiBzdWNjZXNzLCBub24temVybyBvbiBmYWlsdXJlCgkgKi8KCUZJWE1FKCJNTUlPTV9SRU5BTUUgdW5pbXBsZW1lbnRlZFxuIik7CglyZXR1cm4gTU1JT0VSUl9GSUxFTk9URk9VTkQ7CiAgICAKICAgIGRlZmF1bHQ6CglGSVhNRSgidW5leHBlY3RlZCBtZXNzYWdlICV1XG4iLCB1TWVzc2FnZSk7CglyZXR1cm4gMDsKICAgIH0KICAgIAogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICAgCW1taW9NZW1JT1Byb2MgICAgICAgICAgIAkJW2ludGVybmFsXQogKi8Kc3RhdGljIExSRVNVTFQgbW1pb01lbUlPUHJvYyhMUE1NSU9JTkZPIGxwbW1pb2luZm8sIFVJTlQgdU1lc3NhZ2UsIAoJCQkgICAgIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMikgCnsKICAgIFRSQUNFKCIoJXAsMHglMDR4LDB4JTA4bHgsMHglMDhseClcbiIsIGxwbW1pb2luZm8sIHVNZXNzYWdlLCBsUGFyYW0xLCBsUGFyYW0yKTsKCiAgICBzd2l0Y2ggKHVNZXNzYWdlKSB7CgkKICAgIGNhc2UgTU1JT01fT1BFTjogCgkvKiBQYXJhbWV0ZXJzOgoJICogbFBhcmFtMSA9IGZpbGVuYW1lIChtdXN0IGJlIE5VTEwpCgkgKiBsUGFyYW0yID0gcmVzZXJ2ZWQgKHdlIHVzZSBpdCBmb3IgMTYtYml0bmVzcykKCSAqIFJldHVybnM6IHplcm8gb24gc3VjY2VzcywgZXJyb3IgY29kZSBvbiBlcnJvcgoJICogTk9URTogbERpc2tPZmZzZXQgYXV0b21hdGljYWxseSBzZXQgdG8gemVybwoJICovCgkvKiBGSVhNRTogaW8gcHJvYyBzaG91bGRuJ3QgY2hhbmdlIGl0ICovCglpZiAoIShscG1taW9pbmZvLT5kd0ZsYWdzICYgTU1JT19DUkVBVEUpKQoJICAgIGxwbW1pb2luZm8tPnBjaEVuZFJlYWQgPSBscG1taW9pbmZvLT5wY2hFbmRXcml0ZTsKCXJldHVybiAwOwoJCiAgICBjYXNlIE1NSU9NX0NMT1NFOiAKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gd0ZsYWdzIHBhcmFtZXRlciBmcm9tIG1taW9DbG9zZQoJICogbFBhcmFtMiA9IHVudXNlZAoJICogUmV0dXJuczogemVybyBvbiBzdWNjZXNzLCBlcnJvciBjb2RlIG9uIGVycm9yCgkgKi8KCXJldHVybiAwOwoJCiAgICBjYXNlIE1NSU9NX1JFQUQ6IAoJLyogUGFyYW1ldGVyczoKCSAqIGxQYXJhbTEgPSBodWdlIHBvaW50ZXIgdG8gcmVhZCBidWZmZXIKCSAqIGxQYXJhbTIgPSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZAoJICogUmV0dXJuczogbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIDAgZm9yIEVPRiwgLTEgZm9yIGVycm9yIChlcnJvciBjb2RlCgkgKgkgICBpbiB3RXJyb3JSZXQpCgkgKiBOT1RFOiBsRGlza09mZnNldCBzaG91bGQgYmUgdXBkYXRlZAoJICovCglGSVhNRSgiTU1JT01fUkVBRCBvbiBtZW1vcnkgZmlsZXMgc2hvdWxkIG5vdCBvY2N1ciwgYnVmZmVyIG1heSBiZSBsb3N0IVxuIik7CglyZXR1cm4gMDsKICAgIAogICAgY2FzZSBNTUlPTV9XUklURToKICAgIGNhc2UgTU1JT01fV1JJVEVGTFVTSDogCgkvKiBubyBpbnRlcm5hbCBidWZmZXJpbmcsIHNvIFdSSVRFRkxVU0ggaGFuZGxlZCBzYW1lIGFzIFdSSVRFICovCgkKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gaHVnZSBwb2ludGVyIHRvIHdyaXRlIGJ1ZmZlcgoJICogbFBhcmFtMiA9IG51bWJlciBvZiBieXRlcyB0byB3cml0ZQoJICogUmV0dXJuczogbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4sIC0xIGZvciBlcnJvciAoZXJyb3IgY29kZSBpbgoJICoJCXdFcnJvclJldCkKCSAqIE5PVEU6IGxEaXNrT2Zmc2V0IHNob3VsZCBiZSB1cGRhdGVkCgkgKi8KCUZJWE1FKCJNTUlPTV9XUklURSBvbiBtZW1vcnkgZmlsZXMgc2hvdWxkIG5vdCBvY2N1ciwgYnVmZmVyIG1heSBiZSBsb3N0IVxuIik7CglyZXR1cm4gMDsKICAgIAogICAgY2FzZSBNTUlPTV9TRUVLOiAKCS8qIFBhcmFtZXRlcnM6CgkgKiBsUGFyYW0xID0gbmV3IHBvc2l0aW9uCgkgKiBsUGFyYW0yID0gZnJvbSB3aGVuY2UgdG8gc2VlayAoU0VFS19TRVQsIFNFRUtfQ1VSLCBTRUVLX0VORCkKCSAqIFJldHVybnM6IG5ldyBmaWxlIHBvc3Rpb24sIC0xIG9uIGVycm9yCgkgKiBOT1RFOiBsRGlza09mZnNldCBzaG91bGQgYmUgdXBkYXRlZAoJICovCglGSVhNRSgiTU1JT01fU0VFSyBvbiBtZW1vcnkgZmlsZXMgc2hvdWxkIG5vdCBvY2N1ciwgYnVmZmVyIG1heSBiZSBsb3N0IVxuIik7CglyZXR1cm4gLTE7CiAgICAKICAgIGRlZmF1bHQ6CglGSVhNRSgidW5leHBlY3RlZCBtZXNzYWdlICV1XG4iLCB1TWVzc2FnZSk7CglyZXR1cm4gMDsKICAgIH0KICAgIAogICAgcmV0dXJuIDA7Cn0KCgplbnVtIG1taW9Qcm9jVHlwZSB7TU1JT19QUk9DXzE2LE1NSU9fUFJPQ18zMkEsTU1JT19QUk9DXzMyV307CgpzdHJ1Y3QgSU9Qcm9jTGlzdAp7CiAgICBzdHJ1Y3QgSU9Qcm9jTGlzdCpwTmV4dDsgICAgICAgLyogTmV4dCBpdGVtIGluIGxpbmtlZCBsaXN0ICovCiAgICBGT1VSQ0MgICAgICAgICAgICBmb3VyQ0M7ICAgICAgLyogZm91ci1jaGFyYWN0ZXIgY29kZSBpZGVudGlmeWluZyBJT1Byb2MgKi8KICAgIExQTU1JT1BST0MJICAgICAgcElPUHJvYzsgICAgIC8qIHBvaW50ZXIgdG8gSVByb2MgKi8KICAgIGVudW0gbW1pb1Byb2NUeXBlIHR5cGU7ICAgICAgICAvKiAxNiwgMzJBIG9yIDMyVyAqLwogICAgaW50CQkgICAgICBjb3VudDsJICAgLyogbnVtYmVyIG9mIG9iamVjdHMgbGlua2VkIHRvIGl0ICovCn07CgovKiBUaGlzIGFycmF5IHdpbGwgYmUgdGhlIGVudGlyZSBsaXN0IGZvciBtb3N0IGFwcHMgKi8KCnN0YXRpYyBzdHJ1Y3QgSU9Qcm9jTGlzdCBkZWZhdWx0UHJvY3NbXSA9IHsKICAgIHsmZGVmYXVsdFByb2NzWzFdLCBGT1VSQ0NfRE9TLCAoTFBNTUlPUFJPQyltbWlvRG9zSU9Qcm9jLCBNTUlPX1BST0NfMzJBLCAwfSwKICAgIHtOVUxMLCAgICAgICAgICAgICBGT1VSQ0NfTUVNLCAoTFBNTUlPUFJPQyltbWlvTWVtSU9Qcm9jLCBNTUlPX1BST0NfMzJBLCAwfSwKfTsKCnN0YXRpYyBzdHJ1Y3QgSU9Qcm9jTGlzdCoJcElPUHJvY0xpc3RBbmNob3IgPSAmZGVmYXVsdFByb2NzWzBdOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCU1NSU9fRmluZFByb2NOb2RlIAkJCVtJTlRFUk5BTF0KICoKICogRmluZHMgdGhlIFByb2NMaXN0IG5vZGUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gRk9VUkNDIGNvZGUuCiAqLwpzdGF0aWMgc3RydWN0IElPUHJvY0xpc3QqCU1NSU9fRmluZFByb2NOb2RlKEZPVVJDQyBmY2NJT1Byb2MpIAp7CiAgICBzdHJ1Y3QgSU9Qcm9jTGlzdCoJcExpc3ROb2RlOwoKICAgIGZvciAocExpc3ROb2RlID0gcElPUHJvY0xpc3RBbmNob3I7IHBMaXN0Tm9kZTsgcExpc3ROb2RlID0gcExpc3ROb2RlLT5wTmV4dCkgewoJaWYgKHBMaXN0Tm9kZS0+Zm91ckNDID09IGZjY0lPUHJvYykgewoJICAgIHJldHVybiBwTGlzdE5vZGU7Cgl9CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCU1NSU9fSW5zdGFsbElPUHJvYyAJCQlbSU5URVJOQUxdCiAqLwpzdGF0aWMgTFBNTUlPUFJPQyBNTUlPX0luc3RhbGxJT1Byb2MoRk9VUkNDIGZjY0lPUHJvYywgTFBNTUlPUFJPQyBwSU9Qcm9jLAoJCQkJICAgICBEV09SRCBkd0ZsYWdzLCBlbnVtIG1taW9Qcm9jVHlwZSB0eXBlKQp7CiAgICBMUE1NSU9QUk9DCSAgICAgICAgbHBQcm9jID0gTlVMTDsKICAgIHN0cnVjdCBJT1Byb2NMaXN0KiAgcExpc3ROb2RlOwogICAgc3RydWN0IElPUHJvY0xpc3QqKiBwcExpc3ROb2RlOwoKICAgIFRSQUNFKCIoJWxkLCAlcCwgJTA4bFgsICVpKVxuIiwgZmNjSU9Qcm9jLCBwSU9Qcm9jLCBkd0ZsYWdzLCB0eXBlKTsKCiAgICBpZiAoZHdGbGFncyAmIE1NSU9fR0xPQkFMUFJPQykKCUZJWE1FKCJHbG9iYWwgcHJvY2VkdXJlcyBub3QgaW1wbGVtZW50ZWRcbiIpOwoKICAgIC8qIGp1c3QgaGFuZGxlIHRoZSBrbm93biBwcm9jZWR1cmVzIGZvciBub3cgKi8KICAgIHN3aXRjaCAoZHdGbGFncyAmIChNTUlPX0lOU1RBTExQUk9DfE1NSU9fUkVNT1ZFUFJPQ3xNTUlPX0ZJTkRQUk9DKSkgewogICAgY2FzZSBNTUlPX0lOU1RBTExQUk9DOgoJLyogQ3JlYXRlIG5ldyBlbnRyeSBmb3IgdGhlIElPUHJvYyBsaXN0ICovCglwTGlzdE5vZGUgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKCpwTGlzdE5vZGUpKTsKCWlmIChwTGlzdE5vZGUpIHsKCSAgICAvKiBGaWxsIGluIHRoaXMgbm9kZSAqLwoJICAgIHBMaXN0Tm9kZS0+Zm91ckNDID0gZmNjSU9Qcm9jOwoJICAgIHBMaXN0Tm9kZS0+cElPUHJvYyA9IHBJT1Byb2M7CgkgICAgcExpc3ROb2RlLT50eXBlID0gdHlwZTsKCSAgICAKCSAgICAvKiBTdGljayBpdCBvbiB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCgkgICAgcExpc3ROb2RlLT5wTmV4dCA9IHBJT1Byb2NMaXN0QW5jaG9yOwoJICAgIHBJT1Byb2NMaXN0QW5jaG9yID0gcExpc3ROb2RlOwoJICAgIAoJICAgIC8qIFJldHVybiB0aGlzIElPUHJvYyAtIHRoYXQncyBob3cgdGhlIGNhbGxlciBrbm93cyB3ZSBzdWNjZWVkZWQgKi8KCSAgICBscFByb2MgPSBwSU9Qcm9jOwoJfSAKCWJyZWFrOwoJICAgICAgICAgIAogICAgY2FzZSBNTUlPX1JFTU9WRVBST0M6CgkvKiAKCSAqIFNlYXJjaCBmb3IgdGhlIG5vZGUgdGhhdCB3ZSdyZSB0cnlpbmcgdG8gcmVtb3ZlIC0gbm90ZQoJICogdGhhdCB0aGlzIG1ldGhvZCB3b24ndCBmaW5kIHRoZSBmaXJzdCBpdGVtIG9uIHRoZSBsaXN0LCBidXQKCSAqIHNpbmNlIHRoZSBmaXJzdCB0d28gaXRlbXMgb24gdGhpcyBsaXN0IGFyZSBvbmVzIHdlIHdvbid0CgkgKiBsZXQgdGhlIHVzZXIgZGVsZXRlIGFueXdheSwgdGhhdCdzIG9rYXkKCSAqLwkgICAgCglwcExpc3ROb2RlID0gJnBJT1Byb2NMaXN0QW5jaG9yOwoJd2hpbGUgKCgqcHBMaXN0Tm9kZSkgJiYgKCpwcExpc3ROb2RlKS0+Zm91ckNDICE9IGZjY0lPUHJvYykKCSAgICBwcExpc3ROb2RlID0gJigoKnBwTGlzdE5vZGUpLT5wTmV4dCk7CgoJaWYgKCpwcExpc3ROb2RlKSB7IC8qIGZvdW5kIGl0ICovCgkgICAgLyogRklYTUU6IHdoYXQgc2hvdWxkIGJlIGRvbmUgaWYgYW4gb3BlbiBtbWlvIG9iamVjdCB1c2VzIHRoaXMgcHJvYyA/CgkgICAgICogc2hhbGwgd2UgcmV0dXJuIGFuIGVycm9yLCBudWtlIHRoZSBtbWlvIG9iamVjdCA/CgkgICAgICovCgkgICAgaWYgKCgqcHBMaXN0Tm9kZSktPmNvdW50KSB7CgkJRVJSKCJDYW5ub3QgcmVtb3ZlIGEgbW1JT1Byb2Mgd2hpbGUgaW4gdXNlXG4iKTsKCQlicmVhazsKCSAgICB9CgkgICAgLyogcmVtb3ZlIGl0LCBidXQgb25seSBpZiBpdCBpc24ndCBidWlsdGluICovCgkgICAgaWYgKCgqcHBMaXN0Tm9kZSkgPj0gZGVmYXVsdFByb2NzICYmIAoJCSgqcHBMaXN0Tm9kZSkgPCBkZWZhdWx0UHJvY3MgKyBzaXplb2YoZGVmYXVsdFByb2NzKSkgewoJCVdBUk4oIlRyaWVkIHRvIHJlbW92ZSBidWlsdC1pbiBtbWlvIHByb2MuIFNraXBwaW5nXG4iKTsKCSAgICB9IGVsc2UgewoJCS8qIE9rYXksIG51a2UgaXQgKi8KCQlzdHJ1Y3QgSU9Qcm9jTGlzdCogIHB0bXBOb2RlID0gKnBwTGlzdE5vZGU7CgkJbHBQcm9jID0gKCpwcExpc3ROb2RlKS0+cElPUHJvYzsKCQkqcHBMaXN0Tm9kZSA9ICgqcHBMaXN0Tm9kZSktPnBOZXh0OwoJCUhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIHB0bXBOb2RlKTsKCSAgICB9Cgl9CglicmVhazsKCSAgICAKICAgIGNhc2UgTU1JT19GSU5EUFJPQzoKCWlmICgocExpc3ROb2RlID0gTU1JT19GaW5kUHJvY05vZGUoZmNjSU9Qcm9jKSkpIHsKCSAgICBscFByb2MgPSBwTGlzdE5vZGUtPnBJT1Byb2M7Cgl9CglicmVhazsKICAgIH0KICAgIAogICAgcmV0dXJuIGxwUHJvYzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCQlNTUlPX01hcDMyVG8xNgkJCVtJTlRFUk5BTF0KICovCnN0YXRpYyBMUkVTVUxUCU1NSU9fTWFwMzJUbzE2KERXT1JEIHdNc2csIExQQVJBTSogbHAxLCBMUEFSQU0qIGxwMikKewogICAgc3dpdGNoICh3TXNnKSB7CiAgICBjYXNlIE1NSU9NX09QRU46Cgl7CgkgICAgdm9pZCoJbHAgPSBTRUdQVFJfQUxMT0Moc3RybGVuKChMUFNUUikqbHAxKSArIDEpOwoJICAgIGlmICghbHApIHJldHVybiBNTVNZU0VSUl9OT01FTTsKCSAgIAoJICAgIHN0cmNweSgodm9pZCopU0VHUFRSX0dFVChscCksIChMUFNUUikqbHAxKTsKCSAgICAqbHAxID0gKExQQVJBTSlscDsKCX0KCWJyZWFrOwogICAgY2FzZSBNTUlPTV9DTE9TRToKICAgIGNhc2UgTU1JT01fU0VFSzoKCS8qIG5vdGhpbmcgdG8gZG8gKi8KCWJyZWFrOwogICAgY2FzZSBNTUlPTV9SRUFEOgogICAgY2FzZSBNTUlPTV9XUklURToKICAgIGNhc2UgTU1JT01fV1JJVEVGTFVTSDoKCXsKCSAgICB2b2lkKglscCA9IFNFR1BUUl9BTExPQygqbHAyKTsKCSAgICBpZiAoIWxwKSByZXR1cm4gTU1TWVNFUlJfTk9NRU07CgkgICAKCSAgICBpZiAod01zZyAhPSBNTUlPTV9SRUFEKQoJCW1lbWNweSgodm9pZCopU0VHUFRSX0dFVChscCksICh2b2lkKikqbHAxLCAqbHAyKTsKCSAgICAqbHAxID0gKExQQVJBTSlscDsKCX0KCWJyZWFrOwogICAgZGVmYXVsdDoKCVRSQUNFKCJOb3QgYSBtYXBwYWJsZSBtZXNzYWdlICglbGQpXG4iLCB3TXNnKTsKICAgIH0KICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAJTU1JT19Vbk1hcDMyVG8xNiAJCQlbSU5URVJOQUxdCiAqLwpzdGF0aWMgTFJFU1VMVAlNTUlPX1VuTWFwMzJUbzE2KERXT1JEIHdNc2csIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMiwKCQkJCSBMUEFSQU0gbHAxLCBMUEFSQU0gbHAyKQp7CiAgICBzd2l0Y2ggKHdNc2cpIHsKICAgIGNhc2UgTU1JT01fT1BFTjoKCWlmICghU0VHUFRSX0ZSRUUoKHZvaWQqKWxwMSkpIHsKCSAgICBGSVhNRSgiYmFkIGZyZWUgbGluZT0lZFxuIiwgX19MSU5FX18pOwoJfSAKCWJyZWFrOwogICAgY2FzZSBNTUlPTV9DTE9TRToKICAgIGNhc2UgTU1JT01fU0VFSzoKCS8qIG5vdGhpbmcgdG8gZG8gKi8KCWJyZWFrOwogICAgY2FzZSBNTUlPTV9SRUFEOgoJbWVtY3B5KCh2b2lkKilsUGFyYW0xLCAodm9pZCopU0VHUFRSX0dFVCgodm9pZCopbHAxKSwgbHAyKTsKCS8qIGZhbGwgdGhydSAqLwogICAgY2FzZSBNTUlPTV9XUklURToKICAgIGNhc2UgTU1JT01fV1JJVEVGTFVTSDoKCWlmICghU0VHUFRSX0ZSRUUoKHZvaWQqKWxwMSkpIHsKCSAgICBGSVhNRSgiYmFkIGZyZWUgbGluZT0lZFxuIiwgX19MSU5FX18pOwoJfSAKCWJyZWFrOwogICAgZGVmYXVsdDoKCVRSQUNFKCJOb3QgYSBtYXBwYWJsZSBtZXNzYWdlICglbGQpXG4iLCB3TXNnKTsKICAgIH0KICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAJTU1JT19HZW5lcmF0ZUluZm9Gb3JJT1Byb2MgCQlbSU5URVJOQUxdCiAqLwpzdGF0aWMJU0VHUFRSCU1NSU9fR2VuZXJhdGVJbmZvRm9ySU9Qcm9jKGNvbnN0IFdJTkVfTU1JTyogd20pCnsKICAgIFNFR1BUUgkJbHAgPSAoU0VHUFRSKVNFR1BUUl9BTExPQyhzaXplb2YoTU1JT0lORk8xNikpOwogICAgTFBNTUlPSU5GTzE2CW1taW9JbmZvMTYgPSAoTFBNTUlPSU5GTzE2KVNFR1BUUl9HRVQoKHZvaWQqKWxwKTsKCiAgICBtZW1zZXQobW1pb0luZm8xNiwgMCwgc2l6ZW9mKE1NSU9JTkZPMTYpKTsKCiAgICBtbWlvSW5mbzE2LT5sRGlza09mZnNldCA9IHdtLT5pbmZvLmxEaXNrT2Zmc2V0OyAgICAKICAgIG1taW9JbmZvMTYtPmFkd0luZm9bMF0gID0gd20tPmluZm8uYWR3SW5mb1swXTsKICAgIG1taW9JbmZvMTYtPmFkd0luZm9bMV0gID0gd20tPmluZm8uYWR3SW5mb1sxXTsKICAgIG1taW9JbmZvMTYtPmFkd0luZm9bMl0gID0gd20tPmluZm8uYWR3SW5mb1syXTsKICAgIG1taW9JbmZvMTYtPmFkd0luZm9bM10gID0gd20tPmluZm8uYWR3SW5mb1szXTsKCiAgICByZXR1cm4gbHA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgIAlNTUlPX1VwZGF0ZUluZm9Gb3JJT1Byb2MJCVtJTlRFUk5BTF0KICovCnN0YXRpYwlMUkVTVUxUIE1NSU9fVXBkYXRlSW5mb0ZvcklPUHJvYyhXSU5FX01NSU8qIHdtLCBTRUdQVFIgc2VnbW1pb0luZm8xNikKewogICAgY29uc3QgTU1JT0lORk8xNioJbW1pb0luZm8xNjsKCiAgICBtbWlvSW5mbzE2ID0gKGNvbnN0IE1NSU9JTkZPMTYqKVNFR1BUUl9HRVQoKHZvaWQqKXNlZ21taW9JbmZvMTYpOwoKICAgIHdtLT5pbmZvLmxEaXNrT2Zmc2V0ID0gbW1pb0luZm8xNi0+bERpc2tPZmZzZXQ7CiAgICB3bS0+aW5mby5hZHdJbmZvWzBdICA9IG1taW9JbmZvMTYtPmFkd0luZm9bMF07CiAgICB3bS0+aW5mby5hZHdJbmZvWzFdICA9IG1taW9JbmZvMTYtPmFkd0luZm9bMV07CiAgICB3bS0+aW5mby5hZHdJbmZvWzJdICA9IG1taW9JbmZvMTYtPmFkd0luZm9bMl07CiAgICB3bS0+aW5mby5hZHdJbmZvWzNdICA9IG1taW9JbmZvMTYtPmFkd0luZm9bM107CgogICAgaWYgKCFTRUdQVFJfRlJFRSgodm9pZCopc2VnbW1pb0luZm8xNikpIHsKCUZJWE1FKCJiYWQgZnJlZSBsaW5lPSVkXG4iLCBfX0xJTkVfXyk7CiAgICB9IAoKICAgIHJldHVybiBNTVNZU0VSUl9OT0VSUk9SOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAJTU1JT19TZW5kTWVzc2FnZQkJCVtJTlRFUk5BTF0KICovCnN0YXRpYyBMUkVTVUxUCU1NSU9fU2VuZE1lc3NhZ2UoTFBXSU5FX01NSU8gd20sIERXT1JEIHdNc2csIExQQVJBTSBsUGFyYW0xLCAKCQkJCSBMUEFSQU0gbFBhcmFtMiwgZW51bSBtbWlvUHJvY1R5cGUgdHlwZSkKewogICAgTFJFU1VMVCAJCXJlc3VsdDsKICAgIFNFR1BUUgkJc2VnbW1pb0luZm8xNjsKICAgIExQQVJBTQkJbHAxID0gbFBhcmFtMSwgbHAyID0gbFBhcmFtMjsKCiAgICBpZiAoIXdtLT5pb1Byb2MgfHwgIXdtLT5pbmZvLnBJT1Byb2MpIHsKCUVSUigiYnJyclxuIik7CglyZXN1bHQgPSBNTVNZU0VSUl9JTlZBTFBBUkFNOwogICAgfQoKICAgIHN3aXRjaCAod20tPmlvUHJvYy0+dHlwZSkgewogICAgY2FzZSBNTUlPX1BST0NfMTY6CglzZWdtbWlvSW5mbzE2ID0gTU1JT19HZW5lcmF0ZUluZm9Gb3JJT1Byb2Mod20pOwoJaWYgKHdtLT5pb1Byb2MtPnR5cGUgIT0gdHlwZSkgewoJICAgIC8qIG1hcCAobFBhcmFtMSwgbFBhcmFtMikgaW50byAobHAxLCBscDIpIDMyPT4xNiAqLwoJICAgIGlmICgocmVzdWx0ID0gTU1JT19NYXAzMlRvMTYod01zZywgJmxwMSwgJmxwMikpICE9IE1NU1lTRVJSX05PRVJST1IpCgkJcmV0dXJuIHJlc3VsdDsKCX0KCS8qIEZJWE1FOiBpcyB3bS0+aW5mby5wSU9Qcm9jIGEgc2VnbWVudGVkIG9yIGEgbGluZWFyIGFkZHJlc3MgPwoJICogc291bmRzIHRvIG1lIGl0J3MgYSBzZWdtZW50ZWQgb25lLCBzaG91bGQgdXNlIGEgdGh1bmsgc29tZXdoZXJlCgkgKi8KCXJlc3VsdCA9ICgoTFBNTUlPUFJPQzE2KXdtLT5pbmZvLnBJT1Byb2MpKChMUFNUUilzZWdtbWlvSW5mbzE2LCAKCQkJCQkJICB3TXNnLCBscDEsIGxwMik7CgkKCWlmICh3bS0+aW9Qcm9jLT50eXBlICE9IHR5cGUpIHsKCSAgICBNTUlPX1VuTWFwMzJUbzE2KHdNc2csIGxQYXJhbTEsIGxQYXJhbTIsIGxwMSwgbHAyKTsKCX0KCU1NSU9fVXBkYXRlSW5mb0ZvcklPUHJvYyh3bSwgc2VnbW1pb0luZm8xNik7CglicmVhazsKICAgIGNhc2UgTU1JT19QUk9DXzMyQToKICAgIGNhc2UgTU1JT19QUk9DXzMyVzoKCWlmICh3bS0+aW9Qcm9jLT50eXBlICE9IHR5cGUpIHsKCSAgICAvKiBtYXAgKGxQYXJhbTEsIGxQYXJhbTIpIGludG8gKGxwMSwgbHAyKSAxNj0+MzIgKi8KCSAgICBXQVJOKCJOSVlcbiIpOwoJfQoJcmVzdWx0ID0gKHdtLT5pbmZvLnBJT1Byb2MpKChMUFNUUikmd20tPmluZm8sIHdNc2csIGxwMSwgbHAyKTsKCQojaWYgMAoJaWYgKHdtLT5pb1Byb2MtPnR5cGUgIT0gdHlwZSkgewoJICAgIC8qIHVubWFwIChsUGFyYW0xLCBsUGFyYW0yKSBpbnRvIChscDEsIGxwMikgMTY9PjMyICovCgl9CiNlbmRpZgoJYnJlYWs7CiAgICBkZWZhdWx0OiAgCglGSVhNRSgiSW50ZXJuYWwgZXJyb3JcbiIpOwoJcmVzdWx0ID0gTU1TWVNFUlJfRVJST1I7CiAgICB9CgogICAgcmV0dXJuIHJlc3VsdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgCQkJTU1JT19QYXJzZUV4dCAJCSAgICAgICAgW2ludGVybmFsXQogKgogKiBQYXJzZXMgYSBmaWxlbmFtZSBmb3IgdGhlIGV4dGVuc2lvbi4KICoKICogUkVUVVJOUwogKiAgVGhlIEZPVVJDQyBjb2RlIGZvciB0aGUgZXh0ZW5zaW9uIGlmIGZvdW5kLCBlbHNlIDAuCiAqLwpzdGF0aWMgRk9VUkNDIE1NSU9fUGFyc2VFeHQoTFBDU1RSIHN6RmlsZU5hbWUpCnsKICAgIC8qIEZpbGVuYW1lcyBhcmUgb2YgdGhlIGZvcm0gZmlsZS5leHQrQUJDCiAgICAgICBGSVhNRTogV2hhdCBpZiBhICcrJyBpcyBwYXJ0IG9mIHRoZSBmaWxlIG5hbWU/CiAgICAgICBGb3Igbm93LCB3ZSB0YWtlIHRoZSBsYXN0ICcrJyBwcmVzZW50ICovCiAgICAKICAgIEZPVVJDQyByZXQgPSAwOwogICAgCiAgICAvKiBOb3RlIHRoYXQgZXh0e1N0YXJ0LEVuZH0gcG9pbnQgdG8gdGhlIC4gYW5kICsgcmVzcGVjdGl2ZWx5ICovCiAgICBMUFNUUiBleHRFbmQ7CiAgICAKICAgIFRSQUNFKCIoJXMpXG4iLGRlYnVnc3RyX2Eoc3pGaWxlTmFtZSkpOwogICAgCiAgICBleHRFbmQgPSBzdHJyY2hyKHN6RmlsZU5hbWUsJysnKTsKICAgIGlmIChleHRFbmQpIHsKCS8qIE5lZWQgdG8gcGFyc2UgdG8gZmluZCB0aGUgZXh0ZW5zaW9uICovCglMUFNUUiBleHRTdGFydDsKCQoJZXh0U3RhcnQgPSBleHRFbmQ7Cgl3aGlsZSAoZXh0U3RhcnQgPiBzekZpbGVOYW1lICYmIGV4dFN0YXJ0WzBdICE9ICcuJykgewoJICAgIGV4dFN0YXJ0LS07Cgl9CgkKCWlmIChleHRTdGFydCA9PSBzekZpbGVOYW1lKSB7CgkgICAgRVJSKCIrIGJ1dCBubyAuIGluIHN6RmlsZU5hbWU6ICVzXG4iLCBkZWJ1Z3N0cl9hKHN6RmlsZU5hbWUpKTsKCX0gZWxzZSB7CgkgICAgQ0hBUiBleHRbNV07CgkgICAgCgkgICAgaWYgKGV4dEVuZCAtIGV4dFN0YXJ0IC0gMSA+IDQpCgkJV0FSTigiRXh0ZW5zaW9uIGxlbmd0aCA+IDRcbiIpOwoJICAgIGxzdHJjcHluQShleHQsZXh0U3RhcnQgKyAxLG1pbihleHRFbmQtZXh0U3RhcnQsNSkpOwoJICAgIFRSQUNFKCJHb3QgZXh0ZW5zaW9uOiAlc1xuIiwgZGVidWdzdHJfYShleHQpKTsKCSAgICAvKiBGT1VSQ0MgY29kZXMgaWRlbnRpZnlpbmcgZmlsZS1leHRlbnRpb25zIG11c3QgYmUgdXBwZXJjYXNlICovCgkgICAgcmV0ID0gbW1pb1N0cmluZ1RvRk9VUkNDQShleHQsIE1NSU9fVE9VUFBFUik7Cgl9CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCQkJTU1JT19HZXQJCQlbaW50ZXJuYWxdCiAqCiAqIFJldGlyaWV2ZXMgZnJvbSBjdXJyZW50IHByb2Nlc3MgdGhlIG1taW8gb2JqZWN0CiAqLwpzdGF0aWMJTFBXSU5FX01NSU8JTU1JT19HZXQoTFBXSU5FX01NX0lEQVRBIGlEYXRhLCBITU1JTyBoKQp7CiAgICBMUFdJTkVfTU1JTwkJd20gPSBOVUxMOwoKICAgIGlmICghaURhdGEpIGlEYXRhID0gTVVMVElNRURJQV9HZXRJRGF0YSgpOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZpRGF0YS0+Y3MpOwogICAgZm9yICh3bSA9IGlEYXRhLT5scE1NSU87IHdtOyB3bSA9IHdtLT5scE5leHQpIHsKCWlmICh3bS0+aW5mby5obW1pbyA9PSBoKQoJICAgIGJyZWFrOwogICAgfQogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJmlEYXRhLT5jcyk7CiAgICByZXR1cm4gd207Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJCQlNTUlPX0NyZWF0ZQkJCVtpbnRlcm5hbF0KICoKICogQ3JlYXRlcyBhbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBmb3IgYSBtbWlvIGluc3RhbmNlCiAqLwpzdGF0aWMJTFBXSU5FX01NSU8JCU1NSU9fQ3JlYXRlKHZvaWQpCnsKICAgIHN0YXRpYwlXT1JECU1NSU9fY291bnRlciA9IDA7CiAgICBMUFdJTkVfTU1JTwkJd207CiAgICBMUFdJTkVfTU1fSURBVEEJaURhdGEgPSBNVUxUSU1FRElBX0dldElEYXRhKCk7CgogICAgd20gPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKFdJTkVfTU1JTykpOwogICAgaWYgKHdtKSB7CglFbnRlckNyaXRpY2FsU2VjdGlvbigmaURhdGEtPmNzKTsKCXdoaWxlIChNTUlPX0dldChpRGF0YSwgKytNTUlPX2NvdW50ZXIpKTsKCXdtLT5pbmZvLmhtbWlvID0gTU1JT19jb3VudGVyOwoJd20tPmxwTmV4dCA9IGlEYXRhLT5scE1NSU87CglpRGF0YS0+bHBNTUlPID0gd207CglMZWF2ZUNyaXRpY2FsU2VjdGlvbigmaURhdGEtPmNzKTsKICAgIH0KICAgIHJldHVybiB3bTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCQkJCU1NSU9fRGVzdHJveQkJCVtpbnRlcm5hbF0KICotCiAqIERlc3Ryb3lzIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uIGZvciBhIG1taW8gaW5zdGFuY2UKICovCnN0YXRpYwlCT09MCQlNTUlPX0Rlc3Ryb3koTFBXSU5FX01NSU8gd20pCnsKICAgIExQV0lORV9NTV9JREFUQQlpRGF0YSA9IE1VTFRJTUVESUFfR2V0SURhdGEoKTsKICAgIExQV0lORV9NTUlPKgltOwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZpRGF0YS0+Y3MpOwogICAgZm9yIChtID0gJihpRGF0YS0+bHBNTUlPKTsgKm0gJiYgKm0gIT0gd207IG0gPSAmKCptKS0+bHBOZXh0KTsKICAgIGlmICgqbSkgewoJKm0gPSAoKm0pLT5scE5leHQ7CglIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB3bSk7Cgl3bSA9IE5VTEw7CiAgICB9CiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmaURhdGEtPmNzKTsKICAgIHJldHVybiB3bSA/IEZBTFNFIDogVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCQlNTUlPX0ZsdXNoIAkJCVtJTlRFUk5BTF0KICovCnN0YXRpYwlMUkVTVUxUCU1NSU9fRmx1c2goV0lORV9NTUlPKiB3bSwgVUlOVCB1RmxhZ3MpCnsKICAgIGlmICgoIXdtLT5pbmZvLmNjaEJ1ZmZlcikgfHwgKHdtLT5pbmZvLmZjY0lPUHJvYyA9PSBGT1VSQ0NfTUVNKSkgewoJcmV0dXJuIDA7CiAgICB9CgogICAgLyogbm90IHF1aXRlIHN1cmUgd2hhdCB0byBkbyBoZXJlLCBidXQgSSdsbCBndWVzcyAqLwogICAgaWYgKHdtLT5pbmZvLmR3RmxhZ3MgJiBNTUlPX0RJUlRZKSB7CglNTUlPX1NlbmRNZXNzYWdlKHdtLCBNTUlPTV9TRUVLLCB3bS0+aW5mby5sRGlza09mZnNldCwKCQkJIFNFRUtfU0VULCBNTUlPX1BST0NfMzJBKTsKCU1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX1dSSVRFLCAoTFBBUkFNKXdtLT5pbmZvLnBjaEJ1ZmZlciwKCQkJIHdtLT5pbmZvLnBjaE5leHQgLSB3bS0+aW5mby5wY2hCdWZmZXIsIE1NSU9fUFJPQ18zMkEpOwoJd20tPmluZm8uZHdGbGFncyAmPSB+TU1JT19ESVJUWTsKICAgIH0KICAgIGlmICh1RmxhZ3MgJiBNTUlPX0VNUFRZQlVGKQogICAgICAgIHdtLT5pbmZvLnBjaE5leHQgPSB3bS0+aW5mby5wY2hCdWZmZXI7CgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgCQlNTUlPX0dyYWJOZXh0QnVmZmVyCQkJW0lOVEVSTkFMXQogKi8Kc3RhdGljIExPTkcJTU1JT19HcmFiTmV4dEJ1ZmZlcihMUFdJTkVfTU1JTyB3bSwgaW50IGZvcl9yZWFkKQp7CiAgICBMT05HCXNpemUgPSB3bS0+aW5mby5jY2hCdWZmZXI7CgogICAgVFJBQ0UoImJvPSVseCBkbz0lbHggb2Y9JWx4XG4iLCAKCSAgd20tPmluZm8ubEJ1Zk9mZnNldCwgd20tPmluZm8ubERpc2tPZmZzZXQsIAoJICBNTUlPX1NlbmRNZXNzYWdlKHdtLCBNTUlPTV9TRUVLLCAwLCBTRUVLX0NVUiwgTU1JT19QUk9DXzMyQSkpOwoJICAKICAgIHdtLT5pbmZvLmxCdWZPZmZzZXQgPSB3bS0+aW5mby5sRGlza09mZnNldDsKICAgIHdtLT5pbmZvLnBjaE5leHQgPSB3bS0+aW5mby5wY2hCdWZmZXI7CiAgICB3bS0+aW5mby5wY2hFbmRSZWFkID0gd20tPmluZm8ucGNoQnVmZmVyOwogICAgd20tPmluZm8ucGNoRW5kV3JpdGUgPSB3bS0+aW5mby5wY2hCdWZmZXI7CgogICAgaWYgKGZvcl9yZWFkKSB7CglzaXplID0gTU1JT19TZW5kTWVzc2FnZSh3bSwgTU1JT01fUkVBRCwgKExQQVJBTSl3bS0+aW5mby5wY2hCdWZmZXIsCgkJCQlzaXplLCBNTUlPX1BST0NfMzJBKTsKCWlmIChzaXplID4gMCkKCSAgICB3bS0+aW5mby5wY2hFbmRSZWFkICs9IHNpemU7CiAgICB9CiAgICByZXR1cm4gc2l6ZTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAJCU1NSU9fU2V0QnVmZmVyIAkJCQlbSU5URVJOQUxdCiAqLwpzdGF0aWMJVUlOVAlNTUlPX1NldEJ1ZmZlcihXSU5FX01NSU8qIHdtLCB2b2lkKiBwY2hCdWZmZXIsIExPTkcgY2NoQnVmZmVyLCAKCQkJICAgICAgIFVJTlQgdUZsYWdzLCBCT09MIGJGcm9tMzIpCnsKICAgIFRSQUNFKCIoJXAgJXAgJWxkICV1ICVkKVxuIiwgd20sIHBjaEJ1ZmZlciwgY2NoQnVmZmVyLCB1RmxhZ3MsIGJGcm9tMzIpOwoKICAgIGlmICh1RmxhZ3MpCQkJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAgICBpZiAoY2NoQnVmZmVyID4gMHhGRkZGKSB7CglGSVhNRSgiTm90IGhhbmRsaW5nIGh1Z2UgbW1pbyBidWZmZXJzIHlldCAoJWxkID49IDY0aylcbiIsIGNjaEJ1ZmZlcik7CglyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKICAgIH0KCQogICAgaWYgKE1NSU9fRmx1c2god20sIE1NSU9fRU1QVFlCVUYpICE9IDApCglyZXR1cm4gTU1JT0VSUl9DQU5OT1RXUklURTsKICAgIAogICAgaWYgKCghY2NoQnVmZmVyIHx8IHBjaEJ1ZmZlcikgJiYgKHdtLT5pbmZvLmR3RmxhZ3MgJiBNTUlPX0FMTE9DQlVGKSkgewoJR2xvYmFsVW5sb2NrMTYod20tPmhNZW0pOwoJR2xvYmFsRnJlZTE2KHdtLT5oTWVtKTsKCXdtLT5pbmZvLmR3RmxhZ3MgJj0gfk1NSU9fQUxMT0NCVUY7CiAgICB9CiAgICBpZiAocGNoQnVmZmVyKSB7CglpZiAoYkZyb20zMikgewoJICAgIHdtLT5pbmZvLnBjaEJ1ZmZlciA9IHBjaEJ1ZmZlcjsKCSAgICB3bS0+YnVmZmVyMTYgPSAwOwoJfSBlbHNlIHsKCSAgICB3bS0+aW5mby5wY2hCdWZmZXIgPSBQVFJfU0VHX1RPX0xJTihwY2hCdWZmZXIpOwoJICAgIHdtLT5idWZmZXIxNiA9IChTRUdQVFIpcGNoQnVmZmVyOwoJfQoJd20tPmhNZW0gPSAwOwogICAgfSBlbHNlIGlmIChjY2hCdWZmZXIgJiYgKHdtLT5pbmZvLmR3RmxhZ3MgJiBNTUlPX0FMTE9DQlVGKSkgewoJSEdMT0JBTDE2IGhOZXdCdWY7CglHbG9iYWxVbmxvY2sxNih3bS0+aE1lbSk7CgloTmV3QnVmID0gR2xvYmFsUmVBbGxvYzE2KHdtLT5oTWVtLCBjY2hCdWZmZXIsIDApOwoJaWYgKCFoTmV3QnVmKSB7CgkgICAgLyogRklYTUU6IHRoaXMgYXNzdW1lcyB0aGUgbWVtb3J5IGJsb2NrIGRpZG4ndCBtb3ZlICovCgkgICAgR2xvYmFsTG9jazE2KHdtLT5oTWVtKTsKCSAgICByZXR1cm4gTU1JT0VSUl9PVVRPRk1FTU9SWTsKCX0KCXdtLT5oTWVtID0gaE5ld0J1ZjsKICAgIH0gZWxzZSBpZiAoY2NoQnVmZmVyKSB7CglpZiAoISh3bS0+aE1lbSA9IEdsb2JhbEFsbG9jMTYoR01FTV9NT1ZFQUJMRSwgY2NoQnVmZmVyKSkpCgkgICAgcmV0dXJuIE1NSU9FUlJfT1VUT0ZNRU1PUlk7Cgl3bS0+aW5mby5kd0ZsYWdzIHw9IE1NSU9fQUxMT0NCVUY7CiAgICB9IGVsc2UgewoJd20tPmluZm8ucGNoQnVmZmVyID0gTlVMTDsKCXdtLT5oTWVtID0gMDsKCXdtLT5idWZmZXIxNiA9IDA7CiAgICB9CgogICAgaWYgKHdtLT5oTWVtKSB7Cgl3bS0+YnVmZmVyMTYgPSBXSU4xNl9HbG9iYWxMb2NrMTYod20tPmhNZW0pOwoJd20tPmluZm8ucGNoQnVmZmVyID0gKHZvaWQqKVBUUl9TRUdfVE9fTElOKCh2b2lkKil3bS0+YnVmZmVyMTYpOwogICAgfQoKICAgIHdtLT5pbmZvLmNjaEJ1ZmZlciA9IGNjaEJ1ZmZlcjsKICAgIHdtLT5pbmZvLnBjaE5leHQgPSB3bS0+aW5mby5wY2hCdWZmZXI7CiAgICB3bS0+aW5mby5wY2hFbmRSZWFkID0gd20tPmluZm8ucGNoQnVmZmVyOwogICAgd20tPmluZm8ucGNoRW5kV3JpdGUgPSB3bS0+aW5mby5wY2hCdWZmZXIgKyBjY2hCdWZmZXI7CiAgICB3bS0+aW5mby5sQnVmT2Zmc2V0ID0gMDsKCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCU1NSU9fT3BlbiAgICAgIAkJCQlbaW50ZXJuYWxdCiAqLwpzdGF0aWMgSE1NSU8gTU1JT19PcGVuKExQU1RSIHN6RmlsZU5hbWUsIE1NSU9JTkZPKiByZWZtbWluZm8sIAoJCSAgICAgICBEV09SRCBkd09wZW5GbGFncywgZW51bSBtbWlvUHJvY1R5cGUgdHlwZSkKewogICAgTFBXSU5FX01NSU8JCXdtOwoKICAgIFRSQUNFKCIoJyVzJywgJXAsICUwOGxYLCAlZCk7XG4iLCBzekZpbGVOYW1lLCByZWZtbWluZm8sIGR3T3BlbkZsYWdzLCB0eXBlKTsKICAgIAogICAgaWYgKGR3T3BlbkZsYWdzICYgKE1NSU9fUEFSU0V8TU1JT19FWElTVCkpIHsKCWNoYXIJYnVmZmVyW01BWF9QQVRIXTsKCQoJaWYgKEdldEZ1bGxQYXRoTmFtZUEoc3pGaWxlTmFtZSwgc2l6ZW9mKGJ1ZmZlciksIGJ1ZmZlciwgTlVMTCkgPj0gc2l6ZW9mKGJ1ZmZlcikpCgkgICAgcmV0dXJuIChITU1JTzE2KUZBTFNFOwoJaWYgKChkd09wZW5GbGFncyAmIE1NSU9fRVhJU1QpICYmIChHZXRGaWxlQXR0cmlidXRlc0EoYnVmZmVyKSA9PSAtMSkpCgkgICAgcmV0dXJuIChITU1JTylGQUxTRTsKCXN0cmNweShzekZpbGVOYW1lLCBidWZmZXIpOwoJcmV0dXJuIChITU1JTylUUlVFOwogICAgfQogICAgCiAgICBpZiAoKHdtID0gTU1JT19DcmVhdGUoKSkgPT0gTlVMTCkKCXJldHVybiAwOwoKICAgIC8qIElmIGJvdGggcGFyYW1zIGFyZSBOVUxMLCB0aGVuIHBhcnNlIHRoZSBmaWxlIG5hbWUgKi8KICAgIGlmIChyZWZtbWluZm8tPmZjY0lPUHJvYyA9PSAwICYmIHJlZm1taW5mby0+cElPUHJvYyA9PSBOVUxMKSB7Cgl3bS0+aW5mby5mY2NJT1Byb2MgPSBNTUlPX1BhcnNlRXh0KHN6RmlsZU5hbWUpOwoJLyogSGFuZGxlIGFueSB1bmhhbmRsZWQvZXJyb3IgY2FzZS4gQXNzdW1lIERPUyBmaWxlICovCglpZiAod20tPmluZm8uZmNjSU9Qcm9jID09IDApCgkgICAgd20tPmluZm8uZmNjSU9Qcm9jID0gRk9VUkNDX0RPUzsKCWlmICghKHdtLT5pb1Byb2MgPSBNTUlPX0ZpbmRQcm9jTm9kZSh3bS0+aW5mby5mY2NJT1Byb2MpKSkgZ290byBlcnJvcjI7Cgl3bS0+aW5mby5wSU9Qcm9jID0gd20tPmlvUHJvYy0+cElPUHJvYzsKCXdtLT5iVG1wSU9Qcm9jID0gRkFMU0U7CiAgICB9CiAgICAvKiBpZiBqdXN0IHRoZSBmb3VyIGNoYXJhY3RlciBjb2RlIGlzIHByZXNlbnQsIGxvb2sgdXAgSU8gcHJvYyAqLwogICAgZWxzZSBpZiAocmVmbW1pbmZvLT5wSU9Qcm9jID09IE5VTEwpIHsJCgl3bS0+aW5mby5mY2NJT1Byb2MgPSByZWZtbWluZm8tPmZjY0lPUHJvYzsKCWlmICghKHdtLT5pb1Byb2MgPSBNTUlPX0ZpbmRQcm9jTm9kZSh3bS0+aW5mby5mY2NJT1Byb2MpKSkgZ290byBlcnJvcjI7Cgl3bS0+aW5mby5wSU9Qcm9jID0gd20tPmlvUHJvYy0+cElPUHJvYzsKCXdtLT5iVG1wSU9Qcm9jID0gRkFMU0U7CiAgICB9IAogICAgLyogaWYgSU8gcHJvYyBzcGVjaWZpZWQsIHVzZSBpdCBhbmQgc3BlY2lmaWVkIGZvdXIgY2hhcmFjdGVyIGNvZGUgKi8KICAgIGVsc2UgewoJd20tPmluZm8uZmNjSU9Qcm9jID0gcmVmbW1pbmZvLT5mY2NJT1Byb2M7Cgl3bS0+aW5mby5wSU9Qcm9jID0gcmVmbW1pbmZvLT5wSU9Qcm9jOwoJTU1JT19JbnN0YWxsSU9Qcm9jKHdtLT5pbmZvLmZjY0lPUHJvYywgd20tPmluZm8ucElPUHJvYywgCgkJCSAgIE1NSU9fSU5TVEFMTFBST0MsIHR5cGUpOwoJaWYgKCEod20tPmlvUHJvYyA9IE1NSU9fRmluZFByb2NOb2RlKHdtLT5pbmZvLmZjY0lPUHJvYykpKSBnb3RvIGVycm9yMjsKCWFzc2VydCh3bS0+aW9Qcm9jLT5wSU9Qcm9jID09IHJlZm1taW5mby0+cElPUHJvYyk7Cgl3bS0+aW5mby5wSU9Qcm9jID0gd20tPmlvUHJvYy0+cElPUHJvYzsKCXdtLT5iVG1wSU9Qcm9jID0gVFJVRTsKICAgIH0KICAgIAogICAgd20tPmlvUHJvYy0+Y291bnQrKzsKICAgIGlmIChkd09wZW5GbGFncyAmIE1NSU9fQUxMT0NCVUYpIHsKCWlmICgocmVmbW1pbmZvLT53RXJyb3JSZXQgPSBtbWlvU2V0QnVmZmVyKHdtLT5pbmZvLmhtbWlvLCBOVUxMLCAKCQkJCQkJICBNTUlPX0RFRkFVTFRCVUZGRVIsIDApKSkKCSAgICBnb3RvIGVycm9yMTsKICAgIH0gZWxzZSBpZiAod20tPmluZm8uZmNjSU9Qcm9jID09IEZPVVJDQ19NRU0pIHsKCXJlZm1taW5mby0+d0Vycm9yUmV0ID0gTU1JT19TZXRCdWZmZXIod20sIHJlZm1taW5mby0+cGNoQnVmZmVyLCAKCQkJCQkgICAgICByZWZtbWluZm8tPmNjaEJ1ZmZlciwgMCwgCgkJCQkJICAgICAgdHlwZSAhPSBNTUlPX1BST0NfMTYpOwoJaWYgKHJlZm1taW5mby0+d0Vycm9yUmV0ICE9IE1NU1lTRVJSX05PRVJST1IpCgkgICAgZ290byBlcnJvcjE7CiAgICB9IC8qIGVsc2UgPT4gdW5idWZmZXJlZCwgd20tPmluZm8ucGNoQnVmZmVyID09IE5VTEwgKi8KICAgIAogICAgLyogc2VlIG1taW9Eb3NJT1Byb2MgZm9yIHRoYXQgb25lICovCiAgICB3bS0+aW5mby5hZHdJbmZvWzBdID0gcmVmbW1pbmZvLT5hZHdJbmZvWzBdOwogICAgd20tPmluZm8uZHdGbGFncyA9IGR3T3BlbkZsYWdzOwogICAgCiAgICAvKiBjYWxsIElPIHByb2MgdG8gYWN0dWFsbHkgb3BlbiBmaWxlICovCiAgICByZWZtbWluZm8tPndFcnJvclJldCA9IE1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX09QRU4sIChMUEFSQU0pc3pGaWxlTmFtZSwgCgkJCQkJICAgIHR5cGUgPT0gTU1JT19QUk9DXzE2LCBNTUlPX1BST0NfMzJBKTsKICAgIAogICAgaWYgKHJlZm1taW5mby0+d0Vycm9yUmV0ID09IDApCglyZXR1cm4gd20tPmluZm8uaG1taW87CiBlcnJvcjE6CiAgICBpZiAod20tPmlvUHJvYykgd20tPmlvUHJvYy0+Y291bnQtLTsKIGVycm9yMjoKICAgIE1NSU9fRGVzdHJveSh3bSk7CiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvT3BlblcgICAgICAgCQlbV0lOTU0uMTIzXQogKi8KSE1NSU8gV0lOQVBJIG1taW9PcGVuVyhMUFdTVFIgc3pGaWxlTmFtZSwgTU1JT0lORk8qIGxwbW1pb2luZm8sCgkJICAgICAgIERXT1JEIGR3T3BlbkZsYWdzKQp7CiAgICBITU1JTyAJcmV0OwogICAgTFBTVFIJc3pGbiA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzekZpbGVOYW1lKTsKCiAgICBpZiAobHBtbWlvaW5mbykgewoJcmV0ID0gTU1JT19PcGVuKHN6Rm4sIGxwbW1pb2luZm8sIGR3T3BlbkZsYWdzLCBNTUlPX1BST0NfMzJXKTsKICAgIH0gZWxzZSB7CglNTUlPSU5GTwltbWlvaW5mbzsKCQoJbW1pb2luZm8uZmNjSU9Qcm9jID0gMDsKCW1taW9pbmZvLnBJT1Byb2MgPSBOVUxMOwoJbW1pb2luZm8ucGNoQnVmZmVyID0gTlVMTDsKCW1taW9pbmZvLmNjaEJ1ZmZlciA9IDA7CgkKCXJldCA9IE1NSU9fT3BlbihzekZuLCAmbW1pb2luZm8sIGR3T3BlbkZsYWdzLCBNTUlPX1BST0NfMzJXKTsKICAgIH0KCiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzekZuKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb09wZW5BICAgICAgIAkJW1dJTk1NLjEyMl0KICovCkhNTUlPIFdJTkFQSSBtbWlvT3BlbkEoTFBTVFIgc3pGaWxlTmFtZSwgTU1JT0lORk8qIGxwbW1pb2luZm8sIAoJCSAgICAgICBEV09SRCBkd09wZW5GbGFncykKewogICAgSE1NSU8gCXJldDsKICAgIAogICAgaWYgKGxwbW1pb2luZm8pIHsKCXJldCA9IE1NSU9fT3BlbihzekZpbGVOYW1lLCBscG1taW9pbmZvLCBkd09wZW5GbGFncywgTU1JT19QUk9DXzMyQSk7CiAgICB9IGVsc2UgewoJTU1JT0lORk8JbW1pb2luZm87CgkKCW1taW9pbmZvLmZjY0lPUHJvYyA9IDA7CgltbWlvaW5mby5wSU9Qcm9jID0gTlVMTDsKCW1taW9pbmZvLnBjaEJ1ZmZlciA9IE5VTEw7CgltbWlvaW5mby5jY2hCdWZmZXIgPSAwOwoJCglyZXQgPSBNTUlPX09wZW4oc3pGaWxlTmFtZSwgJm1taW9pbmZvLCBkd09wZW5GbGFncywgTU1JT19QUk9DXzMyQSk7CiAgICB9CiAgICByZXR1cm4gcmV0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9PcGVuICAgICAgIAkJW01NU1lTVEVNLjEyMTBdCiAqLwpITU1JTzE2IFdJTkFQSSBtbWlvT3BlbjE2KExQU1RSIHN6RmlsZU5hbWUsIE1NSU9JTkZPMTYqIGxwbW1pb2luZm8xNiwgCgkJCSAgRFdPUkQgZHdPcGVuRmxhZ3MpCnsKICAgIEhNTUlPIAlyZXQ7CiAgICBNTUlPSU5GTwltbWlvOwogICAgCiAgICBpZiAobHBtbWlvaW5mbzE2KSB7CglNTUlPSU5GTwltbWlvaW5mbzsKICAgICAgIAoJbWVtc2V0KCZtbWlvaW5mbywgMCwgc2l6ZW9mKG1taW9pbmZvKSk7CgoJbW1pb2luZm8uZHdGbGFncyAgICAgPSBscG1taW9pbmZvMTYtPmR3RmxhZ3M7IAoJbW1pb2luZm8uZmNjSU9Qcm9jICAgPSBscG1taW9pbmZvMTYtPmZjY0lPUHJvYzsgCgltbWlvaW5mby5wSU9Qcm9jICAgICA9IChMUE1NSU9QUk9DKWxwbW1pb2luZm8xNi0+cElPUHJvYzsgCgltbWlvaW5mby5jY2hCdWZmZXIgICA9IGxwbW1pb2luZm8xNi0+Y2NoQnVmZmVyOyAKCW1taW9pbmZvLnBjaEJ1ZmZlciAgID0gbHBtbWlvaW5mbzE2LT5wY2hCdWZmZXI7CgltbWlvaW5mby5hZHdJbmZvWzBdICA9IGxwbW1pb2luZm8xNi0+YWR3SW5mb1swXTsgCgltbWlvaW5mby5hZHdJbmZvWzFdICA9IGxwbW1pb2luZm8xNi0+YWR3SW5mb1sxXTsgCgltbWlvaW5mby5hZHdJbmZvWzJdICA9IGxwbW1pb2luZm8xNi0+YWR3SW5mb1syXTsgCgltbWlvaW5mby5hZHdJbmZvWzNdICA9IGxwbW1pb2luZm8xNi0+YWR3SW5mb1szXTsgCgkKCXJldCA9IE1NSU9fT3BlbihzekZpbGVOYW1lLCAmbW1pb2luZm8sIGR3T3BlbkZsYWdzLCBNTUlPX1BST0NfMTYpOwoKCW1taW9HZXRJbmZvMTYobW1pb2luZm8uaG1taW8sIGxwbW1pb2luZm8xNiwgMCk7CglscG1taW9pbmZvMTYtPndFcnJvclJldCA9IHJldDsKICAgIH0gZWxzZSB7CgltbWlvLmZjY0lPUHJvYyA9IDA7CgltbWlvLnBJT1Byb2MgPSBOVUxMOwoJbW1pby5wY2hCdWZmZXIgPSBOVUxMOwoJbW1pby5jY2hCdWZmZXIgPSAwOwoJcmV0ID0gTU1JT19PcGVuKHN6RmlsZU5hbWUsICZtbWlvLCBkd09wZW5GbGFncywgRkFMU0UpOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKICAgIAovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9DbG9zZSAgICAgIAkJW1dJTk1NLjExNF0KICovCk1NUkVTVUxUIFdJTkFQSSBtbWlvQ2xvc2UoSE1NSU8gaG1taW8sIFVJTlQgdUZsYWdzKQp7CiAgICBMUFdJTkVfTU1JTwl3bTsKICAgIE1NUkVTVUxUIAlyZXN1bHQ7CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJTA0WCk7XG4iLCBobW1pbywgdUZsYWdzKTsKICAgIAogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKICAgIAogICAgaWYgKChyZXN1bHQgPSBNTUlPX0ZsdXNoKHdtLCBNTUlPX0VNUFRZQlVGKSkgIT0gMCkKCXJldHVybiByZXN1bHQ7CiAgICAKICAgIHJlc3VsdCA9IE1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX0NMT1NFLCB1RmxhZ3MsIDAsIE1NSU9fUFJPQ18zMkEpOwogICAgCiAgICBtbWlvU2V0QnVmZmVyKGhtbWlvLCBOVUxMLCAwLCAwKTsKICAgIAogICAgd20tPmlvUHJvYy0+Y291bnQtLTsKCiAgICBpZiAod20tPmJUbXBJT1Byb2MpCglNTUlPX0luc3RhbGxJT1Byb2Mod20tPmluZm8uZmNjSU9Qcm9jLCBOVUxMLCAKCQkJICAgTU1JT19SRU1PVkVQUk9DLCB3bS0+aW9Qcm9jLT50eXBlKTsKCiAgICBNTUlPX0Rlc3Ryb3kod20pOwoKICAgIHJldHVybiByZXN1bHQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0Nsb3NlICAgICAgCQlbTU1TWVNURU0uMTIxMV0KICovCk1NUkVTVUxUMTYgV0lOQVBJIG1taW9DbG9zZTE2KEhNTUlPMTYgaG1taW8sIFVJTlQxNiB1RmxhZ3MpCnsKICAgIHJldHVybiBtbWlvQ2xvc2UoaG1taW8sIHVGbGFncyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1JlYWQJICAgICAgIAlbV0lOTU0uMTI0XQogKi8KTE9ORyBXSU5BUEkgbW1pb1JlYWQoSE1NSU8gaG1taW8sIEhQU1RSIHBjaCwgTE9ORyBjY2gpCnsKICAgIExQV0lORV9NTUlPCXdtOwogICAgTE9ORyAJY291bnQ7CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJXAsICVsZCk7XG4iLCBobW1pbywgcGNoLCBjY2gpOwogICAgCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIC0xOwoKICAgIC8qIHVuYnVmZmVyZWQgY2FzZSBmaXJzdCAqLwogICAgaWYgKCF3bS0+aW5mby5wY2hCdWZmZXIpCglyZXR1cm4gTU1JT19TZW5kTWVzc2FnZSh3bSwgTU1JT01fUkVBRCwgKExQQVJBTSlwY2gsIGNjaCwgTU1JT19QUk9DXzMyQSk7CgogICAgLyogZmlyc3QgdHJ5IGZyb20gY3VycmVudCBidWZmZXIgKi8KICAgIGlmICh3bS0+aW5mby5wY2hOZXh0ICE9IHdtLT5pbmZvLnBjaEVuZFJlYWQpIHsKCWNvdW50ID0gd20tPmluZm8ucGNoRW5kUmVhZCAtIHdtLT5pbmZvLnBjaE5leHQ7CglpZiAoY291bnQgPiBjY2ggfHwgY291bnQgPCAwKSBjb3VudCA9IGNjaDsKCW1lbWNweShwY2gsIHdtLT5pbmZvLnBjaE5leHQsIGNvdW50KTsKCXdtLT5pbmZvLnBjaE5leHQgKz0gY291bnQ7CglwY2ggKz0gY291bnQ7CgljY2ggLT0gY291bnQ7CiAgICB9IGVsc2UKCWNvdW50ID0gMDsKICAgIAogICAgaWYgKGNjaCAmJiAod20tPmluZm8uZmNjSU9Qcm9jICE9IEZPVVJDQ19NRU0pKSB7Cglhc3NlcnQod20tPmluZm8uY2NoQnVmZmVyKTsKCgl3aGlsZSAoY2NoKSB7CgkgICAgTE9ORyBzaXplOwoKCSAgICBzaXplID0gTU1JT19HcmFiTmV4dEJ1ZmZlcih3bSwgVFJVRSk7CgkgICAgaWYgKHNpemUgPD0gMCkgYnJlYWs7CgkgICAgaWYgKHNpemUgPiBjY2gpIHNpemUgPSBjY2g7CgkgICAgbWVtY3B5KHBjaCwgd20tPmluZm8ucGNoQnVmZmVyLCBzaXplKTsKCSAgICB3bS0+aW5mby5wY2hOZXh0ICs9IHNpemU7CgkgICAgcGNoICs9IHNpemU7CgkgICAgY2NoIC09IHNpemU7CgkgICAgY291bnQgKz0gc2l6ZTsKCX0KICAgIH0KICAgIAogICAgVFJBQ0UoImNvdW50PSVsZFxuIiwgY291bnQpOwogICAgcmV0dXJuIGNvdW50Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9SZWFkCSAgICAgICAJW01NU1lTVEVNLjEyMTJdCiAqLwpMT05HIFdJTkFQSSBtbWlvUmVhZDE2KEhNTUlPMTYgaG1taW8sIEhQU1RSIHBjaCwgTE9ORyBjY2gpCnsKICAgIHJldHVybiBtbWlvUmVhZChobW1pbywgcGNoLCBjY2gpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9Xcml0ZSAgICAgIAkJW1dJTk1NLjEzM10KICovCkxPTkcgV0lOQVBJIG1taW9Xcml0ZShITU1JTyBobW1pbywgSFBDU1RSIHBjaCwgTE9ORyBjY2gpCnsKICAgIExQV0lORV9NTUlPCXdtOwogICAgTE9ORyBjb3VudCxieXRlc1c9MDsKCiAgICBUUkFDRSgiKCUwNFgsICVwLCAlbGQpO1xuIiwgaG1taW8sIHBjaCwgY2NoKTsKCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIC0xOwogICAgCiAgICBpZiAod20tPmluZm8uY2NoQnVmZmVyKSB7Cgljb3VudCA9IDA7Cgl3aGlsZSAoY2NoKSB7CgkgICAgaWYgKHdtLT5pbmZvLnBjaE5leHQgIT0gd20tPmluZm8ucGNoRW5kV3JpdGUpIHsKCQljb3VudCA9IHdtLT5pbmZvLnBjaEVuZFdyaXRlIC0gd20tPmluZm8ucGNoTmV4dDsKCQlpZiAoY291bnQgPiBjY2ggfHwgY291bnQgPCAwKSBjb3VudCA9IGNjaDsKCQltZW1jcHkod20tPmluZm8ucGNoTmV4dCwgcGNoLCBjb3VudCk7CgkJd20tPmluZm8ucGNoTmV4dCArPSBjb3VudDsKCQlwY2ggKz0gY291bnQ7CiAgICAgICAgICAgICAgICBjY2ggLT0gY291bnQ7CiAgICAgICAgICAgICAgICBieXRlc1crPWNvdW50OyAgICAgICAgICAgICAgICAKCQl3bS0+aW5mby5kd0ZsYWdzIHw9IE1NSU9fRElSVFk7CgkgICAgfSBlbHNlCgkJaWYgKHdtLT5pbmZvLmZjY0lPUHJvYyA9PSBGT1VSQ0NfTUVNKSB7CgkJICAgIGlmICh3bS0+aW5mby5hZHdJbmZvWzBdKSB7CgkJCS8qIGZyb20gd2hlcmUgd291bGQgd2UgZ2V0IHRoZSBtZW1vcnkgaGFuZGxlPyAqLwogICAgICAgICAgICAgICAgICAgICAgICBGSVhNRSgibWVtb3J5IGZpbGUgZXhwYW5zaW9uIG5vdCBpbXBsZW1lbnRlZCFcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKCQkgICAgfSBlbHNlIGJyZWFrOwoJCX0KCiAgICAgICAgICAgIGlmICh3bS0+aW5mby5wY2hOZXh0ID09IHdtLT5pbmZvLnBjaEVuZFdyaXRlKSBNTUlPX0ZsdXNoKHdtLCBNTUlPX0VNUFRZQlVGKTsKICAgICAgICAgICAgZWxzZSBicmVhazsKCX0KICAgIH0gZWxzZSB7CglieXRlc1cgPSBNTUlPX1NlbmRNZXNzYWdlKHdtLCBNTUlPTV9XUklURSwgKExQQVJBTSlwY2gsIGNjaCwgTU1JT19QUk9DXzMyQSk7Cgl3bS0+aW5mby5sQnVmT2Zmc2V0ID0gd20tPmluZm8ubERpc2tPZmZzZXQ7CiAgICB9CiAgICAKICAgIFRSQUNFKCJieXRlcyB3cml0dGVuPSVsZFxuIiwgYnl0ZXNXKTsKICAgIHJldHVybiBieXRlc1c7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1dyaXRlICAgICAgCQlbTU1TWVNURU0uMTIxM10KICovCkxPTkcgV0lOQVBJIG1taW9Xcml0ZTE2KEhNTUlPMTYgaG1taW8sIEhQQ1NUUiBwY2gsIExPTkcgY2NoKQp7CiAgICByZXR1cm4gbW1pb1dyaXRlKGhtbWlvLHBjaCxjY2gpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9TZWVrICAgICAgIAkJW01NU1lTVEVNLjEyMTRdCiAqLwpMT05HIFdJTkFQSSBtbWlvU2VlayhITU1JTyBobW1pbywgTE9ORyBsT2Zmc2V0LCBJTlQgaU9yaWdpbikKewogICAgTFBXSU5FX01NSU8Jd207CiAgICBMT05HIAlvZmZzZXQ7CgogICAgVFJBQ0UoIiglMDRYLCAlMDhsWCwgJWQpO1xuIiwgaG1taW8sIGxPZmZzZXQsIGlPcmlnaW4pOwogICAgCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwoKICAgIGlmICghd20tPmluZm8ucGNoQnVmZmVyKQoJcmV0dXJuIE1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX1NFRUssIGxPZmZzZXQsIGlPcmlnaW4sIE1NSU9fUFJPQ18zMkEpOwoKICAgIHN3aXRjaCAoaU9yaWdpbikgewogICAgY2FzZSBTRUVLX1NFVDogCglvZmZzZXQgPSBsT2Zmc2V0OwoJYnJlYWs7CiAgICBjYXNlIFNFRUtfQ1VSOiAKCW9mZnNldCA9IHdtLT5pbmZvLmxCdWZPZmZzZXQgKyAod20tPmluZm8ucGNoTmV4dCAtIHdtLT5pbmZvLnBjaEJ1ZmZlcikgKyBsT2Zmc2V0OwoJYnJlYWs7CiAgICBjYXNlIFNFRUtfRU5EOiAKCWlmICh3bS0+aW5mby5mY2NJT1Byb2MgPT0gRk9VUkNDX01FTSkgewoJICAgIG9mZnNldCA9IHdtLT5pbmZvLmNjaEJ1ZmZlcjsKCX0gZWxzZSB7CgkgICAgYXNzZXJ0KE1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX1NFRUssIDAsIFNFRUtfQ1VSLCBNTUlPX1BST0NfMzJBKSA9PSB3bS0+aW5mby5sRGlza09mZnNldCk7CgkgICAgb2Zmc2V0ID0gTU1JT19TZW5kTWVzc2FnZSh3bSwgTU1JT01fU0VFSywgMCwgU0VFS19FTkQsIE1NSU9fUFJPQ18zMkEpOwoJICAgIE1NSU9fU2VuZE1lc3NhZ2Uod20sIE1NSU9NX1NFRUssIHdtLT5pbmZvLmxEaXNrT2Zmc2V0LCBTRUVLX1NFVCwgTU1JT19QUk9DXzMyQSk7Cgl9CglvZmZzZXQgKz0gbE9mZnNldDsKCWJyZWFrOwogICAgZGVmYXVsdDoKCXJldHVybiAtMTsKICAgIH0KCiAgICAvKiBzdGF5IGluIHNhbWUgYnVmZmVyID8gKi8KICAgIC8qIHNvbWUgbWVtb3J5IG1hcHBlZCBidWZmZXJzIGFyZSBkZWZpbmVkIHdpdGggLTEgYXMgYSBzaXplICovCiAgICBpZiAoKHdtLT5pbmZvLmNjaEJ1ZmZlciA+IDApICYmCgkoKG9mZnNldCA8IHdtLT5pbmZvLmxCdWZPZmZzZXQpIHx8CgkgKG9mZnNldCA+PSB3bS0+aW5mby5sQnVmT2Zmc2V0ICsgd20tPmluZm8uY2NoQnVmZmVyKSkpIHsKCgkvKiBjb25kaXRpb24gdG8gY2hhbmdlIGJ1ZmZlciAqLwoJaWYgKCh3bS0+aW5mby5mY2NJT1Byb2MgPT0gRk9VUkNDX01FTSkgfHwgCgkgICAgTU1JT19GbHVzaCh3bSwgTU1JT19FTVBUWUJVRikgfHwKCSAgICAvKiB0aGlzIGFsc28gc2V0cyB0aGUgd20tPmluZm8ubERpc2tPZmZzZXQgZmllbGQgKi8KCSAgICBNTUlPX1NlbmRNZXNzYWdlKHdtLCBNTUlPTV9TRUVLLCAKCQkJICAgICAob2Zmc2V0IC8gd20tPmluZm8uY2NoQnVmZmVyKSAqIHdtLT5pbmZvLmNjaEJ1ZmZlciwKCQkJICAgICBTRUVLX1NFVCwgTU1JT19QUk9DXzMyQSkgPT0gLTEpCgkgICAgcmV0dXJuIC0xOwoJTU1JT19HcmFiTmV4dEJ1ZmZlcih3bSwgVFJVRSk7CiAgICB9CgogICAgd20tPmluZm8ucGNoTmV4dCA9IHdtLT5pbmZvLnBjaEJ1ZmZlciArIChvZmZzZXQgLSB3bS0+aW5mby5sQnVmT2Zmc2V0KTsKCiAgICBUUkFDRSgiPT4gJWxkXG4iLCBvZmZzZXQpOwogICAgcmV0dXJuIG9mZnNldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU2VlayAgICAgICAJCVtNTVNZU1RFTS4xMjE0XQogKi8KTE9ORyBXSU5BUEkgbW1pb1NlZWsxNihITU1JTzE2IGhtbWlvLCBMT05HIGxPZmZzZXQsIElOVDE2IGlPcmlnaW4pCnsKICAgIHJldHVybiBtbWlvU2VlayhobW1pbywgbE9mZnNldCwgaU9yaWdpbik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0dldEluZm8JICAgICAgIAlbTU1TWVNURU0uMTIxNV0KICovClVJTlQxNiBXSU5BUEkgbW1pb0dldEluZm8xNihITU1JTzE2IGhtbWlvLCBNTUlPSU5GTzE2KiBscG1taW9pbmZvLCBVSU5UMTYgdUZsYWdzKQp7CiAgICBMUFdJTkVfTU1JTwl3bTsKCiAgICBUUkFDRSgibW1pb0dldEluZm9cbiIpOwoKICAgIGlmICgod20gPSBNTUlPX0dldChOVUxMLCBobW1pbykpID09IE5VTEwpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CgogICAgaWYgKCF3bS0+YnVmZmVyMTYpCglyZXR1cm4gTU1TWVNFUlJfRVJST1I7CgogICAgbHBtbWlvaW5mby0+ZHdGbGFncyAgICAgPSB3bS0+aW5mby5kd0ZsYWdzOyAKICAgIGxwbW1pb2luZm8tPmZjY0lPUHJvYyAgID0gd20tPmluZm8uZmNjSU9Qcm9jOyAKICAgIGxwbW1pb2luZm8tPnBJT1Byb2MgICAgID0gKExQTU1JT1BST0MxNil3bS0+aW5mby5wSU9Qcm9jOyAKICAgIGxwbW1pb2luZm8tPndFcnJvclJldCAgID0gd20tPmluZm8ud0Vycm9yUmV0OyAKICAgIGxwbW1pb2luZm8tPmhUYXNrICAgICAgID0gd20tPmluZm8uaFRhc2s7IAogICAgbHBtbWlvaW5mby0+Y2NoQnVmZmVyICAgPSB3bS0+aW5mby5jY2hCdWZmZXI7IAogICAgbHBtbWlvaW5mby0+cGNoQnVmZmVyICAgPSAodm9pZCopd20tPmJ1ZmZlcjE2OwogICAgbHBtbWlvaW5mby0+cGNoTmV4dCAgICAgPSAodm9pZCopKHdtLT5idWZmZXIxNiArICh3bS0+aW5mby5wY2hOZXh0IC0gd20tPmluZm8ucGNoQnVmZmVyKSk7CiAgICBscG1taW9pbmZvLT5wY2hFbmRSZWFkICA9ICh2b2lkKikod20tPmJ1ZmZlcjE2ICsgKHdtLT5pbmZvLnBjaEVuZFJlYWQgLSB3bS0+aW5mby5wY2hCdWZmZXIpKTsKICAgIGxwbW1pb2luZm8tPnBjaEVuZFdyaXRlID0gKHZvaWQqKSh3bS0+YnVmZmVyMTYgKyAod20tPmluZm8ucGNoRW5kV3JpdGUgLSB3bS0+aW5mby5wY2hCdWZmZXIpKTsgCiAgICBscG1taW9pbmZvLT5sQnVmT2Zmc2V0ICA9IHdtLT5pbmZvLmxCdWZPZmZzZXQ7IAogICAgbHBtbWlvaW5mby0+bERpc2tPZmZzZXQgPSB3bS0+aW5mby5sRGlza09mZnNldDsgCiAgICBscG1taW9pbmZvLT5hZHdJbmZvWzBdICA9IHdtLT5pbmZvLmFkd0luZm9bMF07IAogICAgbHBtbWlvaW5mby0+YWR3SW5mb1sxXSAgPSB3bS0+aW5mby5hZHdJbmZvWzFdOyAKICAgIGxwbW1pb2luZm8tPmFkd0luZm9bMl0gID0gd20tPmluZm8uYWR3SW5mb1syXTsgCiAgICBscG1taW9pbmZvLT5hZHdJbmZvWzNdICA9IHdtLT5pbmZvLmFkd0luZm9bM107IAogICAgbHBtbWlvaW5mby0+ZHdSZXNlcnZlZDEgPSAwOwogICAgbHBtbWlvaW5mby0+ZHdSZXNlcnZlZDIgPSAwOwogICAgbHBtbWlvaW5mby0+aG1taW8gPSB3bS0+aW5mby5obW1pbzsgCgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0dldEluZm8JICAgICAgIAlbV0lOTU0uMTE4XQogKi8KVUlOVCBXSU5BUEkgbW1pb0dldEluZm8oSE1NSU8gaG1taW8sIE1NSU9JTkZPKiBscG1taW9pbmZvLCBVSU5UIHVGbGFncykKewogICAgTFBXSU5FX01NSU8JCXdtOwogICAgCiAgICBUUkFDRSgiKDB4JTA0eCwlcCwweCUwOHgpXG4iLGhtbWlvLGxwbW1pb2luZm8sdUZsYWdzKTsKCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwoKICAgIG1lbWNweShscG1taW9pbmZvLCAmd20tPmluZm8sIHNpemVvZihNTUlPSU5GTykpOwoKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9TZXRJbmZvMTYgIAkJW01NU1lTVEVNLjEyMTZdCiAqLwpVSU5UMTYgV0lOQVBJIG1taW9TZXRJbmZvMTYoSE1NSU8xNiBobW1pbywgY29uc3QgTU1JT0lORk8xNiogbHBtbWlvaW5mbywgVUlOVDE2IHVGbGFncykKewogICAgTFBXSU5FX01NSU8JCXdtOwoKICAgIFRSQUNFKCJtbWlvU2V0SW5mb1xuIik7CgogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKCiAgICAvKiBjaGVjayBpZiBzZWcgYW5kIGxpbiBidWZmZXJzIGFyZSB0aGUgc2FtZSAqLwogICAgaWYgKHdtLT5pbmZvLmNjaEJ1ZmZlciAhPSBscG1taW9pbmZvLT5jY2hCdWZmZXIgfHwKCXdtLT5pbmZvLnBjaEJ1ZmZlciAhPSBQVFJfU0VHX1RPX0xJTigodm9pZCopd20tPmJ1ZmZlcjE2KSkKCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwoJCiAgICAvKiBjaGVjayBwb2ludGVycyBjb2hlcmVuY2UgKi8KICAgIGlmIChscG1taW9pbmZvLT5wY2hOZXh0IDwgbHBtbWlvaW5mby0+cGNoQnVmZmVyIHx8IAoJbHBtbWlvaW5mby0+cGNoTmV4dCA+IGxwbW1pb2luZm8tPnBjaEJ1ZmZlciArIGxwbW1pb2luZm8tPmNjaEJ1ZmZlciB8fAoJbHBtbWlvaW5mby0+cGNoRW5kUmVhZCA8IGxwbW1pb2luZm8tPnBjaEJ1ZmZlciB8fCAKCWxwbW1pb2luZm8tPnBjaEVuZFJlYWQgPiBscG1taW9pbmZvLT5wY2hCdWZmZXIgKyBscG1taW9pbmZvLT5jY2hCdWZmZXIgfHwKCWxwbW1pb2luZm8tPnBjaEVuZFdyaXRlIDwgbHBtbWlvaW5mby0+cGNoQnVmZmVyIHx8IAoJbHBtbWlvaW5mby0+cGNoRW5kV3JpdGUgPiBscG1taW9pbmZvLT5wY2hCdWZmZXIgKyBscG1taW9pbmZvLT5jY2hCdWZmZXIpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKCiAgICB3bS0+aW5mby5wY2hOZXh0ICAgICA9IHdtLT5pbmZvLnBjaEJ1ZmZlciArIChscG1taW9pbmZvLT5wY2hOZXh0ICAgICAtIGxwbW1pb2luZm8tPnBjaEJ1ZmZlcik7CiAgICB3bS0+aW5mby5wY2hFbmRSZWFkICA9IHdtLT5pbmZvLnBjaEJ1ZmZlciArIChscG1taW9pbmZvLT5wY2hFbmRSZWFkICAtIGxwbW1pb2luZm8tPnBjaEJ1ZmZlcik7CiAgICB3bS0+aW5mby5wY2hFbmRXcml0ZSA9IHdtLT5pbmZvLnBjaEJ1ZmZlciArIChscG1taW9pbmZvLT5wY2hFbmRXcml0ZSAtIGxwbW1pb2luZm8tPnBjaEJ1ZmZlcik7CgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1NldEluZm8gICAgCQlbV0lOTU0uMTMwXQogKi8KVUlOVCBXSU5BUEkgbW1pb1NldEluZm8oSE1NSU8gaG1taW8sIGNvbnN0IE1NSU9JTkZPKiBscG1taW9pbmZvLCBVSU5UIHVGbGFncykKewogICAgTFBXSU5FX01NSU8JCXdtOwoKICAgIFRSQUNFKCJtbWlvU2V0SW5mb1xuIik7CgogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKICAgIAogICAgLyogY2hlY2sgcG9pbnRlcnMgY29oZXJlbmNlICovCiAgICBpZiAobHBtbWlvaW5mby0+cGNoTmV4dCA8IHdtLT5pbmZvLnBjaEJ1ZmZlciB8fCAKCWxwbW1pb2luZm8tPnBjaE5leHQgPiB3bS0+aW5mby5wY2hCdWZmZXIgKyB3bS0+aW5mby5jY2hCdWZmZXIgfHwKCWxwbW1pb2luZm8tPnBjaEVuZFJlYWQgPCB3bS0+aW5mby5wY2hCdWZmZXIgfHwgCglscG1taW9pbmZvLT5wY2hFbmRSZWFkID4gd20tPmluZm8ucGNoQnVmZmVyICsgd20tPmluZm8uY2NoQnVmZmVyIHx8CglscG1taW9pbmZvLT5wY2hFbmRXcml0ZSA8IHdtLT5pbmZvLnBjaEJ1ZmZlciB8fCAKCWxwbW1pb2luZm8tPnBjaEVuZFdyaXRlID4gd20tPmluZm8ucGNoQnVmZmVyICsgd20tPmluZm8uY2NoQnVmZmVyKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CgogICAgd20tPmluZm8ucGNoTmV4dCA9IGxwbW1pb2luZm8tPnBjaE5leHQ7CiAgICB3bS0+aW5mby5wY2hFbmRSZWFkID0gbHBtbWlvaW5mby0+cGNoRW5kUmVhZDsKCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiogCQkJCW1taW9TZXRCdWZmZXIJCVtXSU5NTS4xMjldCiovClVJTlQgV0lOQVBJIG1taW9TZXRCdWZmZXIoSE1NSU8gaG1taW8sIExQU1RSIHBjaEJ1ZmZlciwgTE9ORyBjY2hCdWZmZXIsIFVJTlQgdUZsYWdzKQp7CiAgICBMUFdJTkVfTU1JTwkJd207CgogICAgVFJBQ0UoIihobW1pbz0lMDR4LCBwY2hCdWY9JXAsIGNjaEJ1Zj0lbGQsIHVGbGFncz0lIzA4eClcbiIsCgkgIGhtbWlvLCBwY2hCdWZmZXIsIGNjaEJ1ZmZlciwgdUZsYWdzKTsKICAgIAogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKCiAgICByZXR1cm4gTU1JT19TZXRCdWZmZXIod20sIHBjaEJ1ZmZlciwgY2NoQnVmZmVyLCB1RmxhZ3MsIFRSVUUpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9TZXRCdWZmZXIJCVtNTVNZU1RFTS4xMjE3XQogKi8KVUlOVDE2IFdJTkFQSSBtbWlvU2V0QnVmZmVyMTYoSE1NSU8xNiBobW1pbywgTFBTVFIgc2VncGNoQnVmZmVyLCAKCQkJICAgICAgTE9ORyBjY2hCdWZmZXIsIFVJTlQxNiB1RmxhZ3MpCnsKICAgIExQV0lORV9NTUlPCQl3bTsKCiAgICBUUkFDRSgiKGhtbWlvPSUwNHgsIHNlZ3BjaEJ1Zj0lcCwgY2NoQnVmPSVsZCwgdUZsYWdzPSUjMDh4KVxuIiwKCSAgaG1taW8sIHNlZ3BjaEJ1ZmZlciwgY2NoQnVmZmVyLCB1RmxhZ3MpOwogICAgCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwoKICAgIHJldHVybiBNTUlPX1NldEJ1ZmZlcih3bSwgc2VncGNoQnVmZmVyLCBjY2hCdWZmZXIsIHVGbGFncywgRkFMU0UpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9GbHVzaCAgICAgIAkJW1dJTk1NLjExN10KICovClVJTlQgV0lOQVBJIG1taW9GbHVzaChITU1JTyBobW1pbywgVUlOVCB1RmxhZ3MpCnsKICAgIExQV0lORV9NTUlPCQl3bTsKCiAgICBUUkFDRSgiKCUwNFgsICUwNFgpXG4iLCBobW1pbywgdUZsYWdzKTsKCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogICAgICAgCiAgICByZXR1cm4gTU1JT19GbHVzaCh3bSwgdUZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvRmx1c2ggICAgICAJCVtNTVNZU1RFTS4xMjE4XQogKi8KVUlOVDE2IFdJTkFQSSBtbWlvRmx1c2gxNihITU1JTzE2IGhtbWlvLCBVSU5UMTYgdUZsYWdzKQp7CiAgICByZXR1cm4gbW1pb0ZsdXNoKGhtbWlvLCB1RmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9BZHZhbmNlICAgIAkJW01NU1lTVEVNLjEyMTldCiAqLwpVSU5UIFdJTkFQSSBtbWlvQWR2YW5jZShITU1JTyBobW1pbywgTU1JT0lORk8qIGxwbW1pb2luZm8sIFVJTlQgdUZsYWdzKQp7CiAgICBMUFdJTkVfTU1JTwkJd207CiAgICAKICAgIFRSQUNFKCJobW1pbz0lMDRYLCBscG1taW9pbmZvPSVwLCB1RmxhZ3M9JTA0WFxuIiwgaG1taW8sIGxwbW1pb2luZm8sIHVGbGFncyk7CgogICAgaWYgKCh3bSA9IE1NSU9fR2V0KE5VTEwsIGhtbWlvKSkgPT0gTlVMTCkKCXJldHVybiBNTVNZU0VSUl9JTlZBTEhBTkRMRTsKCiAgICBpZiAoIXdtLT5pbmZvLmNjaEJ1ZmZlcikKCXJldHVybiBNTUlPRVJSX1VOQlVGRkVSRUQ7CgogICAgaWYgKHVGbGFncyAhPSBNTUlPX1JFQUQgJiYgdUZsYWdzICE9IE1NSU9fV1JJVEUpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKCiAgICBpZiAoTU1JT19GbHVzaCh3bSwgTU1JT19FTVBUWUJVRikpCglyZXR1cm4gTU1JT0VSUl9DQU5OT1RXUklURTsKCiAgICBNTUlPX0dyYWJOZXh0QnVmZmVyKHdtLCB1RmxhZ3MgPT0gTU1JT19SRUFEKTsKCiAgICBscG1taW9pbmZvLT5wY2hOZXh0ID0gbHBtbWlvaW5mby0+cGNoQnVmZmVyOwogICAgbHBtbWlvaW5mby0+cGNoRW5kUmVhZCAgPSBscG1taW9pbmZvLT5wY2hCdWZmZXIgKyAKCSh3bS0+aW5mby5wY2hFbmRSZWFkIC0gd20tPmluZm8ucGNoQnVmZmVyKTsKICAgIGxwbW1pb2luZm8tPnBjaEVuZFdyaXRlID0gbHBtbWlvaW5mby0+cGNoQnVmZmVyICsgCgkod20tPmluZm8ucGNoRW5kV3JpdGUgLSB3bS0+aW5mby5wY2hCdWZmZXIpOwogICAgbHBtbWlvaW5mby0+bERpc2tPZmZzZXQgPSB3bS0+aW5mby5sRGlza09mZnNldDsKICAgIGxwbW1pb2luZm8tPmxCdWZPZmZzZXQgPSB3bS0+aW5mby5sQnVmT2Zmc2V0OwogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0FkdmFuY2UgICAgCQlbTU1TWVNURU0uMTIxOV0KICovClVJTlQxNiBXSU5BUEkgbW1pb0FkdmFuY2UxNihITU1JTzE2IGhtbWlvLCBNTUlPSU5GTzE2KiBscG1taW9pbmZvLCBVSU5UMTYgdUZsYWdzKQp7CiAgICBMUFdJTkVfTU1JTwkJd207CgogICAgVFJBQ0UoIm1taW9BZHZhbmNlXG4iKTsKCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwoKICAgIGlmICghd20tPmluZm8uY2NoQnVmZmVyKQoJcmV0dXJuIE1NSU9FUlJfVU5CVUZGRVJFRDsKCiAgICBpZiAodUZsYWdzICE9IE1NSU9fUkVBRCAmJiB1RmxhZ3MgIT0gTU1JT19XUklURSkKCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwoKICAgIGlmIChNTUlPX0ZsdXNoKHdtLCBNTUlPX0VNUFRZQlVGKSkKCXJldHVybiBNTUlPRVJSX0NBTk5PVFdSSVRFOwoKICAgIE1NSU9fR3JhYk5leHRCdWZmZXIod20sIHVGbGFncyA9PSBNTUlPX1JFQUQpOwoJCiAgICBscG1taW9pbmZvLT5wY2hOZXh0ID0gbHBtbWlvaW5mby0+cGNoQnVmZmVyOwogICAgbHBtbWlvaW5mby0+cGNoRW5kUmVhZCAgPSBscG1taW9pbmZvLT5wY2hCdWZmZXIgKyAKCSh3bS0+aW5mby5wY2hFbmRSZWFkIC0gd20tPmluZm8ucGNoQnVmZmVyKTsKICAgIGxwbW1pb2luZm8tPnBjaEVuZFdyaXRlID0gbHBtbWlvaW5mby0+cGNoQnVmZmVyICsgCgkod20tPmluZm8ucGNoRW5kV3JpdGUgLSB3bS0+aW5mby5wY2hCdWZmZXIpOwogICAgbHBtbWlvaW5mby0+bERpc2tPZmZzZXQgPSB3bS0+aW5mby5sRGlza09mZnNldDsKICAgIGxwbW1pb2luZm8tPmxCdWZPZmZzZXQgPSB3bS0+aW5mby5sQnVmT2Zmc2V0OwoKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9TdHJpbmdUb0ZPVVJDQ0EJW1dJTk1NLjEzMV0KICovCkZPVVJDQyBXSU5BUEkgbW1pb1N0cmluZ1RvRk9VUkNDQShMUENTVFIgc3osIFVJTlQgdUZsYWdzKQp7CiAgICBDSEFSIGNjWzRdOwogICAgaW50IGkgPSAwOwogICAgCiAgICBmb3IgKGkgPSAwOyBpIDwgNCAmJiBzeltpXTsgaSsrKSB7CglpZiAodUZsYWdzICYgTU1JT19UT1VQUEVSKSB7CgkgICAgY2NbaV0gPSB0b3VwcGVyKHN6W2ldKTsKCX0gZWxzZSB7CgkgICAgY2NbaV0gPSBzeltpXTsKCX0KICAgIH0KICAgIAogICAgLyogUGFkIHdpdGggc3BhY2VzICovCiAgICB3aGlsZSAoaSA8IDQpIHsKCWNjW2ldID0gJyAnOwoJaSsrOwogICAgfQogICAgCiAgICBUUkFDRSgiR290ICVjJWMlYyVjXG4iLGNjWzBdLGNjWzFdLGNjWzJdLGNjWzNdKTsKICAgIHJldHVybiBtbWlvRk9VUkNDKGNjWzBdLGNjWzFdLGNjWzJdLGNjWzNdKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU3RyaW5nVG9GT1VSQ0NXCVtXSU5NTS4xMzJdCiAqLwpGT1VSQ0MgV0lOQVBJIG1taW9TdHJpbmdUb0ZPVVJDQ1coTFBDV1NUUiBzeiwgVUlOVCB1RmxhZ3MpCnsKICAgIExQU1RSCXN6QSA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsc3opOwogICAgRk9VUkNDCXJldCA9IG1taW9TdHJpbmdUb0ZPVVJDQ0Eoc3pBLHVGbGFncyk7CiAgICAKICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxzekEpOwogICAgcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvU3RyaW5nVG9GT1VSQ0MJW01NU1lTVEVNLjEyMjBdCiAqLwpGT1VSQ0MgV0lOQVBJIG1taW9TdHJpbmdUb0ZPVVJDQzE2KExQQ1NUUiBzeiwgVUlOVDE2IHVGbGFncykKewogICAgcmV0dXJuIG1taW9TdHJpbmdUb0ZPVVJDQ0Eoc3osIHVGbGFncyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgbW1pb0luc3RhbGxJT1Byb2MxNiAgICBbTU1TWVNURU0uMTIyMV0KICovCkxQTU1JT1BST0MxNiBXSU5BUEkgbW1pb0luc3RhbGxJT1Byb2MxNihGT1VSQ0MgZmNjSU9Qcm9jLCBMUE1NSU9QUk9DMTYgcElPUHJvYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGR3RmxhZ3MpCnsKICAgIHJldHVybiAoTFBNTUlPUFJPQzE2KU1NSU9fSW5zdGFsbElPUHJvYyhmY2NJT1Byb2MsIChMUE1NSU9QUk9DKXBJT1Byb2MsIAoJCQkJCSAgICBkd0ZsYWdzLCBNTUlPX1BST0NfMTYpOyAKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvSW5zdGFsbElPUHJvY0EJICAgW1dJTk1NLjEyMF0KICovCkxQTU1JT1BST0MgV0lOQVBJIG1taW9JbnN0YWxsSU9Qcm9jQShGT1VSQ0MgZmNjSU9Qcm9jLCAKCQkJCSAgICAgTFBNTUlPUFJPQyBwSU9Qcm9jLCBEV09SRCBkd0ZsYWdzKQp7CiAgICByZXR1cm4gTU1JT19JbnN0YWxsSU9Qcm9jKGZjY0lPUHJvYywgcElPUHJvYywgZHdGbGFncywgTU1JT19QUk9DXzMyQSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0luc3RhbGxJT1Byb2NXCSAgIFtXSU5NTS5dCiAqLwpMUE1NSU9QUk9DIFdJTkFQSSBtbWlvSW5zdGFsbElPUHJvY1coRk9VUkNDIGZjY0lPUHJvYywgCgkJCQkgICAgIExQTU1JT1BST0MgcElPUHJvYywgRFdPUkQgZHdGbGFncykKewogICAgcmV0dXJuIE1NSU9fSW5zdGFsbElPUHJvYyhmY2NJT1Byb2MsIHBJT1Byb2MsIGR3RmxhZ3MsIE1NSU9fUFJPQ18zMlcpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9TZW5kTWVzc2FnZTE2CVtNTVNZU1RFTS4xMjIyXQogKi8KTFJFU1VMVCBXSU5BUEkgbW1pb1NlbmRNZXNzYWdlMTYoSE1NSU8xNiBobW1pbywgVUlOVDE2IHVNZXNzYWdlLAoJCQkJIExQQVJBTSBsUGFyYW0xLCBMUEFSQU0gbFBhcmFtMikKewogICAgTFBXSU5FX01NSU8JCXdtOwogICAgCiAgICBUUkFDRSgiKCUwNFgsICV1LCAlbGQsICVsZClcbiIsIGhtbWlvLCB1TWVzc2FnZSwgbFBhcmFtMSwgbFBhcmFtMik7CgogICAgaWYgKHVNZXNzYWdlIDwgTU1JT01fVVNFUikKCXJldHVybiBNTVNZU0VSUl9JTlZBTFBBUkFNOwogICAgCiAgICBpZiAoKHdtID0gTU1JT19HZXQoTlVMTCwgaG1taW8pKSA9PSBOVUxMKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMSEFORExFOwogICAgCiAgICByZXR1cm4gTU1JT19TZW5kTWVzc2FnZSh3bSwgdU1lc3NhZ2UsIGxQYXJhbTEsIGxQYXJhbTIsIE1NSU9fUFJPQ18xNik7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1NlbmRNZXNzYWdlCQlbV0lOTU0uXQogKi8KTFJFU1VMVCBXSU5BUEkgbW1pb1NlbmRNZXNzYWdlKEhNTUlPIGhtbWlvLCBVSU5UIHVNZXNzYWdlLAoJCQkgICAgICAgTFBBUkFNIGxQYXJhbTEsIExQQVJBTSBsUGFyYW0yKQp7CiAgICBMUFdJTkVfTU1JTwkJd207CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJXUsICVsZCwgJWxkKVxuIiwgaG1taW8sIHVNZXNzYWdlLCBsUGFyYW0xLCBsUGFyYW0yKTsKCiAgICBpZiAodU1lc3NhZ2UgPCBNTUlPTV9VU0VSKQoJcmV0dXJuIE1NU1lTRVJSX0lOVkFMUEFSQU07CiAgICAKICAgIGlmICgod20gPSBNTUlPX0dldChOVUxMLCBobW1pbykpID09IE5VTEwpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxIQU5ETEU7CiAgICAKICAgIHJldHVybiBNTUlPX1NlbmRNZXNzYWdlKHdtLCB1TWVzc2FnZSwgbFBhcmFtMSwgbFBhcmFtMiwgTU1JT19QUk9DXzMyQSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb0Rlc2NlbmQJICAgICAgIAlbTU1TWVNURU0uMTIyM10KICovClVJTlQgV0lOQVBJIG1taW9EZXNjZW5kKEhNTUlPIGhtbWlvLCBMUE1NQ0tJTkZPIGxwY2ssCgkJCWNvbnN0IE1NQ0tJTkZPKiBscGNrUGFyZW50LCBVSU5UIHVGbGFncykKewogICAgRFdPUkQJCWR3T2xkUG9zOwogICAgRk9VUkNDCQlzcmNoQ2tJZDsKICAgIEZPVVJDQwkJc3JjaFR5cGU7CiAgICAKICAgIAogICAgVFJBQ0UoIiglMDRYLCAlcCwgJXAsICUwNFgpO1xuIiwgaG1taW8sIGxwY2ssIGxwY2tQYXJlbnQsIHVGbGFncyk7CiAgICAKICAgIGlmIChscGNrID09IE5VTEwpCglyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKICAgIAogICAgZHdPbGRQb3MgPSBtbWlvU2VlayhobW1pbywgMCwgU0VFS19DVVIpOwogICAgVFJBQ0UoImR3T2xkUG9zPSVsZFxuIiwgZHdPbGRQb3MpOwogICAgCiAgICBpZiAobHBja1BhcmVudCAhPSBOVUxMKSB7CglUUkFDRSgic2VlayBpbnNpZGUgcGFyZW50IGF0ICVsZCAhXG4iLCBscGNrUGFyZW50LT5kd0RhdGFPZmZzZXQpOwoJLyogRVBQOiB3YXMgZHdPbGRQb3MgPSBtbWlvU2VlayhobW1pbyxscGNrUGFyZW50LT5kd0RhdGFPZmZzZXQsU0VFS19TRVQpOyAqLwoJaWYgKGR3T2xkUG9zIDwgbHBja1BhcmVudC0+ZHdEYXRhT2Zmc2V0IHx8IAoJICAgIGR3T2xkUG9zID49IGxwY2tQYXJlbnQtPmR3RGF0YU9mZnNldCArIGxwY2tQYXJlbnQtPmNrc2l6ZSkgewoJICAgIFdBUk4oIm91dHNpZGUgcGFyZW50IGNodW5rXG4iKTsKCSAgICByZXR1cm4gTU1JT0VSUl9DSFVOS05PVEZPVU5EOwoJfQogICAgfQogICAgCiAgICAvKiBUaGUgU0RLIGRvY3Ugc2F5cyAnY2tpZCcgaXMgdXNlZCBmb3IgYWxsIGNhc2VzLiBSZWFsIFdvcmxkCiAgICAgKiBleGFtcGxlcyBkaXNhZ3JlZSAtTWFyY3VzLDk5MDIxNi4gCiAgICAgKi8KICAgIAogICAgc3JjaFR5cGUgPSAwOwogICAgLyogZmluZF9jaHVuayBsb29rcyBmb3IgJ2NraWQnICovCiAgICBpZiAodUZsYWdzICYgTU1JT19GSU5EQ0hVTkspCglzcmNoQ2tJZCA9IGxwY2stPmNraWQ7CiAgICAvKiBmaW5kX3JpZmYgYW5kIGZpbmRfbGlzdCBsb29rIGZvciAnZmNjVHlwZScgKi8KICAgIGlmICh1RmxhZ3MgJiBNTUlPX0ZJTkRMSVNUKSB7CglzcmNoQ2tJZCA9IEZPVVJDQ19MSVNUOwoJc3JjaFR5cGUgPSBscGNrLT5mY2NUeXBlOwogICAgfQogICAgaWYgKHVGbGFncyAmIE1NSU9fRklORFJJRkYpIHsKCXNyY2hDa0lkID0gRk9VUkNDX1JJRkY7CglzcmNoVHlwZSA9IGxwY2stPmZjY1R5cGU7CiAgICB9CiAgICAKICAgIGlmICh1RmxhZ3MgJiAoTU1JT19GSU5EQ0hVTkt8TU1JT19GSU5ETElTVHxNTUlPX0ZJTkRSSUZGKSkgewoJVFJBQ0UoInNlYXJjaGluZyBmb3IgJS40cy4lLjRzXG4iLCAKCSAgICAgIChMUFNUUikmc3JjaENrSWQsCgkgICAgICBzcmNoVHlwZT8oTFBTVFIpJnNyY2hUeXBlOiJhbnkgIik7CgkKCXdoaWxlIChUUlVFKSB7CgkgICAgTE9ORyBpeDsKCSAgICAKCSAgICBpeCA9IG1taW9SZWFkKGhtbWlvLCAoTFBTVFIpbHBjaywgMyAqIHNpemVvZihEV09SRCkpOwoJICAgIGlmIChpeCA8IDIqc2l6ZW9mKERXT1JEKSkgewoJCW1taW9TZWVrKGhtbWlvLCBkd09sZFBvcywgU0VFS19TRVQpOwoJCVdBUk4oInJldHVybiBDaHVua05vdEZvdW5kXG4iKTsKCQlyZXR1cm4gTU1JT0VSUl9DSFVOS05PVEZPVU5EOwoJICAgIH0KCSAgICBscGNrLT5kd0RhdGFPZmZzZXQgPSBkd09sZFBvcyArIDIgKiBzaXplb2YoRFdPUkQpOwoJICAgIGlmIChpeCA8IGxwY2stPmR3RGF0YU9mZnNldCAtIGR3T2xkUG9zKSB7CgkJbW1pb1NlZWsoaG1taW8sIGR3T2xkUG9zLCBTRUVLX1NFVCk7CgkJV0FSTigicmV0dXJuIENodW5rTm90Rm91bmRcbiIpOwoJCXJldHVybiBNTUlPRVJSX0NIVU5LTk9URk9VTkQ7CgkgICAgfQoJICAgIFRSQUNFKCJja2lkPSUuNHMgZmNjPSUuNHMgY2tzaXplPSUwOGxYICFcbiIsCgkJICAoTFBTVFIpJmxwY2stPmNraWQsIAoJCSAgc3JjaFR5cGU/KExQU1RSKSZscGNrLT5mY2NUeXBlOiI8bmE+IiwKCQkgIGxwY2stPmNrc2l6ZSk7CgkgICAgaWYgKChzcmNoQ2tJZCA9PSBscGNrLT5ja2lkKSAmJgoJCSghc3JjaFR5cGUgfHwgKHNyY2hUeXBlID09IGxwY2stPmZjY1R5cGUpKQoJCSkKCQlicmVhazsKCSAgICAKCSAgICBkd09sZFBvcyA9IGxwY2stPmR3RGF0YU9mZnNldCArICgobHBjay0+Y2tzaXplICsgMSkgJiB+MSk7CgkgICAgbW1pb1NlZWsoaG1taW8sIGR3T2xkUG9zLCBTRUVLX1NFVCk7Cgl9CiAgICB9IGVsc2UgewoJLyogRklYTUU6IHVudmVyaWZpZWQsIGRvZXMgaXQgZG8gdGhpcz8gKi8KCS8qIE5COiBUaGlzIHBhcnQgaXMgdXNlZCBieSBXQVZFX21jaU9wZW4sIGFtb25nIG90aGVycyAqLwoJaWYgKG1taW9SZWFkKGhtbWlvLCAoTFBTVFIpbHBjaywgMyAqIHNpemVvZihEV09SRCkpIDwgMyAqIHNpemVvZihEV09SRCkpIHsKCSAgICBtbWlvU2VlayhobW1pbywgZHdPbGRQb3MsIFNFRUtfU0VUKTsKCSAgICBXQVJOKCJyZXR1cm4gQ2h1bmtOb3RGb3VuZCAybmRcbiIpOwoJICAgIHJldHVybiBNTUlPRVJSX0NIVU5LTk9URk9VTkQ7Cgl9CglscGNrLT5kd0RhdGFPZmZzZXQgPSBkd09sZFBvcyArIDIgKiBzaXplb2YoRFdPUkQpOwogICAgfQogICAgbHBjay0+ZHdGbGFncyA9IDA7CiAgICAvKiBJZiB3ZSB3ZXJlIGxvb2tpbmcgZm9yIFJJRkYvTElTVCBjaHVua3MsIHRoZSBmaW5hbCBmaWxlIHBvc2l0aW9uCiAgICAgKiBpcyBhZnRlciB0aGUgY2h1bmtpZC4gSWYgd2Ugd2VyZSBqdXN0IGxvb2tpbmcgZm9yIHRoZSBjaHVuawogICAgICogaXQgaXMgYWZ0ZXIgdGhlIGNrc2l6ZS4gU28gYWRkIDQgaW4gUklGRi9MSVNUIGNhc2UuCiAgICAgKi8KICAgIGlmIChscGNrLT5ja2lkID09IEZPVVJDQ19SSUZGIHx8IGxwY2stPmNraWQgPT0gRk9VUkNDX0xJU1QpCgltbWlvU2VlayhobW1pbywgbHBjay0+ZHdEYXRhT2Zmc2V0ICsgc2l6ZW9mKERXT1JEKSwgU0VFS19TRVQpOwogICAgZWxzZQoJbW1pb1NlZWsoaG1taW8sIGxwY2stPmR3RGF0YU9mZnNldCwgU0VFS19TRVQpOwogICAgVFJBQ0UoImxwY2s6IGNraWQ9JS40cywgY2tzaXplPSVsZCwgZHdEYXRhT2Zmc2V0PSVsZCBmY2NUeXBlPSUwOGxYICglLjRzKSFcbiIsIAoJICAoTFBTVFIpJmxwY2stPmNraWQsIGxwY2stPmNrc2l6ZSwgbHBjay0+ZHdEYXRhT2Zmc2V0LCAKCSAgbHBjay0+ZmNjVHlwZSwgc3JjaFR5cGU/KExQU1RSKSZscGNrLT5mY2NUeXBlOiIiKTsKICAgIHJldHVybiAwOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9EZXNjZW5kMTYJICAgICAgIAlbTU1TWVNURU0uMTIyM10KICovClVJTlQxNiBXSU5BUEkgbW1pb0Rlc2NlbmQxNihITU1JTzE2IGhtbWlvLCBMUE1NQ0tJTkZPIGxwY2ssCgkJCSAgICBjb25zdCBNTUNLSU5GTyogbHBja1BhcmVudCwgVUlOVDE2IHVGbGFncykKewogICAgcmV0dXJuIG1taW9EZXNjZW5kKGhtbWlvLCBscGNrLCBscGNrUGFyZW50LCB1RmxhZ3MpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9Bc2NlbmQgICAgIAkJW1dJTk1NLjExM10KICovClVJTlQgV0lOQVBJIG1taW9Bc2NlbmQoSE1NSU8gaG1taW8sIExQTU1DS0lORk8gbHBjaywgVUlOVCB1RmxhZ3MpCnsKICAgIFRSQUNFKCIoJTA0WCwgJXAsICUwNFgpO1xuIiwgaG1taW8sIGxwY2ssIHVGbGFncyk7CiAgICAKICAgIGlmIChscGNrLT5kd0ZsYWdzICYgTU1JT19ESVJUWSkgewoJRFdPUkQJZHdPbGRQb3MsIGR3TmV3U2l6ZSwgZHdTaXplUG9zOwoJCglUUkFDRSgiY2h1bmsgaXMgbWFya2VkIE1NSU9fRElSVFksIGNvcnJlY3RpbmcgY2h1bmsgc2l6ZVxuIik7Cglkd09sZFBvcyA9IG1taW9TZWVrKGhtbWlvLCAwLCBTRUVLX0NVUik7CglUUkFDRSgiZHdPbGRQb3M9JWxkXG4iLCBkd09sZFBvcyk7Cglkd05ld1NpemUgPSBkd09sZFBvcyAtIGxwY2stPmR3RGF0YU9mZnNldDsKCWlmIChkd05ld1NpemUgIT0gbHBjay0+Y2tzaXplKSB7CgkgICAgVFJBQ0UoImR3TmV3U2l6ZT0lbGRcbiIsIGR3TmV3U2l6ZSk7CgkgICAgbHBjay0+Y2tzaXplID0gZHdOZXdTaXplOwoJICAgIAoJICAgIGR3U2l6ZVBvcyA9IGxwY2stPmR3RGF0YU9mZnNldCAtIHNpemVvZihEV09SRCk7CgkgICAgVFJBQ0UoImR3U2l6ZVBvcz0lbGRcbiIsIGR3U2l6ZVBvcyk7CgkgICAgCgkgICAgbW1pb1NlZWsoaG1taW8sIGR3U2l6ZVBvcywgU0VFS19TRVQpOwoJICAgIG1taW9Xcml0ZShobW1pbywgKExQU1RSKSZkd05ld1NpemUsIHNpemVvZihEV09SRCkpOwoJfQogICAgfQogICAgCiAgICBtbWlvU2VlayhobW1pbywgbHBjay0+ZHdEYXRhT2Zmc2V0ICsgKChscGNrLT5ja3NpemUgKyAxKSAmIH4xKSwgU0VFS19TRVQpOwogICAgCiAgICByZXR1cm4gMDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvQXNjZW5kICAgICAJCVtNTVNZU1RFTS4xMjI0XQogKi8KVUlOVDE2IFdJTkFQSSBtbWlvQXNjZW5kMTYoSE1NSU8xNiBobW1pbywgTU1DS0lORk8qIGxwY2ssIFVJTlQxNiB1RmxhZ3MpCnsKICAgIHJldHVybiBtbWlvQXNjZW5kKGhtbWlvLGxwY2ssdUZsYWdzKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvQ3JlYXRlQ2h1bmsJCVtNTVNZU1RFTS4xMjI1XQogKi8KVUlOVDE2IFdJTkFQSSBtbWlvQ3JlYXRlQ2h1bmsxNihITU1JTzE2IGhtbWlvLCBNTUNLSU5GTyogbHBjaywgVUlOVDE2IHVGbGFncykKewogICAgRFdPUkQJZHdPbGRQb3M7CiAgICBMT05HIAlzaXplOwogICAgTE9ORyAJaXg7CiAgICAKICAgIFRSQUNFKCIoJTA0WCwgJXAsICUwNFgpO1xuIiwgaG1taW8sIGxwY2ssIHVGbGFncyk7CiAgICAKICAgIGR3T2xkUG9zID0gbW1pb1NlZWsoaG1taW8sIDAsIFNFRUtfQ1VSKTsKICAgIFRSQUNFKCJkd09sZFBvcz0lbGRcbiIsIGR3T2xkUG9zKTsKICAgIAogICAgaWYgKHVGbGFncyA9PSBNTUlPX0NSRUFURUxJU1QpCglscGNrLT5ja2lkID0gRk9VUkNDX0xJU1Q7CiAgICBlbHNlIGlmICh1RmxhZ3MgPT0gTU1JT19DUkVBVEVSSUZGKQoJbHBjay0+Y2tpZCA9IEZPVVJDQ19SSUZGOwogICAgCiAgICBUUkFDRSgiY2tpZD0lMDhsWFxuIiwgbHBjay0+Y2tpZCk7CiAgICAKICAgIHNpemUgPSAyICogc2l6ZW9mKERXT1JEKTsKICAgIGxwY2stPmR3RGF0YU9mZnNldCA9IGR3T2xkUG9zICsgc2l6ZTsKICAgIAogICAgaWYgKGxwY2stPmNraWQgPT0gRk9VUkNDX1JJRkYgfHwgbHBjay0+Y2tpZCA9PSBGT1VSQ0NfTElTVCkgCglzaXplICs9IHNpemVvZihEV09SRCk7CiAgICBscGNrLT5kd0ZsYWdzID0gTU1JT19ESVJUWTsKICAgIAogICAgaXggPSBtbWlvV3JpdGUoaG1taW8sIChMUFNUUilscGNrLCBzaXplKTsKICAgIFRSQUNFKCJhZnRlciBtbWlvV3JpdGUgaXggPSAlbGQgcmVxID0gJWxkLCBlcnJubyA9ICVkXG4iLGl4LCBzaXplLCBlcnJubyk7CiAgICBpZiAoaXggPCBzaXplKSB7CgltbWlvU2VlayhobW1pbywgZHdPbGRQb3MsIFNFRUtfU0VUKTsKCVdBUk4oInJldHVybiBDYW5ub3RXcml0ZVxuIik7CglyZXR1cm4gTU1JT0VSUl9DQU5OT1RXUklURTsKICAgIH0KICAgIAogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQltbWlvQ3JlYXRlQ2h1bmsJCQkJW1dJTk1NLjExNV0KICovClVJTlQgV0lOQVBJIG1taW9DcmVhdGVDaHVuayhITU1JTyBobW1pbywgTU1DS0lORk8qIGxwY2ssIFVJTlQgdUZsYWdzKQp7CiAgICByZXR1cm4gbW1pb0NyZWF0ZUNodW5rMTYoaG1taW8sIGxwY2ssIHVGbGFncyk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAJCQkJbW1pb1JlbmFtZSAgICAgCQlbTU1TWVNURU0uMTIyNl0KICovClVJTlQxNiBXSU5BUEkgbW1pb1JlbmFtZTE2KExQQ1NUUiBzekZpbGVOYW1lLCBMUENTVFIgc3pOZXdGaWxlTmFtZSwKCQkJICAgTU1JT0lORk8xNiogbHBtbWlvaW5mbywgRFdPUkQgZHdSZW5hbWVGbGFncykKewogICAgVUlOVDE2IAkJcmVzdWx0ID0gTU1TWVNFUlJfRVJST1I7CiAgICBMUE1NSU9QUk9DMTYJaW9Qcm9jOwoKICAgIFRSQUNFKCIoJyVzJywgJyVzJywgJXAsICUwOGxYKTtcbiIsCgkgIHN6RmlsZU5hbWUsIHN6TmV3RmlsZU5hbWUsIGxwbW1pb2luZm8sIGR3UmVuYW1lRmxhZ3MpOwogICAgCiAgICAvKiBJZiBib3RoIHBhcmFtcyBhcmUgTlVMTCwgdGhlbiBwYXJzZSB0aGUgZmlsZSBuYW1lICovCiAgICBpZiAobHBtbWlvaW5mby0+ZmNjSU9Qcm9jID09IDAgJiYgbHBtbWlvaW5mby0+cElPUHJvYyA9PSBOVUxMKQoJbHBtbWlvaW5mby0+ZmNjSU9Qcm9jID0gTU1JT19QYXJzZUV4dChzekZpbGVOYW1lKTsKCiAgICAvKiBIYW5kbGUgYW55IHVuaGFuZGxlZC9lcnJvciBjYXNlIGZyb20gYWJvdmUuIEFzc3VtZSBET1MgZmlsZSAqLwogICAgaWYgKGxwbW1pb2luZm8tPmZjY0lPUHJvYyA9PSAwICYmIGxwbW1pb2luZm8tPnBJT1Byb2MgPT0gTlVMTCkKCWlvUHJvYyA9IChMUE1NSU9QUk9DMTYpbW1pb0Rvc0lPUHJvYzsKICAgIC8qIGlmIGp1c3QgdGhlIGZvdXIgY2hhcmFjdGVyIGNvZGUgaXMgcHJlc2VudCwgbG9vayB1cCBJTyBwcm9jICovCiAgICBlbHNlIGlmIChscG1taW9pbmZvLT5wSU9Qcm9jID09IE5VTEwpCglpb1Byb2MgPSBtbWlvSW5zdGFsbElPUHJvYzE2KGxwbW1pb2luZm8tPmZjY0lPUHJvYywgTlVMTCwgTU1JT19GSU5EUFJPQyk7CiAgICBlbHNlCiAJaW9Qcm9jID0gbHBtbWlvaW5mby0+cElPUHJvYzsKCiAgICAvKiBGSVhNRTogaW9Qcm9jIGlzIGxpa2VseSBhIHNlZ21lbnRlZCBhZGRyZXNzLCB0aHVzIG5lZWRpbmcgYQogICAgICogdGh1bmsgc29tZXdoZXJlLiBUaGUgbWFpbiBpc3N1ZSBpcyB0aGF0IFdpbmUncyBjdXJyZW50IHRodW5raW5nCiAgICAgKiAzMiB0byAxNiBvbmx5IHN1cHBvcnRzIHBhc2NhbCBjYWxsaW5nIGNvbnZlbnRpb24KICAgICAqLwogICAgaWYgKGlvUHJvYykgCglyZXN1bHQgPSAoaW9Qcm9jKSgwLCBNTUlPTV9SRU5BTUUsIAoJCQkgIChMUEFSQU0pc3pGaWxlTmFtZSwgKExQQVJBTSlzek5ld0ZpbGVOYW1lKTsKICAgIAogICAgcmV0dXJuIHJlc3VsdDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAkJCQltbWlvUmVuYW1lQSAgICAJCQlbV0lOTU0uMTI1XQogKi8KVUlOVCBXSU5BUEkgbW1pb1JlbmFtZUEoTFBDU1RSIHN6RmlsZU5hbWUsIExQQ1NUUiBzek5ld0ZpbGVOYW1lLAoJCQlNTUlPSU5GTyogbHBtbWlvaW5mbywgRFdPUkQgZHdSZW5hbWVGbGFncykKewogICAgVUlOVAlyZXN1bHQgPSBNTVNZU0VSUl9FUlJPUjsKICAgIExQTU1JT1BST0MJaW9Qcm9jOwoKICAgIFRSQUNFKCIoJyVzJywgJyVzJywgJXAsICUwOGxYKTtcbiIsCgkgIHN6RmlsZU5hbWUsIHN6TmV3RmlsZU5hbWUsIGxwbW1pb2luZm8sIGR3UmVuYW1lRmxhZ3MpOwogICAgCiAgICAvKiBJZiBib3RoIHBhcmFtcyBhcmUgTlVMTCwgdGhlbiBwYXJzZSB0aGUgZmlsZSBuYW1lICovCiAgICBpZiAobHBtbWlvaW5mby0+ZmNjSU9Qcm9jID09IDAgJiYgbHBtbWlvaW5mby0+cElPUHJvYyA9PSBOVUxMKQoJbHBtbWlvaW5mby0+ZmNjSU9Qcm9jID0gTU1JT19QYXJzZUV4dChzekZpbGVOYW1lKTsKCiAgICAvKiBIYW5kbGUgYW55IHVuaGFuZGxlZC9lcnJvciBjYXNlIGZyb20gYWJvdmUuIEFzc3VtZSBET1MgZmlsZSAqLwogICAgaWYgKGxwbW1pb2luZm8tPmZjY0lPUHJvYyA9PSAwICYmIGxwbW1pb2luZm8tPnBJT1Byb2MgPT0gTlVMTCkKCWlvUHJvYyA9IChMUE1NSU9QUk9DKW1taW9Eb3NJT1Byb2M7CiAgICAvKiBpZiBqdXN0IHRoZSBmb3VyIGNoYXJhY3RlciBjb2RlIGlzIHByZXNlbnQsIGxvb2sgdXAgSU8gcHJvYyAqLwogICAgZWxzZSBpZiAobHBtbWlvaW5mby0+cElPUHJvYyA9PSBOVUxMKQoJaW9Qcm9jID0gTU1JT19JbnN0YWxsSU9Qcm9jKGxwbW1pb2luZm8tPmZjY0lPUHJvYywgTlVMTCwgCgkJCQkgICAgTU1JT19GSU5EUFJPQywgTU1JT19QUk9DXzMyQSk7CiAgICBlbHNlCiAJaW9Qcm9jID0gbHBtbWlvaW5mby0+cElPUHJvYzsKCiAgICBpZiAoaW9Qcm9jKSAKCXJlc3VsdCA9IChpb1Byb2MpKDAsIE1NSU9NX1JFTkFNRSwgCgkJCSAgKExQQVJBTSlzekZpbGVOYW1lLCAoTFBBUkFNKXN6TmV3RmlsZU5hbWUpOwogICAgCiAgICByZXR1cm4gcmVzdWx0Owp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1taW9SZW5hbWVXICAgIAkJCVtXSU5NTS4xMjZdCiAqLwpVSU5UIFdJTkFQSSBtbWlvUmVuYW1lVyhMUENXU1RSIHN6RmlsZU5hbWUsIExQQ1dTVFIgc3pOZXdGaWxlTmFtZSwKCQkJTU1JT0lORk8qIGxwbW1pb2luZm8sIERXT1JEIGR3UmVuYW1lRmxhZ3MpCnsKICAgIExQU1RSCXN6Rm4gPSBIRUFQX3N0cmR1cFd0b0EoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc3pGaWxlTmFtZSk7CiAgICBMUFNUUglzem5GbiA9IEhFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLCAwLCBzek5ld0ZpbGVOYW1lKTsKICAgIFVJTlQJcmV0ID0gbW1pb1JlbmFtZUEoc3pGbiwgc3puRm4sIGxwbW1pb2luZm8sIGR3UmVuYW1lRmxhZ3MpOwogICAgCiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc3pGbik7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsc3puRm4pOwogICAgcmV0dXJuIHJldDsKfQo=