LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIKkgMjAxNSBNaWNyb2NoaXAgVGVjaG5vbG9neSBJbmMuIGFuZCBpdHMgc3Vic2lkaWFyaWVzLg0KKiBZb3UgbWF5IHVzZSB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgZGVyaXZhdGl2ZXMgZXhjbHVzaXZlbHkgd2l0aA0KKiBNaWNyb2NoaXAgcHJvZHVjdHMuDQoqIFRISVMgU09GVFdBUkUgSVMgU1VQUExJRUQgQlkgTUlDUk9DSElQICJBUyBJUyIuDQoqIE5PIFdBUlJBTlRJRVMsIFdIRVRIRVIgRVhQUkVTUywgSU1QTElFRCBPUiBTVEFUVVRPUlksIEFQUExZIFRPIFRISVMgU09GVFdBUkUsDQoqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwNCiogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBPUiBJVFMgSU5URVJBQ1RJT04gV0lUSCBNSUNST0NISVANCiogUFJPRFVDVFMsIENPTUJJTkFUSU9OIFdJVEggQU5ZIE9USEVSIFBST0RVQ1RTLCBPUiBVU0UgSU4gQU5ZIEFQUExJQ0FUSU9OLg0KKiBJTiBOTyBFVkVOVCBXSUxMIE1JQ1JPQ0hJUCBCRSBMSUFCTEUgRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgUFVOSVRJVkUsDQoqIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBMT1NTLCBEQU1BR0UsIENPU1QgT1IgRVhQRU5TRSBPRiBBTlkgS0lORA0KKiBXSEFUU09FVkVSIFJFTEFURUQgVE8gVEhFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCwgRVZFTiBJRiBNSUNST0NISVAgSEFTDQoqIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT1IgVEhFIERBTUFHRVMgQVJFIEZPUkVTRUVBQkxFLg0KKiBUTyBUSEUgRlVMTEVTVCBFWFRFTlQgQUxMT1dFRCBCWSBMQVcsIE1JQ1JPQ0hJUCdTIFRPVEFMIExJQUJJTElUWSBPTiBBTEwNCiogQ0xBSU1TIElOIEFOWSBXQVkgUkVMQVRFRCBUTyBUSElTIFNPRlRXQVJFIFdJTEwgTk9UIEVYQ0VFRCBUSEUgQU1PVU5UIE9GDQoqIEZFRVMsIElGIEFOWSwgVEhBVCBZT1UgSEFWRSBQQUlEIERJUkVDVExZIFRPIE1JQ1JPQ0hJUCBGT1IgVEhJUyBTT0ZUV0FSRS4NCiogTUlDUk9DSElQIFBST1ZJREVTIFRISVMgU09GVFdBUkUgQ09ORElUSU9OQUxMWSBVUE9OIFlPVVIgQUNDRVBUQU5DRQ0KKiBPRiBUSEVTRSBURVJNUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQpWZXJzaW9uIENvbnRyb2wgSW5mb3JtYXRpb24gKFBlcmZvcmNlKQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQokUmV2aXNpb246ICMxICQgDQokRGF0ZVRpbWU6IDIwMTYvMDkvMjIgMDg6MDM6NDkgJCANCiRBdXRob3I6IHByYW1hbnMgJA0KTGFzdCBDaGFuZ2U6CVVwZGF0ZWQgZm9yIHRhYnMNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKiBAZmlsZSBidGltZXJfYXBpLmMNCiogXGJyaWVmIEJhc2ljIFRpbWVyIEFQSXMgU291cmNlIGZpbGUNCiogXGF1dGhvciBqdmFzYW50aA0KKiANCiogVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEJhc2ljIFRpbWVyIEFQSSBmdW5jdGlvbnMgIA0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQovKiogQGRlZmdyb3VwIEJhc2ljX1RpbWVyDQogKiAgQHsNCiAqLw0KDQojaW5jbHVkZSAiY29tbW9uX2xpYi5oIg0KI2luY2x1ZGUgImJ0aW1lci5oIg0KI2luY2x1ZGUgIi4uXHBjclxwY3IuaCINCi8vI2luY2x1ZGUgIi4uXGludGVycnVwdFxlY2lhLmgiDQoNCi8qKiBCYXNpYyBUaW1lciBTbGVlcCBSZWdpc3RlcnMgJiBCaXQgUG9zaXRpb25zICovDQpzdGF0aWMgY29uc3QgdWludDMyX3QgYnRtcl9wY3JfaWRbQlRJTUVSX01BWF9JTlNUQU5DRV0gPSB7DQogICAgUENSX0JUSU1FUjAsDQogICAgUENSX0JUSU1FUjEsDQogICAgUENSX0JUSU1FUjIsDQogICAgUENSX0JUSU1FUjMsDQogICAgUENSX0JUSU1FUjQsDQogICAgUENSX0JUSU1FUjUNCn07DQoNCiNpZmRlZiBQTElCX0JUSU1FUl9DSEVDS19JRA0KDQovKiogTG9jYWwgaGVscGVyIHRoYXQgY2hlY2tzIGlmIGxvZ2ljYWwgVGltZXIgSUQgaXMgdmFsaWQuICANCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQgDQogKiBAcmV0dXJuIHVpbnQ4X3QgTm9uLXplcm8oVkFMSUQpLCAwKEludmFsaWQpDQogKi8NCnN0YXRpYyB1aW50OF90IGJ0bXJfdmFsaWQodWludDhfdCBidGltZXJfaWQpDQp7DQogICAgaWYgKCBidGltZXJfaWQgPCAoUElEX0JUSU1FUl9NQVggKSApIHsNCiAgICAgICAgcmV0dXJuIHRydWU7DQogICAgfQ0KICAgIHJldHVybiBmYWxzZTsNCn0NCg0KI2Vsc2UNCg0KDQovKiogVGhpcyB2ZXJzaW9uIG9mIHRtcl92YWxpZCBza2lwcyBjaGVja2luZyBhbHdheXMgcmV0dXJuaW5nIDEuICANCiAqICBDb21waWxlciBtYXkgb3B0aW1pemUgaXQgb3V0Lg0KICogQHBhcmFtIGJ0aW1lcl9pZCBCYXNpYyBUaW1lciBJRCANCiAqIEByZXR1cm4gdWludDhfdCAxKFZBTElEKSANCiAqLw0Kc3RhdGljIHVpbnQ4X3QgYnRtcl92YWxpZCh1aW50OF90IGJ0aW1lcl9pZCkgeyByZXR1cm4gMTsgfQ0KDQojZW5kaWYNCg0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgICAgICAgICAgICAgQmFzaWMgVGltZXIgSW50aXRpYWxpemF0aW9uIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCi8qKiBJbml0aWFsaXplIHNwZWNpZmllZCB0aW1lcg0KICogQHBhcmFtIGJ0aW1lcl9pZCBCYXNpYyBUaW1lciBJRA0KICogQHBhcmFtIHRtcl9jbnRsIExvZ2ljYWwgZmxhZ3MgZm9yIFRpbWVyIENvbnRyb2wNCiAqIEBwYXJhbSBpbml0aWFsX2NvdW50IEluaXRpYWwgQ291bnQNCiAqIEBwYXJhbSBwcmVsb2FkX2NvdW50IFByZWxvYWQgQ291bnQNCiAqIEBub3RlIFBlcmZvcm1zIGEgc29mdCByZXNldCBvZiB0aGUgdGltZXIgYmVmb3JlIGNvbmZpZ3VyYXRpb24gDQogKi8NCnZvaWQgYnRpbWVyX2luaXQodWludDhfdCBidGltZXJfaWQsIA0KICAgICAgICAgICAgICAgdWludDE2X3QgdG1yX2NudGwsDQogICAgICAgICAgICAgICB1aW50MTZfdCBwcmVzY2FsZXIsDQogICAgICAgICAgICAgICB1aW50MzJfdCBpbml0aWFsX2NvdW50LA0KICAgICAgICAgICAgICAgdWludDMyX3QgcHJlbG9hZF9jb3VudCkNCnsgICAgDQoJIHVpbnQzMl90IHZhbHVlOyAgICANCg0KICAgIGlmIChidG1yX3ZhbGlkKGJ0aW1lcl9pZCkpIHsNCgkJCQ0KICAgICAgICBidGltZXJfcmVzZXQoYnRpbWVyX2lkKTsgDQogICAgICAgIA0KICAgICAgICAvLyBVbmdhdGUgdGltZXIgY2xvY2tzIGFuZCBwcm9ncmFtIHByZXNjYWxlDQogICAgICAgIHZhbHVlID0gKCh1aW50MzJfdClwcmVzY2FsZXIgPDwgMTYpICsgKEJUSU1FUl9DTlRMX0VOQUJMRSk7CQkJICANCiAgICAgICAgcF9idGltZXJfY3RybF93cml0ZShidGltZXJfaWQsIHZhbHVlKTsNCiAgICANCiAgICAgICAgLy8gUHJvZ3JhbSBQcmVsb2FkICYgaW5pdGlhbCBjb3VudGVyIHZhbHVlDQogICAgICAgIHBfYnRpbWVyX3ByZWxvYWRfc2V0KGJ0aW1lcl9pZCwgcHJlbG9hZF9jb3VudCk7DQogICAgICAgIHBfYnRpbWVyX2NvdW50X3NldChidGltZXJfaWQsIGluaXRpYWxfY291bnQpOwkJCQ0KICAgICAgICANCiAgICAgICAgLy8gUHJvZ3JhbSBjb250cm9sIHJlZ2lzdGVyLCBpbnRlcnJ1cHQgZW5hYmxlLCBhbmQgY2xlYXIgc3RhdHVzDQogICAgICAgIGlmICh0bXJfY250bCAmIEJUSU1FUl9DT1VOVF9VUCkgewkJCQkJDQogICAgICAgICAgICBwX2J0aW1lcl9jdHJsX2NvdW50ZXJfZGlyX3NldChidGltZXJfaWQpOyAgICAgICAgICAgIA0KICAgICAgICB9DQogICAgICAgIGlmICh0bXJfY250bCAmIEJUSU1FUl9BVVRPX1JFU1RBUlQpIHsNCiAgICAgICAgICAgIHBfYnRpbWVyX2N0cmxfYXV0b19yZXN0YXJ0X3NldChidGltZXJfaWQpOyAgICAgICAgICAgICANCiAgICAgICAgfSAgICAgICAgDQogICAgICAgIGlmICh0bXJfY250bCAmIEJUSU1FUl9JTlRfRU4pIHsJCQkJCQ0KICAgICAgICAgICAgcF9idGltZXJfaW50X2VuYWJsZV9zZXQoYnRpbWVyX2lkKTsgLy8gZW5hYmxlIGZpcnN0DQogICAgICAgICAgICBwX2J0aW1lcl9pbnRfc3RhdHVzX2NscihidGltZXJfaWQpOyAvLyBjbGVhciBzdGF0dXMgICAgICAgICAgDQogICAgICAgIH0NCiAgICB9DQp9DQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qICAgICAgICAgIEZ1bmN0aW9ucyB0byBwcm9ncmFtIGFuZCByZWFkIHRoZSBCYXNpYyBUaW1lciBDb3VudGVyICAgICAgICAgKi8NCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KLyoqIFByb2dyYW0gdGltZXIncyBjb3VudGVyIHJlZ2lzdGVyLg0KICogQHBhcmFtIGJ0aW1lcl9pZCBCYXNpYyBUaW1lciBJRA0KICogQHBhcmFtIGNvdW50IG5ldyBjb3VudGVyIHZhbHVlIA0KICogQG5vdGUgVGltZXIgaGFyZHdhcmUgbWF5IGltcGxlbWVudCBhIDE2LWJpdCBvciAzMi1iaXQgDQogKiAgICAgICBoYXJkd2FyZSBjb3VudGVyLiBJZiB0aGUgdGltZXIgaXMgMTYtYml0IG9ubHkgdGhlIGxvd2VyDQogKiAgICAgICAxNi1iaXRzIG9mIHRoZSBjb3VudCBwYXJhbXRlciBhcmUgdXNlZC4NCiAqLw0Kdm9pZCBidGltZXJfY291bnRfc2V0KHVpbnQ4X3QgYnRpbWVyX2lkLCB1aW50MzJfdCBjb3VudCkNCnsNCiAgICBpZiAoIGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSApIHsgICAgICAgDQoJCQkNCiAgICAgICAgcF9idGltZXJfY291bnRfc2V0KGJ0aW1lcl9pZCwgY291bnQpOyAgICAgICAgDQogICAgfQ0KfQ0KDQovKiogUmV0dXJuIGN1cnJlbnQgdmFsdWUgb2YgdGltZXIncyBjb3VudCByZWdpc3Rlci4NCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuIA0KICogQHJldHVybiB1aW50MzJfdCB0aW1lciBjb3VudCBtYXkgYmUgMzIgb3IgMTYgYml0cyBkZXBlbmRpbmcgDQogKiAgICAgICAgIHVwb24gdGhlIGhhcmR3YXJlLiAgVGltZXJzIDAtMyBhcmUgMTYtYml0DQogKiAgICAgICAgIGFuZCBUaW1lcnMgNC01IGFyZSAzMi1iaXQuDQogKi8NCnVpbnQzMl90IGJ0aW1lcl9jb3VudF9nZXQodWludDhfdCBidGltZXJfaWQpDQp7ICAgIA0KICAgIHVpbnQzMl90IGNudDsNCiAgICANCiAgICBjbnQgPSAwdWw7DQogICAgaWYgKCBidG1yX3ZhbGlkKGJ0aW1lcl9pZCkgKSB7ICAgICAgICANCgkJCQ0KICAgICAgICBjbnQgPSBwX2J0aW1lcl9jb3VudF9nZXQoYnRpbWVyX2lkKTsgICAgICAgIA0KICAgIH0NCiAgICANCiAgICByZXR1cm4gY250Ow0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgICAgICBGdW5jdGlvbiB0byByZWxvYWQgY291bnRlciBmcm9tIFByZWxvYWQgUmVnaXN0ZXIgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCi8qKiBGb3JjZSB0aW1lciB0byByZWxvYWQgY291bnRlciBmcm9tIHByZWxvYWQgDQogKiByZWdpc3Rlci4gIA0KICogQHBhcmFtIGJ0aW1lcl9pZCBCYXNpYyBUaW1lciBJRC4gDQogKiBAbm90ZSBIYXJkd2FyZSB3aWxsIG9ubHkgcmVsb2FkIGNvdW50ZXIgaWYgdGltZXIgaXMgcnVubmluZy4gDQogKi8NCnZvaWQgYnRpbWVyX3JlbG9hZCh1aW50OF90IGJ0aW1lcl9pZCkNCnsNCiAgICBpZiAoIGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSApIHsgICAgICAgIA0KCQkJDQogICAgICAgIGlmIChwX2J0aW1lcl9jdHJsX3N0YXJ0X2dldChidGltZXJfaWQpKSAvL0NoZWNrIGlmIHRpbWVyIGlzIHJ1bm5pbmcNCiAgICAgICAgew0KICAgICAgICAgICAgICAgIHBfYnRpbWVyX2N0cmxfcmVsb2FkX3NldChidGltZXJfaWQpOw0KICAgICAgICB9DQogICAgfQ0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgICAgICAgRnVuY3Rpb25zIGZvciBzdG9wcGluZyBhbmQgc3RhcnRpbmcgdGhlIGJhc2ljIFRpbWVyICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCi8qKiBTdGFydCB0aW1lciBjb3VudGluZy4NCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuDQogKi8NCnZvaWQgYnRpbWVyX3N0YXJ0KHVpbnQ4X3QgYnRpbWVyX2lkKQ0Kew0KICAgIGlmICggYnRtcl92YWxpZChidGltZXJfaWQpICkgew0KICAgICAgICAgICAgDQogICAgICAgIHBfYnRpbWVyX2N0cmxfc3RhcnRfc2V0KGJ0aW1lcl9pZCk7DQogICAgfQ0KfQ0KDQovKiogU3RvcCB0aW1lci4gDQogKiBAcGFyYW0gYnRpbWVyX2lkIEJhc2ljIFRpbWVyIElELiANCiAqIEBub3RlIFdoZW4gYSBzdG9wcGVkIHRpbWVyIGlzIHN0YXJ0ZWQgYWdhaW4gaXQgd2lsbCByZWxvYWQgDQogKiAgICAgICB0aGUgY291bnQgcmVnaXN0ZXIgZnJvbSBwcmVsb2FkIHZhbHVlLg0KICovDQp2b2lkIGJ0aW1lcl9zdG9wKHVpbnQ4X3QgYnRpbWVyX2lkKQ0Kew0KICAgIGlmICggYnRtcl92YWxpZChidGltZXJfaWQpICkgeyAgICAgICAgDQoJCQkNCiAgICAgICAgcF9idGltZXJfY3RybF9zdGFydF9jbHIoYnRpbWVyX2lkKTsJCQkNCiAgICAgICAgDQogICAgfQ0KfQ0KDQovKiogUmV0dXJuIHN0YXRlIG9mIHRpbWVyJ3MgU1RBUlQgYml0LiANCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuIA0KICogQHJldHVybiB1aW50OF90IDAodGltZXIgbm90IHN0YXJ0ZWQpLCAxICh0aW1lciBzdGFydGVkKQ0KICovDQp1aW50OF90IGJ0aW1lcl9pc19zdGFydGVkKHVpbnQ4X3QgYnRpbWVyX2lkKQ0KeyANCiAgICB1aW50OF90IHN0czsNCiAgICANCiAgICBzdHMgPSAwOw0KICAgIGlmICggYnRtcl92YWxpZChidGltZXJfaWQpICkgewkgIA0KIAkJCQ0KICAgICAgICBpZiAocF9idGltZXJfY3RybF9zdGFydF9nZXQoYnRpbWVyX2lkKSkJDQogICAgICAgIHsNCiAgICAgICAgICAgIHN0cyA9IDE7DQogICAgICAgIH0JCQkJCQ0KICAgIH0NCiAgICByZXR1cm4gc3RzOw0KfQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgICAgICAgICAgICBGdW5jdGlvbiB0byBwZXJmb3JtIGJhc2ljIHRpbWVyIHNvZnQgcmVzZXQgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCi8qKiBQZWZvcm0gc29mdCByZXNldCBvZiBzcGVjaWZpZWQgdGltZXIuIA0KICogQHBhcmFtIGJ0aW1lcl9pZCBCYXNpYyBUaW1lciBJRCANCiAqIEBub3RlIFNvZnQgcmVzZXQgc2V0IGFsbCByZWdpc3RlcnMgdG8gUE9SIHZhbHVlcy4NCiAqIFNwaW5zIDI1NiB0aW1lcyB3YWl0aW5nIG9uIGhhcmR3YXJlIHRvIGNsZWFyIHJlc2V0IGJpdC4gDQogKi8NCnZvaWQgYnRpbWVyX3Jlc2V0KHVpbnQ4X3QgYnRpbWVyX2lkKQ0KeyAgIA0KICAgIHVpbnQzMl90IHdhaXRfY250Ow0KICAgIHVpbnQ4X3Qgc29mdF9yZXNldF9zdHM7DQoNCiAgICBpZiAoYnRtcl92YWxpZChidGltZXJfaWQpKSB7ICAgICAgDQoJCSANCiAgICAgICAgcF9idGltZXJfY3RybF9zb2Z0X3Jlc2V0X3NldChidGltZXJfaWQpOyAgICANCg0KICAgICAgICB3YWl0X2NudCA9IDI1NnVsOw0KICAgICAgICBkbyB7DQogICAgICAgICAgICBzb2Z0X3Jlc2V0X3N0cyA9IHBfYnRpbWVyX2N0cmxfc29mdF9yZXNldF9zdHNfZ2V0KGJ0aW1lcl9pZCk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGlmICgwID09IHNvZnRfcmVzZXRfc3RzKXsgICAgICAgICAgDQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0gDQogICAgICAgIHdoaWxlICggd2FpdF9jbnQtLSApOyANCiAgICB9ICAgICAgDQp9DQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qICAgICAgICAgICAgICAgIEZ1bmN0aW9ucyB0byBoYWx0L3VuaGFsdCB0aGUgdGltZXIgY291bnRpbmcgICAgICAgICAgICAgKi8NCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KLyoqIEhhbHQgdGltZXIgY291bnRpbmcgd2l0aCBubyByZWxvYWQgb24gdW5oYWx0LiAgIA0KICogQHBhcmFtIGJ0aW1lcl9pZCBCYXNpYyBUaW1lciBJRC4gDQogKiBAbm90ZSBBIGhhbHRlZCB0aW1lciB3aWxsIG5vdCByZWxvYWQgdGhlIGNvdW50IHJlZ2lzdGVyIHdoZW4gDQogKiAgICAgICB1bmhhbHRlZCwgaXQgd2lsbCBjb250aW51ZSBjb3VudGluZyBmcm9tIHRoZSBjdXJyZW50DQogKiAgICAgICBjb3VudCB2YWx1ZS4NCiAqLw0Kdm9pZCBidGltZXJfaGFsdCh1aW50OF90IGJ0aW1lcl9pZCkNCnsNCiAgICBpZiAoIGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSApIHsNCiAJCQkNCiAgICAgICAgcF9idGltZXJfY3RybF9oYWx0X3NldChidGltZXJfaWQpOyAgICAgICAgDQogICAgfQ0KfQ0KDQovKiogVW5oYWx0IHRpbWVyIGNvdW50aW5nLiANCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuDQogKi8NCnZvaWQgYnRpbWVyX3VuaGFsdCh1aW50OF90IGJ0aW1lcl9pZCkNCnsNCiAgICBpZiAoIGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSApIHsgDQoJCQkNCiAgICAgICAgcF9idGltZXJfY3RybF9oYWx0X2NscihidGltZXJfaWQpOw0KICAgIH0NCn0NCg0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyogICAgICAgICAgICAgICAgRnVuY3Rpb25zIGZvciBCYXNpYyBUaW1lciBpbnRlcnJ1cHQgICAgICAgICAgICAgICAgICAgICAqLw0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQovKiogRW5hYmxlIHNwZWNpZmllZCB0aW1lcidzIGludGVycnVwdCBmcm9tIHRoZSBibG9jay4gDQogKiBAcGFyYW0gYnRpbWVyX2lkIEJhc2ljIFRpbWVyIElELg0KICogQHBhcmFtIGllbiBOb24temVybyBlbmFibGUgaW50ZXJydXB0IGluIHRpbWVyIGJsb2NrLCAwIA0KICogICAgICAgICAgICBkaXNhYmxlLg0KICovDQp2b2lkIGJ0aW1lcl9pbnRlcnJ1cHRfZW5hYmxlKHVpbnQ4X3QgYnRpbWVyX2lkLCB1aW50OF90IGllbikNCnsgICAgDQogICAgaWYgKGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSkgeyAgICAgIA0KCQkJDQogICAgICAgIHBfYnRpbWVyX2ludF9lbmFibGVfc2V0KGJ0aW1lcl9pZCk7DQoNCiAgICAgICAgaWYgKGllbikgew0KICAgICAgICAgICAgIHBfYnRpbWVyX2ludF9lbmFibGVfc2V0KGJ0aW1lcl9pZCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgcF9idGltZXJfaW50X2VuYWJsZV9jbHIoYnRpbWVyX2lkKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KLyoqIFJlYWQgVGltZXIgaW50ZXJydXB0IHN0YXR1cyBhbmQgY2xlYXIgaWYgc2V0IA0KICogQHBhcmFtIGJ0aW1lcl9pZCBCYXNpYyBUaW1lciBJRC4gDQogKiBAcmV0dXJuIHVpbnQ4X3QgMSAoVGltZXIgaW50ZXJydXB0IHN0YXR1cyBzZXQpIGVsc2UgMC4gDQogKiBAbm90ZSBJZiB0aW1lciBpbnRlcnJ1cHQgc3RhdHVzIGlzIHNldCB0aGVuIGNsZWFyIGl0IGJlZm9yZSANCiAqICAgICAgIHJldHVybmluZy4NCiAqLw0KdWludDhfdCBidGltZXJfaW50ZXJydXB0X3N0YXR1c19nZXRfY2xyKHVpbnQ4X3QgYnRpbWVyX2lkKQ0KeyAgICANCiAgICB1aW50OF90IHN0czsNCg0KICAgIHN0cyA9IDA7DQogICAgaWYgKGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSkgeyAgICAgICAgDQoJCQkJDQoJCQkJc3RzID0gcF9idGltZXJfaW50X3N0YXR1c19nZXQoYnRpbWVyX2lkKTsNCiAgICAgICAgaWYgKHN0cykgew0KCQkJCQlwX2J0aW1lcl9pbnRfc3RhdHVzX2NscihidGltZXJfaWQpOyAgICAgICAgICAgIA0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiBzdHM7DQp9DQoNCiNpZiAwIC8vVGVtcG9yYXJ5IGRpc2FibGUgdW50aWwgaW50ZXJydXB0IG1vZHVsZQ0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgICAgICAgICAgICAgICBGdW5jdGlvbnMgZm9yIEJhc2ljIFRpbWVyIEdJUlEgICAgICAgICAgICAgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCi8qKiBFbmFibGVzIEdJUlEgZW5hYmxlIGJpdCBmb3IgdGhlIHRpbWVyIA0KICogQHBhcmFtIGJ0aW1lcl9pZCBCYXNpYyBUaW1lciBJRC4NCiAqLw0Kdm9pZCBidGltZXJfZ2lycV9lbmFibGVfc2V0KHVpbnQ4X3QgYnRpbWVyX2lkKQ0Kew0KICAgIGlmIChidG1yX3ZhbGlkKGJ0aW1lcl9pZCkpDQogICAgew0KICAgICAgICAvL05vdGU6IEJpdCBQb3NpdGlvbiBpcyBzYW1lIGFzIFRpbWVyIElECQkJDQogICAgICAgIHBfZWNpYV9naXJxX2VuYWJsZV9zZXQoQlRJTUVSX0dJUlEsIGJ0aW1lcl9pZCk7DQogICAgfQkJDQp9DQoNCi8qKiBDbGVhcnMgR0lSUSBlbmFibGUgYml0IGZvciB0aGUgdGltZXIgDQogKiBAcGFyYW0gYnRpbWVyX2lkIEJhc2ljIFRpbWVyIElELg0KICovDQp2b2lkIGJ0aW1lcl9naXJxX2VuYWJsZV9jbHIodWludDhfdCBidGltZXJfaWQpDQp7CQ0KICAgIGlmIChidG1yX3ZhbGlkKGJ0aW1lcl9pZCkpDQogICAgewkJCQ0KICAgICAgICAvL05vdGU6IEJpdCBQb3NpdGlvbiBpcyBzYW1lIGFzIFRpbWVyIElECQkJDQogICAgICAgIHBfZWNpYV9naXJxX2VuYWJsZV9jbHIoQlRJTUVSX0dJUlEsIGJ0aW1lcl9pZCk7DQogICAgfQkNCgkJDQp9DQoNCi8qKiBSZXR1cm5zIEdJUlEgc291cmNlIGJpdCBmb3IgdGhlIHRpbWVyIA0KICogQHBhcmFtIGJ0aW1lcl9pZCBCYXNpYyBUaW1lciBJRC4NCiAqIEByZXR1cm4gdWludDhfdCAwKHNyYyBiaXQgbm90IHNldCksIE5vbi16ZXJvIChzcmMgYml0IHNldCkNCiAqLw0KdWludDhfdCBidGltZXJfZ2lycV9zcmNfZ2V0KHVpbnQ4X3QgYnRpbWVyX2lkKQ0Kew0KICAgIHVpbnQ4X3QgcmV0VmFsOw0KDQogICAgcmV0VmFsID0gMDsNCiAgICBpZiAoYnRtcl92YWxpZChidGltZXJfaWQpKQ0KICAgIHsNCiAgICAgICAgLy9Ob3RlOiBCaXQgUG9zaXRpb24gaXMgc2FtZSBhcyBUaW1lciBJRAkJCQ0KICAgICAgICByZXRWYWwgPSBwX2VjaWFfZ2lycV9zb3VyY2VfZ2V0KEJUSU1FUl9HSVJRLCBidGltZXJfaWQpOwkJCQ0KICAgIH0NCg0KICAgIHJldHVybiByZXRWYWw7DQp9DQoNCi8qKiBDbGVhcnMgR0lSUSBzb3VyY2UgYml0IGZvciB0aGUgdGltZXIgDQogKiBAcGFyYW0gYnRpbWVyX2lkIEJhc2ljIFRpbWVyIElELg0KICovDQp2b2lkIGJ0aW1lcl9naXJxX3NyY19jbHIodWludDhfdCBidGltZXJfaWQpDQp7DQogICAgaWYgKGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSkNCiAgICB7DQogICAgICAgIC8vTm90ZTogQml0IFBvc2l0aW9uIGlzIHNhbWUgYXMgVGltZXIgSUQJCQkNCiAgICAgICAgcF9lY2lhX2dpcnFfc291cmNlX2NscihCVElNRVJfR0lSUSwgYnRpbWVyX2lkKTsJCQkJDQogICAgfQkJCQ0KfQ0KDQovKiogUmV0dXJucyBHSVJRIHJlc3VsdCBiaXQgZm9yIHRoZSB0aW1lciANCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuDQogKiBAcmV0dXJuIHVpbnQ4X3QgMChyZXN1bHQgYml0IG5vdCBzZXQpLCBOb24temVybyAocmVzdWx0IGJpdCBzZXQpDQogKi8NCnVpbnQ4X3QgYnRpbWVyX2dpcnFfcmVzdWx0X2dldCh1aW50OF90IGJ0aW1lcl9pZCkNCnsNCiAgICB1aW50OF90IHJldFZhbDsNCg0KICAgIHJldFZhbCA9IDA7DQogICAgaWYgKGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSkNCiAgICB7DQogICAgICAgIC8vTm90ZTogQml0IFBvc2l0aW9uIGlzIHNhbWUgYXMgVGltZXIgSUQJCQkNCiAgICAgICAgcmV0VmFsID0gcF9lY2lhX2dpcnFfcmVzdWx0X2dldChCVElNRVJfR0lSUSwgYnRpbWVyX2lkKTsJCQkNCiAgICB9DQoNCiAgICByZXR1cm4gcmV0VmFsOwkJCQ0KfQ0KI2VuZGlmDQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qICAgICAgICAgICAgICAgIEZ1bmN0aW9ucyBmb3IgQmFzaWMgVGltZXIgU2xlZXAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KLyoqIEVuYWJsZS9EaXNhYmxlIGNsb2NrIGdhdGluZyBvbiBpZGxlIG9mIGEgdGltZXIgIA0KICogQHBhcmFtIGJ0aW1lcl9pZCBCYXNpYyBUaW1lciBJRC4NCiAqIEBwYXJhbSBzbGVlcF9lbiAxID0gU2xlZXAgZW5hYmxlLCAwID0gU2xlZXAgZGlzYWJsZQ0KICovDQp2b2lkIGJ0aW1lcl9zbGVlcCh1aW50OF90IGJ0aW1lcl9pZCwgdWludDhfdCBzbGVlcF9lbikNCnsNCiAgICB1aW50MzJfdCBwY3JfYmxrX2lkOw0KCQkNCiAgICBpZiAoIGJ0bXJfdmFsaWQoYnRpbWVyX2lkKSApIA0KICAgIHsJCQkJDQogICAgICAgIHBjcl9ibGtfaWQgPSBidG1yX3Bjcl9pZFtidGltZXJfaWRdOwkJCQ0KCQkJDQogICAgICAgIHBjcl9zbGVlcF9lbmFibGUocGNyX2Jsa19pZCwgc2xlZXBfZW4pOyAgICAgICAgDQogICAgfQ0KfQ0KDQovKiogUmV0dXJucyBjbGsgcmVxdWlyZWQgc3RhdHVzIGZvciB0aGUgdGltZXIgYmxvY2sNCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuDQogKiBAcmV0dXJuIE5vbi16ZXJvIGlmIGNsayByZXF1aXJlZCwgZWxzZSAwDQogKi8NCnVpbnQzMl90IGJ0aW1lcl9jbGtfcmVxZF9zdHNfZ2V0KHVpbnQ4X3QgYnRpbWVyX2lkKQ0Kew0KICAgIHVpbnQzMl90IHJldFZhbDsNCiAgICB1aW50MzJfdCBwY3JfYmxrX2lkOw0KICAgIAkNCiAgICByZXRWYWwgPSAwdWw7ICAgDQogICAgaWYgKCBidG1yX3ZhbGlkKGJ0aW1lcl9pZCkgKSANCiAgICB7CQkJDQogICAgICAgIHBjcl9ibGtfaWQgPSBidG1yX3Bjcl9pZFtidGltZXJfaWRdOw0KICAgICAgICANCiAgICAgICAgcmV0VmFsID0gcGNyX2Nsb2NrX3JlcWRfc3RhdHVzX2dldChwY3JfYmxrX2lkKTsJCQkgICAgICAgDQogICAgfQ0KCQkNCiAgICByZXR1cm4gcmV0VmFsOw0KfQ0KDQovKiogRW5hYmxlL0Rpc2FibGUgcmVzZXQgb24gc2xlZXAgZm9yIHRoZSB0aW1lciBibG9jayANCiAqIEBwYXJhbSBidGltZXJfaWQgQmFzaWMgVGltZXIgSUQuDQogKiBAcGFyYW0gcmVzZXRfZW4gMSB0byBlbmFibGUsIDAgdG8gZGlzYWJsZQ0KICovDQp2b2lkIGJ0aW1lcl9yZXNldF9vbl9zbGVlcCh1aW50OF90IGJ0aW1lcl9pZCwgdWludDhfdCByZXNldF9lbikNCnsNCiAgICB1aW50MzJfdCBwY3JfYmxrX2lkOyAgIA0KICAgIA0KICAgIGlmICggYnRtcl92YWxpZChidGltZXJfaWQpICkgDQogICAgewkJCQ0KICAgICAgICBwY3JfYmxrX2lkID0gYnRtcl9wY3JfaWRbYnRpbWVyX2lkXTsNCiAgICANCiAgICAgICAgcGNyX3Jlc2V0X2VuYWJsZShwY3JfYmxrX2lkLCByZXNldF9lbik7CQkJDQogICAgfQ0KfQ0KDQovKiBlbmQgYnRpbWVyX2FwaS5jICovDQoNCi8qKiAgIEB9IC8vUGVyaXBoZXJhbCBCYXNpY19UaW1lcg0KICovDQo=