LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmY0eHhfaGFsX3RpbWViYXNlX3J0Y193YWtldXBfdGVtcGxhdGUuYyAKICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtCiAgKiBAYnJpZWYgICBIQUwgdGltZSBiYXNlIGJhc2VkIG9uIHRoZSBoYXJkd2FyZSBSVENfV0FLRVVQIFRlbXBsYXRlLgogICogICAgCiAgKiAgICAgICAgICBUaGlzIGZpbGUgb3ZlcnJpZGVzIHRoZSBuYXRpdmUgSEFMIHRpbWUgYmFzZSBmdW5jdGlvbnMgKGRlZmluZWQgYXMgd2VhaykKICAqICAgICAgICAgIHRvIHVzZSB0aGUgUlRDIFdBS0VVUCBmb3IgdGhlIHRpbWUgYmFzZSBnZW5lcmF0aW9uOgogICogICAgICAgICAgICsgSW50aWFsaXplcyB0aGUgUlRDIHBlcmlwaGVyYWwgYW5kIGNvbmZpZ3VyZXMgdGhlIHdha2V1cCB0aW1lciB0byBiZQogICogICAgICAgICAgICAgaW5jcmVtZW50ZWQgZWFjaCAxbXMKICAqICAgICAgICAgICArIFRoZSB3YWtldXAgZmVhdHVyZSBpcyBjb25maWd1cmVkIHRvIGFzc2VydCBhbiBpbnRlcnJ1cHQgZWFjaCAxbXMgCiAgKiAgICAgICAgICAgKyBIQUxfSW5jVGljayBpcyBjYWxsZWQgaW5zaWRlIHRoZSBIQUxfUlRDRXhfV2FrZVVwVGltZXJFdmVudENhbGxiYWNrCiAgKiAgICAgICAgICAgKyBIU0UgKGRlZmF1bHQpLCBMU0Ugb3IgTFNJIGNhbiBiZSBzZWxlY3RlZCBhcyBSVEMgY2xvY2sgc291cmNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogQGF0dGVudGlvbgogICoKICAqIENvcHlyaWdodCAoYykgMjAxNyBTVE1pY3JvZWxlY3Ryb25pY3MuCiAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICoKICAqIFRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgdGVybXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZQogICogaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgc29mdHdhcmUgY29tcG9uZW50LgogICogSWYgbm8gTElDRU5TRSBmaWxlIGNvbWVzIHdpdGggdGhpcyBzb2Z0d2FyZSwgaXQgaXMgcHJvdmlkZWQgQVMtSVMuCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFsuLl0KICAgIFRoaXMgZmlsZSBtdXN0IGJlIGNvcGllZCB0byB0aGUgYXBwbGljYXRpb24gZm9sZGVyIGFuZCBtb2RpZmllZCBhcyBmb2xsb3dzOgogICAgKCMpIFJlbmFtZSBpdCB0byAnc3RtMzJmNHh4X2hhbF90aW1lYmFzZV9ydGNfd2FrZXVwLmMnCiAgICAoIykgQWRkIHRoaXMgZmlsZSBhbmQgdGhlIFJUQyBIQUwgZHJpdmVycyB0byB5b3VyIHByb2plY3QgYW5kIHVuY29tbWVudAogICAgICAgSEFMX1JUQ19NT0RVTEVfRU5BQkxFRCBkZWZpbmUgaW4gc3RtMzJmNHh4X2hhbF9jb25mLmggCgogICAgWy4uXQogICAgKEApIEhBTCBSVEMgYWxhcm0gYW5kIEhBTCBSVEMgd2FrZXVwIGRyaXZlcnMgY2FuknQgYmUgdXNlZCB3aXRoIGxvdyBwb3dlciBtb2RlczoKICAgICAgICBUaGUgd2FrZSB1cCBjYXBhYmlsaXR5IG9mIHRoZSBSVEMgbWF5IGJlIGludHJ1c2l2ZSBpbiBjYXNlIG9mIHByaW9yIGxvdyBwb3dlciBtb2RlCiAgICAgICAgY29uZmlndXJhdGlvbiByZXF1aXJpbmcgZGlmZmVyZW50IHdha2UgdXAgc291cmNlcy4KICAgICAgICBBcHBsaWNhdGlvbi9FeGFtcGxlIGJlaGF2aW9yIGlzIG5vIG1vcmUgZ3VhcmFudGVlZCAKICAgIChAKSBUaGUgc3RtMzJmNHh4X2hhbF90aW1lYmFzZV90aW0gdXNlIGlzIHJlY29tbWVuZGVkIGZvciB0aGUgQXBwbGljYXRpb25zL0V4YW1wbGVzCiAgICAgICAgICByZXF1aXJpbmcgbG93IHBvd2VyIG1vZGVzCgogIEBlbmR2ZXJiYXRpbQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCgovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAic3RtMzJmNHh4X2hhbC5oIgovKiogQGFkZHRvZ3JvdXAgU1RNMzJGNHh4X0hBTF9Ecml2ZXIKICAqIEB7CiAgKi8KCi8qKiBAZGVmZ3JvdXAgSEFMX1RpbWVCYXNlX1JUQ19XYWtlVXBfVGVtcGxhdGUgIEhBTCBUaW1lQmFzZSBSVEMgV2FrZVVwIFRlbXBsYXRlCiAgKiBAewogICovIAoKLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIFJUQyBDbG9jayBzb3VyY2UgZm9yIHlvdXIgYXBwbGljYXRpb246IAogICsgUlRDX0NMT0NLX1NPVVJDRV9IU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHJlcXVpcmluZyB0aW1pbmcgcHJlY2lzaW9uLgogICsgUlRDX0NMT0NLX1NPVVJDRV9MU0U6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgogICsgUlRDX0NMT0NLX1NPVVJDRV9MU0k6IGNhbiBiZSBzZWxlY3RlZCBmb3IgYXBwbGljYXRpb25zIHdpdGggbG93IGNvbnN0cmFpbnQgb24gdGltaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlY2lzaW9uLgogICovCiNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9IU0UKLyogI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLwovKiAjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNJICovCgojaWZkZWYgUlRDX0NMT0NLX1NPVVJDRV9IU0UKICAjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDk5VQogICNkZWZpbmUgUlRDX1NZTkNIX1BSRURJViAgICAgICAgOVUKICAjZGVmaW5lIFJDQ19SVENDTEtTT1VSQ0VfMU1IWiAgICgodWludDMyX3QpKCh1aW50MzJfdClSQ0NfQkRDUl9SVENTRUwgfCAodWludDMyX3QpKChIU0VfVkFMVUUvMTAwMDAwMFUpIDw8IDE2VSkpKQojZWxzZSAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTRSB8fCBSVENfQ0xPQ0tfU09VUkNFX0xTSSAqLwogICNkZWZpbmUgUlRDX0FTWU5DSF9QUkVESVYgICAgICAgMFUKICAjZGVmaW5lIFJUQ19TWU5DSF9QUkVESVYgICAgICAgIDMxVQojZW5kaWYgLyogUlRDX0NMT0NLX1NPVVJDRV9IU0UgKi8KCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovClJUQ19IYW5kbGVUeXBlRGVmICAgICAgICBoUlRDX0hhbmRsZTsKCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnZvaWQgUlRDX1dLVVBfSVJRSGFuZGxlcih2b2lkKTsKCi8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKioKICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBSVENfV0tVUCBhcyBhIHRpbWUgYmFzZSBzb3VyY2UuIAogICogICAgICAgICBUaGUgdGltZSBzb3VyY2UgaXMgY29uZmlndXJlZCAgdG8gaGF2ZSAxbXMgdGltZSBiYXNlIHdpdGggYSBkZWRpY2F0ZWQgCiAgKiAgICAgICAgIFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LiAKICAqICAgICAgICAgV2FrZXVwIFRpbWUgYmFzZSA9ICgoUlRDX0FTWU5DSF9QUkVESVYgKyAxKSAqIChSVENfU1lOQ0hfUFJFRElWICsgMSkpIC8gUlRDX0NMT0NLIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMW1zCiAgKiAgICAgICAgIFdha2V1cCBUaW1lID0gV2FrZXVwVGltZWJhc2UgKiBXYWtlVXBDb3VudGVyICgwICsgMSkgCiAgICAgICAgICAgICAgICAgICAgICAgID0gMSBtcwogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgYXV0b21hdGljYWxseSBhdCB0aGUgYmVnaW5uaW5nIG9mIHByb2dyYW0gYWZ0ZXIKICAqICAgICAgICAgcmVzZXQgYnkgSEFMX0luaXQoKSBvciBhdCBhbnkgdGltZSB3aGVuIGNsb2NrIGlzIGNvbmZpZ3VyZWQsIGJ5IEhBTF9SQ0NfQ2xvY2tDb25maWcoKS4gCiAgKiBAcGFyYW0gIFRpY2tQcmlvcml0eSBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KICAqIEByZXR2YWwgSEFMIHN0YXR1cwogICovCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9Jbml0VGljayAodWludDMyX3QgVGlja1ByaW9yaXR5KQp7CiAgX19JTyB1aW50MzJfdCBjb3VudGVyID0gMFU7CgogIFJDQ19Pc2NJbml0VHlwZURlZiAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3Q7CiAgUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmICBQZXJpcGhDbGtJbml0U3RydWN0OwogIEhBTF9TdGF0dXNUeXBlRGVmICAgICBzdGF0dXM7CgojaWZkZWYgUlRDX0NMT0NLX1NPVVJDRV9MU0UKICAvKiBDb25maWd1ZSBMU0UgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLwogIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTRTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CiAgUkNDX09zY0luaXRTdHJ1Y3QuTFNFU3RhdGUgPSBSQ0NfTFNFX09OOwogIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0xTRTsKI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9MU0kpCiAgLyogQ29uZmlndWUgTFNJIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8KICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9MU0k7CiAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOwogIFJDQ19Pc2NJbml0U3RydWN0LkxTSVN0YXRlID0gUkNDX0xTSV9PTjsKICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9MU0k7CiNlbGlmIGRlZmluZWQgKFJUQ19DTE9DS19TT1VSQ0VfSFNFKQogIC8qIENvbmZpZ3VlIEhTRSBhcyBSVEMgY2xvY2sgc291Y3JlICovCiAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfSFNFOwogIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5IU0VTdGF0ZSA9IFJDQ19IU0VfT047CiAgLyogRW5zdXJlIHRoYXQgUlRDIGlzIGNsb2NrZWQgYnkgMU1IeiAqLwogIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFXzFNSFo7CiNlbHNlCiNlcnJvciBQbGVhc2Ugc2VsZWN0IHRoZSBSVEMgQ2xvY2sgc291cmNlCiNlbmRpZiAvKiBSVENfQ0xPQ0tfU09VUkNFX0xTRSAqLwoKICBzdGF0dXMgPSBIQUxfUkNDX09zY0NvbmZpZygmUkNDX09zY0luaXRTdHJ1Y3QpOwogIGlmIChzdGF0dXMgPT0gSEFMX09LKQogIHsKICAgIFBlcmlwaENsa0luaXRTdHJ1Y3QuUGVyaXBoQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUEVSSVBIQ0xLX1JUQzsKICAgIHN0YXR1cyA9IEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoJlBlcmlwaENsa0luaXRTdHJ1Y3QpOwogIH0KICBpZiAoc3RhdHVzID09IEhBTF9PSykKICB7CiAgICAvKiBFbmFibGUgUlRDIENsb2NrICovCiAgICBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpOwogICAgLyogVGhlIHRpbWUgYmFzZSBzaG91bGQgYmUgMW1zCiAgICAgICBUaW1lIGJhc2UgPSAoKFJUQ19BU1lOQ0hfUFJFRElWICsgMSkgKiAoUlRDX1NZTkNIX1BSRURJViArIDEpKSAvIFJUQ19DTE9DSwogICAgICAgSFNFIGFzIFJUQyBjbG9jawogICAgICAgICBUaW1lIGJhc2UgPSAoKDk5ICsgMSkgKiAoOSArIDEpKSAvIDFNaHoKICAgICAgICAgICAgICAgICAgID0gMW1zCiAgICAgICBMU0UgYXMgUlRDIGNsb2NrCiAgICAgICAgIFRpbWUgYmFzZSA9ICgoMzEgKyAxKSAqICgwICsgMSkpIC8gMzIuNzY4S2h6CiAgICAgICAgICAgICAgICAgICA9IH4xbXMKICAgICAgIExTSSBhcyBSVEMgY2xvY2sKICAgICAgICAgVGltZSBiYXNlID0gKCgzMSArIDEpICogKDAgKyAxKSkgLyAzMktoegogICAgICAgICAgICAgICAgICAgPSAxbXMKICAgICovCiAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZSA9IFJUQzsKICAgIGhSVENfSGFuZGxlLkluaXQuSG91ckZvcm1hdCA9IFJUQ19IT1VSRk9STUFUXzI0OwogICAgaFJUQ19IYW5kbGUuSW5pdC5Bc3luY2hQcmVkaXYgPSBSVENfQVNZTkNIX1BSRURJVjsKICAgIGhSVENfSGFuZGxlLkluaXQuU3luY2hQcmVkaXYgPSBSVENfU1lOQ0hfUFJFRElWOwogICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXQgPSBSVENfT1VUUFVUX0RJU0FCTEU7CiAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dFBvbGFyaXR5ID0gUlRDX09VVFBVVF9QT0xBUklUWV9ISUdIOwogICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRUeXBlID0gUlRDX09VVFBVVF9UWVBFX09QRU5EUkFJTjsKICAgIHN0YXR1cyA9IEhBTF9SVENfSW5pdCgmaFJUQ19IYW5kbGUpOwogIH0KICBpZiAoc3RhdHVzID09IEhBTF9PSykKICB7CiAgICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKCiAgICAvKiBEaXNhYmxlIHRoZSBXYWtlLXVwIFRpbWVyICovCiAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRElTQUJMRSgmaFJUQ19IYW5kbGUpOwoKICAgIC8qIEluIGNhc2Ugb2YgaW50ZXJydXB0IG1vZGUgaXMgdXNlZCwgdGhlIGludGVycnVwdCBzb3VyY2UgbXVzdCBkaXNhYmxlZCAqLyAKICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9ESVNBQkxFX0lUKCZoUlRDX0hhbmRsZSwgUlRDX0lUX1dVVCk7CgogICAgLyogV2FpdCB0aWxsIFJUQyBXVVRXRiBmbGFnIGlzIHNldCAgKi8KICAgIHdoaWxlIChfX0hBTF9SVENfV0FLRVVQVElNRVJfR0VUX0ZMQUcoJmhSVENfSGFuZGxlLCBSVENfRkxBR19XVVRXRikgPT0gUkVTRVQpCiAgICB7CiAgICAgIGlmIChjb3VudGVyKysgPT0gKFN5c3RlbUNvcmVDbG9jayAvIDQ4VSkpCiAgICAgIHsKICAgICAgICBzdGF0dXMgPSBIQUxfRVJST1I7CiAgICAgIH0KICAgIH0KICB9CiAgaWYgKHN0YXR1cyA9PSBIQUxfT0spCiAgewogICAgLyogQ2xlYXIgUFdSIHdha2UgdXAgRmxhZyAqLwogICAgX19IQUxfUFdSX0NMRUFSX0ZMQUcoUFdSX0ZMQUdfV1UpOwoKICAgIC8qIENsZWFyIFJUQyBXYWtlIFVwIHRpbWVyIEZsYWcgKi8KICAgIF9fSEFMX1JUQ19XQUtFVVBUSU1FUl9DTEVBUl9GTEFHKCZoUlRDX0hhbmRsZSwgUlRDX0ZMQUdfV1VURik7CgogICAgLyogQ29uZmlndXJlIHRoZSBXYWtlLXVwIFRpbWVyIGNvdW50ZXIgKi8KICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5XVVRSID0gMFU7CgogICAgLyogQ2xlYXIgdGhlIFdha2UtdXAgVGltZXIgY2xvY2sgc291cmNlIGJpdHMgaW4gQ1IgcmVnaXN0ZXIgKi8KICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5DUiAmPSAodWludDMyX3QpflJUQ19DUl9XVUNLU0VMOwoKICAgIC8qIENvbmZpZ3VyZSB0aGUgY2xvY2sgc291cmNlICovCiAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+Q1IgfD0gKHVpbnQzMl90KVJUQ19XQUtFVVBDTE9DS19DS19TUFJFXzE2QklUUzsKCiAgICAvKiBSVEMgV2FrZVVwVGltZXIgSW50ZXJydXB0IENvbmZpZ3VyYXRpb246IEVYVEkgY29uZmlndXJhdGlvbiAqLwogICAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX0lUKCk7CgogICAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VYVElfRU5BQkxFX1JJU0lOR19FREdFKCk7CgogICAgLyogQ29uZmlndXJlIHRoZSBJbnRlcnJ1cHQgaW4gdGhlIFJUQ19DUiByZWdpc3RlciAqLwogICAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VOQUJMRV9JVCgmaFJUQ19IYW5kbGUsUlRDX0lUX1dVVCk7CgogICAgLyogRW5hYmxlIHRoZSBXYWtlLXVwIFRpbWVyICovCiAgICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRU5BQkxFKCZoUlRDX0hhbmRsZSk7CgogICAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwoKICAgIC8qIEVuYWJsZSB0aGUgUlRDIGdsb2JhbCBJbnRlcnJ1cHQgKi8KICAgIEhBTF9OVklDX0VuYWJsZUlSUShSVENfV0tVUF9JUlFuKTsKCiAgICAvKiBDb25maWd1cmUgdGhlIFN5c1RpY2sgSVJRIHByaW9yaXR5ICovCiAgICBpZiAoVGlja1ByaW9yaXR5IDwgKDFVTCA8PCBfX05WSUNfUFJJT19CSVRTKSkKICAgIHsKICAgICAgSEFMX05WSUNfU2V0UHJpb3JpdHkoUlRDX1dLVVBfSVJRbiwgVGlja1ByaW9yaXR5LCAwVSk7CiAgICAgIHV3VGlja1ByaW8gPSBUaWNrUHJpb3JpdHk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsKICAgIH0KICB9CiAgcmV0dXJuIHN0YXR1czsKfQoKLyoqCiAgKiBAYnJpZWYgIFN1c3BlbmQgVGljayBpbmNyZW1lbnQuCiAgKiBAbm90ZSAgIERpc2FibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IGRpc2FibGluZyBSVENfV0tVUCBpbnRlcnJ1cHQuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIEhBTF9TdXNwZW5kVGljayh2b2lkKQp7CiAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOwogIC8qIERpc2FibGUgV0FLRSBVUCBUSU1FUiBJbnRlcnJ1cHQgKi8KICBfX0hBTF9SVENfV0FLRVVQVElNRVJfRElTQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9XVVQpOwogIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7Cn0KCi8qKgogICogQGJyaWVmICBSZXN1bWUgVGljayBpbmNyZW1lbnQuCiAgKiBAbm90ZSAgIEVuYWJsZSB0aGUgdGljayBpbmNyZW1lbnQgYnkgRW5hYmxpbmcgUlRDX1dLVVAgaW50ZXJydXB0LgogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfUmVzdW1lVGljayh2b2lkKQp7CiAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOwogIC8qIEVuYWJsZSAgV0FLRSBVUCBUSU1FUiAgaW50ZXJydXB0ICovCiAgX19IQUxfUlRDX1dBS0VVUFRJTUVSX0VOQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9XVVQpOwogIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKCZoUlRDX0hhbmRsZSk7Cn0KCi8qKgogICogQGJyaWVmICBXYWtlIFVwIFRpbWVyIEV2ZW50IENhbGxiYWNrIGluIG5vbiBibG9ja2luZyBtb2RlCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICB3aGVuIFJUQ19XS1VQIGludGVycnVwdCB0b29rIHBsYWNlLCBpbnNpZGUKICAqIFJUQ19XS1VQX0lSUUhhbmRsZXIoKS4gSXQgbWFrZXMgYSBkaXJlY3QgY2FsbCB0byBIQUxfSW5jVGljaygpIHRvIGluY3JlbWVudAogICogYSBnbG9iYWwgdmFyaWFibGUgInV3VGljayIgdXNlZCBhcyBhcHBsaWNhdGlvbiB0aW1lIGJhc2UuCiAgKiBAcGFyYW0gIGhydGMgIFJUQyBoYW5kbGUKICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgSEFMX1JUQ0V4X1dha2VVcFRpbWVyRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKewogIEhBTF9JbmNUaWNrKCk7Cn0KCi8qKgogICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGhhbmRsZXMgIFdBS0UgVVAgVElNRVIgIGludGVycnVwdCByZXF1ZXN0LgogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBSVENfV0tVUF9JUlFIYW5kbGVyKHZvaWQpCnsKICBIQUxfUlRDRXhfV2FrZVVwVGltZXJJUlFIYW5kbGVyKCZoUlRDX0hhbmRsZSk7Cn0KCi8qKgogICogQH0KICAqLwoKLyoqCiAgKiBAfQogICovCgoK