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=-8.9 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,SIGNED_OFF_BY, SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT 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 620F7C169C4 for ; Sun, 3 Feb 2019 11:52:58 +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 2AD2621773 for ; Sun, 3 Feb 2019 11:52:58 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="t5aAm1c6"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="AKj1980Z" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 2AD2621773 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-riscv-bounces+infradead-linux-riscv=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:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=CsLPjLjHhdJucR46LGsSYU2mA/vzLbxI3qrNXGvwOSU=; b=t5aAm1c6Lxy6ic lrdMs1v0LcaAq/vwuMgdXQmP4LmkfxxEA7HPzAa6Q252qcRbzEBtrqeZ8dxuw5D1Z1W84OgAKfHzd WEQ3kEdao07eqzfvXB4d+JF/dF4huoNh3eKIkPboVAy7lF39fQdrYLvPQcf1tsBjz9cXOIfYpAVDa 9LsEWNtyjUiBJfgfPVFAcqgau6IYTsN0TmkJRtWRt+15Bbse9zM3S4RDGNRWUWTqimh/ReWwNbNRM Dre934CxCTifj6KThyIyjCT0hVboYpCANHpav5TpdjEPh9XoqAFzHVvmu0Z+RqyaVvYU8JcGIXMIy Yq5BfawSGDijmFI7YVDQ==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.90_1 #2 (Red Hat Linux)) id 1gqGKW-0007pU-6u; Sun, 03 Feb 2019 11:52:56 +0000 Received: from mail-ed1-x544.google.com ([2a00:1450:4864:20::544]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gqGKR-0007nW-Ms for linux-riscv@lists.infradead.org; Sun, 03 Feb 2019 11:52:55 +0000 Received: by mail-ed1-x544.google.com with SMTP id o10so8959257edt.13 for ; Sun, 03 Feb 2019 03:52:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=BFZjXc4oxbCyr55AlGif5fNj+LKAPtnciuVDBXGc7/Y=; b=AKj1980ZLo0/P4wRUEgv+KHCscKly5vCKzbvi8vpIyZHSb1UGZnEsWCSIgJr4sqmdy nG8uTm33nuE15EWariGQ6E+1seMDJJBvLCoMBDXPS3Ng262m3wQw/XwpIKoy/r12gMKo MkP1IUqx4e7/AHs07ipUiBC29mOA/enNUZl5GXb2khxTsgOJpCdk5NtJT5vxoCzVrUZy bal6P4fwGpwNOAx+qZfpFWIA5bOSRT/YasENCZpwHUFK0vK8D0wl4INGOgoVIb53YLfb QQhR8HCujkXUhMyd5MQspqmeP1LxKisuLdSySzxkbBRpGfUMuJlHNMi4BNFjX7TQ45+e F8tg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=BFZjXc4oxbCyr55AlGif5fNj+LKAPtnciuVDBXGc7/Y=; b=M0lZLnppjWYOrVOUcmRq79aSwN5gCFwZacwq1vpS4Ig0CoQMt54atYqg79aCCmvdkF KIifKUB9aYVTM0oaddsMUd/Wt3kHTxpNJ8B8lFIYT1VNCUEsW9iqrf6nzNfwV2Uw+Hcd JOvEoSsp4WsMNkgVFxlM026SJKGMeC/grrvAQHAmPxGthh5zIpozhBSd+2AAhW8BmZxb nL+aiEMIiMkFHyaEJuSEQ0fMJpvtkhi73yOYnb+IOBVJQIoUi/r1aFPxNQlL+l9Eftxc ojp5b+fdxLqq00nBgkG87kYjvo/VDU3HtR5C0BEsr8Eg3aP6tJOteUnGEkehi+O1SepS 4z3w== X-Gm-Message-State: AJcUuke89Q2VDIFGAB8GRCM6PX2p5XvPamX3A/lKG4RHfhybOSw3m8P2 QrcuKJMXh9d5Jqv01fRXqEC3npnQTuLNFQ== X-Google-Smtp-Source: ALg8bN77NA3gn9lOcYyMW21aSC/LhXlvpJgQCpCs5KpS+6kHDAr8AvjU/qDCmVpnJjTduu3g1uKCjw== X-Received: by 2002:a05:6402:13d6:: with SMTP id a22mr44756774edx.39.1549194766843; Sun, 03 Feb 2019 03:52:46 -0800 (PST) Received: from btopel-mobl.ger.intel.com ([2001:67c:1810:f055:c82b:bcf5:1add:2ef0]) by smtp.gmail.com with ESMTPSA id l10sm2120719ejq.55.2019.02.03.03.52.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 03 Feb 2019 03:52:46 -0800 (PST) From: bjorn.topel@gmail.com To: linux-riscv@lists.infradead.org, daniel@iogearbox.net, ast@kernel.org, netdev@vger.kernel.org Subject: [PATCH bpf-next 1/3] bpf, riscv: add BPF JIT for RV64G Date: Sun, 3 Feb 2019 12:51:29 +0100 Message-Id: <20190203115132.8766-2-bjorn.topel@gmail.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190203115132.8766-1-bjorn.topel@gmail.com> References: <20190203115132.8766-1-bjorn.topel@gmail.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20190203_035251_759560_645083B3 X-CRM114-Status: GOOD ( 15.64 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: hch@infradead.org, =?UTF-8?q?Bj=C3=B6rn=20T=C3=B6pel?= , palmer@sifive.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+infradead-linux-riscv=archiver.kernel.org@lists.infradead.org RnJvbTogQmrDtnJuIFTDtnBlbCA8Ympvcm4udG9wZWxAZ21haWwuY29tPgoKVGhpcyBjb21taXQg YWRkcyBCUEYgSklUIGZvciBSVjY0Ry4KClRoZSBKSVQgaXMgYSB0d28tcGFzcyBKSVQsIGFuZCBo YXMgYSBkeW5hbWljIHByb2xvZy9lcGlsb2d1ZSAoc2ltaWxhcgp0byB0aGUgTUlQUzY0IEJQRiBK SVQpIGluc3RlYWQgb2Ygc3RhdGljIG9uZXMgKGUuZy4geDg2XzY0KS4KCkF0IHRoZSBtb21lbnQg dGhlIFJJU0MtViBMaW51eCBwb3J0IGRvZXMgbm90IHN1cHBvcnQgSEFWRV9LUFJPQkVTLAp3aGlj aCBtZWFucyB0aGF0IENPTkZJR19CUEZfRVZFTlRTIGlzIG5vdCBzdXBwb3J0ZWQuIFRodXMsIG5v IHRlc3RzCmludm9sdmluZyBCUEZfUFJPR19UWVBFX1RSQUNFUE9JTlQgcGFzc2VzLgoKRnVydGhl ciwgdGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgImZhciBicmFuY2hpbmciICg+ NEtpQikuCgpUaGUgaW1wbGVtZW50YXRpb24gcGFzc2VzIGFsbCB0aGUgdGVzdF9icGYua28gdGVz dHM6CiAgdGVzdF9icGY6IFN1bW1hcnk6IDM3OCBQQVNTRUQsIDAgRkFJTEVELCBbMzY2LzM2NiBK SVQnZWRdCgpBbGwgdGhlIHRhaWxfY2FsbCB0ZXN0cyBpbiB0aGUgc2VsZnRlc3QvYnBmL3Rlc3Rf dmVyaWZpZXIgcHJvZ3JhbQpwYXNzZXMuCgpBbGwgdGVzdHMgd2hlcmUgZG9uZSBvbiBRRU1VIChR RU1VIGVtdWxhdG9yIHZlcnNpb24gMy4xLjUwCih2My4xLjAtNjg4LWc4YWU5NTFmYmMxMDYpKS4K ClNpZ25lZC1vZmYtYnk6IEJqw7ZybiBUw7ZwZWwgPGJqb3JuLnRvcGVsQGdtYWlsLmNvbT4KLS0t CiBhcmNoL3Jpc2N2L0tjb25maWcgICAgICAgICAgICB8ICAgIDEgKwogYXJjaC9yaXNjdi9NYWtl ZmlsZSAgICAgICAgICAgfCAgICAyICstCiBhcmNoL3Jpc2N2L25ldC9NYWtlZmlsZSAgICAgICB8 ICAgIDEgKwogYXJjaC9yaXNjdi9uZXQvYnBmX2ppdF9jb21wLmMgfCAxNTAyICsrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKwogNCBmaWxlcyBjaGFuZ2VkLCAxNTA1IGluc2VydGlvbnMo KyksIDEgZGVsZXRpb24oLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBhcmNoL3Jpc2N2L25ldC9NYWtl ZmlsZQogY3JlYXRlIG1vZGUgMTAwNjQ0IGFyY2gvcmlzY3YvbmV0L2JwZl9qaXRfY29tcC5jCgpk aWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9LY29uZmlnIGIvYXJjaC9yaXNjdi9LY29uZmlnCmluZGV4 IGZlZWVhYTYwNjk3Yy4uZTY0YzY1NzA2MGJiIDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L0tjb25m aWcKKysrIGIvYXJjaC9yaXNjdi9LY29uZmlnCkBAIC00OSw2ICs0OSw3IEBAIGNvbmZpZyBSSVND VgogCXNlbGVjdCBSSVNDVl9USU1FUgogCXNlbGVjdCBHRU5FUklDX0lSUV9NVUxUSV9IQU5ETEVS CiAJc2VsZWN0IEFSQ0hfSEFTX1BURV9TUEVDSUFMCisJc2VsZWN0IEhBVkVfRUJQRl9KSVQgaWYg NjRCSVQKIAogY29uZmlnIE1NVQogCWRlZl9ib29sIHkKZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yv TWFrZWZpbGUgYi9hcmNoL3Jpc2N2L01ha2VmaWxlCmluZGV4IDRiNTk0ZjJlNGY3ZS4uYzYzNDJl NjM4ZWY3IDEwMDY0NAotLS0gYS9hcmNoL3Jpc2N2L01ha2VmaWxlCisrKyBiL2FyY2gvcmlzY3Yv TWFrZWZpbGUKQEAgLTc3LDcgKzc3LDcgQEAgS0JVSUxEX0lNQUdFCTo9ICQoYm9vdCkvSW1hZ2Uu Z3oKIAogaGVhZC15IDo9IGFyY2gvcmlzY3Yva2VybmVsL2hlYWQubwogCi1jb3JlLXkgKz0gYXJj aC9yaXNjdi9rZXJuZWwvIGFyY2gvcmlzY3YvbW0vCitjb3JlLXkgKz0gYXJjaC9yaXNjdi9rZXJu ZWwvIGFyY2gvcmlzY3YvbW0vIGFyY2gvcmlzY3YvbmV0LwogCiBsaWJzLXkgKz0gYXJjaC9yaXNj di9saWIvCiAKZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3YvbmV0L01ha2VmaWxlIGIvYXJjaC9yaXNj di9uZXQvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi5h MTMyMjIwY2M1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Jpc2N2L25ldC9NYWtlZmlsZQpA QCAtMCwwICsxIEBACitvYmotJChDT05GSUdfQlBGX0pJVCkgKz0gYnBmX2ppdF9jb21wLm8KZGlm ZiAtLWdpdCBhL2FyY2gvcmlzY3YvbmV0L2JwZl9qaXRfY29tcC5jIGIvYXJjaC9yaXNjdi9uZXQv YnBmX2ppdF9jb21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMDAwMDAwLi44 M2IxZTJmODkwNzQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Jpc2N2L25ldC9icGZfaml0X2Nv bXAuYwpAQCAtMCwwICsxLDE1MDIgQEAKKy8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBHUEwt Mi4wCisvKiBCUEYgSklUIGNvbXBpbGVyIGZvciBSVjY0RworICoKKyAqIENvcHlyaWdodChjKSAy MDE5IEJqw7ZybiBUw7ZwZWwgPGJqb3JuLnRvcGVsQGdtYWlsLmNvbT4KKyAqCisgKi8KKworI2lu Y2x1ZGUgPGxpbnV4L2JwZi5oPgorI2luY2x1ZGUgPGxpbnV4L2ZpbHRlci5oPgorI2luY2x1ZGUg PGFzbS9jYWNoZWZsdXNoLmg+CisKK2VudW0geworCVJWX1JFR19aRVJPID0JMCwJLyogVGhlIGNv bnN0YW50IHZhbHVlIDAgKi8KKwlSVl9SRUdfUkEgPQkxLAkvKiBSZXR1cm4gYWRkcmVzcyAqLwor CVJWX1JFR19TUCA9CTIsCS8qIFN0YWNrIHBvaW50ZXIgKi8KKwlSVl9SRUdfR1AgPQkzLAkvKiBH bG9iYWwgcG9pbnRlciAqLworCVJWX1JFR19UUCA9CTQsCS8qIFRocmVhZCBwb2ludGVyICovCisJ UlZfUkVHX1QwID0JNSwJLyogVGVtcG9yYXJpZXMgKi8KKwlSVl9SRUdfVDEgPQk2LAorCVJWX1JF R19UMiA9CTcsCisJUlZfUkVHX0ZQID0JOCwKKwlSVl9SRUdfUzEgPQk5LAkvKiBTYXZlZCByZWdp c3RlcnMgKi8KKwlSVl9SRUdfQTAgPQkxMCwJLyogRnVuY3Rpb24gYXJndW1lbnQvcmV0dXJuIHZh bHVlcyAqLworCVJWX1JFR19BMSA9CTExLAkvKiBGdW5jdGlvbiBhcmd1bWVudHMgKi8KKwlSVl9S RUdfQTIgPQkxMiwKKwlSVl9SRUdfQTMgPQkxMywKKwlSVl9SRUdfQTQgPQkxNCwKKwlSVl9SRUdf QTUgPQkxNSwKKwlSVl9SRUdfQTYgPQkxNiwKKwlSVl9SRUdfQTcgPQkxNywKKwlSVl9SRUdfUzIg PQkxOCwJLyogU2F2ZWQgcmVnaXN0ZXJzICovCisJUlZfUkVHX1MzID0JMTksCisJUlZfUkVHX1M0 ID0JMjAsCisJUlZfUkVHX1M1ID0JMjEsCisJUlZfUkVHX1M2ID0JMjIsCisJUlZfUkVHX1M3ID0J MjMsCisJUlZfUkVHX1M4ID0JMjQsCisJUlZfUkVHX1M5ID0JMjUsCisJUlZfUkVHX1MxMCA9CTI2 LAorCVJWX1JFR19TMTEgPQkyNywKKwlSVl9SRUdfVDMgPQkyOCwJLyogVGVtcG9yYXJpZXMgKi8K KwlSVl9SRUdfVDQgPQkyOSwKKwlSVl9SRUdfVDUgPQkzMCwKKwlSVl9SRUdfVDYgPQkzMSwKK307 CisKKyNkZWZpbmUgUlZfUkVHX1RDQyBSVl9SRUdfQTYKKyNkZWZpbmUgUlZfUkVHX1RDQ19TQVZF RCBSVl9SRUdfUzYgLyogU3RvcmUgQTYgaW4gUzYgaWYgcHJvZ3JhbSBkbyBjYWxscyAqLworCitz dGF0aWMgY29uc3QgaW50IHJlZ21hcFtdID0geworCVtCUEZfUkVHXzBdID0JUlZfUkVHX0E1LAor CVtCUEZfUkVHXzFdID0JUlZfUkVHX0EwLAorCVtCUEZfUkVHXzJdID0JUlZfUkVHX0ExLAorCVtC UEZfUkVHXzNdID0JUlZfUkVHX0EyLAorCVtCUEZfUkVHXzRdID0JUlZfUkVHX0EzLAorCVtCUEZf UkVHXzVdID0JUlZfUkVHX0E0LAorCVtCUEZfUkVHXzZdID0JUlZfUkVHX1MxLAorCVtCUEZfUkVH XzddID0JUlZfUkVHX1MyLAorCVtCUEZfUkVHXzhdID0JUlZfUkVHX1MzLAorCVtCUEZfUkVHXzld ID0JUlZfUkVHX1M0LAorCVtCUEZfUkVHX0ZQXSA9CVJWX1JFR19TNSwKKwlbQlBGX1JFR19BWF0g PQlSVl9SRUdfVDAsCit9OworCitlbnVtIHsKKwlSVl9DVFhfRl9TRUVOX1RBSUxfQ0FMTCA9CTAs CisJUlZfQ1RYX0ZfU0VFTl9DQUxMID0JCVJWX1JFR19SQSwKKwlSVl9DVFhfRl9TRUVOX1MxID0J CVJWX1JFR19TMSwKKwlSVl9DVFhfRl9TRUVOX1MyID0JCVJWX1JFR19TMiwKKwlSVl9DVFhfRl9T RUVOX1MzID0JCVJWX1JFR19TMywKKwlSVl9DVFhfRl9TRUVOX1M0ID0JCVJWX1JFR19TNCwKKwlS Vl9DVFhfRl9TRUVOX1M1ID0JCVJWX1JFR19TNSwKKwlSVl9DVFhfRl9TRUVOX1M2ID0JCVJWX1JF R19TNiwKK307CisKK3N0cnVjdCBydl9qaXRfY29udGV4dCB7CisJc3RydWN0IGJwZl9wcm9nICpw cm9nOworCXUzMiAqaW5zbnM7IC8qIFJWIGluc25zICovCisJaW50IG5pbnNuczsKKwlpbnQgZXBp bG9ndWVfb2Zmc2V0OworCWludCAqb2Zmc2V0OyAvKiBCUEYgdG8gUlYgKi8KKwl1bnNpZ25lZCBs b25nIGZsYWdzOworCWludCBzdGFja19zaXplOworfTsKKworc3RydWN0IHJ2X2ppdF9kYXRhIHsK KwlzdHJ1Y3QgYnBmX2JpbmFyeV9oZWFkZXIgKmhlYWRlcjsKKwl1OCAqaW1hZ2U7CisJc3RydWN0 IHJ2X2ppdF9jb250ZXh0IGN0eDsKK307CisKK3N0YXRpYyB1OCBicGZfdG9fcnZfcmVnKGludCBi cGZfcmVnLCBzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eCkKK3sKKwl1OCByZWcgPSByZWdtYXBb YnBmX3JlZ107CisKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUlZfQ1RYX0ZfU0VFTl9TMToKKwlj YXNlIFJWX0NUWF9GX1NFRU5fUzI6CisJY2FzZSBSVl9DVFhfRl9TRUVOX1MzOgorCWNhc2UgUlZf Q1RYX0ZfU0VFTl9TNDoKKwljYXNlIFJWX0NUWF9GX1NFRU5fUzU6CisJY2FzZSBSVl9DVFhfRl9T RUVOX1M2OgorCQlfX3NldF9iaXQocmVnLCAmY3R4LT5mbGFncyk7CisJfQorCXJldHVybiByZWc7 Cit9OworCitzdGF0aWMgYm9vbCBzZWVuX3JlZyhpbnQgcmVnLCBzdHJ1Y3QgcnZfaml0X2NvbnRl eHQgKmN0eCkKK3sKKwlzd2l0Y2ggKHJlZykgeworCWNhc2UgUlZfQ1RYX0ZfU0VFTl9DQUxMOgor CWNhc2UgUlZfQ1RYX0ZfU0VFTl9TMToKKwljYXNlIFJWX0NUWF9GX1NFRU5fUzI6CisJY2FzZSBS Vl9DVFhfRl9TRUVOX1MzOgorCWNhc2UgUlZfQ1RYX0ZfU0VFTl9TNDoKKwljYXNlIFJWX0NUWF9G X1NFRU5fUzU6CisJY2FzZSBSVl9DVFhfRl9TRUVOX1M2OgorCQlyZXR1cm4gdGVzdF9iaXQocmVn LCAmY3R4LT5mbGFncyk7CisJfQorCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgbWFy a19jYWxsKHN0cnVjdCBydl9qaXRfY29udGV4dCAqY3R4KQoreworCV9fc2V0X2JpdChSVl9DVFhf Rl9TRUVOX0NBTEwsICZjdHgtPmZsYWdzKTsKK30KKworc3RhdGljIGJvb2wgc2Vlbl9jYWxsKHN0 cnVjdCBydl9qaXRfY29udGV4dCAqY3R4KQoreworCXJldHVybiBzZWVuX3JlZyhSVl9SRUdfUkEs IGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfdGFpbF9jYWxsKHN0cnVjdCBydl9qaXRfY29u dGV4dCAqY3R4KQoreworCV9fc2V0X2JpdChSVl9DVFhfRl9TRUVOX1RBSUxfQ0FMTCwgJmN0eC0+ ZmxhZ3MpOworfQorCitzdGF0aWMgYm9vbCBzZWVuX3RhaWxfY2FsbChzdHJ1Y3QgcnZfaml0X2Nv bnRleHQgKmN0eCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoUlZfQ1RYX0ZfU0VFTl9UQUlMX0NBTEws ICZjdHgtPmZsYWdzKTsKK30KKworc3RhdGljIHU4IHJ2X3RhaWxfY2FsbF9yZWcoc3RydWN0IHJ2 X2ppdF9jb250ZXh0ICpjdHgpCit7CisJbWFya190YWlsX2NhbGwoY3R4KTsKKworCWlmIChzZWVu X2NhbGwoY3R4KSkgeworCQlfX3NldF9iaXQoUlZfQ1RYX0ZfU0VFTl9TNiwgJmN0eC0+ZmxhZ3Mp OworCQlyZXR1cm4gUlZfUkVHX1M2OworCX0KKwlyZXR1cm4gUlZfUkVHX0E2OworfQorCitzdGF0 aWMgdm9pZCBlbWl0KGNvbnN0IHUzMiBpbnNuLCBzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eCkK K3sKKwlpZiAoY3R4LT5pbnNucykKKwkJY3R4LT5pbnNuc1tjdHgtPm5pbnNuc10gPSBpbnNuOwor CisJY3R4LT5uaW5zbnMrKzsKK30KKworc3RhdGljIHUzMiBydl9yX2luc24odTggZnVuY3Q3LCB1 OCByczIsIHU4IHJzMSwgdTggZnVuY3QzLCB1OCByZCwgdTggb3Bjb2RlKQoreworCXJldHVybiAo ZnVuY3Q3IDw8IDI1KSB8IChyczIgPDwgMjApIHwgKHJzMSA8PCAxNSkgfCAoZnVuY3QzIDw8IDEy KSB8CisJCShyZCA8PCA3KSB8IG9wY29kZTsKK30KKworc3RhdGljIHUzMiBydl9pX2luc24odTE2 IGltbTExXzAsIHU4IHJzMSwgdTggZnVuY3QzLCB1OCByZCwgdTggb3Bjb2RlKQoreworCXJldHVy biAoaW1tMTFfMCA8PCAyMCkgfCAocnMxIDw8IDE1KSB8IChmdW5jdDMgPDwgMTIpIHwgKHJkIDw8 IDcpIHwKKwkJb3Bjb2RlOworfQorCitzdGF0aWMgdTMyIHJ2X3NfaW5zbih1MTYgaW1tMTFfMCwg dTggcnMyLCB1OCByczEsIHU4IGZ1bmN0MywgdTggb3Bjb2RlKQoreworCXU4IGltbTExXzUgPSBp bW0xMV8wID4+IDUsIGltbTRfMCA9IGltbTExXzAgJiAweDFmOworCisJcmV0dXJuIChpbW0xMV81 IDw8IDI1KSB8IChyczIgPDwgMjApIHwgKHJzMSA8PCAxNSkgfCAoZnVuY3QzIDw8IDEyKSB8CisJ CShpbW00XzAgPDwgNykgfCBvcGNvZGU7Cit9CisKK3N0YXRpYyB1MzIgcnZfc2JfaW5zbih1MTYg aW1tMTJfMSwgdTggcnMyLCB1OCByczEsIHU4IGZ1bmN0MywgdTggb3Bjb2RlKQoreworCXU4IGlt bTEyID0gKChpbW0xMl8xICYgMHg4MDApID4+IDUpIHwgKChpbW0xMl8xICYgMHgzZjApID4+IDQp OworCXU4IGltbTRfMSA9ICgoaW1tMTJfMSAmIDB4ZikgPDwgMSkgfCAoKGltbTEyXzEgJiAweDQw MCkgPj4gMTApOworCisJcmV0dXJuIChpbW0xMiA8PCAyNSkgfCAocnMyIDw8IDIwKSB8IChyczEg PDwgMTUpIHwgKGZ1bmN0MyA8PCAxMikgfAorCQkoaW1tNF8xIDw8IDcpIHwgb3Bjb2RlOworfQor CitzdGF0aWMgdTMyIHJ2X3VfaW5zbih1MzIgaW1tMzFfMTIsIHU4IHJkLCB1OCBvcGNvZGUpCit7 CisJcmV0dXJuIChpbW0zMV8xMiA8PCAxMikgfCAocmQgPDwgNykgfCBvcGNvZGU7Cit9CisKK3N0 YXRpYyB1MzIgcnZfdWpfaW5zbih1MzIgaW1tMjBfMSwgdTggcmQsIHU4IG9wY29kZSkKK3sKKwl1 MzIgaW1tOworCisJaW1tID0gKGltbTIwXzEgJiAweDgwMDAwKSB8ICAoKGltbTIwXzEgJiAweDNm ZikgPDwgOSkgfAorCSAgICAgICgoaW1tMjBfMSAmIDB4NDAwKSA+PiAyKSB8ICgoaW1tMjBfMSAm IDB4N2Y4MDApID4+IDExKTsKKworCXJldHVybiAoaW1tIDw8IDEyKSB8IChyZCA8PCA3KSB8IG9w Y29kZTsKK30KKworc3RhdGljIHUzMiBydl9hbW9faW5zbih1OCBmdW5jdDUsIHU4IGFxLCB1OCBy bCwgdTggcnMyLCB1OCByczEsCisJCSAgICAgICB1OCBmdW5jdDMsIHU4IHJkLCB1OCBvcGNvZGUp Cit7CisJdTggZnVuY3Q3ID0gKGZ1bmN0NSA8PCAyKSB8IChhcSA8PCAxKSB8IHJsOworCisJcmV0 dXJuIHJ2X3JfaW5zbihmdW5jdDcsIHJzMiwgcnMxLCBmdW5jdDMsIHJkLCBvcGNvZGUpOworfQor CitzdGF0aWMgdTMyIHJ2X2FkZGl3KHU4IHJkLCB1OCByczEsIHUxNiBpbW0xMV8wKQoreworCXJl dHVybiBydl9pX2luc24oaW1tMTFfMCwgcnMxLCAwLCByZCwgMHgxYik7Cit9CisKK3N0YXRpYyB1 MzIgcnZfYWRkaSh1OCByZCwgdTggcnMxLCB1MTYgaW1tMTFfMCkKK3sKKwlyZXR1cm4gcnZfaV9p bnNuKGltbTExXzAsIHJzMSwgMCwgcmQsIDB4MTMpOworfQorCitzdGF0aWMgdTMyIHJ2X2FkZHco dTggcmQsIHU4IHJzMSwgdTggcnMyKQoreworCXJldHVybiBydl9yX2luc24oMCwgcnMyLCByczEs IDAsIHJkLCAweDNiKTsKK30KKworc3RhdGljIHUzMiBydl9hZGQodTggcmQsIHU4IHJzMSwgdTgg cnMyKQoreworCXJldHVybiBydl9yX2luc24oMCwgcnMyLCByczEsIDAsIHJkLCAweDMzKTsKK30K Kworc3RhdGljIHUzMiBydl9zdWJ3KHU4IHJkLCB1OCByczEsIHU4IHJzMikKK3sKKwlyZXR1cm4g cnZfcl9pbnNuKDB4MjAsIHJzMiwgcnMxLCAwLCByZCwgMHgzYik7Cit9CisKK3N0YXRpYyB1MzIg cnZfc3ViKHU4IHJkLCB1OCByczEsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfcl9pbnNuKDB4MjAs IHJzMiwgcnMxLCAwLCByZCwgMHgzMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfYW5kKHU4IHJkLCB1 OCByczEsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfcl9pbnNuKDAsIHJzMiwgcnMxLCA3LCByZCwg MHgzMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfb3IodTggcmQsIHU4IHJzMSwgdTggcnMyKQorewor CXJldHVybiBydl9yX2luc24oMCwgcnMyLCByczEsIDYsIHJkLCAweDMzKTsKK30KKworc3RhdGlj IHUzMiBydl94b3IodTggcmQsIHU4IHJzMSwgdTggcnMyKQoreworCXJldHVybiBydl9yX2luc24o MCwgcnMyLCByczEsIDQsIHJkLCAweDMzKTsKK30KKworc3RhdGljIHUzMiBydl9tdWx3KHU4IHJk LCB1OCByczEsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfcl9pbnNuKDEsIHJzMiwgcnMxLCAwLCBy ZCwgMHgzYik7Cit9CisKK3N0YXRpYyB1MzIgcnZfbXVsKHU4IHJkLCB1OCByczEsIHU4IHJzMikK K3sKKwlyZXR1cm4gcnZfcl9pbnNuKDEsIHJzMiwgcnMxLCAwLCByZCwgMHgzMyk7Cit9CisKK3N0 YXRpYyB1MzIgcnZfZGl2dXcodTggcmQsIHU4IHJzMSwgdTggcnMyKQoreworCXJldHVybiBydl9y X2luc24oMSwgcnMyLCByczEsIDUsIHJkLCAweDNiKTsKK30KKworc3RhdGljIHUzMiBydl9kaXZ1 KHU4IHJkLCB1OCByczEsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfcl9pbnNuKDEsIHJzMiwgcnMx LCA1LCByZCwgMHgzMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfcmVtdXcodTggcmQsIHU4IHJzMSwg dTggcnMyKQoreworCXJldHVybiBydl9yX2luc24oMSwgcnMyLCByczEsIDcsIHJkLCAweDNiKTsK K30KKworc3RhdGljIHUzMiBydl9yZW11KHU4IHJkLCB1OCByczEsIHU4IHJzMikKK3sKKwlyZXR1 cm4gcnZfcl9pbnNuKDEsIHJzMiwgcnMxLCA3LCByZCwgMHgzMyk7Cit9CisKK3N0YXRpYyB1MzIg cnZfc2xsdyh1OCByZCwgdTggcnMxLCB1OCByczIpCit7CisJcmV0dXJuIHJ2X3JfaW5zbigwLCBy czIsIHJzMSwgMSwgcmQsIDB4M2IpOworfQorCitzdGF0aWMgdTMyIHJ2X3NsbCh1OCByZCwgdTgg cnMxLCB1OCByczIpCit7CisJcmV0dXJuIHJ2X3JfaW5zbigwLCByczIsIHJzMSwgMSwgcmQsIDB4 MzMpOworfQorCitzdGF0aWMgdTMyIHJ2X3NybHcodTggcmQsIHU4IHJzMSwgdTggcnMyKQorewor CXJldHVybiBydl9yX2luc24oMCwgcnMyLCByczEsIDUsIHJkLCAweDNiKTsKK30KKworc3RhdGlj IHUzMiBydl9zcmwodTggcmQsIHU4IHJzMSwgdTggcnMyKQoreworCXJldHVybiBydl9yX2luc24o MCwgcnMyLCByczEsIDUsIHJkLCAweDMzKTsKK30KKworc3RhdGljIHUzMiBydl9zcmF3KHU4IHJk LCB1OCByczEsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfcl9pbnNuKDB4MjAsIHJzMiwgcnMxLCA1 LCByZCwgMHgzYik7Cit9CisKK3N0YXRpYyB1MzIgcnZfc3JhKHU4IHJkLCB1OCByczEsIHU4IHJz MikKK3sKKwlyZXR1cm4gcnZfcl9pbnNuKDB4MjAsIHJzMiwgcnMxLCA1LCByZCwgMHgzMyk7Cit9 CisKK3N0YXRpYyB1MzIgcnZfbHVpKHU4IHJkLCB1MzIgaW1tMzFfMTIpCit7CisJcmV0dXJuIHJ2 X3VfaW5zbihpbW0zMV8xMiwgcmQsIDB4MzcpOworfQorCitzdGF0aWMgdTMyIHJ2X3NsbGkodTgg cmQsIHU4IHJzMSwgdTE2IGltbTExXzApCit7CisJcmV0dXJuIHJ2X2lfaW5zbihpbW0xMV8wLCBy czEsIDEsIHJkLCAweDEzKTsKK30KKworc3RhdGljIHUzMiBydl9hbmRpKHU4IHJkLCB1OCByczEs IHUxNiBpbW0xMV8wKQoreworCXJldHVybiBydl9pX2luc24oaW1tMTFfMCwgcnMxLCA3LCByZCwg MHgxMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfb3JpKHU4IHJkLCB1OCByczEsIHUxNiBpbW0xMV8w KQoreworCXJldHVybiBydl9pX2luc24oaW1tMTFfMCwgcnMxLCA2LCByZCwgMHgxMyk7Cit9CisK K3N0YXRpYyB1MzIgcnZfeG9yaSh1OCByZCwgdTggcnMxLCB1MTYgaW1tMTFfMCkKK3sKKwlyZXR1 cm4gcnZfaV9pbnNuKGltbTExXzAsIHJzMSwgNCwgcmQsIDB4MTMpOworfQorCitzdGF0aWMgdTMy IHJ2X3NsbGl3KHU4IHJkLCB1OCByczEsIHUxNiBpbW0xMV8wKQoreworCXJldHVybiBydl9pX2lu c24oaW1tMTFfMCwgcnMxLCAxLCByZCwgMHgxYik7Cit9CisKK3N0YXRpYyB1MzIgcnZfc3JsaXco dTggcmQsIHU4IHJzMSwgdTE2IGltbTExXzApCit7CisJcmV0dXJuIHJ2X2lfaW5zbihpbW0xMV8w LCByczEsIDUsIHJkLCAweDFiKTsKK30KKworc3RhdGljIHUzMiBydl9zcmxpKHU4IHJkLCB1OCBy czEsIHUxNiBpbW0xMV8wKQoreworCXJldHVybiBydl9pX2luc24oaW1tMTFfMCwgcnMxLCA1LCBy ZCwgMHgxMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfc3JhaXcodTggcmQsIHU4IHJzMSwgdTE2IGlt bTExXzApCit7CisJcmV0dXJuIHJ2X2lfaW5zbigweDQwMCB8IGltbTExXzAsIHJzMSwgNSwgcmQs IDB4MWIpOworfQorCitzdGF0aWMgdTMyIHJ2X3NyYWkodTggcmQsIHU4IHJzMSwgdTE2IGltbTEx XzApCit7CisJcmV0dXJuIHJ2X2lfaW5zbigweDQwMCB8IGltbTExXzAsIHJzMSwgNSwgcmQsIDB4 MTMpOworfQorCitzdGF0aWMgdTMyIHJ2X2phbCh1OCByZCwgdTMyIGltbTIwXzEpCit7CisJcmV0 dXJuIHJ2X3VqX2luc24oaW1tMjBfMSwgcmQsIDB4NmYpOworfQorCitzdGF0aWMgdTMyIHJ2X2ph bHIodTggcmQsIHU4IHJzMSwgdTE2IGltbTExXzApCit7CisJcmV0dXJuIHJ2X2lfaW5zbihpbW0x MV8wLCByczEsIDAsIHJkLCAweDY3KTsKK30KKworc3RhdGljIHUzMiBydl9iZXEodTggcnMxLCB1 OCByczIsIHUxNiBpbW0xMl8xKQoreworCXJldHVybiBydl9zYl9pbnNuKGltbTEyXzEsIHJzMiwg cnMxLCAwLCAweDYzKTsKK30KKworc3RhdGljIHUzMiBydl9ibHR1KHU4IHJzMSwgdTggcnMyLCB1 MTYgaW1tMTJfMSkKK3sKKwlyZXR1cm4gcnZfc2JfaW5zbihpbW0xMl8xLCByczIsIHJzMSwgNiwg MHg2Myk7Cit9CisKK3N0YXRpYyB1MzIgcnZfYmdldSh1OCByczEsIHU4IHJzMiwgdTE2IGltbTEy XzEpCit7CisJcmV0dXJuIHJ2X3NiX2luc24oaW1tMTJfMSwgcnMyLCByczEsIDcsIDB4NjMpOwor fQorCitzdGF0aWMgdTMyIHJ2X2JuZSh1OCByczEsIHU4IHJzMiwgdTE2IGltbTEyXzEpCit7CisJ cmV0dXJuIHJ2X3NiX2luc24oaW1tMTJfMSwgcnMyLCByczEsIDEsIDB4NjMpOworfQorCitzdGF0 aWMgdTMyIHJ2X2JsdCh1OCByczEsIHU4IHJzMiwgdTE2IGltbTEyXzEpCit7CisJcmV0dXJuIHJ2 X3NiX2luc24oaW1tMTJfMSwgcnMyLCByczEsIDQsIDB4NjMpOworfQorCitzdGF0aWMgdTMyIHJ2 X2JnZSh1OCByczEsIHU4IHJzMiwgdTE2IGltbTEyXzEpCit7CisJcmV0dXJuIHJ2X3NiX2luc24o aW1tMTJfMSwgcnMyLCByczEsIDUsIDB4NjMpOworfQorCitzdGF0aWMgdTMyIHJ2X3NiKHU4IHJz MSwgdTE2IGltbTExXzAsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfc19pbnNuKGltbTExXzAsIHJz MiwgcnMxLCAwLCAweDIzKTsKK30KKworc3RhdGljIHUzMiBydl9zaCh1OCByczEsIHUxNiBpbW0x MV8wLCB1OCByczIpCit7CisJcmV0dXJuIHJ2X3NfaW5zbihpbW0xMV8wLCByczIsIHJzMSwgMSwg MHgyMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfc3codTggcnMxLCB1MTYgaW1tMTFfMCwgdTggcnMy KQoreworCXJldHVybiBydl9zX2luc24oaW1tMTFfMCwgcnMyLCByczEsIDIsIDB4MjMpOworfQor CitzdGF0aWMgdTMyIHJ2X3NkKHU4IHJzMSwgdTE2IGltbTExXzAsIHU4IHJzMikKK3sKKwlyZXR1 cm4gcnZfc19pbnNuKGltbTExXzAsIHJzMiwgcnMxLCAzLCAweDIzKTsKK30KKworc3RhdGljIHUz MiBydl9sYnUodTggcmQsIHUxNiBpbW0xMV8wLCB1OCByczEpCit7CisJcmV0dXJuIHJ2X2lfaW5z bihpbW0xMV8wLCByczEsIDQsIHJkLCAweDAzKTsKK30KKworc3RhdGljIHUzMiBydl9saHUodTgg cmQsIHUxNiBpbW0xMV8wLCB1OCByczEpCit7CisJcmV0dXJuIHJ2X2lfaW5zbihpbW0xMV8wLCBy czEsIDUsIHJkLCAweDAzKTsKK30KKworc3RhdGljIHUzMiBydl9sd3UodTggcmQsIHUxNiBpbW0x MV8wLCB1OCByczEpCit7CisJcmV0dXJuIHJ2X2lfaW5zbihpbW0xMV8wLCByczEsIDYsIHJkLCAw eDAzKTsKK30KKworc3RhdGljIHUzMiBydl9sZCh1OCByZCwgdTE2IGltbTExXzAsIHU4IHJzMSkK K3sKKwlyZXR1cm4gcnZfaV9pbnNuKGltbTExXzAsIHJzMSwgMywgcmQsIDB4MDMpOworfQorCitz dGF0aWMgdTMyIHJ2X2Ftb2FkZF93KHU4IHJkLCB1OCByczIsIHU4IHJzMSwgdTggYXEsIHU4IHJs KQoreworCXJldHVybiBydl9hbW9faW5zbigwLCBhcSwgcmwsIHJzMiwgcnMxLCAyLCByZCwgMHgy Zik7Cit9CisKK3N0YXRpYyB1MzIgcnZfYW1vYWRkX2QodTggcmQsIHU4IHJzMiwgdTggcnMxLCB1 OCBhcSwgdTggcmwpCit7CisJcmV0dXJuIHJ2X2Ftb19pbnNuKDAsIGFxLCBybCwgcnMyLCByczEs IDMsIHJkLCAweDJmKTsKK30KKworc3RhdGljIGJvb2wgaXNfMTJiX2ludChzNjQgdmFsKQorewor CXJldHVybiAtKDEgPDwgMTEpIDw9IHZhbCAmJiB2YWwgPCAoMSA8PCAxMSk7Cit9CisKK3N0YXRp YyBib29sIGlzXzEzYl9pbnQoczY0IHZhbCkKK3sKKwlyZXR1cm4gLSgxIDw8IDEyKSA8PSB2YWwg JiYgdmFsIDwgKDEgPDwgMTIpOworfQorCitzdGF0aWMgYm9vbCBpc18yMWJfaW50KHM2NCB2YWwp Cit7CisJcmV0dXJuIC0oMUwgPDwgMjApIDw9IHZhbCAmJiB2YWwgPCAoMUwgPDwgMjApOworfQor CitzdGF0aWMgYm9vbCBpc18zMmJfaW50KHM2NCB2YWwpCit7CisJcmV0dXJuIC0oMUwgPDwgMzEp IDw9IHZhbCAmJiB2YWwgPCAoMUwgPDwgMzEpOworfQorCitzdGF0aWMgaW50IGlzXzEyYl9jaGVj ayhpbnQgb2ZmLCBpbnQgaW5zbikKK3sKKwlpZiAoIWlzXzEyYl9pbnQob2ZmKSkgeworCQlwcl9l cnIoImJwZi1qaXQ6IGluc249JWQgb2Zmc2V0PSVkIG5vdCBzdXBwb3J0ZWQgeWV0IVxuIiwKKwkJ ICAgICAgIGluc24sIChpbnQpb2ZmKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30K Kworc3RhdGljIGludCBpc18xM2JfY2hlY2soaW50IG9mZiwgaW50IGluc24pCit7CisJaWYgKCFp c18xM2JfaW50KG9mZikpIHsKKwkJcHJfZXJyKCJicGYtaml0OiBpbnNuPSVkIG9mZnNldD0lZCBu b3Qgc3VwcG9ydGVkIHlldCFcbiIsCisJCSAgICAgICBpbnNuLCAoaW50KW9mZik7CisJCXJldHVy biAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfMjFiX2NoZWNrKGludCBv ZmYsIGludCBpbnNuKQoreworCWlmICghaXNfMjFiX2ludChvZmYpKSB7CisJCXByX2VycigiYnBm LWppdDogaW5zbj0lZCBvZmZzZXQ9JWQgbm90IHN1cHBvcnRlZCB5ZXQhXG4iLAorCQkgICAgICAg aW5zbiwgKGludClvZmYpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0 aWMgdm9pZCBlbWl0X2ltbSh1OCByZCwgczY0IHZhbCwgc3RydWN0IHJ2X2ppdF9jb250ZXh0ICpj dHgpCit7CisJLyogTm90ZSB0aGF0IHRoZSBpbW1lZGlhdGUgZnJvbSB0aGUgYWRkIGlzIHNpZ24t ZXh0ZW5kZWQsCisJICogd2hpY2ggbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGNvbXBlbnNhdGUgdGhp cyBieSBhZGRpbmcgMl4xMiwKKwkgKiB3aGVuIHRoZSAxMnRoIGJpdCBpcyBzZXQuIEEgc2ltcGxl ciB3YXkgb2YgZG9pbmcgdGhpcywgYW5kCisJICogZ2V0dGluZyByaWQgb2YgdGhlIGNoZWNrLCBp cyB0byBqdXN0IGFkZCAyKioxMSBiZWZvcmUgdGhlCisJICogc2hpZnQuIFRoZSAiTG9hZGluZyBh IDMyLUJpdCBjb25zdGFudCIgZXhhbXBsZSBmcm9tIHRoZQorCSAqICJDb21wdXRlciBPcmdhbml6 YXRpb24gYW5kIERlc2lnbiwgUklTQy1WIGVkaXRpb24iIGJvb2sgYnkKKwkgKiBQYXR0ZXJzb24v SGVubmVzc3kgaGlnaGxpZ2h0cyB0aGlzIGZhY3QuCisJICoKKwkgKiBUaGlzIGFsc28gbWVhbnMg dGhhdCB3ZSBuZWVkIHRvIHByb2Nlc3MgTFNCIHRvIE1TQi4KKwkgKi8KKwlzNjQgdXBwZXIgPSAo dmFsICsgKDEgPDwgMTEpKSA+PiAxMiwgbG93ZXIgPSB2YWwgJiAweGZmZjsKKwlpbnQgc2hpZnQ7 CisKKwlpZiAoaXNfMzJiX2ludCh2YWwpKSB7CisJCWlmICh1cHBlcikKKwkJCWVtaXQocnZfbHVp KHJkLCB1cHBlciksIGN0eCk7CisKKwkJaWYgKCF1cHBlcikgeworCQkJZW1pdChydl9hZGRpKHJk LCBSVl9SRUdfWkVSTywgbG93ZXIpLCBjdHgpOworCQkJcmV0dXJuOworCQl9CisKKwkJZW1pdChy dl9hZGRpdyhyZCwgcmQsIGxvd2VyKSwgY3R4KTsKKwkJcmV0dXJuOworCX0KKworCXNoaWZ0ID0g X19mZnModXBwZXIpOworCXVwcGVyID4+PSBzaGlmdDsKKwlzaGlmdCArPSAxMjsKKworCWVtaXRf aW1tKHJkLCB1cHBlciwgY3R4KTsKKworCWVtaXQocnZfc2xsaShyZCwgcmQsIHNoaWZ0KSwgY3R4 KTsKKwlpZiAobG93ZXIpCisJCWVtaXQocnZfYWRkaShyZCwgcmQsIGxvd2VyKSwgY3R4KTsKK30K Kworc3RhdGljIGludCBydl9vZmZzZXQoaW50IGJwZl90bywgaW50IGJwZl9mcm9tLCBzdHJ1Y3Qg cnZfaml0X2NvbnRleHQgKmN0eCkKK3sKKwlpbnQgZnJvbSA9IGN0eC0+b2Zmc2V0W2JwZl9mcm9t XSAtIDEsIHRvID0gY3R4LT5vZmZzZXRbYnBmX3RvXTsKKworCXJldHVybiAodG8gLSBmcm9tKSA8 PCAyOworfQorCitzdGF0aWMgaW50IGVwaWxvZ3VlX29mZnNldChzdHJ1Y3QgcnZfaml0X2NvbnRl eHQgKmN0eCkKK3sKKwlpbnQgdG8gPSBjdHgtPmVwaWxvZ3VlX29mZnNldCwgZnJvbSA9IGN0eC0+ bmluc25zOworCisJcmV0dXJuICh0byAtIGZyb20pIDw8IDI7Cit9CisKK3N0YXRpYyB2b2lkIF9f YnVpbGRfZXBpbG9ndWUodTggcmVnLCBzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eCkKK3sKKwlp bnQgc3RhY2tfYWRqdXN0ID0gY3R4LT5zdGFja19zaXplLCBzdG9yZV9vZmZzZXQgPSBzdGFja19h ZGp1c3QgLSA4OworCisJaWYgKHNlZW5fcmVnKFJWX1JFR19SQSwgY3R4KSkgeworCQllbWl0KHJ2 X2xkKFJWX1JFR19SQSwgc3RvcmVfb2Zmc2V0LCBSVl9SRUdfU1ApLCBjdHgpOworCQlzdG9yZV9v ZmZzZXQgLT0gODsKKwl9CisJZW1pdChydl9sZChSVl9SRUdfRlAsIHN0b3JlX29mZnNldCwgUlZf UkVHX1NQKSwgY3R4KTsKKwlzdG9yZV9vZmZzZXQgLT0gODsKKwlpZiAoc2Vlbl9yZWcoUlZfUkVH X1MxLCBjdHgpKSB7CisJCWVtaXQocnZfbGQoUlZfUkVHX1MxLCBzdG9yZV9vZmZzZXQsIFJWX1JF R19TUCksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwlpZiAoc2Vlbl9yZWcoUlZf UkVHX1MyLCBjdHgpKSB7CisJCWVtaXQocnZfbGQoUlZfUkVHX1MyLCBzdG9yZV9vZmZzZXQsIFJW X1JFR19TUCksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwlpZiAoc2Vlbl9yZWco UlZfUkVHX1MzLCBjdHgpKSB7CisJCWVtaXQocnZfbGQoUlZfUkVHX1MzLCBzdG9yZV9vZmZzZXQs IFJWX1JFR19TUCksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwlpZiAoc2Vlbl9y ZWcoUlZfUkVHX1M0LCBjdHgpKSB7CisJCWVtaXQocnZfbGQoUlZfUkVHX1M0LCBzdG9yZV9vZmZz ZXQsIFJWX1JFR19TUCksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwlpZiAoc2Vl bl9yZWcoUlZfUkVHX1M1LCBjdHgpKSB7CisJCWVtaXQocnZfbGQoUlZfUkVHX1M1LCBzdG9yZV9v ZmZzZXQsIFJWX1JFR19TUCksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwlpZiAo c2Vlbl9yZWcoUlZfUkVHX1M2LCBjdHgpKSB7CisJCWVtaXQocnZfbGQoUlZfUkVHX1M2LCBzdG9y ZV9vZmZzZXQsIFJWX1JFR19TUCksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwor CWVtaXQocnZfYWRkaShSVl9SRUdfU1AsIFJWX1JFR19TUCwgc3RhY2tfYWRqdXN0KSwgY3R4KTsK KwkvKiBTZXQgcmV0dXJuIHZhbHVlLiAqLworCWVtaXQocnZfYWRkaShSVl9SRUdfQTAsIFJWX1JF R19BNSwgMCksIGN0eCk7CisJZW1pdChydl9qYWxyKFJWX1JFR19aRVJPLCByZWcsIDApLCBjdHgp OworfQorCitzdGF0aWMgdm9pZCBlbWl0X3plcm9fZXh0ZW5kXzMyKHU4IHJlZywgc3RydWN0IHJ2 X2ppdF9jb250ZXh0ICpjdHgpCit7CisJZW1pdChydl9zbGxpKHJlZywgcmVnLCAzMiksIGN0eCk7 CisJZW1pdChydl9zcmxpKHJlZywgcmVnLCAzMiksIGN0eCk7Cit9CisKK3N0YXRpYyBpbnQgZW1p dF9icGZfdGFpbF9jYWxsKGludCBpbnNuLCBzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eCkKK3sK KwlpbnQgdGNfbmluc24sIG9mZiwgc3RhcnRfaW5zbiA9IGN0eC0+bmluc25zOworCXU4IHRjYyA9 IHJ2X3RhaWxfY2FsbF9yZWcoY3R4KTsKKworCS8qIGEwOiAmY3R4CisJICogYTE6ICZhcnJheQor CSAqIGEyOiBpbmRleAorCSAqCisJICogaWYgKGluZGV4ID49IGFycmF5LT5tYXAubWF4X2VudHJp ZXMpCisJICoJZ290byBvdXQ7CisJICovCisJdGNfbmluc24gPSBpbnNuID8gY3R4LT5vZmZzZXRb aW5zbl0gLSBjdHgtPm9mZnNldFtpbnNuIC0gMV0gOgorCQkgICBjdHgtPm9mZnNldFswXTsKKwll bWl0X3plcm9fZXh0ZW5kXzMyKFJWX1JFR19BMiwgY3R4KTsKKworCW9mZiA9IG9mZnNldG9mKHN0 cnVjdCBicGZfYXJyYXksIG1hcC5tYXhfZW50cmllcyk7CisJaWYgKGlzXzEyYl9jaGVjayhvZmYs IGluc24pKQorCQlyZXR1cm4gLTE7CisJZW1pdChydl9sd3UoUlZfUkVHX1QxLCBvZmYsIFJWX1JF R19BMSksIGN0eCk7CisJb2ZmID0gKHRjX25pbnNuIC0gKGN0eC0+bmluc25zIC0gc3RhcnRfaW5z bikpIDw8IDI7CisJaWYgKGlzXzEzYl9jaGVjayhvZmYsIGluc24pKQorCQlyZXR1cm4gLTE7CisJ ZW1pdChydl9iZ2V1KFJWX1JFR19BMiwgUlZfUkVHX1QxLCBvZmYgPj4gMSksIGN0eCk7CisKKwkv KiBpZiAoLS1UQ0MgPCAwKQorCSAqICAgICBnb3RvIG91dDsKKwkgKi8KKwllbWl0KHJ2X2FkZGko UlZfUkVHX1QxLCB0Y2MsIC0xKSwgY3R4KTsKKwlvZmYgPSAodGNfbmluc24gLSAoY3R4LT5uaW5z bnMgLSBzdGFydF9pbnNuKSkgPDwgMjsKKwlpZiAoaXNfMTNiX2NoZWNrKG9mZiwgaW5zbikpCisJ CXJldHVybiAtMTsKKwllbWl0KHJ2X2JsdChSVl9SRUdfVDEsIFJWX1JFR19aRVJPLCBvZmYgPj4g MSksIGN0eCk7CisKKwkvKiBwcm9nID0gYXJyYXktPnB0cnNbaW5kZXhdOworCSAqIGlmICghcHJv ZykKKwkgKiAgICAgZ290byBvdXQ7CisJICovCisJZW1pdChydl9zbGxpKFJWX1JFR19UMiwgUlZf UkVHX0EyLCAzKSwgY3R4KTsKKwllbWl0KHJ2X2FkZChSVl9SRUdfVDIsIFJWX1JFR19UMiwgUlZf UkVHX0ExKSwgY3R4KTsKKwlvZmYgPSBvZmZzZXRvZihzdHJ1Y3QgYnBmX2FycmF5LCBwdHJzKTsK KwlpZiAoaXNfMTJiX2NoZWNrKG9mZiwgaW5zbikpCisJCXJldHVybiAtMTsKKwllbWl0KHJ2X2xk KFJWX1JFR19UMiwgb2ZmLCBSVl9SRUdfVDIpLCBjdHgpOworCW9mZiA9ICh0Y19uaW5zbiAtIChj dHgtPm5pbnNucyAtIHN0YXJ0X2luc24pKSA8PCAyOworCWlmIChpc18xM2JfY2hlY2sob2ZmLCBp bnNuKSkKKwkJcmV0dXJuIC0xOworCWVtaXQocnZfYmVxKFJWX1JFR19UMiwgUlZfUkVHX1pFUk8s IG9mZiA+PiAxKSwgY3R4KTsKKworCS8qIGdvdG8gKihwcm9nLT5icGZfZnVuYyArIDQpOyAqLwor CW9mZiA9IG9mZnNldG9mKHN0cnVjdCBicGZfcHJvZywgYnBmX2Z1bmMpOworCWlmIChpc18xMmJf Y2hlY2sob2ZmLCBpbnNuKSkKKwkJcmV0dXJuIC0xOworCWVtaXQocnZfbGQoUlZfUkVHX1QzLCBv ZmYsIFJWX1JFR19UMiksIGN0eCk7CisJZW1pdChydl9hZGRpKFJWX1JFR19UMywgUlZfUkVHX1Qz LCA0KSwgY3R4KTsKKwllbWl0KHJ2X2FkZGkoUlZfUkVHX1RDQywgUlZfUkVHX1QxLCAwKSwgY3R4 KTsKKwlfX2J1aWxkX2VwaWxvZ3VlKFJWX1JFR19UMywgY3R4KTsKKwlyZXR1cm4gMDsKK30KKwor c3RhdGljIHZvaWQgaW5pdF9yZWdzKHU4ICpyZCwgdTggKnJzLCBjb25zdCBzdHJ1Y3QgYnBmX2lu c24gKmluc24sCisJCSAgICAgIHN0cnVjdCBydl9qaXRfY29udGV4dCAqY3R4KQoreworCXU4IGNv ZGUgPSBpbnNuLT5jb2RlOworCisJc3dpdGNoIChjb2RlKSB7CisJY2FzZSBCUEZfSk1QIHwgQlBG X0pBOgorCWNhc2UgQlBGX0pNUCB8IEJQRl9DQUxMOgorCWNhc2UgQlBGX0pNUCB8IEJQRl9FWElU OgorCWNhc2UgQlBGX0pNUCB8IEJQRl9UQUlMX0NBTEw6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJ CSpyZCA9IGJwZl90b19ydl9yZWcoaW5zbi0+ZHN0X3JlZywgY3R4KTsKKwl9CisKKwlpZiAoY29k ZSAmIChCUEZfQUxVIHwgQlBGX1gpIHx8IGNvZGUgJiAoQlBGX0FMVTY0IHwgQlBGX1gpIHx8CisJ ICAgIGNvZGUgJiAoQlBGX0pNUCB8IEJQRl9YKSB8fCBjb2RlICYgQlBGX0xEWCB8fCBjb2RlICYg QlBGX1NUWCkKKwkJKnJzID0gYnBmX3RvX3J2X3JlZyhpbnNuLT5zcmNfcmVnLCBjdHgpOworfQor CitzdGF0aWMgaW50IHJ2X29mZnNldF9jaGVjayhpbnQgKnJ2b2ZmLCBzMTYgb2ZmLCBpbnQgaW5z biwKKwkJCSAgIHN0cnVjdCBydl9qaXRfY29udGV4dCAqY3R4KQoreworCSpydm9mZiA9IHJ2X29m ZnNldChpbnNuICsgb2ZmLCBpbnNuLCBjdHgpOworCXJldHVybiBpc18xM2JfY2hlY2soKnJ2b2Zm LCBpbnNuKTsKK30KKworc3RhdGljIGludCBlbWl0X2luc24oY29uc3Qgc3RydWN0IGJwZl9pbnNu ICppbnNuLCBzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eCwKKwkJICAgICBib29sIGV4dHJhX3Bh c3MpCit7CisJYm9vbCBpczY0ID0gQlBGX0NMQVNTKGluc24tPmNvZGUpID09IEJQRl9BTFU2NDsK KwlpbnQgcnZvZmYsIGkgPSBpbnNuIC0gY3R4LT5wcm9nLT5pbnNuc2k7CisJdTggcmQgPSAtMSwg cnMgPSAtMSwgY29kZSA9IGluc24tPmNvZGU7CisJczE2IG9mZiA9IGluc24tPm9mZjsKKwlzMzIg aW1tID0gaW5zbi0+aW1tOworCisJaW5pdF9yZWdzKCZyZCwgJnJzLCBpbnNuLCBjdHgpOworCisJ c3dpdGNoIChjb2RlKSB7CisJLyogZHN0ID0gc3JjICovCisJY2FzZSBCUEZfQUxVIHwgQlBGX01P ViB8IEJQRl9YOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX01PViB8IEJQRl9YOgorCQllbWl0KGlz NjQgPyBydl9hZGRpKHJkLCBycywgMCkgOiBydl9hZGRpdyhyZCwgcnMsIDApLCBjdHgpOworCQlp ZiAoIWlzNjQpCisJCQllbWl0X3plcm9fZXh0ZW5kXzMyKHJkLCBjdHgpOworCQlicmVhazsKKwor CS8qIGRzdCA9IGRzdCBPUCBzcmMgKi8KKwljYXNlIEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX1g6 CisJY2FzZSBCUEZfQUxVNjQgfCBCUEZfQUREIHwgQlBGX1g6CisJCWVtaXQoaXM2NCA/IHJ2X2Fk ZChyZCwgcmQsIHJzKSA6IHJ2X2FkZHcocmQsIHJkLCBycyksIGN0eCk7CisJCWJyZWFrOworCWNh c2UgQlBGX0FMVSB8IEJQRl9TVUIgfCBCUEZfWDoKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9TVUIg fCBCUEZfWDoKKwkJZW1pdChpczY0ID8gcnZfc3ViKHJkLCByZCwgcnMpIDogcnZfc3VidyhyZCwg cmQsIHJzKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfQUxVIHwgQlBGX0FORCB8IEJQRl9Y OgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0FORCB8IEJQRl9YOgorCQllbWl0KHJ2X2FuZChyZCwg cmQsIHJzKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfQUxVIHwgQlBGX09SIHwgQlBGX1g6 CisJY2FzZSBCUEZfQUxVNjQgfCBCUEZfT1IgfCBCUEZfWDoKKwkJZW1pdChydl9vcihyZCwgcmQs IHJzKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9YOgor CWNhc2UgQlBGX0FMVTY0IHwgQlBGX1hPUiB8IEJQRl9YOgorCQllbWl0KHJ2X3hvcihyZCwgcmQs IHJzKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfQUxVIHwgQlBGX01VTCB8IEJQRl9YOgor CWNhc2UgQlBGX0FMVTY0IHwgQlBGX01VTCB8IEJQRl9YOgorCQllbWl0KGlzNjQgPyBydl9tdWwo cmQsIHJkLCBycykgOiBydl9tdWx3KHJkLCByZCwgcnMpLCBjdHgpOworCQlpZiAoIWlzNjQpCisJ CQllbWl0X3plcm9fZXh0ZW5kXzMyKHJkLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9BTFUg fCBCUEZfRElWIHwgQlBGX1g6CisJY2FzZSBCUEZfQUxVNjQgfCBCUEZfRElWIHwgQlBGX1g6CisJ CWVtaXQoaXM2NCA/IHJ2X2RpdnUocmQsIHJkLCBycykgOiBydl9kaXZ1dyhyZCwgcmQsIHJzKSwg Y3R4KTsKKwkJaWYgKCFpczY0KQorCQkJZW1pdF96ZXJvX2V4dGVuZF8zMihyZCwgY3R4KTsKKwkJ YnJlYWs7CisJY2FzZSBCUEZfQUxVIHwgQlBGX01PRCB8IEJQRl9YOgorCWNhc2UgQlBGX0FMVTY0 IHwgQlBGX01PRCB8IEJQRl9YOgorCQllbWl0KGlzNjQgPyBydl9yZW11KHJkLCByZCwgcnMpIDog cnZfcmVtdXcocmQsIHJkLCBycyksIGN0eCk7CisJCWlmICghaXM2NCkKKwkJCWVtaXRfemVyb19l eHRlbmRfMzIocmQsIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0FMVSB8IEJQRl9MU0ggfCBC UEZfWDoKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9MU0ggfCBCUEZfWDoKKwkJZW1pdChpczY0ID8g cnZfc2xsKHJkLCByZCwgcnMpIDogcnZfc2xsdyhyZCwgcmQsIHJzKSwgY3R4KTsKKwkJYnJlYWs7 CisJY2FzZSBCUEZfQUxVIHwgQlBGX1JTSCB8IEJQRl9YOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBG X1JTSCB8IEJQRl9YOgorCQllbWl0KGlzNjQgPyBydl9zcmwocmQsIHJkLCBycykgOiBydl9zcmx3 KHJkLCByZCwgcnMpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9BTFUgfCBCUEZfQVJTSCB8 IEJQRl9YOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0FSU0ggfCBCUEZfWDoKKwkJZW1pdChpczY0 ID8gcnZfc3JhKHJkLCByZCwgcnMpIDogcnZfc3JhdyhyZCwgcmQsIHJzKSwgY3R4KTsKKwkJYnJl YWs7CisKKwkvKiBkc3QgPSAtZHN0ICovCisJY2FzZSBCUEZfQUxVIHwgQlBGX05FRzoKKwljYXNl IEJQRl9BTFU2NCB8IEJQRl9ORUc6CisJCWVtaXQoaXM2NCA/IHJ2X3N1YihyZCwgUlZfUkVHX1pF Uk8sIHJkKSA6CisJCSAgICAgcnZfc3VidyhyZCwgUlZfUkVHX1pFUk8sIHJkKSwgY3R4KTsKKwkJ YnJlYWs7CisKKwkvKiBkc3QgPSBCU1dBUCMjaW1tKGRzdCkgKi8KKwljYXNlIEJQRl9BTFUgfCBC UEZfRU5EIHwgQlBGX0ZST01fTEU6CisJeworCQlpbnQgc2hpZnQgPSA2NCAtIGltbTsKKworCQll bWl0KHJ2X3NsbGkocmQsIHJkLCBzaGlmdCksIGN0eCk7CisJCWVtaXQocnZfc3JsaShyZCwgcmQs IHNoaWZ0KSwgY3R4KTsKKwkJYnJlYWs7CisJfQorCWNhc2UgQlBGX0FMVSB8IEJQRl9FTkQgfCBC UEZfRlJPTV9CRToKKwkJZW1pdChydl9hZGRpKFJWX1JFR19UMiwgUlZfUkVHX1pFUk8sIDApLCBj dHgpOworCisJCWVtaXQocnZfYW5kaShSVl9SRUdfVDEsIHJkLCAweGZmKSwgY3R4KTsKKwkJZW1p dChydl9hZGQoUlZfUkVHX1QyLCBSVl9SRUdfVDIsIFJWX1JFR19UMSksIGN0eCk7CisJCWVtaXQo cnZfc2xsaShSVl9SRUdfVDIsIFJWX1JFR19UMiwgOCksIGN0eCk7CisJCWVtaXQocnZfc3JsaShy ZCwgcmQsIDgpLCBjdHgpOworCQlpZiAoaW1tID09IDE2KQorCQkJZ290byBvdXRfYmU7CisKKwkJ ZW1pdChydl9hbmRpKFJWX1JFR19UMSwgcmQsIDB4ZmYpLCBjdHgpOworCQllbWl0KHJ2X2FkZChS Vl9SRUdfVDIsIFJWX1JFR19UMiwgUlZfUkVHX1QxKSwgY3R4KTsKKwkJZW1pdChydl9zbGxpKFJW X1JFR19UMiwgUlZfUkVHX1QyLCA4KSwgY3R4KTsKKwkJZW1pdChydl9zcmxpKHJkLCByZCwgOCks IGN0eCk7CisKKwkJZW1pdChydl9hbmRpKFJWX1JFR19UMSwgcmQsIDB4ZmYpLCBjdHgpOworCQll bWl0KHJ2X2FkZChSVl9SRUdfVDIsIFJWX1JFR19UMiwgUlZfUkVHX1QxKSwgY3R4KTsKKwkJZW1p dChydl9zbGxpKFJWX1JFR19UMiwgUlZfUkVHX1QyLCA4KSwgY3R4KTsKKwkJZW1pdChydl9zcmxp KHJkLCByZCwgOCksIGN0eCk7CisJCWlmIChpbW0gPT0gMzIpCisJCQlnb3RvIG91dF9iZTsKKwor CQllbWl0KHJ2X2FuZGkoUlZfUkVHX1QxLCByZCwgMHhmZiksIGN0eCk7CisJCWVtaXQocnZfYWRk KFJWX1JFR19UMiwgUlZfUkVHX1QyLCBSVl9SRUdfVDEpLCBjdHgpOworCQllbWl0KHJ2X3NsbGko UlZfUkVHX1QyLCBSVl9SRUdfVDIsIDgpLCBjdHgpOworCQllbWl0KHJ2X3NybGkocmQsIHJkLCA4 KSwgY3R4KTsKKworCQllbWl0KHJ2X2FuZGkoUlZfUkVHX1QxLCByZCwgMHhmZiksIGN0eCk7CisJ CWVtaXQocnZfYWRkKFJWX1JFR19UMiwgUlZfUkVHX1QyLCBSVl9SRUdfVDEpLCBjdHgpOworCQll bWl0KHJ2X3NsbGkoUlZfUkVHX1QyLCBSVl9SRUdfVDIsIDgpLCBjdHgpOworCQllbWl0KHJ2X3Ny bGkocmQsIHJkLCA4KSwgY3R4KTsKKworCQllbWl0KHJ2X2FuZGkoUlZfUkVHX1QxLCByZCwgMHhm ZiksIGN0eCk7CisJCWVtaXQocnZfYWRkKFJWX1JFR19UMiwgUlZfUkVHX1QyLCBSVl9SRUdfVDEp LCBjdHgpOworCQllbWl0KHJ2X3NsbGkoUlZfUkVHX1QyLCBSVl9SRUdfVDIsIDgpLCBjdHgpOwor CQllbWl0KHJ2X3NybGkocmQsIHJkLCA4KSwgY3R4KTsKKworCQllbWl0KHJ2X2FuZGkoUlZfUkVH X1QxLCByZCwgMHhmZiksIGN0eCk7CisJCWVtaXQocnZfYWRkKFJWX1JFR19UMiwgUlZfUkVHX1Qy LCBSVl9SRUdfVDEpLCBjdHgpOworCQllbWl0KHJ2X3NsbGkoUlZfUkVHX1QyLCBSVl9SRUdfVDIs IDgpLCBjdHgpOworCQllbWl0KHJ2X3NybGkocmQsIHJkLCA4KSwgY3R4KTsKK291dF9iZToKKwkJ ZW1pdChydl9hbmRpKFJWX1JFR19UMSwgcmQsIDB4ZmYpLCBjdHgpOworCQllbWl0KHJ2X2FkZChS Vl9SRUdfVDIsIFJWX1JFR19UMiwgUlZfUkVHX1QxKSwgY3R4KTsKKworCQllbWl0KHJ2X2FkZGko cmQsIFJWX1JFR19UMiwgMCksIGN0eCk7CisJCWJyZWFrOworCisJLyogZHN0ID0gaW1tICovCisJ Y2FzZSBCUEZfQUxVIHwgQlBGX01PViB8IEJQRl9LOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX01P ViB8IEJQRl9LOgorCQllbWl0X2ltbShyZCwgaW1tLCBjdHgpOworCQlpZiAoIWlzNjQpCisJCQll bWl0X3plcm9fZXh0ZW5kXzMyKHJkLCBjdHgpOworCQlicmVhazsKKworCS8qIGRzdCA9IGRzdCBP UCBpbW0gKi8KKwljYXNlIEJQRl9BTFUgfCBCUEZfQUREIHwgQlBGX0s6CisJY2FzZSBCUEZfQUxV NjQgfCBCUEZfQUREIHwgQlBGX0s6CisJCWlmIChpc18xMmJfaW50KGltbSkpIHsKKwkJCWVtaXQo aXM2NCA/IHJ2X2FkZGkocmQsIHJkLCBpbW0pIDoKKwkJCSAgICAgcnZfYWRkaXcocmQsIHJkLCBp bW0pLCBjdHgpOworCQl9IGVsc2UgeworCQkJZW1pdF9pbW0oUlZfUkVHX1QxLCBpbW0sIGN0eCk7 CisJCQllbWl0KGlzNjQgPyBydl9hZGQocmQsIHJkLCBSVl9SRUdfVDEpIDoKKwkJCSAgICAgcnZf YWRkdyhyZCwgcmQsIFJWX1JFR19UMSksIGN0eCk7CisJCX0KKwkJaWYgKCFpczY0KQorCQkJZW1p dF96ZXJvX2V4dGVuZF8zMihyZCwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfQUxVIHwgQlBG X1NVQiB8IEJQRl9LOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX1NVQiB8IEJQRl9LOgorCQlpZiAo aXNfMTJiX2ludCgtaW1tKSkgeworCQkJZW1pdChpczY0ID8gcnZfYWRkaShyZCwgcmQsIC1pbW0p IDoKKwkJCSAgICAgcnZfYWRkaXcocmQsIHJkLCAtaW1tKSwgY3R4KTsKKwkJfSBlbHNlIHsKKwkJ CWVtaXRfaW1tKFJWX1JFR19UMSwgaW1tLCBjdHgpOworCQkJZW1pdChpczY0ID8gcnZfc3ViKHJk LCByZCwgUlZfUkVHX1QxKSA6CisJCQkgICAgIHJ2X3N1YncocmQsIHJkLCBSVl9SRUdfVDEpLCBj dHgpOworCQl9CisJCWlmICghaXM2NCkKKwkJCWVtaXRfemVyb19leHRlbmRfMzIocmQsIGN0eCk7 CisJCWJyZWFrOworCWNhc2UgQlBGX0FMVSB8IEJQRl9BTkQgfCBCUEZfSzoKKwljYXNlIEJQRl9B TFU2NCB8IEJQRl9BTkQgfCBCUEZfSzoKKwkJaWYgKGlzXzEyYl9pbnQoaW1tKSkgeworCQkJZW1p dChydl9hbmRpKHJkLCByZCwgaW1tKSwgY3R4KTsKKwkJfSBlbHNlIHsKKwkJCWVtaXRfaW1tKFJW X1JFR19UMSwgaW1tLCBjdHgpOworCQkJZW1pdChydl9hbmQocmQsIHJkLCBSVl9SRUdfVDEpLCBj dHgpOworCQl9CisJCWlmICghaXM2NCkKKwkJCWVtaXRfemVyb19leHRlbmRfMzIocmQsIGN0eCk7 CisJCWJyZWFrOworCWNhc2UgQlBGX0FMVSB8IEJQRl9PUiB8IEJQRl9LOgorCWNhc2UgQlBGX0FM VTY0IHwgQlBGX09SIHwgQlBGX0s6CisJCWlmIChpc18xMmJfaW50KGltbSkpIHsKKwkJCWVtaXQo cnZfb3JpKHJkLCByZCwgaW1tKSwgY3R4KTsKKwkJfSBlbHNlIHsKKwkJCWVtaXRfaW1tKFJWX1JF R19UMSwgaW1tLCBjdHgpOworCQkJZW1pdChydl9vcihyZCwgcmQsIFJWX1JFR19UMSksIGN0eCk7 CisJCX0KKwkJaWYgKCFpczY0KQorCQkJZW1pdF96ZXJvX2V4dGVuZF8zMihyZCwgY3R4KTsKKwkJ YnJlYWs7CisJY2FzZSBCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9LOgorCWNhc2UgQlBGX0FMVTY0 IHwgQlBGX1hPUiB8IEJQRl9LOgorCQlpZiAoaXNfMTJiX2ludChpbW0pKSB7CisJCQllbWl0KHJ2 X3hvcmkocmQsIHJkLCBpbW0pLCBjdHgpOworCQl9IGVsc2UgeworCQkJZW1pdF9pbW0oUlZfUkVH X1QxLCBpbW0sIGN0eCk7CisJCQllbWl0KHJ2X3hvcihyZCwgcmQsIFJWX1JFR19UMSksIGN0eCk7 CisJCX0KKwkJaWYgKCFpczY0KQorCQkJZW1pdF96ZXJvX2V4dGVuZF8zMihyZCwgY3R4KTsKKwkJ YnJlYWs7CisJY2FzZSBCUEZfQUxVIHwgQlBGX01VTCB8IEJQRl9LOgorCWNhc2UgQlBGX0FMVTY0 IHwgQlBGX01VTCB8IEJQRl9LOgorCQllbWl0X2ltbShSVl9SRUdfVDEsIGltbSwgY3R4KTsKKwkJ ZW1pdChpczY0ID8gcnZfbXVsKHJkLCByZCwgUlZfUkVHX1QxKSA6CisJCSAgICAgcnZfbXVsdyhy ZCwgcmQsIFJWX1JFR19UMSksIGN0eCk7CisJCWlmICghaXM2NCkKKwkJCWVtaXRfemVyb19leHRl bmRfMzIocmQsIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0FMVSB8IEJQRl9ESVYgfCBCUEZf SzoKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9ESVYgfCBCUEZfSzoKKwkJZW1pdF9pbW0oUlZfUkVH X1QxLCBpbW0sIGN0eCk7CisJCWVtaXQoaXM2NCA/IHJ2X2RpdnUocmQsIHJkLCBSVl9SRUdfVDEp IDoKKwkJICAgICBydl9kaXZ1dyhyZCwgcmQsIFJWX1JFR19UMSksIGN0eCk7CisJCWlmICghaXM2 NCkKKwkJCWVtaXRfemVyb19leHRlbmRfMzIocmQsIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBG X0FMVSB8IEJQRl9NT0QgfCBCUEZfSzoKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9NT0QgfCBCUEZf SzoKKwkJZW1pdF9pbW0oUlZfUkVHX1QxLCBpbW0sIGN0eCk7CisJCWVtaXQoaXM2NCA/IHJ2X3Jl bXUocmQsIHJkLCBSVl9SRUdfVDEpIDoKKwkJICAgICBydl9yZW11dyhyZCwgcmQsIFJWX1JFR19U MSksIGN0eCk7CisJCWlmICghaXM2NCkKKwkJCWVtaXRfemVyb19leHRlbmRfMzIocmQsIGN0eCk7 CisJCWJyZWFrOworCWNhc2UgQlBGX0FMVSB8IEJQRl9MU0ggfCBCUEZfSzoKKwljYXNlIEJQRl9B TFU2NCB8IEJQRl9MU0ggfCBCUEZfSzoKKwkJZW1pdChpczY0ID8gcnZfc2xsaShyZCwgcmQsIGlt bSkgOiBydl9zbGxpdyhyZCwgcmQsIGltbSksIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0FM VSB8IEJQRl9SU0ggfCBCUEZfSzoKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9SU0ggfCBCUEZfSzoK KwkJZW1pdChpczY0ID8gcnZfc3JsaShyZCwgcmQsIGltbSkgOiBydl9zcmxpdyhyZCwgcmQsIGlt bSksIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0FMVSB8IEJQRl9BUlNIIHwgQlBGX0s6CisJ Y2FzZSBCUEZfQUxVNjQgfCBCUEZfQVJTSCB8IEJQRl9LOgorCQllbWl0KGlzNjQgPyBydl9zcmFp KHJkLCByZCwgaW1tKSA6IHJ2X3NyYWl3KHJkLCByZCwgaW1tKSwgY3R4KTsKKwkJYnJlYWs7CisK KwkvKiBKVU1QIG9mZiAqLworCWNhc2UgQlBGX0pNUCB8IEJQRl9KQToKKwkJcnZvZmYgPSBydl9v ZmZzZXQoaSArIG9mZiwgaSwgY3R4KTsKKwkJaWYgKCFpc18yMWJfaW50KHJ2b2ZmKSkgeworCQkJ cHJfZXJyKCJicGYtaml0OiBpbnNuPSVkIG9mZnNldD0lZCBub3Qgc3VwcG9ydGVkIHlldCFcbiIs CisJCQkgICAgICAgaSwgcnZvZmYpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJZW1pdChydl9q YWwoUlZfUkVHX1pFUk8sIHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsKKworCS8qIElGIChk c3QgQ09ORCBzcmMpIEpVTVAgb2ZmICovCisJY2FzZSBCUEZfSk1QIHwgQlBGX0pFUSB8IEJQRl9Y OgorCQlpZiAocnZfb2Zmc2V0X2NoZWNrKCZydm9mZiwgb2ZmLCBpLCBjdHgpKQorCQkJcmV0dXJu IC0xOworCQllbWl0KHJ2X2JlcShyZCwgcnMsIHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsK KwljYXNlIEJQRl9KTVAgfCBCUEZfSkdUIHwgQlBGX1g6CisJCWlmIChydl9vZmZzZXRfY2hlY2so JnJ2b2ZmLCBvZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWVtaXQocnZfYmx0dShycywg cmQsIHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9KTVAgfCBCUEZfSkxU IHwgQlBGX1g6CisJCWlmIChydl9vZmZzZXRfY2hlY2soJnJ2b2ZmLCBvZmYsIGksIGN0eCkpCisJ CQlyZXR1cm4gLTE7CisJCWVtaXQocnZfYmx0dShyZCwgcnMsIHJ2b2ZmID4+IDEpLCBjdHgpOwor CQlicmVhazsKKwljYXNlIEJQRl9KTVAgfCBCUEZfSkdFIHwgQlBGX1g6CisJCWlmIChydl9vZmZz ZXRfY2hlY2soJnJ2b2ZmLCBvZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWVtaXQocnZf YmdldShyZCwgcnMsIHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9KTVAg fCBCUEZfSkxFIHwgQlBGX1g6CisJCWlmIChydl9vZmZzZXRfY2hlY2soJnJ2b2ZmLCBvZmYsIGks IGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWVtaXQocnZfYmdldShycywgcmQsIHJ2b2ZmID4+IDEp LCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9KTVAgfCBCUEZfSk5FIHwgQlBGX1g6CisJCWlm IChydl9vZmZzZXRfY2hlY2soJnJ2b2ZmLCBvZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJ CWVtaXQocnZfYm5lKHJkLCBycywgcnZvZmYgPj4gMSksIGN0eCk7CisJCWJyZWFrOworCWNhc2Ug QlBGX0pNUCB8IEJQRl9KU0dUIHwgQlBGX1g6CisJCWlmIChydl9vZmZzZXRfY2hlY2soJnJ2b2Zm LCBvZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWVtaXQocnZfYmx0KHJzLCByZCwgcnZv ZmYgPj4gMSksIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0xUIHwgQlBG X1g6CisJCWlmIChydl9vZmZzZXRfY2hlY2soJnJ2b2ZmLCBvZmYsIGksIGN0eCkpCisJCQlyZXR1 cm4gLTE7CisJCWVtaXQocnZfYmx0KHJkLCBycywgcnZvZmYgPj4gMSksIGN0eCk7CisJCWJyZWFr OworCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0dFIHwgQlBGX1g6CisJCWlmIChydl9vZmZzZXRfY2hl Y2soJnJ2b2ZmLCBvZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWVtaXQocnZfYmdlKHJk LCBycywgcnZvZmYgPj4gMSksIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0pNUCB8IEJQRl9K U0xFIHwgQlBGX1g6CisJCWlmIChydl9vZmZzZXRfY2hlY2soJnJ2b2ZmLCBvZmYsIGksIGN0eCkp CisJCQlyZXR1cm4gLTE7CisJCWVtaXQocnZfYmdlKHJzLCByZCwgcnZvZmYgPj4gMSksIGN0eCk7 CisJCWJyZWFrOworCWNhc2UgQlBGX0pNUCB8IEJQRl9KU0VUIHwgQlBGX1g6CisJCWlmIChydl9v ZmZzZXRfY2hlY2soJnJ2b2ZmLCBvZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWVtaXQo cnZfYW5kKFJWX1JFR19UMSwgcmQsIHJzKSwgY3R4KTsKKwkJZW1pdChydl9ibmUoUlZfUkVHX1Qx LCBSVl9SRUdfWkVSTywgcnZvZmYgPj4gMSksIGN0eCk7CisJCWJyZWFrOworCisJLyogSUYgKGRz dCBDT05EIGltbSkgSlVNUCBvZmYgKi8KKwljYXNlIEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX0s6 CisJCWlmIChydl9vZmZzZXRfY2hlY2soJnJ2b2ZmLCBvZmYsIGksIGN0eCkpCisJCQlyZXR1cm4g LTE7CisJCWVtaXRfaW1tKFJWX1JFR19UMSwgaW1tLCBjdHgpOworCQllbWl0KHJ2X2JlcShyZCwg UlZfUkVHX1QxLCBydm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSk1QIHwg QlBGX0pHVCB8IEJQRl9LOgorCQlpZiAocnZfb2Zmc2V0X2NoZWNrKCZydm9mZiwgb2ZmLCBpLCBj dHgpKQorCQkJcmV0dXJuIC0xOworCQllbWl0X2ltbShSVl9SRUdfVDEsIGltbSwgY3R4KTsKKwkJ ZW1pdChydl9ibHR1KFJWX1JFR19UMSwgcmQsIHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsK KwljYXNlIEJQRl9KTVAgfCBCUEZfSkxUIHwgQlBGX0s6CisJCWlmIChydl9vZmZzZXRfY2hlY2so JnJ2b2ZmLCBvZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWVtaXRfaW1tKFJWX1JFR19U MSwgaW1tLCBjdHgpOworCQllbWl0KHJ2X2JsdHUocmQsIFJWX1JFR19UMSwgcnZvZmYgPj4gMSks IGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0pNUCB8IEJQRl9KR0UgfCBCUEZfSzoKKwkJaWYg KHJ2X29mZnNldF9jaGVjaygmcnZvZmYsIG9mZiwgaSwgY3R4KSkKKwkJCXJldHVybiAtMTsKKwkJ ZW1pdF9pbW0oUlZfUkVHX1QxLCBpbW0sIGN0eCk7CisJCWVtaXQocnZfYmdldShyZCwgUlZfUkVH X1QxLCBydm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSk1QIHwgQlBGX0pM RSB8IEJQRl9LOgorCQlpZiAocnZfb2Zmc2V0X2NoZWNrKCZydm9mZiwgb2ZmLCBpLCBjdHgpKQor CQkJcmV0dXJuIC0xOworCQllbWl0X2ltbShSVl9SRUdfVDEsIGltbSwgY3R4KTsKKwkJZW1pdChy dl9iZ2V1KFJWX1JFR19UMSwgcmQsIHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsKKwljYXNl IEJQRl9KTVAgfCBCUEZfSk5FIHwgQlBGX0s6CisJCWlmIChydl9vZmZzZXRfY2hlY2soJnJ2b2Zm LCBvZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWVtaXRfaW1tKFJWX1JFR19UMSwgaW1t LCBjdHgpOworCQllbWl0KHJ2X2JuZShyZCwgUlZfUkVHX1QxLCBydm9mZiA+PiAxKSwgY3R4KTsK KwkJYnJlYWs7CisJY2FzZSBCUEZfSk1QIHwgQlBGX0pTR1QgfCBCUEZfSzoKKwkJaWYgKHJ2X29m ZnNldF9jaGVjaygmcnZvZmYsIG9mZiwgaSwgY3R4KSkKKwkJCXJldHVybiAtMTsKKwkJZW1pdF9p bW0oUlZfUkVHX1QxLCBpbW0sIGN0eCk7CisJCWVtaXQocnZfYmx0KFJWX1JFR19UMSwgcmQsIHJ2 b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9KTVAgfCBCUEZfSlNMVCB8IEJQ Rl9LOgorCQlpZiAocnZfb2Zmc2V0X2NoZWNrKCZydm9mZiwgb2ZmLCBpLCBjdHgpKQorCQkJcmV0 dXJuIC0xOworCQllbWl0X2ltbShSVl9SRUdfVDEsIGltbSwgY3R4KTsKKwkJZW1pdChydl9ibHQo cmQsIFJWX1JFR19UMSwgcnZvZmYgPj4gMSksIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0pN UCB8IEJQRl9KU0dFIHwgQlBGX0s6CisJCWlmIChydl9vZmZzZXRfY2hlY2soJnJ2b2ZmLCBvZmYs IGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWVtaXRfaW1tKFJWX1JFR19UMSwgaW1tLCBjdHgp OworCQllbWl0KHJ2X2JnZShyZCwgUlZfUkVHX1QxLCBydm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJl YWs7CisJY2FzZSBCUEZfSk1QIHwgQlBGX0pTTEUgfCBCUEZfSzoKKwkJaWYgKHJ2X29mZnNldF9j aGVjaygmcnZvZmYsIG9mZiwgaSwgY3R4KSkKKwkJCXJldHVybiAtMTsKKwkJZW1pdF9pbW0oUlZf UkVHX1QxLCBpbW0sIGN0eCk7CisJCWVtaXQocnZfYmdlKFJWX1JFR19UMSwgcmQsIHJ2b2ZmID4+ IDEpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9LOgor CQlpZiAocnZfb2Zmc2V0X2NoZWNrKCZydm9mZiwgb2ZmLCBpLCBjdHgpKQorCQkJcmV0dXJuIC0x OworCQllbWl0X2ltbShSVl9SRUdfVDIsIGltbSwgY3R4KTsKKwkJZW1pdChydl9hbmQoUlZfUkVH X1QxLCByZCwgUlZfUkVHX1QyKSwgY3R4KTsKKwkJZW1pdChydl9ibmUoUlZfUkVHX1QxLCBSVl9S RUdfWkVSTywgcnZvZmYgPj4gMSksIGN0eCk7CisJCWJyZWFrOworCisJLyogZnVuY3Rpb24gY2Fs bCAqLworCWNhc2UgQlBGX0pNUCB8IEJQRl9DQUxMOgorCXsKKwkJYm9vbCBmaXhlZDsKKwkJaW50 IGksIHJldDsKKwkJdTY0IGFkZHI7CisKKwkJbWFya19jYWxsKGN0eCk7CisJCXJldCA9IGJwZl9q aXRfZ2V0X2Z1bmNfYWRkcihjdHgtPnByb2csIGluc24sIGV4dHJhX3Bhc3MsICZhZGRyLAorCQkJ CQkgICAgJmZpeGVkKTsKKwkJaWYgKHJldCA8IDApCisJCQlyZXR1cm4gcmV0OworCQlpZiAoZml4 ZWQpIHsKKwkJCWVtaXRfaW1tKFJWX1JFR19UMSwgYWRkciwgY3R4KTsKKwkJfSBlbHNlIHsKKwkJ CWkgPSBjdHgtPm5pbnNuczsKKwkJCWVtaXRfaW1tKFJWX1JFR19UMSwgYWRkciwgY3R4KTsKKwkJ CWZvciAoaSA9IGN0eC0+bmluc25zIC0gaTsgaSA8IDg7IGkrKykgeworCQkJCS8qIG5vcCAqLwor CQkJCWVtaXQocnZfYWRkaShSVl9SRUdfWkVSTywgUlZfUkVHX1pFUk8sIDApLAorCQkJCSAgICAg Y3R4KTsKKwkJCX0KKwkJfQorCQllbWl0KHJ2X2phbHIoUlZfUkVHX1JBLCBSVl9SRUdfVDEsIDAp LCBjdHgpOworCQlyZCA9IGJwZl90b19ydl9yZWcoQlBGX1JFR18wLCBjdHgpOworCQllbWl0KHJ2 X2FkZGkocmQsIFJWX1JFR19BMCwgMCksIGN0eCk7CisJCWJyZWFrOworCX0KKwkvKiB0YWlsIGNh bGwgKi8KKwljYXNlIEJQRl9KTVAgfCBCUEZfVEFJTF9DQUxMOgorCQlpZiAoZW1pdF9icGZfdGFp bF9jYWxsKGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCisJLyogZnVuY3Rpb24g cmV0dXJuICovCisJY2FzZSBCUEZfSk1QIHwgQlBGX0VYSVQ6CisJCWlmIChpID09IGN0eC0+cHJv Zy0+bGVuIC0gMSkKKwkJCWJyZWFrOworCisJCXJ2b2ZmID0gZXBpbG9ndWVfb2Zmc2V0KGN0eCk7 CisJCWlmIChpc18yMWJfY2hlY2socnZvZmYsIGkpKQorCQkJcmV0dXJuIC0xOworCQllbWl0KHJ2 X2phbChSVl9SRUdfWkVSTywgcnZvZmYgPj4gMSksIGN0eCk7CisJCWJyZWFrOworCisJLyogZHN0 ID0gaW1tNjQgKi8KKwljYXNlIEJQRl9MRCB8IEJQRl9JTU0gfCBCUEZfRFc6CisJeworCQlzdHJ1 Y3QgYnBmX2luc24gaW5zbjEgPSBpbnNuWzFdOworCQl1NjQgaW1tNjQ7CisKKwkJaW1tNjQgPSAo dTY0KWluc24xLmltbSA8PCAzMiB8ICh1MzIpaW1tOworCQllbWl0X2ltbShyZCwgaW1tNjQsIGN0 eCk7CisJCXJldHVybiAxOworCX0KKworCS8qIExEWDogZHN0ID0gKihzaXplICopKHNyYyArIG9m ZikgKi8KKwljYXNlIEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX0I6CisJCWlmIChpc18xMmJfaW50 KG9mZikpIHsKKwkJCWVtaXQocnZfbGJ1KHJkLCBvZmYsIHJzKSwgY3R4KTsKKwkJCWJyZWFrOwor CQl9CisKKwkJZW1pdF9pbW0oUlZfUkVHX1QxLCBvZmYsIGN0eCk7CisJCWVtaXQocnZfYWRkKFJW X1JFR19UMSwgUlZfUkVHX1QxLCBycyksIGN0eCk7CisJCWVtaXQocnZfbGJ1KHJkLCAwLCBSVl9S RUdfVDEpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX0g6 CisJCWlmIChpc18xMmJfaW50KG9mZikpIHsKKwkJCWVtaXQocnZfbGh1KHJkLCBvZmYsIHJzKSwg Y3R4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJZW1pdF9pbW0oUlZfUkVHX1QxLCBvZmYsIGN0eCk7 CisJCWVtaXQocnZfYWRkKFJWX1JFR19UMSwgUlZfUkVHX1QxLCBycyksIGN0eCk7CisJCWVtaXQo cnZfbGh1KHJkLCAwLCBSVl9SRUdfVDEpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9MRFgg fCBCUEZfTUVNIHwgQlBGX1c6CisJCWlmIChpc18xMmJfaW50KG9mZikpIHsKKwkJCWVtaXQocnZf bHd1KHJkLCBvZmYsIHJzKSwgY3R4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJZW1pdF9pbW0oUlZf UkVHX1QxLCBvZmYsIGN0eCk7CisJCWVtaXQocnZfYWRkKFJWX1JFR19UMSwgUlZfUkVHX1QxLCBy cyksIGN0eCk7CisJCWVtaXQocnZfbHd1KHJkLCAwLCBSVl9SRUdfVDEpLCBjdHgpOworCQlicmVh azsKKwljYXNlIEJQRl9MRFggfCBCUEZfTUVNIHwgQlBGX0RXOgorCQlpZiAoaXNfMTJiX2ludChv ZmYpKSB7CisJCQllbWl0KHJ2X2xkKHJkLCBvZmYsIHJzKSwgY3R4KTsKKwkJCWJyZWFrOworCQl9 CisKKwkJZW1pdF9pbW0oUlZfUkVHX1QxLCBvZmYsIGN0eCk7CisJCWVtaXQocnZfYWRkKFJWX1JF R19UMSwgUlZfUkVHX1QxLCBycyksIGN0eCk7CisJCWVtaXQocnZfbGQocmQsIDAsIFJWX1JFR19U MSksIGN0eCk7CisJCWJyZWFrOworCisJLyogU1Q6ICooc2l6ZSAqKShkc3QgKyBvZmYpID0gaW1t ICovCisJY2FzZSBCUEZfU1QgfCBCUEZfTUVNIHwgQlBGX0I6CisJCWVtaXRfaW1tKFJWX1JFR19U MSwgaW1tLCBjdHgpOworCQlpZiAoaXNfMTJiX2ludChvZmYpKSB7CisJCQllbWl0KHJ2X3NiKHJk LCBvZmYsIFJWX1JFR19UMSksIGN0eCk7CisJCQlicmVhazsKKwkJfQorCisJCWVtaXRfaW1tKFJW X1JFR19UMiwgb2ZmLCBjdHgpOworCQllbWl0KHJ2X2FkZChSVl9SRUdfVDIsIFJWX1JFR19UMiwg cmQpLCBjdHgpOworCQllbWl0KHJ2X3NiKFJWX1JFR19UMiwgMCwgUlZfUkVHX1QxKSwgY3R4KTsK KwkJYnJlYWs7CisKKwljYXNlIEJQRl9TVCB8IEJQRl9NRU0gfCBCUEZfSDoKKwkJZW1pdF9pbW0o UlZfUkVHX1QxLCBpbW0sIGN0eCk7CisJCWlmIChpc18xMmJfaW50KG9mZikpIHsKKwkJCWVtaXQo cnZfc2gocmQsIG9mZiwgUlZfUkVHX1QxKSwgY3R4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJZW1p dF9pbW0oUlZfUkVHX1QyLCBvZmYsIGN0eCk7CisJCWVtaXQocnZfYWRkKFJWX1JFR19UMiwgUlZf UkVHX1QyLCByZCksIGN0eCk7CisJCWVtaXQocnZfc2goUlZfUkVHX1QyLCAwLCBSVl9SRUdfVDEp LCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9TVCB8IEJQRl9NRU0gfCBCUEZfVzoKKwkJZW1p dF9pbW0oUlZfUkVHX1QxLCBpbW0sIGN0eCk7CisJCWlmIChpc18xMmJfaW50KG9mZikpIHsKKwkJ CWVtaXQocnZfc3cocmQsIG9mZiwgUlZfUkVHX1QxKSwgY3R4KTsKKwkJCWJyZWFrOworCQl9CisK KwkJZW1pdF9pbW0oUlZfUkVHX1QyLCBvZmYsIGN0eCk7CisJCWVtaXQocnZfYWRkKFJWX1JFR19U MiwgUlZfUkVHX1QyLCByZCksIGN0eCk7CisJCWVtaXQocnZfc3coUlZfUkVHX1QyLCAwLCBSVl9S RUdfVDEpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9TVCB8IEJQRl9NRU0gfCBCUEZfRFc6 CisJCWVtaXRfaW1tKFJWX1JFR19UMSwgaW1tLCBjdHgpOworCQlpZiAoaXNfMTJiX2ludChvZmYp KSB7CisJCQllbWl0KHJ2X3NkKHJkLCBvZmYsIFJWX1JFR19UMSksIGN0eCk7CisJCQlicmVhazsK KwkJfQorCisJCWVtaXRfaW1tKFJWX1JFR19UMiwgb2ZmLCBjdHgpOworCQllbWl0KHJ2X2FkZChS Vl9SRUdfVDIsIFJWX1JFR19UMiwgcmQpLCBjdHgpOworCQllbWl0KHJ2X3NkKFJWX1JFR19UMiwg MCwgUlZfUkVHX1QxKSwgY3R4KTsKKwkJYnJlYWs7CisKKwkvKiBTVFg6ICooc2l6ZSAqKShkc3Qg KyBvZmYpID0gc3JjICovCisJY2FzZSBCUEZfU1RYIHwgQlBGX01FTSB8IEJQRl9COgorCQlpZiAo aXNfMTJiX2ludChvZmYpKSB7CisJCQllbWl0KHJ2X3NiKHJkLCBvZmYsIHJzKSwgY3R4KTsKKwkJ CWJyZWFrOworCQl9CisKKwkJZW1pdF9pbW0oUlZfUkVHX1QxLCBvZmYsIGN0eCk7CisJCWVtaXQo cnZfYWRkKFJWX1JFR19UMSwgUlZfUkVHX1QxLCByZCksIGN0eCk7CisJCWVtaXQocnZfc2IoUlZf UkVHX1QxLCAwLCBycyksIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX1NUWCB8IEJQRl9NRU0g fCBCUEZfSDoKKwkJaWYgKGlzXzEyYl9pbnQob2ZmKSkgeworCQkJZW1pdChydl9zaChyZCwgb2Zm LCBycyksIGN0eCk7CisJCQlicmVhazsKKwkJfQorCisJCWVtaXRfaW1tKFJWX1JFR19UMSwgb2Zm LCBjdHgpOworCQllbWl0KHJ2X2FkZChSVl9SRUdfVDEsIFJWX1JFR19UMSwgcmQpLCBjdHgpOwor CQllbWl0KHJ2X3NoKFJWX1JFR19UMSwgMCwgcnMpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQ Rl9TVFggfCBCUEZfTUVNIHwgQlBGX1c6CisJCWlmIChpc18xMmJfaW50KG9mZikpIHsKKwkJCWVt aXQocnZfc3cocmQsIG9mZiwgcnMpLCBjdHgpOworCQkJYnJlYWs7CisJCX0KKworCQllbWl0X2lt bShSVl9SRUdfVDEsIG9mZiwgY3R4KTsKKwkJZW1pdChydl9hZGQoUlZfUkVHX1QxLCBSVl9SRUdf VDEsIHJkKSwgY3R4KTsKKwkJZW1pdChydl9zdyhSVl9SRUdfVDEsIDAsIHJzKSwgY3R4KTsKKwkJ YnJlYWs7CisJY2FzZSBCUEZfU1RYIHwgQlBGX01FTSB8IEJQRl9EVzoKKwkJaWYgKGlzXzEyYl9p bnQob2ZmKSkgeworCQkJZW1pdChydl9zZChyZCwgb2ZmLCBycyksIGN0eCk7CisJCQlicmVhazsK KwkJfQorCisJCWVtaXRfaW1tKFJWX1JFR19UMSwgb2ZmLCBjdHgpOworCQllbWl0KHJ2X2FkZChS Vl9SRUdfVDEsIFJWX1JFR19UMSwgcmQpLCBjdHgpOworCQllbWl0KHJ2X3NkKFJWX1JFR19UMSwg MCwgcnMpLCBjdHgpOworCQlicmVhazsKKwkvKiBTVFggWEFERDogbG9jayAqKHUzMiAqKShkc3Qg KyBvZmYpICs9IHNyYyAqLworCWNhc2UgQlBGX1NUWCB8IEJQRl9YQUREIHwgQlBGX1c6CisJLyog U1RYIFhBREQ6IGxvY2sgKih1NjQgKikoZHN0ICsgb2ZmKSArPSBzcmMgKi8KKwljYXNlIEJQRl9T VFggfCBCUEZfWEFERCB8IEJQRl9EVzoKKwkJaWYgKG9mZikgeworCQkJaWYgKGlzXzEyYl9pbnQo b2ZmKSkgeworCQkJCWVtaXQocnZfYWRkaShSVl9SRUdfVDEsIHJkLCBvZmYpLCBjdHgpOworCQkJ fSBlbHNlIHsKKwkJCQllbWl0X2ltbShSVl9SRUdfVDEsIG9mZiwgY3R4KTsKKwkJCQllbWl0KHJ2 X2FkZChSVl9SRUdfVDEsIFJWX1JFR19UMSwgcmQpLCBjdHgpOworCQkJfQorCisJCQlyZCA9IFJW X1JFR19UMTsKKwkJfQorCisJCWVtaXQoQlBGX1NJWkUoY29kZSkgPT0gQlBGX1cgPworCQkgICAg IHJ2X2Ftb2FkZF93KFJWX1JFR19aRVJPLCBycywgcmQsIDAsIDApIDoKKwkJICAgICBydl9hbW9h ZGRfZChSVl9SRUdfWkVSTywgcnMsIHJkLCAwLCAwKSwgY3R4KTsKKwkJYnJlYWs7CisJZGVmYXVs dDoKKwkJcHJfZXJyKCJicGYtaml0OiB1bmtub3duIG9wY29kZSAlMDJ4XG4iLCBjb2RlKTsKKwkJ cmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxk X3Byb2xvZ3VlKHN0cnVjdCBydl9qaXRfY29udGV4dCAqY3R4KQoreworCWludCBzdGFja19hZGp1 c3QgPSAwLCBzdG9yZV9vZmZzZXQsIGJwZl9zdGFja19hZGp1c3Q7CisKKwlpZiAoc2Vlbl9yZWco UlZfUkVHX1JBLCBjdHgpKQorCQlzdGFja19hZGp1c3QgKz0gODsKKwlzdGFja19hZGp1c3QgKz0g ODsgLyogUlZfUkVHX0ZQICovCisJaWYgKHNlZW5fcmVnKFJWX1JFR19TMSwgY3R4KSkKKwkJc3Rh Y2tfYWRqdXN0ICs9IDg7CisJaWYgKHNlZW5fcmVnKFJWX1JFR19TMiwgY3R4KSkKKwkJc3RhY2tf YWRqdXN0ICs9IDg7CisJaWYgKHNlZW5fcmVnKFJWX1JFR19TMywgY3R4KSkKKwkJc3RhY2tfYWRq dXN0ICs9IDg7CisJaWYgKHNlZW5fcmVnKFJWX1JFR19TNCwgY3R4KSkKKwkJc3RhY2tfYWRqdXN0 ICs9IDg7CisJaWYgKHNlZW5fcmVnKFJWX1JFR19TNSwgY3R4KSkKKwkJc3RhY2tfYWRqdXN0ICs9 IDg7CisJaWYgKHNlZW5fcmVnKFJWX1JFR19TNiwgY3R4KSkKKwkJc3RhY2tfYWRqdXN0ICs9IDg7 CisKKwlzdGFja19hZGp1c3QgPSByb3VuZF91cChzdGFja19hZGp1c3QsIDE2KTsKKwlicGZfc3Rh Y2tfYWRqdXN0ID0gcm91bmRfdXAoY3R4LT5wcm9nLT5hdXgtPnN0YWNrX2RlcHRoLCAxNik7CisJ c3RhY2tfYWRqdXN0ICs9IGJwZl9zdGFja19hZGp1c3Q7CisKKwlzdG9yZV9vZmZzZXQgPSBzdGFj a19hZGp1c3QgLSA4OworCisJLyogRmlyc3QgaW5zdHJ1Y3Rpb24gaXMgYWx3YXlzIHNldHRpbmcg dGhlIHRhaWwtY2FsbC1jb3VudGVyCisJICogKFRDQykgcmVnaXN0ZXIuIFRoaXMgaW5zdHJ1Y3Rp b24gaXMgc2tpcHBlZCBmb3IgdGFpbCBjYWxscy4KKwkgKi8KKwllbWl0KHJ2X2FkZGkoUlZfUkVH X1RDQywgUlZfUkVHX1pFUk8sIE1BWF9UQUlMX0NBTExfQ05UKSwgY3R4KTsKKworCWVtaXQocnZf YWRkaShSVl9SRUdfU1AsIFJWX1JFR19TUCwgLXN0YWNrX2FkanVzdCksIGN0eCk7CisKKwlpZiAo c2Vlbl9yZWcoUlZfUkVHX1JBLCBjdHgpKSB7CisJCWVtaXQocnZfc2QoUlZfUkVHX1NQLCBzdG9y ZV9vZmZzZXQsIFJWX1JFR19SQSksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwll bWl0KHJ2X3NkKFJWX1JFR19TUCwgc3RvcmVfb2Zmc2V0LCBSVl9SRUdfRlApLCBjdHgpOworCXN0 b3JlX29mZnNldCAtPSA4OworCWlmIChzZWVuX3JlZyhSVl9SRUdfUzEsIGN0eCkpIHsKKwkJZW1p dChydl9zZChSVl9SRUdfU1AsIHN0b3JlX29mZnNldCwgUlZfUkVHX1MxKSwgY3R4KTsKKwkJc3Rv cmVfb2Zmc2V0IC09IDg7CisJfQorCWlmIChzZWVuX3JlZyhSVl9SRUdfUzIsIGN0eCkpIHsKKwkJ ZW1pdChydl9zZChSVl9SRUdfU1AsIHN0b3JlX29mZnNldCwgUlZfUkVHX1MyKSwgY3R4KTsKKwkJ c3RvcmVfb2Zmc2V0IC09IDg7CisJfQorCWlmIChzZWVuX3JlZyhSVl9SRUdfUzMsIGN0eCkpIHsK KwkJZW1pdChydl9zZChSVl9SRUdfU1AsIHN0b3JlX29mZnNldCwgUlZfUkVHX1MzKSwgY3R4KTsK KwkJc3RvcmVfb2Zmc2V0IC09IDg7CisJfQorCWlmIChzZWVuX3JlZyhSVl9SRUdfUzQsIGN0eCkp IHsKKwkJZW1pdChydl9zZChSVl9SRUdfU1AsIHN0b3JlX29mZnNldCwgUlZfUkVHX1M0KSwgY3R4 KTsKKwkJc3RvcmVfb2Zmc2V0IC09IDg7CisJfQorCWlmIChzZWVuX3JlZyhSVl9SRUdfUzUsIGN0 eCkpIHsKKwkJZW1pdChydl9zZChSVl9SRUdfU1AsIHN0b3JlX29mZnNldCwgUlZfUkVHX1M1KSwg Y3R4KTsKKwkJc3RvcmVfb2Zmc2V0IC09IDg7CisJfQorCWlmIChzZWVuX3JlZyhSVl9SRUdfUzYs IGN0eCkpIHsKKwkJZW1pdChydl9zZChSVl9SRUdfU1AsIHN0b3JlX29mZnNldCwgUlZfUkVHX1M2 KSwgY3R4KTsKKwkJc3RvcmVfb2Zmc2V0IC09IDg7CisJfQorCisJZW1pdChydl9hZGRpKFJWX1JF R19GUCwgUlZfUkVHX1NQLCBzdGFja19hZGp1c3QpLCBjdHgpOworCisJaWYgKGJwZl9zdGFja19h ZGp1c3QpCisJCWVtaXQocnZfYWRkaShSVl9SRUdfUzUsIFJWX1JFR19TUCwgYnBmX3N0YWNrX2Fk anVzdCksIGN0eCk7CisKKwkvKiBQcm9ncmFtIGNvbnRhaW5zIGNhbGxzIGFuZCB0YWlsIGNhbGxz LCBzbyBSVl9SRUdfVENDIG5lZWQKKwkgKiB0byBiZSBzYXZlZCBhY3Jvc3MgY2FsbHMuCisJICov CisJaWYgKHNlZW5fdGFpbF9jYWxsKGN0eCkgJiYgc2Vlbl9jYWxsKGN0eCkpCisJCWVtaXQocnZf YWRkaShSVl9SRUdfVENDX1NBVkVELCBSVl9SRUdfVENDLCAwKSwgY3R4KTsKKworCWN0eC0+c3Rh Y2tfc2l6ZSA9IHN0YWNrX2FkanVzdDsKK30KKworc3RhdGljIHZvaWQgYnVpbGRfZXBpbG9ndWUo c3RydWN0IHJ2X2ppdF9jb250ZXh0ICpjdHgpCit7CisJX19idWlsZF9lcGlsb2d1ZShSVl9SRUdf UkEsIGN0eCk7Cit9CisKK3N0YXRpYyBpbnQgYnVpbGRfYm9keShzdHJ1Y3QgcnZfaml0X2NvbnRl eHQgKmN0eCwgYm9vbCBleHRyYV9wYXNzKQoreworCWNvbnN0IHN0cnVjdCBicGZfcHJvZyAqcHJv ZyA9IGN0eC0+cHJvZzsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBwcm9nLT5sZW47IGkr KykgeworCQljb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc24gPSAmcHJvZy0+aW5zbnNpW2ldOwor CQlpbnQgcmV0OworCisJCXJldCA9IGVtaXRfaW5zbihpbnNuLCBjdHgsIGV4dHJhX3Bhc3MpOwor CQlpZiAocmV0ID4gMCkgeworCQkJaSsrOworCQkJaWYgKGN0eC0+aW5zbnMgPT0gTlVMTCkKKwkJ CQljdHgtPm9mZnNldFtpXSA9IGN0eC0+bmluc25zOworCQkJY29udGludWU7CisJCX0KKwkJaWYg KGN0eC0+aW5zbnMgPT0gTlVMTCkKKwkJCWN0eC0+b2Zmc2V0W2ldID0gY3R4LT5uaW5zbnM7CisJ CWlmIChyZXQpCisJCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZv aWQgYnBmX2ZpbGxfaWxsX2luc25zKHZvaWQgKmFyZWEsIHVuc2lnbmVkIGludCBzaXplKQorewor CW1lbXNldChhcmVhLCAwLCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgYnBmX2ZsdXNoX2ljYWNo ZSh2b2lkICpzdGFydCwgdm9pZCAqZW5kKQoreworCWZsdXNoX2ljYWNoZV9yYW5nZSgodW5zaWdu ZWQgbG9uZylzdGFydCwgKHVuc2lnbmVkIGxvbmcpZW5kKTsKK30KKworc3RydWN0IGJwZl9wcm9n ICpicGZfaW50X2ppdF9jb21waWxlKHN0cnVjdCBicGZfcHJvZyAqcHJvZykKK3sKKwlib29sIHRt cF9ibGluZGVkID0gZmFsc2UsIGV4dHJhX3Bhc3MgPSBmYWxzZTsKKwlzdHJ1Y3QgYnBmX3Byb2cg KnRtcCwgKm9yaWdfcHJvZyA9IHByb2c7CisJc3RydWN0IHJ2X2ppdF9kYXRhICpqaXRfZGF0YTsK KwlzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eDsKKwl1bnNpZ25lZCBpbnQgaW1hZ2Vfc2l6ZTsK KworCWlmICghcHJvZy0+aml0X3JlcXVlc3RlZCkKKwkJcmV0dXJuIG9yaWdfcHJvZzsKKworCXRt cCA9IGJwZl9qaXRfYmxpbmRfY29uc3RhbnRzKHByb2cpOworCWlmIChJU19FUlIodG1wKSkKKwkJ cmV0dXJuIG9yaWdfcHJvZzsKKwlpZiAodG1wICE9IHByb2cpIHsKKwkJdG1wX2JsaW5kZWQgPSB0 cnVlOworCQlwcm9nID0gdG1wOworCX0KKworCWppdF9kYXRhID0gcHJvZy0+YXV4LT5qaXRfZGF0 YTsKKwlpZiAoIWppdF9kYXRhKSB7CisJCWppdF9kYXRhID0ga3phbGxvYyhzaXplb2YoKmppdF9k YXRhKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghaml0X2RhdGEpIHsKKwkJCXByb2cgPSBvcmlnX3By b2c7CisJCQlnb3RvIG91dDsKKwkJfQorCQlwcm9nLT5hdXgtPmppdF9kYXRhID0gaml0X2RhdGE7 CisJfQorCisJY3R4ID0gJmppdF9kYXRhLT5jdHg7CisKKwlpZiAoY3R4LT5vZmZzZXQpIHsKKwkJ ZXh0cmFfcGFzcyA9IHRydWU7CisJCWltYWdlX3NpemUgPSBzaXplb2YodTMyKSAqIGN0eC0+bmlu c25zOworCQlnb3RvIHNraXBfaW5pdF9jdHg7CisJfQorCisJY3R4LT5wcm9nID0gcHJvZzsKKwlj dHgtPm9mZnNldCA9IGtjYWxsb2MocHJvZy0+bGVuLCBzaXplb2YoaW50KSwgR0ZQX0tFUk5FTCk7 CisJaWYgKCFjdHgtPm9mZnNldCkgeworCQlwcm9nID0gb3JpZ19wcm9nOworCQlnb3RvIG91dF9v ZmZzZXQ7CisJfQorCisJLyogRmlyc3QgcGFzcyBnZW5lcmF0ZXMgdGhlIGN0eC0+b2Zmc2V0LCBi dXQgZG9lcyBub3QgZW1pdCBhbiBpbWFnZS4gKi8KKwlpZiAoYnVpbGRfYm9keShjdHgsIGV4dHJh X3Bhc3MpKSB7CisJCXByb2cgPSBvcmlnX3Byb2c7CisJCWdvdG8gb3V0X29mZnNldDsKKwl9CisJ YnVpbGRfcHJvbG9ndWUoY3R4KTsKKwljdHgtPmVwaWxvZ3VlX29mZnNldCA9IGN0eC0+bmluc25z OworCWJ1aWxkX2VwaWxvZ3VlKGN0eCk7CisKKwkvKiBBbGxvY2F0ZSBpbWFnZSwgbm93IHRoYXQg d2Uga25vdyB0aGUgc2l6ZS4gKi8KKwlpbWFnZV9zaXplID0gc2l6ZW9mKHUzMikgKiBjdHgtPm5p bnNuczsKKwlqaXRfZGF0YS0+aGVhZGVyID0gYnBmX2ppdF9iaW5hcnlfYWxsb2MoaW1hZ2Vfc2l6 ZSwgJmppdF9kYXRhLT5pbWFnZSwKKwkJCQkJCXNpemVvZih1MzIpLAorCQkJCQkJYnBmX2ZpbGxf aWxsX2luc25zKTsKKwlpZiAoIWppdF9kYXRhLT5oZWFkZXIpIHsKKwkJcHJvZyA9IG9yaWdfcHJv ZzsKKwkJZ290byBvdXRfb2Zmc2V0OworCX0KKworCS8qIFNlY29uZCwgcmVhbCBwYXNzLCB0aGF0 IGFjdXRhbGx5IGVtaXRzIHRoZSBpbWFnZS4gKi8KKwljdHgtPmluc25zID0gKHUzMiAqKWppdF9k YXRhLT5pbWFnZTsKK3NraXBfaW5pdF9jdHg6CisJY3R4LT5uaW5zbnMgPSAwOworCisJYnVpbGRf cHJvbG9ndWUoY3R4KTsKKwlpZiAoYnVpbGRfYm9keShjdHgsIGV4dHJhX3Bhc3MpKSB7CisJCWJw Zl9qaXRfYmluYXJ5X2ZyZWUoaml0X2RhdGEtPmhlYWRlcik7CisJCXByb2cgPSBvcmlnX3Byb2c7 CisJCWdvdG8gb3V0X29mZnNldDsKKwl9CisJYnVpbGRfZXBpbG9ndWUoY3R4KTsKKworCWlmIChi cGZfaml0X2VuYWJsZSA+IDEpCisJCWJwZl9qaXRfZHVtcChwcm9nLT5sZW4sIGltYWdlX3NpemUs IDIsIGN0eC0+aW5zbnMpOworCisJcHJvZy0+YnBmX2Z1bmMgPSAodm9pZCAqKWN0eC0+aW5zbnM7 CisJcHJvZy0+aml0ZWQgPSAxOworCXByb2ctPmppdGVkX2xlbiA9IGltYWdlX3NpemU7CisKKwli cGZfZmx1c2hfaWNhY2hlKGppdF9kYXRhLT5oZWFkZXIsICh1OCAqKWN0eC0+aW5zbnMgKyBjdHgt Pm5pbnNucyk7CisKKwlpZiAoIXByb2ctPmlzX2Z1bmMgfHwgZXh0cmFfcGFzcykgeworb3V0X29m ZnNldDoKKwkJa2ZyZWUoY3R4LT5vZmZzZXQpOworCQlrZnJlZShqaXRfZGF0YSk7CisJCXByb2ct PmF1eC0+aml0X2RhdGEgPSBOVUxMOworCX0KK291dDoKKwlpZiAodG1wX2JsaW5kZWQpCisJCWJw Zl9qaXRfcHJvZ19yZWxlYXNlX290aGVyKHByb2csIHByb2cgPT0gb3JpZ19wcm9nID8KKwkJCQkJ ICAgdG1wIDogb3JpZ19wcm9nKTsKKwlyZXR1cm4gcHJvZzsKK30KLS0gCjIuMTkuMQoKCl9fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LXJpc2N2IG1h aWxpbmcgbGlzdApsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5p bmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcmlzY3YK