LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBCaXNtYXJjaywgTkQuLCBVU0EuCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKICogb2YgdGhlIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCiAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBTaW1wbGUgbWVtb3J5IE1BTmFnZXIgaW50ZXJmYWNlIHRoYXQga2VlcHMgdHJhY2sgb24gYWxsb2NhdGUgcmVnaW9ucyBvbiBhCiAqIHBlciAib3duZXIiIGJhc2lzLiBBbGwgcmVnaW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gIm93bmVyIiBjYW4gYmUgcmVsZWFzZWQKICogd2l0aCBhIHNpbXBsZSBjYWxsLiBUeXBpY2FsbHkgaWYgdGhlICJvd25lciIgZXhpc3RzLiBUaGUgb3duZXIgaXMgYW55CiAqICJ1bnNpZ25lZCBsb25nIiBpZGVudGlmaWVyLiBDYW4gdHlwaWNhbGx5IGJlIGEgcG9pbnRlciB0byBhIGZpbGUgcHJpdmF0ZQogKiBzdHJ1Y3Qgb3IgYSBjb250ZXh0IGlkZW50aWZpZXIuCiAqCiAqIEF1dGhvcnM6CiAqIFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqLwoKI2lmbmRlZiBEUk1fU01BTl9ICiNkZWZpbmUgRFJNX1NNQU5fSAoKI2luY2x1ZGUgImRybVAuaCIKI2luY2x1ZGUgImRybV9oYXNodGFiLmgiCgovKgogKiBBIGNsYXNzIHRoYXQgaXMgYW4gYWJzdHJhdGlvbiBvZiBhIHNpbXBsZSBtZW1vcnkgYWxsb2NhdG9yLgogKiBUaGUgc21hbiBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBhIGRlZmF1bHQgc3VjaCBhbGxvY2F0b3IKICogdXNpbmcgdGhlIGRybV9tbS5jIGltcGxlbWVudGF0aW9uLiBCdXQgdGhlIHVzZXIgY2FuIHJlcGxhY2UgaXQuCiAqIFNlZSB0aGUgU2lTIGltcGxlbWVudGF0aW9uLCB3aGljaCBtYXkgdXNlIHRoZSBTaVMgRkIga2VybmVsIG1vZHVsZQogKiBmb3IgbWVtb3J5IG1hbmFnZW1lbnQuCiAqLwoKdHlwZWRlZiBzdHJ1Y3QgZHJtX3NtYW5fbW0gewoJLyogcHJpdmF0ZSBpbmZvLiBJZiBhbGxvY2F0ZWQsIG5lZWRzIHRvIGJlIGRlc3Ryb3llZCBieSB0aGUgZGVzdHJveQoJICAgZnVuY3Rpb24gKi8KCXZvaWQgKnByaXZhdGU7CgoJLyogQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2sgd2l0aCBnaXZlbiBzaXplIGFuZCBhbGlnbm1lbnQuCgkgICBSZXR1cm4gYW4gb3BhcXVlIHJlZmVyZW5jZSB0byB0aGUgbWVtb3J5IGJsb2NrICovCgoJdm9pZCAqKCphbGxvY2F0ZSkgKHZvaWQgKnByaXZhdGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSwKCQkJICAgdW5zaWduZWQgYWxpZ25tZW50KTsKCgkvKiBGcmVlIGEgbWVtb3J5IGJsb2NrLiAicmVmIiBpcyB0aGUgb3BhcXVlIHJlZmVyZW5jZSB0aGF0IHdlIGdvdCBmcm9tCgkgICB0aGUgImFsbG9jIiBmdW5jdGlvbiAqLwoKCXZvaWQgKCpmcmVlKSAodm9pZCAqcHJpdmF0ZSwgdm9pZCAqcmVmKTsKCgkvKiBGcmVlIGFsbCByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYWxsb2NhdG9yICovCgoJdm9pZCAoKmRlc3Ryb3kpICh2b2lkICpwcml2YXRlKTsKCgkvKiBSZXR1cm4gYSBtZW1vcnkgb2Zmc2V0IGZyb20gdGhlIG9wYXF1ZSByZWZlcmVuY2UgcmV0dXJuZWQgZnJvbSB0aGUKCSAgICJhbGxvYyIgZnVuY3Rpb24gKi8KCgl1bnNpZ25lZCBsb25nICgqb2Zmc2V0KSAodm9pZCAqcHJpdmF0ZSwgdm9pZCAqcmVmKTsKfSBkcm1fc21hbl9tbV90OwoKdHlwZWRlZiBzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0gewoJc3RydWN0IGxpc3RfaGVhZCBvd25lcl9saXN0OwoJZHJtX2hhc2hfaXRlbV90IHVzZXJfaGFzaDsKCXZvaWQgKm1tX2luZm87Cglkcm1fc21hbl9tbV90ICptbTsKCXN0cnVjdCBkcm1fc21hbiAqc21hbjsKfSBkcm1fbWVtYmxvY2tfaXRlbV90OwoKdHlwZWRlZiBzdHJ1Y3QgZHJtX3NtYW4gewoJZHJtX3NtYW5fbW1fdCAqbW07CglpbnQgbnVtX21hbmFnZXJzOwoJZHJtX29wZW5faGFzaF90IG93bmVyX2hhc2hfdGFiOwoJZHJtX29wZW5faGFzaF90IHVzZXJfaGFzaF90YWI7CglzdHJ1Y3QgbGlzdF9oZWFkIG93bmVyX2l0ZW1zOwp9IGRybV9zbWFuX3Q7CgovKgogKiBUYWtlIGRvd24gYSBtZW1vcnkgbWFuYWdlci4gVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgYWZ0ZXIgYQogKiBzdWNjZXNzZnVsIGluaXQgYW5kIGFmdGVyIGEgY2FsbCB0byBkcm1fc21hbl9jbGVhbnVwLgogKi8KCmV4dGVybiB2b2lkIGRybV9zbWFuX3Rha2Vkb3duKGRybV9zbWFuX3QgKiBzbWFuKTsKCi8qCiAqIEFsbG9jYXRlIHN0cnVjdHVyZXMgZm9yIGEgbWFuYWdlci4KICogbnVtX21hbmFnZXJzIGFyZSB0aGUgbnVtYmVyIG9mIG1lbW9yeSBwb29scyB0byBtYW5hZ2UuIChWUkFNLCBBR1AsIC4uLi4pCiAqIHVzZXJfb3JkZXIgaXMgdGhlIGxvZzIgb2YgdGhlIG51bWJlciBvZiBidWNrZXRzIGluIHRoZSB1c2VyIGhhc2ggdGFibGUuCiAqCSAgICBzZXQgdGhpcyB0byBhcHByb3hpbWF0ZWx5IGxvZzIgb2YgdGhlIG1heCBudW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMKICoJICAgIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgZm9yIF9hbGxfIHBvb2xzIHRvZ2V0aGVyLgogKiBvd25lcl9vcmRlciBpcyB0aGUgbG9nMiBvZiB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgaW4gdGhlIG93bmVyIGhhc2ggdGFibGUuCiAqCSAgICBzZXQgdGhpcyB0byBhcHByb3hpbWF0ZWx5IGxvZzIgb2YKICoJICAgIHRoZSBudW1iZXIgb2YgY2xpZW50IGZpbGUgY29ubmVjdGlvbnMgdGhhdCB3aWxsCiAqCSAgICBiZSB1c2luZyB0aGUgbWFuYWdlci4KICoKICovCgpleHRlcm4gaW50IGRybV9zbWFuX2luaXQoZHJtX3NtYW5fdCAqIHNtYW4sIHVuc2lnbmVkIGludCBudW1fbWFuYWdlcnMsCgkJCSB1bnNpZ25lZCBpbnQgdXNlcl9vcmRlciwgdW5zaWduZWQgaW50IG93bmVyX29yZGVyKTsKCi8qCiAqIEluaXRpYWxpemUgYSBkcm1fbW0uYyBhbGxvY2F0b3IuIFNob3VsZCBiZSBjYWxsZWQgb25seSBvbmNlIGZvciBlYWNoCiAqIG1hbmFnZXIgdW5sZXNzIGEgY3VzdG9taXplZCBhbGxvZ2F0b3IgaXMgdXNlZC4KICovCgpleHRlcm4gaW50IGRybV9zbWFuX3NldF9yYW5nZShkcm1fc21hbl90ICogc21hbiwgdW5zaWduZWQgaW50IG1hbmFnZXIsCgkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CgovKgogKiBJbml0aWFsaXplIGEgY3VzdG9taXplZCBhbGxvY2F0b3IgZm9yIG9uZSBvZiB0aGUgbWFuYWdlcnMuCiAqIChTZWUgdGhlIFNpUyBtb2R1bGUpLiBUaGUgb2JqZWN0IHBvaW50ZWQgdG8gYnkgImFsbG9jYXRvciIgaXMgY29waWVkLAogKiBzbyBpdCBjYW4gYmUgZGVzdHJveWVkIGFmdGVyIHRoaXMgY2FsbC4KICovCgpleHRlcm4gaW50IGRybV9zbWFuX3NldF9tYW5hZ2VyKGRybV9zbWFuX3QgKiBzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYW5nZXIsCgkJCQlkcm1fc21hbl9tbV90ICogYWxsb2NhdG9yKTsKCi8qCiAqIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrLiBBbGlnbWVudCBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LgogKi8KCmV4dGVybiBkcm1fbWVtYmxvY2tfaXRlbV90ICpkcm1fc21hbl9hbGxvYyhkcm1fc21hbl90ICogc21hbiwKCQkJCQkgICB1bnNpZ25lZCBpbnQgbWFuYWdlciwKCQkJCQkgICB1bnNpZ25lZCBsb25nIHNpemUsCgkJCQkJICAgdW5zaWduZWQgYWxpZ25tZW50LAoJCQkJCSAgIHVuc2lnbmVkIGxvbmcgb3duZXIpOwovKgogKiBGcmVlIGEgbWVtb3J5IGJsb2NrIGlkZW50aWZpZWQgYnkgaXRzIHVzZXIgaGFzaCBrZXkuCiAqLwoKZXh0ZXJuIGludCBkcm1fc21hbl9mcmVlX2tleShkcm1fc21hbl90ICogc21hbiwgdW5zaWduZWQgaW50IGtleSk7CgovKgogKiByZXR1cm5zIDEgaWZmIHRoZXJlIGFyZSBubyBzdGFsZSBtZW1vcnkgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG93bmVyLgogKiBUeXBpY2FsbHkgY2FsbGVkIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIGlkbGUgdGhlIGhhcmR3YXJlIGFuZCBjYWxsCiAqIGRybV9zbWFuX293bmVyX2NsZWFudXAuIElmIHRoZXJlIGFyZSBubyBzdGFsZSBtZW1vcnkgYmxvY2tzLCBpdCByZW1vdmVzIGFsbAogKiByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIG93bmVyLgogKi8KCmV4dGVybiBpbnQgZHJtX3NtYW5fb3duZXJfY2xlYW4oZHJtX3NtYW5fdCAqIHNtYW4sIHVuc2lnbmVkIGxvbmcgb3duZXIpOwoKLyoKICogRnJlZXMgYWxsIHN0YWxlIG1lbW9yeSBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb3duZXIuIE5vdGUgdGhhdCB0aGlzCiAqIHJlcXVpcmVzIHRoYXQgdGhlIGhhcmR3YXJlIGlzIGZpbmlzaGVkIHdpdGggYWxsIGJsb2Nrcywgc28gdGhlIGdyYXBoaWNzIGVuZ2luZQogKiBzaG91bGQgYmUgaWRsZWQgYmVmb3JlIHRoaXMgY2FsbCBpcyBtYWRlLiBUaGlzIGZ1bmN0aW9uIGFsc28gZnJlZXMKICogYW55IHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggIm93bmVyIiBhbmQgc2hvdWxkIGJlIGNhbGxlZCB3aGVuIG93bmVyCiAqIGlzIG5vdCBnb2luZyB0byBiZSByZWZlcmVuY2VkIGFueW1vcmUuCiAqLwoKZXh0ZXJuIHZvaWQgZHJtX3NtYW5fb3duZXJfY2xlYW51cChkcm1fc21hbl90ICogc21hbiwgdW5zaWduZWQgbG9uZyBvd25lcik7CgovKgogKiBGcmVlcyBhbGwgc3RhbGUgbWVtb3J5IGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1lbW9yeSBtYW5hZ2VyLgogKiBTZWUgaWRsaW5nIGFib3ZlLgogKi8KCmV4dGVybiB2b2lkIGRybV9zbWFuX2NsZWFudXAoZHJtX3NtYW5fdCAqIHNtYW4pOwoKI2VuZGlmCg==