LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmw1eHhfaGFsX3d3ZGcuYwogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIFdXREcgSEFMIG1vZHVsZSBkcml2ZXIuCiAgKiAgICAgICAgICBUaGlzIGZpbGUgcHJvdmlkZXMgZmlybXdhcmUgZnVuY3Rpb25zIHRvIG1hbmFnZSB0aGUgZm9sbG93aW5nCiAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFdpbmRvdyBXYXRjaGRvZyAoV1dERykgcGVyaXBoZXJhbDoKICAqICAgICAgICAgICArIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucwogICogICAgICAgICAgICsgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucwogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqIEBhdHRlbnRpb24KICAqCiAgKiBDb3B5cmlnaHQgKGMpIDIwMTkgU1RNaWNyb2VsZWN0cm9uaWNzLgogICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAqCiAgKiBUaGlzIHNvZnR3YXJlIGlzIGxpY2Vuc2VkIHVuZGVyIHRlcm1zIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUKICAqIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzIHNvZnR3YXJlIGNvbXBvbmVudC4KICAqIElmIG5vIExJQ0VOU0UgZmlsZSBjb21lcyB3aXRoIHRoaXMgc29mdHdhcmUsIGl0IGlzIHByb3ZpZGVkIEFTLUlTLgogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICBAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFdXREcgU3BlY2lmaWMgZmVhdHVyZXMgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBbLi5dCiAgICBPbmNlIGVuYWJsZWQgdGhlIFdXREcgZ2VuZXJhdGVzIGEgc3lzdGVtIHJlc2V0IG9uIGV4cGlyeSBvZiBhIHByb2dyYW1tZWQKICAgIHRpbWUgcGVyaW9kLCB1bmxlc3MgdGhlIHByb2dyYW0gcmVmcmVzaGVzIHRoZSBjb3VudGVyIChUWzY7MF0gZG93bmNvdW50ZXIpCiAgICBiZWZvcmUgcmVhY2hpbmcgMHgzRiB2YWx1ZSAoaS5lLiBhIHJlc2V0IGlzIGdlbmVyYXRlZCB3aGVuIHRoZSBjb3VudGVyCiAgICB2YWx1ZSByb2xscyBkb3duIGZyb20gMHg0MCB0byAweDNGKS4KCiAgICAoKykgQW4gTUNVIHJlc2V0IGlzIGFsc28gZ2VuZXJhdGVkIGlmIHRoZSBjb3VudGVyIHZhbHVlIGlzIHJlZnJlc2hlZAogICAgICAgIGJlZm9yZSB0aGUgY291bnRlciBoYXMgcmVhY2hlZCB0aGUgcmVmcmVzaCB3aW5kb3cgdmFsdWUuIFRoaXMKICAgICAgICBpbXBsaWVzIHRoYXQgdGhlIGNvdW50ZXIgbXVzdCBiZSByZWZyZXNoZWQgaW4gYSBsaW1pdGVkIHdpbmRvdy4KICAgICgrKSBPbmNlIGVuYWJsZWQgdGhlIFdXREcgY2Fubm90IGJlIGRpc2FibGVkIGV4Y2VwdCBieSBhIHN5c3RlbSByZXNldC4KICAgICgrKSBXV0RHUlNUIGZsYWcgaW4gUkNDIENTUiByZWdpc3RlciBjYW4gYmUgdXNlZCB0byBpbmZvcm0gd2hlbiBhIFdXREcKICAgICAgICByZXNldCBvY2N1cnMuCiAgICAoKykgVGhlIFdXREcgY291bnRlciBpbnB1dCBjbG9jayBpcyBkZXJpdmVkIGZyb20gdGhlIEFQQiBjbG9jayBkaXZpZGVkCiAgICAgICAgYnkgYSBwcm9ncmFtbWFibGUgcHJlc2NhbGVyLgogICAgKCspIFdXREcgY2xvY2sgKEh6KSA9IFBDTEsxIC8gKDQwOTYgKiBQcmVzY2FsZXIpCiAgICAoKykgV1dERyB0aW1lb3V0IChtUykgPSAxMDAwICogKFRbNTswXSArIDEpIC8gV1dERyBjbG9jayAoSHopCiAgICAgICAgd2hlcmUgVFs1OzBdIGFyZSB0aGUgbG93ZXN0IDYgYml0cyBvZiBDb3VudGVyLgogICAgKCspIFdXREcgQ291bnRlciByZWZyZXNoIGlzIGFsbG93ZWQgYmV0d2VlbiB0aGUgZm9sbG93aW5nIGxpbWl0cyA6CiAgICAgICAgKCsrKSBtaW4gdGltZSAobVMpID0gMTAwMCAqIChDb3VudGVyIC0gV2luZG93KSAvIFdXREcgY2xvY2sKICAgICAgICAoKyspIG1heCB0aW1lIChtUykgPSAxMDAwICogKENvdW50ZXIgLSAweDQwKSAvIFdXREcgY2xvY2sKICAgICgrKSBUeXBpY2FsIHZhbHVlczoKICAgICAgICAoKyspIENvdW50ZXIgbWluIChUWzU7MF0gPSAweDAwKSBAMTEwTUh6IChQQ0xLMSkgd2l0aCB6ZXJvIHByZXNjYWxlcjoKICAgICAgICAgICAgIG1heCB0aW1lb3V0IGJlZm9yZSByZXNldDogfjM3LjIztXMKICAgICAgICAoKyspIENvdW50ZXIgbWF4IChUWzU7MF0gPSAweDNGKSBAMTEwTUh6IChQQ0xLMSkgd2l0aCBwcmVzY2FsZXIgZGl2aWRpbmcgYnkgMTI4OgogICAgICAgICAgICAgbWF4IHRpbWVvdXQgYmVmb3JlIHJlc2V0OiB+MTkuMDdtcwoKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKICAgICoqKiBDb21tb24gZHJpdmVyIHVzYWdlICoqKgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIFsuLl0KICAgICgrKSBFbmFibGUgV1dERyBBUEIxIGNsb2NrIHVzaW5nIF9fSEFMX1JDQ19XV0RHX0NMS19FTkFCTEUoKS4KICAgICgrKSBTZXQgdGhlIFdXREcgcHJlc2NhbGVyLCByZWZyZXNoIHdpbmRvdyBhbmQgY291bnRlciB2YWx1ZQogICAgICAgIHVzaW5nIEhBTF9XV0RHX0luaXQoKSBmdW5jdGlvbi4KICAgICgrKSBTdGFydCB0aGUgV1dERyB1c2luZyBIQUxfV1dER19TdGFydCgpIGZ1bmN0aW9uLgogICAgICAgIFdoZW4gdGhlIFdXREcgaXMgZW5hYmxlZCB0aGUgY291bnRlciB2YWx1ZSBzaG91bGQgYmUgY29uZmlndXJlZCB0bwogICAgICAgIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDB4NDAgdG8gcHJldmVudCBnZW5lcmF0aW5nIGFuIGltbWVkaWF0ZSByZXNldC4KICAgICgrKSBPcHRpb25hbGx5IHlvdSBjYW4gZW5hYmxlIHRoZSBFYXJseSBXYWtldXAgSW50ZXJydXB0IChFV0kpIHdoaWNoIGlzCiAgICAgICAgZ2VuZXJhdGVkIHdoZW4gdGhlIGNvdW50ZXIgcmVhY2hlcyAweDQwLCBhbmQgdGhlbiBzdGFydCB0aGUgV1dERyB1c2luZwogICAgICAgIEhBTF9XV0RHX1N0YXJ0X0lUKCkuIEF0IEVXSSBIQUxfV1dER19XYWtldXBDYWxsYmFjayBpcyBleGVjdXRlZCBhbmQgdXNlciBjYW4KICAgICAgICBhZGQgaGlzIG93biBjb2RlIGJ5IGN1c3RvbWl6YXRpb24gb2YgY2FsbGJhY2sgSEFMX1dXREdfV2FrZXVwQ2FsbGJhY2suCiAgICAgICAgT25jZSBlbmFibGVkLCBFV0kgaW50ZXJydXB0IGNhbm5vdCBiZSBkaXNhYmxlZCBleGNlcHQgYnkgYSBzeXN0ZW0gcmVzZXQuCiAgICAoKykgVGhlbiB0aGUgYXBwbGljYXRpb24gcHJvZ3JhbSBtdXN0IHJlZnJlc2ggdGhlIFdXREcgY291bnRlciBhdCByZWd1bGFyCiAgICAgICAgaW50ZXJ2YWxzIGR1cmluZyBub3JtYWwgb3BlcmF0aW9uIHRvIHByZXZlbnQgYW4gTUNVIHJlc2V0LCB1c2luZwogICAgICAgIEhBTF9XV0RHX1JlZnJlc2goKSBmdW5jdGlvbi4gVGhpcyBvcGVyYXRpb24gbXVzdCBvY2N1ciBvbmx5IHdoZW4KICAgICAgICB0aGUgY291bnRlciBpcyBsb3dlciB0aGFuIHRoZSByZWZyZXNoIHdpbmRvdyB2YWx1ZSBhbHJlYWR5IHByb2dyYW1tZWQuCgogICAgKioqIENhbGxiYWNrIHJlZ2lzdHJhdGlvbiAqKioKICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIFsuLl0KICAgIFRoZSBjb21waWxhdGlvbiBkZWZpbmUgIFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1Mgd2hlbiBzZXQgdG8gMSBhbGxvd3MKICAgIHRoZSB1c2VyIHRvIGNvbmZpZ3VyZSBkeW5hbWljYWxseSB0aGUgZHJpdmVyIGNhbGxiYWNrcy4gVXNlIEZ1bmN0aW9ucwogICAgQHJlZiBIQUxfV1dER19SZWdpc3RlckNhbGxiYWNrKCkgdG8gcmVnaXN0ZXIgYSB1c2VyIGNhbGxiYWNrLgoKICAgICgrKSBGdW5jdGlvbiBAcmVmIEhBTF9XV0RHX1JlZ2lzdGVyQ2FsbGJhY2soKSBhbGxvd3MgdG8gcmVnaXN0ZXIgZm9sbG93aW5nCiAgICAgICAgY2FsbGJhY2tzOgogICAgICAgICgrKykgRXdpQ2FsbGJhY2sgOiBjYWxsYmFjayBmb3IgRWFybHkgV2FrZVVwIEludGVycnVwdC4KICAgICAgICAoKyspIE1zcEluaXRDYWxsYmFjayA6IFdXREcgTXNwSW5pdC4KICAgIFRoaXMgZnVuY3Rpb24gdGFrZXMgYXMgcGFyYW1ldGVycyB0aGUgSEFMIHBlcmlwaGVyYWwgaGFuZGxlLCB0aGUgQ2FsbGJhY2sgSUQKICAgIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHVzZXIgY2FsbGJhY2sgZnVuY3Rpb24uCgogICAgKCspIFVzZSBmdW5jdGlvbiBAcmVmIEhBTF9XV0RHX1VuUmVnaXN0ZXJDYWxsYmFjaygpIHRvIHJlc2V0IGEgY2FsbGJhY2sgdG8KICAgIHRoZSBkZWZhdWx0IHdlYWsgKHN1cmNoYXJnZWQpIGZ1bmN0aW9uLiBAcmVmIEhBTF9XV0RHX1VuUmVnaXN0ZXJDYWxsYmFjaygpCiAgICB0YWtlcyBhcyBwYXJhbWV0ZXJzIHRoZSBIQUwgcGVyaXBoZXJhbCBoYW5kbGUgYW5kIHRoZSBDYWxsYmFjayBJRC4KICAgIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHRvIHJlc2V0IGZvbGxvd2luZyBjYWxsYmFja3M6CiAgICAgICAgKCsrKSBFd2lDYWxsYmFjayA6IGNhbGxiYWNrIGZvciAgRWFybHkgV2FrZVVwIEludGVycnVwdC4KICAgICAgICAoKyspIE1zcEluaXRDYWxsYmFjayA6IFdXREcgTXNwSW5pdC4KCiAgICBbLi5dCiAgICBXaGVuIGNhbGxpbmcgQHJlZiBIQUxfV1dER19Jbml0IGZ1bmN0aW9uLCBjYWxsYmFja3MgYXJlIHJlc2V0IHRvIHRoZQogICAgY29ycmVzcG9uZGluZyBsZWdhY3kgd2VhayAoc3VyY2hhcmdlZCkgZnVuY3Rpb25zOgogICAgQHJlZiBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrKCkgYW5kIEhBTF9XV0RHX01zcEluaXQoKSBvbmx5IGlmIHRoZXkgaGF2ZQogICAgbm90IGJlZW4gcmVnaXN0ZXJlZCBiZWZvcmUuCgogICAgWy4uXQogICAgV2hlbiBjb21waWxhdGlvbiBkZWZpbmUgVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyBpcyBzZXQgdG8gMCBvcgogICAgbm90IGRlZmluZWQsIHRoZSBjYWxsYmFjayByZWdpc3RlcmluZyBmZWF0dXJlIGlzIG5vdCBhdmFpbGFibGUKICAgIGFuZCB3ZWFrIChzdXJjaGFyZ2VkKSBjYWxsYmFja3MgYXJlIHVzZWQuCgogICAgKioqIFdXREcgSEFMIGRyaXZlciBtYWNyb3MgbGlzdCAqKioKICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICBbLi5dCiAgICAgIEJlbG93IHRoZSBsaXN0IG9mIG1vc3QgdXNlZCBtYWNyb3MgaW4gV1dERyBIQUwgZHJpdmVyLgogICAgICAoKykgX19IQUxfV1dER19FTkFCTEU6IEVuYWJsZSB0aGUgV1dERyBwZXJpcGhlcmFsCiAgICAgICgrKSBfX0hBTF9XV0RHX0dFVF9GTEFHOiBHZXQgdGhlIHNlbGVjdGVkIFdXREcncyBmbGFnIHN0YXR1cwogICAgICAoKykgX19IQUxfV1dER19DTEVBUl9GTEFHOiBDbGVhciB0aGUgV1dERydzIHBlbmRpbmcgZmxhZ3MKICAgICAgKCspIF9fSEFMX1dXREdfRU5BQkxFX0lUOiBFbmFibGUgdGhlIFdXREcgZWFybHkgd2FrZXVwIGludGVycnVwdAoKICBAZW5kdmVyYmF0aW0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLwoKLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KI2luY2x1ZGUgInN0bTMybDV4eF9oYWwuaCIKCi8qKiBAYWRkdG9ncm91cCBTVE0zMkw1eHhfSEFMX0RyaXZlcgogICogQHsKICAqLwoKI2lmZGVmIEhBTF9XV0RHX01PRFVMRV9FTkFCTEVECi8qKiBAZGVmZ3JvdXAgV1dERyBXV0RHCiAgKiBAYnJpZWYgV1dERyBIQUwgbW9kdWxlIGRyaXZlci4KICAqIEB7CiAgKi8KCi8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiogQGRlZmdyb3VwIFdXREdfRXhwb3J0ZWRfRnVuY3Rpb25zIFdXREcgRXhwb3J0ZWQgRnVuY3Rpb25zCiAgKiBAewogICovCgovKiogQGRlZmdyb3VwIFdXREdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMSBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMKICAqICBAYnJpZWYgICAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24gZnVuY3Rpb25zLgogICoKQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICBbLi5dCiAgICBUaGlzIHNlY3Rpb24gcHJvdmlkZXMgZnVuY3Rpb25zIGFsbG93aW5nIHRvOgogICAgICAoKykgSW5pdGlhbGl6ZSBhbmQgc3RhcnQgdGhlIFdXREcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycwogICAgICAgICAgaW4gdGhlIFdXREdfSW5pdFR5cGVEZWYgb2YgYXNzb2NpYXRlZCBoYW5kbGUuCiAgICAgICgrKSBJbml0aWFsaXplIHRoZSBXV0RHIE1TUC4KCkBlbmR2ZXJiYXRpbQogICogQHsKICAqLwoKLyoqCiAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFdXREcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQuCiAgKiAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFdXREdfSW5pdFR5cGVEZWYgb2YgIGFzc29jaWF0ZWQgaGFuZGxlLgogICogQHBhcmFtICBod3dkZyAgcG9pbnRlciB0byBhIFdXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfV1dER19Jbml0KFdXREdfSGFuZGxlVHlwZURlZiAqaHd3ZGcpCnsKICAvKiBDaGVjayB0aGUgV1dERyBoYW5kbGUgYWxsb2NhdGlvbiAqLwogIGlmIChod3dkZyA9PSBOVUxMKQogIHsKICAgIHJldHVybiBIQUxfRVJST1I7CiAgfQoKICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLwogIGFzc2VydF9wYXJhbShJU19XV0RHX0FMTF9JTlNUQU5DRShod3dkZy0+SW5zdGFuY2UpKTsKICBhc3NlcnRfcGFyYW0oSVNfV1dER19QUkVTQ0FMRVIoaHd3ZGctPkluaXQuUHJlc2NhbGVyKSk7CiAgYXNzZXJ0X3BhcmFtKElTX1dXREdfV0lORE9XKGh3d2RnLT5Jbml0LldpbmRvdykpOwogIGFzc2VydF9wYXJhbShJU19XV0RHX0NPVU5URVIoaHd3ZGctPkluaXQuQ291bnRlcikpOwogIGFzc2VydF9wYXJhbShJU19XV0RHX0VXSV9NT0RFKGh3d2RnLT5Jbml0LkVXSU1vZGUpKTsKCiNpZiAoVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyA9PSAxKQogIC8qIFJlc2V0IENhbGxiYWNrIHBvaW50ZXJzICovCiAgaWYgKGh3d2RnLT5Fd2lDYWxsYmFjayA9PSBOVUxMKQogIHsKICAgIGh3d2RnLT5Fd2lDYWxsYmFjayA9IEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2s7CiAgfQoKICBpZiAoaHd3ZGctPk1zcEluaXRDYWxsYmFjayA9PSBOVUxMKQogIHsKICAgIGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfV1dER19Nc3BJbml0OwogIH0KCiAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCiAgaHd3ZGctPk1zcEluaXRDYWxsYmFjayhod3dkZyk7CiNlbHNlCiAgLyogSW5pdCB0aGUgbG93IGxldmVsIGhhcmR3YXJlICovCiAgSEFMX1dXREdfTXNwSW5pdChod3dkZyk7CiNlbmRpZiAvKiBVU0VfSEFMX1dXREdfUkVHSVNURVJfQ0FMTEJBQ0tTICovCgogIC8qIFNldCBXV0RHIENvdW50ZXIgKi8KICBXUklURV9SRUcoaHd3ZGctPkluc3RhbmNlLT5DUiwgKFdXREdfQ1JfV0RHQSB8IGh3d2RnLT5Jbml0LkNvdW50ZXIpKTsKCiAgLyogU2V0IFdXREcgUHJlc2NhbGVyIGFuZCBXaW5kb3cgKi8KICBXUklURV9SRUcoaHd3ZGctPkluc3RhbmNlLT5DRlIsIChod3dkZy0+SW5pdC5FV0lNb2RlIHwgaHd3ZGctPkluaXQuUHJlc2NhbGVyIHwgaHd3ZGctPkluaXQuV2luZG93KSk7CgogIC8qIFJldHVybiBmdW5jdGlvbiBzdGF0dXMgKi8KICByZXR1cm4gSEFMX09LOwp9CgoKLyoqCiAgKiBAYnJpZWYgIEluaXRpYWxpemUgdGhlIFdXREcgTVNQLgogICogQHBhcmFtICBod3dkZyAgcG9pbnRlciB0byBhIFdXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCiAgKiBAbm90ZSAgIFdoZW4gcmV3cml0aW5nIHRoaXMgZnVuY3Rpb24gaW4gdXNlciBmaWxlLCBtZWNoYW5pc20gbWF5IGJlIGFkZGVkCiAgKiAgICAgICAgIHRvIGF2b2lkIG11bHRpcGxlIGluaXRpYWxpemUgd2hlbiBIQUxfV1dER19Jbml0IGZ1bmN0aW9uIGlzIGNhbGxlZAogICogICAgICAgICBhZ2FpbiB0byBjaGFuZ2UgcGFyYW1ldGVycy4KICAqIEByZXR2YWwgTm9uZQogICovCl9fd2VhayB2b2lkIEhBTF9XV0RHX01zcEluaXQoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKewogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8KICBVTlVTRUQoaHd3ZGcpOwoKICAvKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwKICAgICAgICAgICB0aGUgSEFMX1dXREdfTXNwSW5pdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlCiAgICovCn0KCgojaWYgKFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKLyoqCiAgKiBAYnJpZWYgIFJlZ2lzdGVyIGEgVXNlciBXV0RHIENhbGxiYWNrCiAgKiAgICAgICAgIFRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgd2VhayAoc3VyY2hhcmdlZCkgcHJlZGVmaW5lZCBjYWxsYmFjawogICogQHBhcmFtICBod3dkZyBXV0RHIGhhbmRsZQogICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCiAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9XV0RHX0VXSV9DQl9JRCBFYXJseSBXYWtlVXAgSW50ZXJydXB0IENhbGxiYWNrIElECiAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9XV0RHX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAogICogQHBhcmFtICBwQ2FsbGJhY2sgcG9pbnRlciB0byB0aGUgQ2FsbGJhY2sgZnVuY3Rpb24KICAqIEByZXR2YWwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1dXREdfUmVnaXN0ZXJDYWxsYmFjayhXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnLCBIQUxfV1dER19DYWxsYmFja0lEVHlwZURlZiBDYWxsYmFja0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBXV0RHX0NhbGxiYWNrVHlwZURlZiBwQ2FsbGJhY2spCnsKICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7CgogIGlmIChwQ2FsbGJhY2sgPT0gTlVMTCkKICB7CiAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgfQogIGVsc2UKICB7CiAgICBzd2l0Y2ggKENhbGxiYWNrSUQpCiAgICB7CiAgICAgIGNhc2UgSEFMX1dXREdfRVdJX0NCX0lEOgogICAgICAgIGh3d2RnLT5Fd2lDYWxsYmFjayA9IHBDYWxsYmFjazsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgSEFMX1dXREdfTVNQSU5JVF9DQl9JRDoKICAgICAgICBod3dkZy0+TXNwSW5pdENhbGxiYWNrID0gcENhbGxiYWNrOwogICAgICAgIGJyZWFrOwoKICAgICAgZGVmYXVsdDoKICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICByZXR1cm4gc3RhdHVzOwp9CgoKLyoqCiAgKiBAYnJpZWYgIFVucmVnaXN0ZXIgYSBXV0RHIENhbGxiYWNrCiAgKiAgICAgICAgIFdXREcgQ2FsbGJhY2sgaXMgcmVkaXJlY3RlZCB0byB0aGUgd2VhayAoc3VyY2hhcmdlZCkgcHJlZGVmaW5lZCBjYWxsYmFjawogICogQHBhcmFtICBod3dkZyBXV0RHIGhhbmRsZQogICogQHBhcmFtICBDYWxsYmFja0lEIElEIG9mIHRoZSBjYWxsYmFjayB0byBiZSByZWdpc3RlcmVkCiAgKiAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6CiAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9XV0RHX0VXSV9DQl9JRCBFYXJseSBXYWtlVXAgSW50ZXJydXB0IENhbGxiYWNrIElECiAgKiAgICAgICAgICAgQGFyZyBAcmVmIEhBTF9XV0RHX01TUElOSVRfQ0JfSUQgTXNwSW5pdCBjYWxsYmFjayBJRAogICogQHJldHZhbCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfV1dER19VblJlZ2lzdGVyQ2FsbGJhY2soV1dER19IYW5kbGVUeXBlRGVmICpod3dkZywgSEFMX1dXREdfQ2FsbGJhY2tJRFR5cGVEZWYgQ2FsbGJhY2tJRCkKewogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsKCiAgc3dpdGNoIChDYWxsYmFja0lEKQogIHsKICAgIGNhc2UgSEFMX1dXREdfRVdJX0NCX0lEOgogICAgICBod3dkZy0+RXdpQ2FsbGJhY2sgPSBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrOwogICAgICBicmVhazsKCiAgICBjYXNlIEhBTF9XV0RHX01TUElOSVRfQ0JfSUQ6CiAgICAgIGh3d2RnLT5Nc3BJbml0Q2FsbGJhY2sgPSBIQUxfV1dER19Nc3BJbml0OwogICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgICAgIGJyZWFrOwogIH0KCiAgcmV0dXJuIHN0YXR1czsKfQojZW5kaWYgLyogVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyAqLwoKLyoqCiAgKiBAfQogICovCgovKiogQGRlZmdyb3VwIFdXREdfRXhwb3J0ZWRfRnVuY3Rpb25zX0dyb3VwMiBJTyBvcGVyYXRpb24gZnVuY3Rpb25zCiAgKiAgQGJyaWVmICAgIElPIG9wZXJhdGlvbiBmdW5jdGlvbnMKICAqCkB2ZXJiYXRpbQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSU8gb3BlcmF0aW9uIGZ1bmN0aW9ucyAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogIFsuLl0KICAgIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBmdW5jdGlvbnMgYWxsb3dpbmcgdG86CiAgICAoKykgUmVmcmVzaCB0aGUgV1dERy4KICAgICgrKSBIYW5kbGUgV1dERyBpbnRlcnJ1cHQgcmVxdWVzdCBhbmQgYXNzb2NpYXRlZCBmdW5jdGlvbiBjYWxsYmFjay4KCkBlbmR2ZXJiYXRpbQogICogQHsKICAqLwoKLyoqCiAgKiBAYnJpZWYgIFJlZnJlc2ggdGhlIFdXREcuCiAgKiBAcGFyYW0gIGh3d2RnICBwb2ludGVyIHRvIGEgV1dER19IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBXV0RHIG1vZHVsZS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9XV0RHX1JlZnJlc2goV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKewogIC8qIFdyaXRlIHRvIFdXREcgQ1IgdGhlIFdXREcgQ291bnRlciB2YWx1ZSB0byByZWZyZXNoIHdpdGggKi8KICBXUklURV9SRUcoaHd3ZGctPkluc3RhbmNlLT5DUiwgKGh3d2RnLT5Jbml0LkNvdW50ZXIpKTsKCiAgLyogUmV0dXJuIGZ1bmN0aW9uIHN0YXR1cyAqLwogIHJldHVybiBIQUxfT0s7Cn0KCi8qKgogICogQGJyaWVmICBIYW5kbGUgV1dERyBpbnRlcnJ1cHQgcmVxdWVzdC4KICAqIEBub3RlICAgVGhlIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgKEVXSSkgY2FuIGJlIHVzZWQgaWYgc3BlY2lmaWMgc2FmZXR5IG9wZXJhdGlvbnMKICAqICAgICAgICAgb3IgZGF0YSBsb2dnaW5nIG11c3QgYmUgcGVyZm9ybWVkIGJlZm9yZSB0aGUgYWN0dWFsIHJlc2V0IGlzIGdlbmVyYXRlZC4KICAqICAgICAgICAgVGhlIEVXSSBpbnRlcnJ1cHQgaXMgZW5hYmxlZCBieSBjYWxsaW5nIEhBTF9XV0RHX0luaXQgZnVuY3Rpb24gd2l0aAogICogICAgICAgICBFV0lNb2RlIHNldCB0byBXV0RHX0VXSV9FTkFCTEUuCiAgKiAgICAgICAgIFdoZW4gdGhlIGRvd25jb3VudGVyIHJlYWNoZXMgdGhlIHZhbHVlIDB4NDAsIGFuZCBFV0kgaW50ZXJydXB0IGlzCiAgKiAgICAgICAgIGdlbmVyYXRlZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgSW50ZXJydXB0IFNlcnZpY2UgUm91dGluZSAoSVNSKSBjYW4KICAqICAgICAgICAgYmUgdXNlZCB0byB0cmlnZ2VyIHNwZWNpZmljIGFjdGlvbnMgKHN1Y2ggYXMgY29tbXVuaWNhdGlvbnMgb3IgZGF0YQogICogICAgICAgICBsb2dnaW5nKSwgYmVmb3JlIHJlc2V0dGluZyB0aGUgZGV2aWNlLgogICogQHBhcmFtICBod3dkZyAgcG9pbnRlciB0byBhIFdXREdfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucwogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgV1dERyBtb2R1bGUuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIEhBTF9XV0RHX0lSUUhhbmRsZXIoV1dER19IYW5kbGVUeXBlRGVmICpod3dkZykKewogIC8qIENoZWNrIGlmIEVhcmx5IFdha2V1cCBJbnRlcnJ1cHQgaXMgZW5hYmxlICovCiAgaWYgKF9fSEFMX1dXREdfR0VUX0lUX1NPVVJDRShod3dkZywgV1dER19JVF9FV0kpICE9IFJFU0VUKQogIHsKICAgIC8qIENoZWNrIGlmIFdXREcgRWFybHkgV2FrZXVwIEludGVycnVwdCBvY2N1cnJlZCAqLwogICAgaWYgKF9fSEFMX1dXREdfR0VUX0ZMQUcoaHd3ZGcsIFdXREdfRkxBR19FV0lGKSAhPSBSRVNFVCkKICAgIHsKICAgICAgLyogQ2xlYXIgdGhlIFdXREcgRWFybHkgV2FrZXVwIGZsYWcgKi8KICAgICAgX19IQUxfV1dER19DTEVBUl9GTEFHKGh3d2RnLCBXV0RHX0ZMQUdfRVdJRik7CgojaWYgKFVTRV9IQUxfV1dER19SRUdJU1RFUl9DQUxMQkFDS1MgPT0gMSkKICAgICAgLyogRWFybHkgV2FrZXVwIHJlZ2lzdGVyZWQgY2FsbGJhY2sgKi8KICAgICAgaHd3ZGctPkV3aUNhbGxiYWNrKGh3d2RnKTsKI2Vsc2UKICAgICAgLyogRWFybHkgV2FrZXVwIGNhbGxiYWNrICovCiAgICAgIEhBTF9XV0RHX0Vhcmx5V2FrZXVwQ2FsbGJhY2soaHd3ZGcpOwojZW5kaWYgLyogVVNFX0hBTF9XV0RHX1JFR0lTVEVSX0NBTExCQUNLUyAqLwogICAgfQogIH0KfQoKCi8qKgogICogQGJyaWVmICBXV0RHIEVhcmx5IFdha2V1cCBjYWxsYmFjay4KICAqIEBwYXJhbSAgaHd3ZGcgIHBvaW50ZXIgdG8gYSBXV0RHX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMKICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFdXREcgbW9kdWxlLgogICogQHJldHZhbCBOb25lCiAgKi8KX193ZWFrIHZvaWQgSEFMX1dXREdfRWFybHlXYWtldXBDYWxsYmFjayhXV0RHX0hhbmRsZVR5cGVEZWYgKmh3d2RnKQp7CiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLwogIFVOVVNFRChod3dkZyk7CgogIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLAogICAgICAgICAgIHRoZSBIQUxfV1dER19FYXJseVdha2V1cENhbGxiYWNrIGNvdWxkIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUKICAgKi8KfQoKLyoqCiAgKiBAfQogICovCgovKioKICAqIEB9CiAgKi8KCiNlbmRpZiAvKiBIQUxfV1dER19NT0RVTEVfRU5BQkxFRCAqLwovKioKICAqIEB9CiAgKi8KCi8qKgogICogQH0KICAqLwo=