LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjR4eF9oYWxfdGltZWJhc2VfcnRjX2FsYXJtX3RlbXBsYXRlLmMgDQogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiAgKiBAdmVyc2lvbiBWMS43LjANCiAgKiBAZGF0ZSAgICAxNy1GZWJydWFyeS0yMDE3DQogICogQGJyaWVmICAgSEFMIHRpbWUgYmFzZSBiYXNlZCBvbiB0aGUgaGFyZHdhcmUgUlRDX0FMQVJNIFRlbXBsYXRlLg0KICAqDQogICogICAgICAgICAgVGhpcyBmaWxlIG92ZXJyaWRlIHRoZSBuYXRpdmUgSEFMIHRpbWUgYmFzZSBmdW5jdGlvbnMgKGRlZmluZWQgYXMgd2VhaykNCiAgKiAgICAgICAgICB0byB1c2UgdGhlIFJUQyBBTEFSTSBmb3IgdGltZSBiYXNlIGdlbmVyYXRpb246DQogICogICAgICAgICAgICsgSW50aWFsaXplcyB0aGUgUlRDIHBlcmlwaGVyYWwgdG8gaW5jcmVtZW50IHRoZSBzZWNvbmRzIHJlZ2lzdGVycyBlYWNoIDFtcw0KICAqICAgICAgICAgICArIFRoZSBhbGFybSBpcyBjb25maWd1cmVkIHRvIGFzc2VydCBhbiBpbnRlcnJ1cHQgd2hlbiB0aGUgUlRDIHJlYWNoZXMgMW1zIA0KICAqICAgICAgICAgICArIEhBTF9JbmNUaWNrIGlzIGNhbGxlZCBhdCBlYWNoIEFsYXJtIGV2ZW50IGFuZCB0aGUgdGltZSBpcyByZXNldCB0byAwMDowMDowMA0KICAqICAgICAgICAgICArIEhTRSAoZGVmYXVsdCksIExTRSBvciBMU0kgY2FuIGJlIHNlbGVjdGVkIGFzIFJUQyBjbG9jayBzb3VyY2UgIA0KIEB2ZXJiYXRpbQ0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMNCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgWy4uXQ0KICAgIFRoaXMgZmlsZSBtdXN0IGJlIGNvcGllZCB0byB0aGUgYXBwbGljYXRpb24gZm9sZGVyIGFuZCBtb2RpZmllZCBhcyBmb2xsb3dzOg0KICAgICgjKSBSZW5hbWUgaXQgdG8gJ3N0bTMyZjR4eF9oYWxfdGltZWJhc2VfcnRjX2FsYXJtLmMnDQogICAgKCMpIEFkZCB0aGlzIGZpbGUgYW5kIHRoZSBSVEMgSEFMIGRyaXZlcnMgdG8geW91ciBwcm9qZWN0IGFuZCB1bmNvbW1lbnQNCiAgICAgICBIQUxfUlRDX01PRFVMRV9FTkFCTEVEIGRlZmluZSBpbiBzdG0zMmY0eHhfaGFsX2NvbmYuaCANCg0KICAgIFsuLl0NCiAgICAoQCkgSEFMIFJUQyBhbGFybSBhbmQgSEFMIFJUQyB3YWtldXAgZHJpdmVycyBjYW6SdCBiZSB1c2VkIHdpdGggbG93IHBvd2VyIG1vZGVzOg0KICAgICAgICBUaGUgd2FrZSB1cCBjYXBhYmlsaXR5IG9mIHRoZSBSVEMgbWF5IGJlIGludHJ1c2l2ZSBpbiBjYXNlIG9mIHByaW9yIGxvdyBwb3dlciBtb2RlDQogICAgICAgIGNvbmZpZ3VyYXRpb24gcmVxdWlyaW5nIGRpZmZlcmVudCB3YWtlIHVwIHNvdXJjZXMuDQogICAgICAgIEFwcGxpY2F0aW9uL0V4YW1wbGUgYmVoYXZpb3IgaXMgbm8gbW9yZSBndWFyYW50ZWVkIA0KICAgIChAKSBUaGUgc3RtMzJmNHh4X2hhbF90aW1lYmFzZV90aW0gdXNlIGlzIHJlY29tbWVuZGVkIGZvciB0aGUgQXBwbGljYXRpb25zL0V4YW1wbGVzDQogICAgICAgICAgcmVxdWlyaW5nIGxvdyBwb3dlciBtb2Rlcw0KDQogIEBlbmR2ZXJiYXRpbQ0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiBAYXR0ZW50aW9uDQogICoNCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCiAgKg0KICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sDQogICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0Og0KICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCiAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24NCiAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0KICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzDQogICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUNCiAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KICAqDQogICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiDQogICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQ0KICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQ0KICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUNCiAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTA0KICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SDQogICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVINCiAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLA0KICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQogICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAgKg0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKi8NCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmY0eHhfaGFsLmgiDQovKiogQGFkZHRvZ3JvdXAgU1RNMzJGNHh4X0hBTF9Ecml2ZXINCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIEhBTF9UaW1lQmFzZV9SVENfQWxhcm1fVGVtcGxhdGUgIEhBTCBUaW1lQmFzZSBSVEMgQWxhcm0gVGVtcGxhdGUNCiAgKiBAew0KICAqLyANCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIFJUQyBDbG9jayBzb3VyY2UgZm9yIHlvdXIgYXBwbGljYXRpb246IA0KICArIFJUQ19DTE9DS19TT1VSQ0VfSFNFOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyByZXF1aXJpbmcgdGltaW5nIHByZWNpc2lvbi4NCiAgKyBSVENfQ0xPQ0tfU09VUkNFX0xTRTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsb3cgY29uc3RyYWludCBvbiB0aW1pbmcNCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLg0KICArIFJUQ19DTE9DS19TT1VSQ0VfTFNJOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxvdyBjb25zdHJhaW50IG9uIHRpbWluZw0KICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24uDQogICovDQojZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfSFNFDQovKiAjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovDQovKiAjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNJICovDQoNCiNpZmRlZiBSVENfQ0xPQ0tfU09VUkNFX0hTRQ0KICAjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDk5VQ0KICAjZGVmaW5lIFJUQ19TWU5DSF9QUkVESVYgICAgICAgIDlVDQogICNkZWZpbmUgUkNDX1JUQ0NMS1NPVVJDRV8xTUhaICAgKCh1aW50MzJfdCkoKHVpbnQzMl90KVJDQ19CRENSX1JUQ1NFTCB8ICh1aW50MzJfdCkoKEhTRV9WQUxVRS8xMDAwMDAwVSkgPDwgMTZVKSkpDQojZWxzZSAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTRSB8fCBSVENfQ0xPQ0tfU09VUkNFX0xTSSAqLw0KICAjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDBVDQogICNkZWZpbmUgUlRDX1NZTkNIX1BSRURJViAgICAgICAgMzFVDQojZW5kaWYgLyogUlRDX0NMT0NLX1NPVVJDRV9IU0UgKi8NCg0KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpSVENfSGFuZGxlVHlwZURlZiAgICAgICAgaFJUQ19IYW5kbGU7DQovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0Kdm9pZCBSVENfQWxhcm1fSVJRSGFuZGxlcih2b2lkKTsNCi8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKg0KICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBSVENfQUxBUk1BIGFzIGEgdGltZSBiYXNlIHNvdXJjZS4gDQogICogICAgICAgICBUaGUgdGltZSBzb3VyY2UgaXMgY29uZmlndXJlZCAgdG8gaGF2ZSAxbXMgdGltZSBiYXNlIHdpdGggYSBkZWRpY2F0ZWQgDQogICogICAgICAgICBUaWNrIGludGVycnVwdCBwcmlvcml0eS4gDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgYXV0b21hdGljYWxseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHByb2dyYW0gYWZ0ZXINCiAgKiAgICAgICAgIHJlc2V0IGJ5IEhBTF9Jbml0KCkgb3IgYXQgYW55IHRpbWUgd2hlbiBjbG9jayBpcyBjb25maWd1cmVkLCBieSBIQUxfUkNDX0Nsb2NrQ29uZmlnKCkuDQogICogQHBhcmFtICBUaWNrUHJpb3JpdHk6IFRpY2sgaW50ZXJydXB0IHByaW9yaXR5Lg0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0luaXRUaWNrICh1aW50MzJfdCBUaWNrUHJpb3JpdHkpDQp7DQogIF9fSU8gdWludDMyX3QgY291bnRlciA9IDBVOw0KDQogIFJDQ19Pc2NJbml0VHlwZURlZiAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3Q7DQogIFJDQ19QZXJpcGhDTEtJbml0VHlwZURlZiAgUGVyaXBoQ2xrSW5pdFN0cnVjdDsNCg0KI2lmZGVmIFJUQ19DTE9DS19TT1VSQ0VfTFNFDQogIC8qIENvbmZpZ3VlIExTRSBhcyBSVEMgY2xvY2sgc291Y3JlICovDQogIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTRTsNCiAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOw0KICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0VTdGF0ZSA9IFJDQ19MU0VfT047DQogIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0xTRTsNCiNlbGlmIGRlZmluZWQgKFJUQ19DTE9DS19TT1VSQ0VfTFNJKQ0KICAvKiBDb25maWd1ZSBMU0kgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLw0KICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9MU0k7DQogIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsNCiAgUkNDX09zY0luaXRTdHJ1Y3QuTFNJU3RhdGUgPSBSQ0NfTFNJX09OOw0KICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9MU0k7DQojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0hTRSkNCiAgLyogQ29uZmlndWUgSFNFIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8NCiAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFOw0KICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7DQogIFJDQ19Pc2NJbml0U3RydWN0LkhTRVN0YXRlID0gUkNDX0hTRV9PTjsNCiAgLyogRW5zdXJlIHRoYXQgUlRDIGlzIGNsb2NrZWQgYnkgMU1IeiAqLw0KICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV8xTUhaOw0KI2Vsc2UNCiNlcnJvciBQbGVhc2Ugc2VsZWN0IHRoZSBSVEMgQ2xvY2sgc291cmNlDQojZW5kaWYgLyogUlRDX0NMT0NLX1NPVVJDRV9MU0UgKi8NCg0KICBpZihIQUxfUkNDX09zY0NvbmZpZygmUkNDX09zY0luaXRTdHJ1Y3QpID09IEhBTF9PSykNCiAgew0KICAgIFBlcmlwaENsa0luaXRTdHJ1Y3QuUGVyaXBoQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUEVSSVBIQ0xLX1JUQzsNCiAgICBpZihIQUxfUkNDRXhfUGVyaXBoQ0xLQ29uZmlnKCZQZXJpcGhDbGtJbml0U3RydWN0KSA9PSBIQUxfT0spDQogICAgew0KICAgICAgLyogRW5hYmxlIFJUQyBDbG9jayAqLw0KICAgICAgX19IQUxfUkNDX1JUQ19FTkFCTEUoKTsNCiAgICAgIC8qIFRoZSB0aW1lIGJhc2Ugc2hvdWxkIGJlIDFtcw0KICAgICAgICAgVGltZSBiYXNlID0gKChSVENfQVNZTkNIX1BSRURJViArIDEpICogKFJUQ19TWU5DSF9QUkVESVYgKyAxKSkgLyBSVENfQ0xPQ0sgDQogICAgICAgICBIU0UgYXMgUlRDIGNsb2NrIA0KICAgICAgICAgICBUaW1lIGJhc2UgPSAoKDk5ICsgMSkgKiAoOSArIDEpKSAvIDFNSHoNCiAgICAgICAgICAgICAgICAgICAgID0gMW1zDQogICAgICAgICBMU0UgYXMgUlRDIGNsb2NrIA0KICAgICAgICAgICBUaW1lIGJhc2UgPSAoKDMxICsgMSkgKiAoMCArIDEpKSAvIDMyLjc2OEtIeg0KICAgICAgICAgICAgICAgICAgICAgPSB+MW1zDQogICAgICAgICBMU0kgYXMgUlRDIGNsb2NrIA0KICAgICAgICAgICBUaW1lIGJhc2UgPSAoKDMxICsgMSkgKiAoMCArIDEpKSAvIDMyS0h6DQogICAgICAgICAgICAgICAgICAgICA9IDFtcw0KICAgICAgKi8NCiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlID0gUlRDOw0KICAgICAgaFJUQ19IYW5kbGUuSW5pdC5Ib3VyRm9ybWF0ID0gUlRDX0hPVVJGT1JNQVRfMjQ7DQogICAgICBoUlRDX0hhbmRsZS5Jbml0LkFzeW5jaFByZWRpdiA9IFJUQ19BU1lOQ0hfUFJFRElWOw0KICAgICAgaFJUQ19IYW5kbGUuSW5pdC5TeW5jaFByZWRpdiA9IFJUQ19TWU5DSF9QUkVESVY7DQogICAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dCA9IFJUQ19PVVRQVVRfRElTQUJMRTsNCiAgICAgIGhSVENfSGFuZGxlLkluaXQuT3V0UHV0UG9sYXJpdHkgPSBSVENfT1VUUFVUX1BPTEFSSVRZX0hJR0g7DQogICAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dFR5cGUgPSBSVENfT1VUUFVUX1RZUEVfT1BFTkRSQUlOOw0KICAgICAgSEFMX1JUQ19Jbml0KCZoUlRDX0hhbmRsZSk7DQoNCiAgICAgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8NCiAgICAgIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOw0KDQogICAgICAvKiBEaXNhYmxlIHRoZSBBbGFybSBBIGludGVycnVwdCAqLw0KICAgICAgX19IQUxfUlRDX0FMQVJNQV9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7DQoNCiAgICAgIC8qIENsZWFyIGZsYWcgYWxhcm0gQSAqLw0KICAgICAgX19IQUxfUlRDX0FMQVJNX0NMRUFSX0ZMQUcoJmhSVENfSGFuZGxlLCBSVENfRkxBR19BTFJBRik7DQoNCiAgICAgIGNvdW50ZXIgPSAwVTsNCiAgICAgIC8qIFdhaXQgdGlsbCBSVEMgQUxSQVdGIGZsYWcgaXMgc2V0IGFuZCBpZiBUaW1lIG91dCBpcyByZWFjaGVkIGV4aXQgKi8NCiAgICAgIHdoaWxlKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX0FMUkFXRikgPT0gUkVTRVQpDQogICAgICB7DQogICAgICAgIGlmKGNvdW50ZXIrKyA9PSAoU3lzdGVtQ29yZUNsb2NrIC80OFUpKSAvKiBUaW1lb3V0ID0gfiAxcyAqLw0KICAgICAgICB7DQogICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsNCiAgICAgICAgfQ0KICAgICAgfQ0KDQogICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+QUxSTUFSID0gKHVpbnQzMl90KTB4MDFVOw0KDQogICAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIHN0YXRlOiBFbmFibGUgQWxhcm0gKi8NCiAgICAgIF9fSEFMX1JUQ19BTEFSTUFfRU5BQkxFKCZoUlRDX0hhbmRsZSk7DQogICAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIGludGVycnVwdCAqLw0KICAgICAgX19IQUxfUlRDX0FMQVJNX0VOQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsNCg0KICAgICAgLyogUlRDIEFsYXJtIEludGVycnVwdCBDb25maWd1cmF0aW9uOiBFWFRJIGNvbmZpZ3VyYXRpb24gKi8NCiAgICAgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9JVCgpOw0KICAgICAgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7DQoNCiAgICAgIC8qIENoZWNrIGlmIHRoZSBJbml0aWFsaXphdGlvbiBtb2RlIGlzIHNldCAqLw0KICAgICAgaWYoKGhSVENfSGFuZGxlLkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX0lOSVRGKSA9PSAodWludDMyX3QpUkVTRVQpDQogICAgICB7DQogICAgICAgIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSAqLw0KICAgICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+SVNSID0gKHVpbnQzMl90KVJUQ19JTklUX01BU0s7DQogICAgICAgIGNvdW50ZXIgPSAwVTsNCiAgICAgICAgd2hpbGUoKGhSVENfSGFuZGxlLkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX0lOSVRGKSA9PSAodWludDMyX3QpUkVTRVQpDQogICAgICAgIHsNCiAgICAgICAgICBpZihjb3VudGVyKysgPT0gKFN5c3RlbUNvcmVDbG9jayAvNDhVKSkgLyogVGltZW91dCA9IH4gMXMgKi8NCiAgICAgICAgICB7DQogICAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkRSID0gMFU7DQogICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+VFIgPSAwVTsNCg0KICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklTUiAmPSAodWludDMyX3QpflJUQ19JU1JfSU5JVDsNCg0KICAgICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovDQogICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOw0KDQogICAgICBIQUxfTlZJQ19TZXRQcmlvcml0eShSVENfQWxhcm1fSVJRbiwgVGlja1ByaW9yaXR5LCAwVSk7DQogICAgICBIQUxfTlZJQ19FbmFibGVJUlEoUlRDX0FsYXJtX0lSUW4pOw0KICAgICAgcmV0dXJuIEhBTF9PSzsNCiAgICB9DQogIH0NCiAgcmV0dXJuIEhBTF9FUlJPUjsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTdXNwZW5kIFRpY2sgaW5jcmVtZW50Lg0KICAqIEBub3RlICAgRGlzYWJsZSB0aGUgdGljayBpbmNyZW1lbnQgYnkgZGlzYWJsaW5nIFJUQyBBTEFSTSBpbnRlcnJ1cHQuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEhBTF9TdXNwZW5kVGljayh2b2lkKQ0Kew0KICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovDQogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOw0KICAvKiBEaXNhYmxlIFJUQyBBTEFSTSB1cGRhdGUgSW50ZXJydXB0ICovDQogIF9fSEFMX1JUQ19BTEFSTV9ESVNBQkxFX0lUKCZoUlRDX0hhbmRsZSwgUlRDX0lUX0FMUkEpOw0KICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8NCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZXN1bWUgVGljayBpbmNyZW1lbnQuDQogICogQG5vdGUgICBFbmFibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IEVuYWJsaW5nIFJUQyBBTEFSTSBpbnRlcnJ1cHQuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEhBTF9SZXN1bWVUaWNrKHZvaWQpDQp7DQogIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8NCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7DQogIC8qIEVuYWJsZSBSVEMgQUxBUk0gVXBkYXRlIGludGVycnVwdCAqLw0KICBfX0hBTF9SVENfQUxBUk1fRU5BQkxFX0lUKCZoUlRDX0hhbmRsZSwgUlRDX0lUX0FMUkEpOw0KICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8NCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBBTEFSTSBBIEV2ZW50IENhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgd2hlbiBSVENfQUxBUk0gaW50ZXJydXB0IHRvb2sgcGxhY2UsIGluc2lkZQ0KICAqIFJUQ19BTEFSTV9JUlFIYW5kbGVyKCkuIEl0IG1ha2VzIGEgZGlyZWN0IGNhbGwgdG8gSEFMX0luY1RpY2soKSB0byBpbmNyZW1lbnQNCiAgKiBhIGdsb2JhbCB2YXJpYWJsZSAidXdUaWNrIiB1c2VkIGFzIGFwcGxpY2F0aW9uIHRpbWUgYmFzZS4NCiAgKiBAcGFyYW0gIGhydGMgOiBSVEMgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEhBTF9SVENfQWxhcm1BRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykNCnsNCiAgX19JTyB1aW50MzJfdCBjb3VudGVyID0gMFU7DQoNCiAgSEFMX0luY1RpY2soKTsNCg0KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7DQoNCiAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBtb2RlICovDQogIGhydGMtPkluc3RhbmNlLT5JU1IgPSAodWludDMyX3QpUlRDX0lOSVRfTUFTSzsNCg0KICB3aGlsZSgoaHJ0Yy0+SW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVEYpID09ICh1aW50MzJfdClSRVNFVCkNCiAgew0KICAgIGlmKGNvdW50ZXIrKyA9PSAoU3lzdGVtQ29yZUNsb2NrIC80OFUpKSAvKiBUaW1lb3V0ID0gfiAxcyAqLw0KICAgIHsNCiAgICAgIGJyZWFrOw0KICAgIH0NCiAgfQ0KDQogIGhydGMtPkluc3RhbmNlLT5EUiA9IDBVOw0KICBocnRjLT5JbnN0YW5jZS0+VFIgPSAwVTsNCg0KICBocnRjLT5JbnN0YW5jZS0+SVNSICY9ICh1aW50MzJfdCl+UlRDX0lTUl9JTklUOw0KDQogIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLw0KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgUlRDIEFMQVJNIGludGVycnVwdCByZXF1ZXN0Lg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSVENfQWxhcm1fSVJRSGFuZGxlcih2b2lkKQ0Kew0KICBIQUxfUlRDX0FsYXJtSVJRSGFuZGxlcigmaFJUQ19IYW5kbGUpOw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K