LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogQ29weXJpZ2h0IChDKSAyMDE2IGJ5IFNhdm9pci1mYWlyZSBMaW51eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KICogQXV0aG9yOiBUcmFjenlrIEFuZHJlYXMgPGFuZHJlYXMudHJhY3p5a0BzYXZvaXJmYWlyZWxpbnV4LmNvbT4gICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgKg0KICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IgICAgICAgKg0KICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsICAgICAgICAgKg0KICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgKg0KICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgKg0KICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAgKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQovKiBjbGllbnQgKi8NCiNpbmNsdWRlICJwY2guaCINCg0KdXNpbmcgbmFtZXNwYWNlIFJpbmdDbGllbnRVV1A7DQoNCnVzaW5nIG5hbWVzcGFjZSBQbGF0Zm9ybTsNCnVzaW5nIG5hbWVzcGFjZSBXaW5kb3dzOjpVSTo6Q29yZTsNCg0Kdm9pZA0KUmluZ0RlYnVnOjpwcmludChjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSwNCiAgICAgICAgICAgICAgICAgY29uc3QgVHlwZSYgdHlwZSkNCnsNCiAgICAvKiBnZXQgdGhlIGN1cnJlbnQgdGltZSAqLw0KICAgIHN0ZDo6dGltZV90IGN1cnJlbnRUaW1lID0gc3RkOjp0aW1lKG51bGxwdHIpOw0KICAgIGNoYXIgdGltZUJ1ZmZlcls2NF07DQogICAgY3RpbWVfcyh0aW1lQnVmZmVyLCBzaXplb2YgdGltZUJ1ZmZlciwgJmN1cnJlbnRUaW1lKTsNCg0KICAgIC8qIHRpbWVzdGFtcCAqLw0KICAgIGF1dG8gbWVzc2FnZVRpbWVzdGFtcGVkID0gdGltZUJ1ZmZlciArIG1lc3NhZ2U7DQogICAgc3RkOjp3c3RyaW5nIHdTdHJpbmcgPSBzdGQ6OndzdHJpbmcobWVzc2FnZS5iZWdpbigpLCBtZXNzYWdlLmVuZCgpKTsNCg0KICAgIC8qIHNldCBtZXNzYWdlIHR5cGUuICovDQogICAgc3dpdGNoICh0eXBlKSB7DQogICAgY2FzZSBUeXBlOjpFUlI6DQogICAgICAgIHdTdHJpbmcgPSBMIihFRSkgIiArIHdTdHJpbmc7DQogICAgICAgIGJyZWFrOw0KICAgIGNhc2UgVHlwZTo6V05HOg0KICAgICAgICB3U3RyaW5nID0gTCIoV1cpICIgKyB3U3RyaW5nOw0KICAgICAgICBicmVhazsNCiAgICAgICAgLypjYXNlIFR5cGU6Om1lc3NhZ2U6Ki8NCiAgICB9DQoNCiAgICAvKiBzY3JlZW4gaXQgaW50byBWUyBkZWJ1ZyBjb25zb2xlICovDQogICAgT3V0cHV0RGVidWdTdHJpbmcod1N0cmluZy5jX3N0cigpKTsNCg0KICAgIC8qIGZpcmUgdGhlIGV2ZW50LiAqLw0KICAgIG1lc3NhZ2VUb1NjcmVlbihyZWYgbmV3IFN0cmluZyh3U3RyaW5nLmNfc3RyKCksIHdTdHJpbmcubGVuZ3RoKCkpKTsNCn0=