LyogRGlyZWN0M0QgRXhlY3V0ZUJ1ZmZlcgogKiBDb3B5cmlnaHQgKGMpIDE5OTgtMjAwNCBMaW9uZWwgVUxNRVIKICogQ29weXJpZ2h0IChjKSAyMDAyLTIwMDQgQ2hyaXN0aWFuIENvc3RhCiAqIENvcHlyaWdodCAoYykgMjAwNiAgICAgIFN0ZWZhbiBE9nNpbmdlcgogKgogKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgIndpbmUvcG9ydC5oIgoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8c3RkYXJnLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2RlZmluZSBDT0JKTUFDUk9TCiNkZWZpbmUgTk9OQU1FTEVTU1VOSU9OCgojaW5jbHVkZSAid2luZGVmLmgiCiNpbmNsdWRlICJ3aW5iYXNlLmgiCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2luZ2RpLmgiCiNpbmNsdWRlICJ3aW5lL2V4Y2VwdGlvbi5oIgoKI2luY2x1ZGUgImRkcmF3LmgiCiNpbmNsdWRlICJkM2QuaCIKCiNpbmNsdWRlICJkZHJhd19wcml2YXRlLmgiCiNpbmNsdWRlICJ3aW5lL2RlYnVnLmgiCgpXSU5FX0RFRkFVTFRfREVCVUdfQ0hBTk5FTChkM2Q3KTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBfZHVtcF9leGVjdXRlZGF0YQogKiBfZHVtcF9EM0RFWEVDVVRFQlVGRkVSREVTQwogKgogKiBEZWJ1ZyBmdW5jdGlvbnMgd2hpY2ggd3JpdGUgdGhlIGV4ZWN1dGVidWZmZXIgZGF0YSB0byB0aGUgY29uc29sZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBfZHVtcF9leGVjdXRlZGF0YShjb25zdCBEM0RFWEVDVVRFREFUQSAqbHBEYXRhKSB7CiAgICBUUkFDRSgiZHdTaXplIDogJWRcbiIsIGxwRGF0YS0+ZHdTaXplKTsKICAgIFRSQUNFKCJWZXJ0ZXggICAgICBPZmZzZXQgOiAlZCAgQ291bnQgIDogJWRcbiIsIGxwRGF0YS0+ZHdWZXJ0ZXhPZmZzZXQsIGxwRGF0YS0+ZHdWZXJ0ZXhDb3VudCk7CiAgICBUUkFDRSgiSW5zdHJ1Y3Rpb24gT2Zmc2V0IDogJWQgIExlbmd0aCA6ICVkXG4iLCBscERhdGEtPmR3SW5zdHJ1Y3Rpb25PZmZzZXQsIGxwRGF0YS0+ZHdJbnN0cnVjdGlvbkxlbmd0aCk7CiAgICBUUkFDRSgiSFZlcnRleCAgICAgT2Zmc2V0IDogJWRcbiIsIGxwRGF0YS0+ZHdIVmVydGV4T2Zmc2V0KTsKfQoKc3RhdGljIHZvaWQgX2R1bXBfRDNERVhFQ1VURUJVRkZFUkRFU0MoY29uc3QgRDNERVhFQ1VURUJVRkZFUkRFU0MgKmxwRGVzYykgewogICAgVFJBQ0UoImR3U2l6ZSAgICAgICA6ICVkXG4iLCBscERlc2MtPmR3U2l6ZSk7CiAgICBUUkFDRSgiZHdGbGFncyAgICAgIDogJXhcbiIsIGxwRGVzYy0+ZHdGbGFncyk7CiAgICBUUkFDRSgiZHdDYXBzICAgICAgIDogJXhcbiIsIGxwRGVzYy0+ZHdDYXBzKTsKICAgIFRSQUNFKCJkd0J1ZmZlclNpemUgOiAlZFxuIiwgbHBEZXNjLT5kd0J1ZmZlclNpemUpOwogICAgVFJBQ0UoImxwRGF0YSAgICAgICA6ICVwXG4iLCBscERlc2MtPmxwRGF0YSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9FeGVjdXRlCiAqCiAqIFRoZSBtYWluIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGV4ZWN1dGUgYnVmZmVyCiAqIEl0IHRyYW5zZm9ybXMgdGhlIHZlcnRpY2VzIGlmIG5lY2Vzc2FyeSwgYW5kIGNhbGxzIElEaXJlY3QzRERldmljZTcKICogZm9yIGRyYXdpbmcgdGhlIHZlcnRpY2VzLiBJdCBpcyBjYWxsZWQgZnJvbQogKiBJRGlyZWN0M0REZXZpY2U6OkV4ZWN1dGUKICoKICogVE9ETzogUGVyaGFwcyBzb21lIGNvbW1lbnRzIGFib3V0IHRoZSB2YXJpb3VzIG9wY29kZXMgd291bGRuJ3QgaHVydAogKgogKiBEb24ndCBkZWNsYXJlIHRoaXMgc3RhdGljLCBhcyBpdCdzIGNhbGxlZCBmcm9tIGRldmljZS5jLAogKiBJRGlyZWN0M0REZXZpY2U6OkV4ZWN1dGUKICoKICogUGFyYW1zOgogKiAgRGV2aWNlOiAzRCBEZXZpY2UgYXNzb2NpYXRlZCB0byB1c2UgZm9yIGRyYXdpbmcKICogIFZpZXdwb3J0OiBWaWV3cG9ydCBmb3IgdGhpcyBvcGVyYXRpb24KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwp2b2lkCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0V4ZWN1dGUoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwgKlRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlSW1wbCAqbHBEZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNEVmlld3BvcnRJbXBsICpscFZpZXdwb3J0KQp7CiAgICAvKiBEV09SRCBicyA9IFRoaXMtPmRlc2MuZHdCdWZmZXJTaXplOyAqLwogICAgRFdPUkQgdnMgPSBUaGlzLT5kYXRhLmR3VmVydGV4T2Zmc2V0OwogICAgLyogRFdPUkQgdmMgPSBUaGlzLT5kYXRhLmR3VmVydGV4Q291bnQ7ICovCiAgICBEV09SRCBpcyA9IFRoaXMtPmRhdGEuZHdJbnN0cnVjdGlvbk9mZnNldDsKICAgIC8qIERXT1JEIGlsID0gVGhpcy0+ZGF0YS5kd0luc3RydWN0aW9uTGVuZ3RoOyAqLwoKICAgIGNoYXIgKmluc3RyID0gKGNoYXIgKilUaGlzLT5kZXNjLmxwRGF0YSArIGlzOwoKICAgIC8qIFNob3VsZCBjaGVjayBpZiB0aGUgdmlld3BvcnQgd2FzIGFkZGVkIG9yIG5vdCB0byB0aGUgZGV2aWNlICovCgogICAgLyogQWN0aXZhdGUgdGhlIHZpZXdwb3J0ICovCiAgICBscFZpZXdwb3J0LT5hY3RpdmVfZGV2aWNlID0gbHBEZXZpY2U7CiAgICBscFZpZXdwb3J0LT5hY3RpdmF0ZShscFZpZXdwb3J0KTsKCiAgICBUUkFDRSgiRXhlY3V0ZURhdGEgOlxuIik7CiAgICBpZiAoVFJBQ0VfT04oZDNkNykpCiAgICAgIF9kdW1wX2V4ZWN1dGVkYXRhKCYoVGhpcy0+ZGF0YSkpOwoKICAgIHdoaWxlICgxKSB7CiAgICAgICAgTFBEM0RJTlNUUlVDVElPTiBjdXJyZW50ID0gKExQRDNESU5TVFJVQ1RJT04pIGluc3RyOwoJQllURSBzaXplOwoJV09SRCBjb3VudDsKCQoJY291bnQgPSBjdXJyZW50LT53Q291bnQ7CglzaXplID0gY3VycmVudC0+YlNpemU7CglpbnN0ciArPSBzaXplb2YoRDNESU5TVFJVQ1RJT04pOwoJCglzd2l0Y2ggKGN1cnJlbnQtPmJPcGNvZGUpIHsKCSAgICBjYXNlIEQzRE9QX1BPSU5UOiB7CgkgICAgICAgIFdBUk4oIlBPSU5ULXMgICAgICAgICAgKCVkKVxuIiwgY291bnQpOwoJCWluc3RyICs9IGNvdW50ICogc2l6ZTsKCSAgICB9IGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX0xJTkU6IHsKCSAgICAgICAgV0FSTigiTElORS1zICAgICAgICAgICAoJWQpXG4iLCBjb3VudCk7CgkJaW5zdHIgKz0gY291bnQgKiBzaXplOwoJICAgIH0gYnJlYWs7CgoJICAgIGNhc2UgRDNET1BfVFJJQU5HTEU6IHsKCSAgICAgICAgaW50IGk7CgkJRDNEVExWRVJURVggKnRsX3Z4ID0gKEQzRFRMVkVSVEVYICopIFRoaXMtPnZlcnRleF9kYXRhOwoJCVRSQUNFKCJUUklBTkdMRSAgICAgICAgICglZClcbiIsIGNvdW50KTsKCQkKCQlpZiAoY291bnQqMz5UaGlzLT5uYl9pbmRpY2VzKSB7CgkJICAgIFRoaXMtPm5iX2luZGljZXMgPSBjb3VudCAqIDM7CiAgICAgICAgICAgICAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLFRoaXMtPmluZGljZXMpOwoJCSAgICBUaGlzLT5pbmRpY2VzID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplb2YoV09SRCkqVGhpcy0+bmJfaW5kaWNlcyk7CgkJfQoJCQkKCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIExQRDNEVFJJQU5HTEUgY2kgPSAoTFBEM0RUUklBTkdMRSkgaW5zdHI7CgkJICAgIFRSQUNFXyhkM2Q3KSgiICB2MTogJWQgIHYyOiAlZCAgdjM6ICVkXG4iLGNpLT51MS52MSwgY2ktPnUyLnYyLCBjaS0+dTMudjMpOwoJCSAgICBUUkFDRV8oZDNkNykoIiAgRmxhZ3MgOiAiKTsKCQkgICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CgkJCS8qIFdpcmVmcmFtZSAqLwoJCQlpZiAoY2ktPndGbGFncyAmIEQzRFRSSUZMQUdfRURHRUVOQUJMRTEpCgkgICAgICAgIAkgICAgVFJBQ0VfKGQzZDcpKCJFREdFRU5BQkxFMSAiKTsKCSAgICAJCWlmIChjaS0+d0ZsYWdzICYgRDNEVFJJRkxBR19FREdFRU5BQkxFMikKCSAgICAgICAgCSAgICBUUkFDRV8oZDNkNykoIkVER0VFTkFCTEUyICIpOwoJICAgIAkJaWYgKGNpLT53RmxhZ3MgJiBEM0RUUklGTEFHX0VER0VFTkFCTEUxKQoJICAgICAgICAJICAgIFRSQUNFXyhkM2Q3KSgiRURHRUVOQUJMRTMgIik7CgkgICAgCQkvKiBTdHJpcHMgLyBGYW5zICovCgkgICAgCQlpZiAoY2ktPndGbGFncyA9PSBEM0RUUklGTEFHX0VWRU4pCgkgICAgICAgIAkgICAgVFJBQ0VfKGQzZDcpKCJFVkVOICIpOwoJICAgIAkJaWYgKGNpLT53RmxhZ3MgPT0gRDNEVFJJRkxBR19PREQpCgkgICAgICAgIAkgICAgVFJBQ0VfKGQzZDcpKCJPREQgIik7CgkgICAgCQlpZiAoY2ktPndGbGFncyA9PSBEM0RUUklGTEFHX1NUQVJUKQoJICAgICAgICAJICAgIFRSQUNFXyhkM2Q3KSgiU1RBUlQgIik7CgkgICAgCQlpZiAoKGNpLT53RmxhZ3MgPiAwKSAmJiAoY2ktPndGbGFncyA8IDMwKSkKCSAgICAgICAJCSAgICBUUkFDRV8oZDNkNykoIlNUQVJURkxBVCglZCkgIiwgY2ktPndGbGFncyk7CgkgICAgCQlUUkFDRV8oZDNkNykoIlxuIik7CiAgICAgICAgCSAgICB9CgkJICAgIFRoaXMtPmluZGljZXNbKGkgKiAzKSAgICBdID0gY2ktPnUxLnYxOwoJCSAgICBUaGlzLT5pbmRpY2VzWyhpICogMykgKyAxXSA9IGNpLT51Mi52MjsKCQkgICAgVGhpcy0+aW5kaWNlc1soaSAqIDMpICsgMl0gPSBjaS0+dTMudjM7CiAgICAgICAgICAgICAgICAgICAgaW5zdHIgKz0gc2l6ZTsKCQl9CiAgICAgICAgICAgICAgICAvKiBJRGlyZWN0M0REZXZpY2VzIGhhdmUgY29sb3Iga2V5aW5nIGFsd2F5cyBlbmFibGVkIC0KICAgICAgICAgICAgICAgICAqIGVuYWJsZSBpdCBiZWZvcmUgZHJhd2luZy4gVGhpcyBvdmVyd3JpdGVzIGFueSBBTFBIQSoKICAgICAgICAgICAgICAgICAqIHJlbmRlciBzdGF0ZQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9TZXRSZW5kZXJTdGF0ZShscERldmljZS0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RSU19DT0xPUktFWUVOQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOwogICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlN19EcmF3SW5kZXhlZFByaW1pdGl2ZShJQ09NX0lOVEVSRkFDRShscERldmljZSxJRGlyZWN0M0REZXZpY2U3KSwKCQkJCSAgICAgICAgICAgICAgICAgICAgICBEM0RQVF9UUklBTkdMRUxJU1QsRDNERlZGX1RMVkVSVEVYLHRsX3Z4LDAsVGhpcy0+aW5kaWNlcyxjb3VudCozLDApOwoJICAgIH0gYnJlYWs7CgoJICAgIGNhc2UgRDNET1BfTUFUUklYTE9BRDoKCSAgICAgICAgV0FSTigiTUFUUklYTE9BRC1zICAgICAoJWQpXG4iLCBjb3VudCk7CgkgICAgICAgIGluc3RyICs9IGNvdW50ICogc2l6ZTsKCSAgICAgICAgYnJlYWs7CgoJICAgIGNhc2UgRDNET1BfTUFUUklYTVVMVElQTFk6IHsKCSAgICAgICAgaW50IGk7CgkJVFJBQ0UoIk1BVFJJWE1VTFRJUExZICAgKCVkKVxuIiwgY291bnQpOwoJCQoJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CgkJICAgIExQRDNETUFUUklYTVVMVElQTFkgY2kgPSAoTFBEM0RNQVRSSVhNVUxUSVBMWSkgaW5zdHI7CiAgICAgICAgICAgICAgICAgICAgTFBEM0RNQVRSSVggYSwgYiwgYzsKCiAgICAgICAgICAgICAgICAgICAgaWYoIWNpLT5oRGVzdE1hdHJpeCB8fCBjaS0+aERlc3RNYXRyaXggPiBscERldmljZS0+bnVtSGFuZGxlcyB8fAogICAgICAgICAgICAgICAgICAgICAgICFjaS0+aFNyY01hdHJpeDEgfHwgY2ktPmhTcmNNYXRyaXgxID4gbHBEZXZpY2UtPm51bUhhbmRsZXMgfHwKICAgICAgICAgICAgICAgICAgICAgICAhY2ktPmhTcmNNYXRyaXgyIHx8IGNpLT5oU3JjTWF0cml4MiA+IGxwRGV2aWNlLT5udW1IYW5kbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEVSUigiSGFuZGxlcyBvdXQgb2YgYm91bmRzXG4iKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxwRGV2aWNlLT5IYW5kbGVzW2NpLT5oRGVzdE1hdHJpeCAtIDFdLnR5cGUgIT0gRERyYXdIYW5kbGVfTWF0cml4IHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscERldmljZS0+SGFuZGxlc1tjaS0+aFNyY01hdHJpeDEgLSAxXS50eXBlICE9IEREcmF3SGFuZGxlX01hdHJpeCB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEZXZpY2UtPkhhbmRsZXNbY2ktPmhTcmNNYXRyaXgyIC0gMV0udHlwZSAhPSBERHJhd0hhbmRsZV9NYXRyaXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRVJSKCJIYW5kbGUgdHlwZXMgaW52YWxpZFxuIik7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgYSA9IChMUEQzRE1BVFJJWCkgbHBEZXZpY2UtPkhhbmRsZXNbY2ktPmhEZXN0TWF0cml4IC0gMV0ucHRyOwogICAgICAgICAgICAgICAgICAgICAgICBiID0gKExQRDNETUFUUklYKSBscERldmljZS0+SGFuZGxlc1tjaS0+aFNyY01hdHJpeDEgLSAxXS5wdHI7CiAgICAgICAgICAgICAgICAgICAgICAgIGMgPSAoTFBEM0RNQVRSSVgpIGxwRGV2aWNlLT5IYW5kbGVzW2NpLT5oU3JjTWF0cml4MiAtIDFdLnB0cjsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIiAgRGVzdCA6ICVwICBTcmMxIDogJXAgIFNyYzIgOiAlcFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEsIGIsIGMpOwogICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBseV9tYXRyaXgoYSxjLGIpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaW5zdHIgKz0gc2l6ZTsKCQl9CgkgICAgfSBicmVhazsKCgkgICAgY2FzZSBEM0RPUF9TVEFURVRSQU5TRk9STTogewoJICAgICAgICBpbnQgaTsKCQlUUkFDRSgiU1RBVEVUUkFOU0ZPUk0gICAoJWQpXG4iLCBjb3VudCk7CgkJCgkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKCQkgICAgTFBEM0RTVEFURSBjaSA9IChMUEQzRFNUQVRFKSBpbnN0cjsKCiAgICAgICAgICAgICAgICAgICAgaWYoIWNpLT51Mi5kd0FyZ1swXSkgewogICAgICAgICAgICAgICAgICAgICAgICBFUlIoIlNldHRpbmcgYSBOVUxMIG1hdHJpeCBoYW5kbGUsIHdoYXQgc2hvdWxkIEkgZG8/XG4iKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYoY2ktPnUyLmR3QXJnWzBdID4gbHBEZXZpY2UtPm51bUhhbmRsZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRVJSKCJIYW5kbGUgJWQgaXMgb3V0IG9mIGJvdW5kc1xuIiwgY2ktPnUyLmR3QXJnWzBdKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYobHBEZXZpY2UtPkhhbmRsZXNbY2ktPnUyLmR3QXJnWzBdIC0gMV0udHlwZSAhPSBERHJhd0hhbmRsZV9NYXRyaXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgRVJSKCJIYW5kbGUgJWQgaXMgbm90IGEgbWF0cml4IGhhbmRsZVxuIiwgY2ktPnUyLmR3QXJnWzBdKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZihjaS0+dTEuZHJzdFJlbmRlclN0YXRlVHlwZSA9PSBEM0RUUkFOU0ZPUk1TVEFURV9XT1JMRCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRGV2aWNlLT53b3JsZCA9IGNpLT51Mi5kd0FyZ1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoY2ktPnUxLmRyc3RSZW5kZXJTdGF0ZVR5cGUgPT0gRDNEVFJBTlNGT1JNU1RBVEVfVklFVykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwRGV2aWNlLT52aWV3ID0gY2ktPnUyLmR3QXJnWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBpZihjaS0+dTEuZHJzdFJlbmRlclN0YXRlVHlwZSA9PSBEM0RUUkFOU0ZPUk1TVEFURV9QUk9KRUNUSU9OKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHBEZXZpY2UtPnByb2ogPSBjaS0+dTIuZHdBcmdbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIElEaXJlY3QzRERldmljZTdfU2V0VHJhbnNmb3JtKElDT01fSU5URVJGQUNFKGxwRGV2aWNlLCBJRGlyZWN0M0REZXZpY2U3KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2ktPnUxLmRyc3RSZW5kZXJTdGF0ZVR5cGUsIChMUEQzRE1BVFJJWCkgbHBEZXZpY2UtPkhhbmRsZXNbY2ktPnUyLmR3QXJnWzBdIC0gMV0ucHRyKTsKICAgICAgICAgICAgICAgICAgICB9CgkJICAgIGluc3RyICs9IHNpemU7CgkJfQoJICAgIH0gYnJlYWs7CgoJICAgIGNhc2UgRDNET1BfU1RBVEVMSUdIVDogewoJICAgICAgICBpbnQgaTsKCQlUUkFDRSgiU1RBVEVMSUdIVCAgICAgICAoJWQpXG4iLCBjb3VudCk7CgkJCgkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKCQkgICAgTFBEM0RTVEFURSBjaSA9IChMUEQzRFNUQVRFKSBpbnN0cjsKCiAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIiglMDh4LCUwOHgpXG4iLGNpLT51MS5kbHN0TGlnaHRTdGF0ZVR5cGUsIGNpLT51Mi5kd0FyZ1swXSk7CgoJCSAgICBpZiAoIWNpLT51MS5kbHN0TGlnaHRTdGF0ZVR5cGUgJiYgKGNpLT51MS5kbHN0TGlnaHRTdGF0ZVR5cGUgPiBEM0RMSUdIVFNUQVRFX0NPTE9SVkVSVEVYKSkKCQkJRVJSKCJVbmV4cGVjdGVkIExpZ2h0IFN0YXRlIFR5cGVcbiIpOwoJCSAgICBlbHNlIGlmIChjaS0+dTEuZGxzdExpZ2h0U3RhdGVUeXBlID09IEQzRExJR0hUU1RBVEVfTUFURVJJQUwgLyogMSAqLykgewogICAgICAgICAgICBEV09SRCBtYXRIYW5kbGUgPSBjaS0+dTIuZHdBcmdbMF07CgogICAgICAgICAgICBpZighbWF0SGFuZGxlKSB7CiAgICAgICAgICAgICAgICBGSVhNRSgiIEQzRExJR0hUU1RBVEVfTUFURVJJQUwgY2FsbGVkIHdpdGggTlVMTCBtYXRlcmlhbCAhISFcbiIpOwogICAgICAgICAgICB9IGVsc2UgaWYobWF0SGFuZGxlID49IGxwRGV2aWNlLT5udW1IYW5kbGVzKSB7CiAgICAgICAgICAgICAgICBXQVJOKCJNYXRlcmlhbCBoYW5kbGUgJWQgaXMgaW52YWxpZFxuIiwgbWF0SGFuZGxlKTsKICAgICAgICAgICAgfSBlbHNlIGlmKGxwRGV2aWNlLT5IYW5kbGVzW21hdEhhbmRsZSAtIDFdLnR5cGUgIT0gRERyYXdIYW5kbGVfTWF0ZXJpYWwpIHsKICAgICAgICAgICAgICAgIFdBUk4oIkhhbmRsZSAlZCBpcyBub3QgYSBtYXRlcmlhbCBoYW5kbGVcbiIsIG1hdEhhbmRsZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBJRGlyZWN0M0RNYXRlcmlhbEltcGwgKm1hdCA9IChJRGlyZWN0M0RNYXRlcmlhbEltcGwgKikgbHBEZXZpY2UtPkhhbmRsZXNbbWF0SGFuZGxlIC0gMV0ucHRyOwogICAgICAgICAgICAgICAgbWF0LT5hY3RpdmF0ZShtYXQpOwoJCSAgICB9CiAgICAgICAgICAgIH0KCQkgICBlbHNlIGlmIChjaS0+dTEuZGxzdExpZ2h0U3RhdGVUeXBlID09IEQzRExJR0hUU1RBVEVfQ09MT1JNT0RFTCAvKiAzICovKSB7CgkJCXN3aXRjaCAoY2ktPnUyLmR3QXJnWzBdKSB7CgkJCSAgICBjYXNlIEQzRENPTE9SX01PTk86CgkJCSAgICAgICBFUlIoIkREQ09MT1JfTU9OTyBzaG91bGQgbm90IGhhcHBlbiFcbiIpOwoJCQkgICAgICAgYnJlYWs7CgkJCSAgICBjYXNlIEQzRENPTE9SX1JHQjoKCQkJICAgICAgIC8qIFdlIGFyZSBhbHJlYWR5IGluIHRoaXMgbW9kZSAqLwoJCQkgICAgICAgYnJlYWs7CgkJCSAgICBkZWZhdWx0OgoJCSAgICAgICAgICAgICAgIEVSUigiVW5rbm93biBjb2xvciBtb2RlbCFcbiIpOwoJCQl9CgkJICAgIH0gZWxzZSB7CgkJICAgIAlEM0RSRU5ERVJTVEFURVRZUEUgcnMgPSAwOwoJCSAgICAJc3dpdGNoIChjaS0+dTEuZGxzdExpZ2h0U3RhdGVUeXBlKSB7CgoJCSAgICAJICAgIGNhc2UgRDNETElHSFRTVEFURV9BTUJJRU5UOiAgICAgICAvKiAyICovCgkJCQlycyA9IEQzRFJFTkRFUlNUQVRFX0FNQklFTlQ7CgkJCQlicmVhazsJCQoJCQkgICAgY2FzZSBEM0RMSUdIVFNUQVRFX0ZPR01PREU6ICAgICAgIC8qIDQgKi8KCQkJCXJzID0gRDNEUkVOREVSU1RBVEVfRk9HVkVSVEVYTU9ERTsKCQkJCWJyZWFrOwoJCQkgICAgY2FzZSBEM0RMSUdIVFNUQVRFX0ZPR1NUQVJUOiAgICAgIC8qIDUgKi8KCQkJCXJzID0gRDNEUkVOREVSU1RBVEVfRk9HU1RBUlQ7CgkJCQlicmVhazsKCQkJICAgIGNhc2UgRDNETElHSFRTVEFURV9GT0dFTkQ6ICAgICAgICAvKiA2ICovCgkJCQlycyA9IEQzRFJFTkRFUlNUQVRFX0ZPR0VORDsKCQkJCWJyZWFrOwoJCQkgICAgY2FzZSBEM0RMSUdIVFNUQVRFX0ZPR0RFTlNJVFk6ICAgIC8qIDcgKi8KCQkJCXJzID0gRDNEUkVOREVSU1RBVEVfRk9HREVOU0lUWTsKCQkJCWJyZWFrOwoJCQkgICAgY2FzZSBEM0RMSUdIVFNUQVRFX0NPTE9SVkVSVEVYOiAgIC8qIDggKi8KCQkJCXJzID0gRDNEUkVOREVSU1RBVEVfQ09MT1JWRVJURVg7CgkJCQlicmVhazsKCQkJICAgIGRlZmF1bHQ6CgkJCQlicmVhazsKCQkJfQoJCQkKCQkgICAgICAgIElEaXJlY3QzRERldmljZTdfU2V0UmVuZGVyU3RhdGUoSUNPTV9JTlRFUkZBQ0UobHBEZXZpY2UsIElEaXJlY3QzRERldmljZTcpLAoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCXJzLGNpLT51Mi5kd0FyZ1swXSk7CgkJICAgfQoKCQkgICBpbnN0ciArPSBzaXplOwoJCX0KCSAgICB9IGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX1NUQVRFUkVOREVSOiB7CgkgICAgICAgIGludCBpOwoJCVRSQUNFKCJTVEFURVJFTkRFUiAgICAgICglZClcbiIsIGNvdW50KTsKCgkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKCQkgICAgTFBEM0RTVEFURSBjaSA9IChMUEQzRFNUQVRFKSBpbnN0cjsKCQkgICAgCgkJICAgIElEaXJlY3QzRERldmljZTdfU2V0UmVuZGVyU3RhdGUoSUNPTV9JTlRFUkZBQ0UobHBEZXZpY2UsIElEaXJlY3QzRERldmljZTcpLAoJCQkJCQkgICAgY2ktPnUxLmRyc3RSZW5kZXJTdGF0ZVR5cGUsIGNpLT51Mi5kd0FyZ1swXSk7CgoJCSAgICBpbnN0ciArPSBzaXplOwoJCX0KCSAgICB9IGJyZWFrOwoKICAgICAgICAgICAgY2FzZSBEM0RPUF9QUk9DRVNTVkVSVElDRVM6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIFRPRE86IFNoYXJlIGNvZGUgd2l0aCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI6OlByb2Nlc3NWZXJ0aWNlcyBhbmQgLyBvcgogICAgICAgICAgICAgICAgICogSVdpbmVEM0REZXZpY2U6OlByb2Nlc3NWZXJ0aWNlcwogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAgICAgIEQzRE1BVFJJWCB2aWV3X21hdCwgd29ybGRfbWF0LCBwcm9qX21hdDsKICAgICAgICAgICAgICAgIFRSQUNFKCJQUk9DRVNTVkVSVElDRVMgICglZClcbiIsIGNvdW50KTsKCiAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHRyYW5zZm9ybSBhbmQgd29ybGQgbWF0cml4ICovCiAgICAgICAgICAgICAgICAvKiBOb3RlOiBEM0RNQVRSSVggaXMgY29tcGF0aWJsZSB3aXRoIFdJTkVEM0RNQVRSSVggKi8KCiAgICAgICAgICAgICAgICBJV2luZUQzRERldmljZV9HZXRUcmFuc2Zvcm0obHBEZXZpY2UtPndpbmVEM0REZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEVFJBTlNGT1JNU1RBVEVfVklFVywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV0lORUQzRE1BVFJJWCopICZ2aWV3X21hdCk7CgogICAgICAgICAgICAgICAgSVdpbmVEM0REZXZpY2VfR2V0VHJhbnNmb3JtKGxwRGV2aWNlLT53aW5lRDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRFRSQU5TRk9STVNUQVRFX1BST0pFQ1RJT04sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdJTkVEM0RNQVRSSVgqKSAmcHJval9tYXQpOwoKICAgICAgICAgICAgICAgIElXaW5lRDNERGV2aWNlX0dldFRyYW5zZm9ybShscERldmljZS0+d2luZUQzRERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVFNfV09STERNQVRSSVgoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFdJTkVEM0RNQVRSSVgqKSAmd29ybGRfbWF0KTsKCgkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKCQkgICAgTFBEM0RQUk9DRVNTVkVSVElDRVMgY2kgPSAoTFBEM0RQUk9DRVNTVkVSVElDRVMpIGluc3RyOwoKICAgICAgICAgICAgICAgICAgICBUUkFDRSgiICBTdGFydCA6ICVkIERlc3QgOiAlZCBDb3VudCA6ICVkXG4iLAoJCQkgIGNpLT53U3RhcnQsIGNpLT53RGVzdCwgY2ktPmR3Q291bnQpOwoJCSAgICBUUkFDRSgiICBGbGFncyA6ICIpOwoJCSAgICBpZiAoVFJBQ0VfT04oZDNkNykpIHsKCQkgICAgICAgIGlmIChjaS0+ZHdGbGFncyAmIEQzRFBST0NFU1NWRVJUSUNFU19DT1BZKQoJCQkgICAgVFJBQ0UoIkNPUFkgIik7CgkJCWlmIChjaS0+ZHdGbGFncyAmIEQzRFBST0NFU1NWRVJUSUNFU19OT0NPTE9SKQoJCQkgICAgVFJBQ0UoIk5PQ09MT1IgIik7CgkJCWlmIChjaS0+ZHdGbGFncyA9PSBEM0RQUk9DRVNTVkVSVElDRVNfT1BNQVNLKQoJCQkgICAgVFJBQ0UoIk9QTUFTSyAiKTsKCQkJaWYgKGNpLT5kd0ZsYWdzICYgRDNEUFJPQ0VTU1ZFUlRJQ0VTX1RSQU5TRk9STSkKCQkJICAgIFRSQUNFKCJUUkFOU0ZPUk0gIik7CgkJCWlmIChjaS0+ZHdGbGFncyA9PSBEM0RQUk9DRVNTVkVSVElDRVNfVFJBTlNGT1JNTElHSFQpCgkJCSAgICBUUkFDRSgiVFJBTlNGT1JNTElHSFQgIik7CgkJCWlmIChjaS0+ZHdGbGFncyAmIEQzRFBST0NFU1NWRVJUSUNFU19VUERBVEVFWFRFTlRTKQoJCQkgICAgVFJBQ0UoIlVQREFURUVYVEVOVFMgIik7CgkJCVRSQUNFKCJcbiIpOwoJCSAgICB9CgkJICAgIAoJCSAgICAvKiBUaGlzIGlzIHdoZXJlIGRvaW5nIERpcmVjdDNEIG9uIHRvcCBvbiBPcGVuR0wgaXMgcXVpdGUgZGlmZmljdWx0LgoJCSAgICAgICBUaGlzIG1ldGhvZCB0cmFuc2Zvcm1zIGEgc2V0IG9mIHZlcnRpY2VzIHVzaW5nIHRoZSBDVVJSRU5UIHN0YXRlCgkJICAgICAgIChsaWdodGluZywgcHJvamVjdGlvbiwgLi4uKSBidXQgZG9lcyBub3QgcmFzdGVyaXplIHRoZW0uCgkJICAgICAgIFRoZXkgd2lsbCBvbmx5IGJlIHB1dCBvbiBzY3JlZW4gbGF0ZXIgKHdpdGggdGhlIFBPSU5UIC8gTElORSBhbmQKCQkgICAgICAgVFJJQU5HTEUgb3AtY29kZXMpLiBUaGUgcHJvYmxlbSBpcyB0aGF0IHlvdSBjYW4gaGF2ZSBhIHRyaWFuZ2xlCgkJICAgICAgIHdpdGggZWFjaCBwb2ludCBoYXZpbmcgYmVlbiB0cmFuc2Zvcm1lZCB1c2luZyBhbm90aGVyIHN0YXRlLi4uCgkJICAgICAgIAoJCSAgICAgICBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCBJIHdpbGwgZW11bGF0ZSBvbmx5IE9ORSB0aGluZyA6IGVhY2gKCQkgICAgICAgdmVydGV4IGNhbiBoYXZlIGl0cyBvd24gIldPUkxEIiB0cmFuc2Zvcm1hdGlvbiAodGhpcyBpcyB1c2VkIGluIHRoZQoJCSAgICAgICBUV0lTVC5FWEUgZGVtbyBvZiB0aGUgNS4yIFNESykuIEkgc3VwcG9zZSB0aGF0IGFsbCB2ZXJ0aWNlcyBvZiB0aGUKCQkgICAgICAgZXhlY3V0ZSBidWZmZXIgdXNlIHRoZSBzYW1lIHN0YXRlLgoJCSAgICAgICAKCQkgICAgICAgSWYgSSBmaW5kIGFwcGxpY2F0aW9ucyB0aGF0IGNoYW5nZSBvdGhlciBzdGF0ZXMsIEkgd2lsbCB0cnkgdG8gZG8gYQoJCSAgICAgICBtb3JlICdmaW5lLXR1bmVkJyBzdGF0ZSBlbXVsYXRpb24gKGJ1dCBJIG1heSBiZWNvbWUgcXVpdGUgdHJpY2t5IGlmCgkJICAgICAgIGl0IGNoYW5nZXMgYSBsaWdodCBwb3NpdGlvbiBpbiB0aGUgbWlkZGxlIG9mIGEgdHJpYW5nbGUpLgoJCSAgICAgICAKCQkgICAgICAgSW4gdGhpcyBjYXNlLCBhICdkaXJlY3QnIGFwcHJvYWNoIChpLmUuIHdpdGhvdXQgdXNpbmcgT3BlbkdMLCBidXQKCQkgICAgICAgd3JpdGluZyBvdXIgb3duIDNEIHJhc3Rlcml6ZXIpIHdvdWxkIGJlIGVhc2llci4gKi8KCQkgICAgCgkJICAgIC8qIFRoZSBjdXJyZW50IG1ldGhvZCAod2l0aCB0aGUgaHlwb3RoZXNpcyB0aGF0IG9ubHkgdGhlIFdPUkxEIG1hdHJpeAoJCSAgICAgICB3aWxsIGNoYW5nZSBiZXR3ZWVuIHR3byBwb2ludHMpIGlzIGxpa2UgdGhpcyA6CgkJICAgICAgIC0gSSB0cmFuc2Zvcm0gJ21hbnVhbGx5JyBhbGwgdGhlIHZlcnRpY2VzIHdpdGggdGhlIGN1cnJlbnQgV09STEQKCQkgICAgICAgICBtYXRyaXggYW5kIHN0b3JlIHRoZW0gaW4gdGhlIHZlcnRleCBidWZmZXIKCQkgICAgICAgLSBkdXJpbmcgdGhlIHJhc3Rlcml6YXRpb24gcGhhc2UsIHRoZSBXT1JMRCBtYXRyaXggd2lsbCBiZSBzZXQgdG8KCQkgICAgICAgICB0aGUgSWRlbnRpdHkgbWF0cml4ICovCgkJICAgIAoJCSAgICAvKiBFbm91Z2ggZm9yIHRoZSBtb21lbnQgKi8KCQkgICAgaWYgKGNpLT5kd0ZsYWdzID09IEQzRFBST0NFU1NWRVJUSUNFU19UUkFOU0ZPUk1MSUdIVCkgewoJCSAgICAgICAgdW5zaWduZWQgaW50IG5iOwoJCQlEM0RWRVJURVggICpzcmMgPSAoKExQRDNEVkVSVEVYKSAgKChjaGFyICopVGhpcy0+ZGVzYy5scERhdGEgKyB2cykpICsgY2ktPndTdGFydDsKCQkJRDNEVExWRVJURVggKmRzdCA9ICgoTFBEM0RUTFZFUlRFWCkgKFRoaXMtPnZlcnRleF9kYXRhKSkgKyBjaS0+d0Rlc3Q7CgkJCUQzRE1BVFJJWCAqbWF0MiA9ICZ3b3JsZF9tYXQ7CgkJCUQzRE1BVFJJWCBtYXQ7CgkJCUQzRFZBTFVFIG54LG55LG56OwoJCQlEM0RWSUVXUE9SVCogVmlld3BvcnQgPSAmbHBWaWV3cG9ydC0+dmlld3BvcnRzLnZwMTsKCQkJCgkJCWlmIChUUkFDRV9PTihkM2Q3KSkgewoJCQkgICAgVFJBQ0UoIiAgUHJvamVjdGlvbiBNYXRyaXggOiAoJXApXG4iLCAmcHJval9tYXQpOwoJCQkgICAgZHVtcF9EM0RNQVRSSVgoJnByb2pfbWF0KTsKCQkJICAgIFRSQUNFKCIgIFZpZXcgICAgICAgTWF0cml4IDogKCVwKVxuIiwgJnZpZXdfbWF0KTsKCQkJICAgIGR1bXBfRDNETUFUUklYKCZ2aWV3X21hdCk7CgkJCSAgICBUUkFDRSgiICBXb3JsZCBNYXRyaXggOiAoJXApXG4iLCAmd29ybGRfbWF0KTsKCQkJICAgIGR1bXBfRDNETUFUUklYKCZ3b3JsZF9tYXQpOwoJCQl9CgogICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBseV9tYXRyaXgoJm1hdCwmdmlld19tYXQsJndvcmxkX21hdCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpcGx5X21hdHJpeCgmbWF0LCZwcm9qX21hdCwmbWF0KTsKCgkJCWZvciAobmIgPSAwOyBuYiA8IGNpLT5kd0NvdW50OyBuYisrKSB7CgkJCSAgICAvKiBOb3JtYWxzIHRyYW5zZm9ybWF0aW9uICovCgkJCSAgICBueCA9IChzcmMtPnU0Lm54ICogbWF0Mi0+XzExKSArIChzcmMtPnU1Lm55ICogbWF0Mi0+XzIxKSArIChzcmMtPnU2Lm56ICogbWF0Mi0+XzMxKTsKCQkJICAgIG55ID0gKHNyYy0+dTQubnggKiBtYXQyLT5fMTIpICsgKHNyYy0+dTUubnkgKiBtYXQyLT5fMjIpICsgKHNyYy0+dTYubnogKiBtYXQyLT5fMzIpOwoJCQkgICAgbnogPSAoc3JjLT51NC5ueCAqIG1hdDItPl8xMykgKyAoc3JjLT51NS5ueSAqIG1hdDItPl8yMykgKyAoc3JjLT51Ni5ueiAqIG1hdDItPl8zMyk7CgkJCSAgICAKCQkJICAgIC8qIE5vIGxpZ2h0aW5nIHlldCAqLwoJCQkgICAgZHN0LT51NS5jb2xvciA9IDB4RkZGRkZGRkY7IC8qIE9wYXF1ZSB3aGl0ZSAqLwoJCQkgICAgZHN0LT51Ni5zcGVjdWxhciA9IDB4RkYwMDAwMDA7IC8qIE5vIHNwZWN1bGFyIGFuZCBubyBmb2cgZmFjdG9yICovCgkJCSAgICAKCQkJICAgIGRzdC0+dTcudHUgID0gc3JjLT51Ny50dTsKCQkJICAgIGRzdC0+dTgudHYgID0gc3JjLT51OC50djsKCQkJICAgIAoJCQkgICAgLyogTm93LCB0aGUgbWF0cml4IG11bHRpcGxpY2F0aW9uICovCgkJCSAgICBkc3QtPnUxLnN4ID0gKHNyYy0+dTEueCAqIG1hdC5fMTEpICsgKHNyYy0+dTIueSAqIG1hdC5fMjEpICsgKHNyYy0+dTMueiAqIG1hdC5fMzEpICsgKDEuMCAqIG1hdC5fNDEpOwoJCQkgICAgZHN0LT51Mi5zeSA9IChzcmMtPnUxLnggKiBtYXQuXzEyKSArIChzcmMtPnUyLnkgKiBtYXQuXzIyKSArIChzcmMtPnUzLnogKiBtYXQuXzMyKSArICgxLjAgKiBtYXQuXzQyKTsKCQkJICAgIGRzdC0+dTMuc3ogPSAoc3JjLT51MS54ICogbWF0Ll8xMykgKyAoc3JjLT51Mi55ICogbWF0Ll8yMykgKyAoc3JjLT51My56ICogbWF0Ll8zMykgKyAoMS4wICogbWF0Ll80Myk7CgkJCSAgICBkc3QtPnU0LnJodyA9IChzcmMtPnUxLnggKiBtYXQuXzE0KSArIChzcmMtPnUyLnkgKiBtYXQuXzI0KSArIChzcmMtPnUzLnogKiBtYXQuXzM0KSArICgxLjAgKiBtYXQuXzQ0KTsKCgkJCSAgICBkc3QtPnUxLnN4ID0gZHN0LT51MS5zeCAvIGRzdC0+dTQucmh3ICogVmlld3BvcnQtPmR3V2lkdGggLyAyCgkJCQkgICAgICAgKyBWaWV3cG9ydC0+ZHdYICsgVmlld3BvcnQtPmR3V2lkdGggLyAyOwoJCQkgICAgZHN0LT51Mi5zeSA9ICgtZHN0LT51Mi5zeSkgLyBkc3QtPnU0LnJodyAqIFZpZXdwb3J0LT5kd0hlaWdodCAvIDIKCQkJCSAgICAgICArIFZpZXdwb3J0LT5kd1kgKyBWaWV3cG9ydC0+ZHdIZWlnaHQgLyAyOwoJCQkgICAgZHN0LT51My5zeiAvPSBkc3QtPnU0LnJodzsKCQkJICAgIGRzdC0+dTQucmh3ID0gMSAvIGRzdC0+dTQucmh3OwoKCQkJICAgIHNyYysrOwoJCQkgICAgZHN0Kys7CgkJCSAgICAKCQkJfQoJCSAgICB9IGVsc2UgaWYgKGNpLT5kd0ZsYWdzID09IEQzRFBST0NFU1NWRVJUSUNFU19UUkFOU0ZPUk0pIHsKCQkgICAgICAgIHVuc2lnbmVkIGludCBuYjsKCQkJRDNETFZFUlRFWCAqc3JjICA9ICgoTFBEM0RMVkVSVEVYKSAoKGNoYXIgKilUaGlzLT5kZXNjLmxwRGF0YSArIHZzKSkgKyBjaS0+d1N0YXJ0OwoJCQlEM0RUTFZFUlRFWCAqZHN0ID0gKChMUEQzRFRMVkVSVEVYKSAoVGhpcy0+dmVydGV4X2RhdGEpKSArIGNpLT53RGVzdDsKCQkJRDNETUFUUklYIG1hdDsKCQkJRDNEVklFV1BPUlQqIFZpZXdwb3J0ID0gJmxwVmlld3BvcnQtPnZpZXdwb3J0cy52cDE7CgkJCQoJCQlpZiAoVFJBQ0VfT04oZDNkNykpIHsKCQkJICAgIFRSQUNFKCIgIFByb2plY3Rpb24gTWF0cml4IDogKCVwKVxuIiwgJnByb2pfbWF0KTsKCQkJICAgIGR1bXBfRDNETUFUUklYKCZwcm9qX21hdCk7CgkJCSAgICBUUkFDRSgiICBWaWV3ICAgICAgIE1hdHJpeCA6ICglcClcbiIsJnZpZXdfbWF0KTsKCQkJICAgIGR1bXBfRDNETUFUUklYKCZ2aWV3X21hdCk7CgkJCSAgICBUUkFDRSgiICBXb3JsZCBNYXRyaXggOiAoJXApXG4iLCAmbWF0KTsKCQkJICAgIGR1bXBfRDNETUFUUklYKCZtYXQpOwoJCQl9CgoJCQltdWx0aXBseV9tYXRyaXgoJm1hdCwmdmlld19tYXQsJndvcmxkX21hdCk7CgkJCW11bHRpcGx5X21hdHJpeCgmbWF0LCZwcm9qX21hdCwmbWF0KTsKCgkJCWZvciAobmIgPSAwOyBuYiA8IGNpLT5kd0NvdW50OyBuYisrKSB7CgkJCSAgICBkc3QtPnU1LmNvbG9yID0gc3JjLT51NC5jb2xvcjsKCQkJICAgIGRzdC0+dTYuc3BlY3VsYXIgPSBzcmMtPnU1LnNwZWN1bGFyOwoJCQkgICAgZHN0LT51Ny50dSA9IHNyYy0+dTYudHU7CgkJCSAgICBkc3QtPnU4LnR2ID0gc3JjLT51Ny50djsKCQkJICAgIAoJCQkgICAgLyogTm93LCB0aGUgbWF0cml4IG11bHRpcGxpY2F0aW9uICovCgkJCSAgICBkc3QtPnUxLnN4ID0gKHNyYy0+dTEueCAqIG1hdC5fMTEpICsgKHNyYy0+dTIueSAqIG1hdC5fMjEpICsgKHNyYy0+dTMueiAqIG1hdC5fMzEpICsgKDEuMCAqIG1hdC5fNDEpOwoJCQkgICAgZHN0LT51Mi5zeSA9IChzcmMtPnUxLnggKiBtYXQuXzEyKSArIChzcmMtPnUyLnkgKiBtYXQuXzIyKSArIChzcmMtPnUzLnogKiBtYXQuXzMyKSArICgxLjAgKiBtYXQuXzQyKTsKCQkJICAgIGRzdC0+dTMuc3ogPSAoc3JjLT51MS54ICogbWF0Ll8xMykgKyAoc3JjLT51Mi55ICogbWF0Ll8yMykgKyAoc3JjLT51My56ICogbWF0Ll8zMykgKyAoMS4wICogbWF0Ll80Myk7CgkJCSAgICBkc3QtPnU0LnJodyA9IChzcmMtPnUxLnggKiBtYXQuXzE0KSArIChzcmMtPnUyLnkgKiBtYXQuXzI0KSArIChzcmMtPnUzLnogKiBtYXQuXzM0KSArICgxLjAgKiBtYXQuXzQ0KTsKCgkJCSAgICBkc3QtPnUxLnN4IC89IGRzdC0+dTQucmh3ICogVmlld3BvcnQtPmR2U2NhbGVYICogVmlld3BvcnQtPmR3V2lkdGggLyAyICsgVmlld3BvcnQtPmR3WDsKCQkJICAgIGRzdC0+dTIuc3kgLz0gZHN0LT51NC5yaHcgKiBWaWV3cG9ydC0+ZHZTY2FsZVkgKiBWaWV3cG9ydC0+ZHdIZWlnaHQgLyAyICsgVmlld3BvcnQtPmR3WTsKCQkJICAgIGRzdC0+dTMuc3ogLz0gZHN0LT51NC5yaHc7CgkJCSAgICBkc3QtPnU0LnJodyA9IDEgLyBkc3QtPnU0LnJodzsKCgkJCSAgICBzcmMrKzsKCQkJICAgIGRzdCsrOwoJCQl9CgkJICAgIH0gZWxzZSBpZiAoY2ktPmR3RmxhZ3MgPT0gRDNEUFJPQ0VTU1ZFUlRJQ0VTX0NPUFkpIHsKCQkgICAgICAgIEQzRFRMVkVSVEVYICpzcmMgPSAoKExQRDNEVExWRVJURVgpICgoY2hhciAqKVRoaXMtPmRlc2MubHBEYXRhICsgdnMpKSArIGNpLT53U3RhcnQ7CgkJCUQzRFRMVkVSVEVYICpkc3QgPSAoKExQRDNEVExWRVJURVgpIChUaGlzLT52ZXJ0ZXhfZGF0YSkpICsgY2ktPndEZXN0OwoJCQkKCQkJbWVtY3B5KGRzdCwgc3JjLCBjaS0+ZHdDb3VudCAqIHNpemVvZihEM0RUTFZFUlRFWCkpOwoJCSAgICB9IGVsc2UgewoJCSAgICAgICAgRVJSKCJVbmhhbmRsZWQgdmVydGV4IHByb2Nlc3NpbmcgIVxuIik7CgkJICAgIH0KCgkJICAgIGluc3RyICs9IHNpemU7CgkJfQoJICAgIH0gYnJlYWs7CgoJICAgIGNhc2UgRDNET1BfVEVYVFVSRUxPQUQ6IHsKCSAgICAgICAgV0FSTigiVEVYVFVSRUxPQUQtcyAgICAoJWQpXG4iLCBjb3VudCk7CgoJCWluc3RyICs9IGNvdW50ICogc2l6ZTsKCSAgICB9IGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX0VYSVQ6IHsKCSAgICAgICAgVFJBQ0UoIkVYSVQgICAgICAgICAgICAgKCVkKVxuIiwgY291bnQpOwoJCS8qIFdlIGRpZCB0aGlzIGluc3RydWN0aW9uICovCgkJaW5zdHIgKz0gc2l6ZTsKCQkvKiBFeGl0IHRoaXMgbG9vcCAqLwoJCWdvdG8gZW5kX29mX2J1ZmZlcjsKCSAgICB9IGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX0JSQU5DSEZPUldBUkQ6IHsKCSAgICAgICAgaW50IGk7CgkJVFJBQ0UoIkJSQU5DSEZPUldBUkQgICAgKCVkKVxuIiwgY291bnQpOwoKCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCSAgICBMUEQzREJSQU5DSCBjaSA9IChMUEQzREJSQU5DSCkgaW5zdHI7CgoJCSAgICBpZiAoKFRoaXMtPmRhdGEuZHNTdGF0dXMuZHdTdGF0dXMgJiBjaS0+ZHdNYXNrKSA9PSBjaS0+ZHdWYWx1ZSkgewoJCSAgICAgICAgaWYgKCFjaS0+Yk5lZ2F0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0UoIiBCcmFuY2ggdG8gJWRcbiIsIGNpLT5kd09mZnNldCk7CgkJCSAgICBpbnN0ciA9IChjaGFyKiljdXJyZW50ICsgY2ktPmR3T2Zmc2V0OwoJCQl9CgkJICAgIH0gZWxzZSB7CgkJICAgICAgICBpZiAoY2ktPmJOZWdhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFKCIgQnJhbmNoIHRvICVkXG4iLCBjaS0+ZHdPZmZzZXQpOwoJCQkgICAgaW5zdHIgPSAoY2hhciopY3VycmVudCArIGNpLT5kd09mZnNldDsKCQkJfQoJCSAgICB9CgoJCSAgICBpbnN0ciArPSBzaXplOwoJCX0KCSAgICB9IGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX1NQQU46IHsKCSAgICAgICAgV0FSTigiU1BBTi1zICAgICAgICAgICAoJWQpXG4iLCBjb3VudCk7CgoJCWluc3RyICs9IGNvdW50ICogc2l6ZTsKCSAgICB9IGJyZWFrOwoKCSAgICBjYXNlIEQzRE9QX1NFVFNUQVRVUzogewoJICAgICAgICBpbnQgaTsKCQlUUkFDRSgiU0VUU1RBVFVTICAgICAgICAoJWQpXG4iLCBjb3VudCk7CgoJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CgkJICAgIExQRDNEU1RBVFVTIGNpID0gKExQRDNEU1RBVFVTKSBpbnN0cjsKCQkgICAgCgkJICAgIFRoaXMtPmRhdGEuZHNTdGF0dXMgPSAqY2k7CgoJCSAgICBpbnN0ciArPSBzaXplOwoJCX0KCSAgICB9IGJyZWFrOwoKCSAgICBkZWZhdWx0OgoJICAgICAgICBFUlIoIlVuaGFuZGxlZCBPcENvZGUgJWQgISEhXG4iLGN1cnJlbnQtPmJPcGNvZGUpOwoJICAgICAgICAvKiBUcnkgdG8gc2F2ZSAuLi4gKi8KCSAgICAgICAgaW5zdHIgKz0gY291bnQgKiBzaXplOwoJICAgICAgICBicmVhazsKCX0KICAgIH0KCmVuZF9vZl9idWZmZXI6CiAgICA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpRdWVyeUludGVyZmFjZQogKgogKiBXZWxsLCBhIHVzdWFsIFF1ZXJ5SW50ZXJmYWNlIGZ1bmN0aW9uLiBEb24ndCBrbm93IGZ1ciBzdXJlIHdoaWNoCiAqIGludGVyZmFjZXMgaXQgY2FuIFF1ZXJ5LgogKgogKiBQYXJhbXM6CiAqICByaWlkOiBUaGUgaW50ZXJmYWNlIElEIHF1ZXJpZWQgZm9yCiAqICBvYmo6IEFkZHJlc3MgdG8gcmV0dXJuIHRoZSBpbnRlcmZhY2UgcG9pbnRlciBhdAogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIGluIGNhc2Ugb2YgYSBzdWNjZXNzIChTX09LPyBUaGluayBpdCdzIHRoZSBzYW1lKQogKiAgT0xFX0VfRU5VTV9OT01PUkUgaWYgdGhlIGludGVyZmFjZSB3YXNuJ3QgZm91bmQuCiAqICAgKEVfTk9JTlRFUkZBQ0U/PyBEb24ndCBrbm93IHdoYXQgSSByZWFsbHkgbmVlZCkKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfUXVlcnlJbnRlcmZhY2UoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFRklJRCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb2JqKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgaWZhY2UpOwogICAgVFJBQ0UoIiglcC8lcCktPiglcywlcClcbiIsIFRoaXMsIGlmYWNlLCBkZWJ1Z3N0cl9ndWlkKHJpaWQpLCBvYmopOwoKICAgICpvYmogPSBOVUxMOwoKICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSVVua25vd24sICByaWlkICkgKSB7CiAgICAgICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcl9BZGRSZWYoSUNPTV9JTlRFUkZBQ0UoVGhpcywgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcikpOwoJKm9iaiA9IGlmYWNlOwoJVFJBQ0UoIiAgQ3JlYXRpbmcgSVVua25vd24gaW50ZXJmYWNlIGF0ICVwLlxuIiwgKm9iaik7CglyZXR1cm4gU19PSzsKICAgIH0KICAgIGlmICggSXNFcXVhbEdVSUQoICZJSURfSURpcmVjdDNETWF0ZXJpYWwsIHJpaWQgKSApIHsKICAgICAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyX0FkZFJlZihJQ09NX0lOVEVSRkFDRShUaGlzLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyKSk7CiAgICAgICAgKm9iaiA9IElDT01fSU5URVJGQUNFKFRoaXMsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIpOwoJVFJBQ0UoIiAgQ3JlYXRpbmcgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciBpbnRlcmZhY2UgJXBcbiIsICpvYmopOwoJcmV0dXJuIFNfT0s7CiAgICB9CiAgICBGSVhNRSgiKCVwKTogaW50ZXJmYWNlIGZvciBJSUQgJXMgTk9UIGZvdW5kIVxuIiwgVGhpcywgZGVidWdzdHJfZ3VpZChyaWlkKSk7CiAgICByZXR1cm4gRV9OT0lOVEVSRkFDRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpBZGRSZWYKICoKICogQSBub3JtYWwgQWRkUmVmIG1ldGhvZCwgbm90aGluZyBzcGVjaWFsCiAqCiAqIFJldHVybnM6CiAqICBUaGUgbmV3IHJlZmNvdW50CiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIFVMT05HIFdJTkFQSQpJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9BZGRSZWYoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZEluY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBGSVhNRSgiKCVwKS0+KClpbmNyZW1lbnRpbmcgZnJvbSAldS5cbiIsIFRoaXMsIHJlZiAtIDEpOwoKICAgIHJldHVybiByZWY7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpSZWxlYXNlCiAqCiAqIEEgbm9ybWFsIFJlbGVhc2UgbWV0aG9kLCBub3RoaW5nIHNwZWNpYWwKICoKICogUmV0dXJuczoKICogIFRoZSBuZXcgcmVmY291bnQKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgVUxPTkcgV0lOQVBJCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX1JlbGVhc2UoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBpZmFjZSk7CiAgICBVTE9ORyByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKCiAgICBUUkFDRSgiKCVwKS0+KClkZWNyZW1lbnRpbmcgZnJvbSAldS5cbiIsIFRoaXMsIHJlZiArIDEpOwoKICAgIGlmICghcmVmKSB7CiAgICAgICAgaWYgKFRoaXMtPm5lZWRfZnJlZSkKCSAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLDAsVGhpcy0+ZGVzYy5scERhdGEpOwogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxUaGlzLT52ZXJ0ZXhfZGF0YSk7CiAgICAgICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLFRoaXMtPmluZGljZXMpOwoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLFRoaXMpOwoJcmV0dXJuIDA7CiAgICB9CgogICAgcmV0dXJuIHJlZjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OkluaXRpYWxpemUKICoKICogSW5pdGlhbGl6ZXMgdGhlIEV4ZWN1dGUgQnVmZmVyLiBUaGlzIG1ldGhvZCBleGlzdHMgZm9yIENPTSBjb21wbGlhbmNlCiAqIE5vdGhpbmcgdG8gZG8gaGVyZS4KICoKICogUmV0dXJuczoKICogIEQzRF9PSwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9Jbml0aWFsaXplKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSURpcmVjdDNERGV2aWNlICpscERpcmVjdDNERGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNERVhFQ1VURUJVRkZFUkRFU0MgKmxwRGVzYykKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJXAsJXApIG5vLW9wLi4uLlxuIiwgVGhpcywgbHBEaXJlY3QzRERldmljZSwgbHBEZXNjKTsKICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpMb2NrCiAqCiAqIExvY2tzIHRoZSBidWZmZXIsIHNvIHRoZSBhcHAgY2FuIHdyaXRlIGludG8gaXQuCiAqCiAqIFBhcmFtczoKICogIERlc2M6IFBvaW50ZXIgdG8gcmV0dXJuIHRoZSBidWZmZXIgZGVzY3JpcHRpb24uIFRoaXMgRGVzY3JpcHRpb24gY29udGFpbnMKICogICAgICAgIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyIGRhdGEuCiAqCiAqIFJldHVybnM6CiAqICBUaGlzIGltcGxlbWVudGF0aW9uIGFsd2F5cyByZXR1cm5zIEQzRF9PSwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9Mb2NrKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzREVYRUNVVEVCVUZGRVJERVNDICpscERlc2MpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBpZmFjZSk7CiAgICBEV09SRCBkd1NpemU7CiAgICBUUkFDRSgiKCVwKS0+KCVwKVxuIiwgVGhpcywgbHBEZXNjKTsKCiAgICBkd1NpemUgPSBscERlc2MtPmR3U2l6ZTsKICAgIG1lbXNldChscERlc2MsIDAsIGR3U2l6ZSk7CiAgICBtZW1jcHkobHBEZXNjLCAmVGhpcy0+ZGVzYywgZHdTaXplKTsKICAgIAogICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CiAgICAgICAgVFJBQ0UoIiAgUmV0dXJuaW5nIGRlc2NyaXB0aW9uIDpcbiIpOwoJX2R1bXBfRDNERVhFQ1VURUJVRkZFUkRFU0MobHBEZXNjKTsKICAgIH0KICAgIHJldHVybiBEM0RfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpVbmxvY2sKICoKICogVW5sb2NrcyB0aGUgYnVmZmVyLiBXZSBkb24ndCBoYXZlIGFueXRoaW5nIHRvIGRvIGhlcmUKICoKICogUmV0dXJuczoKICogIFRoaXMgaW1wbGVtZW50YXRpb24gYWx3YXlzIHJldHVybnMgRDNEX09LCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX1VubG9jayhJRGlyZWN0M0RFeGVjdXRlQnVmZmVyICppZmFjZSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oKSBuby1vcC4uLlxuIiwgVGhpcyk7CiAgICByZXR1cm4gRDNEX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSURpcmVjdDNERXhlY3V0ZUJ1ZmZlcjo6U2V0RXhlY3V0ZURhdGEKICoKICogU2V0cyB0aGUgZXhlY3V0ZSBkYXRhLiBUaGlzIGRhdGEgaXMgdXNlZCB0byBkZXNjcmliZSB0aGUgYnVmZmVyJ3MgY29udGVudAogKgogKiBQYXJhbXM6CiAqICBEYXRhOiBQb2ludGVyIHRvIGEgRDNERVhFQ1VURURBVEEgc3RydWN0dXJlIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8KICogIGFzc2lnbgogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICogIERERVJSX09VVE9GTUVNT1JZIGlmIHRoZSB2ZXJ0ZXggYnVmZmVyIGFsbG9jYXRpb24gZmFpbGVkCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX1NldEV4ZWN1dGVEYXRhKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RFWEVDVVRFREFUQSAqbHBEYXRhKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgaWZhY2UpOwogICAgRFdPUkQgbmJ2ZXJ0OwogICAgVFJBQ0UoIiglcCktPiglcClcbiIsIFRoaXMsIGxwRGF0YSk7CgogICAgbWVtY3B5KCZUaGlzLT5kYXRhLCBscERhdGEsIGxwRGF0YS0+ZHdTaXplKTsKCiAgICAvKiBHZXQgdGhlIG51bWJlciBvZiB2ZXJ0aWNlcyBpbiB0aGUgZXhlY3V0ZSBidWZmZXIgKi8KICAgIG5idmVydCA9IFRoaXMtPmRhdGEuZHdWZXJ0ZXhDb3VudDsKICAgIAogICAgLyogUHJlcGFyZXMgdGhlIHRyYW5zZm9ybWVkIHZlcnRleCBidWZmZXIgKi8KICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMtPnZlcnRleF9kYXRhKTsKICAgIFRoaXMtPnZlcnRleF9kYXRhID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIG5idmVydCAqIHNpemVvZihEM0RUTFZFUlRFWCkpOwoKICAgIGlmIChUUkFDRV9PTihkM2Q3KSkgewogICAgICAgIF9kdW1wX2V4ZWN1dGVkYXRhKGxwRGF0YSk7CiAgICB9CgogICAgcmV0dXJuIEQzRF9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OkdldEV4ZWN1dGVEYXRhCiAqCiAqIFJldHVybnMgdGhlIGRhdGEgaW4gdGhlIGV4ZWN1dGUgYnVmZmVyCiAqCiAqIFBhcmFtczoKICogIERhdGE6IFBvaW50ZXIgdG8gYSBEM0RFWEVDVVRFREFUQSBzdHJ1Y3R1cmUgdXNlZCB0byByZXR1cm4gZGF0YQogKgogKiBSZXR1cm5zOgogKiAgRDNEX09LIG9uIHN1Y2Nlc3MKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkKSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfR2V0RXhlY3V0ZURhdGEoSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciAqaWZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzREVYRUNVVEVEQVRBICpscERhdGEpCnsKICAgIElDT01fVEhJU19GUk9NKElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsLCBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyLCBpZmFjZSk7CiAgICBEV09SRCBkd1NpemU7CiAgICBUUkFDRSgiKCVwKS0+KCVwKTogc3R1YiFcbiIsIFRoaXMsIGxwRGF0YSk7CgogICAgZHdTaXplID0gbHBEYXRhLT5kd1NpemU7CiAgICBtZW1zZXQobHBEYXRhLCAwLCBkd1NpemUpOwogICAgbWVtY3B5KGxwRGF0YSwgJlRoaXMtPmRhdGEsIGR3U2l6ZSk7CgogICAgaWYgKFRSQUNFX09OKGQzZDcpKSB7CiAgICAgICAgVFJBQ0UoIlJldHVybmluZyBkYXRhIDpcbiIpOwoJX2R1bXBfZXhlY3V0ZWRhdGEobHBEYXRhKTsKICAgIH0KCiAgICByZXR1cm4gRERfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpWYWxpZGF0ZQogKgogKiBEaXJlY3RYIDUgU0RLOiAiVGhlIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6OlZhbGlkYXRlIG1ldGhvZCBpcyBub3QKICogY3VycmVudGx5IGltcGxlbWVudGVkIgogKgogKiBQYXJhbXM6CiAqICA/CiAqCiAqIFJldHVybnM6CiAqICBEREVSUl9VTlNVUFBPUlRFRCwgYmVjYXVzZSBpdCdzIG5vdCBpbXBsZW1lbnRlZCBpbiBXaW5kb3dzLgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBIUkVTVUxUIFdJTkFQSQpJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9WYWxpZGF0ZShJRGlyZWN0M0RFeGVjdXRlQnVmZmVyICppZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgKk9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBEM0RWQUxJREFURUNBTExCQUNLIEZ1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKlVzZXJBcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIFJlc2VydmVkKQp7CiAgICBJQ09NX1RISVNfRlJPTShJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbCwgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlciwgaWZhY2UpOwogICAgVFJBQ0UoIiglcCktPiglcCwlcCwlcCwlMDh4KTogVW5pbXBsZW1lbnRlZCFcbiIsIFRoaXMsIE9mZnNldCwgRnVuYywgVXNlckFyZywgUmVzZXJ2ZWQpOwogICAgcmV0dXJuIERERVJSX1VOU1VQUE9SVEVEOyAvKiBVbmNoZWNrZWQgKi8KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElEaXJlY3QzREV4ZWN1dGVCdWZmZXI6Ok9wdGltaXplCiAqCiAqIERpcmVjdFg1IFNESzogIlRoZSBJRGlyZWN0M0RFeGVjdXRlQnVmZmVyOjpPcHRpbWl6ZSBtZXRob2QgaXMgbm90CiAqIGN1cnJlbnRseSBzdXBwb3J0ZWQiCiAqCiAqIFBhcmFtczoKICogIER1bW15OiBTZWVtcyB0byBiZSBhbiB1bnVzZWQgZHVtbXkgOykKICoKICogUmV0dXJuczoKICogIERERVJSX1VOU1VQUE9SVEVELCBiZWNhdXNlIGl0J3Mgbm90IGltcGxlbWVudGVkIGluIFdpbmRvd3MuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJCklEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX09wdGltaXplKElEaXJlY3QzREV4ZWN1dGVCdWZmZXIgKmlmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBEdW1teSkKewogICAgSUNPTV9USElTX0ZST00oSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGwsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXIsIGlmYWNlKTsKICAgIFRSQUNFKCIoJXApLT4oJTA4eCk6IFVuaW1wbGVtZW50ZWRcbiIsIFRoaXMsIER1bW15KTsKICAgIHJldHVybiBEREVSUl9VTlNVUFBPUlRFRDsgLyogVW5jaGVja2VkICovCn0KCmNvbnN0IElEaXJlY3QzREV4ZWN1dGVCdWZmZXJWdGJsIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJfVnRibCA9CnsKICAgIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX1F1ZXJ5SW50ZXJmYWNlLAogICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfQWRkUmVmLAogICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfUmVsZWFzZSwKICAgIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX0luaXRpYWxpemUsCiAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9Mb2NrLAogICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfVW5sb2NrLAogICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfU2V0RXhlY3V0ZURhdGEsCiAgICBJRGlyZWN0M0RFeGVjdXRlQnVmZmVySW1wbF9HZXRFeGVjdXRlRGF0YSwKICAgIElEaXJlY3QzREV4ZWN1dGVCdWZmZXJJbXBsX1ZhbGlkYXRlLAogICAgSURpcmVjdDNERXhlY3V0ZUJ1ZmZlckltcGxfT3B0aW1pemUsCn07Cg==