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=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,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 D3EDAC433DB for ; Mon, 8 Feb 2021 05:58:06 +0000 (UTC) Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (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 36B6264E6C for ; Mon, 8 Feb 2021 05:58:06 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 36B6264E6C Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=quicinc.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Received: from localhost ([::1]:38784 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1l8zYj-000495-3C for qemu-devel@archiver.kernel.org; Mon, 08 Feb 2021 00:58:05 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:56012) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1l8zO8-0007sJ-2I for qemu-devel@nongnu.org; Mon, 08 Feb 2021 00:47:08 -0500 Received: from alexa-out-sd-02.qualcomm.com ([199.106.114.39]:35765) by eggs.gnu.org with esmtps (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1l8zO3-0006SB-Rg for qemu-devel@nongnu.org; Mon, 08 Feb 2021 00:47:07 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=quicinc.com; i=@quicinc.com; q=dns/txt; s=qcdkim; t=1612763223; x=1644299223; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=gUL0TFXYOGeHEvrYU2SzHqKlI+7TrkiPi9ZtiXwf+qo=; b=DSXixdOMXPvlMdKoHd4ye8BJmCR1LBVOsUVNxPXejTFb/wimH/bwo1DA 7HSawK5tZnpHD2T02PMV3Tpm2SuowObBMjgDWixjVIYDnBOxvPcsTH2pI W8DkVTLaBLaw6481gTTrAopZgQQrY5Jbckn9R9BtyOQUjY7MRnraltSLd A=; Received: from unknown (HELO ironmsg05-sd.qualcomm.com) ([10.53.140.145]) by alexa-out-sd-02.qualcomm.com with ESMTP; 07 Feb 2021 21:46:31 -0800 X-QCInternal: smtphost Received: from vu-tsimpson-aus.qualcomm.com (HELO vu-tsimpson1-aus.qualcomm.com) ([10.222.150.1]) by ironmsg05-sd.qualcomm.com with ESMTP; 07 Feb 2021 21:46:30 -0800 Received: by vu-tsimpson1-aus.qualcomm.com (Postfix, from userid 47164) id B62234141; Sun, 7 Feb 2021 23:46:29 -0600 (CST) From: Taylor Simpson To: qemu-devel@nongnu.org Subject: [PATCH v8 17/35] Hexagon (target/hexagon/fma_emu.[ch]) utility functions Date: Sun, 7 Feb 2021 23:46:07 -0600 Message-Id: <1612763186-18161-18-git-send-email-tsimpson@quicinc.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1612763186-18161-1-git-send-email-tsimpson@quicinc.com> References: <1612763186-18161-1-git-send-email-tsimpson@quicinc.com> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Received-SPF: pass client-ip=199.106.114.39; envelope-from=tsimpson@qualcomm.com; helo=alexa-out-sd-02.qualcomm.com X-Spam_score_int: -40 X-Spam_score: -4.1 X-Spam_bar: ---- X-Spam_report: (-4.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=0.248, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: ale@rev.ng, bcain@quicinc.com, philmd@redhat.com, richard.henderson@linaro.org, laurent@vivier.eu, tsimpson@quicinc.com, alex.bennee@linaro.org Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" U2lnbmVkLW9mZi1ieTogVGF5bG9yIFNpbXBzb24gPHRzaW1wc29uQHF1aWNpbmMuY29tPgotLS0K IHRhcmdldC9oZXhhZ29uL2ZtYV9lbXUuaCB8ICAzNiArKysKIHRhcmdldC9oZXhhZ29uL2ZtYV9l bXUuYyB8IDcwMiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KwogMiBmaWxlcyBjaGFuZ2VkLCA3MzggaW5zZXJ0aW9ucygrKQogY3JlYXRlIG1vZGUgMTAwNjQ0 IHRhcmdldC9oZXhhZ29uL2ZtYV9lbXUuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IHRhcmdldC9oZXhh Z29uL2ZtYV9lbXUuYwoKZGlmZiAtLWdpdCBhL3RhcmdldC9oZXhhZ29uL2ZtYV9lbXUuaCBiL3Rh cmdldC9oZXhhZ29uL2ZtYV9lbXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAw Li5lM2I5OWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2hleGFnb24vZm1hX2VtdS5oCkBA IC0wLDAgKzEsMzYgQEAKKy8qCisgKiAgQ29weXJpZ2h0KGMpIDIwMTktMjAyMSBRdWFsY29tbSBJ bm5vdmF0aW9uIENlbnRlciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBUaGlz IHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29y IG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGlj IExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlv bjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRp b24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0 ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBB TlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1F UkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0 aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoK KyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8 aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBIRVhBR09OX0ZN QV9FTVVfSAorI2RlZmluZSBIRVhBR09OX0ZNQV9FTVVfSAorCitzdGF0aWMgaW5saW5lIGJvb2wg aXNfZmluaXRlKGZsb2F0NjQgeCkKK3sKKyAgICByZXR1cm4gIWZsb2F0NjRfaXNfYW55X25hbih4 KSAmJiAhZmxvYXQ2NF9pc19pbmZpbml0eSh4KTsKK30KKworaW50MzJfdCBmbG9hdDY0X2dldGV4 cChmbG9hdDY0IGY2NCk7CitpbnQzMl90IGZsb2F0MzJfZ2V0ZXhwKGZsb2F0MzIgZjMyKTsKK2Zs b2F0MzIgaW5maW5pdGVfZmxvYXQzMih1aW50OF90IHNpZ24pOworZmxvYXQzMiBpbnRlcm5hbF9m bWFmeChmbG9hdDMyIGEsIGZsb2F0MzIgYiwgZmxvYXQzMiBjLAorICAgICAgICAgICAgICAgICAg ICAgICBpbnQgc2NhbGUsIGZsb2F0X3N0YXR1cyAqZnBfc3RhdHVzKTsKK2Zsb2F0MzIgaW50ZXJu YWxfbXB5ZihmbG9hdDMyIGEsIGZsb2F0MzIgYiwgZmxvYXRfc3RhdHVzICpmcF9zdGF0dXMpOwor ZmxvYXQ2NCBpbnRlcm5hbF9tcHloaChmbG9hdDY0IGEsIGZsb2F0NjQgYiwKKyAgICAgICAgICAg ICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGludCBhY2N1bXVsYXRlZCwKKyAgICAgICAg ICAgICAgICAgICAgICAgZmxvYXRfc3RhdHVzICpmcF9zdGF0dXMpOworCisjZW5kaWYKZGlmZiAt LWdpdCBhL3RhcmdldC9oZXhhZ29uL2ZtYV9lbXUuYyBiL3RhcmdldC9oZXhhZ29uL2ZtYV9lbXUu YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDJkOTAzCi0tLSAvZGV2L251 bGwKKysrIGIvdGFyZ2V0L2hleGFnb24vZm1hX2VtdS5jCkBAIC0wLDAgKzEsNzAyIEBACisvKgor ICogIENvcHlyaWdodChjKSAyMDE5LTIwMjEgUXVhbGNvbW0gSW5ub3ZhdGlvbiBDZW50ZXIsIElu Yy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29m dHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRl ciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hl ZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIg b2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lv bi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQg aXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0 IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklU TkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwg UHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZl IHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBh bG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9s aWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlICJxZW11L29zZGVwLmgiCisjaW5jbHVkZSAicWVt dS9pbnQxMjguaCIKKyNpbmNsdWRlICJmcHUvc29mdGZsb2F0LmgiCisjaW5jbHVkZSAibWFjcm9z LmgiCisjaW5jbHVkZSAiY29udl9lbXUuaCIKKyNpbmNsdWRlICJmbWFfZW11LmgiCisKKyNkZWZp bmUgREZfSU5GX0VYUCAgICAgMHg3ZmYKKyNkZWZpbmUgREZfQklBUyAgICAgICAgMTAyMworI2Rl ZmluZSBERl9NQU5UQklUUyAgICA1MgorI2RlZmluZSBERl9OQU4gICAgICAgICAweGZmZmZmZmZm ZmZmZmZmZmZVTEwKKyNkZWZpbmUgREZfSU5GICAgICAgICAgMHg3ZmYwMDAwMDAwMDAwMDAwVUxM CisjZGVmaW5lIERGX01JTlVTX0lORiAgIDB4ZmZmMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBE Rl9NQVhGICAgICAgICAweDdmZWZmZmZmZmZmZmZmZmZVTEwKKyNkZWZpbmUgREZfTUlOVVNfTUFY RiAgMHhmZmVmZmZmZmZmZmZmZmZmVUxMCisKKyNkZWZpbmUgU0ZfSU5GX0VYUCAgICAgMHhmZgor I2RlZmluZSBTRl9CSUFTICAgICAgICAxMjcKKyNkZWZpbmUgU0ZfTUFOVEJJVFMgICAgMjMKKyNk ZWZpbmUgU0ZfSU5GICAgICAgICAgMHg3ZjgwMDAwMAorI2RlZmluZSBTRl9NSU5VU19JTkYgICAw eGZmODAwMDAwCisjZGVmaW5lIFNGX01BWEYgICAgICAgIDB4N2Y3ZmZmZmYKKyNkZWZpbmUgU0Zf TUlOVVNfTUFYRiAgMHhmZjdmZmZmZgorCisjZGVmaW5lIEhGX0lORl9FWFAgMHgxZgorI2RlZmlu ZSBIRl9CSUFTIDE1CisKKyNkZWZpbmUgV0FZX0JJR19FWFAgNDA5NgorCit0eXBlZGVmIHVuaW9u IHsKKyAgICBkb3VibGUgZjsKKyAgICB1aW50NjRfdCBpOworICAgIHN0cnVjdCB7CisgICAgICAg IHVpbnQ2NF90IG1hbnQ6NTI7CisgICAgICAgIHVpbnQ2NF90IGV4cDoxMTsKKyAgICAgICAgdWlu dDY0X3Qgc2lnbjoxOworICAgIH07Cit9IERvdWJsZTsKKwordHlwZWRlZiB1bmlvbiB7CisgICAg ZmxvYXQgZjsKKyAgICB1aW50MzJfdCBpOworICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQzMl90 IG1hbnQ6MjM7CisgICAgICAgIHVpbnQzMl90IGV4cDo4OworICAgICAgICB1aW50MzJfdCBzaWdu OjE7CisgICAgfTsKK30gRmxvYXQ7CisKK3N0YXRpYyBpbmxpbmUgdWludDY0X3QgZmxvYXQ2NF9n ZXRtYW50KGZsb2F0NjQgZjY0KQoreworICAgIERvdWJsZSBhID0geyAuaSA9IGY2NCB9OworICAg IGlmIChmbG9hdDY0X2lzX25vcm1hbChmNjQpKSB7CisgICAgICAgIHJldHVybiBhLm1hbnQgfCAx VUxMIDw8IDUyOworICAgIH0KKyAgICBpZiAoZmxvYXQ2NF9pc196ZXJvKGY2NCkpIHsKKyAgICAg ICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChmbG9hdDY0X2lzX2Rlbm9ybWFsKGY2NCkpIHsK KyAgICAgICAgcmV0dXJuIGEubWFudDsKKyAgICB9CisgICAgcmV0dXJuIH4wVUxMOworfQorCitp bnQzMl90IGZsb2F0NjRfZ2V0ZXhwKGZsb2F0NjQgZjY0KQoreworICAgIERvdWJsZSBhID0geyAu aSA9IGY2NCB9OworICAgIGlmIChmbG9hdDY0X2lzX25vcm1hbChmNjQpKSB7CisgICAgICAgIHJl dHVybiBhLmV4cDsKKyAgICB9CisgICAgaWYgKGZsb2F0NjRfaXNfZGVub3JtYWwoZjY0KSkgewor ICAgICAgICByZXR1cm4gYS5leHAgKyAxOworICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKK3N0 YXRpYyBpbmxpbmUgdWludDY0X3QgZmxvYXQzMl9nZXRtYW50KGZsb2F0MzIgZjMyKQoreworICAg IEZsb2F0IGEgPSB7IC5pID0gZjMyIH07CisgICAgaWYgKGZsb2F0MzJfaXNfbm9ybWFsKGYzMikp IHsKKyAgICAgICAgcmV0dXJuIGEubWFudCB8IDFVTEwgPDwgMjM7CisgICAgfQorICAgIGlmIChm bG9hdDMyX2lzX3plcm8oZjMyKSkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaWYg KGZsb2F0MzJfaXNfZGVub3JtYWwoZjMyKSkgeworICAgICAgICByZXR1cm4gYS5tYW50OworICAg IH0KKyAgICByZXR1cm4gfjBVTEw7Cit9CisKK2ludDMyX3QgZmxvYXQzMl9nZXRleHAoZmxvYXQz MiBmMzIpCit7CisgICAgRmxvYXQgYSA9IHsgLmkgPSBmMzIgfTsKKyAgICBpZiAoZmxvYXQzMl9p c19ub3JtYWwoZjMyKSkgeworICAgICAgICByZXR1cm4gYS5leHA7CisgICAgfQorICAgIGlmIChm bG9hdDMyX2lzX2Rlbm9ybWFsKGYzMikpIHsKKyAgICAgICAgcmV0dXJuIGEuZXhwICsgMTsKKyAg ICB9CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IGludDEyOF9n ZXR3MChJbnQxMjggeCkKK3sKKyAgICByZXR1cm4gaW50MTI4X2dldGxvKHgpOworfQorCitzdGF0 aWMgaW5saW5lIHVpbnQzMl90IGludDEyOF9nZXR3MShJbnQxMjggeCkKK3sKKyAgICByZXR1cm4g aW50MTI4X2dldGxvKHgpID4+IDMyOworfQorCitzdGF0aWMgaW5saW5lIEludDEyOCBpbnQxMjhf bXVsXzY0NjQodWludDY0X3QgYWksIHVpbnQ2NF90IGJpKQoreworICAgIEludDEyOCBhLCBiOwor ICAgIHVpbnQ2NF90IHBwMCwgcHAxYSwgcHAxYiwgcHAxcywgcHAyOworCisgICAgYSA9IGludDEy OF9tYWtlNjQoYWkpOworICAgIGIgPSBpbnQxMjhfbWFrZTY0KGJpKTsKKyAgICBwcDAgPSAodWlu dDY0X3QpaW50MTI4X2dldHcwKGEpICogKHVpbnQ2NF90KWludDEyOF9nZXR3MChiKTsKKyAgICBw cDFhID0gKHVpbnQ2NF90KWludDEyOF9nZXR3MShhKSAqICh1aW50NjRfdClpbnQxMjhfZ2V0dzAo Yik7CisgICAgcHAxYiA9ICh1aW50NjRfdClpbnQxMjhfZ2V0dzEoYikgKiAodWludDY0X3QpaW50 MTI4X2dldHcwKGEpOworICAgIHBwMiA9ICh1aW50NjRfdClpbnQxMjhfZ2V0dzEoYSkgKiAodWlu dDY0X3QpaW50MTI4X2dldHcxKGIpOworCisgICAgcHAxcyA9IHBwMWEgKyBwcDFiOworICAgIGlm ICgocHAxcyA8IHBwMWEpIHx8IChwcDFzIDwgcHAxYikpIHsKKyAgICAgICAgcHAyICs9ICgxVUxM IDw8IDMyKTsKKyAgICB9CisgICAgdWludDY0X3QgcmV0X2xvdyA9IHBwMCArIChwcDFzIDw8IDMy KTsKKyAgICBpZiAoKHJldF9sb3cgPCBwcDApIHx8IChyZXRfbG93IDwgKHBwMXMgPDwgMzIpKSkg eworICAgICAgICBwcDIgKz0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gaW50MTI4X21ha2UxMjgo cmV0X2xvdywgcHAyICsgKHBwMXMgPj4gMzIpKTsKK30KKworc3RhdGljIGlubGluZSBJbnQxMjgg aW50MTI4X3N1Yl9ib3Jyb3coSW50MTI4IGEsIEludDEyOCBiLCBpbnQgYm9ycm93KQoreworICAg IEludDEyOCByZXQgPSBpbnQxMjhfc3ViKGEsIGIpOworICAgIGlmIChib3Jyb3cgIT0gMCkgewor ICAgICAgICByZXQgPSBpbnQxMjhfc3ViKHJldCwgaW50MTI4X29uZSgpKTsKKyAgICB9CisgICAg cmV0dXJuIHJldDsKK30KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIEludDEyOCBtYW50OworICAg IGludDMyX3QgZXhwOworICAgIHVpbnQ4X3Qgc2lnbjsKKyAgICB1aW50OF90IGd1YXJkOworICAg IHVpbnQ4X3Qgcm91bmQ7CisgICAgdWludDhfdCBzdGlja3k7Cit9IEFjY3VtOworCitzdGF0aWMg aW5saW5lIHZvaWQgYWNjdW1faW5pdChBY2N1bSAqcCkKK3sKKyAgICBwLT5tYW50ID0gaW50MTI4 X3plcm8oKTsKKyAgICBwLT5leHAgPSAwOworICAgIHAtPnNpZ24gPSAwOworICAgIHAtPmd1YXJk ID0gMDsKKyAgICBwLT5yb3VuZCA9IDA7CisgICAgcC0+c3RpY2t5ID0gMDsKK30KKworc3RhdGlj IGlubGluZSBBY2N1bSBhY2N1bV9ub3JtX2xlZnQoQWNjdW0gYSkKK3sKKyAgICBhLmV4cC0tOwor ICAgIGEubWFudCA9IGludDEyOF9sc2hpZnQoYS5tYW50LCAxKTsKKyAgICBhLm1hbnQgPSBpbnQx Mjhfb3IoYS5tYW50LCBpbnQxMjhfbWFrZTY0KGEuZ3VhcmQpKTsKKyAgICBhLmd1YXJkID0gYS5y b3VuZDsKKyAgICBhLnJvdW5kID0gYS5zdGlja3k7CisgICAgcmV0dXJuIGE7Cit9CisKK3N0YXRp YyBpbmxpbmUgQWNjdW0gYWNjdW1fbm9ybV9yaWdodChBY2N1bSBhLCBpbnQgYW10KQoreworICAg IGlmIChhbXQgPiAxMzApIHsKKyAgICAgICAgYS5zdGlja3kgfD0KKyAgICAgICAgICAgIGEucm91 bmQgfCBhLmd1YXJkIHwgaW50MTI4X256KGEubWFudCk7CisgICAgICAgIGEuZ3VhcmQgPSBhLnJv dW5kID0gMDsKKyAgICAgICAgYS5tYW50ID0gaW50MTI4X3plcm8oKTsKKyAgICAgICAgYS5leHAg Kz0gYW10OworICAgICAgICByZXR1cm4gYTsKKworICAgIH0KKyAgICB3aGlsZSAoYW10ID49IDY0 KSB7CisgICAgICAgIGEuc3RpY2t5IHw9IGEucm91bmQgfCBhLmd1YXJkIHwgKGludDEyOF9nZXRs byhhLm1hbnQpICE9IDApOworICAgICAgICBhLmd1YXJkID0gKGludDEyOF9nZXRsbyhhLm1hbnQp ID4+IDYzKSAmIDE7CisgICAgICAgIGEucm91bmQgPSAoaW50MTI4X2dldGxvKGEubWFudCkgPj4g NjIpICYgMTsKKyAgICAgICAgYS5tYW50ID0gaW50MTI4X21ha2U2NChpbnQxMjhfZ2V0aGkoYS5t YW50KSk7CisgICAgICAgIGEuZXhwICs9IDY0OworICAgICAgICBhbXQgLT0gNjQ7CisgICAgfQor ICAgIHdoaWxlIChhbXQgPiAwKSB7CisgICAgICAgIGEuZXhwKys7CisgICAgICAgIGEuc3RpY2t5 IHw9IGEucm91bmQ7CisgICAgICAgIGEucm91bmQgPSBhLmd1YXJkOworICAgICAgICBhLmd1YXJk ID0gaW50MTI4X2dldGxvKGEubWFudCkgJiAxOworICAgICAgICBhLm1hbnQgPSBpbnQxMjhfcnNo aWZ0KGEubWFudCwgMSk7CisgICAgICAgIGFtdC0tOworICAgIH0KKyAgICByZXR1cm4gYTsKK30K KworLyoKKyAqIE9uIHRoZSBhZGQvc3ViLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gc2hpZnQgb3V0 IGxvdHMgb2YgYml0cywgYnV0IG5lZWQgYQorICogc3RpY2t5IGJpdCBmb3Igd2hhdCB3YXMgc2hp ZnRlZCBvdXQsIEkgdGhpbmsuCisgKi8KK3N0YXRpYyBBY2N1bSBhY2N1bV9hZGQoQWNjdW0gYSwg QWNjdW0gYik7CisKK3N0YXRpYyBpbmxpbmUgQWNjdW0gYWNjdW1fc3ViKEFjY3VtIGEsIEFjY3Vt IGIsIGludCBuZWdhdGUpCit7CisgICAgQWNjdW0gcmV0OworICAgIGFjY3VtX2luaXQoJnJldCk7 CisgICAgaW50IGJvcnJvdzsKKworICAgIGlmIChhLnNpZ24gIT0gYi5zaWduKSB7CisgICAgICAg IGIuc2lnbiA9ICFiLnNpZ247CisgICAgICAgIHJldHVybiBhY2N1bV9hZGQoYSwgYik7CisgICAg fQorICAgIGlmIChiLmV4cCA+IGEuZXhwKSB7CisgICAgICAgIC8qIHNtYWxsIC0gYmlnID09IC0g KGJpZyAtIHNtYWxsKSAqLworICAgICAgICByZXR1cm4gYWNjdW1fc3ViKGIsIGEsICFuZWdhdGUp OworICAgIH0KKyAgICBpZiAoKGIuZXhwID09IGEuZXhwKSAmJiAoaW50MTI4X2d0KGIubWFudCwg YS5tYW50KSkpIHsKKyAgICAgICAgLyogc21hbGwgLSBiaWcgPT0gLSAoYmlnIC0gc21hbGwpICov CisgICAgICAgIHJldHVybiBhY2N1bV9zdWIoYiwgYSwgIW5lZ2F0ZSk7CisgICAgfQorCisgICAg d2hpbGUgKGEuZXhwID4gYi5leHApIHsKKyAgICAgICAgLyogVHJ5IHRvIG5vcm1hbGl6ZSBleHBv bmVudHM6IHNocmluayBhIGV4cG9uZW50IGFuZCBncm93IG1hbnRpc3NhICovCisgICAgICAgIGlm IChpbnQxMjhfZ2V0aGkoYS5tYW50KSAmICgxVUxMIDw8IDYyKSkgeworICAgICAgICAgICAgLyog Q2FuJ3QgZ3JvdyBhIGFueSBtb3JlICovCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBl bHNlIHsKKyAgICAgICAgICAgIGEgPSBhY2N1bV9ub3JtX2xlZnQoYSk7CisgICAgICAgIH0KKyAg ICB9CisKKyAgICB3aGlsZSAoYS5leHAgPiBiLmV4cCkgeworICAgICAgICAvKiBUcnkgdG8gbm9y bWFsaXplIGV4cG9uZW50czogZ3JvdyBiIGV4cG9uZW50IGFuZCBzaHJpbmsgbWFudGlzc2EgKi8K KyAgICAgICAgLyogS2VlcCBhcm91bmQgc2hpZnRlZCBvdXQgYml0cy4uLiB3ZSBtaWdodCBuZWVk IHRob3NlIGxhdGVyICovCisgICAgICAgIGIgPSBhY2N1bV9ub3JtX3JpZ2h0KGIsIGEuZXhwIC0g Yi5leHApOworICAgIH0KKworICAgIGlmICgoaW50MTI4X2d0KGIubWFudCwgYS5tYW50KSkpIHsK KyAgICAgICAgcmV0dXJuIGFjY3VtX3N1YihiLCBhLCAhbmVnYXRlKTsKKyAgICB9CisKKyAgICAv KiBPSywgbm93IHRoaW5ncyBzaG91bGQgYmUgbm9ybWFsaXplZCEgKi8KKyAgICByZXQuc2lnbiA9 IGEuc2lnbjsKKyAgICByZXQuZXhwID0gYS5leHA7CisgICAgYXNzZXJ0KCFpbnQxMjhfZ3QoYi5t YW50LCBhLm1hbnQpKTsKKyAgICBib3Jyb3cgPSAoYi5yb3VuZCA8PCAyKSB8IChiLmd1YXJkIDw8 IDEpIHwgYi5zdGlja3k7CisgICAgcmV0Lm1hbnQgPSBpbnQxMjhfc3ViX2JvcnJvdyhhLm1hbnQs IGIubWFudCwgKGJvcnJvdyAhPSAwKSk7CisgICAgYm9ycm93ID0gMCAtIGJvcnJvdzsKKyAgICBy ZXQuZ3VhcmQgPSAoYm9ycm93ID4+IDIpICYgMTsKKyAgICByZXQucm91bmQgPSAoYm9ycm93ID4+ IDEpICYgMTsKKyAgICByZXQuc3RpY2t5ID0gKGJvcnJvdyA+PiAwKSAmIDE7CisgICAgaWYgKG5l Z2F0ZSkgeworICAgICAgICByZXQuc2lnbiA9ICFyZXQuc2lnbjsKKyAgICB9CisgICAgcmV0dXJu IHJldDsKK30KKworc3RhdGljIEFjY3VtIGFjY3VtX2FkZChBY2N1bSBhLCBBY2N1bSBiKQorewor ICAgIEFjY3VtIHJldDsKKyAgICBhY2N1bV9pbml0KCZyZXQpOworICAgIGlmIChhLnNpZ24gIT0g Yi5zaWduKSB7CisgICAgICAgIGIuc2lnbiA9ICFiLnNpZ247CisgICAgICAgIHJldHVybiBhY2N1 bV9zdWIoYSwgYiwgMCk7CisgICAgfQorICAgIGlmIChiLmV4cCA+IGEuZXhwKSB7CisgICAgICAg IC8qIHNtYWxsICsgYmlnID09ICAoYmlnICsgc21hbGwpICovCisgICAgICAgIHJldHVybiBhY2N1 bV9hZGQoYiwgYSk7CisgICAgfQorICAgIGlmICgoYi5leHAgPT0gYS5leHApICYmIGludDEyOF9n dChiLm1hbnQsIGEubWFudCkpIHsKKyAgICAgICAgLyogc21hbGwgKyBiaWcgPT0gIChiaWcgKyBz bWFsbCkgKi8KKyAgICAgICAgcmV0dXJuIGFjY3VtX2FkZChiLCBhKTsKKyAgICB9CisKKyAgICB3 aGlsZSAoYS5leHAgPiBiLmV4cCkgeworICAgICAgICAvKiBUcnkgdG8gbm9ybWFsaXplIGV4cG9u ZW50czogc2hyaW5rIGEgZXhwb25lbnQgYW5kIGdyb3cgbWFudGlzc2EgKi8KKyAgICAgICAgaWYg KGludDEyOF9nZXRoaShhLm1hbnQpICYgKDFVTEwgPDwgNjIpKSB7CisgICAgICAgICAgICAvKiBD YW4ndCBncm93IGEgYW55IG1vcmUgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVs c2UgeworICAgICAgICAgICAgYSA9IGFjY3VtX25vcm1fbGVmdChhKTsKKyAgICAgICAgfQorICAg IH0KKworICAgIHdoaWxlIChhLmV4cCA+IGIuZXhwKSB7CisgICAgICAgIC8qIFRyeSB0byBub3Jt YWxpemUgZXhwb25lbnRzOiBncm93IGIgZXhwb25lbnQgYW5kIHNocmluayBtYW50aXNzYSAqLwor ICAgICAgICAvKiBLZWVwIGFyb3VuZCBzaGlmdGVkIG91dCBiaXRzLi4uIHdlIG1pZ2h0IG5lZWQg dGhvc2UgbGF0ZXIgKi8KKyAgICAgICAgYiA9IGFjY3VtX25vcm1fcmlnaHQoYiwgYS5leHAgLSBi LmV4cCk7CisgICAgfQorCisgICAgLyogT0ssIG5vdyB0aGluZ3Mgc2hvdWxkIGJlIG5vcm1hbGl6 ZWQhICovCisgICAgaWYgKGludDEyOF9ndChiLm1hbnQsIGEubWFudCkpIHsKKyAgICAgICAgcmV0 dXJuIGFjY3VtX2FkZChiLCBhKTsKKyAgICB9OworICAgIHJldC5zaWduID0gYS5zaWduOworICAg IHJldC5leHAgPSBhLmV4cDsKKyAgICBhc3NlcnQoIWludDEyOF9ndChiLm1hbnQsIGEubWFudCkp OworICAgIHJldC5tYW50ID0gaW50MTI4X2FkZChhLm1hbnQsIGIubWFudCk7CisgICAgcmV0Lmd1 YXJkID0gYi5ndWFyZDsKKyAgICByZXQucm91bmQgPSBiLnJvdW5kOworICAgIHJldC5zdGlja3kg PSBiLnN0aWNreTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBSZXR1cm4gYW4gaW5maW5pdHkg d2l0aCByZXF1ZXN0ZWQgc2lnbiAqLworc3RhdGljIGlubGluZSBmbG9hdDY0IGluZmluaXRlX2Zs b2F0NjQodWludDhfdCBzaWduKQoreworICAgIGlmIChzaWduKSB7CisgICAgICAgIHJldHVybiBt YWtlX2Zsb2F0NjQoREZfTUlOVVNfSU5GKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4g bWFrZV9mbG9hdDY0KERGX0lORik7CisgICAgfQorfQorCisvKiBSZXR1cm4gYSBtYXhpbXVtIGZp bml0ZSB2YWx1ZSB3aXRoIHJlcXVlc3RlZCBzaWduICovCitzdGF0aWMgaW5saW5lIGZsb2F0NjQg bWF4ZmluaXRlX2Zsb2F0NjQodWludDhfdCBzaWduKQoreworICAgIGlmIChzaWduKSB7CisgICAg ICAgIHJldHVybiBtYWtlX2Zsb2F0NjQoREZfTUlOVVNfTUFYRik7CisgICAgfSBlbHNlIHsKKyAg ICAgICAgcmV0dXJuIG1ha2VfZmxvYXQ2NChERl9NQVhGKTsKKyAgICB9Cit9CisKKy8qIFJldHVy biBhIHplcm8gdmFsdWUgd2l0aCByZXF1ZXN0ZWQgc2lnbiAqLworc3RhdGljIGlubGluZSBmbG9h dDY0IHplcm9fZmxvYXQ2NCh1aW50OF90IHNpZ24pCit7CisgICAgaWYgKHNpZ24pIHsKKyAgICAg ICAgcmV0dXJuIG1ha2VfZmxvYXQ2NCgweDgwMDAwMDAwMDAwMDAwMDApOworICAgIH0gZWxzZSB7 CisgICAgICAgIHJldHVybiBmbG9hdDY0X3plcm87CisgICAgfQorfQorCisvKiBSZXR1cm4gYW4g aW5maW5pdHkgd2l0aCB0aGUgcmVxdWVzdGVkIHNpZ24gKi8KK2Zsb2F0MzIgaW5maW5pdGVfZmxv YXQzMih1aW50OF90IHNpZ24pCit7CisgICAgaWYgKHNpZ24pIHsKKyAgICAgICAgcmV0dXJuIG1h a2VfZmxvYXQzMihTRl9NSU5VU19JTkYpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBt YWtlX2Zsb2F0MzIoU0ZfSU5GKTsKKyAgICB9Cit9CisKKy8qIFJldHVybiBhIG1heGltdW0gZmlu aXRlIHZhbHVlIHdpdGggdGhlIHJlcXVlc3RlZCBzaWduICovCitzdGF0aWMgaW5saW5lIGZsb2F0 MzIgbWF4ZmluaXRlX2Zsb2F0MzIodWludDhfdCBzaWduKQoreworICAgIGlmIChzaWduKSB7Cisg ICAgICAgIHJldHVybiBtYWtlX2Zsb2F0MzIoU0ZfTUlOVVNfTUFYRik7CisgICAgfSBlbHNlIHsK KyAgICAgICAgcmV0dXJuIG1ha2VfZmxvYXQzMihTRl9NQVhGKTsKKyAgICB9Cit9CisKKy8qIFJl dHVybiBhIHplcm8gdmFsdWUgd2l0aCByZXF1ZXN0ZWQgc2lnbiAqLworc3RhdGljIGlubGluZSBm bG9hdDMyIHplcm9fZmxvYXQzMih1aW50OF90IHNpZ24pCit7CisgICAgaWYgKHNpZ24pIHsKKyAg ICAgICAgcmV0dXJuIG1ha2VfZmxvYXQzMigweDgwMDAwMDAwKTsKKyAgICB9IGVsc2UgeworICAg ICAgICByZXR1cm4gZmxvYXQzMl96ZXJvOworICAgIH0KK30KKworI2RlZmluZSBHRU5fWEZfUk9V TkQoU1VGRklYLCBNQU5UQklUUywgSU5GX0VYUCwgSU5URVJOQUxfVFlQRSkgXAorc3RhdGljIGlu bGluZSBTVUZGSVggYWNjdW1fcm91bmRfIyNTVUZGSVgoQWNjdW0gYSwgZmxvYXRfc3RhdHVzICog ZnBfc3RhdHVzKSBcCit7IFwKKyAgICBpZiAoKGludDEyOF9nZXRoaShhLm1hbnQpID09IDApICYm IChpbnQxMjhfZ2V0bG8oYS5tYW50KSA9PSAwKSBcCisgICAgICAgICYmICgoYS5ndWFyZCB8IGEu cm91bmQgfCBhLnN0aWNreSkgPT0gMCkpIHsgXAorICAgICAgICAvKiByZXN1bHQgemVybyAqLyBc CisgICAgICAgIHN3aXRjaCAoZnBfc3RhdHVzLT5mbG9hdF9yb3VuZGluZ19tb2RlKSB7IFwKKyAg ICAgICAgY2FzZSBmbG9hdF9yb3VuZF9kb3duOiBcCisgICAgICAgICAgICByZXR1cm4gemVyb18j I1NVRkZJWCgxKTsgXAorICAgICAgICBkZWZhdWx0OiBcCisgICAgICAgICAgICByZXR1cm4gemVy b18jI1NVRkZJWCgwKTsgXAorICAgICAgICB9IFwKKyAgICB9IFwKKyAgICAvKiBOb3JtYWxpemUg cmlnaHQgKi8gXAorICAgIC8qIFdlIHdhbnQgTUFOVEJJVFMgYml0cyBvZiBtYW50aXNzYSBwbHVz IHRoZSBsZWFkaW5nIG9uZS4gKi8gXAorICAgIC8qIFRoYXQgbWVhbnMgdGhhdCB3ZSB3YW50IE1B TlRCSVRTKzEgYml0cywgb3IgMHgwMDAwMDAwMDAwMDBGRl9GRkZGICovIFwKKyAgICAvKiBTbyB3 ZSBuZWVkIHRvIG5vcm1hbGl6ZSByaWdodCB3aGlsZSB0aGUgaGlnaCB3b3JkIGlzIG5vbi16ZXJv IGFuZCBcCisgICAgKiB3aGlsZSB0aGUgbG93IHdvcmQgaXMgbm9uemVybyB3aGVuIG1hc2tlZCB3 aXRoIDB4ZmZlMF8wMDAwXzAwMDBfMDAwMCAqLyBcCisgICAgd2hpbGUgKChpbnQxMjhfZ2V0aGko YS5tYW50KSAhPSAwKSB8fCBcCisgICAgICAgICAgICgoaW50MTI4X2dldGxvKGEubWFudCkgPj4g KE1BTlRCSVRTICsgMSkpICE9IDApKSB7IFwKKyAgICAgICAgYSA9IGFjY3VtX25vcm1fcmlnaHQo YSwgMSk7IFwKKyAgICB9IFwKKyAgICAvKiBcCisgICAgICogT0ssIG5vdyBub3JtYWxpemUgbGVm dCBcCisgICAgICogV2Ugd2FudCB0byBub3JtYWxpemUgbGVmdCB1bnRpbCB3ZSBoYXZlIGEgbGVh ZGluZyBvbmUgaW4gYml0IDI0IFwKKyAgICAgKiBUaGVvcmV0aWNhbGx5LCB3ZSBvbmx5IG5lZWQg dG8gc2hpZnQgYSBtYXhpbXVtIG9mIG9uZSB0byB0aGUgbGVmdCBpZiB3ZSBcCisgICAgICogc2hp ZnRlZCBvdXQgbG90cyBvZiBiaXRzIGZyb20gQiwgb3IgaWYgd2UgaGFkIG5vIHNoaWZ0IC8gMSBz aGlmdCBzdGlja3kgXAorICAgICAqIHNob3VkbCBiZSAwICBcCisgICAgICovIFwKKyAgICB3aGls ZSAoKGludDEyOF9nZXRsbyhhLm1hbnQpICYgKDFVTEwgPDwgTUFOVEJJVFMpKSA9PSAwKSB7IFwK KyAgICAgICAgYSA9IGFjY3VtX25vcm1fbGVmdChhKTsgXAorICAgIH0gXAorICAgIC8qIFwKKyAg ICAgKiBPSywgbm93IHdlIG1pZ2h0IG5lZWQgdG8gZGVub3JtYWxpemUgYmVjYXVzZSBvZiBwb3Rl bnRpYWwgdW5kZXJmbG93LiBcCisgICAgICogV2UgbmVlZCB0byBkbyB0aGlzIGJlZm9yZSByb3Vu ZGluZywgYW5kIHJvdW5kaW5nIG1pZ2h0IG1ha2UgdXMgbm9ybWFsIFwKKyAgICAgKiBhZ2FpbiBc CisgICAgICovIFwKKyAgICB3aGlsZSAoYS5leHAgPD0gMCkgeyBcCisgICAgICAgIGEgPSBhY2N1 bV9ub3JtX3JpZ2h0KGEsIDEgLSBhLmV4cCk7IFwKKyAgICAgICAgLyogXAorICAgICAgICAgKiBE byB3ZSBoYXZlIHVuZGVyZmxvdz8gXAorICAgICAgICAgKiBUaGF0J3Mgd2hlbiB3ZSBnZXQgYW4g aW5leGFjdCBhbnN3ZXIgYmVjYXVzZSB3ZSByYW4gb3V0IG9mIGJpdHMgXAorICAgICAgICAgKiBp biBhIGRlbm9ybWFsLiBcCisgICAgICAgICAqLyBcCisgICAgICAgIGlmIChhLmd1YXJkIHx8IGEu cm91bmQgfHwgYS5zdGlja3kpIHsgXAorICAgICAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxh Z191bmRlcmZsb3csIGZwX3N0YXR1cyk7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCisgICAgLyog T0ssIHdlJ3JlIHJlbGF0aXZlbHkgY2Fub25pY2FsLi4uIG5vdyB3ZSBuZWVkIHRvIHJvdW5kICov IFwKKyAgICBpZiAoYS5ndWFyZCB8fCBhLnJvdW5kIHx8IGEuc3RpY2t5KSB7IFwKKyAgICAgICAg ZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19pbmV4YWN0LCBmcF9zdGF0dXMpOyBcCisgICAgICAgIHN3 aXRjaCAoZnBfc3RhdHVzLT5mbG9hdF9yb3VuZGluZ19tb2RlKSB7IFwKKyAgICAgICAgY2FzZSBm bG9hdF9yb3VuZF90b196ZXJvOiBcCisgICAgICAgICAgICAvKiBDaG9wIGFuZCB3ZSdyZSBkb25l ICovIFwKKyAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgIGNhc2UgZmxvYXRfcm91bmRfdXA6 IFwKKyAgICAgICAgICAgIGlmIChhLnNpZ24gPT0gMCkgeyBcCisgICAgICAgICAgICAgICAgYS5t YW50ID0gaW50MTI4X2FkZChhLm1hbnQsIGludDEyOF9vbmUoKSk7IFwKKyAgICAgICAgICAgIH0g XAorICAgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgY2FzZSBmbG9hdF9yb3VuZF9kb3duOiBc CisgICAgICAgICAgICBpZiAoYS5zaWduICE9IDApIHsgXAorICAgICAgICAgICAgICAgIGEubWFu dCA9IGludDEyOF9hZGQoYS5tYW50LCBpbnQxMjhfb25lKCkpOyBcCisgICAgICAgICAgICB9IFwK KyAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgIGRlZmF1bHQ6IFwKKyAgICAgICAgICAgIGlm IChhLnJvdW5kIHx8IGEuc3RpY2t5KSB7IFwKKyAgICAgICAgICAgICAgICAvKiByb3VuZCB1cCBp ZiBndWFyZCBpcyAxLCBkb3duIGlmIGd1YXJkIGlzIHplcm8gKi8gXAorICAgICAgICAgICAgICAg IGEubWFudCA9IGludDEyOF9hZGQoYS5tYW50LCBpbnQxMjhfbWFrZTY0KGEuZ3VhcmQpKTsgXAor ICAgICAgICAgICAgfSBlbHNlIGlmIChhLmd1YXJkKSB7IFwKKyAgICAgICAgICAgICAgICAvKiBl eGFjdGx5IC41LCByb3VuZCB1cCBpZiBvZGQgKi8gXAorICAgICAgICAgICAgICAgIGEubWFudCA9 IGludDEyOF9hZGQoYS5tYW50LCBpbnQxMjhfYW5kKGEubWFudCwgaW50MTI4X29uZSgpKSk7IFwK KyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgfSBcCisgICAg fSBcCisgICAgLyogXAorICAgICAqIE9LLCBub3cgd2UgbWlnaHQgaGF2ZSBjYXJyaWVkIGFsbCB0 aGUgd2F5IHVwLiBcCisgICAgICogU28gd2UgbWlnaHQgbmVlZCB0byBzaHIgb25jZSBcCisgICAg ICogYXQgbGVhc3Qgd2Uga25vdyB0aGF0IHRoZSBsc2Igc2hvdWxkIGJlIHplcm8gaWYgd2Ugcm91 bmRlZCBhbmQgXAorICAgICAqIGdvdCBhIGNhcnJ5IG91dC4uLiBcCisgICAgICovIFwKKyAgICBp ZiAoKGludDEyOF9nZXRsbyhhLm1hbnQpID4+IChNQU5UQklUUyArIDEpKSAhPSAwKSB7IFwKKyAg ICAgICAgYSA9IGFjY3VtX25vcm1fcmlnaHQoYSwgMSk7IFwKKyAgICB9IFwKKyAgICAvKiBPdmVy Zmxvdz8gKi8gXAorICAgIGlmIChhLmV4cCA+PSBJTkZfRVhQKSB7IFwKKyAgICAgICAgLyogWWVw LCBpbmYgcmVzdWx0ICovIFwKKyAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19vdmVyZmxv dywgZnBfc3RhdHVzKTsgXAorICAgICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX2luZXhhY3Qs IGZwX3N0YXR1cyk7IFwKKyAgICAgICAgc3dpdGNoIChmcF9zdGF0dXMtPmZsb2F0X3JvdW5kaW5n X21vZGUpIHsgXAorICAgICAgICBjYXNlIGZsb2F0X3JvdW5kX3RvX3plcm86IFwKKyAgICAgICAg ICAgIHJldHVybiBtYXhmaW5pdGVfIyNTVUZGSVgoYS5zaWduKTsgXAorICAgICAgICBjYXNlIGZs b2F0X3JvdW5kX3VwOiBcCisgICAgICAgICAgICBpZiAoYS5zaWduID09IDApIHsgXAorICAgICAg ICAgICAgICAgIHJldHVybiBpbmZpbml0ZV8jI1NVRkZJWChhLnNpZ24pOyBcCisgICAgICAgICAg ICB9IGVsc2UgeyBcCisgICAgICAgICAgICAgICAgcmV0dXJuIG1heGZpbml0ZV8jI1NVRkZJWChh LnNpZ24pOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgY2FzZSBmbG9hdF9yb3VuZF9kb3du OiBcCisgICAgICAgICAgICBpZiAoYS5zaWduICE9IDApIHsgXAorICAgICAgICAgICAgICAgIHJl dHVybiBpbmZpbml0ZV8jI1NVRkZJWChhLnNpZ24pOyBcCisgICAgICAgICAgICB9IGVsc2UgeyBc CisgICAgICAgICAgICAgICAgcmV0dXJuIG1heGZpbml0ZV8jI1NVRkZJWChhLnNpZ24pOyBcCisg ICAgICAgICAgICB9IFwKKyAgICAgICAgZGVmYXVsdDogXAorICAgICAgICAgICAgcmV0dXJuIGlu ZmluaXRlXyMjU1VGRklYKGEuc2lnbik7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCisgICAgLyog VW5kZXJmbG93PyAqLyBcCisgICAgaWYgKGludDEyOF9nZXRsbyhhLm1hbnQpICYgKDFVTEwgPDwg TUFOVEJJVFMpKSB7IFwKKyAgICAgICAgLyogTGVhZGluZyBvbmUgbWVhbnM6IE5vLCB3ZSdyZSBu b3JtYWwuIFNvLCB3ZSBzaG91bGQgYmUgZG9uZS4uLiAqLyBcCisgICAgICAgIElOVEVSTkFMX1RZ UEUgcmV0OyBcCisgICAgICAgIHJldC5pID0gMDsgXAorICAgICAgICByZXQuc2lnbiA9IGEuc2ln bjsgXAorICAgICAgICByZXQuZXhwID0gYS5leHA7IFwKKyAgICAgICAgcmV0Lm1hbnQgPSBpbnQx MjhfZ2V0bG8oYS5tYW50KTsgXAorICAgICAgICByZXR1cm4gcmV0Lmk7IFwKKyAgICB9IFwKKyAg ICBhc3NlcnQoYS5leHAgPT0gMSk7IFwKKyAgICBJTlRFUk5BTF9UWVBFIHJldDsgXAorICAgIHJl dC5pID0gMDsgXAorICAgIHJldC5zaWduID0gYS5zaWduOyBcCisgICAgcmV0LmV4cCA9IDA7IFwK KyAgICByZXQubWFudCA9IGludDEyOF9nZXRsbyhhLm1hbnQpOyBcCisgICAgcmV0dXJuIHJldC5p OyBcCit9CisKK0dFTl9YRl9ST1VORChmbG9hdDY0LCBERl9NQU5UQklUUywgREZfSU5GX0VYUCwg RG91YmxlKQorR0VOX1hGX1JPVU5EKGZsb2F0MzIsIFNGX01BTlRCSVRTLCBTRl9JTkZfRVhQLCBG bG9hdCkKKworc3RhdGljIGJvb2wgaXNfaW5mX3Byb2QoZmxvYXQ2NCBhLCBmbG9hdDY0IGIpCit7 CisgICAgcmV0dXJuICgoZmxvYXQ2NF9pc19pbmZpbml0eShhKSAmJiBmbG9hdDY0X2lzX2luZmlu aXR5KGIpKSB8fAorICAgICAgICAgICAgKGZsb2F0NjRfaXNfaW5maW5pdHkoYSkgJiYgaXNfZmlu aXRlKGIpICYmICghZmxvYXQ2NF9pc196ZXJvKGIpKSkgfHwKKyAgICAgICAgICAgIChmbG9hdDY0 X2lzX2luZmluaXR5KGIpICYmIGlzX2Zpbml0ZShhKSAmJiAoIWZsb2F0NjRfaXNfemVybyhhKSkp KTsKK30KKworc3RhdGljIGlubGluZSBmbG9hdDY0IHNwZWNpYWxfZm1hKGZsb2F0NjQgYSwgZmxv YXQ2NCBiLCBmbG9hdDY0IGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxv YXRfc3RhdHVzICpmcF9zdGF0dXMpCit7CisgICAgZmxvYXQ2NCByZXQgPSBtYWtlX2Zsb2F0NjQo MCk7CisKKyAgICAvKgorICAgICAqIElmIEEgbXVsdGlwbGllZCBieSBCIGlzIGFuIGV4YWN0IGlu ZmluaXR5IGFuZCBDIGlzIGFsc28gYW4gaW5maW5pdHkKKyAgICAgKiBidXQgd2l0aCB0aGUgb3Bw b3NpdGUgc2lnbiwgRk1BIHJldHVybnMgTmFOIGFuZCByYWlzZXMgaW52YWxpZC4KKyAgICAgKi8K KyAgICB1aW50OF90IGFfc2lnbiA9IGZsb2F0NjRfaXNfbmVnKGEpOworICAgIHVpbnQ4X3QgYl9z aWduID0gZmxvYXQ2NF9pc19uZWcoYik7CisgICAgdWludDhfdCBjX3NpZ24gPSBmbG9hdDY0X2lz X25lZyhjKTsKKyAgICBpZiAoaXNfaW5mX3Byb2QoYSwgYikgJiYgZmxvYXQ2NF9pc19pbmZpbml0 eShjKSkgeworICAgICAgICBpZiAoKGFfc2lnbiBeIGJfc2lnbikgIT0gY19zaWduKSB7CisgICAg ICAgICAgICByZXQgPSBtYWtlX2Zsb2F0NjQoREZfTkFOKTsKKyAgICAgICAgICAgIGZsb2F0X3Jh aXNlKGZsb2F0X2ZsYWdfaW52YWxpZCwgZnBfc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBy ZXQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKChmbG9hdDY0X2lzX2luZmluaXR5KGEpICYm IGZsb2F0NjRfaXNfemVybyhiKSkgfHwKKyAgICAgICAgKGZsb2F0NjRfaXNfemVybyhhKSAmJiBm bG9hdDY0X2lzX2luZmluaXR5KGIpKSkgeworICAgICAgICByZXQgPSBtYWtlX2Zsb2F0NjQoREZf TkFOKTsKKyAgICAgICAgZmxvYXRfcmFpc2UoZmxvYXRfZmxhZ19pbnZhbGlkLCBmcF9zdGF0dXMp OworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICAvKgorICAgICAqIElmIG5vbmUgb2Yg dGhlIGFib3ZlIGNoZWNrcyBhcmUgdHJ1ZSBhbmQgQyBpcyBhIE5hTiwKKyAgICAgKiBhIE5hTiBz aGFsbCBiZSByZXR1cm5lZAorICAgICAqIElmIEEgb3IgQiBhcmUgTmFOLCBhIE5BTiBzaGFsbCBi ZSByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBpZiAoZmxvYXQ2NF9pc19hbnlfbmFuKGEpIHx8Cisg ICAgICAgIGZsb2F0NjRfaXNfYW55X25hbihiKSB8fAorICAgICAgICBmbG9hdDY0X2lzX2FueV9u YW4oYykpIHsKKyAgICAgICAgaWYgKGZsb2F0NjRfaXNfYW55X25hbihhKSAmJiAoZkdFVEJJVCg1 MSwgYSkgPT0gMCkpIHsKKyAgICAgICAgICAgIGZsb2F0X3JhaXNlKGZsb2F0X2ZsYWdfaW52YWxp ZCwgZnBfc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZmxvYXQ2NF9pc19hbnlfbmFu KGIpICYmIChmR0VUQklUKDUxLCBiKSA9PSAwKSkgeworICAgICAgICAgICAgZmxvYXRfcmFpc2Uo ZmxvYXRfZmxhZ19pbnZhbGlkLCBmcF9zdGF0dXMpOworICAgICAgICB9CisgICAgICAgIGlmIChm bG9hdDY0X2lzX2FueV9uYW4oYykgJiYgKGZHRVRCSVQoNTEsIGMpID09IDApKSB7CisgICAgICAg ICAgICBmbG9hdF9yYWlzZShmbG9hdF9mbGFnX2ludmFsaWQsIGZwX3N0YXR1cyk7CisgICAgICAg IH0KKyAgICAgICAgcmV0ID0gbWFrZV9mbG9hdDY0KERGX05BTik7CisgICAgICAgIHJldHVybiBy ZXQ7CisgICAgfQorICAgIC8qCisgICAgICogV2UgaGF2ZSBjaGVja2VkIGZvciBhZGRpbmcgb3Bw b3NpdGUtc2lnbmVkIGluZmluaXRpZXMuCisgICAgICogT3RoZXIgaW5maW5pdGllcyByZXR1cm4g aW5maW5pdHkgd2l0aCB0aGUgY29ycmVjdCBzaWduCisgICAgICovCisgICAgaWYgKGZsb2F0NjRf aXNfaW5maW5pdHkoYykpIHsKKyAgICAgICAgcmV0ID0gaW5maW5pdGVfZmxvYXQ2NChjX3NpZ24p OworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoZmxvYXQ2NF9pc19pbmZpbml0 eShhKSB8fCBmbG9hdDY0X2lzX2luZmluaXR5KGIpKSB7CisgICAgICAgIHJldCA9IGluZmluaXRl X2Zsb2F0NjQoYV9zaWduIF4gYl9zaWduKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9Cisg ICAgZ19hc3NlcnRfbm90X3JlYWNoZWQoKTsKK30KKworc3RhdGljIGlubGluZSBmbG9hdDMyIHNw ZWNpYWxfZm1hZihmbG9hdDMyIGEsIGZsb2F0MzIgYiwgZmxvYXQzMiBjLAorICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgZmxvYXRfc3RhdHVzICpmcF9zdGF0dXMpCit7CisgICAgZmxv YXQ2NCBhYSwgYmIsIGNjOworICAgIGFhID0gZmxvYXQzMl90b19mbG9hdDY0KGEsIGZwX3N0YXR1 cyk7CisgICAgYmIgPSBmbG9hdDMyX3RvX2Zsb2F0NjQoYiwgZnBfc3RhdHVzKTsKKyAgICBjYyA9 IGZsb2F0MzJfdG9fZmxvYXQ2NChjLCBmcF9zdGF0dXMpOworICAgIHJldHVybiBmbG9hdDY0X3Rv X2Zsb2F0MzIoc3BlY2lhbF9mbWEoYWEsIGJiLCBjYywgZnBfc3RhdHVzKSwgZnBfc3RhdHVzKTsK K30KKworZmxvYXQzMiBpbnRlcm5hbF9mbWFmeChmbG9hdDMyIGEsIGZsb2F0MzIgYiwgZmxvYXQz MiBjLCBpbnQgc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0X3N0YXR1cyAqZnBf c3RhdHVzKQoreworICAgIEFjY3VtIHByb2Q7CisgICAgQWNjdW0gYWNjOworICAgIEFjY3VtIHJl c3VsdDsKKyAgICBhY2N1bV9pbml0KCZwcm9kKTsKKyAgICBhY2N1bV9pbml0KCZhY2MpOworICAg IGFjY3VtX2luaXQoJnJlc3VsdCk7CisKKyAgICB1aW50OF90IGFfc2lnbiA9IGZsb2F0MzJfaXNf bmVnKGEpOworICAgIHVpbnQ4X3QgYl9zaWduID0gZmxvYXQzMl9pc19uZWcoYik7CisgICAgdWlu dDhfdCBjX3NpZ24gPSBmbG9hdDMyX2lzX25lZyhjKTsKKyAgICBpZiAoZmxvYXQzMl9pc19pbmZp bml0eShhKSB8fAorICAgICAgICBmbG9hdDMyX2lzX2luZmluaXR5KGIpIHx8CisgICAgICAgIGZs b2F0MzJfaXNfaW5maW5pdHkoYykpIHsKKyAgICAgICAgcmV0dXJuIHNwZWNpYWxfZm1hZihhLCBi LCBjLCBmcF9zdGF0dXMpOworICAgIH0KKyAgICBpZiAoZmxvYXQzMl9pc19hbnlfbmFuKGEpIHx8 CisgICAgICAgIGZsb2F0MzJfaXNfYW55X25hbihiKSB8fAorICAgICAgICBmbG9hdDMyX2lzX2Fu eV9uYW4oYykpIHsKKyAgICAgICAgcmV0dXJuIHNwZWNpYWxfZm1hZihhLCBiLCBjLCBmcF9zdGF0 dXMpOworICAgIH0KKyAgICBpZiAoKHNjYWxlID09IDApICYmIChmbG9hdDMyX2lzX3plcm8oYSkg fHwgZmxvYXQzMl9pc196ZXJvKGIpKSkgeworICAgICAgICBmbG9hdDMyIHRtcCA9IGZsb2F0MzJf bXVsKGEsIGIsIGZwX3N0YXR1cyk7CisgICAgICAgIHRtcCA9IGZsb2F0MzJfYWRkKHRtcCwgYywg ZnBfc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICAvKiAoYSAqIDIq KmIpICogKGMgKiAyKipkKSA9PSBhKmMgKiAyKiooYitkKSAqLworICAgIHByb2QubWFudCA9IGlu dDEyOF9tdWxfNjQ2NChmbG9hdDMyX2dldG1hbnQoYSksIGZsb2F0MzJfZ2V0bWFudChiKSk7CisK KyAgICAvKgorICAgICAqIE5vdGU6IGV4dHJhY3RpbmcgdGhlIG1hbnRpc3NhIGludG8gYW4gaW50 IGlzIG11bHRpcGx5aW5nIGJ5CisgICAgICogMioqMjMsIHNvIGFkanVzdCBoZXJlCisgICAgICov CisgICAgcHJvZC5leHAgPSBmbG9hdDMyX2dldGV4cChhKSArIGZsb2F0MzJfZ2V0ZXhwKGIpIC0g U0ZfQklBUyAtIDIzOworICAgIHByb2Quc2lnbiA9IGFfc2lnbiBeIGJfc2lnbjsKKyAgICBpZiAo ZmxvYXQzMl9pc196ZXJvKGEpIHx8IGZsb2F0MzJfaXNfemVybyhiKSkgeworICAgICAgICBwcm9k LmV4cCA9IC0yICogV0FZX0JJR19FWFA7CisgICAgfQorICAgIGlmICgoc2NhbGUgPiAwKSAmJiBm bG9hdDMyX2lzX2Rlbm9ybWFsKGMpKSB7CisgICAgICAgIGFjYy5tYW50ID0gaW50MTI4X211bF82 NDY0KDAsIDApOworICAgICAgICBhY2MuZXhwID0gLVdBWV9CSUdfRVhQOworICAgICAgICBhY2Mu c2lnbiA9IGNfc2lnbjsKKyAgICAgICAgYWNjLnN0aWNreSA9IDE7CisgICAgICAgIHJlc3VsdCA9 IGFjY3VtX2FkZChwcm9kLCBhY2MpOworICAgIH0gZWxzZSBpZiAoIWZsb2F0MzJfaXNfemVybyhj KSkgeworICAgICAgICBhY2MubWFudCA9IGludDEyOF9tdWxfNjQ2NChmbG9hdDMyX2dldG1hbnQo YyksIDEpOworICAgICAgICBhY2MuZXhwID0gZmxvYXQzMl9nZXRleHAoYyk7CisgICAgICAgIGFj Yy5zaWduID0gY19zaWduOworICAgICAgICByZXN1bHQgPSBhY2N1bV9hZGQocHJvZCwgYWNjKTsK KyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBwcm9kOworICAgIH0KKyAgICByZXN1bHQu ZXhwICs9IHNjYWxlOworICAgIHJldHVybiBhY2N1bV9yb3VuZF9mbG9hdDMyKHJlc3VsdCwgZnBf c3RhdHVzKTsKK30KKworZmxvYXQzMiBpbnRlcm5hbF9tcHlmKGZsb2F0MzIgYSwgZmxvYXQzMiBi LCBmbG9hdF9zdGF0dXMgKmZwX3N0YXR1cykKK3sKKyAgICBpZiAoZmxvYXQzMl9pc196ZXJvKGEp IHx8IGZsb2F0MzJfaXNfemVybyhiKSkgeworICAgICAgICByZXR1cm4gZmxvYXQzMl9tdWwoYSwg YiwgZnBfc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIGludGVybmFsX2ZtYWZ4KGEsIGIsIGZs b2F0MzJfemVybywgMCwgZnBfc3RhdHVzKTsKK30KKworZmxvYXQ2NCBpbnRlcm5hbF9tcHloaChm bG9hdDY0IGEsIGZsb2F0NjQgYiwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25n IGxvbmcgaW50IGFjY3VtdWxhdGVkLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0X3N0YXR1 cyAqZnBfc3RhdHVzKQoreworICAgIEFjY3VtIHg7CisgICAgdW5zaWduZWQgbG9uZyBsb25nIGlu dCBwcm9kOworICAgIHVuc2lnbmVkIGludCBzdGlja3k7CisgICAgdWludDhfdCBhX3NpZ24sIGJf c2lnbjsKKworICAgIHN0aWNreSA9IGFjY3VtdWxhdGVkICYgMTsKKyAgICBhY2N1bXVsYXRlZCA+ Pj0gMTsKKyAgICBhY2N1bV9pbml0KCZ4KTsKKyAgICBpZiAoZmxvYXQ2NF9pc196ZXJvKGEpIHx8 CisgICAgICAgIGZsb2F0NjRfaXNfYW55X25hbihhKSB8fAorICAgICAgICBmbG9hdDY0X2lzX2lu ZmluaXR5KGEpKSB7CisgICAgICAgIHJldHVybiBmbG9hdDY0X211bChhLCBiLCBmcF9zdGF0dXMp OworICAgIH0KKyAgICBpZiAoZmxvYXQ2NF9pc196ZXJvKGIpIHx8CisgICAgICAgIGZsb2F0NjRf aXNfYW55X25hbihiKSB8fAorICAgICAgICBmbG9hdDY0X2lzX2luZmluaXR5KGIpKSB7CisgICAg ICAgIHJldHVybiBmbG9hdDY0X211bChhLCBiLCBmcF9zdGF0dXMpOworICAgIH0KKyAgICB4Lm1h bnQgPSBpbnQxMjhfbXVsXzY0NjQoYWNjdW11bGF0ZWQsIDEpOworICAgIHguc3RpY2t5ID0gc3Rp Y2t5OworICAgIHByb2QgPSBmR0VUVVdPUkQoMSwgZmxvYXQ2NF9nZXRtYW50KGEpKSAqIGZHRVRV V09SRCgxLCBmbG9hdDY0X2dldG1hbnQoYikpOworICAgIHgubWFudCA9IGludDEyOF9hZGQoeC5t YW50LCBpbnQxMjhfbXVsXzY0NjQocHJvZCwgMHgxMDAwMDAwMDBVTEwpKTsKKyAgICB4LmV4cCA9 IGZsb2F0NjRfZ2V0ZXhwKGEpICsgZmxvYXQ2NF9nZXRleHAoYikgLSBERl9CSUFTIC0gMjA7Cisg ICAgaWYgKCFmbG9hdDY0X2lzX25vcm1hbChhKSB8fCAhZmxvYXQ2NF9pc19ub3JtYWwoYikpIHsK KyAgICAgICAgLyogY3J1c2ggdG8gaW5leGFjdCB6ZXJvICovCisgICAgICAgIHguc3RpY2t5ID0g MTsKKyAgICAgICAgeC5leHAgPSAtNDA5NjsKKyAgICB9CisgICAgYV9zaWduID0gZmxvYXQ2NF9p c19uZWcoYSk7CisgICAgYl9zaWduID0gZmxvYXQ2NF9pc19uZWcoYik7CisgICAgeC5zaWduID0g YV9zaWduIF4gYl9zaWduOworICAgIHJldHVybiBhY2N1bV9yb3VuZF9mbG9hdDY0KHgsIGZwX3N0 YXR1cyk7Cit9Ci0tIAoyLjcuNAoK