Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1v8WCt-0022wQ-Tp for pgsql-hackers@arkaria.postgresql.org; Tue, 14 Oct 2025 04:00:16 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1v8WCq-00A5aD-0F for pgsql-hackers@arkaria.postgresql.org; Tue, 14 Oct 2025 04:00:12 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1v8WCp-00A5a5-IP for pgsql-hackers@lists.postgresql.org; Tue, 14 Oct 2025 04:00:12 +0000 Received: from mail-wm1-x334.google.com ([2a00:1450:4864:20::334]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1v8WCn-00236C-1P for pgsql-hackers@postgresql.org; Tue, 14 Oct 2025 04:00:11 +0000 Received: by mail-wm1-x334.google.com with SMTP id 5b1f17b1804b1-46e326e4e99so27805355e9.1 for ; Mon, 13 Oct 2025 21:00:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760414403; x=1761019203; darn=postgresql.org; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:from:to:cc:subject:date :message-id:reply-to; bh=/uUKqRsG8vRJPIYRvcsow/U5uckd0Se1b7oGBz4r1FI=; b=GtAAY3iFanWx5elB3CI4DO982Ro0Hi/JIBMhMT3vk/r2+m9WD/noaU4U2ddp50aEr2 jpubsb7/qUAWK5a2T8oZ3Nt/u7pBS+JVivnqsnM99g3RtbVIUXa8X9wl7UefiMlFpEzB 3Y4JvBausAgAM2HZ+uUe5y2JjBXqLsDCaUCCjgmi/6GQptEOtMcSoxT+cWLTA0KR3PL4 SbagXRpVheQyVCM8sHyy0o1QgM0NE/fr4DYTwWoAM2QtKP7NPhrALakOtl7ldQp/3ASN ghGhNg+TSvRzcvVEpOceoU4kH7ixpmO6MTuiVqYGQF8zaunXv74fyDEE/dXPGzoCUU96 tEgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760414403; x=1761019203; h=in-reply-to:from:content-language:references:cc:to:subject :user-agent:mime-version:date:message-id:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=/uUKqRsG8vRJPIYRvcsow/U5uckd0Se1b7oGBz4r1FI=; b=o4rvN/4zL05XEDtD5LcD0JIKvpgaebKKKv1RmNkD1mUsrL7YtcXOt3T60w6jHrXYgw ZDTU9yLEI3CWO24eEPMlkBSRH69e6u8tzZPpX2QcKMdGhkFC5zLI0+XzITW+deAW1cph lG0zjqRtB02sgL4grvrQfN/G66ywLLQihHJbhhoK8ZAA5SsdHfzsQ+kvBd5jp1BRNLQH vMPNAwNSr7IOX0DMQWSOE0SIzUhy23nK8ITs402pqQl04N2sINjc3DEjnmVrO1RR0QI3 NSjkBuiL2YphiSpTfSHvVfy46z7boZzRziK/pPuN2kA+Vy1Dop97nTwvmy7CGQi7P1Cc beNA== X-Forwarded-Encrypted: i=1; AJvYcCXR+EUoU5zJ/ZANrh/TlNW/LJ1xry/OiQCbuUcJtMvwvJh0G6hTBwegbbcLepsc1bOENSbffCZ6s3xEsynl@postgresql.org X-Gm-Message-State: AOJu0YwRFut4Di5lB7acpLjn/LSAuH7/lxnBaYhPNm8pawe3LFzC4Big 6UzTuQ2xopjYiOKZRLO4ro1VTr8vR5UnowvB/lHP9RqA4ZjnYNC3nmfr X-Gm-Gg: ASbGncv/Q+PhnIMXDPK9htNxl+SRQbsRBit/VRogb7ZQLljLfjpT2QWH38vjn4Egk9W EI69Wg6CmPhfMiUVIhnempDS6DQfskcab1XxwgdFFWb0fD8mY1KbmBBwz0BFZWsuK5wf6wgdVIs ZI56EmHCRqqJj5OmEGrwzRBMHBZ76u9p8CtbCRmzbISPktt34kkEQ299btpDSALXJ1b+tVSto2L NXRvaRPYs/m1bn2DbN0XtRY5A7P4RWzZrp8vlhZh7lfXkU4QxTwXbl6se2iB5zACkez8W76LXNu rOqxQ0UpShpuw2h/bxQPs7ugotTOJdpDlulbLe+jRfoWzca60wbc13e8wLobhKx6e6xaZBXLaCx 2DDtGHOXYMvm4no60wpxC5Xt7ZCzytF2lA7Ln/fNqz7siZDbdKKR9nL4= X-Google-Smtp-Source: AGHT+IEna/QraoHNVEwhDEURlBPTJ2bitLzibP8gefA9xrx/L9M5CG1ZdsqUA6y64IuarVxYjMW6ow== X-Received: by 2002:a5d:5f83:0:b0:426:dac0:8ee8 with SMTP id ffacd0b85a97d-426dac08fd1mr7196357f8f.10.1760414402874; Mon, 13 Oct 2025 21:00:02 -0700 (PDT) Received: from [192.168.0.50] ([89.149.120.198]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-426ce5e8b31sm21485262f8f.54.2025.10.13.21.00.00 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 13 Oct 2025 21:00:01 -0700 (PDT) Content-Type: multipart/mixed; boundary="------------4aRSnycNgAxKLMaGM9RUerb7" Message-ID: Date: Tue, 14 Oct 2025 07:00:00 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: IO in wrong state on riscv64 To: Thomas Munro Cc: Andres Freund , pgsql-hackers , greg@burd.me References: <60bbebf4-0a80-4e5f-83c0-311c85f6bd5c@gmail.com> Content-Language: en-US From: Alexander Lakhin In-Reply-To: List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------4aRSnycNgAxKLMaGM9RUerb7 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hello Thomas, 13.10.2025 08:40, Thomas Munro wrote: > Thanks. All seems to have something plausible in the right places, > but I know nothing about RISC-V... hmm, what happens if you replace > pg_{read,write}_barrier() with pg_memory_barrier(), in those three > functions? And if it happens to help, perhaps you could try to figure > out which one(s) help? Not that it should be necessary but as a clue > or to rule out this line of enquiry... I guess that should generate > FENCE RW,RW, meaning wait for all preceding reads and writes to > complete and don't let any following reads or writes begin, but that's > just from googling... The replacements doesn't work for me, unfortunately: I have 3 out of 30 027_stream_regress test runs failed: 2025-10-13 21:27:26.161 UTC [4181290:5] pg_regress/brin ERROR:  IO in wrong state: 0 2025-10-13 21:27:26.161 UTC [4181290:6] pg_regress/brin STATEMENT: CREATE TABLE brintest (byteacol bytea, Disassembly of those three functions is attached. I'll try to find some simple C programs to test memory barriers outside of postgres... Best regards, Alexander --------------4aRSnycNgAxKLMaGM9RUerb7 Content-Type: text/plain; charset=UTF-8; name="pgaio_io_reclaim.asm" Content-Disposition: attachment; filename="pgaio_io_reclaim.asm" Content-Transfer-Encoding: base64 R05VIGdkYiAoRGViaWFuIDE1LjItMSkgMTUuMgpDb3B5cmlnaHQgKEMpIDIwMjQgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkxpY2Vuc2UgR1BMdjMrOiBHTlUgR1BMIHZlcnNp b24gMyBvciBsYXRlciA8aHR0cDovL2dudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWw+ClRoaXMg aXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmli dXRlIGl0LgpUaGVyZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQg YnkgbGF3LgpUeXBlICJzaG93IGNvcHlpbmciIGFuZCAic2hvdyB3YXJyYW50eSIgZm9yIGRl dGFpbHMuClRoaXMgR0RCIHdhcyBjb25maWd1cmVkIGFzICJyaXNjdjY0LWxpbnV4LWdudSIu ClR5cGUgInNob3cgY29uZmlndXJhdGlvbiIgZm9yIGNvbmZpZ3VyYXRpb24gZGV0YWlscy4K Rm9yIGJ1ZyByZXBvcnRpbmcgaW5zdHJ1Y3Rpb25zLCBwbGVhc2Ugc2VlOgo8aHR0cHM6Ly93 d3cuZ251Lm9yZy9zb2Z0d2FyZS9nZGIvYnVncy8+LgpGaW5kIHRoZSBHREIgbWFudWFsIGFu ZCBvdGhlciBkb2N1bWVudGF0aW9uIHJlc291cmNlcyBvbmxpbmUgYXQ6CiAgICA8aHR0cDov L3d3dy5nbnUub3JnL3NvZnR3YXJlL2dkYi9kb2N1bWVudGF0aW9uLz4uCgpGb3IgaGVscCwg dHlwZSAiaGVscCIuClR5cGUgImFwcm9wb3Mgd29yZCIgdG8gc2VhcmNoIGZvciBjb21tYW5k cyByZWxhdGVkIHRvICJ3b3JkIi4uLgpSZWFkaW5nIHN5bWJvbHMgZnJvbSB0bXBfaW5zdGFs bC91c3IvbG9jYWwvcGdzcWwvYmluL3Bvc3RncmVzLi4uCihnZGIpIER1bXAgb2YgYXNzZW1i bGVyIGNvZGUgZm9yIGZ1bmN0aW9uIHBnYWlvX2lvX3JlY2xhaW06CjM0MQkJQXNzZXJ0KGlv aCA+PSBwZ2Fpb19jdGwtPmlvX2hhbmRsZXMgJiYKICAgMHgwMDAwMDAwMDAwNDM2NmQwIDwr MTYyPjoJYXVpcGMJYTAsMHg0YzMKICAgMHgwMDAwMDAwMDAwNDM2NmQ0IDwrMTY2PjoJbGQJ YTEsLTExOTIoYTApICMgMHg4ZjkyMjggPHBnYWlvX2N0bD4KICAgMHgwMDAwMDAwMDAwNDM2 NmQ4IDwrMTcwPjoJbGQJYTAsNDgoYTEpCiAgIDB4MDAwMDAwMDAwMDQzNjZkYSA8KzE3Mj46 CWJsdHUJczAsYTAsMHg0MzY4ODYgPHBnYWlvX2lvX3JlY2xhaW0rNjAwPgogICAweDAwMDAw MDAwMDA0MzY2ZGUgPCsxNzY+Oglsd3UJYTEsNDAoYTEpCiAgIDB4MDAwMDAwMDAwMDQzNjZl MiA8KzE4MD46CWxpCWEyLDE0NAogICAweDAwMDAwMDAwMDA0MzY2ZTYgPCsxODQ+OgltdWwJ YTEsYTEsYTIKICAgMHgwMDAwMDAwMDAwNDM2NmVhIDwrMTg4PjoJYWRkCWExLGExLGEwCiAg IDB4MDAwMDAwMDAwMDQzNjZlYyA8KzE5MD46CWJnZXUJczAsYTEsMHg0MzY4ODYgPHBnYWlv X2lvX3JlY2xhaW0rNjAwPgogICAweDAwMDAwMDAwMDA0MzY2ZjAgPCsxOTQ+OglhdWlwYwlh MSwweDRjMQogICAweDAwMDAwMDAwMDA0MzY2ZjQgPCsxOTg+OglsZAlzNCwtMjk2KGExKSAj IDB4OGY3NWM4CiAgIDB4MDAwMDAwMDAwMDQzNjg4NiA8KzYwMD46CWF1aXBjCWEwLDB4MjQy CiAgIDB4MDAwMDAwMDAwMDQzNjg4YSA8KzYwND46CWFkZGkJYTAsYTAsLTI3MSAjIDB4Njc4 Nzc3CiAgIDB4MDAwMDAwMDAwMDQzNjg4ZSA8KzYwOD46CWF1aXBjCWExLDB4MjQyCiAgIDB4 MDAwMDAwMDAwMDQzNjg5MiA8KzYxMj46CWFkZGkJYTEsYTEsLTY1NyAjIDB4Njc4NWZkCiAg IDB4MDAwMDAwMDAwMDQzNjg5NiA8KzYxNj46CWxpCWEyLDM0MgogICAweDAwMDAwMDAwMDA0 MzY4OWEgPCs2MjA+OglhdWlwYwlyYSwweDE2MAogICAweDAwMDAwMDAwMDA0MzY4OWUgPCs2 MjQ+OglqYWxyCTE3NChyYSkgIyAweDU5Njk0OCA8RXhjZXB0aW9uYWxDb25kaXRpb24+Cgoz NDIJCQkgICBpb2ggPCAocGdhaW9fY3RsLT5pb19oYW5kbGVzICsgcGdhaW9fY3RsLT5pb19o YW5kbGVfY291bnQpKTsKMzQzCQlyZXR1cm4gaW9oIC0gcGdhaW9fY3RsLT5pb19oYW5kbGVz OwogICAweDAwMDAwMDAwMDA0MzY2ZjggPCsyMDI+OglzdWIJczEsczAsYTAKICAgMHgwMDAw MDAwMDAwNDM2NmZjIDwrMjA2PjoJc3JhaQlzMSxzMSwweDQKCjM0NAl9CjM0NQkKMzQ2CS8q CjM0NwkgKiBSZXR1cm4gdGhlIFByb2NOdW1iZXIgZm9yIHRoZSBwcm9jZXNzIHRoYXQgY2Fu IHVzZSBhbiBJTyBoYW5kbGUuIFRoZQozNDgJICogbWFwcGluZyBmcm9tIElPIGhhbmRsZXMg dG8gUEdQUk9DcyBpcyBzdGF0aWMsIHRoZXJlZm9yZSB0aGlzIGV2ZW4gd29ya3MKMzQ5CSAq IHdoZW4gdGhlIGNvcnJlc3BvbmRpbmcgUEdQUk9DIGlzIG5vdCBpbiB1c2UuCjM1MAkgKi8K MzUxCVByb2NOdW1iZXIKMzUyCXBnYWlvX2lvX2dldF9vd25lcihQZ0Fpb0hhbmRsZSAqaW9o KQozNTMJewozNTQJCXJldHVybiBpb2gtPm93bmVyX3Byb2NubzsKMzU1CX0KMzU2CQozNTcJ LyoKMzU4CSAqIFJldHVybiBhIHdhaXQgcmVmZXJlbmNlIGZvciB0aGUgSU8uIE9ubHkgd2Fp dCByZWZlcmVuY2VzIGNhbiBiZSB1c2VkIHRvCjM1OQkgKiB3YWl0IGZvciBhbiBJT3MgY29t cGxldGlvbiwgYXMgaGFuZGxlcyB0aGVtc2VsdmVzIGNhbiBiZSByZXVzZWQgYWZ0ZXIKMzYw CSAqIGNvbXBsZXRpb24uICBTZWUgYWxzbyB0aGUgY29tbWVudCBhYm92ZSBwZ2Fpb19pb19h Y3F1aXJlKCkuCjM2MQkgKi8KMzYyCXZvaWQKMzYzCXBnYWlvX2lvX2dldF93cmVmKFBnQWlv SGFuZGxlICppb2gsIFBnQWlvV2FpdFJlZiAqaW93KQozNjQJewozNjUJCUFzc2VydChpb2gt PnN0YXRlID09IFBHQUlPX0hTX0hBTkRFRF9PVVQgfHwKMzY2CQkJICAgaW9oLT5zdGF0ZSA9 PSBQR0FJT19IU19ERUZJTkVEIHx8CjM2NwkJCSAgIGlvaC0+c3RhdGUgPT0gUEdBSU9fSFNf U1RBR0VEKTsKMzY4CQlBc3NlcnQoaW9oLT5nZW5lcmF0aW9uICE9IDApOwozNjkJCjM3MAkJ aW93LT5haW9faW5kZXggPSBpb2ggLSBwZ2Fpb19jdGwtPmlvX2hhbmRsZXM7CjM3MQkJaW93 LT5nZW5lcmF0aW9uX3VwcGVyID0gKHVpbnQzMikgKGlvaC0+Z2VuZXJhdGlvbiA+PiAzMik7 CjM3MgkJaW93LT5nZW5lcmF0aW9uX2xvd2VyID0gKHVpbnQzMikgaW9oLT5nZW5lcmF0aW9u OwozNzMJfQozNzQJCjM3NQkKMzc2CQozNzcJLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0KMzc4CSAqIEludGVybmFsIEZ1bmN0aW9ucyByZWxhdGVkIHRvIFBnQWlvSGFuZGxlCjM3 OQkgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQozODAJICovCjM4MQkKMzgyCXN0YXRp YyBpbmxpbmUgdm9pZAozODMJcGdhaW9faW9fdXBkYXRlX3N0YXRlKFBnQWlvSGFuZGxlICpp b2gsIFBnQWlvSGFuZGxlU3RhdGUgbmV3X3N0YXRlKQozODQJewozODUJCS8qCjM4NgkJICog QWxsIGNhbGxlcnMgbmVlZCB0byBoYXZlIGhlbGQgaW50ZXJydXB0cyBpbiBzb21lIGZvcm0s IG90aGVyd2lzZQozODcJCSAqIGludGVycnVwdCBwcm9jZXNzaW5nIGNvdWxkIHdhaXQgZm9y IHRoZSBJTyB0byBjb21wbGV0ZSwgd2hpbGUgaW4gYW4KMzg4CQkgKiBpbnRlcm1lZGlhcnkg c3RhdGUuCjM4OQkJICovCjM5MAkJQXNzZXJ0KCFJTlRFUlJVUFRTX0NBTl9CRV9QUk9DRVNT RUQoKSk7CjM5MQkKMzkyCQlwZ2Fpb19kZWJ1Z19pbyhERUJVRzUsIGlvaCwKMzkzCQkJCQkg ICAidXBkYXRpbmcgc3RhdGUgdG8gJXMiLAozOTQJCQkJCSAgIHBnYWlvX2lvX3N0YXRlX2dl dF9uYW1lKG5ld19zdGF0ZSkpOwozOTUJCjM5NgkJLyoKMzk3CQkgKiBFbnN1cmUgdGhlIGNo YW5nZXMgc2lnbmlmaWVkIGJ5IHRoZSBuZXcgc3RhdGUgYXJlIHZpc2libGUgYmVmb3JlIHRo ZQozOTgJCSAqIG5ldyBzdGF0ZSBiZWNvbWVzIHZpc2libGUuCjM5OQkJICovCjQwMAkJcGdf bWVtb3J5X2JhcnJpZXIoKTsKNDAxCQo0MDIJCWlvaC0+c3RhdGUgPSBuZXdfc3RhdGU7CjQw Mwl9CjQwNAkKNDA1CXN0YXRpYyB2b2lkCjQwNglwZ2Fpb19pb19yZXNvd25lcl9yZWdpc3Rl cihQZ0Fpb0hhbmRsZSAqaW9oKQo0MDcJewo0MDgJCUFzc2VydCghaW9oLT5yZXNvd25lcik7 CjQwOQkJQXNzZXJ0KEN1cnJlbnRSZXNvdXJjZU93bmVyKTsKNDEwCQo0MTEJCVJlc291cmNl T3duZXJSZW1lbWJlckFpb0hhbmRsZShDdXJyZW50UmVzb3VyY2VPd25lciwgJmlvaC0+cmVz b3duZXJfbm9kZSk7CjQxMgkJaW9oLT5yZXNvd25lciA9IEN1cnJlbnRSZXNvdXJjZU93bmVy Owo0MTMJfQo0MTQJCjQxNQkvKgo0MTYJICogU3RhZ2UgSU8gZm9yIGV4ZWN1dGlvbiBhbmQs IGlmIGFwcHJvcHJpYXRlLCBzdWJtaXQgaXQgaW1tZWRpYXRlbHkuCjQxNwkgKgo0MTgJICog U2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gcGdhaW9faW9fc3RhcnRfKigpLgo0MTkJICov CjQyMAl2b2lkCjQyMQlwZ2Fpb19pb19zdGFnZShQZ0Fpb0hhbmRsZSAqaW9oLCBQZ0Fpb09w IG9wKQo0MjIJewo0MjMJCWJvb2wJCW5lZWRzX3N5bmNocm9ub3VzOwo0MjQJCjQyNQkJQXNz ZXJ0KGlvaC0+c3RhdGUgPT0gUEdBSU9fSFNfSEFOREVEX09VVCk7CjQyNgkJQXNzZXJ0KHBn YWlvX215X2JhY2tlbmQtPmhhbmRlZF9vdXRfaW8gPT0gaW9oKTsKNDI3CQlBc3NlcnQocGdh aW9faW9faGFzX3RhcmdldChpb2gpKTsKNDI4CQo0MjkJCS8qCjQzMAkJICogT3RoZXJ3aXNl IGFuIGludGVycnVwdCwgaW4gdGhlIG1pZGRsZSBvZiBzdGFnaW5nIGFuZCBwb3NzaWJseSBl eGVjdXRpbmcKNDMxCQkgKiB0aGUgSU8sIGNvdWxkIGVuZCB1cCB0cnlpbmcgdG8gd2FpdCBm b3IgdGhlIElPLCBsZWFkaW5nIHRvIHN0YXRlCjQzMgkJICogY29uZnVzaW9uLgo0MzMJCSAq Lwo0MzQJCUhPTERfSU5URVJSVVBUUygpOwo0MzUJCjQzNgkJaW9oLT5vcCA9IG9wOwo0MzcJ CWlvaC0+cmVzdWx0ID0gMDsKNDM4CQo0MzkJCXBnYWlvX2lvX3VwZGF0ZV9zdGF0ZShpb2gs IFBHQUlPX0hTX0RFRklORUQpOwo0NDAJCjQ0MQkJLyogYWxsb3cgYSBuZXcgSU8gdG8gYmUg c3RhZ2VkICovCjQ0MgkJcGdhaW9fbXlfYmFja2VuZC0+aGFuZGVkX291dF9pbyA9IE5VTEw7 CjQ0MwkKNDQ0CQlwZ2Fpb19pb19jYWxsX3N0YWdlKGlvaCk7CjQ0NQkKNDQ2CQlwZ2Fpb19p b191cGRhdGVfc3RhdGUoaW9oLCBQR0FJT19IU19TVEFHRUQpOwo0NDcJCjQ0OAkJLyoKNDQ5 CQkgKiBTeW5jaHJvbm91cyBleGVjdXRpb24gaGFzIHRvIGJlIGV4ZWN1dGVkLCB3ZWxsLCBz eW5jaHJvbm91c2x5LCBzbyBjaGVjawo0NTAJCSAqIHRoYXQgZmlyc3QuCjQ1MQkJICovCjQ1 MgkJbmVlZHNfc3luY2hyb25vdXMgPSBwZ2Fpb19pb19uZWVkc19zeW5jaHJvbm91c19leGVj dXRpb24oaW9oKTsKNDUzCQo0NTQJCXBnYWlvX2RlYnVnX2lvKERFQlVHMywgaW9oLAo0NTUJ CQkJCSAgICJzdGFnZWQgKHN5bmNocm9ub3VzOiAlZCwgaW5fYmF0Y2g6ICVkKSIsCjQ1NgkJ CQkJICAgbmVlZHNfc3luY2hyb25vdXMsIHBnYWlvX215X2JhY2tlbmQtPmluX2JhdGNobW9k ZSk7CjQ1NwkKNDU4CQlpZiAoIW5lZWRzX3N5bmNocm9ub3VzKQo0NTkJCXsKNDYwCQkJcGdh aW9fbXlfYmFja2VuZC0+c3RhZ2VkX2lvc1twZ2Fpb19teV9iYWNrZW5kLT5udW1fc3RhZ2Vk X2lvcysrXSA9IGlvaDsKNDYxCQkJQXNzZXJ0KHBnYWlvX215X2JhY2tlbmQtPm51bV9zdGFn ZWRfaW9zIDw9IFBHQUlPX1NVQk1JVF9CQVRDSF9TSVpFKTsKNDYyCQo0NjMJCQkvKgo0NjQJ CQkgKiBVbmxlc3MgY29kZSBleHBsaWNpdGx5IG9wdGVkIGludG8gYmF0Y2hpbmcgSU9zLCBz dWJtaXQgdGhlIElPCjQ2NQkJCSAqIGltbWVkaWF0ZWx5Lgo0NjYJCQkgKi8KNDY3CQkJaWYg KCFwZ2Fpb19teV9iYWNrZW5kLT5pbl9iYXRjaG1vZGUpCjQ2OAkJCQlwZ2Fpb19zdWJtaXRf c3RhZ2VkKCk7CjQ2OQkJfQo0NzAJCWVsc2UKNDcxCQl7CjQ3MgkJCXBnYWlvX2lvX3ByZXBh cmVfc3VibWl0KGlvaCk7CjQ3MwkJCXBnYWlvX2lvX3BlcmZvcm1fc3luY2hyb25vdXNseShp b2gpOwo0NzQJCX0KNDc1CQo0NzYJCVJFU1VNRV9JTlRFUlJVUFRTKCk7CjQ3Nwl9CjQ3OAkK NDc5CWJvb2wKNDgwCXBnYWlvX2lvX25lZWRzX3N5bmNocm9ub3VzX2V4ZWN1dGlvbihQZ0Fp b0hhbmRsZSAqaW9oKQo0ODEJewo0ODIJCS8qCjQ4MwkJICogSWYgdGhlIGNhbGxlciBzYWlk IHRvIGV4ZWN1dGUgdGhlIElPIHN5bmNocm9ub3VzbHksIGRvIHNvLgo0ODQJCSAqCjQ4NQkJ ICogWFhYOiBXZSBjb3VsZCBvcHRpbWl6ZSB0aGUgbG9naWMgd2hlbiB0byBleGVjdXRlIHN5 bmNocm9ub3VzbHkgYnkgZmlyc3QKNDg2CQkgKiBjaGVja2luZyBpZiB0aGVyZSBhcmUgb3Ro ZXIgSU9zIGluIGZsaWdodCBhbmQgb25seSBzeW5jaHJvbm91c2x5CjQ4NwkJICogZXhlY3V0 aW5nIGlmIG5vdC4gVW5jbGVhciB3aGV0aGVyIHRoYXQnbGwgYmUgc3VmZmljaWVudGx5IGNv bW1vbiB0byBiZQo0ODgJCSAqIHdvcnRoIHdvcnJ5aW5nIGFib3V0Lgo0ODkJCSAqLwo0OTAJ CWlmIChpb2gtPmZsYWdzICYgUEdBSU9fSEZfU1lOQ0hST05PVVMpCjQ5MQkJCXJldHVybiB0 cnVlOwo0OTIJCjQ5MwkJLyogQ2hlY2sgaWYgdGhlIElPIG1ldGhvZCByZXF1aXJlcyBzeW5j aHJvbm91cyBleGVjdXRpb24gb2YgSU8gKi8KNDk0CQlpZiAocGdhaW9fbWV0aG9kX29wcy0+ bmVlZHNfc3luY2hyb25vdXNfZXhlY3V0aW9uKQo0OTUJCQlyZXR1cm4gcGdhaW9fbWV0aG9k X29wcy0+bmVlZHNfc3luY2hyb25vdXNfZXhlY3V0aW9uKGlvaCk7CjQ5NgkKNDk3CQlyZXR1 cm4gZmFsc2U7CjQ5OAl9CjQ5OQkKNTAwCS8qCjUwMQkgKiBIYW5kbGUgSU8gYmVpbmcgcHJv Y2Vzc2VkIGJ5IElPIG1ldGhvZC4KNTAyCSAqCjUwMwkgKiBTaG91bGQgYmUgY2FsbGVkIGJ5 IElPIG1ldGhvZHMgLyBzeW5jaHJvbm91cyBJTyBleGVjdXRpb24sIGp1c3QgYmVmb3JlIHRo ZQo1MDQJICogSU8gaXMgcGVyZm9ybWVkLgo1MDUJICovCjUwNgl2b2lkCjUwNwlwZ2Fpb19p b19wcmVwYXJlX3N1Ym1pdChQZ0Fpb0hhbmRsZSAqaW9oKQo1MDgJewo1MDkJCXBnYWlvX2lv X3VwZGF0ZV9zdGF0ZShpb2gsIFBHQUlPX0hTX1NVQk1JVFRFRCk7CjUxMAkKNTExCQlkY2xp c3RfcHVzaF90YWlsKCZwZ2Fpb19teV9iYWNrZW5kLT5pbl9mbGlnaHRfaW9zLCAmaW9oLT5u b2RlKTsKNTEyCX0KNTEzCQo1MTQJLyoKNTE1CSAqIEhhbmRsZSBJTyBnZXR0aW5nIGNvbXBs ZXRlZCBieSBhIG1ldGhvZC4KNTE2CSAqCjUxNwkgKiBTaG91bGQgYmUgY2FsbGVkIGJ5IElP IG1ldGhvZHMgLyBzeW5jaHJvbm91cyBJTyBleGVjdXRpb24sIGp1c3QgYWZ0ZXIgdGhlCjUx OAkgKiBJTyBoYXMgYmVlbiBwZXJmb3JtZWQuCjUxOQkgKgo1MjAJICogRXhwZWN0cyB0byBi ZSBjYWxsZWQgaW4gYSBjcml0aWNhbCBzZWN0aW9uLiBXZSBleHBlY3QgSU9zIHRvIGJlIHVz YWJsZSBmb3IKNTIxCSAqIFdBTCBldGMsIHdoaWNoIHJlcXVpcmVzIGJlaW5nIGFibGUgdG8g ZXhlY3V0ZSBjb21wbGV0aW9uIGNhbGxiYWNrcyBpbiBhCjUyMgkgKiBjcml0aWNhbCBzZWN0 aW9uLgo1MjMJICovCjUyNAl2b2lkCjUyNQlwZ2Fpb19pb19wcm9jZXNzX2NvbXBsZXRpb24o UGdBaW9IYW5kbGUgKmlvaCwgaW50IHJlc3VsdCkKNTI2CXsKNTI3CQlBc3NlcnQoaW9oLT5z dGF0ZSA9PSBQR0FJT19IU19TVUJNSVRURUQpOwo1MjgJCjUyOQkJQXNzZXJ0KENyaXRTZWN0 aW9uQ291bnQgPiAwKTsKNTMwCQo1MzEJCWlvaC0+cmVzdWx0ID0gcmVzdWx0Owo1MzIJCjUz MwkJcGdhaW9faW9fdXBkYXRlX3N0YXRlKGlvaCwgUEdBSU9fSFNfQ09NUExFVEVEX0lPKTsK NTM0CQo1MzUJCUlOSkVDVElPTl9QT0lOVCgiYWlvLXByb2Nlc3MtY29tcGxldGlvbi1iZWZv cmUtc2hhcmVkIiwgaW9oKTsKNTM2CQo1MzcJCXBnYWlvX2lvX2NhbGxfY29tcGxldGVfc2hh cmVkKGlvaCk7CjUzOAkKNTM5CQlwZ2Fpb19pb191cGRhdGVfc3RhdGUoaW9oLCBQR0FJT19I U19DT01QTEVURURfU0hBUkVEKTsKNTQwCQo1NDEJCS8qIGNvbmRpdGlvbiB2YXJpYWJsZSBi cm9hZGNhc3QgZW5zdXJlcyBzdGF0ZSBpcyB2aXNpYmxlIGJlZm9yZSB3YWtldXAgKi8KNTQy CQlDb25kaXRpb25WYXJpYWJsZUJyb2FkY2FzdCgmaW9oLT5jdik7CjU0MwkKNTQ0CQkvKiBj b250YWlucyBjYWxsIHRvIHBnYWlvX2lvX2NhbGxfY29tcGxldGVfbG9jYWwoKSAqLwo1NDUJ CWlmIChpb2gtPm93bmVyX3Byb2NubyA9PSBNeVByb2NOdW1iZXIpCjU0NgkJCXBnYWlvX2lv X3JlY2xhaW0oaW9oKTsKNTQ3CX0KNTQ4CQo1NDkJLyoKNTUwCSAqIEhhcyB0aGUgSU8gY29t cGxldGVkIGFuZCB0aHVzIHRoZSBJTyBoYW5kbGUgYmVlbiByZXVzZWQ/CjU1MQkgKgo1NTIJ ICogVGhpcyBpcyB1c2VmdWwgd2hlbiB3YWl0aW5nIGZvciBJTyBjb21wbGV0aW9uIGF0IGEg bG93IGxldmVsIChlLmcuIGluIGFuIElPCjU1MwkgKiBtZXRob2QncyAtPndhaXRfb25lKCkg Y2FsbGJhY2spLgo1NTQJICovCjU1NQlib29sCjU1NglwZ2Fpb19pb193YXNfcmVjeWNsZWQo UGdBaW9IYW5kbGUgKmlvaCwgdWludDY0IHJlZl9nZW5lcmF0aW9uLCBQZ0Fpb0hhbmRsZVN0 YXRlICpzdGF0ZSkKNTU3CXsKNTU4CQkqc3RhdGUgPSBpb2gtPnN0YXRlOwo1NTkJCjU2MAkJ LyoKNTYxCQkgKiBFbnN1cmUgdGhhdCB3ZSBkb24ndCBzZWUgYW4gZWFybGllciBzdGF0ZSBv ZiB0aGUgaGFuZGxlIHRoYW4gaW9oLT5zdGF0ZQo1NjIJCSAqIGR1ZSB0byBjb21waWxlciBv ciBDUFUgcmVvcmRlcmluZy4gVGhpcyBwcm90ZWN0cyBib3RoIC0+Z2VuZXJhdGlvbiBhcwo1 NjMJCSAqIGRpcmVjdGx5IHVzZWQgaGVyZSwgYW5kIG90aGVyIGZpZWxkcyBpbiB0aGUgaGFu ZGxlIGFjY2Vzc2VkIGluIHRoZQo1NjQJCSAqIGNhbGxlciBpZiB0aGUgaGFuZGxlIHdhcyBu b3QgcmV1c2VkLgo1NjUJCSAqLwo1NjYJCXBnX21lbW9yeV9iYXJyaWVyKCk7CjU2NwkKNTY4 CQlyZXR1cm4gaW9oLT5nZW5lcmF0aW9uICE9IHJlZl9nZW5lcmF0aW9uOwo1NjkJfQo1NzAJ CjU3MQkvKgo1NzIJICogV2FpdCBmb3IgSU8gdG8gY29tcGxldGUuIEV4dGVybmFsIGNvZGUg c2hvdWxkIG5ldmVyIHVzZSB0aGlzLCBvdXRzaWRlIG9mCjU3MwkgKiB0aGUgQUlPIHN1YnN5 c3RlbSB3YWl0cyBhcmUgb25seSBhbGxvd2VkIHZpYSBwZ2Fpb193cmVmX3dhaXQoKS4KNTc0 CSAqLwo1NzUJc3RhdGljIHZvaWQKNTc2CXBnYWlvX2lvX3dhaXQoUGdBaW9IYW5kbGUgKmlv aCwgdWludDY0IHJlZl9nZW5lcmF0aW9uKQo1NzcJewo1NzgJCVBnQWlvSGFuZGxlU3RhdGUg c3RhdGU7CjU3OQkJYm9vbAkJYW1fb3duZXI7CjU4MAkKNTgxCQlhbV9vd25lciA9IGlvaC0+ b3duZXJfcHJvY25vID09IE15UHJvY051bWJlcjsKNTgyCQo1ODMJCWlmIChwZ2Fpb19pb193 YXNfcmVjeWNsZWQoaW9oLCByZWZfZ2VuZXJhdGlvbiwgJnN0YXRlKSkKNTg0CQkJcmV0dXJu Owo1ODUJCjU4NgkJaWYgKGFtX293bmVyKQo1ODcJCXsKNTg4CQkJaWYgKHN0YXRlICE9IFBH QUlPX0hTX1NVQk1JVFRFRAo1ODkJCQkJJiYgc3RhdGUgIT0gUEdBSU9fSFNfQ09NUExFVEVE X0lPCjU5MAkJCQkmJiBzdGF0ZSAhPSBQR0FJT19IU19DT01QTEVURURfU0hBUkVECjU5MQkJ CQkmJiBzdGF0ZSAhPSBQR0FJT19IU19DT01QTEVURURfTE9DQUwpCjU5MgkJCXsKNTkzCQkJ CWVsb2coUEFOSUMsICJ3YWl0aW5nIGZvciBvd24gSU8gJWQgaW4gd3Jvbmcgc3RhdGU6ICVz IiwKNTk0CQkJCQkgcGdhaW9faW9fZ2V0X2lkKGlvaCksIHBnYWlvX2lvX2dldF9zdGF0ZV9u YW1lKGlvaCkpOwo1OTUJCQl9CjU5NgkJfQo1OTcJCjU5OAkJd2hpbGUgKHRydWUpCjU5OQkJ ewo2MDAJCQlpZiAocGdhaW9faW9fd2FzX3JlY3ljbGVkKGlvaCwgcmVmX2dlbmVyYXRpb24s ICZzdGF0ZSkpCjYwMQkJCQlyZXR1cm47CjYwMgkKNjAzCQkJc3dpdGNoICgoUGdBaW9IYW5k bGVTdGF0ZSkgc3RhdGUpCjYwNAkJCXsKNjA1CQkJCWNhc2UgUEdBSU9fSFNfSURMRToKNjA2 CQkJCWNhc2UgUEdBSU9fSFNfSEFOREVEX09VVDoKNjA3CQkJCQllbG9nKEVSUk9SLCAiSU8g aW4gd3Jvbmcgc3RhdGU6ICVkIiwgc3RhdGUpOwo2MDgJCQkJCWJyZWFrOwo2MDkJCjYxMAkJ CQljYXNlIFBHQUlPX0hTX1NVQk1JVFRFRDoKNjExCQo2MTIJCQkJCS8qCjYxMwkJCQkJICog SWYgd2UgbmVlZCB0byB3YWl0IHZpYSB0aGUgSU8gbWV0aG9kLCBkbyBzbyBub3cuIERvbid0 CjYxNAkJCQkJICogY2hlY2sgdmlhIHRoZSBJTyBtZXRob2QgaWYgdGhlIGlzc3VpbmcgYmFj a2VuZCBpcyBleGVjdXRpbmcKNjE1CQkJCQkgKiB0aGUgSU8gc3luY2hyb25vdXNseS4KNjE2 CQkJCQkgKi8KNjE3CQkJCQlpZiAocGdhaW9fbWV0aG9kX29wcy0+d2FpdF9vbmUgJiYgIShp b2gtPmZsYWdzICYgUEdBSU9fSEZfU1lOQ0hST05PVVMpKQo2MTgJCQkJCXsKNjE5CQkJCQkJ cGdhaW9fbWV0aG9kX29wcy0+d2FpdF9vbmUoaW9oLCByZWZfZ2VuZXJhdGlvbik7CjYyMAkJ CQkJCWNvbnRpbnVlOwo2MjEJCQkJCX0KNjIyCQkJCQkvKiBmYWxsdGhyb3VnaCAqLwo2MjMJ CjYyNAkJCQkJLyogd2FpdGluZyBmb3Igb3duZXIgdG8gc3VibWl0ICovCjYyNQkJCQljYXNl IFBHQUlPX0hTX0RFRklORUQ6CjYyNgkJCQljYXNlIFBHQUlPX0hTX1NUQUdFRDoKNjI3CQkJ CQkvKiB3YWl0aW5nIGZvciByZWFwZXIgdG8gY29tcGxldGUgKi8KNjI4CQkJCQkvKiBmYWxs dGhyb3VnaCAqLwo2MjkJCQkJY2FzZSBQR0FJT19IU19DT01QTEVURURfSU86CjYzMAkJCQkJ Lyogc2hvdWxkbid0IGJlIGFibGUgdG8gaGl0IHRoaXMgb3RoZXJ3aXNlICovCjYzMQkJCQkJ QXNzZXJ0KElzVW5kZXJQb3N0bWFzdGVyKTsKNjMyCQkJCQkvKiBlbnN1cmUgd2UncmUgZ29p bmcgdG8gZ2V0IHdva2VuIHVwICovCjYzMwkJCQkJQ29uZGl0aW9uVmFyaWFibGVQcmVwYXJl VG9TbGVlcCgmaW9oLT5jdik7CjYzNAkKNjM1CQkJCQl3aGlsZSAoIXBnYWlvX2lvX3dhc19y ZWN5Y2xlZChpb2gsIHJlZl9nZW5lcmF0aW9uLCAmc3RhdGUpKQo2MzYJCQkJCXsKNjM3CQkJ CQkJaWYgKHN0YXRlID09IFBHQUlPX0hTX0NPTVBMRVRFRF9TSEFSRUQgfHwKNjM4CQkJCQkJ CXN0YXRlID09IFBHQUlPX0hTX0NPTVBMRVRFRF9MT0NBTCkKNjM5CQkJCQkJCWJyZWFrOwo2 NDAJCQkJCQlDb25kaXRpb25WYXJpYWJsZVNsZWVwKCZpb2gtPmN2LCBXQUlUX0VWRU5UX0FJ T19JT19DT01QTEVUSU9OKTsKNjQxCQkJCQl9CjY0MgkKNjQzCQkJCQlDb25kaXRpb25WYXJp YWJsZUNhbmNlbFNsZWVwKCk7CjY0NAkJCQkJYnJlYWs7CjY0NQkKNjQ2CQkJCWNhc2UgUEdB SU9fSFNfQ09NUExFVEVEX1NIQVJFRDoKNjQ3CQkJCWNhc2UgUEdBSU9fSFNfQ09NUExFVEVE X0xPQ0FMOgo2NDgJCjY0OQkJCQkJLyoKNjUwCQkJCQkgKiBOb3RlIHRoYXQgbm8gaW50ZXJy dXB0cyBhcmUgcHJvY2Vzc2VkIGJldHdlZW4KNjUxCQkJCQkgKiBwZ2Fpb19pb193YXNfcmVj eWNsZWQoKSBhbmQgdGhpcyBjaGVjayAtIHRoYXQncyBpbXBvcnRhbnQKNjUyCQkJCQkgKiBh cyBvdGhlcndpc2UgYW4gaW50ZXJydXB0IGNvdWxkIGhhdmUgYWxyZWFkeSByZWNsYWltZWQg dGhlCjY1MwkJCQkJICogaGFuZGxlLgo2NTQJCQkJCSAqLwo2NTUJCQkJCWlmIChhbV9vd25l cikKNjU2CQkJCQkJcGdhaW9faW9fcmVjbGFpbShpb2gpOwo2NTcJCQkJCXJldHVybjsKNjU4 CQkJfQo2NTkJCX0KNjYwCX0KNjYxCQo2NjIJLyoKNjYzCSAqIE1ha2UgSU8gaGFuZGxlIHJl YWR5IHRvIGJlIHJldXNlZCBhZnRlciBJTyBoYXMgY29tcGxldGVkIG9yIGFmdGVyIHRoZQo2 NjQJICogaGFuZGxlIGhhcyBiZWVuIHJlbGVhc2VkIHdpdGhvdXQgYmVpbmcgdXNlZC4KNjY1 CSAqCjY2NgkgKiBOb3RlIHRoYXQgY2FsbGVycyBuZWVkIHRvIGJlIGNhcmVmdWwgYWJvdXQg b25seSBjYWxsaW5nIHRoaXMgaW4gdGhlIHJpZ2h0CjY2NwkgKiBzdGF0ZSBhbmQgdGhhdCBu byBpbnRlcnJ1cHRzIGNhbiBiZSBwcm9jZXNzZWQgYmV0d2VlbiB0aGUgc3RhdGUgY2hlY2sg YW5kCjY2OAkgKiB0aGUgY2FsbCB0byBwZ2Fpb19pb19yZWNsYWltKCkuIE90aGVyd2lzZSBp bnRlcnJ1cHQgcHJvY2Vzc2luZyBjb3VsZAo2NjkJICogYWxyZWFkeSBoYXZlIHJlY2xhaW1l ZCB0aGUgaGFuZGxlLgo2NzAJICovCjY3MQlzdGF0aWMgdm9pZAo2NzIJcGdhaW9faW9fcmVj bGFpbShQZ0Fpb0hhbmRsZSAqaW9oKQo2NzMJewogICAweDAwMDAwMDAwMDA0MzY2MmUgPCsw PjoJYWRkaQlzcCxzcCwtNjQKICAgMHgwMDAwMDAwMDAwNDM2NjMwIDwrMj46CXNkCXJhLDU2 KHNwKQogICAweDAwMDAwMDAwMDA0MzY2MzIgPCs0PjoJc2QJczAsNDgoc3ApCiAgIDB4MDAw MDAwMDAwMDQzNjYzNCA8KzY+OglzZAlzMSw0MChzcCkKICAgMHgwMDAwMDAwMDAwNDM2NjM2 IDwrOD46CXNkCXMyLDMyKHNwKQogICAweDAwMDAwMDAwMDA0MzY2MzggPCsxMD46CXNkCXMz LDI0KHNwKQogICAweDAwMDAwMDAwMDA0MzY2M2EgPCsxMj46CXNkCXM0LDE2KHNwKQoKNjc0 CQkvKiBUaGlzIGlzIG9ubHkgb2sgaWYgaXQncyBvdXIgSU8gKi8KNjc1CQlBc3NlcnQoaW9o LT5vd25lcl9wcm9jbm8gPT0gTXlQcm9jTnVtYmVyKTsKICAgMHgwMDAwMDAwMDAwNDM2NjNj IDwrMTQ+OglhdWlwYwlhMSwweDRhNgogICAweDAwMDAwMDAwMDA0MzY2NDAgPCsxOD46CWxk CWExLC0yMDIwKGExKSAjIDB4OGRiZTU4CiAgIDB4MDAwMDAwMDAwMDQzNjY0NCA8KzIyPjoJ bXYJczAsYTAKICAgMHgwMDAwMDAwMDAwNDM2NjQ2IDwrMjQ+OglsdwlhMCwxNihhMCkKICAg MHgwMDAwMDAwMDAwNDM2NjQ4IDwrMjY+OglsdwlhMSwwKGExKQogICAweDAwMDAwMDAwMDA0 MzY2NGEgPCsyOD46CWJuZQlhMCxhMSwweDQzNjg0ZSA8cGdhaW9faW9fcmVjbGFpbSs1NDQ+ CiAgIDB4MDAwMDAwMDAwMDQzNjg0ZSA8KzU0ND46CWF1aXBjCWEwLDB4MjQyCiAgIDB4MDAw MDAwMDAwMDQzNjg1MiA8KzU0OD46CWFkZGkJYTAsYTAsLTQ5NCAjIDB4Njc4NjYwCiAgIDB4 MDAwMDAwMDAwMDQzNjg1NiA8KzU1Mj46CWF1aXBjCWExLDB4MjQyCiAgIDB4MDAwMDAwMDAw MDQzNjg1YSA8KzU1Nj46CWFkZGkJYTEsYTEsLTYwMSAjIDB4Njc4NWZkCiAgIDB4MDAwMDAw MDAwMDQzNjg1ZSA8KzU2MD46CWxpCWEyLDY3NQogICAweDAwMDAwMDAwMDA0MzY4NjIgPCs1 NjQ+OglhdWlwYwlyYSwweDE2MAogICAweDAwMDAwMDAwMDA0MzY4NjYgPCs1Njg+OglqYWxy CTIzMChyYSkgIyAweDU5Njk0OCA8RXhjZXB0aW9uYWxDb25kaXRpb24+Cgo2NzYJCUFzc2Vy dChpb2gtPnN0YXRlICE9IFBHQUlPX0hTX0lETEUpOwogICAweDAwMDAwMDAwMDA0MzY2NGUg PCszMj46CWxidQlhMCwwKHMwKQogICAweDAwMDAwMDAwMDA0MzY2NTIgPCszNj46CWJlcXoJ YTAsMHg0MzY4NmEgPHBnYWlvX2lvX3JlY2xhaW0rNTcyPgogICAweDAwMDAwMDAwMDA0MzY4 NmEgPCs1NzI+OglhdWlwYwlhMCwweDI0MgogICAweDAwMDAwMDAwMDA0MzY4NmUgPCs1NzY+ OglhZGRpCWEwLGEwLDEwMzcgIyAweDY3OGM3NwogICAweDAwMDAwMDAwMDA0MzY4NzIgPCs1 ODA+OglhdWlwYwlhMSwweDI0MgogICAweDAwMDAwMDAwMDA0MzY4NzYgPCs1ODQ+OglhZGRp CWExLGExLC02MjkgIyAweDY3ODVmZAogICAweDAwMDAwMDAwMDA0MzY4N2EgPCs1ODg+Ogls aQlhMiw2NzYKICAgMHgwMDAwMDAwMDAwNDM2ODdlIDwrNTkyPjoJYXVpcGMJcmEsMHgxNjAK ICAgMHgwMDAwMDAwMDAwNDM2ODgyIDwrNTk2PjoJamFscgkyMDIocmEpICMgMHg1OTY5NDgg PEV4Y2VwdGlvbmFsQ29uZGl0aW9uPgoKNjc3CQo2NzgJCS8qIHNlZSBjb21tZW50IGluIGZ1 bmN0aW9uIGhlYWRlciAqLwo2NzkJCUhPTERfSU5URVJSVVBUUygpOwogICAweDAwMDAwMDAw MDA0MzY2NTYgPCs0MD46CWF1aXBjCWEwLDB4NGE2CiAgIDB4MDAwMDAwMDAwMDQzNjY1YSA8 KzQ0PjoJbGQJczIsMzQoYTApICMgMHg4ZGM2NzgKICAgMHgwMDAwMDAwMDAwNDM2NjVlIDwr NDg+OglsdwlhMCwwKHMyKQogICAweDAwMDAwMDAwMDA0MzY2NjIgPCs1Mj46CWFkZGkJYTAs YTAsMQogICAweDAwMDAwMDAwMDA0MzY2NjQgPCs1ND46CXN3CWEwLDAoczIpCgo2ODAJCjY4 MQkJLyoKNjgyCQkgKiBJdCdzIGEgYml0IHVnbHksIGJ1dCByaWdodCBub3cgdGhlIGVhc2ll c3QgcGxhY2UgdG8gcHV0IHRoZSBleGVjdXRpb24KNjgzCQkgKiBvZiBsb2NhbCBjb21wbGV0 aW9uIGNhbGxiYWNrcyBpcyB0aGlzIGZ1bmN0aW9uLCBhcyB3ZSBuZWVkIHRvIGV4ZWN1dGUK Njg0CQkgKiBsb2NhbCBjYWxsYmFja3MganVzdCBiZWZvcmUgcmVjbGFpbWluZyBhdCBtdWx0 aXBsZSBjYWxsc2l0ZXMuCjY4NQkJICovCjY4NgkJaWYgKGlvaC0+c3RhdGUgPT0gUEdBSU9f SFNfQ09NUExFVEVEX1NIQVJFRCkKICAgMHgwMDAwMDAwMDAwNDM2NjY4IDwrNTg+OglsYnUJ YTAsMChzMCkKICAgMHgwMDAwMDAwMDAwNDM2NjZjIDwrNjI+OglsaQlhMSw2CiAgIDB4MDAw MDAwMDAwMDQzNjY2ZSA8KzY0PjoJYm5lCWEwLGExLDB4NDM2NmFlIDxwZ2Fpb19pb19yZWNs YWltKzEyOD4KCjY4NwkJewo2ODgJCQlQZ0Fpb1Jlc3VsdCBsb2NhbF9yZXN1bHQ7CjY4OQkK NjkwCQkJbG9jYWxfcmVzdWx0ID0gcGdhaW9faW9fY2FsbF9jb21wbGV0ZV9sb2NhbChpb2gp OwogICAweDAwMDAwMDAwMDA0MzY2NzIgPCs2OD46CW12CWEwLHMwCiAgIDB4MDAwMDAwMDAw MDQzNjY3NCA8KzcwPjoJamFsCTB4NDM4MWRlIDxwZ2Fpb19pb19jYWxsX2NvbXBsZXRlX2xv Y2FsPgogICAweDAwMDAwMDAwMDA0MzY2NzggPCs3ND46CW12CXMxLGEwCgo2OTEJCQlwZ2Fp b19pb191cGRhdGVfc3RhdGUoaW9oLCBQR0FJT19IU19DT01QTEVURURfTE9DQUwpOwogICAw eDAwMDAwMDAwMDA0MzY2N2EgPCs3Nj46CWxpCWExLDcKICAgMHgwMDAwMDAwMDAwNDM2Njdj IDwrNzg+OgltdglhMCxzMAogICAweDAwMDAwMDAwMDA0MzY2N2UgPCs4MD46CWphbAkweDQz NjQzNiA8cGdhaW9faW9fdXBkYXRlX3N0YXRlPgoKNjkyCQo2OTMJCQlpZiAoaW9oLT5yZXBv cnRfcmV0dXJuKQogICAweDAwMDAwMDAwMDA0MzY2ODIgPCs4ND46CWxkCWEwLDk2KHMwKQog ICAweDAwMDAwMDAwMDA0MzY2ODQgPCs4Nj46CWJlcXoJYTAsMHg0MzY2YWUgPHBnYWlvX2lv X3JlY2xhaW0rMTI4PgoKNjk0CQkJewo2OTUJCQkJaW9oLT5yZXBvcnRfcmV0dXJuLT5yZXN1 bHQgPSBsb2NhbF9yZXN1bHQ7CiAgIDB4MDAwMDAwMDAwMDQzNjY4NiA8Kzg4PjoJc3cJczEs MChhMCkKICAgMHgwMDAwMDAwMDAwNDM2Njg4IDwrOTA+OglzcmxpCXMxLHMxLDB4MjAKICAg MHgwMDAwMDAwMDAwNDM2NjhhIDwrOTI+OglzdwlzMSw0KGEwKQoKNjk2CQkJCWlvaC0+cmVw b3J0X3JldHVybi0+dGFyZ2V0X2RhdGEgPSBpb2gtPnRhcmdldF9kYXRhOwogICAweDAwMDAw MDAwMDA0MzY2OGMgPCs5ND46CWxkCWEwLDk2KHMwKQogICAweDAwMDAwMDAwMDA0MzY2OGUg PCs5Nj46CWx3CWExLDE0MChzMCkKICAgMHgwMDAwMDAwMDAwNDM2NjkyIDwrMTAwPjoJc3cJ YTEsMjgoYTApCiAgIDB4MDAwMDAwMDAwMDQzNjY5NCA8KzEwMj46CWx3CWExLDEzNihzMCkK ICAgMHgwMDAwMDAwMDAwNDM2Njk4IDwrMTA2PjoJc3cJYTEsMjQoYTApCiAgIDB4MDAwMDAw MDAwMDQzNjY5YSA8KzEwOD46CWx3CWExLDEzMihzMCkKICAgMHgwMDAwMDAwMDAwNDM2Njll IDwrMTEyPjoJc3cJYTEsMjAoYTApCiAgIDB4MDAwMDAwMDAwMDQzNjZhMCA8KzExND46CWx3 CWExLDEyOChzMCkKICAgMHgwMDAwMDAwMDAwNDM2NmE0IDwrMTE4PjoJc3cJYTEsMTYoYTAp CiAgIDB4MDAwMDAwMDAwMDQzNjZhNiA8KzEyMD46CWx3CWExLDEyNChzMCkKICAgMHgwMDAw MDAwMDAwNDM2NmE4IDwrMTIyPjoJc3cJYTEsMTIoYTApCiAgIDB4MDAwMDAwMDAwMDQzNjZh YSA8KzEyND46CWx3CWExLDEyMChzMCkKICAgMHgwMDAwMDAwMDAwNDM2NmFjIDwrMTI2PjoJ c3cJYTEsOChhMCkKCjY5NwkJCX0KNjk4CQl9CjY5OQkKNzAwCQlwZ2Fpb19kZWJ1Z19pbyhE RUJVRzQsIGlvaCwKICAgMHgwMDAwMDAwMDAwNDM2NmFlIDwrMTI4PjoJbGkJYTAsMTEKICAg MHgwMDAwMDAwMDAwNDM2NmIwIDwrMTMwPjoJbGkJYTEsMAogICAweDAwMDAwMDAwMDA0MzY2 YjIgPCsxMzI+OglhdWlwYwlyYSwweDE2MQogICAweDAwMDAwMDAwMDA0MzY2YjYgPCsxMzY+ OglqYWxyCS0xNzc2KHJhKSAjIDB4NTk2ZmMyIDxlcnJzdGFydD4KICAgMHgwMDAwMDAwMDAw NDM2NmJhIDwrMTQwPjoJYmVxeglhMCwweDQzNjc4OCA8cGdhaW9faW9fcmVjbGFpbSszNDY+ CiAgIDB4MDAwMDAwMDAwMDQzNjZiYyA8KzE0Mj46CWxpCWEwLDEKICAgMHgwMDAwMDAwMDAw NDM2NmJlIDwrMTQ0PjoJYXVpcGMJcmEsMHgxNjMKICAgMHgwMDAwMDAwMDAwNDM2NmMyIDwr MTQ4PjoJamFscgk2ODgocmEpICMgMHg1OTk5NmUgPGVycmhpZGVzdG10PgogICAweDAwMDAw MDAwMDA0MzY2YzYgPCsxNTI+OglsaQlhMCwxCiAgIDB4MDAwMDAwMDAwMDQzNjZjOCA8KzE1 ND46CWF1aXBjCXJhLDB4MTYzCiAgIDB4MDAwMDAwMDAwMDQzNjZjYyA8KzE1OD46CWphbHIJ NzgwKHJhKSAjIDB4NTk5OWQ0IDxlcnJoaWRlY29udGV4dD4KICAgMHgwMDAwMDAwMDAwNDM2 NmZlIDwrMjA4PjoJbXYJYTAsczAKICAgMHgwMDAwMDAwMDAwNDM2NzAwIDwrMjEwPjoJamFs CTB4NDM4ZjkwIDxwZ2Fpb19pb19nZXRfb3BfbmFtZT4KICAgMHgwMDAwMDAwMDAwNDM2NzA0 IDwrMjE0PjoJbXYJczMsYTAKICAgMHgwMDAwMDAwMDAwNDM2NzA2IDwrMjE2PjoJbXYJYTAs czAKICAgMHgwMDAwMDAwMDAwNDM2NzA4IDwrMjE4PjoJamFsCTB4NDM5MDc2IDxwZ2Fpb19p b19nZXRfdGFyZ2V0X25hbWU+CiAgIDB4MDAwMDAwMDAwMDQzNjcxMiA8KzIyOD46CW12CWEz LGEwCiAgIDB4MDAwMDAwMDAwMDQzNjcyYSA8KzI1Mj46CWx3CWEwLDg0KHMwKQogICAweDAw MDAwMDAwMDA0MzY3MmMgPCsyNTQ+OglzbGxpCWEyLGEwLDB4MzcKICAgMHgwMDAwMDAwMDAw NDM2NzMwIDwrMjU4PjoJc3JsaQlhMixhMiwweDNkCiAgIDB4MDAwMDAwMDAwMDQzNjczMiA8 KzI2MD46CWxpCWE1LDQKICAgMHgwMDAwMDAwMDAwNDM2NzM0IDwrMjYyPjoJbXVsdwlhMSxz MSxzNAogICAweDAwMDAwMDAwMDA0MzY3NGUgPCsyODg+OglsdwlhMiwyMChzMCkKICAgMHgw MDAwMDAwMDAwNDM2NzUwIDwrMjkwPjoJYW5kaQlhNixhMCw2MwogICAweDAwMDAwMDAwMDA0 MzY3NTQgPCsyOTQ+OglzcmxpdwlhNyxhMCwweDkKICAgMHgwMDAwMDAwMDAwNDM2NzU4IDwr Mjk4PjoJYXVpcGMJYTAsMHgyNDIKICAgMHgwMDAwMDAwMDAwNDM2NzVjIDwrMzAyPjoJYWRk aQlhMCxhMCwxMzM5ICMgMHg2NzhjOTMKICAgMHgwMDAwMDAwMDAwNDM2NzYwIDwrMzA2PjoJ c2QJYTIsMChzcCkKICAgMHgwMDAwMDAwMDAwNDM2NzYyIDwrMzA4PjoJbXYJYTIsczMKICAg MHgwMDAwMDAwMDAwNDM2NzY0IDwrMzEwPjoJYXVpcGMJcmEsMHgxNjEKICAgMHgwMDAwMDAw MDAwNDM2NzY4IDwrMzE0PjoJamFscgktNjQyKHJhKSAjIDB4NTk3NGUyIDxlcnJtc2dfaW50 ZXJuYWw+CiAgIDB4MDAwMDAwMDAwMDQzNjc2YyA8KzMxOD46CWF1aXBjCWEwLDB4MjQyCiAg IDB4MDAwMDAwMDAwMDQzNjc3MCA8KzMyMj46CWFkZGkJYTAsYTAsLTM2NyAjIDB4Njc4NWZk CiAgIDB4MDAwMDAwMDAwMDQzNjc3NCA8KzMyNj46CWF1aXBjCWExLDB4MjQyCiAgIDB4MDAw MDAwMDAwMDQzNjc3OCA8KzMzMD46CWFkZGkJYTIsYTEsMTQzMyAjIDB4Njc4ZDBkCiAgIDB4 MDAwMDAwMDAwMDQzNjc3YyA8KzMzND46CWxpCWExLDcwNQogICAweDAwMDAwMDAwMDA0MzY3 ODAgPCszMzg+OglhdWlwYwlyYSwweDE2MQogICAweDAwMDAwMDAwMDA0MzY3ODQgPCszNDI+ OglqYWxyCS0xMjg0KHJhKSAjIDB4NTk3MjdjIDxlcnJmaW5pc2g+Cgo3MDEJCQkJCSAgICJy ZWNsYWltaW5nOiBkaXN0aWxsZWRfcmVzdWx0OiAoc3RhdHVzICVzLCBpZCAldSwgZXJyb3Jf ZGF0YSAlZCksIHJhd19yZXN1bHQ6ICVkIiwKNzAyCQkJCQkgICBwZ2Fpb19yZXN1bHRfc3Rh dHVzX3N0cmluZyhpb2gtPmRpc3RpbGxlZF9yZXN1bHQuc3RhdHVzKSwKNzAzCQkJCQkgICBp b2gtPmRpc3RpbGxlZF9yZXN1bHQuaWQsCjcwNAkJCQkJICAgaW9oLT5kaXN0aWxsZWRfcmVz dWx0LmVycm9yX2RhdGEsCjcwNQkJCQkJICAgaW9oLT5yZXN1bHQpOwo3MDYJCjcwNwkJLyog aWYgdGhlIElPIGhhcyBiZWVuIGRlZmluZWQsIGl0J3Mgb24gdGhlIGluLWZsaWdodCBsaXN0 LCByZW1vdmUgKi8KNzA4CQlpZiAoaW9oLT5zdGF0ZSAhPSBQR0FJT19IU19IQU5ERURfT1VU KQogICAweDAwMDAwMDAwMDA0MzY3ODggPCszNDY+OglsYnUJYTAsMChzMCkKICAgMHgwMDAw MDAwMDAwNDM2NzhjIDwrMzUwPjoJbGkJYTEsMQogICAweDAwMDAwMDAwMDA0MzY3OGUgPCsz NTI+OglhdWlwYwlzMSwweDRjMwogICAweDAwMDAwMDAwMDA0MzY3OTIgPCszNTY+OgliZXEJ YTAsYTEsMHg0MzY3YjYgPHBnYWlvX2lvX3JlY2xhaW0rMzkyPgoKNzA5CQkJZGNsaXN0X2Rl bGV0ZV9mcm9tKCZwZ2Fpb19teV9iYWNrZW5kLT5pbl9mbGlnaHRfaW9zLCAmaW9oLT5ub2Rl KTsKICAgMHgwMDAwMDAwMDAwNDM2Nzk2IDwrMzYwPjoJbGQJYTAsLTEzOTAoczEpCgo3MTAJ CjcxMQkJaWYgKGlvaC0+cmVzb3duZXIpCiAgIDB4MDAwMDAwMDAwMDQzNjdiNiA8KzM5Mj46 CWxkCWEwLDQwKHMwKQogICAweDAwMDAwMDAwMDA0MzY3YjggPCszOTQ+OgliZXF6CWEwLDB4 NDM2N2NhIDxwZ2Fpb19pb19yZWNsYWltKzQxMj4KCjcxMgkJewo3MTMJCQlSZXNvdXJjZU93 bmVyRm9yZ2V0QWlvSGFuZGxlKGlvaC0+cmVzb3duZXIsICZpb2gtPnJlc293bmVyX25vZGUp OwogICAweDAwMDAwMDAwMDA0MzY3YmEgPCszOTY+OglhZGRpCWExLHMwLDQ4CiAgIDB4MDAw MDAwMDAwMDQzNjdiZSA8KzQwMD46CWF1aXBjCXJhLDB4MThkCiAgIDB4MDAwMDAwMDAwMDQz NjdjMiA8KzQwND46CWphbHIJMTU2NihyYSkgIyAweDVjM2RkYyA8UmVzb3VyY2VPd25lckZv cmdldEFpb0hhbmRsZT4KCjcxNAkJCWlvaC0+cmVzb3duZXIgPSBOVUxMOwogICAweDAwMDAw MDAwMDA0MzY3YzYgPCs0MDg+OglzZAl6ZXJvLDQwKHMwKQoKNzE1CQl9CjcxNgkKNzE3CQlB c3NlcnQoIWlvaC0+cmVzb3duZXIpOwo3MTgJCjcxOQkJLyoKNzIwCQkgKiBVcGRhdGUgZ2Vu ZXJhdGlvbiAmIHN0YXRlIGZpcnN0LCBiZWZvcmUgcmVzZXR0aW5nIHRoZSBJTydzIGZpZWxk cywKNzIxCQkgKiBvdGhlcndpc2UgYSBjb25jdXJyZW50ICJ2aWV3ZXIiIGNvdWxkIHRoaW5r IHRoZSBmaWVsZHMgYXJlIHZhbGlkLCBldmVuCjcyMgkJICogdGhvdWdoIHRoZXkgYXJlIGJl aW5nIHJlc2V0LiAgSW5jcmVtZW50IHRoZSBnZW5lcmF0aW9uIGZpcnN0LCBzbyB0aGF0Cjcy MwkJICogd2UgY2FuIGFzc2VydCBlbHNld2hlcmUgdGhhdCB3ZSBuZXZlciB3YWl0IGZvciBh biBJRExFIElPLiAgV2hpbGUgaXQncwo3MjQJCSAqIGEgYml0IHdlaXJkIGZvciB0aGUgc3Rh dGUgdG8gZ28gYmFja3dhcmRzIGZvciBhIGdlbmVyYXRpb24sIGl0J3MgT0sKNzI1CQkgKiBo ZXJlLCBhcyB0aGVyZSBjYW5ub3QgYmUgcmVmZXJlbmNlcyB0byB0aGUgInJlYm9ybiIgSU8g eWV0LiAgQ2FuJ3QKNzI2CQkgKiB1cGRhdGUgYm90aCBhdCBvbmNlLCBzbyBzb21ldGhpbmcg aGFzIHRvIGdpdmUuCjcyNwkJICovCjcyOAkJaW9oLT5nZW5lcmF0aW9uKys7CiAgIDB4MDAw MDAwMDAwMDQzNjdjYSA8KzQxMj46CWxkCWEwLDY0KHMwKQogICAweDAwMDAwMDAwMDA0MzY3 Y2MgPCs0MTQ+OglhZGRpCWEwLGEwLDEKICAgMHgwMDAwMDAwMDAwNDM2N2NlIDwrNDE2PjoJ c2QJYTAsNjQoczApCgo3MjkJCXBnYWlvX2lvX3VwZGF0ZV9zdGF0ZShpb2gsIFBHQUlPX0hT X0lETEUpOwogICAweDAwMDAwMDAwMDA0MzY3ZDAgPCs0MTg+OgltdglhMCxzMAogICAweDAw MDAwMDAwMDA0MzY3ZDIgPCs0MjA+OglsaQlhMSwwCiAgIDB4MDAwMDAwMDAwMDQzNjdkNCA8 KzQyMj46CWphbAkweDQzNjQzNiA8cGdhaW9faW9fdXBkYXRlX3N0YXRlPgoKNzMwCQo3MzEJ CS8qIGVuc3VyZSB0aGUgc3RhdGUgdXBkYXRlIGlzIHZpc2libGUgYmVmb3JlIHdlIHJlc2V0 IGZpZWxkcyAqLwo3MzIJCXBnX21lbW9yeV9iYXJyaWVyKCk7CiAgIDB4MDAwMDAwMDAwMDQz NjdkOCA8KzQyNj46CWZlbmNlCXJ3LHJ3Cgo3MzMJCjczNAkJaW9oLT5vcCA9IFBHQUlPX09Q X0lOVkFMSUQ7CjczNQkJaW9oLT50YXJnZXQgPSBQR0FJT19USURfSU5WQUxJRDsKICAgMHgw MDAwMDAwMDAwNDM2N2U0IDwrNDM4PjoJc2IJemVybyw0KHMwKQogICAweDAwMDAwMDAwMDA0 MzY3ZTggPCs0NDI+OglzYgl6ZXJvLDMoczApCiAgIDB4MDAwMDAwMDAwMDQzNjdlYyA8KzQ0 Nj46CXNiCXplcm8sMihzMCkKICAgMHgwMDAwMDAwMDAwNDM2N2Y0IDwrNDU0PjoJc2IJemVy bywxKHMwKQoKNzM2CQlpb2gtPmZsYWdzID0gMDsKNzM3CQlpb2gtPm51bV9jYWxsYmFja3Mg PSAwOwo3MzgJCWlvaC0+aGFuZGxlX2RhdGFfbGVuID0gMDsKICAgMHgwMDAwMDAwMDAwNDM2 N2RjIDwrNDMwPjoJc2IJemVybywxMyhzMCkKCjczOQkJaW9oLT5yZXBvcnRfcmV0dXJuID0g TlVMTDsKICAgMHgwMDAwMDAwMDAwNDM2N2UwIDwrNDM0PjoJc2QJemVybyw5NihzMCkKCjc0 MAkJaW9oLT5yZXN1bHQgPSAwOwogICAweDAwMDAwMDAwMDA0MzY3ZmMgPCs0NjI+Oglzdwl6 ZXJvLDIwKHMwKQoKNzQxCQlpb2gtPmRpc3RpbGxlZF9yZXN1bHQuc3RhdHVzID0gUEdBSU9f UlNfVU5LTk9XTjsKICAgMHgwMDAwMDAwMDAwNDM2N2YwIDwrNDUwPjoJbHd1CWExLDg0KHMw KQogICAweDAwMDAwMDAwMDA0MzY4MDAgPCs0NjY+OglhbmRpCWExLGExLC00NDkKICAgMHgw MDAwMDAwMDAwNDM2ODA0IDwrNDcwPjoJc3cJYTEsODQoczApCgo3NDIJCjc0MwkJLyoKNzQ0 CQkgKiBXZSBwdXNoIHRoZSBJTyB0byB0aGUgaGVhZCBvZiB0aGUgaWRsZSBJTyBsaXN0LCB0 aGF0IHNlZW1zIG1vcmUgY2FjaGUKNzQ1CQkgKiBlZmZpY2llbnQgaW4gY2FzZXMgd2hlcmUg b25seSBhIGZldyBJT3MgYXJlIHVzZWQuCjc0NgkJICovCjc0NwkJZGNsaXN0X3B1c2hfaGVh ZCgmcGdhaW9fbXlfYmFja2VuZC0+aWRsZV9pb3MsICZpb2gtPm5vZGUpOwogICAweDAwMDAw MDAwMDA0MzY3ZjggPCs0NTg+OglsZAlhMCwtMTM5MChzMSkKICAgMHgwMDAwMDAwMDAwNDM2 ODA4IDwrNDc0PjoJYWRkaQlhMixhMCw4CiAgIDB4MDAwMDAwMDAwMDQzNjgwYyA8KzQ3OD46 CWFkZGkJYTEsczAsMjQKCjc0OAkKNzQ5CQlSRVNVTUVfSU5URVJSVVBUUygpOwogICAweDAw MDAwMDAwMDA0MzY4MmUgPCs1MTI+OglsdwlhMCwwKHMyKQogICAweDAwMDAwMDAwMDA0MzY4 MzIgPCs1MTY+OgliZXF6CWEwLDB4NDM2OGJlIDxwZ2Fpb19pb19yZWNsYWltKzY1Nj4KICAg MHgwMDAwMDAwMDAwNDM2ODM0IDwrNTE4PjoJbHcJYTAsMChzMikKICAgMHgwMDAwMDAwMDAw NDM2ODM4IDwrNTIyPjoJYWRkaQlhMCxhMCwtMQogICAweDAwMDAwMDAwMDA0MzY4M2EgPCs1 MjQ+OglzdwlhMCwwKHMyKQogICAweDAwMDAwMDAwMDA0MzY4M2UgPCs1Mjg+OglsZAlyYSw1 NihzcCkKICAgMHgwMDAwMDAwMDAwNDM2ODQwIDwrNTMwPjoJbGQJczAsNDgoc3ApCiAgIDB4 MDAwMDAwMDAwMDQzNjg0MiA8KzUzMj46CWxkCXMxLDQwKHNwKQogICAweDAwMDAwMDAwMDA0 MzY4NDQgPCs1MzQ+OglsZAlzMiwzMihzcCkKICAgMHgwMDAwMDAwMDAwNDM2ODQ2IDwrNTM2 PjoJbGQJczMsMjQoc3ApCiAgIDB4MDAwMDAwMDAwMDQzNjg0OCA8KzUzOD46CWxkCXM0LDE2 KHNwKQogICAweDAwMDAwMDAwMDA0MzY4YmUgPCs2NTY+OglhdWlwYwlhMCwweDFjZAogICAw eDAwMDAwMDAwMDA0MzY4YzIgPCs2NjA+OglhZGRpCWEwLGEwLC03MTYgIyAweDYwMzVmMgog ICAweDAwMDAwMDAwMDA0MzY4YzYgPCs2NjQ+OglhdWlwYwlhMSwweDI0MgogICAweDAwMDAw MDAwMDA0MzY4Y2EgPCs2Njg+OglhZGRpCWExLGExLC03MTMgIyAweDY3ODVmZAogICAweDAw MDAwMDAwMDA0MzY4Y2UgPCs2NzI+OglsaQlhMiw3NDkKICAgMHgwMDAwMDAwMDAwNDM2OGQy IDwrNjc2PjoJYXVpcGMJcmEsMHgxNjAKICAgMHgwMDAwMDAwMDAwNDM2OGQ2IDwrNjgwPjoJ amFscgkxMTgocmEpICMgMHg1OTY5NDggPEV4Y2VwdGlvbmFsQ29uZGl0aW9uPgoKNzUwCX0K ICAgMHgwMDAwMDAwMDAwNDM2ODRhIDwrNTQwPjoJYWRkaQlzcCxzcCw2NAogICAweDAwMDAw MDAwMDA0MzY4NGMgPCs1NDI+OglyZXQKCjc1MQkKNzUyCS8qCjc1MwkgKiBXYWl0IGZvciBh biBJTyBoYW5kbGUgdG8gYmVjb21lIHVzYWJsZS4KNzU0CSAqCjc1NQkgKiBUaGlzIG9ubHkg cmVhbGx5IGlzIHVzZWZ1bCBmb3IgcGdhaW9faW9fYWNxdWlyZSgpLgo3NTYJICovCjc1Nwlz dGF0aWMgdm9pZAo3NTgJcGdhaW9faW9fd2FpdF9mb3JfZnJlZSh2b2lkKQo3NTkJewo3NjAJ CWludAkJCXJlY2xhaW1lZCA9IDA7Cjc2MQkKNzYyCQlwZ2Fpb19kZWJ1ZyhERUJVRzIsICJ3 YWl0aW5nIGZvciBmcmVlIElPIHdpdGggJWQgcGVuZGluZywgJXUgaW4tZmxpZ2h0LCAldSBp ZGxlIElPcyIsCjc2MwkJCQkJcGdhaW9fbXlfYmFja2VuZC0+bnVtX3N0YWdlZF9pb3MsCjc2 NAkJCQkJZGNsaXN0X2NvdW50KCZwZ2Fpb19teV9iYWNrZW5kLT5pbl9mbGlnaHRfaW9zKSwK NzY1CQkJCQlkY2xpc3RfY291bnQoJnBnYWlvX215X2JhY2tlbmQtPmlkbGVfaW9zKSk7Cjc2 NgkKNzY3CQkvKgo3NjgJCSAqIEZpcnN0IGNoZWNrIGlmIGFueSBvZiBvdXIgSU9zIGFjdHVh bGx5IGhhdmUgY29tcGxldGVkIC0gd2hlbiB1c2luZwo3NjkJCSAqIHdvcmtlciwgdGhhdCds bCBvZnRlbiBiZSB0aGUgY2FzZS4gV2UgY291bGQgZG8gc28gYXMgcGFydCBvZiB0aGUgbG9v cAo3NzAJCSAqIGJlbG93LCBidXQgdGhhdCdkIHBvdGVudGlhbGx5IGxlYWQgdXMgdG8gd2Fp dCBmb3Igc29tZSBJTyBzdWJtaXR0ZWQKNzcxCQkgKiBiZWZvcmUuCjc3MgkJICovCjc3MwkJ Zm9yIChpbnQgaSA9IDA7IGkgPCBpb19tYXhfY29uY3VycmVuY3k7IGkrKykKNzc0CQl7Cjc3 NQkJCVBnQWlvSGFuZGxlICppb2ggPSAmcGdhaW9fY3RsLT5pb19oYW5kbGVzW3BnYWlvX215 X2JhY2tlbmQtPmlvX2hhbmRsZV9vZmYgKyBpXTsKNzc2CQo3NzcJCQlpZiAoaW9oLT5zdGF0 ZSA9PSBQR0FJT19IU19DT01QTEVURURfU0hBUkVEKQo3NzgJCQl7Cjc3OQkJCQkvKgo3ODAJ CQkJICogTm90ZSB0aGF0IG5vIGludGVycnVwdHMgYXJlIHByb2Nlc3NlZCBiZXR3ZWVuIHRo ZSBzdGF0ZSBjaGVjawo3ODEJCQkJICogYW5kIHRoZSBjYWxsIHRvIHJlY2xhaW0gLSB0aGF0 J3MgaW1wb3J0YW50IGFzIG90aGVyd2lzZSBhbgo3ODIJCQkJICogaW50ZXJydXB0IGNvdWxk IGhhdmUgYWxyZWFkeSByZWNsYWltZWQgdGhlIGhhbmRsZS4KNzgzCQkJCSAqCjc4NAkJCQkg KiBOZWVkIHRvIGVuc3VyZSB0aGF0IHRoZXJlJ3Mgbm8gcmVvcmRlcmluZywgaW4gdGhlIG1v cmUgY29tbW9uCjc4NQkJCQkgKiBwYXRocywgd2hlcmUgd2Ugd2FpdCBmb3IgSU8sIHRoYXQn cyBkb25lIGJ5Cjc4NgkJCQkgKiBwZ2Fpb19pb193YXNfcmVjeWNsZWQoKS4KNzg3CQkJCSAq Lwo3ODgJCQkJcGdfcmVhZF9iYXJyaWVyKCk7Cjc4OQkJCQlwZ2Fpb19pb19yZWNsYWltKGlv aCk7Cjc5MAkJCQlyZWNsYWltZWQrKzsKNzkxCQkJfQo3OTIJCX0KNzkzCQo3OTQJCWlmIChy ZWNsYWltZWQgPiAwKQo3OTUJCQlyZXR1cm47Cjc5NgkKNzk3CQkvKgo3OTgJCSAqIElmIHdl IGhhdmUgYW55IHVuc3VibWl0dGVkIElPcywgc3VibWl0IHRoZW0gbm93LiBXZSdsbCBzdGFy dCB3YWl0aW5nIGluCjc5OQkJICogYSBzZWNvbmQsIHNvIGl0J3MgYmV0dGVyIHRoZXkncmUg aW4gZmxpZ2h0LiBUaGlzIGFsc28gYWRkcmVzc2VzIHRoZQo4MDAJCSAqIGVkZ2UtY2FzZSB0 aGF0IGFsbCBJT3MgYXJlIHVuc3VibWl0dGVkLgo4MDEJCSAqLwo4MDIJCWlmIChwZ2Fpb19t eV9iYWNrZW5kLT5udW1fc3RhZ2VkX2lvcyA+IDApCjgwMwkJCXBnYWlvX3N1Ym1pdF9zdGFn ZWQoKTsKODA0CQo4MDUJCS8qIHBvc3NpYmx5IHNvbWUgSU9zIGZpbmlzaGVkIGR1cmluZyBz dWJtaXNzaW9uICovCjgwNgkJaWYgKCFkY2xpc3RfaXNfZW1wdHkoJnBnYWlvX215X2JhY2tl bmQtPmlkbGVfaW9zKSkKODA3CQkJcmV0dXJuOwo4MDgJCjgwOQkJaWYgKGRjbGlzdF9jb3Vu dCgmcGdhaW9fbXlfYmFja2VuZC0+aW5fZmxpZ2h0X2lvcykgPT0gMCkKODEwCQkJZXJlcG9y dChFUlJPUiwKODExCQkJCQllcnJtc2dfaW50ZXJuYWwoIm5vIGZyZWUgSU9zIGRlc3BpdGUg bm8gaW4tZmxpZ2h0IElPcyIpLAo4MTIJCQkJCWVycmRldGFpbF9pbnRlcm5hbCgiJWQgcGVu ZGluZywgJXUgaW4tZmxpZ2h0LCAldSBpZGxlIElPcyIsCjgxMwkJCQkJCQkJCSAgIHBnYWlv X215X2JhY2tlbmQtPm51bV9zdGFnZWRfaW9zLAo4MTQJCQkJCQkJCQkgICBkY2xpc3RfY291 bnQoJnBnYWlvX215X2JhY2tlbmQtPmluX2ZsaWdodF9pb3MpLAo4MTUJCQkJCQkJCQkgICBk Y2xpc3RfY291bnQoJnBnYWlvX215X2JhY2tlbmQtPmlkbGVfaW9zKSkpOwo4MTYJCjgxNwkJ LyoKODE4CQkgKiBXYWl0IGZvciB0aGUgb2xkZXN0IGluLWZsaWdodCBJTyB0byBjb21wbGV0 ZS4KODE5CQkgKgo4MjAJCSAqIFhYWDogUmV1c2luZyB0aGUgZ2VuZXJhbCBJTyB3YWl0IGlz IHN1Ym9wdGltYWwsIHdlIGRvbid0IG5lZWQgdG8gd2FpdAo4MjEJCSAqIGZvciB0aGF0IHNw ZWNpZmljIElPIHRvIGNvbXBsZXRlLCB3ZSBqdXN0IG5lZWQgKmFueSogSU8gdG8gY29tcGxl dGUuCjgyMgkJICovCjgyMwkJewo4MjQJCQlQZ0Fpb0hhbmRsZSAqaW9oID0gZGNsaXN0X2hl YWRfZWxlbWVudChQZ0Fpb0hhbmRsZSwgbm9kZSwKODI1CQkJCQkJCQkJCQkJICAgJnBnYWlv X215X2JhY2tlbmQtPmluX2ZsaWdodF9pb3MpOwo4MjYJCQl1aW50NjQJCWdlbmVyYXRpb24g PSBpb2gtPmdlbmVyYXRpb247CjgyNwkKODI4CQkJc3dpdGNoICgoUGdBaW9IYW5kbGVTdGF0 ZSkgaW9oLT5zdGF0ZSkKODI5CQkJewo4MzAJCQkJCS8qIHNob3VsZCBub3QgYmUgaW4gaW4t ZmxpZ2h0IGxpc3QgKi8KODMxCQkJCWNhc2UgUEdBSU9fSFNfSURMRToKODMyCQkJCWNhc2Ug UEdBSU9fSFNfREVGSU5FRDoKODMzCQkJCWNhc2UgUEdBSU9fSFNfSEFOREVEX09VVDoKODM0 CQkJCWNhc2UgUEdBSU9fSFNfU1RBR0VEOgo4MzUJCQkJY2FzZSBQR0FJT19IU19DT01QTEVU RURfTE9DQUw6CjgzNgkJCQkJZWxvZyhFUlJPUiwgInNob3VsZG4ndCBnZXQgaGVyZSB3aXRo IGlvOiVkIGluIHN0YXRlICVkIiwKODM3CQkJCQkJIHBnYWlvX2lvX2dldF9pZChpb2gpLCBp b2gtPnN0YXRlKTsKODM4CQkJCQlicmVhazsKODM5CQo4NDAJCQkJY2FzZSBQR0FJT19IU19D T01QTEVURURfSU86Cjg0MQkJCQljYXNlIFBHQUlPX0hTX1NVQk1JVFRFRDoKODQyCQkJCQlw Z2Fpb19kZWJ1Z19pbyhERUJVRzIsIGlvaCwKODQzCQkJCQkJCQkgICAid2FpdGluZyBmb3Ig ZnJlZSBpbyB3aXRoICV1IGluIGZsaWdodCIsCjg0NAkJCQkJCQkJICAgZGNsaXN0X2NvdW50 KCZwZ2Fpb19teV9iYWNrZW5kLT5pbl9mbGlnaHRfaW9zKSk7Cjg0NQkKODQ2CQkJCQkvKgo4 NDcJCQkJCSAqIEluIGEgbW9yZSBnZW5lcmFsIGNhc2UgdGhpcyB3b3VsZCBiZSByYWN5LCBi ZWNhdXNlIHRoZQo4NDgJCQkJCSAqIGdlbmVyYXRpb24gY291bGQgaW5jcmVhc2UgYWZ0ZXIg d2UgcmVhZCBpb2gtPnN0YXRlIGFib3ZlLgo4NDkJCQkJCSAqIEJ1dCB3ZSBhcmUgb25seSBs b29raW5nIGF0IElPcyBieSB0aGUgY3VycmVudCBiYWNrZW5kIGFuZAo4NTAJCQkJCSAqIHRo ZSBJTyBjYW4gb25seSBiZSByZWN5Y2xlZCBieSB0aGlzIGJhY2tlbmQuICBFdmVuIHRoaXMg aXMKODUxCQkJCQkgKiBvbmx5IE9LIGJlY2F1c2Ugd2UgZ2V0IHRoZSBoYW5kbGUncyBnZW5l cmF0aW9uIGJlZm9yZQo4NTIJCQkJCSAqIHBvdGVudGlhbGx5IHByb2Nlc3NpbmcgaW50ZXJy dXB0cywgZS5nLiBhcyBwYXJ0IG9mCjg1MwkJCQkJICogcGdhaW9fZGVidWdfaW8oKS4KODU0 CQkJCQkgKi8KODU1CQkJCQlwZ2Fpb19pb193YWl0KGlvaCwgZ2VuZXJhdGlvbik7Cjg1NgkJ CQkJYnJlYWs7Cjg1NwkKODU4CQkJCWNhc2UgUEdBSU9fSFNfQ09NUExFVEVEX1NIQVJFRDoK ODU5CQo4NjAJCQkJCS8qCjg2MQkJCQkJICogSXQncyBwb3NzaWJsZSB0aGF0IGFub3RoZXIg YmFja2VuZCBqdXN0IGZpbmlzaGVkIHRoaXMgSU8uCjg2MgkJCQkJICoKODYzCQkJCQkgKiBO b3RlIHRoYXQgbm8gaW50ZXJydXB0cyBhcmUgcHJvY2Vzc2VkIGJldHdlZW4gdGhlIHN0YXRl Cjg2NAkJCQkJICogY2hlY2sgYW5kIHRoZSBjYWxsIHRvIHJlY2xhaW0gLSB0aGF0J3MgaW1w b3J0YW50IGFzCjg2NQkJCQkJICogb3RoZXJ3aXNlIGFuIGludGVycnVwdCBjb3VsZCBoYXZl IGFscmVhZHkgcmVjbGFpbWVkIHRoZQo4NjYJCQkJCSAqIGhhbmRsZS4KODY3CQkJCQkgKgo4 NjgJCQkJCSAqIE5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlcmUncyBubyByZW9yZGVyaW5nLCBp biB0aGUgbW9yZQo4NjkJCQkJCSAqIGNvbW1vbiBwYXRocywgd2hlcmUgd2Ugd2FpdCBmb3Ig SU8sIHRoYXQncyBkb25lIGJ5Cjg3MAkJCQkJICogcGdhaW9faW9fd2FzX3JlY3ljbGVkKCku Cjg3MQkJCQkJICovCjg3MgkJCQkJcGdfcmVhZF9iYXJyaWVyKCk7Cjg3MwkJCQkJcGdhaW9f aW9fcmVjbGFpbShpb2gpOwo4NzQJCQkJCWJyZWFrOwo4NzUJCQl9Cjg3NgkKODc3CQkJaWYg KGRjbGlzdF9jb3VudCgmcGdhaW9fbXlfYmFja2VuZC0+aWRsZV9pb3MpID09IDApCjg3OAkJ CQllbG9nKFBBTklDLCAibm8gaWRsZSBJTyBhZnRlciB3YWl0aW5nIGZvciBJTyB0byB0ZXJt aW5hdGUiKTsKODc5CQkJcmV0dXJuOwo4ODAJCX0KODgxCX0KODgyCQo4ODMJLyoKODg0CSAq IEludGVybmFsIC0gY29kZSBvdXRzaWRlIG9mIEFJTyBzaG91bGQgbmV2ZXIgbmVlZCB0aGlz IGFuZCBpdCdkIGJlIGhhcmQgZm9yCjg4NQkgKiBzdWNoIGNvZGUgdG8gYmUgc2FmZS4KODg2 CSAqLwo4ODcJc3RhdGljIFBnQWlvSGFuZGxlICoKODg4CXBnYWlvX2lvX2Zyb21fd3JlZihQ Z0Fpb1dhaXRSZWYgKmlvdywgdWludDY0ICpyZWZfZ2VuZXJhdGlvbikKODg5CXsKODkwCQlQ Z0Fpb0hhbmRsZSAqaW9oOwo4OTEJCjg5MgkJQXNzZXJ0KGlvdy0+YWlvX2luZGV4IDwgcGdh aW9fY3RsLT5pb19oYW5kbGVfY291bnQpOwo4OTMJCjg5NAkJaW9oID0gJnBnYWlvX2N0bC0+ aW9faGFuZGxlc1tpb3ctPmFpb19pbmRleF07Cjg5NQkKODk2CQkqcmVmX2dlbmVyYXRpb24g PSAoKHVpbnQ2NCkgaW93LT5nZW5lcmF0aW9uX3VwcGVyKSA8PCAzMiB8Cjg5NwkJCWlvdy0+ Z2VuZXJhdGlvbl9sb3dlcjsKODk4CQo4OTkJCUFzc2VydCgqcmVmX2dlbmVyYXRpb24gIT0g MCk7CjkwMAkKOTAxCQlyZXR1cm4gaW9oOwo5MDIJfQo5MDMJCjkwNAlzdGF0aWMgY29uc3Qg Y2hhciAqCjkwNQlwZ2Fpb19pb19zdGF0ZV9nZXRfbmFtZShQZ0Fpb0hhbmRsZVN0YXRlIHMp CjkwNgl7CjkwNwkjZGVmaW5lIFBHQUlPX0hTX1RPU1RSX0NBU0Uoc3ltKSBjYXNlIFBHQUlP X0hTXyMjc3ltOiByZXR1cm4gI3N5bQo5MDgJCXN3aXRjaCAoKFBnQWlvSGFuZGxlU3RhdGUp IHMpCiAgIDB4MDAwMDAwMDAwMDQzNjcxNCA8KzIzMD46CWJsdHUJYTIsYTEsMHg0MzY3Mjgg PHBnYWlvX2lvX3JlY2xhaW0rMjUwPgogICAweDAwMDAwMDAwMDA0MzY3MTggPCsyMzQ+Oglz bGxpCWExLGExLDB4MwogICAweDAwMDAwMDAwMDA0MzY3MWEgPCsyMzY+OglhdWlwYwlhMCww eDQ4NQogICAweDAwMDAwMDAwMDA0MzY3MWUgPCsyNDA+OglhZGRpCWEwLGEwLC0xMTA2ICMg MHg4YmIyYzgKICAgMHgwMDAwMDAwMDAwNDM2NzIyIDwrMjQ0PjoJYWRkCWEwLGEwLGExCiAg IDB4MDAwMDAwMDAwMDQzNjcyNCA8KzI0Nj46CWxkCWE0LDAoYTApCiAgIDB4MDAwMDAwMDAw MDQzNjcyNiA8KzI0OD46CWoJMHg0MzY3MmEgPHBnYWlvX2lvX3JlY2xhaW0rMjUyPgogICAw eDAwMDAwMDAwMDA0MzY3MjggPCsyNTA+OglsaQlhNCwwCgo5MDkJCXsKOTEwCQkJCVBHQUlP X0hTX1RPU1RSX0NBU0UoSURMRSk7CjkxMQkJCQlQR0FJT19IU19UT1NUUl9DQVNFKEhBTkRF RF9PVVQpOwo5MTIJCQkJUEdBSU9fSFNfVE9TVFJfQ0FTRShERUZJTkVEKTsKOTEzCQkJCVBH QUlPX0hTX1RPU1RSX0NBU0UoU1RBR0VEKTsKOTE0CQkJCVBHQUlPX0hTX1RPU1RSX0NBU0Uo U1VCTUlUVEVEKTsKOTE1CQkJCVBHQUlPX0hTX1RPU1RSX0NBU0UoQ09NUExFVEVEX0lPKTsK OTE2CQkJCVBHQUlPX0hTX1RPU1RSX0NBU0UoQ09NUExFVEVEX1NIQVJFRCk7CjkxNwkJCQlQ R0FJT19IU19UT1NUUl9DQVNFKENPTVBMRVRFRF9MT0NBTCk7CjkxOAkJfQo5MTkJI3VuZGVm IFBHQUlPX0hTX1RPU1RSX0NBU0UKOTIwCQo5MjEJCXJldHVybiBOVUxMOwkJCQkvKiBzaWxl bmNlIGNvbXBpbGVyICovCjkyMgl9CjkyMwkKOTI0CWNvbnN0IGNoYXIgKgo5MjUJcGdhaW9f aW9fZ2V0X3N0YXRlX25hbWUoUGdBaW9IYW5kbGUgKmlvaCkKOTI2CXsKOTI3CQlyZXR1cm4g cGdhaW9faW9fc3RhdGVfZ2V0X25hbWUoaW9oLT5zdGF0ZSk7CiAgIDB4MDAwMDAwMDAwMDQz NjcwYyA8KzIyMj46CWxidQlhMSwwKHMwKQogICAweDAwMDAwMDAwMDA0MzY3MTAgPCsyMjY+ OglsaQlhMiw3Cgo5MjgJfQo5MjkJCjkzMAljb25zdCBjaGFyICoKOTMxCXBnYWlvX3Jlc3Vs dF9zdGF0dXNfc3RyaW5nKFBnQWlvUmVzdWx0U3RhdHVzIHJzKQo5MzIJewo5MzMJCXN3aXRj aCAoKFBnQWlvUmVzdWx0U3RhdHVzKSBycykKICAgMHgwMDAwMDAwMDAwNDM2NzM4IDwrMjY2 PjoJYmx0dQlhNSxhMiwweDQzNjc0YyA8cGdhaW9faW9fcmVjbGFpbSsyODY+CiAgIDB4MDAw MDAwMDAwMDQzNjczYyA8KzI3MD46CXNsbGkJYTIsYTIsMHgzCiAgIDB4MDAwMDAwMDAwMDQz NjczZSA8KzI3Mj46CWF1aXBjCWE1LDB4NDg1CiAgIDB4MDAwMDAwMDAwMDQzNjc0MiA8KzI3 Nj46CWFkZGkJYTUsYTUsLTExODIgIyAweDhiYjJhMAogICAweDAwMDAwMDAwMDA0MzY3NDYg PCsyODA+OglhZGQJYTIsYTIsYTUKICAgMHgwMDAwMDAwMDAwNDM2NzQ4IDwrMjgyPjoJbGQJ YTUsMChhMikKICAgMHgwMDAwMDAwMDAwNDM2NzRhIDwrMjg0PjoJagkweDQzNjc0ZSA8cGdh aW9faW9fcmVjbGFpbSsyODg+CiAgIDB4MDAwMDAwMDAwMDQzNjc0YyA8KzI4Nj46CWxpCWE1 LDAKCkVuZCBvZiBhc3NlbWJsZXIgZHVtcC4KKGdkYikg --------------4aRSnycNgAxKLMaGM9RUerb7 Content-Type: text/plain; charset=UTF-8; name="pgaio_io_update_state.asm" Content-Disposition: attachment; filename="pgaio_io_update_state.asm" Content-Transfer-Encoding: base64 R05VIGdkYiAoRGViaWFuIDE1LjItMSkgMTUuMgpDb3B5cmlnaHQgKEMpIDIwMjQgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkxpY2Vuc2UgR1BMdjMrOiBHTlUgR1BMIHZlcnNp b24gMyBvciBsYXRlciA8aHR0cDovL2dudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWw+ClRoaXMg aXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmli dXRlIGl0LgpUaGVyZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQg YnkgbGF3LgpUeXBlICJzaG93IGNvcHlpbmciIGFuZCAic2hvdyB3YXJyYW50eSIgZm9yIGRl dGFpbHMuClRoaXMgR0RCIHdhcyBjb25maWd1cmVkIGFzICJyaXNjdjY0LWxpbnV4LWdudSIu ClR5cGUgInNob3cgY29uZmlndXJhdGlvbiIgZm9yIGNvbmZpZ3VyYXRpb24gZGV0YWlscy4K Rm9yIGJ1ZyByZXBvcnRpbmcgaW5zdHJ1Y3Rpb25zLCBwbGVhc2Ugc2VlOgo8aHR0cHM6Ly93 d3cuZ251Lm9yZy9zb2Z0d2FyZS9nZGIvYnVncy8+LgpGaW5kIHRoZSBHREIgbWFudWFsIGFu ZCBvdGhlciBkb2N1bWVudGF0aW9uIHJlc291cmNlcyBvbmxpbmUgYXQ6CiAgICA8aHR0cDov L3d3dy5nbnUub3JnL3NvZnR3YXJlL2dkYi9kb2N1bWVudGF0aW9uLz4uCgpGb3IgaGVscCwg dHlwZSAiaGVscCIuClR5cGUgImFwcm9wb3Mgd29yZCIgdG8gc2VhcmNoIGZvciBjb21tYW5k cyByZWxhdGVkIHRvICJ3b3JkIi4uLgpSZWFkaW5nIHN5bWJvbHMgZnJvbSB0bXBfaW5zdGFs bC91c3IvbG9jYWwvcGdzcWwvYmluL3Bvc3RncmVzLi4uCihnZGIpIER1bXAgb2YgYXNzZW1i bGVyIGNvZGUgZm9yIGZ1bmN0aW9uIHBnYWlvX2lvX3VwZGF0ZV9zdGF0ZToKMzQxCQlBc3Nl cnQoaW9oID49IHBnYWlvX2N0bC0+aW9faGFuZGxlcyAmJgogICAweDAwMDAwMDAwMDA0MzY0 OTAgPCs5MD46CWF1aXBjCWEwLDB4NGMzCiAgIDB4MDAwMDAwMDAwMDQzNjQ5NCA8Kzk0PjoJ bGQJYTEsLTYxNihhMCkgIyAweDhmOTIyOCA8cGdhaW9fY3RsPgogICAweDAwMDAwMDAwMDA0 MzY0OTggPCs5OD46CWxkCWEwLDQ4KGExKQogICAweDAwMDAwMDAwMDA0MzY0OWEgPCsxMDA+ OglibHR1CXMxLGEwLDB4NDM2NTUyIDxwZ2Fpb19pb191cGRhdGVfc3RhdGUrMjg0PgogICAw eDAwMDAwMDAwMDA0MzY0OWUgPCsxMDQ+Oglsd3UJYTEsNDAoYTEpCiAgIDB4MDAwMDAwMDAw MDQzNjRhMiA8KzEwOD46CWxpCWEyLDE0NAogICAweDAwMDAwMDAwMDA0MzY0YTYgPCsxMTI+ OgltdWwJYTEsYTEsYTIKICAgMHgwMDAwMDAwMDAwNDM2NGFhIDwrMTE2PjoJYWRkCWExLGEx LGEwCiAgIDB4MDAwMDAwMDAwMDQzNjRhYyA8KzExOD46CWJnZXUJczEsYTEsMHg0MzY1NTIg PHBnYWlvX2lvX3VwZGF0ZV9zdGF0ZSsyODQ+CiAgIDB4MDAwMDAwMDAwMDQzNjRiMCA8KzEy Mj46CWF1aXBjCWExLDB4NGMxCiAgIDB4MDAwMDAwMDAwMDQzNjRiNCA8KzEyNj46CWxkCXMz LDI4MChhMSkgIyAweDhmNzVjOAogICAweDAwMDAwMDAwMDA0MzY1NTIgPCsyODQ+OglhdWlw YwlhMCwweDI0MgogICAweDAwMDAwMDAwMDA0MzY1NTYgPCsyODg+OglhZGRpCWEwLGEwLDU0 OSAjIDB4Njc4Nzc3CiAgIDB4MDAwMDAwMDAwMDQzNjU1YSA8KzI5Mj46CWF1aXBjCWExLDB4 MjQyCiAgIDB4MDAwMDAwMDAwMDQzNjU1ZSA8KzI5Nj46CWFkZGkJYTEsYTEsMTYzICMgMHg2 Nzg1ZmQKICAgMHgwMDAwMDAwMDAwNDM2NTYyIDwrMzAwPjoJbGkJYTIsMzQyCiAgIDB4MDAw MDAwMDAwMDQzNjU2NiA8KzMwND46CWF1aXBjCXJhLDB4MTYwCiAgIDB4MDAwMDAwMDAwMDQz NjU2YSA8KzMwOD46CWphbHIJOTk0KHJhKSAjIDB4NTk2OTQ4IDxFeGNlcHRpb25hbENvbmRp dGlvbj4KCjM0MgkJCSAgIGlvaCA8IChwZ2Fpb19jdGwtPmlvX2hhbmRsZXMgKyBwZ2Fpb19j dGwtPmlvX2hhbmRsZV9jb3VudCkpOwozNDMJCXJldHVybiBpb2ggLSBwZ2Fpb19jdGwtPmlv X2hhbmRsZXM7CiAgIDB4MDAwMDAwMDAwMDQzNjRiOCA8KzEzMD46CXN1YglzMCxzMSxhMAog ICAweDAwMDAwMDAwMDA0MzY0YmMgPCsxMzQ+OglzcmFpCXMwLHMwLDB4NAoKMzQ0CX0KMzQ1 CQozNDYJLyoKMzQ3CSAqIFJldHVybiB0aGUgUHJvY051bWJlciBmb3IgdGhlIHByb2Nlc3Mg dGhhdCBjYW4gdXNlIGFuIElPIGhhbmRsZS4gVGhlCjM0OAkgKiBtYXBwaW5nIGZyb20gSU8g aGFuZGxlcyB0byBQR1BST0NzIGlzIHN0YXRpYywgdGhlcmVmb3JlIHRoaXMgZXZlbiB3b3Jr cwozNDkJICogd2hlbiB0aGUgY29ycmVzcG9uZGluZyBQR1BST0MgaXMgbm90IGluIHVzZS4K MzUwCSAqLwozNTEJUHJvY051bWJlcgozNTIJcGdhaW9faW9fZ2V0X293bmVyKFBnQWlvSGFu ZGxlICppb2gpCjM1Mwl7CjM1NAkJcmV0dXJuIGlvaC0+b3duZXJfcHJvY25vOwozNTUJfQoz NTYJCjM1NwkvKgozNTgJICogUmV0dXJuIGEgd2FpdCByZWZlcmVuY2UgZm9yIHRoZSBJTy4g T25seSB3YWl0IHJlZmVyZW5jZXMgY2FuIGJlIHVzZWQgdG8KMzU5CSAqIHdhaXQgZm9yIGFu IElPcyBjb21wbGV0aW9uLCBhcyBoYW5kbGVzIHRoZW1zZWx2ZXMgY2FuIGJlIHJldXNlZCBh ZnRlcgozNjAJICogY29tcGxldGlvbi4gIFNlZSBhbHNvIHRoZSBjb21tZW50IGFib3ZlIHBn YWlvX2lvX2FjcXVpcmUoKS4KMzYxCSAqLwozNjIJdm9pZAozNjMJcGdhaW9faW9fZ2V0X3dy ZWYoUGdBaW9IYW5kbGUgKmlvaCwgUGdBaW9XYWl0UmVmICppb3cpCjM2NAl7CjM2NQkJQXNz ZXJ0KGlvaC0+c3RhdGUgPT0gUEdBSU9fSFNfSEFOREVEX09VVCB8fAozNjYJCQkgICBpb2gt PnN0YXRlID09IFBHQUlPX0hTX0RFRklORUQgfHwKMzY3CQkJICAgaW9oLT5zdGF0ZSA9PSBQ R0FJT19IU19TVEFHRUQpOwozNjgJCUFzc2VydChpb2gtPmdlbmVyYXRpb24gIT0gMCk7CjM2 OQkKMzcwCQlpb3ctPmFpb19pbmRleCA9IGlvaCAtIHBnYWlvX2N0bC0+aW9faGFuZGxlczsK MzcxCQlpb3ctPmdlbmVyYXRpb25fdXBwZXIgPSAodWludDMyKSAoaW9oLT5nZW5lcmF0aW9u ID4+IDMyKTsKMzcyCQlpb3ctPmdlbmVyYXRpb25fbG93ZXIgPSAodWludDMyKSBpb2gtPmdl bmVyYXRpb247CjM3Mwl9CjM3NAkKMzc1CQozNzYJCjM3NwkvKiAtLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLQozNzgJICogSW50ZXJuYWwgRnVuY3Rpb25zIHJlbGF0ZWQgdG8gUGdBaW9I YW5kbGUKMzc5CSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCjM4MAkgKi8KMzgxCQoz ODIJc3RhdGljIGlubGluZSB2b2lkCjM4MwlwZ2Fpb19pb191cGRhdGVfc3RhdGUoUGdBaW9I YW5kbGUgKmlvaCwgUGdBaW9IYW5kbGVTdGF0ZSBuZXdfc3RhdGUpCjM4NAl7CiAgIDB4MDAw MDAwMDAwMDQzNjQzNiA8KzA+OglhZGRpCXNwLHNwLC00OAogICAweDAwMDAwMDAwMDA0MzY0 MzggPCsyPjoJc2QJcmEsNDAoc3ApCiAgIDB4MDAwMDAwMDAwMDQzNjQzYSA8KzQ+OglzZAlz MCwzMihzcCkKICAgMHgwMDAwMDAwMDAwNDM2NDNjIDwrNj46CXNkCXMxLDI0KHNwKQogICAw eDAwMDAwMDAwMDA0MzY0M2UgPCs4PjoJc2QJczIsMTYoc3ApCiAgIDB4MDAwMDAwMDAwMDQz NjQ0MCA8KzEwPjoJc2QJczMsOChzcCkKICAgMHgwMDAwMDAwMDAwNDM2NDQyIDwrMTI+Oglz ZAlzNCwwKHNwKQoKMzg1CQkvKgozODYJCSAqIEFsbCBjYWxsZXJzIG5lZWQgdG8gaGF2ZSBo ZWxkIGludGVycnVwdHMgaW4gc29tZSBmb3JtLCBvdGhlcndpc2UKMzg3CQkgKiBpbnRlcnJ1 cHQgcHJvY2Vzc2luZyBjb3VsZCB3YWl0IGZvciB0aGUgSU8gdG8gY29tcGxldGUsIHdoaWxl IGluIGFuCjM4OAkJICogaW50ZXJtZWRpYXJ5IHN0YXRlLgozODkJCSAqLwozOTAJCUFzc2Vy dCghSU5URVJSVVBUU19DQU5fQkVfUFJPQ0VTU0VEKCkpOwogICAweDAwMDAwMDAwMDA0MzY0 NDQgPCsxND46CWF1aXBjCWEyLDB4NGE2CiAgIDB4MDAwMDAwMDAwMDQzNjQ0OCA8KzE4PjoJ bGQJYTIsNTY0KGEyKSAjIDB4OGRjNjc4CiAgIDB4MDAwMDAwMDAwMDQzNjQ0YyA8KzIyPjoJ bHcJYTIsMChhMikKICAgMHgwMDAwMDAwMDAwNDM2NDRlIDwrMjQ+OgltdglzNCxhMQogICAw eDAwMDAwMDAwMDA0MzY0NTAgPCsyNj46CW12CXMxLGEwCiAgIDB4MDAwMDAwMDAwMDQzNjQ1 MiA8KzI4PjoJYm5leglhMiwweDQzNjQ2ZSA8cGdhaW9faW9fdXBkYXRlX3N0YXRlKzU2Pgog ICAweDAwMDAwMDAwMDA0MzY0NTQgPCszMD46CWF1aXBjCWEwLDB4NGE2CiAgIDB4MDAwMDAw MDAwMDQzNjQ1OCA8KzM0PjoJbGQJYTAsNTA4KGEwKSAjIDB4OGRjNjUwCiAgIDB4MDAwMDAw MDAwMDQzNjQ1YyA8KzM4PjoJbHcJYTAsMChhMCkKICAgMHgwMDAwMDAwMDAwNDM2NDVlIDwr NDA+OglibmV6CWEwLDB4NDM2NDZlIDxwZ2Fpb19pb191cGRhdGVfc3RhdGUrNTY+CiAgIDB4 MDAwMDAwMDAwMDQzNjQ2MCA8KzQyPjoJYXVpcGMJYTAsMHg0YTYKICAgMHgwMDAwMDAwMDAw NDM2NDY0IDwrNDY+OglsZAlhMCwtMTYxNihhMCkgIyAweDhkYmUxMAogICAweDAwMDAwMDAw MDA0MzY0NjggPCs1MD46CWx3CWEwLDAoYTApCiAgIDB4MDAwMDAwMDAwMDQzNjQ2YSA8KzUy PjoJYmVxeglhMCwweDQzNjU2ZSA8cGdhaW9faW9fdXBkYXRlX3N0YXRlKzMxMj4KICAgMHgw MDAwMDAwMDAwNDM2NTZlIDwrMzEyPjoJYXVpcGMJYTAsMHgyNDIKICAgMHgwMDAwMDAwMDAw NDM2NTcyIDwrMzE2PjoJYWRkaQlhMCxhMCwxNjcwICMgMHg2NzhiZjQKICAgMHgwMDAwMDAw MDAwNDM2NTc2IDwrMzIwPjoJYXVpcGMJYTEsMHgyNDIKICAgMHgwMDAwMDAwMDAwNDM2NTdh IDwrMzI0PjoJYWRkaQlhMSxhMSwxMzUgIyAweDY3ODVmZAogICAweDAwMDAwMDAwMDA0MzY1 N2UgPCszMjg+OglsaQlhMiwzOTAKICAgMHgwMDAwMDAwMDAwNDM2NTgyIDwrMzMyPjoJYXVp cGMJcmEsMHgxNjAKICAgMHgwMDAwMDAwMDAwNDM2NTg2IDwrMzM2PjoJamFscgk5NjYocmEp ICMgMHg1OTY5NDggPEV4Y2VwdGlvbmFsQ29uZGl0aW9uPgoKMzkxCQozOTIJCXBnYWlvX2Rl YnVnX2lvKERFQlVHNSwgaW9oLAogICAweDAwMDAwMDAwMDA0MzY0NmUgPCs1Nj46CWxpCWEw LDEwCiAgIDB4MDAwMDAwMDAwMDQzNjQ3MCA8KzU4PjoJbGkJYTEsMAogICAweDAwMDAwMDAw MDA0MzY0NzIgPCs2MD46CWF1aXBjCXJhLDB4MTYxCiAgIDB4MDAwMDAwMDAwMDQzNjQ3NiA8 KzY0PjoJamFscgktMTIwMChyYSkgIyAweDU5NmZjMiA8ZXJyc3RhcnQ+CiAgIDB4MDAwMDAw MDAwMDQzNjQ3YSA8KzY4PjoJYmVxeglhMCwweDQzNjUzYSA8cGdhaW9faW9fdXBkYXRlX3N0 YXRlKzI2MD4KICAgMHgwMDAwMDAwMDAwNDM2NDdjIDwrNzA+OglsaQlhMCwxCiAgIDB4MDAw MDAwMDAwMDQzNjQ3ZSA8KzcyPjoJYXVpcGMJcmEsMHgxNjMKICAgMHgwMDAwMDAwMDAwNDM2 NDgyIDwrNzY+OglqYWxyCTEyNjQocmEpICMgMHg1OTk5NmUgPGVycmhpZGVzdG10PgogICAw eDAwMDAwMDAwMDA0MzY0ODYgPCs4MD46CWxpCWEwLDEKICAgMHgwMDAwMDAwMDAwNDM2NDg4 IDwrODI+OglhdWlwYwlyYSwweDE2MwogICAweDAwMDAwMDAwMDA0MzY0OGMgPCs4Nj46CWph bHIJMTM1NihyYSkgIyAweDU5OTlkNCA8ZXJyaGlkZWNvbnRleHQ+CiAgIDB4MDAwMDAwMDAw MDQzNjRiZSA8KzEzNj46CW12CWEwLHMxCiAgIDB4MDAwMDAwMDAwMDQzNjRjMCA8KzEzOD46 CWphbAkweDQzOGY5MCA8cGdhaW9faW9fZ2V0X29wX25hbWU+CiAgIDB4MDAwMDAwMDAwMDQz NjRjNCA8KzE0Mj46CW12CXMyLGEwCiAgIDB4MDAwMDAwMDAwMDQzNjRjNiA8KzE0ND46CW12 CWEwLHMxCiAgIDB4MDAwMDAwMDAwMDQzNjRjOCA8KzE0Nj46CWphbAkweDQzOTA3NiA8cGdh aW9faW9fZ2V0X3RhcmdldF9uYW1lPgogICAweDAwMDAwMDAwMDA0MzY0ZDIgPCsxNTY+Oglt dglhMyxhMAogICAweDAwMDAwMDAwMDA0MzY0ZTYgPCsxNzY+OgltdWx3CWExLHMwLHMzCiAg IDB4MDAwMDAwMDAwMDQzNjUwMiA8KzIwND46CW11bHcJYTEsczAsczMKICAgMHgwMDAwMDAw MDAwNDM2NTBjIDwrMjE0PjoJYXVpcGMJYTAsMHgyNDIKICAgMHgwMDAwMDAwMDAwNDM2NTEw IDwrMjE4PjoJYWRkaQlhMCxhMCwxNzk5ICMgMHg2NzhjMTMKICAgMHgwMDAwMDAwMDAwNDM2 NTE0IDwrMjIyPjoJbXYJYTIsczIKICAgMHgwMDAwMDAwMDAwNDM2NTE2IDwrMjI0PjoJYXVp cGMJcmEsMHgxNjEKICAgMHgwMDAwMDAwMDAwNDM2NTFhIDwrMjI4PjoJamFscgktNTIocmEp ICMgMHg1OTc0ZTIgPGVycm1zZ19pbnRlcm5hbD4KICAgMHgwMDAwMDAwMDAwNDM2NTFlIDwr MjMyPjoJYXVpcGMJYTAsMHgyNDIKICAgMHgwMDAwMDAwMDAwNDM2NTIyIDwrMjM2PjoJYWRk aQlhMCxhMCwyMjMgIyAweDY3ODVmZAogICAweDAwMDAwMDAwMDA0MzY1MjYgPCsyNDA+Oglh dWlwYwlhMSwweDI0MgogICAweDAwMDAwMDAwMDA0MzY1MmEgPCsyNDQ+OglhZGRpCWEyLGEx LDE4MzYgIyAweDY3OGM1MgogICAweDAwMDAwMDAwMDA0MzY1MmUgPCsyNDg+OglsaQlhMSwz OTQKICAgMHgwMDAwMDAwMDAwNDM2NTMyIDwrMjUyPjoJYXVpcGMJcmEsMHgxNjEKICAgMHgw MDAwMDAwMDAwNDM2NTM2IDwrMjU2PjoJamFscgktNjk0KHJhKSAjIDB4NTk3MjdjIDxlcnJm aW5pc2g+CgozOTMJCQkJCSAgICJ1cGRhdGluZyBzdGF0ZSB0byAlcyIsCjM5NAkJCQkJICAg cGdhaW9faW9fc3RhdGVfZ2V0X25hbWUobmV3X3N0YXRlKSk7CjM5NQkKMzk2CQkvKgozOTcJ CSAqIEVuc3VyZSB0aGUgY2hhbmdlcyBzaWduaWZpZWQgYnkgdGhlIG5ldyBzdGF0ZSBhcmUg dmlzaWJsZSBiZWZvcmUgdGhlCjM5OAkJICogbmV3IHN0YXRlIGJlY29tZXMgdmlzaWJsZS4K Mzk5CQkgKi8KNDAwCQlwZ19tZW1vcnlfYmFycmllcigpOwogICAweDAwMDAwMDAwMDA0MzY1 M2EgPCsyNjA+OglmZW5jZQlydyxydwoKNDAxCQo0MDIJCWlvaC0+c3RhdGUgPSBuZXdfc3Rh dGU7CiAgIDB4MDAwMDAwMDAwMDQzNjUzZSA8KzI2ND46CXNiCXM0LDAoczEpCiAgIDB4MDAw MDAwMDAwMDQzNjU0MiA8KzI2OD46CWxkCXJhLDQwKHNwKQogICAweDAwMDAwMDAwMDA0MzY1 NDQgPCsyNzA+OglsZAlzMCwzMihzcCkKICAgMHgwMDAwMDAwMDAwNDM2NTQ2IDwrMjcyPjoJ bGQJczEsMjQoc3ApCiAgIDB4MDAwMDAwMDAwMDQzNjU0OCA8KzI3ND46CWxkCXMyLDE2KHNw KQogICAweDAwMDAwMDAwMDA0MzY1NGEgPCsyNzY+OglsZAlzMyw4KHNwKQogICAweDAwMDAw MDAwMDA0MzY1NGMgPCsyNzg+OglsZAlzNCwwKHNwKQoKNDAzCX0KICAgMHgwMDAwMDAwMDAw NDM2NTRlIDwrMjgwPjoJYWRkaQlzcCxzcCw0OAogICAweDAwMDAwMDAwMDA0MzY1NTAgPCsy ODI+OglyZXQKCjQwNAkKNDA1CXN0YXRpYyB2b2lkCjQwNglwZ2Fpb19pb19yZXNvd25lcl9y ZWdpc3RlcihQZ0Fpb0hhbmRsZSAqaW9oKQo0MDcJewo0MDgJCUFzc2VydCghaW9oLT5yZXNv d25lcik7CjQwOQkJQXNzZXJ0KEN1cnJlbnRSZXNvdXJjZU93bmVyKTsKNDEwCQo0MTEJCVJl c291cmNlT3duZXJSZW1lbWJlckFpb0hhbmRsZShDdXJyZW50UmVzb3VyY2VPd25lciwgJmlv aC0+cmVzb3duZXJfbm9kZSk7CjQxMgkJaW9oLT5yZXNvd25lciA9IEN1cnJlbnRSZXNvdXJj ZU93bmVyOwo0MTMJfQo0MTQJCjQxNQkvKgo0MTYJICogU3RhZ2UgSU8gZm9yIGV4ZWN1dGlv biBhbmQsIGlmIGFwcHJvcHJpYXRlLCBzdWJtaXQgaXQgaW1tZWRpYXRlbHkuCjQxNwkgKgo0 MTgJICogU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZyb20gcGdhaW9faW9fc3RhcnRfKigpLgo0 MTkJICovCjQyMAl2b2lkCjQyMQlwZ2Fpb19pb19zdGFnZShQZ0Fpb0hhbmRsZSAqaW9oLCBQ Z0Fpb09wIG9wKQo0MjIJewo0MjMJCWJvb2wJCW5lZWRzX3N5bmNocm9ub3VzOwo0MjQJCjQy NQkJQXNzZXJ0KGlvaC0+c3RhdGUgPT0gUEdBSU9fSFNfSEFOREVEX09VVCk7CjQyNgkJQXNz ZXJ0KHBnYWlvX215X2JhY2tlbmQtPmhhbmRlZF9vdXRfaW8gPT0gaW9oKTsKNDI3CQlBc3Nl cnQocGdhaW9faW9faGFzX3RhcmdldChpb2gpKTsKNDI4CQo0MjkJCS8qCjQzMAkJICogT3Ro ZXJ3aXNlIGFuIGludGVycnVwdCwgaW4gdGhlIG1pZGRsZSBvZiBzdGFnaW5nIGFuZCBwb3Nz aWJseSBleGVjdXRpbmcKNDMxCQkgKiB0aGUgSU8sIGNvdWxkIGVuZCB1cCB0cnlpbmcgdG8g d2FpdCBmb3IgdGhlIElPLCBsZWFkaW5nIHRvIHN0YXRlCjQzMgkJICogY29uZnVzaW9uLgo0 MzMJCSAqLwo0MzQJCUhPTERfSU5URVJSVVBUUygpOwo0MzUJCjQzNgkJaW9oLT5vcCA9IG9w Owo0MzcJCWlvaC0+cmVzdWx0ID0gMDsKNDM4CQo0MzkJCXBnYWlvX2lvX3VwZGF0ZV9zdGF0 ZShpb2gsIFBHQUlPX0hTX0RFRklORUQpOwo0NDAJCjQ0MQkJLyogYWxsb3cgYSBuZXcgSU8g dG8gYmUgc3RhZ2VkICovCjQ0MgkJcGdhaW9fbXlfYmFja2VuZC0+aGFuZGVkX291dF9pbyA9 IE5VTEw7CjQ0MwkKNDQ0CQlwZ2Fpb19pb19jYWxsX3N0YWdlKGlvaCk7CjQ0NQkKNDQ2CQlw Z2Fpb19pb191cGRhdGVfc3RhdGUoaW9oLCBQR0FJT19IU19TVEFHRUQpOwo0NDcJCjQ0OAkJ LyoKNDQ5CQkgKiBTeW5jaHJvbm91cyBleGVjdXRpb24gaGFzIHRvIGJlIGV4ZWN1dGVkLCB3 ZWxsLCBzeW5jaHJvbm91c2x5LCBzbyBjaGVjawo0NTAJCSAqIHRoYXQgZmlyc3QuCjQ1MQkJ ICovCjQ1MgkJbmVlZHNfc3luY2hyb25vdXMgPSBwZ2Fpb19pb19uZWVkc19zeW5jaHJvbm91 c19leGVjdXRpb24oaW9oKTsKNDUzCQo0NTQJCXBnYWlvX2RlYnVnX2lvKERFQlVHMywgaW9o LAo0NTUJCQkJCSAgICJzdGFnZWQgKHN5bmNocm9ub3VzOiAlZCwgaW5fYmF0Y2g6ICVkKSIs CjQ1NgkJCQkJICAgbmVlZHNfc3luY2hyb25vdXMsIHBnYWlvX215X2JhY2tlbmQtPmluX2Jh dGNobW9kZSk7CjQ1NwkKNDU4CQlpZiAoIW5lZWRzX3N5bmNocm9ub3VzKQo0NTkJCXsKNDYw CQkJcGdhaW9fbXlfYmFja2VuZC0+c3RhZ2VkX2lvc1twZ2Fpb19teV9iYWNrZW5kLT5udW1f c3RhZ2VkX2lvcysrXSA9IGlvaDsKNDYxCQkJQXNzZXJ0KHBnYWlvX215X2JhY2tlbmQtPm51 bV9zdGFnZWRfaW9zIDw9IFBHQUlPX1NVQk1JVF9CQVRDSF9TSVpFKTsKNDYyCQo0NjMJCQkv Kgo0NjQJCQkgKiBVbmxlc3MgY29kZSBleHBsaWNpdGx5IG9wdGVkIGludG8gYmF0Y2hpbmcg SU9zLCBzdWJtaXQgdGhlIElPCjQ2NQkJCSAqIGltbWVkaWF0ZWx5Lgo0NjYJCQkgKi8KNDY3 CQkJaWYgKCFwZ2Fpb19teV9iYWNrZW5kLT5pbl9iYXRjaG1vZGUpCjQ2OAkJCQlwZ2Fpb19z dWJtaXRfc3RhZ2VkKCk7CjQ2OQkJfQo0NzAJCWVsc2UKNDcxCQl7CjQ3MgkJCXBnYWlvX2lv X3ByZXBhcmVfc3VibWl0KGlvaCk7CjQ3MwkJCXBnYWlvX2lvX3BlcmZvcm1fc3luY2hyb25v dXNseShpb2gpOwo0NzQJCX0KNDc1CQo0NzYJCVJFU1VNRV9JTlRFUlJVUFRTKCk7CjQ3Nwl9 CjQ3OAkKNDc5CWJvb2wKNDgwCXBnYWlvX2lvX25lZWRzX3N5bmNocm9ub3VzX2V4ZWN1dGlv bihQZ0Fpb0hhbmRsZSAqaW9oKQo0ODEJewo0ODIJCS8qCjQ4MwkJICogSWYgdGhlIGNhbGxl ciBzYWlkIHRvIGV4ZWN1dGUgdGhlIElPIHN5bmNocm9ub3VzbHksIGRvIHNvLgo0ODQJCSAq CjQ4NQkJICogWFhYOiBXZSBjb3VsZCBvcHRpbWl6ZSB0aGUgbG9naWMgd2hlbiB0byBleGVj dXRlIHN5bmNocm9ub3VzbHkgYnkgZmlyc3QKNDg2CQkgKiBjaGVja2luZyBpZiB0aGVyZSBh cmUgb3RoZXIgSU9zIGluIGZsaWdodCBhbmQgb25seSBzeW5jaHJvbm91c2x5CjQ4NwkJICog ZXhlY3V0aW5nIGlmIG5vdC4gVW5jbGVhciB3aGV0aGVyIHRoYXQnbGwgYmUgc3VmZmljaWVu dGx5IGNvbW1vbiB0byBiZQo0ODgJCSAqIHdvcnRoIHdvcnJ5aW5nIGFib3V0Lgo0ODkJCSAq Lwo0OTAJCWlmIChpb2gtPmZsYWdzICYgUEdBSU9fSEZfU1lOQ0hST05PVVMpCjQ5MQkJCXJl dHVybiB0cnVlOwo0OTIJCjQ5MwkJLyogQ2hlY2sgaWYgdGhlIElPIG1ldGhvZCByZXF1aXJl cyBzeW5jaHJvbm91cyBleGVjdXRpb24gb2YgSU8gKi8KNDk0CQlpZiAocGdhaW9fbWV0aG9k X29wcy0+bmVlZHNfc3luY2hyb25vdXNfZXhlY3V0aW9uKQo0OTUJCQlyZXR1cm4gcGdhaW9f bWV0aG9kX29wcy0+bmVlZHNfc3luY2hyb25vdXNfZXhlY3V0aW9uKGlvaCk7CjQ5NgkKNDk3 CQlyZXR1cm4gZmFsc2U7CjQ5OAl9CjQ5OQkKNTAwCS8qCjUwMQkgKiBIYW5kbGUgSU8gYmVp bmcgcHJvY2Vzc2VkIGJ5IElPIG1ldGhvZC4KNTAyCSAqCjUwMwkgKiBTaG91bGQgYmUgY2Fs bGVkIGJ5IElPIG1ldGhvZHMgLyBzeW5jaHJvbm91cyBJTyBleGVjdXRpb24sIGp1c3QgYmVm b3JlIHRoZQo1MDQJICogSU8gaXMgcGVyZm9ybWVkLgo1MDUJICovCjUwNgl2b2lkCjUwNwlw Z2Fpb19pb19wcmVwYXJlX3N1Ym1pdChQZ0Fpb0hhbmRsZSAqaW9oKQo1MDgJewo1MDkJCXBn YWlvX2lvX3VwZGF0ZV9zdGF0ZShpb2gsIFBHQUlPX0hTX1NVQk1JVFRFRCk7CjUxMAkKNTEx CQlkY2xpc3RfcHVzaF90YWlsKCZwZ2Fpb19teV9iYWNrZW5kLT5pbl9mbGlnaHRfaW9zLCAm aW9oLT5ub2RlKTsKNTEyCX0KNTEzCQo1MTQJLyoKNTE1CSAqIEhhbmRsZSBJTyBnZXR0aW5n IGNvbXBsZXRlZCBieSBhIG1ldGhvZC4KNTE2CSAqCjUxNwkgKiBTaG91bGQgYmUgY2FsbGVk IGJ5IElPIG1ldGhvZHMgLyBzeW5jaHJvbm91cyBJTyBleGVjdXRpb24sIGp1c3QgYWZ0ZXIg dGhlCjUxOAkgKiBJTyBoYXMgYmVlbiBwZXJmb3JtZWQuCjUxOQkgKgo1MjAJICogRXhwZWN0 cyB0byBiZSBjYWxsZWQgaW4gYSBjcml0aWNhbCBzZWN0aW9uLiBXZSBleHBlY3QgSU9zIHRv IGJlIHVzYWJsZSBmb3IKNTIxCSAqIFdBTCBldGMsIHdoaWNoIHJlcXVpcmVzIGJlaW5nIGFi bGUgdG8gZXhlY3V0ZSBjb21wbGV0aW9uIGNhbGxiYWNrcyBpbiBhCjUyMgkgKiBjcml0aWNh bCBzZWN0aW9uLgo1MjMJICovCjUyNAl2b2lkCjUyNQlwZ2Fpb19pb19wcm9jZXNzX2NvbXBs ZXRpb24oUGdBaW9IYW5kbGUgKmlvaCwgaW50IHJlc3VsdCkKNTI2CXsKNTI3CQlBc3NlcnQo aW9oLT5zdGF0ZSA9PSBQR0FJT19IU19TVUJNSVRURUQpOwo1MjgJCjUyOQkJQXNzZXJ0KENy aXRTZWN0aW9uQ291bnQgPiAwKTsKNTMwCQo1MzEJCWlvaC0+cmVzdWx0ID0gcmVzdWx0Owo1 MzIJCjUzMwkJcGdhaW9faW9fdXBkYXRlX3N0YXRlKGlvaCwgUEdBSU9fSFNfQ09NUExFVEVE X0lPKTsKNTM0CQo1MzUJCUlOSkVDVElPTl9QT0lOVCgiYWlvLXByb2Nlc3MtY29tcGxldGlv bi1iZWZvcmUtc2hhcmVkIiwgaW9oKTsKNTM2CQo1MzcJCXBnYWlvX2lvX2NhbGxfY29tcGxl dGVfc2hhcmVkKGlvaCk7CjUzOAkKNTM5CQlwZ2Fpb19pb191cGRhdGVfc3RhdGUoaW9oLCBQ R0FJT19IU19DT01QTEVURURfU0hBUkVEKTsKNTQwCQo1NDEJCS8qIGNvbmRpdGlvbiB2YXJp YWJsZSBicm9hZGNhc3QgZW5zdXJlcyBzdGF0ZSBpcyB2aXNpYmxlIGJlZm9yZSB3YWtldXAg Ki8KNTQyCQlDb25kaXRpb25WYXJpYWJsZUJyb2FkY2FzdCgmaW9oLT5jdik7CjU0MwkKNTQ0 CQkvKiBjb250YWlucyBjYWxsIHRvIHBnYWlvX2lvX2NhbGxfY29tcGxldGVfbG9jYWwoKSAq Lwo1NDUJCWlmIChpb2gtPm93bmVyX3Byb2NubyA9PSBNeVByb2NOdW1iZXIpCjU0NgkJCXBn YWlvX2lvX3JlY2xhaW0oaW9oKTsKNTQ3CX0KNTQ4CQo1NDkJLyoKNTUwCSAqIEhhcyB0aGUg SU8gY29tcGxldGVkIGFuZCB0aHVzIHRoZSBJTyBoYW5kbGUgYmVlbiByZXVzZWQ/CjU1MQkg Kgo1NTIJICogVGhpcyBpcyB1c2VmdWwgd2hlbiB3YWl0aW5nIGZvciBJTyBjb21wbGV0aW9u IGF0IGEgbG93IGxldmVsIChlLmcuIGluIGFuIElPCjU1MwkgKiBtZXRob2QncyAtPndhaXRf b25lKCkgY2FsbGJhY2spLgo1NTQJICovCjU1NQlib29sCjU1NglwZ2Fpb19pb193YXNfcmVj eWNsZWQoUGdBaW9IYW5kbGUgKmlvaCwgdWludDY0IHJlZl9nZW5lcmF0aW9uLCBQZ0Fpb0hh bmRsZVN0YXRlICpzdGF0ZSkKNTU3CXsKNTU4CQkqc3RhdGUgPSBpb2gtPnN0YXRlOwo1NTkJ CjU2MAkJLyoKNTYxCQkgKiBFbnN1cmUgdGhhdCB3ZSBkb24ndCBzZWUgYW4gZWFybGllciBz dGF0ZSBvZiB0aGUgaGFuZGxlIHRoYW4gaW9oLT5zdGF0ZQo1NjIJCSAqIGR1ZSB0byBjb21w aWxlciBvciBDUFUgcmVvcmRlcmluZy4gVGhpcyBwcm90ZWN0cyBib3RoIC0+Z2VuZXJhdGlv biBhcwo1NjMJCSAqIGRpcmVjdGx5IHVzZWQgaGVyZSwgYW5kIG90aGVyIGZpZWxkcyBpbiB0 aGUgaGFuZGxlIGFjY2Vzc2VkIGluIHRoZQo1NjQJCSAqIGNhbGxlciBpZiB0aGUgaGFuZGxl IHdhcyBub3QgcmV1c2VkLgo1NjUJCSAqLwo1NjYJCXBnX21lbW9yeV9iYXJyaWVyKCk7CjU2 NwkKNTY4CQlyZXR1cm4gaW9oLT5nZW5lcmF0aW9uICE9IHJlZl9nZW5lcmF0aW9uOwo1NjkJ fQo1NzAJCjU3MQkvKgo1NzIJICogV2FpdCBmb3IgSU8gdG8gY29tcGxldGUuIEV4dGVybmFs IGNvZGUgc2hvdWxkIG5ldmVyIHVzZSB0aGlzLCBvdXRzaWRlIG9mCjU3MwkgKiB0aGUgQUlP IHN1YnN5c3RlbSB3YWl0cyBhcmUgb25seSBhbGxvd2VkIHZpYSBwZ2Fpb193cmVmX3dhaXQo KS4KNTc0CSAqLwo1NzUJc3RhdGljIHZvaWQKNTc2CXBnYWlvX2lvX3dhaXQoUGdBaW9IYW5k bGUgKmlvaCwgdWludDY0IHJlZl9nZW5lcmF0aW9uKQo1NzcJewo1NzgJCVBnQWlvSGFuZGxl U3RhdGUgc3RhdGU7CjU3OQkJYm9vbAkJYW1fb3duZXI7CjU4MAkKNTgxCQlhbV9vd25lciA9 IGlvaC0+b3duZXJfcHJvY25vID09IE15UHJvY051bWJlcjsKNTgyCQo1ODMJCWlmIChwZ2Fp b19pb193YXNfcmVjeWNsZWQoaW9oLCByZWZfZ2VuZXJhdGlvbiwgJnN0YXRlKSkKNTg0CQkJ cmV0dXJuOwo1ODUJCjU4NgkJaWYgKGFtX293bmVyKQo1ODcJCXsKNTg4CQkJaWYgKHN0YXRl ICE9IFBHQUlPX0hTX1NVQk1JVFRFRAo1ODkJCQkJJiYgc3RhdGUgIT0gUEdBSU9fSFNfQ09N UExFVEVEX0lPCjU5MAkJCQkmJiBzdGF0ZSAhPSBQR0FJT19IU19DT01QTEVURURfU0hBUkVE CjU5MQkJCQkmJiBzdGF0ZSAhPSBQR0FJT19IU19DT01QTEVURURfTE9DQUwpCjU5MgkJCXsK NTkzCQkJCWVsb2coUEFOSUMsICJ3YWl0aW5nIGZvciBvd24gSU8gJWQgaW4gd3Jvbmcgc3Rh dGU6ICVzIiwKNTk0CQkJCQkgcGdhaW9faW9fZ2V0X2lkKGlvaCksIHBnYWlvX2lvX2dldF9z dGF0ZV9uYW1lKGlvaCkpOwo1OTUJCQl9CjU5NgkJfQo1OTcJCjU5OAkJd2hpbGUgKHRydWUp CjU5OQkJewo2MDAJCQlpZiAocGdhaW9faW9fd2FzX3JlY3ljbGVkKGlvaCwgcmVmX2dlbmVy YXRpb24sICZzdGF0ZSkpCjYwMQkJCQlyZXR1cm47CjYwMgkKNjAzCQkJc3dpdGNoICgoUGdB aW9IYW5kbGVTdGF0ZSkgc3RhdGUpCjYwNAkJCXsKNjA1CQkJCWNhc2UgUEdBSU9fSFNfSURM RToKNjA2CQkJCWNhc2UgUEdBSU9fSFNfSEFOREVEX09VVDoKNjA3CQkJCQllbG9nKEVSUk9S LCAiSU8gaW4gd3Jvbmcgc3RhdGU6ICVkIiwgc3RhdGUpOwo2MDgJCQkJCWJyZWFrOwo2MDkJ CjYxMAkJCQljYXNlIFBHQUlPX0hTX1NVQk1JVFRFRDoKNjExCQo2MTIJCQkJCS8qCjYxMwkJ CQkJICogSWYgd2UgbmVlZCB0byB3YWl0IHZpYSB0aGUgSU8gbWV0aG9kLCBkbyBzbyBub3cu IERvbid0CjYxNAkJCQkJICogY2hlY2sgdmlhIHRoZSBJTyBtZXRob2QgaWYgdGhlIGlzc3Vp bmcgYmFja2VuZCBpcyBleGVjdXRpbmcKNjE1CQkJCQkgKiB0aGUgSU8gc3luY2hyb25vdXNs eS4KNjE2CQkJCQkgKi8KNjE3CQkJCQlpZiAocGdhaW9fbWV0aG9kX29wcy0+d2FpdF9vbmUg JiYgIShpb2gtPmZsYWdzICYgUEdBSU9fSEZfU1lOQ0hST05PVVMpKQo2MTgJCQkJCXsKNjE5 CQkJCQkJcGdhaW9fbWV0aG9kX29wcy0+d2FpdF9vbmUoaW9oLCByZWZfZ2VuZXJhdGlvbik7 CjYyMAkJCQkJCWNvbnRpbnVlOwo2MjEJCQkJCX0KNjIyCQkJCQkvKiBmYWxsdGhyb3VnaCAq Lwo2MjMJCjYyNAkJCQkJLyogd2FpdGluZyBmb3Igb3duZXIgdG8gc3VibWl0ICovCjYyNQkJ CQljYXNlIFBHQUlPX0hTX0RFRklORUQ6CjYyNgkJCQljYXNlIFBHQUlPX0hTX1NUQUdFRDoK NjI3CQkJCQkvKiB3YWl0aW5nIGZvciByZWFwZXIgdG8gY29tcGxldGUgKi8KNjI4CQkJCQkv KiBmYWxsdGhyb3VnaCAqLwo2MjkJCQkJY2FzZSBQR0FJT19IU19DT01QTEVURURfSU86CjYz MAkJCQkJLyogc2hvdWxkbid0IGJlIGFibGUgdG8gaGl0IHRoaXMgb3RoZXJ3aXNlICovCjYz MQkJCQkJQXNzZXJ0KElzVW5kZXJQb3N0bWFzdGVyKTsKNjMyCQkJCQkvKiBlbnN1cmUgd2Un cmUgZ29pbmcgdG8gZ2V0IHdva2VuIHVwICovCjYzMwkJCQkJQ29uZGl0aW9uVmFyaWFibGVQ cmVwYXJlVG9TbGVlcCgmaW9oLT5jdik7CjYzNAkKNjM1CQkJCQl3aGlsZSAoIXBnYWlvX2lv X3dhc19yZWN5Y2xlZChpb2gsIHJlZl9nZW5lcmF0aW9uLCAmc3RhdGUpKQo2MzYJCQkJCXsK NjM3CQkJCQkJaWYgKHN0YXRlID09IFBHQUlPX0hTX0NPTVBMRVRFRF9TSEFSRUQgfHwKNjM4 CQkJCQkJCXN0YXRlID09IFBHQUlPX0hTX0NPTVBMRVRFRF9MT0NBTCkKNjM5CQkJCQkJCWJy ZWFrOwo2NDAJCQkJCQlDb25kaXRpb25WYXJpYWJsZVNsZWVwKCZpb2gtPmN2LCBXQUlUX0VW RU5UX0FJT19JT19DT01QTEVUSU9OKTsKNjQxCQkJCQl9CjY0MgkKNjQzCQkJCQlDb25kaXRp b25WYXJpYWJsZUNhbmNlbFNsZWVwKCk7CjY0NAkJCQkJYnJlYWs7CjY0NQkKNjQ2CQkJCWNh c2UgUEdBSU9fSFNfQ09NUExFVEVEX1NIQVJFRDoKNjQ3CQkJCWNhc2UgUEdBSU9fSFNfQ09N UExFVEVEX0xPQ0FMOgo2NDgJCjY0OQkJCQkJLyoKNjUwCQkJCQkgKiBOb3RlIHRoYXQgbm8g aW50ZXJydXB0cyBhcmUgcHJvY2Vzc2VkIGJldHdlZW4KNjUxCQkJCQkgKiBwZ2Fpb19pb193 YXNfcmVjeWNsZWQoKSBhbmQgdGhpcyBjaGVjayAtIHRoYXQncyBpbXBvcnRhbnQKNjUyCQkJ CQkgKiBhcyBvdGhlcndpc2UgYW4gaW50ZXJydXB0IGNvdWxkIGhhdmUgYWxyZWFkeSByZWNs YWltZWQgdGhlCjY1MwkJCQkJICogaGFuZGxlLgo2NTQJCQkJCSAqLwo2NTUJCQkJCWlmIChh bV9vd25lcikKNjU2CQkJCQkJcGdhaW9faW9fcmVjbGFpbShpb2gpOwo2NTcJCQkJCXJldHVy bjsKNjU4CQkJfQo2NTkJCX0KNjYwCX0KNjYxCQo2NjIJLyoKNjYzCSAqIE1ha2UgSU8gaGFu ZGxlIHJlYWR5IHRvIGJlIHJldXNlZCBhZnRlciBJTyBoYXMgY29tcGxldGVkIG9yIGFmdGVy IHRoZQo2NjQJICogaGFuZGxlIGhhcyBiZWVuIHJlbGVhc2VkIHdpdGhvdXQgYmVpbmcgdXNl ZC4KNjY1CSAqCjY2NgkgKiBOb3RlIHRoYXQgY2FsbGVycyBuZWVkIHRvIGJlIGNhcmVmdWwg YWJvdXQgb25seSBjYWxsaW5nIHRoaXMgaW4gdGhlIHJpZ2h0CjY2NwkgKiBzdGF0ZSBhbmQg dGhhdCBubyBpbnRlcnJ1cHRzIGNhbiBiZSBwcm9jZXNzZWQgYmV0d2VlbiB0aGUgc3RhdGUg Y2hlY2sgYW5kCjY2OAkgKiB0aGUgY2FsbCB0byBwZ2Fpb19pb19yZWNsYWltKCkuIE90aGVy d2lzZSBpbnRlcnJ1cHQgcHJvY2Vzc2luZyBjb3VsZAo2NjkJICogYWxyZWFkeSBoYXZlIHJl Y2xhaW1lZCB0aGUgaGFuZGxlLgo2NzAJICovCjY3MQlzdGF0aWMgdm9pZAo2NzIJcGdhaW9f aW9fcmVjbGFpbShQZ0Fpb0hhbmRsZSAqaW9oKQo2NzMJewo2NzQJCS8qIFRoaXMgaXMgb25s eSBvayBpZiBpdCdzIG91ciBJTyAqLwo2NzUJCUFzc2VydChpb2gtPm93bmVyX3Byb2NubyA9 PSBNeVByb2NOdW1iZXIpOwo2NzYJCUFzc2VydChpb2gtPnN0YXRlICE9IFBHQUlPX0hTX0lE TEUpOwo2NzcJCjY3OAkJLyogc2VlIGNvbW1lbnQgaW4gZnVuY3Rpb24gaGVhZGVyICovCjY3 OQkJSE9MRF9JTlRFUlJVUFRTKCk7CjY4MAkKNjgxCQkvKgo2ODIJCSAqIEl0J3MgYSBiaXQg dWdseSwgYnV0IHJpZ2h0IG5vdyB0aGUgZWFzaWVzdCBwbGFjZSB0byBwdXQgdGhlIGV4ZWN1 dGlvbgo2ODMJCSAqIG9mIGxvY2FsIGNvbXBsZXRpb24gY2FsbGJhY2tzIGlzIHRoaXMgZnVu Y3Rpb24sIGFzIHdlIG5lZWQgdG8gZXhlY3V0ZQo2ODQJCSAqIGxvY2FsIGNhbGxiYWNrcyBq dXN0IGJlZm9yZSByZWNsYWltaW5nIGF0IG11bHRpcGxlIGNhbGxzaXRlcy4KNjg1CQkgKi8K Njg2CQlpZiAoaW9oLT5zdGF0ZSA9PSBQR0FJT19IU19DT01QTEVURURfU0hBUkVEKQo2ODcJ CXsKNjg4CQkJUGdBaW9SZXN1bHQgbG9jYWxfcmVzdWx0Owo2ODkJCjY5MAkJCWxvY2FsX3Jl c3VsdCA9IHBnYWlvX2lvX2NhbGxfY29tcGxldGVfbG9jYWwoaW9oKTsKNjkxCQkJcGdhaW9f aW9fdXBkYXRlX3N0YXRlKGlvaCwgUEdBSU9fSFNfQ09NUExFVEVEX0xPQ0FMKTsKNjkyCQo2 OTMJCQlpZiAoaW9oLT5yZXBvcnRfcmV0dXJuKQo2OTQJCQl7CjY5NQkJCQlpb2gtPnJlcG9y dF9yZXR1cm4tPnJlc3VsdCA9IGxvY2FsX3Jlc3VsdDsKNjk2CQkJCWlvaC0+cmVwb3J0X3Jl dHVybi0+dGFyZ2V0X2RhdGEgPSBpb2gtPnRhcmdldF9kYXRhOwo2OTcJCQl9CjY5OAkJfQo2 OTkJCjcwMAkJcGdhaW9fZGVidWdfaW8oREVCVUc0LCBpb2gsCjcwMQkJCQkJICAgInJlY2xh aW1pbmc6IGRpc3RpbGxlZF9yZXN1bHQ6IChzdGF0dXMgJXMsIGlkICV1LCBlcnJvcl9kYXRh ICVkKSwgcmF3X3Jlc3VsdDogJWQiLAo3MDIJCQkJCSAgIHBnYWlvX3Jlc3VsdF9zdGF0dXNf c3RyaW5nKGlvaC0+ZGlzdGlsbGVkX3Jlc3VsdC5zdGF0dXMpLAo3MDMJCQkJCSAgIGlvaC0+ ZGlzdGlsbGVkX3Jlc3VsdC5pZCwKNzA0CQkJCQkgICBpb2gtPmRpc3RpbGxlZF9yZXN1bHQu ZXJyb3JfZGF0YSwKNzA1CQkJCQkgICBpb2gtPnJlc3VsdCk7CjcwNgkKNzA3CQkvKiBpZiB0 aGUgSU8gaGFzIGJlZW4gZGVmaW5lZCwgaXQncyBvbiB0aGUgaW4tZmxpZ2h0IGxpc3QsIHJl bW92ZSAqLwo3MDgJCWlmIChpb2gtPnN0YXRlICE9IFBHQUlPX0hTX0hBTkRFRF9PVVQpCjcw OQkJCWRjbGlzdF9kZWxldGVfZnJvbSgmcGdhaW9fbXlfYmFja2VuZC0+aW5fZmxpZ2h0X2lv cywgJmlvaC0+bm9kZSk7CjcxMAkKNzExCQlpZiAoaW9oLT5yZXNvd25lcikKNzEyCQl7Cjcx MwkJCVJlc291cmNlT3duZXJGb3JnZXRBaW9IYW5kbGUoaW9oLT5yZXNvd25lciwgJmlvaC0+ cmVzb3duZXJfbm9kZSk7CjcxNAkJCWlvaC0+cmVzb3duZXIgPSBOVUxMOwo3MTUJCX0KNzE2 CQo3MTcJCUFzc2VydCghaW9oLT5yZXNvd25lcik7CjcxOAkKNzE5CQkvKgo3MjAJCSAqIFVw ZGF0ZSBnZW5lcmF0aW9uICYgc3RhdGUgZmlyc3QsIGJlZm9yZSByZXNldHRpbmcgdGhlIElP J3MgZmllbGRzLAo3MjEJCSAqIG90aGVyd2lzZSBhIGNvbmN1cnJlbnQgInZpZXdlciIgY291 bGQgdGhpbmsgdGhlIGZpZWxkcyBhcmUgdmFsaWQsIGV2ZW4KNzIyCQkgKiB0aG91Z2ggdGhl eSBhcmUgYmVpbmcgcmVzZXQuICBJbmNyZW1lbnQgdGhlIGdlbmVyYXRpb24gZmlyc3QsIHNv IHRoYXQKNzIzCQkgKiB3ZSBjYW4gYXNzZXJ0IGVsc2V3aGVyZSB0aGF0IHdlIG5ldmVyIHdh aXQgZm9yIGFuIElETEUgSU8uICBXaGlsZSBpdCdzCjcyNAkJICogYSBiaXQgd2VpcmQgZm9y IHRoZSBzdGF0ZSB0byBnbyBiYWNrd2FyZHMgZm9yIGEgZ2VuZXJhdGlvbiwgaXQncyBPSwo3 MjUJCSAqIGhlcmUsIGFzIHRoZXJlIGNhbm5vdCBiZSByZWZlcmVuY2VzIHRvIHRoZSAicmVi b3JuIiBJTyB5ZXQuICBDYW4ndAo3MjYJCSAqIHVwZGF0ZSBib3RoIGF0IG9uY2UsIHNvIHNv bWV0aGluZyBoYXMgdG8gZ2l2ZS4KNzI3CQkgKi8KNzI4CQlpb2gtPmdlbmVyYXRpb24rKzsK NzI5CQlwZ2Fpb19pb191cGRhdGVfc3RhdGUoaW9oLCBQR0FJT19IU19JRExFKTsKNzMwCQo3 MzEJCS8qIGVuc3VyZSB0aGUgc3RhdGUgdXBkYXRlIGlzIHZpc2libGUgYmVmb3JlIHdlIHJl c2V0IGZpZWxkcyAqLwo3MzIJCXBnX21lbW9yeV9iYXJyaWVyKCk7CjczMwkKNzM0CQlpb2gt Pm9wID0gUEdBSU9fT1BfSU5WQUxJRDsKNzM1CQlpb2gtPnRhcmdldCA9IFBHQUlPX1RJRF9J TlZBTElEOwo3MzYJCWlvaC0+ZmxhZ3MgPSAwOwo3MzcJCWlvaC0+bnVtX2NhbGxiYWNrcyA9 IDA7CjczOAkJaW9oLT5oYW5kbGVfZGF0YV9sZW4gPSAwOwo3MzkJCWlvaC0+cmVwb3J0X3Jl dHVybiA9IE5VTEw7Cjc0MAkJaW9oLT5yZXN1bHQgPSAwOwo3NDEJCWlvaC0+ZGlzdGlsbGVk X3Jlc3VsdC5zdGF0dXMgPSBQR0FJT19SU19VTktOT1dOOwo3NDIJCjc0MwkJLyoKNzQ0CQkg KiBXZSBwdXNoIHRoZSBJTyB0byB0aGUgaGVhZCBvZiB0aGUgaWRsZSBJTyBsaXN0LCB0aGF0 IHNlZW1zIG1vcmUgY2FjaGUKNzQ1CQkgKiBlZmZpY2llbnQgaW4gY2FzZXMgd2hlcmUgb25s eSBhIGZldyBJT3MgYXJlIHVzZWQuCjc0NgkJICovCjc0NwkJZGNsaXN0X3B1c2hfaGVhZCgm cGdhaW9fbXlfYmFja2VuZC0+aWRsZV9pb3MsICZpb2gtPm5vZGUpOwo3NDgJCjc0OQkJUkVT VU1FX0lOVEVSUlVQVFMoKTsKNzUwCX0KNzUxCQo3NTIJLyoKNzUzCSAqIFdhaXQgZm9yIGFu IElPIGhhbmRsZSB0byBiZWNvbWUgdXNhYmxlLgo3NTQJICoKNzU1CSAqIFRoaXMgb25seSBy ZWFsbHkgaXMgdXNlZnVsIGZvciBwZ2Fpb19pb19hY3F1aXJlKCkuCjc1NgkgKi8KNzU3CXN0 YXRpYyB2b2lkCjc1OAlwZ2Fpb19pb193YWl0X2Zvcl9mcmVlKHZvaWQpCjc1OQl7Cjc2MAkJ aW50CQkJcmVjbGFpbWVkID0gMDsKNzYxCQo3NjIJCXBnYWlvX2RlYnVnKERFQlVHMiwgIndh aXRpbmcgZm9yIGZyZWUgSU8gd2l0aCAlZCBwZW5kaW5nLCAldSBpbi1mbGlnaHQsICV1IGlk bGUgSU9zIiwKNzYzCQkJCQlwZ2Fpb19teV9iYWNrZW5kLT5udW1fc3RhZ2VkX2lvcywKNzY0 CQkJCQlkY2xpc3RfY291bnQoJnBnYWlvX215X2JhY2tlbmQtPmluX2ZsaWdodF9pb3MpLAo3 NjUJCQkJCWRjbGlzdF9jb3VudCgmcGdhaW9fbXlfYmFja2VuZC0+aWRsZV9pb3MpKTsKNzY2 CQo3NjcJCS8qCjc2OAkJICogRmlyc3QgY2hlY2sgaWYgYW55IG9mIG91ciBJT3MgYWN0dWFs bHkgaGF2ZSBjb21wbGV0ZWQgLSB3aGVuIHVzaW5nCjc2OQkJICogd29ya2VyLCB0aGF0J2xs IG9mdGVuIGJlIHRoZSBjYXNlLiBXZSBjb3VsZCBkbyBzbyBhcyBwYXJ0IG9mIHRoZSBsb29w Cjc3MAkJICogYmVsb3csIGJ1dCB0aGF0J2QgcG90ZW50aWFsbHkgbGVhZCB1cyB0byB3YWl0 IGZvciBzb21lIElPIHN1Ym1pdHRlZAo3NzEJCSAqIGJlZm9yZS4KNzcyCQkgKi8KNzczCQlm b3IgKGludCBpID0gMDsgaSA8IGlvX21heF9jb25jdXJyZW5jeTsgaSsrKQo3NzQJCXsKNzc1 CQkJUGdBaW9IYW5kbGUgKmlvaCA9ICZwZ2Fpb19jdGwtPmlvX2hhbmRsZXNbcGdhaW9fbXlf YmFja2VuZC0+aW9faGFuZGxlX29mZiArIGldOwo3NzYJCjc3NwkJCWlmIChpb2gtPnN0YXRl ID09IFBHQUlPX0hTX0NPTVBMRVRFRF9TSEFSRUQpCjc3OAkJCXsKNzc5CQkJCS8qCjc4MAkJ CQkgKiBOb3RlIHRoYXQgbm8gaW50ZXJydXB0cyBhcmUgcHJvY2Vzc2VkIGJldHdlZW4gdGhl IHN0YXRlIGNoZWNrCjc4MQkJCQkgKiBhbmQgdGhlIGNhbGwgdG8gcmVjbGFpbSAtIHRoYXQn cyBpbXBvcnRhbnQgYXMgb3RoZXJ3aXNlIGFuCjc4MgkJCQkgKiBpbnRlcnJ1cHQgY291bGQg aGF2ZSBhbHJlYWR5IHJlY2xhaW1lZCB0aGUgaGFuZGxlLgo3ODMJCQkJICoKNzg0CQkJCSAq IE5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlcmUncyBubyByZW9yZGVyaW5nLCBpbiB0aGUgbW9y ZSBjb21tb24KNzg1CQkJCSAqIHBhdGhzLCB3aGVyZSB3ZSB3YWl0IGZvciBJTywgdGhhdCdz IGRvbmUgYnkKNzg2CQkJCSAqIHBnYWlvX2lvX3dhc19yZWN5Y2xlZCgpLgo3ODcJCQkJICov Cjc4OAkJCQlwZ19yZWFkX2JhcnJpZXIoKTsKNzg5CQkJCXBnYWlvX2lvX3JlY2xhaW0oaW9o KTsKNzkwCQkJCXJlY2xhaW1lZCsrOwo3OTEJCQl9Cjc5MgkJfQo3OTMJCjc5NAkJaWYgKHJl Y2xhaW1lZCA+IDApCjc5NQkJCXJldHVybjsKNzk2CQo3OTcJCS8qCjc5OAkJICogSWYgd2Ug aGF2ZSBhbnkgdW5zdWJtaXR0ZWQgSU9zLCBzdWJtaXQgdGhlbSBub3cuIFdlJ2xsIHN0YXJ0 IHdhaXRpbmcgaW4KNzk5CQkgKiBhIHNlY29uZCwgc28gaXQncyBiZXR0ZXIgdGhleSdyZSBp biBmbGlnaHQuIFRoaXMgYWxzbyBhZGRyZXNzZXMgdGhlCjgwMAkJICogZWRnZS1jYXNlIHRo YXQgYWxsIElPcyBhcmUgdW5zdWJtaXR0ZWQuCjgwMQkJICovCjgwMgkJaWYgKHBnYWlvX215 X2JhY2tlbmQtPm51bV9zdGFnZWRfaW9zID4gMCkKODAzCQkJcGdhaW9fc3VibWl0X3N0YWdl ZCgpOwo4MDQJCjgwNQkJLyogcG9zc2libHkgc29tZSBJT3MgZmluaXNoZWQgZHVyaW5nIHN1 Ym1pc3Npb24gKi8KODA2CQlpZiAoIWRjbGlzdF9pc19lbXB0eSgmcGdhaW9fbXlfYmFja2Vu ZC0+aWRsZV9pb3MpKQo4MDcJCQlyZXR1cm47CjgwOAkKODA5CQlpZiAoZGNsaXN0X2NvdW50 KCZwZ2Fpb19teV9iYWNrZW5kLT5pbl9mbGlnaHRfaW9zKSA9PSAwKQo4MTAJCQllcmVwb3J0 KEVSUk9SLAo4MTEJCQkJCWVycm1zZ19pbnRlcm5hbCgibm8gZnJlZSBJT3MgZGVzcGl0ZSBu byBpbi1mbGlnaHQgSU9zIiksCjgxMgkJCQkJZXJyZGV0YWlsX2ludGVybmFsKCIlZCBwZW5k aW5nLCAldSBpbi1mbGlnaHQsICV1IGlkbGUgSU9zIiwKODEzCQkJCQkJCQkJICAgcGdhaW9f bXlfYmFja2VuZC0+bnVtX3N0YWdlZF9pb3MsCjgxNAkJCQkJCQkJCSAgIGRjbGlzdF9jb3Vu dCgmcGdhaW9fbXlfYmFja2VuZC0+aW5fZmxpZ2h0X2lvcyksCjgxNQkJCQkJCQkJCSAgIGRj bGlzdF9jb3VudCgmcGdhaW9fbXlfYmFja2VuZC0+aWRsZV9pb3MpKSk7CjgxNgkKODE3CQkv Kgo4MTgJCSAqIFdhaXQgZm9yIHRoZSBvbGRlc3QgaW4tZmxpZ2h0IElPIHRvIGNvbXBsZXRl Lgo4MTkJCSAqCjgyMAkJICogWFhYOiBSZXVzaW5nIHRoZSBnZW5lcmFsIElPIHdhaXQgaXMg c3Vib3B0aW1hbCwgd2UgZG9uJ3QgbmVlZCB0byB3YWl0CjgyMQkJICogZm9yIHRoYXQgc3Bl Y2lmaWMgSU8gdG8gY29tcGxldGUsIHdlIGp1c3QgbmVlZCAqYW55KiBJTyB0byBjb21wbGV0 ZS4KODIyCQkgKi8KODIzCQl7CjgyNAkJCVBnQWlvSGFuZGxlICppb2ggPSBkY2xpc3RfaGVh ZF9lbGVtZW50KFBnQWlvSGFuZGxlLCBub2RlLAo4MjUJCQkJCQkJCQkJCQkgICAmcGdhaW9f bXlfYmFja2VuZC0+aW5fZmxpZ2h0X2lvcyk7CjgyNgkJCXVpbnQ2NAkJZ2VuZXJhdGlvbiA9 IGlvaC0+Z2VuZXJhdGlvbjsKODI3CQo4MjgJCQlzd2l0Y2ggKChQZ0Fpb0hhbmRsZVN0YXRl KSBpb2gtPnN0YXRlKQo4MjkJCQl7CjgzMAkJCQkJLyogc2hvdWxkIG5vdCBiZSBpbiBpbi1m bGlnaHQgbGlzdCAqLwo4MzEJCQkJY2FzZSBQR0FJT19IU19JRExFOgo4MzIJCQkJY2FzZSBQ R0FJT19IU19ERUZJTkVEOgo4MzMJCQkJY2FzZSBQR0FJT19IU19IQU5ERURfT1VUOgo4MzQJ CQkJY2FzZSBQR0FJT19IU19TVEFHRUQ6CjgzNQkJCQljYXNlIFBHQUlPX0hTX0NPTVBMRVRF RF9MT0NBTDoKODM2CQkJCQllbG9nKEVSUk9SLCAic2hvdWxkbid0IGdldCBoZXJlIHdpdGgg aW86JWQgaW4gc3RhdGUgJWQiLAo4MzcJCQkJCQkgcGdhaW9faW9fZ2V0X2lkKGlvaCksIGlv aC0+c3RhdGUpOwo4MzgJCQkJCWJyZWFrOwo4MzkJCjg0MAkJCQljYXNlIFBHQUlPX0hTX0NP TVBMRVRFRF9JTzoKODQxCQkJCWNhc2UgUEdBSU9fSFNfU1VCTUlUVEVEOgo4NDIJCQkJCXBn YWlvX2RlYnVnX2lvKERFQlVHMiwgaW9oLAo4NDMJCQkJCQkJCSAgICJ3YWl0aW5nIGZvciBm cmVlIGlvIHdpdGggJXUgaW4gZmxpZ2h0IiwKODQ0CQkJCQkJCQkgICBkY2xpc3RfY291bnQo JnBnYWlvX215X2JhY2tlbmQtPmluX2ZsaWdodF9pb3MpKTsKODQ1CQo4NDYJCQkJCS8qCjg0 NwkJCQkJICogSW4gYSBtb3JlIGdlbmVyYWwgY2FzZSB0aGlzIHdvdWxkIGJlIHJhY3ksIGJl Y2F1c2UgdGhlCjg0OAkJCQkJICogZ2VuZXJhdGlvbiBjb3VsZCBpbmNyZWFzZSBhZnRlciB3 ZSByZWFkIGlvaC0+c3RhdGUgYWJvdmUuCjg0OQkJCQkJICogQnV0IHdlIGFyZSBvbmx5IGxv b2tpbmcgYXQgSU9zIGJ5IHRoZSBjdXJyZW50IGJhY2tlbmQgYW5kCjg1MAkJCQkJICogdGhl IElPIGNhbiBvbmx5IGJlIHJlY3ljbGVkIGJ5IHRoaXMgYmFja2VuZC4gIEV2ZW4gdGhpcyBp cwo4NTEJCQkJCSAqIG9ubHkgT0sgYmVjYXVzZSB3ZSBnZXQgdGhlIGhhbmRsZSdzIGdlbmVy YXRpb24gYmVmb3JlCjg1MgkJCQkJICogcG90ZW50aWFsbHkgcHJvY2Vzc2luZyBpbnRlcnJ1 cHRzLCBlLmcuIGFzIHBhcnQgb2YKODUzCQkJCQkgKiBwZ2Fpb19kZWJ1Z19pbygpLgo4NTQJ CQkJCSAqLwo4NTUJCQkJCXBnYWlvX2lvX3dhaXQoaW9oLCBnZW5lcmF0aW9uKTsKODU2CQkJ CQlicmVhazsKODU3CQo4NTgJCQkJY2FzZSBQR0FJT19IU19DT01QTEVURURfU0hBUkVEOgo4 NTkJCjg2MAkJCQkJLyoKODYxCQkJCQkgKiBJdCdzIHBvc3NpYmxlIHRoYXQgYW5vdGhlciBi YWNrZW5kIGp1c3QgZmluaXNoZWQgdGhpcyBJTy4KODYyCQkJCQkgKgo4NjMJCQkJCSAqIE5v dGUgdGhhdCBubyBpbnRlcnJ1cHRzIGFyZSBwcm9jZXNzZWQgYmV0d2VlbiB0aGUgc3RhdGUK ODY0CQkJCQkgKiBjaGVjayBhbmQgdGhlIGNhbGwgdG8gcmVjbGFpbSAtIHRoYXQncyBpbXBv cnRhbnQgYXMKODY1CQkJCQkgKiBvdGhlcndpc2UgYW4gaW50ZXJydXB0IGNvdWxkIGhhdmUg YWxyZWFkeSByZWNsYWltZWQgdGhlCjg2NgkJCQkJICogaGFuZGxlLgo4NjcJCQkJCSAqCjg2 OAkJCQkJICogTmVlZCB0byBlbnN1cmUgdGhhdCB0aGVyZSdzIG5vIHJlb3JkZXJpbmcsIGlu IHRoZSBtb3JlCjg2OQkJCQkJICogY29tbW9uIHBhdGhzLCB3aGVyZSB3ZSB3YWl0IGZvciBJ TywgdGhhdCdzIGRvbmUgYnkKODcwCQkJCQkgKiBwZ2Fpb19pb193YXNfcmVjeWNsZWQoKS4K ODcxCQkJCQkgKi8KODcyCQkJCQlwZ19yZWFkX2JhcnJpZXIoKTsKODczCQkJCQlwZ2Fpb19p b19yZWNsYWltKGlvaCk7Cjg3NAkJCQkJYnJlYWs7Cjg3NQkJCX0KODc2CQo4NzcJCQlpZiAo ZGNsaXN0X2NvdW50KCZwZ2Fpb19teV9iYWNrZW5kLT5pZGxlX2lvcykgPT0gMCkKODc4CQkJ CWVsb2coUEFOSUMsICJubyBpZGxlIElPIGFmdGVyIHdhaXRpbmcgZm9yIElPIHRvIHRlcm1p bmF0ZSIpOwo4NzkJCQlyZXR1cm47Cjg4MAkJfQo4ODEJfQo4ODIJCjg4MwkvKgo4ODQJICog SW50ZXJuYWwgLSBjb2RlIG91dHNpZGUgb2YgQUlPIHNob3VsZCBuZXZlciBuZWVkIHRoaXMg YW5kIGl0J2QgYmUgaGFyZCBmb3IKODg1CSAqIHN1Y2ggY29kZSB0byBiZSBzYWZlLgo4ODYJ ICovCjg4NwlzdGF0aWMgUGdBaW9IYW5kbGUgKgo4ODgJcGdhaW9faW9fZnJvbV93cmVmKFBn QWlvV2FpdFJlZiAqaW93LCB1aW50NjQgKnJlZl9nZW5lcmF0aW9uKQo4ODkJewo4OTAJCVBn QWlvSGFuZGxlICppb2g7Cjg5MQkKODkyCQlBc3NlcnQoaW93LT5haW9faW5kZXggPCBwZ2Fp b19jdGwtPmlvX2hhbmRsZV9jb3VudCk7Cjg5MwkKODk0CQlpb2ggPSAmcGdhaW9fY3RsLT5p b19oYW5kbGVzW2lvdy0+YWlvX2luZGV4XTsKODk1CQo4OTYJCSpyZWZfZ2VuZXJhdGlvbiA9 ICgodWludDY0KSBpb3ctPmdlbmVyYXRpb25fdXBwZXIpIDw8IDMyIHwKODk3CQkJaW93LT5n ZW5lcmF0aW9uX2xvd2VyOwo4OTgJCjg5OQkJQXNzZXJ0KCpyZWZfZ2VuZXJhdGlvbiAhPSAw KTsKOTAwCQo5MDEJCXJldHVybiBpb2g7CjkwMgl9CjkwMwkKOTA0CXN0YXRpYyBjb25zdCBj aGFyICoKOTA1CXBnYWlvX2lvX3N0YXRlX2dldF9uYW1lKFBnQWlvSGFuZGxlU3RhdGUgcykK OTA2CXsKOTA3CSNkZWZpbmUgUEdBSU9fSFNfVE9TVFJfQ0FTRShzeW0pIGNhc2UgUEdBSU9f SFNfIyNzeW06IHJldHVybiAjc3ltCjkwOAkJc3dpdGNoICgoUGdBaW9IYW5kbGVTdGF0ZSkg cykKICAgMHgwMDAwMDAwMDAwNDM2NGQ0IDwrMTU4PjoJYmx0dQlhMixhMSwweDQzNjUwMCA8 cGdhaW9faW9fdXBkYXRlX3N0YXRlKzIwMj4KICAgMHgwMDAwMDAwMDAwNDM2NGQ4IDwrMTYy PjoJc2xsaQlhMSxhMSwweDMKICAgMHgwMDAwMDAwMDAwNDM2NGRhIDwrMTY0PjoJYXVpcGMJ YTAsMHg0ODUKICAgMHgwMDAwMDAwMDAwNDM2NGRlIDwrMTY4PjoJYWRkaQlhMCxhMCwtNTMw ICMgMHg4YmIyYzgKICAgMHgwMDAwMDAwMDAwNDM2NGUyIDwrMTcyPjoJYWRkCWEwLGEwLGEx CiAgIDB4MDAwMDAwMDAwMDQzNjRlNCA8KzE3ND46CWxkCWE0LDAoYTApCiAgIDB4MDAwMDAw MDAwMDQzNjRlYSA8KzE4MD46CWJsdHUJYTIsczQsMHg0MzY1MGEgPHBnYWlvX2lvX3VwZGF0 ZV9zdGF0ZSsyMTI+CiAgIDB4MDAwMDAwMDAwMDQzNjRlZSA8KzE4ND46CXNsbGkJYTAsczQs MHgzCiAgIDB4MDAwMDAwMDAwMDQzNjRmMiA8KzE4OD46CWF1aXBjCWEyLDB4NDg1CiAgIDB4 MDAwMDAwMDAwMDQzNjRmNiA8KzE5Mj46CWFkZGkJYTIsYTIsLTU1NCAjIDB4OGJiMmM4CiAg IDB4MDAwMDAwMDAwMDQzNjRmYSA8KzE5Nj46CWFkZAlhMCxhMCxhMgogICAweDAwMDAwMDAw MDA0MzY0ZmMgPCsxOTg+OglsZAlhNSwwKGEwKQogICAweDAwMDAwMDAwMDA0MzY0ZmUgPCsy MDA+OglqCTB4NDM2NTBjIDxwZ2Fpb19pb191cGRhdGVfc3RhdGUrMjE0PgogICAweDAwMDAw MDAwMDA0MzY1MDAgPCsyMDI+OglsaQlhNCwwCiAgIDB4MDAwMDAwMDAwMDQzNjUwNiA8KzIw OD46CWJnZXUJYTIsczQsMHg0MzY0ZWUgPHBnYWlvX2lvX3VwZGF0ZV9zdGF0ZSsxODQ+CiAg IDB4MDAwMDAwMDAwMDQzNjUwYSA8KzIxMj46CWxpCWE1LDAKCjkwOQkJewo5MTAJCQkJUEdB SU9fSFNfVE9TVFJfQ0FTRShJRExFKTsKOTExCQkJCVBHQUlPX0hTX1RPU1RSX0NBU0UoSEFO REVEX09VVCk7CjkxMgkJCQlQR0FJT19IU19UT1NUUl9DQVNFKERFRklORUQpOwo5MTMJCQkJ UEdBSU9fSFNfVE9TVFJfQ0FTRShTVEFHRUQpOwo5MTQJCQkJUEdBSU9fSFNfVE9TVFJfQ0FT RShTVUJNSVRURUQpOwo5MTUJCQkJUEdBSU9fSFNfVE9TVFJfQ0FTRShDT01QTEVURURfSU8p Owo5MTYJCQkJUEdBSU9fSFNfVE9TVFJfQ0FTRShDT01QTEVURURfU0hBUkVEKTsKOTE3CQkJ CVBHQUlPX0hTX1RPU1RSX0NBU0UoQ09NUExFVEVEX0xPQ0FMKTsKOTE4CQl9CjkxOQkjdW5k ZWYgUEdBSU9fSFNfVE9TVFJfQ0FTRQo5MjAJCjkyMQkJcmV0dXJuIE5VTEw7CQkJCS8qIHNp bGVuY2UgY29tcGlsZXIgKi8KOTIyCX0KOTIzCQo5MjQJY29uc3QgY2hhciAqCjkyNQlwZ2Fp b19pb19nZXRfc3RhdGVfbmFtZShQZ0Fpb0hhbmRsZSAqaW9oKQo5MjYJewo5MjcJCXJldHVy biBwZ2Fpb19pb19zdGF0ZV9nZXRfbmFtZShpb2gtPnN0YXRlKTsKICAgMHgwMDAwMDAwMDAw NDM2NGNjIDwrMTUwPjoJbGJ1CWExLDAoczEpCiAgIDB4MDAwMDAwMDAwMDQzNjRkMCA8KzE1 ND46CWxpCWEyLDcKCkVuZCBvZiBhc3NlbWJsZXIgZHVtcC4KKGdkYikg --------------4aRSnycNgAxKLMaGM9RUerb7 Content-Type: text/plain; charset=UTF-8; name="pgaio_io_was_recycled.asm" Content-Disposition: attachment; filename="pgaio_io_was_recycled.asm" Content-Transfer-Encoding: base64 R05VIGdkYiAoRGViaWFuIDE1LjItMSkgMTUuMgpDb3B5cmlnaHQgKEMpIDIwMjQgRnJlZSBT b2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkxpY2Vuc2UgR1BMdjMrOiBHTlUgR1BMIHZlcnNp b24gMyBvciBsYXRlciA8aHR0cDovL2dudS5vcmcvbGljZW5zZXMvZ3BsLmh0bWw+ClRoaXMg aXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSBhbmQgcmVkaXN0cmli dXRlIGl0LgpUaGVyZSBpcyBOTyBXQVJSQU5UWSwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQg YnkgbGF3LgpUeXBlICJzaG93IGNvcHlpbmciIGFuZCAic2hvdyB3YXJyYW50eSIgZm9yIGRl dGFpbHMuClRoaXMgR0RCIHdhcyBjb25maWd1cmVkIGFzICJyaXNjdjY0LWxpbnV4LWdudSIu ClR5cGUgInNob3cgY29uZmlndXJhdGlvbiIgZm9yIGNvbmZpZ3VyYXRpb24gZGV0YWlscy4K Rm9yIGJ1ZyByZXBvcnRpbmcgaW5zdHJ1Y3Rpb25zLCBwbGVhc2Ugc2VlOgo8aHR0cHM6Ly93 d3cuZ251Lm9yZy9zb2Z0d2FyZS9nZGIvYnVncy8+LgpGaW5kIHRoZSBHREIgbWFudWFsIGFu ZCBvdGhlciBkb2N1bWVudGF0aW9uIHJlc291cmNlcyBvbmxpbmUgYXQ6CiAgICA8aHR0cDov L3d3dy5nbnUub3JnL3NvZnR3YXJlL2dkYi9kb2N1bWVudGF0aW9uLz4uCgpGb3IgaGVscCwg dHlwZSAiaGVscCIuClR5cGUgImFwcm9wb3Mgd29yZCIgdG8gc2VhcmNoIGZvciBjb21tYW5k cyByZWxhdGVkIHRvICJ3b3JkIi4uLgpSZWFkaW5nIHN5bWJvbHMgZnJvbSB0bXBfaW5zdGFs bC91c3IvbG9jYWwvcGdzcWwvYmluL3Bvc3RncmVzLi4uCihnZGIpIER1bXAgb2YgYXNzZW1i bGVyIGNvZGUgZm9yIGZ1bmN0aW9uIHBnYWlvX2lvX3dhc19yZWN5Y2xlZDoKNTU4CQkqc3Rh dGUgPSBpb2gtPnN0YXRlOwogICAweDAwMDAwMDAwMDA0MzZmOTggPCswPjoJbGJ1CWEzLDAo YTApCiAgIDB4MDAwMDAwMDAwMDQzNmY5YyA8KzQ+OglzdwlhMywwKGEyKQoKNTU5CQo1NjAJ CS8qCjU2MQkJICogRW5zdXJlIHRoYXQgd2UgZG9uJ3Qgc2VlIGFuIGVhcmxpZXIgc3RhdGUg b2YgdGhlIGhhbmRsZSB0aGFuIGlvaC0+c3RhdGUKNTYyCQkgKiBkdWUgdG8gY29tcGlsZXIg b3IgQ1BVIHJlb3JkZXJpbmcuIFRoaXMgcHJvdGVjdHMgYm90aCAtPmdlbmVyYXRpb24gYXMK NTYzCQkgKiBkaXJlY3RseSB1c2VkIGhlcmUsIGFuZCBvdGhlciBmaWVsZHMgaW4gdGhlIGhh bmRsZSBhY2Nlc3NlZCBpbiB0aGUKNTY0CQkgKiBjYWxsZXIgaWYgdGhlIGhhbmRsZSB3YXMg bm90IHJldXNlZC4KNTY1CQkgKi8KNTY2CQlwZ19tZW1vcnlfYmFycmllcigpOwogICAweDAw MDAwMDAwMDA0MzZmOWUgPCs2PjoJZmVuY2UJcncscncKCjU2NwkKNTY4CQlyZXR1cm4gaW9o LT5nZW5lcmF0aW9uICE9IHJlZl9nZW5lcmF0aW9uOwogICAweDAwMDAwMDAwMDA0MzZmYTIg PCsxMD46CWxkCWEwLDY0KGEwKQogICAweDAwMDAwMDAwMDA0MzZmYTQgPCsxMj46CXhvcglh MCxhMCxhMQogICAweDAwMDAwMDAwMDA0MzZmYTYgPCsxND46CXNuZXoJYTAsYTAKICAgMHgw MDAwMDAwMDAwNDM2ZmFhIDwrMTg+OglyZXQKCkVuZCBvZiBhc3NlbWJsZXIgZHVtcC4KKGdk Yikg --------------4aRSnycNgAxKLMaGM9RUerb7--