LyoqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAZmlsZSAgICBzdG0zMmcweHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybV90ZW1wbGF0ZS5jCiAgKiBAYXV0aG9yICBNQ0QgQXBwbGljYXRpb24gVGVhbQogICogQGJyaWVmICAgSEFMIHRpbWUgYmFzZSBiYXNlZCBvbiB0aGUgaGFyZHdhcmUgUlRDX0FMQVJNIFRlbXBsYXRlLgogICoKICAqICAgICAgICAgIFRoaXMgZmlsZSBvdmVycmlkZSB0aGUgbmF0aXZlIEhBTCB0aW1lIGJhc2UgZnVuY3Rpb25zIChkZWZpbmVkIGFzIHdlYWspCiAgKiAgICAgICAgICB0byB1c2UgdGhlIFJUQyBBTEFSTSBmb3IgdGltZSBiYXNlIGdlbmVyYXRpb246CiAgKiAgICAgICAgICAgKyBJbnRpYWxpemVzIHRoZSBSVEMgcGVyaXBoZXJhbCB0byBpbmNyZW1lbnQgdGhlIHNlY29uZHMgcmVnaXN0ZXJzIGVhY2ggMW1zCiAgKiAgICAgICAgICAgKyBUaGUgYWxhcm0gaXMgY29uZmlndXJlZCB0byBhc3NlcnQgYW4gaW50ZXJydXB0IHdoZW4gdGhlIFJUQyByZWFjaGVzIDFtcwogICogICAgICAgICAgICsgSEFMX0luY1RpY2sgaXMgY2FsbGVkIGF0IGVhY2ggQWxhcm0gZXZlbnQgYW5kIHRoZSB0aW1lIGlzIHJlc2V0IHRvIDAwOjAwOjAwCiAgKiAgICAgICAgICAgKyBIU0UgKGRlZmF1bHQpLCBMU0Ugb3IgTFNJIGNhbiBiZSBzZWxlY3RlZCBhcyBSVEMgY2xvY2sgc291cmNlCiBAdmVyYmF0aW0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIwogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAgWy4uXQogICAgVGhpcyBmaWxlIG11c3QgYmUgY29waWVkIHRvIHRoZSBhcHBsaWNhdGlvbiBmb2xkZXIgYW5kIG1vZGlmaWVkIGFzIGZvbGxvd3M6CiAgICAoIykgUmVuYW1lIGl0IHRvICdzdG0zMmcweHhfaGFsX3RpbWViYXNlX3J0Y19hbGFybS5jJwogICAgKCMpIEFkZCB0aGlzIGZpbGUgYW5kIHRoZSBSVEMgSEFMIGRyaXZlcnMgdG8geW91ciBwcm9qZWN0IGFuZCB1bmNvbW1lbnQKICAgICAgIEhBTF9SVENfTU9EVUxFX0VOQUJMRUQgZGVmaW5lIGluIHN0bTMyZzB4eF9oYWxfY29uZi5oCgogICAgWy4uXQogICAgKEApIEhBTCBSVEMgYWxhcm0gYW5kIEhBTCBSVEMgd2FrZXVwIGRyaXZlcnMgY2FuknQgYmUgdXNlZCB3aXRoIGxvdyBwb3dlciBtb2RlczoKICAgICAgICBUaGUgd2FrZSB1cCBjYXBhYmlsaXR5IG9mIHRoZSBSVEMgbWF5IGJlIGludHJ1c2l2ZSBpbiBjYXNlIG9mIHByaW9yIGxvdyBwb3dlciBtb2RlCiAgICAgICAgY29uZmlndXJhdGlvbiByZXF1aXJpbmcgZGlmZmVyZW50IHdha2UgdXAgc291cmNlcy4KICAgICAgICBBcHBsaWNhdGlvbi9FeGFtcGxlIGJlaGF2aW9yIGlzIG5vIG1vcmUgZ3VhcmFudGVlZAogICAgKEApIFRoZSBzdG0zMmcweHhfaGFsX3RpbWViYXNlX3RpbSB1c2UgaXMgcmVjb21tZW5kZWQgZm9yIHRoZSBBcHBsaWNhdGlvbnMvRXhhbXBsZXMKICAgICAgICAgIHJlcXVpcmluZyBsb3cgcG93ZXIgbW9kZXMKCiAgQGVuZHZlcmJhdGltCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBAYXR0ZW50aW9uCiAgKgogICogPGgyPjxjZW50ZXI+JmNvcHk7IENvcHlyaWdodCAoYykgMjAxOCBTVE1pY3JvZWxlY3Ryb25pY3MuIAogICogQWxsIHJpZ2h0cyByZXNlcnZlZC48L2NlbnRlcj48L2gyPgogICoKICAqIFRoaXMgc29mdHdhcmUgY29tcG9uZW50IGlzIGxpY2Vuc2VkIGJ5IFNUIHVuZGVyIEJTRCAzLUNsYXVzZSBsaWNlbnNlLAogICogdGhlICJMaWNlbnNlIjsgWW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSAKICAqIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKICAqICAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvQlNELTMtQ2xhdXNlCiAgKgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCgovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwojaW5jbHVkZSAic3RtMzJnMHh4X2hhbC5oIgovKiogQGFkZHRvZ3JvdXAgU1RNMzJHMHh4X0hBTF9Ecml2ZXIKICAqIEB7CiAgKi8KCi8qKiBAZGVmZ3JvdXAgSEFMX1RpbWVCYXNlX1JUQ19BbGFybV9UZW1wbGF0ZSAgSEFMIFRpbWVCYXNlIFJUQyBBbGFybSBUZW1wbGF0ZQogICogQHsKICAqLwoKLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCi8qIFVuY29tbWVudCB0aGUgbGluZSBiZWxvdyB0byBzZWxlY3QgdGhlIGFwcHJvcHJpYXRlIFJUQyBDbG9jayBzb3VyY2UgZm9yIHlvdXIgYXBwbGljYXRpb246CiAgKyBSVENfQ0xPQ0tfU09VUkNFX0hTRTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgcmVxdWlyaW5nIHRpbWluZyBwcmVjaXNpb24uCiAgKyBSVENfQ0xPQ0tfU09VUkNFX0xTRTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsb3cgY29uc3RyYWludCBvbiB0aW1pbmcKICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24uCiAgKyBSVENfQ0xPQ0tfU09VUkNFX0xTSTogY2FuIGJlIHNlbGVjdGVkIGZvciBhcHBsaWNhdGlvbnMgd2l0aCBsb3cgY29uc3RyYWludCBvbiB0aW1pbmcKICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVjaXNpb24uCiAgKi8KI2RlZmluZSBSVENfQ0xPQ0tfU09VUkNFX0hTRQovKiAjZGVmaW5lIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovCi8qICNkZWZpbmUgUlRDX0NMT0NLX1NPVVJDRV9MU0kgKi8KCiNpZmRlZiBSVENfQ0xPQ0tfU09VUkNFX0hTRQojZGVmaW5lIFJUQ19BU1lOQ0hfUFJFRElWICAgICAgIDQ5VQojZGVmaW5lIFJUQ19TWU5DSF9QUkVESVYgICAgICAgIDRVCiNlbHNlIC8qIFJUQ19DTE9DS19TT1VSQ0VfTFNFIHx8IFJUQ19DTE9DS19TT1VSQ0VfTFNJICovCiNkZWZpbmUgUlRDX0FTWU5DSF9QUkVESVYgICAgICAgMFUKI2RlZmluZSBSVENfU1lOQ0hfUFJFRElWICAgICAgICAzMVUKI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfSFNFICovCgovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpleHRlcm4gUlRDX0hhbmRsZVR5cGVEZWYgaFJUQ19IYW5kbGU7ClJUQ19IYW5kbGVUeXBlRGVmIGhSVENfSGFuZGxlOwoKLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kdm9pZCBSVENfVEFNUF9JUlFIYW5kbGVyKHZvaWQpOwovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKLyoqCiAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgUlRDX0FMQVJNQSBhcyBhIHRpbWUgYmFzZSBzb3VyY2UuCiAgKiAgICAgICAgIFRoZSB0aW1lIHNvdXJjZSBpcyBjb25maWd1cmVkICB0byBoYXZlIDFtcyB0aW1lIGJhc2Ugd2l0aCBhIGRlZGljYXRlZAogICogICAgICAgICBUaWNrIGludGVycnVwdCBwcmlvcml0eS4KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIGF1dG9tYXRpY2FsbHkgYXQgdGhlIGJlZ2lubmluZyBvZiBwcm9ncmFtIGFmdGVyCiAgKiAgICAgICAgIHJlc2V0IGJ5IEhBTF9Jbml0KCkgb3IgYXQgYW55IHRpbWUgd2hlbiBjbG9jayBpcyBjb25maWd1cmVkLCBieSBIQUxfUkNDX0Nsb2NrQ29uZmlnKCkuCiAgKiBAcGFyYW0gIFRpY2tQcmlvcml0eTogVGljayBpbnRlcnJ1cHQgcHJpb3JpdHkuCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMKICAqLwpIQUxfU3RhdHVzVHlwZURlZiBIQUxfSW5pdFRpY2sodWludDMyX3QgVGlja1ByaW9yaXR5KQp7CiAgX19JTyB1aW50MzJfdCBjb3VudGVyID0gMFU7CgogIFJDQ19Pc2NJbml0VHlwZURlZiAgICAgICAgUkNDX09zY0luaXRTdHJ1Y3Q7CiAgUkNDX1BlcmlwaENMS0luaXRUeXBlRGVmICBQZXJpcGhDbGtJbml0U3RydWN0OwoKI2lmZGVmIFJUQ19DTE9DS19TT1VSQ0VfTFNFCiAgLyogQ29uZmlndWUgTFNFIGFzIFJUQyBjbG9jayBzb3VjcmUgKi8KICBSQ0NfT3NjSW5pdFN0cnVjdC5Pc2NpbGxhdG9yVHlwZSA9IFJDQ19PU0NJTExBVE9SVFlQRV9MU0U7CiAgUkNDX09zY0luaXRTdHJ1Y3QuUExMLlBMTFN0YXRlID0gUkNDX1BMTF9OT05FOwogIFJDQ19Pc2NJbml0U3RydWN0LkxTRVN0YXRlID0gUkNDX0xTRV9PTjsKICBQZXJpcGhDbGtJbml0U3RydWN0LlJUQ0Nsb2NrU2VsZWN0aW9uID0gUkNDX1JUQ0NMS1NPVVJDRV9MU0U7CiNlbGlmIGRlZmluZWQgKFJUQ19DTE9DS19TT1VSQ0VfTFNJKQogIC8qIENvbmZpZ3VlIExTSSBhcyBSVEMgY2xvY2sgc291Y3JlICovCiAgUkNDX09zY0luaXRTdHJ1Y3QuT3NjaWxsYXRvclR5cGUgPSBSQ0NfT1NDSUxMQVRPUlRZUEVfTFNJOwogIFJDQ19Pc2NJbml0U3RydWN0LlBMTC5QTExTdGF0ZSA9IFJDQ19QTExfTk9ORTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5MU0lTdGF0ZSA9IFJDQ19MU0lfT047CiAgUGVyaXBoQ2xrSW5pdFN0cnVjdC5SVENDbG9ja1NlbGVjdGlvbiA9IFJDQ19SVENDTEtTT1VSQ0VfTFNJOwojZWxpZiBkZWZpbmVkIChSVENfQ0xPQ0tfU09VUkNFX0hTRSkKICAvKiBDb25maWd1ZSBIU0UgYXMgUlRDIGNsb2NrIHNvdWNyZSAqLwogIFJDQ19Pc2NJbml0U3RydWN0Lk9zY2lsbGF0b3JUeXBlID0gUkNDX09TQ0lMTEFUT1JUWVBFX0hTRTsKICBSQ0NfT3NjSW5pdFN0cnVjdC5QTEwuUExMU3RhdGUgPSBSQ0NfUExMX05PTkU7CiAgUkNDX09zY0luaXRTdHJ1Y3QuSFNFU3RhdGUgPSBSQ0NfSFNFX09OOwogIFBlcmlwaENsa0luaXRTdHJ1Y3QuUlRDQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUlRDQ0xLU09VUkNFX0hTRV9ESVYzMjsKI2Vsc2UKI2Vycm9yIFBsZWFzZSBzZWxlY3QgdGhlIFJUQyBDbG9jayBzb3VyY2UKI2VuZGlmIC8qIFJUQ19DTE9DS19TT1VSQ0VfTFNFICovCgogIGlmKEhBTF9SQ0NfT3NjQ29uZmlnKCZSQ0NfT3NjSW5pdFN0cnVjdCkgPT0gSEFMX09LKQogIHsKICAgIFBlcmlwaENsa0luaXRTdHJ1Y3QuUGVyaXBoQ2xvY2tTZWxlY3Rpb24gPSBSQ0NfUEVSSVBIQ0xLX1JUQzsKICAgIGlmKEhBTF9SQ0NFeF9QZXJpcGhDTEtDb25maWcoJlBlcmlwaENsa0luaXRTdHJ1Y3QpID09IEhBTF9PSykKICAgIHsKICAgICAgLyogRW5hYmxlIFJUQyBDbG9jayAqLwogICAgICBfX0hBTF9SQ0NfUlRDX0VOQUJMRSgpOwogICAgICBfX0hBTF9SQ0NfUlRDQVBCX0NMS19FTkFCTEUoKTsKCiAgICAgIC8qIFRoZSB0aW1lIGJhc2Ugc2hvdWxkIGJlIDFtcwogICAgICAgICBUaW1lIGJhc2UgPSAoKFJUQ19BU1lOQ0hfUFJFRElWICsgMSkgKiAoUlRDX1NZTkNIX1BSRURJViArIDEpKSAvIFJUQ19DTE9DSwogICAgICAgICBIU0UgYXMgUlRDIGNsb2NrCiAgICAgICAgICAgVGltZSBiYXNlID0gKCg0OSArIDEpICogKDQgKyAxKSkgLyAyNTBrSHoKICAgICAgICAgICAgICAgICAgICAgPSAxbXMKICAgICAgICAgTFNFIGFzIFJUQyBjbG9jawogICAgICAgICAgIFRpbWUgYmFzZSA9ICgoMzEgKyAxKSAqICgwICsgMSkpIC8gMzIuNzY4S0h6CiAgICAgICAgICAgICAgICAgICAgID0gfjFtcwogICAgICAgICBMU0kgYXMgUlRDIGNsb2NrCiAgICAgICAgICAgVGltZSBiYXNlID0gKCgzMSArIDEpICogKDAgKyAxKSkgLyAzMktIegogICAgICAgICAgICAgICAgICAgICA9IDFtcwogICAgICAqLwogICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZSA9IFJUQzsKICAgICAgaFJUQ19IYW5kbGUuSW5pdC5Ib3VyRm9ybWF0ID0gUlRDX0hPVVJGT1JNQVRfMjQ7CiAgICAgIGhSVENfSGFuZGxlLkluaXQuQXN5bmNoUHJlZGl2ID0gUlRDX0FTWU5DSF9QUkVESVY7CiAgICAgIGhSVENfSGFuZGxlLkluaXQuU3luY2hQcmVkaXYgPSBSVENfU1lOQ0hfUFJFRElWOwogICAgICBoUlRDX0hhbmRsZS5Jbml0Lk91dFB1dCA9IFJUQ19PVVRQVVRfRElTQUJMRTsKICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRQb2xhcml0eSA9IFJUQ19PVVRQVVRfUE9MQVJJVFlfSElHSDsKICAgICAgaFJUQ19IYW5kbGUuSW5pdC5PdXRQdXRUeXBlID0gUlRDX09VVFBVVF9UWVBFX09QRU5EUkFJTjsKICAgICAgaWYgKEhBTF9SVENfSW5pdCgmaFJUQ19IYW5kbGUpICE9IEhBTF9PSykKICAgICAgewogICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgIH0KCiAgICAgIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICAgICAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKCZoUlRDX0hhbmRsZSk7CgogICAgICAvKiBEaXNhYmxlIHRoZSBBbGFybSBBIGludGVycnVwdCAqLwogICAgICBfX0hBTF9SVENfQUxBUk1BX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKCiAgICAgIC8qIENsZWFyIGZsYWcgYWxhcm0gQSAqLwogICAgICBfX0hBTF9SVENfQUxBUk1fQ0xFQVJfRkxBRygmaFJUQ19IYW5kbGUsIFJUQ19GTEFHX0FMUkFGKTsKCiAgICAgIGNvdW50ZXIgPSAwVTsKICAgICAgLyogV2FpdCB0aWxsIFJUQyBBTFJBV0YgZmxhZyBpcyBzZXQgYW5kIGlmIFRpbWUgb3V0IGlzIHJlYWNoZWQgZXhpdCAqLwogICAgICB3aGlsZShfX0hBTF9SVENfQUxBUk1fR0VUX0ZMQUcoJmhSVENfSGFuZGxlLCBSVENfRkxBR19BTFJBV0YpID09IDBVKQogICAgICB7CiAgICAgICAgaWYoY291bnRlcisrID09IChTeXN0ZW1Db3JlQ2xvY2sgLyA1NlUpKSAvKiBUaW1lb3V0ID0gfiAxcyAqLwogICAgICAgIHsKICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgfQogICAgICB9CgogICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+QUxSTUFSID0gKHVpbnQzMl90KTB4MDFVOwoKICAgICAgLyogQ29uZmlndXJlIHRoZSBBbGFybSBzdGF0ZTogRW5hYmxlIEFsYXJtICovCiAgICAgIF9fSEFMX1JUQ19BTEFSTUFfRU5BQkxFKCZoUlRDX0hhbmRsZSk7CiAgICAgIC8qIENvbmZpZ3VyZSB0aGUgQWxhcm0gaW50ZXJydXB0ICovCiAgICAgIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7CgogICAgICAvKiBSVEMgQWxhcm0gSW50ZXJydXB0IENvbmZpZ3VyYXRpb246IEVYVEkgY29uZmlndXJhdGlvbiAqLwogICAgICBfX0hBTF9SVENfQUxBUk1fRVhUSV9FTkFCTEVfSVQoKTsKCiAgICAgIC8qIENoZWNrIGlmIHRoZSBJbml0aWFsaXphdGlvbiBtb2RlIGlzIHNldCAqLwogICAgICBpZigoaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklDU1IgJiBSVENfSUNTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQogICAgICB7CiAgICAgICAgLyogU2V0IHRoZSBJbml0aWFsaXphdGlvbiBtb2RlICovCiAgICAgICAgaFJUQ19IYW5kbGUuSW5zdGFuY2UtPklDU1IgPSAodWludDMyX3QpUlRDX0lOSVRfTUFTSzsKICAgICAgICBjb3VudGVyID0gMFU7CiAgICAgICAgd2hpbGUoKGhSVENfSGFuZGxlLkluc3RhbmNlLT5JQ1NSICYgUlRDX0lDU1JfSU5JVEYpID09ICh1aW50MzJfdClSRVNFVCkKICAgICAgICB7CiAgICAgICAgICBpZihjb3VudGVyKysgPT0gKFN5c3RlbUNvcmVDbG9jayAvIDU2VSkpIC8qIFRpbWVvdXQgPSB+IDFzICovCiAgICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBIQUxfRVJST1I7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5EUiA9IDBVOwogICAgICBoUlRDX0hhbmRsZS5JbnN0YW5jZS0+VFIgPSAwVTsKCiAgICAgIGhSVENfSGFuZGxlLkluc3RhbmNlLT5JQ1NSICY9ICh1aW50MzJfdCl+UlRDX0lDU1JfSU5JVDsKCiAgICAgIC8qIEVuYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogICAgICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRSgmaFJUQ19IYW5kbGUpOwoKICAgICAgSEFMX05WSUNfU2V0UHJpb3JpdHkoUlRDX1RBTVBfSVJRbiwgVGlja1ByaW9yaXR5LCAwVSk7CiAgICAgIEhBTF9OVklDX0VuYWJsZUlSUShSVENfVEFNUF9JUlFuKTsKICAgICAgcmV0dXJuIEhBTF9PSzsKICAgIH0KICB9CiAgcmV0dXJuIEhBTF9FUlJPUjsKfQoKLyoqCiAgKiBAYnJpZWYgIFN1c3BlbmQgVGljayBpbmNyZW1lbnQuCiAgKiBAbm90ZSAgIERpc2FibGUgdGhlIHRpY2sgaW5jcmVtZW50IGJ5IGRpc2FibGluZyBSVEMgQUxBUk0gaW50ZXJydXB0LgogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfU3VzcGVuZFRpY2sodm9pZCkKewogIC8qIERpc2FibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0RJU0FCTEUoJmhSVENfSGFuZGxlKTsKICAvKiBEaXNhYmxlIFJUQyBBTEFSTSB1cGRhdGUgSW50ZXJydXB0ICovCiAgX19IQUxfUlRDX0FMQVJNX0RJU0FCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7CiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKfQoKLyoqCiAgKiBAYnJpZWYgIFJlc3VtZSBUaWNrIGluY3JlbWVudC4KICAqIEBub3RlICAgRW5hYmxlIHRoZSB0aWNrIGluY3JlbWVudCBieSBFbmFibGluZyBSVEMgQUxBUk0gaW50ZXJydXB0LgogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfUmVzdW1lVGljayh2b2lkKQp7CiAgLyogRGlzYWJsZSB0aGUgd3JpdGUgcHJvdGVjdGlvbiBmb3IgUlRDIHJlZ2lzdGVycyAqLwogIF9fSEFMX1JUQ19XUklURVBST1RFQ1RJT05fRElTQUJMRSgmaFJUQ19IYW5kbGUpOwogIC8qIEVuYWJsZSBSVEMgQUxBUk0gVXBkYXRlIGludGVycnVwdCAqLwogIF9fSEFMX1JUQ19BTEFSTV9FTkFCTEVfSVQoJmhSVENfSGFuZGxlLCBSVENfSVRfQUxSQSk7CiAgLyogRW5hYmxlIHRoZSB3cml0ZSBwcm90ZWN0aW9uIGZvciBSVEMgcmVnaXN0ZXJzICovCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9FTkFCTEUoJmhSVENfSGFuZGxlKTsKfQoKLyoqCiAgKiBAYnJpZWYgIEFMQVJNIEEgRXZlbnQgQ2FsbGJhY2sgaW4gbm9uIGJsb2NraW5nIG1vZGUKICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgIHdoZW4gUlRDX0FMQVJNIGludGVycnVwdCB0b29rIHBsYWNlLCBpbnNpZGUKICAqIFJUQ19BTEFSTV9JUlFIYW5kbGVyKCkuIEl0IG1ha2VzIGEgZGlyZWN0IGNhbGwgdG8gSEFMX0luY1RpY2soKSB0byBpbmNyZW1lbnQKICAqIGEgZ2xvYmFsIHZhcmlhYmxlICJ1d1RpY2siIHVzZWQgYXMgYXBwbGljYXRpb24gdGltZSBiYXNlLgogICogQHBhcmFtICBocnRjIDogUlRDIGhhbmRsZQogICogQHJldHZhbCBOb25lCiAgKi8Kdm9pZCBIQUxfUlRDX0FsYXJtQUV2ZW50Q2FsbGJhY2soUlRDX0hhbmRsZVR5cGVEZWYgKmhydGMpCnsKICBfX0lPIHVpbnQzMl90IGNvdW50ZXIgPSAwVTsKCiAgSEFMX0luY1RpY2soKTsKCiAgX19IQUxfUlRDX1dSSVRFUFJPVEVDVElPTl9ESVNBQkxFKGhydGMpOwoKICAvKiBTZXQgdGhlIEluaXRpYWxpemF0aW9uIG1vZGUgKi8KICBocnRjLT5JbnN0YW5jZS0+SUNTUiA9ICh1aW50MzJfdClSVENfSU5JVF9NQVNLOwoKICB3aGlsZSgoaHJ0Yy0+SW5zdGFuY2UtPklDU1IgJiBSVENfSUNTUl9JTklURikgPT0gKHVpbnQzMl90KVJFU0VUKQogIHsKICAgIGlmKGNvdW50ZXIrKyA9PSAoU3lzdGVtQ29yZUNsb2NrIC8gNTZVKSkgLyogVGltZW91dCA9IH4gMXMgKi8KICAgIHsKICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICBocnRjLT5JbnN0YW5jZS0+RFIgPSAwVTsKICBocnRjLT5JbnN0YW5jZS0+VFIgPSAwVTsKCiAgaHJ0Yy0+SW5zdGFuY2UtPklDU1IgJj0gKHVpbnQzMl90KX5SVENfSUNTUl9JTklUOwoKICAvKiBFbmFibGUgdGhlIHdyaXRlIHByb3RlY3Rpb24gZm9yIFJUQyByZWdpc3RlcnMgKi8KICBfX0hBTF9SVENfV1JJVEVQUk9URUNUSU9OX0VOQUJMRShocnRjKTsKfQoKLyoqCiAgKiBAYnJpZWYgIFRoaXMgZnVuY3Rpb24gaGFuZGxlcyBSVEMgQUxBUk0gaW50ZXJydXB0IHJlcXVlc3QuCiAgKiBAcmV0dmFsIE5vbmUKICAqLwp2b2lkIFJUQ19UQU1QX0lSUUhhbmRsZXIodm9pZCkKewogIEhBTF9SVENfQWxhcm1JUlFIYW5kbGVyKCZoUlRDX0hhbmRsZSk7Cn0KCi8qKgogICogQH0KICAqLwoKLyoqCiAgKiBAfQogICovCgovKioqKioqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLwo=