LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjF4eF9oYWxfdGltZWJhc2VfcnRjX2FsYXJtX3RlbXBsYXRlLmMgDQogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiAgKiBAdmVyc2lvbiBWMS4xLjENCiAgKiBAZGF0ZSAgICAxMi1NYXktMjAxNw0KICAqIEBicmllZiAgIEhBTCB0aW1lIGJhc2UgYmFzZWQgb24gdGhlIGhhcmR3YXJlIFJUQ19BTEFSTS4NCiAgKg0KICAqICAgICAgICAgIFRoaXMgZmlsZSBvdmVycmlkZSB0aGUgbmF0aXZlIEhBTCB0aW1lIGJhc2UgZnVuY3Rpb25zIChkZWZpbmVkIGFzIHdlYWspDQogICogICAgICAgICAgdG8gdXNlIHRoZSBSVEMgQUxBUk0gZm9yIHRpbWUgYmFzZSBnZW5lcmF0aW9uOg0KICAqICAgICAgICAgICArIEludGlhbGl6ZXMgdGhlIFJUQyBwZXJpcGhlcmFsIHRvIGluY3JlbWVudCB0aGUgc2Vjb25kcyByZWdpc3RlcnMgZWFjaCAxbXMNCiAgKiAgICAgICAgICAgKyBUaGUgYWxhcm0gaXMgY29uZmlndXJlZCB0byBhc3NlcnQgYW4gaW50ZXJydXB0IHdoZW4gdGhlIFJUQyByZWFjaGVzIDFtcyANCiAgKiAgICAgICAgICAgKyBIQUxfSW5jVGljayBpcyBjYWxsZWQgYXQgZWFjaCBBbGFybSBldmVudCBhbmQgdGhlIHRpbWUgaXMgcmVzZXQgdG8gMDA6MDA6MDANCiAgKiAgICAgICAgICAgKyBIU0UgKGRlZmF1bHQpLCBMU0Ugb3IgTFNJIGNhbiBiZSBzZWxlY3RlZCBhcyBSVEMgY2xvY2sgc291cmNlICANCiBAdmVyYmF0aW0NCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjDQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIFsuLl0NCiAgICBUaGlzIGZpbGUgbXVzdCBiZSBjb3BpZWQgdG8gdGhlIGFwcGxpY2F0aW9uIGZvbGRlciBhbmQgbW9kaWZpZWQgYXMgZm9sbG93czoNCiAgICAoIykgUmVuYW1lIGl0IHRvICdzdG0zMmYxeHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybS5jJw0KICAgICgjKSBBZGQgdGhpcyBmaWxlIGFuZCB0aGUgUlRDIEhBTCBkcml2ZXJzIHRvIHlvdXIgcHJvamVjdCBhbmQgdW5jb21tZW50DQogICAgICAgSEFMX1JUQ19NT0RVTEVfRU5BQkxFRCBkZWZpbmUgaW4gc3RtMzJmMXh4X2hhbF9jb25mLmggDQoNCiAgICBbLi5dDQogICAgKEApIEhBTCBSVEMgYWxhcm0gYW5kIEhBTCBSVEMgd2FrZXVwIGRyaXZlcnMgY2FuknQgYmUgdXNlZCB3aXRoIGxvdyBwb3dlciBtb2RlczoNCiAgICAgICAgVGhlIHdha2UgdXAgY2FwYWJpbGl0eSBvZiB0aGUgUlRDIG1heSBiZSBpbnRydXNpdmUgaW4gY2FzZSBvZiBwcmlvciBsb3cgcG93ZXIgbW9kZQ0KICAgICAgICBjb25maWd1cmF0aW9uIHJlcXVpcmluZyBkaWZmZXJlbnQgd2FrZSB1cCBzb3VyY2VzLg0KICAgICAgICBBcHBsaWNhdGlvbi9FeGFtcGxlIGJlaGF2aW9yIGlzIG5vIG1vcmUgZ3VhcmFudGVlZCANCiAgICAoQCkgVGhlIHN0bTMyZjF4eF9oYWxfdGltZWJhc2VfdGltIHVzZSBpcyByZWNvbW1lbmRlZCBmb3IgdGhlIEFwcGxpY2F0aW9ucy9FeGFtcGxlcw0KICAgICAgICAgIHJlcXVpcmluZyBsb3cgcG93ZXIgbW9kZXMNCg0KICBAZW5kdmVyYmF0aW0NCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICogQGF0dGVudGlvbg0KICAqDQogICogPGgyPjxjZW50ZXI+JmNvcHk7IENPUFlSSUdIVChjKSAyMDE3IFNUTWljcm9lbGVjdHJvbmljczwvY2VudGVyPjwvaDI+DQogICoNCiAgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQgbW9kaWZpY2F0aW9uLA0KICAqIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoNCiAgKiAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQogICogICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsDQogICogICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uDQogICogICAgICBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCiAgKiAgIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgU1RNaWNyb2VsZWN0cm9uaWNzIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycw0KICAqICAgICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlDQogICogICAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCiAgKg0KICAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIg0KICAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUNCiAgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUNCiAgKiBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFDQogICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwNCiAgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUg0KICAqIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSDQogICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwNCiAgKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQ0KICAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQogICoNCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICovDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAic3RtMzJmMXh4X2hhbC5oIg0KLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjF4eF9IQUxfRHJpdmVyDQogICogQHsNCiAgKi8NCg0KLyoqIEBkZWZncm91cCBIQUxfVGltZUJhc2VfUlRDX0FsYXJtX1RlbXBsYXRlICBIQUwgVGltZUJhc2UgUlRDIEFsYXJtIFRlbXBsYXRlDQogICogQHsNCiAgKi8NCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIFJUQyBDbG9jayBzb3VyY2UgZm9yIHlvdXIgYXBwbGljYXRpb246DQogICsgUlRDX0NMT0NLX1NPVVJDRV9IU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHJlcXVpcmluZyB0aW1pbmcgcHJlY2lzaW9uLg0KICArIFJUQ19DTE9DS19TT1VSQ0VfTFNFOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxvdyBjb25zdHJhaW50IG9uIHRpbWluZw0KICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24uDQogICsgUlRDX0NMT0NLX1NPVVJDRV9MU0k6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbi4NCiAgKi8NCiNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9IU0UNCi8qICNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9MU0UgKi8NCi8qICNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9MU0kgKi8NCg0KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpSVENfSGFuZGxlVHlwZURlZiAgICAgICAgaFJUQ19IYW5kbGU7DQovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0Kdm9pZCBSVENfQWxhcm1fSVJRSGFuZGxlcih2b2lkKTsNCi8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKg0KICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBSVENfQUxBUk1BIGFzIGEgdGltZSBiYXNlIHNvdXJjZS4gDQogICogICAgICAgICBUaGUgdGltZSBzb3VyY2UgaXMgY29uZmlndXJlZCAgdG8gaGF2ZSAxbXMgdGltZSBiYXNlIHdpdGggYSBkZWRpY2F0ZWQgDQogICogICAgICAgICBUaWNrIGludGVycnVwdCBwcmlvcml0eS4gDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgYXV0b21hdGljYWxseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHByb2dyYW0gYWZ0ZXINCiAgKiAgICAgICAgIHJlc2V0IGJ5IEhBTF9Jbml0KCkgb3IgYXQgYW55IHRpbWUgd2hlbiBjbG9jayBpcyBjb25maWd1cmVkLCBieSBIQUxfUkNDX0Nsb2NrQ29uZmlnKCkuDQogICogQHBhcmFtICBUaWNrUHJpb3JpdHk6IFRpY2sgaW50ZXJydXB0IHByaW9yaXR5Lg0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0luaXRUaWNrICh1aW50MzJfdCBUaWNrUHJpb3JpdHkpDQp7DQogIF9fSU8gdWludDMyX3QgY291bnRlciA9IDBVOw0KDQogIFJDQ19Pc2NJbml0VHlwZURlZiAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3Q7DQogIFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAgUGVyaXBoQ2xrSW5pdFN0cnVjdDsNCg0KI2lmZGVmIFJUQ19DTE9DS19TT1VSQ0VfTFNFDQogIC8qIENvbmZpZ3VlIExTRSBhcyBSVEMgY2xvY2sgc291Y3JlICovDQogIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTRTsNCiAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOw0KICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0VTdGF0ZSA9IFJDQ19MU0VfT047DQogIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0xTRTsNCiNlbGlmIGRlZmluZWQgKFJUQ19DTE9DS19TT1VSQ0VfTFNJKQ0KICAvKiBDb25maWd1ZSBMU0kgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLw0KICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9MU0k7DQogIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsNCiAgUkNDX09zY0luaXRTdHJ1Y3QuTFNJU3RhdGUgPSBSQ0NfTFNJX09OOw0KICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9MU0k7DQojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0hTRSkNCiAgLyogQ29uZmlndWUgSFNFIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8NCiAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFOw0KICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7DQogIFJDQ19Pc2NJbml0U3RydWN0LkhTRVN0YXRlID0gUkNDX0hTRV9PTjsNCiAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfSFNFX0RJVjEyODsNCiNlbHNlDQojZXJyb3IgUGxlYXNlIHNlbGVjdCB0aGUgUlRDIENsb2NrIHNvdXJjZQ0KI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovDQoNCiAgaWYoSEFMX1JDQ19Pc2NDb25maWcoJlJDQ19Pc2NJbml0U3RydWN0KSA9PSBIQUxfT0spDQogIHsNCiAgICBQZXJpcGhDbGtJbml0U3RydWN0LlBlcmlwaENsb2NrU2VsZWN0aW9uID0gUkNDX1BFUklQSENMS19SVEM7DQogICAgaWYoSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygmUGVyaXBoQ2xrSW5pdFN0cnVjdCkgPT0gSEFMX09LKQ0KICAgIHsNCiAgICAgIC8qIEVuYWJsZSBSVEMgQ2xvY2sgKi8NCiAgICAgIF9fSEFMX1JDQ19SVENfRU5BQkxFKCk7DQoNCiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlID0gUlRDOw0KICAgICAgLyogQ29uZmlndXJlIFJUQyB0aW1lIGJhc2UgdG8gMTBLaHogKi8NCiAgICAgIGhSVENfSGFuZGxlLkluaXQuQXN5bmNoUHJlZGl2ID0gIChIQUxfUkNDRXhfR2V0UGVyaXBoQ0xLRnJlcShSQ0NfUEVSSVBIQ0xLX1JUQykgLyAxMDAwMCkgLSAxOw0KICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXQgPSBSVENfT1VUUFVUU09VUkNFX05PTkU7DQogICAgICBIQUxfUlRDX0luaXQoJmhSVENfSGFuZGxlKTsNCg0KICAgICAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLw0KICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7DQoNCiAgICAgIC8qIENsZWFyIGZsYWcgYWxhcm0gQSAqLw0KICAgICAgX19IQUxfUlRDX0FMQVJNX0NMRUFSX0ZMQUcoJmhSVENfSGFuZGxlLCBSVENfRkxBR19BTFJBRik7DQoNCiAgICAgIGNvdW50ZXIgPSAwVTsNCiAgICAgIC8qIFdhaXQgdGlsbCBSVEMgQUxSQUYgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLw0KICAgICAgd2hpbGUoX19IQUxfUlRDX0FMQVJNX0dFVF9GTEFHKCZoUlRDX0hhbmRsZSwgUlRDX0ZMQUdfQUxSQUYpICE9IFJFU0VUKQ0KICAgICAgew0KICAgICAgICBpZihjb3VudGVyKysgPT0gU3lzdGVtQ29yZUNsb2NrIC80OFUpIC8qIFRpbWVvdXQgPSB+IDFzICovDQogICAgICAgIHsNCiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KICAgICAgICB9DQogICAgICB9DQoNCiAgICAgIC8qIFNldCBSVEMgQ09VTlRFUiBNU0Igd29yZCAqLw0KICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkFMUkggPSAweDAwVTsNCiAgICAgIC8qIFNldCBSVEMgQ09VTlRFUiBMU0Igd29yZCAqLw0KICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkFMUkwgPSAweDA5VTsNCg0KICAgICAgLyogUlRDIEFsYXJtIEludGVycnVwdCBDb25maWd1cmF0aW9uOiBFWFRJIGNvbmZpZ3VyYXRpb24gKi8NCiAgICAgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9JVCgpOw0KICAgICAgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7DQoNCiAgICAgIC8qIENsZWFyIFNlY29uZCBhbmQgb3ZlcmZsb3cgZmxhZ3MgKi8NCiAgICAgIENMRUFSX0JJVChoUlRDX0hhbmRsZS5JbnN0YW5jZS0+Q1JMLCAoUlRDX0ZMQUdfU0VDIHwgUlRDX0ZMQUdfT1cpKTsNCg0KICAgICAgLyogU2V0IFJUQyBDT1VOVEVSIE1TQiB3b3JkICovDQogICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+Q05USCA9IDB4MDBVOw0KICAgICAgLyogU2V0IFJUQyBDT1VOVEVSIExTQiB3b3JkICovDQogICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+Q05UTCA9IDB4MDBVOw0KDQogICAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIGludGVycnVwdCAqLw0KICAgICAgX19IQUxfUlRDX0FMQVJNX0VOQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsNCg0KICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovDQogICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOw0KDQogICAgICAvKiBXYWl0IHRpbGwgUlRDIGlzIGluIElOSVQgc3RhdGUgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLw0KICAgICAgY291bnRlciA9IDBVOw0KICAgICAgd2hpbGUoKGhSVENfSGFuZGxlLkluc3RhbmNlLT5DUkwgJiBSVENfQ1JMX1JUT0ZGKSA9PSAodWludDMyX3QpUkVTRVQpDQogICAgICB7DQogICAgICAgIGlmKGNvdW50ZXIrKyA9PSBTeXN0ZW1Db3JlQ2xvY2sgLzQ4VSkgLyogVGltZW91dCA9IH4gMXMgKi8NCiAgICAgICAgew0KICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7DQogICAgICAgIH0NCiAgICAgIH0NCg0KICAgICAgSEFMX05WSUNfU2V0UHJpb3JpdHkoUlRDX0FsYXJtX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOw0KICAgICAgSEFMX05WSUNfRW5hYmxlSVJRKFJUQ19BbGFybV9JUlFuKTsNCiAgICAgIHJldHVybiBIQUxfT0s7DQogICAgfQ0KICB9DQogIHJldHVybiBIQUxfRVJST1I7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU3VzcGVuZCBUaWNrIGluY3JlbWVudC4NCiAgKiBAbm90ZSAgIERpc2FibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IGRpc2FibGluZyBSVEMgQUxBUk0gaW50ZXJydXB0Lg0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBIQUxfU3VzcGVuZFRpY2sodm9pZCkNCnsNCiAgLyogRGlzYWJsZSBSVEMgQUxBUk0gdXBkYXRlIEludGVycnVwdCAqLw0KICBfX0hBTF9SVENfQUxBUk1fRElTQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZXN1bWUgVGljayBpbmNyZW1lbnQuDQogICogQG5vdGUgICBFbmFibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IEVuYWJsaW5nIFJUQyBBTEFSTSBpbnRlcnJ1cHQuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEhBTF9SZXN1bWVUaWNrKHZvaWQpDQp7DQogIF9fSU8gdWludDMyX3QgY291bnRlciA9IDBVOw0KDQogIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8NCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7DQoNCiAgLyogU2V0IFJUQyBDT1VOVEVSIE1TQiB3b3JkICovDQogIGhSVENfSGFuZGxlLkluc3RhbmNlLT5DTlRIID0gMHgwMFU7DQogIC8qIFNldCBSVEMgQ09VTlRFUiBMU0Igd29yZCAqLw0KICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+Q05UTCA9IDB4MDBVOw0KDQogIC8qIENsZWFyIFNlY29uZCBhbmQgb3ZlcmZsb3cgZmxhZ3MgKi8NCiAgQ0xFQVJfQklUKGhSVENfSGFuZGxlLkluc3RhbmNlLT5DUkwsIChSVENfRkxBR19TRUMgfCBSVENfRkxBR19PVyB8IFJUQ19GTEFHX0FMUkFGKSk7DQoNCiAgLyogRW5hYmxlIFJUQyBBTEFSTSBVcGRhdGUgaW50ZXJydXB0ICovDQogIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7DQoNCiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovDQogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7DQoNCiAgLyogV2FpdCB0aWxsIFJUQyBpcyBpbiBJTklUIHN0YXRlIGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8NCiAgd2hpbGUoKGhSVENfSGFuZGxlLkluc3RhbmNlLT5DUkwgJiBSVENfQ1JMX1JUT0ZGKSA9PSAodWludDMyX3QpUkVTRVQpDQogIHsNCiAgICBpZihjb3VudGVyKysgPT0gU3lzdGVtQ29yZUNsb2NrIC80OFUpIC8qIFRpbWVvdXQgPSB+IDFzICovDQogICAgew0KICAgICAgYnJlYWs7DQogICAgfQ0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQUxBUk0gQSBFdmVudCBDYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZQ0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIHdoZW4gUlRDX0FMQVJNIGludGVycnVwdCB0b29rIHBsYWNlLCBpbnNpZGUNCiAgKiBSVENfQUxBUk1fSVJRSGFuZGxlcigpLiBJdCBtYWtlcyBhIGRpcmVjdCBjYWxsIHRvIEhBTF9JbmNUaWNrKCkgdG8gaW5jcmVtZW50DQogICogYSBnbG9iYWwgdmFyaWFibGUgInV3VGljayIgdXNlZCBhcyBhcHBsaWNhdGlvbiB0aW1lIGJhc2UuDQogICogQHBhcmFtICBocnRjIDogUlRDIGhhbmRsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBIQUxfUlRDX0FsYXJtQUV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpDQp7DQogIF9fSU8gdWludDMyX3QgY291bnRlciA9IDBVOw0KDQogIEhBTF9JbmNUaWNrKCk7DQoNCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOw0KDQogIC8qIFNldCBSVEMgQ09VTlRFUiBNU0Igd29yZCAqLw0KICBXUklURV9SRUcoaHJ0Yy0+SW5zdGFuY2UtPkNOVEgsIDB4MDBVKTsNCiAgLyogU2V0IFJUQyBDT1VOVEVSIExTQiB3b3JkICovDQogIFdSSVRFX1JFRyhocnRjLT5JbnN0YW5jZS0+Q05UTCwgMHgwMFUpOw0KDQogIC8qIENsZWFyIFNlY29uZCBhbmQgb3ZlcmZsb3cgZmxhZ3MgKi8NCiAgQ0xFQVJfQklUKGhydGMtPkluc3RhbmNlLT5DUkwsIChSVENfRkxBR19TRUMgfCBSVENfRkxBR19PVykpOw0KDQogIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLw0KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsNCg0KICAvKiBXYWl0IHRpbGwgUlRDIGlzIGluIElOSVQgc3RhdGUgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLw0KICB3aGlsZSgoaHJ0Yy0+SW5zdGFuY2UtPkNSTCAmIFJUQ19DUkxfUlRPRkYpID09ICh1aW50MzJfdClSRVNFVCkNCiAgew0KICAgIGlmKGNvdW50ZXIrKyA9PSBTeXN0ZW1Db3JlQ2xvY2sgLzQ4VSkgLyogVGltZW91dCA9IH4gMXMgKi8NCiAgICB7DQogICAgICBicmVhazsNCiAgICB9DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgUlRDIEFMQVJNIGludGVycnVwdCByZXF1ZXN0Lg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSVENfQWxhcm1fSVJRSGFuZGxlcih2b2lkKQ0Kew0KICBIQUxfUlRDX0FsYXJtSVJRSGFuZGxlcigmaFJUQ19IYW5kbGUpOw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K