LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWdlcmUgU3lzdGVtcyBJbmMuCiAqIFdpcmVsZXNzIGRldmljZSBkcml2ZXIgZm9yIExpbnV4ICh3bGFnczQ5KS4KICoKICogQ29weXJpZ2h0IChjKSAxOTk4LTIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqICAgaHR0cDovL3d3dy5hZ2VyZS5jb20KICoKICogSW5pdGlhbGx5IGRldmVsb3BlZCBieSBUcmlwbGVQb2ludCwgSW5jLgogKiAgIGh0dHA6Ly93d3cudHJpcGxlcG9pbnQuY29tCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqICAgRHJpdmVyIGNvbW1vbiBoZWFkZXIgZm9yIGluZm8gbmVlZGVkIGJ5IGRyaXZlciBzb3VyY2UgYW5kIHVzZXItc3BhY2UKICogICBwcm9jZXNzZXMgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBkcml2ZXIuCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIFNPRlRXQVJFIExJQ0VOU0UKICoKICogVGhpcyBzb2Z0d2FyZSBpcyBwcm92aWRlZCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMsCiAqIHdoaWNoIHlvdSBzaG91bGQgcmVhZCBjYXJlZnVsbHkgYmVmb3JlIHVzaW5nIHRoZSBzb2Z0d2FyZS4gIFVzaW5nIHRoaXMKICogc29mdHdhcmUgaW5kaWNhdGVzIHlvdXIgYWNjZXB0YW5jZSBvZiB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIElmIHlvdSBkbwogKiBub3QgYWdyZWUgd2l0aCB0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucywgZG8gbm90IHVzZSB0aGUgc29mdHdhcmUuCiAqCiAqIENvcHlyaWdodCCpIDIwMDMgQWdlcmUgU3lzdGVtcyBJbmMuCiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqCiAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIG9yIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbnMsIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKICoKICogLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMKICogICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgYXMgY29tbWVudHMgaW4gdGhlIGNvZGUgYXMKICogICAgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiAqICAgIGRpc3RyaWJ1dGlvbi4KICoKICogLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCiAqICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIERpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24KICogICAgYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAqCiAqIC4gTmVpdGhlciB0aGUgbmFtZSBvZiBBZ2VyZSBTeXN0ZW1zIEluYy4gbm9yIHRoZSBuYW1lcyBvZiB0aGUgY29udHJpYnV0b3JzCiAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQogKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICoKICogRGlzY2xhaW1lcgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIJNBUyBJU5QgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywKICogSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElORlJJTkdFTUVOVCBBTkQgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgogKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgQU5ZCiAqIFVTRSwgTU9ESUZJQ0FUSU9OIE9SIERJU1RSSUJVVElPTiBPRiBUSElTIFNPRlRXQVJFIElTIFNPTEVMWSBBVCBUSEUgVVNFUlMgT1dOCiAqIFJJU0suIElOIE5PIEVWRU5UIFNIQUxMIEFHRVJFIFNZU1RFTVMgSU5DLiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkKICogRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMKICogKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOwogKiBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBDT05UUkFDVCwgU1RSSUNUCiAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCiAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNICiAqIERBTUFHRS4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgX19XQVZFTEFOMl9JRl9IX18KI2RlZmluZSBfX1dBVkVMQU4yX0lGX0hfXwoKCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIGNvbnN0YW50IGRlZmluaXRpb25zCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiNkZWZpbmUgTUFYX0xUVl9CVUZfU0laRSAgICAgICAgICAgICg1MTIgLSAoc2l6ZW9mKGhjZl8xNikgKiAyKSkKCiNkZWZpbmUgSENGX1RBTExJRVNfU0laRSAgICAgICAgICAgIChzaXplb2YoQ0ZHX0hFUk1FU19UQUxMSUVTX1NUUkNUKSArIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoaGNmXzE2KSAqIDIpKQoKI2RlZmluZSBIQ0ZfTUFYX01VTFRJQ0FTVCAgICAgICAgICAgMTYKI2RlZmluZSBIQ0ZfTUFYX05BTUVfTEVOICAgICAgICAgICAgMzIKI2RlZmluZSBNQVhfTElORV9TSVpFICAgCQkJMjU2CiNkZWZpbmUgSENGX05VTV9JT19QT1JUUyAgICAgICAgICAgIDB4ODAKI2RlZmluZSBUWF9USU1FT1VUICAgICAgICAgICAgICAgICAgKCg4MDAgKiBIWikgLyAxMDAwKQoKCi8vI2RlZmluZSBIQ0ZfTUlOX0NPTU1fUVVBTElUWSAgICAgICAgMAovLyNkZWZpbmUgSENGX01BWF9DT01NX1FVQUxJVFkgICAgICAgIDkyCi8vI2RlZmluZSBIQ0ZfTUlOX1NJR05BTF9MRVZFTCAgICAgICAgNDcKLy8jZGVmaW5lIEhDRl9NQVhfU0lHTkFMX0xFVkVMICAgICAgICAxMzgKLy8jZGVmaW5lIEhDRl9NSU5fTk9JU0VfTEVWRUwgICAgICAgICA0NwovLyNkZWZpbmUgSENGX01BWF9OT0lTRV9MRVZFTCAgICAgICAgIDEzOAovLyNkZWZpbmUgSENGXzBEQk1fT0ZGU0VUICAgICAgICAgICAgIDE0OQoKLy8gUEUxRE5OCi8vIEJldHRlciBkYXRhIGZyb20gdGhlIHJlYWwgd29ybGQuIE5vdCBzY2llbnRpZmljIGJ1dCBlbXBpcmljYWwgZGF0YSBnYXRoZXJlZAovLyBmcm9tIGEgVGhvbXNvbiBTcGVlZHRvdWNoIDExMCB3aGljaCBpcyBpZGVudGlmaWVkIGFzOgovLyBQQ01DSUEgSW5mbzogIkFnZXJlIFN5c3RlbXMiICJXaXJlbGVzcyBQQyBDYXJkIE1vZGVsIDAxMTAiCi8vICAgICAgICAgICAgICBNYW51ZmFjdHVyZSBJRDogMDE1NiwwMDAzCi8vIExvd2VzdCBtZWFzdXJtZW50IGZvciBub2lzZSBmbG9vciBzZWVuIGlzIHZhbHVlIDU0Ci8vIEhpZ2hlc3Qgc2lnbmFsIHN0cmVuZ3RoIGluIGNsb3NlIHByb3hpbWl0eSB0byB0aGUgQVAgc2VlbiBpcyB2YWx1ZSAxMTgKLy8gVmVyeSBnb29kIG11c3QgYmUgYXJyb3VuZCAxMDAgKG90aGVyd2lzZSBpdHMgbmV2ZXIgImZ1bGwgc2NhbGUiCi8vIEFsbCBvdGhlciBjb25zdGFudHMgYXJlIGRlcnJpdmVkIGZyb20gdGhlc2UuIFRoaXMgbWFrZXMgdGhlIHNpZ25hbCBnYXVnZQovLyB3b3JrIGZvciBtZS4uLgojZGVmaW5lIEhDRl9NSU5fU0lHTkFMX0xFVkVMICAgICAgICA1NAojZGVmaW5lIEhDRl9NQVhfU0lHTkFMX0xFVkVMICAgICAgICAxMDAKI2RlZmluZSBIQ0ZfTUlOX05PSVNFX0xFVkVMICAgICAgICAgSENGX01JTl9TSUdOQUxfTEVWRUwKI2RlZmluZSBIQ0ZfTUFYX05PSVNFX0xFVkVMICAgICAgICAgSENGX01BWF9TSUdOQUxfTEVWRUwKI2RlZmluZSBIQ0ZfMERCTV9PRkZTRVQgICAgICAgICAgICAgKEhDRl9NQVhfU0lHTkFMX0xFVkVMICsgMSkKI2RlZmluZSBIQ0ZfTUlOX0NPTU1fUVVBTElUWSAgICAgICAgMAojZGVmaW5lIEhDRl9NQVhfQ09NTV9RVUFMSVRZICAgICAgICAoSENGX01BWF9TSUdOQUxfTEVWRUwgLSBIQ0ZfTUlOX05PSVNFX0xFVkVMICsgMSkKCgovKiBGb3IgZW5jcnlwdGlvbiAoV0VQKSAqLwojZGVmaW5lIE1JTl9LRVlfU0laRSAgICAgICAgICAgICAgICA1ICAgICAgIC8vIDQwIGJpdHMgUkM0IC0gV0VQCiNkZWZpbmUgTUFYX0tFWV9TSVpFICAgICAgICAgICAgICAgIDEzICAgICAgLy8gMTA0IGJpdHMKI2RlZmluZSBNQVhfS0VZUyAgICAgICAgICAgICAgICAgICAgNAoKI2RlZmluZSBSQURJT19DSEFOTkVMUyAgICAgICAgICAgICAgMTQKI2RlZmluZSBSQURJT19TRU5TSVRJVklUWV9MRVZFTFMgICAgMwojZGVmaW5lIFJBRElPX1RYX1BPV0VSX01XQVRUICAgICAgICAzMgojZGVmaW5lIFJBRElPX1RYX1BPV0VSX0RCTSAgICAgICAgICAxNQoKI2RlZmluZSBNSU5fUlRTX0JZVEVTICAgICAgICAgICAgICAgMAojZGVmaW5lIE1BWF9SVFNfQllURVMgICAgICAgICAgICAgICAyMzQ3CgojZGVmaW5lIE1BWF9SQVRFUyAgICAgICAgICAgICAgICAgICA4CiNkZWZpbmUgTUVHQUJJVCAgICAgICAgICAgICAgICAgICAgIDEwMjQqMTAyNAoKI2RlZmluZSBIQ0ZfRkFJTFVSRSAgICAgICAgICAgICAgICAgMHhGRgojZGVmaW5lIFVJTF9GQUlMVVJFCQkgICAgICAgICAgICAweEZGCiNkZWZpbmUgQ0ZHX1VJTF9DT05ORUNUICAgICAgICAgICAgIDB4QTEyMyAgICAgICAgICAvLyBEZWZpbmUgZGlmZmVyZW50bHk/CiNkZWZpbmUgQ0ZHX1VJTF9DT05ORUNUX0FDS19DT0RFICAgIDB4NTY1MzQzNUEgICAgICAvLyBWU0NaCiNkZWZpbmUgV1ZMQU4yX1VJTF9DT05ORUNURUQgICAgICAgICgweDAxTCA8PCAwKQojZGVmaW5lIFdWTEFOMl9VSUxfQlVTWSAgICAgICAgICAgICAoMHgwMUwgPDwgMSkKCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIGRyaXZlciBpb2N0bCBpbnRlcmZhY2UKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2RlZmluZSBXVkxBTjJfSU9DVExfVUlMICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUKCi8qIFRoZSBVSUwgSW50ZXJmYWNlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgV1ZMQU4yX0lPQ1RMX1VJTCBjb2RlIGFib3ZlCiAgIGlzIGRlZmluZWQgaW4gbWRkLmguIEEgcXVpY2sgcmVmZXJlbmNlIG9mIHRoZSBVSUwgY29kZXMgaXMgbGlzdGVkIGJlbG93ICovCi8qClVJTF9GVU5fQ09OTkVDVApVSUxfRlVOX0RJU0NPTk5FQ1QKVUlMX0ZVTl9BQ1RJT04KICAgIFVJTF9BQ1RfQkxPQ0sKICAgIFVJTF9BQ1RfVU5CTE9DSwogICAgVUlMX0FDVF9TQ0EKICAgIFVJTF9BQ1RfRElBRwogICAgVUlMX0FDVF9BUFBMWQpVSUxfRlVOX1NFTkRfRElBR19NU0cKVUlMX0ZVTl9HRVRfSU5GTwpVSUxfRlVOX1BVVF9JTkZPCiovCgojZGVmaW5lIFNJT0NTSVdORVROQU1FICAgICAgICAgICAgICBTSU9DREVWUFJJVkFURSsxCiNkZWZpbmUgU0lPQ0dJV05FVE5BTUUgICAgICAgICAgICAgIFNJT0NERVZQUklWQVRFKzIKI2RlZmluZSBTSU9DU0lXU1RBTkFNRSAgICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrMwojZGVmaW5lIFNJT0NHSVdTVEFOQU1FICAgICAgICAgICAgICBTSU9DREVWUFJJVkFURSs0CiNkZWZpbmUgU0lPQ1NJV1BPUlRUWVBFICAgICAgICAgICAgIFNJT0NERVZQUklWQVRFKzUKI2RlZmluZSBTSU9DR0lXUE9SVFRZUEUgICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrNgoKLyogSU9DVEwgY29kZSBmb3IgdGhlIFJUUyBpbnRlcmZhY2UgKi8KI2RlZmluZSBXTF9JT0NUTF9SVFMgICAgICAgICAgICAgICAgU0lPQ0RFVlBSSVZBVEUrNwoKLyogSU9DVEwgc3ViY29kZXMgZm9yIFdMX0lPQ1RMX1JUUyAqLwojZGVmaW5lIFdMX0lPQ1RMX1JUU19SRUFEICAgICAgICAgICAxCiNkZWZpbmUgV0xfSU9DVExfUlRTX1dSSVRFICAgICAgICAgIDIKI2RlZmluZSBXTF9JT0NUTF9SVFNfQkFUQ0hfUkVBRCAgICAgMwojZGVmaW5lIFdMX0lPQ1RMX1JUU19CQVRDSF9XUklURSAgICA0CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU1RSVUNUVVJFIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnR5cGVkZWYgc3RydWN0CnsKICAgIF9fdTE2ICAgbGVuZ3RoOwogICAgX191OCAgICBuYW1lW0hDRl9NQVhfTkFNRV9MRU5dOwp9Cnd2TmFtZV90OwoKCnR5cGVkZWYgc3RydWN0CnsKICAgIGhjZl8xNiAgICAgIGxlbjsKICAgIGhjZl8xNiAgICAgIHR5cDsKICAgIHVuaW9uCiAgICB7CiAgICAgICAgaGNmXzggICAgICAgdThbTUFYX0xUVl9CVUZfU0laRSAvIHNpemVvZihoY2ZfOCldOwogICAgICAgIGhjZl8xNiAgICAgIHUxNltNQVhfTFRWX0JVRl9TSVpFIC8gc2l6ZW9mKGhjZl8xNildOwogICAgICAgIGhjZl8zMiAgICAgIHUzMltNQVhfTFRWX0JVRl9TSVpFIC8gc2l6ZW9mKGhjZl8zMildOwogICAgfSB1Owp9Cmx0dl90OwoKCnN0cnVjdCB1aWxyZXEKewogICAgdW5pb24KICAgIHsKICAgICAgICBjaGFyICAgIGlmcm5fbmFtZVtJRk5BTVNJWl07CiAgICB9IGlmcl9pZnJuOwoKICAgIElGQlAgICAgICAgIGhjZkN0eDsKICAgIF9fdTggICAgICAgIGNvbW1hbmQ7CiAgICBfX3U4ICAgICAgICByZXN1bHQ7CgogICAgLyogVGhlIGRhdGEgZmllbGQgaW4gdGhpcyBzdHJ1Y3R1cmUgaXMgdHlwaWNhbGx5IGFuIExUViBvZiBzb21lIHR5cGUuIFRoZQogICAgICAgbGVuIGZpZWxkIGlzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgaW4gYnl0ZXMsIGFzIG9wcG9zZWQgdG8gd29yZHMgKGxpa2UKICAgICAgIHRoZSBMLWZpZWxkIGluIHRoZSBMVFYgKi8KICAgIF9fdTE2ICAgICAgIGxlbjsKICAgIHZvaWQgICAgICAgKmRhdGE7Cn07CgoKc3RydWN0IHJ0c3JlcQp7CiAgICB1bmlvbgogICAgewogICAgICAgIGNoYXIgICAgaWZybl9uYW1lW0lGTkFNU0laXTsKICAgIH0KICAgIGlmcl9pZnJuOwoKICAgIF9fdTE2ICAgdHlwOwogICAgX191MTYgICByZWc7CiAgICBfX3UxNiAgIGxlbjsKICAgIF9fdTE2ICAgKmRhdGE7Cn07CgoKI2VuZGlmICAvLyBfX1dBVkVMQU4yX0lGX0hfXwoK