LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMndieHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybV90ZW1wbGF0ZS5jIAogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0KICAqIEBicmllZiAgIEhBTCB0aW1lIGJhc2UgYmFzZWQgb24gdGhlIGhhcmR3YXJlIFJUQ19BTEFSTSBUZW1wbGF0ZS4KICAqCiAgKiAgICAgICAgICBUaGlzIGZpbGUgb3ZlcnJpZGUgdGhlIG5hdGl2ZSBIQUwgdGltZSBiYXNlIGZ1bmN0aW9ucyAoZGVmaW5lZCBhcyB3ZWFrKQogICogICAgICAgICAgdG8gdXNlIHRoZSBSVEMgQUxBUk0gZm9yIHRpbWUgYmFzZSBnZW5lcmF0aW9uOgogICogICAgICAgICAgICsgSW50aWFsaXplcyB0aGUgUlRDIHBlcmlwaGVyYWwgdG8gaW5jcmVtZW50IHRoZSBzZWNvbmRzIHJlZ2lzdGVycyBlYWNoIDFtcwogICogICAgICAgICAgICsgVGhlIGFsYXJtIGlzIGNvbmZpZ3VyZWQgdG8gYXNzZXJ0IGFuIGludGVycnVwdCB3aGVuIHRoZSBSVEMgcmVhY2hlcyAxbXMgCiAgKiAgICAgICAgICAgKyBIQUxfSW5jVGljayBpcyBjYWxsZWQgYXQgZWFjaCBBbGFybSBldmVudCBhbmQgdGhlIHRpbWUgaXMgcmVzZXQgdG8gMDA6MDA6MDAKICAqICAgICAgICAgICArIEhTRSAoZGVmYXVsdCksIExTRSBvciBMU0kgY2FuIGJlIHNlbGVjdGVkIGFzIFJUQyBjbG9jayBzb3VyY2UgIAogQHZlcmJhdGltCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIEhvdyB0byB1c2UgdGhpcyBkcml2ZXIgIyMjIyMKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgIFsuLl0KICAgIFRoaXMgZmlsZSBtdXN0IGJlIGNvcGllZCB0byB0aGUgYXBwbGljYXRpb24gZm9sZGVyIGFuZCBtb2RpZmllZCBhcyBmb2xsb3dzOgogICAgKCMpIFJlbmFtZSBpdCB0byAnc3RtMzJ3Ynh4X2hhbF90aW1lYmFzZV9ydGNfYWxhcm0uYycKICAgICgjKSBBZGQgdGhpcyBmaWxlIGFuZCB0aGUgUlRDIEhBTCBkcml2ZXJzIHRvIHlvdXIgcHJvamVjdCBhbmQgdW5jb21tZW50CiAgICAgICBIQUxfUlRDX01PRFVMRV9FTkFCTEVEIGRlZmluZSBpbiBzdG0zMndieHhfaGFsX2NvbmYuaCAKCiAgICBbLi5dCiAgICAoQCkgSEFMIFJUQyBhbGFybSBhbmQgSEFMIFJUQyB3YWtldXAgZHJpdmVycyBjYW6SdCBiZSB1c2VkIHdpdGggbG93IHBvd2VyIG1vZGVzOgogICAgICAgIFRoZSB3YWtlIHVwIGNhcGFiaWxpdHkgb2YgdGhlIFJUQyBtYXkgYmUgaW50cnVzaXZlIGluIGNhc2Ugb2YgcHJpb3IgbG93IHBvd2VyIG1vZGUKICAgICAgICBjb25maWd1cmF0aW9uIHJlcXVpcmluZyBkaWZmZXJlbnQgd2FrZSB1cCBzb3VyY2VzLgogICAgICAgIEFwcGxpY2F0aW9uL0V4YW1wbGUgYmVoYXZpb3IgaXMgbm8gbW9yZSBndWFyYW50ZWVkIAogICAgKEApIFRoZSBzdG0zMndieHhfaGFsX3RpbWViYXNlX3RpbSB1c2UgaXMgcmVjb21tZW5kZWQgZm9yIHRoZSBBcHBsaWNhdGlvbnMvRXhhbXBsZXMKICAgICAgICAgIHJlcXVpcmluZyBsb3cgcG93ZXIgbW9kZXMKCiAgQGVuZHZlcmJhdGltCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAYXR0ZW50aW9uCiAgKgogICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOSBTVE1pY3JvZWxlY3Ryb25pY3MuIAogICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgogICoKICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAogICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCgovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAic3RtMzJ3Ynh4X2hhbC5oIgovKiogQGFkZHRvZ3JvdXAgU1RNMzJXQnh4X0hBTF9Ecml2ZXIKICAqIEB7CiAgKi8KCi8qKiBAZGVmZ3JvdXAgSEFMX1RpbWVCYXNlX1JUQ19BbGFybV9UZW1wbGF0ZSAgSEFMIFRpbWVCYXNlIFJUQyBBbGFybSBUZW1wbGF0ZQogICogQHsKICAqLyAKCi8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgovKiBVbmNvbW1lbnQgdGhlIGxpbmUgYmVsb3cgdG8gc2VsZWN0IHRoZSBhcHByb3ByaWF0ZSBSVEMgQ2xvY2sgc291cmNlIGZvciB5b3VyIGFwcGxpY2F0aW9uOiAKICArIFJUQ19DTE9DS19TT1VSQ0VfSFNFOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyByZXF1aXJpbmcgdGltaW5nIHByZWNpc2lvbi4KICArIFJUQ19DTE9DS19TT1VSQ0VfTFNFOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxvdyBjb25zdHJhaW50IG9uIHRpbWluZwogICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbi4KICArIFJUQ19DTE9DS19TT1VSQ0VfTFNJOiBjYW4gYmUgc2VsZWN0ZWQgZm9yIGFwcGxpY2F0aW9ucyB3aXRoIGxvdyBjb25zdHJhaW50IG9uIHRpbWluZwogICAgICAgICAgICAgICAgICAgICAgICAgIHByZWNpc2lvbi4KICAqLwojZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfSFNFCi8qICNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9MU0UgKi8KLyogI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0xTSSAqLwoKI2lmZGVmIFJUQ19DTE9DS19TT1VSQ0VfSFNFCiAgI2RlZmluZSBSVENfQVNZTkNIX1BSRURJViAgICAgICA5OVUKICAjZGVmaW5lIFJUQ19TWU5DSF9QUkVESVYgICAgICAgIDlVCiAgI2RlZmluZSBSQ0NfUlRDQ0xLU09VUkNFXzFNSFogICAoKHVpbnQzMl90KSgodWludDMyX3QpUkNDX0JEQ1JfUlRDU0VMIHwgKHVpbnQzMl90KSgoSFNFX1ZBTFVFLzEwMDAwMDBVKSA8PCAxNlUpKSkKI2Vsc2UgLyogUlRDX0NMT0NLX1NPVVJDRV9MU0UgfHwgUlRDX0NMT0NLX1NPVVJDRV9MU0kgKi8KICAjZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDBVCiAgI2RlZmluZSBSVENfU1lOQ0hfUFJFRElWICAgICAgICAzMVUKI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfSFNFICovCgovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpleHRlcm4gUlRDX0hhbmRsZVR5cGVEZWYgaFJUQ19IYW5kbGU7ClJUQ19IYW5kbGVUeXBlRGVmIGhSVENfSGFuZGxlOwoKLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCBSVENfQWxhcm1fSVJRSGFuZGxlcih2b2lkKTsKLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qKgogICogQGJyaWVmICBUaGlzIGZ1bmN0aW9uIGNvbmZpZ3VyZXMgdGhlIFJUQ19BTEFSTUEgYXMgYSB0aW1lIGJhc2Ugc291cmNlLiAKICAqICAgICAgICAgVGhlIHRpbWUgc291cmNlIGlzIGNvbmZpZ3VyZWQgIHRvIGhhdmUgMW1zIHRpbWUgYmFzZSB3aXRoIGEgZGVkaWNhdGVkIAogICogICAgICAgICBUaWNrIGludGVycnVwdCBwcmlvcml0eS4gCiAgKiBAbm90ZSAgIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkICBhdXRvbWF0aWNhbGx5IGF0IHRoZSBiZWdpbm5pbmcgb2YgcHJvZ3JhbSBhZnRlcgogICogICAgICAgICByZXNldCBieSBIQUxfSW5pdCgpIG9yIGF0IGFueSB0aW1lIHdoZW4gY2xvY2sgaXMgY29uZmlndXJlZCwgYnkgSEFMX1JDQ19DbG9ja0NvbmZpZygpLgogICogQHBhcmFtICBUaWNrUHJpb3JpdHk6IFRpY2sgaW50ZXJydXB0IHByaW9yaXR5LgogICogQHJldHZhbCBIQUwgc3RhdHVzCiAgKi8KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX0luaXRUaWNrICh1aW50MzJfdCBUaWNrUHJpb3JpdHkpCnsKICBfX0lPIHVpbnQzMl90IGNvdW50ZXIgPSAwVTsKCiAgUkNDX09zY0luaXRUeXBlRGVmICAgICAgICBSQ0NfT3NjSW5pdFN0cnVjdDsKICBSQ0NfUGVyaXBoQ0xLSW5pdFR5cGVEZWYgIFBlcmlwaENsa0luaXRTdHJ1Y3Q7CgojaWZkZWYgUlRDX0NMT0NLX1NPVVJDRV9MU0UKICAvKiBDb25maWd1ZSBMU0UgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLwogIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0xTRTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CiAgUkNDX09zY0luaXRTdHJ1Y3QuTFNFU3RhdGUgPSBSQ0NfTFNFX09OOwogIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0xTRTsKI2VsaWYgZGVmaW5lZCAoUlRDX0NMT0NLX1NPVVJDRV9MU0kpCiAgLyogQ29uZmlndWUgTFNJIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8KICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9MU0kxOwogIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0lTdGF0ZSA9IFJDQ19MU0lfT047CiAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNJOwojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0hTRSkKICAvKiBDb25maWd1ZSBIU0UgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLwogIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTRTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CiAgUkNDX09zY0luaXRTdHJ1Y3QuSFNFU3RhdGUgPSBSQ0NfSFNFX09OOwogIC8qIEVuc3VyZSB0aGF0IFJUQyBpcyBjbG9ja2VkIGJ5IDFNSHogKi8KICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV8xTUhaOwojZWxzZQojZXJyb3IgUGxlYXNlIHNlbGVjdCB0aGUgUlRDIENsb2NrIHNvdXJjZQojZW5kaWYgLyogUlRDX0NMT0NLX1NPVVJDRV9MU0UgKi8KCiAgaWYoSEFMX1JDQ19Pc2NDb25maWcoJlJDQ19Pc2NJbml0U3RydWN0KSA9PSBIQUxfT0spCiAgewogICAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5QZXJpcGhDbG9ja1NlbGVjdGlvbiA9IFJDQ19QRVJJUEhDTEtfUlRDOwogICAgaWYoSEFMX1JDQ0V4X1BlcmlwaENMS0NvbmZpZygmUGVyaXBoQ2xrSW5pdFN0cnVjdCkgPT0gSEFMX09LKQogICAgewogICAgICAvKiBFbmFibGUgUlRDIENsb2NrICovCiAgICAgIF9fSEFMX1JDQ19SVENfRU5BQkxFKCk7CiAgICAgIC8qIFRoZSB0aW1lIGJhc2Ugc2hvdWxkIGJlIDFtcwogICAgICAgICBUaW1lIGJhc2UgPSAoKFJUQ19BU1lOQ0hfUFJFRElWICsgMSkgKiAoUlRDX1NZTkNIX1BSRURJViArIDEpKSAvIFJUQ19DTE9DSyAKICAgICAgICAgSFNFIGFzIFJUQyBjbG9jayAKICAgICAgICAgICBUaW1lIGJhc2UgPSAoKDk5ICsgMSkgKiAoOSArIDEpKSAvIDFNSHoKICAgICAgICAgICAgICAgICAgICAgPSAxbXMKICAgICAgICAgTFNFIGFzIFJUQyBjbG9jayAKICAgICAgICAgICBUaW1lIGJhc2UgPSAoKDMxICsgMSkgKiAoMCArIDEpKSAvIDMyLjc2OEtIegogICAgICAgICAgICAgICAgICAgICA9IH4xbXMKICAgICAgICAgTFNJIGFzIFJUQyBjbG9jayAKICAgICAgICAgICBUaW1lIGJhc2UgPSAoKDMxICsgMSkgKiAoMCArIDEpKSAvIDMyS0h6CiAgICAgICAgICAgICAgICAgICAgID0gMW1zCiAgICAgICovCiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlID0gUlRDOwogICAgICBoUlRDX0hhbmRsZS5Jbml0LkhvdXJGb3JtYXQgPSBSVENfSE9VUkZPUk1BVF8yNDsKICAgICAgaFJUQ19IYW5kbGUuSW5pdC5Bc3luY2hQcmVkaXYgPSBSVENfQVNZTkNIX1BSRURJVjsKICAgICAgaFJUQ19IYW5kbGUuSW5pdC5TeW5jaFByZWRpdiA9IFJUQ19TWU5DSF9QUkVESVY7CiAgICAgIGhSVENfSGFuZGxlLkluaXQuT3V0UHV0ID0gUlRDX09VVFBVVF9ESVNBQkxFOwogICAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dFBvbGFyaXR5ID0gUlRDX09VVFBVVF9QT0xBUklUWV9ISUdIOwogICAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dFR5cGUgPSBSVENfT1VUUFVUX1RZUEVfT1BFTkRSQUlOOwogICAgICBpZiAoSEFMX1JUQ19Jbml0KCZoUlRDX0hhbmRsZSkgIT0gSEFMX09LKQogICAgICB7CiAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgfQoKICAgICAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKCiAgICAgIC8qIERpc2FibGUgdGhlIEFsYXJtIEEgaW50ZXJydXB0ICovCiAgICAgIF9fSEFMX1JUQ19BTEFSTUFfRElTQUJMRSgmaFJUQ19IYW5kbGUpOwoKICAgICAgLyogQ2xlYXIgZmxhZyBhbGFybSBBICovCiAgICAgIF9fSEFMX1JUQ19BTEFSTV9DTEVBUl9GTEFHKCZoUlRDX0hhbmRsZSwgUlRDX0ZMQUdfQUxSQUYpOwoKICAgICAgY291bnRlciA9IDBVOwogICAgICAvKiBXYWl0IHRpbGwgUlRDIEFMUkFXRiBmbGFnIGlzIHNldCBhbmQgaWYgVGltZSBvdXQgaXMgcmVhY2hlZCBleGl0ICovCiAgICAgIHdoaWxlKF9fSEFMX1JUQ19BTEFSTV9HRVRfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX0FMUkFXRikgPT0gMFUpCiAgICAgIHsKICAgICAgICBpZihjb3VudGVyKysgPT0gKFN5c3RlbUNvcmVDbG9jayAvNDhVKSkgLyogVGltZW91dCA9IH4gMXMgKi8KICAgICAgICB7CiAgICAgICAgICByZXR1cm4gSEFMX0VSUk9SOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkFMUk1BUiA9ICh1aW50MzJfdCkweDAxVTsKCiAgICAgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gc3RhdGU6IEVuYWJsZSBBbGFybSAqLwogICAgICBfX0hBTF9SVENfQUxBUk1BX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwogICAgICAvKiBDb25maWd1cmUgdGhlIEFsYXJtIGludGVycnVwdCAqLwogICAgICBfX0hBTF9SVENfQUxBUk1fRU5BQkxFX0lUKCZoUlRDX0hhbmRsZSwgUlRDX0lUX0FMUkEpOwoKICAgICAgLyogUlRDIEFsYXJtIEludGVycnVwdCBDb25maWd1cmF0aW9uOiBFWFRJIGNvbmZpZ3VyYXRpb24gKi8KICAgICAgX19IQUxfUlRDX0FMQVJNX0VYVElfRU5BQkxFX0lUKCk7CiAgICAgIF9fSEFMX1JUQ19BTEFSTV9FWFRJX0VOQUJMRV9SSVNJTkdfRURHRSgpOwoKICAgICAgLyogQ2hlY2sgaWYgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgaXMgc2V0ICovCiAgICAgIGlmKChoUlRDX0hhbmRsZS5JbnN0YW5jZS0+SVNSICYgUlRDX0lTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQogICAgICB7CiAgICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBtb2RlICovCiAgICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklTUiA9ICh1aW50MzJfdClSVENfSU5JVF9NQVNLOwogICAgICAgIGNvdW50ZXIgPSAwVTsKICAgICAgICB3aGlsZSgoaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklTUiAmIFJUQ19JU1JfSU5JVEYpID09ICh1aW50MzJfdClSRVNFVCkKICAgICAgICB7CiAgICAgICAgICBpZihjb3VudGVyKysgPT0gKFN5c3RlbUNvcmVDbG9jayAvNDhVKSkgLyogVGltZW91dCA9IH4gMXMgKi8KICAgICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIEhBTF9FUlJPUjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPkRSID0gMFU7CiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5UUiA9IDBVOwoKICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklTUiAmPSAodWludDMyX3QpflJUQ19JU1JfSU5JVDsKCiAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwoKICAgICAgSEFMX05WSUNfU2V0UHJpb3JpdHkoUlRDX0FsYXJtX0lSUW4sIFRpY2tQcmlvcml0eSwgMFUpOwogICAgICBIQUxfTlZJQ19FbmFibGVJUlEoUlRDX0FsYXJtX0lSUW4pOwogICAgICByZXR1cm4gSEFMX09LOwogICAgfQogIH0KICByZXR1cm4gSEFMX0VSUk9SOwp9CgovKioKICAqIEBicmllZiAgU3VzcGVuZCBUaWNrIGluY3JlbWVudC4KICAqIEBub3RlICAgRGlzYWJsZSB0aGUgdGljayBpbmNyZW1lbnQgYnkgZGlzYWJsaW5nIFJUQyBBTEFSTSBpbnRlcnJ1cHQuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIEhBTF9TdXNwZW5kVGljayh2b2lkKQp7CiAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOwogIC8qIERpc2FibGUgUlRDIEFMQVJNIHVwZGF0ZSBJbnRlcnJ1cHQgKi8KICBfX0hBTF9SVENfQUxBUk1fRElTQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsKICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwp9CgovKioKICAqIEBicmllZiAgUmVzdW1lIFRpY2sgaW5jcmVtZW50LgogICogQG5vdGUgICBFbmFibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IEVuYWJsaW5nIFJUQyBBTEFSTSBpbnRlcnJ1cHQuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIEhBTF9SZXN1bWVUaWNrKHZvaWQpCnsKICAvKiBEaXNhYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CiAgLyogRW5hYmxlIFJUQyBBTEFSTSBVcGRhdGUgaW50ZXJydXB0ICovCiAgX19IQUxfUlRDX0FMQVJNX0VOQUJMRV9JVCgmaFJUQ19IYW5kbGUsIFJUQ19JVF9BTFJBKTsKICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwp9CgovKioKICAqIEBicmllZiAgQUxBUk0gQSBFdmVudCBDYWxsYmFjayBpbiBub24gYmxvY2tpbmcgbW9kZQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCAgd2hlbiBSVENfQUxBUk0gaW50ZXJydXB0IHRvb2sgcGxhY2UsIGluc2lkZQogICogUlRDX0FMQVJNX0lSUUhhbmRsZXIoKS4gSXQgbWFrZXMgYSBkaXJlY3QgY2FsbCB0byBIQUxfSW5jVGljaygpIHRvIGluY3JlbWVudAogICogYSBnbG9iYWwgdmFyaWFibGUgInV3VGljayIgdXNlZCBhcyBhcHBsaWNhdGlvbiB0aW1lIGJhc2UuCiAgKiBAcGFyYW0gIGhydGMgOiBSVEMgaGFuZGxlCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIEhBTF9SVENfQWxhcm1BRXZlbnRDYWxsYmFjayhSVENfSGFuZGxlVHlwZURlZiAqaHJ0YykKewogIF9fSU8gdWludDMyX3QgY291bnRlciA9IDBVOwoKICBIQUxfSW5jVGljaygpOwoKICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoaHJ0Yyk7CgogIC8qIFNldCB0aGUgSW5pdGlhbGl6YXRpb24gbW9kZSAqLwogIGhydGMtPkluc3RhbmNlLT5JU1IgPSAodWludDMyX3QpUlRDX0lOSVRfTUFTSzsKCiAgd2hpbGUoKGhydGMtPkluc3RhbmNlLT5JU1IgJiBSVENfSVNSX0lOSVRGKSA9PSAodWludDMyX3QpUkVTRVQpCiAgewogICAgaWYoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLzQ4VSkpIC8qIFRpbWVvdXQgPSB+IDFzICovCiAgICB7CiAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgaHJ0Yy0+SW5zdGFuY2UtPkRSID0gMFU7CiAgaHJ0Yy0+SW5zdGFuY2UtPlRSID0gMFU7CgogIGhydGMtPkluc3RhbmNlLT5JU1IgJj0gKHVpbnQzMl90KX5SVENfSVNSX0lOSVQ7CgogIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRU5BQkxFKGhydGMpOwp9CgovKioKICAqIEBicmllZiAgVGhpcyBmdW5jdGlvbiBoYW5kbGVzIFJUQyBBTEFSTSBpbnRlcnJ1cHQgcmVxdWVzdC4KICAqIEByZXR2YWwgTm9uZQogICovCnZvaWQgUlRDX0FsYXJtX0lSUUhhbmRsZXIodm9pZCkKewogIEhBTF9SVENfQWxhcm1JUlFIYW5kbGVyKCZoUlRDX0hhbmRsZSk7Cn0KCi8qKgogICogQH0KICAqLwoKLyoqCiAgKiBAfQogICovCgovKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwo=