LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIKkgMjAxNSBNaWNyb2NoaXAgVGVjaG5vbG9neSBJbmMuIGFuZCBpdHMgc3Vic2lkaWFyaWVzLg0KKiBZb3UgbWF5IHVzZSB0aGlzIHNvZnR3YXJlIGFuZCBhbnkgZGVyaXZhdGl2ZXMgZXhjbHVzaXZlbHkgd2l0aA0KKiBNaWNyb2NoaXAgcHJvZHVjdHMuDQoqIFRISVMgU09GVFdBUkUgSVMgU1VQUExJRUQgQlkgTUlDUk9DSElQICJBUyBJUyIuDQoqIE5PIFdBUlJBTlRJRVMsIFdIRVRIRVIgRVhQUkVTUywgSU1QTElFRCBPUiBTVEFUVVRPUlksIEFQUExZIFRPIFRISVMgU09GVFdBUkUsDQoqIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5USUVTIE9GIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwNCiogQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLCBPUiBJVFMgSU5URVJBQ1RJT04gV0lUSCBNSUNST0NISVANCiogUFJPRFVDVFMsIENPTUJJTkFUSU9OIFdJVEggQU5ZIE9USEVSIFBST0RVQ1RTLCBPUiBVU0UgSU4gQU5ZIEFQUExJQ0FUSU9OLg0KKiBJTiBOTyBFVkVOVCBXSUxMIE1JQ1JPQ0hJUCBCRSBMSUFCTEUgRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgUFVOSVRJVkUsDQoqIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTCBMT1NTLCBEQU1BR0UsIENPU1QgT1IgRVhQRU5TRSBPRiBBTlkgS0lORA0KKiBXSEFUU09FVkVSIFJFTEFURUQgVE8gVEhFIFNPRlRXQVJFLCBIT1dFVkVSIENBVVNFRCwgRVZFTiBJRiBNSUNST0NISVAgSEFTDQoqIEJFRU4gQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT1IgVEhFIERBTUFHRVMgQVJFIEZPUkVTRUVBQkxFLg0KKiBUTyBUSEUgRlVMTEVTVCBFWFRFTlQgQUxMT1dFRCBCWSBMQVcsIE1JQ1JPQ0hJUCdTIFRPVEFMIExJQUJJTElUWSBPTiBBTEwNCiogQ0xBSU1TIElOIEFOWSBXQVkgUkVMQVRFRCBUTyBUSElTIFNPRlRXQVJFIFdJTEwgTk9UIEVYQ0VFRCBUSEUgQU1PVU5UIE9GDQoqIEZFRVMsIElGIEFOWSwgVEhBVCBZT1UgSEFWRSBQQUlEIERJUkVDVExZIFRPIE1JQ1JPQ0hJUCBGT1IgVEhJUyBTT0ZUV0FSRS4NCiogTUlDUk9DSElQIFBST1ZJREVTIFRISVMgU09GVFdBUkUgQ09ORElUSU9OQUxMWSBVUE9OIFlPVVIgQUNDRVBUQU5DRQ0KKiBPRiBUSEVTRSBURVJNUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KDQpWZXJzaW9uIENvbnRyb2wgSW5mb3JtYXRpb24gKFBlcmZvcmNlKQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQokUmV2aXNpb246ICMxICQgDQokRGF0ZVRpbWU6IDIwMTYvMDkvMjIgMDg6MDM6NDkgJCANCiRBdXRob3I6IHByYW1hbnMgJA0KTGFzdCBDaGFuZ2U6CUluaXRpYWwgRHJhZnQNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKiBAZmlsZSBpbnRlcnJ1cHRfZWNpYV9wZXJwaGwuYw0KKiBcYnJpZWYgSW50ZXJydXB0IEVDSUEgUGVyaXBoZXJhbCBTb3VyY2UgRmlsZQ0KKiBcYXV0aG9yIGp2YXNhbnRoDQoqIA0KKiBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgRUNJQSBwZXJpcGhlcmFsIGZ1bmN0aW9ucyAgDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qKiBAZGVmZ3JvdXAgSW50ZXJydXB0DQogKiAgQHsNCiAqLw0KDQojaW5jbHVkZSAiY29tbW9uX2xpYi5oIg0KI2luY2x1ZGUgImludGVycnVwdC5oIg0KDQojZGVmaW5lIEVDSUEJKChJTlRTX1R5cGUgICAgICAgICAgICAgICAqKSBJTlRTX0JBU0UpDQojZGVmaW5lCUVDUwkJKChFQ19SRUdfQkFOS19UeXBlICopICAgRUNfUkVHX0JBTktfQkFTRSkNCg0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyogICBPcGVyYXRpb25zIG9uIEdJUlEgQmxvY2sgRW5hYmxlIFNldCwgRW5hYmxlIENsZWFyIGFuZCBTdGF0dXMgUmVnaXN0ZXIgICAgICAgICAqLw0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQovKiogRW5hYmxlIHNwZWNpZmllZCBHSVJRIGluIEVDSUEgYmxvY2sNCiAqIEBwYXJhbSBnaXJxX2lkIC0gZW51bSBNRUNfR0lSUV9JRFMgDQogKi8NCnZvaWQgcF9pbnRlcnJ1cHRfZWNpYV9ibG9ja19lbmFibGVfc2V0KHVpbnQ4X3QgZ2lycV9pZCkNCnsNCiAgICBpZiAoIGdpcnFfaWQgPCAoTUVDX0dJUlFfSURfTUFYKSApIHsNCiAgICAgICAgRUNJQS0+QkxPQ0tfRU5BQkxFX1NFVCA9ICgxdWwgPDwgKChnaXJxX2lkICsgOCkgJiAweDFGdSkpOw0KICAgIH0NCn0NCg0KLyoqIEVuYWJsZSBHSVJRcyBpbiBFQ0lBIEJsb2NrIA0KICogQHBhcmFtIGdpcnFfYml0bWFzayAtIEJpdG1hc2sgb2YgR0lSUXMgdG8gYmUgZW5hYmxlZCBpbiBFQ0lBIEJsb2NrICANCiAqLw0Kdm9pZCBwX2ludGVycnVwdF9lY2lhX2Jsb2NrX2VuYWJsZV9iaXRtYXNrX3NldCh1aW50MzJfdCBnaXJxX2JpdG1hc2spDQp7ICAgIA0KICAgIEVDSUEtPkJMT0NLX0VOQUJMRV9TRVQgPSBnaXJxX2JpdG1hc2s7ICAgIA0KfQ0KDQovKiogQ2hlY2sgaWYgc3BlY2lmaWVkIEdJUlEgYmxvY2sgZW5hYmxlZCBvciBub3QNCiAqIEBwYXJhbSBnaXJxX2lkIC0gZW51bSBNRUNfR0lSUV9JRFMgDQogKiBAcmV0dXJuIHJldFZhbCAtIDEgaWYgdGhlIHBhcnRpY3VsYXIgR0lSUSBibG9jayBlbmFibGVkLCBlbHNlIDANCiAqLw0KdWludDhfdCBwX2ludGVycnVwdF9lY2lhX2Jsb2NrX2VuYWJsZV9nZXQodWludDhfdCBnaXJxX2lkKQ0Kew0KICAgIHVpbnQ4X3QgcmV0VmFsOw0KICAgIA0KICAgIHJldFZhbCA9IDA7DQogICAgaWYgKCBnaXJxX2lkIDwgKE1FQ19HSVJRX0lEX01BWCkgKSANCiAgICB7ICAgICAgICANCiAgICAgICAgaWYgKChFQ0lBLT5CTE9DS19FTkFCTEVfU0VUKSAmICgxdWwgPDwgKChnaXJxX2lkICsgOCkgJiAweDFGdSkpKQ0KICAgICAgICB7DQogICAgICAgICAgIHJldFZhbCA9IDE7IA0KICAgICAgICB9DQogICAgfQ0KICAgIHJldHVybiByZXRWYWw7DQp9DQoNCi8qKiBTZXQgYWxsIEdJUlEgYmxvY2sgZW5hYmxlcyAqLw0Kdm9pZCBwX2ludGVycnVwdF9lY2lhX2Jsb2NrX2VuYWJsZV9hbGxfc2V0KHZvaWQpDQp7ICAgIA0KICAgIEVDSUEtPkJMT0NLX0VOQUJMRV9TRVQgPSAweGZmZmZmZmZmdWw7IA0KfQ0KDQovKiogQ2xlYXIgc3BlY2lmaWVkIEdJUlEgaW4gRUNJQSBCbG9jayANCiAqIEBwYXJhbSBnaXJxX2lkIC0gZW51bSBNRUNfR0lSUV9JRFMgDQogKi8NCnZvaWQgcF9pbnRlcnJ1cHRfZWNpYV9ibG9ja19lbmFibGVfY2xyKHVpbnQ4X3QgZ2lycV9pZCkNCnsNCiAgICBpZiAoIGdpcnFfaWQgPCAoTUVDX0dJUlFfSURfTUFYKSApIHsNCiAgICAgICAgRUNJQS0+QkxPQ0tfRU5BQkxFX0NMRUFSID0gKDF1bCA8PCAoKGdpcnFfaWQgKyA4KSAmIDB4MUZ1KSk7DQogICAgfQ0KfQ0KDQovKiogQ2xlYXIgR0lSUXMgaW4gRUNJQSBCbG9jayANCiAqIEBwYXJhbSBnaXJxX2JpdG1hc2sgLSBCaXRtYXNrIG9mIEdJUlFzIHRvIGJlIGNsZWFyZWQgaW4gRUNJQSBCbG9jayAgDQogKi8NCnZvaWQgcF9pbnRlcnJ1cHRfZWNpYV9ibG9ja19lbmFibGVfYml0bWFza19jbHIodWludDMyX3QgZ2lycV9iaXRtYXNrKQ0KeyAgICANCiAgICBFQ0lBLT5CTE9DS19FTkFCTEVfQ0xFQVIgPSBnaXJxX2JpdG1hc2s7ICAgIA0KfQ0KDQovKiogcF9pbnRlcnJ1cHRfZWNpYV9ibG9ja19lbmFibGVfYWxsX2NsciAtIENsZWFycyBhbGwgR0lSUSBibG9jayBlbmFibGVzICovDQogdm9pZCBwX2ludGVycnVwdF9lY2lhX2Jsb2NrX2VuYWJsZV9hbGxfY2xyKHZvaWQpDQp7ICAgIA0KICAgIEVDSUEtPkJMT0NLX0VOQUJMRV9DTEVBUiA9IDB4ZmZmZmZmZmZ1bDsgDQp9DQoNCi8qKiBHZXQgc3RhdHVzIG9mIEdJUlEgaW4gRUNJQSBCbG9jaw0KICogQHBhcmFtIGdpcnFfaWQgLSBlbnVtIE1FQ19HSVJRX0lEUyAgDQogKiBAcmV0dXJuIDAgaWYgc3RhdHVzIGJpdCBub3Qgc2V0OyBlbHNlIG5vbi16ZXJvIHZhbHVlDQogKi8NCnVpbnQzMl90IHBfaW50ZXJydXB0X2VjaWFfYmxvY2tfaXJxX3N0YXR1c19nZXQodWludDhfdCBnaXJxX2lkKQ0KeyAJDQogICAgdWludDMyX3QgcmV0VmFsOw0KDQogICAgcmV0VmFsID0gRUNJQS0+QkxPQ0tfSVJRX1ZFQ1RPUiAmICgxdWwgPDwgKChnaXJxX2lkICsgOCkgJiAweDFGdSkpOw0KDQogICAgcmV0dXJuIHJldFZhbDsJCQ0KfQ0KDQovKiogUmVhZHMgdGhlIEJsb2NrIElSUSBWZWN0b3IgUmVnaXN0ZXINCiAgKiBAcmV0dXJuIDMyLWJpdCB2YWx1ZQ0KICovDQp1aW50MzJfdCBwX2ludGVycnVwdF9lY2lhX2Jsb2NrX2lycV9hbGxfc3RhdHVzX2dldCh2b2lkKQ0KeyAJDQogICAgdWludDMyX3QgcmV0VmFsOw0KDQogICAgcmV0VmFsID0gRUNJQS0+QkxPQ0tfSVJRX1ZFQ1RPUjsNCg0KICAgIHJldHVybiByZXRWYWw7CQkNCn0NCg0KDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiAgIE9wZXJhdGlvbnMgb24gR0lSUXggU291cmNlLCBFbmFibGUsIFJlc3VsdCBhbmQgRW5hYmxlIFJlZ2lzdGVycyAgICAgICAgICAgICAgICovDQovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCi8qKiBDbGVhciBzcGVjaWZpZWQgaW50ZXJydXB0IHNvdXJjZSBiaXQgaW4gR0lSUXgNCiAqIEBwYXJhbSBnaXJxX2lkIC0gZW51bSBNRUNfR0lSUV9JRFMNCiAqIEBwYXJhbSBiaXRudW0gLVswLCAzMV0NCiAqLw0Kdm9pZCBwX2ludGVycnVwdF9lY2lhX2dpcnFfc291cmNlX2NscihpbnQxNl90IGdpcnFfaWQsIHVpbnQ4X3QgYml0bnVtKQ0Kew0KCSAgX19JTyB1aW50MzJfdCAqZ2lycV9zb3VyY2UgPSAodWludDMyX3QqKUVDSUE7DQoJCSAgDQogICAgaWYgKCBnaXJxX2lkIDwgKE1FQ19HSVJRX0lEX01BWCkgKSB7DQoJCQkvKiBFYWNoIEdJUlEgaGFzIDUgMzJiaXQgZmllbGRzOiBTUkMsIEVOQUJMRV9TRVQsIEVOQUJMRV9DTFIsIFJFU1VMVCAmIFJFU0VSVkVEDQoJCQkgKiBwbGVhc2UgcmVmZXIgSU5UU19UeXBlIGluIE1DSFBfZGV2aWNlX2ludGVybmFsLmgNCgkJCSAqIEJhc2VkIG9uIHRoZSBnaXJxIGlkIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGluIHRoZSBzdHJ1Y3R1cmUgSU5UU19UeXBlDQoJCQkgKiANCgkJCSAqIEJBU0VEIE9OIFRIRSBTVFJVQ1RVUkUgREVGSU5JVElPTiBPRiBJTlRTX1R5cGUgQUxMIEZJRUxEUyBBUkUgQUxJR05FRCBPTg0KCQkJICogMzIgQklUIEJPVU5EQVJZLCBGT0xMT1dJTkcgV0lMTCBOT1QgV09SSyBJRiBUSElTIFNDSEVNRSBDSEFOR0VTDQoJCQkqLw0KCQkJICBnaXJxX3NvdXJjZSArPSAoNSAqIGdpcnFfaWQpOw0KICAgICAgICAqZ2lycV9zb3VyY2UgfD0gKDF1bCA8PCAoYml0bnVtICYgMHgxRnUpKTsNCiAgICB9DQp9DQoNCi8qKiBSZWFkIHRoZSBzcGVjaWZpZWQgaW50ZXJydXB0IHNvdXJjZSBiaXQgaW4gR0lSUXgNCiAqIEBwYXJhbSBnaXJxX2lkIC0gZW51bSBNRUNfR0lSUV9JRFMNCiAqIEBwYXJhbSBiaXRudW0gLVswLCAzMV0NCiAqIEByZXR1cm4gMCBpZiBzb3VyY2UgYml0IG5vdCBzZXQ7IGVsc2Ugbm9uLXplcm8gdmFsdWUNCiAqLw0KdWludDMyX3QgcF9pbnRlcnJ1cHRfZWNpYV9naXJxX3NvdXJjZV9nZXQoaW50MTZfdCBnaXJxX2lkLCB1aW50OF90IGJpdG51bSkNCnsNCiAgICB1aW50MzJfdCByZXRWYWw7DQoJICBfX0lPIHVpbnQzMl90ICpnaXJxX3NvdXJjZSA9ICh1aW50MzJfdCopRUNJQTsNCgkNCiAgICByZXRWYWwgPSAwOw0KICAgIGlmICggZ2lycV9pZCA8IChNRUNfR0lSUV9JRF9NQVgpICkgew0KCQkJLyogRWFjaCBHSVJRIGhhcyA1IDMyYml0IGZpZWxkczogU1JDLCBFTkFCTEVfU0VULCBFTkFCTEVfQ0xSLCBSRVNVTFQgJiBSRVNFUlZFRA0KCQkJICogcGxlYXNlIHJlZmVyIElOVFNfVHlwZSBpbiBNQ0hQX2RldmljZV9pbnRlcm5hbC5oDQoJCQkgKiBCYXNlZCBvbiB0aGUgZ2lycSBpZCBjYWxjdWxhdGUgdGhlIG9mZnNldCBpbiB0aGUgc3RydWN0dXJlIElOVFNfVHlwZQ0KCQkJICogDQoJCQkgKiBCQVNFRCBPTiBUSEUgU1RSVUNUVVJFIERFRklOSVRJT04gT0YgSU5UU19UeXBlIEFMTCBGSUVMRFMgQVJFIEFMSUdORUQgT04NCgkJCSAqIDMyIEJJVCBCT1VOREFSWSwgRk9MTE9XSU5HIFdJTEwgTk9UIFdPUksgSUYgVEhJUyBTQ0hFTUUgQ0hBTkdFUw0KCQkJKi8NCgkJCSAgZ2lycV9zb3VyY2UgKz0gKDUgKiBnaXJxX2lkKTsJCQkNCiAgICAgICAgcmV0VmFsID0gKCpnaXJxX3NvdXJjZSAmICgxdWwgPDwgKGJpdG51bSAmIDB4MUZ1KSkpOw0KICAgIH0JCQ0KICAgIHJldHVybiByZXRWYWw7DQp9DQoNCi8qKiBFbmFibGUgdGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQgaW4gR0lSUXgNCiAqIGdpcnFfaWQgLSBlbnVtIE1FQ19HSVJRX0lEUw0KICogYml0bnVtID0gWzAsIDMxXQ0KICovDQp2b2lkIHBfaW50ZXJydXB0X2VjaWFfZ2lycV9lbmFibGVfc2V0KHVpbnQxNl90IGdpcnFfaWQsIHVpbnQ4X3QgYml0bnVtKQ0Kew0KCSAgX19JTyB1aW50MzJfdCAqZ2lycV9lbmFibGVfc2V0ID0gKHVpbnQzMl90KikoJihFQ0lBLT5HSVJRMDhfRU5fU0VUKSk7DQoJDQogICAgaWYgKCBnaXJxX2lkIDwgKE1FQ19HSVJRX0lEX01BWCkgKSB7DQoJCQkvKiBFYWNoIEdJUlEgaGFzIDUgMzJiaXQgZmllbGRzOiBTUkMsIEVOQUJMRV9TRVQsIEVOQUJMRV9DTFIsIFJFU1VMVCAmIFJFU0VSVkVEDQoJCQkgKiBwbGVhc2UgcmVmZXIgSU5UU19UeXBlIGluIE1DSFBfZGV2aWNlX2ludGVybmFsLmgNCgkJCSAqIEJhc2VkIG9uIHRoZSBnaXJxIGlkIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGluIHRoZSBzdHJ1Y3R1cmUgSU5UU19UeXBlDQoJCQkgKiANCgkJCSAqIEJBU0VEIE9OIFRIRSBTVFJVQ1RVUkUgREVGSU5JVElPTiBPRiBJTlRTX1R5cGUgQUxMIEZJRUxEUyBBUkUgQUxJR05FRCBPTg0KCQkJICogMzIgQklUIEJPVU5EQVJZLCBGT0xMT1dJTkcgV0lMTCBOT1QgV09SSyBJRiBUSElTIFNDSEVNRSBDSEFOR0VTDQoJCQkqLw0KCQkJICBnaXJxX2VuYWJsZV9zZXQgKz0gKDUgKiBnaXJxX2lkKTsJCQkNCiAgICAgICAgKmdpcnFfZW5hYmxlX3NldCB8PSAoMXVsIDw8IChiaXRudW0gJiAweDFGdSkpOw0KICAgIH0NCn0NCg0KLyoqIERpc2FibGUgdGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQgaW4gR0lSUXgNCiAqIGdpcnFfaWQgLSBlbnVtIE1FQ19HSVJRX0lEUw0KICogYml0bnVtID0gWzAsIDMxXQ0KICovDQp2b2lkIHBfaW50ZXJydXB0X2VjaWFfZ2lycV9lbmFibGVfY2xyKHVpbnQxNl90IGdpcnFfaWQsIHVpbnQ4X3QgYml0bnVtKQ0Kew0KCSAgX19JTyB1aW50MzJfdCAqZ2lycV9lbmFibGVfY2xyID0gKHVpbnQzMl90KikoJihFQ0lBLT5HSVJRMDhfRU5fQ0xSKSk7DQoJDQogICAgaWYgKCBnaXJxX2lkIDwgKE1FQ19HSVJRX0lEX01BWCkgKSB7DQoJCQkvKiBFYWNoIEdJUlEgaGFzIDUgMzJiaXQgZmllbGRzOiBTUkMsIEVOQUJMRV9TRVQsIEVOQUJMRV9DTFIsIFJFU1VMVCAmIFJFU0VSVkVEDQoJCQkgKiBwbGVhc2UgcmVmZXIgSU5UU19UeXBlIGluIE1DSFBfZGV2aWNlX2ludGVybmFsLmgNCgkJCSAqIEJhc2VkIG9uIHRoZSBnaXJxIGlkIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGluIHRoZSBzdHJ1Y3R1cmUgSU5UU19UeXBlDQoJCQkgKiANCgkJCSAqIEJBU0VEIE9OIFRIRSBTVFJVQ1RVUkUgREVGSU5JVElPTiBPRiBJTlRTX1R5cGUgQUxMIEZJRUxEUyBBUkUgQUxJR05FRCBPTg0KCQkJICogMzIgQklUIEJPVU5EQVJZLCBGT0xMT1dJTkcgV0lMTCBOT1QgV09SSyBJRiBUSElTIFNDSEVNRSBDSEFOR0VTDQoJCQkqLw0KCQkJICBnaXJxX2VuYWJsZV9jbHIgKz0gKDUgKiBnaXJxX2lkKTsJCQkNCiAgICAgICAgKmdpcnFfZW5hYmxlX2NsciB8PSAoMXVsIDw8IChiaXRudW0gJiAweDFGdSkpOw0KICAgIH0NCn0NCg0KLyoqIFJlYWQgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIGludGVycnVwdCBpbiBHSVJReA0KICogZ2lycV9pZCAtIGVudW0gTUVDX0dJUlFfSURTDQogKiBiaXRudW0gPSBbMCwgMzFdDQogKiBAcmV0dXJuIDAgaWYgZW5hYmxlIGJpdCBub3Qgc2V0OyBlbHNlIG5vbi16ZXJvIHZhbHVlDQogKi8NCnVpbnQzMl90IHBfaW50ZXJydXB0X2VjaWFfZ2lycV9lbmFibGVfZ2V0KHVpbnQxNl90IGdpcnFfaWQsIHVpbnQ4X3QgYml0bnVtKQ0Kew0KICAgIHVpbnQzMl90IHJldFZhbDsNCgkgIF9fSU8gdWludDMyX3QgKmdpcnFfZW5hYmxlX3NldCA9ICh1aW50MzJfdCopKCYoRUNJQS0+R0lSUTA4X0VOX1NFVCkpOw0KDQogICAgcmV0VmFsID0gMDsNCiAgICBpZiAoIGdpcnFfaWQgPCAoTUVDX0dJUlFfSURfTUFYKSApIHsNCgkJCS8qIEVhY2ggR0lSUSBoYXMgNSAzMmJpdCBmaWVsZHM6IFNSQywgRU5BQkxFX1NFVCwgRU5BQkxFX0NMUiwgUkVTVUxUICYgUkVTRVJWRUQNCgkJCSAqIHBsZWFzZSByZWZlciBJTlRTX1R5cGUgaW4gTUNIUF9kZXZpY2VfaW50ZXJuYWwuaA0KCQkJICogQmFzZWQgb24gdGhlIGdpcnEgaWQgY2FsY3VsYXRlIHRoZSBvZmZzZXQgaW4gdGhlIHN0cnVjdHVyZSBJTlRTX1R5cGUNCgkJCSAqIA0KCQkJICogQkFTRUQgT04gVEhFIFNUUlVDVFVSRSBERUZJTklUSU9OIE9GIElOVFNfVHlwZSBBTEwgRklFTERTIEFSRSBBTElHTkVEIE9ODQoJCQkgKiAzMiBCSVQgQk9VTkRBUlksIEZPTExPV0lORyBXSUxMIE5PVCBXT1JLIElGIFRISVMgU0NIRU1FIENIQU5HRVMNCgkJCSovDQoJCQkgIGdpcnFfZW5hYmxlX3NldCArPSAoNSAqIGdpcnFfaWQpOwkJCQ0KICAgICAgICByZXRWYWwgPSAoKmdpcnFfZW5hYmxlX3NldCAgJiAoMXVsIDw8IChiaXRudW0gJiAweDFGdSkpKTsNCiAgICB9DQogICAgcmV0dXJuIHJldFZhbDsNCn0NCg0KLyoqIFJlYWQgdGhlIHJlc3VsdCBiaXQgb2YgdGhlIGludGVycnVwdCBpbiBHSVJReA0KICogQHBhcmFtIGdpcnFfaWQgLSBlbnVtIE1FQ19HSVJRX0lEUw0KICogQHBhcmFtIGJpdG51bSAtWzAsIDMxXQ0KICogQHJldHVybiAwIGlmIGVuYWJsZSBiaXQgbm90IHNldDsgZWxzZSBub24temVybyB2YWx1ZQ0KICovDQp1aW50MzJfdCBwX2ludGVycnVwdF9lY2lhX2dpcnFfcmVzdWx0X2dldChpbnQxNl90IGdpcnFfaWQsIHVpbnQ4X3QgYml0bnVtKQ0Kew0KICAgIHVpbnQzMl90IHJldFZhbDsNCgkgIF9fSU8gdWludDMyX3QgKmdpcnFfcmVzdWx0ID0gKHVpbnQzMl90KikoJihFQ0lBLT5HSVJRMDhfUkVTVUxUKSk7DQoJDQogICAgcmV0VmFsID0gMDsNCiAgICBpZiAoIGdpcnFfaWQgPCAoTUVDX0dJUlFfSURfTUFYKSApIHsNCgkJCS8qIEVhY2ggR0lSUSBoYXMgNSAzMmJpdCBmaWVsZHM6IFNSQywgRU5BQkxFX1NFVCwgRU5BQkxFX0NMUiwgUkVTVUxUICYgUkVTRVJWRUQNCgkJCSAqIHBsZWFzZSByZWZlciBJTlRTX1R5cGUgaW4gTUNIUF9kZXZpY2VfaW50ZXJuYWwuaA0KCQkJICogQmFzZWQgb24gdGhlIGdpcnEgaWQgY2FsY3VsYXRlIHRoZSBvZmZzZXQgaW4gdGhlIHN0cnVjdHVyZSBJTlRTX1R5cGUNCgkJCSAqIA0KCQkJICogQkFTRUQgT04gVEhFIFNUUlVDVFVSRSBERUZJTklUSU9OIE9GIElOVFNfVHlwZSBBTEwgRklFTERTIEFSRSBBTElHTkVEIE9ODQoJCQkgKiAzMiBCSVQgQk9VTkRBUlksIEZPTExPV0lORyBXSUxMIE5PVCBXT1JLIElGIFRISVMgU0NIRU1FIENIQU5HRVMNCgkJCSovDQoJCQkgIGdpcnFfcmVzdWx0ICs9ICg1ICogZ2lycV9pZCk7CQkJDQogICAgICAgIHJldFZhbCA9ICgqZ2lycV9yZXN1bHQgJiAoMXVsIDw8IChiaXRudW0gJiAweDFGdSkpKTsNCiAgICB9DQoJCQ0KICAgIHJldHVybiByZXRWYWw7DQp9DQoNCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbnMgb24gYWxsIEdJUlFzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCg0KLyoqIENsZWFyIGFsbCBhZ2dyZWdhdG9yIEdJUlFuIHN0YXR1cyByZWdpc3RlcnMgKi8NCnZvaWQgcF9pbnRlcnJ1cHRfZWNpYV9naXJxc19zb3VyY2VfcmVzZXQodm9pZCkNCnsNCiAgICB1aW50MTZfdCBpOw0KCSAgX19JTyB1aW50MzJfdCAqZ2lycV9zb3VyY2UgPSAodWludDMyX3QqKUVDSUE7DQoNCiAgICBmb3IgKCBpID0gMHU7IGkgPCAoTUVDX0dJUlFfSURfTUFYKTsgaSsrICkgew0KCQkJLyogRWFjaCBHSVJRIGhhcyA1IDMyYml0IGZpZWxkczogU1JDLCBFTkFCTEVfU0VULCBFTkFCTEVfQ0xSLCBSRVNVTFQgJiBSRVNFUlZFRA0KCQkJICogcGxlYXNlIHJlZmVyIElOVFNfVHlwZSBpbiBNQ0hQX2RldmljZV9pbnRlcm5hbC5oDQoJCQkgKiBCYXNlZCBvbiB0aGUgZ2lycSBpZCBjYWxjdWxhdGUgdGhlIG9mZnNldCBpbiB0aGUgc3RydWN0dXJlIElOVFNfVHlwZQ0KCQkJICogDQoJCQkgKiBCQVNFRCBPTiBUSEUgU1RSVUNUVVJFIERFRklOSVRJT04gT0YgSU5UU19UeXBlIEFMTCBGSUVMRFMgQVJFIEFMSUdORUQgT04NCgkJCSAqIDMyIEJJVCBCT1VOREFSWSwgRk9MTE9XSU5HIFdJTEwgTk9UIFdPUksgSUYgVEhJUyBTQ0hFTUUgQ0hBTkdFUw0KCQkJKi8NCgkJCSAgZ2lycV9zb3VyY2UgKz0gNTsJCQkNCiAgICAgICAgKmdpcnFfc291cmNlID0gMHhmZmZmZmZmZnVsOw0KICAgIH0gICAgDQp9DQoNCi8qKiBDbGVhciBhbGwgYWdncmVnYXRvciBHSVJRbiBlbmFibGVzICovDQogdm9pZCBwX2ludGVycnVwdF9lY2lhX2dpcnFzX2VuYWJsZV9yZXNldCh2b2lkKQ0Kew0KICAgIHVpbnQxNl90IGk7DQoJICBfX0lPIHVpbnQzMl90ICpnaXJxX2VuYWJsZV9jbHIgPSAodWludDMyX3QqKSgmKEVDSUEtPkdJUlEwOF9FTl9DTFIpKTsNCg0KICAgIGZvciAoIGkgPSAwdTsgaSA8IChNRUNfR0lSUV9JRF9NQVgpOyBpKysgKSB7DQoJCQkvKiBFYWNoIEdJUlEgaGFzIDUgMzJiaXQgZmllbGRzOiBTUkMsIEVOQUJMRV9TRVQsIEVOQUJMRV9DTFIsIFJFU1VMVCAmIFJFU0VSVkVEDQoJCQkgKiBwbGVhc2UgcmVmZXIgSU5UU19UeXBlIGluIE1DSFBfZGV2aWNlX2ludGVybmFsLmgNCgkJCSAqIEJhc2VkIG9uIHRoZSBnaXJxIGlkIGNhbGN1bGF0ZSB0aGUgb2Zmc2V0IGluIHRoZSBzdHJ1Y3R1cmUgSU5UU19UeXBlDQoJCQkgKiANCgkJCSAqIEJBU0VEIE9OIFRIRSBTVFJVQ1RVUkUgREVGSU5JVElPTiBPRiBJTlRTX1R5cGUgQUxMIEZJRUxEUyBBUkUgQUxJR05FRCBPTg0KCQkJICogMzIgQklUIEJPVU5EQVJZLCBGT0xMT1dJTkcgV0lMTCBOT1QgV09SSyBJRiBUSElTIFNDSEVNRSBDSEFOR0VTDQoJCQkqLw0KCQkJICBnaXJxX2VuYWJsZV9jbHIgKz0gNTsJCQkJDQogICAgICAgICpnaXJxX2VuYWJsZV9jbHIgPSAweGZmZmZmZmZmdWw7DQogICAgfSAgICANCn0NCg0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyogICAgICAgICAgICAgICAgICBGdW5jdGlvbiB0byBzZXQgaW50ZXJydXB0IGNvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KDQovKiogU2V0IGludGVycnVwdCBjb250cm9sIA0KICogQHBhcmFtIG52aWNfZW5fZmxhZyA6IDAgPSBBbHRlcm5hdGUgTlZJQyBkaXNhYmxlZCwgMSA9IEFsdGVybmF0ZSBOVklDIGVuYWJsZWQNCiAqLw0Kdm9pZCBwX2ludGVycnVwdF9jb250cm9sX3NldCh1aW50OF90IG52aWNfZW5fZmxhZykNCnsJCQ0KICAgIEVDUy0+SU5URVJSVVBUX0NPTlRST0wgPSBudmljX2VuX2ZsYWc7DQp9DQoNCi8qKiBSZWFkIGludGVycnVwdCBjb250cm9sIA0KICogQHJldHVybiB1aW50OF90IC0gMCA9IEFsdGVybmF0ZSBOVklDIGRpc2FibGVkLCAxID0gQWx0ZXJuYXRlIE5WSUMgZW5hYmxlZA0KICovDQp1aW50OF90IHBfaW50ZXJydXB0X2NvbnRyb2xfZ2V0KHZvaWQpDQp7CQkNCiAgICByZXR1cm4gKEVDUy0+SU5URVJSVVBUX0NPTlRST0wgJiAweDEpOw0KfQ0KDQovKiBlbmQgaW50ZXJydXB0X2VjaWFfcGVycGhsLmMgKi8NCi8qKiAgIEB9DQogKi8NCg==