LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBCaXNtYXJjaywgTkQuLCBVU0EuCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKICogb2YgdGhlIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCiAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKgogKiBTaW1wbGUgbWVtb3J5IE1BTmFnZXIgaW50ZXJmYWNlIHRoYXQga2VlcHMgdHJhY2sgb24gYWxsb2NhdGUgcmVnaW9ucyBvbiBhCiAqIHBlciAib3duZXIiIGJhc2lzLiBBbGwgcmVnaW9ucyBhc3NvY2lhdGVkIHdpdGggYW4gIm93bmVyIiBjYW4gYmUgcmVsZWFzZWQKICogd2l0aCBhIHNpbXBsZSBjYWxsLiBUeXBpY2FsbHkgaWYgdGhlICJvd25lciIgZXhpc3RzLiBUaGUgb3duZXIgaXMgYW55CiAqICJ1bnNpZ25lZCBsb25nIiBpZGVudGlmaWVyLiBDYW4gdHlwaWNhbGx5IGJlIGEgcG9pbnRlciB0byBhIGZpbGUgcHJpdmF0ZQogKiBzdHJ1Y3Qgb3IgYSBjb250ZXh0IGlkZW50aWZpZXIuCiAqCiAqIEF1dGhvcnM6CiAqIFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqLwoKI2lmbmRlZiBEUk1fU01BTl9ICiNkZWZpbmUgRFJNX1NNQU5fSAoKI2luY2x1ZGUgImRybVAuaCIKI2luY2x1ZGUgImRybV9oYXNodGFiLmgiCgovKgogKiBBIGNsYXNzIHRoYXQgaXMgYW4gYWJzdHJhdGlvbiBvZiBhIHNpbXBsZSBtZW1vcnkgYWxsb2NhdG9yLgogKiBUaGUgc21hbiBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBhIGRlZmF1bHQgc3VjaCBhbGxvY2F0b3IKICogdXNpbmcgdGhlIGRybV9tbS5jIGltcGxlbWVudGF0aW9uLiBCdXQgdGhlIHVzZXIgY2FuIHJlcGxhY2UgaXQuCiAqIFNlZSB0aGUgU2lTIGltcGxlbWVudGF0aW9uLCB3aGljaCBtYXkgdXNlIHRoZSBTaVMgRkIga2VybmVsIG1vZHVsZQogKiBmb3IgbWVtb3J5IG1hbmFnZW1lbnQuCiAqLwoKc3RydWN0IGRybV9zbWFuX21tIHsKCS8qIHByaXZhdGUgaW5mby4gSWYgYWxsb2NhdGVkLCBuZWVkcyB0byBiZSBkZXN0cm95ZWQgYnkgdGhlIGRlc3Ryb3kKCSAgIGZ1bmN0aW9uICovCgl2b2lkICpwcml2YXRlOwoKCS8qIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIHdpdGggZ2l2ZW4gc2l6ZSBhbmQgYWxpZ25tZW50LgoJICAgUmV0dXJuIGFuIG9wYXF1ZSByZWZlcmVuY2UgdG8gdGhlIG1lbW9yeSBibG9jayAqLwoKCXZvaWQgKigqYWxsb2NhdGUpICh2b2lkICpwcml2YXRlLCB1bnNpZ25lZCBsb25nIHNpemUsCgkJCSAgIHVuc2lnbmVkIGFsaWdubWVudCk7CgoJLyogRnJlZSBhIG1lbW9yeSBibG9jay4gInJlZiIgaXMgdGhlIG9wYXF1ZSByZWZlcmVuY2UgdGhhdCB3ZSBnb3QgZnJvbQoJICAgdGhlICJhbGxvYyIgZnVuY3Rpb24gKi8KCgl2b2lkICgqZnJlZSkgKHZvaWQgKnByaXZhdGUsIHZvaWQgKnJlZik7CgoJLyogRnJlZSBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGFsbG9jYXRvciAqLwoKCXZvaWQgKCpkZXN0cm95KSAodm9pZCAqcHJpdmF0ZSk7CgoJLyogUmV0dXJuIGEgbWVtb3J5IG9mZnNldCBmcm9tIHRoZSBvcGFxdWUgcmVmZXJlbmNlIHJldHVybmVkIGZyb20gdGhlCgkgICAiYWxsb2MiIGZ1bmN0aW9uICovCgoJdW5zaWduZWQgbG9uZyAoKm9mZnNldCkgKHZvaWQgKnByaXZhdGUsIHZvaWQgKnJlZik7Cn07CgpzdHJ1Y3QgZHJtX21lbWJsb2NrX2l0ZW0gewoJc3RydWN0IGxpc3RfaGVhZCBvd25lcl9saXN0OwoJc3RydWN0IGRybV9oYXNoX2l0ZW0gdXNlcl9oYXNoOwoJdm9pZCAqbW1faW5mbzsKCXN0cnVjdCBkcm1fc21hbl9tbSAqbW07CglzdHJ1Y3QgZHJtX3NtYW4gKnNtYW47Cn07CgpzdHJ1Y3QgZHJtX3NtYW4gewoJc3RydWN0IGRybV9zbWFuX21tICptbTsKCWludCBudW1fbWFuYWdlcnM7CglzdHJ1Y3QgZHJtX29wZW5faGFzaCBvd25lcl9oYXNoX3RhYjsKCXN0cnVjdCBkcm1fb3Blbl9oYXNoIHVzZXJfaGFzaF90YWI7CglzdHJ1Y3QgbGlzdF9oZWFkIG93bmVyX2l0ZW1zOwp9OwoKLyoKICogVGFrZSBkb3duIGEgbWVtb3J5IG1hbmFnZXIuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGFmdGVyIGEKICogc3VjY2Vzc2Z1bCBpbml0IGFuZCBhZnRlciBhIGNhbGwgdG8gZHJtX3NtYW5fY2xlYW51cC4KICovCgpleHRlcm4gdm9pZCBkcm1fc21hbl90YWtlZG93bihzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuKTsKCi8qCiAqIEFsbG9jYXRlIHN0cnVjdHVyZXMgZm9yIGEgbWFuYWdlci4KICogbnVtX21hbmFnZXJzIGFyZSB0aGUgbnVtYmVyIG9mIG1lbW9yeSBwb29scyB0byBtYW5hZ2UuIChWUkFNLCBBR1AsIC4uLi4pCiAqIHVzZXJfb3JkZXIgaXMgdGhlIGxvZzIgb2YgdGhlIG51bWJlciBvZiBidWNrZXRzIGluIHRoZSB1c2VyIGhhc2ggdGFibGUuCiAqCSAgICBzZXQgdGhpcyB0byBhcHByb3hpbWF0ZWx5IGxvZzIgb2YgdGhlIG1heCBudW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMKICoJICAgIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgZm9yIF9hbGxfIHBvb2xzIHRvZ2V0aGVyLgogKiBvd25lcl9vcmRlciBpcyB0aGUgbG9nMiBvZiB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgaW4gdGhlIG93bmVyIGhhc2ggdGFibGUuCiAqCSAgICBzZXQgdGhpcyB0byBhcHByb3hpbWF0ZWx5IGxvZzIgb2YKICoJICAgIHRoZSBudW1iZXIgb2YgY2xpZW50IGZpbGUgY29ubmVjdGlvbnMgdGhhdCB3aWxsCiAqCSAgICBiZSB1c2luZyB0aGUgbWFuYWdlci4KICoKICovCgpleHRlcm4gaW50IGRybV9zbWFuX2luaXQoc3RydWN0IGRybV9zbWFuICogc21hbiwgdW5zaWduZWQgaW50IG51bV9tYW5hZ2VycywKCQkJIHVuc2lnbmVkIGludCB1c2VyX29yZGVyLCB1bnNpZ25lZCBpbnQgb3duZXJfb3JkZXIpOwoKLyoKICogSW5pdGlhbGl6ZSBhIGRybV9tbS5jIGFsbG9jYXRvci4gU2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UgZm9yIGVhY2gKICogbWFuYWdlciB1bmxlc3MgYSBjdXN0b21pemVkIGFsbG9nYXRvciBpcyB1c2VkLgogKi8KCmV4dGVybiBpbnQgZHJtX3NtYW5fc2V0X3JhbmdlKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sIHVuc2lnbmVkIGludCBtYW5hZ2VyLAoJCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIHNpemUpOwoKLyoKICogSW5pdGlhbGl6ZSBhIGN1c3RvbWl6ZWQgYWxsb2NhdG9yIGZvciBvbmUgb2YgdGhlIG1hbmFnZXJzLgogKiAoU2VlIHRoZSBTaVMgbW9kdWxlKS4gVGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5ICJhbGxvY2F0b3IiIGlzIGNvcGllZCwKICogc28gaXQgY2FuIGJlIGRlc3Ryb3llZCBhZnRlciB0aGlzIGNhbGwuCiAqLwoKZXh0ZXJuIGludCBkcm1fc21hbl9zZXRfbWFuYWdlcihzdHJ1Y3QgZHJtX3NtYW4gKiBzbWFuLCB1bnNpZ25lZCBpbnQgbWFuYW5nZXIsCgkJCQlzdHJ1Y3QgZHJtX3NtYW5fbW0gKiBhbGxvY2F0b3IpOwoKLyoKICogQWxsb2NhdGUgYSBtZW1vcnkgYmxvY2suIEFsaWdtZW50IGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuCiAqLwoKZXh0ZXJuIHN0cnVjdCBkcm1fbWVtYmxvY2tfaXRlbSAqZHJtX3NtYW5fYWxsb2Moc3RydWN0IGRybV9zbWFuICogc21hbiwKCQkJCQkJdW5zaWduZWQgaW50IG1hbmFnZXIsCgkJCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwKCQkJCQkJdW5zaWduZWQgYWxpZ25tZW50LAoJCQkJCQl1bnNpZ25lZCBsb25nIG93bmVyKTsKLyoKICogRnJlZSBhIG1lbW9yeSBibG9jayBpZGVudGlmaWVkIGJ5IGl0cyB1c2VyIGhhc2gga2V5LgogKi8KCmV4dGVybiBpbnQgZHJtX3NtYW5fZnJlZV9rZXkoc3RydWN0IGRybV9zbWFuICogc21hbiwgdW5zaWduZWQgaW50IGtleSk7CgovKgogKiByZXR1cm5zIDEgaWZmIHRoZXJlIGFyZSBubyBzdGFsZSBtZW1vcnkgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG93bmVyLgogKiBUeXBpY2FsbHkgY2FsbGVkIHRvIGRldGVybWluZSBpZiB3ZSBuZWVkIHRvIGlkbGUgdGhlIGhhcmR3YXJlIGFuZCBjYWxsCiAqIGRybV9zbWFuX293bmVyX2NsZWFudXAuIElmIHRoZXJlIGFyZSBubyBzdGFsZSBtZW1vcnkgYmxvY2tzLCBpdCByZW1vdmVzIGFsbAogKiByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIG93bmVyLgogKi8KCmV4dGVybiBpbnQgZHJtX3NtYW5fb3duZXJfY2xlYW4oc3RydWN0IGRybV9zbWFuICogc21hbiwgdW5zaWduZWQgbG9uZyBvd25lcik7CgovKgogKiBGcmVlcyBhbGwgc3RhbGUgbWVtb3J5IGJsb2NrcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBvd25lci4gTm90ZSB0aGF0IHRoaXMKICogcmVxdWlyZXMgdGhhdCB0aGUgaGFyZHdhcmUgaXMgZmluaXNoZWQgd2l0aCBhbGwgYmxvY2tzLCBzbyB0aGUgZ3JhcGhpY3MgZW5naW5lCiAqIHNob3VsZCBiZSBpZGxlZCBiZWZvcmUgdGhpcyBjYWxsIGlzIG1hZGUuIFRoaXMgZnVuY3Rpb24gYWxzbyBmcmVlcwogKiBhbnkgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCAib3duZXIiIGFuZCBzaG91bGQgYmUgY2FsbGVkIHdoZW4gb3duZXIKICogaXMgbm90IGdvaW5nIHRvIGJlIHJlZmVyZW5jZWQgYW55bW9yZS4KICovCgpleHRlcm4gdm9pZCBkcm1fc21hbl9vd25lcl9jbGVhbnVwKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4sIHVuc2lnbmVkIGxvbmcgb3duZXIpOwoKLyoKICogRnJlZXMgYWxsIHN0YWxlIG1lbW9yeSBibG9ja3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZW1vcnkgbWFuYWdlci4KICogU2VlIGlkbGluZyBhYm92ZS4KICovCgpleHRlcm4gdm9pZCBkcm1fc21hbl9jbGVhbnVwKHN0cnVjdCBkcm1fc21hbiAqIHNtYW4pOwoKI2VuZGlmCg==