From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-13.0 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED,DKIM_VALID,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 687A5C33CA7 for ; Sun, 12 Jan 2020 17:26:38 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 1A5042084D for ; Sun, 12 Jan 2020 17:26:38 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="p0uJ/F5g"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="sJ/bBz+I" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1A5042084D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date: Message-ID:From:References:To:Subject:Reply-To:Content-ID:Content-Description :Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=+wwDBysJ3TjZtENKlWr6BkTC8Jr9CUXGmuHo9QxjQv0=; b=p0uJ/F5g6I8kT+ nhqIRnePCKQGTSlD6n0eammkWqvf3rGrA90nDnyzgO1oKm0QAHbnyfSZJwFT8dW9JUMhfD8LL+qHX ihl4kN5mNVWtCMBPIjHOicI4GKi5UsNWbJR24Zv9QFd4EeAn4ZZJyxWfMrtntZwPWbB10q/KPGRTj HkAqeZjoiPpPIJZIGiTNzknWl/OuFU0gm567golwPespwYmDN6vh7sG4SEh2cq75HWrO5l6Szzrcj F/a90mub2xWlYfNKe5StYqjszaKbE0WplHPxgyGlyit7KmugqOMqtFi8mDl8K+RvvAn1DUbnIUvza 0Z2d8OFavlw51adGmtNQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1iqh0X-0001Mn-67; Sun, 12 Jan 2020 17:26:37 +0000 Received: from mail-wr1-x443.google.com ([2a00:1450:4864:20::443]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1iqh0O-00012Z-1Q; Sun, 12 Jan 2020 17:26:34 +0000 Received: by mail-wr1-x443.google.com with SMTP id t2so6357065wrr.1; Sun, 12 Jan 2020 09:26:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=subject:to:cc:references:from:message-id:date:user-agent :mime-version:in-reply-to:content-language:content-transfer-encoding; bh=xVRZT7YHVPE3GbyttbmSvMk99hkpTLXEzonadfBniK0=; b=sJ/bBz+I6AX+VbqaGHYqU8oVcVl/3fSB0h+kVMFnrusHsAraBxY0dWeSBp/G6dF6VS KC3iiITMz4jGvTyFgMdWFv/IKS0nvXQGjasscb3dfzY5UDXLcJ8F43s9WRibK76KLk2I c4tCo4dpuJ0itfQSWTdmYgfgkTHkMqoI1jEQJmcC6AYjiCK5vcexTiLyYWe+2oaf1D7X n1xemEpadN4Z3XRFXs7Ysx4/EzdtgFKlHMLMD3Jwv7S28I230Ek2qNGbLPva3NdGiWEt zyqdsLAx3UCcNjPnhi4d1sx3JnxiT305p4d9Q7DL03PDA9H5c2Tr5gIytdsAZv2wKxVJ WQqw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:subject:to:cc:references:from:message-id:date :user-agent:mime-version:in-reply-to:content-language :content-transfer-encoding; bh=xVRZT7YHVPE3GbyttbmSvMk99hkpTLXEzonadfBniK0=; b=eC/NEVAWvs4lV9HAT3WospQ6KFzAVv+qE1fKqpbKTdvm6BDwrj3ub1NQvwdkK83FaZ 5YkqoTo6EIBtgwFY0OfkiFToG4G3GBdOEiQPu9Cxa7WKp4PIWQ9sizLju4dUn8XF0JSp nNHypsiZ4wMsoPVUyMSOe8uiAitcuvgO8F0tWLpIx5g2Qln1/PcdocomXnjp6ZfDMIq9 MpPRtNCYZVoEOHc5C5PbH+SYIDvBK3H4RGDBB0OG5SvlwKc+fypHigxZQVs4EbEeXTpb dFBvo8tEabDJzj+Z9Pbi9Z8FFxc+qeojoA6bDa/6B6Aratq4rxT6Qgr+o0i+3OHiX0HM qArw== X-Gm-Message-State: APjAAAWamXYH6P6qB17VZd0N1nZ4//804SI9Zcil3HfHsP72dabxRr+k A6+MIsbjQbWMOVp/ReII1d0= X-Google-Smtp-Source: APXvYqyNJb2sZ+BEdl8Qe/N/WrvcZaNsBPjLBsFGSsIaeCCg3xu/NTbmYXVL2WXphD8eiIaYdsHO/Q== X-Received: by 2002:adf:fbc9:: with SMTP id d9mr14694899wrs.20.1578849984608; Sun, 12 Jan 2020 09:26:24 -0800 (PST) Received: from [192.168.2.1] (ip51ccf9cd.speed.planet.nl. [81.204.249.205]) by smtp.gmail.com with ESMTPSA id 4sm10505338wmg.22.2020.01.12.09.26.22 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 12 Jan 2020 09:26:23 -0800 (PST) Subject: Re: [RFC PATCH v1 02/10] mtd: nand: raw: add rockchip nand controller driver To: Miquel Raynal References: <20200108205338.11369-1-jbx6244@gmail.com> <20200108205338.11369-3-jbx6244@gmail.com> <20200110120534.1b4026b0@xps13> From: Johan Jonker Message-ID: <7a477af0-1448-4f26-4004-9331978e824c@gmail.com> Date: Sun, 12 Jan 2020 18:26:20 +0100 User-Agent: Mozilla/5.0 (X11; Linux i686; rv:68.0) Gecko/20100101 Thunderbird/68.3.0 MIME-Version: 1.0 In-Reply-To: <20200110120534.1b4026b0@xps13> Content-Language: en-US X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200112_092628_298994_4C76E6BF X-CRM114-Status: GOOD ( 32.18 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, devicetree@vger.kernel.org, vigneshr@ti.com, richard@nod.at, linux-kernel@vger.kernel.org, linux-rockchip@lists.infradead.org, robh+dt@kernel.org, linux-mtd@lists.infradead.org, linux-arm-kernel@lists.infradead.org, heiko@sntech.de Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+infradead-linux-arm-kernel=archiver.kernel.org@lists.infradead.org SGkgTWlxdWVsLAoKVGhhbmsgeW91IGZvciB5b3VyIGRldGFpbGVkIGFuZCB1c2VmdWwgcmV2aWV3 LgoKV2l0aG91dCBtYW51ZmFjdHVyZXIgc3VwcG9ydCBJIG11c3Qgc2NyYXBlIG15IGluZm9ybWF0 aW9uCmZyb20gYWxsIG92ZXIgdGhlIGludGVybmV0LCB0b2dldGhlciB3aXRoIHNsb3cgaW50ZXJw cmV0YXRpb24gb2YKUm9ja2NoaXAgZHJpdmVycy4KU28gcGxlYXNlIGhhdmUgc29tZSBwYXRpZW5j ZSB3aXRoIG15IHVwZGF0ZXMgYW5kIG5ldyB2ZXJzaW9ucy4KCkJlbG93IGFyZSBzb21lIGNvbW1l bnRzIGFuZCBxdWVzdGlvbnMgaW4gcmFuZG9tIG9yZGVyLgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8KClRvIHByZXZlbnQgZ3Vlc3NpbmcgZ2FtZXMgY291bGQgeW91IGNvbmZpcm0gdGhl IGZvbGxvd2luZyBuYW1lczoKCmRyaXZlciBmaWxlIG5hbWU6ICAgcm9ja2NoaXAtbmFuZC1jb250 cm9sbGVyLmMKZG9jdW1lbnQgZmlsZSBuYW1lOiByb2NrY2hpcC1uYW5kLWNvbnRyb2xsZXIueWFt bAoKY29tcGF0aWJsZTogInJvY2tjaGlwLG5hbmRjLXY2Igpjb21wYXRpYmxlOiAicm9ja2NoaXAs bmFuZGMtdjkiCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKTXkgaW5jb21wbGV0ZSBz b3J0IGxpc3QgZm9yIGNvbnRyb2xsZXIgdmVyc2lvbnMuCgpDYW4gc29tZW9uZSB3aXRoIGFjY2Vz cyB0byB0aGUgUlYxMTA4IFRSTSAobWFudWFsKSByZXBvcnQgdGhlIGRldGFpbHMKZm9yIHRoZSBO YW5kYyBWZXJzaW9uIFJlZ2lzdGVyIGFuZCB3aGV0aGVyIGl0IGlzIGNvbXBhdGlibGUuIFRoYW5r cy4KCkFkZGVkIHZlcnNpb24gNyBmb3IgUkszMjI4QS9SSzMyMjhCLiBDYW4gc29tZW9uZSB3aXRo IGluc2lkZXIgaW5mbyBjb25maXJtCmlmIHRoaXMgd29ya3Mgb3Igbm90LgoKUkszMDY2L1BYMgpO QU5EQ19OQU5EQ19WRVIgMHgwMTYwIFcgMHg1NjM2MzAzMCBOYW5kYyBWZXJzaW9uIFJlZ2lzdGVy CgpSSzMxODgKTkFORENfTkFORENfVkVSIDB4MDE2MCBXIDB4NTYzNjMwMzAgTmFuZGMgVmVyc2lv biBSZWdpc3RlcgoKUFgzCk5BTkRDX05BTkRDX1ZFUiAweDAxNjAgVyAweDU2MzYzMDMwIE5hbmRj IFZlcnNpb24gUmVnaXN0ZXIKClJLMzEyWApOQU5EQ19OQU5EQ19WRVIgMHgwMTYwIFcgMHg1NjM2 MzIzMiBOYW5kYyBWZXJzaW9uIFJlZ2lzdGVyCgpSSzMyODgKTkFORENfTkFORENfVkVSIDB4MDE2 MCBXIDB4NTYzNjMyMzIgTmFuZGMgVmVyc2lvbiBSZWdpc3RlcgoKUkszMzY4L1BYNQpOQU5EQ19O QU5EQ19WRVIgMHgwMTYwIFcgMHg1NjM2MzIzMiBOYW5kYyBWZXJzaW9uIFJlZ2lzdGVyCgpSSzMy MjhBL1JLMzIyOEIKTkFORENfTkFORENfVkVSIDB4MDE2MCBXIDB4MDAwMDA3MDEgTmFuZGMgVmVy c2lvbiBSZWdpc3RlcgoKUkszMzA4Ck5BTkRDX05BTkRDX1ZFUiAweDAxNjAgVyAweDAwMDAwODAx IE5hbmRjIFZlcnNpb24gUmVnaXN0ZXIKClJLMzMyNi9QWDMwCk5BTkRDX05BTkRDX1ZFUiAweDAw ODAgVyAweDU2MzkzMDMwIE5hbmRjIFZlcnNpb24gUmVnaXN0ZXIKClJLMzMyOApOTyBOQU5EQwoK UkszMzk5Ck5PIE5BTkRDCgpSVjExMDgKdW5rbm93bgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8v Ly8vLy8KCk15IGRlYnVnIGtlcm5lbC5sb2cgd2l0aCAxIHBhcnRpdGlvbiBpbiBkdHMuCgpKYW4g IDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDUxNTg3XSByb2NrY2hpcC1uYW5kYwox MDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IGdldCBjbGtfbmFuZGMgZmFpbGVkCkphbiAgMSAwMDow MjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTI0MDJdIG5hbmQ6IGRldmljZSBmb3VuZCwKTWFu dWZhY3R1cmVyIElEOiAweGFkLCBDaGlwIElEOiAweGRlCkphbiAgMSAwMDowMjoyNyBtazgwOCBr ZXJuZWw6IFsgIDE0Ny4wNTI5NDVdIG5hbmQ6IEh5bml4IEgyN1VDRzhUMkFUUi1CQwo2NEcgMy4z ViA4LWJpdApKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDUzMzg4XSBuYW5k OiA4MTkyIE1pQiwgTUxDLCBlcmFzZQpzaXplOiAyMDQ4IEtpQiwgcGFnZSBzaXplOiA4MTkyLCBP T0Igc2l6ZTogNjQwCkphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTQwNTBd IHJvY2tjaGlwLW5hbmRjCjEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+bnVtY2hpcHMg PSAxCkphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTQ3NDBdIHJvY2tjaGlw LW5hbmRjCjEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+Y2hpcHNpemUgPSA4NTg5OTM0 NTkyCkphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNTUzODBdIHJvY2tjaGlw LW5hbmRjCjEwNTAwMDAwLm5hbmQtY29udHJvbGxlcjogbmFuZC0+cGFnZW1hc2sgPSAgICBmZmZm ZgpKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU1OTk0XSByb2NrY2hpcC1u YW5kYwoxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPmJhZGJsb2NrcG9zID0gMApKYW4g IDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU2NTkxXSByb2NrY2hpcC1uYW5kYwox MDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPmNoaXBfc2hpZnQgPSAzMwpKYW4gIDEgMDA6 MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDU3MTc0XSByb2NrY2hpcC1uYW5kYwoxMDUwMDAw MC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPnBhZ2Vfc2hpZnQgPSAxMwpKYW4gIDEgMDA6MDI6Mjcg bWs4MDgga2VybmVsOiBbICAxNDcuMDU3NzUxXSByb2NrY2hpcC1uYW5kYwoxMDUwMDAwMC5uYW5k LWNvbnRyb2xsZXI6IG5hbmQtPnBoeXNfZXJhc2Vfc2hpZnQgPSAyMQpKYW4gIDEgMDA6MDI6Mjcg bWs4MDgga2VybmVsOiBbICAxNDcuMDU4MzY2XSByb2NrY2hpcC1uYW5kYwoxMDUwMDAwMC5uYW5k LWNvbnRyb2xsZXI6IG5hbmQtPmVjYy5tb2RlID0gMwpKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2Vy bmVsOiBbICAxNDcuMDU4OTIwXSByb2NrY2hpcC1uYW5kYwoxMDUwMDAwMC5uYW5kLWNvbnRyb2xs ZXI6IG5hbmQtPmVjYy5zdGVwcyA9IDgKSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAg MTQ3LjA1OTQ4MV0gcm9ja2NoaXAtbmFuZGMKMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5k LT5lY2MuYnl0ZXMgPSA3MApKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYw MDQ5XSByb2NrY2hpcC1uYW5kYwoxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPmVjYy50 b3RhbCA9IDAKSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA2MDYwN10gcm9j a2NoaXAtbmFuZGMKMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBuYW5kLT5lY2MucHJlcGFkID0g NApKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYxMTc1XSByb2NrY2hpcC1u YW5kYwoxMDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPmVjYy5zaXplID0gMTAyNApKYW4g IDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYxNzQ4XSByb2NrY2hpcC1uYW5kYwox MDUwMDAwMC5uYW5kLWNvbnRyb2xsZXI6IG5hbmQtPmVjYy5zdHJlbmd0aCA9IDQwCkphbiAgMSAw MDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNjIzNDFdIHJvY2tjaGlwLW5hbmRjCjEwNTAw MDAwLm5hbmQtY29udHJvbGxlcjogbXRkLT5vb2JsYXlvdXQgPSA5MWNlOWNlMgpKYW4gIDEgMDA6 MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDYyOTQzXSByb2NrY2hpcC1uYW5kYwoxMDUwMDAw MC5uYW5kLWNvbnRyb2xsZXI6IG10ZC0+ZmxhZ3MgPSAwMDAwMDAwMApKYW4gIDEgMDA6MDI6Mjcg bWs4MDgga2VybmVsOiBbICAxNDcuMDYzNTE4XSByb2NrY2hpcC1uYW5kYwoxMDUwMDAwMC5uYW5k LWNvbnRyb2xsZXI6IG10ZC0+c2l6ZSA9IDg1ODk5MzQ1OTIKSmFuICAxIDAwOjAyOjI3IG1rODA4 IGtlcm5lbDogWyAgMTQ3LjA2NDA5OF0gcm9ja2NoaXAtbmFuZGMKMTA1MDAwMDAubmFuZC1jb250 cm9sbGVyOiBtdGQtPmVyYXNlc2l6ZSA9IDIwOTcxNTIKSmFuICAxIDAwOjAyOjI3IG1rODA4IGtl cm5lbDogWyAgMTQ3LjA2NDgxNV0gcm9ja2NoaXAtbmFuZGMKMTA1MDAwMDAubmFuZC1jb250cm9s bGVyOiBtdGQtPndyaXRlc2l6ZSA9IDgxOTIKSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDog WyAgMTQ3LjA2NTQxM10gcm9ja2NoaXAtbmFuZGMKMTA1MDAwMDAubmFuZC1jb250cm9sbGVyOiBt dGQtPm9vYnNpemUgPSA2NDAKSmFuICAxIDAwOjAyOjI3IG1rODA4IGtlcm5lbDogWyAgMTQ3LjA2 ODk4NV0gMSBmaXhlZC1wYXJ0aXRpb25zCnBhcnRpdGlvbnMgZm91bmQgb24gTVREIGRldmljZSAx MDUwMDAwMC5uYW5kLWNvbnRyb2xsZXIuMApKYW4gIDEgMDA6MDI6MjcgbWs4MDgga2VybmVsOiBb ICAxNDcuMDY5MTkwXSBDcmVhdGluZyAxIE1URCBwYXJ0aXRpb25zCm9uICIxMDUwMDAwMC5uYW5k LWNvbnRyb2xsZXIuMCI6CkphbiAgMSAwMDowMjoyNyBtazgwOCBrZXJuZWw6IFsgIDE0Ny4wNzIz NzVdCjB4MDAwMDAwMDAwMDAwLTB4MDAwMDAwNDAwMDAwIDogInBhcmFtZXRlciIKCgpKYW4gIDEg MDA6MDI6MjcgbWs4MDgga2VybmVsOiBbICAxNDcuMDc1NjQ5XSByb2NrY2hpcC1uYW5kYwoxMDUw MDAwMC5uYW5kLWNvbnRyb2xsZXI6IFI6MHgwMGZmIGNzOjAKSmFuICAxIDAwOjAyOjI3IG1rODA4 IGtlcm5lbDogWyAgMTQ3LjA3OTQyM10gcm9ja2NoaXAtbmFuZGMKMTA1MDAwMDAubmFuZC1jb250 cm9sbGVyOiBSOjB4MDFmZiBjczowCgoKRGVzcGl0ZSBuYW5kLT5vcHRpb25zID0gTkFORF9TS0lQ X0JCVFNDQU4uCgpXaGF0IGlzIHRoZSByZWFzb24gZm9yIHRoZXNlIDIgcmtfbmFuZGNfaHdfc3lu ZHJvbWVfZWNjX3JlYWRfcGFnZSgpIGNvbW1hbmRzCmF0IHBhZ2UgUjoweDAwZmYgYW5kIFI6MHgw MWZmIHJpZ2h0IGFmdGVyIGNyZWF0aW5nIHBhcnRpdGlvbnMuCgpXaGVuIGVuYWJsZWQgQkJUU0NB TiBNVEQgc3RhcnRzIHRvIHN0b3JlIGF0IGFsbCBraW5kIG9mIHBsYWNlcy4gQ2FuIHlvdQpzdGF0 ZQp0aGVyZSBwYWdlIGFkZHJlc3MgbG9naWMsIGllLiBXb3VsZCB0aGF0IGRhbWFnZSB0aGUgZXhj aXN0aW5nIFJvY2tjaGlwCmxheW91dD8KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgpO byBiYWQgYmxvY2sgc3VwcG9ydAoKQmFzZWQgb246CmRyaXZlcnM6IG10ZDogbmFuZDogcm9ja2No aXAgbmFuZGMgYWRkIGJhZCBibG9jayBkZXRlY3QgYXBpCmh0dHBzOi8vZ2l0aHViLmNvbS9yb2Nr Y2hpcC1saW51eC91LWJvb3QvY29tbWl0Lwo3YWVjNzA0YTRlOWQ5MzIyZjExMDJiY2Y2MWVlNWMz Y2Y2ZWM3OTRkCgpyb2NrY2hpcDogZHJpdmVyczogbXRkOiBuYW5kOiBtb2RpZnkgdGhlIGJhZCBi bG9jayBkZXRlY3Rpb24gcHJvY2VzcwpodHRwczovL2dpdGh1Yi5jb20vcm9ja2NoaXAtbGludXgv dS1ib290L2NvbW1pdC8KZDZkNzA4ZDFhMzI5YTYzNjkxNDNlOGRkMzRjZjRlMmM4MWQ1ZDkyZgoK QkNIICAgICAgfCAgICAgIG9vYiBzaXplCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoxNjogYnl0 ZXM6IDI4ICsgNCA9IDMyCjI0OiBieXRlczogNDIgKyA0ID0gNDYKNDA6IGJ5dGVzOiA3MCArIDQg PSA3NAo2MDogYnl0ZXM6IDEwNiArIDQgPSAxMTAKClRoZSBkYXRhIGxheW91dCB0aGF0IGlzIHdy aXR0ZW4gYnkgYW4gaW50ZXJuYWwgUm9ja2NoaXAgbmFuZGMgZG1hIGlzOgogICAgMTAyNCBieXRl cyBkYXRhICsgMzIgb2JiICsgMTAyNCBkYXRhICsgMzIgb2JiIC4uLgoKVGhlIE1URCBzeXN0ZW0g aG93ZXZlciB0cmllcyB0byBkZXRlY3QgYmFkIGJsb2NrIGZsYWdzIGxvY2F0ZWQgYXQ6CiAgICAy MDQ4LCA0MDk2LCA4MTkyLi4uCgpUaGUgc3lzdGVtIGNoZWNrcyBmb3IgYmFkIGJsb2NrcyBhbmQg bG9va3MgYXQgdGhlIHdyb25nIGJhZCBibG9jayBtYXJrZXIKbG9jYXRpb24uCllpZmVuZyBaaGFv IHByb3Bvc2VzIHRvIGFkZCBhIGJhZCBibG9jayBkZXRlY3Rpbmcgc3RyYXRlZ3kgYnkgZG9pbmcK YSByZWFkIHdpdGggcmtfbmFuZGNfaHdfc3luZHJvbWVfZWNjX3JlYWRfcGFnZSgpIGZpcnN0LApp ZiBmYWlsdXJlIHRoZW4gYXNzdW1lIGl0J3Mgc3RpbGwgcmF3IHVud3JpdHRlbiBOQU5EIGFuZCB0 ZXN0IGJ5dGVzIGFyZQphdCB0aGUgcG9zaXRpb24gTVREIG5vcm1hbHkgd291bGQgY2hlY2sgZm9y IHJpZ2h0IGZyb20gdGhlIGZhY3RvcnkuCldoZW4gdGhpcyBmdW5jdGlvbiBpcyB1c2VkIG9uIGEg RlRMIGNvbnRyb2xsZWQgTkFORCBpdCBjcmVhdGVzCmFuIGF3ZnVsIGxvdCBvZiBlcnJvcnMgaW4g dGhlIGtlcm5lbCBsb2csIGJlY2F1c2UgaXQgdXNlcyB0aGUgQkIgbWFya2VyCmZvciBkaXJ0eSB0 YWcgdHJpY2tzIGZvciB0aGVyZSBkYXRhIHN0b3JhZ2UuClNvIHdoYXQgaXMgZ29vZCBmb3IgYSBy YXcgZW1wdHkgTkFORCB3aXRob3V0IEZUTApkb2VzIG5vdCB3b3JrIGZvciB0aGUgbWFqb3JpdHkg b2YgUm9ja2NoaXAgZGV2aWNlcyBJIHRoaW5rLgoKUGxlYXNlIGFkdmlzZSBmb3Igb3RoZXIgb3B0 aW9ucy4KCnN0YXRpYyB1aW50OF90IHJrX25hbmRfcmVhZF9ieXRlKHN0cnVjdCBuYW5kX2NoaXAg Km5hbmQpCnsKCXVpbnQ4X3QgcmV0OwoKCXJrX25hbmRfcmVhZF9idWYobmFuZCwgJnJldCwgMSk7 CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCBya19uYW5kX2Jsb2NrX2JhZChzdHJ1Y3QgbmFu ZF9jaGlwICpuYW5kLCBsb2ZmX3Qgb2ZzKQp7CglzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRf dG9fbXRkKG5hbmQpOwoJaW50IHBhZ2UsIHJlcyA9IDA7Cgl1MTYgYmFkID0gMHhmZjsKCXU4ICpi dWYgPSBuYW5kX2dldF9kYXRhX2J1ZihuYW5kKTsKCWludCBjaGlwbnIgPSAoaW50KShvZnMgPj4g bmFuZC0+Y2hpcF9zaGlmdCk7CgoJcGFnZSA9IChpbnQpKG9mcyA+PiBuYW5kLT5wYWdlX3NoaWZ0 KSAmIG5hbmQtPnBhZ2VtYXNrOwoJcmtfbmFuZF9zZWxlY3RfY2hpcChuYW5kLCBjaGlwbnIpOwoJ aWYgKHJrX25hbmRfaHdfc3luZHJvbWVfZWNjX3JlYWRfcGFnZShuYW5kLCBidWYsIGZhbHNlLCBw YWdlKSA9PSAtMSkgewoJCS8qIGZpcnN0IHBhZ2Ugb2YgYSBibG9jayovCgkJbmFuZF9yZWFkX3Bh Z2Vfb3AobmFuZCwgcGFnZSwgbmFuZC0+YmFkYmxvY2twb3MsIE5VTEwsIDApOwoJCWJhZCA9IHJr X25hbmRfcmVhZF9ieXRlKG5hbmQpOwoJCWlmIChiYWQgIT0gMHhGRikKCQkJcmVzID0gMTsKCQkv KiBzZWNvbmQgcGFnZSBvZiBhIGJsb2NrKi8KCQluYW5kX3JlYWRfcGFnZV9vcChuYW5kLCBwYWdl ICsgMSwgbmFuZC0+YmFkYmxvY2twb3MsIE5VTEwsIDApOwoJCWJhZCA9IHJrX25hbmRfcmVhZF9i eXRlKG5hbmQpOwoJCWlmIChiYWQgIT0gMHhGRikKCQkJcmVzID0gMTsKCQkvKiBsYXN0IHBhZ2Ug b2YgYSBibG9jayAqLwoJCXBhZ2UgKz0gKChtdGQtPmVyYXNlc2l6ZSAtIG10ZC0+d3JpdGVzaXpl KSA+PiBuYW5kLT5jaGlwX3NoaWZ0KTsKCQlwYWdlLS07CgkJbmFuZF9yZWFkX3BhZ2Vfb3AobmFu ZCwgcGFnZSwgbmFuZC0+YmFkYmxvY2twb3MsIE5VTEwsIDApOwoJCWJhZCA9IHJrX25hbmRfcmVh ZF9ieXRlKG5hbmQpOwoJCWlmIChiYWQgIT0gMHhGRikKCQkJcmVzID0gMTsKCX0KCXJrX25hbmRf c2VsZWN0X2NoaXAobmFuZCwgLTEpOwoJcmV0dXJuIHJlczsKfQoKVGhpcyBhbHNvIHJlcXVpcmVz IGEgcGF0Y2ggZm9yIG5hbmRfYmJ0LmMKQXMgSSB0cnkgdG8gZ2V0IHRvIGdldCBzb21lIHNoYXBl IGluIHRoZSByZXN0IG9mIHRoaXMgZHJpdmVyLApJIGhhdmUgbGVmdCBpdCBvdXQgZm9yIHZlcnNp b24gMSBhbmQgYXMgSSB3YWl0IGZvciBvdXIgcmVzcG9ucyBmaXJzdC4KCmRyaXZlcnMvbXRkL25h bmQvbmFuZF9iYnQuYwpAQCAtNDg3LDggKzQ4NywxMCBAQCBzdGF0aWMgaW50IGNyZWF0ZV9iYnQo c3RydWN0IG10ZF9pbmZvICptdGQsIHVpbnQ4X3QKKmJ1ZiwKCQlpbnQgcmV0OwoKCQlCVUdfT04o YmQtPm9wdGlvbnMgJiBOQU5EX0JCVF9OT19PT0IpOwoKCQlyZXQgPSBzY2FuX2Jsb2NrX2Zhc3Qo bXRkLCBiZCwgZnJvbSwgYnVmLCBudW1wYWdlcyk7CgkJaWYgKHRoaXMtPmJsb2NrX2JhZCkKCQkJ cmV0ID0gdGhpcy0+YmxvY2tfYmFkKG10ZCwgZnJvbSk7CgkJZWxzZQoJCQlyZXQgPSBzY2FuX2Js b2NrX2Zhc3QobXRkLCBiZCwgZnJvbSwgYnVmLCBudW1wYWdlcyk7CgovLy8vLy8vLy8vLy8vLy8v Ly8vLy8vLy8vLy8vLwoKRGF0YSBzdHJ1Y3R1cmVzL1BhcnRpdGlvbnMKClRoZSBtYWpvcml0eSBv ZiBSb2NrY2hpcCBkZXZpY2VzIHVzZSBhIGNsb3NlZCBzb3VyY2UgRlRMIGRyaXZlciwKc28gd2hl biB3ZSB3YW50IHRvIHJlYWQgb3Igd3JpdGUgd2UgbXVzdCBkZWFsIHdpdGggaXQuCgpFeGFtcGxl IE1URCBzdHJpbmc6Cm10ZHBhcnRzPXJrMjl4eG5hbmQ6CjB4MDAwMDIwMDBAMHgwMDAwMjAwMCht aXNjKSwKMHgwMDAwODAwMEAweDAwMDA0MDAwKGtlcm5lbCksCjB4MDAwMDgwMDBAMHgwMDAwQzAw MChib290KSwKMHgwMDAwODAwMEAweDAwMDE0MDAwKHJlY292ZXJ5KSwKMHgwMDBDMDAwMEAweDAw MDFDMDAwKGJhY2t1cCksCjB4MDAwNDAwMDBAMHgwMDBEQzAwMChjYWNoZSksCjB4MDAzMDAwMDBA MHgwMDExQzAwMCh1c2VyZGF0YSksCjB4MDAwMDIwMDBAMHgwMDQxQzAwMChrcGFuaWMpLAoweDAw MjAwMDAwQDB4MDA0MUUwMDAoc3lzdGVtKSwKLUAweDAwNjNFMDAwKHVzZXIpIgoKV2hlbiBSb2Nr Y2hpcCBtZW50aW9ucyBhIHN0cmluZyBsaWtlIHRoaXMgaXQgaGFzIG5vdGhpbmcgdG8gZG8Kd2l0 aCB0aGUgcmVhbCBwb3NpdGlvbiBvbiBOQU5ELiBGVEwgd3JpdGUgd2hlcmUgd2FudHMsCnNvIHJl YWRpbmcgdGhlcmUgaXMgbm90IHVzZWZ1bC4KQWxsIHNpemVzIGhhdmUgdG8gYmUgbXVsdGlwbGll ZCBieSA1MTIgYW5kIGNhc3RlZCB0byAodTY0KSEKQWxsIHBhcnRpdGlvbnMgbmVlZCB0byBjb250 YWluIGF0IGxlYXN0IDIgZXJhc2UgYmxvY2tzLgpPbmUgZm9yIG5vcm1hbCB1c2UgYW5kIG9uZSBz cGFyZS4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tCkZsYXNoU2F2ZVBoeUluZm8KUmF3SWRiRGF0YQot LS0tLS0tLS0tLS0tLS0tLS0tLQouLi4KRlRMIGRhdGEKLi4uCi0tLS0tLS0tLS0tLS0tLS0tLS0t Ck1hcCBibG9ja3M6CisgTDJwTWFwSW5mbworIFZlbmRvckJsa0luZm8KClN5cyBpbmZvOgorIHN5 c19zYXZlX2RhdGEKClZlbmRvciBwYXJ0aXRpb246Cisgc3lzX2V4dF9kYXRhICAgIDAKKyBlY3Rf dGJsX2luZm8gICA2NAorIHZlbmRvciAgICAgICAgMjU2ICsgPworIEJvb3RDb25maWcgICAgNTEy ICsgMAorIERybUtleUluZm8gICAgNTEyICsgMQorIFZlbmRvcjBJbmZvICAgNTEyICsgMgorIFZl bmRvcjFJbmZvICAgNTEyICsgMworIHN5cyAgICAgICAgICAgNTEyICsgPworIHB1YmxpYyBrZXkg ICAgNTIwCi0tLS0tLS0tLS0tLS0tLS0tLS0tCkJhZCBCbG9jayBNYXAgVGJsKG5vdCBjb21wYXRp YmxlIHdpdGggTVREKQotLS0tLS0tLS0tLS0tLS0tLS0tLQpyZXNlcnZlZDogbGFzdCBOQU5EIGJs b2NrIC0gbgotLS0tLS0tLS0tLS0tLS0tLS0tLQoKRnJvbSB0aGUgYWJvdmUgZGlhZ3JhbSBvbmx5 IFJhd0lkYkRhdGEgaGFzIHRvIGJlIGxvY2F0ZWQgaW4gdGhlIGZpcnN0CmVyYXNlIGJsb2NrLgpC b290IFJPTSBzZWFyY2hlcyBmb3IgdGhlIHRhZyBJRF9JRFJXID0gMHhGQ0RDOEMzQi4KT25seSB0 aGUgZmlyc3QgNCBzZWN0aW9ucyAoNCoxMDI0KSBvZiBhIHBhZ2UgYXJlIHVzZWQuCldoZW4gd3Jp dGluZyBtdWx0aXBsZSBwYWdlcyBleHRyYSBzcGFjZXMgaW4gdGhlIGRhdGEKZm9yIGJldHdlZW4g dGhlIHNlY3Rpb25zIGFyZSByZXF1aXJlZC4KT2xkZXIgY3B1J3MgKFJLMzA2NikgbWlnaHQgbmVl ZCBleHRyYSBSQzQgY29kaW5nLgoKRlRMIHVzZXMgdGhhdCBSYXdJZGJEYXRhIGFyZWEgdW5mb3J0 dW5hdGVseSBhbHNvIHRvIHNhdmUgc3RydWN0CkZsYXNoU2F2ZVBoeUluZm8uCkZvciBhIGJhcmUg YmFzaWMgYXBwbGljYXRpb24gb25seSBSYXdJZGJEYXRhIGlzIG5lZWRlZC4KCkZvciB1c2VycyB0 aGF0IG1pZ2h0IGNvbnNpZGVyIE1URCBhcyBhIG9wdGlvbiB0byBkbyBzb21ldGhpbmcgb24gYQpS b2NrY2hpcCBOQU5ECnNlZSB0aGUgc291cmNlIGNvZGUgYmVsb3cgdG8gZ2V0IGFuIGluZGljYXRp b24gb2Ygd2hhdCBpcyBuZWVkZWQgZm9yIGEKdXNlZnVsCnNldHVwIHRvIGp1c3QgcmVhZCBhbmQg d3JpdGUgYSBib290bG9hZGVyIGFsb25lLiBXcml0aW5nIG9mIGFueSB1c2VyCnBhcnRpdGlvbgpp cyBub3QgZXZlbiBpbmNsdWRlZC4KSGF2aW5nIGEgYmFzaWMgTVREIGRyaXZlciBpcyBqdXN0IG5v dCBlbm91Z2guClBsZWFzZSBhZHZpc2UgaWYgc3VjaCBhIG92ZXJoZWFkIGNhbiBpbnRlcmZhY2Ug d2l0aCBNVEQ/CkhhdmUgZnVuIQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCk9uIDEv MTAvMjAgMTI6MDUgUE0sIE1pcXVlbCBSYXluYWwgd3JvdGU6Cj4gSGkgSm9oYW4sCj4KPiBKb2hh biBKb25rZXIgPGpieDYyNDRAZ21haWwuY29tPiB3cm90ZSBvbiBXZWQsICA4IEphbiAyMDIwIDIx OjUzOjMwCj4gKzAxMDA6Cj4KPj4gRnJvbTogWWlmZW5nIFpoYW8gPHp5ZkByb2NrLWNoaXBzLmNv bT4KPj4KPgo+IENhbiB5b3UgY2hhbmdlIHRoZSB0aXRsZSB0byAibXRkOiByYXduYW5kOiByb2Nr Y2hpcDogQWRkIE5BTkQKPiBjb250cm9sbGVyIGRyaXZlciIKPgo+PiBBZGQgYmFzaWMgUm9ja2No aXAgbmFuZCBjb250cm9sbGVyIGRyaXZlci4KPj4KPj4gQ29tcGF0aWJsZSB3aXRoIGhhcmR3YXJl IHZlcnNpb24gNiBhbmQgOS4KPj4gVjY6MTYsIDI0LCA0MCwgNjAgcGVyIDEwMjRCIEJDSC9FQ0Mu Cj4+IFY5OjE2LCA0MCwgNjAsIDcwIHBlciAxMDI0QiBCQ0gvRUNDLgo+PiA4IGJpdCBhc3luY2hy b25vdXMgZmxhc2ggaW50ZXJmYWNlIHN1cHBvcnQuCj4+IFN1cHBvcnRzIHVwIHRvIDIgaWRlbnRp Y2FsIG5hbmRjIG5vZGVzLgo+PiBNYXggNCBuYW5kIGNoaXBzIHBlciBjb250cm9sbGVyLgo+PiBB YmxlIHRvIHNlbGVjdCBhIGRpZmZlcmVudCBoYXJkd2FyZSBlY2Mgc2V0dXAKPj4gZm9yIHRoZSBs b2FkZXIgYmxvY2tzLgo+PiBObyBiYWQgYmxvY2sgc3VwcG9ydC4KPgo+IFRoYW5rIHlvdSB2ZXJ5 IG11Y2ggZm9yIHRoaXMgc2VyaWVzLCBhcyB0aGUgYmFkIGJsb2NrcyBzdXBwb3J0IGlzCj4gYWJz b2x1dGVseSBmdW5kYW1lbnRhbCwgSSB3b25kZXIgd2hhdCBpcyB0aGUgaXNzdWUgaGVyZT8KPgo+ Pgo+PiBTaWduZWQtb2ZmLWJ5OiBZaWZlbmcgWmhhbyA8enlmQHJvY2stY2hpcHMuY29tPgo+PiBT aWduZWQtb2ZmLWJ5OiBKb2hhbiBKb25rZXIgPGpieDYyNDRAZ21haWwuY29tPgo+PiAtLS0KPj4g IGRyaXZlcnMvbXRkL25hbmQvcmF3L0tjb25maWcgICAgICAgICAgfCAgICA4ICsKPj4gIGRyaXZl cnMvbXRkL25hbmQvcmF3L01ha2VmaWxlICAgICAgICAgfCAgICAxICsKPj4gIGRyaXZlcnMvbXRk L25hbmQvcmF3L3JvY2tjaGlwX25hbmRjLmMgfCAxMjI0CisrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKwo+PiAgMyBmaWxlcyBjaGFuZ2VkLCAxMjMzIGluc2VydGlvbnMoKykKPj4gIGNy ZWF0ZSBtb2RlIDEwMDY0NCBkcml2ZXJzL210ZC9uYW5kL3Jhdy9yb2NrY2hpcF9uYW5kYy5jCj4+ Cj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL210ZC9uYW5kL3Jhdy9LY29uZmlnIGIvZHJpdmVycy9t dGQvbmFuZC9yYXcvS2NvbmZpZwo+PiBpbmRleCA3NGZiOTFhZGUuLjY4ZGM5YTM2ZCAxMDA2NDQK Pj4gLS0tIGEvZHJpdmVycy9tdGQvbmFuZC9yYXcvS2NvbmZpZwo+PiArKysgYi9kcml2ZXJzL210 ZC9uYW5kL3Jhdy9LY29uZmlnCj4+IEBAIC00NTcsNiArNDU3LDE0IEBAIGNvbmZpZyBNVERfTkFO RF9DQURFTkNFCj4+ICAJICBFbmFibGUgdGhlIGRyaXZlciBmb3IgTkFORCBmbGFzaCBvbiBwbGF0 Zm9ybXMgdXNpbmcgYSBDYWRlbmNlIE5BTkQKPj4gIAkgIGNvbnRyb2xsZXIuCj4+Cj4+ICtjb25m aWcgTVREX05BTkRfUk9DS0NISVAKPj4gKwl0cmlzdGF0ZSAiUm9ja2NoaXAgcmF3IE5BTkQgY29u dHJvbGxlciBkcml2ZXIiCj4+ICsJZGVwZW5kcyBvbiBBUkNIX1JPQ0tDSElQIHx8IENPTVBJTEVf VEVTVAo+PiArCWRlcGVuZHMgb24gSEFTX0lPTUVNCj4+ICsJaGVscAo+PiArCSAgRW5hYmxlcyBz dXBwb3J0IGZvciB0aGUgUm9ja2NoaXAgcmF3IE5BTkQgY29udHJvbGxlciBkcml2ZXIuCj4+ICsJ ICBUaGlzIGNvbnRyb2xsZXIgaXMgZm91bmQgb24gcmszMDY2LCByazMxODgsIHJrMzI4OCBhbmQg bW9yZS4KPgo+IENhbiB5b3Ugd3JpdGUgYW4gZXhoYXVzdGl2ZSBsaXN0IGlmIHlvdSBrbm93IGl0 PyBPciBhdCBsZWFzdCB0aGUKPiBmYW1pbGllcz8gSXQgaXMgcXVpdGUgY2hhbGxlbmdpbmcgd2hl biB5b3UgYXJlIG5vdCBpbiB0aGUgUm9ja2NoaXAKPiB3b3JsZCB0byBrbm93IHdoYXQgU29DIGlz IHNpbWlsYXIgdG8gYW5vdGhlciByYW5kb20gU29DLgoKU2VlIGFib3ZlLgoKPgo+PiArCj4+ICBj b21tZW50ICJNaXNjIgo+Pgo+PiAgY29uZmlnIE1URF9TTV9DT01NT04KPj4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvbXRkL25hbmQvcmF3L01ha2VmaWxlCmIvZHJpdmVycy9tdGQvbmFuZC9yYXcvTWFr ZWZpbGUKPj4gaW5kZXggMmQxMzZiMTU4Li4zMDYzZmU3NGEgMTAwNjQ0Cj4+IC0tLSBhL2RyaXZl cnMvbXRkL25hbmQvcmF3L01ha2VmaWxlCj4+ICsrKyBiL2RyaXZlcnMvbXRkL25hbmQvcmF3L01h a2VmaWxlCj4+IEBAIC01OCw2ICs1OCw3IEBAIG9iai0kKENPTkZJR19NVERfTkFORF9URUdSQSkJ CSs9IHRlZ3JhX25hbmQubwo+PiAgb2JqLSQoQ09ORklHX01URF9OQU5EX1NUTTMyX0ZNQzIpCSs9 IHN0bTMyX2ZtYzJfbmFuZC5vCj4+ICBvYmotJChDT05GSUdfTVREX05BTkRfTUVTT04pCQkrPSBt ZXNvbl9uYW5kLm8KPj4gIG9iai0kKENPTkZJR19NVERfTkFORF9DQURFTkNFKQkJKz0gY2FkZW5j ZS1uYW5kLWNvbnRyb2xsZXIubwo+PiArb2JqLSQoQ09ORklHX01URF9OQU5EX1JPQ0tDSElQKQkJ Kz0gcm9ja2NoaXBfbmFuZGMubwo+Cj4gQSBkcml2ZXIgbmFtZWQgcm9ja2NoaXAtbmFuZC1jb250 cm9sbGVyLmMgd291bGQgYmUgbmljZSEKPgo+Pgo+PiAgbmFuZC1vYmpzIDo9IG5hbmRfYmFzZS5v IG5hbmRfbGVnYWN5Lm8gbmFuZF9iYnQubyBuYW5kX3RpbWluZ3MubwpuYW5kX2lkcy5vCj4+ICBu YW5kLW9ianMgKz0gbmFuZF9vbmZpLm8KPj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvbXRkL25hbmQv cmF3L3JvY2tjaGlwX25hbmRjLmMKYi9kcml2ZXJzL210ZC9uYW5kL3Jhdy9yb2NrY2hpcF9uYW5k Yy5jCj4+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0Cj4+IGluZGV4IDAwMDAwMDAwMC4uMDE4MzA4ZTU4 Cj4+IC0tLSAvZGV2L251bGwKPj4gKysrIGIvZHJpdmVycy9tdGQvbmFuZC9yYXcvcm9ja2NoaXBf bmFuZGMuYwo+PiBAQCAtMCwwICsxLDEyMjQgQEAKPj4gKy8vIFNQRFgtTGljZW5zZS1JZGVudGlm aWVyOiBHUEwtMi4wCj4+ICsvKgo+PiArICogQmFzZWQgb246Cj4+ICsgKgpodHRwczovL2dpdGh1 Yi5jb20vcm9ja2NoaXAtbGludXgva2VybmVsL2Jsb2IvZGV2ZWxvcC00LjQvZHJpdmVycy9tdGQv bmFuZC8KPj4gKyAqICAgICAgICAgcm9ja2NoaXBfbmFuZF92Ni5jCj4+ICsgKgpodHRwczovL2dp dGh1Yi5jb20vcm9ja2NoaXAtbGludXgva2VybmVsL2Jsb2IvZGV2ZWxvcC00LjQvZHJpdmVycy9t dGQvbmFuZC8KPj4gKyAqICAgICAgICAgcm9ja2NoaXBfbmFuZF92OS5jCj4KPiBJJ20gbm90IHN1 cmUgdGhlIGVudGlyZSBsaW5rIGlzIHJlbGV2YW50LCBJIHdvdWxkIHNpbXBsZSBtZW50aW9uIHRo ZQo+IFJvY2tjaGlwIG9mZmljaWFsIEdpdGh1YiByZXBvc2l0b3J5IGFuZCB3b3JrIGZyb20gWWlm ZW5nLgo+Cj4+ICsgKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOSBZaWZlbmcgWmhhbyB5aWZlbmcu emhhb0Byb2NrLWNoaXBzLmNvbQo+PiArICoKPj4gKyAqIFVwZGF0ZS9yZXN0eWxlIGZvciBsaW51 eC1uZXh0Lgo+PiArICogQWRkIGV4ZWNfb3AgZnVuY3Rpb24uCj4KPiBZb3UgY2FuIGRyb3AgdGhl c2UgdHdvIGxpbmVzIHRvby4gVGhpcyBpcyBtb3JlIGEgImNvbW1pdCBkZXNjcmlwdGlvbiIKPiB0 aGluZy4KPgo+PiArICogQ29tYmluZSBkcml2ZXIgZm9yIG5hbmRjIHZlcnNpb24gNiBhbmQgOS4K Pgo+ICAgICAgIFN1cHBvcnQgTkFORCBjb250cm9sbGVyIHZlcnNpb25zIDYgYW5kIDkgZm91bmQg b24gU29DcyAuLi4KPgo+PiArICogQ29weXJpZ2h0IChjKSAyMDIwIEpvaGFuIEpvbmtlciBqYng2 MjQ0QGdtYWlsLmNvbQo+PiArICovCj4+ICsKPj4gKyNpbmNsdWRlIDxsaW51eC9jbGsuaD4KPj4g KyNpbmNsdWRlIDxsaW51eC9kbWEtbWFwcGluZy5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L2ludGVy cnVwdC5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L2lvcG9sbC5oPgo+PiArI2luY2x1ZGUgPGxpbnV4 L21vZHVsZS5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L29mX2RldmljZS5oPgo+PiArI2luY2x1ZGUg PGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgo+PiArCj4+ICsjaW5jbHVkZSA8bGludXgvbXRkL3Jh d25hbmQuaD4KPj4gKwo+PiArI2RlZmluZSBOQU5EQ19JRF9WNjAwCQkJMHg1NjM2MzAzMAo+PiAr I2RlZmluZSBOQU5EQ19JRF9WNjIyCQkJMHg1NjM2MzIzMgo+PiArI2RlZmluZSBOQU5EQ19JRF9W NzAxCQkJMHg3MDEKPj4gKyNkZWZpbmUgTkFORENfSURfVjgwMAkJCTB4NTYzODMwMzAKPj4gKyNk ZWZpbmUgTkFORENfSURfVjgwMQkJCTB4ODAxCj4+ICsjZGVmaW5lIE5BTkRDX0lEX1Y5MDAJCQkw eDU2MzkzMDMwCj4KCj4gSSB3b3VsZCBwcmVmZXIgcHJlZml4aW5nIGV2ZXJ5dGhpbmcgUktfTkFO RENfIG9yIFJLXwoKV2lsbCBjaGFuZ2UgZGVmaW5lIGxpc3QgYWJvdmUgYW5kIGJlbG93IHRvIFJL X05BTkRDXwpJdCB0YWtlcyBtb3JlIHNwYWNlIHRob3VnaC4gQWxyZWFkeSBkaWZmaWN1bHQgdG8g c3RheSBiZWxvdyA4MCBjaGFyL2xpbmUuCgo+Cj4+ICsKPj4gKyNkZWZpbmUgTkFORENfSURCUmVz QmxrTnVtCQkxNgo+PiArI2RlZmluZSBOQU5EQ19JREJFY2NCaXRzCQkyNAo+PiArI2RlZmluZSBO QU5EQ19JREJTdGFydEFkZHIJCTAKPj4gKwo+PiArI2RlZmluZSBOQU5EQ19WNl9FQ0NfMTYJCQkw eDAwMDAwMDAwCj4+ICsjZGVmaW5lIE5BTkRDX1Y2X0VDQ18yNAkJCTB4MDAwMDAwMTAKPj4gKyNk ZWZpbmUgTkFORENfVjZfRUNDXzQwCQkJMHgwMDA0MDAwMAo+PiArI2RlZmluZSBOQU5EQ19WNl9F Q0NfNjAJCQkweDAwMDQwMDEwCj4+ICsKPj4gKyNkZWZpbmUgTkFORENfVjlfRUNDXzE2CQkJMHgw MjAwMDAwMQo+PiArI2RlZmluZSBOQU5EQ19WOV9FQ0NfNDAJCQkweDA0MDAwMDAxCj4+ICsjZGVm aW5lIE5BTkRDX1Y5X0VDQ182MAkJCTB4MDYwMDAwMDEKPj4gKyNkZWZpbmUgTkFORENfVjlfRUND XzcwCQkJMHgwMDAwMDAwMQo+PiArCj4+ICsjZGVmaW5lIE5BTkRDX05VTV9CQU5LUwkJCTQKPj4g KyNkZWZpbmUgTkFORENfREVGX1RJTUVPVVQJCTEwMDAwCj4+ICsKPj4gKyNkZWZpbmUgTkFORENf UkVHX0RBVEEJCQkweDAwCj4+ICsjZGVmaW5lIE5BTkRDX1JFR19BRERSCQkJMHgwNAo+PiArI2Rl ZmluZSBOQU5EQ19SRUdfQ01ECQkJMHgwOAo+PiArCj4+ICsvKiByZWdpc3RlciBvZmZzZXQgbmFu ZGMgdmVyc2lvbiA2ICovCj4+ICsjZGVmaW5lIE5BTkRDX1JFR19WNl9GTUNUTAkJMHgwMAo+PiAr I2RlZmluZSBOQU5EQ19SRUdfVjZfRk1XQUlUCQkweDA0Cj4+ICsjZGVmaW5lIE5BTkRDX1JFR19W Nl9GTENUTAkJMHgwOAo+PiArI2RlZmluZSBOQU5EQ19SRUdfVjZfQkNIQ1RMCQkweDBjCj4+ICsj ZGVmaW5lIE5BTkRDX1JFR19WNl9ETUFfQ0ZHCQkweDEwCj4+ICsjZGVmaW5lIE5BTkRDX1JFR19W Nl9ETUFfQlVGMAkJMHgxNAo+PiArI2RlZmluZSBOQU5EQ19SRUdfVjZfRE1BX0JVRjEJCTB4MTgK Pj4gKyNkZWZpbmUgTkFORENfUkVHX1Y2X0RNQV9TVAkJMHgxQwo+PiArI2RlZmluZSBOQU5EQ19S RUdfVjZfQkNIU1QJCTB4MjAKPj4gKyNkZWZpbmUgTkFORENfUkVHX1Y2X1JBTkRNWgkJMHgxNTAK Pj4gKyNkZWZpbmUgTkFORENfUkVHX1Y2X1ZFUgkJMHgxNjAKPj4gKyNkZWZpbmUgTkFORENfUkVH X1Y2X0lOVEVOCQkweDE2Qwo+PiArI2RlZmluZSBOQU5EQ19SRUdfVjZfSU5UQ0xSCQkweDE3MAo+ PiArI2RlZmluZSBOQU5EQ19SRUdfVjZfSU5UU1QJCTB4MTc0Cj4+ICsjZGVmaW5lIE5BTkRDX1JF R19WNl9TUEFSRTAJCTB4MjAwCj4+ICsjZGVmaW5lIE5BTkRDX1JFR19WNl9TUEFSRTEJCTB4MjMw Cj4+ICsKPj4gKy8qIHJlZ2lzdGVyIG9mZnNldCBuYW5kYyB2ZXJzaW9uIDkgKi8KPj4gKyNkZWZp bmUgTkFORENfUkVHX1Y5X0ZNQ1RMCQkweDAwCj4+ICsjZGVmaW5lIE5BTkRDX1JFR19WOV9GTVdB SVQJCTB4MDQKPj4gKyNkZWZpbmUgTkFORENfUkVHX1Y5X0ZMQ1RMCQkweDEwCj4+ICsjZGVmaW5l IE5BTkRDX1JFR19WOV9CQ0hDVEwJCTB4MjAKPj4gKyNkZWZpbmUgTkFORENfUkVHX1Y5X0RNQV9D RkcJCTB4MzAKPj4gKyNkZWZpbmUgTkFORENfUkVHX1Y5X0RNQV9CVUYwCQkweDM0Cj4+ICsjZGVm aW5lIE5BTkRDX1JFR19WOV9ETUFfQlVGMQkJMHgzOAo+PiArI2RlZmluZSBOQU5EQ19SRUdfVjlf RE1BX1NUCQkweDQwCj4+ICsjZGVmaW5lIE5BTkRDX1JFR19WOV9WRVIJCTB4ODAKPj4gKyNkZWZp bmUgTkFORENfUkVHX1Y5X0lOVEVOCQkweDEyMAo+PiArI2RlZmluZSBOQU5EQ19SRUdfVjlfSU5U Q0xSCQkweDEyNAo+PiArI2RlZmluZSBOQU5EQ19SRUdfVjlfSU5UU1QJCTB4MTI4Cj4+ICsjZGVm aW5lIE5BTkRDX1JFR19WOV9CQ0hTVAkJMHgxNTAKPj4gKyNkZWZpbmUgTkFORENfUkVHX1Y5X1NQ QVJFMAkJMHgyMDAKPj4gKyNkZWZpbmUgTkFORENfUkVHX1Y5X1NQQVJFMQkJMHgyMDQKPj4gKyNk ZWZpbmUgTkFORENfUkVHX1Y5X1JBTkRNWgkJMHgyMDgKPj4gKwo+PiArLyogcmVnaXN0ZXIgb2Zm c2V0IG5hbmRjIGNvbW1vbiAqLwo+PiArI2RlZmluZSBOQU5EQ19SRUdfQkFOSzAJCQkweDgwMAo+ PiArI2RlZmluZSBOQU5EQ19SRUdfU1JBTTAJCQkweDEwMDAKPj4gKwo+PiArLyogRk1DVEwgKi8K Pj4gKyNkZWZpbmUgTkFORENfVjZfRk1fV1AJCQlCSVQoOCkKPj4gKyNkZWZpbmUgTkFORENfVjZf Rk1fQ0VfU0VMX00JCTB4RkYKPj4gKyNkZWZpbmUgTkFORENfVjZfRk1fQ0VfU0VMKHgpCQkoMSA8 PCAoeCkpCj4+ICsjZGVmaW5lIE5BTkRDX1Y2X0ZNX0ZSRUFEWQkJQklUKDkpCj4+ICsKPj4gKyNk ZWZpbmUgTkFORENfVjlfRk1fV1AJCQlCSVQoOCkKPj4gKyNkZWZpbmUgTkFORENfVjlfRk1fQ0Vf U0VMX00JCTB4RkYKPj4gKyNkZWZpbmUgTkFORENfVjlfRk1fQ0VfU0VMKHgpCQkoMSA8PCAoeCkp Cj4+ICsjZGVmaW5lIE5BTkRDX1Y5X1JEWQkJCUJJVCg5KQo+PiArCj4+ICsvKiBGTENUTCAqLwo+ PiArI2RlZmluZSBOQU5EQ19WNl9GTF9SU1QJCQlCSVQoMCkKPj4gKyNkZWZpbmUgTkFORENfVjZf RkxfRElSKHgpCQkoKHgpID8gQklUKDEpIDogMCkKPj4gKyNkZWZpbmUgTkFORENfVjZfRkxfWEZF Ul9TVEFSVAkJQklUKDIpCj4+ICsjZGVmaW5lIE5BTkRDX1Y2X0ZMX1hGRVJfRU4JCUJJVCgzKQo+ PiArI2RlZmluZSBOQU5EQ19WNl9GTF9TVF9CVUZfUwkJMHg0Cj4+ICsjZGVmaW5lIE5BTkRDX1Y2 X0ZMX1hGRVJfQ09VTlQJCUJJVCg1KQo+PiArI2RlZmluZSBOQU5EQ19WNl9GTF9BQ09SUkVDVAkJ QklUKDEwKQo+PiArI2RlZmluZSBOQU5EQ19WNl9GTF9YRkVSX1JFQURZCQlCSVQoMjApCj4+ICsj ZGVmaW5lIE5BTkRDX1Y2X0ZMX1BBR0VfTlVNKHgpCQkoKHgpIDw8IDIyKQo+PiArI2RlZmluZSBO QU5EQ19WNl9GTF9BU1lOQ19UT0dfTUlYCUJJVCgyOSkKPj4gKwo+PiArI2RlZmluZSBOQU5EQ19W OV9GTF9SU1QJCQlCSVQoMCkKPj4gKyNkZWZpbmUgTkFORENfVjlfRkxfRElSKHgpCQkoKHgpID8g QklUKDEpIDogMCkKPj4gKyNkZWZpbmUgTkFORENfVjlfRkxfWEZFUl9TVEFSVAkJQklUKDIpCj4+ ICsjZGVmaW5lIE5BTkRDX1Y5X0ZMX1hGRVJfRU4JCUJJVCgzKQo+PiArI2RlZmluZSBOQU5EQ19W OV9GTF9TVF9CVUZfUwkJMHg0Cj4+ICsjZGVmaW5lIE5BTkRDX1Y5X0ZMX1hGRVJfQ09VTlQJCUJJ VCg1KQo+PiArI2RlZmluZSBOQU5EQ19WOV9GTF9BQ09SUkVDVAkJQklUKDEwKQo+PiArI2RlZmlu ZSBOQU5EQ19WOV9GTF9YRkVSX1JFQURZCQlCSVQoMjApCj4+ICsjZGVmaW5lIE5BTkRDX1Y5X0ZM X1BBR0VfTlVNKHgpCQkoKHgpIDw8IDIyKQo+PiArI2RlZmluZSBOQU5EQ19WOV9GTF9BU1lOQ19U T0dfTUlYCUJJVCgyOSkKPj4gKwo+PiArLyogQkNIQ1RMICovCj4+ICsjZGVmaW5lIE5BTkRfVjZf QkNIX1JFR0lPTl9TCQkweDUKPj4gKyNkZWZpbmUgTkFORF9WNl9CQ0hfUkVHSU9OX00JCTB4Nwo+ PiArCj4+ICsjZGVmaW5lIE5BTkRfVjlfQkNIX01PREVfUwkJMjUKPj4gKyNkZWZpbmUgTkFORF9W OV9CQ0hfTU9ERV9NCQkweDcKPj4gKwo+PiArLyogQkNIU1QgKi8KPj4gKyNkZWZpbmUgTkFORENf VjZfQkNIMF9TVF9FUlIJCUJJVCgyKQo+PiArI2RlZmluZSBOQU5EQ19WNl9CQ0gxX1NUX0VSUgkJ QklUKDE1KQo+PiArI2RlZmluZSBOQU5EQ19WNl9FQ0NfRVJSX0NOVDAoeCkJKCgoKHggJiAoMHgx RiA8PCAzKSkgPj4gMykgXAo+PiArCQkJCQl8ICgoeCAmICgxIDw8IDI3KSkgPj4gMjIpKSAmIDB4 M0YpCj4+ICsjZGVmaW5lIE5BTkRDX1Y2X0VDQ19FUlJfQ05UMSh4KQkoKCgoeCAmICgweDFGIDw8 IDE2KSkgPj4gMTYpIFwKPj4gKwkJCQkJfCAoKHggJiAoMSA8PCAyOSkpID4+IDI0KSkgJiAweDNG KQo+PiArCj4+ICsjZGVmaW5lIE5BTkRDX1Y5X0JDSDBfU1RfRVJSCQlCSVQoMikKPj4gKyNkZWZp bmUgTkFORENfVjlfQkNIMV9TVF9FUlIJCUJJVCgxOCkKPj4gKyNkZWZpbmUgTkFORENfVjlfRUND X0VSUl9DTlQwKHgpCSgoKHgpICYgKDB4N0YgPDwgMykpID4+IDMpCj4+ICsjZGVmaW5lIE5BTkRD X1Y5X0VDQ19FUlJfQ05UMSh4KQkoKCh4KSAmICgweDdGIDw8IDE5KSkgPj4gMTkpCj4+ICsKPj4g Ky8qIERNQV9DRkcgKi8KPj4gKyNkZWZpbmUgTkFORENfVjZfRE1BX0NGR19XUl9TVAkJQklUKDAp Cj4+ICsjZGVmaW5lIE5BTkRDX1Y2X0RNQV9DRkdfV1IoeCkJCSgoIXgpID8gQklUKDEpIDogMCkK Pj4gKyNkZWZpbmUgTkFORENfVjZfRE1BX0NGR19CVVNfTU9ERQlCSVQoMikKPj4gKwo+PiArI2Rl ZmluZSBOQU5EQ19WNl9ETUFfQ0ZHX0hTSVpFXzgJMAo+PiArI2RlZmluZSBOQU5EQ19WNl9ETUFf Q0ZHX0hTSVpFXzE2CSgxIDw8IDMpCj4+ICsjZGVmaW5lIE5BTkRDX1Y2X0RNQV9DRkdfSFNJWkVf MzIJKDIgPDwgMykKPj4gKwo+PiArI2RlZmluZSBOQU5EQ19WNl9ETUFfQ0ZHX0JVUlNUXzEJMAo+ PiArI2RlZmluZSBOQU5EQ19WNl9ETUFfQ0ZHX0JVUlNUXzQJKDMgPDwgNikKPj4gKyNkZWZpbmUg TkFORENfVjZfRE1BX0NGR19CVVJTVF84CSg1IDw8IDYpCj4+ICsjZGVmaW5lIE5BTkRDX1Y2X0RN QV9DRkdfQlVSU1RfMTYJKDcgPDwgNikKPj4gKwo+PiArI2RlZmluZSBOQU5EQ19WNl9ETUFfQ0ZH X0lOQ1JfTlVNKHgpCSgoeCkgPDwgOSkKPj4gKwo+PiArI2RlZmluZSBOQU5EQ19WOV9ETUFfQ0ZH X1dSX1NUCQlCSVQoMCkKPj4gKyNkZWZpbmUgTkFORENfVjlfRE1BX0NGR19XUih4KQkJKCgheCkg PyBCSVQoMSkgOiAwKQo+PiArI2RlZmluZSBOQU5EQ19WOV9ETUFfQ0ZHX0JVU19NT0RFCUJJVCgy KQo+PiArCj4+ICsjZGVmaW5lIE5BTkRDX1Y5X0RNQV9DRkdfSFNJWkVfOAkwCj4+ICsjZGVmaW5l IE5BTkRDX1Y5X0RNQV9DRkdfSFNJWkVfMTYJKDEgPDwgMykKPj4gKyNkZWZpbmUgTkFORENfVjlf RE1BX0NGR19IU0laRV8zMgkoMiA8PCAzKQo+PiArCj4+ICsjZGVmaW5lIE5BTkRDX1Y5X0RNQV9D RkdfQlVSU1RfMQkwCj4+ICsjZGVmaW5lIE5BTkRDX1Y5X0RNQV9DRkdfQlVSU1RfNAkoMyA8PCA2 KQo+PiArI2RlZmluZSBOQU5EQ19WOV9ETUFfQ0ZHX0JVUlNUXzgJKDUgPDwgNikKPj4gKyNkZWZp bmUgTkFORENfVjlfRE1BX0NGR19CVVJTVF8xNgkoNyA8PCA2KQo+PiArCj4+ICsjZGVmaW5lIE5B TkRDX1Y5X0RNQV9DRkdfSU5DUl9OVU0oeCkJKCh4KSA8PCA5KQo+PiArCj4+ICsvKiBJTlRFTiAq Lwo+PiArI2RlZmluZSBOQU5EQ19WNl9JTlRfRE1BCQlCSVQoMCkKPj4gKwo+PiArI2RlZmluZSBO QU5EQ19WOV9JTlRfRE1BCQlCSVQoMCkKPj4gKwo+PiArZW51bSBya19uYW5kY192ZXJzaW9uIHsK Pj4gKwlWRVJTSU9OXzYgPSA2LAo+PiArCVZFUlNJT05fOSA9IDksCj4+ICt9Owo+PiArCj4+ICtz dHJ1Y3QgcmtfbmFuZGNfZGF0YSB7Cj4+ICsJZW51bSBya19uYW5kY192ZXJzaW9uIHZlcnNpb247 Cj4KCj4gSWYgeW91IG1ha2UgYSBkaXN0aW5jdGlvbiBiZXR3ZWVuIGJvdGggdmVyc2lvbiwgbWF5 YmUgeW91IGNhbiBhZGQgbW9yZQo+IHBhcmFtZXRlcnMgaGVyZSBhbmQgZG8KPgo+IAlmb28gPSBk YXRhLT5wYXJhbQo+Cj4gaW5zdGVhZCBvZgo+Cj4gCWlmIChkYXRhLT52ZXJzaW9uID09IDYpCj4g CQlmb28gPSB0aGlzOwo+IAllbHNlCj4gCQlmb28gPSB0aGF0Owo+CgpUT0RPIHYyCgo+PiArfTsK Cgo+PiArCj4+ICtzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyIHsKPj4gKwl2b2lkIF9faW9tZW0g KnJlZ3M7Cj4+ICsJaW50IGlycTsKPj4gKwlzdHJ1Y3QgY2xrICpoY2xrOwo+PiArCXN0cnVjdCBj bGsgKmNsazsKPj4gKwlzdHJ1Y3QgbGlzdF9oZWFkIGNoaXBzOwo+PiArCXN0cnVjdCBjb21wbGV0 aW9uIGNvbXBsZXRlOwo+PiArCXN0cnVjdCBuYW5kX2NvbnRyb2xsZXIgY29udHJvbGxlcjsKPj4g KwlpbnQgYmFua3NbTkFORENfTlVNX0JBTktTXTsKPgo+PiArCWJvb2wgYm9vdHJvbWJsb2NrczsK Pj4gKwlpbnQgZWNjX21vZGU7Cj4+ICsJdWludDMyX3QgZWNjX3N0cmVuZ3RoOwo+PiArCWludCBt YXhfZWNjX3N0cmVuZ3RoOwo+Cgo+IEkgaGF2ZSBub3QgcmVhZCB5ZXQgdGhlIGVudGlyZSBkcml2 ZXIgYnV0IEkgYmVsaWV2ZSB0aGUgYWJvdmUgNAo+IHBhcmFtZXRlcnMgc2hvdWxkIHByb2JhYmx5 IGJlIG1vdmVkIGluIHJrX25hbmRfY2hpcCwgcmlnaHQ/IEFueXRoaW5nCj4gdGhhdCBpcyBOQU5E IGNoaXAgcmVsYXRlZCBzaG91bGQgbm90IGJlIGluIHRoZSBjb250cm9sbGVyIHN0cnVjdHVyZS4g SXQKPiBkZXBlbmRzIGlmIHlvdSBjYW4gY2hhbmdlIEVDQyByZXF1aXJlbWVudHMgb24gdGhlIGZs eSBvciBub3QuCgpTaG9ydCBhbnN3ZXI6ClRoZSByZWFzb24gdGhhdCBpdCBpcyB0aGUgbW9zdCBj b252ZW5pZW5jZSBwbGFjZSB0byBoYXZlIHRoZW0gZm9yIG5vdy4KV2l0aCBvbmUgcG9pbnRlciBm cm9tIG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YSgpIEkgaGF2ZSBhbGwgZGF0YSBhdmFpbGFibGUu CgpzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyICpjdHJsID0gbmFuZF9nZXRfY29udHJvbGxlcl9k YXRhKG5hbmQpOwoKVGhlIEVDQyBpcyBub3cgc29ydCBvZiBmaXhlZCB0byAyNCBhbmQgNDAgZm9y IGxlZ2FjeSByZWFzb25zLgpUaGUgb2xkZXIgcmszMDY2IGJvb3Ryb20gYXBwYXJlbnRseSBvbmx5 IHdvcmtzIGZvciBlY2MgMjQuClNlZSBpbmZvIGJhc2VkIG9uIG9sZGVyIHdvcmsgYnkgUGF3ZcWC IEphcm9zeiBmb3IgVWJvb3QuCgpJJ20gbm90IHRvbyBmYW1pbGlhciB3aXRoIGFsbCBpbm5lciB3 b3JraW5nIG9mIE1URCwgc28gcGxlYXNlIGFkdmlzZS4KQ2FuIHRoZSB1c2VycyBnZXQgYWNjZXNz IHRvIHN0cnVjdCBya19uYW5kX2NoaXA/CldvdWxkIHlvdSBsaWtlIHRvIGdpdmUgdXNlcnMgY29u dHJvbCBvdmVyIHdoYXQgZWNjIHRvIHVzZT8KV2hhdCBwcm9ncmFtIGNhbiB3ZSB1c2UgZm9yIHRo YXQ/IENhbid0IHVzZSBkZCB0aGVuIGFueSBtb3JlLgpIb3cgZG8gd2UgcmVnYWluIGVjYyBjb250 cm9sIGlmIHdlIHJlYWxseSBoYXZlIHRvIGZvciBleGFtcGxlIHJrMzA2Nj8KT3IgcmVtb3ZlIHRo YXQgYm9vdHJvbSBjaGVjayBhbmQgYWx3YXlzIHNldCBFQ0Mgd2l0aCBldmVyeQpya19uYW5kY19o d19zeW5kcm9tZV9lY2NfcmVhZF9wYWdlIGFuZCBya19uYW5kY19od19zeW5kcm9tZV9lY2Nfd3Jp dGVfcGFnZQp3aXRoIHdoYXRldmVyIHBhc3NlZCBhbG9uZz8KCj4KPj4gKwl1aW50MzJfdCAqb29i X2J1ZjsKPj4gKwl1aW50MzJfdCAqcGFnZV9idWY7Cj4+ICsJaW50IHNlbGVjdGVkX2Jhbms7Cj4+ ICsJZW51bSBya19uYW5kY192ZXJzaW9uIHZlcnNpb247Cj4+ICt9Owo+PiArCj4+ICtzdHJ1Y3Qg cmtfbmFuZF9jaGlwIHsKPj4gKwlzdHJ1Y3QgbmFuZF9jaGlwIG5hbmQ7Cj4+ICsJc3RydWN0IGxp c3RfaGVhZCBjaGlwX2xpc3Q7Cj4+ICt9Owo+PiArCj4+ICtzdGF0aWMgc3RydWN0IHJrX25hbmRf Y29udHJvbGxlciBnX25hbmRjX2luZm9bMl07Cj4KPiBJIGRvbid0IGxpa2UgdGhpcyBpZGVhIHNv IG11Y2guIEkgcHJlZmVyIGEgZHluYW1pYyBhbGxvY2F0aW9uIGluIHRoZQo+IHByb2JlLgo+Cj4+ ICtzdGF0aWMgaW50IGdfaWRfY291bnRlcjsKPgo+IERvbid0IGtub3cgd2hhdCB0aGlzIGlzIHll dCwgYnV0IGl0IGlzIHByb2JhYmx5IGEgYmFkIGlkZWEgOikKPgoKTWF5YmUgbm90IGludGVyZXN0 aW5nIGZvciBNVEQsIGJ1dCBSSzMyODggaGFzIDIgaWRlbnRpY2FsIE5BTkRDJ3MuClRoZSBjdXJy ZWN0IEZUTCBzZXR1cCBvbmx5IHdvcmtzIHdpdGggbmFuZGMwLgpUbyByZXVzZSB0aGUgcHJvYmUg ZnVuY3Rpb24gZm9yIG90aGVyIHRoaW5ncyB0aGVuIE1URAppdCBuZWVkcyB0byBiZSBhd2FyZSBv ZiBhbGlhcyBvcmRlci4KV2lsbCByZW1vdmUgaXQgZm9yIHZlcnNpb24gMi4KCj4+ICsKPj4gK3N0 YXRpYyB2b2lkIHJrX25hbmRjX2luaXQoc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCkK Pj4gK3sKPj4gKwlpZiAoY3RybC0+dmVyc2lvbiA9PSBWRVJTSU9OXzkpIHsKPj4gKwkJd3JpdGVs KDAsIGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjlfUkFORE1aKTsKPj4gKwkJd3JpdGVsKDAsIGN0 cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjlfRE1BX0NGRyk7Cj4+ICsJCXdyaXRlbChOQU5EQ19WOV9G TV9XUCwgY3RybC0+cmVncyArIE5BTkRDX1JFR19WOV9GTUNUTCk7Cj4+ICsJCXdyaXRlbChOQU5E Q19WOV9GTF9SU1QsIGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjlfRkxDVEwpOwo+PiArCQl3cml0 ZWwoMHgxMDgxLCBjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y5X0ZNV0FJVCk7Cj4+ICsJfSBlbHNl IHsKPj4gKwkJd3JpdGVsKDAsIGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjZfUkFORE1aKTsKPj4g KwkJd3JpdGVsKDAsIGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjZfRE1BX0NGRyk7Cj4+ICsJCXdy aXRlbChOQU5EQ19WNl9GTV9XUCwgY3RybC0+cmVncyArIE5BTkRDX1JFR19WNl9GTUNUTCk7Cj4+ ICsJCXdyaXRlbChOQU5EQ19WNl9GTF9SU1QsIGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjZfRkxD VEwpOwo+PiArCQl3cml0ZWwoMHgxMDgxLCBjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y2X0ZNV0FJ VCk7Cj4+ICsJfQo+Cj4gTXkgYWJvdmUgY29tbWVudCBhYm91dCB0aGUgcGxhdGZvcm0gZGF0YSB3 b3VsZCBtYWtlIGEgbG90IG9mIHNlbnNlIGhlcmUhCj4KPj4gK30KPj4gKwo+PiArc3RhdGljIGly cXJldHVybl90IHJrX25hbmRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCj4+ICt7 Cj4+ICsJc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCA9IGRldl9pZDsKPj4gKwo+PiAr CWlmIChjdHJsLT52ZXJzaW9uID09IFZFUlNJT05fOSkgewo+PiArCQl1aW50MzJfdCBzdCA9IHJl YWRsKGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjlfSU5UU1QpOwo+PiArCQl1aW50MzJfdCBpZW4g PSByZWFkbChjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y5X0lOVEVOKTsKPj4gKwo+PiArCQlpZiAo IShpZW4gJiBzdCkpCj4+ICsJCQlyZXR1cm4gSVJRX05PTkU7Cj4+ICsKPj4gKwkJaWYgKChpZW4g JiBzdCkgPT0gaWVuKQo+PiArCQkJY29tcGxldGUoJmN0cmwtPmNvbXBsZXRlKTsKPj4gKwo+PiAr CQl3cml0ZWwoc3QsIGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjlfSU5UQ0xSKTsKPj4gKwkJd3Jp dGVsKH5zdCAmIGllbiwgY3RybC0+cmVncyArIE5BTkRDX1JFR19WOV9JTlRFTik7Cj4+ICsJfSBl bHNlIHsKPj4gKwkJdWludDMyX3Qgc3QgPSByZWFkbChjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y2 X0lOVFNUKTsKPj4gKwkJdWludDMyX3QgaWVuID0gcmVhZGwoY3RybC0+cmVncyArIE5BTkRDX1JF R19WNl9JTlRFTik7Cj4+ICsKPj4gKwkJaWYgKCEoaWVuICYgc3QpKQo+PiArCQkJcmV0dXJuIElS UV9OT05FOwo+PiArCj4+ICsJCWlmICgoaWVuICYgc3QpID09IGllbikKPj4gKwkJCWNvbXBsZXRl KCZjdHJsLT5jb21wbGV0ZSk7Cj4+ICsKPj4gKwkJd3JpdGVsKHN0LCBjdHJsLT5yZWdzICsgTkFO RENfUkVHX1Y2X0lOVENMUik7Cj4+ICsJCXdyaXRlbCh+c3QgJiBpZW4sIGN0cmwtPnJlZ3MgKyBO QU5EQ19SRUdfVjZfSU5URU4pOwo+PiArCX0KPgo+IFNhbWUgY29tbWVudCEKPgo+PiArCj4+ICsJ cmV0dXJuIElSUV9IQU5ETEVEOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBya19uYW5kY19z ZWxlY3RfY2hpcChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLCBpbnQgY2hpcG5yKQo+PiArewo+PiAr CXN0cnVjdCBya19uYW5kX2NvbnRyb2xsZXIgKmN0cmwgPSBuYW5kX2dldF9jb250cm9sbGVyX2Rh dGEobmFuZCk7Cj4+ICsJdWludDMyX3QgcmVnOwo+PiArCWludCBiYW5rbnI7Cj4+ICsKPj4gKwkv KiBUaGUgcmVnaXN0ZXIgb2Zmc2V0IGFuZCBiaXQgcG9zaXRpb25zIGZvcgo+Cj4gc2hvdWxkIGJl Ogo+Cj4gCS8qCj4gCSAqIFRoZSByZWdpc3Rlci4uLgo+Cgo+IFBsZWFzZSBydW4gY2hlY2twYXRj aC5wbCAtLXN0cmljdCBvbiB0aGlzIGZpbGUsIHRoaXMga2luZCBvZiBtaXN0YWtlCj4gd291bGQg aGF2ZSBiZWVuIGRldGVjdGVkLgo+CgpXaGVuIHlvdSB0aGluayB0aGF0IHlvdSBnb3QgcmlkIG9m IGFsbCB3YXJuaW5ncyB0aGVyZSdzIGFsd2F5cwphbiBleHRyYSBvcHRpb24gZm9yIG1vcmUuLi4K VGhhbmtzIGZvciB0aGF0IGFkdmljZS4KCj4+ICsJICogTkFORENfUkVHX1Y2X0ZNQ1RMIGFuZCBO QU5EQ19SRUdfVjlfRk1DVEwKPj4gKwkgKiBhcmUgaWRlbnRpY2FsLgo+PiArCSAqLwo+PiArCXJl ZyA9IHJlYWRsKGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjZfRk1DVEwpOwo+PiArCXJlZyAmPSB+ TkFORENfVjZfRk1fQ0VfU0VMX007Cj4+ICsKPj4gKwlpZiAoY2hpcG5yID09IC0xKSB7Cj4+ICsJ CWJhbmtuciA9IC0xOwo+PiArCX0gZWxzZSB7Cj4+ICsJCWJhbmtuciA9IGN0cmwtPmJhbmtzW2No aXBucl07Cj4+ICsKPj4gKwkJcmVnIHw9IE5BTkRDX1Y2X0ZNX0NFX1NFTChiYW5rbnIpOwo+PiAr CX0KPj4gKwl3cml0ZWwocmVnLCBjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y2X0ZNQ1RMKTsKPgo+ IE1heWJlIHlvdSBjYW4gc3BhcmUgdGhpcyB3cml0ZWwgYnkgcmV0dXJuaW5nIGVhcmx5IGlmIGJh bmtuciA9PQo+IGN0cmwtPnNlbGVjdGVkX2JhbmsuCj4KPj4gKwo+PiArCWN0cmwtPnNlbGVjdGVk X2JhbmsgPSBiYW5rbnI7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcmtfbmFuZGNfaHdfZWNj X3NldHVwKHN0cnVjdCBuYW5kX2NoaXAgKm5hbmQsCj4+ICsJCQkJIHVpbnQzMl90IHN0cmVuZ3Ro KQo+PiArewo+PiArCXN0cnVjdCBya19uYW5kX2NvbnRyb2xsZXIgKmN0cmwgPSBuYW5kX2dldF9j b250cm9sbGVyX2RhdGEobmFuZCk7Cj4+ICsJdWludDMyX3QgcmVnOwo+PiArCj4+ICsJbmFuZC0+ ZWNjLnN0cmVuZ3RoID0gc3RyZW5ndGg7CgpTaG91bGQgSSBhZGQgdGhpcyBjb21tZW50IGJlbG93 PwoKLyogSFcgRUNDIGFsd2F5cyByZXF1ZXN0IEVDQyBieXRlcyBmb3IgMTAyNCBieXRlcyBibG9j a3MgKi8KCj4+ICsJbmFuZC0+ZWNjLmJ5dGVzID0gRElWX1JPVU5EX1VQKG5hbmQtPmVjYy5zdHJl bmd0aCAqIDE0LCA4KTsKPgoKPiBXaGF0IGRvIDE0IGFuZCA4IG1lYW4/CgpmbHMgLSBmaW5kIGxh c3QgKG1vc3Qtc2lnbmlmaWNhbnQpIGJpdCBzZXQKCmludCBmbHModW5zaWduZWQgaW50IHgpCnsK CWludCByID0gMzI7CgoJaWYgKCF4KQoJCXJldHVybiAwOwoJaWYgKCEoeCAmIDB4ZmZmZjAwMDB1 KSkgewoJCXggPDw9IDE2OwoJCXIgLT0gMTY7Cgl9CglpZiAoISh4ICYgMHhmZjAwMDAwMHUpKSB7 CgkJeCA8PD0gODsKCQlyIC09IDg7Cgl9CglpZiAoISh4ICYgMHhmMDAwMDAwMHUpKSB7CgkJeCA8 PD0gNDsKCQlyIC09IDQ7Cgl9CglpZiAoISh4ICYgMHhjMDAwMDAwMHUpKSB7CgkJeCA8PD0gMjsK CQlyIC09IDI7Cgl9CglpZiAoISh4ICYgMHg4MDAwMDAwMHUpKSB7CgkJeCA8PD0gMTsKCQlyIC09 IDE7Cgl9CglyZXR1cm4gcjsKfQoKCW5hbmQtPmVjYy5ieXRlcyA9IERJVl9ST1VORF9VUChlY2Mt PnN0cmVuZ3RoICogZmxzKDggKiAxMDI0KSwgOCk7Cgpmb3JtdWxlIGlzIHVzZWQgdG8gdHJhbnNs YXRlIHN0cmVuZ3RoIGluIGJpdC8xMDI0IEJDSC9FQ0MKdG8gTVREIEVDQyBieXRlcyBmb3IgMTAy NCBieXRlcyBibG9ja3MgaW4gbmFuZC0+ZWNjLmJ5dGVzCgoxNCBpcyByZXBsYWNlbWVudCBmb3Ig ZmxzKDggKiAxMDI0KQo4IGJpdHMgaW4gYSBieXRlCgo+Cj4+ICsJLyogSFcgRUNDIG9ubHkgd29y a3Mgd2l0aCBhbiBldmVuIG51bWJlciBvZiBFQ0MgYnl0ZXMgKi8KPj4gKwluYW5kLT5lY2MuYnl0 ZXMgPSBBTElHTihuYW5kLT5lY2MuYnl0ZXMsIDIpOwo+PiArCj4+ICsJaWYgKGN0cmwtPnZlcnNp b24gPT0gVkVSU0lPTl85KSB7Cj4+ICsJCXN3aXRjaCAobmFuZC0+ZWNjLnN0cmVuZ3RoKSB7Cj4+ ICsJCWNhc2UgNzA6Cj4+ICsJCQlyZWcgPSBOQU5EQ19WOV9FQ0NfNzA7Cj4+ICsJCQlicmVhazsK Pj4gKwkJY2FzZSA2MDoKPj4gKwkJCXJlZyA9IE5BTkRDX1Y5X0VDQ182MDsKPj4gKwkJCWJyZWFr Owo+PiArCQljYXNlIDQwOgo+PiArCQkJcmVnID0gTkFORENfVjlfRUNDXzQwOwo+PiArCQkJYnJl YWs7Cj4+ICsJCWNhc2UgMTY6Cj4+ICsJCQlyZWcgPSBOQU5EQ19WOV9FQ0NfMTY7Cj4+ICsJCQli cmVhazsKPj4gKwkJZGVmYXVsdDoKPj4gKwkJCXJldHVybiAtRUlOVkFMOwo+PiArCQl9Cj4+ICsJ CXdyaXRlbChyZWcsIGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjlfQkNIQ1RMKTsKPj4gKwl9IGVs c2Ugewo+PiArCQlzd2l0Y2ggKG5hbmQtPmVjYy5zdHJlbmd0aCkgewo+PiArCQljYXNlIDYwOgo+ PiArCQkJcmVnID0gTkFORENfVjZfRUNDXzYwOwo+PiArCQkJYnJlYWs7Cj4+ICsJCWNhc2UgNDA6 Cj4+ICsJCQlyZWcgPSBOQU5EQ19WNl9FQ0NfNDA7Cj4+ICsJCQlicmVhazsKPj4gKwkJY2FzZSAy NDoKPj4gKwkJCXJlZyA9IE5BTkRDX1Y2X0VDQ18yNDsKPj4gKwkJCWJyZWFrOwo+PiArCQljYXNl IDE2Ogo+PiArCQkJcmVnID0gTkFORENfVjZfRUNDXzE2Owo+PiArCQkJYnJlYWs7Cj4+ICsJCWRl ZmF1bHQ6Cj4+ICsJCQlyZXR1cm4gLUVJTlZBTDsKPj4gKwkJfQo+PiArCQl3cml0ZWwocmVnLCBj dHJsLT5yZWdzICsgTkFORENfUkVHX1Y2X0JDSENUTCk7Cj4+ICsJfQo+PiArCj4+ICsJcmV0dXJu IDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB2b2lkIHJrX25hbmRjX3hmZXJfc3RhcnQoc3RydWN0 IHJrX25hbmRfY29udHJvbGxlciAqY3RybCwKPj4gKwkJCQl1aW50OF90IGRpciwgdWludDhfdCBu X0tCLAo+PiArCQkJCWRtYV9hZGRyX3QgZG1hX2RhdGEsIGRtYV9hZGRyX3QgZG1hX29vYikKPj4g K3sKPj4gKwl1aW50MzJfdCByZWc7Cj4+ICsKPj4gKwlpZiAoY3RybC0+dmVyc2lvbiA9PSBWRVJT SU9OXzkpIHsKPj4gKwkJcmVnID0gTkFORENfVjlfRE1BX0NGR19XUl9TVCB8Cj4+ICsJCSAgICAg IE5BTkRDX1Y5X0RNQV9DRkdfV1IoZGlyKSB8Cj4+ICsJCSAgICAgIE5BTkRDX1Y5X0RNQV9DRkdf QlVTX01PREUgfAo+PiArCQkgICAgICBOQU5EQ19WOV9ETUFfQ0ZHX0hTSVpFXzMyIHwKPj4gKwkJ ICAgICAgTkFORENfVjlfRE1BX0NGR19CVVJTVF8xNiB8Cj4+ICsJCSAgICAgIE5BTkRDX1Y5X0RN QV9DRkdfSU5DUl9OVU0oMTYpOwo+PiArCQl3cml0ZWwocmVnLCBjdHJsLT5yZWdzICsgTkFORENf UkVHX1Y5X0RNQV9DRkcpOwo+PiArCQl3cml0ZWwoKHVpbnQzMl90KWRtYV9kYXRhLCBjdHJsLT5y ZWdzICsgTkFORENfUkVHX1Y5X0RNQV9CVUYwKTsKPj4gKwkJd3JpdGVsKCh1aW50MzJfdClkbWFf b29iLCBjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y5X0RNQV9CVUYxKTsKPgo+IEknbSBwcmV0dHkg c3VyZSBtb3N0IG9mIHRoZXNlIHdyaXRlbCBjb3VsZCBiZSB0dXJuZWQgaW50bwo+IHdyaXRlbF9y ZWxheGVkLgoKd3JpdGVsKCkgICAgICAgLS0gd3JpdGUgdG8gdGhlIGxpdHRsZS1lbmRpYW4gaGFy ZHdhcmUgcmVnaXN0ZXIgd2l0aApjb21waWxlciBtZW1vcnkgYmFycmllciwKd3JpdGVsX3JlbGF4 ZWQgLS0gYXMgYWJvdmUsIHdpdGhvdXQgYmFycmllciwKX19yYXdfd3JpdGVsKCkgLS0gYXMgYWJv dmUgKHdyaXRlbF9yZWxheGVkKCkpIHdpdGhvdXQgZW5kaWFuZXNzCmNvbnZlcnNpb24gKENQVSBv cmRlcmluZyB3aWxsIGJlIHVzZWQpLgpBcmNoaXRlY3R1cmUtZGVwZW5kZW50LgpJIGRvbid0IGtu b3cuCgo+Cj4gQWxzbyBJIGFtIG5vdCBhIGJpZyBmYW4gb2YgdGhlc2UgY2FzdHMsIG1heWJlIHlv dSBzaG91bGQgY2hhbmdlCj4gZG1hX2RhdGEgYW5kIGRtYV9vb2IgdHlwZXMgKGJlIGNhcmVmdWw6 IHlvdSBlbmFibGVkIENPTVBJTEVfVEVTVCBpbgo+IEtjb25maWcsIHlvdSBtdXN0IHN1cHBvcnQg MzItYml0IGFuZCA2NC1iaXQgcG9pbnRlcnMsIHBsZWFzZSB0cnkgdG8KPiBjb21waWxlIHRoaXMg ZHJpdmVyIHdpdGggZGlmZmVyZW50IHRvb2xjaGFpbnMpLgoKRHJpdmVyIGlzIHVzZWQgZm9yIGJv dGggQVJNIGFzIGFybTY0LgpUaGVzZSByZWdpc3RlcnMgYXJlIDMyIGJpdC4gUGxlYXNlIGFkdmlz ZSB3aGF0IGhhcHBlbnMKd2hlbiB3cml0ZWwgZ2V0cyBkbWFfYWRkcl90IGFuZCBkbWFfZGF0YSBh cyA2NCBiaXQuCkRvbid0IGhhdmUgdGhlIGhhcmR3YXJlIHRvIGZpbmQgb3V0LgoKPgo+PiArCj4+ ICsJCXJlZyA9IE5BTkRDX1Y5X0ZMX0RJUihkaXIpIHwKPj4gKwkJICAgICAgTkFORENfVjlfRkxf WEZFUl9FTiB8Cj4+ICsJCSAgICAgIE5BTkRDX1Y5X0ZMX1hGRVJfQ09VTlQgfAo+PiArCQkgICAg ICBOQU5EQ19WOV9GTF9BQ09SUkVDVCB8Cj4+ICsJCSAgICAgIE5BTkRDX1Y5X0ZMX1BBR0VfTlVN KG5fS0IpIHwKPj4gKwkJICAgICAgTkFORENfVjlfRkxfQVNZTkNfVE9HX01JWDsKPj4gKwkJd3Jp dGVsKHJlZywgY3RybC0+cmVncyArIE5BTkRDX1JFR19WOV9GTENUTCk7Cj4+ICsJCXJlZyB8PSBO QU5EQ19WOV9GTF9YRkVSX1NUQVJUOwo+PiArCQl3cml0ZWwocmVnLCBjdHJsLT5yZWdzICsgTkFO RENfUkVHX1Y5X0ZMQ1RMKTsKPj4gKwl9IGVsc2Ugewo+PiArCQlyZWcgPSByZWFkbChjdHJsLT5y ZWdzICsgTkFORENfUkVHX1Y2X0JDSENUTCk7Cj4+ICsJCXJlZyA9IChyZWcgJiAofihOQU5EX1Y2 X0JDSF9SRUdJT05fTSA8PAo+PiArCQkJCU5BTkRfVjZfQkNIX1JFR0lPTl9TKSkpIHwKPj4gKwkJ ICAgICAgKGN0cmwtPnNlbGVjdGVkX2JhbmsgPDwgTkFORF9WNl9CQ0hfUkVHSU9OX1MpOwo+PiAr CQl3cml0ZWwocmVnLCBjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y2X0JDSENUTCk7Cj4+ICsKPj4g KwkJcmVnID0gTkFORENfVjZfRE1BX0NGR19XUl9TVCB8Cj4+ICsJCSAgICAgIE5BTkRDX1Y2X0RN QV9DRkdfV1IoZGlyKSB8Cj4+ICsJCSAgICAgIE5BTkRDX1Y2X0RNQV9DRkdfQlVTX01PREUgfAo+ PiArCQkgICAgICBOQU5EQ19WNl9ETUFfQ0ZHX0hTSVpFXzMyIHwKPj4gKwkJICAgICAgTkFORENf VjZfRE1BX0NGR19CVVJTVF8xNiB8Cj4+ICsJCSAgICAgIE5BTkRDX1Y2X0RNQV9DRkdfSU5DUl9O VU0oMTYpOwo+PiArCQl3cml0ZWwocmVnLCBjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y2X0RNQV9D RkcpOwo+PiArCQl3cml0ZWwoZG1hX2RhdGEsIGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjZfRE1B X0JVRjApOwo+PiArCQl3cml0ZWwoZG1hX29vYiwgY3RybC0+cmVncyArIE5BTkRDX1JFR19WNl9E TUFfQlVGMSk7CgpTYW1lIGhlcmUuCgo+PiArCj4+ICsJCXJlZyA9IE5BTkRDX1Y2X0ZMX0RJUihk aXIpIHwKPj4gKwkJICAgICAgTkFORENfVjZfRkxfWEZFUl9FTiB8Cj4+ICsJCSAgICAgIE5BTkRD X1Y2X0ZMX1hGRVJfQ09VTlQgfAo+PiArCQkgICAgICBOQU5EQ19WNl9GTF9BQ09SUkVDVCB8Cj4+ ICsJCSAgICAgIE5BTkRDX1Y2X0ZMX1BBR0VfTlVNKG5fS0IpIHwKPj4gKwkJICAgICAgTkFORENf VjZfRkxfQVNZTkNfVE9HX01JWDsKPj4gKwkJd3JpdGVsKHJlZywgY3RybC0+cmVncyArIE5BTkRD X1JFR19WNl9GTENUTCk7Cj4+ICsJCXJlZyB8PSBOQU5EQ19WNl9GTF9YRkVSX1NUQVJUOwo+PiAr CQl3cml0ZWwocmVnLCBjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y2X0ZMQ1RMKTsKPj4gKwl9Cj4+ ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcmtfbmFuZGNfd2FpdF9mb3JfeGZlcl9kb25lKHN0cnVj dCBya19uYW5kX2NvbnRyb2xsZXIgKmN0cmwpCj4+ICt7Cj4+ICsJdWludDMyX3QgcmVnOwo+PiAr CWludCByZXQ7Cj4+ICsKPj4gKwlpZiAoY3RybC0+dmVyc2lvbiA9PSBWRVJTSU9OXzkpIHsKPj4g KwkJdm9pZCBfX2lvbWVtICpwdHIgPSBjdHJsLT5yZWdzICsgTkFORENfUkVHX1Y5X0ZMQ1RMOwo+ PiArCj4+ICsJCXJldCA9IHJlYWRsX3BvbGxfdGltZW91dF9hdG9taWMocHRyLCByZWcsCj4+ICsJ CQkJCQlyZWcgJiBOQU5EQ19WOV9GTF9YRkVSX1JFQURZLAo+PiArCQkJCQkJMSwgTkFORENfREVG X1RJTUVPVVQpOwo+PiArCX0gZWxzZSB7Cj4+ICsJCXZvaWQgX19pb21lbSAqcHRyID0gY3RybC0+ cmVncyArIE5BTkRDX1JFR19WNl9GTENUTDsKPj4gKwo+PiArCQlyZXQgPSByZWFkbF9wb2xsX3Rp bWVvdXRfYXRvbWljKHB0ciwgcmVnLAo+PiArCQkJCQkJcmVnICYgTkFORENfVjZfRkxfWEZFUl9S RUFEWSwKPj4gKwkJCQkJCTEsIE5BTkRDX0RFRl9USU1FT1VUKTsKPj4gKwl9Cj4KPiBTcGFjZQo+ Cj4+ICsJaWYgKHJldCkKPj4gKwkJcHJfZXJyKCJ0aW1lb3V0IHJlZz0leFxuIiwgcmVnKTsKPj4g Kwo+PiArCXJldHVybiByZXQ7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJr X25hbmRjX2RtYV9tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwKPj4gKwkJdm9pZCAqcHRy LCBpbnQgc2l6ZSwgaW50IGRpcikKPgoKPiBVbmFsaWduZWQgcGFyYW1ldGVycwoKVG8gcmVzdHls ZSBJIHVzZToKYXN0eWxlIC1UOCAtLW1heC1jb2RlLWxlbmd0aD04MCAtLXN0eWxlPWxpbnV4IHJv Y2tjaGlwX25hbmRjLmMKClBsZWFzZSBhZHZpc2UgZm9yIGEgYmV0dGVyIHNvbHV0aW9uLgoKPgo+ PiArewo+PiArI2lmZGVmIENPTkZJR19BUk02NAo+PiArCV9fZG1hX21hcF9hcmVhKCh2b2lkICop cHRyLCBzaXplLCBkaXIpOwo+PiArCXJldHVybiAoKHVuc2lnbmVkIGxvbmcpdmlydF90b19waHlz KCh2b2lkICopcHRyKSk7Cj4+ICsjZWxzZQo+PiArCXJldHVybiBkbWFfbWFwX3NpbmdsZShkZXYs ICh2b2lkICopcHRyLCBzaXplLCBkaXIpOwo+PiArI2VuZGlmCj4KCj4gUGxlYXNlIHRyeSB0byBy ZW1vdmUgdGhlc2UgI2lmZGVmcywgSSBkb24ndCBrbm93IHdoeSB3b3VsZCB5b3UgbmVlZCB0aGUK PiBmb3JtZXIgYmxvY2s/CgpUaGlzIGRyaXZlciBpcyB1c2VkIGJvdGggZm9yIEFSTSBhcyBhcm02 NC4KT3JpZ2luYWwgZnJvbSBSb2NrY2hpcDogYXJtNjQgZG9lc24ndCBoYXZlIGRtYV9tYXBfc2lu Z2xlKCkgYXMgSSByZW1lbWJlci4KRG9uJ3Qga25vdyB3aGF0IHRvIHVzZSBpbnN0ZWFkLgpQbGVh c2UgYWR2aXNlLgoKPgo+PiArfQo+PiArCj4+ICtzdGF0aWMgdm9pZCBya19uYW5kY19kbWFfdW5t YXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmRldiwKPj4gKwkJCQkgICAgICB1bnNpZ25lZCBsb25n IHB0ciwgaW50IHNpemUsIGludCBkaXIpCj4+ICt7Cj4+ICsjaWZkZWYgQ09ORklHX0FSTTY0Cj4+ ICsJX19kbWFfdW5tYXBfYXJlYShwaHlzX3RvX3ZpcnQocHRyKSwgc2l6ZSwgZGlyKTsKPj4gKyNl bHNlCj4+ICsJZG1hX3VubWFwX3NpbmdsZShkZXYsIChkbWFfYWRkcl90KXB0ciwgc2l6ZSwgZGly KTsKPj4gKyNlbmRpZgo+Cj4gU2FtZQo+Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcmtfbmFu ZGNfaHdfc3luZHJvbWVfZWNjX3JlYWRfcGFnZShzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLAo+PiAr CQl1aW50OF90ICpidWYsCj4+ICsJCWludCBvb2JfcmVxdWlyZWQsIGludCBwYWdlKQo+Cgo+IFVu YWxpZ25lZCBwYXJhbWV0ZXJzIChwbGVhc2UgY2hlY2sgYWxsIG9mIHRoZW0pLgoKQWdhaW4gYmxh bWUgYXN0eWxlIC4uLgpBZnRlciBjb3JyZWN0aW5nIGl0IG1hbnVhbGx5IGEgZmV3IHRpbWUgSSBq dXN0IGxlZnQgaXQgYXMgaXQgaXMuCgo+Cj4+ICt7Cj4+ICsJc3RydWN0IG10ZF9pbmZvICptdGQg PSBuYW5kX3RvX210ZChuYW5kKTsKPj4gKwlzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyICpjdHJs ID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRhKG5hbmQpOwo+PiArCXN0cnVjdCBuYW5kX2VjY19j dHJsICplY2MgPSAmbmFuZC0+ZWNjOwo+PiArCWludCBtYXhfYml0ZmxpcHMgPSAwOwo+PiArCWRt YV9hZGRyX3QgZG1hX2RhdGEsIGRtYV9vb2I7Cj4+ICsJaW50IHJldCwgaTsKPj4gKwlpbnQgYmNo X3N0Owo+PiArCWludCBkbWFfb29iX3NpemUgPSBlY2MtPnN0ZXBzICogMTI4Owo+PiArCWludCBw YWdlc19wZXJfYmxrID0gbXRkLT5lcmFzZXNpemUgLyBtdGQtPndyaXRlc2l6ZTsKPj4gKwo+PiAr CXJrX25hbmRjX3NlbGVjdF9jaGlwKG5hbmQsIGN0cmwtPnNlbGVjdGVkX2JhbmspOwo+PiArCj4+ ICsJaWYgKChwYWdlIDwgcGFnZXNfcGVyX2JsayAqIE5BTkRDX0lEQlJlc0Jsa051bSkgJiYKPgoK PiBDYW1lbCBjYXNlIGlzIHVzdWFsbHkgbm90IHdlbGNvbWUKCkFueSBzdWdnZXN0aW9ucyBmb3Ig YSBiZXRlciByZXBsYWNlIGZvciBOQU5EQ19JREJSZXNCbGtOdW0gYXJlIHdlbGNvbWUuCgo+Cj4+ ICsJICAgIGN0cmwtPmJvb3Ryb21ibG9ja3MpCj4KPiBUaGlzIHdvdWxkIHByb2JhYmx5IGRlc2Vy dmUgYSBoZWxwZXIKPgo+PiArCQlya19uYW5kY19od19lY2Nfc2V0dXAobmFuZCwgTkFORENfSURC RWNjQml0cyk7Cj4+ICsKPj4gKwluYW5kX3JlYWRfcGFnZV9vcChuYW5kLCBwYWdlLCAwLCBOVUxM LCAwKTsKPj4gKwo+PiArCWRtYV9kYXRhID0gcmtfbmFuZGNfZG1hX21hcF9zaW5nbGUobXRkLT5k ZXYucGFyZW50LAo+PiArCQkJCQkgICBjdHJsLT5wYWdlX2J1ZiwgbXRkLT53cml0ZXNpemUsCj4+ ICsJCQkJCSAgIERNQV9GUk9NX0RFVklDRSk7Cj4+ICsJZG1hX29vYiA9IHJrX25hbmRjX2RtYV9t YXBfc2luZ2xlKG10ZC0+ZGV2LnBhcmVudCwKPj4gKwkJCQkJICBjdHJsLT5vb2JfYnVmLCBkbWFf b29iX3NpemUsCj4+ICsJCQkJCSAgRE1BX0ZST01fREVWSUNFKTsKPj4gKwo+PiArCWluaXRfY29t cGxldGlvbigmY3RybC0+Y29tcGxldGUpOwo+Cgo+IE9uZSBpbml0X2NvbXBsZXRpb24gaXMgbmVl ZGVkIChpbiB0aGUgcHJvYmUsIHByb2JhYmx5KSB0aGVuIHBsZWFzZSB1c2UKPiByZWluaXRfY29t cGxldGlvbigpLgoKTXVzdCBzdHVkeSB0aGlzIGxhdGVyLgoKPgo+PiArCWlmIChjdHJsLT52ZXJz aW9uID09IFZFUlNJT05fOSkKPj4gKwkJd3JpdGVsKE5BTkRDX1Y5X0lOVF9ETUEsIGN0cmwtPnJl Z3MgKyBOQU5EQ19SRUdfVjlfSU5URU4pOwo+PiArCWVsc2UKPj4gKwkJd3JpdGVsKE5BTkRDX1Y2 X0lOVF9ETUEsIGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjZfSU5URU4pOwo+PiArCXJrX25hbmRj X3hmZXJfc3RhcnQoY3RybCwgMCwgZWNjLT5zdGVwcywgZG1hX2RhdGEsIGRtYV9vb2IpOwoKPj4g Kwl3YWl0X2Zvcl9jb21wbGV0aW9uX3RpbWVvdXQoJmN0cmwtPmNvbXBsZXRlLCBtc2Vjc190b19q aWZmaWVzKDUpKTsKPj4gKwlya19uYW5kY193YWl0X2Zvcl94ZmVyX2RvbmUoY3RybCk7Cj4KPiBZ b3VzIHNob3VsZCBjaGVjayB0aGUgcmV0dXJuIHN0YXR1cyBvZiBhbG1vc3QgYWxsIHRoZSBmdW5j dGlvbnMgaGVyZS4KClBsZWFzZSBhZHZpc2Ugd2hhdCBFUlJPUiBjb2RlIHNob3VsZCBiZSByZXR1 cm5lZCBoZXJlCnRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIE1URC4KCj4KPj4gKwlya19uYW5kY19k bWFfdW5tYXBfc2luZ2xlKG10ZC0+ZGV2LnBhcmVudCwgZG1hX2RhdGEsIG10ZC0+d3JpdGVzaXpl LAo+PiArCQkJCSAgRE1BX0ZST01fREVWSUNFKTsKPj4gKwlya19uYW5kY19kbWFfdW5tYXBfc2lu Z2xlKG10ZC0+ZGV2LnBhcmVudCwgZG1hX29vYiwgZG1hX29vYl9zaXplLAo+PiArCQkJCSAgRE1B X0ZST01fREVWSUNFKTsKPj4gKwo+PiArCW1lbWNweShidWYsIGN0cmwtPnBhZ2VfYnVmLCBtdGQt PndyaXRlc2l6ZSk7Cj4+ICsKPj4gKwlpZiAob29iX3JlcXVpcmVkKSB7Cj4+ICsJCXVpbnQ4X3Qg Km9vYjsKPj4gKwkJdWludDMyX3QgdG1wOwo+Cgo+IFBsZWFzZSB1c2UgdTgsIHUxNiBhbmQgdTMy IHR5cGVzLgoKU2hvdWxkIHRoaXMgYmUgY2hhbmdlZCBmb3IgdGhlIGVudGlyZSBzb3VyY2U/Cgo+ Cj4+ICsKPj4gKwkJZm9yIChpID0gMDsgaSA8IGVjYy0+c3RlcHM7IGkrKykgewo+PiArCQkJb29i ID0gbmFuZC0+b29iX3BvaSArCj4+ICsJCQkgICAgICBpICogKGVjYy0+Ynl0ZXMgKyBuYW5kLT5l Y2MucHJlcGFkKTsKPj4gKwkJCWlmIChjdHJsLT52ZXJzaW9uID09IFZFUlNJT05fOSkgewo+PiAr CQkJCXRtcCA9IGN0cmwtPm9vYl9idWZbaV07Cj4+ICsJCQl9IGVsc2Ugewo+PiArCQkJCXVpbnQ4 X3Qgb29iX3N0ZXAgPSAoY3RybC0+ZWNjX21vZGUgPD0gMjQpID8KPj4gKwkJCQkJCSAgIDY0IDog MTI4Owo+PiArCQkJCXRtcCA9IGN0cmwtPm9vYl9idWZbaSAqIG9vYl9zdGVwIC8gNF07Cj4+ICsJ CQl9Cj4+ICsJCQkqb29iKysgPSAodWludDhfdCl0bXA7Cj4+ICsJCQkqb29iKysgPSAodWludDhf dCkodG1wID4+IDgpOwo+PiArCQkJKm9vYisrID0gKHVpbnQ4X3QpKHRtcCA+PiAxNik7Cj4+ICsJ CQkqb29iKysgPSAodWludDhfdCkodG1wID4+IDI0KTsKPj4gKwkJfQo+PiArCX0KPj4gKwo+PiAr CWlmIChjdHJsLT52ZXJzaW9uID09IFZFUlNJT05fOSkgewo+PiArCQlmb3IgKGkgPSAwOyBpIDwg ZWNjLT5zdGVwcyAvIDI7IGkrKykgewo+PiArCQkJYmNoX3N0ID0gcmVhZGwoY3RybC0+cmVncyAr IE5BTkRDX1JFR19WOV9CQ0hTVCArIGkgKiA0KTsKPj4gKwkJCWlmIChiY2hfc3QgJiBOQU5EQ19W OV9CQ0gwX1NUX0VSUiB8fAo+PiArCQkJICAgIGJjaF9zdCAmIE5BTkRDX1Y5X0JDSDFfU1RfRVJS KSB7Cj4+ICsJCQkJbXRkLT5lY2Nfc3RhdHMuZmFpbGVkKys7Cj4+ICsJCQkJbWF4X2JpdGZsaXBz ID0gLTE7Cj4+ICsJCQl9IGVsc2Ugewo+PiArCQkJCXJldCA9IE5BTkRDX1Y5X0VDQ19FUlJfQ05U MChiY2hfc3QpOwo+PiArCQkJCW10ZC0+ZWNjX3N0YXRzLmNvcnJlY3RlZCArPSByZXQ7Cj4+ICsJ CQkJbWF4X2JpdGZsaXBzID0gbWF4X3QodW5zaWduZWQgaW50LAo+PiArCQkJCQkJICAgICBtYXhf Yml0ZmxpcHMsIHJldCk7Cj4+ICsKPj4gKwkJCQlyZXQgPSBOQU5EQ19WOV9FQ0NfRVJSX0NOVDEo YmNoX3N0KTsKPj4gKwkJCQltdGQtPmVjY19zdGF0cy5jb3JyZWN0ZWQgKz0gcmV0Owo+PiArCQkJ CW1heF9iaXRmbGlwcyA9IG1heF90KHVuc2lnbmVkIGludCwKPj4gKwkJCQkJCSAgICAgbWF4X2Jp dGZsaXBzLCByZXQpOwo+PiArCQkJfQo+PiArCQl9Cj4+ICsJfSBlbHNlIHsKPj4gKwkJZm9yIChp ID0gMDsgaSA8IGVjYy0+c3RlcHMgLyAyOyBpKyspIHsKPj4gKwkJCWJjaF9zdCA9IHJlYWRsKGN0 cmwtPnJlZ3MgKyBOQU5EQ19SRUdfVjZfQkNIU1QgKyBpICogNCk7Cj4+ICsJCQlpZiAoYmNoX3N0 ICYgTkFORENfVjZfQkNIMF9TVF9FUlIgfHwKPj4gKwkJCSAgICBiY2hfc3QgJiBOQU5EQ19WNl9C Q0gxX1NUX0VSUikgewo+PiArCQkJCW10ZC0+ZWNjX3N0YXRzLmZhaWxlZCsrOwo+PiArCQkJCW1h eF9iaXRmbGlwcyA9IC0xOwo+Cgo+IFdoeSBub3QgdXNpbmcgcmV0ID0gJChyZWFsIGVycm9yKSBp bnN0ZWFkIG9mIHVzaW5nIG1heF9iaXRmbGlwcyBoZXJlPwo+Cj4gVGhlbjoKPgo+IAlpZiAocmV0 KSB7Cgo+IAkJZGV2X2VycigpOwoKRG8geW91IHJlYWxseSB3YW50IHRvIGxpdHRlciB0aGUga2Vy bmVsIGxvZyB3aXRoIGVhY2ggdGltZSB5b3UgaGl0IGEgYmFkCmJsb2NrLAppbiBjYXNlIHlvdSB1 c2UgdGhpcyBmdW5jdGlvbiBpbiBhIHNlYXJjaCBiYWQgYmxvY2sgbG9vcD8KRG9uJ3QgdGhpbmtz IHNvIC4uLgpQbGVhc2UgYWR2aXNlLgoKPiAJCXJldHVybiByZXQ7Cj4gCX0KPgo+IAlyZXR1cm4g bWF4X2JpdGZsaXBzOwoKcmtfbmFuZGNfaHdfc3luZHJvbWVfZWNjX3JlYWRfcGFnZSgpIGlzIHVz ZWQgaW4gYSBiYWQgYmxvY2sgc2VhcmNoIHN0cmF0ZWd5LgpJIHRoaW5rIG1heF9iaXRmbGlwcyA9 IC0xIHdhcyBjaG9zZW4gYXMgYSBzYXZlciB2YWx1ZSB0byByZXR1cm4uClBsZWFzZSBhZHZpc2Ug d2hhdCBudW1iZXIgcmFuZ2UgTVREIGludGVycHJldHMgYXMgbWF4X2JpdGZsaXBzIG9yIGFzIGZh dWx0LgpBbHNvIGNvbnNpZGVyIHNvbWUgdW5jb250cm9sbGVkIHN0YXR1cyByZXR1cm4gdmFsdWUs IGl0IHdvdWxkIGJlIGJldHRlcgppZiB3ZQphcmUgaW4gY29udHJvbCBvZiB3aGF0IGdvZXMgcmV0 dXJuLgoKPgo+PiArCQkJfSBlbHNlIHsKPj4gKwkJCQlyZXQgPSBOQU5EQ19WNl9FQ0NfRVJSX0NO VDAoYmNoX3N0KTsKPj4gKwkJCQltdGQtPmVjY19zdGF0cy5jb3JyZWN0ZWQgKz0gcmV0Owo+PiAr CQkJCW1heF9iaXRmbGlwcyA9IG1heF90KHVuc2lnbmVkIGludCwKPj4gKwkJCQkJCSAgICAgbWF4 X2JpdGZsaXBzLCByZXQpOwo+PiArCj4+ICsJCQkJcmV0ID0gTkFORENfVjZfRUNDX0VSUl9DTlQx KGJjaF9zdCk7Cj4+ICsJCQkJbXRkLT5lY2Nfc3RhdHMuY29ycmVjdGVkICs9IHJldDsKPj4gKwkJ CQltYXhfYml0ZmxpcHMgPSBtYXhfdCh1bnNpZ25lZCBpbnQsCj4+ICsJCQkJCQkgICAgIG1heF9i aXRmbGlwcywgcmV0KTsKPj4gKwkJCX0KPj4gKwkJfQo+PiArCX0KPj4gKwo+PiArCWlmIChtYXhf Yml0ZmxpcHMgPT0gLTEpIHsKPj4gKwkJZGV2X2VycihtdGQtPmRldi5wYXJlbnQsCj4+ICsJCQki cmVhZF9wYWdlICV4ICV4ICV4ICV4ICV4ICVwICV4XG4iLAo+PiArCQkJcGFnZSwKPj4gKwkJCW1h eF9iaXRmbGlwcywKPj4gKwkJCWJjaF9zdCwKPj4gKwkJCSgodWludDMyX3QgKilidWYpWzBdLAo+ PiArCQkJKCh1aW50MzJfdCAqKWJ1ZilbMV0sCj4+ICsJCQlidWYsCj4+ICsJCQkodWludDMyX3Qp ZG1hX2RhdGEpOwo+Cgo+IFRoaXMgaXMgbm90IHZlcnkgaW5mb3JtYXRpdmUsIHBsZWFzZSB3cml0 ZSBhIHJlYWwgZXJyb3IgbWVzc2FnZS4gQXZvaWQKPiBwdXR0aW5nIHRvbyBtdWNoIGRlYnVnIGlu Zm9ybWF0aW9uLCBwZW9wbGUgd2lsbCB0cm91Ymxlc2hvb3QgdGhlbXNlbHZlcwo+IGlmIG5lZWRl ZC4KCk9LLCBhZ3JlZS4KCj4KPj4gKwl9Cj4+ICsKPj4gKwlpZiAoY3RybC0+Ym9vdHJvbWJsb2Nr cykKPj4gKwkJcmtfbmFuZGNfaHdfZWNjX3NldHVwKG5hbmQsIGN0cmwtPmVjY19tb2RlKTsKPj4g Kwo+Cgo+IFlvdSBkb24ndCB1c2UgdGhlIHNhbWUgY29uZGl0aW9uIGFzIGFib3ZlLiBXaHkgPyBN YXliZSB0aGUgaGVscGVyIHdvdWxkCj4gaGVscC4KCkEgZmV3IGxlc3MgY29uZGl0aW9ucyB0byBj aGVjay4gSXQgd29uJ3QgZG8gZGFtYWdlIGluIGNhc2UgZWNjIGlzCnNhbWUgYmVmb3JlIGFuZCBh ZnRlci4gV2lsbCBtYWtlIGNvbmRpdGlvbnMgZXF1YWwuCgo+Cj4+ICsJcmV0dXJuIG1heF9iaXRm bGlwczsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBya19uYW5kY19od19zeW5kcm9tZV9lY2Nf d3JpdGVfcGFnZShzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLAo+PiArCQljb25zdCB1aW50OF90ICpi dWYsCj4+ICsJCWludCBvb2JfcmVxdWlyZWQsCj4+ICsJCWludCBwYWdlKQo+PiArewo+PiArCXN0 cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQobmFuZCk7Cj4+ICsJc3RydWN0IHJrX25h bmRfY29udHJvbGxlciAqY3RybCA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShuYW5kKTsKPj4g KwlzdHJ1Y3QgbmFuZF9lY2NfY3RybCAqZWNjID0gJm5hbmQtPmVjYzsKPj4gKwlkbWFfYWRkcl90 IGRtYV9kYXRhLCBkbWFfb29iOwo+PiArCWludCBpOwo+PiArCWludCBkbWFfb29iX3NpemUgPSBl Y2MtPnN0ZXBzICogMTI4Owo+PiArCWludCBwYWdlc19wZXJfYmxrID0gbXRkLT5lcmFzZXNpemUg LyBtdGQtPndyaXRlc2l6ZTsKPj4gKwo+PiArCXJrX25hbmRjX3NlbGVjdF9jaGlwKG5hbmQsIGN0 cmwtPnNlbGVjdGVkX2JhbmspOwo+PiArCj4+ICsJaWYgKChwYWdlIDwgcGFnZXNfcGVyX2JsayAq IE5BTkRDX0lEQlJlc0Jsa051bSkgJiYKPj4gKwkgICAgY3RybC0+Ym9vdHJvbWJsb2NrcykKPj4g KwkJcmtfbmFuZGNfaHdfZWNjX3NldHVwKG5hbmQsIE5BTkRDX0lEQkVjY0JpdHMpOwo+PiArCj4+ ICsJbmFuZF9wcm9nX3BhZ2VfYmVnaW5fb3AobmFuZCwgcGFnZSwgMCwgTlVMTCwgMCk7Cj4+ICsK Pj4gKwlmb3IgKGkgPSAwOyBpIDwgZWNjLT5zdGVwczsgaSsrKSB7Cj4+ICsJCXVpbnQzMl90IHRt cDsKPj4gKwo+PiArCQlpZiAob29iX3JlcXVpcmVkKSB7Cj4+ICsJCQl1aW50OF90ICpvb2I7Cj4+ ICsKPj4gKwkJCW9vYiA9IG5hbmQtPm9vYl9wb2kgKwo+PiArCQkJICAgICAgaSAqIChlY2MtPmJ5 dGVzICsgbmFuZC0+ZWNjLnByZXBhZCk7Cj4+ICsJCQl0bXAgPSBvb2JbMF0gfAo+PiArCQkJICAg ICAgKG9vYlsxXSA8PCA4KSB8Cj4+ICsJCQkgICAgICAob29iWzJdIDw8IDE2KSB8Cj4+ICsJCQkg ICAgICAob29iWzNdIDw8IDI0KTsKPj4gKwkJfSBlbHNlIHsKPj4gKwkJCS8qIFRoZSBmaXJzdCBO QU5EQ19JREJSZXNCbGtOdW0gYmxvY2tzIGFyZQo+PiArCQkJICogZm9yIHRoZSBzdG9yZWQgbG9h ZGVyLiBUaGUgZmlyc3QgMzIgYml0cwo+PiArCQkJICogb2Ygb29iIG11c3QgY29udGFpbiBhIHNv cnQgb2YgbGluayB0bwo+PiArCQkJICogdGhlIG5leHQgcGFnZSBhZGRyZXNzIGluIHRoYXQgc2Ft ZSBibG9jawo+PiArCQkJICogZm9yIHRoZSBCb290cm9tLgo+PiArCQkJICogRGVwZW5kaW5nIG9u IHdoYXQgRlRMIGZyb20gUm9ja2NoaXAgaXMgdXNlZCwKPj4gKwkJCSAqIHRoZSBmaXJzdCAyIHBh Z2VzIGluIHRoZSBOQU5EQ19JREJSZXNCbGtOdW0gYmxvY2tzCj4+ICsJCQkgKiBhcmUgcmVzZXJ2 ZWQgZm9yIEZsYXNoUGh5SW5mby4KPj4gKwkJCSAqIFJhdyBJREIgZGF0YSB0aGVuIHN0YXJ0cyBh dCBwYWdlIDIgb3IgaGlnaGVyLgo+Cj4gSSB3b3VsZCBzZXBhcmF0ZSB0aGUgZnVuY3Rpb24gdG8g cmVhZC93cml0ZSB0aGUgbG9hZGVyIHRoYW4gdGhlIHVzdWFsCj4gcmVhZC93cml0ZSBoZWxwZXJz IHRvIGF2b2lkIGFueSBjb25mdXNpb24gb24gd2h5IHlvdSBkbyB0aGVzZSB0cmlja3MuCj4KPiBN YXliZSBub3QgdGhlIHdob2xlIGZ1bmN0aW9uLCBidXQgYXQgbGVhc3QgdGhlIGRhdGEvb29iIHBs YWNlbWVudD8KPiAoVGhpcyBpcyByZWFsbHkgYSBzdWdnZXN0aW9uKQo+Cj4+ICsJCQkgKi8KPj4g KwkJCWlmICghaSAmJgo+PiArCQkJICAgIHBhZ2UgPCBwYWdlc19wZXJfYmxrICogTkFORENfSURC UmVzQmxrTnVtICYmCj4+ICsJCQkgICAgcGFnZSA+PSBOQU5EQ19JREJTdGFydEFkZHIpCj4+ICsJ CQkJdG1wID0gKHBhZ2UgJiAocGFnZXNfcGVyX2JsayAtIDEpKSAqIDQ7Cj4+ICsJCQllbHNlCj4+ ICsJCQkJdG1wID0gMHhGRkZGRkZGRjsKPj4gKwkJfQo+PiArCQlpZiAoY3RybC0+dmVyc2lvbiA9 PSBWRVJTSU9OXzkpIHsKPj4gKwkJCWN0cmwtPm9vYl9idWZbaV0gPSB0bXA7Cj4+ICsJCX0gZWxz ZSB7Cj4+ICsJCQl1aW50OF90IG9vYl9zdGVwID0gKGN0cmwtPmVjY19tb2RlIDw9IDI0KSA/Cj4+ ICsJCQkJCSAgIDY0IDogMTI4Owo+PiArCQkJY3RybC0+b29iX2J1ZltpICogb29iX3N0ZXAgLyA0 XSA9IHRtcDsKPj4gKwkJfQo+PiArCX0KPj4gKwo+PiArCW1lbWNweShjdHJsLT5wYWdlX2J1Ziwg YnVmLCBtdGQtPndyaXRlc2l6ZSk7Cj4+ICsJZG1hX2RhdGEgPSBya19uYW5kY19kbWFfbWFwX3Np bmdsZShtdGQtPmRldi5wYXJlbnQsCj4+ICsJCQkJCSAgIGN0cmwtPnBhZ2VfYnVmLCBtdGQtPndy aXRlc2l6ZSwKPj4gKwkJCQkJICAgRE1BX1RPX0RFVklDRSk7Cj4+ICsJZG1hX29vYiA9IHJrX25h bmRjX2RtYV9tYXBfc2luZ2xlKG10ZC0+ZGV2LnBhcmVudCwKPj4gKwkJCQkJICBjdHJsLT5vb2Jf YnVmLCBkbWFfb29iX3NpemUsCj4+ICsJCQkJCSAgRE1BX1RPX0RFVklDRSk7Cj4+ICsJaW5pdF9j b21wbGV0aW9uKCZjdHJsLT5jb21wbGV0ZSk7Cj4+ICsJaWYgKGN0cmwtPnZlcnNpb24gPT0gVkVS U0lPTl85KQo+PiArCQl3cml0ZWwoTkFORENfVjlfSU5UX0RNQSwgY3RybC0+cmVncyArIE5BTkRD X1JFR19WOV9JTlRFTik7Cj4+ICsJZWxzZQo+PiArCQl3cml0ZWwoTkFORENfVjZfSU5UX0RNQSwg Y3RybC0+cmVncyArIE5BTkRDX1JFR19WNl9JTlRFTik7Cj4+ICsJcmtfbmFuZGNfeGZlcl9zdGFy dChjdHJsLCAxLCBlY2MtPnN0ZXBzLCBkbWFfZGF0YSwgZG1hX29vYik7Cj4+ICsJd2FpdF9mb3Jf Y29tcGxldGlvbl90aW1lb3V0KCZjdHJsLT5jb21wbGV0ZSwgbXNlY3NfdG9famlmZmllcygxMCkp Owo+PiArCXJrX25hbmRjX3dhaXRfZm9yX3hmZXJfZG9uZShjdHJsKTsKPj4gKwlya19uYW5kY19k bWFfdW5tYXBfc2luZ2xlKG10ZC0+ZGV2LnBhcmVudCwgZG1hX2RhdGEsIG10ZC0+d3JpdGVzaXpl LAo+PiArCQkJCSAgRE1BX1RPX0RFVklDRSk7Cj4+ICsJcmtfbmFuZGNfZG1hX3VubWFwX3Npbmds ZShtdGQtPmRldi5wYXJlbnQsIGRtYV9vb2IsIGRtYV9vb2Jfc2l6ZSwKPj4gKwkJCQkgIERNQV9U T19ERVZJQ0UpOwo+PiArCj4+ICsJaWYgKGN0cmwtPmJvb3Ryb21ibG9ja3MpCj4+ICsJCXJrX25h bmRjX2h3X2VjY19zZXR1cChuYW5kLCBjdHJsLT5lY2NfbW9kZSk7Cj4+ICsKPj4gKwlyZXR1cm4g bmFuZF9wcm9nX3BhZ2VfZW5kX29wKG5hbmQpOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHJr X25hbmRjX2h3X2VjY19yZWFkX29vYihzdHJ1Y3QgbmFuZF9jaGlwICpuYW5kLCBpbnQgcGFnZSkK Pj4gK3sKPj4gKwl1aW50OF90ICpidWYgPSBuYW5kX2dldF9kYXRhX2J1ZihuYW5kKTsKPj4gKwo+ PiArCXJldHVybiBuYW5kLT5lY2MucmVhZF9wYWdlKG5hbmQsIGJ1ZiwgdHJ1ZSwgcGFnZSk7Cj4+ ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcmtfbmFuZGNfaHdfZWNjX3dyaXRlX29vYihzdHJ1Y3Qg bmFuZF9jaGlwICpuYW5kLCBpbnQgcGFnZSkKPj4gK3sKPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10 ZCA9IG5hbmRfdG9fbXRkKG5hbmQpOwo+PiArCWludCByZXQ7Cj4+ICsJdWludDhfdCAqYnVmID0g bmFuZF9nZXRfZGF0YV9idWYobmFuZCk7Cj4+ICsKPj4gKwltZW1zZXQoYnVmLCAweEZGLCBtdGQt PndyaXRlc2l6ZSk7Cj4+ICsJcmV0ID0gbmFuZC0+ZWNjLndyaXRlX3BhZ2UobmFuZCwgYnVmLCB0 cnVlLCBwYWdlKTsKPj4gKwlpZiAocmV0KQo+PiArCQlyZXR1cm4gcmV0Owo+PiArCj4+ICsJcmV0 dXJuIG5hbmRfcHJvZ19wYWdlX2VuZF9vcChuYW5kKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZv aWQgcmtfbmFuZGNfcmVhZF9idWYoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwgdWludDhfdCAqYnVm LAppbnQgbGVuKQo+PiArewo+PiArCXN0cnVjdCBya19uYW5kX2NvbnRyb2xsZXIgKmN0cmwgPSBu YW5kX2dldF9jb250cm9sbGVyX2RhdGEobmFuZCk7Cj4+ICsJaW50IG9mZnMgPSAwOwo+PiArCXZv aWQgX19pb21lbSAqYmFua19iYXNlID0gY3RybC0+cmVncyArIE5BTkRDX1JFR19CQU5LMCArCj4+ ICsJCQkJICBjdHJsLT5zZWxlY3RlZF9iYW5rICogMHgxMDA7Cj4KCj4gMHgxMDA6IE1heWJlIGEg ZGVmaW5lCgpPSywgYWdyZWUuCgo+Cj4+ICsKPj4gKwlmb3IgKG9mZnMgPSAwOyBvZmZzIDwgbGVu OyBvZmZzKyspCj4+ICsJCWJ1ZltvZmZzXSA9IHJlYWRiKGJhbmtfYmFzZSk7Cj4+ICt9Cj4+ICsK Pj4gK3N0YXRpYyB2b2lkIHJrX25hbmRjX3dyaXRlX2J1ZihzdHJ1Y3QgbmFuZF9jaGlwICpuYW5k LAo+PiArCQkJICAgICAgIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgaW50IGxlbikKPj4gK3sKPj4gKwlz dHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyICpjdHJsID0gbmFuZF9nZXRfY29udHJvbGxlcl9kYXRh KG5hbmQpOwo+PiArCWludCBvZmZzID0gMDsKPj4gKwl2b2lkIF9faW9tZW0gKmJhbmtfYmFzZSA9 IGN0cmwtPnJlZ3MgKyBOQU5EQ19SRUdfQkFOSzAgKwo+PiArCQkJCSAgY3RybC0+c2VsZWN0ZWRf YmFuayAqIDB4MTAwOwo+PiArCj4+ICsJZm9yIChvZmZzID0gMDsgb2ZmcyA8IGxlbjsgb2Zmcysr KQo+PiArCQl3cml0ZWIoYnVmW29mZnNdLCBiYW5rX2Jhc2UpOwo+PiArfQo+PiArCj4+ICtzdGF0 aWMgdm9pZCBya19uYW5kY193cml0ZV9jbWQoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCwgdWludDhf dCBjbWQpCj4+ICt7Cj4+ICsJc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCA9IG5hbmRf Z2V0X2NvbnRyb2xsZXJfZGF0YShuYW5kKTsKPj4gKwo+PiArCXZvaWQgX19pb21lbSAqYmFua19i YXNlID0gY3RybC0+cmVncyArIE5BTkRDX1JFR19CQU5LMCArCj4+ICsJCQkJICBjdHJsLT5zZWxl Y3RlZF9iYW5rICogMHgxMDAgKwo+PiArCQkJCSAgTkFORENfUkVHX0NNRDsKPgoKPiBZb3UgbWln aHQgd2FudCB0byB3cml0ZSBhbiBoZWxwZXIgdG8gY2FsY3VsYXRlIGJhbmtfYmFzZSwgdG8gYXZv aWQKPiByZXBlYXRpbmcgdGhlc2UgbGluZXMuCgpFdmVuIHdpdGggYSBzZXBhcmF0ZSBkZWZpbmUg b3IgaGVscGVyIGZ1bmN0aW9uIEkgc3RpbGwgaGF2ZSB0byBzdXBwbHkKbXkgcmVnLCBzZWxlY3Rl ZF9iYW5rIGFuZCBvZmZzZXQuIEl0IGRvZXNuJ3QgbWFrZSB0aGluZ3MgY2xlYW5lciBwdW1waW5n CmRhdGUKdG8gYW5kIGZyb20gYSBoZWxwZXIgb3IgbmVpdGhlciBkb2Vzbid0IGl0IHNob3J0ZW4g bXkgc291cmNlIHdpdGggYSBkZWZpbmUuClRlbmQgdG8ga2VlcCBpdCBhcyBpdCBpcyBmb3Igbm93 LiBJZiB5b3UgYWdyZWUgb2YgY291cnNlLgoKPgo+PiArCj4+ICsJd3JpdGViKGNtZCwgYmFua19i YXNlKTsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgcmtfbmFuZGNfd3JpdGVfYWRkcihzdHJ1 Y3QgbmFuZF9jaGlwICpuYW5kLCB1aW50OF90IGFkZHIpCj4+ICt7Cj4+ICsJc3RydWN0IHJrX25h bmRfY29udHJvbGxlciAqY3RybCA9IG5hbmRfZ2V0X2NvbnRyb2xsZXJfZGF0YShuYW5kKTsKPj4g Kwo+PiArCXZvaWQgX19pb21lbSAqYmFua19iYXNlID0gY3RybC0+cmVncyArIE5BTkRDX1JFR19C QU5LMCArCj4+ICsJCQkJICBjdHJsLT5zZWxlY3RlZF9iYW5rICogMHgxMDAgKwo+PiArCQkJCSAg TkFORENfUkVHX0FERFI7Cj4+ICsKPj4gKwl3cml0ZWIoYWRkciwgYmFua19iYXNlKTsKPj4gK30K Pj4gKwo+PiArc3RhdGljIGludCBya19uYW5kY19kZXZfcmVhZHkoc3RydWN0IG5hbmRfY2hpcCAq bmFuZCkKPj4gK3sKPj4gKwlzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyICpjdHJsID0gbmFuZF9n ZXRfY29udHJvbGxlcl9kYXRhKG5hbmQpOwo+PiArCj4+ICsJaWYgKHJlYWRsKGN0cmwtPnJlZ3Mg KyBOQU5EQ19SRUdfVjZfRk1DVEwpICYgTkFORENfVjZfRk1fRlJFQURZKQo+PiArCQlyZXR1cm4g MTsKPj4gKwo+PiArCXJldHVybiAwOwo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHJrX25hbmRj X29vYmxheW91dF9lY2Moc3RydWN0IG10ZF9pbmZvICptdGQsIGludCBzZWN0aW9uLAo+PiArCQkJ CSAgc3RydWN0IG10ZF9vb2JfcmVnaW9uICpvb2JyZWdpb24pCj4+ICt7Cj4+ICsJc3RydWN0IG5h bmRfY2hpcCAqbmFuZCA9IG10ZF90b19uYW5kKG10ZCk7Cj4+ICsKPj4gKwlpZiAoc2VjdGlvbiA+ PSBuYW5kLT5lY2Muc3RlcHMpCj4+ICsJCXJldHVybiAtRVJBTkdFOwo+PiArCj4+ICsJb29icmVn aW9uLT5vZmZzZXQgPSAobmFuZC0+ZWNjLmJ5dGVzICsgbmFuZC0+ZWNjLnByZXBhZCkgKiBzZWN0 aW9uICsKPj4gKwkJCSAgICBuYW5kLT5lY2MucHJlcGFkOwo+PiArCW9vYnJlZ2lvbi0+bGVuZ3Ro ID0gbmFuZC0+ZWNjLnN0ZXBzICogbmFuZC0+ZWNjLmJ5dGVzOwo+PiArCj4+ICsJcmV0dXJuIDA7 Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcmtfbmFuZGNfb29ibGF5b3V0X2ZyZWUoc3RydWN0 IG10ZF9pbmZvICptdGQsIGludCBzZWN0aW9uLAo+PiArCQkJCSAgIHN0cnVjdCBtdGRfb29iX3Jl Z2lvbiAqb29icmVnaW9uKQo+PiArewo+PiArCXN0cnVjdCBuYW5kX2NoaXAgKm5hbmQgPSBtdGRf dG9fbmFuZChtdGQpOwo+PiArCj4+ICsJaWYgKHNlY3Rpb24gPj0gbmFuZC0+ZWNjLnN0ZXBzKQo+ PiArCQlyZXR1cm4gLUVSQU5HRTsKPj4gKwo+PiArCW9vYnJlZ2lvbi0+b2Zmc2V0ID0gKG5hbmQt PmVjYy5ieXRlcyArIG5hbmQtPmVjYy5wcmVwYWQpICogc2VjdGlvbjsKPj4gKwlvb2JyZWdpb24t Pmxlbmd0aCA9IG5hbmQtPmVjYy5zdGVwcyAqIG5hbmQtPmVjYy5wcmVwYWQ7Cj4+ICsKPj4gKwly ZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBtdGRfb29ibGF5b3V0 X29wcyBya19uYW5kY19vb2Jfb3BzID0gewo+PiArCS5lY2MgPSBya19uYW5kY19vb2JsYXlvdXRf ZWNjLAo+PiArCS5mcmVlID0gcmtfbmFuZGNfb29ibGF5b3V0X2ZyZWUsCj4+ICt9Owo+PiArCj4+ ICtzdGF0aWMgdm9pZCBya19uYW5kY19mcmVlX2J1ZmZlcihzdHJ1Y3QgbmFuZF9jaGlwICpuYW5k KQo+PiArewo+PiArCXN0cnVjdCBya19uYW5kX2NvbnRyb2xsZXIgKmN0cmwgPSBuYW5kX2dldF9j b250cm9sbGVyX2RhdGEobmFuZCk7Cj4+ICsKPj4gKwlrZnJlZShjdHJsLT5wYWdlX2J1Zik7Cj4+ ICsJa2ZyZWUoY3RybC0+b29iX2J1Zik7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcmtfbmFu ZGNfYnVmZmVyX2luaXQoc3RydWN0IG5hbmRfY2hpcCAqbmFuZCkKPj4gK3sKPj4gKwlzdHJ1Y3Qg bXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKG5hbmQpOwo+PiArCXN0cnVjdCBya19uYW5kX2Nv bnRyb2xsZXIgKmN0cmwgPSBuYW5kX2dldF9jb250cm9sbGVyX2RhdGEobmFuZCk7Cj4+ICsKPj4g KwljdHJsLT5wYWdlX2J1ZiA9IGttYWxsb2MobXRkLT53cml0ZXNpemUsIEdGUF9LRVJORUwgfCBH RlBfRE1BKTsKPgoKPiBkZXZpY2UgbWFuYWdlZCBhbGxvY2F0aW9ucyAoZGV2bV8uLi4pIHdvdWxk IGJlIG5pY2UKCmRldm1fa3phbGxvYygpIG5lZWRzIGFuIGV4dHJhIHN0cnVjdCBkZXZpY2UuCkRv ZXMgTVREIHNhZmUtZ2FyZCB0aGUgY29ycmVjdCBvcmRlciB0byBkZXRhY2ggZnJvbSBzdHJ1Y3QK cmtfbmFuZF9jb250cm9sbGVyCndpdGhvdXQgcmtfbmFuZGNfZnJlZV9idWZmZXIoKT8KCj4KPj4g KwlpZiAoIWN0cmwtPnBhZ2VfYnVmKQo+PiArCQlyZXR1cm4gLUVOT01FTTsKPj4gKwo+PiArCWN0 cmwtPm9vYl9idWYgPSBrbWFsbG9jKG5hbmQtPmVjYy5zdGVwcyAqIDEyOCwgR0ZQX0tFUk5FTCB8 IEdGUF9ETUEpOwo+PiArCWlmICghY3RybC0+b29iX2J1Zikgewo+PiArCQlrZnJlZShjdHJsLT5w YWdlX2J1Zik7Cj4+ICsJCXJldHVybiAtRU5PTUVNOwo+PiArCX0KPj4gKwo+PiArCXJldHVybiAw Owo+PiArfQo+PiArCj4+ICtzdGF0aWMgaW50IHJrX25hbmRjX2h3X2VjY19jdHJsX2luaXQoc3Ry dWN0IG5hbmRfY2hpcCAqbmFuZCkKPj4gK3sKPj4gKwl1aW50OF90IHN0cmVuZ3Roc192NltdID0g ezYwLCA0MCwgMjQsIDE2fTsKPj4gKwl1aW50OF90IHN0cmVuZ3Roc192OVtdID0gezcwLCA2MCwg NDAsIDE2fTsKPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZCA9IG5hbmRfdG9fbXRkKG5hbmQpOwo+ PiArCXN0cnVjdCBya19uYW5kX2NvbnRyb2xsZXIgKmN0cmwgPSBuYW5kX2dldF9jb250cm9sbGVy X2RhdGEobmFuZCk7Cj4+ICsJaW50IG1heF9zdHJlbmd0aDsKPj4gKwl1aW50MzJfdCBpLCB2ZXI7 Cj4+ICsKPj4gKwlpZiAobmFuZC0+b3B0aW9ucyAmIE5BTkRfSVNfQk9PVF9NRURJVU0pCj4+ICsJ CWN0cmwtPmJvb3Ryb21ibG9ja3MgPSB0cnVlOwo+PiArCWVsc2UKPj4gKwkJY3RybC0+Ym9vdHJv bWJsb2NrcyA9IGZhbHNlOwo+PiArCj4+ICsJbmFuZC0+ZWNjLnByZXBhZCA9IDQ7Cj4+ICsJbmFu ZC0+ZWNjLnN0ZXBzID0gbXRkLT53cml0ZXNpemUgLyBuYW5kLT5lY2Muc2l6ZTsKPj4gKwo+PiAr CW1heF9zdHJlbmd0aCA9ICgobXRkLT5vb2JzaXplIC8gbmFuZC0+ZWNjLnN0ZXBzKSAtIDQpICog OCAvIDE0Owo+PiArCWlmIChjdHJsLT52ZXJzaW9uID09IFZFUlNJT05fOSkgewo+PiArCQljdHJs LT5tYXhfZWNjX3N0cmVuZ3RoID0gNzA7Cj4+ICsJCXZlciA9IHJlYWRsKGN0cmwtPnJlZ3MgKyBO QU5EQ19SRUdfVjlfVkVSKTsKPj4gKwkJaWYgKHZlciAhPSBOQU5EQ19JRF9WOTAwKQo+PiArCQkJ ZGV2X2VycihtdGQtPmRldi5wYXJlbnQsCj4+ICsJCQkJInVuc3VwcG9ydGVkIG5hbmRjIHZlcnNp b24gJXhcbiIsIHZlcik7Cj4+ICsKPj4gKwkJaWYgKG1heF9zdHJlbmd0aCA+IGN0cmwtPm1heF9l Y2Nfc3RyZW5ndGgpCj4+ICsJCQltYXhfc3RyZW5ndGggPSBjdHJsLT5tYXhfZWNjX3N0cmVuZ3Ro Owo+PiArCj4+ICsJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN0cmVuZ3Roc192OSk7IGkr Kykgewo+PiArCQkJaWYgKG1heF9zdHJlbmd0aCA+PSBzdHJlbmd0aHNfdjlbaV0pCj4+ICsJCQkJ YnJlYWs7Cj4+ICsJCX0KPj4gKwo+PiArCQlpZiAoaSA+PSBBUlJBWV9TSVpFKHN0cmVuZ3Roc192 OSkpIHsKPj4gKwkJCWRldl9lcnIobXRkLT5kZXYucGFyZW50LAo+PiArCQkJCSJ1bnN1cHBvcnRl ZCBzdHJlbmd0aFxuIik7Cj4+ICsJCQlyZXR1cm4gLUVOT1RTVVBQOwo+PiArCQl9Cj4+ICsKPj4g KwkJY3RybC0+ZWNjX21vZGUgPSBzdHJlbmd0aHNfdjlbaV07Cj4+ICsJfSBlbHNlIHsKPj4gKwkJ Y3RybC0+bWF4X2VjY19zdHJlbmd0aCA9IDYwOwo+PiArCj4+ICsJCXZlciA9IHJlYWRsKGN0cmwt PnJlZ3MgKyBOQU5EQ19SRUdfVjZfVkVSKTsKPj4gKwkJaWYgKHZlciA9PSBOQU5EQ19JRF9WODAx KQo+PiArCQkJY3RybC0+bWF4X2VjY19zdHJlbmd0aCA9IDE2Owo+PiArCQllbHNlIGlmICh2ZXIg PT0gTkFORENfSURfVjYwMCB8fAo+PiArCQkJIHZlciA9PSBOQU5EQ19JRF9WNjIyIHx8Cgo+PiAr CQkJIHZlciA9PSBOQU5EQ19JRF9WNzAxIHx8CgpBZGRlZCB2ZXJzaW9uIDcgZm9yIFJLMzIyOEEv UkszMjI4Qi4gQ2FuIHNvbWVvbmUgd2l0aCBpbnNpZGVyIGluZm8gY29uZmlybQppZiB0aGlzIHdv cmtzIG9yIG5vdC4KCj4+ICsJCQkgdmVyID09IE5BTkRDX0lEX1Y4MDApCj4+ICsJCQljdHJsLT5t YXhfZWNjX3N0cmVuZ3RoID0gNjA7Cj4+ICsJCWVsc2UKPj4gKwkJCWRldl9lcnIobXRkLT5kZXYu cGFyZW50LAo+PiArCQkJCSJ1bnN1cHBvcnRlZCBuYW5kYyB2ZXJzaW9uICV4XG4iLCB2ZXIpOwo+ PiArCj4+ICsJCWlmIChtYXhfc3RyZW5ndGggPiBjdHJsLT5tYXhfZWNjX3N0cmVuZ3RoKQo+PiAr CQkJbWF4X3N0cmVuZ3RoID0gY3RybC0+bWF4X2VjY19zdHJlbmd0aDsKPj4gKwo+PiArCQlmb3Ig KGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdHJlbmd0aHNfdjYpOyBpKyspIHsKPj4gKwkJCWlmICht YXhfc3RyZW5ndGggPj0gc3RyZW5ndGhzX3Y2W2ldKQo+PiArCQkJCWJyZWFrOwo+PiArCQl9Cj4+ ICsKPj4gKwkJaWYgKGkgPj0gQVJSQVlfU0laRShzdHJlbmd0aHNfdjYpKSB7Cj4+ICsJCQlkZXZf ZXJyKG10ZC0+ZGV2LnBhcmVudCwKPj4gKwkJCQkidW5zdXBwb3J0ZWQgc3RyZW5ndGhcbiIpOwo+ PiArCQkJcmV0dXJuIC1FTk9UU1VQUDsKPj4gKwkJfQo+PiArCj4+ICsJCWN0cmwtPmVjY19tb2Rl ID0gc3RyZW5ndGhzX3Y2W2ldOwo+PiArCX0KPj4gKwlya19uYW5kY19od19lY2Nfc2V0dXAobmFu ZCwgY3RybC0+ZWNjX21vZGUpOwo+PiArCj4+ICsJbXRkX3NldF9vb2JsYXlvdXQobXRkLCAmcmtf bmFuZGNfb29iX29wcyk7Cj4+ICsKPj4gKwlpZiAobXRkLT5vb2JzaXplIDwgKChuYW5kLT5lY2Mu Ynl0ZXMgKyBuYW5kLT5lY2MucHJlcGFkKSAqCj4+ICsJCQkgICAgbmFuZC0+ZWNjLnN0ZXBzKSkg ewo+PiArCQlyZXR1cm4gLUVJTlZBTDsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30K Pj4gKwo+PiArc3RhdGljIHZvaWQgcmtfbmFuZGNfZGV0YWNoX2NoaXAoc3RydWN0IG5hbmRfY2hp cCAqbmFuZCkKPj4gK3sKPj4gKwlzd2l0Y2ggKG5hbmQtPmVjYy5tb2RlKSB7Cj4+ICsJY2FzZSBO QU5EX0VDQ19IV19TWU5EUk9NRToKPj4gKwkJcmtfbmFuZGNfZnJlZV9idWZmZXIobmFuZCk7Cj4+ ICsJCWJyZWFrOwo+PiArCWRlZmF1bHQ6Cj4+ICsJCWJyZWFrOwo+PiArCX0KPj4gK30KPj4gKwo+ PiArc3RhdGljIGludCBya19uYW5kY19hdHRhY2hfY2hpcChzdHJ1Y3QgbmFuZF9jaGlwICpuYW5k KQo+PiArewo+PiArCXN0cnVjdCBtdGRfaW5mbyAqbXRkID0gbmFuZF90b19tdGQobmFuZCk7Cj4+ ICsJaW50IHJldDsKPj4gKwo+PiArCXN3aXRjaCAobmFuZC0+ZWNjLm1vZGUpIHsKPj4gKwljYXNl IE5BTkRfRUNDX0hXX1NZTkRST01FOgo+PiArCQlyZXQgPSBya19uYW5kY19od19lY2NfY3RybF9p bml0KG5hbmQpOwo+PiArCQlpZiAocmV0KQo+PiArCQkJcmV0dXJuIHJldDsKPj4gKwkJcmV0ID0g cmtfbmFuZGNfYnVmZmVyX2luaXQobmFuZCk7Cj4+ICsJCWlmIChyZXQpCj4+ICsJCQlyZXR1cm4g LUVOT01FTTsKPj4gKwkJbmFuZC0+ZWNjLnJlYWRfcGFnZSA9IHJrX25hbmRjX2h3X3N5bmRyb21l X2VjY19yZWFkX3BhZ2U7Cj4+ICsJCW5hbmQtPmVjYy53cml0ZV9wYWdlID0gcmtfbmFuZGNfaHdf c3luZHJvbWVfZWNjX3dyaXRlX3BhZ2U7Cj4+ICsJCW5hbmQtPmVjYy5yZWFkX29vYiA9IHJrX25h bmRjX2h3X2VjY19yZWFkX29vYjsKPj4gKwkJbmFuZC0+ZWNjLndyaXRlX29vYiA9IHJrX25hbmRj X2h3X2VjY193cml0ZV9vb2I7Cj4+ICsJCWJyZWFrOwo+PiArCWNhc2UgTkFORF9FQ0NfSFc6Cj4K PiBJIHdvdWxkIGVpdGhlciByZWZ1c2UgRUNDX0hXIG9yIHB1dCBpdCBiZXNpZGVzIEhXX1NZTkRS T01FLgoKSXMgdGhlcmUgYSBmdW5kYW1lbnRhbCBkaWZmZXJlbmNlIGluIGhhbmRsaW5nIEVDQ19I VyBhbmQgSFdfU1lORFJPTUUKZnJvbSB0aGUgTVREIHBvaW50IG9mIHZpZXc/IE90aGVyIHRoZW4g YSBpbmRpY2F0aW9uIGhvdyBpdCdzIGRvbmUgb24KdGhlIGRyaXZlciBzaWRlPwpXaWxsIGRyb3Ag aXQuCgo+Cj4+ICsJY2FzZSBOQU5EX0VDQ19OT05FOgo+PiArCWNhc2UgTkFORF9FQ0NfU09GVDoK PgoKPiBIYXZlIHlvdSB0ZXN0ZWQgd2l0aCBTVyBCQ0g/CgpTaG9ydCBhbnN3ZXI6IE5vCkp1c3Qg Y29waWVkIGl0IGZyb20gdGhlIG9yaWdpbmFsLgpQbGVhc2UgYWR2aXNlIGEgdG9vbCB0byBkbyBh IHRlc3QgYmV0d2VlbiB0aGUgaW5kaXZpZHVhbCBlY2MgcmVhZCBvcHRpb25zLgpPciBkbyBJIGhh dmUgdG8gd3JpdGUgdGhlIHRvb2wgbXkgc2VsZiB3aXRoIG10ZC11dGlscz8KCj4KPj4gKwkJYnJl YWs7Cj4+ICsJZGVmYXVsdDoKPj4gKwkJcmV0dXJuIC1FSU5WQUw7Cj4+ICsJfQo+PiArCj4+ICsJ cmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcmtfbmFuZGNfZXhlY19vcChzdHJ1 Y3QgbmFuZF9jaGlwICpuYW5kLAo+PiArCQkJICAgIGNvbnN0IHN0cnVjdCBuYW5kX29wZXJhdGlv biAqb3AsCj4+ICsJCQkgICAgYm9vbCBjaGVja19vbmx5KQo+PiArewo+PiArCWludCBpOwo+PiAr CXVuc2lnbmVkIGludCBvcF9pZDsKPj4gKwljb25zdCBzdHJ1Y3QgbmFuZF9vcF9pbnN0ciAqaW5z dHIgPSBOVUxMOwo+PiArCj4+ICsJcmtfbmFuZGNfc2VsZWN0X2NoaXAobmFuZCwgb3AtPmNzKTsK Pj4gKwo+PiArCWlmIChjaGVja19vbmx5KQo+PiArCQlyZXR1cm4gMDsKPj4gKwo+PiArCWZvciAo b3BfaWQgPSAwOyBvcF9pZCA8IG9wLT5uaW5zdHJzOyBvcF9pZCsrKSB7Cj4+ICsJCWluc3RyID0g Jm9wLT5pbnN0cnNbb3BfaWRdOwo+PiArCj4+ICsJCXN3aXRjaCAoaW5zdHItPnR5cGUpIHsKPj4g KwkJY2FzZSBOQU5EX09QX0NNRF9JTlNUUjoKPj4gKwkJCXJrX25hbmRjX3dyaXRlX2NtZChuYW5k LCBpbnN0ci0+Y3R4LmNtZC5vcGNvZGUpOwo+PiArCQkJYnJlYWs7Cj4+ICsJCWNhc2UgTkFORF9P UF9BRERSX0lOU1RSOgo+PiArCQkJZm9yIChpID0gMDsgaSA8IGluc3RyLT5jdHguYWRkci5uYWRk cnM7IGkrKykKPj4gKwkJCQlya19uYW5kY193cml0ZV9hZGRyKG5hbmQsCj4+ICsJCQkJCQkgICAg aW5zdHItPmN0eC5hZGRyLmFkZHJzW2ldKTsKPj4gKwkJCWJyZWFrOwo+PiArCQljYXNlIE5BTkRf T1BfREFUQV9JTl9JTlNUUjoKPj4gKwkJCXJrX25hbmRjX3JlYWRfYnVmKG5hbmQsIGluc3RyLT5j dHguZGF0YS5idWYuaW4sCj4+ICsJCQkJCSAgaW5zdHItPmN0eC5kYXRhLmxlbik7Cj4+ICsJCQli cmVhazsKPj4gKwkJY2FzZSBOQU5EX09QX0RBVEFfT1VUX0lOU1RSOgo+PiArCQkJcmtfbmFuZGNf d3JpdGVfYnVmKG5hbmQsIGluc3RyLT5jdHguZGF0YS5idWYub3V0LAo+PiArCQkJCQkgICBpbnN0 ci0+Y3R4LmRhdGEubGVuKTsKPj4gKwkJCWJyZWFrOwo+PiArCQljYXNlIE5BTkRfT1BfV0FJVFJE WV9JTlNUUjoKPj4gKwkJCXJrX25hbmRjX2Rldl9yZWFkeShuYW5kKTsKPj4gKwkJCWJyZWFrOwo+ PiArCQl9Cj4+ICsJfQo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBj b25zdCBzdHJ1Y3QgbmFuZF9jb250cm9sbGVyX29wcyBya19uYW5kX2NvbnRyb2xsZXJfb3BzID0g ewo+PiArCS5hdHRhY2hfY2hpcCA9IHJrX25hbmRjX2F0dGFjaF9jaGlwLAo+PiArCS5kZXRhY2hf Y2hpcCA9IHJrX25hbmRjX2RldGFjaF9jaGlwLAo+PiArCS5leGVjX29wID0gcmtfbmFuZGNfZXhl Y19vcCwKPj4gK307Cj4+ICsKPj4gK3N0YXRpYyBpbnQgcmtfbmFuZGNfY2hpcF9pbml0KHN0cnVj dCBkZXZpY2UgKmRldiwKPj4gKwkJCSAgICAgIHN0cnVjdCBya19uYW5kX2NvbnRyb2xsZXIgKmN0 cmwsCj4+ICsJCQkgICAgICBzdHJ1Y3QgZGV2aWNlX25vZGUgKm5wLCB1bnNpZ25lZCBpbnQgY2hp cG5yKQo+PiArewo+PiArCXN0cnVjdCBya19uYW5kX2NoaXAgKm5vZGU7Cj4+ICsJc3RydWN0IG5h bmRfY2hpcCAqbmFuZDsKPj4gKwlzdHJ1Y3QgbXRkX2luZm8gKm10ZDsKPj4gKwljb25zdCBfX2Jl MzIgKnJlZzsKPj4gKwlpbnQgcmV0Owo+PiArCj4+ICsJcmVnID0gb2ZfZ2V0X3Byb3BlcnR5KG5w LCAicmVnIiwgTlVMTCk7Cj4+ICsJaWYgKCFyZWcpCj4+ICsJCXJldHVybiAtRUlOVkFMOwo+PiAr Cj4+ICsJY3RybC0+YmFua3NbY2hpcG5yXSA9IGJlMzJfdG9fY3B1KCpyZWcpOwo+PiArCj4+ICsJ aWYgKGN0cmwtPmJhbmtzW2NoaXBucl0gPCAwKQo+PiArCQlyZXR1cm4gLUVJTlZBTDsKPj4gKwo+ PiArCW5vZGUgPSBkZXZtX2t6YWxsb2MoZGV2LCBzaXplb2YoKm5vZGUpLCBHRlBfS0VSTkVMKTsK Pj4gKwlpZiAoIW5vZGUpCj4+ICsJCXJldHVybiAtRU5PTUVNOwo+PiArCj4+ICsJbmFuZCA9ICZu b2RlLT5uYW5kOwo+PiArCj4+ICsJbmFuZF9zZXRfZmxhc2hfbm9kZShuYW5kLCBucCk7Cj4+ICsJ bmFuZF9zZXRfY29udHJvbGxlcl9kYXRhKG5hbmQsIGN0cmwpOwo+PiArCj4+ICsJbmFuZC0+Y29u dHJvbGxlciA9ICZjdHJsLT5jb250cm9sbGVyOwo+PiArCW5hbmQtPmNvbnRyb2xsZXItPm9wcyA9 ICZya19uYW5kX2NvbnRyb2xsZXJfb3BzOwo+PiArCj4+ICsJbmFuZC0+ZWNjLm1vZGUgPSBOQU5E X0VDQ19IV19TWU5EUk9NRTsKPj4gKwluYW5kLT5lY2Muc2l6ZSA9IDEwMjQ7Cj4+ICsJbmFuZC0+ ZWNjLnN0cmVuZ3RoID0gNDA7Cj4+ICsKPj4gKwluYW5kLT5vcHRpb25zID0gTkFORF9TS0lQX0JC VFNDQU4gfCBOQU5EX05PX1NVQlBBR0VfV1JJVEU7Cj4+ICsKPj4gKwltdGQgPSBuYW5kX3RvX210 ZChuYW5kKTsKPj4gKwltdGQtPmRldi5wYXJlbnQgPSBkZXY7Cj4+ICsJbXRkLT5uYW1lID0gZGV2 bV9rYXNwcmludGYoZGV2LCBHRlBfS0VSTkVMLCAiJXMuJWQiLCBkZXZfbmFtZShkZXYpLAo+PiAr CQkJCSAgIGN0cmwtPmJhbmtzW2NoaXBucl0pOwo+PiArCj4+ICsJcmV0ID0gbmFuZF9zY2FuKG5h bmQsIDEpOwo+Cj4gV2h5IDEgaGVyZT8KClRPRE8gZm9yIHZlcnNpb24gMi4KQSBsaXR0bGUgbWlz dW5kZXJzdGFuZGluZyBvbiBob3cgZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZSB3b3Jrcy4KQWxsIGNo aXBzIHNob3VsZCBiZSBzY2FubmVkLgovLy8vLwpEZXJpdmUgY2hpcG5yCkV4YW1wbGUgZnJvbSBz dW54aV9uYW5kLmMKCglpZiAoIW9mX2dldF9wcm9wZXJ0eShucCwgInJlZyIsICZuc2VscykpCgkJ cmV0dXJuIC1FSU5WQUw7CgoJbnNlbHMgLz0gc2l6ZW9mKHUzMik7CglpZiAoIW5zZWxzKSB7CgkJ ZGV2X2VycihkZXYsICJpbnZhbGlkIHJlZyBwcm9wZXJ0eSBzaXplXG4iKTsKCQlyZXR1cm4gLUVJ TlZBTDsKCX0KLy8vLy8KRnJvbSBya19uYW5kY19jaGlwc19pbml0KCkKCglmb3JfZWFjaF9jaGls ZF9vZl9ub2RlKG5wLCBuYW5kX25wKSB7CgkJcmV0ID0gcmtfbmFuZGNfY2hpcF9pbml0KGRldiwg Y3RybCwgbmFuZF9ucCwgaSk7CgpXaHkgZG9lcyBzdW54aV9uYW5kLmMgbmVlZCB0aGlzIGV4dHJh IGZvcl9lYWNoX2NoaWxkX29mX25vZGU/Cgo+Cj4+ICsJaWYgKHJldCkKPj4gKwkJcmV0dXJuIHJl dDsKPj4gKwo+PiArCXJldCA9IG10ZF9kZXZpY2VfcmVnaXN0ZXIobXRkLCBOVUxMLCAwKTsKPj4g KwlpZiAocmV0KSB7Cj4+ICsJCWRldl9lcnIoZGV2LCAibXRkIGRldmljZSByZWdpc3RlciBmYWls ZWQ6ICVkXG4iLCByZXQpOwo+PiArCQluYW5kX3JlbGVhc2UobmFuZCk7Cj4+ICsJCXJldHVybiBy ZXQ7Cj4+ICsJfQo+PiArCj4+ICsJbGlzdF9hZGRfdGFpbCgmbm9kZS0+Y2hpcF9saXN0LCAmY3Ry bC0+Y2hpcHMpOwo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQg cmtfbmFuZGNfY2xlYW51cF9jaGlwcyhzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyICpjdHJsKQo+ PiArewo+PiArCXN0cnVjdCBya19uYW5kX2NoaXAgKm5vZGU7Cj4+ICsJc3RydWN0IG10ZF9pbmZv ICptdGQ7Cj4+ICsJaW50IHJldDsKPj4gKwo+PiArCXdoaWxlICghbGlzdF9lbXB0eSgmY3RybC0+ Y2hpcHMpKSB7Cj4+ICsJCW5vZGUgPSBsaXN0X2ZpcnN0X2VudHJ5KCZjdHJsLT5jaGlwcywgc3Ry dWN0IHJrX25hbmRfY2hpcCwKPj4gKwkJCQkJY2hpcF9saXN0KTsKPj4gKwkJbXRkID0gbmFuZF90 b19tdGQoJm5vZGUtPm5hbmQpOwo+PiArCQlyZXQgPSBtdGRfZGV2aWNlX3VucmVnaXN0ZXIobXRk KTsKPj4gKwkJaWYgKHJldCkKPj4gKwkJCXJldHVybiByZXQ7Cj4+ICsKPj4gKwkJcmtfbmFuZGNf ZnJlZV9idWZmZXIoJm5vZGUtPm5hbmQpOwo+PiArCQluYW5kX2NsZWFudXAoJm5vZGUtPm5hbmQp Owo+PiArCQlsaXN0X2RlbCgmbm9kZS0+Y2hpcF9saXN0KTsKPj4gKwl9Cj4+ICsKPj4gKwlyZXR1 cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIGludCBya19uYW5kY19jaGlwc19pbml0KHN0cnVj dCBkZXZpY2UgKmRldiwKPj4gKwkJCSAgICAgICBzdHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyICpj dHJsKQo+PiArewo+PiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbnAgPSBkZXYtPm9mX25vZGU7Cj4+ ICsJc3RydWN0IGRldmljZV9ub2RlICpuYW5kX25wOwo+PiArCWludCBuY2hpcHMgPSBvZl9nZXRf Y2hpbGRfY291bnQobnApOwo+PiArCWludCBpID0gMDsKPj4gKwlpbnQgcmV0Owo+PiArCj4+ICsJ aWYgKG5jaGlwcyA+IE5BTkRDX05VTV9CQU5LUykgewo+PiArCQlkZXZfZXJyKGRldiwgInRvbyBt YW55IE5BTkQgY2hpcHM6ICVkIChtYXggPSA0KVxuIiwgbmNoaXBzKTsKPj4gKwkJcmV0dXJuIC1F SU5WQUw7Cj4+ICsJfQo+PiArCj4+ICsJZm9yX2VhY2hfY2hpbGRfb2Zfbm9kZShucCwgbmFuZF9u cCkgewo+PiArCQlyZXQgPSBya19uYW5kY19jaGlwX2luaXQoZGV2LCBjdHJsLCBuYW5kX25wLCBp KTsKPj4gKwkJaWYgKHJldCkgewo+PiArCQkJcmtfbmFuZGNfY2xlYW51cF9jaGlwcyhjdHJsKTsK Pj4gKwkJCW9mX25vZGVfcHV0KG5hbmRfbnApOwo+PiArCQkJcmV0dXJuIHJldDsKPj4gKwkJfQo+ PiArCQlpKys7Cj4+ICsJfQo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICt9Cj4+ICsKPj4gK3N0YXRp YyBpbnQgcmtfbmFuZGNfcHJvYmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPj4gK3sK Pj4gKwljb25zdCBzdHJ1Y3QgcmtfbmFuZGNfZGF0YSAqZGF0YTsKPj4gKwlzdHJ1Y3QgZGV2aWNl ICpkZXYgPSAmcGRldi0+ZGV2Owo+PiArCXN0cnVjdCBkZXZpY2Vfbm9kZSAqbm9kZTsKPj4gKwlp bnQgaWQ7Cj4+ICsJaW50IHJldDsKPj4gKwo+PiArCWRhdGEgPSBvZl9kZXZpY2VfZ2V0X21hdGNo X2RhdGEoJnBkZXYtPmRldik7Cj4+ICsJaWYgKCFkYXRhKQo+PiArCQlyZXR1cm4gLUVOT0RFVjsK Pj4gKwoKPj4gKwlub2RlID0gcGRldi0+ZGV2Lm9mX25vZGU7Cj4+ICsKPj4gKwlpZCA9IG9mX2Fs aWFzX2dldF9pZChub2RlLCAibmFuZGMiKTsKPj4gKwlpZiAoaWQgPCAwKQo+PiArCQlpZCA9IGdf aWRfY291bnRlcjsKPj4gKwlpZiAoKGlkID49IEFSUkFZX1NJWkUoZ19uYW5kY19pbmZvKSB8fCBn X25hbmRjX2luZm9baWRdLnJlZ3MpKSB7Cj4+ICsJCWRldl9lcnIoCj4+ICsJCQkmcGRldi0+ZGV2 LAo+PiArCQkJImZhaWxlZCB0byBnZXQgaWQgZm9yIG5hbmRjIG5vZGUgJyVwT0ZuJ1xuIiwKPj4g KwkJCW5vZGUpOwo+PiArCQlvZl9ub2RlX3B1dChub2RlKTsKPj4gKwkJcmV0dXJuIC1FTk9ERVY7 Cj4+ICsJfQo+PiArCSsrZ19pZF9jb3VudGVyOwoKU2VlIGNvbW1lbnRzIGFib3ZlIGFib3V0IFJr MzI4OC4gS2VlcGluZyB0cmFjayBub2RlIGFsaWFzIGZvciBuYW5kYzAuClRvIHJlbW92ZSBvciBu b3Q/Cgo+PiArCj4+ICsJZ19uYW5kY19pbmZvW2lkXS52ZXJzaW9uID0gZGF0YS0+dmVyc2lvbjsK Pj4gKwo+PiArCWdfbmFuZGNfaW5mb1tpZF0ucmVncyA9IGRldm1fcGxhdGZvcm1faW9yZW1hcF9y ZXNvdXJjZShwZGV2LCAwKTsKPj4gKwlpZiAoSVNfRVJSKGdfbmFuZGNfaW5mb1tpZF0ucmVncykp IHsKPj4gKwkJZGV2X2VycihkZXYsICJpb3JlbWFwIGZhaWxlZFxuIik7Cj4+ICsJCXJldHVybiBQ VFJfRVJSKGdfbmFuZGNfaW5mb1tpZF0ucmVncyk7Cj4+ICsJfQo+PiArCj4+ICsJZ19uYW5kY19p bmZvW2lkXS5pcnEgPSBwbGF0Zm9ybV9nZXRfaXJxKHBkZXYsIDApOwo+PiArCWlmIChnX25hbmRj X2luZm9baWRdLmlycSA8IDApIHsKPj4gKwkJZGV2X2VycihkZXYsICJnZXQgaXJxIGZhaWxlZFxu Iik7Cj4+ICsJCXJldHVybiBnX25hbmRjX2luZm9baWRdLmlycTsKPj4gKwl9Cj4+ICsKPj4gKwln X25hbmRjX2luZm9baWRdLmhjbGsgPSBkZXZtX2Nsa19nZXQoZGV2LCAiaGNsa19uYW5kYyIpOwo+ PiArCWlmIChJU19FUlIoZ19uYW5kY19pbmZvW2lkXS5oY2xrKSkgewo+PiArCQlkZXZfZXJyKGRl diwgImdldCBoY2xrX25hbmRjIGZhaWxlZFxuIik7Cj4+ICsJCXJldHVybiBQVFJfRVJSKGdfbmFu ZGNfaW5mb1tpZF0uaGNsayk7Cj4+ICsJfQo+PiArCj4+ICsJcmV0ID0gY2xrX3ByZXBhcmVfZW5h YmxlKGdfbmFuZGNfaW5mb1tpZF0uaGNsayk7Cj4+ICsJaWYgKHJldCkKPj4gKwkJcmV0dXJuIHJl dDsKPj4gKwo+PiArCWdfbmFuZGNfaW5mb1tpZF0uY2xrID0gZGV2bV9jbGtfZ2V0KGRldiwgImNs a19uYW5kYyIpOwo+PiArCWlmICghKElTX0VSUihnX25hbmRjX2luZm9baWRdLmNsaykpKSB7Cj4+ ICsJCWNsa19zZXRfcmF0ZShnX25hbmRjX2luZm9baWRdLmNsaywgMTUwICogMTAwMCAqIDEwMDAp Owo+PiArCj4+ICsJCXJldCA9IGNsa19wcmVwYXJlX2VuYWJsZShnX25hbmRjX2luZm9baWRdLmNs ayk7Cj4+ICsJCWlmIChyZXQpCj4+ICsJCQlnb3RvIGVycl9kaXNhYmxlX2hjbGs7Cj4+ICsJfSBl bHNlCj4+ICsJCWRldl9lcnIoZGV2LCAiZ2V0IGNsa19uYW5kYyBmYWlsZWRcbiIpOwo+PiArCj4+ ICsJaWYgKGdfbmFuZGNfaW5mb1tpZF0udmVyc2lvbiA9PSBWRVJTSU9OXzkpCj4+ICsJCXdyaXRl bCgwLCBnX25hbmRjX2luZm9baWRdLnJlZ3MgKyBOQU5EQ19SRUdfVjlfSU5URU4pOwo+PiArCWVs c2UKPj4gKwkJd3JpdGVsKDAsIGdfbmFuZGNfaW5mb1tpZF0ucmVncyArIE5BTkRDX1JFR19WNl9J TlRFTik7Cj4+ICsJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycShkZXYsIGdfbmFuZGNfaW5mb1tpZF0u aXJxLCBya19uYW5kY19pbnRlcnJ1cHQsCj4+ICsJCQkgICAgICAgMCwgIm5hbmRjIiwgJmdfbmFu ZGNfaW5mb1tpZF0pOwo+PiArCWlmIChyZXQpCj4+ICsJCWdvdG8gZXJyX2Rpc2FibGVfY2xrOwo+ PiArCj4+ICsJbmFuZF9jb250cm9sbGVyX2luaXQoJmdfbmFuZGNfaW5mb1tpZF0uY29udHJvbGxl cik7Cj4+ICsJSU5JVF9MSVNUX0hFQUQoJmdfbmFuZGNfaW5mb1tpZF0uY2hpcHMpOwo+PiArCj4+ ICsJcmtfbmFuZGNfaW5pdCgmZ19uYW5kY19pbmZvW2lkXSk7Cj4+ICsKPj4gKwlyZXQgPSBya19u YW5kY19jaGlwc19pbml0KGRldiwgJmdfbmFuZGNfaW5mb1tpZF0pOwo+PiArCWlmIChyZXQpIHsK Pj4gKwkJZGV2X2VycihkZXYsICJpbml0IG5hbmQgY2hpcHMgZmFpbGVkXG4iKTsKPj4gKwkJZ290 byBlcnJfZGlzYWJsZV9jbGs7Cj4+ICsJfQo+PiArCj4+ICsJcGxhdGZvcm1fc2V0X2RydmRhdGEo cGRldiwgJmdfbmFuZGNfaW5mb1tpZF0pOwo+PiArCj4+ICsJcmV0dXJuIDA7Cj4+ICsKPj4gK2Vy cl9kaXNhYmxlX2NsazoKPj4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUoZ19uYW5kY19pbmZvW2lk XS5jbGspOwo+PiArZXJyX2Rpc2FibGVfaGNsazoKPj4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUo Z19uYW5kY19pbmZvW2lkXS5oY2xrKTsKPj4gKwo+PiArCXJldHVybiByZXQ7Cj4+ICt9Cj4+ICsK Pj4gK3N0YXRpYyBpbnQgcmtfbmFuZGNfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBk ZXYpCj4+ICt7Cj4+ICsJc3RydWN0IHJrX25hbmRfY29udHJvbGxlciAqY3RybCA9IHBsYXRmb3Jt X2dldF9kcnZkYXRhKHBkZXYpOwo+PiArCWludCByZXQ7Cj4+ICsKPj4gKwlyZXQgPSBya19uYW5k Y19jbGVhbnVwX2NoaXBzKGN0cmwpOwo+PiArCWlmIChyZXQpCj4+ICsJCXJldHVybiByZXQ7Cj4+ ICsKPj4gKwljbGtfZGlzYWJsZV91bnByZXBhcmUoY3RybC0+Y2xrKTsKPj4gKwljbGtfZGlzYWJs ZV91bnByZXBhcmUoY3RybC0+aGNsayk7Cj4+ICsJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwg TlVMTCk7Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gK30KPj4gKwo+PiArc3RhdGljIHZvaWQgcmtf bmFuZGNfc2h1dGRvd24oc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKPj4gK3sKPj4gKwlz dHJ1Y3QgcmtfbmFuZF9jb250cm9sbGVyICpjdHJsID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRl dik7Cj4+ICsJaW50IHJldDsKPj4gKwo+PiArCXJldCA9IHJrX25hbmRjX2NsZWFudXBfY2hpcHMo Y3RybCk7Cj4+ICsJaWYgKHJldCkKPj4gKwkJcmV0dXJuOwo+PiArCj4+ICsJY2xrX2Rpc2FibGVf dW5wcmVwYXJlKGN0cmwtPmNsayk7Cj4+ICsJY2xrX2Rpc2FibGVfdW5wcmVwYXJlKGN0cmwtPmhj bGspOwo+PiArCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOwo+PiArfQo+PiArCj4+ ICtzdGF0aWMgY29uc3Qgc3RydWN0IHJrX25hbmRjX2RhdGEgcmtfbmFuZGNfdjZfZGF0YSA9IHsK Pj4gKwkudmVyc2lvbiA9IFZFUlNJT05fNiwKPj4gK307Cj4+ICsKPj4gK3N0YXRpYyBjb25zdCBz dHJ1Y3QgcmtfbmFuZGNfZGF0YSBya19uYW5kY192OV9kYXRhID0gewo+PiArCS52ZXJzaW9uID0g VkVSU0lPTl85LAo+PiArfTsKPj4gKwo+PiArc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2Vf aWQgb2ZfcmtfbmFuZGNfbWF0Y2hbXSA9IHsKCgo+PiArCXsKPj4gKwkJLmNvbXBhdGlibGUgPSAi cm9ja2NoaXAsbmFuZGMtdjYiLAo+PiArCQkuZGF0YSA9ICZya19uYW5kY192Nl9kYXRhLAo+PiAr CX0sCj4+ICsJewo+PiArCQkuY29tcGF0aWJsZSA9ICJyb2NrY2hpcCxuYW5kYy12OSIsCj4+ICsJ CS5kYXRhID0gJnJrX25hbmRjX3Y5X2RhdGEsCj4+ICsJfSwKCkFnYWluIHRvIHByZXZlbnQgZ3Vl c3NpbmcgZ2FtZXMgcGxlYXNlIGFkdmlzZQppZiAicm9ja2NoaXAsbmFuZGMtdjYiIGFuZCAicm9j a2NoaXAsbmFuZGMtdjkiIGFyZSBjb3JyZWN0IG9yCnN0YXRlIHRoZSBkZXNpcmVkIGNvbXBhdGli bGUgc3RyaW5ncy4KCj4+ICsJeyAvKiBzZW50aW5lbCAqLyB9LAo+PiArfTsKPj4gKwo+PiArc3Rh dGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgcmtfbmFuZGNfZHJpdmVyID0gewo+PiArCS5wcm9i ZSAgPSBya19uYW5kY19wcm9iZSwKPj4gKwkucmVtb3ZlID0gcmtfbmFuZGNfcmVtb3ZlLAo+PiAr CS5zaHV0ZG93biA9IHJrX25hbmRjX3NodXRkb3duLAo+PiArCS5kcml2ZXIgPSB7Cj4+ICsJCS5u YW1lID0gInJvY2tjaGlwLW5hbmRjIiwKPj4gKwkJLm9mX21hdGNoX3RhYmxlID0gb2ZfcmtfbmFu ZGNfbWF0Y2gsCj4+ICsJfSwKPj4gK307Cj4+ICsKPgo+IE1vdmUgdGhpcyBlbXB0eSBsaW5lLi4u Cj4KPj4gK21vZHVsZV9wbGF0Zm9ybV9kcml2ZXIocmtfbmFuZGNfZHJpdmVyKTsKPgo+IC4uLkhl cmUKPgo+PiArTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwo+Cj4gVGhhbmtzLAo+IE1pcXXDqGwK PgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgovLyBTUERYLUxpY2Vuc2UtSWRl bnRpZmllcjogR1BMLTIuMAovKgogKiBDb3B5cmlnaHQgKGMpIDIwMTksIEpvaGFuIEpvbmtlciA8 amJ4NjI0NEBnbWFpbC5jb20+CiAqCiAqIEJhc2VkIG9uOgogKgpodHRwczovL2dpdGh1Yi5jb20v cm9ja2NoaXAtbGludXgva2VybmVsL2Jsb2IvZGV2ZWxvcC00LjQvZHJpdmVycy9ya19uYW5kL3Jr X2Z0bF9hcm1fdjcuUwogKgpodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vcm9ja2No aXAtbGludXgva2VybmVsL2RldmVsb3AtNC40L2RyaXZlcnMvcmtfbmFuZC9ya19mdGxfYXJtX3Y3 LlMKICogQ29weXJpZ2h0IChjKSAyMDE2LTIwMTgsIEZ1emhvdSBSb2NrY2hpcCBFbGVjdHJvbmlj cyBDby4sIEx0ZAogKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMCsKICoKICoKaHR0 cHM6Ly9naXRodWIuY29tL3JvY2tjaGlwLWxpbnV4L3UtYm9vdC9ibG9iL25leHQtZGV2L2RyaXZl cnMvcmtuYW5kL3JrX2Z0bF9hcm1fdjcuUwogKgpodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVu dC5jb20vcm9ja2NoaXAtbGludXgvdS1ib290L25leHQtZGV2L2RyaXZlcnMvcmtuYW5kL3JrX2Z0 bF9hcm1fdjcuUwogKiBDb3B5cmlnaHQgKGMpIDIwMTYtMjAxOCwgRnV6aG91IFJvY2tjaGlwIEVs ZWN0cm9uaWNzIENvLiwgTHRkCiAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwtMi4wKwog KgogKiBodHRwczovL2dpdGh1Yi5jb20vcm9ja2NoaXAtbGludXgvcmtkZXZlbG9wdG9vbC9ibG9i L21hc3Rlci9jcmMuY3BwCiAqIENvcHlyaWdodCAoYykgMjAxNyBGdXpob3UgUm9ja2NoaXAgRWxl Y3Ryb25pY3MgQ28uLCBMdGQKICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEdQTC0yLjArCiAq LwoKZW51bSBOQU5EX1RBRyB7CglJRF9JREJUID0gMHhFRkYwLAoJSURfVk5EUiA9IDB4RjA4NiwK CUlEX1NCRlggPSAweEYwOTUsCglJRF9TWVNCID0gMHhGMEE0LAoJSURfTDJQTSA9IDB4RjBDMiwK CUlEX0JCVEIgPSAweEYwRDEsCglJRF9CQlRGID0gMHhGMEUwLAoJSURfUkdNUCA9IDB4RkFGNSwK CUlEX1hYWFcgPSAweEZGRkYsCglJRF9TQlRHID0gMHgxMjM0NTY3OCwKCUlEX0NIQ0sgPSAweDEy MzQ4NzY1LAoJSURfQlRDRSA9IDB4NDI1NDQzNDUsCglJRF9GVExTID0gMHg0NjU0NEM1MywKCUlE X0hBU0ggPSAweDQ3QzZBN0U2LAoJSURfTkFORCA9IDB4NEU0MTRFNDQsCglJRF9WUENUID0gMHg1 MDAwMDA1NiwKCUlEX0lEUlcgPSAweEZDREM4QzNCLAoJSURfWFhYRCA9IDB4RkZGRkZGRkYsCn07 CgpzdHJ1Y3QgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpIHRhZ0ZsYXNoU2F2ZUluZm8gewoJ dWludDMyX3QgSWQ7Cgl1aW50MzJfdCBTaXplOwoJdWludDMyX3QgSlNIYXNoOwoJdWludDE2X3Qg Z05hbmRNYXhEaWU7Cgl1aW50MTZfdCBnTmFuZElEQlJlc0Jsa051bTsKCXVpbnQ2NF90IElEQnl0 ZVs4XTsKCXVpbnQxNl90IERpZUNzSW5kZXhbOF07Cgl1aW50NjRfdCBEaWVBZGRyc1s4XTsKCXVp bnQzMl90IGdOYW5kUGFyYUluZm9bOF07Cgl1aW50MzJfdCBnTmFuZE9wdFBhcmFbOF07Cgl1aW50 OF90IGdSZWFkUmV0cnlJbmZvWzg1Ml07Cgl1aW50MzJfdCBnRmxhc2hUb2dnbGVNb2RlRW47Cn07 CgpzdHJ1Y3QgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgyKSkpIHRhZ05hbmRPcHRQYXJhIHsKCXVp bnQ4X3QgcmVzMVs4XTsKCXVpbnQ4X3QgU3RhcnREcENtZDsKCXVpbnQ4X3QgRW5kRHBDbWQ7Cgl1 aW50OF90IERwRmlyc3RDbWQ7Cgl1aW50OF90IERwU2Vjb25kQ21kOwoJdWludDhfdCByZXM2OwoJ dWludDhfdCBjbWQyOwoJdWludDhfdCBjbWQxOwoJdWludDhfdCBtYXg7Cgl1aW50OF90IG9wdGlv bjsKCXVpbnQ4X3QgcmVzMTFbMTVdOwp9OwoKc3RydWN0IF9fYXR0cmlidXRlX18oKGFsaWduZWQo MikpKSB0YWdOYW5kUGFyYUluZm8gewoJdWludDhfdCBpZF9ieXRlczsKCXVpbnQ4X3QgbmFuZF9p ZFs2XTsKCXVpbnQ4X3QgdmVuZG9yOwoJdWludDhfdCBkaWVfcGVyX2NoaXA7Cgl1aW50OF90IHNl Y19wZXJfcGFnZTsKCXVpbnQxNl90IHBhZ2VfcGVyX2JsazsKCXVpbnQ4X3QgY2VsbDsKCXVpbnQ4 X3QgcGxhbmVfcGVyX2RpZTsKCXVpbnQxNl90IGJsa19wZXJfcGxhbmU7Cgl1aW50MTZfdCBvcGVy YXRpb25fb3B0OwoJdWludDhfdCBsc2JfbW9kZTsKCXVpbnQ4X3QgcmVhZF9yZXRyeV9tb2RlOwoJ dWludDhfdCBlY2NfYml0czsKCXVpbnQ4X3QgYWNjZXNzX2ZyZXE7Cgl1aW50OF90IG9wdF9tb2Rl OwoJdWludDhfdCBkaWVfZ2FwOwoJdWludDhfdCBiYWRfYmxvY2tfbW9kZTsKCXVpbnQ4X3QgbXVs dGlfcGxhbmVfbW9kZTsKCXVpbnQ4X3Qgc2xjX21vZGU7Cgl1aW50OF90IHJlc2VydmVkWzVdOwp9 OwoKc3RydWN0IF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKSB0YWdOYW5kUGh5SW5mbyB7Cgl1 aW50MzJfdCBjaGlwX2lkOwoJdWludDMyX3QgdmVuZG9yOwoJdWludDE2X3QgbmFuZF90eXBlOwoJ dWludDE2X3QgZGllX251bTsKCXVpbnQxNl90IHBsYW5lc19wZXJfZGllOwoJdWludDE2X3QgYmxr X3Blcl9wbGFuZTsKCXVpbnQxNl90IHBhZ2VfcGVyX2JsazsKCXVpbnQxNl90IHBhZ2VfcGVyX3Ns Y19ibGs7Cgl1aW50MTZfdCBzZWNfcGVyX3BhZ2U7Cgl1aW50MTZfdCBibG9ja19zaXplOwoJdWlu dDE2X3Qgc2VjdG9yX3NpemU7Cgl1aW50MTZfdCByZXNlcnZlZF9ibGtzOwp9OwoKc3RydWN0IHRh Z1JlYWRSZXRyeUluZm8gewoJdWludDhfdCByZXRyeU1vZGU7Cgl1aW50OF90IHNpemU7Cgl1aW50 OF90IG1heDsKCXVpbnQ4X3QgcmVzMzsKCXVpbnQ4X3QgYWRkcls4XTsKCXVpbnQ4X3Qgb2Zmc2V0 MVs4XTsKCXVpbnQ4X3QgYnVmWzgzMl07Cn07Cgp1aW50OF90IGdOYW5kSURhdGFCdWZbMjA0OF07 CnN0cnVjdCB0YWdOYW5kUGFyYUluZm8gKmdwTmFuZFBhcmFJbmZvOwpzdHJ1Y3QgdGFnTmFuZE9w dFBhcmEgZ05hbmRPcHRQYXJhOwpzdHJ1Y3QgdGFnTmFuZFBoeUluZm8gZ05hbmRQaHlJbmZvOwpz dHJ1Y3QgdGFnUmVhZFJldHJ5SW5mbyBnUmVhZFJldHJ5SW5mbzsKCnVpbnQxNl90IG1sY1BhZ2VU b1NsY1BhZ2VUYmxbNTEyXTsKdWludDE2X3Qgc2xjUGFnZVRvTWxjUGFnZVRibFsyNTZdOwoKdWlu dDMyX3QgKmdGbGFzaFBhZ2VCdWZmZXIwOwp1aW50MzJfdCAqZ0ZsYXNoUGFnZUJ1ZmZlcjE7Cgp2 b2lkIFBfUkM0KHVpbnQ4X3QgKmJ1ZiwgdWludDMyX3Qgc2l6ZSkKewoJdWludDhfdCBrZXlbMTZd ID0gewoJCTB4N0MsIDB4NEUsIDB4MDMsIDB4MDQsIDB4NTUsIDB4MDUsIDB4MDksIDB4MDcsCgkJ MHgyRCwgMHgyQywgMHg3QiwgMHgzOCwgMHgxNywgMHgwRCwgMHgxNywgMHgxMSwKCX07Cgl1aW50 OF90IFNbMjU2XSwgS1syNTZdLCB0ZW1wOwoJdWludDMyX3QgaSwgaiwgdCwgeDsKCglqID0gMDsK CWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewoJCVNbaV0gPSAodWludDhfdClpOwoJCWogJj0g MHgwZjsKCQlLW2ldID0ga2V5W2pdOwoJCWorKzsKCX0KCWogPSAwOwoJZm9yIChpID0gMDsgaSA8 IDI1NjsgaSsrKSB7CgkJaiA9IChqICsgU1tpXSArIEtbaV0pICUgMjU2OwoJCXRlbXAgPSBTW2ld OwoJCVNbaV0gPSBTW2pdOwoJCVNbal0gPSB0ZW1wOwoJfQoJaSA9IGogPSAwOwoJZm9yICh4ID0g MDsgeCA8IHNpemU7IHgrKykgewoJCWkgPSAoaSsxKSAlIDI1NjsKCQlqID0gKGogKyBTW2ldKSAl IDI1NjsKCQl0ZW1wID0gU1tpXTsKCQlTW2ldID0gU1tqXTsKCQlTW2pdID0gdGVtcDsKCQl0ID0g KFNbaV0gKyAoU1tqXSAlIDI1NikpICUgMjU2OwoJCWJ1Zlt4XSA9IGJ1Zlt4XSBeIFNbdF07Cgl9 Cn0KCnVpbnQzMl90IGpzX2hhc2godWludDhfdCAqYnVmLCB1aW50MzJfdCBzaXplKQp7Cgl1aW50 MzJfdCBoYXNoOwoJdWludDhfdCAqcF9tYXg7Cgl1aW50MzJfdCB0bXA7CgoJaGFzaCA9IElEX0hB U0g7CglwX21heCA9ICZidWZbc2l6ZV07Cgl3aGlsZSAoYnVmICE9IHBfbWF4KSB7CgkJdG1wID0g KmJ1ZisrOwoJCWhhc2ggXj0gKGhhc2ggPj4gMikgKyAzMiAqIGhhc2ggKyB0bXA7Cgl9CglyZXR1 cm4gaGFzaDsKfQoKdm9pZCBCdWlsZEZsYXNoTHNiUGFnZVRhYmxlKHVpbnQzMl90IGxzYl9tb2Rl LCB1aW50MTZfdCBzaXplKQp7Cgl1aW50MzJfdCBjb3VudGVyMTsKCXVpbnQzMl90IGNvdW50ZXIy OwoJdWludDMyX3QgY291bnRlcjM7Cgl1aW50MzJfdCBjb3VudGVyNDsKCXVpbnQzMl90IGNvdW50 ZXI1OwoJdWludDMyX3QgY291bnRlcjY7Cgl1aW50MzJfdCBjb3VudGVyNzsKCXVpbnQzMl90IGNv dW50ZXI4OwoJdWludDE2X3Qgb2Zmc2V0MTsKCXVpbnQxNl90IG9mZnNldDI7Cgl1aW50MzJfdCBv ZmZzZXQzOwoJdWludDE2X3Qgb2Zmc2V0NDsKCXVpbnQxNl90ICpwX3RhYmxlMTsKCXVpbnQxNl90 ICpwX3RhYmxlMjsKCXVpbnQxNl90ICpwX3RhYmxlMzsKCXVpbnQxNl90IHRtcDE7Cgl1aW50MTZf dCB0bXAyOwoJdWludDE2X3QgdG1wMzsKCXVpbnQzMl90IHRtcDQ7Cgl1aW50MTZfdCB0bXA1OwoJ dWludDMyX3QgdG1wNjsKCglpZiAobHNiX21vZGUpIHsKCQlzd2l0Y2ggKGxzYl9tb2RlKSB7CgkJ Y2FzZSAxdToKCQkJY291bnRlcjIgPSAwOwoJCQlkbyB7CgkJCQl0bXAxID0gY291bnRlcjI7CgkJ CQlpZiAoY291bnRlcjIgPiAzKSB7CgkJCQkJaWYgKGNvdW50ZXIyICYgMSkKCQkJCQkJb2Zmc2V0 MSA9IDM7CgkJCQkJZWxzZQoJCQkJCQlvZmZzZXQxID0gMjsKCQkJCQl0bXAxID0gMiAqIGNvdW50 ZXIyIC0gb2Zmc2V0MTsKCQkJCX0KCQkJCXNsY1BhZ2VUb01sY1BhZ2VUYmxbY291bnRlcjIrK10g PSB0bXAxOwoJCQl9IHdoaWxlIChjb3VudGVyMiAhPSAyNTYpOwoJCQlicmVhazsKCQljYXNlIDJ1 OgoJCQljb3VudGVyMyA9IDA7CgkJCWRvIHsKCQkJCXRtcDIgPSBjb3VudGVyMzsKCQkJCWlmIChj b3VudGVyMyA+IDEpCgkJCQkJdG1wMiA9IDIgKiBjb3VudGVyMyAtIDE7CgkJCQlzbGNQYWdlVG9N bGNQYWdlVGJsW2NvdW50ZXIzKytdID0gdG1wMjsKCQkJfSB3aGlsZSAoY291bnRlcjMgIT0gMjU2 KTsKCQkJYnJlYWs7CgkJY2FzZSAzdToKCQkJY291bnRlcjQgPSAwOwoJCQlkbyB7CgkJCQl0bXAz ID0gY291bnRlcjQ7CgkJCQlpZiAoY291bnRlcjQgPiA1KSB7CgkJCQkJaWYgKGNvdW50ZXI0ICYg MSkKCQkJCQkJb2Zmc2V0MiA9IDU7CgkJCQkJZWxzZQoJCQkJCQlvZmZzZXQyID0gNDsKCQkJCQl0 bXAzID0gMiAqIGNvdW50ZXI0IC0gb2Zmc2V0MjsKCQkJCX0KCQkJCXNsY1BhZ2VUb01sY1BhZ2VU YmxbY291bnRlcjQrK10gPSB0bXAzOwoJCQl9IHdoaWxlIChjb3VudGVyNCAhPSAyNTYpOwoJCQli cmVhazsKCQlkZWZhdWx0OgoJCQljb3VudGVyNSA9IDA7CgkJCXN3aXRjaCAobHNiX21vZGUpIHsK CQkJY2FzZSA0dToKCQkJCXNsY1BhZ2VUb01sY1BhZ2VUYmxbMF0gPSAwOwoJCQkJc2xjUGFnZVRv TWxjUGFnZVRibFsxXSA9IDE7CgkJCQlzbGNQYWdlVG9NbGNQYWdlVGJsWzJdID0gMjsKCQkJCXNs Y1BhZ2VUb01sY1BhZ2VUYmxbM10gPSAzOwoJCQkJc2xjUGFnZVRvTWxjUGFnZVRibFs1XSA9IDU7 CgkJCQlzbGNQYWdlVG9NbGNQYWdlVGJsWzZdID0gNzsKCQkJCWNvdW50ZXI2ID0gODsKCQkJCXNs Y1BhZ2VUb01sY1BhZ2VUYmxbNF0gPSA0OwoJCQkJc2xjUGFnZVRvTWxjUGFnZVRibFs3XSA9IDg7 CgkJCQlwX3RhYmxlMSA9ICZzbGNQYWdlVG9NbGNQYWdlVGJsWzddOwoJCQkJZG8gewoJCQkJCWlm IChjb3VudGVyNiAmIDEpCgkJCQkJCW9mZnNldDMgPSA3OwoJCQkJCWVsc2UKCQkJCQkJb2Zmc2V0 MyA9IDY7CgkJCQkJdG1wNCA9IDIgKiBjb3VudGVyNiAtIG9mZnNldDM7CgkJCQkJY291bnRlcjYg PSAodWludDE2X3QpKGNvdW50ZXI2ICsgMSk7CgkJCQkJcF90YWJsZTFbMV0gPSB0bXA0OwoJCQkJ CSsrcF90YWJsZTE7CgkJCQl9IHdoaWxlIChjb3VudGVyNiAhPSAyNTYpOwoJCQkJYnJlYWs7CgkJ CWNhc2UgNXU6CgkJCQlkbyB7CgkJCQkJc2xjUGFnZVRvTWxjUGFnZVRibFtjb3VudGVyNV0gPQoJ CQkJCQljb3VudGVyNTsKCQkJCQkrK2NvdW50ZXI1OwoJCQkJfSB3aGlsZSAoY291bnRlcjUgIT0g MTYpOwoJCQkJcF90YWJsZTIgPSAmc2xjUGFnZVRvTWxjUGFnZVRibFsxNV07CgkJCQlkbyB7CgkJ CQkJcF90YWJsZTJbMV0gPSBjb3VudGVyNTsKCQkJCQkrK3BfdGFibGUyOwoJCQkJCWNvdW50ZXI1 ID0gKHVpbnQxNl90KShjb3VudGVyNSArIDIpOwoJCQkJfSB3aGlsZSAoY291bnRlcjUgIT0gNDk2 KTsKCQkJCWJyZWFrOwoJCQljYXNlIDZ1OgoJCQkJY291bnRlcjcgPSAwOwoJCQkJZG8gewoJCQkJ CXRtcDUgPSBjb3VudGVyNzsKCQkJCQlpZiAoY291bnRlcjcgPiA1KSB7CgkJCQkJCWlmIChjb3Vu dGVyNyAmIDEpCgkJCQkJCQlvZmZzZXQ0ID0gMTI7CgkJCQkJCWVsc2UKCQkJCQkJCW9mZnNldDQg PSAxMDsKCQkJCQkJdG1wNSA9IGNvdW50ZXI1IC0gb2Zmc2V0NDsKCQkJCQl9CgkJCQkJc2xjUGFn ZVRvTWxjUGFnZVRibFtjb3VudGVyNysrXSA9IHRtcDU7CgkJCQkJY291bnRlcjUgPSAodWludDE2 X3QpKGNvdW50ZXI1ICsgMyk7CgkJCQl9IHdoaWxlIChjb3VudGVyNyAhPSAyNTYpOwoJCQkJYnJl YWs7CgkJCWNhc2UgOXU6CgkJCQlzbGNQYWdlVG9NbGNQYWdlVGJsWzBdID0gMDsKCQkJCXNsY1Bh Z2VUb01sY1BhZ2VUYmxbMV0gPSAxOwoJCQkJc2xjUGFnZVRvTWxjUGFnZVRibFsyXSA9IDI7CgkJ CQlwX3RhYmxlMyA9ICZzbGNQYWdlVG9NbGNQYWdlVGJsWzJdOwoJCQkJY291bnRlcjggPSAzOwoJ CQkJZG8gewoJCQkJCXBfdGFibGUzWzFdID0gY291bnRlcjg7CgkJCQkJKytwX3RhYmxlMzsKCQkJ CQljb3VudGVyOCA9ICh1aW50MTZfdCkoY291bnRlcjggKyAyKTsKCQkJCX0gd2hpbGUgKGNvdW50 ZXI4ICE9IDUwOSk7CgkJCQlicmVhazsKCQkJfQoJCQlicmVhazsKCQl9Cgl9IGVsc2UgewoJCWRv IHsKCQkJc2xjUGFnZVRvTWxjUGFnZVRibFtsc2JfbW9kZV0gPSBsc2JfbW9kZTsKCQkJKytsc2Jf bW9kZTsKCQl9IHdoaWxlIChsc2JfbW9kZSAhPSAyNTYpOwoJfQoJZnRsX21lbXNldChtbGNQYWdl VG9TbGNQYWdlVGJsLCAweEZGdSwgMTAyNHUpOwoJY291bnRlcjEgPSAwOwoJd2hpbGUgKHNpemUg PiAodWludDE2X3QpY291bnRlcjEpIHsKCQl0bXA2ID0gc2xjUGFnZVRvTWxjUGFnZVRibFtjb3Vu dGVyMSsrXTsKCQltbGNQYWdlVG9TbGNQYWdlVGJsW3RtcDZdID0gdG1wNjsKCX0KfQoKaW50IEZs YXNoRXJhc2VCbG9jayh1aW50MzJfdCBjcywgdWludDMyX3QgcGFnZV9hZGRyLCB1aW50MzJfdCBz bGNfbW9kZSkKewoJdWludDhfdCBzdGF0dXM7CgoJTmFuZGNXYWl0Rmxhc2hSZWFkeShjcyk7CglO YW5kY0ZsYXNoQ3MoY3MpOwoJRmxhc2hFcmFzZUNtZChjcywgcGFnZV9hZGRyLCBzbGNfbW9kZSk7 CglOYW5kY1dhaXRGbGFzaFJlYWR5KGNzKTsKCXN0YXR1cyA9IEZsYXNoUmVhZFN0YXR1cyhjcyk7 CglOYW5kY0ZsYXNoRGVDcyhjcyk7CglyZXR1cm4gc3RhdHVzICYgMTsKfQoKaW50IEZsYXNoUHJv Z1BhZ2VSYXcodWludDMyX3QgY3MsIHVpbnQzMl90IHBhZ2VfYWRkciwgdWludDMyX3QgKnBfZGF0 YSwKCQkgICAgIHVpbnQxNl90ICpwX3NwYXJlKQp7Cgl1aW50OF90IHNlY19wZXJfcGFnZTsKCXVp bnQ4X3Qgc3RhdHVzOwoKCXNlY19wZXJfcGFnZSA9IGdOYW5kUGFyYUluZm8uc2VjX3Blcl9wYWdl OwoJaWYgKCFjcyAmJiBnQmxvY2tQYWdlQWxpZ25TaXplICogZ05hbmRJREJSZXNCbGtOdW0gPiBw YWdlX2FkZHIpIHsKCQlzZWNfcGVyX3BhZ2UgPSA0OwoJfQoJTmFuZGNXYWl0Rmxhc2hSZWFkeShj cyk7CglOYW5kY0ZsYXNoQ3MoY3MpOwoJRmxhc2hQcm9nRmlyc3RDbWQoY3MsIHBhZ2VfYWRkcik7 CglOYW5kY1hmZXJEYXRhKGNzLCAxdSwgc2VjX3Blcl9wYWdlLCBwX2RhdGEsIHBfc3BhcmUpOwoJ Rmxhc2hQcm9nU2Vjb25kQ21kKGNzKTsKCU5hbmRjV2FpdEZsYXNoUmVhZHkoY3MpOwoJc3RhdHVz ID0gRmxhc2hSZWFkU3RhdHVzKGNzKTsKCU5hbmRjRmxhc2hEZUNzKGNzKTsKCXJldHVybiBzdGF0 dXMgJiAxOwp9Cgp1aW50MzJfdCBGbGFzaFJlYWRSYXdQYWdlKHVpbnQzMl90IGNzLCB1aW50MzJf dCBwYWdlX2FkZHIsIHVpbnQzMl90ICpwX2RhdGEsCgkJCSAgdWludDE2X3QgKnBfc3BhcmUpCnsK CXVpbnQzMl90IHNlY19wZXJfcGFnZTsKCXVpbnQzMl90IHN0YXR1czsKCglzZWNfcGVyX3BhZ2Ug PSBnTmFuZFBhcmFJbmZvLnNlY19wZXJfcGFnZTsKCWlmICghY3MgJiYgZ0Jsb2NrUGFnZUFsaWdu U2l6ZSAqIGdOYW5kSURCUmVzQmxrTnVtID4gcGFnZV9hZGRyKSB7CgkJc2VjX3Blcl9wYWdlID0g NDsKCX0KCU5hbmRjV2FpdEZsYXNoUmVhZHkoY3MpOwoJTmFuZGNGbGFzaENzKGNzKTsKCUZsYXNo UmVhZENtZChjcywgcGFnZV9hZGRyKTsKCU5hbmRjV2FpdEZsYXNoUmVhZHkoY3MpOwoJc3RhdHVz ID0gTmFuZGNYZmVyRGF0YShjcywgMCwgc2VjX3Blcl9wYWdlLCBwX2RhdGEsIHBfc3BhcmUpOwoJ TmFuZGNGbGFzaERlQ3MoY3MpOwoJcmV0dXJuIHN0YXR1czsKfQoKdm9pZCBGbGFzaEJsb2NrQWxp Z25Jbml0KHVpbnQzMl90IHBhZ2VfcGVyX2JsaykKewoJdWludDMyX3QgYWxpZ25fc2l6ZTsKCglp ZiAocGFnZV9wZXJfYmxrID4gMjU2KSB7CgkJYWxpZ25fc2l6ZSA9IDUxMjsKbGFiZWxfMzoKCQln QmxvY2tQYWdlQWxpZ25TaXplID0gYWxpZ25fc2l6ZTsKCQlyZXR1cm47Cgl9CglpZiAocGFnZV9w ZXJfYmxrID4gMTI4KSB7CgkJYWxpZ25fc2l6ZSA9IDI1NjsKCQlnb3RvIGxhYmVsXzM7Cgl9Cgln QmxvY2tQYWdlQWxpZ25TaXplID0gcGFnZV9wZXJfYmxrOwp9Cgp1aW50MzJfdCBGbGFzaExvYWRQ aHlJbmZvKHZvaWQpCnsKCXN0cnVjdCB0YWdGbGFzaFNhdmVJbmZvICppbmZvOwoJdWludDMyX3Qg YWxpZ25fc2l6ZTsKCXVpbnQzMl90IGJjaF9jb3VudGVyOwoJdWludDMyX3QgY291bnRlcjsKCXVp bnQzMl90IHBhZ2VfYWRkcjsKCXVpbnQzMl90IHN0YXR1czsKCXVpbnQ4X3QgYmNoWzRdOwoKCXBh Z2VfYWRkciA9IDA7Cgljb3VudGVyID0gNDsKCWJjaFswXSA9IDYwOwoJYmNoWzFdID0gNDA7Cgli Y2hbMl0gPSAyNDsKCWJjaFszXSA9IDE2OwoJc3RhdHVzID0gTkFORF9TVFNfRVJST1I7CglhbGln bl9zaXplID0gZ0Jsb2NrUGFnZUFsaWduU2l6ZTsKCWdOYW5kRmxhc2hJbmZvQmxvY2tBZGRyID0g MDsKCWdwRmxhc2hTYXZlSW5mbyA9IChzdHJ1Y3QgdGFnRmxhc2hTYXZlSW5mbyAqKWdGbGFzaFBh Z2VCdWZmZXIwOwoJZmxhc2hfZW50ZXJfc2xjX21vZGUoMCk7Cgl3aGlsZSAoMSkgewoJCWJjaF9j b3VudGVyID0gMDsKCQl3aGlsZSAoMSkgewoJCQlGbGFzaEJjaFNlbChiY2hbYmNoX2NvdW50ZXJd KTsKCQkJaWYgKEZsYXNoUmVhZFJhd1BhZ2UoCgkJCQkgICAgMCwKCQkJCSAgICBwYWdlX2FkZHIs CgkJCQkgICAgZ0ZsYXNoUGFnZUJ1ZmZlcjAsCgkJCQkgICAgMCkgIT0gTkFORF9TVFNfRVJST1Ig fHwKCQkJICAgIEZsYXNoUmVhZFJhd1BhZ2UoCgkJCQkgICAgMCwKCQkJCSAgICBwYWdlX2FkZHIg KyAxLAoJCQkJICAgIGdGbGFzaFBhZ2VCdWZmZXIwLAoJCQkJICAgIDApICE9IE5BTkRfU1RTX0VS Uk9SKSB7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoKytiY2hfY291bnRlciA9PSA0KQoJCQkJZ290 byBsYWJlbF82OwoJCX0KCQlpbmZvID0gZ3BGbGFzaFNhdmVJbmZvOwoJCWlmIChncEZsYXNoU2F2 ZUluZm8tPklkID09IElEX05BTkQpIHsKCQkJaWYgKCFzdGF0dXMpIHsKCQkJCWdOYW5kRmxhc2hJ ZGJCbG9ja0FkZHIgPQoJCQkJCXBhZ2VfYWRkcgoJCQkJCS8gZ0Jsb2NrUGFnZUFsaWduU2l6ZSAr IDE7CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoIGluZm8tPkpTSGFzaCA9PSBqc19oYXNoKAoJCQkJ ICAgICAodWludDhfdCAqKSZncEZsYXNoU2F2ZUluZm8tPmdOYW5kTWF4RGllLAoJCQkJICAgICAy MDM2dSkpIHsKCQkJCWZ0bF9tZW1jcHkoCgkJCQkJJmdOYW5kUGFyYUluZm8sCgkJCQkJaW5mby0+ Z05hbmRQYXJhSW5mbywKCQkJCQkzMnUpOwoJCQkJZnRsX21lbWNweSgKCQkJCQkmZ05hbmRPcHRQ YXJhLAoJCQkJCWdwRmxhc2hTYXZlSW5mby0+Z05hbmRPcHRQYXJhLAoJCQkJCTMydSk7CgkJCQlm dGxfbWVtY3B5KAoJCQkJCSZnUmVhZFJldHJ5SW5mbywKCQkJCQlncEZsYXNoU2F2ZUluZm8tPmdS ZWFkUmV0cnlJbmZvLAoJCQkJCTg1MnUpOwoJCQkJRmxhc2hCbG9ja0FsaWduSW5pdChnTmFuZFBh cmFJbmZvLnBhZ2VfcGVyX2Jsayk7CgkJCQlnRmxhc2hUb2dnbGVNb2RlRW4gPQoJCQkJCWdwRmxh c2hTYXZlSW5mby0+Z0ZsYXNoVG9nZ2xlTW9kZUVuOwoJCQkJZ05hbmRGbGFzaEluZm9CbG9ja0Fk ZHIgPSBwYWdlX2FkZHI7CgkJCQlpZiAocGFnZV9hZGRyIC8gZ0Jsb2NrUGFnZUFsaWduU2l6ZSAr IDEgPiAxKQoJCQkJCWdOYW5kRmxhc2hJZGJCbG9ja0FkZHIgPQoJCQkJCQlwYWdlX2FkZHIKCQkJ CQkJLyBnQmxvY2tQYWdlQWxpZ25TaXplICsgMTsKCQkJCWVsc2UKCQkJCQlnTmFuZEZsYXNoSWRi QmxvY2tBZGRyID0gMjsKCQkJCXN0YXR1cyA9IE5BTkRfU1RTX09LOwoJCQkJZ05hbmRJREJSZXNC bGtOdW1TYXZlSW5GbGFzaCA9CgkJCQkJZ3BGbGFzaFNhdmVJbmZvLT5nTmFuZElEQlJlc0Jsa051 bTsKCQkJfSBlbHNlIHsKCQkJCXN0YXR1cyA9IE5BTkRfU1RTX0VSUk9SOwoJCQl9CgkJfQpsYWJl bF82OgoJCS0tY291bnRlcjsKCQlwYWdlX2FkZHIgKz0gYWxpZ25fc2l6ZTsKCQlpZiAoY291bnRl cikKCQkJY29udGludWU7CgkJYnJlYWs7Cgl9CglmbGFzaF9leGl0X3NsY19tb2RlKDApOwoJcmV0 dXJuIHN0YXR1czsKfQoKdm9pZCBGbGFzaFNhdmVQaHlJbmZvKHZvaWQpCnsKCXVpbnQzMl90IGNv dW50ZXIxOwoJdWludDMyX3QgY291bnRlcjI7Cgl1aW50MzJfdCBkb25lOwoJdWludDMyX3QgaGFz aDsKCXVpbnQzMl90IHN0YXR1czsKCglncEZsYXNoU2F2ZUluZm8gPSAoc3RydWN0IHRhZ0ZsYXNo U2F2ZUluZm8gKilnRmxhc2hQYWdlQnVmZmVyMDsKCUZsYXNoQmNoU2VsKGdOYW5kRmxhc2hJREJF Y2NCaXRzKTsKCWZ0bF9tZW1zZXQoZ0ZsYXNoUGFnZUJ1ZmZlcjAsIDAsIDIwNDh1KTsKCWdwRmxh c2hTYXZlSW5mby0+SWQgPSBJRF9OQU5EOwoJZ3BGbGFzaFNhdmVJbmZvLT5nTmFuZE1heERpZSA9 IGdOYW5kTWF4RGllOwoJZ3BGbGFzaFNhdmVJbmZvLT5nTmFuZElEQlJlc0Jsa051bSA9IGdOYW5k SURCUmVzQmxrTnVtOwoJZ3BGbGFzaFNhdmVJbmZvLT5nRmxhc2hUb2dnbGVNb2RlRW4gPSBnRmxh c2hUb2dnbGVNb2RlRW47CglmdGxfbWVtY3B5KGdwRmxhc2hTYXZlSW5mby0+SURCeXRlLCBJREJ5 dGUsIDMydSk7CglmdGxfbWVtY3B5KGdwRmxhc2hTYXZlSW5mby0+RGllQ3NJbmRleCwgRGllQ3NJ bmRleCwgOHUpOwoJZnRsX21lbWNweShncEZsYXNoU2F2ZUluZm8tPkRpZUFkZHJzLCBEaWVBZGRy cywgMzJ1KTsKCWZ0bF9tZW1jcHkoCgkJZ3BGbGFzaFNhdmVJbmZvLT5nTmFuZFBhcmFJbmZvLAoJ CSZnTmFuZFBhcmFJbmZvLAoJCTMydSk7CglmdGxfbWVtY3B5KGdwRmxhc2hTYXZlSW5mby0+Z05h bmRPcHRQYXJhLCAmZ05hbmRPcHRQYXJhLCAzMnUpOwoJZnRsX21lbWNweSgKCQlncEZsYXNoU2F2 ZUluZm8tPmdSZWFkUmV0cnlJbmZvLAoJCSZnUmVhZFJldHJ5SW5mbywKCQk4NTJ1KTsKCWdwRmxh c2hTYXZlSW5mby0+SlNIYXNoID0ganNfaGFzaCgKCQkJCQkgICh1aW50OF90ICopCgkJCQkJICAm Z3BGbGFzaFNhdmVJbmZvLT5nTmFuZE1heERpZSwKCQkJCQkgIDIwMzZ1KTsKCWdwRmxhc2hTYXZl SW5mby0+U2l6ZSA9IDE1OTI7Cglkb25lID0gMDsKCWNvdW50ZXIxID0gMDsKCWdwRmxhc2hTYXZl SW5mbyA9IChzdHJ1Y3QgdGFnRmxhc2hTYXZlSW5mbyAqKWdGbGFzaFBhZ2VCdWZmZXIxOwoJZmxh c2hfZW50ZXJfc2xjX21vZGUoMCk7CglkbyB7CgkJRmxhc2hFcmFzZUJsb2NrKDAsIGdCbG9ja1Bh Z2VBbGlnblNpemUgKiBjb3VudGVyMSwgMCk7CgkJRmxhc2hQcm9nUGFnZVJhdygKCQkJMCwKCQkJ Z0Jsb2NrUGFnZUFsaWduU2l6ZSAqIGNvdW50ZXIxLAoJCQlnRmxhc2hQYWdlQnVmZmVyMCwKCQkJ MCk7CgkJRmxhc2hQcm9nUGFnZVJhdygKCQkJMCwKCQkJZ0Jsb2NrUGFnZUFsaWduU2l6ZSAqIGNv dW50ZXIxICsgMSwKCQkJZ0ZsYXNoUGFnZUJ1ZmZlcjAsCgkJCTApOwoJCXN0YXR1cyA9IEZsYXNo UmVhZFJhd1BhZ2UoCgkJCQkgMCwKCQkJCSBnQmxvY2tQYWdlQWxpZ25TaXplICogY291bnRlcjEs CgkJCQkgZ0ZsYXNoUGFnZUJ1ZmZlcjEsCgkJCQkgMCk7CgkJY291bnRlcjIgPSBjb3VudGVyMSAr IDE7CgkJaWYgKHN0YXR1cyAhPSBOQU5EX1NUU19FUlJPUiAmJgoJCSAgICBncEZsYXNoU2F2ZUlu Zm8tPklkID09IElEX05BTkQpIHsKCQkJaGFzaCA9IGpzX2hhc2goCgkJCQkgICAgICAgKHVpbnQ4 X3QgKikKCQkJCSAgICAgICAmZ3BGbGFzaFNhdmVJbmZvLT5nTmFuZE1heERpZSwKCQkJCSAgICAg ICAyMDM2dSk7CgkJCWNvdW50ZXIyID0gY291bnRlcjEgKyAxOwoJCQlpZiAoZ3BGbGFzaFNhdmVJ bmZvLT5KU0hhc2ggPT0gaGFzaCkgewoJCQkJZ05hbmRGbGFzaElkYkJsb2NrQWRkciA9IGNvdW50 ZXIxICsgMTsKCQkJCWdOYW5kRmxhc2hJbmZvQmxvY2tBZGRyID0gY291bnRlcjEKCQkJCQkJCSAg KiBnQmxvY2tQYWdlQWxpZ25TaXplOwoJCQkJaWYgKGRvbmUgPT0gMSkKCQkJCQlicmVhazsKCQkJ CWRvbmUgPSAxOwoJCQl9CgkJfQoJCWNvdW50ZXIxID0gY291bnRlcjI7Cgl9IHdoaWxlIChjb3Vu dGVyMiAhPSA0KTsKCWZsYXNoX2V4aXRfc2xjX21vZGUoMCk7Cn0KCmludCBGbGFzaFJlYWRJZGJE YXRhUmF3KHVpbnQ4X3QgKnBfYnVmKQp7Cgl1aW50MzJfdCBiY2hfY291bnRlcjsKCXVpbnQzMl90 IGVjY19iaXRzOwoJdWludDMyX3QgZWNjX2JpdHMyOwoJdWludDMyX3QgcGFnZV9jb3VudGVyOwoJ aW50IHN0YXR1czsKCXVpbnQ4X3QgYmNoWzRdOwoKCWJjaFswXSA9IDYwOwoJYmNoWzFdID0gNDA7 CgliY2hbMl0gPSAyNDsKCWJjaFszXSA9IDE2OwoJZWNjX2JpdHMyID0gZ05hbmRGbGFzaEVjY0Jp dHM7CglpZiAoaWRiX2ZsYXNoX3NsY19tb2RlKQoJCWZsYXNoX2VudGVyX3NsY19tb2RlKDApOwoJ c3RhdHVzID0gTkFORF9TVFNfRVJST1I7CglwYWdlX2NvdW50ZXIgPSAyOwoJZnRsX21lbXNldChw X2J1ZiwgMCwgMjA0OHUpOwoJd2hpbGUgKDEpIHsKCQlpZiAocGFnZV9jb3VudGVyIDwgZ05hbmRJ REJSZXNCbGtOdW0pIHsKCQkJYmNoX2NvdW50ZXIgPSAwOwoJCQl3aGlsZSAoMSkgewoJCQkJZWNj X2JpdHMgPSBiY2hbYmNoX2NvdW50ZXJdOwoJCQkJRmxhc2hCY2hTZWwoZWNjX2JpdHMpOwoJCQkJ aWYgKCBGbGFzaFJlYWRSYXdQYWdlKAoJCQkJCSAgICAgMCwKCQkJCQkgICAgIGdCbG9ja1BhZ2VB bGlnblNpemUKCQkJCQkgICAgICogcGFnZV9jb3VudGVyLAoJCQkJCSAgICAgZ0ZsYXNoUGFnZUJ1 ZmZlcjAsCgkJCQkJICAgICAwKSAhPSBOQU5EX1NUU19FUlJPUikKCQkJCQlicmVhazsKCQkJCWlm ICgrK2JjaF9jb3VudGVyID09IDQpCgkJCQkJZ290byBsYWJlbF8xMTsKCQkJfQoJCQlpZiAoKmdG bGFzaFBhZ2VCdWZmZXIwID09IElEX0lEUlcpIHsKCQkJCUZUTF9JTkZPKCJFQ0M6JWRcbiIsIGVj Y19iaXRzKTsKCQkJCWZ0bF9tZW1jcHkoCgkJCQkJcF9idWYsCgkJCQkJZ0ZsYXNoUGFnZUJ1ZmZl cjAsCgkJCQkJMjA0OHUpOwoJCQkJZ05hbmRJREJSZXNCbGtOdW0gPSBnRmxhc2hQYWdlQnVmZmVy MFsxMjhdOwoJCQkJaWYgKHBhZ2VfY291bnRlciA+PSBnTmFuZEZsYXNoSWRiQmxvY2tBZGRyKSB7 CgkJCQkJc3RhdHVzID0gTkFORF9TVFNfT0s7CgkJCQkJYnJlYWs7CgkJCQl9CgkJCQlnTmFuZEZs YXNoSWRiQmxvY2tBZGRyID0gcGFnZV9jb3VudGVyOwoJCQkJc3RhdHVzID0gTkFORF9TVFNfT0s7 CgkJCQlGbGFzaFNhdmVQaHlJbmZvKCk7CgkJCX0KbGFiZWxfMTE6CgkJCSsrcGFnZV9jb3VudGVy OwoJCQljb250aW51ZTsKCQl9CgkJYnJlYWs7Cgl9CglGbGFzaEJjaFNlbChlY2NfYml0czIpOwoJ aWYgKGlkYl9mbGFzaF9zbGNfbW9kZSkKCQlmbGFzaF9leGl0X3NsY19tb2RlKDApOwoJcmV0dXJu IHN0YXR1czsKfQoKdm9pZCBGbGFzaFBhZ2VQcm9nTXNiRkZEYXRhKHVpbnQzMl90IGNzLCB1aW50 MzJfdCBwYWdlX2FkZHIsIHVpbnQzMl90IGNvdW50KQp7Cgl1aW50MzJfdCByZXRyeV9tb2RlOwoJ dWludDMyX3Qgc2hpZnQ7Cgl1aW50MzJfdCB0bXA7CgoJaWYgKCFnRmxhc2hTbGNNb2RlIHx8ICFp ZGJfZmxhc2hfc2xjX21vZGUpIHsKCQlyZXRyeV9tb2RlID0gZ3BOYW5kUGFyYUluZm8tPnJlYWRf cmV0cnlfbW9kZTsKCQlzaGlmdCA9ICh1aW50OF90KShyZXRyeV9tb2RlIC0gNSk7CgkJaWYgKHNo aWZ0ID4gMzApIHsKCQkJaWYgKHJldHJ5X21vZGUgIT0gNjgpCgkJCQlyZXR1cm47CgkJfSBlbHNl IGlmICghKCgweDQwMDA0MDBGdSA+PiBzaGlmdCkgJiAxKSkgewoJCQlyZXR1cm47CgkJfQoJCXdo aWxlIChncE5hbmRQYXJhSW5mby0+cGFnZV9wZXJfYmxrID4gY291bnQgJiYKCQkgICAgICAgbWxj UGFnZVRvU2xjUGFnZVRibFtjb3VudF0gPT0gMHhGRkZGKSB7CgkJCWlmIChyZXRyeV9tb2RlID09 IDgpCgkJCQl0bXAgPSAwOwoJCQllbHNlCgkJCQl0bXAgPSAweEZGdTsKCQkJZnRsX21lbXNldChn Rmxhc2hQYWdlQnVmZmVyMSwgdG1wLCAzMjc2OHUpOwoJCQlGbGFzaFByb2dQYWdlUmF3KAoJCQkJ Y3MsCgkJCQljb3VudCArIHBhZ2VfYWRkciwKCQkJCWdGbGFzaFBhZ2VCdWZmZXIxLAoJCQkJKHVp bnQxNl90ICopZ0ZsYXNoUGFnZUJ1ZmZlcjEpOwoJCQljb3VudCA9ICh1aW50MTZfdCkoY291bnQg KyAxKTsKCQl9Cgl9Cn0KCnZvaWQgSWRCbG9ja1JlYWREYXRhKHVpbnQzMl90IGluZGV4LCB1aW50 MzJfdCBjb3VudCwgdWludDMyX3QgKmJ1ZikKewoJdWludDMyX3QgY291bnRlcjsKCXVpbnQxNl90 IGNvdW50ZXJfYWRkOwoJdWludDMyX3QgZWNjX2JpdHM7Cgl1aW50MzJfdCBtaW5fc2VjdG9yOwoJ dWludDMyX3QgcGFnZTsKCXVpbnQzMl90IHNlY3RvcjsKCXVpbnQzMl90IHNlY3RvcjI7Cgl1aW50 MTZfdCBzaXplOwoJdWludDMyX3Qgc3RhcnRfb2Zmc2V0OwoKCXNpemUgPSBncE5hbmRQYXJhSW5m by0+c2VjX3Blcl9wYWdlICogKHVpbnQxNl90KWdCbG9ja1BhZ2VBbGlnblNpemU7CglGVExfSU5G TygKCQkiSWRCbG9ja1JlYWREYXRhICV4ICV4XG4iLAoJCWluZGV4LAoJCWNvdW50KTsKCWNvdW50 ZXIgPSAwOwoJc2VjdG9yMiA9IGluZGV4ICUgc2l6ZTsKCW1pbl9zZWN0b3IgPSBpbmRleCAtIGlu ZGV4ICUgc2l6ZTsKCXN0YXJ0X29mZnNldCA9IChncE5hbmRQYXJhSW5mby0+c2VjX3Blcl9wYWdl ICogKGluZGV4ICUgc2l6ZSkgPj4gMikgJiAzOwoJd2hpbGUgKGNvdW50ZXIgPCBjb3VudCkgewoJ CWNvdW50ZXJfYWRkID0gNCAtIHN0YXJ0X29mZnNldDsKCQlwYWdlID0gc2xjUGFnZVRvTWxjUGFn ZVRibFsoKGNvdW50ZXIgKyBzZWN0b3IyKSA+PiAyKSAmIDB4RkZGRl07CgkJaWYgKGdGbGFzaFNs Y01vZGUgJiYKCQkgICAgZ19uYW5kY192ZXJzaW9uX2RhdGEgPT0gTkFORF9WRVJTSU9OX1Y4MDAp CgkJCXBhZ2UgPSAoKGNvdW50ZXIgKyBzZWN0b3IyKSA+PiAyKSAmIDB4RkZGRjsKCQllY2NfYml0 cyA9IGdOYW5kRmxhc2hFY2NCaXRzOwoJCXNlY3RvciA9IHN0YXJ0X29mZnNldCArCgkJCSBtaW5f c2VjdG9yICsKCQkJIGdwTmFuZFBhcmFJbmZvLT5zZWNfcGVyX3BhZ2UgKiBwYWdlOwoJCUZsYXNo QmNoU2VsKGdOYW5kRmxhc2hJREJFY2NCaXRzKTsKCQlmbGFzaF9ib290X2VudGVyX3NsY19tb2Rl KDApOwoJCUZsYXNoUmVhZFBhZ2UoCgkJCTAsCgkJCXNlY3RvciAvIGdwTmFuZFBhcmFJbmZvLT5z ZWNfcGVyX3BhZ2UsCgkJCWdGbGFzaFBhZ2VCdWZmZXIxLAoJCQkwKTsKCQlmbGFzaF9ib290X2V4 aXRfc2xjX21vZGUoMCk7CgkJRmxhc2hCY2hTZWwoZWNjX2JpdHMpOwoJCW1lbWNweSgmYnVmWzEy OCAqIGNvdW50ZXJdLCBnRmxhc2hQYWdlQnVmZmVyMSwgMjA0OHUpOwoJCXN0YXJ0X29mZnNldCA9 IDA7CgkJY291bnRlciA9ICh1aW50MTZfdCkoY291bnRlcl9hZGQgKyBjb3VudGVyKTsKCX0KCUZU TF9JTkZPKAoJCSJJZEJsb2NrUmVhZERhdGEgJXggJXggcmV0PSAleFxuIiwKCQlpbmRleCwKCQlj b3VudCwKCQkwKTsKfQoKdm9pZCBJREJsb2NrV3JpdGVEYXRhKHVpbnQzMl90IGluZGV4LCB1aW50 MzJfdCBjb3VudCwgdWludDMyX3QgKmJ1ZikKewoJdWludDMyX3QgY291bnRlcjsKCXVpbnQzMl90 IGVjY19iaXRzOwoJdWludDMyX3QgbWluX3NlY3RvcjsKCXVpbnQzMl90IHBhZ2U7Cgl1aW50MzJf dCBwYWdlMTsKCXVpbnQzMl90IHBhZ2UyOwoJdWludDMyX3Qgc2VjdG9yMjsKCXVpbnQxNl90IHNp emU7Cgl1aW50MzJfdCBzcGFyZVszMl07CgoJc2l6ZSA9IGdwTmFuZFBhcmFJbmZvLT5zZWNfcGVy X3BhZ2UgKiAodWludDE2X3QpZ0Jsb2NrUGFnZUFsaWduU2l6ZTsKCUZUTF9JTkZPKAoJCSJJREJs b2NrV3JpdGVEYXRhICV4ICV4XG4iLAoJCWluZGV4LAoJCWNvdW50KTsKCWZsYXNoX2Jvb3RfZW50 ZXJfc2xjX21vZGUoMCk7CglGbGFzaEVyYXNlQmxvY2soMCwgaW5kZXggLyBnTmFuZFBoeUluZm8u c2VjX3Blcl9wYWdlLCAwKTsKCWZsYXNoX2Jvb3RfZXhpdF9zbGNfbW9kZSgwKTsKCWNvdW50ZXIg PSAwOwoJc2VjdG9yMiA9IGluZGV4ICUgc2l6ZTsKCW1pbl9zZWN0b3IgPSBpbmRleCAtIGluZGV4 ICUgc2l6ZTsKCXdoaWxlIChjb3VudGVyIDwgY291bnQpIHsKCQlwYWdlID0gKChjb3VudGVyICsg c2VjdG9yMikgPj4gMikgJiAweEZGRkY7CgkJaWYgKHBhZ2UpIHsKCQkJcGFnZTEgPSBzbGNQYWdl VG9NbGNQYWdlVGJsW3BhZ2UgKyAxXTsKCQkJaWYgKGdGbGFzaFNsY01vZGUgJiYKCQkJICAgIGdf bmFuZGNfdmVyc2lvbl9kYXRhID09IE5BTkRfVkVSU0lPTl9WODAwKQoJCQkJcGFnZTEgPSAodWlu dDE2X3QpCgkJCQkJKCgoY291bnRlciArIHNlY3RvcjIpID4+IDIpICsgMSk7CgkJCXNwYXJlWzBd ID0gNCAqIChwYWdlMSAtIDEpOwoJCQlzcGFyZVsxXSA9IDA7CgkJfQoJCXBhZ2UyID0gc2xjUGFn ZVRvTWxjUGFnZVRibFtwYWdlXTsKCQlpZiAoZ0ZsYXNoU2xjTW9kZSAmJgoJCSAgICBnX25hbmRj X3ZlcnNpb25fZGF0YSA9PSBOQU5EX1ZFUlNJT05fVjgwMCkKCQkJcGFnZTIgPSAoKGNvdW50ZXIg KyBzZWN0b3IyKSA+PiAyKSAmIDB4RkZGRjsKCQllY2NfYml0cyA9IGdOYW5kRmxhc2hFY2NCaXRz OwoJCUZsYXNoQmNoU2VsKGdOYW5kRmxhc2hJREJFY2NCaXRzKTsKCQlmbGFzaF9ib290X2VudGVy X3NsY19tb2RlKDApOwoJCUZsYXNoUHJvZ1BhZ2VSYXcoCgkJCTAsCgkJCShtaW5fc2VjdG9yICsg Z3BOYW5kUGFyYUluZm8tPnNlY19wZXJfcGFnZSAqIHBhZ2UyKQoJCQkvIGdwTmFuZFBhcmFJbmZv LT5zZWNfcGVyX3BhZ2UsCgkJCSZidWZbMTI4ICogY291bnRlcl0sCgkJCSh1aW50MTZfdCAqKXNw YXJlKTsKCQlmbGFzaF9ib290X2V4aXRfc2xjX21vZGUoMCk7CgkJRmxhc2hCY2hTZWwoZWNjX2Jp dHMpOwoJCUZsYXNoUGFnZVByb2dNc2JGRkRhdGEoCgkJCTAsCgkJCW1pbl9zZWN0b3IgLyBncE5h bmRQYXJhSW5mby0+c2VjX3Blcl9wYWdlLAoJCQkodWludDE2X3QpKHBhZ2UyICsgMSkpOwoJCWNv dW50ZXIgPSAodWludDE2X3QpKGNvdW50ZXIgKyA0KTsKCX0KCUZUTF9JTkZPKAoJCSJJREJsb2Nr V3JpdGVEYXRhICV4ICV4IHJldD0gJXhcbiIsCgkJaW5kZXgsCgkJY291bnQsCgkJMCk7Cn0KCmlu dCB3cml0ZV9pZGJsb2NrKHVpbnQzMl90IHNpemUsIHVpbnQzMl90ICpidWYsIHVpbnQzMl90ICpw X2RhdGEpCnsKCXVpbnQzMl90IGNvdW50OwoJdWludDMyX3QgY291bnRlcjsKCXVpbnQzMl90IGNv dW50ZXIyOwoJdWludDMyX3QgaW5kZXg7Cgl1aW50MzJfdCBtYXhfc2l6ZTsKCXVpbnQzMl90IG9m ZnNldDsKCXVpbnQzMl90IG9mZnNldDI7Cgl1aW50MzJfdCBwYWdlX2FkZHI7Cgl1aW50MzJfdCAq cF9yZWFkOwoJdWludDMyX3QgKnBfd3JpdGU7Cgl1aW50MzJfdCByOwoJdWludDMyX3QgdzsKCXVp bnQxNl90IHNpemUyOwoJdWludDMyX3Qgc3RhdHVzOwoJdWludDMyX3Qgd3JpdGVfY291bnRlcjsK CglzaXplMiA9IGdwTmFuZFBhcmFJbmZvLT5zZWNfcGVyX3BhZ2UgKiAodWludDE2X3QpZ0Jsb2Nr UGFnZUFsaWduU2l6ZTsKCXBfcmVhZCA9ICh1aW50MzJfdCAqKWttYWxsb2Nfb3JkZXJfdHJhY2Uo MjU2MDAwLCAyMDgsIDYpOwoJaWYgKHBfcmVhZCkgewoJCWluZGV4ID0gKHNpemUgKyA1MTEpID4+ IDk7CgkJaWYgKGluZGV4IDw9IDI1NSkKCQkJbWVtY3B5KCZidWZbMTI4ICogaW5kZXhdLCBidWYs IDI1NiAtIGluZGV4KTsKCQljb3VudCA9IGluZGV4ICsgMTI4OwoJCXJrbmFuZF9wcmludF9oZXgo ImlkYmxrOiIsIHBfZGF0YSwgNCwgNSk7CgkJaWYgKGNvdW50ID49IDI1NikKCQkJY291bnQgPSAy NTY7CgkJY291bnRlciA9IDA7CgkJRlRMX0lORk8oCgkJCSJpZGIgcmV2ZXJzZSAleCAleFxuIiwK CQkJYnVmWzEyOF0sCgkJCWdOYW5kSURCUmVzQmxrTnVtKTsKCQl3cml0ZV9jb3VudGVyID0gMDsK CQlwX3dyaXRlID0gYnVmOwoJCWlmIChidWZbMTI4XSA+IGdOYW5kSURCUmVzQmxrTnVtKQoJCQli dWZbMTI4XSA9IGdOYW5kSURCUmVzQmxrTnVtOwoJCUZUTF9JTkZPKAoJCQkid3JpdGVfaWRibG9j ayB0b3RhbF9zZWMgJXggJXhcbiIsCgkJCWNvdW50LAoJCQlzaXplKTsKCQltYXhfc2l6ZSA9IGNv dW50IDw8IDc7CgkJZG8gewoJCQlwYWdlX2FkZHIgPSAqcF9kYXRhOwoJCQkrK3BfZGF0YTsKCQkJ aWYgKHBhZ2VfYWRkciA8IGdOYW5kUGh5SW5mby5yZXNlcnZlZF9ibGtzICYmCgkJCSAgICBwYWdl X2FkZHIgPj0gZ05hbmRGbGFzaElkYkJsb2NrQWRkcikgewoJCQkJZnRsX21lbXNldChwX3JlYWQs IDAsIDUxMik7CgkJCQlJREJsb2NrV3JpdGVEYXRhKAoJCQkJCSoocF9kYXRhIC0gMSkgKiBzaXpl MiwKCQkJCQljb3VudCwKCQkJCQlwX3dyaXRlKTsKCQkJCUlkQmxvY2tSZWFkRGF0YSgKCQkJCQkq KHBfZGF0YSAtIDEpICogc2l6ZTIsCgkJCQkJY291bnQsCgkJCQkJcF9yZWFkKTsKCQkJCWNvdW50 ZXIyID0gMDsKCQkJCW9mZnNldCA9IDA7CgkJCQl3aGlsZSAoMSkgewoJCQkJCXIgPSBwX3JlYWRb Y291bnRlcjJdOwoJCQkJCXcgPSBwX3dyaXRlW2NvdW50ZXIyXTsKCQkJCQkrK2NvdW50ZXIyOwoJ CQkJCWlmIChyICE9IHcpCgkJCQkJCWJyZWFrOwoJCQkJCSsrb2Zmc2V0OwoJCQkJCWlmIChvZmZz ZXQgPT0gbWF4X3NpemUpCgkJCQkJCWdvdG8gbGFiZWxfMTsKCQkJCX0KCQkJCW9mZnNldDIgPSBv ZmZzZXQgJiAweEZGRkZGRjAwOwoJCQkJRlRMX0lORk8oCgkJCQkJIndyaXRlIGFuZCBjaGVjayBl cnJvcjoiCgkJCQkJIiVkIGlkYj0leCxvZmZzZXQ9JXgscj0leCx3PSV4XG4iLAoJCQkJCXdyaXRl X2NvdW50ZXIsCgkJCQkJKihwX2RhdGEgLSAxKSwKCQkJCQlvZmZzZXQsCgkJCQkJciwKCQkJCQl3 KTsKCQkJCXJrbmFuZF9wcmludF9oZXgoCgkJCQkJIndyaXRlIiwKCQkJCQkmcF93cml0ZVtvZmZz ZXQyXSwKCQkJCQk0LAoJCQkJCTI1Nik7CgkJCQlya25hbmRfcHJpbnRfaGV4KAoJCQkJCSJyZWFk IiwKCQkJCQkmcF9yZWFkW29mZnNldDJdLAoJCQkJCTQsCgkJCQkJMjU2KTsKCQkJCWZ0bF9tZW1z ZXQocF9yZWFkLCAwLCA1MTIpOwoJCQkJSURCbG9ja1dyaXRlRGF0YSgKCQkJCQkqKHBfZGF0YSAt IDEpICogc2l6ZTIsCgkJCQkJNHUsCgkJCQkJcF9yZWFkKTsKCQkJCUZUTF9JTkZPKCJ3cml0ZV9p ZGJsb2NrIGVycm9yXG4iKTsKCQkJCWlmIChvZmZzZXQgPCBtYXhfc2l6ZSkKCQkJCQlnb3RvIGxh YmVsXzA7CmxhYmVsXzE6CgkJCQkrK2NvdW50ZXI7CgkJCX0KbGFiZWxfMDoKCQkJKyt3cml0ZV9j b3VudGVyOwoJCX0gd2hpbGUgKHdyaXRlX2NvdW50ZXIgIT0gNSk7CgkJZnRsX2ZyZWUocF9yZWFk KTsKCQlpZiAoY291bnRlcikKCQkJc3RhdHVzID0gMDsKCQllbHNlCgkJCXN0YXR1cyA9IC0xOwoJ fSBlbHNlIHsKCQlzdGF0dXMgPSAtMTsKCX0KCXJldHVybiBzdGF0dXM7Cn0KCnZvaWQgd3JpdGVf bG9hZGVyX2xiYSh1aW50MzJfdCBpbmRleCwgdWludDMyX3QgY291bnQsIHVpbnQzMl90ICpidWYp CnsKCXVpbnQzMl90IGNvdW50ZXIxOwoJdWludDMyX3QgY291bnRlcjI7Cgl1aW50MzJfdCBsYmEx OwoJdWludDMyX3QgbGJhMjsKCXVpbnQzMl90IHNpemU7Cgl1aW50MzJfdCB0bXA7Cgl1aW50MzJf dCBibG9ja1sxMzBdOwoKCWlmIChpbmRleCA9PSA2NCAmJiAqYnVmID09IElEX0lEUlcpIHsKCQlp ZGJfd3JpdGVfZW5hYmxlID0gMTsKCQlpZGJfYnVmID0gZnRsX21hbGxvYygyNTYwMDApOwoJCWZ0 bF9tZW1zZXQoCgkJCWlkYl9idWYsCgkJCTAsCgkJCTI1NjAwMCk7CgkJaWRiX2xhc3RfbGJhID0g aW5kZXg7Cgl9CglGVExfSU5GTygid2xfbGJhICVwICV4ICV4ICV4XG4iLCBpZGJfYnVmLCAqYnVm LCBpbmRleCwgY291bnQpOwoJaWYgKGlkYl93cml0ZV9lbmFibGUpIHsKCQlpZiAoaW5kZXggLSA2 NCA+PSA1MDApIHsKCQkJaWYgKGluZGV4ID49IDU2NCkgewoJCQkJbGJhMSA9IGlkYl9sYXN0X2xi YSAtIDY0OwoJCQkJaWYgKGlkYl9sYXN0X2xiYSAtIDY0ID49IDUwMCkKCQkJCQlsYmExID0gNTAw OwoJCQkJaWYgKGdwTmFuZFBhcmFJbmZvLT5zZWNfcGVyX3BhZ2UgPT0gNCkgewoJCQkJCWNvdW50 ZXIxID0gMDsKCQkJCQlkbyB7CgkJCQkJCXRtcCA9IDIgKiBjb3VudGVyMTsKCQkJCQkJaWYgKGxi YTEgPD0gMjU2KQoJCQkJCQkJdG1wID0gY291bnRlcjE7CgkJCQkJCWJsb2NrW2NvdW50ZXIxKytd ID0gdG1wOwoJCQkJCX0gd2hpbGUgKGNvdW50ZXIxICE9IDUpOwoJCQkJfSBlbHNlIHsKCQkJCQli bG9ja1swXSA9IDI7CgkJCQkJYmxvY2tbMV0gPSAzOwoJCQkJCWJsb2NrWzJdID0gNDsKCQkJCQli bG9ja1szXSA9IDU7CgkJCQkJYmxvY2tbNF0gPSA2OwoJCQkJfQoJCQkJY291bnRlcjIgPSA2Mzg3 MjsKCQkJCWRvIHsKCQkJCQlpZiAoaWRiX2J1Zltjb3VudGVyMl0pIHsKCQkJCQkJc2l6ZSA9IDQg KiAoY291bnRlcjIgKyAxMjgpOwoJCQkJCQlnb3RvIGxhYmVsXzI4OwoJCQkJCX0KCQkJCQktLWNv dW50ZXIyOwoJCQkJfSB3aGlsZSAoY291bnRlcjIgIT0gNDA5Nik7CgkJCQlzaXplID0gbGJhMSA8 PCA5OwpsYWJlbF8yODoKCQkJCXdyaXRlX2lkYmxvY2soCgkJCQkJc2l6ZSwKCQkJCQlpZGJfYnVm LAoJCQkJCWJsb2NrKTsKCQkJCWlkYl93cml0ZV9lbmFibGUgPSAwOwoJCQkJZnRsX2ZyZWUoaWRi X2J1Zik7CgkJCQlpZGJfYnVmID0gMDsKCQkJCWdvdG8gbGFiZWxfMTQ7CgkJCX0KCQl9IGVsc2Ug ewoJCQlsYmEyID0gNTY0IC0gaW5kZXg7CgkJCWlmICg1NjQgLSBpbmRleCA+PSBjb3VudCkKCQkJ CWxiYTIgPSBjb3VudDsKCQkJZnRsX21lbWNweSgKCQkJCSh2b2lkICopCgkJCQkoaWRiX2J1ZiAr ICgoaW5kZXggLSA2NCkgPDwgOSkpLAoJCQkJYnVmLAoJCQkJbGJhMiA8PCA5KTsKCQl9CgkJaWYg KGlkYl9sYXN0X2xiYSAhPSBpbmRleCkgewoJCQlpZGJfd3JpdGVfZW5hYmxlID0gMDsKCQkJaWYg KGlkYl9idWYpCgkJCQlmdGxfZnJlZShpZGJfYnVmKTsKCQkJaWRiX2J1ZiA9IDA7CgkJfQpsYWJl bF8xNDoKCQlpZGJfbGFzdF9sYmEgPSBpbmRleCArIGNvdW50OwoJfQp9CgojZGVmaW5lIEdldElk YmxvY2tEYXRhTm9SYzQocCwgcykgUF9SQzQocCwgcykKCmludCBGdGxHZXRJZEJsb2NrU3lzRGF0 YSh2b2lkICpwX2J1ZiwgaW50IGluZGV4KQp7CglpZiAoaW5kZXggPiAzKQoJCXJldHVybiAtMTsK CWZ0bF9tZW1jcHkocF9idWYsICZnTmFuZElEYXRhQnVmW2luZGV4ICogNTEyXSwgNTEyKTsKCWlm IChpbmRleCA9PSAxKQoJCXJldHVybiAwOwoJR2V0SWRibG9ja0RhdGFOb1JjNChwX2J1ZiwgNTEy KTsKCXJldHVybiAwOwp9CgppbnQgRnRsR2V0Q2hpcFNlY3RvckluZm8odm9pZCAqcF9idWYpCnsK CXJldHVybiBGdGxHZXRJZEJsb2NrU3lzRGF0YShwX2J1ZiwgMik7Cn0KCmludCBGdGxHZXRTTlNl Y3RvckluZm8odm9pZCAqcF9idWYpCnsKCXJldHVybiBGdGxHZXRJZEJsb2NrU3lzRGF0YShwX2J1 ZiwgMyk7Cn0KCi8qIGluaXQgKi8KCglnRmxhc2hQYWdlQnVmZmVyMCA9CgkJKHVpbnQzMl90ICop CgkJZnRsX21hbGxvYygzMjc2OHUpOwoJZ0ZsYXNoUGFnZUJ1ZmZlcjEgPQoJCSh1aW50MzJfdCAq KQoJCWZ0bF9tYWxsb2MoMzI3Njh1KTsKCglnQmxvY2tQYWdlQWxpZ25TaXplID0gMTI4OwovKiBt b3JlIGluaXQgKi8KCgkJaWYgKEZsYXNoTG9hZFBoeUluZm8oKSkgewoKCQkJLyogc29ydCBvdXQg eW91ciBtZXNzIGhlcmUgKi8KCgkJCUZsYXNoU2F2ZVBoeUluZm8oKTsKCQl9CgovKiBtb3JlIGlu aXQgKi8KCglnRmxhc2hTbGNNb2RlID0gZ3BOYW5kUGFyYUluZm8tPnNsY19tb2RlOwoJZ05hbmRS YW5kb21pemVyID0gKGdwTmFuZFBhcmFJbmZvLT5vcGVyYXRpb25fb3B0ID4+IDcpICYgMTsKCWdN dWx0aVBhZ2VSZWFkRW4gPSAoZ3BOYW5kUGFyYUluZm8tPm9wZXJhdGlvbl9vcHQgPj4gMykgJiAx OwoJZ011bHRpUGFnZVByb2dFbiA9IChncE5hbmRQYXJhSW5mby0+b3BlcmF0aW9uX29wdCA+PiA0 KSAmIDE7CglnRmxhc2hJbnRlcmZhY2VNb2RlID0gKGdwTmFuZFBhcmFJbmZvLT5vcGVyYXRpb25f b3B0ID4+IDgpICYgNzsKCglCdWlsZEZsYXNoTHNiUGFnZVRhYmxlKAoJCWdwTmFuZFBhcmFJbmZv LT5sc2JfbW9kZSwKCQkodWludDMyX3QpZ3BOYW5kUGFyYUluZm8tPnBhZ2VfcGVyX2JsayAvCgkJ KHVpbnQzMl90KWdwTmFuZFBhcmFJbmZvLT5jZWxsKTsKCglGbGFzaFJlYWRJZGJEYXRhUmF3KGdO YW5kSURhdGFCdWYpOwoKCWdOYW5kSURCUmVzQmxrTnVtID0gMTY7CglnTmFuZFBoeUluZm8ubmFu ZF90eXBlID0KCQlncE5hbmRQYXJhSW5mby0+Y2VsbDsKCWdOYW5kUGh5SW5mby52ZW5kb3IgPQoJ CWdwTmFuZFBhcmFJbmZvLT52ZW5kb3I7CglnTmFuZFBoeUluZm8uY2hpcF9pZCA9CgkJKih1aW50 MzJfdCAqKUlEQnl0ZTsKCWdOYW5kUGh5SW5mby5kaWVfbnVtID0KCQlnTmFuZE1heERpZTsKCWdO YW5kUGh5SW5mby5wYWdlX3Blcl9ibGsgPQoJCWdwTmFuZFBhcmFJbmZvLT5wYWdlX3Blcl9ibGs7 CglnTmFuZFBoeUluZm8uYmxrX3Blcl9wbGFuZSA9CgkJZ3BOYW5kUGFyYUluZm8tPmJsa19wZXJf cGxhbmU7CglnTmFuZFBoeUluZm8ucGxhbmVzX3Blcl9kaWUgPQoJCWdwTmFuZFBhcmFJbmZvLT5w bGFuZV9wZXJfZGllOwoJZ05hbmRQaHlJbmZvLnBhZ2VfcGVyX3NsY19ibGsgPQoJCSh1aW50MzJf dClncE5hbmRQYXJhSW5mby0+cGFnZV9wZXJfYmxrIC8KCQkodWludDMyX3QpZ3BOYW5kUGFyYUlu Zm8tPmNlbGw7CglnTmFuZFBoeUluZm8uc2VjdG9yX3NpemUgPQoJCTUxMjsKCWdOYW5kUGh5SW5m by5zZWNfcGVyX3BhZ2UgPQoJCWdwTmFuZFBhcmFJbmZvLT5zZWNfcGVyX3BhZ2U7CglnTmFuZFBo eUluZm8ucmVzZXJ2ZWRfYmxrcyA9CgkJMTY7CglnTmFuZFBoeUluZm8uYmxvY2tfc2l6ZSA9CgkJ Z3BOYW5kUGFyYUluZm8tPnBhZ2VfcGVyX2JsayAqCgkJZ3BOYW5kUGFyYUluZm8tPnNlY19wZXJf cGFnZTsKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwps aW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJh ZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51 eC1hcm0ta2VybmVsCg==