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=-9.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,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 3B67FC282CB for ; Tue, 5 Feb 2019 12:51:57 +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 033C120844 for ; Tue, 5 Feb 2019 12:51:57 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="n6Tq7lxN"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="mZwd4Am7"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="rXaTBS6d" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 033C120844 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=Ia1zm8TvRlOCEOBik8+HD1Sr0xxJs71krtvnhN05gwI=; b=n6Tq7lxNjKMJK/ MQ1JELbXl0YPQEEpTZITYfa+glt+tNGCOa1JI9RWcooLJEd8uR7w7ONCpz56XhDBipSZBUuJoKVSJ 2yLUYT66CeVwlidgQFeLT7m9unffd8w82zsx8zXzLCrvzkkF/LyM6haYs3w3ZZyy5XtJBPEBS5mn8 dx1YCKGv7JH0hgpemvHJllSDKONV/yDshPbD84sp3UdtHw47/dG0JnoFLmdLjLFAmupIRWc1ly7aZ ZW4krOwGtUJdng+quKjYMsjnUO9M+Dz7VwXkGHCuAIMs93/wXRKdFmTPva3hVu+vSSAhl74I9DXA0 UyjV3WS3Y3bLSDGtYgbw==; 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 1gr0Ci-0008R4-2c; Tue, 05 Feb 2019 12:51:56 +0000 Received: from merlin.infradead.org ([2001:8b0:10b:1231::1]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gr03I-0003PB-Q6 for linux-riscv@bombadil.infradead.org; Tue, 05 Feb 2019 12:42:13 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=merlin.20170209; h=Content-Transfer-Encoding:Content-Type: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-ID:Content-Description:Resent-Date:Resent-From: Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=omw1ZsBIeWFMQ/sUYvzF/hZcRvtGgsOWtM1JHxuMFRY=; b=mZwd4Am71BNA+jMXf3hGudc0ln ijiMJz0Et2DIOsjU+nLdW7NQNZGKFHXbfssBx+KsFDgUp8vX1PrYziHeZnqQg6SoowjuTM3hgn+22 BcfoIO634+KL16fmdBorWiMyHdEhD9BtLb9GoNTDDnfC1nIrcJ6cRs+JiAVJuPM/OQ/JxWNaeqHHC BTg9hUEfQBehOCvjBdqhDpnPZbG3uU2Xnn+PxwjgSlju2e9ErkcIpLxsqhOC0l4Damjc3rDv4cDfl tK638cfy+q7AsgC2AHvpi6UCOLXY/tMJYk0nySXBKAa7euLY8ln6mnAwdWrsMt3O2C141jBDrRgsj bMkBnxvw==; Received: from mail-pl1-x643.google.com ([2607:f8b0:4864:20::643]) by merlin.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1gr03E-0003qa-SV for linux-riscv@lists.infradead.org; Tue, 05 Feb 2019 12:42:10 +0000 Received: by mail-pl1-x643.google.com with SMTP id p8so1436249plo.2 for ; Tue, 05 Feb 2019 04:42:06 -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=omw1ZsBIeWFMQ/sUYvzF/hZcRvtGgsOWtM1JHxuMFRY=; b=rXaTBS6dS/ILZaqKAzo+aYGqRAAjEaEPFsZvI3MKVqar0Jvz17X1m90QQ7X43sYKo9 pHvrOBpXXIuAs0HFv+ZUx3OtDRb5qJxlOCMsteyMTgPPInsy93RhyTeCPNyBMFnjimyD Cujc+NbmLASFk27ndpzx8kJ4eHvVUdLTjoqA26Er+AOQHLSpQNf9fjQVlQCpAxDZj1aw fQgJX18kK5dR56YQuP4RqSDiDxJEHhHUvAPPgsYQ3Q2ZmFHiq2vfxD8TmXFQqF+gI3Ua gLeJcTgf+0sCEu2tVsBVbSZWoC3ovJRKUT0OBkTiMIgA32QzKOE1e18vSUvCyPML+Xqm 8YCA== 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=omw1ZsBIeWFMQ/sUYvzF/hZcRvtGgsOWtM1JHxuMFRY=; b=q8OkS5/IKzuOpHjeYmnsMWorlLIKf4X7VWq3IaqbnGOZpPPQXKBkMk4uVAMOONZ3jH 1tBXId3VNLNH96ADGxYh/f77Zp+aCo04UQFM3VlOqg7GP2u2z4dbyGuO4xIhhST3CZg/ viWEJCA+PE/MsLL6bdI+XNR2wQCbe/E6X232PP6TS9pdUCiSoOvdTBvjyjPtNHp7WqmC I8LnwljEwXBHrDF9Bp8j3uGLpusw49tYY1ESlYdMl1/y3QI493elxXHFEAsi7tAn4h6H 0zbzK/BIyFTtKUZVXiDSQ+gAoOH3/6ZAsmgVzDACQg8DqdL7VScKGtwv+HNg6YnTaQPa Y/HA== X-Gm-Message-State: AHQUAuaox7eqnDpNLTXNSAfA9KcNWDaw9x/L+wqmGsbY/Qr68zfl+tG0 2lkILL6mh/sJzdUwH4jcGrgMnziy3zikbg== X-Google-Smtp-Source: AHgI3IZoGwV9s+UnYGLn3+obrlCvQXSGRE70ROe51+Sn1aDQYbqHd7WfizbjANAlVV+iV6ERHRwPug== X-Received: by 2002:a17:902:29ab:: with SMTP id h40mr4940658plb.238.1549370523496; Tue, 05 Feb 2019 04:42:03 -0800 (PST) Received: from btopel-mobl.ger.intel.com (jfdmzpr04-ext.jf.intel.com. [134.134.139.73]) by smtp.gmail.com with ESMTPSA id g6sm5116774pgq.18.2019.02.05.04.41.58 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 05 Feb 2019 04:42:02 -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 v2 1/4] bpf, riscv: add BPF JIT for RV64G Date: Tue, 5 Feb 2019 13:41:22 +0100 Message-Id: <20190205124125.5553-2-bjorn.topel@gmail.com> X-Mailer: git-send-email 2.19.1 In-Reply-To: <20190205124125.5553-1-bjorn.topel@gmail.com> References: <20190205124125.5553-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-20190205_074208_961558_10775E0E X-CRM114-Status: GOOD ( 20.37 ) 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 YWRkcyBhIEJQRiBKSVQgZm9yIFJWNjRHLgoKVGhlIEpJVCBpcyBhIHR3by1wYXNzIEpJVCwgYW5k IGhhcyBhIGR5bmFtaWMgcHJvbG9nL2VwaWxvZ3VlIChzaW1pbGFyCnRvIHRoZSBNSVBTNjQgQlBG IEpJVCkgaW5zdGVhZCBvZiBzdGF0aWMgb25lcyAoZS5nLiB4ODZfNjQpLgoKQXQgdGhlIG1vbWVu dCB0aGUgUklTQy1WIExpbnV4IHBvcnQgZG9lcyBub3Qgc3VwcG9ydApDT05GSUdfSEFWRV9LUFJP QkVTLCB3aGljaCBtZWFucyB0aGF0IENPTkZJR19CUEZfRVZFTlRTIGlzIG5vdApzdXBwb3J0ZWQu IFRodXMsIG5vIHRlc3RzIGludm9sdmluZyBCUEZfUFJPR19UWVBFX1RSQUNFUE9JTlQsCkJQRl9Q Uk9HX1RZUEVfUEVSRl9FVkVOVCwgQlBGX1BST0dfVFlQRV9LUFJPQkUgYW5kCkJQRl9QUk9HX1RZ UEVfUkFXX1RSQUNFUE9JTlQgcGFzc2VzLgoKVGhlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1 cHBvcnQgImZhciBicmFuY2hpbmciICg+NEtpQikuCgpUZXN0IHJlc3VsdHM6CiAgIyBtb2Rwcm9i ZSB0ZXN0X2JwZgogIHRlc3RfYnBmOiBTdW1tYXJ5OiAzNzggUEFTU0VELCAwIEZBSUxFRCwgWzM2 Ni8zNjYgSklUJ2VkXQoKICAjIGVjaG8gMSA+IC9wcm9jL3N5cy9rZXJuZWwvdW5wcml2aWxlZ2Vk X2JwZl9kaXNhYmxlZAogICMgLi90ZXN0X3ZlcmlmaWVyCiAgLi4uCiAgU3VtbWFyeTogNzYxIFBB U1NFRCwgNTA3IFNLSVBQRUQsIDIgRkFJTEVECgpOb3RlIHRoYXQgInRlc3RfdmVyaWZpZXIiIHdh cyBydW4gd2l0aCBvbmUgYnVpbGQgd2l0aApDT05GSUdfSEFWRV9FRkZJQ0lFTlRfVU5BTElHTkVE X0FDQ0VTUz15IGFuZCBvbmUgd2l0aG91dCwgb3RoZXJ3aXNlCm1hbnkgb2YgdGhlIHRoZSB0ZXN0 cyB0aGF0IHJlcXVpcmUgdW5hbGlnbmVkIGFjY2VzcyB3ZXJlIHNraXBwZWQuCgpDT05GSUdfSEFW RV9FRkZJQ0lFTlRfVU5BTElHTkVEX0FDQ0VTUz15OgogICMgZWNobyAxID4gL3Byb2Mvc3lzL2tl cm5lbC91bnByaXZpbGVnZWRfYnBmX2Rpc2FibGVkCiAgIyAuL3Rlc3RfdmVyaWZpZXIgfCBncmVw IC1jICdOT1RFLip1bmtub3duIGFsaWduJwogIDAKCk5vIENPTkZJR19IQVZFX0VGRklDSUVOVF9V TkFMSUdORURfQUNDRVNTOgogICMgZWNobyAxID4gL3Byb2Mvc3lzL2tlcm5lbC91bnByaXZpbGVn ZWRfYnBmX2Rpc2FibGVkCiAgIyAuL3Rlc3RfdmVyaWZpZXIgfCBncmVwIC1jICdOT1RFLip1bmtu b3duIGFsaWduJwogIDU5CgpUaGUgdHdvIGZhaWxpbmcgdGVzdF92ZXJpZmllciB0ZXN0cyBhcmU6 CiAgImxkX2FiczogdmxhbiArIGFicywgdGVzdCAxIgogICJsZF9hYnM6IGp1bXAgYXJvdW5kIGxk X2FicyIKClRoaXMgaXMgZHVlIHRvIHRoYXQgImZhciBicmFuY2hpbmciIGludm9sdmVkIGluIHRo b3NlIHRlc3RzLgoKQWxsIHRlc3RzIHdoZXJlIGRvbmUgb24gUUVNVSAoUUVNVSBlbXVsYXRvciB2 ZXJzaW9uIDMuMS41MAoodjMuMS4wLTY4OC1nOGFlOTUxZmJjMTA2KSkuCgpTaWduZWQtb2ZmLWJ5 OiBCasO2cm4gVMO2cGVsIDxiam9ybi50b3BlbEBnbWFpbC5jb20+Ci0tLQogYXJjaC9yaXNjdi9L Y29uZmlnICAgICAgICAgICAgfCAgICAxICsKIGFyY2gvcmlzY3YvTWFrZWZpbGUgICAgICAgICAg IHwgICAgMiArLQogYXJjaC9yaXNjdi9uZXQvTWFrZWZpbGUgICAgICAgfCAgICAxICsKIGFyY2gv cmlzY3YvbmV0L2JwZl9qaXRfY29tcC5jIHwgMTYwMiArKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysKIDQgZmlsZXMgY2hhbmdlZCwgMTYwNSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9u KC0pCiBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9yaXNjdi9uZXQvTWFrZWZpbGUKIGNyZWF0ZSBt b2RlIDEwMDY0NCBhcmNoL3Jpc2N2L25ldC9icGZfaml0X2NvbXAuYwoKZGlmZiAtLWdpdCBhL2Fy Y2gvcmlzY3YvS2NvbmZpZyBiL2FyY2gvcmlzY3YvS2NvbmZpZwppbmRleCBmZWVlYWE2MDY5N2Mu LmU2NGM2NTcwNjBiYiAxMDA2NDQKLS0tIGEvYXJjaC9yaXNjdi9LY29uZmlnCisrKyBiL2FyY2gv cmlzY3YvS2NvbmZpZwpAQCAtNDksNiArNDksNyBAQCBjb25maWcgUklTQ1YKIAlzZWxlY3QgUklT Q1ZfVElNRVIKIAlzZWxlY3QgR0VORVJJQ19JUlFfTVVMVElfSEFORExFUgogCXNlbGVjdCBBUkNI X0hBU19QVEVfU1BFQ0lBTAorCXNlbGVjdCBIQVZFX0VCUEZfSklUIGlmIDY0QklUCiAKIGNvbmZp ZyBNTVUKIAlkZWZfYm9vbCB5CmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L01ha2VmaWxlIGIvYXJj aC9yaXNjdi9NYWtlZmlsZQppbmRleCA0YjU5NGYyZTRmN2UuLmM2MzQyZTYzOGVmNyAxMDA2NDQK LS0tIGEvYXJjaC9yaXNjdi9NYWtlZmlsZQorKysgYi9hcmNoL3Jpc2N2L01ha2VmaWxlCkBAIC03 Nyw3ICs3Nyw3IEBAIEtCVUlMRF9JTUFHRQk6PSAkKGJvb3QpL0ltYWdlLmd6CiAKIGhlYWQteSA6 PSBhcmNoL3Jpc2N2L2tlcm5lbC9oZWFkLm8KIAotY29yZS15ICs9IGFyY2gvcmlzY3Yva2VybmVs LyBhcmNoL3Jpc2N2L21tLworY29yZS15ICs9IGFyY2gvcmlzY3Yva2VybmVsLyBhcmNoL3Jpc2N2 L21tLyBhcmNoL3Jpc2N2L25ldC8KIAogbGlicy15ICs9IGFyY2gvcmlzY3YvbGliLwogCmRpZmYg LS1naXQgYS9hcmNoL3Jpc2N2L25ldC9NYWtlZmlsZSBiL2FyY2gvcmlzY3YvbmV0L01ha2VmaWxl Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uYTEzMjIyMGNjNTgyCi0t LSAvZGV2L251bGwKKysrIGIvYXJjaC9yaXNjdi9uZXQvTWFrZWZpbGUKQEAgLTAsMCArMSBAQAor b2JqLSQoQ09ORklHX0JQRl9KSVQpICs9IGJwZl9qaXRfY29tcC5vCmRpZmYgLS1naXQgYS9hcmNo L3Jpc2N2L25ldC9icGZfaml0X2NvbXAuYyBiL2FyY2gvcmlzY3YvbmV0L2JwZl9qaXRfY29tcC5j Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwMC4uODBiMTJhYTVlMTBkCi0t LSAvZGV2L251bGwKKysrIGIvYXJjaC9yaXNjdi9uZXQvYnBmX2ppdF9jb21wLmMKQEAgLTAsMCAr MSwxNjAyIEBACisvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogR1BMLTIuMAorLyogQlBGIEpJ VCBjb21waWxlciBmb3IgUlY2NEcKKyAqCisgKiBDb3B5cmlnaHQoYykgMjAxOSBCasO2cm4gVMO2 cGVsIDxiam9ybi50b3BlbEBnbWFpbC5jb20+CisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9i cGYuaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGVmbHVz aC5oPgorCitlbnVtIHsKKwlSVl9SRUdfWkVSTyA9CTAsCS8qIFRoZSBjb25zdGFudCB2YWx1ZSAw ICovCisJUlZfUkVHX1JBID0JMSwJLyogUmV0dXJuIGFkZHJlc3MgKi8KKwlSVl9SRUdfU1AgPQky LAkvKiBTdGFjayBwb2ludGVyICovCisJUlZfUkVHX0dQID0JMywJLyogR2xvYmFsIHBvaW50ZXIg Ki8KKwlSVl9SRUdfVFAgPQk0LAkvKiBUaHJlYWQgcG9pbnRlciAqLworCVJWX1JFR19UMCA9CTUs CS8qIFRlbXBvcmFyaWVzICovCisJUlZfUkVHX1QxID0JNiwKKwlSVl9SRUdfVDIgPQk3LAorCVJW X1JFR19GUCA9CTgsCisJUlZfUkVHX1MxID0JOSwJLyogU2F2ZWQgcmVnaXN0ZXJzICovCisJUlZf UkVHX0EwID0JMTAsCS8qIEZ1bmN0aW9uIGFyZ3VtZW50L3JldHVybiB2YWx1ZXMgKi8KKwlSVl9S RUdfQTEgPQkxMSwJLyogRnVuY3Rpb24gYXJndW1lbnRzICovCisJUlZfUkVHX0EyID0JMTIsCisJ UlZfUkVHX0EzID0JMTMsCisJUlZfUkVHX0E0ID0JMTQsCisJUlZfUkVHX0E1ID0JMTUsCisJUlZf UkVHX0E2ID0JMTYsCisJUlZfUkVHX0E3ID0JMTcsCisJUlZfUkVHX1MyID0JMTgsCS8qIFNhdmVk IHJlZ2lzdGVycyAqLworCVJWX1JFR19TMyA9CTE5LAorCVJWX1JFR19TNCA9CTIwLAorCVJWX1JF R19TNSA9CTIxLAorCVJWX1JFR19TNiA9CTIyLAorCVJWX1JFR19TNyA9CTIzLAorCVJWX1JFR19T OCA9CTI0LAorCVJWX1JFR19TOSA9CTI1LAorCVJWX1JFR19TMTAgPQkyNiwKKwlSVl9SRUdfUzEx ID0JMjcsCisJUlZfUkVHX1QzID0JMjgsCS8qIFRlbXBvcmFyaWVzICovCisJUlZfUkVHX1Q0ID0J MjksCisJUlZfUkVHX1Q1ID0JMzAsCisJUlZfUkVHX1Q2ID0JMzEsCit9OworCisjZGVmaW5lIFJW X1JFR19UQ0MgUlZfUkVHX0E2CisjZGVmaW5lIFJWX1JFR19UQ0NfU0FWRUQgUlZfUkVHX1M2IC8q IFN0b3JlIEE2IGluIFM2IGlmIHByb2dyYW0gZG8gY2FsbHMgKi8KKworc3RhdGljIGNvbnN0IGlu dCByZWdtYXBbXSA9IHsKKwlbQlBGX1JFR18wXSA9CVJWX1JFR19BNSwKKwlbQlBGX1JFR18xXSA9 CVJWX1JFR19BMCwKKwlbQlBGX1JFR18yXSA9CVJWX1JFR19BMSwKKwlbQlBGX1JFR18zXSA9CVJW X1JFR19BMiwKKwlbQlBGX1JFR180XSA9CVJWX1JFR19BMywKKwlbQlBGX1JFR181XSA9CVJWX1JF R19BNCwKKwlbQlBGX1JFR182XSA9CVJWX1JFR19TMSwKKwlbQlBGX1JFR183XSA9CVJWX1JFR19T MiwKKwlbQlBGX1JFR184XSA9CVJWX1JFR19TMywKKwlbQlBGX1JFR185XSA9CVJWX1JFR19TNCwK KwlbQlBGX1JFR19GUF0gPQlSVl9SRUdfUzUsCisJW0JQRl9SRUdfQVhdID0JUlZfUkVHX1QwLAor fTsKKworZW51bSB7CisJUlZfQ1RYX0ZfU0VFTl9UQUlMX0NBTEwgPQkwLAorCVJWX0NUWF9GX1NF RU5fQ0FMTCA9CQlSVl9SRUdfUkEsCisJUlZfQ1RYX0ZfU0VFTl9TMSA9CQlSVl9SRUdfUzEsCisJ UlZfQ1RYX0ZfU0VFTl9TMiA9CQlSVl9SRUdfUzIsCisJUlZfQ1RYX0ZfU0VFTl9TMyA9CQlSVl9S RUdfUzMsCisJUlZfQ1RYX0ZfU0VFTl9TNCA9CQlSVl9SRUdfUzQsCisJUlZfQ1RYX0ZfU0VFTl9T NSA9CQlSVl9SRUdfUzUsCisJUlZfQ1RYX0ZfU0VFTl9TNiA9CQlSVl9SRUdfUzYsCit9OworCitz dHJ1Y3QgcnZfaml0X2NvbnRleHQgeworCXN0cnVjdCBicGZfcHJvZyAqcHJvZzsKKwl1MzIgKmlu c25zOyAvKiBSViBpbnNucyAqLworCWludCBuaW5zbnM7CisJaW50IGVwaWxvZ3VlX29mZnNldDsK KwlpbnQgKm9mZnNldDsgLyogQlBGIHRvIFJWICovCisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlp bnQgc3RhY2tfc2l6ZTsKK307CisKK3N0cnVjdCBydl9qaXRfZGF0YSB7CisJc3RydWN0IGJwZl9i aW5hcnlfaGVhZGVyICpoZWFkZXI7CisJdTggKmltYWdlOworCXN0cnVjdCBydl9qaXRfY29udGV4 dCBjdHg7Cit9OworCitzdGF0aWMgdTggYnBmX3RvX3J2X3JlZyhpbnQgYnBmX3JlZywgc3RydWN0 IHJ2X2ppdF9jb250ZXh0ICpjdHgpCit7CisJdTggcmVnID0gcmVnbWFwW2JwZl9yZWddOworCisJ c3dpdGNoIChyZWcpIHsKKwljYXNlIFJWX0NUWF9GX1NFRU5fUzE6CisJY2FzZSBSVl9DVFhfRl9T RUVOX1MyOgorCWNhc2UgUlZfQ1RYX0ZfU0VFTl9TMzoKKwljYXNlIFJWX0NUWF9GX1NFRU5fUzQ6 CisJY2FzZSBSVl9DVFhfRl9TRUVOX1M1OgorCWNhc2UgUlZfQ1RYX0ZfU0VFTl9TNjoKKwkJX19z ZXRfYml0KHJlZywgJmN0eC0+ZmxhZ3MpOworCX0KKwlyZXR1cm4gcmVnOworfTsKKworc3RhdGlj IGJvb2wgc2Vlbl9yZWcoaW50IHJlZywgc3RydWN0IHJ2X2ppdF9jb250ZXh0ICpjdHgpCit7CisJ c3dpdGNoIChyZWcpIHsKKwljYXNlIFJWX0NUWF9GX1NFRU5fQ0FMTDoKKwljYXNlIFJWX0NUWF9G X1NFRU5fUzE6CisJY2FzZSBSVl9DVFhfRl9TRUVOX1MyOgorCWNhc2UgUlZfQ1RYX0ZfU0VFTl9T MzoKKwljYXNlIFJWX0NUWF9GX1NFRU5fUzQ6CisJY2FzZSBSVl9DVFhfRl9TRUVOX1M1OgorCWNh c2UgUlZfQ1RYX0ZfU0VFTl9TNjoKKwkJcmV0dXJuIHRlc3RfYml0KHJlZywgJmN0eC0+ZmxhZ3Mp OworCX0KKwlyZXR1cm4gZmFsc2U7Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfY2FsbChzdHJ1Y3Qg cnZfaml0X2NvbnRleHQgKmN0eCkKK3sKKwlfX3NldF9iaXQoUlZfQ1RYX0ZfU0VFTl9DQUxMLCAm Y3R4LT5mbGFncyk7Cit9CisKK3N0YXRpYyBib29sIHNlZW5fY2FsbChzdHJ1Y3QgcnZfaml0X2Nv bnRleHQgKmN0eCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoUlZfQ1RYX0ZfU0VFTl9DQUxMLCAmY3R4 LT5mbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfdGFpbF9jYWxsKHN0cnVjdCBydl9qaXRf Y29udGV4dCAqY3R4KQoreworCV9fc2V0X2JpdChSVl9DVFhfRl9TRUVOX1RBSUxfQ0FMTCwgJmN0 eC0+ZmxhZ3MpOworfQorCitzdGF0aWMgYm9vbCBzZWVuX3RhaWxfY2FsbChzdHJ1Y3QgcnZfaml0 X2NvbnRleHQgKmN0eCkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoUlZfQ1RYX0ZfU0VFTl9UQUlMX0NB TEwsICZjdHgtPmZsYWdzKTsKK30KKworc3RhdGljIHU4IHJ2X3RhaWxfY2FsbF9yZWcoc3RydWN0 IHJ2X2ppdF9jb250ZXh0ICpjdHgpCit7CisJbWFya190YWlsX2NhbGwoY3R4KTsKKworCWlmIChz ZWVuX2NhbGwoY3R4KSkgeworCQlfX3NldF9iaXQoUlZfQ1RYX0ZfU0VFTl9TNiwgJmN0eC0+Zmxh Z3MpOworCQlyZXR1cm4gUlZfUkVHX1M2OworCX0KKwlyZXR1cm4gUlZfUkVHX0E2OworfQorCitz dGF0aWMgdm9pZCBlbWl0KGNvbnN0IHUzMiBpbnNuLCBzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0 eCkKK3sKKwlpZiAoY3R4LT5pbnNucykKKwkJY3R4LT5pbnNuc1tjdHgtPm5pbnNuc10gPSBpbnNu OworCisJY3R4LT5uaW5zbnMrKzsKK30KKworc3RhdGljIHUzMiBydl9yX2luc24odTggZnVuY3Q3 LCB1OCByczIsIHU4IHJzMSwgdTggZnVuY3QzLCB1OCByZCwgdTggb3Bjb2RlKQoreworCXJldHVy biAoZnVuY3Q3IDw8IDI1KSB8IChyczIgPDwgMjApIHwgKHJzMSA8PCAxNSkgfCAoZnVuY3QzIDw8 IDEyKSB8CisJCShyZCA8PCA3KSB8IG9wY29kZTsKK30KKworc3RhdGljIHUzMiBydl9pX2luc24o dTE2IGltbTExXzAsIHU4IHJzMSwgdTggZnVuY3QzLCB1OCByZCwgdTggb3Bjb2RlKQoreworCXJl dHVybiAoaW1tMTFfMCA8PCAyMCkgfCAocnMxIDw8IDE1KSB8IChmdW5jdDMgPDwgMTIpIHwgKHJk IDw8IDcpIHwKKwkJb3Bjb2RlOworfQorCitzdGF0aWMgdTMyIHJ2X3NfaW5zbih1MTYgaW1tMTFf MCwgdTggcnMyLCB1OCByczEsIHU4IGZ1bmN0MywgdTggb3Bjb2RlKQoreworCXU4IGltbTExXzUg PSBpbW0xMV8wID4+IDUsIGltbTRfMCA9IGltbTExXzAgJiAweDFmOworCisJcmV0dXJuIChpbW0x MV81IDw8IDI1KSB8IChyczIgPDwgMjApIHwgKHJzMSA8PCAxNSkgfCAoZnVuY3QzIDw8IDEyKSB8 CisJCShpbW00XzAgPDwgNykgfCBvcGNvZGU7Cit9CisKK3N0YXRpYyB1MzIgcnZfc2JfaW5zbih1 MTYgaW1tMTJfMSwgdTggcnMyLCB1OCByczEsIHU4IGZ1bmN0MywgdTggb3Bjb2RlKQoreworCXU4 IGltbTEyID0gKChpbW0xMl8xICYgMHg4MDApID4+IDUpIHwgKChpbW0xMl8xICYgMHgzZjApID4+ IDQpOworCXU4IGltbTRfMSA9ICgoaW1tMTJfMSAmIDB4ZikgPDwgMSkgfCAoKGltbTEyXzEgJiAw eDQwMCkgPj4gMTApOworCisJcmV0dXJuIChpbW0xMiA8PCAyNSkgfCAocnMyIDw8IDIwKSB8IChy czEgPDwgMTUpIHwgKGZ1bmN0MyA8PCAxMikgfAorCQkoaW1tNF8xIDw8IDcpIHwgb3Bjb2RlOwor fQorCitzdGF0aWMgdTMyIHJ2X3VfaW5zbih1MzIgaW1tMzFfMTIsIHU4IHJkLCB1OCBvcGNvZGUp Cit7CisJcmV0dXJuIChpbW0zMV8xMiA8PCAxMikgfCAocmQgPDwgNykgfCBvcGNvZGU7Cit9CisK K3N0YXRpYyB1MzIgcnZfdWpfaW5zbih1MzIgaW1tMjBfMSwgdTggcmQsIHU4IG9wY29kZSkKK3sK Kwl1MzIgaW1tOworCisJaW1tID0gKGltbTIwXzEgJiAweDgwMDAwKSB8ICAoKGltbTIwXzEgJiAw eDNmZikgPDwgOSkgfAorCSAgICAgICgoaW1tMjBfMSAmIDB4NDAwKSA+PiAyKSB8ICgoaW1tMjBf MSAmIDB4N2Y4MDApID4+IDExKTsKKworCXJldHVybiAoaW1tIDw8IDEyKSB8IChyZCA8PCA3KSB8 IG9wY29kZTsKK30KKworc3RhdGljIHUzMiBydl9hbW9faW5zbih1OCBmdW5jdDUsIHU4IGFxLCB1 OCBybCwgdTggcnMyLCB1OCByczEsCisJCSAgICAgICB1OCBmdW5jdDMsIHU4IHJkLCB1OCBvcGNv ZGUpCit7CisJdTggZnVuY3Q3ID0gKGZ1bmN0NSA8PCAyKSB8IChhcSA8PCAxKSB8IHJsOworCisJ cmV0dXJuIHJ2X3JfaW5zbihmdW5jdDcsIHJzMiwgcnMxLCBmdW5jdDMsIHJkLCBvcGNvZGUpOwor fQorCitzdGF0aWMgdTMyIHJ2X2FkZGl3KHU4IHJkLCB1OCByczEsIHUxNiBpbW0xMV8wKQorewor CXJldHVybiBydl9pX2luc24oaW1tMTFfMCwgcnMxLCAwLCByZCwgMHgxYik7Cit9CisKK3N0YXRp YyB1MzIgcnZfYWRkaSh1OCByZCwgdTggcnMxLCB1MTYgaW1tMTFfMCkKK3sKKwlyZXR1cm4gcnZf aV9pbnNuKGltbTExXzAsIHJzMSwgMCwgcmQsIDB4MTMpOworfQorCitzdGF0aWMgdTMyIHJ2X2Fk ZHcodTggcmQsIHU4IHJzMSwgdTggcnMyKQoreworCXJldHVybiBydl9yX2luc24oMCwgcnMyLCBy czEsIDAsIHJkLCAweDNiKTsKK30KKworc3RhdGljIHUzMiBydl9hZGQodTggcmQsIHU4IHJzMSwg dTggcnMyKQoreworCXJldHVybiBydl9yX2luc24oMCwgcnMyLCByczEsIDAsIHJkLCAweDMzKTsK K30KKworc3RhdGljIHUzMiBydl9zdWJ3KHU4IHJkLCB1OCByczEsIHU4IHJzMikKK3sKKwlyZXR1 cm4gcnZfcl9pbnNuKDB4MjAsIHJzMiwgcnMxLCAwLCByZCwgMHgzYik7Cit9CisKK3N0YXRpYyB1 MzIgcnZfc3ViKHU4IHJkLCB1OCByczEsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfcl9pbnNuKDB4 MjAsIHJzMiwgcnMxLCAwLCByZCwgMHgzMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfYW5kKHU4IHJk LCB1OCByczEsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfcl9pbnNuKDAsIHJzMiwgcnMxLCA3LCBy ZCwgMHgzMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfb3IodTggcmQsIHU4IHJzMSwgdTggcnMyKQor eworCXJldHVybiBydl9yX2luc24oMCwgcnMyLCByczEsIDYsIHJkLCAweDMzKTsKK30KKworc3Rh dGljIHUzMiBydl94b3IodTggcmQsIHU4IHJzMSwgdTggcnMyKQoreworCXJldHVybiBydl9yX2lu c24oMCwgcnMyLCByczEsIDQsIHJkLCAweDMzKTsKK30KKworc3RhdGljIHUzMiBydl9tdWx3KHU4 IHJkLCB1OCByczEsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfcl9pbnNuKDEsIHJzMiwgcnMxLCAw LCByZCwgMHgzYik7Cit9CisKK3N0YXRpYyB1MzIgcnZfbXVsKHU4IHJkLCB1OCByczEsIHU4IHJz MikKK3sKKwlyZXR1cm4gcnZfcl9pbnNuKDEsIHJzMiwgcnMxLCAwLCByZCwgMHgzMyk7Cit9CisK K3N0YXRpYyB1MzIgcnZfZGl2dXcodTggcmQsIHU4IHJzMSwgdTggcnMyKQoreworCXJldHVybiBy dl9yX2luc24oMSwgcnMyLCByczEsIDUsIHJkLCAweDNiKTsKK30KKworc3RhdGljIHUzMiBydl9k aXZ1KHU4IHJkLCB1OCByczEsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfcl9pbnNuKDEsIHJzMiwg cnMxLCA1LCByZCwgMHgzMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfcmVtdXcodTggcmQsIHU4IHJz MSwgdTggcnMyKQoreworCXJldHVybiBydl9yX2luc24oMSwgcnMyLCByczEsIDcsIHJkLCAweDNi KTsKK30KKworc3RhdGljIHUzMiBydl9yZW11KHU4IHJkLCB1OCByczEsIHU4IHJzMikKK3sKKwly ZXR1cm4gcnZfcl9pbnNuKDEsIHJzMiwgcnMxLCA3LCByZCwgMHgzMyk7Cit9CisKK3N0YXRpYyB1 MzIgcnZfc2xsdyh1OCByZCwgdTggcnMxLCB1OCByczIpCit7CisJcmV0dXJuIHJ2X3JfaW5zbigw LCByczIsIHJzMSwgMSwgcmQsIDB4M2IpOworfQorCitzdGF0aWMgdTMyIHJ2X3NsbCh1OCByZCwg dTggcnMxLCB1OCByczIpCit7CisJcmV0dXJuIHJ2X3JfaW5zbigwLCByczIsIHJzMSwgMSwgcmQs IDB4MzMpOworfQorCitzdGF0aWMgdTMyIHJ2X3NybHcodTggcmQsIHU4IHJzMSwgdTggcnMyKQor eworCXJldHVybiBydl9yX2luc24oMCwgcnMyLCByczEsIDUsIHJkLCAweDNiKTsKK30KKworc3Rh dGljIHUzMiBydl9zcmwodTggcmQsIHU4IHJzMSwgdTggcnMyKQoreworCXJldHVybiBydl9yX2lu c24oMCwgcnMyLCByczEsIDUsIHJkLCAweDMzKTsKK30KKworc3RhdGljIHUzMiBydl9zcmF3KHU4 IHJkLCB1OCByczEsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfcl9pbnNuKDB4MjAsIHJzMiwgcnMx LCA1LCByZCwgMHgzYik7Cit9CisKK3N0YXRpYyB1MzIgcnZfc3JhKHU4IHJkLCB1OCByczEsIHU4 IHJzMikKK3sKKwlyZXR1cm4gcnZfcl9pbnNuKDB4MjAsIHJzMiwgcnMxLCA1LCByZCwgMHgzMyk7 Cit9CisKK3N0YXRpYyB1MzIgcnZfbHVpKHU4IHJkLCB1MzIgaW1tMzFfMTIpCit7CisJcmV0dXJu IHJ2X3VfaW5zbihpbW0zMV8xMiwgcmQsIDB4MzcpOworfQorCitzdGF0aWMgdTMyIHJ2X3NsbGko dTggcmQsIHU4IHJzMSwgdTE2IGltbTExXzApCit7CisJcmV0dXJuIHJ2X2lfaW5zbihpbW0xMV8w LCByczEsIDEsIHJkLCAweDEzKTsKK30KKworc3RhdGljIHUzMiBydl9hbmRpKHU4IHJkLCB1OCBy czEsIHUxNiBpbW0xMV8wKQoreworCXJldHVybiBydl9pX2luc24oaW1tMTFfMCwgcnMxLCA3LCBy ZCwgMHgxMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfb3JpKHU4IHJkLCB1OCByczEsIHUxNiBpbW0x MV8wKQoreworCXJldHVybiBydl9pX2luc24oaW1tMTFfMCwgcnMxLCA2LCByZCwgMHgxMyk7Cit9 CisKK3N0YXRpYyB1MzIgcnZfeG9yaSh1OCByZCwgdTggcnMxLCB1MTYgaW1tMTFfMCkKK3sKKwly ZXR1cm4gcnZfaV9pbnNuKGltbTExXzAsIHJzMSwgNCwgcmQsIDB4MTMpOworfQorCitzdGF0aWMg dTMyIHJ2X3NsbGl3KHU4IHJkLCB1OCByczEsIHUxNiBpbW0xMV8wKQoreworCXJldHVybiBydl9p X2luc24oaW1tMTFfMCwgcnMxLCAxLCByZCwgMHgxYik7Cit9CisKK3N0YXRpYyB1MzIgcnZfc3Js aXcodTggcmQsIHU4IHJzMSwgdTE2IGltbTExXzApCit7CisJcmV0dXJuIHJ2X2lfaW5zbihpbW0x MV8wLCByczEsIDUsIHJkLCAweDFiKTsKK30KKworc3RhdGljIHUzMiBydl9zcmxpKHU4IHJkLCB1 OCByczEsIHUxNiBpbW0xMV8wKQoreworCXJldHVybiBydl9pX2luc24oaW1tMTFfMCwgcnMxLCA1 LCByZCwgMHgxMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfc3JhaXcodTggcmQsIHU4IHJzMSwgdTE2 IGltbTExXzApCit7CisJcmV0dXJuIHJ2X2lfaW5zbigweDQwMCB8IGltbTExXzAsIHJzMSwgNSwg cmQsIDB4MWIpOworfQorCitzdGF0aWMgdTMyIHJ2X3NyYWkodTggcmQsIHU4IHJzMSwgdTE2IGlt bTExXzApCit7CisJcmV0dXJuIHJ2X2lfaW5zbigweDQwMCB8IGltbTExXzAsIHJzMSwgNSwgcmQs IDB4MTMpOworfQorCitzdGF0aWMgdTMyIHJ2X2phbCh1OCByZCwgdTMyIGltbTIwXzEpCit7CisJ cmV0dXJuIHJ2X3VqX2luc24oaW1tMjBfMSwgcmQsIDB4NmYpOworfQorCitzdGF0aWMgdTMyIHJ2 X2phbHIodTggcmQsIHU4IHJzMSwgdTE2IGltbTExXzApCit7CisJcmV0dXJuIHJ2X2lfaW5zbihp bW0xMV8wLCByczEsIDAsIHJkLCAweDY3KTsKK30KKworc3RhdGljIHUzMiBydl9iZXEodTggcnMx LCB1OCByczIsIHUxNiBpbW0xMl8xKQoreworCXJldHVybiBydl9zYl9pbnNuKGltbTEyXzEsIHJz MiwgcnMxLCAwLCAweDYzKTsKK30KKworc3RhdGljIHUzMiBydl9ibHR1KHU4IHJzMSwgdTggcnMy LCB1MTYgaW1tMTJfMSkKK3sKKwlyZXR1cm4gcnZfc2JfaW5zbihpbW0xMl8xLCByczIsIHJzMSwg NiwgMHg2Myk7Cit9CisKK3N0YXRpYyB1MzIgcnZfYmdldSh1OCByczEsIHU4IHJzMiwgdTE2IGlt bTEyXzEpCit7CisJcmV0dXJuIHJ2X3NiX2luc24oaW1tMTJfMSwgcnMyLCByczEsIDcsIDB4NjMp OworfQorCitzdGF0aWMgdTMyIHJ2X2JuZSh1OCByczEsIHU4IHJzMiwgdTE2IGltbTEyXzEpCit7 CisJcmV0dXJuIHJ2X3NiX2luc24oaW1tMTJfMSwgcnMyLCByczEsIDEsIDB4NjMpOworfQorCitz dGF0aWMgdTMyIHJ2X2JsdCh1OCByczEsIHU4IHJzMiwgdTE2IGltbTEyXzEpCit7CisJcmV0dXJu IHJ2X3NiX2luc24oaW1tMTJfMSwgcnMyLCByczEsIDQsIDB4NjMpOworfQorCitzdGF0aWMgdTMy IHJ2X2JnZSh1OCByczEsIHU4IHJzMiwgdTE2IGltbTEyXzEpCit7CisJcmV0dXJuIHJ2X3NiX2lu c24oaW1tMTJfMSwgcnMyLCByczEsIDUsIDB4NjMpOworfQorCitzdGF0aWMgdTMyIHJ2X3NiKHU4 IHJzMSwgdTE2IGltbTExXzAsIHU4IHJzMikKK3sKKwlyZXR1cm4gcnZfc19pbnNuKGltbTExXzAs IHJzMiwgcnMxLCAwLCAweDIzKTsKK30KKworc3RhdGljIHUzMiBydl9zaCh1OCByczEsIHUxNiBp bW0xMV8wLCB1OCByczIpCit7CisJcmV0dXJuIHJ2X3NfaW5zbihpbW0xMV8wLCByczIsIHJzMSwg MSwgMHgyMyk7Cit9CisKK3N0YXRpYyB1MzIgcnZfc3codTggcnMxLCB1MTYgaW1tMTFfMCwgdTgg cnMyKQoreworCXJldHVybiBydl9zX2luc24oaW1tMTFfMCwgcnMyLCByczEsIDIsIDB4MjMpOwor fQorCitzdGF0aWMgdTMyIHJ2X3NkKHU4IHJzMSwgdTE2IGltbTExXzAsIHU4IHJzMikKK3sKKwly ZXR1cm4gcnZfc19pbnNuKGltbTExXzAsIHJzMiwgcnMxLCAzLCAweDIzKTsKK30KKworc3RhdGlj IHUzMiBydl9sYnUodTggcmQsIHUxNiBpbW0xMV8wLCB1OCByczEpCit7CisJcmV0dXJuIHJ2X2lf aW5zbihpbW0xMV8wLCByczEsIDQsIHJkLCAweDAzKTsKK30KKworc3RhdGljIHUzMiBydl9saHUo dTggcmQsIHUxNiBpbW0xMV8wLCB1OCByczEpCit7CisJcmV0dXJuIHJ2X2lfaW5zbihpbW0xMV8w LCByczEsIDUsIHJkLCAweDAzKTsKK30KKworc3RhdGljIHUzMiBydl9sd3UodTggcmQsIHUxNiBp bW0xMV8wLCB1OCByczEpCit7CisJcmV0dXJuIHJ2X2lfaW5zbihpbW0xMV8wLCByczEsIDYsIHJk LCAweDAzKTsKK30KKworc3RhdGljIHUzMiBydl9sZCh1OCByZCwgdTE2IGltbTExXzAsIHU4IHJz MSkKK3sKKwlyZXR1cm4gcnZfaV9pbnNuKGltbTExXzAsIHJzMSwgMywgcmQsIDB4MDMpOworfQor CitzdGF0aWMgdTMyIHJ2X2Ftb2FkZF93KHU4IHJkLCB1OCByczIsIHU4IHJzMSwgdTggYXEsIHU4 IHJsKQoreworCXJldHVybiBydl9hbW9faW5zbigwLCBhcSwgcmwsIHJzMiwgcnMxLCAyLCByZCwg MHgyZik7Cit9CisKK3N0YXRpYyB1MzIgcnZfYW1vYWRkX2QodTggcmQsIHU4IHJzMiwgdTggcnMx LCB1OCBhcSwgdTggcmwpCit7CisJcmV0dXJuIHJ2X2Ftb19pbnNuKDAsIGFxLCBybCwgcnMyLCBy czEsIDMsIHJkLCAweDJmKTsKK30KKworc3RhdGljIGJvb2wgaXNfMTJiX2ludChzNjQgdmFsKQor eworCXJldHVybiAtKDEgPDwgMTEpIDw9IHZhbCAmJiB2YWwgPCAoMSA8PCAxMSk7Cit9CisKK3N0 YXRpYyBib29sIGlzXzEzYl9pbnQoczY0IHZhbCkKK3sKKwlyZXR1cm4gLSgxIDw8IDEyKSA8PSB2 YWwgJiYgdmFsIDwgKDEgPDwgMTIpOworfQorCitzdGF0aWMgYm9vbCBpc18yMWJfaW50KHM2NCB2 YWwpCit7CisJcmV0dXJuIC0oMUwgPDwgMjApIDw9IHZhbCAmJiB2YWwgPCAoMUwgPDwgMjApOwor fQorCitzdGF0aWMgYm9vbCBpc18zMmJfaW50KHM2NCB2YWwpCit7CisJcmV0dXJuIC0oMUwgPDwg MzEpIDw9IHZhbCAmJiB2YWwgPCAoMUwgPDwgMzEpOworfQorCitzdGF0aWMgaW50IGlzXzEyYl9j aGVjayhpbnQgb2ZmLCBpbnQgaW5zbikKK3sKKwlpZiAoIWlzXzEyYl9pbnQob2ZmKSkgeworCQlw cl9lcnIoImJwZi1qaXQ6IGluc249JWQgb2Zmc2V0PSVkIG5vdCBzdXBwb3J0ZWQgeWV0IVxuIiwK KwkJICAgICAgIGluc24sIChpbnQpb2ZmKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsK K30KKworc3RhdGljIGludCBpc18xM2JfY2hlY2soaW50IG9mZiwgaW50IGluc24pCit7CisJaWYg KCFpc18xM2JfaW50KG9mZikpIHsKKwkJcHJfZXJyKCJicGYtaml0OiBpbnNuPSVkIG9mZnNldD0l ZCBub3Qgc3VwcG9ydGVkIHlldCFcbiIsCisJCSAgICAgICBpbnNuLCAoaW50KW9mZik7CisJCXJl dHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaXNfMjFiX2NoZWNrKGlu dCBvZmYsIGludCBpbnNuKQoreworCWlmICghaXNfMjFiX2ludChvZmYpKSB7CisJCXByX2Vycigi YnBmLWppdDogaW5zbj0lZCBvZmZzZXQ9JWQgbm90IHN1cHBvcnRlZCB5ZXQhXG4iLAorCQkgICAg ICAgaW5zbiwgKGludClvZmYpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitz dGF0aWMgdm9pZCBlbWl0X2ltbSh1OCByZCwgczY0IHZhbCwgc3RydWN0IHJ2X2ppdF9jb250ZXh0 ICpjdHgpCit7CisJLyogTm90ZSB0aGF0IHRoZSBpbW1lZGlhdGUgZnJvbSB0aGUgYWRkIGlzIHNp Z24tZXh0ZW5kZWQsCisJICogd2hpY2ggbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGNvbXBlbnNhdGUg dGhpcyBieSBhZGRpbmcgMl4xMiwKKwkgKiB3aGVuIHRoZSAxMnRoIGJpdCBpcyBzZXQuIEEgc2lt cGxlciB3YXkgb2YgZG9pbmcgdGhpcywgYW5kCisJICogZ2V0dGluZyByaWQgb2YgdGhlIGNoZWNr LCBpcyB0byBqdXN0IGFkZCAyKioxMSBiZWZvcmUgdGhlCisJICogc2hpZnQuIFRoZSAiTG9hZGlu ZyBhIDMyLUJpdCBjb25zdGFudCIgZXhhbXBsZSBmcm9tIHRoZQorCSAqICJDb21wdXRlciBPcmdh bml6YXRpb24gYW5kIERlc2lnbiwgUklTQy1WIGVkaXRpb24iIGJvb2sgYnkKKwkgKiBQYXR0ZXJz b24vSGVubmVzc3kgaGlnaGxpZ2h0cyB0aGlzIGZhY3QuCisJICoKKwkgKiBUaGlzIGFsc28gbWVh bnMgdGhhdCB3ZSBuZWVkIHRvIHByb2Nlc3MgTFNCIHRvIE1TQi4KKwkgKi8KKwlzNjQgdXBwZXIg PSAodmFsICsgKDEgPDwgMTEpKSA+PiAxMiwgbG93ZXIgPSB2YWwgJiAweGZmZjsKKwlpbnQgc2hp ZnQ7CisKKwlpZiAoaXNfMzJiX2ludCh2YWwpKSB7CisJCWlmICh1cHBlcikKKwkJCWVtaXQocnZf bHVpKHJkLCB1cHBlciksIGN0eCk7CisKKwkJaWYgKCF1cHBlcikgeworCQkJZW1pdChydl9hZGRp KHJkLCBSVl9SRUdfWkVSTywgbG93ZXIpLCBjdHgpOworCQkJcmV0dXJuOworCQl9CisKKwkJZW1p dChydl9hZGRpdyhyZCwgcmQsIGxvd2VyKSwgY3R4KTsKKwkJcmV0dXJuOworCX0KKworCXNoaWZ0 ID0gX19mZnModXBwZXIpOworCXVwcGVyID4+PSBzaGlmdDsKKwlzaGlmdCArPSAxMjsKKworCWVt aXRfaW1tKHJkLCB1cHBlciwgY3R4KTsKKworCWVtaXQocnZfc2xsaShyZCwgcmQsIHNoaWZ0KSwg Y3R4KTsKKwlpZiAobG93ZXIpCisJCWVtaXQocnZfYWRkaShyZCwgcmQsIGxvd2VyKSwgY3R4KTsK K30KKworc3RhdGljIGludCBydl9vZmZzZXQoaW50IGJwZl90bywgaW50IGJwZl9mcm9tLCBzdHJ1 Y3QgcnZfaml0X2NvbnRleHQgKmN0eCkKK3sKKwlpbnQgZnJvbSA9IGN0eC0+b2Zmc2V0W2JwZl9m cm9tXSAtIDEsIHRvID0gY3R4LT5vZmZzZXRbYnBmX3RvXTsKKworCXJldHVybiAodG8gLSBmcm9t KSA8PCAyOworfQorCitzdGF0aWMgaW50IGVwaWxvZ3VlX29mZnNldChzdHJ1Y3QgcnZfaml0X2Nv bnRleHQgKmN0eCkKK3sKKwlpbnQgdG8gPSBjdHgtPmVwaWxvZ3VlX29mZnNldCwgZnJvbSA9IGN0 eC0+bmluc25zOworCisJcmV0dXJuICh0byAtIGZyb20pIDw8IDI7Cit9CisKK3N0YXRpYyB2b2lk IF9fYnVpbGRfZXBpbG9ndWUodTggcmVnLCBzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eCkKK3sK KwlpbnQgc3RhY2tfYWRqdXN0ID0gY3R4LT5zdGFja19zaXplLCBzdG9yZV9vZmZzZXQgPSBzdGFj a19hZGp1c3QgLSA4OworCisJaWYgKHNlZW5fcmVnKFJWX1JFR19SQSwgY3R4KSkgeworCQllbWl0 KHJ2X2xkKFJWX1JFR19SQSwgc3RvcmVfb2Zmc2V0LCBSVl9SRUdfU1ApLCBjdHgpOworCQlzdG9y ZV9vZmZzZXQgLT0gODsKKwl9CisJZW1pdChydl9sZChSVl9SRUdfRlAsIHN0b3JlX29mZnNldCwg UlZfUkVHX1NQKSwgY3R4KTsKKwlzdG9yZV9vZmZzZXQgLT0gODsKKwlpZiAoc2Vlbl9yZWcoUlZf UkVHX1MxLCBjdHgpKSB7CisJCWVtaXQocnZfbGQoUlZfUkVHX1MxLCBzdG9yZV9vZmZzZXQsIFJW X1JFR19TUCksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwlpZiAoc2Vlbl9yZWco UlZfUkVHX1MyLCBjdHgpKSB7CisJCWVtaXQocnZfbGQoUlZfUkVHX1MyLCBzdG9yZV9vZmZzZXQs IFJWX1JFR19TUCksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwlpZiAoc2Vlbl9y ZWcoUlZfUkVHX1MzLCBjdHgpKSB7CisJCWVtaXQocnZfbGQoUlZfUkVHX1MzLCBzdG9yZV9vZmZz ZXQsIFJWX1JFR19TUCksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwlpZiAoc2Vl bl9yZWcoUlZfUkVHX1M0LCBjdHgpKSB7CisJCWVtaXQocnZfbGQoUlZfUkVHX1M0LCBzdG9yZV9v ZmZzZXQsIFJWX1JFR19TUCksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwlpZiAo c2Vlbl9yZWcoUlZfUkVHX1M1LCBjdHgpKSB7CisJCWVtaXQocnZfbGQoUlZfUkVHX1M1LCBzdG9y ZV9vZmZzZXQsIFJWX1JFR19TUCksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwlp ZiAoc2Vlbl9yZWcoUlZfUkVHX1M2LCBjdHgpKSB7CisJCWVtaXQocnZfbGQoUlZfUkVHX1M2LCBz dG9yZV9vZmZzZXQsIFJWX1JFR19TUCksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0K KworCWVtaXQocnZfYWRkaShSVl9SRUdfU1AsIFJWX1JFR19TUCwgc3RhY2tfYWRqdXN0KSwgY3R4 KTsKKwkvKiBTZXQgcmV0dXJuIHZhbHVlLiAqLworCWVtaXQocnZfYWRkaShSVl9SRUdfQTAsIFJW X1JFR19BNSwgMCksIGN0eCk7CisJZW1pdChydl9qYWxyKFJWX1JFR19aRVJPLCByZWcsIDApLCBj dHgpOworfQorCitzdGF0aWMgdm9pZCBlbWl0X3pleHRfMzIodTggcmVnLCBzdHJ1Y3QgcnZfaml0 X2NvbnRleHQgKmN0eCkKK3sKKwllbWl0KHJ2X3NsbGkocmVnLCByZWcsIDMyKSwgY3R4KTsKKwll bWl0KHJ2X3NybGkocmVnLCByZWcsIDMyKSwgY3R4KTsKK30KKworc3RhdGljIGludCBlbWl0X2Jw Zl90YWlsX2NhbGwoaW50IGluc24sIHN0cnVjdCBydl9qaXRfY29udGV4dCAqY3R4KQoreworCWlu dCB0Y19uaW5zbiwgb2ZmLCBzdGFydF9pbnNuID0gY3R4LT5uaW5zbnM7CisJdTggdGNjID0gcnZf dGFpbF9jYWxsX3JlZyhjdHgpOworCisJLyogYTA6ICZjdHgKKwkgKiBhMTogJmFycmF5CisJICog YTI6IGluZGV4CisJICoKKwkgKiBpZiAoaW5kZXggPj0gYXJyYXktPm1hcC5tYXhfZW50cmllcykK KwkgKglnb3RvIG91dDsKKwkgKi8KKwl0Y19uaW5zbiA9IGluc24gPyBjdHgtPm9mZnNldFtpbnNu XSAtIGN0eC0+b2Zmc2V0W2luc24gLSAxXSA6CisJCSAgIGN0eC0+b2Zmc2V0WzBdOworCWVtaXRf emV4dF8zMihSVl9SRUdfQTIsIGN0eCk7CisKKwlvZmYgPSBvZmZzZXRvZihzdHJ1Y3QgYnBmX2Fy cmF5LCBtYXAubWF4X2VudHJpZXMpOworCWlmIChpc18xMmJfY2hlY2sob2ZmLCBpbnNuKSkKKwkJ cmV0dXJuIC0xOworCWVtaXQocnZfbHd1KFJWX1JFR19UMSwgb2ZmLCBSVl9SRUdfQTEpLCBjdHgp OworCW9mZiA9ICh0Y19uaW5zbiAtIChjdHgtPm5pbnNucyAtIHN0YXJ0X2luc24pKSA8PCAyOwor CWlmIChpc18xM2JfY2hlY2sob2ZmLCBpbnNuKSkKKwkJcmV0dXJuIC0xOworCWVtaXQocnZfYmdl dShSVl9SRUdfQTIsIFJWX1JFR19UMSwgb2ZmID4+IDEpLCBjdHgpOworCisJLyogaWYgKC0tVEND IDwgMCkKKwkgKiAgICAgZ290byBvdXQ7CisJICovCisJZW1pdChydl9hZGRpKFJWX1JFR19UMSwg dGNjLCAtMSksIGN0eCk7CisJb2ZmID0gKHRjX25pbnNuIC0gKGN0eC0+bmluc25zIC0gc3RhcnRf aW5zbikpIDw8IDI7CisJaWYgKGlzXzEzYl9jaGVjayhvZmYsIGluc24pKQorCQlyZXR1cm4gLTE7 CisJZW1pdChydl9ibHQoUlZfUkVHX1QxLCBSVl9SRUdfWkVSTywgb2ZmID4+IDEpLCBjdHgpOwor CisJLyogcHJvZyA9IGFycmF5LT5wdHJzW2luZGV4XTsKKwkgKiBpZiAoIXByb2cpCisJICogICAg IGdvdG8gb3V0OworCSAqLworCWVtaXQocnZfc2xsaShSVl9SRUdfVDIsIFJWX1JFR19BMiwgMyks IGN0eCk7CisJZW1pdChydl9hZGQoUlZfUkVHX1QyLCBSVl9SRUdfVDIsIFJWX1JFR19BMSksIGN0 eCk7CisJb2ZmID0gb2Zmc2V0b2Yoc3RydWN0IGJwZl9hcnJheSwgcHRycyk7CisJaWYgKGlzXzEy Yl9jaGVjayhvZmYsIGluc24pKQorCQlyZXR1cm4gLTE7CisJZW1pdChydl9sZChSVl9SRUdfVDIs IG9mZiwgUlZfUkVHX1QyKSwgY3R4KTsKKwlvZmYgPSAodGNfbmluc24gLSAoY3R4LT5uaW5zbnMg LSBzdGFydF9pbnNuKSkgPDwgMjsKKwlpZiAoaXNfMTNiX2NoZWNrKG9mZiwgaW5zbikpCisJCXJl dHVybiAtMTsKKwllbWl0KHJ2X2JlcShSVl9SRUdfVDIsIFJWX1JFR19aRVJPLCBvZmYgPj4gMSks IGN0eCk7CisKKwkvKiBnb3RvICoocHJvZy0+YnBmX2Z1bmMgKyA0KTsgKi8KKwlvZmYgPSBvZmZz ZXRvZihzdHJ1Y3QgYnBmX3Byb2csIGJwZl9mdW5jKTsKKwlpZiAoaXNfMTJiX2NoZWNrKG9mZiwg aW5zbikpCisJCXJldHVybiAtMTsKKwllbWl0KHJ2X2xkKFJWX1JFR19UMywgb2ZmLCBSVl9SRUdf VDIpLCBjdHgpOworCWVtaXQocnZfYWRkaShSVl9SRUdfVDMsIFJWX1JFR19UMywgNCksIGN0eCk7 CisJZW1pdChydl9hZGRpKFJWX1JFR19UQ0MsIFJWX1JFR19UMSwgMCksIGN0eCk7CisJX19idWls ZF9lcGlsb2d1ZShSVl9SRUdfVDMsIGN0eCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lk IGluaXRfcmVncyh1OCAqcmQsIHU4ICpycywgY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuLAor CQkgICAgICBzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eCkKK3sKKwl1OCBjb2RlID0gaW5zbi0+ Y29kZTsKKworCXN3aXRjaCAoY29kZSkgeworCWNhc2UgQlBGX0pNUCB8IEJQRl9KQToKKwljYXNl IEJQRl9KTVAgfCBCUEZfQ0FMTDoKKwljYXNlIEJQRl9KTVAgfCBCUEZfRVhJVDoKKwljYXNlIEJQ Rl9KTVAgfCBCUEZfVEFJTF9DQUxMOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQkqcmQgPSBicGZf dG9fcnZfcmVnKGluc24tPmRzdF9yZWcsIGN0eCk7CisJfQorCisJaWYgKGNvZGUgJiAoQlBGX0FM VSB8IEJQRl9YKSB8fCBjb2RlICYgKEJQRl9BTFU2NCB8IEJQRl9YKSB8fAorCSAgICBjb2RlICYg KEJQRl9KTVAgfCBCUEZfWCkgfHwgY29kZSAmIChCUEZfSk1QMzIgfCBCUEZfWCkgfHwKKwkgICAg Y29kZSAmIEJQRl9MRFggfHwgY29kZSAmIEJQRl9TVFgpCisJCSpycyA9IGJwZl90b19ydl9yZWco aW5zbi0+c3JjX3JlZywgY3R4KTsKK30KKworc3RhdGljIGludCBydl9vZmZzZXRfY2hlY2soaW50 ICpydm9mZiwgczE2IG9mZiwgaW50IGluc24sCisJCQkgICBzdHJ1Y3QgcnZfaml0X2NvbnRleHQg KmN0eCkKK3sKKwkqcnZvZmYgPSBydl9vZmZzZXQoaW5zbiArIG9mZiwgaW5zbiwgY3R4KTsKKwly ZXR1cm4gaXNfMTNiX2NoZWNrKCpydm9mZiwgaW5zbik7Cit9CisKK3N0YXRpYyB2b2lkIGVtaXRf emV4dF8zMl9yZF9ycyh1OCAqcmQsIHU4ICpycywgc3RydWN0IHJ2X2ppdF9jb250ZXh0ICpjdHgp Cit7CisJZW1pdChydl9hZGRpKFJWX1JFR19UMiwgKnJkLCAwKSwgY3R4KTsKKwllbWl0X3pleHRf MzIoUlZfUkVHX1QyLCBjdHgpOworCWVtaXQocnZfYWRkaShSVl9SRUdfVDEsICpycywgMCksIGN0 eCk7CisJZW1pdF96ZXh0XzMyKFJWX1JFR19UMSwgY3R4KTsKKwkqcmQgPSBSVl9SRUdfVDI7CisJ KnJzID0gUlZfUkVHX1QxOworfQorCitzdGF0aWMgdm9pZCBlbWl0X3NleHRfMzJfcmRfcnModTgg KnJkLCB1OCAqcnMsIHN0cnVjdCBydl9qaXRfY29udGV4dCAqY3R4KQoreworCWVtaXQocnZfYWRk aXcoUlZfUkVHX1QyLCAqcmQsIDApLCBjdHgpOworCWVtaXQocnZfYWRkaXcoUlZfUkVHX1QxLCAq cnMsIDApLCBjdHgpOworCSpyZCA9IFJWX1JFR19UMjsKKwkqcnMgPSBSVl9SRUdfVDE7Cit9CisK K3N0YXRpYyB2b2lkIGVtaXRfemV4dF8zMl9yZF90MSh1OCAqcmQsIHN0cnVjdCBydl9qaXRfY29u dGV4dCAqY3R4KQoreworCWVtaXQocnZfYWRkaShSVl9SRUdfVDIsICpyZCwgMCksIGN0eCk7CisJ ZW1pdF96ZXh0XzMyKFJWX1JFR19UMiwgY3R4KTsKKwllbWl0X3pleHRfMzIoUlZfUkVHX1QxLCBj dHgpOworCSpyZCA9IFJWX1JFR19UMjsKK30KKworc3RhdGljIHZvaWQgZW1pdF9zZXh0XzMyX3Jk KHU4ICpyZCwgc3RydWN0IHJ2X2ppdF9jb250ZXh0ICpjdHgpCit7CisJZW1pdChydl9hZGRpdyhS Vl9SRUdfVDIsICpyZCwgMCksIGN0eCk7CisJKnJkID0gUlZfUkVHX1QyOworfQorCitzdGF0aWMg aW50IGVtaXRfaW5zbihjb25zdCBzdHJ1Y3QgYnBmX2luc24gKmluc24sIHN0cnVjdCBydl9qaXRf Y29udGV4dCAqY3R4LAorCQkgICAgIGJvb2wgZXh0cmFfcGFzcykKK3sKKwlib29sIGlzNjQgPSBC UEZfQ0xBU1MoaW5zbi0+Y29kZSkgPT0gQlBGX0FMVTY0IHx8CisJCSAgICBCUEZfQ0xBU1MoaW5z bi0+Y29kZSkgPT0gQlBGX0pNUDsKKwlpbnQgcnZvZmYsIGkgPSBpbnNuIC0gY3R4LT5wcm9nLT5p bnNuc2k7CisJdTggcmQgPSAtMSwgcnMgPSAtMSwgY29kZSA9IGluc24tPmNvZGU7CisJczE2IG9m ZiA9IGluc24tPm9mZjsKKwlzMzIgaW1tID0gaW5zbi0+aW1tOworCisJaW5pdF9yZWdzKCZyZCwg JnJzLCBpbnNuLCBjdHgpOworCisJc3dpdGNoIChjb2RlKSB7CisJLyogZHN0ID0gc3JjICovCisJ Y2FzZSBCUEZfQUxVIHwgQlBGX01PViB8IEJQRl9YOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX01P ViB8IEJQRl9YOgorCQllbWl0KGlzNjQgPyBydl9hZGRpKHJkLCBycywgMCkgOiBydl9hZGRpdyhy ZCwgcnMsIDApLCBjdHgpOworCQlpZiAoIWlzNjQpCisJCQllbWl0X3pleHRfMzIocmQsIGN0eCk7 CisJCWJyZWFrOworCisJLyogZHN0ID0gZHN0IE9QIHNyYyAqLworCWNhc2UgQlBGX0FMVSB8IEJQ Rl9BREQgfCBCUEZfWDoKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9BREQgfCBCUEZfWDoKKwkJZW1p dChpczY0ID8gcnZfYWRkKHJkLCByZCwgcnMpIDogcnZfYWRkdyhyZCwgcmQsIHJzKSwgY3R4KTsK KwkJYnJlYWs7CisJY2FzZSBCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9YOgorCWNhc2UgQlBGX0FM VTY0IHwgQlBGX1NVQiB8IEJQRl9YOgorCQllbWl0KGlzNjQgPyBydl9zdWIocmQsIHJkLCBycykg OiBydl9zdWJ3KHJkLCByZCwgcnMpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9BTFUgfCBC UEZfQU5EIHwgQlBGX1g6CisJY2FzZSBCUEZfQUxVNjQgfCBCUEZfQU5EIHwgQlBGX1g6CisJCWVt aXQocnZfYW5kKHJkLCByZCwgcnMpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9BTFUgfCBC UEZfT1IgfCBCUEZfWDoKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9PUiB8IEJQRl9YOgorCQllbWl0 KHJ2X29yKHJkLCByZCwgcnMpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9BTFUgfCBCUEZf WE9SIHwgQlBGX1g6CisJY2FzZSBCUEZfQUxVNjQgfCBCUEZfWE9SIHwgQlBGX1g6CisJCWVtaXQo cnZfeG9yKHJkLCByZCwgcnMpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9BTFUgfCBCUEZf TVVMIHwgQlBGX1g6CisJY2FzZSBCUEZfQUxVNjQgfCBCUEZfTVVMIHwgQlBGX1g6CisJCWVtaXQo aXM2NCA/IHJ2X211bChyZCwgcmQsIHJzKSA6IHJ2X211bHcocmQsIHJkLCBycyksIGN0eCk7CisJ CWlmICghaXM2NCkKKwkJCWVtaXRfemV4dF8zMihyZCwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBC UEZfQUxVIHwgQlBGX0RJViB8IEJQRl9YOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0RJViB8IEJQ Rl9YOgorCQllbWl0KGlzNjQgPyBydl9kaXZ1KHJkLCByZCwgcnMpIDogcnZfZGl2dXcocmQsIHJk LCBycyksIGN0eCk7CisJCWlmICghaXM2NCkKKwkJCWVtaXRfemV4dF8zMihyZCwgY3R4KTsKKwkJ YnJlYWs7CisJY2FzZSBCUEZfQUxVIHwgQlBGX01PRCB8IEJQRl9YOgorCWNhc2UgQlBGX0FMVTY0 IHwgQlBGX01PRCB8IEJQRl9YOgorCQllbWl0KGlzNjQgPyBydl9yZW11KHJkLCByZCwgcnMpIDog cnZfcmVtdXcocmQsIHJkLCBycyksIGN0eCk7CisJCWlmICghaXM2NCkKKwkJCWVtaXRfemV4dF8z MihyZCwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfQUxVIHwgQlBGX0xTSCB8IEJQRl9YOgor CWNhc2UgQlBGX0FMVTY0IHwgQlBGX0xTSCB8IEJQRl9YOgorCQllbWl0KGlzNjQgPyBydl9zbGwo cmQsIHJkLCBycykgOiBydl9zbGx3KHJkLCByZCwgcnMpLCBjdHgpOworCQlicmVhazsKKwljYXNl IEJQRl9BTFUgfCBCUEZfUlNIIHwgQlBGX1g6CisJY2FzZSBCUEZfQUxVNjQgfCBCUEZfUlNIIHwg QlBGX1g6CisJCWVtaXQoaXM2NCA/IHJ2X3NybChyZCwgcmQsIHJzKSA6IHJ2X3NybHcocmQsIHJk LCBycyksIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0FMVSB8IEJQRl9BUlNIIHwgQlBGX1g6 CisJY2FzZSBCUEZfQUxVNjQgfCBCUEZfQVJTSCB8IEJQRl9YOgorCQllbWl0KGlzNjQgPyBydl9z cmEocmQsIHJkLCBycykgOiBydl9zcmF3KHJkLCByZCwgcnMpLCBjdHgpOworCQlicmVhazsKKwor CS8qIGRzdCA9IC1kc3QgKi8KKwljYXNlIEJQRl9BTFUgfCBCUEZfTkVHOgorCWNhc2UgQlBGX0FM VTY0IHwgQlBGX05FRzoKKwkJZW1pdChpczY0ID8gcnZfc3ViKHJkLCBSVl9SRUdfWkVSTywgcmQp IDoKKwkJICAgICBydl9zdWJ3KHJkLCBSVl9SRUdfWkVSTywgcmQpLCBjdHgpOworCQlicmVhazsK KworCS8qIGRzdCA9IEJTV0FQIyNpbW0oZHN0KSAqLworCWNhc2UgQlBGX0FMVSB8IEJQRl9FTkQg fCBCUEZfRlJPTV9MRToKKwl7CisJCWludCBzaGlmdCA9IDY0IC0gaW1tOworCisJCWVtaXQocnZf c2xsaShyZCwgcmQsIHNoaWZ0KSwgY3R4KTsKKwkJZW1pdChydl9zcmxpKHJkLCByZCwgc2hpZnQp LCBjdHgpOworCQlicmVhazsKKwl9CisJY2FzZSBCUEZfQUxVIHwgQlBGX0VORCB8IEJQRl9GUk9N X0JFOgorCQllbWl0KHJ2X2FkZGkoUlZfUkVHX1QyLCBSVl9SRUdfWkVSTywgMCksIGN0eCk7CisK KwkJZW1pdChydl9hbmRpKFJWX1JFR19UMSwgcmQsIDB4ZmYpLCBjdHgpOworCQllbWl0KHJ2X2Fk ZChSVl9SRUdfVDIsIFJWX1JFR19UMiwgUlZfUkVHX1QxKSwgY3R4KTsKKwkJZW1pdChydl9zbGxp KFJWX1JFR19UMiwgUlZfUkVHX1QyLCA4KSwgY3R4KTsKKwkJZW1pdChydl9zcmxpKHJkLCByZCwg OCksIGN0eCk7CisJCWlmIChpbW0gPT0gMTYpCisJCQlnb3RvIG91dF9iZTsKKworCQllbWl0KHJ2 X2FuZGkoUlZfUkVHX1QxLCByZCwgMHhmZiksIGN0eCk7CisJCWVtaXQocnZfYWRkKFJWX1JFR19U MiwgUlZfUkVHX1QyLCBSVl9SRUdfVDEpLCBjdHgpOworCQllbWl0KHJ2X3NsbGkoUlZfUkVHX1Qy LCBSVl9SRUdfVDIsIDgpLCBjdHgpOworCQllbWl0KHJ2X3NybGkocmQsIHJkLCA4KSwgY3R4KTsK KworCQllbWl0KHJ2X2FuZGkoUlZfUkVHX1QxLCByZCwgMHhmZiksIGN0eCk7CisJCWVtaXQocnZf YWRkKFJWX1JFR19UMiwgUlZfUkVHX1QyLCBSVl9SRUdfVDEpLCBjdHgpOworCQllbWl0KHJ2X3Ns bGkoUlZfUkVHX1QyLCBSVl9SRUdfVDIsIDgpLCBjdHgpOworCQllbWl0KHJ2X3NybGkocmQsIHJk LCA4KSwgY3R4KTsKKwkJaWYgKGltbSA9PSAzMikKKwkJCWdvdG8gb3V0X2JlOworCisJCWVtaXQo cnZfYW5kaShSVl9SRUdfVDEsIHJkLCAweGZmKSwgY3R4KTsKKwkJZW1pdChydl9hZGQoUlZfUkVH X1QyLCBSVl9SRUdfVDIsIFJWX1JFR19UMSksIGN0eCk7CisJCWVtaXQocnZfc2xsaShSVl9SRUdf VDIsIFJWX1JFR19UMiwgOCksIGN0eCk7CisJCWVtaXQocnZfc3JsaShyZCwgcmQsIDgpLCBjdHgp OworCisJCWVtaXQocnZfYW5kaShSVl9SRUdfVDEsIHJkLCAweGZmKSwgY3R4KTsKKwkJZW1pdChy dl9hZGQoUlZfUkVHX1QyLCBSVl9SRUdfVDIsIFJWX1JFR19UMSksIGN0eCk7CisJCWVtaXQocnZf c2xsaShSVl9SRUdfVDIsIFJWX1JFR19UMiwgOCksIGN0eCk7CisJCWVtaXQocnZfc3JsaShyZCwg cmQsIDgpLCBjdHgpOworCisJCWVtaXQocnZfYW5kaShSVl9SRUdfVDEsIHJkLCAweGZmKSwgY3R4 KTsKKwkJZW1pdChydl9hZGQoUlZfUkVHX1QyLCBSVl9SRUdfVDIsIFJWX1JFR19UMSksIGN0eCk7 CisJCWVtaXQocnZfc2xsaShSVl9SRUdfVDIsIFJWX1JFR19UMiwgOCksIGN0eCk7CisJCWVtaXQo cnZfc3JsaShyZCwgcmQsIDgpLCBjdHgpOworCisJCWVtaXQocnZfYW5kaShSVl9SRUdfVDEsIHJk LCAweGZmKSwgY3R4KTsKKwkJZW1pdChydl9hZGQoUlZfUkVHX1QyLCBSVl9SRUdfVDIsIFJWX1JF R19UMSksIGN0eCk7CisJCWVtaXQocnZfc2xsaShSVl9SRUdfVDIsIFJWX1JFR19UMiwgOCksIGN0 eCk7CisJCWVtaXQocnZfc3JsaShyZCwgcmQsIDgpLCBjdHgpOworb3V0X2JlOgorCQllbWl0KHJ2 X2FuZGkoUlZfUkVHX1QxLCByZCwgMHhmZiksIGN0eCk7CisJCWVtaXQocnZfYWRkKFJWX1JFR19U MiwgUlZfUkVHX1QyLCBSVl9SRUdfVDEpLCBjdHgpOworCisJCWVtaXQocnZfYWRkaShyZCwgUlZf UkVHX1QyLCAwKSwgY3R4KTsKKwkJYnJlYWs7CisKKwkvKiBkc3QgPSBpbW0gKi8KKwljYXNlIEJQ Rl9BTFUgfCBCUEZfTU9WIHwgQlBGX0s6CisJY2FzZSBCUEZfQUxVNjQgfCBCUEZfTU9WIHwgQlBG X0s6CisJCWVtaXRfaW1tKHJkLCBpbW0sIGN0eCk7CisJCWlmICghaXM2NCkKKwkJCWVtaXRfemV4 dF8zMihyZCwgY3R4KTsKKwkJYnJlYWs7CisKKwkvKiBkc3QgPSBkc3QgT1AgaW1tICovCisJY2Fz ZSBCUEZfQUxVIHwgQlBGX0FERCB8IEJQRl9LOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0FERCB8 IEJQRl9LOgorCQlpZiAoaXNfMTJiX2ludChpbW0pKSB7CisJCQllbWl0KGlzNjQgPyBydl9hZGRp KHJkLCByZCwgaW1tKSA6CisJCQkgICAgIHJ2X2FkZGl3KHJkLCByZCwgaW1tKSwgY3R4KTsKKwkJ fSBlbHNlIHsKKwkJCWVtaXRfaW1tKFJWX1JFR19UMSwgaW1tLCBjdHgpOworCQkJZW1pdChpczY0 ID8gcnZfYWRkKHJkLCByZCwgUlZfUkVHX1QxKSA6CisJCQkgICAgIHJ2X2FkZHcocmQsIHJkLCBS Vl9SRUdfVDEpLCBjdHgpOworCQl9CisJCWlmICghaXM2NCkKKwkJCWVtaXRfemV4dF8zMihyZCwg Y3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfQUxVIHwgQlBGX1NVQiB8IEJQRl9LOgorCWNhc2Ug QlBGX0FMVTY0IHwgQlBGX1NVQiB8IEJQRl9LOgorCQlpZiAoaXNfMTJiX2ludCgtaW1tKSkgewor CQkJZW1pdChpczY0ID8gcnZfYWRkaShyZCwgcmQsIC1pbW0pIDoKKwkJCSAgICAgcnZfYWRkaXco cmQsIHJkLCAtaW1tKSwgY3R4KTsKKwkJfSBlbHNlIHsKKwkJCWVtaXRfaW1tKFJWX1JFR19UMSwg aW1tLCBjdHgpOworCQkJZW1pdChpczY0ID8gcnZfc3ViKHJkLCByZCwgUlZfUkVHX1QxKSA6CisJ CQkgICAgIHJ2X3N1YncocmQsIHJkLCBSVl9SRUdfVDEpLCBjdHgpOworCQl9CisJCWlmICghaXM2 NCkKKwkJCWVtaXRfemV4dF8zMihyZCwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfQUxVIHwg QlBGX0FORCB8IEJQRl9LOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0FORCB8IEJQRl9LOgorCQlp ZiAoaXNfMTJiX2ludChpbW0pKSB7CisJCQllbWl0KHJ2X2FuZGkocmQsIHJkLCBpbW0pLCBjdHgp OworCQl9IGVsc2UgeworCQkJZW1pdF9pbW0oUlZfUkVHX1QxLCBpbW0sIGN0eCk7CisJCQllbWl0 KHJ2X2FuZChyZCwgcmQsIFJWX1JFR19UMSksIGN0eCk7CisJCX0KKwkJaWYgKCFpczY0KQorCQkJ ZW1pdF96ZXh0XzMyKHJkLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9BTFUgfCBCUEZfT1Ig fCBCUEZfSzoKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9PUiB8IEJQRl9LOgorCQlpZiAoaXNfMTJi X2ludChpbW0pKSB7CisJCQllbWl0KHJ2X29yaShyZCwgcmQsIGltbSksIGN0eCk7CisJCX0gZWxz ZSB7CisJCQllbWl0X2ltbShSVl9SRUdfVDEsIGltbSwgY3R4KTsKKwkJCWVtaXQocnZfb3IocmQs IHJkLCBSVl9SRUdfVDEpLCBjdHgpOworCQl9CisJCWlmICghaXM2NCkKKwkJCWVtaXRfemV4dF8z MihyZCwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfQUxVIHwgQlBGX1hPUiB8IEJQRl9LOgor CWNhc2UgQlBGX0FMVTY0IHwgQlBGX1hPUiB8IEJQRl9LOgorCQlpZiAoaXNfMTJiX2ludChpbW0p KSB7CisJCQllbWl0KHJ2X3hvcmkocmQsIHJkLCBpbW0pLCBjdHgpOworCQl9IGVsc2UgeworCQkJ ZW1pdF9pbW0oUlZfUkVHX1QxLCBpbW0sIGN0eCk7CisJCQllbWl0KHJ2X3hvcihyZCwgcmQsIFJW X1JFR19UMSksIGN0eCk7CisJCX0KKwkJaWYgKCFpczY0KQorCQkJZW1pdF96ZXh0XzMyKHJkLCBj dHgpOworCQlicmVhazsKKwljYXNlIEJQRl9BTFUgfCBCUEZfTVVMIHwgQlBGX0s6CisJY2FzZSBC UEZfQUxVNjQgfCBCUEZfTVVMIHwgQlBGX0s6CisJCWVtaXRfaW1tKFJWX1JFR19UMSwgaW1tLCBj dHgpOworCQllbWl0KGlzNjQgPyBydl9tdWwocmQsIHJkLCBSVl9SRUdfVDEpIDoKKwkJICAgICBy dl9tdWx3KHJkLCByZCwgUlZfUkVHX1QxKSwgY3R4KTsKKwkJaWYgKCFpczY0KQorCQkJZW1pdF96 ZXh0XzMyKHJkLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9BTFUgfCBCUEZfRElWIHwgQlBG X0s6CisJY2FzZSBCUEZfQUxVNjQgfCBCUEZfRElWIHwgQlBGX0s6CisJCWVtaXRfaW1tKFJWX1JF R19UMSwgaW1tLCBjdHgpOworCQllbWl0KGlzNjQgPyBydl9kaXZ1KHJkLCByZCwgUlZfUkVHX1Qx KSA6CisJCSAgICAgcnZfZGl2dXcocmQsIHJkLCBSVl9SRUdfVDEpLCBjdHgpOworCQlpZiAoIWlz NjQpCisJCQllbWl0X3pleHRfMzIocmQsIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0FMVSB8 IEJQRl9NT0QgfCBCUEZfSzoKKwljYXNlIEJQRl9BTFU2NCB8IEJQRl9NT0QgfCBCUEZfSzoKKwkJ ZW1pdF9pbW0oUlZfUkVHX1QxLCBpbW0sIGN0eCk7CisJCWVtaXQoaXM2NCA/IHJ2X3JlbXUocmQs IHJkLCBSVl9SRUdfVDEpIDoKKwkJICAgICBydl9yZW11dyhyZCwgcmQsIFJWX1JFR19UMSksIGN0 eCk7CisJCWlmICghaXM2NCkKKwkJCWVtaXRfemV4dF8zMihyZCwgY3R4KTsKKwkJYnJlYWs7CisJ Y2FzZSBCUEZfQUxVIHwgQlBGX0xTSCB8IEJQRl9LOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX0xT SCB8IEJQRl9LOgorCQllbWl0KGlzNjQgPyBydl9zbGxpKHJkLCByZCwgaW1tKSA6IHJ2X3NsbGl3 KHJkLCByZCwgaW1tKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfQUxVIHwgQlBGX1JTSCB8 IEJQRl9LOgorCWNhc2UgQlBGX0FMVTY0IHwgQlBGX1JTSCB8IEJQRl9LOgorCQllbWl0KGlzNjQg PyBydl9zcmxpKHJkLCByZCwgaW1tKSA6IHJ2X3NybGl3KHJkLCByZCwgaW1tKSwgY3R4KTsKKwkJ YnJlYWs7CisJY2FzZSBCUEZfQUxVIHwgQlBGX0FSU0ggfCBCUEZfSzoKKwljYXNlIEJQRl9BTFU2 NCB8IEJQRl9BUlNIIHwgQlBGX0s6CisJCWVtaXQoaXM2NCA/IHJ2X3NyYWkocmQsIHJkLCBpbW0p IDogcnZfc3JhaXcocmQsIHJkLCBpbW0pLCBjdHgpOworCQlicmVhazsKKworCS8qIEpVTVAgb2Zm ICovCisJY2FzZSBCUEZfSk1QIHwgQlBGX0pBOgorCQlydm9mZiA9IHJ2X29mZnNldChpICsgb2Zm LCBpLCBjdHgpOworCQlpZiAoIWlzXzIxYl9pbnQocnZvZmYpKSB7CisJCQlwcl9lcnIoImJwZi1q aXQ6IGluc249JWQgb2Zmc2V0PSVkIG5vdCBzdXBwb3J0ZWQgeWV0IVxuIiwKKwkJCSAgICAgICBp LCBydm9mZik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCQllbWl0KHJ2X2phbChSVl9SRUdfWkVS TywgcnZvZmYgPj4gMSksIGN0eCk7CisJCWJyZWFrOworCisJLyogSUYgKGRzdCBDT05EIHNyYykg SlVNUCBvZmYgKi8KKwljYXNlIEJQRl9KTVAgfCBCUEZfSkVRIHwgQlBGX1g6CisJY2FzZSBCUEZf Sk1QMzIgfCBCUEZfSkVRIHwgQlBGX1g6CisJCWlmIChydl9vZmZzZXRfY2hlY2soJnJ2b2ZmLCBv ZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWlmICghaXM2NCkKKwkJCWVtaXRfemV4dF8z Ml9yZF9ycygmcmQsICZycywgY3R4KTsKKwkJZW1pdChydl9iZXEocmQsIHJzLCBydm9mZiA+PiAx KSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSk1QIHwgQlBGX0pHVCB8IEJQRl9YOgorCWNh c2UgQlBGX0pNUDMyIHwgQlBGX0pHVCB8IEJQRl9YOgorCQlpZiAocnZfb2Zmc2V0X2NoZWNrKCZy dm9mZiwgb2ZmLCBpLCBjdHgpKQorCQkJcmV0dXJuIC0xOworCQlpZiAoIWlzNjQpCisJCQllbWl0 X3pleHRfMzJfcmRfcnMoJnJkLCAmcnMsIGN0eCk7CisJCWVtaXQocnZfYmx0dShycywgcmQsIHJ2 b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9KTVAgfCBCUEZfSkxUIHwgQlBG X1g6CisJY2FzZSBCUEZfSk1QMzIgfCBCUEZfSkxUIHwgQlBGX1g6CisJCWlmIChydl9vZmZzZXRf Y2hlY2soJnJ2b2ZmLCBvZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWlmICghaXM2NCkK KwkJCWVtaXRfemV4dF8zMl9yZF9ycygmcmQsICZycywgY3R4KTsKKwkJZW1pdChydl9ibHR1KHJk LCBycywgcnZvZmYgPj4gMSksIGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0pNUCB8IEJQRl9K R0UgfCBCUEZfWDoKKwljYXNlIEJQRl9KTVAzMiB8IEJQRl9KR0UgfCBCUEZfWDoKKwkJaWYgKHJ2 X29mZnNldF9jaGVjaygmcnZvZmYsIG9mZiwgaSwgY3R4KSkKKwkJCXJldHVybiAtMTsKKwkJaWYg KCFpczY0KQorCQkJZW1pdF96ZXh0XzMyX3JkX3JzKCZyZCwgJnJzLCBjdHgpOworCQllbWl0KHJ2 X2JnZXUocmQsIHJzLCBydm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSk1Q IHwgQlBGX0pMRSB8IEJQRl9YOgorCWNhc2UgQlBGX0pNUDMyIHwgQlBGX0pMRSB8IEJQRl9YOgor CQlpZiAocnZfb2Zmc2V0X2NoZWNrKCZydm9mZiwgb2ZmLCBpLCBjdHgpKQorCQkJcmV0dXJuIC0x OworCQlpZiAoIWlzNjQpCisJCQllbWl0X3pleHRfMzJfcmRfcnMoJnJkLCAmcnMsIGN0eCk7CisJ CWVtaXQocnZfYmdldShycywgcmQsIHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsKKwljYXNl IEJQRl9KTVAgfCBCUEZfSk5FIHwgQlBGX1g6CisJY2FzZSBCUEZfSk1QMzIgfCBCUEZfSk5FIHwg QlBGX1g6CisJCWlmIChydl9vZmZzZXRfY2hlY2soJnJ2b2ZmLCBvZmYsIGksIGN0eCkpCisJCQly ZXR1cm4gLTE7CisJCWlmICghaXM2NCkKKwkJCWVtaXRfemV4dF8zMl9yZF9ycygmcmQsICZycywg Y3R4KTsKKwkJZW1pdChydl9ibmUocmQsIHJzLCBydm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7 CisJY2FzZSBCUEZfSk1QIHwgQlBGX0pTR1QgfCBCUEZfWDoKKwljYXNlIEJQRl9KTVAzMiB8IEJQ Rl9KU0dUIHwgQlBGX1g6CisJCWlmIChydl9vZmZzZXRfY2hlY2soJnJ2b2ZmLCBvZmYsIGksIGN0 eCkpCisJCQlyZXR1cm4gLTE7CisJCWlmICghaXM2NCkKKwkJCWVtaXRfc2V4dF8zMl9yZF9ycygm cmQsICZycywgY3R4KTsKKwkJZW1pdChydl9ibHQocnMsIHJkLCBydm9mZiA+PiAxKSwgY3R4KTsK KwkJYnJlYWs7CisJY2FzZSBCUEZfSk1QIHwgQlBGX0pTTFQgfCBCUEZfWDoKKwljYXNlIEJQRl9K TVAzMiB8IEJQRl9KU0xUIHwgQlBGX1g6CisJCWlmIChydl9vZmZzZXRfY2hlY2soJnJ2b2ZmLCBv ZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWlmICghaXM2NCkKKwkJCWVtaXRfc2V4dF8z Ml9yZF9ycygmcmQsICZycywgY3R4KTsKKwkJZW1pdChydl9ibHQocmQsIHJzLCBydm9mZiA+PiAx KSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSk1QIHwgQlBGX0pTR0UgfCBCUEZfWDoKKwlj YXNlIEJQRl9KTVAzMiB8IEJQRl9KU0dFIHwgQlBGX1g6CisJCWlmIChydl9vZmZzZXRfY2hlY2so JnJ2b2ZmLCBvZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWlmICghaXM2NCkKKwkJCWVt aXRfc2V4dF8zMl9yZF9ycygmcmQsICZycywgY3R4KTsKKwkJZW1pdChydl9iZ2UocmQsIHJzLCBy dm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSk1QIHwgQlBGX0pTTEUgfCBC UEZfWDoKKwljYXNlIEJQRl9KTVAzMiB8IEJQRl9KU0xFIHwgQlBGX1g6CisJCWlmIChydl9vZmZz ZXRfY2hlY2soJnJ2b2ZmLCBvZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWlmICghaXM2 NCkKKwkJCWVtaXRfc2V4dF8zMl9yZF9ycygmcmQsICZycywgY3R4KTsKKwkJZW1pdChydl9iZ2Uo cnMsIHJkLCBydm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSk1QIHwgQlBG X0pTRVQgfCBCUEZfWDoKKwljYXNlIEJQRl9KTVAzMiB8IEJQRl9KU0VUIHwgQlBGX1g6CisJCWlm IChydl9vZmZzZXRfY2hlY2soJnJ2b2ZmLCBvZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJ CWlmICghaXM2NCkKKwkJCWVtaXRfemV4dF8zMl9yZF9ycygmcmQsICZycywgY3R4KTsKKwkJZW1p dChydl9hbmQoUlZfUkVHX1QxLCByZCwgcnMpLCBjdHgpOworCQllbWl0KHJ2X2JuZShSVl9SRUdf VDEsIFJWX1JFR19aRVJPLCBydm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisKKwkvKiBJRiAo ZHN0IENPTkQgaW1tKSBKVU1QIG9mZiAqLworCWNhc2UgQlBGX0pNUCB8IEJQRl9KRVEgfCBCUEZf SzoKKwljYXNlIEJQRl9KTVAzMiB8IEJQRl9KRVEgfCBCUEZfSzoKKwkJaWYgKHJ2X29mZnNldF9j aGVjaygmcnZvZmYsIG9mZiwgaSwgY3R4KSkKKwkJCXJldHVybiAtMTsKKwkJZW1pdF9pbW0oUlZf UkVHX1QxLCBpbW0sIGN0eCk7CisJCWlmICghaXM2NCkKKwkJCWVtaXRfemV4dF8zMl9yZF90MSgm cmQsIGN0eCk7CisJCWVtaXQocnZfYmVxKHJkLCBSVl9SRUdfVDEsIHJ2b2ZmID4+IDEpLCBjdHgp OworCQlicmVhazsKKwljYXNlIEJQRl9KTVAgfCBCUEZfSkdUIHwgQlBGX0s6CisJY2FzZSBCUEZf Sk1QMzIgfCBCUEZfSkdUIHwgQlBGX0s6CisJCWlmIChydl9vZmZzZXRfY2hlY2soJnJ2b2ZmLCBv ZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWVtaXRfaW1tKFJWX1JFR19UMSwgaW1tLCBj dHgpOworCQlpZiAoIWlzNjQpCisJCQllbWl0X3pleHRfMzJfcmRfdDEoJnJkLCBjdHgpOworCQll bWl0KHJ2X2JsdHUoUlZfUkVHX1QxLCByZCwgcnZvZmYgPj4gMSksIGN0eCk7CisJCWJyZWFrOwor CWNhc2UgQlBGX0pNUCB8IEJQRl9KTFQgfCBCUEZfSzoKKwljYXNlIEJQRl9KTVAzMiB8IEJQRl9K TFQgfCBCUEZfSzoKKwkJaWYgKHJ2X29mZnNldF9jaGVjaygmcnZvZmYsIG9mZiwgaSwgY3R4KSkK KwkJCXJldHVybiAtMTsKKwkJZW1pdF9pbW0oUlZfUkVHX1QxLCBpbW0sIGN0eCk7CisJCWlmICgh aXM2NCkKKwkJCWVtaXRfemV4dF8zMl9yZF90MSgmcmQsIGN0eCk7CisJCWVtaXQocnZfYmx0dShy ZCwgUlZfUkVHX1QxLCBydm9mZiA+PiAxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfSk1Q IHwgQlBGX0pHRSB8IEJQRl9LOgorCWNhc2UgQlBGX0pNUDMyIHwgQlBGX0pHRSB8IEJQRl9LOgor CQlpZiAocnZfb2Zmc2V0X2NoZWNrKCZydm9mZiwgb2ZmLCBpLCBjdHgpKQorCQkJcmV0dXJuIC0x OworCQllbWl0X2ltbShSVl9SRUdfVDEsIGltbSwgY3R4KTsKKwkJaWYgKCFpczY0KQorCQkJZW1p dF96ZXh0XzMyX3JkX3QxKCZyZCwgY3R4KTsKKwkJZW1pdChydl9iZ2V1KHJkLCBSVl9SRUdfVDEs IHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9KTVAgfCBCUEZfSkxFIHwg QlBGX0s6CisJY2FzZSBCUEZfSk1QMzIgfCBCUEZfSkxFIHwgQlBGX0s6CisJCWlmIChydl9vZmZz ZXRfY2hlY2soJnJ2b2ZmLCBvZmYsIGksIGN0eCkpCisJCQlyZXR1cm4gLTE7CisJCWVtaXRfaW1t KFJWX1JFR19UMSwgaW1tLCBjdHgpOworCQlpZiAoIWlzNjQpCisJCQllbWl0X3pleHRfMzJfcmRf dDEoJnJkLCBjdHgpOworCQllbWl0KHJ2X2JnZXUoUlZfUkVHX1QxLCByZCwgcnZvZmYgPj4gMSks IGN0eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX0pNUCB8IEJQRl9KTkUgfCBCUEZfSzoKKwljYXNl IEJQRl9KTVAzMiB8IEJQRl9KTkUgfCBCUEZfSzoKKwkJaWYgKHJ2X29mZnNldF9jaGVjaygmcnZv ZmYsIG9mZiwgaSwgY3R4KSkKKwkJCXJldHVybiAtMTsKKwkJZW1pdF9pbW0oUlZfUkVHX1QxLCBp bW0sIGN0eCk7CisJCWlmICghaXM2NCkKKwkJCWVtaXRfemV4dF8zMl9yZF90MSgmcmQsIGN0eCk7 CisJCWVtaXQocnZfYm5lKHJkLCBSVl9SRUdfVDEsIHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVh azsKKwljYXNlIEJQRl9KTVAgfCBCUEZfSlNHVCB8IEJQRl9LOgorCWNhc2UgQlBGX0pNUDMyIHwg QlBGX0pTR1QgfCBCUEZfSzoKKwkJaWYgKHJ2X29mZnNldF9jaGVjaygmcnZvZmYsIG9mZiwgaSwg Y3R4KSkKKwkJCXJldHVybiAtMTsKKwkJZW1pdF9pbW0oUlZfUkVHX1QxLCBpbW0sIGN0eCk7CisJ CWlmICghaXM2NCkKKwkJCWVtaXRfc2V4dF8zMl9yZCgmcmQsIGN0eCk7CisJCWVtaXQocnZfYmx0 KFJWX1JFR19UMSwgcmQsIHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9K TVAgfCBCUEZfSlNMVCB8IEJQRl9LOgorCWNhc2UgQlBGX0pNUDMyIHwgQlBGX0pTTFQgfCBCUEZf SzoKKwkJaWYgKHJ2X29mZnNldF9jaGVjaygmcnZvZmYsIG9mZiwgaSwgY3R4KSkKKwkJCXJldHVy biAtMTsKKwkJZW1pdF9pbW0oUlZfUkVHX1QxLCBpbW0sIGN0eCk7CisJCWlmICghaXM2NCkKKwkJ CWVtaXRfc2V4dF8zMl9yZCgmcmQsIGN0eCk7CisJCWVtaXQocnZfYmx0KHJkLCBSVl9SRUdfVDEs IHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9KTVAgfCBCUEZfSlNHRSB8 IEJQRl9LOgorCWNhc2UgQlBGX0pNUDMyIHwgQlBGX0pTR0UgfCBCUEZfSzoKKwkJaWYgKHJ2X29m ZnNldF9jaGVjaygmcnZvZmYsIG9mZiwgaSwgY3R4KSkKKwkJCXJldHVybiAtMTsKKwkJZW1pdF9p bW0oUlZfUkVHX1QxLCBpbW0sIGN0eCk7CisJCWlmICghaXM2NCkKKwkJCWVtaXRfc2V4dF8zMl9y ZCgmcmQsIGN0eCk7CisJCWVtaXQocnZfYmdlKHJkLCBSVl9SRUdfVDEsIHJ2b2ZmID4+IDEpLCBj dHgpOworCQlicmVhazsKKwljYXNlIEJQRl9KTVAgfCBCUEZfSlNMRSB8IEJQRl9LOgorCWNhc2Ug QlBGX0pNUDMyIHwgQlBGX0pTTEUgfCBCUEZfSzoKKwkJaWYgKHJ2X29mZnNldF9jaGVjaygmcnZv ZmYsIG9mZiwgaSwgY3R4KSkKKwkJCXJldHVybiAtMTsKKwkJZW1pdF9pbW0oUlZfUkVHX1QxLCBp bW0sIGN0eCk7CisJCWlmICghaXM2NCkKKwkJCWVtaXRfc2V4dF8zMl9yZCgmcmQsIGN0eCk7CisJ CWVtaXQocnZfYmdlKFJWX1JFR19UMSwgcmQsIHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsK KwljYXNlIEJQRl9KTVAgfCBCUEZfSlNFVCB8IEJQRl9LOgorCWNhc2UgQlBGX0pNUDMyIHwgQlBG X0pTRVQgfCBCUEZfSzoKKwkJaWYgKHJ2X29mZnNldF9jaGVjaygmcnZvZmYsIG9mZiwgaSwgY3R4 KSkKKwkJCXJldHVybiAtMTsKKwkJZW1pdF9pbW0oUlZfUkVHX1QxLCBpbW0sIGN0eCk7CisJCWlm ICghaXM2NCkKKwkJCWVtaXRfemV4dF8zMl9yZF90MSgmcmQsIGN0eCk7CisJCWVtaXQocnZfYW5k KFJWX1JFR19UMSwgcmQsIFJWX1JFR19UMSksIGN0eCk7CisJCWVtaXQocnZfYm5lKFJWX1JFR19U MSwgUlZfUkVHX1pFUk8sIHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsKKworCS8qIGZ1bmN0 aW9uIGNhbGwgKi8KKwljYXNlIEJQRl9KTVAgfCBCUEZfQ0FMTDoKKwl7CisJCWJvb2wgZml4ZWQ7 CisJCWludCBpLCByZXQ7CisJCXU2NCBhZGRyOworCisJCW1hcmtfY2FsbChjdHgpOworCQlyZXQg PSBicGZfaml0X2dldF9mdW5jX2FkZHIoY3R4LT5wcm9nLCBpbnNuLCBleHRyYV9wYXNzLCAmYWRk ciwKKwkJCQkJICAgICZmaXhlZCk7CisJCWlmIChyZXQgPCAwKQorCQkJcmV0dXJuIHJldDsKKwkJ aWYgKGZpeGVkKSB7CisJCQllbWl0X2ltbShSVl9SRUdfVDEsIGFkZHIsIGN0eCk7CisJCX0gZWxz ZSB7CisJCQlpID0gY3R4LT5uaW5zbnM7CisJCQllbWl0X2ltbShSVl9SRUdfVDEsIGFkZHIsIGN0 eCk7CisJCQlmb3IgKGkgPSBjdHgtPm5pbnNucyAtIGk7IGkgPCA4OyBpKyspIHsKKwkJCQkvKiBu b3AgKi8KKwkJCQllbWl0KHJ2X2FkZGkoUlZfUkVHX1pFUk8sIFJWX1JFR19aRVJPLCAwKSwKKwkJ CQkgICAgIGN0eCk7CisJCQl9CisJCX0KKwkJZW1pdChydl9qYWxyKFJWX1JFR19SQSwgUlZfUkVH X1QxLCAwKSwgY3R4KTsKKwkJcmQgPSBicGZfdG9fcnZfcmVnKEJQRl9SRUdfMCwgY3R4KTsKKwkJ ZW1pdChydl9hZGRpKHJkLCBSVl9SRUdfQTAsIDApLCBjdHgpOworCQlicmVhazsKKwl9CisJLyog dGFpbCBjYWxsICovCisJY2FzZSBCUEZfSk1QIHwgQlBGX1RBSUxfQ0FMTDoKKwkJaWYgKGVtaXRf YnBmX3RhaWxfY2FsbChpLCBjdHgpKQorCQkJcmV0dXJuIC0xOworCQlicmVhazsKKworCS8qIGZ1 bmN0aW9uIHJldHVybiAqLworCWNhc2UgQlBGX0pNUCB8IEJQRl9FWElUOgorCQlpZiAoaSA9PSBj dHgtPnByb2ctPmxlbiAtIDEpCisJCQlicmVhazsKKworCQlydm9mZiA9IGVwaWxvZ3VlX29mZnNl dChjdHgpOworCQlpZiAoaXNfMjFiX2NoZWNrKHJ2b2ZmLCBpKSkKKwkJCXJldHVybiAtMTsKKwkJ ZW1pdChydl9qYWwoUlZfUkVHX1pFUk8sIHJ2b2ZmID4+IDEpLCBjdHgpOworCQlicmVhazsKKwor CS8qIGRzdCA9IGltbTY0ICovCisJY2FzZSBCUEZfTEQgfCBCUEZfSU1NIHwgQlBGX0RXOgorCXsK KwkJc3RydWN0IGJwZl9pbnNuIGluc24xID0gaW5zblsxXTsKKwkJdTY0IGltbTY0OworCisJCWlt bTY0ID0gKHU2NClpbnNuMS5pbW0gPDwgMzIgfCAodTMyKWltbTsKKwkJZW1pdF9pbW0ocmQsIGlt bTY0LCBjdHgpOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBMRFg6IGRzdCA9ICooc2l6ZSAqKShz cmMgKyBvZmYpICovCisJY2FzZSBCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9COgorCQlpZiAoaXNf MTJiX2ludChvZmYpKSB7CisJCQllbWl0KHJ2X2xidShyZCwgb2ZmLCBycyksIGN0eCk7CisJCQli cmVhazsKKwkJfQorCisJCWVtaXRfaW1tKFJWX1JFR19UMSwgb2ZmLCBjdHgpOworCQllbWl0KHJ2 X2FkZChSVl9SRUdfVDEsIFJWX1JFR19UMSwgcnMpLCBjdHgpOworCQllbWl0KHJ2X2xidShyZCwg MCwgUlZfUkVHX1QxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfTERYIHwgQlBGX01FTSB8 IEJQRl9IOgorCQlpZiAoaXNfMTJiX2ludChvZmYpKSB7CisJCQllbWl0KHJ2X2xodShyZCwgb2Zm LCBycyksIGN0eCk7CisJCQlicmVhazsKKwkJfQorCisJCWVtaXRfaW1tKFJWX1JFR19UMSwgb2Zm LCBjdHgpOworCQllbWl0KHJ2X2FkZChSVl9SRUdfVDEsIFJWX1JFR19UMSwgcnMpLCBjdHgpOwor CQllbWl0KHJ2X2xodShyZCwgMCwgUlZfUkVHX1QxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBC UEZfTERYIHwgQlBGX01FTSB8IEJQRl9XOgorCQlpZiAoaXNfMTJiX2ludChvZmYpKSB7CisJCQll bWl0KHJ2X2x3dShyZCwgb2ZmLCBycyksIGN0eCk7CisJCQlicmVhazsKKwkJfQorCisJCWVtaXRf aW1tKFJWX1JFR19UMSwgb2ZmLCBjdHgpOworCQllbWl0KHJ2X2FkZChSVl9SRUdfVDEsIFJWX1JF R19UMSwgcnMpLCBjdHgpOworCQllbWl0KHJ2X2x3dShyZCwgMCwgUlZfUkVHX1QxKSwgY3R4KTsK KwkJYnJlYWs7CisJY2FzZSBCUEZfTERYIHwgQlBGX01FTSB8IEJQRl9EVzoKKwkJaWYgKGlzXzEy Yl9pbnQob2ZmKSkgeworCQkJZW1pdChydl9sZChyZCwgb2ZmLCBycyksIGN0eCk7CisJCQlicmVh azsKKwkJfQorCisJCWVtaXRfaW1tKFJWX1JFR19UMSwgb2ZmLCBjdHgpOworCQllbWl0KHJ2X2Fk ZChSVl9SRUdfVDEsIFJWX1JFR19UMSwgcnMpLCBjdHgpOworCQllbWl0KHJ2X2xkKHJkLCAwLCBS Vl9SRUdfVDEpLCBjdHgpOworCQlicmVhazsKKworCS8qIFNUOiAqKHNpemUgKikoZHN0ICsgb2Zm KSA9IGltbSAqLworCWNhc2UgQlBGX1NUIHwgQlBGX01FTSB8IEJQRl9COgorCQllbWl0X2ltbShS Vl9SRUdfVDEsIGltbSwgY3R4KTsKKwkJaWYgKGlzXzEyYl9pbnQob2ZmKSkgeworCQkJZW1pdChy dl9zYihyZCwgb2ZmLCBSVl9SRUdfVDEpLCBjdHgpOworCQkJYnJlYWs7CisJCX0KKworCQllbWl0 X2ltbShSVl9SRUdfVDIsIG9mZiwgY3R4KTsKKwkJZW1pdChydl9hZGQoUlZfUkVHX1QyLCBSVl9S RUdfVDIsIHJkKSwgY3R4KTsKKwkJZW1pdChydl9zYihSVl9SRUdfVDIsIDAsIFJWX1JFR19UMSks IGN0eCk7CisJCWJyZWFrOworCisJY2FzZSBCUEZfU1QgfCBCUEZfTUVNIHwgQlBGX0g6CisJCWVt aXRfaW1tKFJWX1JFR19UMSwgaW1tLCBjdHgpOworCQlpZiAoaXNfMTJiX2ludChvZmYpKSB7CisJ CQllbWl0KHJ2X3NoKHJkLCBvZmYsIFJWX1JFR19UMSksIGN0eCk7CisJCQlicmVhazsKKwkJfQor CisJCWVtaXRfaW1tKFJWX1JFR19UMiwgb2ZmLCBjdHgpOworCQllbWl0KHJ2X2FkZChSVl9SRUdf VDIsIFJWX1JFR19UMiwgcmQpLCBjdHgpOworCQllbWl0KHJ2X3NoKFJWX1JFR19UMiwgMCwgUlZf UkVHX1QxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfU1QgfCBCUEZfTUVNIHwgQlBGX1c6 CisJCWVtaXRfaW1tKFJWX1JFR19UMSwgaW1tLCBjdHgpOworCQlpZiAoaXNfMTJiX2ludChvZmYp KSB7CisJCQllbWl0KHJ2X3N3KHJkLCBvZmYsIFJWX1JFR19UMSksIGN0eCk7CisJCQlicmVhazsK KwkJfQorCisJCWVtaXRfaW1tKFJWX1JFR19UMiwgb2ZmLCBjdHgpOworCQllbWl0KHJ2X2FkZChS Vl9SRUdfVDIsIFJWX1JFR19UMiwgcmQpLCBjdHgpOworCQllbWl0KHJ2X3N3KFJWX1JFR19UMiwg MCwgUlZfUkVHX1QxKSwgY3R4KTsKKwkJYnJlYWs7CisJY2FzZSBCUEZfU1QgfCBCUEZfTUVNIHwg QlBGX0RXOgorCQllbWl0X2ltbShSVl9SRUdfVDEsIGltbSwgY3R4KTsKKwkJaWYgKGlzXzEyYl9p bnQob2ZmKSkgeworCQkJZW1pdChydl9zZChyZCwgb2ZmLCBSVl9SRUdfVDEpLCBjdHgpOworCQkJ YnJlYWs7CisJCX0KKworCQllbWl0X2ltbShSVl9SRUdfVDIsIG9mZiwgY3R4KTsKKwkJZW1pdChy dl9hZGQoUlZfUkVHX1QyLCBSVl9SRUdfVDIsIHJkKSwgY3R4KTsKKwkJZW1pdChydl9zZChSVl9S RUdfVDIsIDAsIFJWX1JFR19UMSksIGN0eCk7CisJCWJyZWFrOworCisJLyogU1RYOiAqKHNpemUg KikoZHN0ICsgb2ZmKSA9IHNyYyAqLworCWNhc2UgQlBGX1NUWCB8IEJQRl9NRU0gfCBCUEZfQjoK KwkJaWYgKGlzXzEyYl9pbnQob2ZmKSkgeworCQkJZW1pdChydl9zYihyZCwgb2ZmLCBycyksIGN0 eCk7CisJCQlicmVhazsKKwkJfQorCisJCWVtaXRfaW1tKFJWX1JFR19UMSwgb2ZmLCBjdHgpOwor CQllbWl0KHJ2X2FkZChSVl9SRUdfVDEsIFJWX1JFR19UMSwgcmQpLCBjdHgpOworCQllbWl0KHJ2 X3NiKFJWX1JFR19UMSwgMCwgcnMpLCBjdHgpOworCQlicmVhazsKKwljYXNlIEJQRl9TVFggfCBC UEZfTUVNIHwgQlBGX0g6CisJCWlmIChpc18xMmJfaW50KG9mZikpIHsKKwkJCWVtaXQocnZfc2go cmQsIG9mZiwgcnMpLCBjdHgpOworCQkJYnJlYWs7CisJCX0KKworCQllbWl0X2ltbShSVl9SRUdf VDEsIG9mZiwgY3R4KTsKKwkJZW1pdChydl9hZGQoUlZfUkVHX1QxLCBSVl9SRUdfVDEsIHJkKSwg Y3R4KTsKKwkJZW1pdChydl9zaChSVl9SRUdfVDEsIDAsIHJzKSwgY3R4KTsKKwkJYnJlYWs7CisJ Y2FzZSBCUEZfU1RYIHwgQlBGX01FTSB8IEJQRl9XOgorCQlpZiAoaXNfMTJiX2ludChvZmYpKSB7 CisJCQllbWl0KHJ2X3N3KHJkLCBvZmYsIHJzKSwgY3R4KTsKKwkJCWJyZWFrOworCQl9CisKKwkJ ZW1pdF9pbW0oUlZfUkVHX1QxLCBvZmYsIGN0eCk7CisJCWVtaXQocnZfYWRkKFJWX1JFR19UMSwg UlZfUkVHX1QxLCByZCksIGN0eCk7CisJCWVtaXQocnZfc3coUlZfUkVHX1QxLCAwLCBycyksIGN0 eCk7CisJCWJyZWFrOworCWNhc2UgQlBGX1NUWCB8IEJQRl9NRU0gfCBCUEZfRFc6CisJCWlmIChp c18xMmJfaW50KG9mZikpIHsKKwkJCWVtaXQocnZfc2QocmQsIG9mZiwgcnMpLCBjdHgpOworCQkJ YnJlYWs7CisJCX0KKworCQllbWl0X2ltbShSVl9SRUdfVDEsIG9mZiwgY3R4KTsKKwkJZW1pdChy dl9hZGQoUlZfUkVHX1QxLCBSVl9SRUdfVDEsIHJkKSwgY3R4KTsKKwkJZW1pdChydl9zZChSVl9S RUdfVDEsIDAsIHJzKSwgY3R4KTsKKwkJYnJlYWs7CisJLyogU1RYIFhBREQ6IGxvY2sgKih1MzIg KikoZHN0ICsgb2ZmKSArPSBzcmMgKi8KKwljYXNlIEJQRl9TVFggfCBCUEZfWEFERCB8IEJQRl9X OgorCS8qIFNUWCBYQUREOiBsb2NrICoodTY0ICopKGRzdCArIG9mZikgKz0gc3JjICovCisJY2Fz ZSBCUEZfU1RYIHwgQlBGX1hBREQgfCBCUEZfRFc6CisJCWlmIChvZmYpIHsKKwkJCWlmIChpc18x MmJfaW50KG9mZikpIHsKKwkJCQllbWl0KHJ2X2FkZGkoUlZfUkVHX1QxLCByZCwgb2ZmKSwgY3R4 KTsKKwkJCX0gZWxzZSB7CisJCQkJZW1pdF9pbW0oUlZfUkVHX1QxLCBvZmYsIGN0eCk7CisJCQkJ ZW1pdChydl9hZGQoUlZfUkVHX1QxLCBSVl9SRUdfVDEsIHJkKSwgY3R4KTsKKwkJCX0KKworCQkJ cmQgPSBSVl9SRUdfVDE7CisJCX0KKworCQllbWl0KEJQRl9TSVpFKGNvZGUpID09IEJQRl9XID8K KwkJICAgICBydl9hbW9hZGRfdyhSVl9SRUdfWkVSTywgcnMsIHJkLCAwLCAwKSA6CisJCSAgICAg cnZfYW1vYWRkX2QoUlZfUkVHX1pFUk8sIHJzLCByZCwgMCwgMCksIGN0eCk7CisJCWJyZWFrOwor CWRlZmF1bHQ6CisJCXByX2VycigiYnBmLWppdDogdW5rbm93biBvcGNvZGUgJTAyeFxuIiwgY29k ZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9p ZCBidWlsZF9wcm9sb2d1ZShzdHJ1Y3QgcnZfaml0X2NvbnRleHQgKmN0eCkKK3sKKwlpbnQgc3Rh Y2tfYWRqdXN0ID0gMCwgc3RvcmVfb2Zmc2V0LCBicGZfc3RhY2tfYWRqdXN0OworCisJaWYgKHNl ZW5fcmVnKFJWX1JFR19SQSwgY3R4KSkKKwkJc3RhY2tfYWRqdXN0ICs9IDg7CisJc3RhY2tfYWRq dXN0ICs9IDg7IC8qIFJWX1JFR19GUCAqLworCWlmIChzZWVuX3JlZyhSVl9SRUdfUzEsIGN0eCkp CisJCXN0YWNrX2FkanVzdCArPSA4OworCWlmIChzZWVuX3JlZyhSVl9SRUdfUzIsIGN0eCkpCisJ CXN0YWNrX2FkanVzdCArPSA4OworCWlmIChzZWVuX3JlZyhSVl9SRUdfUzMsIGN0eCkpCisJCXN0 YWNrX2FkanVzdCArPSA4OworCWlmIChzZWVuX3JlZyhSVl9SRUdfUzQsIGN0eCkpCisJCXN0YWNr X2FkanVzdCArPSA4OworCWlmIChzZWVuX3JlZyhSVl9SRUdfUzUsIGN0eCkpCisJCXN0YWNrX2Fk anVzdCArPSA4OworCWlmIChzZWVuX3JlZyhSVl9SRUdfUzYsIGN0eCkpCisJCXN0YWNrX2FkanVz dCArPSA4OworCisJc3RhY2tfYWRqdXN0ID0gcm91bmRfdXAoc3RhY2tfYWRqdXN0LCAxNik7CisJ YnBmX3N0YWNrX2FkanVzdCA9IHJvdW5kX3VwKGN0eC0+cHJvZy0+YXV4LT5zdGFja19kZXB0aCwg MTYpOworCXN0YWNrX2FkanVzdCArPSBicGZfc3RhY2tfYWRqdXN0OworCisJc3RvcmVfb2Zmc2V0 ID0gc3RhY2tfYWRqdXN0IC0gODsKKworCS8qIEZpcnN0IGluc3RydWN0aW9uIGlzIGFsd2F5cyBz ZXR0aW5nIHRoZSB0YWlsLWNhbGwtY291bnRlcgorCSAqIChUQ0MpIHJlZ2lzdGVyLiBUaGlzIGlu c3RydWN0aW9uIGlzIHNraXBwZWQgZm9yIHRhaWwgY2FsbHMuCisJICovCisJZW1pdChydl9hZGRp KFJWX1JFR19UQ0MsIFJWX1JFR19aRVJPLCBNQVhfVEFJTF9DQUxMX0NOVCksIGN0eCk7CisKKwll bWl0KHJ2X2FkZGkoUlZfUkVHX1NQLCBSVl9SRUdfU1AsIC1zdGFja19hZGp1c3QpLCBjdHgpOwor CisJaWYgKHNlZW5fcmVnKFJWX1JFR19SQSwgY3R4KSkgeworCQllbWl0KHJ2X3NkKFJWX1JFR19T UCwgc3RvcmVfb2Zmc2V0LCBSVl9SRUdfUkEpLCBjdHgpOworCQlzdG9yZV9vZmZzZXQgLT0gODsK Kwl9CisJZW1pdChydl9zZChSVl9SRUdfU1AsIHN0b3JlX29mZnNldCwgUlZfUkVHX0ZQKSwgY3R4 KTsKKwlzdG9yZV9vZmZzZXQgLT0gODsKKwlpZiAoc2Vlbl9yZWcoUlZfUkVHX1MxLCBjdHgpKSB7 CisJCWVtaXQocnZfc2QoUlZfUkVHX1NQLCBzdG9yZV9vZmZzZXQsIFJWX1JFR19TMSksIGN0eCk7 CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwlpZiAoc2Vlbl9yZWcoUlZfUkVHX1MyLCBjdHgp KSB7CisJCWVtaXQocnZfc2QoUlZfUkVHX1NQLCBzdG9yZV9vZmZzZXQsIFJWX1JFR19TMiksIGN0 eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwlpZiAoc2Vlbl9yZWcoUlZfUkVHX1MzLCBj dHgpKSB7CisJCWVtaXQocnZfc2QoUlZfUkVHX1NQLCBzdG9yZV9vZmZzZXQsIFJWX1JFR19TMyks IGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwlpZiAoc2Vlbl9yZWcoUlZfUkVHX1M0 LCBjdHgpKSB7CisJCWVtaXQocnZfc2QoUlZfUkVHX1NQLCBzdG9yZV9vZmZzZXQsIFJWX1JFR19T NCksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwlpZiAoc2Vlbl9yZWcoUlZfUkVH X1M1LCBjdHgpKSB7CisJCWVtaXQocnZfc2QoUlZfUkVHX1NQLCBzdG9yZV9vZmZzZXQsIFJWX1JF R19TNSksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKwlpZiAoc2Vlbl9yZWcoUlZf UkVHX1M2LCBjdHgpKSB7CisJCWVtaXQocnZfc2QoUlZfUkVHX1NQLCBzdG9yZV9vZmZzZXQsIFJW X1JFR19TNiksIGN0eCk7CisJCXN0b3JlX29mZnNldCAtPSA4OworCX0KKworCWVtaXQocnZfYWRk aShSVl9SRUdfRlAsIFJWX1JFR19TUCwgc3RhY2tfYWRqdXN0KSwgY3R4KTsKKworCWlmIChicGZf c3RhY2tfYWRqdXN0KQorCQllbWl0KHJ2X2FkZGkoUlZfUkVHX1M1LCBSVl9SRUdfU1AsIGJwZl9z dGFja19hZGp1c3QpLCBjdHgpOworCisJLyogUHJvZ3JhbSBjb250YWlucyBjYWxscyBhbmQgdGFp bCBjYWxscywgc28gUlZfUkVHX1RDQyBuZWVkCisJICogdG8gYmUgc2F2ZWQgYWNyb3NzIGNhbGxz LgorCSAqLworCWlmIChzZWVuX3RhaWxfY2FsbChjdHgpICYmIHNlZW5fY2FsbChjdHgpKQorCQll bWl0KHJ2X2FkZGkoUlZfUkVHX1RDQ19TQVZFRCwgUlZfUkVHX1RDQywgMCksIGN0eCk7CisKKwlj dHgtPnN0YWNrX3NpemUgPSBzdGFja19hZGp1c3Q7Cit9CisKK3N0YXRpYyB2b2lkIGJ1aWxkX2Vw aWxvZ3VlKHN0cnVjdCBydl9qaXRfY29udGV4dCAqY3R4KQoreworCV9fYnVpbGRfZXBpbG9ndWUo UlZfUkVHX1JBLCBjdHgpOworfQorCitzdGF0aWMgaW50IGJ1aWxkX2JvZHkoc3RydWN0IHJ2X2pp dF9jb250ZXh0ICpjdHgsIGJvb2wgZXh0cmFfcGFzcykKK3sKKwljb25zdCBzdHJ1Y3QgYnBmX3By b2cgKnByb2cgPSBjdHgtPnByb2c7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgcHJvZy0+ bGVuOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IGJwZl9pbnNuICppbnNuID0gJnByb2ctPmluc25z aVtpXTsKKwkJaW50IHJldDsKKworCQlyZXQgPSBlbWl0X2luc24oaW5zbiwgY3R4LCBleHRyYV9w YXNzKTsKKwkJaWYgKHJldCA+IDApIHsKKwkJCWkrKzsKKwkJCWlmIChjdHgtPmluc25zID09IE5V TEwpCisJCQkJY3R4LT5vZmZzZXRbaV0gPSBjdHgtPm5pbnNuczsKKwkJCWNvbnRpbnVlOworCQl9 CisJCWlmIChjdHgtPmluc25zID09IE5VTEwpCisJCQljdHgtPm9mZnNldFtpXSA9IGN0eC0+bmlu c25zOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0 YXRpYyB2b2lkIGJwZl9maWxsX2lsbF9pbnNucyh2b2lkICphcmVhLCB1bnNpZ25lZCBpbnQgc2l6 ZSkKK3sKKwltZW1zZXQoYXJlYSwgMCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGJwZl9mbHVz aF9pY2FjaGUodm9pZCAqc3RhcnQsIHZvaWQgKmVuZCkKK3sKKwlmbHVzaF9pY2FjaGVfcmFuZ2Uo KHVuc2lnbmVkIGxvbmcpc3RhcnQsICh1bnNpZ25lZCBsb25nKWVuZCk7Cit9CisKK3N0cnVjdCBi cGZfcHJvZyAqYnBmX2ludF9qaXRfY29tcGlsZShzdHJ1Y3QgYnBmX3Byb2cgKnByb2cpCit7CisJ Ym9vbCB0bXBfYmxpbmRlZCA9IGZhbHNlLCBleHRyYV9wYXNzID0gZmFsc2U7CisJc3RydWN0IGJw Zl9wcm9nICp0bXAsICpvcmlnX3Byb2cgPSBwcm9nOworCXN0cnVjdCBydl9qaXRfZGF0YSAqaml0 X2RhdGE7CisJc3RydWN0IHJ2X2ppdF9jb250ZXh0ICpjdHg7CisJdW5zaWduZWQgaW50IGltYWdl X3NpemU7CisKKwlpZiAoIXByb2ctPmppdF9yZXF1ZXN0ZWQpCisJCXJldHVybiBvcmlnX3Byb2c7 CisKKwl0bXAgPSBicGZfaml0X2JsaW5kX2NvbnN0YW50cyhwcm9nKTsKKwlpZiAoSVNfRVJSKHRt cCkpCisJCXJldHVybiBvcmlnX3Byb2c7CisJaWYgKHRtcCAhPSBwcm9nKSB7CisJCXRtcF9ibGlu ZGVkID0gdHJ1ZTsKKwkJcHJvZyA9IHRtcDsKKwl9CisKKwlqaXRfZGF0YSA9IHByb2ctPmF1eC0+ aml0X2RhdGE7CisJaWYgKCFqaXRfZGF0YSkgeworCQlqaXRfZGF0YSA9IGt6YWxsb2Moc2l6ZW9m KCpqaXRfZGF0YSksIEdGUF9LRVJORUwpOworCQlpZiAoIWppdF9kYXRhKSB7CisJCQlwcm9nID0g b3JpZ19wcm9nOworCQkJZ290byBvdXQ7CisJCX0KKwkJcHJvZy0+YXV4LT5qaXRfZGF0YSA9IGpp dF9kYXRhOworCX0KKworCWN0eCA9ICZqaXRfZGF0YS0+Y3R4OworCisJaWYgKGN0eC0+b2Zmc2V0 KSB7CisJCWV4dHJhX3Bhc3MgPSB0cnVlOworCQlpbWFnZV9zaXplID0gc2l6ZW9mKHUzMikgKiBj dHgtPm5pbnNuczsKKwkJZ290byBza2lwX2luaXRfY3R4OworCX0KKworCWN0eC0+cHJvZyA9IHBy b2c7CisJY3R4LT5vZmZzZXQgPSBrY2FsbG9jKHByb2ctPmxlbiwgc2l6ZW9mKGludCksIEdGUF9L RVJORUwpOworCWlmICghY3R4LT5vZmZzZXQpIHsKKwkJcHJvZyA9IG9yaWdfcHJvZzsKKwkJZ290 byBvdXRfb2Zmc2V0OworCX0KKworCS8qIEZpcnN0IHBhc3MgZ2VuZXJhdGVzIHRoZSBjdHgtPm9m ZnNldCwgYnV0IGRvZXMgbm90IGVtaXQgYW4gaW1hZ2UuICovCisJaWYgKGJ1aWxkX2JvZHkoY3R4 LCBleHRyYV9wYXNzKSkgeworCQlwcm9nID0gb3JpZ19wcm9nOworCQlnb3RvIG91dF9vZmZzZXQ7 CisJfQorCWJ1aWxkX3Byb2xvZ3VlKGN0eCk7CisJY3R4LT5lcGlsb2d1ZV9vZmZzZXQgPSBjdHgt Pm5pbnNuczsKKwlidWlsZF9lcGlsb2d1ZShjdHgpOworCisJLyogQWxsb2NhdGUgaW1hZ2UsIG5v dyB0aGF0IHdlIGtub3cgdGhlIHNpemUuICovCisJaW1hZ2Vfc2l6ZSA9IHNpemVvZih1MzIpICog Y3R4LT5uaW5zbnM7CisJaml0X2RhdGEtPmhlYWRlciA9IGJwZl9qaXRfYmluYXJ5X2FsbG9jKGlt YWdlX3NpemUsICZqaXRfZGF0YS0+aW1hZ2UsCisJCQkJCQlzaXplb2YodTMyKSwKKwkJCQkJCWJw Zl9maWxsX2lsbF9pbnNucyk7CisJaWYgKCFqaXRfZGF0YS0+aGVhZGVyKSB7CisJCXByb2cgPSBv cmlnX3Byb2c7CisJCWdvdG8gb3V0X29mZnNldDsKKwl9CisKKwkvKiBTZWNvbmQsIHJlYWwgcGFz cywgdGhhdCBhY3V0YWxseSBlbWl0cyB0aGUgaW1hZ2UuICovCisJY3R4LT5pbnNucyA9ICh1MzIg KilqaXRfZGF0YS0+aW1hZ2U7Citza2lwX2luaXRfY3R4OgorCWN0eC0+bmluc25zID0gMDsKKwor CWJ1aWxkX3Byb2xvZ3VlKGN0eCk7CisJaWYgKGJ1aWxkX2JvZHkoY3R4LCBleHRyYV9wYXNzKSkg eworCQlicGZfaml0X2JpbmFyeV9mcmVlKGppdF9kYXRhLT5oZWFkZXIpOworCQlwcm9nID0gb3Jp Z19wcm9nOworCQlnb3RvIG91dF9vZmZzZXQ7CisJfQorCWJ1aWxkX2VwaWxvZ3VlKGN0eCk7CisK KwlpZiAoYnBmX2ppdF9lbmFibGUgPiAxKQorCQlicGZfaml0X2R1bXAocHJvZy0+bGVuLCBpbWFn ZV9zaXplLCAyLCBjdHgtPmluc25zKTsKKworCXByb2ctPmJwZl9mdW5jID0gKHZvaWQgKiljdHgt Pmluc25zOworCXByb2ctPmppdGVkID0gMTsKKwlwcm9nLT5qaXRlZF9sZW4gPSBpbWFnZV9zaXpl OworCisJYnBmX2ZsdXNoX2ljYWNoZShqaXRfZGF0YS0+aGVhZGVyLCBjdHgtPmluc25zICsgY3R4 LT5uaW5zbnMpOworCisJaWYgKCFwcm9nLT5pc19mdW5jIHx8IGV4dHJhX3Bhc3MpIHsKK291dF9v ZmZzZXQ6CisJCWtmcmVlKGN0eC0+b2Zmc2V0KTsKKwkJa2ZyZWUoaml0X2RhdGEpOworCQlwcm9n LT5hdXgtPmppdF9kYXRhID0gTlVMTDsKKwl9CitvdXQ6CisJaWYgKHRtcF9ibGluZGVkKQorCQli cGZfaml0X3Byb2dfcmVsZWFzZV9vdGhlcihwcm9nLCBwcm9nID09IG9yaWdfcHJvZyA/CisJCQkJ CSAgIHRtcCA6IG9yaWdfcHJvZyk7CisJcmV0dXJuIHByb2c7Cit9Ci0tIAoyLjE5LjEKCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1yaXNjdiBt YWlsaW5nIGxpc3QKbGludXgtcmlzY3ZAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMu aW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cg==