LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJtb2QuaAogKiBWZXJzaW9uOiAgICAgICAwLjMKICogRGVzY3JpcHRpb246ICAgSXJEQSBtb2R1bGUgYW5kIHV0aWxpdGllcyBmdW5jdGlvbnMKICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIE1vbiBEZWMgMTUgMTM6NTg6NTIgMTk5NwogKiBNb2RpZmllZCBhdDogICBGcmkgSmFuIDI4IDEzOjE1OjI0IDIwMDAKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKgogKiAgICAgQ29weXJpZ2h0IChjKSAxOTk4LTIwMDAgRGFnIEJyYXR0bGksIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICBDb3B5cmlnaHQgKGMpIDIwMDAtMjAwMiBKZWFuIFRvdXJyaWxoZXMgPGp0QGhwbC5ocC5jb20+CiAqICAgICAgCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCiAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKiAgCiAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCiAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnLgogKiAgICAgCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgSVJNT0RfSAojZGVmaW5lIElSTU9EX0gKCi8qIE1pc2Mgc3RhdHVzIGluZm9ybWF0aW9uICovCnR5cGVkZWYgZW51bSB7CglTVEFUVVNfT0ssCglTVEFUVVNfQUJPUlRFRCwKCVNUQVRVU19OT19BQ1RJVklUWSwKCVNUQVRVU19OT0lTWSwKCVNUQVRVU19SRU1PVEUsCn0gTElOS19TVEFUVVM7Cgp0eXBlZGVmIGVudW0gewoJTE9DS19OT19DSEFOR0UsCglMT0NLX0xPQ0tFRCwKCUxPQ0tfVU5MT0NLRUQsCn0gTE9DS19TVEFUVVM7Cgp0eXBlZGVmIGVudW0geyBGTE9XX1NUT1AsIEZMT1dfU1RBUlQgfSBMT0NBTF9GTE9XOwoKLyogIAogKiAgSXJMTVAgZGlzY29ubmVjdCByZWFzb25zLiBUaGUgb3JkZXIgaXMgdmVyeSBpbXBvcnRhbnQsIHNpbmNlIHRoZXkgCiAqICBjb3JyZXNwb25kIHRvIGRpc2Nvbm5lY3QgcmVhc29ucyBzZW50IGluIElyTE1QIGRpc2Nvbm5lY3QgZnJhbWVzLCBzbwogKiAgcGxlYXNlIGRvIG5vdCB0b3VjaCA6LSkKICovCnR5cGVkZWYgZW51bSB7CglMTV9VU0VSX1JFUVVFU1QgPSAxLCAgLyogVXNlciByZXF1ZXN0ICovCglMTV9MQVBfRElTQ09OTkVDVCwgICAgLyogVW5leHBlY3RlZCBJckxBUCBkaXNjb25uZWN0ICovCglMTV9DT05ORUNUX0ZBSUxVUkUsICAgLyogRmFpbGVkIHRvIGVzdGFibGlzaCBJckxBUCBjb25uZWN0aW9uICovCglMTV9MQVBfUkVTRVQsICAgICAgICAgLyogSXJMQVAgcmVzZXQgKi8KCUxNX0lOSVRfRElTQ09OTkVDVCwgICAvKiBMaW5rIE1hbmFnZW1lbnQgaW5pdGlhdGVkIGRpc2Nvbm5lY3QgKi8KCUxNX0xTQVBfTk9UQ09OTiwgICAgICAvKiBEYXRhIGRlbGl2ZXJlZCBvbiB1bmNvbm5lY3RlZCBMU0FQICovCglMTV9OT05fUkVTUF9DTElFTlQsICAgLyogTm9uIHJlc3BvbnNpdmUgTE0tTVVYIGNsaWVudCAqLwoJTE1fTk9fQVZBSUxfQ0xJRU5ULCAgIC8qIE5vIGF2YWlsYWJsZSBMTS1NVVggY2xpZW50ICovCglMTV9DT05OX0hBTEZfT1BFTiwgICAgLyogQ29ubmVjdGlvbiBpcyBoYWxmIG9wZW4gKi8KCUxNX0JBRF9TT1VSQ0VfQUREUiwgICAvKiBJbGxlZ2FsIHNvdXJjZSBhZGRyZXNzIChpLmUgMHgwMCkgKi8KfSBMTV9SRUFTT047CiNkZWZpbmUgTE1fVU5LTk9XTiAweGZmICAgICAgIC8qIFVuc3BlY2lmaWVkIGRpc2Nvbm5lY3QgcmVhc29uICovCgovKiBBIGZldyBmb3J3YXJkIGRlY2xhcmF0aW9ucyAodG8gbWFrZSBjb21waWxlciBoYXBweSkgKi8Kc3RydWN0IHFvc19pbmZvOwkJLyogaW4gPG5ldC9pcmRhL3Fvcy5oPiAqLwoKLyoKICogIE5vdGlmeSBzdHJ1Y3R1cmUgdXNlZCBiZXR3ZWVuIHRyYW5zcG9ydCBhbmQgbGluayBtYW5hZ2VtZW50IGxheWVycwogKi8KdHlwZWRlZiBzdHJ1Y3QgewoJaW50ICgqZGF0YV9pbmRpY2F0aW9uKSh2b2lkICpwcml2LCB2b2lkICpzYXAsIHN0cnVjdCBza19idWZmICpza2IpOwoJaW50ICgqdWRhdGFfaW5kaWNhdGlvbikodm9pZCAqcHJpdiwgdm9pZCAqc2FwLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKCXZvaWQgKCpjb25uZWN0X2NvbmZpcm0pKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAoJCQkJc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZHVfc2l6ZSwKCQkJCV9fdTggbWF4X2hlYWRlcl9zaXplLCBzdHJ1Y3Qgc2tfYnVmZiAqc2tiKTsKCXZvaWQgKCpjb25uZWN0X2luZGljYXRpb24pKHZvaWQgKmluc3RhbmNlLCB2b2lkICpzYXAsIAoJCQkJICAgc3RydWN0IHFvc19pbmZvICpxb3MsIF9fdTMyIG1heF9zZHVfc2l6ZSwgCgkJCQkgICBfX3U4IG1heF9oZWFkZXJfc2l6ZSwgc3RydWN0IHNrX2J1ZmYgKnNrYik7Cgl2b2lkICgqZGlzY29ubmVjdF9pbmRpY2F0aW9uKSh2b2lkICppbnN0YW5jZSwgdm9pZCAqc2FwLCAKCQkJCSAgICAgIExNX1JFQVNPTiByZWFzb24sIHN0cnVjdCBza19idWZmICopOwoJdm9pZCAoKmZsb3dfaW5kaWNhdGlvbikodm9pZCAqaW5zdGFuY2UsIHZvaWQgKnNhcCwgTE9DQUxfRkxPVyBmbG93KTsKCXZvaWQgKCpzdGF0dXNfaW5kaWNhdGlvbikodm9pZCAqaW5zdGFuY2UsCgkJCQkgIExJTktfU1RBVFVTIGxpbmssIExPQ0tfU1RBVFVTIGxvY2spOwoJdm9pZCAqaW5zdGFuY2U7IC8qIExheWVyIGluc3RhbmNlIHBvaW50ZXIgKi8KCWNoYXIgbmFtZVsxNl07ICAvKiBOYW1lIG9mIGxheWVyICovCn0gbm90aWZ5X3Q7CgojZGVmaW5lIE5PVElGWV9NQVhfTkFNRSAxNgoKLyogWmVybyB0aGUgbm90aWZ5IHN0cnVjdHVyZSAqLwp2b2lkIGlyZGFfbm90aWZ5X2luaXQobm90aWZ5X3QgKm5vdGlmeSk7CgovKiBMb2NraW5nIHdyYXBwZXIgLSBOb3RlIHRoZSBpbnZlcnRlZCBsb2dpYyBvbiBpcmRhX2xvY2soKS4KICogVGhvc2UgZnVuY3Rpb24gYmFzaWNhbGx5IHJldHVybiBmYWxzZSBpZiB0aGUgbG9jayBpcyBhbHJlYWR5IGluIHRoZQogKiBwb3NpdGlvbiB5b3Ugd2FudCB0byBzZXQgaXQuIC0gSmVhbiBJSSAqLwojZGVmaW5lIGlyZGFfbG9jayhsb2NrKQkJKCEgdGVzdF9hbmRfc2V0X2JpdCgwLCAodm9pZCAqKSAobG9jaykpKQojZGVmaW5lIGlyZGFfdW5sb2NrKGxvY2spCSh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgKHZvaWQgKikgKGxvY2spKSkKCiNlbmRpZiAvKiBJUk1PRF9IICovCgoKCgoKCgoKCg==