LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIENvcHlyaWdodCAoQykgMjAxNiBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IFRyYWN6eWsgQW5kcmVhcyA8dHJhY3p5ay5hbmRyZWFzQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQp1c2luZyBuYW1lc3BhY2UgY29uY3VycmVuY3k7DQoNCm5hbWVzcGFjZSBSaW5nQ2xpZW50VVdQDQp7DQovLyBpdHMgb2sgdG8ga2VlcCB0aGlzIGVudW0gaGVyZSBhbmQgdG8gdXNlIGl0IHdpdGggdGhlIHdpemFyZCwgYmVjYXVzZSBpbiBwY2guaCBoZWFkZXJzIGFyZSBhLXogc29ydGVkLA0KLy8gYnV0IGl0IHdvdWxkIGJlIG11Y2ggbW9yZSBjb25zaXN0ZW50IHRvIG1vdmUgdGhpcyBlbnVtIGluIGdsb2JhbHMuaCB3aGVuIG1lcmdlZA0KDQpwdWJsaWMgZW51bSBjbGFzcyBTdGFydGluZ1N0YXR1cyB7IE5PUk1BTCwgUkVHSVNURVJJTkdfT05fVEhJU19QQywgUkVHSVNURVJJTkdfVEhJU19ERVZJQ0UgfTsNCg0KLyogZGVsZWdhdGUgKi8NCmRlbGVnYXRlIHZvaWQgSW5jb21pbmdDYWxsKFN0cmluZ14gYWNjb3VudElkLCBTdHJpbmdeIGNhbGxJZCwgU3RyaW5nXiBmcm9tKTsNCmRlbGVnYXRlIHZvaWQgU3RhdGVDaGFuZ2UoU3RyaW5nXiBjYWxsSWQsIENhbGxTdGF0dXMgc3RhdGUsIGludCBjb2RlKTsNCmRlbGVnYXRlIHZvaWQgSW5jb21pbmdBY2NvdW50TWVzc2FnZShTdHJpbmdeIGFjY291bnRJZCwgU3RyaW5nXiBmcm9tLCBTdHJpbmdeIHBheWxvYWQpOw0KZGVsZWdhdGUgdm9pZCBDYWxsUGxhY2VkKFN0cmluZ14gY2FsbElkKTsNCmRlbGVnYXRlIHZvaWQgSW5jb21pbmdNZXNzYWdlKFN0cmluZ14gY2FsbElkLCBTdHJpbmdeIHBheWxvYWQpOw0KZGVsZWdhdGUgdm9pZCBEZXZpY2VzTGlzdFJlZnJlc2hlZChWZWN0b3I8U3RyaW5nXj5eIGRldmljZXNMaXN0KTsNCmRlbGVnYXRlIHZvaWQgRXhwb3J0T25SaW5nRW5kZWQoU3RyaW5nXiBhY2NvdW50SWQsIFN0cmluZ14gcGluKTsNCg0KDQpwdWJsaWMgcmVmIGNsYXNzIFJpbmdEIHNlYWxlZA0Kew0KcHVibGljOg0KICAgIC8qIGZ1bmN0aW9ucyAqLw0KDQogICAgLyogcHJvcGVydGllcyAqLw0KICAgIHN0YXRpYyBwcm9wZXJ0eSBSaW5nRF4gaW5zdGFuY2UNCiAgICB7DQogICAgICAgIFJpbmdEXiBnZXQoKQ0KICAgICAgICB7DQogICAgICAgICAgICBzdGF0aWMgUmluZ0ReIGluc3RhbmNlXyA9IHJlZiBuZXcgUmluZ0QoKTsNCiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZV87DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBwcm9wZXJ0eSBib29sIGRhZW1vblJ1bm5pbmcNCiAgICB7DQogICAgICAgIGJvb2wgZ2V0KCkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIGRhZW1vblJ1bm5pbmdfOw0KICAgICAgICB9DQogICAgfQ0KICAgIHByb3BlcnR5IFN0YXJ0aW5nU3RhdHVzIF9zdGFydGluZ1N0YXR1czsNCiAgICBwcm9wZXJ0eSBTdHJpbmdeIF9waW47DQogICAgcHJvcGVydHkgU3RyaW5nXiBfcGFzc3dvcmQ7DQoNCiAgICB2b2lkIGNhbmNlbE91dEdvaW5nQ2FsbDIoU3RyaW5nXiBjYWxsSWQpOyAvLyBtYXJjaGUNCg0KaW50ZXJuYWw6IC8vIHdoeSB0aGlzIHByb3BlcnR5IGhhcyB0byBiZSBpbnRlcm5hbCBhbmQgbm90IHB1YmxpYyA/DQogICAgcHJvcGVydHkgVmVjdG9yPFN0cmluZ14+XiBfY2FsbElkc0xpc3QNCiAgICB7DQogICAgICAgIFZlY3RvcjxTdHJpbmdePl4gZ2V0KCkNCiAgICAgICAgew0KICAgICAgICAgICAgcmV0dXJuIGNhbGxJZHNMaXN0XzsNCiAgICAgICAgfQ0KICAgIH0NCg0KDQppbnRlcm5hbDoNCiAgICAvKiBmdW5jdGlvbnMgKi8NCiAgICB2b2lkIHN0YXJ0RGFlbW9uKCk7DQogICAgdm9pZCByZWxvYWRBY2NvdW50TGlzdCgpOw0KICAgIHZvaWQgc2VuZEFjY291bnRUZXh0TWVzc2FnZShTdHJpbmdeIG1lc3NhZ2UpOw0KICAgIHZvaWQgc2VuZFNJUFRleHRNZXNzYWdlKFN0cmluZ14gbWVzc2FnZSk7DQogICAgdm9pZCBjcmVhdGVSSU5HQWNjb3VudChTdHJpbmdeIGFsaWFzKTsNCiAgICB2b2lkIGNyZWF0ZVNJUEFjY291bnQoU3RyaW5nXiBhbGlhcyk7DQogICAgdm9pZCByZWZ1c2VJbmNvbW1pbmdDYWxsKFN0cmluZ14gY2FsbCk7DQogICAgdm9pZCBhY2NlcHRJbmNvbW1pbmdDYWxsKFN0cmluZ14gY2FsbCk7DQogICAgdm9pZCBwbGFjZUNhbGwoQ29udGFjdF4gY29udGFjdCk7DQogICAgLyp2b2lkIGNhbmNlbE91dEdvaW5nQ2FsbDIoU3RyaW5nXiBjYWxsSWQpOyovIC8vIG1hcmNoZSBwYXMNCiAgICBDYWxsU3RhdHVzIHRyYW5zbGF0ZUNhbGxTdGF0dXMoU3RyaW5nXiBzdGF0ZSk7DQogICAgVmVjdG9yPFN0cmluZ14+XiB0cmFuc2xhdGVLbm93blJpbmdEZXZpY2VzKGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gZGV2aWNlcyk7DQoNCiAgICB2b2lkIGhhbmdVcENhbGwyKFN0cmluZ14gY2FsbElkKTsNCiAgICB2b2lkIHBhdXNlQ2FsbChTdHJpbmcgXiBjYWxsSWQpOw0KICAgIHZvaWQgdW5QYXVzZUNhbGwoU3RyaW5nIF4gY2FsbElkKTsNCiAgICB2b2lkIGFza1RvUmVmcmVzaEtub3duRGV2aWNlcyhTdHJpbmdeIGFjY291bnRJZCk7DQogICAgdm9pZCBhc2tUb0V4cG9ydE9uUmluZyhTdHJpbmdeIGFjY291bnRJZCwgU3RyaW5nXiBwYXNzd29yZCk7DQoNCiAgICAvKiBUT0RPIDogbW92ZSBtZW1iZXJzICovDQogICAgLy8vYm9vbCBoYXNDb25maWc7IC8vIHJlcGxhY2VkIGJ5IHN0YXJ0aW5nU3RhdHVzDQogICAgc3RkOjpzdHJpbmcgYWNjb3VudE5hbWU7DQogICAgU3RyaW5nIF4gY3VycmVudENhbGxJZDsgLy8gdG8gc2F2ZSBvbmdvaW5nIGNhbGwgaWQgZHVyaW5nIHZpc2liaWxpdHkgY2hhbmdlDQoNCiAgICAvKiBldmVudHMgKi8NCiAgICBldmVudCBJbmNvbWluZ0NhbGxeIGluY29taW5nQ2FsbDsNCiAgICBldmVudCBTdGF0ZUNoYW5nZV4gc3RhdGVDaGFuZ2U7DQogICAgZXZlbnQgSW5jb21pbmdBY2NvdW50TWVzc2FnZV4gaW5jb21pbmdBY2NvdW50TWVzc2FnZTsNCiAgICBldmVudCBJbmNvbWluZ01lc3NhZ2VeIGluY29taW5nTWVzc2FnZTsNCiAgICBldmVudCBDYWxsUGxhY2VkXiBjYWxsUGxhY2VkOw0KICAgIGV2ZW50IERldmljZXNMaXN0UmVmcmVzaGVkXiBkZXZpY2VzTGlzdFJlZnJlc2hlZDsNCiAgICBldmVudCBFeHBvcnRPblJpbmdFbmRlZF4gZXhwb3J0T25SaW5nRW5kZWQ7DQoNCnByaXZhdGU6DQogICAgLyogc3ViIGNsYXNzZXMgKi8NCiAgICBlbnVtIGNsYXNzIFJlcXVlc3Qgew0KICAgICAgICBOb25lLA0KICAgICAgICBBZGRSaW5nQWNjb3VudCwNCiAgICAgICAgQWRkU0lQQWNjb3VudCwNCiAgICAgICAgUmVmdXNlSW5jb21taW5nQ2FsbCwNCiAgICAgICAgQWNjZXB0SW5jb21taW5nQ2FsbCwNCiAgICAgICAgQ2FuY2VsT3V0R29pbmdDYWxsLA0KICAgICAgICBIYW5nVXBDYWxsLA0KICAgICAgICBQYXVzZUNhbGwsDQogICAgICAgIFVuUGF1c2VDYWxsLA0KICAgICAgICBSZWdpc3RlckRldmljZSwNCiAgICAgICAgR2V0S25vd25EZXZpY2VzLA0KICAgICAgICBFeHBvcnRPblJpbmcNCiAgICB9Ow0KDQoNCiAgICBWZWN0b3I8U3RyaW5nXj5eIGNhbGxJZHNMaXN0XzsNCg0KICAgIHJlZiBjbGFzcyBUYXNrDQogICAgew0KICAgIGludGVybmFsOg0KICAgICAgICBUYXNrKFJlcXVlc3Qgcikgew0KICAgICAgICAgICAgcmVxdWVzdCA9IHI7DQogICAgICAgIH0NCiAgICAgICAgVGFzayhSZXF1ZXN0IHIsIFN0cmluZ14gYykgew0KICAgICAgICAgICAgcmVxdWVzdCA9IHI7DQogICAgICAgICAgICBfY2FsbElkID0gYzsNCiAgICAgICAgfQ0KICAgICAgICBUYXNrKFJlcXVlc3QgciwgU3RyaW5nXiBwLCBTdHJpbmdeIFApIHsNCiAgICAgICAgICAgIHJlcXVlc3QgPSByOw0KICAgICAgICAgICAgX3BpbiA9IHA7DQogICAgICAgICAgICBfcGFzc3dvcmQgPSBQOw0KICAgICAgICB9DQogICAgcHVibGljOg0KICAgICAgICBwcm9wZXJ0eSBSZXF1ZXN0IHJlcXVlc3Q7DQogICAgICAgIHByb3BlcnR5IFN0cmluZ14gX2NhbGxJZDsNCiAgICAgICAgcHJvcGVydHkgU3RyaW5nXiBfcGluOw0KICAgICAgICBwcm9wZXJ0eSBTdHJpbmdeIF9wYXNzd29yZDsNCiAgICAgICAgcHJvcGVydHkgU3RyaW5nXiBfYWNjb3VudElkOw0KICAgIH07DQoNCiAgICAvKiBmdW5jdGlvbnMgKi8NCiAgICBSaW5nRCgpOyAvLyBzaW5nbGV0b24NCiAgICB2b2lkIGRlcXVldWVUYXNrcygpOw0KLy8gICAgQ2FsbFN0YXR1cyB0cmFuc2xhdGVDYWxsU3RhdHVzKFN0cmluZ14gc3RhdGUpOw0KDQogICAgLyogbWVtYmVycyAqLw0KICAgIHN0ZDo6c3RyaW5nIGxvY2FsRm9sZGVyXzsNCiAgICBib29sIGRhZW1vblJ1bm5pbmdfID0gZmFsc2U7DQogICAgc3RkOjpxdWV1ZTxUYXNrXj4gdGFza3NMaXN0XzsNCiAgICBTdGFydGluZ1N0YXR1cyBzdGFydGluZ1N0YXR1c18gPSBTdGFydGluZ1N0YXR1czo6Tk9STUFMOw0KfTsNCn0=