LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIChjKSBDb3B5cmlnaHQgMjAxMC0yMDEzIE1pY3Jvc2VtaSBTb0MgUHJvZHVjdHMgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICogDQogKiAgU21hcnRGdXNpb24yIE1TUyBIUERNQSBiYXJlIG1ldGFsIHNvZnR3YXJlIGRyaXZlciBwdWJsaWMgQVBJLg0KICoNCiAqIFNWTiAkUmV2aXNpb246IDU1ODMgJA0KICogU1ZOICREYXRlOiAyMDEzLTA0LTA0IDEyOjI5OjE4ICswMTAwIChUaHUsIDA0IEFwciAyMDEzKSAkDQogKi8NCg0KLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8vKioNCiAgQG1haW5wYWdlIFNtYXJ0RnVzaW9uMiBNU1MgSFBETUEgQmFyZSBNZXRhbCBEcml2ZXIuDQoNCiAgQHNlY3Rpb24gaW50cm9fc2VjIEludHJvZHVjdGlvbg0KICBUaGUgU21hcnRGdXNpb24yIE1pY3JvY29udHJvbGxlciBTdWJzeXN0ZW0gKE1TUykgaW5jbHVkZXMgYSBIaWdoIFBlcmZvcm1hbmNlDQogIERpcmVjdCBNZW1vcnkgQWNjZXNzIChIUERNQSkgY29udHJvbGxlciB3aGljaCBwZXJmb3JtcyBmYXN0IGRhdGEgdHJhbnNmZXINCiAgYmV0d2VlbiBhbnkgTVNTIG1lbW9yeSBjb25uZWN0ZWQgdG8gdGhlIEFIQiBidXMgbWF0cml4IGFuZCBNU1MgRERSLUJyaWRnZQ0KICBtZW1vcnkuIFRoaXMgc29mdHdhcmUgZHJpdmVyIHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBmb3IgY29udHJvbGxpbmcgdGhlDQogIE1TUyBIUERNQSBhcyBwYXJ0IG9mIGEgYmFyZSBtZXRhbCBzeXN0ZW0gd2hlcmUgbm8gb3BlcmF0aW5nIHN5c3RlbSBpcw0KICBhdmFpbGFibGUuIFRoZSBkcml2ZXIgY2FuIGJlIGFkYXB0ZWQgZm9yIHVzZSBhcyBwYXJ0IG9mIGFuIG9wZXJhdGluZyBzeXN0ZW0NCiAgYnV0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWRhcHRhdGlvbiBsYXllciBiZXR3ZWVuIHRoZSBkcml2ZXIgYW5kIHRoZQ0KICBvcGVyYXRpbmcgc3lzdGVtJ3MgZHJpdmVyIG1vZGVsIGlzIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZSBkcml2ZXIuDQogIA0KICBAc2VjdGlvbiBod19kZXBlbmRlbmNpZXMgSGFyZHdhcmUgRmxvdyBEZXBlbmRlbmNpZXMNCiAgVGhlIGNvbmZpZ3VyYXRpb24gb2YgYWxsIGZlYXR1cmVzIG9mIHRoZSBNU1MgSFBETUEgaXMgY292ZXJlZCBieSB0aGlzIGRyaXZlci4NCiAgVGhlcmUgYXJlIG5vIGRlcGVuZGVuY2llcyBvbiB0aGUgaGFyZHdhcmUgZmxvdyB3aGVuIGNvbmZpZ3VyaW5nIHRoZSBNU1MgSFBETUEuDQogIFRoZSBiYXNlIGFkZHJlc3MsIHJlZ2lzdGVyIGFkZHJlc3NlcyBhbmQgaW50ZXJydXB0IG51bWJlciBhc3NpZ25tZW50IGZvciB0aGUNCiAgTVNTIEhQRE1BIGJsb2NrcyBhcmUgZGVmaW5lZCBhcyBjb25zdGFudHMgaW4gdGhlIFNtYXJ0RnVzaW9uMiBDTVNJUyBIQUwuIFlvdQ0KICBtdXN0IGVuc3VyZSB0aGF0IHRoZSBsYXRlc3QgU21hcnRGdXNpb24yIENNU0lTIEhBTCBpcyBpbmNsdWRlZCBpbiB0aGUgcHJvamVjdA0KICBzZXR0aW5ncyBvZiB0aGUgc29mdHdhcmUgdG9vbCBjaGFpbiB1c2VkIHRvIGJ1aWxkIHlvdXIgcHJvamVjdCBhbmQgdGhhdCBpdCBpcw0KICBnZW5lcmF0ZWQgaW50byB5b3VyIHByb2plY3QuDQogIA0KICBAc2VjdGlvbiB0aGVvcnlfb3AgVGhlb3J5IG9mIE9wZXJhdGlvbg0KICBUaGUgTVNTIEhQRE1BIGRyaXZlciBmdW5jdGlvbnMgYXJlIGdyb3VwZWQgaW50byB0aGUgZm9sbG93aW5nIGNhdGVnb3JpZXM6DQogICAgLSBJbml0aWFsaXphdGlvbiBvZiB0aGUgTVNTIEhQRE1BIGRyaXZlciBhbmQgaGFyZHdhcmUNCiAgICAtIERhdGEgdHJhbnNmZXIgY29udHJvbCANCiAgICAtIERhdGEgdHJhbnNmZXIgc3RhdHVzDQogICAgLSBJbnRlcnJ1cHQgaGFuZGxpbmcNCiAgICANCiAgSW5pdGlhbGl6YXRpb24NCiAgVGhlIE1TUyBIUERNQSBkcml2ZXIgaXMgaW5pdGlhbGl6ZWQgdGhyb3VnaCBhIGNhbGwgdG8gdGhlIE1TU19IUERNQV9pbml0KCkNCiAgZnVuY3Rpb24uIFRoZSBNU1NfSFBETUFfaW5pdCgpIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgb3RoZXIgTVNTDQogIEhQRE1BIGRyaXZlciBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZC4NCiAgDQogIERhdGEgVHJhbnNmZXIgQ29udHJvbA0KICBUaGUgZHJpdmVyIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHRvIGNvbnRyb2wgSFBETUEgZGF0YSB0cmFuc2ZlcnM6DQogICAgLSBNU1NfSFBETUFfc3RhcnQoKSAgliBUaGlzIGZ1bmN0aW9uIHN0YXJ0cyBhIEhQRE1BIGRhdGEgdHJhbnNmZXIuIFlvdSBtdXN0DQogICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlIHRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFkZHJlc3NlcyBhbG9uZw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0cmFuc2ZlciBzaXplIGFuZCB0cmFuc2ZlciBkaXJlY3Rpb24uDQogICAgLSBNU1NfSFBETUFfcGF1c2UoKSAgliBUaGlzIGZ1bmN0aW9uIHBhdXNlcyB0aGUgSFBETUEgdHJhbnNmZXIgdGhhdCBpcw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGluIHByb2dyZXNzLg0KICAgIC0gTVNTX0hQRE1BX3Jlc3VtZSgpIJYgVGhpcyBmdW5jdGlvbiByZXN1bWVzIGEgSFBETUEgdHJhbnNmZXIgdGhhdCB3YXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzbHkgcGF1c2VkLg0KICAgIC0gTVNTX0hQRE1BX2Fib3J0KCkgIJYgVGhpcyBmdW5jdGlvbiBhYm9ydHMgdGhlIEhQRE1BIHRyYW5zZmVyIHRoYXQgaXMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRseSBpbiBwcm9ncmVzcy4NCiAgICANCiAgRGF0YSBUcmFuc2ZlciBTdGF0dXMNCiAgVGhlIHN0YXR1cyBvZiB0aGUgSFBETUEgdHJhbnNmZXIgaW5pdGlhdGVkIGJ5IHRoZSBsYXN0IGNhbGwgdG8NCiAgTVNTX0hQRE1BX3N0YXJ0KCkgY2FuIGJlIHJldHJpZXZlZCB1c2luZyB0aGUgTVNTX0hQRE1BX2dldF90cmFuc2Zlcl9zdGF0dXMoKQ0KICBmdW5jdGlvbi4NCiAgDQogIEludGVycnVwdCBIYW5kbGluZw0KICBUaGUgTVNTX0hQRE1BX3NldF9oYW5kbGVyKCkgZnVuY3Rpb24gaXMgdXNlZCB0byByZWdpc3RlciBhIGhhbmRsZXIgZnVuY3Rpb24NCiAgdGhhdCB3aWxsIGJlIGNhbGxlZCBieSB0aGUgZHJpdmVyIHdoZW4gdGhlIEhQRE1BIHRyYW5zZmVyIGNvbXBsZXRlcy4gWW91IG11c3QNCiAgY3JlYXRlIGFuZCByZWdpc3RlciBhIHRyYW5zZmVyIGNvbXBsZXRpb24gaGFuZGxlciBmdW5jdGlvbiB0byBzdWl0IHlvdXINCiAgYXBwbGljYXRpb24uDQoNCiAqLy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovDQojaWZuZGVmIE1TU19IUERNQV9IXw0KI2RlZmluZSBNU1NfSFBETUFfSF8NCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQpleHRlcm4gIkMiIHsNCiNlbmRpZiANCg0KI2luY2x1ZGUgIi4uLy4uL0NNU0lTL20yc3h4eC5oIg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgSFBETUFfVE9fRERSIGNvbnN0YW50IGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24uIEl0DQogIGluZGljYXRlcyBhIHRyYW5zZmVyIGZyb20gbWVtb3J5IGNvbm5lY3RlZCB0byB0aGUgQUhCIGJ1cyBtYXRyaXggdG8gTVNTDQogIEREUi1CcmlkZ2UgbWVtb3J5LiBJdCBpcyB1c2VkIGFzIGEgcGFyYW1ldGVyIGJ5IHRoZSBNU1NfSFBETUFfc3RhcnQoKQ0KICBmdW5jdGlvbi4NCiAqLw0KI2RlZmluZSBIUERNQV9UT19ERFIgICAgICAgIDB1DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBIUERNQV9GUk9NX0REUiBjb25zdGFudCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uLiBJdA0KICBpbmRpY2F0ZXMgYSB0cmFuc3RlciBmcm9tIE1TUyBERFItQnJpZGdlIG1lbW9yeSB0byBtZW1vcnkgY29ubmVjdGVkIHRvIHRoZSBBSEINCiAgYnVzIG1hdHJpeC4gSXQgaXMgdXNlZCBhcyBhIHBhcmFtZXRlciBieSB0aGUgTVNTX0hQRE1BX3N0YXJ0KCkgZnVuY3Rpb24uDQogKi8NCiNkZWZpbmUgSFBETUFfRlJPTV9ERFIgICAgICAxdQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgaHBkbWFfc3RhdHVzX3QgdHlwZSBpcyB1c2VkIHRvIGNvbW11bmljYXRlIHRoZSBzdGF0dXMgb2YgdGhlIEhQRE1BDQogIHRyYW5zZmVyIGluaXRpYXRlZCBieSB0aGUgbW9zdCByZWNlbnQgY2FsbCB0byBIUERNQV9zdGFydCgpLiBJdCBpbmRpY2F0ZXMgaWYNCiAgYSB0cmFuc2ZlciBpcyBzdGlsbCBjdXJyZW50bHkgaW4gcHJvZ3Jlc3Mgb3IgdGhlIG91dGNvbWUgb2YgdGhlIGxhdGVzdA0KICB0cmFuc2Zlci4gVGhpcyB0eXBlIGlzIHJldHVybmVkIGJ5IHRoZSBNU1NfSFBETUFfZ2V0X3RyYW5zZmVyX3N0YXR1cygpDQogIGZ1bmN0aW9uIGFuZCB1c2VkIGFzIHBhcmFtZXRlciB0byBoYW5kbGVyIGZ1bmN0aW9ucyByZWdpc3RlcmVkIHdpdGggdGhlIE1TUw0KICBIUERNQSBkcml2ZXIgYnkgdGhlIGFwcGxpY2F0aW9uLg0KICANCiAgLSBIUERNQV9JTl9QUk9HUkVTUyAgICAgICAtIEEgSFBETUEgdHJhbnNmZXIgaXMgdGFraW5nIHBsYWNlLg0KICAtIEhQRE1BX0NPTVBMRVRFRCAgICAgICAgIC0gVGhlIG1vc3QgcmVjZW50IEhQRE1BIHRyYW5zZmVyIGluaXRpYXRlZCBieSBhIGNhbGwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEhQRE1BX3N0YXJ0KCkgaGFzIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuDQogIC0gSFBETUFfU09VUkNFX0VSUk9SICAgICAgLSBUaGUgbW9zdCByZWNlbnQgSFBETUEgdHJhbnNmZXIgZmFpbGVkIGJlY2F1c2Ugb2YgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbSB3aXRoIHRoZSBzb3VyY2UgYWRkcmVzcyBwYXNzZWQgdG8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhQRE1BX3N0YXJ0KCkuDQogIC0gSFBETUFfREVTVElOQVRJT05fRVJST1IgLSBUaGUgbW9zdCByZWNlbnQgSFBETUEgdHJhbnNmZXIgZmFpbGVkIGJlY2F1c2Ugb2YgYQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbSB3aXRoIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHBhc3NlZCB0bw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFBETUFfc3RhcnQoKS4NCiAgLSBIUERNQV9XT1JEX0FMSUdOX0VSUk9SICAtIFRoZSBtb3N0IHJlY2VudCBIUERNQSB0cmFuc2ZlciBmYWlsZWQgYmVjYXVzZSB0aGUNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyIHNpemUgd2FzIG5vdCB3b3JkIGFsaWduZWQuIFRoaXMgbWVhbnMNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIHRyYW5zZmVyIHNpemUgcGFzc2VkIHRvIEhQRE1BX3N0YXJ0KCkgd2FzDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3QgYSBtdWx0aXBsZSBvZiBmb3VyLg0KICovDQp0eXBlZGVmIGVudW0NCnsNCiAgICBIUERNQV9JTl9QUk9HUkVTUywNCiAgICBIUERNQV9DT01QTEVURUQsDQogICAgSFBETUFfU09VUkNFX0VSUk9SLA0KICAgIEhQRE1BX0RFU1RJTkFUSU9OX0VSUk9SLA0KICAgIEhQRE1BX1dPUkRfQUxJR05fRVJST1INCn0gaHBkbWFfc3RhdHVzX3Q7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoaXMgdHlwZSBkZWZpbml0aW9uIHNwZWNpZmllcyB0aGUgcHJvdG90eXBlIG9mIGEgZnVuY3Rpb24gdGhhdCBjYW4gYmUNCiAgcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZHJpdmVyIGFzIGEgSFBETUEgdHJhbnNmZXIgY29tcGxldGlvbiBoYW5kbGVyIGZ1bmN0aW9uDQogIHRocm91Z2ggYSBjYWxsIHRvIE1TU19IUERNQV9zZXRfaGFuZGxlcigpLiBUaGUgSFBETUEgdHJhbnNmZXIgY29tcGxldGlvbg0KICBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBkcml2ZXIgd2hlbiBhIEhQRE1BIHRyYW5zZmVyIGNvbXBsZXRlcy4gVGhlIE1TUw0KICBIUERNQSBkcml2ZXIgcGFzc2VzIHRoZSBvdXRjb21lIG9mIHRoZSB0cmFuc2ZlciB0byB0aGUgY29tcGxldGlvbiBoYW5kbGVyIGluDQogIHRoZSBmb3JtIG9mIGEgaHBkbWFfc3RhdHVzX3QgcGFyYW1ldGVyIGluZGljYXRpbmcgaWYgdGhlIHRyYW5zZmVyIHdhcw0KICBzdWNjZXNzZnVsIG9yIHRoZSB0eXBlIG9mIGVycm9yIHRoYXQgb2NjdXJyZWQgZHVyaW5nIHRoZSB0cmFuc2Zlci4NCiAqLw0KdHlwZWRlZiB2b2lkICgqbXNzX2hwZG1hX2hhbmRsZXJfdCkoaHBkbWFfc3RhdHVzX3Qgc3RhdHVzKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIE1TU19IUERNQV9pbml0KCkgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIE1TUyBIUERNQSBkcml2ZXIuIEl0IHJlc2V0cyB0aGUNCiAgSFBETUEgY29udHJvbGxlci4gSXQgY2xlYXJzIGFsbCBwZW5kaW5nIEhQRE1BIGludGVycnVwdHMuIEl0IGluaXRpYWxpemVzDQogIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBNU1MgSFBETUEgZHJpdmVyLiBJdCBkaXNhYmxlcyBpbnRlcnJ1cHRzDQogIHJlbGF0ZWQgdG8gSFBETUEgZGF0YSB0cmFuc2ZlcnMuDQoNCiAgQHBhcmFtDQogICAgVGhpcyBmdW5jdGlvbiBoYXMgbm8gcGFyYW1ldGVycy4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAqLw0Kdm9pZA0KTVNTX0hQRE1BX2luaXQNCigNCiAgICB2b2lkDQopOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLy8qKg0KICBUaGUgTVNTX0hQRE1BX3N0YXJ0KCkgZnVuY3Rpb24gc3RhcnRzIGEgSFBETUEgZGF0YSB0cmFuc2Zlci4gSXRzIHBhcmFtZXRlcnMNCiAgc3BlY2lmeSB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhZGRyZXNzZXMgb2YgdGhlIHRyYW5zZmVyIGFzIHdlbGwgYXMgaXRzDQogIHNpemUgYW5kIGRpcmVjdGlvbi4gSFBETUEgZGF0YSB0cmFuc2ZlcnMgYWx3YXlzIHVzZSBERFIgbWVtb3J5IGFzIHRoZSBzb3VyY2UNCiAgb3IgZGVzdGluYXRpb24gb2YgdGhlIHRyYW5zZmVyLiBUaGUgSFBETUEgY29udHJvbGxlciB0cmFuc2ZlcnMgZGF0YSBpbiAzMi1iaXQNCiAgY2h1bmtzIGxvY2F0ZWQgb24gMzItYml0IHdvcmQgYWxpZ25lZCBhZGRyZXNzIGJvdW5kYXJpZXMuDQoNCiAgQHBhcmFtIHNyY19hZGRyDQogICAgVGhlIHBhcmFtZXRlciBzcmNfYWRkciBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgdHJhbnNmZXJyZWQNCiAgICBieSB0aGUgSFBETUEuIFRoaXMgYWRkcmVzcyBtdXN0IGJlIDMyLWJpdCB3b3JkIGFsaWduZWQuIFRoZSBtZW1vcnkgbG9jYXRpb24NCiAgICBzcGVjaWZpZWQgYnkgdGhpcyBhZGRyZXNzIG11c3QgYmUgbG9jYXRlZCBpbiBERFIgbWVtb3J5IGlmIHRoZSB0cmFuc2Zlcl9kaXINCiAgICBwYXJhbWV0ZXIgaXMgc2V0IHRvIEhQRE1fRlJPTV9ERFIuDQoNCiAgQHBhcmFtIGRlc3RfYWRkcg0KICAgIFRoZSBwYXJhbWV0ZXIgZGVzdF9hZGRyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbiBhdCB3aGljaCB0aGUgZGF0YQ0KICAgIHdpbGwgYmUgdHJhbnNmZXJyZWQuIFRoaXMgYWRkcmVzcyBtdXN0IGJlIDMyLWJpdCB3b3JkIGFsaWduZWQuIFRoZSBtZW1vcnkNCiAgICBsb2NhdGlvbiBzcGVjaWZpZWQgYnkgdGhpcyBhZGRyZXNzIG11c3QgYmUgbG9jYXRlZCBpbiBERFIgbWVtb3J5IGlmIHRoZQ0KICAgIHRyYW5zZmVyX2RpciBwYXJhbWV0ZXIgaXMgc2V0IHRvIEhQRE1fVE9fRERSLg0KDQogIEBwYXJhbSB0cmFuc2Zlcl9zaXplDQogICAgVGhlIHBhcmFtZXRlciB0cmFuc2Zlcl9zaXplIHNwZWNpZmllcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgcmVxdWVzdGVkDQogICAgdHJhbnNmZXIuIFRoZSB2YWx1ZSBvZiB0cmFuc2Zlcl9zaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBmb3VyLg0KDQogIEBwYXJhbSB0cmFuc2Zlcl9kaXINCiAgICAgVGhlIHBhcmFtZXRlciB0cmFuc2Zlcl9kaXIgaXMgdXNlZCBmb3Igc3BlY2lmeWluZyB0aGUgZGF0YSB0cmFuc2Zlcg0KICAgICBkaXJlY3Rpb24uIEFsbG93ZWQgdmFsdWVzIGZvciB0cmFuc2Zlcl9kaXIgYXJlIGFzIGZvbGxvd3M6DQogICAgICAgIC0gSFBETUFfVE9fRERSDQogICAgICAgIC0gSFBETUFfRlJPTV9ERFINCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAqLw0Kdm9pZA0KTVNTX0hQRE1BX3N0YXJ0DQooDQogICAgdWludDMyX3Qgc3JjX2FkZHIsDQogICAgdWludDMyX3QgZGVzdF9hZGRyLA0KICAgIHVpbnQzMl90IHRyYW5zZmVyX3NpemUsDQogICAgdWludDhfdCB0cmFuc2Zlcl9kaXINCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBNU1NfSFBETUFfcGF1c2UoKSBmdW5jdGlvbiBwYXVzZXMgdGhlIGN1cnJlbnQgSFBETUEgdHJhbnNmZXIuIFRoZSBIUERNQQ0KICB0cmFuc2ZlciBjYW4gYmUgcmVzdW1lZCBsYXRlciAgYnkgY2FsbGluZyBNU1NfSFBETUFfcmVzdW1lKCkuDQoNCiAgQHBhcmFtDQogICAgVGhpcyBmdW5jdGlvbiBoYXMgbm8gcGFyYW1ldGVycy4NCiAgICANCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQogKi8NCnZvaWQNCk1TU19IUERNQV9wYXVzZQ0KKA0KICAgIHZvaWQNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBNU1NfSFBETUFfcGF1c2UoKSBmdW5jdGlvbiByZXN1bWVzIHRoZSBjdXJyZW50IEhQRE1BIHRyYW5zZmVyIGFmdGVyIGl0IHdhcw0KICBwcmV2aW91c2x5IHBhdXNlZCB0aHJvdWdoIGEgY2FsbCB0byBNU1NfSFBETUFfcGF1c2UoKS4NCg0KICBAcGFyYW0NCiAgICBUaGlzIGZ1bmN0aW9uIGhhcyBubyBwYXJhbWV0ZXJzLg0KICAgIA0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAqLw0Kdm9pZA0KTVNTX0hQRE1BX3Jlc3VtZQ0KKA0KICAgIHZvaWQNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogIFRoZSBNU1NfSFBETUFfYWJvcnQoKSBmdW5jdGlvbiBhYm9ydHMgdGhlIGN1cnJlbnQgSFBETUEgdHJhbnNmZXIuDQoNCiAgQHBhcmFtDQogICAgVGhpcyBmdW5jdGlvbiBoYXMgbm8gcGFyYW1ldGVycy4NCiAgICANCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQogKi8NCnZvaWQNCk1TU19IUERNQV9hYm9ydA0KKA0KICAgIHZvaWQNCik7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovLyoqDQogVGhlIE1TU19IUERNQV9nZXRfdHJhbnNmZXJfc3RhdHVzKCkgZnVuY3Rpb24gcmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBIUERNQQ0KIHRyYW5zZmVyIGluaXRpYXRlZCBieSBhIGNhbGwgdG8gTVNTX0hQRE1BX3N0YXJ0KCkuIA0KDQogIEBwYXJhbQ0KICAgIFRoaXMgZnVuY3Rpb24gaGFzIG5vIHBhcmFtZXRlcnMuDQogICAgDQogIEByZXR1cm4NCiAgICBUaGUgTVNTX0hQRE1BX2dldF90cmFuc2Zlcl9zdGF0dXMoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIEhQRE1BDQogICAgdHJhbnNmZXIgYXMgYSB2YWx1ZSBvZiAgdHlwZSBocGRtYV9zdGF0dXNfdC4gVGhlIHBvc3NpYmxlIHJldHVybiB2YWx1ZXMgYXJlOg0KICAgICAgICAtIEhQRE1BX0lOX1BST0dSRVNTDQogICAgICAgIC0gSFBETUFfQ09NUExFVEVEDQogICAgICAgIC0gSFBETUFfU09VUkNFX0VSUk9SDQogICAgICAgIC0gSFBETUFfREVTVElOQVRJT05fRVJST1INCiAgICAgICAgLSBIUERNQV9XT1JEX0FMSUdOX0VSUk9SDQogICAgICANCiAgVGhlIGV4YW1wbGUgY29kZSBiZWxvdyBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiB0aGUNCiAgTVNTX0hQRE1BX2dldF90cmFuc2Zlcl9zdGF0dXMoKSBmdW5jdGlvbiB0byBkZXRlY3QgdGhlIGNvbXBsZXRpb24gb2YgdGhlDQogIHRyYW5zZmVyIG9mIHRoZSBjb250ZW50IG9mIGVOVk0gaW50byBNRERSIG1lbW9yeS4NCiAgQGNvZGUNCiAgICB2b2lkIGNvcHlfZW52bV90b19tZGRyKHZvaWQpDQogICAgew0KICAgICAgICBNU1NfSFBETUFfc3RhcnQoRU5WTV9CQVNFX0FERFIsDQogICAgICAgICAgICAgICAgICAgICAgICBNRERSX0JBU0VfQUREUiwNCiAgICAgICAgICAgICAgICAgICAgICAgIEVOVk1fU0laRV9CWVRFLA0KICAgICAgICAgICAgICAgICAgICAgICAgSFBETUFfVE9fRERSKTsNCiAgICAgICAgDQogICAgICAgIGRvIHsNCiAgICAgICAgICAgIHhmZXJfc3RhdGUgPSBNU1NfSFBETUFfZ2V0X3RyYW5zZmVyX3N0YXR1cygpOw0KICAgICAgICB9IHdoaWxlKEhQRE1BX0lOX1BST0dSRVNTID09IHhmZXJfc3RhdGUpOw0KICAgIH0NCiAgQGVuZGNvZGUNCiAqLw0KaHBkbWFfc3RhdHVzX3QNCk1TU19IUERNQV9nZXRfdHJhbnNmZXJfc3RhdHVzDQooDQogICAgdm9pZA0KKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8vKioNCiAgVGhlIE1TU19IUERNQV9zZXRfaGFuZGxlcigpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSBoYW5kbGVyIGZ1bmN0aW9uDQogIHRoYXQgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIGRyaXZlciB3aGVuIHRoZSBIUERNQSB0cmFuc2ZlciBjb21wbGV0ZXMuIFlvdSBtdXN0DQogIGNyZWF0ZSBhbmQgcmVnaXN0ZXIgYSB0cmFuc2ZlciBjb21wbGV0aW9uIGhhbmRsZXIgZnVuY3Rpb24gdG8gc3VpdCB5b3VyDQogIGFwcGxpY2F0aW9uLiBUaGUgTVNTIEhQRE1BIGRyaXZlciBwYXNzZXMgdGhlIG91dGNvbWUgb2YgdGhlIHRyYW5zZmVyIHRvIHRoZQ0KICBjb21wbGV0aW9uIGhhbmRsZXIgaW4gdGhlIGZvcm0gb2YgYSBocGRtYV9zdGF0dXNfdCBwYXJhbWV0ZXIgaW5kaWNhdGluZyBpZiB0aGUNCiAgdHJhbnNmZXIgd2FzIHN1Y2Nlc3NmdWwgb3IgdGhlIHR5cGUgb2YgZXJyb3IgdGhhdCBvY2N1cnJlZCBkdXJpbmcgdGhlIHRyYW5zZmVyDQogIGlmIHRoZSB0cmFuc2ZlciBmYWlsZWQuDQoNCiAgQHBhcmFtIGhhbmRsZXINCiAgICBUaGUgaGFuZGxlciBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGEgaGFuZGxlciBmdW5jdGlvbiBwcm92aWRlZCBieSB5b3VyDQogICAgYXBwbGljYXRpb24uIFRoaXMgaGFuZGxlciBpcyBvZiB0eXBlIG1zc19ocGRtYV9oYW5kbGVyX3QuIFRoZSBoYW5kbGVyDQogICAgZnVuY3Rpb24gbXVzdCB0YWtlIG9uZSBwYXJhbWV0ZXIgb2YgdHlwZSBocGRtYV9zdGF0dXNfdCBhbmQgbXVzdCBub3QgcmV0dXJuDQogICAgYSB2YWx1ZS4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAgICANCiAgVGhpcyBleGFtcGxlIGNvZGUgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgdGhlIE1TU19IUERNQV9zZXRfaGFuZGxlcigpDQogIGZ1bmN0aW9uOg0KICBAY29kZQ0KICAgIHZvaWQgdHJhbnNmZXJfY29tcGxldGVfaGFuZGxlcihocGRtYV9zdGF0dXNfdCBzdGF0dXMpOw0KDQogICAgdm9sYXRpbGUgdWludDMyX3QgZ194ZmVyX2luX3Byb2dyZXNzID0gMDsNCg0KICAgIHZvaWQgZGVtb190cmFuc2Zlcih2b2lkKQ0KICAgIHsNCiAgICAgICAgTVNTX0hQRE1BX2luaXQoKTsNCiAgICAgICAgDQogICAgICAgIE1TU19IUERNQV9zZXRfaGFuZGxlcih0cmFuc2Zlcl9jb21wbGV0ZV9oYW5kbGVyKTsNCiAgICAgICAgDQogICAgICAgIGdfeGZlcl9pbl9wcm9ncmVzcyA9IDE7DQogICAgICAgIE1TU19IUERNQV9zdGFydCgodWludDMyX3QpMHgyMDAwMDAwMCwNCiAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkweDAwMDAwMDAwLA0KICAgICAgICAgICAgICAgICAgICAgICAgMjAsDQogICAgICAgICAgICAgICAgICAgICAgICBIUERNQV9GUk9NX0REUik7DQogICAgICAgIA0KICAgICAgICB3aGlsZShnX3hmZXJfaW5fcHJvZ3Jlc3MpDQogICAgICAgIHsNCiAgICAgICAgICAgIDsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHZvaWQgdHJhbnNmZXJfY29tcGxldGVfaGFuZGxlcihocGRtYV9zdGF0dXNfdCBzdGF0dXMpDQogICAgew0KICAgICAgICBnX3hmZXJfaW5fcHJvZ3Jlc3MgPSAwOw0KICAgICAgICANCiAgICAgICAgc3dpdGNoKHN0YXR1cykNCiAgICAgICAgew0KICAgICAgICAgICAgY2FzZSBIUERNQV9DT01QTEVURUQ6DQogICAgICAgICAgICAgICAgZGlzcGxheSgiVHJhbnNmZXIgY29tcGxldGUiKTsNCiAgICAgICAgICAgIGJyZWFrOw0KDQogICAgICAgICAgICBjYXNlIEhQRE1BX1NPVVJDRV9FUlJPUjoNCiAgICAgICAgICAgICAgICBkaXNwbGF5KCJUcmFuc2ZlciBmYWlsZWQ6IHNvdXJjZSBlcnJvciIpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGNhc2UgSFBETUFfREVTVElOQVRJT05fRVJST1I6DQogICAgICAgICAgICAgICAgZGlzcGxheSgiVHJhbnNmZXIgZmFpbGVkOiBkZXN0aW5hdGlvbiBlcnJvciIpOw0KICAgICAgICAgICAgYnJlYWs7DQoNCiAgICAgICAgICAgIGNhc2UgSFBETUFfV09SRF9BTElHTl9FUlJPUjoNCiAgICAgICAgICAgICAgICBkaXNwbGF5KCJUcmFuc2ZlciBmYWlsZWQ6IHdvcmQgYWxpZ25tZW50IGVycm9yIik7DQogICAgICAgICAgICBicmVhazsNCg0KICAgICAgICAgICAgZGVmYXVsdDoNCiAgICAgICAgICAgICAgICBkaXNwbGF5KCJVbmV4cGVjdGVkIHN0YXR1cyIpOw0KICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICB9DQogIEBlbmRjb2RlDQogKi8NCnZvaWQNCk1TU19IUERNQV9zZXRfaGFuZGxlcg0KKA0KICAgIG1zc19ocGRtYV9oYW5kbGVyX3QgaGFuZGxlcg0KKTsNCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQp9DQojZW5kaWYNCg0KI2VuZGlmIC8qIE1TU19IUERNQV9IXyAqLw0K