LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogJElkJAkJbHBjMTh4eF9kYWMuaAkJCTIwMTEtMDYtMDINCiovLyoqDQoqIEBmaWxlCQlscGMxOHh4X2RhYy5oDQoqIEBicmllZglDb250YWlucyBhbGwgbWFjcm8gZGVmaW5pdGlvbnMgYW5kIGZ1bmN0aW9uIHByb3RvdHlwZXMNCiogCQkJc3VwcG9ydCBmb3IgREFDIGZpcm13YXJlIGxpYnJhcnkgb24gTFBDMTh4eA0KKiBAdmVyc2lvbgkxLjANCiogQGRhdGUJCTAyLiBKdW5lLiAyMDExDQoqIEBhdXRob3IJTlhQIE1DVSBTVyBBcHBsaWNhdGlvbiBUZWFtDQoqDQoqIENvcHlyaWdodChDKSAyMDExLCBOWFAgU2VtaWNvbmR1Y3Rvcg0KKiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogU29mdHdhcmUgdGhhdCBpcyBkZXNjcmliZWQgaGVyZWluIGlzIGZvciBpbGx1c3RyYXRpdmUgcHVycG9zZXMgb25seQ0KKiB3aGljaCBwcm92aWRlcyBjdXN0b21lcnMgd2l0aCBwcm9ncmFtbWluZyBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlDQoqIHByb2R1Y3RzLiBUaGlzIHNvZnR3YXJlIGlzIHN1cHBsaWVkICJBUyBJUyIgd2l0aG91dCBhbnkgd2FycmFudGllcy4NCiogTlhQIFNlbWljb25kdWN0b3JzIGFzc3VtZXMgbm8gcmVzcG9uc2liaWxpdHkgb3IgbGlhYmlsaXR5IGZvciB0aGUNCiogdXNlIG9mIHRoZSBzb2Z0d2FyZSwgY29udmV5cyBubyBsaWNlbnNlIG9yIHRpdGxlIHVuZGVyIGFueSBwYXRlbnQsDQoqIGNvcHlyaWdodCwgb3IgbWFzayB3b3JrIHJpZ2h0IHRvIHRoZSBwcm9kdWN0LiBOWFAgU2VtaWNvbmR1Y3RvcnMNCiogcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIG1ha2UgY2hhbmdlcyBpbiB0aGUgc29mdHdhcmUgd2l0aG91dA0KKiBub3RpZmljYXRpb24uIE5YUCBTZW1pY29uZHVjdG9ycyBhbHNvIG1ha2Ugbm8gcmVwcmVzZW50YXRpb24gb3INCiogd2FycmFudHkgdGhhdCBzdWNoIGFwcGxpY2F0aW9uIHdpbGwgYmUgc3VpdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQNCiogdXNlIHdpdGhvdXQgZnVydGhlciB0ZXN0aW5nIG9yIG1vZGlmaWNhdGlvbi4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qIFBlcmlwaGVyYWwgZ3JvdXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBAZGVmZ3JvdXAgREFDIERBQyAoRGlnaXRhbCB0byBBbmFsb2cgQ29udmVydGVyKQ0KICogQGluZ3JvdXAgTFBDMTgwMENNU0lTX0Z3TGliX0RyaXZlcnMNCiAqIEB7DQogKi8NCg0KI2lmbmRlZiBMUEMxOFhYX0RBQ19IXw0KI2RlZmluZSBMUEMxOFhYX0RBQ19IXw0KDQovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQojaW5jbHVkZSAiTFBDMTh4eC5oIg0KI2luY2x1ZGUgImxwY190eXBlcy5oIg0KDQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KZXh0ZXJuICJDIg0Kew0KI2VuZGlmDQoNCi8qIFB1YmxpYyBNYWNyb3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBAZGVmZ3JvdXAgREFDX1ByaXZhdGVfTWFjcm9zIERBQyBQcml2YXRlIE1hY3Jvcw0KICogQHsNCiAqLw0KDQovKiogQWZ0ZXIgdGhlIHNlbGVjdGVkIHNldHRsaW5nIHRpbWUgYWZ0ZXIgdGhpcyBmaWVsZCBpcyB3cml0dGVuIHdpdGggYQ0KbmV3IFZBTFVFLCB0aGUgdm9sdGFnZSBvbiB0aGUgQU9VVCBwaW4gKHdpdGggcmVzcGVjdCB0byBWU1NBKQ0KaXMgVkFMVUUvMTAyNCDXIFZSRUYgKi8NCiNkZWZpbmUgREFDX1ZBTFVFKG4pIAkJKCh1aW50MzJfdCkoKG4mMHgzRkYpPDw2KSkNCi8qKiBJZiB0aGlzIGJpdCA9IDA6IFRoZSBzZXR0bGluZyB0aW1lIG9mIHRoZSBEQUMgaXMgMSBtaWNyb3NlY29uZCBtYXgsDQogKiBhbmQgdGhlIG1heGltdW0gY3VycmVudCBpcyA3MDAgbWljcm9BbXBlcmUNCiAqIElmIHRoaXMgYml0ID0gMTogVGhlIHNldHRsaW5nIHRpbWUgb2YgdGhlIERBQyBpcyAyLjUgbWljcm9zZWNvbmQNCiAqIGFuZCB0aGUgbWF4aW11bSBjdXJyZW50IGlzIDM1MCBtaWNyb0FtcGVyZSAqLw0KI2RlZmluZSBEQUNfQklBU19FTgkJCSgodWludDMyX3QpKDE8PDE2KSkNCi8qKiBWYWx1ZSB0byByZWxvYWQgaW50ZXJydXB0IERNQSBjb3VudGVyICovDQojZGVmaW5lIERBQ19DQ05UX1ZBTFVFKG4pICAoKHVpbnQzMl90KShuJjB4ZmZmZikpDQoNCi8qKiBEQ0FSIGRvdWJsZSBidWZmZXJpbmcgKi8NCiNkZWZpbmUgREFDX0RCTEJVRl9FTkEJCSgodWludDMyX3QpKDE8PDEpKQ0KLyoqIERDQVIgVGltZSBvdXQgY291bnQgZW5hYmxlICovDQojZGVmaW5lIERBQ19DTlRfRU5BCQkJKCh1aW50MzJfdCkoMTw8MikpDQovKiogRENBUiBETUEgYWNjZXNzICovDQojZGVmaW5lIERBQ19ETUFfRU5BCQkJKCh1aW50MzJfdCkoMTw8MykpDQovKiogRENBUiBEQUNDVFJMIG1hc2sgYml0ICovDQojZGVmaW5lIERBQ19EQUNDVFJMX01BU0sJKCh1aW50MzJfdCkoMHgwRikpDQoNCi8qKiBNYWNybyB0byBkZXRlcm1pbmUgaWYgaXQgaXMgdmFsaWQgREFDIHBlcmlwaGVyYWwgKi8NCiNkZWZpbmUgUEFSQU1fREFDeChuKQkoKCh1aW50MzJfdCAqKW4pPT0oKHVpbnQzMl90ICopTFBDX0RBQykpDQoNCi8qKiBNYWNybyB0byBjaGVjayBEQUMgY3VycmVudCBvcHRpb25hbCBwYXJhbWV0ZXIgKi8NCiNkZWZpbmUJUEFSQU1fREFDX0NVUlJFTlRfT1BUKE9QVElPTikgKChPUFRJT04gPT0gREFDX01BWF9DVVJSRU5UXzcwMHVBKVwNCnx8KE9QVElPTiA9PSBEQUNfTUFYX0NVUlJFTlRfMzUwdUEpKQ0KDQovKioNCiAqIEB9DQogKi8NCi8qIFB1YmxpYyBUeXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBAZGVmZ3JvdXAgREFDX1B1YmxpY19UeXBlcyBEQUMgUHVibGljIFR5cGVzDQogKiBAew0KICovDQoNCi8qKg0KICogQGJyaWVmIEN1cnJlbnQgb3B0aW9uIGluIERBQyBjb25maWd1cmF0aW9uIG9wdGlvbiAqLw0KdHlwZWRlZiBlbnVtDQp7DQoJREFDX01BWF9DVVJSRU5UXzcwMHVBID0gMCwgCS8qITwgVGhlIHNldHRsaW5nIHRpbWUgb2YgdGhlIERBQyBpcyAxIHVzIG1heCwNCgkJCQkJCQkJYW5kIHRoZSBtYXhpbXVtCWN1cnJlbnQgaXMgNzAwIHVBICovDQoJREFDX01BWF9DVVJSRU5UXzM1MHVBCQkvKiE8IFRoZSBzZXR0bGluZyB0aW1lIG9mIHRoZSBEQUMgaXMgMi41IHVzDQoJCQkJCQkJCWFuZCB0aGUgbWF4aW11bSBjdXJyZW50IGlzIDM1MCB1QSAqLw0KfSBEQUNfQ1VSUkVOVF9PUFQ7DQoNCi8qKg0KICogQGJyaWVmIENvbmZpZ3VyYXRpb24gZm9yIERBQyBjb252ZXJ0ZXIgY29udHJvbCByZWdpc3RlciAqLw0KdHlwZWRlZiBzdHJ1Y3QNCnsNCg0KCXVpbnQ4X3QgIERCTEJVRl9FTkE7IAkJLyoqPA0KCSAgICAgICAgICAgICAgICAgICAgICAgICAJCS0wOiBEaXNhYmxlIERBQ1IgZG91YmxlIGJ1ZmZlcmluZw0KCSAgICAgICAgICAgICAgICAgICAgICAgICAJCS0xOiB3aGVuIGJpdCBDTlRfRU5BLCBlbmFibGUgREFDUiBkb3VibGUgYnVmZmVyaW5nIGZlYXR1cmUNCgkJCQkJCQkgCSovDQoJdWludDhfdCAgQ05UX0VOQTsJCQkvKiE8DQoJICAgICAgICAgICAgICAgICAgICAgICAgIAkJLTA6IFRpbWUgb3V0IGNvdW50ZXIgaXMgZGlzYWJsZQ0KCSAgICAgICAgICAgICAgICAgICAgICAgICAJCS0xOiBUaW1lIG91dCBjb250ZXIgaXMgZW5hYmxlDQoJCQkJCQkJIAkqLw0KCXVpbnQ4X3QgIERNQV9FTkE7CQkJLyohPA0KCQkgICAgICAgICAgICAgICAgICAgICAgICAgCS0wOiBETUEgYWNjZXNzIGlzIGRpc2FibGUNCgkJICAgICAgICAgICAgICAgICAgICAgICAgIAktMTogRE1BIGJ1cnN0IHJlcXVlc3QNCgkJCQkJCQkJKi8NCgl1aW50OF90IFJFU0VSVkVEOw0KDQp9IERBQ19DT05WRVJURVJfQ0ZHX1R5cGU7DQoNCi8qKg0KICogQH0NCiAqLw0KDQovKiBQdWJsaWMgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogQGRlZmdyb3VwIERBQ19QdWJsaWNfRnVuY3Rpb25zIERBQyBQdWJsaWMgRnVuY3Rpb25zDQogKiBAew0KICovDQoNCnZvaWQgCURBQ19Jbml0KExQQ19EQUNfVHlwZSAqREFDeCk7DQp2b2lkICAgIERBQ19VcGRhdGVWYWx1ZSAoTFBDX0RBQ19UeXBlICpEQUN4LCB1aW50MzJfdCBkYWNfdmFsdWUpOw0Kdm9pZCAgICBEQUNfU2V0QmlhcyAoTFBDX0RBQ19UeXBlICpEQUN4LHVpbnQzMl90IGJpYXMpOw0Kdm9pZCAgICBEQUNfQ29uZmlnREFDb252ZXJ0ZXJDb250cm9sIChMUENfREFDX1R5cGUgKkRBQ3gsREFDX0NPTlZFUlRFUl9DRkdfVHlwZSAqREFDX0NvbnZlcnRlckNvbmZpZ1N0cnVjdCk7DQp2b2lkIAlEQUNfU2V0RE1BVGltZU91dChMUENfREFDX1R5cGUgKkRBQ3gsdWludDMyX3QgdGltZV9vdXQpOw0KDQovKioNCiAqIEB9DQogKi8NCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQp9DQojZW5kaWYNCg0KDQojZW5kaWYgLyogTFBDMThYWF9EQUNfSF8gKi8NCg0KLyoqDQogKiBAfQ0KICovDQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBFbmQgT2YgRmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0K