LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIFRyYWNlIFJlY29yZGVyIExpYnJhcnkgZm9yIFRyYWNlYWx5emVyIHYzLjAuMg0KICogUGVyY2VwaW8gQUIsIHd3dy5wZXJjZXBpby5jb20NCiAqDQogKiB0cmNIYXJkd2FyZVBvcnQuaA0KICoNCiAqIFRoZSBoYXJkd2FyZSBhYnN0cmFjdGlvbiBsYXllciBmb3IgdGhlIHRyYWNlIHJlY29yZGVyIGxpYnJhcnkuDQogKg0KICogVGVybXMgb2YgVXNlDQogKiBUaGlzIHNvZnR3YXJlICh0aGUgIlRyYWNlYWx5emVyIFJlY29yZGVyIExpYnJhcnkiKSBpcyB0aGUgaW50ZWxsZWN0dWFsDQogKiBwcm9wZXJ0eSBvZiBQZXJjZXBpbyBBQiBhbmQgbWF5IG5vdCBiZSBzb2xkIG9yIGluIG90aGVyIHdheXMgY29tbWVyY2lhbGx5DQogKiByZWRpc3RyaWJ1dGVkIHdpdGhvdXQgZXhwbGljaXQgd3JpdHRlbiBwZXJtaXNzaW9uIGJ5IFBlcmNlcGlvIEFCLg0KICoNCiAqIFNlcGFyYXRlIGNvbmRpdGlvbnMgYXBwbGllcyBmb3IgdGhlIFNFR0dFUiBicmFuZGVkIHNvdXJjZSBjb2RlIGluY2x1ZGVkLg0KICoNCiAqIFRoZSByZWNvcmRlciBsaWJyYXJ5IGlzIGZyZWUgZm9yIHVzZSB0b2dldGhlciB3aXRoIFBlcmNlcGlvIHByb2R1Y3RzLg0KICogWW91IG1heSBkaXN0cmlidXRlIHRoZSByZWNvcmRlciBsaWJyYXJ5IGluIGl0cyBvcmlnaW5hbCBmb3JtLCBidXQgcHVibGljDQogKiBkaXN0cmlidXRpb24gb2YgbW9kaWZpZWQgdmVyc2lvbnMgcmVxdWlyZSBhcHByb3ZhbCBieSBQZXJjZXBpbyBBQi4NCiAqDQogKiBEaXNjbGFpbWVyDQogKiBUaGUgdHJhY2UgdG9vbCBhbmQgcmVjb3JkZXIgbGlicmFyeSBpcyBiZWluZyBkZWxpdmVyZWQgdG8geW91IEFTIElTIGFuZA0KICogUGVyY2VwaW8gQUIgbWFrZXMgbm8gd2FycmFudHkgYXMgdG8gaXRzIHVzZSBvciBwZXJmb3JtYW5jZS4gUGVyY2VwaW8gQUIgZG9lcw0KICogbm90IGFuZCBjYW5ub3Qgd2FycmFudCB0aGUgcGVyZm9ybWFuY2Ugb3IgcmVzdWx0cyB5b3UgbWF5IG9idGFpbiBieSB1c2luZyB0aGUNCiAqIHNvZnR3YXJlIG9yIGRvY3VtZW50YXRpb24uIFBlcmNlcGlvIEFCIG1ha2Ugbm8gd2FycmFudGllcywgZXhwcmVzcyBvcg0KICogaW1wbGllZCwgYXMgdG8gbm9uaW5mcmluZ2VtZW50IG9mIHRoaXJkIHBhcnR5IHJpZ2h0cywgbWVyY2hhbnRhYmlsaXR5LCBvcg0KICogZml0bmVzcyBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gSW4gbm8gZXZlbnQgd2lsbCBQZXJjZXBpbyBBQiwgaXRzDQogKiB0ZWNobm9sb2d5IHBhcnRuZXJzLCBvciBkaXN0cmlidXRvcnMgYmUgbGlhYmxlIHRvIHlvdSBmb3IgYW55IGNvbnNlcXVlbnRpYWwsDQogKiBpbmNpZGVudGFsIG9yIHNwZWNpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBsb3N0IHByb2ZpdHMgb3IgbG9zdCBzYXZpbmdzLA0KICogZXZlbiBpZiBhIHJlcHJlc2VudGF0aXZlIG9mIFBlcmNlcGlvIEFCIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5DQogKiBvZiBzdWNoIGRhbWFnZXMsIG9yIGZvciBhbnkgY2xhaW0gYnkgYW55IHRoaXJkIHBhcnR5LiBTb21lIGp1cmlzZGljdGlvbnMgZG8NCiAqIG5vdCBhbGxvdyB0aGUgZXhjbHVzaW9uIG9yIGxpbWl0YXRpb24gb2YgaW5jaWRlbnRhbCwgY29uc2VxdWVudGlhbCBvciBzcGVjaWFsDQogKiBkYW1hZ2VzLCBvciB0aGUgZXhjbHVzaW9uIG9mIGltcGxpZWQgd2FycmFudGllcyBvciBsaW1pdGF0aW9ucyBvbiBob3cgbG9uZyBhbg0KICogaW1wbGllZCB3YXJyYW50eSBtYXkgbGFzdCwgc28gdGhlIGFib3ZlIGxpbWl0YXRpb25zIG1heSBub3QgYXBwbHkgdG8geW91Lg0KICoNCiAqIFRhYnMgYXJlIHVzZWQgZm9yIGluZGVudCBpbiB0aGlzIGZpbGUgKDEgdGFiID0gNCBzcGFjZXMpDQogKg0KICogQ29weXJpZ2h0IFBlcmNlcGlvIEFCLCAyMDE1Lg0KICogd3d3LnBlcmNlcGlvLmNvbQ0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KI2lmbmRlZiBUUkNfSEFSRFdBUkVfUE9SVF9IDQojZGVmaW5lIFRSQ19IQVJEV0FSRV9QT1JUX0gNCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQpleHRlcm4gk0OUIHsNCiNlbmRpZg0KDQojaW5jbHVkZSA8c3RkaW50Lmg+DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIEhhcmR3YXJlIHBvcnRzDQogKiBUbyBnZXQgYWNjdXJhdGUgdGltZXN0YW1waW5nLCBhIGhhcmR3YXJlIHRpbWVyIGlzIG5lY2Vzc2FyeS4gQmVsb3cgYXJlIHRoZQ0KICogYXZhaWxhYmxlIHBvcnRzLiBTb21lIG9mIHRoZXNlIGFyZSAidW5vZmZpY2lhbCIsIG1lYW5pbmcgdGhhdA0KICogdGhleSBoYXZlIG5vdCB5ZXQgYmVlbiB2ZXJpZmllZCBieSBQZXJjZXBpbyBidXQgaGF2ZSBiZWVuIGNvbnRyaWJ1dGVkIGJ5DQogKiBleHRlcm5hbCBkZXZlbG9wZXJzLiBUaGV5IHNob3VsZCB3b3JrLCBvdGhlcndpc2UgbGV0IHVzIGtub3cgYnkgZW1haWxpbmcNCiAqIHN1cHBvcnRAcGVyY2VwaW8uY29tLiBTb21lIHdvcmsgb24gYW55IE9TIHBsYXRmb3JtLCB3aGlsZSBvdGhlciBhcmUgc3BlY2lmaWMNCiAqIHRvIGEgY2VydGFpbiBvcGVyYXRpbmcgc3lzdGVtLg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQoNCi8qKioqKiogUG9ydCBOYW1lICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqIENvZGUgKi8NCiNkZWZpbmUgVFJDX1BPUlRfQVBQTElDQVRJT05fREVGSU5FRAkJCS0xDQojZGVmaW5lIFRSQ19QT1JUX05PVF9TRVQJCQkJCQkwDQojZGVmaW5lIFRSQ19QT1JUX0FSTV9Db3J0ZXhfTQkJCQkJMQ0KI2RlZmluZSBUUkNfUE9SVF9BUk1fQ09SVEVYX0E5CQkJCQkyDQojZGVmaW5lIFRSQ19QT1JUX1JlbmVzYXNfUlg2MDAJCQkJCTMNCiNkZWZpbmUgVFJDX1BPUlRfVEVYQVNfSU5TVFJVTUVOVFNfVE1TNTcwX1JNNDgJNA0KI2RlZmluZSBUUkNfUE9SVF9NSUNST0NISVBfUElDMzJfTVhfTVoJCQk1DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKg0KICogSFdUQyBNYWNyb3MgLSBIYXJkd2FyZSBUaW1lci9Db3VudGVyIElzb2xhdGlvbiBMYXllcg0KICoNCiAqIFRoZXNlIHR3byBIV1RDIG1hY3JvcyBwcm92aWRlcyBhIGhhcmR3YXJlIGlzb2xhdGlvbiBsYXllciByZXByZXNlbnRpbmcgYQ0KICogZ2VuZXJpYyBoYXJkd2FyZSB0aW1lci9jb3VudGVyIHVzZWQgZm9yIHRoZSB0aW1lc3RhbXBpbmcuDQogKg0KICogSFdUQ19DT1VOVDogVGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvdW50ZXIuIFRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgcmVzZXQNCiAqIGEgZWFjaCB0aWNrIGludGVycnVwdC4gVGh1cywgd2hlbiB0aGUgdGljayBoYW5kbGVyIHN0YXJ0cywgdGhlIGNvdW50ZXIgaGFzDQogKiBhbHJlYWR5IHdyYXBwZWQuDQogKg0KICogSFdUQ19UWVBFOiBEZWZpbmVzIHRoZSB0eXBlIG9mIHRpbWVyL2NvdW50ZXIgdXNlZCBmb3IgSFdUQ19DT1VOVDoNCiAqDQogKiAtIEZSRUVfUlVOTklOR18zMkJJVF9JTkNSOg0KICogICBGcmVlLXJ1bm5pbmcgMzItYml0IHRpbWVyLCBjb3VudGluZyB1cHdhcmRzIGZyb20gMCAtID4gMHhGRkZGRkZGRg0KICoNCiAqIC0gRlJFRV9SVU5OSU5HXzMyQklUX0RFQ1INCiAqICAgRnJlZS1ydW5uaW5nIDMyLWJpdCBjb3VudGVyLCBjb3VudGluZyBkb3dud2FyZHMgZnJvbSAweEZGRkZGRkZGIC0+IDANCiAqDQogKiAtIE9TX1RJTUVSX0lOQ1INCiAqCSBJbnRlcnJ1cHQgdGltZXIsIGNvdW50cyB1cHdhcmRzIGZyb20gMCB1bnRpbCBIV1RDX1BFUklPRC0xDQogKg0KICogLSBPU19USU1FUl9ERUNSDQogKiAgIEludGVycnVwdCB0aW1lciwgY291bnRzIGRvd253YXJkcyBmcm9tIEhXVENfUEVSSU9ELTEgdW50aWwgMA0KICoNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKg0KICogSVJRX1BSSU9SSVRZX09SREVSDQogKg0KICogTWFjcm8gd2hpY2ggc2hvdWxkIGJlIGRlZmluZWQgYXMgYW4gaW50ZWdlciBvZiAwIG9yIDEuDQogKg0KICogSXQgaXMgb25seSB1c2VkIG9ubHkgdG8gc29ydCBhbmQgY29sb3JpemUgdGhlIGludGVycnVwdHMgaW4gcHJpb3JpdHkgb3JkZXIsDQogKiBpbiBjYXNlIHlvdSByZWNvcmQgaW50ZXJydXB0cyB1c2luZyB0aGUgdlRyYWNlU3RvcmVJU1JCZWdpbiBhbmQNCiAqIHZUcmFjZVN0b3JlSVNSRW5kIHJvdXRpbmVzLiAxIGluZGljYXRlcyBoaWdoZXIgdmFsdWUgaXMgbW9yZSBpbXBvcnRhbnQuDQogKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KI2RlZmluZSBUUkNfRlJFRV9SVU5OSU5HXzMyQklUX0lOQ1IgMQ0KI2RlZmluZSBUUkNfRlJFRV9SVU5OSU5HXzMyQklUX0RFQ1IgMg0KI2RlZmluZSBUUkNfT1NfVElNRVJfSU5DUiAzDQojZGVmaW5lIFRSQ19PU19USU1FUl9ERUNSIDQNCg0KI2lmIChUUkNfUkVDT1JERVJfSEFSRFdBUkVfUE9SVCA9PSBUUkNfUE9SVF9BUk1fQ29ydGV4X00pDQoNCgkjZGVmaW5lIEhXVENfVFlQRSBUUkNfT1NfVElNRVJfREVDUg0KICAgICNkZWZpbmUgSFdUQ19DT1VOVCAoKigodWludDMyX3QqKTB4RTAwMEUwMTgpKSAvKiBTeXNUaWNrIGNvdW50ZXIgKi8NCgkjZGVmaW5lIElSUV9QUklPUklUWV9PUkRFUiAwDQoNCiNlbGlmIChUUkNfUkVDT1JERVJfSEFSRFdBUkVfUE9SVCA9PSBUUkNfUE9SVF9SZW5lc2FzX1JYNjAwKQ0KDQoJI2luY2x1ZGUgImlvZGVmaW5lLmgiDQoNCgkjZGVmaW5lIEhXVENfVFlQRSBUUkNfT1NfVElNRVJfSU5DUg0KCSNkZWZpbmUgSFdUQ19DT1VOVCAoQ01UMC5DTUNOVCkNCgkjZGVmaW5lIElSUV9QUklPUklUWV9PUkRFUiAxDQoNCiNlbGlmIChUUkNfUkVDT1JERVJfSEFSRFdBUkVfUE9SVCA9PSBUUkNfUE9SVF9NSUNST0NISVBfUElDMzJfTVhfTVopDQoNCgkjZGVmaW5lIEhXVENfVFlQRSBUUkNfT1NfVElNRVJfSU5DUg0KCSNkZWZpbmUgSFdUQ19DT1VOVCAoVE1SMSkNCgkjZGVmaW5lIElSUV9QUklPUklUWV9PUkRFUiAwDQoNCiNlbGlmIChUUkNfUkVDT1JERVJfSEFSRFdBUkVfUE9SVCA9PSBUUkNfUE9SVF9URVhBU19JTlNUUlVNRU5UU19UTVM1NzBfUk00OCkNCg0KCSNkZWZpbmUgUlRJRlJDMCAqKCh1aW50MzJfdCAqKTB4RkZGRkZDMTApDQoJI2RlZmluZSBSVElDT01QMCAqKCh1aW50MzJfdCAqKTB4RkZGRkZDNTApDQoJI2RlZmluZSBSVElVRENQMCAqKCh1aW50MzJfdCAqKTB4RkZGRkZDNTQpDQoNCgkjZGVmaW5lIEhXVENfVFlQRSBUUkNfT1NfVElNRVJfSU5DUg0KCSNkZWZpbmUgSFdUQ19DT1VOVCAoUlRJRlJDMCAtIChSVElDT01QMCAtIFJUSVVEQ1AwKSkNCgkjZGVmaW5lIElSUV9QUklPUklUWV9PUkRFUiAwDQoNCiNlbGlmIChUUkNfUkVDT1JERVJfSEFSRFdBUkVfUE9SVCA9PSBUUkNfUE9SVF9BUk1fQ09SVEVYX0E5KQ0KCS8qIElOUFVUIFlPVVIgUEVSSVBIRVJBTCBCQVNFIEFERFJFU1MgSEVSRSAqLw0KCSNkZWZpbmUgQ0E5X01QQ09SRV9QRVJJUEhFUkFMX0JBU0VfQUREUkVTUwkweFNPTUVUSElORw0KCQ0KCSNkZWZpbmUgQ0E5X01QQ09SRV9QUklWQVRFX01FTU9SWV9PRkZTRVQJMHgwNjAwDQoJI2RlZmluZSBDQTlfTVBDT1JFX1BSSVZDVFJfUEVSSU9EX1JFRwkoKih2b2xhdGlsZSB1aW50MzJfdCopKENBOV9NUENPUkVfUEVSSVBIRVJBTF9CQVNFX0FERFJFU1MgKyBDQTlfTVBDT1JFX1BSSVZBVEVfTUVNT1JZX09GRlNFVCArIDB4MDApKQ0KCSNkZWZpbmUgQ0E5X01QQ09SRV9QUklWQ1RSX0NPVU5URVJfUkVHCSgqKHZvbGF0aWxlIHVpbnQzMl90KikoQ0E5X01QQ09SRV9QRVJJUEhFUkFMX0JBU0VfQUREUkVTUyArIENBOV9NUENPUkVfUFJJVkFURV9NRU1PUllfT0ZGU0VUICsgMHgwNCkpDQoJI2RlZmluZSBDQTlfTVBDT1JFX1BSSVZDVFJfQ09OVFJPTF9SRUcJKCoodm9sYXRpbGUgdWludDMyX3QqKShDQTlfTVBDT1JFX1BFUklQSEVSQUxfQkFTRV9BRERSRVNTICsgQ0E5X01QQ09SRV9QUklWQVRFX01FTU9SWV9PRkZTRVQgKyAweDA4KSkNCgkNCgkjZGVmaW5lIENBOV9NUENPUkVfUFJJVkNUUl9DT05UUk9MX1BSRVNDQUxFUl9NQVNLICAgIDB4MDAwMEZGMDANCgkjZGVmaW5lIENBOV9NUENPUkVfUFJJVkNUUl9DT05UUk9MX1BSRVNDQUxFUl9TSElGVCAgIDgNCgkjZGVmaW5lIENBOV9NUENPUkVfUFJJVkNUUl9QUkVTQ0FMRVIgICAgICAgICgoKENBOV9NUENPUkVfUFJJVkNUUl9DT05UUk9MX1JFRyAmIENBOV9NUENPUkVfUFJJVkNUUl9DT05UUk9MX1BSRVNDQUxFUl9NQVNLKSA+PiBDQTlfTVBDT1JFX1BSSVZDVFJfQ09OVFJPTF9QUkVTQ0FMRVJfU0hJRlQpICsgMSkNCg0KICAgICNkZWZpbmUgSFdUQ19UWVBFIAkJCQkJCQlUUkNfT1NfVElNRVJfREVDUg0KICAgICNkZWZpbmUgSFdUQ19DT1VOVCAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E5X01QQ09SRV9QUklWQ1RSX0NPVU5URVJfUkVHDQogICAgI2RlZmluZSBJUlFfUFJJT1JJVFlfT1JERVIgMA0KDQojZWxpZiAoVFJDX1JFQ09SREVSX0hBUkRXQVJFX1BPUlQgPT0gVFJDX1BPUlRfQVBQTElDQVRJT05fREVGSU5FRCkNCg0KCSNpZiAhKCBkZWZpbmVkIChIV1RDX1RZUEUpICYmIGRlZmluZWQgKEhXVENfQ09VTlQpICYmIGRlZmluZWQgKElSUV9QUklPUklUWV9PUkRFUikpDQoJCSNlcnJvciBSRUNPUkRFUl9IQVJEV0FSRV9QT1JUIGlzIFBPUlRfQVBQTElDQVRJT05fREVGSU5FRCBidXQgbm90IGFsbCBvZiB0aGUgbmVjZXNzYXJ5IGNvbnN0YW50cyBoYXZlIGJlZW4gZGVmaW5lZC4NCgkjZW5kaWYNCg0KI2VsaWYgKFRSQ19SRUNPUkRFUl9IQVJEV0FSRV9QT1JUICE9IFRSQ19QT1JUX05PVF9TRVQpDQoNCgkjZXJyb3IgIlJFQ09SREVSX0hBUkRXQVJFX1BPUlQgaGFkIHVuc3VwcG9ydGVkIHZhbHVlISINCgkjZGVmaW5lIFRSQ19SRUNPUkRFUl9IQVJEV0FSRV9QT1JUIFBPUlRfTk9UX1NFVA0KDQojZW5kaWYNCg0KI2lmIChUUkNfUkVDT1JERVJfSEFSRFdBUkVfUE9SVCAhPSBUUkNfUE9SVF9OT1RfU0VUKQ0KDQoJI2lmbmRlZiBIV1RDX0NPVU5UDQoJI2Vycm9yICJIV1RDX0NPVU5UIGlzIG5vdCBzZXQhIg0KCSNlbmRpZg0KDQoJI2lmbmRlZiBIV1RDX1RZUEUNCgkjZXJyb3IgIkhXVENfVFlQRSBpcyBub3Qgc2V0ISINCgkjZW5kaWYNCg0KCSNpZm5kZWYgSVJRX1BSSU9SSVRZX09SREVSDQoJI2Vycm9yICJJUlFfUFJJT1JJVFlfT1JERVIgaXMgbm90IHNldCEiDQoJI2VsaWYgKElSUV9QUklPUklUWV9PUkRFUiAhPSAwKSAmJiAoSVJRX1BSSU9SSVRZX09SREVSICE9IDEpDQoJI2Vycm9yICJJUlFfUFJJT1JJVFlfT1JERVIgaGFzIGJhZCB2YWx1ZSEiDQoJI2VuZGlmDQoNCiNlbmRpZg0KDQojaWZkZWYgX19jcGx1c3BsdXMNCn0NCiNlbmRpZg0KDQojZW5kaWYgLyogVFJDX0hBUkRXQVJFX1BPUlRfSCAqLw0K