LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmYxeHhfaGFsX3d3ZGcuYwogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIFdXREcgSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCiAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFdpbmRvdyBXYXRjaGRvZyAoV1dERykgcGVyaXBoZXJhbDoKICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucwogICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEBhdHRlbnRpb24KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTYgU1RNaWNyb2VsZWN0cm9uaWNzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFdXREcgU3BlY2lmaWMgZmVhdHVyZXMgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBbLi5dCiAgICBPbmNlIGVuYWJsZWQgdGhlIFdXREcgZ2VuZXJhdGVzIGEgc3lzdGVtIHJlc2V0IG9uIGV4cGlyeSBvZiBhIHByb2dyYW1tZWQKICAgIHRpbWUgcGVyaW9kLCB1bmxlc3MgdGhlIHByb2dyYW0gcmVmcmVzaGVzIHRoZSBjb3VudGVyIChUWzY7MF0gZG93bmNvdW50ZXIpCiAgICBiZWZvcmUgcmVhY2hpbmcgMHgzRiB2YWx1ZSAoaS5lLiBhIHJlc2V0IGlzIGdlbmVyYXRlZCB3aGVuIHRoZSBjb3VudGVyCiAgICB2YWx1ZSByb2xscyBkb3duIGZyb20gMHg0MCB0byAweDNGKS4KCiAgICAoKykgQW4gTUNVIHJlc2V0IGlzIGFsc28gZ2VuZXJhdGVkIGlmIHRoZSBjb3VudGVyIHZhbHVlIGlzIHJlZnJlc2hlZAogICAgICAgIGJlZm9yZSB0aGUgY291bnRlciBoYXMgcmVhY2hlZCB0aGUgcmVmcmVzaCB3aW5kb3cgdmFsdWUuIFRoaXMKICAgICAgICBpbXBsaWVzIHRoYXQgdGhlIGNvdW50ZXIgbXVzdCBiZSByZWZyZXNoZWQgaW4gYSBsaW1pdGVkIHdpbmRvdy4KICAgICgrKSBPbmNlIGVuYWJsZWQgdGhlIFdXREcgY2Fubm90IGJlIGRpc2FibGVkIGV4Y2VwdCBieSBhIHN5c3RlbSByZXNldC4KICAgICgrKSBJZiByZXF1aXJlZCBieSBhcHBsaWNhdGlvbiwgYW4gRWFybHkgV2FrZXVwIEludGVycnVwdCBjYW4gYmUgdHJpZ2dlcmVkCiAgICAgICAgaW4gb3JkZXIgdG8gYmUgd2FybmVkIGJlZm9yZSBXV0RHIGV4cGlyYXRpb24uIFRoZSBFYXJseSBXYWtldXAgSW50ZXJydXB0CiAgICAgICAgKEVXSSkgY2FuIGJlIHVzZWQgaWYgc3BlY2lmaWMgc2FmZXR5IG9wZXJhdGlvbnMgb3IgZGF0YSBsb2dnaW5nIG11c3QKICAgICAgICBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBhY3R1YWwgcmVzZXQgaXMgZ2VuZXJhdGVkLiBXaGVuIHRoZSBkb3duY291bnRlcgogICAgICAgIHJlYWNoZXMgMHg0MCwgaW50ZXJydXB0IG9jY3Vycy4gVGhpcyBtZWNoYW5pc20gcmVxdWlyZXMgV1dERyBpbnRlcnJ1cHQKICAgICAgICBsaW5lIHRvIGJlIGVuYWJsZWQgaW4gTlZJQy4gT25jZSBlbmFibGVkLCBFV0kgaW50ZXJydXB0IGNhbm5vdCBiZQogICAgICAgIGRpc2FibGVkIGV4Y2VwdCBieSBhIHN5c3RlbSByZXNldC4KICAgICgrKSBXV0RHUlNUIGZsYWcgaW4gUkNDIENTUiByZWdpc3RlciBjYW4gYmUgdXNlZCB0byBpbmZvcm0gd2hlbiBhIFdXREcKICAgICAgICByZXNldCBvY2N1cnMuCiAgICAoKykgVGhlIFdXREcgY291bnRlciBpbnB1dCBjbG9jayBpcyBkZXJpdmVkIGZyb20gdGhlIEFQQiBjbG9jayBkaXZpZGVkCiAgICAgICAgYnkgYSBwcm9ncmFtbWFibGUgcHJlc2NhbGVyLgogICAgKCspIFdXREcgY2xvY2sgKEh6KSA9IFBDTEsxIC8gKDQwOTYgKiBQcmVzY2FsZXIpCiAgICAoKykgV1dERyB0aW1lb3V0IChtUykgPSAxMDAwICogKFRbNTswXSArIDEpIC8gV1dERyBjbG9jayAoSHopCiAgICAgICAgd2hlcmUgVFs1OzBdIGFyZSB0aGUgbG93ZXN0IDYgYml0cyBvZiBDb3VudGVyLgogICAgKCspIFdXREcgQ291bnRlciByZWZyZXNoIGlzIGFsbG93ZWQgYmV0d2VlbiB0aGUgZm9sbG93aW5nIGxpbWl0cyA6CiAgICAgICAgKCsrKSBtaW4gdGltZSAobVMpID0gMTAwMCAqIChDb3VudGVyIC0gV2luZG93KSAvIFdXREcgY2xvY2sKICAgICAgICAoKyspIG1heCB0aW1lIChtUykgPSAxMDAwICogKENvdW50ZXIgLSAweDQwKSAvIFdXREcgY2xvY2sKICAgICgrKSBUeXBpY2FsIHZhbHVlczoKICAgICAgICAoKyspIENvdW50ZXIgbWluIChUWzU7MF0gPSAweDAwKSBhdCAzNk1IeiAoUENMSzEpIHdpdGggemVybyBwcmVzY2FsZXI6CiAgICAgICAgICAgICBtYXggdGltZW91dCBiZWZvcmUgcmVzZXQ6IGFwcHJveGltYXRlbHkgOTEwtXMKICAgICAgICAoKyspIENvdW50ZXIgbWF4IChUWzU7MF0gPSAweDNGKSBhdCAzNk1IeiAoUENMSzEpIHdpdGggcHJlc2NhbGVyCiAgICAgICAgICAgICBkaXZpZGluZyBieSA4OgogICAgICAgICAgICAgbWF4IHRpbWVvdXQgYmVmb3JlIHJlc2V0OiBhcHByb3hpbWF0ZWx5IDU4LjI1bXMKCiAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAgICAqKiogQ29tbW9uIGRyaXZlciB1c2FnZSAqKioKICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICBbLi5dCiAgICAoKykgRW5hYmxlIFdXREcgQVBCMSBjbG9jayB1c2luZyBfX0hBTF9SQ0NfV1dER19DTEtfRU5BQkxFKCkuCiAgICAoKykgQ29uZmlndXJlIHRoZSBXV0RHIHByZXNjYWxlciwgcmVmcmVzaCB3aW5kb3cgdmFsdWUsIGNvdW50ZXIgdmFsdWUgYW5kIGVhcmx5CiAgICAgICAgaW50ZXJydXB0IHN0YXR1cyB1c2luZyBIQUxfV1dER19Jbml0KCkgZnVuY3Rpb24uIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAgZW5hYmxlIFdXREcgYW5kIHN0YXJ0IGl0cyBkb3duY291bnRlci4gVGltZSByZWZlcmVuY2UgY2FuIGJlIHRha2VuIGZyb20gCiAgICAgICAgZnVuY3Rpb24gZXhpdC4gQ2FyZSBtdXN0IGJlIHRha2VuIHRvIHByb3ZpZGUgYSBjb3VudGVyIHZhbHVlCiAgICAgICAgZ3JlYXRlciB0aGFuIDB4NDAgdG8gcHJldmVudCBnZW5lcmF0aW9uIG9mIGltbWVkaWF0ZSByZXNldC4KICAgICgrKSBJZiB0aGUgRWFybHkgV2FrZXVwIEludGVycnVwdCAoRVdJKSBmZWF0dXJlIGlzIGVuYWJsZWQsIGFuIGludGVycnVwdCBpcwogICAgICAgIGdlbmVyYXRlZCB3aGVuIHRoZSBjb3VudGVyIHJlYWNoZXMgMHg0MC4gV2hlbiBIQUxfV1dER19JUlFIYW5kbGVyIGlzCiAgICAgICAgdHJpZ2dlcmVkIGJ5IHRoZSBpbnRlcnJ1cHQgc2VydmljZSByb3V0aW5lLCBmbGFnIHdpbGwgYmUgYXV0b21hdGljYWxseQogICAgICAgIGNsZWFyZWQgYW5kIEhBTF9XV0RHX1dha2V1cENhbGxiYWNrIHVzZXIgY2FsbGJhY2sgd2lsbCBiZSBleGVjdXRlZC4gVXNlcgogICAgICAgIGNhbiBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgY2FsbGJhY2sgSEFMX1dXREdfV2FrZXVwQ2FsbGJhY2suCiAgICAoKykgVGhlbiB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSBtdXN0IHJlZnJlc2ggdGhlIFdXREcgY291bnRlciBhdCByZWd1bGFyCiAgICAgICAgaW50ZXJ2YWxzIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uIHRvIHByZXZlbnQgYW4gTUNVIHJlc2V0LCB1c2luZwogICAgICAgIEhBTF9XV0RHX1JlZnJlc2goKSBmdW5jdGlvbi4gVGhpcyBvcGVyYXRpb24gbXVzdCBvY2N1ciBvbmx5IHdoZW4KICAgICAgICB0aGUgY291bnRlciBpcyBsb3dlciB0aGFuIHRoZSByZWZyZXNoIHdpbmRvdyB2YWx1ZSBhbHJlYWR5IHByb2dyYW1tZWQuCgogICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIFsuLl0KICAgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyB3aGVuIHNldCB0byAxIGFsbG93cwogICAgdGhlIHVzZXIgdG8gY29uZmlndXJlIGR5bmFtaWNhbGx5IHRoZSBkcml2ZXIgY2FsbGJhY2tzLiBVc2UgRnVuY3Rpb25zCiAgICBIQUxfV1dER19SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgoKICAgICgrKSBGdW5jdGlvbiBIQUxfV1dER19SZWdpc3RlckNhbGxiYWNrKCkgYWxsb3dzIHRvIHJlZ2lzdGVyIGZvbGxvd2luZwogICAgICAgIGNhbGxiYWNrczoKICAgICAgICAoKyspIEV3aUNhbGxiYWNrIDogY2FsbGJhY2sgZm9yIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQuCiAgICAgICAgKCsrKSBNc3BJbml0Q2FsbGJhY2sgOiBXV0RHIE1zcEluaXQuCiAgICBUaGlzIGZ1bmN0aW9uIHRha2VzIGFzIHBhcmFtZXRlcnMgdGhlIEhBTCBwZXJpcGhlcmFsIGhhbmRsZSwgdGhlIENhbGxiYWNrIElECiAgICBhbmQgYSBwb2ludGVyIHRvIHRoZSB1c2VyIGNhbGxiYWNrIGZ1bmN0aW9uLgoKICAgICgrKSBVc2UgZnVuY3Rpb24gSEFMX1dXREdfVW5SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVzZXQgYSBjYWxsYmFjayB0bwogICAgdGhlIGRlZmF1bHQgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb24uIEhBTF9XV0RHX1VuUmVnaXN0ZXJDYWxsYmFjaygpCiAgICB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUgYW5kIHRoZSBDYWxsYmFjayBJRC4KICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CiAgICAgICAgKCsrKSBFd2lDYWxsYmFjayA6IGNhbGxiYWNrIGZvciAgRWFybHkgV2FrZVVwIEludGVycnVwdC4KICAgICAgICAoKyspIE1zcEluaXRDYWxsYmFjayA6IFdXREcgTXNwSW5pdC4KCiAgICBbLi5dCiAgICBXaGVuIGNhbGxpbmcgSEFMX1dXREdfSW5pdCBmdW5jdGlvbiwgY2FsbGJhY2tzIGFyZSByZXNldCB0byB0aGUKICAgIGNvcnJlc3BvbmRpbmcgbGVnYWN5IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uczoKICAgIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2soKSBhbmQgSEFMX1dXREdfTXNwSW5pdCgpIG9ubHkgaWYgdGhleSBoYXZlCiAgICBub3QgYmVlbiByZWdpc3RlcmVkIGJlZm9yZS4KCiAgICBbLi5dCiAgICBXaGVuIGNvbXBpbGF0aW9uIGRlZmluZSBVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTIGlzIHNldCB0byAwIG9yCiAgICBub3QgZGVmaW5lZCwgdGhlIGNhbGxiYWNrIHJlZ2lzdGVyaW5nIGZlYXR1cmUgaXMgbm90IGF2YWlsYWJsZQogICAgYW5kIHdlYWsgKHN1cmNoYXJnZWQpIGNhbGxiYWNrcyBhcmUgdXNlZC4KCiAgICAqKiogV1dERyBIQUwgZHJpdmVyIG1hY3JvcyBsaXN0ICoqKgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFsuLl0KICAgICAgQmVsb3cgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG1hY3JvcyBpbiBXV0RHIEhBTCBkcml2ZXIuCiAgICAgICgrKSBfX0hBTF9XV0RHX0VOQUJMRTogRW5hYmxlIHRoZSBXV0RHIHBlcmlwaGVyYWwKICAgICAgKCspIF9fSEFMX1dXREdfR0VUX0ZMQUc6IEdldCB0aGUgc2VsZWN0ZWQgV1dERydzIGZsYWcgc3RhdHVzCiAgICAgICgrKSBfX0hBTF9XV0RHX0NMRUFSX0ZMQUc6IENsZWFyIHRoZSBXV0RHJ3MgcGVuZGluZyBmbGFncwogICAgICAoKykgX19IQUxfV1dER19FTkFCTEVfSVQ6IEVuYWJsZSB0aGUgV1dERyBlYXJseSB3YWtldXAgaW50ZXJydXB0CgogIEBlbmR2ZXJiYXRpbQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCgovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAic3RtMzJmMXh4X2hhbC5oIgoKLyoqIEBhZGR0b2dyb3VwIFNUTTMyRjF4eF9IQUxfRHJpdmVyCiAgKiBAewogICovCgojaWZkZWYgSEFMX1dXREdfTU9EVUxFX0VOQUJMRUQKLyoqIEBkZWZncm91cCBXV0RHIFdXREcKICAqIEBicmllZiBXV0RHIEhBTCBtb2R1bGUgZHJpdmVyLgogICogQHsKICAqLwoKLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogRXhwb3J0ZWQgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnMgV1dERyBFeHBvcnRlZCBGdW5jdGlvbnMKICAqIEB7CiAgKi8KCi8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAxIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucwogICogIEBicmllZiAgICBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMuCiAgKgpAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICMjIyMjIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIFsuLl0KICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CiAgICAgICgrKSBJbml0aWFsaXplIGFuZCBzdGFydCB0aGUgV1dERyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzCiAgICAgICAgICBpbiB0aGUgV1dER19Jbml0VHlwZURlZiBvZiBhc3NvY2lhdGVkIGhhbmRsZS4KICAgICAgKCspIEluaXRpYWxpemUgdGhlIFdXREcgTVNQLgoKQGVuZHZlcmJhdGltCiAgKiBAewogICovCgovKioKICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgV1dERyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZC4KICAqICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgV1dER19Jbml0VHlwZURlZiBvZiAgYXNzb2NpYXRlZCBoYW5kbGUuCiAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9XV0RHX0luaXQoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKewogIC8qIENoZWNrIHRoZSBXV0RHIGhhbmRsZSBhbGxvY2F0aW9uICovCiAgaWYgKGh3d2RnID09IE5VTEwpCiAgewogICAgcmV0dXJuIEhBTF9FUlJPUjsKICB9CgogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovCiAgYXNzZXJ0X3BhcmFtKElTX1dXREdfQUxMX0lOU1RBTkNFKGh3d2RnLT5JbnN0YW5jZSkpOwogIGFzc2VydF9wYXJhbShJU19XV0RHX1BSRVNDQUxFUihod3dkZy0+SW5pdC5QcmVzY2FsZXIpKTsKICBhc3NlcnRfcGFyYW0oSVNfV1dER19XSU5ET1coaHd3ZGctPkluaXQuV2luZG93KSk7CiAgYXNzZXJ0X3BhcmFtKElTX1dXREdfQ09VTlRFUihod3dkZy0+SW5pdC5Db3VudGVyKSk7CiAgYXNzZXJ0X3BhcmFtKElTX1dXREdfRVdJX01PREUoaHd3ZGctPkluaXQuRVdJTW9kZSkpOwoKI2lmIChVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTID09IDEpCiAgLyogUmVzZXQgQ2FsbGJhY2sgcG9pbnRlcnMgKi8KICBpZiAoaHd3ZGctPkV3aUNhbGxiYWNrID09IE5VTEwpCiAgewogICAgaHd3ZGctPkV3aUNhbGxiYWNrID0gSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjazsKICB9CgogIGlmIChod3dkZy0+TXNwSW5pdENhbGxiYWNrID09IE5VTEwpCiAgewogICAgaHd3ZGctPk1zcEluaXRDYWxsYmFjayA9IEhBTF9XV0RHX01zcEluaXQ7CiAgfQoKICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KICBod3dkZy0+TXNwSW5pdENhbGxiYWNrKGh3d2RnKTsKI2Vsc2UKICAvKiBJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8KICBIQUxfV1dER19Nc3BJbml0KGh3d2RnKTsKI2VuZGlmIC8qIFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgKi8KCiAgLyogU2V0IFdXREcgQ291bnRlciAqLwogIFdSSVRFX1JFRyhod3dkZy0+SW5zdGFuY2UtPkNSLCAoV1dER19DUl9XREdBIHwgaHd3ZGctPkluaXQuQ291bnRlcikpOwoKICAvKiBTZXQgV1dERyBQcmVzY2FsZXIgYW5kIFdpbmRvdyAqLwogIFdSSVRFX1JFRyhod3dkZy0+SW5zdGFuY2UtPkNGUiwgKGh3d2RnLT5Jbml0LkVXSU1vZGUgfCBod3dkZy0+SW5pdC5QcmVzY2FsZXIgfCBod3dkZy0+SW5pdC5XaW5kb3cpKTsKCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KCgovKioKICAqIEBicmllZiAgSW5pdGlhbGl6ZSB0aGUgV1dERyBNU1AuCiAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KICAqIEBub3RlICAgV2hlbiByZXdyaXRpbmcgdGhpcyBmdW5jdGlvbiBpbiB1c2VyIGZpbGUsIG1lY2hhbmlzbSBtYXkgYmUgYWRkZWQKICAqICAgICAgICAgdG8gYXZvaWQgbXVsdGlwbGUgaW5pdGlhbGl6ZSB3aGVuIEhBTF9XV0RHX0luaXQgZnVuY3Rpb24gaXMgY2FsbGVkCiAgKiAgICAgICAgIGFnYWluIHRvIGNoYW5nZSBwYXJhbWV0ZXJzLgogICogQHJldHZhbCBOb25lCiAgKi8KX193ZWFrIHZvaWQgSEFMX1dXREdfTXNwSW5pdChXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQp7CiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogIFVOVVNFRChod3dkZyk7CgogIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgIHRoZSBIQUxfV1dER19Nc3BJbml0IGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8KfQoKCiNpZiAoVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQovKioKICAqIEBicmllZiAgUmVnaXN0ZXIgYSBVc2VyIFdXREcgQ2FsbGJhY2sKICAqICAgICAgICAgVG8gYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSB3ZWFrIChzdXJjaGFyZ2VkKSBwcmVkZWZpbmVkIGNhbGxiYWNrCiAgKiBAcGFyYW0gIGh3d2RnIFdXREcgaGFuZGxlCiAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfRVdJX0NCX0lEIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQgQ2FsbGJhY2sgSUQKICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECiAgKiBAcGFyYW0gIHBDYWxsYmFjayBwb2ludGVyIHRvIHRoZSBDYWxsYmFjayBmdW5jdGlvbgogICogQHJldHZhbCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfV1dER19SZWdpc3RlckNhbGxiYWNrKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcsIEhBTF9XV0RHX0NhbGxiYWNrSURUeXBlRGVmIENhbGxiYWNrSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdXREdfQ2FsbGJhY2tUeXBlRGVmIHBDYWxsYmFjaykKewogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKCiAgaWYgKHBDYWxsYmFjayA9PSBOVUxMKQogIHsKICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICB9CiAgZWxzZQogIHsKICAgIHN3aXRjaCAoQ2FsbGJhY2tJRCkKICAgIHsKICAgICAgY2FzZSBIQUxfV1dER19FV0lfQ0JfSUQ6CiAgICAgICAgaHd3ZGctPkV3aUNhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBIQUxfV1dER19NU1BJTklUX0NCX0lEOgogICAgICAgIGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2sgPSBwQ2FsbGJhY2s7CiAgICAgICAgYnJlYWs7CgogICAgICBkZWZhdWx0OgogICAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICAgICAgICBicmVhazsKICAgIH0KICB9CgogIHJldHVybiBzdGF0dXM7Cn0KCgovKioKICAqIEBicmllZiAgVW5yZWdpc3RlciBhIFdXREcgQ2FsbGJhY2sKICAqICAgICAgICAgV1dERyBDYWxsYmFjayBpcyByZWRpcmVjdGVkIHRvIHRoZSB3ZWFrIChzdXJjaGFyZ2VkKSBwcmVkZWZpbmVkIGNhbGxiYWNrCiAgKiBAcGFyYW0gIGh3d2RnIFdXREcgaGFuZGxlCiAgKiBAcGFyYW0gIENhbGxiYWNrSUQgSUQgb2YgdGhlIGNhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQKICAqICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoKICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfRVdJX0NCX0lEIEVhcmx5IFdha2VVcCBJbnRlcnJ1cHQgQ2FsbGJhY2sgSUQKICAqICAgICAgICAgICBAYXJnIEByZWYgSEFMX1dXREdfTVNQSU5JVF9DQl9JRCBNc3BJbml0IGNhbGxiYWNrIElECiAgKiBAcmV0dmFsIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9XV0RHX1VuUmVnaXN0ZXJDYWxsYmFjayhXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnLCBIQUxfV1dER19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lEKQp7CiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOwoKICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgewogICAgY2FzZSBIQUxfV1dER19FV0lfQ0JfSUQ6CiAgICAgIGh3d2RnLT5Fd2lDYWxsYmFjayA9IEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2s7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgSEFMX1dXREdfTVNQSU5JVF9DQl9JRDoKICAgICAgaHd3ZGctPk1zcEluaXRDYWxsYmFjayA9IEhBTF9XV0RHX01zcEluaXQ7CiAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICAgICAgYnJlYWs7CiAgfQoKICByZXR1cm4gc3RhdHVzOwp9CiNlbmRpZiAvKiBVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTICovCgovKioKICAqIEB9CiAgKi8KCi8qKiBAZGVmZ3JvdXAgV1dER19FeHBvcnRlZF9GdW5jdGlvbnNfR3JvdXAyIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKICAqICBAYnJpZWYgICAgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucwogICoKQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAjIyMjIyBJTyBvcGVyYXRpb24gZnVuY3Rpb25zICMjIyMjCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgWy4uXQogICAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoKICAgICgrKSBSZWZyZXNoIHRoZSBXV0RHLgogICAgKCspIEhhbmRsZSBXV0RHIGludGVycnVwdCByZXF1ZXN0IGFuZCBhc3NvY2lhdGVkIGZ1bmN0aW9uIGNhbGxiYWNrLgoKQGVuZHZlcmJhdGltCiAgKiBAewogICovCgovKioKICAqIEBicmllZiAgUmVmcmVzaCB0aGUgV1dERy4KICAqIEBwYXJhbSAgaHd3ZGcgIHBvaW50ZXIgdG8gYSBXV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFdXREcgbW9kdWxlLgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1dXREdfUmVmcmVzaChXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQp7CiAgLyogV3JpdGUgdG8gV1dERyBDUiB0aGUgV1dERyBDb3VudGVyIHZhbHVlIHRvIHJlZnJlc2ggd2l0aCAqLwogIFdSSVRFX1JFRyhod3dkZy0+SW5zdGFuY2UtPkNSLCAoaHd3ZGctPkluaXQuQ291bnRlcikpOwoKICAvKiBSZXR1cm4gZnVuY3Rpb24gc3RhdHVzICovCiAgcmV0dXJuIEhBTF9PSzsKfQoKLyoqCiAgKiBAYnJpZWYgIEhhbmRsZSBXV0RHIGludGVycnVwdCByZXF1ZXN0LgogICogQG5vdGUgICBUaGUgRWFybHkgV2FrZXVwIEludGVycnVwdCAoRVdJKSBjYW4gYmUgdXNlZCBpZiBzcGVjaWZpYyBzYWZldHkgb3BlcmF0aW9ucwogICogICAgICAgICBvciBkYXRhIGxvZ2dpbmcgbXVzdCBiZSBwZXJmb3JtZWQgYmVmb3JlIHRoZSBhY3R1YWwgcmVzZXQgaXMgZ2VuZXJhdGVkLgogICogICAgICAgICBUaGUgRVdJIGludGVycnVwdCBpcyBlbmFibGVkIGJ5IGNhbGxpbmcgSEFMX1dXREdfSW5pdCBmdW5jdGlvbiB3aXRoCiAgKiAgICAgICAgIEVXSU1vZGUgc2V0IHRvIFdXREdfRVdJX0VOQUJMRS4KICAqICAgICAgICAgV2hlbiB0aGUgZG93bmNvdW50ZXIgcmVhY2hlcyB0aGUgdmFsdWUgMHg0MCwgYW5kIEVXSSBpbnRlcnJ1cHQgaXMKICAqICAgICAgICAgZ2VuZXJhdGVkIGFuZCB0aGUgY29ycmVzcG9uZGluZyBJbnRlcnJ1cHQgU2VydmljZSBSb3V0aW5lIChJU1IpIGNhbgogICogICAgICAgICBiZSB1c2VkIHRvIHRyaWdnZXIgc3BlY2lmaWMgYWN0aW9ucyAoc3VjaCBhcyBjb21tdW5pY2F0aW9ucyBvciBkYXRhCiAgKiAgICAgICAgIGxvZ2dpbmcpLCBiZWZvcmUgcmVzZXR0aW5nIHRoZSBkZXZpY2UuCiAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgSEFMX1dXREdfSVJRSGFuZGxlcihXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQp7CiAgLyogQ2hlY2sgaWYgRWFybHkgV2FrZXVwIEludGVycnVwdCBpcyBlbmFibGUgKi8KICBpZiAoX19IQUxfV1dER19HRVRfSVRfU09VUkNFKGh3d2RnLCBXV0RHX0lUX0VXSSkgIT0gUkVTRVQpCiAgewogICAgLyogQ2hlY2sgaWYgV1dERyBFYXJseSBXYWtldXAgSW50ZXJydXB0IG9jY3VycmVkICovCiAgICBpZiAoX19IQUxfV1dER19HRVRfRkxBRyhod3dkZywgV1dER19GTEFHX0VXSUYpICE9IFJFU0VUKQogICAgewogICAgICAvKiBDbGVhciB0aGUgV1dERyBFYXJseSBXYWtldXAgZmxhZyAqLwogICAgICBfX0hBTF9XV0RHX0NMRUFSX0ZMQUcoaHd3ZGcsIFdXREdfRkxBR19FV0lGKTsKCiNpZiAoVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogICAgICAvKiBFYXJseSBXYWtldXAgcmVnaXN0ZXJlZCBjYWxsYmFjayAqLwogICAgICBod3dkZy0+RXdpQ2FsbGJhY2soaHd3ZGcpOwojZWxzZQogICAgICAvKiBFYXJseSBXYWtldXAgY2FsbGJhY2sgKi8KICAgICAgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjayhod3dkZyk7CiNlbmRpZiAvKiBVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTICovCiAgICB9CiAgfQp9CgoKLyoqCiAgKiBAYnJpZWYgIFdXREcgRWFybHkgV2FrZXVwIGNhbGxiYWNrLgogICogQHBhcmFtICBod3dkZyAgcG9pbnRlciB0byBhIFdXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwpfX3dlYWsgdm9pZCBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrKFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpCnsKICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovCiAgVU5VU0VEKGh3d2RnKTsKCiAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsCiAgICAgICAgICAgdGhlIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2sgY291bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQogICAqLwp9CgovKioKICAqIEB9CiAgKi8KCi8qKgogICogQH0KICAqLwoKI2VuZGlmIC8qIEhBTF9XV0RHX01PRFVMRV9FTkFCTEVEICovCi8qKgogICogQH0KICAqLwoKLyoqCiAgKiBAfQogICovCg==