LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBUcmFjenlrIEFuZHJlYXMgPGFuZHJlYXMudHJhY3p5a0BzYXZvaXJmYWlyZWxpbnV4LmNvbT4gICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKg0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKg0KICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKg0KICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojcHJhZ21hIG9uY2UNCg0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOw0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OlVJOjpYYW1sOjpEYXRhOw0KdXNpbmcgbmFtZXNwYWNlIFBsYXRmb3JtOjpDb2xsZWN0aW9uczsNCg0KbmFtZXNwYWNlIFJpbmdDbGllbnRVV1ANCnsNCnB1YmxpYyByZWYgY2xhc3MgQWNjb3VudCBzZWFsZWQgOiBwdWJsaWMgSU5vdGlmeVByb3BlcnR5Q2hhbmdlZA0Kew0KcHVibGljOg0KICAgIEFjY291bnQoU3RyaW5nXiBuYW1lLCBTdHJpbmdeIHJpbmdJRCwgU3RyaW5nXiBhY2NvdW50VHlwZSwgU3RyaW5nXiBhY2NvdW50SUQsIFN0cmluZ14gZGV2aWNlSWQpOw0KDQogICAgdmlydHVhbCBldmVudCBQcm9wZXJ0eUNoYW5nZWRFdmVudEhhbmRsZXJeIFByb3BlcnR5Q2hhbmdlZDsNCg0KICAgIHByb3BlcnR5IFN0cmluZ14gbmFtZV87DQogICAgcHJvcGVydHkgU3RyaW5nXiByaW5nSURfOw0KICAgIHByb3BlcnR5IFN0cmluZ14gYWNjb3VudFR5cGVfOyAvLyByZWZhY3RvIDogY3JlYXRlIGEgZW51bSBhY2NvdW50VHlwZQ0KICAgIHByb3BlcnR5IFN0cmluZ14gYWNjb3VudElEXzsNCiAgICBwcm9wZXJ0eSBTdHJpbmdeIF9kZXZpY2VJZDsNCiAgICBwcm9wZXJ0eSBXaW5kb3dzOjpGb3VuZGF0aW9uOjpDb2xsZWN0aW9uczo6SVZlY3RvcjxTdHJpbmdePl4gX2RldmljZXNJZExpc3Qgew0KICAgICAgICBXaW5kb3dzOjpGb3VuZGF0aW9uOjpDb2xsZWN0aW9uczo6SVZlY3RvcjxTdHJpbmdePl4gZ2V0KCkgew0KICAgICAgICAgICAgcmV0dXJuIGRldmljZXNJZExpc3RfOw0KICAgICAgICB9DQogICAgICAgIHZvaWQgc2V0KFdpbmRvd3M6OkZvdW5kYXRpb246OkNvbGxlY3Rpb25zOjpJVmVjdG9yPFN0cmluZ14+XiB2YWx1ZSkgew0KICAgICAgICAgICAgZGV2aWNlc0lkTGlzdF8gPSB2YWx1ZTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBwcm9wZXJ0eSBib29sIF9pc1NlbGVjdGVkIHsNCiAgICAgICAgdm9pZCBzZXQoYm9vbCB2YWx1ZSkgew0KICAgICAgICAgICAgLy8gaXNTZWxlY3RlZF8gPSB2YWx1ZTsgZGlzYWJsZWQgb24gcHVycG9zZSBmb3IgZnV0dXJlIHVzZQ0KICAgICAgICAgICAgUHJvcGVydHlDaGFuZ2VkKHRoaXMsIHJlZiBuZXcgUHJvcGVydHlDaGFuZ2VkRXZlbnRBcmdzKCJfaXNTZWxlY3RlZCIpKTsNCiAgICAgICAgfQ0KICAgICAgICBib29sIGdldCgpIHsNCiAgICAgICAgICAgIHJldHVybiBpc1NlbGVjdGVkXzsNCiAgICAgICAgfQ0KICAgIH0NCg0KcHJvdGVjdGVkOg0KICAgIHZvaWQgTm90aWZ5UHJvcGVydHlDaGFuZ2VkKFN0cmluZ14gcHJvcGVydHlOYW1lKTsNCg0KcHJpdmF0ZToNCiAgICBXaW5kb3dzOjpGb3VuZGF0aW9uOjpDb2xsZWN0aW9uczo6SVZlY3RvcjxTdHJpbmdePl4gZGV2aWNlc0lkTGlzdF87DQogICAgYm9vbCBpc1NlbGVjdGVkXzsNCg0KfTsNCn0NCg0K