LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmw0eHhfaGFsX2NyeXAuYwogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIENSWVAgSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCiAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIENyeXB0b2dyYXBoeSAoQ1JZUCkgcGVyaXBoZXJhbDoKICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBkZS1pbml0aWFsaXphdGlvbiBmdW5jdGlvbnMKICAqICAgICAgICAgICArIFByb2Nlc3NpbmcgZnVuY3Rpb25zIHVzaW5nIHBvbGxpbmcgbW9kZQogICogICAgICAgICAgICsgUHJvY2Vzc2luZyBmdW5jdGlvbnMgdXNpbmcgaW50ZXJydXB0IG1vZGUKICAqICAgICAgICAgICArIFByb2Nlc3NpbmcgZnVuY3Rpb25zIHVzaW5nIERNQSBtb2RlCiAgKiAgICAgICAgICAgKyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEBhdHRlbnRpb24KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgaW4KICAqIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIEB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAjIyMjIyBIb3cgdG8gdXNlIHRoaXMgZHJpdmVyICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dCiAgICAgIFRoZSBDUllQIEhBTCBkcml2ZXIgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKCiAgICAgICgjKUluaXRpYWxpemUgdGhlIENSWVAgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9DUllQX01zcEluaXQoKToKICAgICAgICAgKCsrKSBFbmFibGUgdGhlIENSWVAgaW50ZXJmYWNlIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19BRVNfQ0xLX0VOQUJMRSgpCiAgICAgICAgICgrKykgSW4gY2FzZSBvZiB1c2luZyBpbnRlcnJ1cHRzIChlLmcuIEhBTF9DUllQX0FFU19JVCgpKQogICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBDUllQIGludGVycnVwdCBwcmlvcml0eSB1c2luZyBIQUxfTlZJQ19TZXRQcmlvcml0eSgpCiAgICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIEFFUyBJUlEgaGFuZGxlciB1c2luZyBIQUxfTlZJQ19FbmFibGVJUlEoKQogICAgICAgICAgICAgKCsrKykgSW4gQUVTIElSUSBoYW5kbGVyLCBjYWxsIEhBTF9DUllQX0lSUUhhbmRsZXIoKQogICAgICAgICAoKyspIEluIGNhc2Ugb2YgdXNpbmcgRE1BIHRvIGNvbnRyb2wgZGF0YSB0cmFuc2ZlciAoZS5nLiBIQUxfQ1JZUEV4X0FFU19ETUEoKSkKICAgICAgICAgICAgICgrKyspIEVuYWJsZSB0aGUgRE1BMiBpbnRlcmZhY2UgY2xvY2sgdXNpbmcKICAgICAgICAgICAgICAgICBfX0hBTF9SQ0NfRE1BMl9DTEtfRU5BQkxFKCkKICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSBhbmQgZW5hYmxlIHR3byBETUEgY2hhbm5lbHMgb25lIGZvciBtYW5hZ2luZyBkYXRhIHRyYW5zZmVyIGZyb20KICAgICAgICAgICAgICAgICBtZW1vcnkgdG8gcGVyaXBoZXJhbCAoaW5wdXQgY2hhbm5lbCkgYW5kIGFub3RoZXIgY2hhbm5lbCBmb3IgbWFuYWdpbmcgZGF0YQogICAgICAgICAgICAgICAgIHRyYW5zZmVyIGZyb20gcGVyaXBoZXJhbCB0byBtZW1vcnkgKG91dHB1dCBjaGFubmVsKQogICAgICAgICAgICAgKCsrKykgQXNzb2NpYXRlIHRoZSBpbml0aWFsaXplZCBETUEgaGFuZGxlIHRvIHRoZSBDUllQIERNQSBoYW5kbGUKICAgICAgICAgICAgICAgICB1c2luZyBfX0hBTF9MSU5LRE1BKCkKICAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyIGNvbXBsZXRlCiAgICAgICAgICAgICAgICAgaW50ZXJydXB0IG9uIHRoZSB0d28gRE1BIGNoYW5uZWxzLiBUaGUgb3V0cHV0IGNoYW5uZWwgc2hvdWxkIGhhdmUgaGlnaGVyCiAgICAgICAgICAgICAgICAgcHJpb3JpdHkgdGhhbiB0aGUgaW5wdXQgY2hhbm5lbC4KICAgICAgICAgICAgICAgICBSZXNvcnQgdG8gSEFMX05WSUNfU2V0UHJpb3JpdHkoKSBhbmQgSEFMX05WSUNfRW5hYmxlSVJRKCkKCiAgICAgICgjKUluaXRpYWxpemUgdGhlIENSWVAgSEFMIHVzaW5nIEhBTF9DUllQX0luaXQoKS4gVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzOgogICAgICAgICAoKyspIFRoZSBkYXRhIHR5cGU6IDEtYml0LCA4LWJpdCwgMTYtYml0IGFuZCAzMi1iaXQKICAgICAgICAgKCsrKSBUaGUgQUVTIG9wZXJhdGluZyBtb2RlIChlbmNyeXB0aW9uLCBrZXkgZGVyaXZhdGlvbiBhbmQvb3IgZGVjcnlwdGlvbikKICAgICAgICAgKCsrKSBUaGUgQUVTIGNoYWluaW5nIG1vZGUgKEVDQiwgQ0JDLCBDVFIsIEdDTSwgR01BQywgQ01BQyB3aGVuIGFwcGxpY2FibGUsIENDTSB3aGVuIGFwcGxpY2FibGUpCiAgICAgICAgICgrKykgVGhlIGVuY3J5cHRpb24vZGVjcnlwdGlvbiBrZXkgaWYgc28gcmVxdWlyZWQKICAgICAgICAgKCsrKSBUaGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIG9yIG5vbmNlIGlmIGFwcGxpY2FibGUgKG5vdCB1c2VkIGluIEVDQiBtb2RlKS4KCiAgICAgICgjKVRocmVlIHByb2Nlc3NpbmcgKGVuY3J5cHRpb24vZGVjcnlwdGlvbikgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGU6CiAgICAgICAgICgrKykgUG9sbGluZyBtb2RlOiBlbmNyeXB0aW9uIGFuZCBkZWNyeXB0aW9uIEFQSXMgYXJlIGJsb2NraW5nIGZ1bmN0aW9ucwogICAgICAgICAgICAgIGkuZS4gdGhleSBwcm9jZXNzIHRoZSBkYXRhIGFuZCB3YWl0IHRpbGwgdGhlIHByb2Nlc3NpbmcgaXMgZmluaXNoZWQKICAgICAgICAgKCsrKSBJbnRlcnJ1cHQgbW9kZTogZW5jcnlwdGlvbiBhbmQgZGVjcnlwdGlvbiBBUElzIGFyZSBub3QgYmxvY2tpbmcgZnVuY3Rpb25zCiAgICAgICAgICAgICAgaS5lLiB0aGV5IHByb2Nlc3MgdGhlIGRhdGEgdW5kZXIgaW50ZXJydXB0CiAgICAgICAgICgrKykgRE1BIG1vZGU6IGVuY3J5cHRpb24gYW5kIGRlY3J5cHRpb24gQVBJcyBhcmUgbm90IGJsb2NraW5nIGZ1bmN0aW9ucwogICAgICAgICAgICAgIGkuZS4gdGhlIGRhdGEgdHJhbnNmZXIgaXMgZW5zdXJlZCBieSBETUEKCiAgICAgICAoIylDYWxsIEhBTF9DUllQX0RlSW5pdCgpIHRvIGRlaW5pdGlhbGl6ZSB0aGUgQ1JZUCBwZXJpcGhlcmFsLgoKICAgICAqKiogQ2FsbGJhY2sgcmVnaXN0cmF0aW9uICoqKgogICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgWy4uXQogICAgICAoIykgVGhlIGNvbXBpbGF0aW9uIGRlZmluZSAgVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxCiAgICAgICAgICBhbGxvd3MgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLgogICAgICAgICAgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX0NSWVBfUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlZ2lzdGVyIGEgdXNlciBjYWxsYmFjay4KCiAgICAgICgjKSBGdW5jdGlvbiBAcmVmIEhBTF9DUllQX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nIGNhbGxiYWNrczoKICAgICAgICAgICAgKCspIEluQ3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIGlucHV0IERNQSB0cmFuc2ZlciBjb21wbGV0aW9uLgogICAgICAgICAgICAoKykgT3V0Q3BsdENhbGxiYWNrIDogY2FsbGJhY2sgZm9yIG91dHB1dCBETUEgdHJhbnNmZXIgY29tcGxldGlvbi4KICAgICAgICAgICAgKCspIENvbXBDcGx0Q2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgY29tcHV0YXRpb24gY29tcGxldGlvbi4KICAgICAgICAgICAgKCspIEVycm9yQ2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgZXJyb3IuCiAgICAgICAgICAgICgrKSBNc3BJbml0Q2FsbGJhY2sgICAgOiBDUllQIE1zcEluaXQuCiAgICAgICAgICAgICgrKSBNc3BEZUluaXRDYWxsYmFjayAgOiBDUllQIE1zcERlSW5pdC4KICAgICAgICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKICAgICAgICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCgogICAgICAoIykgVXNlIGZ1bmN0aW9uIEByZWYgSEFMX0NSWVBfVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0byB0aGUgZGVmYXVsdAogICAgICAgICAgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb24uCiAgICAgICAgICBAcmVmIEhBTF9DUllQX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwKICAgICAgICAgIGFuZCB0aGUgQ2FsbGJhY2sgSUQuCiAgICAgICAgICBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byByZXNldCBmb2xsb3dpbmcgY2FsbGJhY2tzOgogICAgICAgICAgICAoKykgSW5DcGx0Q2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgaW5wdXQgRE1BIHRyYW5zZmVyIGNvbXBsZXRpb24uCiAgICAgICAgICAgICgrKSBPdXRDcGx0Q2FsbGJhY2sgOiBjYWxsYmFjayBmb3Igb3V0cHV0IERNQSB0cmFuc2ZlciBjb21wbGV0aW9uLgogICAgICAgICAgICAoKykgQ29tcENwbHRDYWxsYmFjayA6IGNhbGxiYWNrIGZvciBjb21wdXRhdGlvbiBjb21wbGV0aW9uLgogICAgICAgICAgICAoKykgRXJyb3JDYWxsYmFjayA6IGNhbGxiYWNrIGZvciBlcnJvci4KICAgICAgICAgICAgKCspIE1zcEluaXRDYWxsYmFjayAgICA6IENSWVAgTXNwSW5pdC4KICAgICAgICAgICAgKCspIE1zcERlSW5pdENhbGxiYWNrICA6IENSWVAgTXNwRGVJbml0LgoKICAgICAgKCMpIEJ5IGRlZmF1bHQsIGFmdGVyIHRoZSBAcmVmIEhBTF9DUllQX0luaXQgYW5kIGlmIHRoZSBzdGF0ZSBpcyBIQUxfQ1JZUF9TVEFURV9SRVNFVAogICAgICAgICAgYWxsIGNhbGxiYWNrcyBhcmUgcmVzZXQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgbGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uczoKICAgICAgICAgIGV4YW1wbGVzIEByZWYgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soKSwgQHJlZiBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKCkKICAgICAgICAgIEV4Y2VwdGlvbiBkb25lIGZvciBNc3BJbml0IGFuZCBNc3BEZUluaXQgY2FsbGJhY2tzIHRoYXQgYXJlIHJlc3BlY3RpdmVseQogICAgICAgICAgcmVzZXQgdG8gdGhlIGxlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBmdW5jdGlvbnMgaW4gdGhlIEByZWYgSEFMX0NSWVBfSW5pdAogICAgICAgICAgYW5kIEByZWYgSEFMX0NSWVBfRGVJbml0IG9ubHkgd2hlbiB0aGVzZSBjYWxsYmFja3MgYXJlIG51bGwgKG5vdCByZWdpc3RlcmVkIGJlZm9yZWhhbmQpCiAgICAgICAgICBJZiBub3QsIE1zcEluaXQgb3IgTXNwRGVJbml0IGFyZSBub3QgbnVsbCwgdGhlIEByZWYgSEFMX0NSWVBfSW5pdCBhbmQgQHJlZiBIQUxfQ1JZUF9EZUluaXQKICAgICAgICAgIGtlZXAgYW5kIHVzZSB0aGUgdXNlciBNc3BJbml0L01zcERlSW5pdCBjYWxsYmFja3MgKHJlZ2lzdGVyZWQgYmVmb3JlaGFuZCkuCgogICAgICAgICAgQ2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZCBpbiBSRUFEWSBzdGF0ZSBvbmx5LgogICAgICAgICAgRXhjZXB0aW9uIGRvbmUgZm9yIE1zcEluaXQvTXNwRGVJbml0IGNhbGxiYWNrcyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkL3VucmVnaXN0ZXJlZAogICAgICAgICAgaW4gUkVBRFkgb3IgUkVTRVQgc3RhdGUsIHRodXMgcmVnaXN0ZXJlZCAodXNlcikgTXNwSW5pdC9EZUluaXQgY2FsbGJhY2tzIGNhbiBiZSB1c2VkCiAgICAgICAgICBkdXJpbmcgdGhlIEluaXQvRGVJbml0LgogICAgICAgICAgSW4gdGhhdCBjYXNlIGZpcnN0IHJlZ2lzdGVyIHRoZSBNc3BJbml0L01zcERlSW5pdCB1c2VyIGNhbGxiYWNrcwogICAgICAgICAgdXNpbmcgQHJlZiBIQUxfQ1JZUF9SZWdpc3RlckNhbGxiYWNrIGJlZm9yZSBjYWxsaW5nIEByZWYgSEFMX0NSWVBfRGVJbml0CiAgICAgICAgICBvciBAcmVmIEhBTF+oQ1JZUF9Jbml0IGZ1bmN0aW9uLgoKICAgICAgICAgIFdoZW4gVGhlIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCiAgICAgICAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdGVyaW5nIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQogICAgICAgICAgYW5kIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrcyBhcmUgdXNlZC4KCgogIEBlbmR2ZXJiYXRpbQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCgovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAic3RtMzJsNHh4X2hhbC5oIgoKI2lmZGVmIEhBTF9DUllQX01PRFVMRV9FTkFCTEVECgojaWYgZGVmaW5lZChBRVMpCgovKiogQGFkZHRvZ3JvdXAgU1RNMzJMNHh4X0hBTF9Ecml2ZXIKICAqIEB7CiAgKi8KCi8qKiBAZGVmZ3JvdXAgQ1JZUCBDUllQCiAgKiBAYnJpZWYgQ1JZUCBIQUwgbW9kdWxlIGRyaXZlci4KICAqIEB7CiAgKi8KCgoKLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyoqIEBkZWZncm91cCBDUllQX1ByaXZhdGVfRnVuY3Rpb25zIENSWVAgUHJpdmF0ZSBGdW5jdGlvbnMKICAqIEB7CiAgKi8KCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX1NldEluaXRWZWN0b3IoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCk7CnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX1NldEtleShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKTsKc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIENSWVBfQUVTX0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApOwoKLyoqCiAgKiBAfQogICovCgovKiBFeHBvcnRlZCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnMgQ1JZUCBFeHBvcnRlZCBGdW5jdGlvbnMKICAqIEB7CiAgKi8KCi8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBkZWluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucwogKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucy4KICoKQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgIyMjIyMgSW5pdGlhbGl6YXRpb24gYW5kIGRlaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgogICAgICAoKykgSW5pdGlhbGl6ZSB0aGUgQ1JZUCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCiAgICAgICAgICBpbiB0aGUgQ1JZUF9Jbml0VHlwZURlZiBhbmQgY3JlYXRlcyB0aGUgYXNzb2NpYXRlZCBoYW5kbGUKICAgICAgKCspIERlSW5pdGlhbGl6ZSB0aGUgQ1JZUCBwZXJpcGhlcmFsCiAgICAgICgrKSBJbml0aWFsaXplIHRoZSBDUllQIE1TUCAoTUNVIFNwZWNpZmljIFBhY2thZ2UpCiAgICAgICgrKSBEZS1Jbml0aWFsaXplIHRoZSBDUllQIE1TUAoKICAgIFsuLl0KICAgIChAKSBTcGVjaWZpYyBjYXJlIG11c3QgYmUgdGFrZW4gdG8gZm9ybWF0IHRoZSBrZXkgYW5kIHRoZSBJbml0aWFsaXphdGlvbiBWZWN0b3IgSVYhCgogICBbLi5dIElmIHRoZSBrZXkgaXMgZGVmaW5lZCBhcyBhIDEyOC1iaXQgbG9uZyBhcnJheSBrZXlbMTI3Li4wXSA9IHtiMTI3IC4uLiBiMH0gd2hlcmUKICAgICAgICBiMTI3IGlzIHRoZSBNU0IgYW5kIGIwIHRoZSBMU0IsIHRoZSBrZXkgbXVzdCBiZSBzdG9yZWQgaW4gTUNVIG1lbW9yeQogICAgICAgICgrKSBhcyBhIHNlcXVlbmNlIG9mIHdvcmRzIHdoZXJlIHRoZSBNU0Igd29yZCBjb21lcyBmaXJzdCAob2NjdXBpZXMgdGhlCiAgICAgICAgICBsb3dlc3QgbWVtb3J5IGFkZHJlc3MpCiAgICAgICAgKCspIHdoZXJlIGVhY2ggd29yZCBpcyBieXRlLXN3YXBwZWQ6CiAgICAgICAgICgrKykgICBhZGRyZXNzIG4rMCA6IDBiIGIxMDMgLi4gYjk2IGIxMTEgLi4gYjEwNCBiMTE5IC4uIGIxMTIgYjEyNyAuLiBiMTIwCiAgICAgICAgICgrKykgICBhZGRyZXNzIG4rNCA6IDBiIGI3MSAuLiBiNjQgYjc5IC4uIGI3MiBiODcgLi4gYjgwIGI5NSAuLiBiODgKICAgICAgICAgKCsrKSAgIGFkZHJlc3Mgbis4IDogMGIgYjM5IC4uIGIzMiBiNDcgLi4gYjQwIGI1NSAuLiBiNDggYjYzIC4uIGI1NgogICAgICAgICAoKyspICAgYWRkcmVzcyBuK0MgOiAwYiBiNyAuLiBiMCBiMTUgLi4gYjggYjIzIC4uIGIxNiBiMzEgLi4gYjI0CiAgICBbLi5dIEhlcmVhZnRlciwgYW5vdGhlciBpbGx1c3RyYXRpb24gd2hlbiBjb25zaWRlcmluZyBhIDEyOC1iaXQgbG9uZyBrZXkgbWFkZSBvZiAxNiBieXRlcyB7QjE1Li5CMH0uCiAgICAgICAgVGhlIDQgMzItYml0IHdvcmRzIHRoYXQgbWFrZSB0aGUga2V5IG11c3QgYmUgc3RvcmVkIGFzIGZvbGxvd3MgaW4gTUNVIG1lbW9yeToKICAgICAgICAgKCspICAgIGFkZHJlc3MgbiswIDogMHggQjEyIEIxMyBCMTQgQjE1CiAgICAgICAgICgrKSAgICBhZGRyZXNzIG4rNCA6IDB4IEI4IEI5IEIxMCBCMTEKICAgICAgICAgKCspICAgIGFkZHJlc3Mgbis4IDogMHggQjQgQjUgQjYgQjcKICAgICAgICAgKCspICAgIGFkZHJlc3MgbitDIDogMHggQjAgQjEgQjIgQjMKICAgIFsuLl0gIHdoaWNoIGxlYWRzIHRvIHRoZSBleHBlY3RlZCBzZXR0aW5nCiAgICAgICgrKSAgICAgICBBRVNfS0VZUjMgPSAweCBCMTUgQjE0IEIxMyBCMTIKICAgICAgKCspICAgICAgIEFFU19LRVlSMiA9IDB4IEIxMSBCMTAgQjkgQjgKICAgICAgKCspICAgICAgIEFFU19LRVlSMSA9IDB4IEI3IEI2IEI1IEI0CiAgICAgICgrKSAgICAgICBBRVNfS0VZUjAgPSAweCBCMyBCMiBCMSBCMAoKICAgWy4uXSAgU2FtZSBmb3JtYXQgbXVzdCBiZSBhcHBsaWVkIGZvciBhIDI1Ni1iaXQgbG9uZyBrZXkgbWFkZSBvZiAzMiBieXRlcyB7QjMxLi5CMH0uCiAgICAgICAgIFRoZSA4IDMyLWJpdCB3b3JkcyB0aGF0IG1ha2UgdGhlIGtleSBtdXN0IGJlIHN0b3JlZCBhcyBmb2xsb3dzIGluIE1DVSBtZW1vcnk6CiAgICAgICAgICgrKSAgICBhZGRyZXNzIG4rMDAgOiAweCBCMjggQjI5IEIzMCBCMzEKICAgICAgICAgKCspICAgIGFkZHJlc3MgbiswNCA6IDB4IEIyNCBCMjUgQjI2IEIyNwogICAgICAgICAoKykgICAgYWRkcmVzcyBuKzA4IDogMHggQjIwIEIyMSBCMjIgQjIzCiAgICAgICAgICgrKSAgICBhZGRyZXNzIG4rMEMgOiAweCBCMTYgQjE3IEIxOCBCMTkKICAgICAgICAgKCspICAgIGFkZHJlc3MgbisxMCA6IDB4IEIxMiBCMTMgQjE0IEIxNQogICAgICAgICAoKykgICAgYWRkcmVzcyBuKzE0IDogMHggQjggQjkgQjEwIEIxMQogICAgICAgICAoKykgICAgYWRkcmVzcyBuKzE4IDogMHggQjQgQjUgQjYgQjcKICAgICAgICAgKCspICAgIGFkZHJlc3MgbisxQyA6IDB4IEIwIEIxIEIyIEIzCiAgICBbLi5dICB3aGljaCBsZWFkcyB0byB0aGUgZXhwZWN0ZWQgc2V0dGluZwogICAgICAoKykgICAgICAgQUVTX0tFWVI3ID0gMHggQjMxIEIzMCBCMjkgQjI4CiAgICAgICgrKSAgICAgICBBRVNfS0VZUjYgPSAweCBCMjcgQjI2IEIyNSBCMjQKICAgICAgKCspICAgICAgIEFFU19LRVlSNSA9IDB4IEIyMyBCMjIgQjIxIEIyMAogICAgICAoKykgICAgICAgQUVTX0tFWVI0ID0gMHggQjE5IEIxOCBCMTcgQjE2CiAgICAgICgrKSAgICAgICBBRVNfS0VZUjMgPSAweCBCMTUgQjE0IEIxMyBCMTIKICAgICAgKCspICAgICAgIEFFU19LRVlSMiA9IDB4IEIxMSBCMTAgQjkgQjgKICAgICAgKCspICAgICAgIEFFU19LRVlSMSA9IDB4IEI3IEI2IEI1IEI0CiAgICAgICgrKSAgICAgICBBRVNfS0VZUjAgPSAweCBCMyBCMiBCMSBCMAoKICAgWy4uXSBJbml0aWFsaXphdGlvbiBWZWN0b3IgSVYgKDQgMzItYml0IHdvcmRzKSBmb3JtYXQgbXVzdCBmb2xsb3cgdGhlIHNhbWUgYXMKICAgICAgICB0aGF0IG9mIGEgMTI4LWJpdCBsb25nIGtleS4KCiAgWy4uXQoKQGVuZHZlcmJhdGltCiAgKiBAewogICovCgovKioKICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgQ1JZUCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAogICogICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBDUllQX0luaXRUeXBlRGVmIGFuZCBpbml0aWFsaXplIHRoZSBhc3NvY2lhdGVkIGhhbmRsZS4KICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUgIAogICogQG5vdGUgU3BlY2lmaWMgY2FyZSBtdXN0IGJlIHRha2VuIHRvIGZvcm1hdCB0aGUga2V5IGFuZCB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yIElWCiAgKiAgICAgICBzdG9yZWQgaW4gdGhlIE1DVSBtZW1vcnkgYmVmb3JlIGNhbGxpbmcgSEFMX0NSWVBfSW5pdCgpLiBSZWZlciB0byBleHBsYW5hdGlvbnMKICAqICAgICAgIGhlcmVhYm92ZS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0luaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIC8qIENoZWNrIHRoZSBDUllQIGhhbmRsZSBhbGxvY2F0aW9uICovCiAgaWYoaGNyeXAgPT0gTlVMTCkKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KCiAgLyogQ2hlY2sgdGhlIGluc3RhbmNlICovCiAgYXNzZXJ0X3BhcmFtKElTX0FFU19BTExfSU5TVEFOQ0UoaGNyeXAtPkluc3RhbmNlKSk7CgogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfS0VZU0laRShoY3J5cC0+SW5pdC5LZXlTaXplKSk7CiAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfREFUQVRZUEUoaGNyeXAtPkluaXQuRGF0YVR5cGUpKTsKICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9BTEdPTU9ERShoY3J5cC0+SW5pdC5PcGVyYXRpbmdNb2RlKSk7CiAgLyogQ2hhaW5pbmdNb2RlIHBhcmFtZXRlciBpcyBpcnJlbGV2YW50IHdoZW4gbW9kZSBpcyBzZXQgdG8gS2V5IGRlcml2YXRpb24gKi8KICBpZiAoaGNyeXAtPkluaXQuT3BlcmF0aW5nTW9kZSAhPSBDUllQX0FMR09NT0RFX0tFWURFUklWQVRJT04pCiAgewogICAgYXNzZXJ0X3BhcmFtKElTX0NSWVBfQ0hBSU5NT0RFKGhjcnlwLT5Jbml0LkNoYWluaW5nTW9kZSkpOwogIH0KICBhc3NlcnRfcGFyYW0oSVNfQ1JZUF9XUklURShoY3J5cC0+SW5pdC5LZXlXcml0ZUZsYWcpKTsKCiAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgLyogQ2hlY2sgdGhlIHByb3BlciBvcGVyYXRpbmcvY2hhaW5pbmcgbW9kZXMgY29tYmluYXRpb25zICovCiAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgLyogQ2hlY2sgdGhlIHByb3BlciBjaGFpbmluZyB3aGVuIHRoZSBvcGVyYXRpbmcgbW9kZSBpcyBrZXkgZGVyaXZhdGlvbiBhbmQgZGVjcnlwdGlvbiAqLwojaWYgZGVmaW5lZChBRVNfQ1JfTlBCTEIpCiAgaWYgKChoY3J5cC0+SW5pdC5PcGVyYXRpbmdNb2RlID09IENSWVBfQUxHT01PREVfS0VZREVSSVZBVElPTl9ERUNSWVBUKSAmJlwKICAgICAgICAgKChoY3J5cC0+SW5pdC5DaGFpbmluZ01vZGUgPT0gQ1JZUF9DSEFJTk1PREVfQUVTX0NUUikgICAgICAgICAgIFwKICAgICAgIHx8IChoY3J5cC0+SW5pdC5DaGFpbmluZ01vZGUgPT0gQ1JZUF9DSEFJTk1PREVfQUVTX0dDTV9HTUFDKSAgICAgIFwKICAgICAgIHx8IChoY3J5cC0+SW5pdC5DaGFpbmluZ01vZGUgPT0gQ1JZUF9DSEFJTk1PREVfQUVTX0NDTSkpKQojZWxzZQogIGlmICgoaGNyeXAtPkluaXQuT3BlcmF0aW5nTW9kZSA9PSBDUllQX0FMR09NT0RFX0tFWURFUklWQVRJT05fREVDUllQVCkgJiZcCiAgICAgICAgICgoaGNyeXAtPkluaXQuQ2hhaW5pbmdNb2RlID09IENSWVBfQ0hBSU5NT0RFX0FFU19DVFIpICAgICAgICAgICBcCiAgICAgICB8fCAoaGNyeXAtPkluaXQuQ2hhaW5pbmdNb2RlID09IENSWVBfQ0hBSU5NT0RFX0FFU19HQ01fR01BQykgICAgICBcCiAgICAgICB8fCAoaGNyeXAtPkluaXQuQ2hhaW5pbmdNb2RlID09IENSWVBfQ0hBSU5NT0RFX0FFU19DTUFDKSkpCiNlbmRpZgogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQogIC8qIENoZWNrIHRoYXQga2V5IGRlcml2YXRpb24gaXMgbm90IHNldCBpbiBDTUFDIG1vZGUgb3IgQ0NNIG1vZGUgd2hlbiBhcHBsaWNhYmxlICovCiNpZiBkZWZpbmVkKEFFU19DUl9OUEJMQikKICBpZiAoKGhjcnlwLT5Jbml0Lk9wZXJhdGluZ01vZGUgPT0gQ1JZUF9BTEdPTU9ERV9LRVlERVJJVkFUSU9OKQogICAmJiAoaGNyeXAtPkluaXQuQ2hhaW5pbmdNb2RlID09IENSWVBfQ0hBSU5NT0RFX0FFU19DQ00pKQojZWxzZQogIGlmICgoaGNyeXAtPkluaXQuT3BlcmF0aW5nTW9kZSA9PSBDUllQX0FMR09NT0RFX0tFWURFUklWQVRJT04pCiAgICYmIChoY3J5cC0+SW5pdC5DaGFpbmluZ01vZGUgPT0gQ1JZUF9DSEFJTk1PREVfQUVTX0NNQUMpKQojZW5kaWYKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KCgogIC8qPT09PT09PT09PT09PT09PSovCiAgLyogSW5pdGlhbGl6YXRpb24gKi8KICAvKj09PT09PT09PT09PT09PT0qLwogIC8qIEluaXRpYWxpemF0aW9uIHN0YXJ0ICovCiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogIGlmIChoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVTRVQpCiAgewogICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogICAgaGNyeXAtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CgogICAgLyogUmVzZXQgQ2FsbGJhY2sgcG9pbnRlcnMgaW4gSEFMX0NSWVBfU1RBVEVfUkVTRVQgb25seSAqLwogICAgaGNyeXAtPkluQ3BsdENhbGxiYWNrICAgPSAgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGlucHV0IERNQSB0cmFuc2ZlciBjb21wbGV0aW9uIGNhbGxiYWNrICovCiAgICBoY3J5cC0+T3V0Q3BsdENhbGxiYWNrICAgPSAgSEFMX0NSWVBfT3V0Q3BsdENhbGxiYWNrOyAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIG91dHB1dCBETUEgdHJhbnNmZXIgY29tcGxldGlvbiBjYWxsYmFjayAqLwogICAgaGNyeXAtPkNvbXBDcGx0Q2FsbGJhY2sgPSAgSEFMX0NSWVBFeF9Db21wdXRhdGlvbkNwbHRDYWxsYmFjazsgLyogTGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGNvbXB1dGF0aW9uIGNvbXBsZXRpb24gY2FsbGJhY2sgKi8KICAgIGhjcnlwLT5FcnJvckNhbGxiYWNrICAgID0gIEhBTF9DUllQX0Vycm9yQ2FsbGJhY2s7ICAgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBlcnJvciBjYWxsYmFjayAqLwogICAgaWYoaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQogICAgewogICAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0NSWVBfTXNwSW5pdDsKICAgIH0KCiAgICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2soaGNyeXApOwogIH0KI2Vsc2UKICBpZihoY3J5cC0+U3RhdGUgPT0gSEFMX0NSWVBfU1RBVEVfUkVTRVQpCiAgewogICAgLyogQWxsb2NhdGUgbG9jayByZXNvdXJjZSBhbmQgaW5pdGlhbGl6ZSBpdCAqLwogICAgaGNyeXAtPkxvY2sgPSBIQUxfVU5MT0NLRUQ7CgogICAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCiAgICBIQUxfQ1JZUF9Nc3BJbml0KGhjcnlwKTsKICB9CiNlbmRpZiAvKiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUykgKi8KCiAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKCiAgLyogRGlzYWJsZSB0aGUgUGVyaXBoZXJhbCAqLwogIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgogIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgLyogQUVTIGluaXRpYWxpemF0aW9uIGNvbW1vbiB0byBhbGwgb3BlcmF0aW5nIG1vZGVzICAgICAgICAgICAgKi8KICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogIC8qIFNldCB0aGUgS2V5IHNpemUgc2VsZWN0aW9uICovCiAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfS0VZU0laRSwgaGNyeXAtPkluaXQuS2V5U2l6ZSk7CgogIC8qIFNldCB0aGUgZGVmYXVsdCBDUllQIHBoYXNlIHdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgbm90IHVzZWQuCiAgICAgUGhhc2UgaXMgdXBkYXRlZCBiZWxvdyBpbiBjYXNlIG9mIEdDTS9HTUFDKC9DTUFDKSgvQ0NNKSBzZXR0aW5nLiAqLwogIGhjcnlwLT5QaGFzZSA9IEhBTF9DUllQX1BIQVNFX05PVF9VU0VEOwoKCgogIC8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgLyogQ2Fycnkgb24gdGhlIGluaXRpYWxpemF0aW9uIGJhc2VkIG9uIHRoZSBBRVMgb3BlcmF0aW5nIG1vZGUgKi8KICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogIC8qIEtleSBkZXJpdmF0aW9uICovCiAgaWYgKGhjcnlwLT5Jbml0Lk9wZXJhdGluZ01vZGUgPT0gQ1JZUF9BTEdPTU9ERV9LRVlERVJJVkFUSU9OKQogIHsKICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX01PREUsIENSWVBfQUxHT01PREVfS0VZREVSSVZBVElPTik7CgogICAgLyogQ29uZmlndXJlIHRoZSBLZXkgcmVnaXN0ZXJzICovCiAgICBpZiAoQ1JZUF9TZXRLZXkoaGNyeXApICE9IEhBTF9PSykKICAgIHsKICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgIH0KICB9CiAgZWxzZQogIC8qIEVuY3J5cHRpb24gLyBEZWNyeXB0aW9uICh3aXRoIG9yIHdpdGhvdXQga2V5IGRlcml2YXRpb24pIC8gYXV0aGVudGljYXRpb24gKi8KICB7CiNpZiAhZGVmaW5lZChBRVNfQ1JfTlBCTEIpCiAgICAvKiBTZXQgZGF0YSB0eXBlLCBvcGVyYXRpbmcgYW5kIGNoYWluaW5nIG1vZGVzLgogICAgICAgSW4gY2FzZSBvZiBHQ00gb3IgR01BQywgZGF0YSB0eXBlIGlzIGZvcmNlZCB0byAwYjAwICovCiAgICBpZiAoaGNyeXAtPkluaXQuQ2hhaW5pbmdNb2RlID09IENSWVBfQ0hBSU5NT0RFX0FFU19HQ01fR01BQykKICAgIHsKICAgICAgTU9ESUZZX1JFRyhoY3J5cC0+SW5zdGFuY2UtPkNSLCBBRVNfQ1JfREFUQVRZUEV8QUVTX0NSX01PREV8QUVTX0NSX0NITU9ELCBoY3J5cC0+SW5pdC5PcGVyYXRpbmdNb2RlfGhjcnlwLT5Jbml0LkNoYWluaW5nTW9kZSk7CiAgICB9CiAgICBlbHNlCiNlbmRpZgogICAgewogICAgICBNT0RJRllfUkVHKGhjcnlwLT5JbnN0YW5jZS0+Q1IsIEFFU19DUl9EQVRBVFlQRXxBRVNfQ1JfTU9ERXxBRVNfQ1JfQ0hNT0QsIGhjcnlwLT5Jbml0LkRhdGFUeXBlfGhjcnlwLT5Jbml0Lk9wZXJhdGluZ01vZGV8aGNyeXAtPkluaXQuQ2hhaW5pbmdNb2RlKTsKICAgIH0KCgogICAvKiBTcGVjaWZ5IHRoZSBlbmNyeXB0aW9uL2RlY3J5cHRpb24gcGhhc2UgaW4gY2FzZSBvZiBHYWxvaXMgY291bnRlciBtb2RlIChHQ00pLAogICAgICBHYWxvaXMgbWVzc2FnZSBhdXRoZW50aWNhdGlvbiBjb2RlIChHTUFDKSwgY2lwaGVyIG1lc3NhZ2UgYXV0aGVudGljYXRpb24gY29kZSAoQ01BQykgd2hlbiBhcHBsaWNhYmxlCiAgICAgIG9yIENvdW50ZXIgd2l0aCBDaXBoZXIgTW9kZSAoQ0NNKSB3aGVuIGFwcGxpY2FibGUgKi8KI2lmIGRlZmluZWQoQUVTX0NSX05QQkxCKQogICBpZiAoKGhjcnlwLT5Jbml0LkNoYWluaW5nTW9kZSA9PSBDUllQX0NIQUlOTU9ERV9BRVNfR0NNX0dNQUMpCiAgICB8fCAoaGNyeXAtPkluaXQuQ2hhaW5pbmdNb2RlID09IENSWVBfQ0hBSU5NT0RFX0FFU19DQ00pKQojZWxzZQogICBpZiAoKGhjcnlwLT5Jbml0LkNoYWluaW5nTW9kZSA9PSBDUllQX0NIQUlOTU9ERV9BRVNfR0NNX0dNQUMpCiAgICB8fCAoaGNyeXAtPkluaXQuQ2hhaW5pbmdNb2RlID09IENSWVBfQ0hBSU5NT0RFX0FFU19DTUFDKSkKI2VuZGlmCiAgICB7CiAgICAgIE1PRElGWV9SRUcoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX0dDTVBILCBoY3J5cC0+SW5pdC5HQ01DTUFDUGhhc2UpOwogICAgICBoY3J5cC0+UGhhc2UgPSBIQUxfQ1JZUF9QSEFTRV9TVEFSVDsKICAgIH0KCgogICAgLyogQ29uZmlndXJlIHRoZSBLZXkgcmVnaXN0ZXJzIGlmIG5vIG5lZWQgdG8gYnlwYXNzIHRoaXMgc3RlcCAqLwogICAgaWYgKGhjcnlwLT5Jbml0LktleVdyaXRlRmxhZyA9PSBDUllQX0tFWV9XUklURV9FTkFCTEUpCiAgICB7CiAgICAgIGlmIChDUllQX1NldEtleShoY3J5cCkgIT0gSEFMX09LKQogICAgICB7CiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgfQogICAgfQoKICAgIC8qIElmIGFwcGxpY2FibGUsIGNvbmZpZ3VyZSB0aGUgSW5pdGlhbGl6YXRpb24gVmVjdG9yICovCiAgICBpZiAoaGNyeXAtPkluaXQuQ2hhaW5pbmdNb2RlICE9IENSWVBfQ0hBSU5NT0RFX0FFU19FQ0IpCiAgICB7CiAgICAgIGlmIChDUllQX1NldEluaXRWZWN0b3IoaGNyeXApICE9IEhBTF9PSykKICAgICAgewogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0KICB9CgojaWYgZGVmaW5lZChBRVNfQ1JfTlBCTEIpCiAgLyogQ2xlYXIgTlBCTEIgZmllbGQgKi8KICBDTEVBUl9CSVQoaGNyeXAtPkluc3RhbmNlLT5DUiwgQUVTX0NSX05QQkxCKTsKI2VuZGlmCgogIC8qIFJlc2V0IENyeXBJbkNvdW50IGFuZCBDcnlwT3V0Q291bnQgKi8KICBoY3J5cC0+Q3J5cEluQ291bnQgPSAwOwogIGhjcnlwLT5DcnlwT3V0Q291bnQgPSAwOwoKICAvKiBSZXNldCBFcnJvckNvZGUgZmllbGQgKi8KICBoY3J5cC0+RXJyb3JDb2RlID0gSEFMX0NSWVBfRVJST1JfTk9ORTsKCiAgLyogUmVzZXQgTW9kZSBzdXNwZW5zaW9uIHJlcXVlc3QgKi8KICBoY3J5cC0+U3VzcGVuZFJlcXVlc3QgPSBIQUxfQ1JZUF9TVVNQRU5EX05PTkU7CgogIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogIGhjcnlwLT5TdGF0ZSA9IEhBTF9DUllQX1NUQVRFX1JFQURZOwoKICAvKiBFbmFibGUgdGhlIFBlcmlwaGVyYWwgKi8KICBfX0hBTF9DUllQX0VOQUJMRShoY3J5cCk7CgogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9CgovKioKICAqIEBicmllZiAgRGVJbml0aWFsaXplIHRoZSBDUllQIHBlcmlwaGVyYWwuCiAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9EZUluaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIC8qIENoZWNrIHRoZSBDUllQIGhhbmRsZSBhbGxvY2F0aW9uICovCiAgaWYoaGNyeXAgPT0gTlVMTCkKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KCiAgLyogQ2hhbmdlIHRoZSBDUllQIHN0YXRlICovCiAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfQlVTWTsKCiAgLyogU2V0IHRoZSBkZWZhdWx0IENSWVAgcGhhc2UgKi8KICBoY3J5cC0+UGhhc2UgPSBIQUxfQ1JZUF9QSEFTRV9SRUFEWTsKCiAgLyogUmVzZXQgQ3J5cEluQ291bnQgYW5kIENyeXBPdXRDb3VudCAqLwogIGhjcnlwLT5DcnlwSW5Db3VudCA9IDA7CiAgaGNyeXAtPkNyeXBPdXRDb3VudCA9IDA7CgogIC8qIERpc2FibGUgdGhlIENSWVAgUGVyaXBoZXJhbCBDbG9jayAqLwogIF9fSEFMX0NSWVBfRElTQUJMRShoY3J5cCk7CgojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgIGlmKGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9PSBOVUxMKQogICAgewogICAgICBoY3J5cC0+TXNwRGVJbml0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9Nc3BEZUluaXQ7CiAgICB9CgogICAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmU6IENMT0NLLCBOVklDLiovCiAgSEFMX0NSWVBfTXNwRGVJbml0KGhjcnlwKTsKI2VuZGlmIC8qIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTKSAqLwoKICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9SRVNFVDsKCiAgLyogUmVsZWFzZSBMb2NrICovCiAgX19IQUxfVU5MT0NLKGhjcnlwKTsKCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBJbml0aWFsaXplIHRoZSBDUllQIE1TUC4KICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEByZXR2YWwgTm9uZQogICovCl9fd2VhayB2b2lkIEhBTF9DUllQX01zcEluaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICBVTlVTRUQoaGNyeXApOwoKICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkOyB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9Nc3BJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICovCn0KCi8qKgogICogQGJyaWVmICBEZUluaXRpYWxpemUgQ1JZUCBNU1AuCiAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpfX3dlYWsgdm9pZCBIQUxfQ1JZUF9Nc3BEZUluaXQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICBVTlVTRUQoaGNyeXApOwoKICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkOyB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9Nc3BEZUluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8KfQoKLyoqCiAgKiBAfQogICovCgovKiogQGRlZmdyb3VwIENSWVBfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBBRVMgcHJvY2Vzc2luZyBmdW5jdGlvbnMKICogIEBicmllZiAgIFByb2Nlc3NpbmcgZnVuY3Rpb25zLgogKgpAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEFFUyBwcm9jZXNzaW5nIGZ1bmN0aW9ucyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKICAgICAgKCspIEVuY3J5cHQgcGxhaW50ZXh0IHVzaW5nIEFFUyBhbGdvcml0aG0gaW4gZGlmZmVyZW50IGNoYWluaW5nIG1vZGVzCiAgICAgICgrKSBEZWNyeXB0IGN5cGhlcnRleHQgdXNpbmcgQUVTIGFsZ29yaXRobSBpbiBkaWZmZXJlbnQgY2hhaW5pbmcgbW9kZXMKICAgIFsuLl0gIFRocmVlIHByb2Nlc3NpbmcgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGU6CiAgICAgICgrKSBQb2xsaW5nIG1vZGUKICAgICAgKCspIEludGVycnVwdCBtb2RlCiAgICAgICgrKSBETUEgbW9kZQoKQGVuZHZlcmJhdGltCiAgKiBAewogICovCgoKLyoqCiAgKiBAYnJpZWYgIEVuY3J5cHQgcFBsYWluRGF0YSBpbiBBRVMgRUNCIGVuY3J5cHRpb24gbW9kZS4gVGhlIGN5cGhlciBkYXRhIGFyZSBhdmFpbGFibGUgaW4gcEN5cGhlckRhdGEuCiAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIHBQbGFpbkRhdGEgUG9pbnRlciB0byB0aGUgcGxhaW50ZXh0IGJ1ZmZlcgogICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LgogICogQHBhcmFtICBwQ3lwaGVyRGF0YSBQb2ludGVyIHRvIHRoZSBjeXBoZXJ0ZXh0IGJ1ZmZlcgogICogQHBhcmFtICBUaW1lb3V0IFNwZWNpZnkgVGltZW91dCB2YWx1ZQogICogQG5vdGUgICBUaGlzIEFQSSBpcyBwcm92aWRlZCBvbmx5IHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgc29mdHdhcmUuIFVzZXJzIHNob3VsZCBkaXJlY3RseQogICogICAgICAgICByZXNvcnQgdG8gZ2VuZXJpYyBIQUxfQ1JZUEV4X0FFUygpIEFQSSBpbnN0ZWFkICh1c2FnZSByZWNvbW1lbmRlZCkuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNFQ0JfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwUGxhaW5EYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwQ3lwaGVyRGF0YSwgdWludDMyX3QgVGltZW91dCkKewogIC8qIFJlLWluaXRpYWxpemUgQUVTIElQIHdpdGggcHJvcGVyIHBhcmFtZXRlcnMgKi8KICBpZiAoSEFMX0NSWVBfRGVJbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CiAgaGNyeXAtPkluaXQuT3BlcmF0aW5nTW9kZSA9IENSWVBfQUxHT01PREVfRU5DUllQVDsKICBoY3J5cC0+SW5pdC5DaGFpbmluZ01vZGUgPSBDUllQX0NIQUlOTU9ERV9BRVNfRUNCOwogIGhjcnlwLT5Jbml0LktleVdyaXRlRmxhZyA9IENSWVBfS0VZX1dSSVRFX0VOQUJMRTsKICBpZiAoSEFMX0NSWVBfSW5pdChoY3J5cCkgIT0gSEFMX09LKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQoKICByZXR1cm4gSEFMX0NSWVBFeF9BRVMoaGNyeXAsIHBQbGFpbkRhdGEsIFNpemUsIHBDeXBoZXJEYXRhLCBUaW1lb3V0KTsKfQoKCi8qKgogICogQGJyaWVmICBFbmNyeXB0IHBQbGFpbkRhdGEgaW4gQUVTIENCQyBlbmNyeXB0aW9uIG1vZGUgd2l0aCBrZXkgZGVyaXZhdGlvbi4gVGhlIGN5cGhlciBkYXRhIGFyZSBhdmFpbGFibGUgaW4gcEN5cGhlckRhdGEuCiAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIHBQbGFpbkRhdGEgUG9pbnRlciB0byB0aGUgcGxhaW50ZXh0IGJ1ZmZlcgogICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LgogICogQHBhcmFtICBwQ3lwaGVyRGF0YSBQb2ludGVyIHRvIHRoZSBjeXBoZXJ0ZXh0IGJ1ZmZlcgogICogQHBhcmFtICBUaW1lb3V0IFNwZWNpZnkgVGltZW91dCB2YWx1ZQogICogQG5vdGUgICBUaGlzIEFQSSBpcyBwcm92aWRlZCBvbmx5IHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgc29mdHdhcmUuIFVzZXJzIHNob3VsZCBkaXJlY3RseQogICogICAgICAgICByZXNvcnQgdG8gZ2VuZXJpYyBIQUxfQ1JZUEV4X0FFUygpIEFQSSBpbnN0ZWFkICh1c2FnZSByZWNvbW1lbmRlZCkuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNDQkNfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwUGxhaW5EYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwQ3lwaGVyRGF0YSwgdWludDMyX3QgVGltZW91dCkKewogIC8qIFJlLWluaXRpYWxpemUgQUVTIElQIHdpdGggcHJvcGVyIHBhcmFtZXRlcnMgKi8KICBpZiAoSEFMX0NSWVBfRGVJbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CiAgaGNyeXAtPkluaXQuT3BlcmF0aW5nTW9kZSA9IENSWVBfQUxHT01PREVfRU5DUllQVDsKICBoY3J5cC0+SW5pdC5DaGFpbmluZ01vZGUgPSBDUllQX0NIQUlOTU9ERV9BRVNfQ0JDOwogIGhjcnlwLT5Jbml0LktleVdyaXRlRmxhZyA9IENSWVBfS0VZX1dSSVRFX0VOQUJMRTsKICBpZiAoSEFMX0NSWVBfSW5pdChoY3J5cCkgIT0gSEFMX09LKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQoKICByZXR1cm4gSEFMX0NSWVBFeF9BRVMoaGNyeXAsIHBQbGFpbkRhdGEsIFNpemUsIHBDeXBoZXJEYXRhLCBUaW1lb3V0KTsKfQoKCi8qKgogICogQGJyaWVmICBFbmNyeXB0IHBQbGFpbkRhdGEgaW4gQUVTIENUUiBlbmNyeXB0aW9uIG1vZGUuIFRoZSBjeXBoZXIgZGF0YSBhcmUgYXZhaWxhYmxlIGluIHBDeXBoZXJEYXRhCiAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIHBQbGFpbkRhdGEgUG9pbnRlciB0byB0aGUgcGxhaW50ZXh0IGJ1ZmZlcgogICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LgogICogQHBhcmFtICBwQ3lwaGVyRGF0YSBQb2ludGVyIHRvIHRoZSBjeXBoZXJ0ZXh0IGJ1ZmZlcgogICogQHBhcmFtICBUaW1lb3V0IFNwZWNpZnkgVGltZW91dCB2YWx1ZQogICogQG5vdGUgICBUaGlzIEFQSSBpcyBwcm92aWRlZCBvbmx5IHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgc29mdHdhcmUuIFVzZXJzIHNob3VsZCBkaXJlY3RseQogICogICAgICAgICByZXNvcnQgdG8gZ2VuZXJpYyBIQUxfQ1JZUEV4X0FFUygpIEFQSSBpbnN0ZWFkICh1c2FnZSByZWNvbW1lbmRlZCkuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNDVFJfRW5jcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwUGxhaW5EYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwQ3lwaGVyRGF0YSwgdWludDMyX3QgVGltZW91dCkKewogIC8qIFJlLWluaXRpYWxpemUgQUVTIElQIHdpdGggcHJvcGVyIHBhcmFtZXRlcnMgKi8KICBpZiAoSEFMX0NSWVBfRGVJbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CiAgaGNyeXAtPkluaXQuT3BlcmF0aW5nTW9kZSA9IENSWVBfQUxHT01PREVfRU5DUllQVDsKICBoY3J5cC0+SW5pdC5DaGFpbmluZ01vZGUgPSBDUllQX0NIQUlOTU9ERV9BRVNfQ1RSOwogIGhjcnlwLT5Jbml0LktleVdyaXRlRmxhZyA9IENSWVBfS0VZX1dSSVRFX0VOQUJMRTsKICBpZiAoSEFMX0NSWVBfSW5pdChoY3J5cCkgIT0gSEFMX09LKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQoKICByZXR1cm4gSEFMX0NSWVBFeF9BRVMoaGNyeXAsIHBQbGFpbkRhdGEsIFNpemUsIHBDeXBoZXJEYXRhLCBUaW1lb3V0KTsKfQoKLyoqCiAgKiBAYnJpZWYgIERlY3J5cHQgcEN5cGhlckRhdGEgaW4gQUVTIEVDQiBkZWNyeXB0aW9uIG1vZGUgd2l0aCBrZXkgZGVyaXZhdGlvbiwKICAqICAgICAgICAgdGhlIGRlY3lwaGVyZWQgZGF0YSBhcmUgYXZhaWxhYmxlIGluIHBQbGFpbkRhdGEuCiAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIHBDeXBoZXJEYXRhIFBvaW50ZXIgdG8gdGhlIGN5cGhlcnRleHQgYnVmZmVyCiAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyIGluIGJ5dGVzLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuCiAgKiBAcGFyYW0gIHBQbGFpbkRhdGEgUG9pbnRlciB0byB0aGUgcGxhaW50ZXh0IGJ1ZmZlcgogICogQHBhcmFtICBUaW1lb3V0IFNwZWNpZnkgVGltZW91dCB2YWx1ZQogICogQG5vdGUgICBUaGlzIEFQSSBpcyBwcm92aWRlZCBvbmx5IHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgc29mdHdhcmUuIFVzZXJzIHNob3VsZCBkaXJlY3RseQogICogICAgICAgICByZXNvcnQgdG8gZ2VuZXJpYyBIQUxfQ1JZUEV4X0FFUygpIEFQSSBpbnN0ZWFkICh1c2FnZSByZWNvbW1lbmRlZCkuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNFQ0JfRGVjcnlwdChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwQ3lwaGVyRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcFBsYWluRGF0YSwgdWludDMyX3QgVGltZW91dCkKewogIC8qIFJlLWluaXRpYWxpemUgQUVTIElQIHdpdGggcHJvcGVyIHBhcmFtZXRlcnMgKi8KICBpZiAoSEFMX0NSWVBfRGVJbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CiAgaGNyeXAtPkluaXQuT3BlcmF0aW5nTW9kZSA9IENSWVBfQUxHT01PREVfS0VZREVSSVZBVElPTl9ERUNSWVBUOwogIGhjcnlwLT5Jbml0LkNoYWluaW5nTW9kZSA9IENSWVBfQ0hBSU5NT0RFX0FFU19FQ0I7CiAgaGNyeXAtPkluaXQuS2V5V3JpdGVGbGFnID0gQ1JZUF9LRVlfV1JJVEVfRU5BQkxFOwogIGlmIChIQUxfQ1JZUF9Jbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIHJldHVybiBIQUxfQ1JZUEV4X0FFUyhoY3J5cCwgcEN5cGhlckRhdGEsIFNpemUsIHBQbGFpbkRhdGEsIFRpbWVvdXQpOwp9CgovKioKICAqIEBicmllZiAgRGVjcnlwdCBwQ3lwaGVyRGF0YSBpbiBBRVMgRUNCIGRlY3J5cHRpb24gbW9kZSB3aXRoIGtleSBkZXJpdmF0aW9uLAogICogICAgICAgICB0aGUgZGVjeXBoZXJlZCBkYXRhIGFyZSBhdmFpbGFibGUgaW4gcFBsYWluRGF0YS4KICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEBwYXJhbSAgcEN5cGhlckRhdGEgUG9pbnRlciB0byB0aGUgY3lwaGVydGV4dCBidWZmZXIKICAqIEBwYXJhbSAgU2l6ZSBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIgaW4gYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4KICAqIEBwYXJhbSAgcFBsYWluRGF0YSBQb2ludGVyIHRvIHRoZSBwbGFpbnRleHQgYnVmZmVyCiAgKiBAcGFyYW0gIFRpbWVvdXQgU3BlY2lmeSBUaW1lb3V0IHZhbHVlCiAgKiBAbm90ZSAgIFRoaXMgQVBJIGlzIHByb3ZpZGVkIG9ubHkgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBzb2Z0d2FyZS4gVXNlcnMgc2hvdWxkIGRpcmVjdGx5CiAgKiAgICAgICAgIHJlc29ydCB0byBnZW5lcmljIEhBTF9DUllQRXhfQUVTKCkgQVBJIGluc3RlYWQgKHVzYWdlIHJlY29tbWVuZGVkKS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0FFU0NCQ19EZWNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwUGxhaW5EYXRhLCB1aW50MzJfdCBUaW1lb3V0KQp7CiAgLyogUmUtaW5pdGlhbGl6ZSBBRVMgSVAgd2l0aCBwcm9wZXIgcGFyYW1ldGVycyAqLwogIGlmIChIQUxfQ1JZUF9EZUluaXQoaGNyeXApICE9IEhBTF9PSykKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KICBoY3J5cC0+SW5pdC5PcGVyYXRpbmdNb2RlID0gQ1JZUF9BTEdPTU9ERV9LRVlERVJJVkFUSU9OX0RFQ1JZUFQ7CiAgaGNyeXAtPkluaXQuQ2hhaW5pbmdNb2RlID0gQ1JZUF9DSEFJTk1PREVfQUVTX0NCQzsKICBoY3J5cC0+SW5pdC5LZXlXcml0ZUZsYWcgPSBDUllQX0tFWV9XUklURV9FTkFCTEU7CiAgaWYgKEhBTF9DUllQX0luaXQoaGNyeXApICE9IEhBTF9PSykKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KCiAgcmV0dXJuIEhBTF9DUllQRXhfQUVTKGhjcnlwLCBwQ3lwaGVyRGF0YSwgU2l6ZSwgcFBsYWluRGF0YSwgVGltZW91dCk7Cn0KCi8qKgogICogQGJyaWVmICBEZWNyeXB0IHBDeXBoZXJEYXRhIGluIEFFUyBDVFIgZGVjcnlwdGlvbiBtb2RlLAogICogICAgICAgICB0aGUgZGVjeXBoZXJlZCBkYXRhIGFyZSBhdmFpbGFibGUgaW4gcFBsYWluRGF0YS4KICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEBwYXJhbSAgcEN5cGhlckRhdGEgUG9pbnRlciB0byB0aGUgY3lwaGVydGV4dCBidWZmZXIKICAqIEBwYXJhbSAgU2l6ZSBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIgaW4gYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4KICAqIEBwYXJhbSAgcFBsYWluRGF0YSBQb2ludGVyIHRvIHRoZSBwbGFpbnRleHQgYnVmZmVyCiAgKiBAcGFyYW0gIFRpbWVvdXQgU3BlY2lmeSBUaW1lb3V0IHZhbHVlCiAgKiBAbm90ZSAgIFRoaXMgQVBJIGlzIHByb3ZpZGVkIG9ubHkgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBzb2Z0d2FyZS4gVXNlcnMgc2hvdWxkIGRpcmVjdGx5CiAgKiAgICAgICAgIHJlc29ydCB0byBnZW5lcmljIEhBTF9DUllQRXhfQUVTKCkgQVBJIGluc3RlYWQgKHVzYWdlIHJlY29tbWVuZGVkKS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0FFU0NUUl9EZWNyeXB0KENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwUGxhaW5EYXRhLCB1aW50MzJfdCBUaW1lb3V0KQp7CiAgLyogUmUtaW5pdGlhbGl6ZSBBRVMgSVAgd2l0aCBwcm9wZXIgcGFyYW1ldGVycyAqLwogIGlmIChIQUxfQ1JZUF9EZUluaXQoaGNyeXApICE9IEhBTF9PSykKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KICBoY3J5cC0+SW5pdC5PcGVyYXRpbmdNb2RlID0gQ1JZUF9BTEdPTU9ERV9ERUNSWVBUOwogIGhjcnlwLT5Jbml0LkNoYWluaW5nTW9kZSA9IENSWVBfQ0hBSU5NT0RFX0FFU19DVFI7CiAgaGNyeXAtPkluaXQuS2V5V3JpdGVGbGFnID0gQ1JZUF9LRVlfV1JJVEVfRU5BQkxFOwogIGlmIChIQUxfQ1JZUF9Jbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIHJldHVybiBIQUxfQ1JZUEV4X0FFUyhoY3J5cCwgcEN5cGhlckRhdGEsIFNpemUsIHBQbGFpbkRhdGEsIFRpbWVvdXQpOwp9CgovKioKICAqIEBicmllZiAgRW5jcnlwdCBwUGxhaW5EYXRhIGluIEFFUyBFQ0IgZW5jcnlwdGlvbiBtb2RlIHVzaW5nIEludGVycnVwdCwKICAqICAgICAgICAgdGhlIGN5cGhlciBkYXRhIGFyZSBhdmFpbGFibGUgaW4gcEN5cGhlckRhdGEuCiAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIHBQbGFpbkRhdGEgUG9pbnRlciB0byB0aGUgcGxhaW50ZXh0IGJ1ZmZlcgogICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LgogICogQHBhcmFtICBwQ3lwaGVyRGF0YSBQb2ludGVyIHRvIHRoZSBjeXBoZXJ0ZXh0IGJ1ZmZlcgogICogQG5vdGUgICBUaGlzIEFQSSBpcyBwcm92aWRlZCBvbmx5IHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgc29mdHdhcmUuIFVzZXJzIHNob3VsZCBkaXJlY3RseQogICogICAgICAgICByZXNvcnQgdG8gZ2VuZXJpYyBIQUxfQ1JZUEV4X0FFU19JVCgpIEFQSSBpbnN0ZWFkICh1c2FnZSByZWNvbW1lbmRlZCkuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNFQ0JfRW5jcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwUGxhaW5EYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwQ3lwaGVyRGF0YSkKewogIC8qIFJlLWluaXRpYWxpemUgQUVTIElQIHdpdGggcHJvcGVyIHBhcmFtZXRlcnMgKi8KICBpZiAoSEFMX0NSWVBfRGVJbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CiAgaGNyeXAtPkluaXQuT3BlcmF0aW5nTW9kZSA9IENSWVBfQUxHT01PREVfRU5DUllQVDsKICBoY3J5cC0+SW5pdC5DaGFpbmluZ01vZGUgPSBDUllQX0NIQUlOTU9ERV9BRVNfRUNCOwogIGhjcnlwLT5Jbml0LktleVdyaXRlRmxhZyA9IENSWVBfS0VZX1dSSVRFX0VOQUJMRTsKICBpZiAoSEFMX0NSWVBfSW5pdChoY3J5cCkgIT0gSEFMX09LKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQoKICByZXR1cm4gSEFMX0NSWVBFeF9BRVNfSVQoaGNyeXAsIHBQbGFpbkRhdGEsIFNpemUsIHBDeXBoZXJEYXRhKTsKfQoKLyoqCiAgKiBAYnJpZWYgIEVuY3J5cHQgcFBsYWluRGF0YSBpbiBBRVMgQ0JDIGVuY3J5cHRpb24gbW9kZSB1c2luZyBJbnRlcnJ1cHQsCiAgKiAgICAgICAgIHRoZSBjeXBoZXIgZGF0YSBhcmUgYXZhaWxhYmxlIGluIHBDeXBoZXJEYXRhLgogICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBwUGxhaW5EYXRhIFBvaW50ZXIgdG8gdGhlIHBsYWludGV4dCBidWZmZXIKICAqIEBwYXJhbSAgU2l6ZSBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIgaW4gYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4KICAqIEBwYXJhbSAgcEN5cGhlckRhdGEgUG9pbnRlciB0byB0aGUgY3lwaGVydGV4dCBidWZmZXIKICAqIEBub3RlICAgVGhpcyBBUEkgaXMgcHJvdmlkZWQgb25seSB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IHNvZnR3YXJlLiBVc2VycyBzaG91bGQgZGlyZWN0bHkKICAqICAgICAgICAgcmVzb3J0IHRvIGdlbmVyaWMgSEFMX0NSWVBFeF9BRVNfSVQoKSBBUEkgaW5zdGVhZCAodXNhZ2UgcmVjb21tZW5kZWQpLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfQUVTQ0JDX0VuY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcFBsYWluRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcEN5cGhlckRhdGEpCnsKICAvKiBSZS1pbml0aWFsaXplIEFFUyBJUCB3aXRoIHByb3BlciBwYXJhbWV0ZXJzICovCiAgaWYgKEhBTF9DUllQX0RlSW5pdChoY3J5cCkgIT0gSEFMX09LKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQogIGhjcnlwLT5Jbml0Lk9wZXJhdGluZ01vZGUgPSBDUllQX0FMR09NT0RFX0VOQ1JZUFQ7CiAgaGNyeXAtPkluaXQuQ2hhaW5pbmdNb2RlID0gQ1JZUF9DSEFJTk1PREVfQUVTX0NCQzsKICBoY3J5cC0+SW5pdC5LZXlXcml0ZUZsYWcgPSBDUllQX0tFWV9XUklURV9FTkFCTEU7CiAgaWYgKEhBTF9DUllQX0luaXQoaGNyeXApICE9IEhBTF9PSykKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KCiAgcmV0dXJuIEhBTF9DUllQRXhfQUVTX0lUKGhjcnlwLCBwUGxhaW5EYXRhLCBTaXplLCBwQ3lwaGVyRGF0YSk7Cn0KCgovKioKICAqIEBicmllZiAgRW5jcnlwdCBwUGxhaW5EYXRhIGluIEFFUyBDVFIgZW5jcnlwdGlvbiBtb2RlIHVzaW5nIEludGVycnVwdCwKICAqICAgICAgICAgdGhlIGN5cGhlciBkYXRhIGFyZSBhdmFpbGFibGUgaW4gcEN5cGhlckRhdGEuCiAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIHBQbGFpbkRhdGEgUG9pbnRlciB0byB0aGUgcGxhaW50ZXh0IGJ1ZmZlcgogICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LgogICogQHBhcmFtICBwQ3lwaGVyRGF0YSBQb2ludGVyIHRvIHRoZSBjeXBoZXJ0ZXh0IGJ1ZmZlcgogICogQG5vdGUgICBUaGlzIEFQSSBpcyBwcm92aWRlZCBvbmx5IHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgc29mdHdhcmUuIFVzZXJzIHNob3VsZCBkaXJlY3RseQogICogICAgICAgICByZXNvcnQgdG8gZ2VuZXJpYyBIQUxfQ1JZUEV4X0FFU19JVCgpIEFQSSBpbnN0ZWFkICh1c2FnZSByZWNvbW1lbmRlZCkuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNDVFJfRW5jcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwUGxhaW5EYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwQ3lwaGVyRGF0YSkKewogIC8qIFJlLWluaXRpYWxpemUgQUVTIElQIHdpdGggcHJvcGVyIHBhcmFtZXRlcnMgKi8KICBpZiAoSEFMX0NSWVBfRGVJbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CiAgaGNyeXAtPkluaXQuT3BlcmF0aW5nTW9kZSA9IENSWVBfQUxHT01PREVfRU5DUllQVDsKICBoY3J5cC0+SW5pdC5DaGFpbmluZ01vZGUgPSBDUllQX0NIQUlOTU9ERV9BRVNfQ1RSOwogIGhjcnlwLT5Jbml0LktleVdyaXRlRmxhZyA9IENSWVBfS0VZX1dSSVRFX0VOQUJMRTsKICBpZiAoSEFMX0NSWVBfSW5pdChoY3J5cCkgIT0gSEFMX09LKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQoKICByZXR1cm4gSEFMX0NSWVBFeF9BRVNfSVQoaGNyeXAsIHBQbGFpbkRhdGEsIFNpemUsIHBDeXBoZXJEYXRhKTsKfQoKLyoqCiAgKiBAYnJpZWYgIERlY3J5cHQgcEN5cGhlckRhdGEgaW4gQUVTIEVDQiBkZWNyeXB0aW9uIG1vZGUgdXNpbmcgSW50ZXJydXB0LAogICogICAgICAgICB0aGUgZGVjeXBoZXJlZCBkYXRhIGFyZSBhdmFpbGFibGUgaW4gcFBsYWluRGF0YS4KICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEBwYXJhbSAgcEN5cGhlckRhdGEgUG9pbnRlciB0byB0aGUgY3lwaGVydGV4dCBidWZmZXIKICAqIEBwYXJhbSAgU2l6ZSBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIgaW4gYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4KICAqIEBwYXJhbSAgcFBsYWluRGF0YSBQb2ludGVyIHRvIHRoZSBwbGFpbnRleHQgYnVmZmVyLgogICogQG5vdGUgICBUaGlzIEFQSSBpcyBwcm92aWRlZCBvbmx5IHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgc29mdHdhcmUuIFVzZXJzIHNob3VsZCBkaXJlY3RseQogICogICAgICAgICByZXNvcnQgdG8gZ2VuZXJpYyBIQUxfQ1JZUEV4X0FFU19JVCgpIEFQSSBpbnN0ZWFkICh1c2FnZSByZWNvbW1lbmRlZCkuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNFQ0JfRGVjcnlwdF9JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwQ3lwaGVyRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcFBsYWluRGF0YSkKewogIC8qIFJlLWluaXRpYWxpemUgQUVTIElQIHdpdGggcHJvcGVyIHBhcmFtZXRlcnMgKi8KICBpZiAoSEFMX0NSWVBfRGVJbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CiAgaGNyeXAtPkluaXQuT3BlcmF0aW5nTW9kZSA9IENSWVBfQUxHT01PREVfS0VZREVSSVZBVElPTl9ERUNSWVBUOwogIGhjcnlwLT5Jbml0LkNoYWluaW5nTW9kZSA9IENSWVBfQ0hBSU5NT0RFX0FFU19FQ0I7CiAgaGNyeXAtPkluaXQuS2V5V3JpdGVGbGFnID0gQ1JZUF9LRVlfV1JJVEVfRU5BQkxFOwogIGlmIChIQUxfQ1JZUF9Jbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIHJldHVybiBIQUxfQ1JZUEV4X0FFU19JVChoY3J5cCwgcEN5cGhlckRhdGEsIFNpemUsIHBQbGFpbkRhdGEpOwp9CgovKioKICAqIEBicmllZiAgRGVjcnlwdCBwQ3lwaGVyRGF0YSBpbiBBRVMgQ0JDIGRlY3J5cHRpb24gbW9kZSB1c2luZyBJbnRlcnJ1cHQsCiAgKiAgICAgICAgIHRoZSBkZWN5cGhlcmVkIGRhdGEgYXJlIGF2YWlsYWJsZSBpbiBwUGxhaW5EYXRhLgogICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBwQ3lwaGVyRGF0YSBQb2ludGVyIHRvIHRoZSBjeXBoZXJ0ZXh0IGJ1ZmZlcgogICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LgogICogQHBhcmFtICBwUGxhaW5EYXRhIFBvaW50ZXIgdG8gdGhlIHBsYWludGV4dCBidWZmZXIKICAqIEBub3RlICAgVGhpcyBBUEkgaXMgcHJvdmlkZWQgb25seSB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IHNvZnR3YXJlLiBVc2VycyBzaG91bGQgZGlyZWN0bHkKICAqICAgICAgICAgcmVzb3J0IHRvIGdlbmVyaWMgSEFMX0NSWVBFeF9BRVNfSVQoKSBBUEkgaW5zdGVhZCAodXNhZ2UgcmVjb21tZW5kZWQpLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfQUVTQ0JDX0RlY3J5cHRfSVQoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcEN5cGhlckRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBQbGFpbkRhdGEpCnsKICAvKiBSZS1pbml0aWFsaXplIEFFUyBJUCB3aXRoIHByb3BlciBwYXJhbWV0ZXJzICovCiAgaWYgKEhBTF9DUllQX0RlSW5pdChoY3J5cCkgIT0gSEFMX09LKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQogIGhjcnlwLT5Jbml0Lk9wZXJhdGluZ01vZGUgPSBDUllQX0FMR09NT0RFX0tFWURFUklWQVRJT05fREVDUllQVDsKICBoY3J5cC0+SW5pdC5DaGFpbmluZ01vZGUgPSBDUllQX0NIQUlOTU9ERV9BRVNfQ0JDOwogIGhjcnlwLT5Jbml0LktleVdyaXRlRmxhZyA9IENSWVBfS0VZX1dSSVRFX0VOQUJMRTsKICBpZiAoSEFMX0NSWVBfSW5pdChoY3J5cCkgIT0gSEFMX09LKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQoKICByZXR1cm4gSEFMX0NSWVBFeF9BRVNfSVQoaGNyeXAsIHBDeXBoZXJEYXRhLCBTaXplLCBwUGxhaW5EYXRhKTsKfQoKLyoqCiAgKiBAYnJpZWYgIERlY3J5cHQgcEN5cGhlckRhdGEgaW4gQUVTIENUUiBkZWNyeXB0aW9uIG1vZGUgdXNpbmcgSW50ZXJydXB0LAogICogICAgICAgICB0aGUgZGVjeXBoZXJlZCBkYXRhIGFyZSBhdmFpbGFibGUgaW4gcFBsYWluRGF0YS4KICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEBwYXJhbSAgcEN5cGhlckRhdGEgUG9pbnRlciB0byB0aGUgY3lwaGVydGV4dCBidWZmZXIKICAqIEBwYXJhbSAgU2l6ZSBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIgaW4gYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4KICAqIEBwYXJhbSAgcFBsYWluRGF0YSBQb2ludGVyIHRvIHRoZSBwbGFpbnRleHQgYnVmZmVyCiAgKiBAbm90ZSAgIFRoaXMgQVBJIGlzIHByb3ZpZGVkIG9ubHkgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBzb2Z0d2FyZS4gVXNlcnMgc2hvdWxkIGRpcmVjdGx5CiAgKiAgICAgICAgIHJlc29ydCB0byBnZW5lcmljIEhBTF9DUllQRXhfQUVTX0lUKCkgQVBJIGluc3RlYWQgKHVzYWdlIHJlY29tbWVuZGVkKS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0FFU0NUUl9EZWNyeXB0X0lUKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwUGxhaW5EYXRhKQp7CiAgLyogUmUtaW5pdGlhbGl6ZSBBRVMgSVAgd2l0aCBwcm9wZXIgcGFyYW1ldGVycyAqLwogIGlmIChIQUxfQ1JZUF9EZUluaXQoaGNyeXApICE9IEhBTF9PSykKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KICBoY3J5cC0+SW5pdC5PcGVyYXRpbmdNb2RlID0gQ1JZUF9BTEdPTU9ERV9ERUNSWVBUOwogIGhjcnlwLT5Jbml0LkNoYWluaW5nTW9kZSA9IENSWVBfQ0hBSU5NT0RFX0FFU19DVFI7CiAgaGNyeXAtPkluaXQuS2V5V3JpdGVGbGFnID0gQ1JZUF9LRVlfV1JJVEVfRU5BQkxFOwogIGlmIChIQUxfQ1JZUF9Jbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIHJldHVybiBIQUxfQ1JZUEV4X0FFU19JVChoY3J5cCwgcEN5cGhlckRhdGEsIFNpemUsIHBQbGFpbkRhdGEpOwp9CgovKioKICAqIEBicmllZiAgRW5jcnlwdCBwUGxhaW5EYXRhIGluIEFFUyBFQ0IgZW5jcnlwdGlvbiBtb2RlIHVzaW5nIERNQSwKICAqICAgICAgICAgdGhlIGN5cGhlciBkYXRhIGFyZSBhdmFpbGFibGUgaW4gcEN5cGhlckRhdGEuCiAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIHBQbGFpbkRhdGEgUG9pbnRlciB0byB0aGUgcGxhaW50ZXh0IGJ1ZmZlcgogICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LgogICogQHBhcmFtICBwQ3lwaGVyRGF0YSBQb2ludGVyIHRvIHRoZSBjeXBoZXJ0ZXh0IGJ1ZmZlcgogICogQG5vdGUgICBUaGlzIEFQSSBpcyBwcm92aWRlZCBvbmx5IHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgc29mdHdhcmUuIFVzZXJzIHNob3VsZCBkaXJlY3RseQogICogICAgICAgICByZXNvcnQgdG8gZ2VuZXJpYyBIQUxfQ1JZUEV4X0FFU19ETUEoKSBBUEkgaW5zdGVhZCAodXNhZ2UgcmVjb21tZW5kZWQpLgogICogQG5vdGUgICBwUGxhaW5EYXRhIGFuZCBwQ3lwaGVyRGF0YSBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgdG8gZW5zdXJlIGEgY29ycmVjdCBETUEgdHJhbnNmZXIgdG8gYW5kIGZyb20gdGhlIElQLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfQUVTRUNCX0VuY3J5cHRfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBQbGFpbkRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhKQp7CiAgLyogUmUtaW5pdGlhbGl6ZSBBRVMgSVAgd2l0aCBwcm9wZXIgcGFyYW1ldGVycyAqLwogIGlmIChIQUxfQ1JZUF9EZUluaXQoaGNyeXApICE9IEhBTF9PSykKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KICBoY3J5cC0+SW5pdC5PcGVyYXRpbmdNb2RlID0gQ1JZUF9BTEdPTU9ERV9FTkNSWVBUOwogIGhjcnlwLT5Jbml0LkNoYWluaW5nTW9kZSA9IENSWVBfQ0hBSU5NT0RFX0FFU19FQ0I7CiAgaGNyeXAtPkluaXQuS2V5V3JpdGVGbGFnID0gQ1JZUF9LRVlfV1JJVEVfRU5BQkxFOwogIGlmIChIQUxfQ1JZUF9Jbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIHJldHVybiBIQUxfQ1JZUEV4X0FFU19ETUEoaGNyeXAsIHBQbGFpbkRhdGEsIFNpemUsIHBDeXBoZXJEYXRhKTsKfQoKCgovKioKICAqIEBicmllZiAgRW5jcnlwdCBwUGxhaW5EYXRhIGluIEFFUyBDQkMgZW5jcnlwdGlvbiBtb2RlIHVzaW5nIERNQSwKICAqICAgICAgICAgdGhlIGN5cGhlciBkYXRhIGFyZSBhdmFpbGFibGUgaW4gcEN5cGhlckRhdGEuCiAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIHBQbGFpbkRhdGEgUG9pbnRlciB0byB0aGUgcGxhaW50ZXh0IGJ1ZmZlcgogICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciwgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LgogICogQHBhcmFtICBwQ3lwaGVyRGF0YSBQb2ludGVyIHRvIHRoZSBjeXBoZXJ0ZXh0IGJ1ZmZlcgogICogQG5vdGUgICBUaGlzIEFQSSBpcyBwcm92aWRlZCBvbmx5IHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgc29mdHdhcmUuIFVzZXJzIHNob3VsZCBkaXJlY3RseQogICogICAgICAgICByZXNvcnQgdG8gZ2VuZXJpYyBIQUxfQ1JZUEV4X0FFU19ETUEoKSBBUEkgaW5zdGVhZCAodXNhZ2UgcmVjb21tZW5kZWQpLgogICogQG5vdGUgICBwUGxhaW5EYXRhIGFuZCBwQ3lwaGVyRGF0YSBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgdG8gZW5zdXJlIGEgY29ycmVjdCBETUEgdHJhbnNmZXIgdG8gYW5kIGZyb20gdGhlIElQLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfQUVTQ0JDX0VuY3J5cHRfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBQbGFpbkRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhKQp7CiAgLyogUmUtaW5pdGlhbGl6ZSBBRVMgSVAgd2l0aCBwcm9wZXIgcGFyYW1ldGVycyAqLwogIGlmIChIQUxfQ1JZUF9EZUluaXQoaGNyeXApICE9IEhBTF9PSykKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KICBoY3J5cC0+SW5pdC5PcGVyYXRpbmdNb2RlID0gQ1JZUF9BTEdPTU9ERV9FTkNSWVBUOwogIGhjcnlwLT5Jbml0LkNoYWluaW5nTW9kZSA9IENSWVBfQ0hBSU5NT0RFX0FFU19DQkM7CiAgaGNyeXAtPkluaXQuS2V5V3JpdGVGbGFnID0gQ1JZUF9LRVlfV1JJVEVfRU5BQkxFOwogIGlmIChIQUxfQ1JZUF9Jbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIHJldHVybiBIQUxfQ1JZUEV4X0FFU19ETUEoaGNyeXAsIHBQbGFpbkRhdGEsIFNpemUsIHBDeXBoZXJEYXRhKTsKfQoKLyoqCiAgKiBAYnJpZWYgIEVuY3J5cHQgcFBsYWluRGF0YSBpbiBBRVMgQ1RSIGVuY3J5cHRpb24gbW9kZSB1c2luZyBETUEsCiAgKiAgICAgICAgIHRoZSBjeXBoZXIgZGF0YSBhcmUgYXZhaWxhYmxlIGluIHBDeXBoZXJEYXRhLgogICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBwUGxhaW5EYXRhIFBvaW50ZXIgdG8gdGhlIHBsYWludGV4dCBidWZmZXIKICAqIEBwYXJhbSAgU2l6ZSBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIgaW4gYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4KICAqIEBwYXJhbSAgcEN5cGhlckRhdGEgUG9pbnRlciB0byB0aGUgY3lwaGVydGV4dCBidWZmZXIuCiAgKiBAbm90ZSAgIFRoaXMgQVBJIGlzIHByb3ZpZGVkIG9ubHkgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBzb2Z0d2FyZS4gVXNlcnMgc2hvdWxkIGRpcmVjdGx5CiAgKiAgICAgICAgIHJlc29ydCB0byBnZW5lcmljIEhBTF9DUllQRXhfQUVTX0RNQSgpIEFQSSBpbnN0ZWFkICh1c2FnZSByZWNvbW1lbmRlZCkuCiAgKiBAbm90ZSAgIHBQbGFpbkRhdGEgYW5kIHBDeXBoZXJEYXRhIGJ1ZmZlcnMgbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCB0byBlbnN1cmUgYSBjb3JyZWN0IERNQSB0cmFuc2ZlciB0byBhbmQgZnJvbSB0aGUgSVAuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNDVFJfRW5jcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcFBsYWluRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcEN5cGhlckRhdGEpCnsKICAvKiBSZS1pbml0aWFsaXplIEFFUyBJUCB3aXRoIHByb3BlciBwYXJhbWV0ZXJzICovCiAgaWYgKEhBTF9DUllQX0RlSW5pdChoY3J5cCkgIT0gSEFMX09LKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQogIGhjcnlwLT5Jbml0Lk9wZXJhdGluZ01vZGUgPSBDUllQX0FMR09NT0RFX0VOQ1JZUFQ7CiAgaGNyeXAtPkluaXQuQ2hhaW5pbmdNb2RlID0gQ1JZUF9DSEFJTk1PREVfQUVTX0NUUjsKICBoY3J5cC0+SW5pdC5LZXlXcml0ZUZsYWcgPSBDUllQX0tFWV9XUklURV9FTkFCTEU7CiAgaWYgKEhBTF9DUllQX0luaXQoaGNyeXApICE9IEhBTF9PSykKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KCiAgcmV0dXJuIEhBTF9DUllQRXhfQUVTX0RNQShoY3J5cCwgcFBsYWluRGF0YSwgU2l6ZSwgcEN5cGhlckRhdGEpOwp9CgovKioKICAqIEBicmllZiAgRGVjcnlwdCBwQ3lwaGVyRGF0YSBpbiBBRVMgRUNCIGRlY3J5cHRpb24gbW9kZSB1c2luZyBETUEsCiAgKiAgICAgICAgIHRoZSBkZWN5cGhlcmVkIGRhdGEgYXJlIGF2YWlsYWJsZSBpbiBwUGxhaW5EYXRhLgogICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHBhcmFtICBwQ3lwaGVyRGF0YSBQb2ludGVyIHRvIHRoZSBjeXBoZXJ0ZXh0IGJ1ZmZlcgogICogQHBhcmFtICBTaXplIExlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IGJ1ZmZlciBpbiBieXRlcywgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LgogICogQHBhcmFtICBwUGxhaW5EYXRhIFBvaW50ZXIgdG8gdGhlIHBsYWludGV4dCBidWZmZXIKICAqIEBub3RlICAgVGhpcyBBUEkgaXMgcHJvdmlkZWQgb25seSB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IHNvZnR3YXJlLiBVc2VycyBzaG91bGQgZGlyZWN0bHkKICAqICAgICAgICAgcmVzb3J0IHRvIGdlbmVyaWMgSEFMX0NSWVBFeF9BRVNfRE1BKCkgQVBJIGluc3RlYWQgKHVzYWdlIHJlY29tbWVuZGVkKS4KICAqIEBub3RlICAgcFBsYWluRGF0YSBhbmQgcEN5cGhlckRhdGEgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkIHRvIGVuc3VyZSBhIGNvcnJlY3QgRE1BIHRyYW5zZmVyIHRvIGFuZCBmcm9tIHRoZSBJUC4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9DUllQX0FFU0VDQl9EZWNyeXB0X0RNQShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCB1aW50OF90ICpwQ3lwaGVyRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDhfdCAqcFBsYWluRGF0YSkKewogIC8qIFJlLWluaXRpYWxpemUgQUVTIElQIHdpdGggcHJvcGVyIHBhcmFtZXRlcnMgKi8KICBpZiAoSEFMX0NSWVBfRGVJbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CiAgaGNyeXAtPkluaXQuT3BlcmF0aW5nTW9kZSA9IENSWVBfQUxHT01PREVfS0VZREVSSVZBVElPTl9ERUNSWVBUOwogIGhjcnlwLT5Jbml0LkNoYWluaW5nTW9kZSA9IENSWVBfQ0hBSU5NT0RFX0FFU19FQ0I7CiAgaGNyeXAtPkluaXQuS2V5V3JpdGVGbGFnID0gQ1JZUF9LRVlfV1JJVEVfRU5BQkxFOwogIGlmIChIQUxfQ1JZUF9Jbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIHJldHVybiBIQUxfQ1JZUEV4X0FFU19ETUEoaGNyeXAsIHBDeXBoZXJEYXRhLCBTaXplLCBwUGxhaW5EYXRhKTsKfQoKLyoqCiAgKiBAYnJpZWYgIERlY3J5cHQgcEN5cGhlckRhdGEgaW4gQUVTIENCQyBkZWNyeXB0aW9uIG1vZGUgdXNpbmcgRE1BLAogICogICAgICAgICB0aGUgZGVjeXBoZXJlZCBkYXRhIGFyZSBhdmFpbGFibGUgaW4gcFBsYWluRGF0YS4KICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEBwYXJhbSAgcEN5cGhlckRhdGEgUG9pbnRlciB0byB0aGUgY3lwaGVydGV4dCBidWZmZXIKICAqIEBwYXJhbSAgU2l6ZSBMZW5ndGggb2YgdGhlIHBsYWludGV4dCBidWZmZXIgaW4gYnl0ZXMsIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi4KICAqIEBwYXJhbSAgcFBsYWluRGF0YSBQb2ludGVyIHRvIHRoZSBwbGFpbnRleHQgYnVmZmVyCiAgKiBAbm90ZSAgIFRoaXMgQVBJIGlzIHByb3ZpZGVkIG9ubHkgdG8gbWFpbnRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIGxlZ2FjeSBzb2Z0d2FyZS4gVXNlcnMgc2hvdWxkIGRpcmVjdGx5CiAgKiAgICAgICAgIHJlc29ydCB0byBnZW5lcmljIEhBTF9DUllQRXhfQUVTX0RNQSgpIEFQSSBpbnN0ZWFkICh1c2FnZSByZWNvbW1lbmRlZCkuCiAgKiBAbm90ZSAgIHBQbGFpbkRhdGEgYW5kIHBDeXBoZXJEYXRhIGJ1ZmZlcnMgbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCB0byBlbnN1cmUgYSBjb3JyZWN0IERNQSB0cmFuc2ZlciB0byBhbmQgZnJvbSB0aGUgSVAuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9BRVNDQkNfRGVjcnlwdF9ETUEoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgdWludDhfdCAqcEN5cGhlckRhdGEsIHVpbnQxNl90IFNpemUsIHVpbnQ4X3QgKnBQbGFpbkRhdGEpCnsKICAvKiBSZS1pbml0aWFsaXplIEFFUyBJUCB3aXRoIHByb3BlciBwYXJhbWV0ZXJzICovCiAgaWYgKEhBTF9DUllQX0RlSW5pdChoY3J5cCkgIT0gSEFMX09LKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQogIGhjcnlwLT5Jbml0Lk9wZXJhdGluZ01vZGUgPSBDUllQX0FMR09NT0RFX0tFWURFUklWQVRJT05fREVDUllQVDsKICBoY3J5cC0+SW5pdC5DaGFpbmluZ01vZGUgPSBDUllQX0NIQUlOTU9ERV9BRVNfQ0JDOwogIGhjcnlwLT5Jbml0LktleVdyaXRlRmxhZyA9IENSWVBfS0VZX1dSSVRFX0VOQUJMRTsKICBpZiAoSEFMX0NSWVBfSW5pdChoY3J5cCkgIT0gSEFMX09LKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQoKICByZXR1cm4gSEFMX0NSWVBFeF9BRVNfRE1BKGhjcnlwLCBwQ3lwaGVyRGF0YSwgU2l6ZSwgcFBsYWluRGF0YSk7Cn0KCi8qKgogICogQGJyaWVmICBEZWNyeXB0IHBDeXBoZXJEYXRhIGluIEFFUyBDVFIgZGVjcnlwdGlvbiBtb2RlIHVzaW5nIERNQSwKICAqICAgICAgICAgdGhlIGRlY3lwaGVyZWQgZGF0YSBhcmUgYXZhaWxhYmxlIGluIHBQbGFpbkRhdGEuCiAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcGFyYW0gIHBDeXBoZXJEYXRhIFBvaW50ZXIgdG8gdGhlIGN5cGhlcnRleHQgYnVmZmVyCiAgKiBAcGFyYW0gIFNpemUgTGVuZ3RoIG9mIHRoZSBwbGFpbnRleHQgYnVmZmVyIGluIGJ5dGVzLCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMTYuCiAgKiBAcGFyYW0gIHBQbGFpbkRhdGEgUG9pbnRlciB0byB0aGUgcGxhaW50ZXh0IGJ1ZmZlcgogICogQG5vdGUgICBUaGlzIEFQSSBpcyBwcm92aWRlZCBvbmx5IHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgc29mdHdhcmUuIFVzZXJzIHNob3VsZCBkaXJlY3RseQogICogICAgICAgICByZXNvcnQgdG8gZ2VuZXJpYyBIQUxfQ1JZUEV4X0FFU19ETUEoKSBBUEkgaW5zdGVhZCAodXNhZ2UgcmVjb21tZW5kZWQpLgogICogQG5vdGUgICBwUGxhaW5EYXRhIGFuZCBwQ3lwaGVyRGF0YSBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgdG8gZW5zdXJlIGEgY29ycmVjdCBETUEgdHJhbnNmZXIgdG8gYW5kIGZyb20gdGhlIElQLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfQUVTQ1RSX0RlY3J5cHRfRE1BKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXAsIHVpbnQ4X3QgKnBDeXBoZXJEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50OF90ICpwUGxhaW5EYXRhKQp7CiAgLyogUmUtaW5pdGlhbGl6ZSBBRVMgSVAgd2l0aCBwcm9wZXIgcGFyYW1ldGVycyAqLwogIGlmIChIQUxfQ1JZUF9EZUluaXQoaGNyeXApICE9IEhBTF9PSykKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KICBoY3J5cC0+SW5pdC5PcGVyYXRpbmdNb2RlID0gQ1JZUF9BTEdPTU9ERV9ERUNSWVBUOwogIGhjcnlwLT5Jbml0LkNoYWluaW5nTW9kZSA9IENSWVBfQ0hBSU5NT0RFX0FFU19DVFI7CiAgaGNyeXAtPkluaXQuS2V5V3JpdGVGbGFnID0gQ1JZUF9LRVlfV1JJVEVfRU5BQkxFOwogIGlmIChIQUxfQ1JZUF9Jbml0KGhjcnlwKSAhPSBIQUxfT0spCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIHJldHVybiBIQUxfQ1JZUEV4X0FFU19ETUEoaGNyeXAsIHBDeXBoZXJEYXRhLCBTaXplLCBwUGxhaW5EYXRhKTsKfQoKCi8qKgogICogQH0KICAqLwoKLyoqIEBkZWZncm91cCBDUllQX0V4cG9ydGVkX0Z1bmN0aW9uc19Hcm91cDMgQ2FsbGJhY2sgZnVuY3Rpb25zCiAqICBAYnJpZWYgICBDYWxsYmFjayBmdW5jdGlvbnMuCiAqCkB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgQ2FsbGJhY2sgZnVuY3Rpb25zICAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIEludGVycnVwdGlvbiBhbmQgRE1BIGNhbGxiYWNrIGZ1bmN0aW9uczoKICAgICAgKCspIERNQSBJbnB1dCBkYXRhIHRyYW5zZmVyIGNvbXBsZXRlCiAgICAgICgrKSBETUEgT3V0cHV0IGRhdGEgdHJhbnNmZXIgY29tcGxldGUKICAgICAgKCspIERNQSBvciBJbnRlcnJ1cHQgZXJyb3IKCkBlbmR2ZXJiYXRpbQogICogQHsKICAqLwoKLyoqCiAgKiBAYnJpZWYgIENSWVAgZXJyb3IgY2FsbGJhY2suCiAgKiBAcGFyYW0gIGhjcnlwIHBvaW50ZXIgdG8gYSBDUllQX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIENSWVAgbW9kdWxlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpfX3dlYWsgdm9pZCBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgVU5VU0VEKGhjcnlwKTsKCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZDsgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgICB0aGUgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLwp9CgovKioKICAqIEBicmllZiAgSW5wdXQgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrLgogICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHJldHZhbCBOb25lCiAgKi8KX193ZWFrIHZvaWQgSEFMX0NSWVBfSW5DcGx0Q2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICBVTlVTRUQoaGNyeXApOwoKICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkOyB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgIHRoZSBIQUxfQ1JZUF9JbkNwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLwp9CgovKioKICAqIEBicmllZiAgT3V0cHV0IERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjay4KICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEByZXR2YWwgTm9uZQogICovCl9fd2VhayB2b2lkIEhBTF9DUllQX091dENwbHRDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7CiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogIFVOVVNFRChoY3J5cCk7CgogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQ7IHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICAgdGhlIEhBTF9DUllQX091dENwbHRDYWxsYmFjayBjYW4gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLwp9CgojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLyoqCiAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBDUllQIENhbGxiYWNrCiAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayAoc3VyY2hhcmdlZCkgcHJlZGVmaW5lZCBjYWxsYmFjawogICogQHBhcmFtIGhjcnlwIENSWVAgaGFuZGxlCiAgKiBAcGFyYW0gQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgcmVnaXN0ZXJlZAogICogICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfSU5QVVRDUExUX0NCX0lEIENSWVAgaW5wdXQgRE1BIHRyYW5zZmVyIGNvbXBsZXRpb24gQ2FsbGJhY2sgSUQKICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9PVVRQVVRDUExUX0NCX0lEIENSWVAgb3V0cHV0IERNQSB0cmFuc2ZlciBjb21wbGV0aW9uIENhbGxiYWNrIElECiAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfQ09NUENQTFRfQ0JfSUQgQ1JZUCBjb21wdXRhdGlvbiBjb21wbGV0aW9uIENhbGxiYWNrIElECiAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfRVJST1JfQ0JfSUQgQ1JZUCBlcnJvciBjYWxsYmFjayBJRAogICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgQ1JZUCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9NU1BERUlOSVRfQ0JfSUQgQ1JZUCBNc3BEZUluaXQgY2FsbGJhY2sgSUQKICAqIEBwYXJhbSBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KICAqIEByZXR2YWwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0NSWVBfUmVnaXN0ZXJDYWxsYmFjayhDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwLCBIQUxfQ1JZUF9DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELCBwQ1JZUF9DYWxsYmFja1R5cGVEZWYgcENhbGxiYWNrKQp7CiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwoKICBpZihwQ2FsbGJhY2sgPT0gTlVMTCkKICB7CiAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQogIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgX19IQUxfTE9DSyhoY3J5cCk7CgogIGlmKEhBTF9DUllQX1NUQVRFX1JFQURZID09IGhjcnlwLT5TdGF0ZSkKICB7CiAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICB7CiAgICBjYXNlIEhBTF9DUllQX0lOUFVUQ1BMVF9DQl9JRCA6CiAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgYnJlYWs7CgogICAgY2FzZSBIQUxfQ1JZUF9PVVRQVVRDUExUX0NCX0lEIDoKICAgICAgaGNyeXAtPk91dENwbHRDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgYnJlYWs7CgogICAgY2FzZSBIQUxfQ1JZUF9DT01QQ1BMVF9DQl9JRCA6CiAgICAgIGhjcnlwLT5Db21wQ3BsdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICBicmVhazsKCiAgICBjYXNlIEhBTF9DUllQX0VSUk9SX0NCX0lEIDoKICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2sgPSBwQ2FsbGJhY2s7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgSEFMX0NSWVBfTVNQSU5JVF9DQl9JRCA6CiAgICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIDoKICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICBicmVhazsKCiAgICBkZWZhdWx0IDoKICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8KICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGVsc2UgaWYoSEFMX0NSWVBfU1RBVEVfUkVTRVQgPT0gaGNyeXAtPlN0YXRlKQogIHsKICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgIHsKICAgIGNhc2UgSEFMX0NSWVBfTVNQSU5JVF9DQl9JRCA6CiAgICAgIGhjcnlwLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgSEFMX0NSWVBfTVNQREVJTklUX0NCX0lEIDoKICAgICAgaGNyeXAtPk1zcERlSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICBicmVhazsKCiAgICBkZWZhdWx0IDoKICAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8KICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICAvKiBVcGRhdGUgdGhlIGVycm9yIGNvZGUgKi8KICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX0VSUk9SX0lOVkFMSURfQ0FMTEJBQ0s7CiAgICAgLyogdXBkYXRlIHJldHVybiBzdGF0dXMgKi8KICAgICAgc3RhdHVzID0gIEhBTF9FUlJPUjsKICB9CgogIC8qIFJlbGVhc2UgTG9jayAqLwogIF9fSEFMX1VOTE9DSyhoY3J5cCk7CiAgcmV0dXJuIHN0YXR1czsKfQoKLyoqCiAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYSBDUllQIENhbGxiYWNrCiAgKiAgICAgICAgIENSWVAgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayAoc3VyY2hhcmdlZCkgcHJlZGVmaW5lZCBjYWxsYmFjawogICogQHBhcmFtIGhjcnlwIENSWVAgaGFuZGxlCiAgKiBAcGFyYW0gQ2FsbGJhY2tJRCBJRCBvZiB0aGUgY2FsbGJhY2sgdG8gYmUgdW5yZWdpc3RlcmVkCiAgKiAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9JTlBVVENQTFRfQ0JfSUQgQ1JZUCBpbnB1dCBETUEgdHJhbnNmZXIgY29tcGxldGlvbiBDYWxsYmFjayBJRAogICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX09VVFBVVENQTFRfQ0JfSUQgQ1JZUCBvdXRwdXQgRE1BIHRyYW5zZmVyIGNvbXBsZXRpb24gQ2FsbGJhY2sgSUQKICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9DT01QQ1BMVF9DQl9JRCBDUllQIGNvbXB1dGF0aW9uIGNvbXBsZXRpb24gQ2FsbGJhY2sgSUQKICAqICAgICAgICAgIEBhcmcgQHJlZiBIQUxfQ1JZUF9FUlJPUl9DQl9JRCBDUllQIGVycm9yIGNhbGxiYWNrIElECiAgKiAgICAgICAgICBAYXJnIEByZWYgSEFMX0NSWVBfTVNQSU5JVF9DQl9JRCBDUllQIE1zcERlSW5pdCBjYWxsYmFjayBJRAogICogICAgICAgICAgQGFyZyBAcmVmIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCBDUllQIE1zcERlSW5pdCBjYWxsYmFjayBJRAogICogQHJldHZhbCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfQ1JZUF9VblJlZ2lzdGVyQ2FsbGJhY2soQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCwgSEFMX0NSWVBfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKewpIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CgogIC8qIFByb2Nlc3MgbG9ja2VkICovCiAgX19IQUxfTE9DSyhoY3J5cCk7CgogIGlmKEhBTF9DUllQX1NUQVRFX1JFQURZID09IGhjcnlwLT5TdGF0ZSkKICB7CiAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICB7CiAgICBjYXNlIEhBTF9DUllQX0lOUFVUQ1BMVF9DQl9JRCA6CiAgICAgIGhjcnlwLT5JbkNwbHRDYWxsYmFjayA9IEhBTF9DUllQX0luQ3BsdENhbGxiYWNrOyAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGlucHV0IERNQSB0cmFuc2ZlciBjb21wbGV0aW9uIGNhbGxiYWNrICovCiAgICAgIGJyZWFrOwoKICAgIGNhc2UgSEFMX0NSWVBfT1VUUFVUQ1BMVF9DQl9JRCA6CiAgICAgIGhjcnlwLT5PdXRDcGx0Q2FsbGJhY2sgPSBIQUxfQ1JZUF9PdXRDcGx0Q2FsbGJhY2s7ICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIG91dHB1dCBETUEgdHJhbnNmZXIgY29tcGxldGlvbiBjYWxsYmFjayAqLwogICAgICBicmVhazsKCiAgICBjYXNlIEhBTF9DUllQX0NPTVBDUExUX0NCX0lEIDoKICAgICAgaGNyeXAtPkNvbXBDcGx0Q2FsbGJhY2sgPSBIQUxfQ1JZUEV4X0NvbXB1dGF0aW9uQ3BsdENhbGxiYWNrOyAvKiBMZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgY29tcHV0YXRpb24gY29tcGxldGlvbiBjYWxsYmFjayAqLwogICAgICBicmVhazsKCiAgICBjYXNlIEhBTF9DUllQX0VSUk9SX0NCX0lEIDoKICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2sgPSBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrOyAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZXJyb3IgY2FsbGJhY2sgKi8KICAgICAgYnJlYWs7CgogICAgY2FzZSBIQUxfQ1JZUF9NU1BJTklUX0NCX0lEIDoKICAgICAgaGNyeXAtPk1zcEluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcEluaXQ7ICAgICAgICAgICAgICAgICAgICAvKiBMZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgTXNwIERlSW5pdCAqLwogICAgICBicmVhazsKCiAgICBjYXNlIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCA6CiAgICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcERlSW5pdDsgICAgICAgICAgICAgICAgLyogTGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIE1zcCBEZUluaXQgKi8KICAgICAgYnJlYWs7CgogICAgZGVmYXVsdCA6CiAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCiAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBlbHNlIGlmKEhBTF9DUllQX1NUQVRFX1JFU0VUID09IGhjcnlwLT5TdGF0ZSkKICB7CiAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICB7CiAgICBjYXNlIEhBTF9DUllQX01TUElOSVRfQ0JfSUQgOgogICAgICBoY3J5cC0+TXNwSW5pdENhbGxiYWNrID0gSEFMX0NSWVBfTXNwSW5pdDsgICAgICAgICAgIC8qIExlZ2FjeSB3ZWFrIChzdXJjaGFyZ2VkKSBNc3AgSW5pdCAqLwogICAgICBicmVhazsKCiAgICBjYXNlIEhBTF9DUllQX01TUERFSU5JVF9DQl9JRCA6CiAgICAgIGhjcnlwLT5Nc3BEZUluaXRDYWxsYmFjayA9IEhBTF9DUllQX01zcERlSW5pdDsgICAgICAgLyogTGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIE1zcCBEZUluaXQgKi8KICAgICAgYnJlYWs7CgogICAgZGVmYXVsdCA6CiAgICAgLyogVXBkYXRlIHRoZSBlcnJvciBjb2RlICovCiAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9FUlJPUl9JTlZBTElEX0NBTExCQUNLOwogICAgIC8qIHVwZGF0ZSByZXR1cm4gc3RhdHVzICovCiAgICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7CiAgICAgIGJyZWFrOwogICAgfQogIH0KICBlbHNlCiAgewogICAgIC8qIFVwZGF0ZSB0aGUgZXJyb3IgY29kZSAqLwogICAgIGhjcnlwLT5FcnJvckNvZGUgfD0gSEFMX0NSWVBfRVJST1JfSU5WQUxJRF9DQUxMQkFDSzsKICAgICAvKiB1cGRhdGUgcmV0dXJuIHN0YXR1cyAqLwogICAgICBzdGF0dXMgPSAgSEFMX0VSUk9SOwogIH0KCiAgLyogUmVsZWFzZSBMb2NrICovCiAgX19IQUxfVU5MT0NLKGhjcnlwKTsKICByZXR1cm4gc3RhdHVzOwp9CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCgovKioKICAqIEB9CiAgKi8KCi8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA0IENSWVAgSVJRIGhhbmRsZXIKICogIEBicmllZiAgIEFFUyBJUlEgaGFuZGxlci4KICoKQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAjIyMjIyBBRVMgSVJRIGhhbmRsZXIgbWFuYWdlbWVudCAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpbLi5dICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgQUVTIElSUSBoYW5kbGVyIGZ1bmN0aW9uLgoKQGVuZHZlcmJhdGltCiAgKiBAewogICovCgovKioKICAqIEBicmllZiAgSGFuZGxlIEFFUyBpbnRlcnJ1cHQgcmVxdWVzdC4KICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgSEFMX0NSWVBfSVJRSGFuZGxlcihDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7CiAgLyogQ2hlY2sgaWYgZXJyb3Igb2NjdXJyZWQgKi8KICBpZiAoX19IQUxfQ1JZUF9HRVRfSVRfU09VUkNFKGhjcnlwLCBDUllQX0lUX0VSUklFKSAhPSBSRVNFVCkKICB7CiAgICAvKiBJZiBXcml0ZSBFcnJvciBvY2N1cnJlZCAqLwogICAgaWYgKF9fSEFMX0NSWVBfR0VUX0ZMQUcoaGNyeXAsIENSWVBfSVRfV1JFUlIpICE9IFJFU0VUKQogICAgewogICAgICBoY3J5cC0+RXJyb3JDb2RlIHw9IEhBTF9DUllQX1dSSVRFX0VSUk9SOwogICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9FUlJPUjsKICAgIH0KICAgIC8qIElmIFJlYWQgRXJyb3Igb2NjdXJyZWQgKi8KICAgIGlmIChfX0hBTF9DUllQX0dFVF9GTEFHKGhjcnlwLCBDUllQX0lUX1JERVJSKSAhPSBSRVNFVCkKICAgIHsKICAgICAgaGNyeXAtPkVycm9yQ29kZSB8PSBIQUxfQ1JZUF9SRUFEX0VSUk9SOwogICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9FUlJPUjsKICAgIH0KCiAgICAvKiBJZiBhbiBlcnJvciBoYXMgYmVlbiByZXBvcnRlZCAqLwogICAgaWYgKGhjcnlwLT5TdGF0ZSA9PSBIQUxfQ1JZUF9TVEFURV9FUlJPUikKICAgIHsKICAgICAgLyogRGlzYWJsZSBFcnJvciBhbmQgQ29tcHV0YXRpb24gQ29tcGxldGUgSW50ZXJydXB0cyAqLwogICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUV8Q1JZUF9JVF9FUlJJRSk7CiAgICAgIC8qIENsZWFyIGFsbCBJbnRlcnJ1cHQgZmxhZ3MgKi8KICAgICAgX19IQUxfQ1JZUF9DTEVBUl9GTEFHKGhjcnlwLCBDUllQX0VSUl9DTEVBUnxDUllQX0NDRl9DTEVBUik7CgogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovCiAgICAgIF9fSEFMX1VOTE9DSyhoY3J5cCk7CgojaWYgKFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KCiAgICAgIHJldHVybjsKICAgIH0KCiAgfQoKICAvKiBDaGVjayBpZiBjb21wdXRhdGlvbiBjb21wbGV0ZSBpbnRlcnJ1cHQgaXMgZW5hYmxlZAogICAgIGFuZCBpZiB0aGUgY29tcHV0YXRpb24gY29tcGxldGUgZmxhZyBpcyByYWlzZWQgKi8KICBpZiAoX19IQUxfQ1JZUF9HRVRfRkxBRyhoY3J5cCwgQ1JZUF9JVF9DQ0YpICE9IFJFU0VUKQogIHsKICAgIGlmIChfX0hBTF9DUllQX0dFVF9JVF9TT1VSQ0UoaGNyeXAsIENSWVBfSVRfQ0NGSUUpICE9IFJFU0VUKQogICAgewojaWYgZGVmaW5lZChBRVNfQ1JfTlBCTEIpCiAgICAgIGlmICgoaGNyeXAtPkluaXQuQ2hhaW5pbmdNb2RlID09IENSWVBfQ0hBSU5NT0RFX0FFU19HQ01fR01BQykKICAgICAgIHx8IChoY3J5cC0+SW5pdC5DaGFpbmluZ01vZGUgPT0gQ1JZUF9DSEFJTk1PREVfQUVTX0NDTSkpCiNlbHNlCiAgICAgIGlmICgoaGNyeXAtPkluaXQuQ2hhaW5pbmdNb2RlID09IENSWVBfQ0hBSU5NT0RFX0FFU19HQ01fR01BQykKICAgICAgIHx8IChoY3J5cC0+SW5pdC5DaGFpbmluZ01vZGUgPT0gQ1JZUF9DSEFJTk1PREVfQUVTX0NNQUMpKQojZW5kaWYKICAgICAgewogICAgICAgLyogVG8gZW5zdXJlIHByb3BlciBzdXNwZW5zaW9uIHJlcXVlc3RzIG1hbmFnZW1lbnQsIENDRiBmbGFnCiAgICAgICAgICBpcyByZXNldCBpbiBDUllQX0FFU19BdXRoX0lUKCkgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50CiAgICAgICAgICBwaGFzZSB1bmRlciBoYW5kbGluZyAqLwogICAgICAgIGlmIChDUllQX0FFU19BdXRoX0lUKGhjcnlwKSAhPSAgSEFMX09LKQogICAgICAgIHsKI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgICAgICBoY3J5cC0+RXJyb3JDYWxsYmFjayhoY3J5cCk7CiNlbHNlCiAgICAgICAgICBIQUxfQ1JZUF9FcnJvckNhbGxiYWNrKGhjcnlwKTsKI2VuZGlmIC8qIFVTRV9IQUxfQ1JZUF9SRUdJU1RFUl9DQUxMQkFDS1MgKi8KICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZQogICAgICB7CiAgICAgICAgLyogQ2xlYXIgQ29tcHV0YXRpb24gQ29tcGxldGUgRmxhZyAqLwogICAgICAgIF9fSEFMX0NSWVBfQ0xFQVJfRkxBRyhoY3J5cCwgQ1JZUF9DQ0ZfQ0xFQVIpOwogICAgICAgIGlmIChDUllQX0FFU19JVChoY3J5cCkgIT0gIEhBTF9PSykKICAgICAgICB7CiNpZiAoVVNFX0hBTF9DUllQX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAgICAgaGNyeXAtPkVycm9yQ2FsbGJhY2soaGNyeXApOwojZWxzZQogICAgICAgICAgSEFMX0NSWVBfRXJyb3JDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9CgovKioKICAqIEB9CiAgKi8KCi8qKiBAZGVmZ3JvdXAgQ1JZUF9FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXA1IFBlcmlwaGVyYWwgU3RhdGUgZnVuY3Rpb25zCiAqICBAYnJpZWYgICBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucy4KICoKQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBQZXJpcGhlcmFsIFN0YXRlIGZ1bmN0aW9ucyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXQogICAgVGhpcyBzdWJzZWN0aW9uIHBlcm1pdHMgdG8gZ2V0IGluIHJ1bi10aW1lIHRoZSBzdGF0dXMgb2YgdGhlIHBlcmlwaGVyYWwuCgpAZW5kdmVyYmF0aW0KICAqIEB7CiAgKi8KCi8qKgogICogQGJyaWVmICBSZXR1cm4gdGhlIENSWVAgaGFuZGxlIHN0YXRlLgogICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHJldHZhbCBIQUwgc3RhdGUKICAqLwpIQUxfQ1JZUF9TVEFURVR5cGVEZWYgSEFMX0NSWVBfR2V0U3RhdGUoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIC8qIFJldHVybiBDUllQIGhhbmRsZSBzdGF0ZSAqLwogIHJldHVybiBoY3J5cC0+U3RhdGU7Cn0KCi8qKgogICogQGJyaWVmICBSZXR1cm4gdGhlIENSWVAgcGVyaXBoZXJhbCBlcnJvci4KICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEBub3RlICAgVGhlIHJldHVybmVkIGVycm9yIGlzIGEgYml0LW1hcCBjb21iaW5hdGlvbiBvZiBwb3NzaWJsZSBlcnJvcnMKICAqIEByZXR2YWwgRXJyb3IgYml0LW1hcAogICovCnVpbnQzMl90IEhBTF9DUllQX0dldEVycm9yKENSWVBfSGFuZGxlVHlwZURlZiAqaGNyeXApCnsKICByZXR1cm4gaGNyeXAtPkVycm9yQ29kZTsKfQoKLyoqCiAgKiBAfQogICovCgovKioKICAqIEB9CiAgKi8KCi8qKiBAYWRkdG9ncm91cCBDUllQX1ByaXZhdGVfRnVuY3Rpb25zCiAgKiBAewogICovCgoKLyoqCiAgKiBAYnJpZWYgIFdyaXRlIHRoZSBLZXkgaW4gS2V5UnggcmVnaXN0ZXJzLgogICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZQogICogQHJldHZhbCBOb25lCiAgKi8Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmICBDUllQX1NldEtleShDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7CiAgdWludDMyX3Qga2V5YWRkcjsKCiAgaWYgKGhjcnlwLT5Jbml0LnBLZXkgPT0gTlVMTCkKICB7CiAgICByZXR1cm4gSEFMX0VSUk9SOwogIH0KCgogIGtleWFkZHIgPSAodWludDMyX3QpKGhjcnlwLT5Jbml0LnBLZXkpOwoKICBpZiAoaGNyeXAtPkluaXQuS2V5U2l6ZSA9PSBDUllQX0tFWVNJWkVfMjU2QikKICB7CiAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI3ID0gX19SRVYoKih1aW50MzJfdCopKGtleWFkZHIpKTsKICAgIGtleWFkZHIrPTRVOwogICAgaGNyeXAtPkluc3RhbmNlLT5LRVlSNiA9IF9fUkVWKCoodWludDMyX3QqKShrZXlhZGRyKSk7CiAgICBrZXlhZGRyKz00VTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+S0VZUjUgPSBfX1JFVigqKHVpbnQzMl90Kikoa2V5YWRkcikpOwogICAga2V5YWRkcis9NFU7CiAgICBoY3J5cC0+SW5zdGFuY2UtPktFWVI0ID0gX19SRVYoKih1aW50MzJfdCopKGtleWFkZHIpKTsKICAgIGtleWFkZHIrPTRVOwogIH0KCiAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMyA9IF9fUkVWKCoodWludDMyX3QqKShrZXlhZGRyKSk7CiAga2V5YWRkcis9NFU7CiAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMiA9IF9fUkVWKCoodWludDMyX3QqKShrZXlhZGRyKSk7CiAga2V5YWRkcis9NFU7CiAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMSA9IF9fUkVWKCoodWludDMyX3QqKShrZXlhZGRyKSk7CiAga2V5YWRkcis9NFU7CiAgaGNyeXAtPkluc3RhbmNlLT5LRVlSMCA9IF9fUkVWKCoodWludDMyX3QqKShrZXlhZGRyKSk7CgogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBXcml0ZSB0aGUgSW5pdFZlY3Rvci9Jbml0Q291bnRlciBpbiBJVlJ4IHJlZ2lzdGVycy4KICAqIEBwYXJhbSAgaGNyeXAgcG9pbnRlciB0byBhIENSWVBfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgQ1JZUCBtb2R1bGUKICAqIEByZXR2YWwgTm9uZQogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX1NldEluaXRWZWN0b3IoQ1JZUF9IYW5kbGVUeXBlRGVmICpoY3J5cCkKewogIHVpbnQzMl90IGl2YWRkcjsKCiNpZiAhZGVmaW5lZChBRVNfQ1JfTlBCTEIpCiAgaWYgKGhjcnlwLT5Jbml0LkNoYWluaW5nTW9kZSA9PSBDUllQX0NIQUlOTU9ERV9BRVNfQ01BQykKICB7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjMgPSAwOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIyID0gMDsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMSA9IDA7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjAgPSAwOwogIH0KICBlbHNlCiNlbmRpZgogIHsKICAgIGlmIChoY3J5cC0+SW5pdC5wSW5pdFZlY3QgPT0gTlVMTCkKICAgIHsKICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgIH0KCiAgICBpdmFkZHIgPSAodWludDMyX3QpKGhjcnlwLT5Jbml0LnBJbml0VmVjdCk7CgogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIzID0gX19SRVYoKih1aW50MzJfdCopKGl2YWRkcikpOwogICAgaXZhZGRyKz00VTsKICAgIGhjcnlwLT5JbnN0YW5jZS0+SVZSMiA9IF9fUkVWKCoodWludDMyX3QqKShpdmFkZHIpKTsKICAgIGl2YWRkcis9NFU7CiAgICBoY3J5cC0+SW5zdGFuY2UtPklWUjEgPSBfX1JFVigqKHVpbnQzMl90KikoaXZhZGRyKSk7CiAgICBpdmFkZHIrPTRVOwogICAgaGNyeXAtPkluc3RhbmNlLT5JVlIwID0gX19SRVYoKih1aW50MzJfdCopKGl2YWRkcikpOwogIH0KICByZXR1cm4gSEFMX09LOwp9CgoKCi8qKgogICogQGJyaWVmICBIYW5kbGUgQ1JZUCBibG9jayBpbnB1dC9vdXRwdXQgZGF0YSBoYW5kbGluZyB1bmRlciBpbnRlcnJ1cHRpb24uCiAgKiBAbm90ZSAgIFRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgdW5kZXIgaW50ZXJydXB0aW9uIG9ubHksIG9uY2UKICAqICAgICAgICAgaW50ZXJydXB0aW9ucyBoYXZlIGJlZW4gZW5hYmxlZCBieSBIQUxfQ1JZUEV4X0FFU19JVCgpLgogICogQHBhcmFtICBoY3J5cCBwb2ludGVyIHRvIGEgQ1JZUF9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBDUllQIG1vZHVsZS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBDUllQX0FFU19JVChDUllQX0hhbmRsZVR5cGVEZWYgKmhjcnlwKQp7CiAgdWludDMyX3QgaW5wdXRhZGRyOwogIHVpbnQzMl90IG91dHB1dGFkZHIgPSAodWludDMyX3QpaGNyeXAtPnBDcnlwT3V0QnVmZlB0cjsKCiAgaWYoaGNyeXAtPlN0YXRlID09IEhBTF9DUllQX1NUQVRFX0JVU1kpCiAgewogICAgaWYgKGhjcnlwLT5Jbml0Lk9wZXJhdGluZ01vZGUgIT0gQ1JZUF9BTEdPTU9ERV9LRVlERVJJVkFUSU9OKQogICAgewogICAgICAvKiBSZWFkIHRoZSBsYXN0IGF2YWlsYWJsZSBvdXRwdXQgYmxvY2sgZnJvbSB0aGUgRGF0YSBPdXRwdXQgUmVnaXN0ZXIgKi8KICAgICAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKICAgICAgb3V0cHV0YWRkcis9NFU7CiAgICAgICoodWludDMyX3QqKShvdXRwdXRhZGRyKSA9IGhjcnlwLT5JbnN0YW5jZS0+RE9VVFI7CiAgICAgIG91dHB1dGFkZHIrPTRVOwogICAgICAqKHVpbnQzMl90Kikob3V0cHV0YWRkcikgPSBoY3J5cC0+SW5zdGFuY2UtPkRPVVRSOwogICAgICBvdXRwdXRhZGRyKz00VTsKICAgICAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gaGNyeXAtPkluc3RhbmNlLT5ET1VUUjsKICAgICAgaGNyeXAtPnBDcnlwT3V0QnVmZlB0ciArPSAxNjsKICAgICAgaGNyeXAtPkNyeXBPdXRDb3VudCAtPSAxNlU7CgogICAgfQogICAgZWxzZQogICAgewogICAgICAvKiBSZWFkIHRoZSBkZXJpdmVkIGtleSBmcm9tIHRoZSBLZXkgcmVnaXN0ZXJzICovCiAgICAgIGlmIChoY3J5cC0+SW5pdC5LZXlTaXplID09IENSWVBfS0VZU0laRV8yNTZCKQogICAgICB7CiAgICAgICAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gX19SRVYoaGNyeXAtPkluc3RhbmNlLT5LRVlSNyk7CiAgICAgICAgb3V0cHV0YWRkcis9NFU7CiAgICAgICAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gX19SRVYoaGNyeXAtPkluc3RhbmNlLT5LRVlSNik7CiAgICAgICAgb3V0cHV0YWRkcis9NFU7CiAgICAgICAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gX19SRVYoaGNyeXAtPkluc3RhbmNlLT5LRVlSNSk7CiAgICAgICAgb3V0cHV0YWRkcis9NFU7CiAgICAgICAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gX19SRVYoaGNyeXAtPkluc3RhbmNlLT5LRVlSNCk7CiAgICAgICAgb3V0cHV0YWRkcis9NFU7CiAgICAgIH0KCiAgICAgICAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gX19SRVYoaGNyeXAtPkluc3RhbmNlLT5LRVlSMyk7CiAgICAgICAgb3V0cHV0YWRkcis9NFU7CiAgICAgICAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gX19SRVYoaGNyeXAtPkluc3RhbmNlLT5LRVlSMik7CiAgICAgICAgb3V0cHV0YWRkcis9NFU7CiAgICAgICAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gX19SRVYoaGNyeXAtPkluc3RhbmNlLT5LRVlSMSk7CiAgICAgICAgb3V0cHV0YWRkcis9NFU7CiAgICAgICAgKih1aW50MzJfdCopKG91dHB1dGFkZHIpID0gX19SRVYoaGNyeXAtPkluc3RhbmNlLT5LRVlSMCk7CiAgICB9CgogICAgLyogSW4gY2FzZSBvZiBjaXBoZXJpbmcgb3IgZGVjaXBoZXJpbmcsIGNoZWNrIGlmIGFsbCBvdXRwdXQgdGV4dCBoYXMgYmVlbiByZXRyaWV2ZWQ7CiAgICAgICBJbiBjYXNlIG9mIGtleSBkZXJpdmF0aW9uLCBzdG9wIHJpZ2h0IHRoZXJlICovCiAgICBpZiAoKGhjcnlwLT5DcnlwT3V0Q291bnQgPT0gMFUpIHx8IChoY3J5cC0+SW5pdC5PcGVyYXRpbmdNb2RlID09IENSWVBfQUxHT01PREVfS0VZREVSSVZBVElPTikpCiAgICB7CiAgICAgIC8qIERpc2FibGUgQ29tcHV0YXRpb24gQ29tcGxldGUgRmxhZyBhbmQgRXJyb3JzIEludGVycnVwdHMgKi8KICAgICAgX19IQUxfQ1JZUF9ESVNBQkxFX0lUKGhjcnlwLCBDUllQX0lUX0NDRklFfENSWVBfSVRfRVJSSUUpOwogICAgICAvKiBDaGFuZ2UgdGhlIENSWVAgc3RhdGUgKi8KICAgICAgaGNyeXAtPlN0YXRlID0gSEFMX0NSWVBfU1RBVEVfUkVBRFk7CgogICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKCiAgICAgIC8qIENhbGwgY29tcHV0YXRpb24gY29tcGxldGUgY2FsbGJhY2sgKi8KI2lmIChVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgICAgIGhjcnlwLT5Db21wQ3BsdENhbGxiYWNrKGhjcnlwKTsKI2Vsc2UKICAgICAgSEFMX0NSWVBFeF9Db21wdXRhdGlvbkNwbHRDYWxsYmFjayhoY3J5cCk7CiNlbmRpZiAvKiBVU0VfSEFMX0NSWVBfUkVHSVNURVJfQ0FMTEJBQ0tTICovCgogICAgICByZXR1cm4gSEFMX09LOwogICAgfQogICAgLyogSWYgc3VzcGVuc2lvbiBmbGFnIGhhcyBiZWVuIHJhaXNlZCwgc3VzcGVuZCBwcm9jZXNzaW5nICovCiAgICBlbHNlIGlmIChoY3J5cC0+U3VzcGVuZFJlcXVlc3QgPT0gSEFMX0NSWVBfU1VTUEVORCkKICAgIHsKICAgICAgLyogcmVzZXQgTW9kZVN1c3BlbmQgKi8KICAgICAgaGNyeXAtPlN1c3BlbmRSZXF1ZXN0ID0gSEFMX0NSWVBfU1VTUEVORF9OT05FOwoKICAgICAgLyogRGlzYWJsZSBDb21wdXRhdGlvbiBDb21wbGV0ZSBGbGFnIGFuZCBFcnJvcnMgSW50ZXJydXB0cyAqLwogICAgICBfX0hBTF9DUllQX0RJU0FCTEVfSVQoaGNyeXAsIENSWVBfSVRfQ0NGSUV8Q1JZUF9JVF9FUlJJRSk7CiAgICAgIC8qIENoYW5nZSB0aGUgQ1JZUCBzdGF0ZSAqLwogICAgICBoY3J5cC0+U3RhdGUgPSBIQUxfQ1JZUF9TVEFURV9TVVNQRU5ERUQ7CgogICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8KICAgICAgX19IQUxfVU5MT0NLKGhjcnlwKTsKCiAgICAgIHJldHVybiBIQUxfT0s7CiAgICB9CiAgICBlbHNlIC8qIFByb2Nlc3MgdGhlIHJlc3Qgb2YgaW5wdXQgZGF0YSAqLwogICAgewogICAgICAvKiBHZXQgdGhlIEludHB1dCBkYXRhIGFkZHJlc3MgKi8KICAgICAgaW5wdXRhZGRyID0gKHVpbnQzMl90KWhjcnlwLT5wQ3J5cEluQnVmZlB0cjsKCiAgICAgIC8qIEluY3JlbWVudC9kZWNyZW1lbnQgaW5zdGFuY2UgcG9pbnRlci9jb3VudGVyICovCiAgICAgIGhjcnlwLT5wQ3J5cEluQnVmZlB0ciArPSAxNjsKICAgICAgaGNyeXAtPkNyeXBJbkNvdW50IC09IDE2VTsKCiAgICAgIC8qIFdyaXRlIHRoZSBuZXh0IGlucHV0IGJsb2NrIGluIHRoZSBEYXRhIElucHV0IHJlZ2lzdGVyICovCiAgICAgIGhjcnlwLT5JbnN0YW5jZS0+RElOUiA9ICoodWludDMyX3QqKShpbnB1dGFkZHIpOwogICAgICBpbnB1dGFkZHIrPTRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaW5wdXRhZGRyKTsKICAgICAgaW5wdXRhZGRyKz00VTsKICAgICAgaGNyeXAtPkluc3RhbmNlLT5ESU5SICA9ICoodWludDMyX3QqKShpbnB1dGFkZHIpOwogICAgICBpbnB1dGFkZHIrPTRVOwogICAgICBoY3J5cC0+SW5zdGFuY2UtPkRJTlIgPSAqKHVpbnQzMl90KikoaW5wdXRhZGRyKTsKCiAgICAgIHJldHVybiBIQUxfT0s7CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICByZXR1cm4gSEFMX0JVU1k7CiAgfQp9CgoKCgovKioKICAqIEB9CiAgKi8KCgoKLyoqCiAgKiBAfQogICovCgovKioKICAqIEB9CiAgKi8KCiNlbmRpZiAvKiBBRVMgKi8KCiNlbmRpZiAvKiBIQUxfQ1JZUF9NT0RVTEVfRU5BQkxFRCAqLwo=