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=-12.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,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 BD3FCC433DF for ; Tue, 18 Aug 2020 16:00:17 +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 65BD1206DA for ; Tue, 18 Aug 2020 16:00:17 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=quicinc.com header.i=@quicinc.com header.b="i5GFr0Tx" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 65BD1206DA 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]:39330 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1k8424-0006Xk-EY for qemu-devel@archiver.kernel.org; Tue, 18 Aug 2020 12:00:16 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:60852) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k83tP-0006sV-Gz for qemu-devel@nongnu.org; Tue, 18 Aug 2020 11:51:19 -0400 Received: from alexa-out-sd-02.qualcomm.com ([199.106.114.39]:12941) by eggs.gnu.org with esmtps (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.90_1) (envelope-from ) id 1k83tI-0005sP-To for qemu-devel@nongnu.org; Tue, 18 Aug 2020 11:51:19 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=quicinc.com; i=@quicinc.com; q=dns/txt; s=qcdkim; t=1597765872; x=1629301872; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=JMd/L5Y581THcdUOKlxFSAInH9hU7TfLtrM7gZ2iMUg=; b=i5GFr0TxRgd+JrFffr4y0tQNga8gMagZ2mHgNaNFAAWGX67zgByEdsUg bPQkJU4BINcr7V8raR+i//fP8wjk9gNIW4XOcbbdLvqCRentviidXX437 XqQAeEtC73YvQGUBfg9iTtCUynhU0ZsZtD4SLOy4C3Wbds5PiABSaYr0b E=; Received: from unknown (HELO ironmsg01-sd.qualcomm.com) ([10.53.140.141]) by alexa-out-sd-02.qualcomm.com with ESMTP; 18 Aug 2020 08:50:58 -0700 Received: from vu-tsimpson-aus.qualcomm.com (HELO vu-tsimpson1-aus.qualcomm.com) ([10.222.150.1]) by ironmsg01-sd.qualcomm.com with ESMTP; 18 Aug 2020 08:50:57 -0700 Received: by vu-tsimpson1-aus.qualcomm.com (Postfix, from userid 47164) id D4D6BEB5; Tue, 18 Aug 2020 10:50:56 -0500 (CDT) From: Taylor Simpson To: qemu-devel@nongnu.org Subject: [RFC PATCH v3 16/34] Hexagon (target/hexagon) utility functions Date: Tue, 18 Aug 2020 10:50:29 -0500 Message-Id: <1597765847-16637-17-git-send-email-tsimpson@quicinc.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1597765847-16637-1-git-send-email-tsimpson@quicinc.com> References: <1597765847-16637-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-detected-operating-system: by eggs.gnu.org: First seen = 2020/08/18 11:50:57 X-ACL-Warn: Detected OS = FreeBSD 9.x or newer [fuzzy] X-Spam_score_int: -32 X-Spam_score: -3.3 X-Spam_bar: --- X-Spam_report: (-3.3 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, HEADER_FROM_DIFFERENT_DOMAINS=1, RCVD_IN_DNSWL_MED=-2.3, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, URIBL_BLOCKED=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, riku.voipio@iki.fi, richard.henderson@linaro.org, laurent@vivier.eu, tsimpson@quicinc.com, philmd@redhat.com, aleksandar.m.mail@gmail.com Errors-To: qemu-devel-bounces+qemu-devel=archiver.kernel.org@nongnu.org Sender: "Qemu-devel" VXRpbGl0eSBmdW5jdGlvbnMgY2FsbGVkIGJ5IHZhcmlvdXMgaW5zdHJ1Y3Rpb25zCgpTaWduZWQt b2ZmLWJ5OiBUYXlsb3IgU2ltcHNvbiA8dHNpbXBzb25AcXVpY2luYy5jb20+Ci0tLQogdGFyZ2V0 L2hleGFnb24vYXJjaC5oICAgICB8ICA0MiArKysKIHRhcmdldC9oZXhhZ29uL2NvbnZfZW11Lmgg fCAgNTAgKysrCiB0YXJnZXQvaGV4YWdvbi9mbWFfZW11LmggIHwgIDI3ICsrCiB0YXJnZXQvaGV4 YWdvbi9hcmNoLmMgICAgIHwgMzU0ICsrKysrKysrKysrKysrKysrKysrKwogdGFyZ2V0L2hleGFn b24vY29udl9lbXUuYyB8IDM2OSArKysrKysrKysrKysrKysrKysrKysrCiB0YXJnZXQvaGV4YWdv bi9mbWFfZW11LmMgIHwgNzgxICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysKIDYgZmlsZXMgY2hhbmdlZCwgMTYyMyBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9k ZSAxMDA2NDQgdGFyZ2V0L2hleGFnb24vYXJjaC5oCiBjcmVhdGUgbW9kZSAxMDA2NDQgdGFyZ2V0 L2hleGFnb24vY29udl9lbXUuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IHRhcmdldC9oZXhhZ29uL2Zt YV9lbXUuaAogY3JlYXRlIG1vZGUgMTAwNjQ0IHRhcmdldC9oZXhhZ29uL2FyY2guYwogY3JlYXRl IG1vZGUgMTAwNjQ0IHRhcmdldC9oZXhhZ29uL2NvbnZfZW11LmMKIGNyZWF0ZSBtb2RlIDEwMDY0 NCB0YXJnZXQvaGV4YWdvbi9mbWFfZW11LmMKCmRpZmYgLS1naXQgYS90YXJnZXQvaGV4YWdvbi9h cmNoLmggYi90YXJnZXQvaGV4YWdvbi9hcmNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXgg MDAwMDAwMC4uZWNmNzA2MAotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9oZXhhZ29uL2FyY2gu aApAQCAtMCwwICsxLDQyIEBACisvKgorICogIENvcHlyaWdodChjKSAyMDE5LTIwMjAgUXVhbGNv bW0gSW5ub3ZhdGlvbiBDZW50ZXIsIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiAg VGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAgKGF0IHlvdXIg b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3Ry aWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhP VVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAq ICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBT ZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4K KyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVy YWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCBz ZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgSEVYQUdP Tl9BUkNIX0gKKyNkZWZpbmUgSEVYQUdPTl9BUkNIX0gKKworI2luY2x1ZGUgImNwdS5oIgorI2lu Y2x1ZGUgImhleF9hcmNoX3R5cGVzLmgiCisKK2V4dGVybiBzaXplOHVfdCBpbnRlcmxlYXZlKHNp emU0dV90IG9kZCwgc2l6ZTR1X3QgZXZlbik7CitleHRlcm4gc2l6ZTh1X3QgZGVpbnRlcmxlYXZl KHNpemU4dV90IHNyYyk7CitleHRlcm4gc2l6ZTR1X3QgY2FycnlfZnJvbV9hZGQ2NChzaXplOHVf dCBhLCBzaXplOHVfdCBiLCBzaXplNHVfdCBjKTsKK2V4dGVybiBzaXplNHNfdCBjb252X3JvdW5k KHNpemU0c190IGEsIGludCBuKTsKK2V4dGVybiBzaXplMTZzX3QgY2FzdDhzX3RvXzE2cyhzaXpl OHNfdCBhKTsKK2V4dGVybiBzaXplOHNfdCBjYXN0MTZzX3RvXzhzKHNpemUxNnNfdCBhKTsKK2V4 dGVybiBzaXplMTZzX3QgYWRkMTI4KHNpemUxNnNfdCBhLCBzaXplMTZzX3QgYik7CitleHRlcm4g c2l6ZTE2c190IHN1YjEyOChzaXplMTZzX3QgYSwgc2l6ZTE2c190IGIpOworZXh0ZXJuIHNpemUx NnNfdCBzaGlmdHIxMjgoc2l6ZTE2c190IGEsIHNpemU0dV90IG4pOworZXh0ZXJuIHNpemUxNnNf dCBzaGlmdGwxMjgoc2l6ZTE2c190IGEsIHNpemU0dV90IG4pOworZXh0ZXJuIHNpemUxNnNfdCBh bmQxMjgoc2l6ZTE2c190IGEsIHNpemUxNnNfdCBiKTsKK2V4dGVybiB2b2lkIGFyY2hfZnBvcF9z dGFydChDUFVIZXhhZ29uU3RhdGUgKmVudik7CitleHRlcm4gdm9pZCBhcmNoX2Zwb3BfZW5kKENQ VUhleGFnb25TdGF0ZSAqZW52KTsKK2V4dGVybiB2b2lkIGFyY2hfcmFpc2VfZnBmbGFnKHVuc2ln bmVkIGludCBmbGFncyk7CitleHRlcm4gaW50IGFyY2hfc2ZfcmVjaXBfY29tbW9uKHNpemU0c190 ICpScywgc2l6ZTRzX3QgKlJ0LCBzaXplNHNfdCAqUmQsCisgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIGludCAqYWRqdXN0KTsKK2V4dGVybiBpbnQgYXJjaF9zZl9pbnZzcXJ0X2NvbW1v bihzaXplNHNfdCAqUnMsIHNpemU0c190ICpSZCwgaW50ICphZGp1c3QpOworCisjZW5kaWYKZGlm ZiAtLWdpdCBhL3RhcmdldC9oZXhhZ29uL2NvbnZfZW11LmggYi90YXJnZXQvaGV4YWdvbi9jb252 X2VtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZDlkMmMKLS0tIC9k ZXYvbnVsbAorKysgYi90YXJnZXQvaGV4YWdvbi9jb252X2VtdS5oCkBAIC0wLDAgKzEsNTAgQEAK Ky8qCisgKiAgQ29weXJpZ2h0KGMpIDIwMTktMjAyMCBRdWFsY29tbSBJbm5vdmF0aW9uIENlbnRl ciwgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJl ZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0 IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVi bGlzaGVkIGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNp b24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2 ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUg dGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdp dGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBv ciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2Vu ZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxk IGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQor ICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUu b3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBIRVhBR09OX0NPTlZfRU1VX0gKKyNkZWZp bmUgSEVYQUdPTl9DT05WX0VNVV9ICisKKyNpbmNsdWRlICJoZXhfYXJjaF90eXBlcy5oIgorCitl eHRlcm4gc2l6ZTh1X3QgY29udl9zZl90b184dShmbG9hdCBpbik7CitleHRlcm4gc2l6ZTR1X3Qg Y29udl9zZl90b180dShmbG9hdCBpbik7CitleHRlcm4gc2l6ZThzX3QgY29udl9zZl90b184cyhm bG9hdCBpbik7CitleHRlcm4gc2l6ZTRzX3QgY29udl9zZl90b180cyhmbG9hdCBpbik7CisKK2V4 dGVybiBzaXplOHVfdCBjb252X2RmX3RvXzh1KGRvdWJsZSBpbik7CitleHRlcm4gc2l6ZTR1X3Qg Y29udl9kZl90b180dShkb3VibGUgaW4pOworZXh0ZXJuIHNpemU4c190IGNvbnZfZGZfdG9fOHMo ZG91YmxlIGluKTsKK2V4dGVybiBzaXplNHNfdCBjb252X2RmX3RvXzRzKGRvdWJsZSBpbik7CisK K2V4dGVybiBkb3VibGUgY29udl84dV90b19kZihzaXplOHVfdCBpbik7CitleHRlcm4gZG91Ymxl IGNvbnZfNHVfdG9fZGYoc2l6ZTR1X3QgaW4pOworZXh0ZXJuIGRvdWJsZSBjb252XzhzX3RvX2Rm KHNpemU4c190IGluKTsKK2V4dGVybiBkb3VibGUgY29udl80c190b19kZihzaXplNHNfdCBpbik7 CisKK2V4dGVybiBmbG9hdCBjb252Xzh1X3RvX3NmKHNpemU4dV90IGluKTsKK2V4dGVybiBmbG9h dCBjb252XzR1X3RvX3NmKHNpemU0dV90IGluKTsKK2V4dGVybiBmbG9hdCBjb252XzhzX3RvX3Nm KHNpemU4c190IGluKTsKK2V4dGVybiBmbG9hdCBjb252XzRzX3RvX3NmKHNpemU0c190IGluKTsK KworZXh0ZXJuIGZsb2F0IGNvbnZfZGZfdG9fc2YoZG91YmxlIGluKTsKKworc3RhdGljIGlubGlu ZSBkb3VibGUgY29udl9zZl90b19kZihmbG9hdCBpbikKK3sKKyAgICByZXR1cm4gaW47Cit9CisK KyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2hleGFnb24vZm1hX2VtdS5oIGIvdGFyZ2V0L2hl eGFnb24vZm1hX2VtdS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MWIx ZjYKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvaGV4YWdvbi9mbWFfZW11LmgKQEAgLTAsMCAr MSwyNyBAQAorLyoKKyAqICBDb3B5cmlnaHQoYykgMjAxOS0yMDIwIFF1YWxjb21tIElubm92YXRp b24gQ2VudGVyLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFRoaXMgcHJvZ3Jh bSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5 CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo ZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55 IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0 aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJS QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRB QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICog IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlv dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8v d3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIEhFWEFHT05fRk1BX0VNVV9I CisjZGVmaW5lIEhFWEFHT05fRk1BX0VNVV9ICisKK2V4dGVybiBmbG9hdCBpbnRlcm5hbF9mbWFm eChmbG9hdCBhX2luLCBmbG9hdCBiX2luLCBmbG9hdCBjX2luLCBpbnQgc2NhbGUpOworZXh0ZXJu IGZsb2F0IGludGVybmFsX2ZtYWYoZmxvYXQgYV9pbiwgZmxvYXQgYl9pbiwgZmxvYXQgY19pbik7 CitleHRlcm4gZmxvYXQgaW50ZXJuYWxfbXB5ZihmbG9hdCBhX2luLCBmbG9hdCBiX2luKTsKK2V4 dGVybiBkb3VibGUgaW50ZXJuYWxfbXB5aGgoZG91YmxlIGFfaW4sIGRvdWJsZSBiX2luLAorICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgaW50IGFjY3VtdWxh dGVkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS90YXJnZXQvaGV4YWdvbi9hcmNoLmMgYi90YXJn ZXQvaGV4YWdvbi9hcmNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2 MTJkMgotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9oZXhhZ29uL2FyY2guYwpAQCAtMCwwICsx LDM1NCBAQAorLyoKKyAqICBDb3B5cmlnaHQoYykgMjAxOS0yMDIwIFF1YWxjb21tIElubm92YXRp b24gQ2VudGVyLCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogIFRoaXMgcHJvZ3Jh bSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5 CisgKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBhcyBwdWJsaXNoZWQgYnkKKyAqICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRo ZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogIChhdCB5b3VyIG9wdGlvbikgYW55 IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0 aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJS QU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRB QklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICog IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlv dSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBM aWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgc2VlIDxodHRwOi8v d3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSAicWVtdS9vc2RlcC5oIgor I2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJmbWFfZW11LmgiCisjaW5jbHVkZSAiYXJjaC5o IgorI2luY2x1ZGUgIm1hY3Jvcy5oIgorCisjZGVmaW5lIEJJVFNfTUFTS184IDB4NTU1NTU1NTU1 NTU1NTU1NVVMTAorI2RlZmluZSBQQUlSX01BU0tfOCAweDMzMzMzMzMzMzMzMzMzMzNVTEwKKyNk ZWZpbmUgTllCTF9NQVNLXzggMHgwZjBmMGYwZjBmMGYwZjBmVUxMCisjZGVmaW5lIEJZVEVfTUFT S184IDB4MDBmZjAwZmYwMGZmMDBmZlVMTAorI2RlZmluZSBIQUxGX01BU0tfOCAweDAwMDBmZmZm MDAwMGZmZmZVTEwKKyNkZWZpbmUgV09SRF9NQVNLXzggMHgwMDAwMDAwMGZmZmZmZmZmVUxMCisK K3NpemU4dV90IGludGVybGVhdmUoc2l6ZTR1X3Qgb2RkLCBzaXplNHVfdCBldmVuKQoreworICAg IC8qIENvbnZlcnQgdG8gbG9uZyBsb25nICovCisgICAgc2l6ZTh1X3QgbXlvZGQgPSBvZGQ7Cisg ICAgc2l6ZTh1X3QgbXlldmVuID0gZXZlbjsKKyAgICAvKiBGaXJzdCwgc3ByZWFkIGJpdHMgb3V0 ICovCisgICAgbXlvZGQgPSAobXlvZGQgfCAobXlvZGQgPDwgMTYpKSAmIEhBTEZfTUFTS184Owor ICAgIG15ZXZlbiA9IChteWV2ZW4gfCAobXlldmVuIDw8IDE2KSkgJiBIQUxGX01BU0tfODsKKyAg ICBteW9kZCA9IChteW9kZCB8IChteW9kZCA8PCA4KSkgJiBCWVRFX01BU0tfODsKKyAgICBteWV2 ZW4gPSAobXlldmVuIHwgKG15ZXZlbiA8PCA4KSkgJiBCWVRFX01BU0tfODsKKyAgICBteW9kZCA9 IChteW9kZCB8IChteW9kZCA8PCA0KSkgJiBOWUJMX01BU0tfODsKKyAgICBteWV2ZW4gPSAobXll dmVuIHwgKG15ZXZlbiA8PCA0KSkgJiBOWUJMX01BU0tfODsKKyAgICBteW9kZCA9IChteW9kZCB8 IChteW9kZCA8PCAyKSkgJiBQQUlSX01BU0tfODsKKyAgICBteWV2ZW4gPSAobXlldmVuIHwgKG15 ZXZlbiA8PCAyKSkgJiBQQUlSX01BU0tfODsKKyAgICBteW9kZCA9IChteW9kZCB8IChteW9kZCA8 PCAxKSkgJiBCSVRTX01BU0tfODsKKyAgICBteWV2ZW4gPSAobXlldmVuIHwgKG15ZXZlbiA8PCAx KSkgJiBCSVRTX01BU0tfODsKKyAgICAvKiBOb3cgT1IgdG9nZXRoZXIgKi8KKyAgICByZXR1cm4g bXlldmVuIHwgKG15b2RkIDw8IDEpOworfQorCitzaXplOHVfdCBkZWludGVybGVhdmUoc2l6ZTh1 X3Qgc3JjKQoreworICAgIC8qIEdldCBvZGQgYW5kIGV2ZW4gYml0cyAqLworICAgIHNpemU4dV90 IG15b2RkID0gKChzcmMgPj4gMSkgJiBCSVRTX01BU0tfOCk7CisgICAgc2l6ZTh1X3QgbXlldmVu ID0gKHNyYyAmIEJJVFNfTUFTS184KTsKKworICAgIC8qIFVuc3ByZWFkIGJpdHMgKi8KKyAgICBt eWV2ZW4gPSAobXlldmVuIHwgKG15ZXZlbiA+PiAxKSkgJiBQQUlSX01BU0tfODsKKyAgICBteW9k ZCA9IChteW9kZCB8IChteW9kZCA+PiAxKSkgJiBQQUlSX01BU0tfODsKKyAgICBteWV2ZW4gPSAo bXlldmVuIHwgKG15ZXZlbiA+PiAyKSkgJiBOWUJMX01BU0tfODsKKyAgICBteW9kZCA9IChteW9k ZCB8IChteW9kZCA+PiAyKSkgJiBOWUJMX01BU0tfODsKKyAgICBteWV2ZW4gPSAobXlldmVuIHwg KG15ZXZlbiA+PiA0KSkgJiBCWVRFX01BU0tfODsKKyAgICBteW9kZCA9IChteW9kZCB8IChteW9k ZCA+PiA0KSkgJiBCWVRFX01BU0tfODsKKyAgICBteWV2ZW4gPSAobXlldmVuIHwgKG15ZXZlbiA+ PiA4KSkgJiBIQUxGX01BU0tfODsKKyAgICBteW9kZCA9IChteW9kZCB8IChteW9kZCA+PiA4KSkg JiBIQUxGX01BU0tfODsKKyAgICBteWV2ZW4gPSAobXlldmVuIHwgKG15ZXZlbiA+PiAxNikpICYg V09SRF9NQVNLXzg7CisgICAgbXlvZGQgPSAobXlvZGQgfCAobXlvZGQgPj4gMTYpKSAmIFdPUkRf TUFTS184OworCisgICAgLyogUmV0dXJuIG9kZCBiaXRzIGluIHVwcGVyIGhhbGYgKi8KKyAgICBy ZXR1cm4gbXlldmVuIHwgKG15b2RkIDw8IDMyKTsKK30KKworc2l6ZTR1X3QgY2FycnlfZnJvbV9h ZGQ2NChzaXplOHVfdCBhLCBzaXplOHVfdCBiLCBzaXplNHVfdCBjKQoreworICAgIHNpemU4dV90 IHRtcGEsIHRtcGIsIHRtcGM7CisgICAgdG1wYSA9IGZHRVRVV09SRCgwLCBhKTsKKyAgICB0bXBi ID0gZkdFVFVXT1JEKDAsIGIpOworICAgIHRtcGMgPSB0bXBhICsgdG1wYiArIGM7CisgICAgdG1w YSA9IGZHRVRVV09SRCgxLCBhKTsKKyAgICB0bXBiID0gZkdFVFVXT1JEKDEsIGIpOworICAgIHRt cGMgPSB0bXBhICsgdG1wYiArIGZHRVRVV09SRCgxLCB0bXBjKTsKKyAgICB0bXBjID0gZkdFVFVX T1JEKDEsIHRtcGMpOworICAgIHJldHVybiB0bXBjOworfQorCitzaXplNHNfdCBjb252X3JvdW5k KHNpemU0c190IGEsIGludCBuKQoreworICAgIHNpemU4c190IHZhbDsKKworICAgIGlmIChuID09 IDApIHsKKyAgICAgICAgdmFsID0gYTsKKyAgICB9IGVsc2UgaWYgKChhICYgKCgxIDw8IChuIC0g MSkpIC0gMSkpID09IDApIHsgICAgLyogTi0xLi4wIGFsbCB6ZXJvPyAqLworICAgICAgICAvKiBB ZGQgTFNCIGZyb20gaW50IHBhcnQgKi8KKyAgICAgICAgdmFsID0gKChmU0UzMl82NChhKSkgKyAo c2l6ZThzX3QpICgoKHNpemU0dV90KSAoKDEgPDwgbikgJiBhKSkgPj4gMSkpOworICAgIH0gZWxz ZSB7CisgICAgICAgIHZhbCA9ICgoZlNFMzJfNjQoYSkpICsgKDEgPDwgKG4gLSAxKSkpOworICAg IH0KKworICAgIHZhbCA9IHZhbCA+PiBuOworICAgIHJldHVybiAoc2l6ZTRzX3QpdmFsOworfQor CitzaXplMTZzX3QgY2FzdDhzX3RvXzE2cyhzaXplOHNfdCBhKQoreworICAgIHNpemUxNnNfdCBy ZXN1bHQgPSB7LmhpID0gMCwgLmxvID0gMH07CisgICAgcmVzdWx0LmxvID0gYTsKKyAgICBpZiAo YSA8IDApIHsKKyAgICAgICAgcmVzdWx0LmhpID0gLTE7CisgICAgfQorICAgIHJldHVybiByZXN1 bHQ7Cit9CisKK3NpemU4c190IGNhc3QxNnNfdG9fOHMoc2l6ZTE2c190IGEpCit7CisgICAgcmV0 dXJuIGEubG87Cit9CisKK3NpemUxNnNfdCBhZGQxMjgoc2l6ZTE2c190IGEsIHNpemUxNnNfdCBi KQoreworICAgIHNpemUxNnNfdCByZXN1bHQgPSB7LmhpID0gMCwgLmxvID0gMH07CisgICAgcmVz dWx0LmxvID0gYS5sbyArIGIubG87CisgICAgcmVzdWx0LmhpID0gYS5oaSArIGIuaGk7CisKKyAg ICBpZiAocmVzdWx0LmxvIDwgYi5sbykgeworICAgICAgICByZXN1bHQuaGkrKzsKKyAgICB9CisK KyAgICByZXR1cm4gcmVzdWx0OworfQorCitzaXplMTZzX3Qgc3ViMTI4KHNpemUxNnNfdCBhLCBz aXplMTZzX3QgYikKK3sKKyAgICBzaXplMTZzX3QgcmVzdWx0ID0gey5oaSA9IDAsIC5sbyA9IDB9 OworICAgIHJlc3VsdC5sbyA9IGEubG8gLSBiLmxvOworICAgIHJlc3VsdC5oaSA9IGEuaGkgLSBi LmhpOworICAgIGlmIChyZXN1bHQubG8gPiBhLmxvKSB7CisgICAgICAgIHJlc3VsdC5oaS0tOwor ICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3NpemUxNnNfdCBzaGlmdHIxMjgoc2l6 ZTE2c190IGEsIHNpemU0dV90IG4pCit7CisgICAgc2l6ZTE2c190IHJlc3VsdDsKKyAgICByZXN1 bHQubG8gPSAoYS5sbyA+PiBuKSB8IChhLmhpIDw8ICg2NCAtIG4pKTsKKyAgICByZXN1bHQuaGkg PSBhLmhpID4+IG47CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc2l6ZTE2c190IHNoaWZ0bDEy OChzaXplMTZzX3QgYSwgc2l6ZTR1X3QgbikKK3sKKyAgICBzaXplMTZzX3QgcmVzdWx0OworICAg IHJlc3VsdC5sbyA9IGEubG8gPDwgbjsKKyAgICByZXN1bHQuaGkgPSAoYS5oaSA8PCBuKSB8IChh LmxvID4+ICg2NCAtIG4pKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzaXplMTZzX3QgYW5k MTI4KHNpemUxNnNfdCBhLCBzaXplMTZzX3QgYikKK3sKKyAgICBzaXplMTZzX3QgcmVzdWx0Owor ICAgIHJlc3VsdC5sbyA9IGEubG8gJiBiLmxvOworICAgIHJlc3VsdC5oaSA9IGEuaGkgJiBiLmhp OworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8qIEZsb2F0aW5nIFBvaW50IFN0dWZmICovCisK K3N0YXRpYyBjb25zdCBpbnQgcm91bmRpbmdtb2Rlc1tdID0geworICAgIEZFX1RPTkVBUkVTVCwK KyAgICBGRV9UT1dBUkRaRVJPLAorICAgIEZFX0RPV05XQVJELAorICAgIEZFX1VQV0FSRAorfTsK Kwordm9pZCBhcmNoX2Zwb3Bfc3RhcnQoQ1BVSGV4YWdvblN0YXRlICplbnYpCit7CisgICAgZmVn ZXRlbnYoJmVudi0+ZmVudik7CisgICAgZmVjbGVhcmV4Y2VwdChGRV9BTExfRVhDRVBUKTsKKyAg ICBmZXNldHJvdW5kKHJvdW5kaW5nbW9kZXNbZlJFQURfUkVHX0ZJRUxEKFVTUiwgVVNSX0ZQUk5E KV0pOworfQorCisjZGVmaW5lIE5PVEhJTkcgICAgICAgICAgICAgLyogRG9uJ3QgZG8gYW55dGhp bmcgKi8KKworI2RlZmluZSBURVNUX0ZMQUcoTElCQ0YsIE1ZRiwgTVlFKSBcCisgICAgZG8geyBc CisgICAgICAgIGlmIChmZXRlc3RleGNlcHQoTElCQ0YpKSB7IFwKKyAgICAgICAgICAgIGlmIChH RVRfVVNSX0ZJRUxEKFVTUl8jI01ZRikgPT0gMCkgeyBcCisgICAgICAgICAgICAgICAgU0VUX1VT Ul9GSUVMRChVU1JfIyNNWUYsIDEpOyBcCisgICAgICAgICAgICAgICAgaWYgKEdFVF9VU1JfRklF TEQoVVNSXyMjTVlFKSkgeyBcCisgICAgICAgICAgICAgICAgICAgIE5PVEhJTkcgXAorICAgICAg ICAgICAgICAgIH0gXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgIH0gd2hpbGUg KDApCisKK3ZvaWQgYXJjaF9mcG9wX2VuZChDUFVIZXhhZ29uU3RhdGUgKmVudikKK3sKKyAgICBp ZiAoZmV0ZXN0ZXhjZXB0KEZFX0FMTF9FWENFUFQpKSB7CisgICAgICAgIFRFU1RfRkxBRyhGRV9J TkVYQUNULCBGUElOUEYsIEZQSU5QRSk7CisgICAgICAgIFRFU1RfRkxBRyhGRV9ESVZCWVpFUk8s IEZQREJaRiwgRlBEQlpFKTsKKyAgICAgICAgVEVTVF9GTEFHKEZFX0lOVkFMSUQsIEZQSU5WRiwg RlBJTlZFKTsKKyAgICAgICAgVEVTVF9GTEFHKEZFX09WRVJGTE9XLCBGUE9WRkYsIEZQT1ZGRSk7 CisgICAgICAgIFRFU1RfRkxBRyhGRV9VTkRFUkZMT1csIEZQVU5GRiwgRlBVTkZFKTsKKyAgICB9 CisgICAgZmVzZXRlbnYoJmVudi0+ZmVudik7Cit9CisKKyN1bmRlZiBURVNUX0ZMQUcKKworCit2 b2lkIGFyY2hfcmFpc2VfZnBmbGFnKHVuc2lnbmVkIGludCBmbGFncykKK3sKKyAgICBmZXJhaXNl ZXhjZXB0KGZsYWdzKTsKK30KKworaW50IGFyY2hfc2ZfcmVjaXBfY29tbW9uKHNpemU0c190ICpS cywgc2l6ZTRzX3QgKlJ0LCBzaXplNHNfdCAqUmQsIGludCAqYWRqdXN0KQoreworICAgIGludCBu X2NsYXNzOworICAgIGludCBkX2NsYXNzOworICAgIGludCBuX2V4cDsKKyAgICBpbnQgZF9leHA7 CisgICAgaW50IHJldCA9IDA7CisgICAgc2l6ZTRzX3QgUnNWLCBSdFYsIFJkVjsKKyAgICBpbnQg UGVWID0gMDsKKyAgICBSc1YgPSAqUnM7CisgICAgUnRWID0gKlJ0OworICAgIG5fY2xhc3MgPSBm cGNsYXNzaWZ5KGZGTE9BVChSc1YpKTsKKyAgICBkX2NsYXNzID0gZnBjbGFzc2lmeShmRkxPQVQo UnRWKSk7CisgICAgaWYgKChuX2NsYXNzID09IEZQX05BTikgJiYgKGRfY2xhc3MgPT0gRlBfTkFO KSkgeworICAgICAgICBpZiAoZkdFVEJJVCgyMiwgUnNWICYgUnRWKSA9PSAwKSB7CisgICAgICAg ICAgICBmUkFJU0VGTEFHUyhGRV9JTlZBTElEKTsKKyAgICAgICAgfQorICAgICAgICBSZFYgPSBS c1YgPSBSdFYgPSBmU0ZOQU5WQUwoKTsKKyAgICB9IGVsc2UgaWYgKG5fY2xhc3MgPT0gRlBfTkFO KSB7CisgICAgICAgIGlmIChmR0VUQklUKDIyLCBSc1YpID09IDApIHsKKyAgICAgICAgICAgIGZS QUlTRUZMQUdTKEZFX0lOVkFMSUQpOworICAgICAgICB9CisgICAgICAgIFJkViA9IFJzViA9IFJ0 ViA9IGZTRk5BTlZBTCgpOworICAgIH0gZWxzZSBpZiAoZF9jbGFzcyA9PSBGUF9OQU4pIHsKKyAg ICAgICAgLyogb3IgcHV0IE5hTiBpbiBudW0vZGVuIGZpeHVwPyAqLworICAgICAgICBpZiAoZkdF VEJJVCgyMiwgUnRWKSA9PSAwKSB7CisgICAgICAgICAgICBmUkFJU0VGTEFHUyhGRV9JTlZBTElE KTsKKyAgICAgICAgfQorICAgICAgICBSZFYgPSBSc1YgPSBSdFYgPSBmU0ZOQU5WQUwoKTsKKyAg ICB9IGVsc2UgaWYgKChuX2NsYXNzID09IEZQX0lORklOSVRFKSAmJiAoZF9jbGFzcyA9PSBGUF9J TkZJTklURSkpIHsKKyAgICAgICAgLyogb3IgcHV0IEluZiBpbiBudW0gZml4dXA/ICovCisgICAg ICAgIFJkViA9IFJzViA9IFJ0ViA9IGZTRk5BTlZBTCgpOworICAgICAgICBmUkFJU0VGTEFHUyhG RV9JTlZBTElEKTsKKyAgICB9IGVsc2UgaWYgKChuX2NsYXNzID09IEZQX1pFUk8pICYmIChkX2Ns YXNzID09IEZQX1pFUk8pKSB7CisgICAgICAgIC8qIG9yIHB1dCB6ZXJvIGluIG51bSBmaXh1cD8g Ki8KKyAgICAgICAgUmRWID0gUnNWID0gUnRWID0gZlNGTkFOVkFMKCk7CisgICAgICAgIGZSQUlT RUZMQUdTKEZFX0lOVkFMSUQpOworICAgIH0gZWxzZSBpZiAoZF9jbGFzcyA9PSBGUF9aRVJPKSB7 CisgICAgICAgIC8qIG9yIHB1dCBJbmYgaW4gbnVtIGZpeHVwPyAqLworICAgICAgICBSc1YgPSBm U0ZJTkZWQUwoUnNWIF4gUnRWKTsKKyAgICAgICAgUnRWID0gZlNGT05FVkFMKDApOworICAgICAg ICBSZFYgPSBmU0ZPTkVWQUwoMCk7CisgICAgICAgIGlmIChuX2NsYXNzICE9IEZQX0lORklOSVRF KSB7CisgICAgICAgICAgICBmUkFJU0VGTEFHUyhGRV9ESVZCWVpFUk8pOworICAgICAgICB9Cisg ICAgfSBlbHNlIGlmIChkX2NsYXNzID09IEZQX0lORklOSVRFKSB7CisgICAgICAgIFJzViA9IDB4 ODAwMDAwMDAgJiAoUnNWIF4gUnRWKTsKKyAgICAgICAgUnRWID0gZlNGT05FVkFMKDApOworICAg ICAgICBSZFYgPSBmU0ZPTkVWQUwoMCk7CisgICAgfSBlbHNlIGlmIChuX2NsYXNzID09IEZQX1pF Uk8pIHsKKyAgICAgICAgLyogRG9lcyB0aGlzIGp1c3Qgd29yayBpdHNlbGYgb3V0PyAqLworICAg ICAgICAvKiBObywgMC9JbmYgY2F1c2VzIHByb2JsZW1zLiAqLworICAgICAgICBSc1YgPSAweDgw MDAwMDAwICYgKFJzViBeIFJ0Vik7CisgICAgICAgIFJ0ViA9IGZTRk9ORVZBTCgwKTsKKyAgICAg ICAgUmRWID0gZlNGT05FVkFMKDApOworICAgIH0gZWxzZSBpZiAobl9jbGFzcyA9PSBGUF9JTkZJ TklURSkgeworICAgICAgICAvKiBEb2VzIHRoaXMganVzdCB3b3JrIGl0c2VsZiBvdXQ/ICovCisg ICAgICAgIFJzViA9IGZTRklORlZBTChSc1YgXiBSdFYpOworICAgICAgICBSdFYgPSBmU0ZPTkVW QUwoMCk7CisgICAgICAgIFJkViA9IGZTRk9ORVZBTCgwKTsKKyAgICB9IGVsc2UgeworICAgICAg ICBQZVYgPSAweDAwOworICAgICAgICAvKiBCYXNpYyBjaGVja3MgcGFzc2VkICovCisgICAgICAg IG5fZXhwID0gZlNGX0dFVEVYUChSc1YpOworICAgICAgICBkX2V4cCA9IGZTRl9HRVRFWFAoUnRW KTsKKyAgICAgICAgaWYgKChuX2V4cCAtIGRfZXhwICsgZlNGX0JJQVMoKSkgPD0gZlNGX01BTlRC SVRTKCkpIHsKKyAgICAgICAgICAgIC8qIE5lYXIgcXVvdGllbnQgdW5kZXJmbG93IC8gaW5leGFj dCBRICovCisgICAgICAgICAgICBQZVYgPSAweDgwOworICAgICAgICAgICAgUnRWID0gZlNGX01V TF9QT1cyKFJ0ViwgLTY0KTsKKyAgICAgICAgICAgIFJzViA9IGZTRl9NVUxfUE9XMihSc1YsIDY0 KTsKKyAgICAgICAgfSBlbHNlIGlmICgobl9leHAgLSBkX2V4cCArIGZTRl9CSUFTKCkpID4gKGZT Rl9NQVhFWFAoKSAtIDI0KSkgeworICAgICAgICAgICAgLyogTmVhciBxdW90aWVudCBvdmVyZmxv dyAqLworICAgICAgICAgICAgUGVWID0gMHg0MDsKKyAgICAgICAgICAgIFJ0ViA9IGZTRl9NVUxf UE9XMihSdFYsIDMyKTsKKyAgICAgICAgICAgIFJzViA9IGZTRl9NVUxfUE9XMihSc1YsIC0zMik7 CisgICAgICAgIH0gZWxzZSBpZiAobl9leHAgPD0gZlNGX01BTlRCSVRTKCkgKyAyKSB7CisgICAg ICAgICAgICBSdFYgPSBmU0ZfTVVMX1BPVzIoUnRWLCA2NCk7CisgICAgICAgICAgICBSc1YgPSBm U0ZfTVVMX1BPVzIoUnNWLCA2NCk7CisgICAgICAgIH0gZWxzZSBpZiAoZF9leHAgPD0gMSkgewor ICAgICAgICAgICAgUnRWID0gZlNGX01VTF9QT1cyKFJ0ViwgMzIpOworICAgICAgICAgICAgUnNW ID0gZlNGX01VTF9QT1cyKFJzViwgMzIpOworICAgICAgICB9IGVsc2UgaWYgKGRfZXhwID4gMjUy KSB7CisgICAgICAgICAgICBSdFYgPSBmU0ZfTVVMX1BPVzIoUnRWLCAtMzIpOworICAgICAgICAg ICAgUnNWID0gZlNGX01VTF9QT1cyKFJzViwgLTMyKTsKKyAgICAgICAgfQorICAgICAgICBSZFYg PSAwOworICAgICAgICByZXQgPSAxOworICAgIH0KKyAgICAqUnMgPSBSc1Y7CisgICAgKlJ0ID0g UnRWOworICAgICpSZCA9IFJkVjsKKyAgICAqYWRqdXN0ID0gUGVWOworICAgIHJldHVybiByZXQ7 Cit9CisKK2ludCBhcmNoX3NmX2ludnNxcnRfY29tbW9uKHNpemU0c190ICpScywgc2l6ZTRzX3Qg KlJkLCBpbnQgKmFkanVzdCkKK3sKKyAgICBpbnQgcl9jbGFzczsKKyAgICBzaXplNHNfdCBSc1Ys IFJkVjsKKyAgICBpbnQgUGVWID0gMDsKKyAgICBpbnQgcl9leHA7CisgICAgaW50IHJldCA9IDA7 CisgICAgUnNWID0gKlJzOworICAgIHJfY2xhc3MgPSBmcGNsYXNzaWZ5KGZGTE9BVChSc1YpKTsK KyAgICBpZiAocl9jbGFzcyA9PSBGUF9OQU4pIHsKKyAgICAgICAgaWYgKGZHRVRCSVQoMjIsIFJz VikgPT0gMCkgeworICAgICAgICAgICAgZlJBSVNFRkxBR1MoRkVfSU5WQUxJRCk7CisgICAgICAg IH0KKyAgICAgICAgUmRWID0gUnNWID0gZlNGTkFOVkFMKCk7CisgICAgfSBlbHNlIGlmIChmRkxP QVQoUnNWKSA8IDAuMCkgeworICAgICAgICAvKiBOZWdhdGl2ZSBub256ZXJvIHZhbHVlcyBhcmUg TmFOICovCisgICAgICAgIGZSQUlTRUZMQUdTKEZFX0lOVkFMSUQpOworICAgICAgICBSc1YgPSBm U0ZOQU5WQUwoKTsKKyAgICAgICAgUmRWID0gZlNGTkFOVkFMKCk7CisgICAgfSBlbHNlIGlmIChy X2NsYXNzID09IEZQX0lORklOSVRFKSB7CisgICAgICAgIC8qIG9yIHB1dCBJbmYgaW4gbnVtIGZp eHVwPyAqLworICAgICAgICBSc1YgPSBmU0ZJTkZWQUwoLTEpOworICAgICAgICBSZFYgPSBmU0ZJ TkZWQUwoLTEpOworICAgIH0gZWxzZSBpZiAocl9jbGFzcyA9PSBGUF9aRVJPKSB7CisgICAgICAg IC8qIG9yIHB1dCB6ZXJvIGluIG51bSBmaXh1cD8gKi8KKyAgICAgICAgUmRWID0gZlNGT05FVkFM KDApOworICAgIH0gZWxzZSB7CisgICAgICAgIFBlViA9IDB4MDA7CisgICAgICAgIC8qIEJhc2lj IGNoZWNrcyBwYXNzZWQgKi8KKyAgICAgICAgcl9leHAgPSBmU0ZfR0VURVhQKFJzVik7CisgICAg ICAgIGlmIChyX2V4cCA8PSAyNCkgeworICAgICAgICAgICAgUnNWID0gZlNGX01VTF9QT1cyKFJz ViwgNjQpOworICAgICAgICAgICAgUGVWID0gMHhlMDsKKyAgICAgICAgfQorICAgICAgICBSZFYg PSAwOworICAgICAgICByZXQgPSAxOworICAgIH0KKyAgICAqUnMgPSBSc1Y7CisgICAgKlJkID0g UmRWOworICAgICphZGp1c3QgPSBQZVY7CisgICAgcmV0dXJuIHJldDsKK30KKwpkaWZmIC0tZ2l0 IGEvdGFyZ2V0L2hleGFnb24vY29udl9lbXUuYyBiL3RhcmdldC9oZXhhZ29uL2NvbnZfZW11LmMK bmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMxZmYzMgotLS0gL2Rldi9udWxs CisrKyBiL3RhcmdldC9oZXhhZ29uL2NvbnZfZW11LmMKQEAgLTAsMCArMSwzNjkgQEAKKy8qCisg KiAgQ29weXJpZ2h0KGMpIDIwMTktMjAyMCBRdWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciwgSW5j LiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0 d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVy IHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVk IGJ5CisgKiAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBv ZiB0aGUgTGljZW5zZSwgb3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9u LgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQg ZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRO RVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQ dWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUg cmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFs b25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xp Y2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJxZW11L29zZGVw LmgiCisjaW5jbHVkZSAiaGV4X2FyY2hfdHlwZXMuaCIKKyNpbmNsdWRlICJtYWNyb3MuaCIKKyNp bmNsdWRlICJjb252X2VtdS5oIgorCisjZGVmaW5lIGlzeihYKSAoZnBjbGFzc2lmeShYKSA9PSBG UF9aRVJPKQorI2RlZmluZSBERl9CSUFTIDEwMjMKKyNkZWZpbmUgU0ZfQklBUyAxMjcKKworI2Rl ZmluZSBMTF9NQVhfUE9TIDB4N2ZmZmZmZmZmZmZmZmZmZlVMTAorI2RlZmluZSBNQVhfUE9TIDB4 N2ZmZmZmZmZVCisKKyNpZmRlZiBWQ1BQCisvKgorICogVmlzdWFsIEMgaXNuJ3QgR05VIEMgYW5k IGRvZXNuJ3QgaGF2ZSBfX2J1aWx0aW5fY2x6bGwKKyAqLworCitzdGF0aWMgaW50IF9fYnVpbHRp bl9jbHpsbCh1bnNpZ25lZCBsb25nIGxvbmcgaW50IGlucHV0KQoreworICAgIGludCB0b3RhbCA9 IDA7CisgICAgaWYgKGlucHV0ID09IDApIHsKKyAgICAgICAgcmV0dXJuIDY0OworICAgIH0KKyAg ICB0b3RhbCArPSAoKGlucHV0ID4+ICh0b3RhbCArIDMyKSkgIT0gMCkgPyAzMiA6IDA7CisgICAg dG90YWwgKz0gKChpbnB1dCA+PiAodG90YWwgKyAxNikpICE9IDApID8gMTYgOiAwOworICAgIHRv dGFsICs9ICgoaW5wdXQgPj4gKHRvdGFsICsgIDgpKSAhPSAwKSA/ICA4IDogMDsKKyAgICB0b3Rh bCArPSAoKGlucHV0ID4+ICh0b3RhbCArICA0KSkgIT0gMCkgPyAgNCA6IDA7CisgICAgdG90YWwg Kz0gKChpbnB1dCA+PiAodG90YWwgKyAgMikpICE9IDApID8gIDIgOiAwOworICAgIHRvdGFsICs9 ICgoaW5wdXQgPj4gKHRvdGFsICsgIDEpKSAhPSAwKSA/ICAxIDogMDsKKyAgICByZXR1cm4gNjMg LSB0b3RhbDsKK30KKyNlbmRpZgorCit0eXBlZGVmIHVuaW9uIHsKKyAgICBkb3VibGUgZjsKKyAg ICBzaXplOHVfdCBpOworICAgIHN0cnVjdCB7CisgICAgICAgIHNpemU4dV90IG1hbnQ6NTI7Cisg ICAgICAgIHNpemU4dV90IGV4cDoxMTsKKyAgICAgICAgc2l6ZTh1X3Qgc2lnbjoxOworICAgIH0g eDsKK30gZGZfdDsKKworCit0eXBlZGVmIHVuaW9uIHsKKyAgICBmbG9hdCBmOworICAgIHNpemU0 dV90IGk7CisgICAgc3RydWN0IHsKKyAgICAgICAgc2l6ZTR1X3QgbWFudDoyMzsKKyAgICAgICAg c2l6ZTR1X3QgZXhwOjg7CisgICAgICAgIHNpemU0dV90IHNpZ246MTsKKyAgICB9IHg7Cit9IHNm X3Q7CisKKworI2RlZmluZSBNQUtFX0NPTlZfOFVfVE9fWEZfTihGTE9BVElELCBCSUdGTE9BVElE LCBSRVRUWVBFKSBcCitzdGF0aWMgUkVUVFlQRSBjb252Xzh1X3RvXyMjRkxPQVRJRCMjX24oc2l6 ZTh1X3QgaW4sIGludCBuZWdhdGUpIFwKK3sgXAorICAgIEZMT0FUSUQjI190IHg7IFwKKyAgICBz aXplOHVfdCB0bXAsIHRydW5jYml0cywgc2hhbXQ7IFwKKyAgICBpbnQgbGVhZGluZ196ZXJvczsg XAorICAgIGlmIChpbiA9PSAwKSB7IFwKKyAgICAgICAgcmV0dXJuIDAuMDsgXAorICAgIH0gXAor ICAgIGxlYWRpbmdfemVyb3MgPSBfX2J1aWx0aW5fY2x6bGwoaW4pOyBcCisgICAgdG1wID0gaW4g PDwgKGxlYWRpbmdfemVyb3MpOyBcCisgICAgdG1wIDw8PSAxOyBcCisgICAgc2hhbXQgPSA2NCAt IGYjI0JJR0ZMT0FUSUQjI19NQU5UQklUUygpOyBcCisgICAgdHJ1bmNiaXRzID0gdG1wICYgKCgx VUxMIDw8IChzaGFtdCkpIC0gMSk7IFwKKyAgICB0bXAgPj49IHNoYW10OyBcCisgICAgaWYgKHRy dW5jYml0cyAhPSAwKSB7IFwKKyAgICAgICAgZmVyYWlzZWV4Y2VwdChGRV9JTkVYQUNUKTsgXAor ICAgICAgICBzd2l0Y2ggKGZlZ2V0cm91bmQoKSkgeyBcCisgICAgICAgIGNhc2UgRkVfVE9XQVJE WkVSTzogXAorICAgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgY2FzZSBGRV9ET1dOV0FSRDog XAorICAgICAgICAgICAgaWYgKG5lZ2F0ZSkgeyBcCisgICAgICAgICAgICAgICAgdG1wICs9IDE7 IFwKKyAgICAgICAgICAgIH0gXAorICAgICAgICAgICAgYnJlYWs7IFwKKyAgICAgICAgY2FzZSBG RV9VUFdBUkQ6IFwKKyAgICAgICAgICAgIGlmICghbmVnYXRlKSB7IFwKKyAgICAgICAgICAgICAg ICB0bXAgKz0gMTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBicmVhazsgXAorICAg ICAgICBkZWZhdWx0OiBcCisgICAgICAgICAgICBpZiAoKHRydW5jYml0cyAmICgoMVVMTCA8PCAo c2hhbXQgLSAxKSkgLSAxKSkgPT0gMCkgeyBcCisgICAgICAgICAgICAgICAgdG1wICs9ICh0bXAg JiAxKTsgXAorICAgICAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgICAgIHRtcCArPSAo KHRydW5jYml0cyA+PiAoc2hhbXQgLSAxKSkgJiAxKTsgXAorICAgICAgICAgICAgfSBcCisgICAg ICAgICAgICBicmVhazsgXAorICAgICAgICB9IFwKKyAgICB9IFwKKyAgICBpZiAoKCh0bXAgPDwg c2hhbXQpID4+IHNoYW10KSAhPSB0bXApIHsgXAorICAgICAgICBsZWFkaW5nX3plcm9zLS07IFwK KyAgICB9IFwKKyAgICB4LngubWFudCA9IHRtcDsgXAorICAgIHgueC5leHAgPSBCSUdGTE9BVElE IyNfQklBUyArIGYjI0JJR0ZMT0FUSUQjI19NQU5UQklUUygpIC0gXAorICAgICAgICAgICAgICBs ZWFkaW5nX3plcm9zICsgc2hhbXQgLSAxOyBcCisgICAgeC54LnNpZ24gPSBuZWdhdGU7IFwKKyAg ICByZXR1cm4geC5mOyBcCit9CisKK01BS0VfQ09OVl84VV9UT19YRl9OKGRmLCBERiwgZG91Ymxl KQorTUFLRV9DT05WXzhVX1RPX1hGX04oc2YsIFNGLCBmbG9hdCkKKworZG91YmxlIGNvbnZfOHVf dG9fZGYoc2l6ZTh1X3QgaW4pCit7CisgICAgcmV0dXJuIGNvbnZfOHVfdG9fZGZfbihpbiwgMCk7 Cit9CisKK2RvdWJsZSBjb252XzhzX3RvX2RmKHNpemU4c190IGluKQoreworICAgIGlmIChpbiA9 PSAweDgwMDAwMDAwMDAwMDAwMDApIHsKKyAgICAgICAgcmV0dXJuIC0weDFwNjM7CisgICAgfQor ICAgIGlmIChpbiA8IDApIHsKKyAgICAgICAgcmV0dXJuIGNvbnZfOHVfdG9fZGZfbigtaW4sIDEp OworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBjb252Xzh1X3RvX2RmX24oaW4sIDApOwor ICAgIH0KK30KKworZG91YmxlIGNvbnZfNHVfdG9fZGYoc2l6ZTR1X3QgaW4pCit7CisgICAgcmV0 dXJuIGNvbnZfOHVfdG9fZGYoKHNpemU4dV90KSBpbik7Cit9CisKK2RvdWJsZSBjb252XzRzX3Rv X2RmKHNpemU0c190IGluKQoreworICAgIHJldHVybiBjb252XzhzX3RvX2RmKGluKTsKK30KKwor ZmxvYXQgY29udl84dV90b19zZihzaXplOHVfdCBpbikKK3sKKyAgICByZXR1cm4gY29udl84dV90 b19zZl9uKGluLCAwKTsKK30KKworZmxvYXQgY29udl84c190b19zZihzaXplOHNfdCBpbikKK3sK KyAgICBpZiAoaW4gPT0gMHg4MDAwMDAwMDAwMDAwMDAwKSB7CisgICAgICAgIHJldHVybiAtMHgx cDYzOworICAgIH0KKyAgICBpZiAoaW4gPCAwKSB7CisgICAgICAgIHJldHVybiBjb252Xzh1X3Rv X3NmX24oLWluLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gY29udl84dV90b19z Zl9uKGluLCAwKTsKKyAgICB9Cit9CisKK2Zsb2F0IGNvbnZfNHVfdG9fc2Yoc2l6ZTR1X3QgaW4p Cit7CisgICAgcmV0dXJuIGNvbnZfOHVfdG9fc2YoaW4pOworfQorCitmbG9hdCBjb252XzRzX3Rv X3NmKHNpemU0c190IGluKQoreworICAgIHJldHVybiBjb252XzhzX3RvX3NmKGluKTsKK30KKwor CitzdGF0aWMgc2l6ZTh1X3QgY29udl9kZl90b184dV9uKGRvdWJsZSBpbiwgaW50IHdpbGxfbmVn YXRlKQoreworICAgIGRmX3QgeDsKKyAgICBpbnQgZnJhY3NoaWZ0LCBlbmRzaGlmdDsKKyAgICBz aXplOHVfdCB0bXAsIHRydW5jYml0czsKKyAgICB4LmYgPSBpbjsKKyAgICBpZiAoaXNpbmYoaW4p KSB7CisgICAgICAgIGZlcmFpc2VleGNlcHQoRkVfSU5WQUxJRCk7CisgICAgICAgIGlmIChpbiA+ IDAuMCkgeworICAgICAgICAgICAgcmV0dXJuIH4wVUxMOworICAgICAgICB9IGVsc2UgeworICAg ICAgICAgICAgcmV0dXJuIDBVTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGlzbmFuKGlu KSkgeworICAgICAgICBmZXJhaXNlZXhjZXB0KEZFX0lOVkFMSUQpOworICAgICAgICByZXR1cm4g fjBVTEw7CisgICAgfQorICAgIGlmIChpc3ooaW4pKSB7CisgICAgICAgIHJldHVybiAwOworICAg IH0KKyAgICBpZiAoeC54LnNpZ24pIHsKKyAgICAgICAgZmVyYWlzZWV4Y2VwdChGRV9JTlZBTElE KTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChpbiA8IDAuNSkgeworICAgICAg ICAvKiBOZWFyIHplcm8sIGNhcHR1cmVzIGxhcmdlIGZyYWNzaGlmdHMsIGRlbm9ybXMsIGV0YyAq LworICAgICAgICBmZXJhaXNlZXhjZXB0KEZFX0lORVhBQ1QpOworICAgICAgICBzd2l0Y2ggKGZl Z2V0cm91bmQoKSkgeworICAgICAgICBjYXNlIEZFX0RPV05XQVJEOgorICAgICAgICAgICAgaWYg KHdpbGxfbmVnYXRlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9 IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAg ICBjYXNlIEZFX1VQV0FSRDoKKyAgICAgICAgICAgIGlmICghd2lsbF9uZWdhdGUpIHsKKyAgICAg ICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAg ICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAg ICByZXR1cm4gMDsgICAgLyogbmVhcmVzdCBvciB0b3dhcmRzIHplcm8gKi8KKyAgICAgICAgfQor ICAgIH0KKyAgICBpZiAoKHgueC5leHAgLSBERl9CSUFTKSA+PSA2NCkgeworICAgICAgICAvKiB3 YXkgdG9vIGJpZyAqLworICAgICAgICBmZXJhaXNlZXhjZXB0KEZFX0lOVkFMSUQpOworICAgICAg ICByZXR1cm4gfjBVTEw7CisgICAgfQorICAgIGZyYWNzaGlmdCA9IGZNQVgoMCwgKGZERl9NQU5U QklUUygpIC0gKHgueC5leHAgLSBERl9CSUFTKSkpOworICAgIGVuZHNoaWZ0ID0gZk1BWCgwLCAo KHgueC5leHAgLSBERl9CSUFTIC0gZkRGX01BTlRCSVRTKCkpKSk7CisgICAgdG1wID0geC54Lm1h bnQgfCAoMVVMTCA8PCBmREZfTUFOVEJJVFMoKSk7CisgICAgdHJ1bmNiaXRzID0gdG1wICYgKCgx VUxMIDw8IGZyYWNzaGlmdCkgLSAxKTsKKyAgICB0bXAgPj49IGZyYWNzaGlmdDsKKyAgICBpZiAo dHJ1bmNiaXRzKSB7CisgICAgICAgIC8qIEFwcGx5IFJvdW5kaW5nICovCisgICAgICAgIGZlcmFp c2VleGNlcHQoRkVfSU5FWEFDVCk7CisgICAgICAgIHN3aXRjaCAoZmVnZXRyb3VuZCgpKSB7Cisg ICAgICAgIGNhc2UgRkVfVE9XQVJEWkVSTzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBj YXNlIEZFX0RPV05XQVJEOgorICAgICAgICAgICAgaWYgKHdpbGxfbmVnYXRlKSB7CisgICAgICAg ICAgICAgICAgdG1wICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAg ICAgICAgY2FzZSBGRV9VUFdBUkQ6CisgICAgICAgICAgICBpZiAoIXdpbGxfbmVnYXRlKSB7Cisg ICAgICAgICAgICAgICAgdG1wICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVh azsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGlmICgodHJ1bmNiaXRzICYgKCgxVUxM IDw8IChmcmFjc2hpZnQgLSAxKSkgLSAxKSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8qIEV4 YWN0bHkgLjUgKi8KKyAgICAgICAgICAgICAgICB0bXAgKz0gKHRtcCAmIDEpOworICAgICAgICAg ICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0bXAgKz0gKCh0cnVuY2JpdHMgPj4gKGZyYWNz aGlmdCAtIDEpKSAmIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8q CisgICAgICogSWYgd2UgYWRkZWQgb25lIGFuZCBpdCBjYXJyaWVkIGFsbCB0aGUgd2F5IG91dCwK KyAgICAgKiBjaGVjayB0byBzZWUgaWYgb3ZlcmZsb3cKKyAgICAgKi8KKyAgICBpZiAoKHRtcCAm ICgoMVVMTCA8PCAoZkRGX01BTlRCSVRTKCkgKyAxKSkgLSAxKSkgPT0gMCkgeworICAgICAgICBp ZiAoKHgueC5leHAgLSBERl9CSUFTKSA9PSA2MykgeworICAgICAgICAgICAgZmVjbGVhcmV4Y2Vw dChGRV9JTkVYQUNUKTsKKyAgICAgICAgICAgIGZlcmFpc2VleGNlcHQoRkVfSU5WQUxJRCk7Cisg ICAgICAgICAgICByZXR1cm4gfjBVTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgdG1wIDw8PSBl bmRzaGlmdDsKKyAgICByZXR1cm4gdG1wOworfQorCitzdGF0aWMgc2l6ZTR1X3QgY29udl9kZl90 b180dV9uKGRvdWJsZSBpbiwgaW50IHdpbGxfbmVnYXRlKQoreworICAgIHNpemU4dV90IHRtcDsK KyAgICB0bXAgPSBjb252X2RmX3RvXzh1X24oaW4sIHdpbGxfbmVnYXRlKTsKKyAgICBpZiAodG1w ID4gMHgwMDAwMDAwMGZmZmZmZmZmVUxMKSB7CisgICAgICAgIGZlY2xlYXJleGNlcHQoRkVfSU5F WEFDVCk7CisgICAgICAgIGZlcmFpc2VleGNlcHQoRkVfSU5WQUxJRCk7CisgICAgICAgIHJldHVy biB+MFU7CisgICAgfQorICAgIHJldHVybiAoc2l6ZTR1X3QpdG1wOworfQorCitzaXplOHVfdCBj b252X2RmX3RvXzh1KGRvdWJsZSBpbikKK3sKKyAgICByZXR1cm4gY29udl9kZl90b184dV9uKGlu LCAwKTsKK30KKworc2l6ZTR1X3QgY29udl9kZl90b180dShkb3VibGUgaW4pCit7CisgICAgcmV0 dXJuIGNvbnZfZGZfdG9fNHVfbihpbiwgMCk7Cit9CisKK3NpemU4c190IGNvbnZfZGZfdG9fOHMo ZG91YmxlIGluKQoreworICAgIHNpemU4dV90IHRtcDsKKyAgICBkZl90IHg7CisgICAgeC5mID0g aW47CisgICAgaWYgKGlzbmFuKGluKSkgeworICAgICAgICBmZXJhaXNlZXhjZXB0KEZFX0lOVkFM SUQpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICh4Lnguc2lnbikgeworICAg ICAgICB0bXAgPSBjb252X2RmX3RvXzh1X24oLWluLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAg ICB0bXAgPSBjb252X2RmX3RvXzh1X24oaW4sIDApOworICAgIH0KKyAgICBpZiAodG1wID4gKExM X01BWF9QT1MgKyB4Lnguc2lnbikpIHsKKyAgICAgICAgZmVjbGVhcmV4Y2VwdChGRV9JTkVYQUNU KTsKKyAgICAgICAgZmVyYWlzZWV4Y2VwdChGRV9JTlZBTElEKTsKKyAgICAgICAgdG1wID0gKExM X01BWF9QT1MgKyB4Lnguc2lnbik7CisgICAgfQorICAgIGlmICh4Lnguc2lnbikgeworICAgICAg ICByZXR1cm4gLXRtcDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gdG1wOworICAgIH0K K30KKworc2l6ZTRzX3QgY29udl9kZl90b180cyhkb3VibGUgaW4pCit7CisgICAgc2l6ZTh1X3Qg dG1wOworICAgIGRmX3QgeDsKKyAgICB4LmYgPSBpbjsKKyAgICBpZiAoaXNuYW4oaW4pKSB7Cisg ICAgICAgIGZlcmFpc2VleGNlcHQoRkVfSU5WQUxJRCk7CisgICAgICAgIHJldHVybiAtMTsKKyAg ICB9CisgICAgaWYgKHgueC5zaWduKSB7CisgICAgICAgIHRtcCA9IGNvbnZfZGZfdG9fOHVfbigt aW4sIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHRtcCA9IGNvbnZfZGZfdG9fOHVfbihpbiwg MCk7CisgICAgfQorICAgIGlmICh0bXAgPiAoTUFYX1BPUyArIHgueC5zaWduKSkgeworICAgICAg ICBmZWNsZWFyZXhjZXB0KEZFX0lORVhBQ1QpOworICAgICAgICBmZXJhaXNlZXhjZXB0KEZFX0lO VkFMSUQpOworICAgICAgICB0bXAgPSAoTUFYX1BPUyArIHgueC5zaWduKTsKKyAgICB9CisgICAg aWYgKHgueC5zaWduKSB7CisgICAgICAgIHJldHVybiAtdG1wOworICAgIH0gZWxzZSB7CisgICAg ICAgIHJldHVybiB0bXA7CisgICAgfQorfQorCitzaXplOHVfdCBjb252X3NmX3RvXzh1KGZsb2F0 IGluKQoreworICAgIHJldHVybiBjb252X2RmX3RvXzh1KGluKTsKK30KKworc2l6ZTR1X3QgY29u dl9zZl90b180dShmbG9hdCBpbikKK3sKKyAgICByZXR1cm4gY29udl9kZl90b180dShpbik7Cit9 CisKK3NpemU4c190IGNvbnZfc2ZfdG9fOHMoZmxvYXQgaW4pCit7CisgICAgcmV0dXJuIGNvbnZf ZGZfdG9fOHMoaW4pOworfQorCitzaXplNHNfdCBjb252X3NmX3RvXzRzKGZsb2F0IGluKQorewor ICAgIHJldHVybiBjb252X2RmX3RvXzRzKGluKTsKK30KKwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2hl eGFnb24vZm1hX2VtdS5jIGIvdGFyZ2V0L2hleGFnb24vZm1hX2VtdS5jCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkN2I3OTgKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQv aGV4YWdvbi9mbWFfZW11LmMKQEAgLTAsMCArMSw3ODEgQEAKKy8qCisgKiAgQ29weXJpZ2h0KGMp IDIwMTktMjAyMCBRdWFsY29tbSBJbm5vdmF0aW9uIENlbnRlciwgSW5jLiBBbGwgUmlnaHRzIFJl c2VydmVkLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiBy ZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiAgdGhlIEZy ZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwg b3IKKyAqICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlz IHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1 bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGll ZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJ Q1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm b3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5 IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBw cm9ncmFtOyBpZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8K KworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJxZW11L29zZGVwLmgiCisjaW5jbHVkZSAi bWFjcm9zLmgiCisjaW5jbHVkZSAiY29udl9lbXUuaCIKKyNpbmNsdWRlICJmbWFfZW11LmgiCisK KyNkZWZpbmUgREZfSU5GX0VYUCAweDdmZgorI2RlZmluZSBERl9CSUFTIDEwMjMKKworI2RlZmlu ZSBTRl9JTkZfRVhQIDB4ZmYKKyNkZWZpbmUgU0ZfQklBUyAxMjcKKworI2RlZmluZSBIRl9JTkZf RVhQIDB4MWYKKyNkZWZpbmUgSEZfQklBUyAxNQorCisjZGVmaW5lIFdBWV9CSUdfRVhQIDQwOTYK KworI2RlZmluZSBpc3ooWCkgKGZwY2xhc3NpZnkoWCkgPT0gRlBfWkVSTykKKwordHlwZWRlZiB1 bmlvbiB7CisgICAgZG91YmxlIGY7CisgICAgc2l6ZTh1X3QgaTsKKyAgICBzdHJ1Y3QgeworICAg ICAgICBzaXplOHVfdCBtYW50OjUyOworICAgICAgICBzaXplOHVfdCBleHA6MTE7CisgICAgICAg IHNpemU4dV90IHNpZ246MTsKKyAgICB9IHg7Cit9IGRmX3Q7CisKK3R5cGVkZWYgdW5pb24gewor ICAgIGZsb2F0IGY7CisgICAgc2l6ZTR1X3QgaTsKKyAgICBzdHJ1Y3QgeworICAgICAgICBzaXpl NHVfdCBtYW50OjIzOworICAgICAgICBzaXplNHVfdCBleHA6ODsKKyAgICAgICAgc2l6ZTR1X3Qg c2lnbjoxOworICAgIH0geDsKK30gc2ZfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIHVuaW9u IHsKKyAgICAgICAgc2l6ZTh1X3QgbG93OworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAg c2l6ZTR1X3QgdzA7CisgICAgICAgICAgICBzaXplNHVfdCB3MTsKKyAgICAgICAgfTsKKyAgICB9 OworICAgIHVuaW9uIHsKKyAgICAgICAgc2l6ZTh1X3QgaGlnaDsKKyAgICAgICAgc3RydWN0IHsK KyAgICAgICAgICAgIHNpemU0dV90IHczOworICAgICAgICAgICAgc2l6ZTR1X3QgdzI7CisgICAg ICAgIH07CisgICAgfTsKK30gaW50MTI4X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBpbnQx MjhfdCBtYW50OworICAgIHNpemU0c190IGV4cDsKKyAgICBzaXplMXVfdCBzaWduOworICAgIHNp emUxdV90IGd1YXJkOworICAgIHNpemUxdV90IHJvdW5kOworICAgIHNpemUxdV90IHN0aWNreTsK K30geGZfdDsKKworc3RhdGljIGlubGluZSB2b2lkIHhmX2luaXQoeGZfdCAqcCkKK3sKKyAgICBw LT5tYW50LmxvdyA9IDA7CisgICAgcC0+bWFudC5oaWdoID0gMDsKKyAgICBwLT5leHAgPSAwOwor ICAgIHAtPnNpZ24gPSAwOworICAgIHAtPmd1YXJkID0gMDsKKyAgICBwLT5yb3VuZCA9IDA7Cisg ICAgcC0+c3RpY2t5ID0gMDsKK30KKworc3RhdGljIGlubGluZSBzaXplOHVfdCBkZl9nZXRtYW50 KGRmX3QgYSkKK3sKKyAgICBpbnQgY2xhc3MgPSBmcGNsYXNzaWZ5KGEuZik7CisgICAgc3dpdGNo IChjbGFzcykgeworICAgIGNhc2UgRlBfTk9STUFMOgorICAgIHJldHVybiBhLngubWFudCB8IDFV TEwgPDwgNTI7CisgICAgY2FzZSBGUF9aRVJPOgorICAgICAgICByZXR1cm4gMDsKKyAgICBjYXNl IEZQX1NVQk5PUk1BTDoKKyAgICAgICAgcmV0dXJuIGEueC5tYW50OworICAgIGRlZmF1bHQ6Cisg ICAgICAgIHJldHVybiAtMTsKKyAgICB9OworfQorCitzdGF0aWMgaW5saW5lIHNpemU0c190IGRm X2dldGV4cChkZl90IGEpCit7CisgICAgaW50IGNsYXNzID0gZnBjbGFzc2lmeShhLmYpOworICAg IHN3aXRjaCAoY2xhc3MpIHsKKyAgICBjYXNlIEZQX05PUk1BTDoKKyAgICAgICAgcmV0dXJuIGEu eC5leHA7CisgICAgY2FzZSBGUF9TVUJOT1JNQUw6CisgICAgICAgIHJldHVybiBhLnguZXhwICsg MTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLTE7CisgICAgfTsKK30KKworc3RhdGlj IGlubGluZSBzaXplOHVfdCBzZl9nZXRtYW50KHNmX3QgYSkKK3sKKyAgICBpbnQgY2xhc3MgPSBm cGNsYXNzaWZ5KGEuZik7CisgICAgc3dpdGNoIChjbGFzcykgeworICAgIGNhc2UgRlBfTk9STUFM OgorICAgICAgICByZXR1cm4gYS54Lm1hbnQgfCAxVUxMIDw8IDIzOworICAgIGNhc2UgRlBfWkVS TzoKKyAgICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBGUF9TVUJOT1JNQUw6CisgICAgICAgIHJl dHVybiBhLngubWFudCB8IDBVTEw7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIC0xOwor ICAgIH07Cit9CisKK3N0YXRpYyBpbmxpbmUgc2l6ZTRzX3Qgc2ZfZ2V0ZXhwKHNmX3QgYSkKK3sK KyAgICBpbnQgY2xhc3MgPSBmcGNsYXNzaWZ5KGEuZik7CisgICAgc3dpdGNoIChjbGFzcykgewor ICAgIGNhc2UgRlBfTk9STUFMOgorICAgICAgICByZXR1cm4gYS54LmV4cDsKKyAgICBjYXNlIEZQ X1NVQk5PUk1BTDoKKyAgICAgICAgcmV0dXJuIGEueC5leHAgKyAxOworICAgIGRlZmF1bHQ6Cisg ICAgICAgIHJldHVybiAtMTsKKyAgICB9OworfQorCitzdGF0aWMgaW5saW5lIGludDEyOF90IGlu dDEyOF9tdWxfNjQ2NChzaXplOHVfdCBhaSwgc2l6ZTh1X3QgYmkpCit7CisgICAgaW50MTI4X3Qg cmV0OworICAgIGludDEyOF90IGEsIGI7CisgICAgc2l6ZTh1X3QgcHAwLCBwcDFhLCBwcDFiLCBw cDFzLCBwcDI7CisKKyAgICBhLmhpZ2ggPSBiLmhpZ2ggPSAwOworICAgIGEubG93ID0gYWk7Cisg ICAgYi5sb3cgPSBiaTsKKyAgICBwcDAgPSAoc2l6ZTh1X3QpYS53MCAqIChzaXplOHVfdCliLncw OworICAgIHBwMWEgPSAoc2l6ZTh1X3QpYS53MSAqIChzaXplOHVfdCliLncwOworICAgIHBwMWIg PSAoc2l6ZTh1X3QpYi53MSAqIChzaXplOHVfdClhLncwOworICAgIHBwMiA9IChzaXplOHVfdClh LncxICogKHNpemU4dV90KWIudzE7CisKKyAgICBwcDFzID0gcHAxYSArIHBwMWI7CisgICAgaWYg KChwcDFzIDwgcHAxYSkgfHwgKHBwMXMgPCBwcDFiKSkgeworICAgICAgICBwcDIgKz0gKDFVTEwg PDwgMzIpOworICAgIH0KKyAgICByZXQubG93ID0gcHAwICsgKHBwMXMgPDwgMzIpOworICAgIGlm ICgocmV0LmxvdyA8IHBwMCkgfHwgKHJldC5sb3cgPCAocHAxcyA8PCAzMikpKSB7CisgICAgICAg IHBwMiArPSAxOworICAgIH0KKyAgICByZXQuaGlnaCA9IHBwMiArIChwcDFzID4+IDMyKTsKKwor ICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MTI4X3QgaW50MTI4X3NobChp bnQxMjhfdCBhLCBzaXplNHVfdCBhbXQpCit7CisgICAgaW50MTI4X3QgcmV0OworICAgIGlmIChh bXQgPT0gMCkgeworICAgICAgICByZXR1cm4gYTsKKyAgICB9CisgICAgaWYgKGFtdCA+IDEyOCkg eworICAgICAgICByZXQuaGlnaCA9IDA7CisgICAgICAgIHJldC5sb3cgPSAwOworICAgICAgICBy ZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAoYW10ID49IDY0KSB7CisgICAgICAgIGFtdCAtPSA2 NDsKKyAgICAgICAgYS5oaWdoID0gYS5sb3c7CisgICAgICAgIGEubG93ID0gMDsKKyAgICB9Cisg ICAgcmV0LmhpZ2ggPSBhLmhpZ2ggPDwgYW10OworICAgIHJldC5oaWdoIHw9IChhLmxvdyA+PiAo NjQgLSBhbXQpKTsKKyAgICByZXQubG93ID0gYS5sb3cgPDwgYW10OworICAgIHJldHVybiByZXQ7 Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50MTI4X3QgaW50MTI4X3NocihpbnQxMjhfdCBhLCBzaXpl NHVfdCBhbXQpCit7CisgICAgaW50MTI4X3QgcmV0OworICAgIGlmIChhbXQgPT0gMCkgeworICAg ICAgICByZXR1cm4gYTsKKyAgICB9CisgICAgaWYgKGFtdCA+IDEyOCkgeworICAgICAgICByZXQu aGlnaCA9IDA7CisgICAgICAgIHJldC5sb3cgPSAwOworICAgICAgICByZXR1cm4gcmV0OworICAg IH0KKyAgICBpZiAoYW10ID49IDY0KSB7CisgICAgICAgIGFtdCAtPSA2NDsKKyAgICAgICAgYS5s b3cgPSBhLmhpZ2g7CisgICAgICAgIGEuaGlnaCA9IDA7CisgICAgfQorICAgIHJldC5sb3cgPSBh LmxvdyA+PiBhbXQ7CisgICAgcmV0LmxvdyB8PSAoYS5oaWdoIDw8ICg2NCAtIGFtdCkpOworICAg IHJldC5oaWdoID0gYS5oaWdoID4+IGFtdDsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMg aW5saW5lIGludDEyOF90IGludDEyOF9hZGQoaW50MTI4X3QgYSwgaW50MTI4X3QgYikKK3sKKyAg ICBpbnQxMjhfdCByZXQ7CisgICAgcmV0LmxvdyA9IGEubG93ICsgYi5sb3c7CisgICAgaWYgKChy ZXQubG93IDwgYS5sb3cpIHx8IChyZXQubG93IDwgYi5sb3cpKSB7CisgICAgICAgIC8qIGNhcnJ5 IGludG8gaGlnaCBwYXJ0ICovCisgICAgICAgIGEuaGlnaCArPSAxOworICAgIH0KKyAgICByZXQu aGlnaCA9IGEuaGlnaCArIGIuaGlnaDsKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW5s aW5lIGludDEyOF90IGludDEyOF9zdWIoaW50MTI4X3QgYSwgaW50MTI4X3QgYiwgaW50IGJvcnJv dykKK3sKKyAgICBpbnQxMjhfdCByZXQ7CisgICAgcmV0LmxvdyA9IGEubG93IC0gYi5sb3c7Cisg ICAgaWYgKHJldC5sb3cgPiBhLmxvdykgeworICAgICAgICAvKiBib3Jyb3cgaW50byBoaWdoIHBh cnQgKi8KKyAgICAgICAgYS5oaWdoIC09IDE7CisgICAgfQorICAgIHJldC5oaWdoID0gYS5oaWdo IC0gYi5oaWdoOworICAgIGlmIChib3Jyb3cgPT0gMCkgeworICAgICAgICByZXR1cm4gcmV0Owor ICAgIH0gZWxzZSB7CisgICAgICAgIGEuaGlnaCA9IDA7CisgICAgICAgIGEubG93ID0gMTsKKyAg ICAgICAgcmV0dXJuIGludDEyOF9zdWIocmV0LCBhLCAwKTsKKyAgICB9Cit9CisKK3N0YXRpYyBp bmxpbmUgaW50IGludDEyOF9ndChpbnQxMjhfdCBhLCBpbnQxMjhfdCBiKQoreworICAgIGlmIChh LmhpZ2ggPT0gYi5oaWdoKSB7CisgICAgICAgIHJldHVybiBhLmxvdyA+IGIubG93OworICAgIH0K KyAgICByZXR1cm4gYS5oaWdoID4gYi5oaWdoOworfQorCitzdGF0aWMgaW5saW5lIHhmX3QgeGZf bm9ybV9sZWZ0KHhmX3QgYSkKK3sKKyAgICBhLmV4cC0tOworICAgIGEubWFudCA9IGludDEyOF9z aGwoYS5tYW50LCAxKTsKKyAgICBhLm1hbnQubG93IHw9IGEuZ3VhcmQ7CisgICAgYS5ndWFyZCA9 IGEucm91bmQ7CisgICAgYS5yb3VuZCA9IGEuc3RpY2t5OworICAgIHJldHVybiBhOworfQorCitz dGF0aWMgaW5saW5lIHhmX3QgeGZfbm9ybV9yaWdodCh4Zl90IGEsIGludCBhbXQpCit7CisgICAg aWYgKGFtdCA+IDEzMCkgeworICAgICAgICBhLnN0aWNreSB8PQorICAgICAgICAgICAgYS5yb3Vu ZCB8IGEuZ3VhcmQgfCAoYS5tYW50LmxvdyAhPSAwKSB8IChhLm1hbnQuaGlnaCAhPSAwKTsKKyAg ICAgICAgYS5ndWFyZCA9IGEucm91bmQgPSBhLm1hbnQuaGlnaCA9IGEubWFudC5sb3cgPSAwOwor ICAgICAgICBhLmV4cCArPSBhbXQ7CisgICAgICAgIHJldHVybiBhOworCisgICAgfQorICAgIHdo aWxlIChhbXQgPj0gNjQpIHsKKyAgICAgICAgYS5zdGlja3kgfD0gYS5yb3VuZCB8IGEuZ3VhcmQg fCAoYS5tYW50LmxvdyAhPSAwKTsKKyAgICAgICAgYS5ndWFyZCA9IChhLm1hbnQubG93ID4+IDYz KSAmIDE7CisgICAgICAgIGEucm91bmQgPSAoYS5tYW50LmxvdyA+PiA2MikgJiAxOworICAgICAg ICBhLm1hbnQubG93ID0gYS5tYW50LmhpZ2g7CisgICAgICAgIGEubWFudC5oaWdoID0gMDsKKyAg ICAgICAgYS5leHAgKz0gNjQ7CisgICAgICAgIGFtdCAtPSA2NDsKKyAgICB9CisgICAgd2hpbGUg KGFtdCA+IDApIHsKKyAgICAgICAgYS5leHArKzsKKyAgICAgICAgYS5zdGlja3kgfD0gYS5yb3Vu ZDsKKyAgICAgICAgYS5yb3VuZCA9IGEuZ3VhcmQ7CisgICAgICAgIGEuZ3VhcmQgPSBhLm1hbnQu bG93ICYgMTsKKyAgICAgICAgYS5tYW50ID0gaW50MTI4X3NocihhLm1hbnQsIDEpOworICAgICAg ICBhbXQtLTsKKyAgICB9CisgICAgcmV0dXJuIGE7Cit9CisKKworLyoKKyAqIE9uIHRoZSBhZGQv c3ViLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gc2hpZnQgb3V0IGxvdHMgb2YgYml0cywgYnV0IG5l ZWQgYQorICogc3RpY2t5IGJpdCBmb3Igd2hhdCB3YXMgc2hpZnRlZCBvdXQsIEkgdGhpbmsuCisg Ki8KK3N0YXRpYyB4Zl90IHhmX2FkZCh4Zl90IGEsIHhmX3QgYik7CisKK3N0YXRpYyBpbmxpbmUg eGZfdCB4Zl9zdWIoeGZfdCBhLCB4Zl90IGIsIGludCBuZWdhdGUpCit7CisgICAgeGZfdCByZXQ7 CisgICAgeGZfaW5pdCgmcmV0KTsKKyAgICBpbnQgYm9ycm93OworCisgICAgaWYgKGEuc2lnbiAh PSBiLnNpZ24pIHsKKyAgICAgICAgYi5zaWduID0gIWIuc2lnbjsKKyAgICAgICAgcmV0dXJuIHhm X2FkZChhLCBiKTsKKyAgICB9CisgICAgaWYgKGIuZXhwID4gYS5leHApIHsKKyAgICAgICAgLyog c21hbGwgLSBiaWcgPT0gLSAoYmlnIC0gc21hbGwpICovCisgICAgICAgIHJldHVybiB4Zl9zdWIo YiwgYSwgIW5lZ2F0ZSk7CisgICAgfQorICAgIGlmICgoYi5leHAgPT0gYS5leHApICYmIChpbnQx MjhfZ3QoYi5tYW50LCBhLm1hbnQpKSkgeworICAgICAgICAvKiBzbWFsbCAtIGJpZyA9PSAtIChi aWcgLSBzbWFsbCkgKi8KKyAgICAgICAgcmV0dXJuIHhmX3N1YihiLCBhLCAhbmVnYXRlKTsKKyAg ICB9CisKKyAgICB3aGlsZSAoYS5leHAgPiBiLmV4cCkgeworICAgICAgICAvKiBUcnkgdG8gbm9y bWFsaXplIGV4cG9uZW50czogc2hyaW5rIGEgZXhwb25lbnQgYW5kIGdyb3cgbWFudGlzc2EgKi8K KyAgICAgICAgaWYgKGEubWFudC5oaWdoICYgKDFVTEwgPDwgNjIpKSB7CisgICAgICAgICAgICAv KiBDYW4ndCBncm93IGEgYW55IG1vcmUgKi8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9 IGVsc2UgeworICAgICAgICAgICAgYSA9IHhmX25vcm1fbGVmdChhKTsKKyAgICAgICAgfQorICAg IH0KKworICAgIHdoaWxlIChhLmV4cCA+IGIuZXhwKSB7CisgICAgICAgIC8qIFRyeSB0byBub3Jt YWxpemUgZXhwb25lbnRzOiBncm93IGIgZXhwb25lbnQgYW5kIHNocmluayBtYW50aXNzYSAqLwor ICAgICAgICAvKiBLZWVwIGFyb3VuZCBzaGlmdGVkIG91dCBiaXRzLi4uIHdlIG1pZ2h0IG5lZWQg dGhvc2UgbGF0ZXIgKi8KKyAgICAgICAgYiA9IHhmX25vcm1fcmlnaHQoYiwgYS5leHAgLSBiLmV4 cCk7CisgICAgfQorCisgICAgaWYgKChpbnQxMjhfZ3QoYi5tYW50LCBhLm1hbnQpKSkgeworICAg ICAgICByZXR1cm4geGZfc3ViKGIsIGEsICFuZWdhdGUpOworICAgIH0KKworICAgIC8qIE9LLCBu b3cgdGhpbmdzIHNob3VsZCBiZSBub3JtYWxpemVkISAqLworICAgIHJldC5zaWduID0gYS5zaWdu OworICAgIHJldC5leHAgPSBhLmV4cDsKKyAgICBhc3NlcnQoIWludDEyOF9ndChiLm1hbnQsIGEu bWFudCkpOworICAgIGJvcnJvdyA9IChiLnJvdW5kIDw8IDIpIHwgKGIuZ3VhcmQgPDwgMSkgfCBi LnN0aWNreTsKKyAgICByZXQubWFudCA9IGludDEyOF9zdWIoYS5tYW50LCBiLm1hbnQsIChib3Jy b3cgIT0gMCkpOworICAgIGJvcnJvdyA9IDAgLSBib3Jyb3c7CisgICAgcmV0Lmd1YXJkID0gKGJv cnJvdyA+PiAyKSAmIDE7CisgICAgcmV0LnJvdW5kID0gKGJvcnJvdyA+PiAxKSAmIDE7CisgICAg cmV0LnN0aWNreSA9IChib3Jyb3cgPj4gMCkgJiAxOworICAgIGlmIChuZWdhdGUpIHsKKyAgICAg ICAgcmV0LnNpZ24gPSAhcmV0LnNpZ247CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0 YXRpYyB4Zl90IHhmX2FkZCh4Zl90IGEsIHhmX3QgYikKK3sKKyAgICB4Zl90IHJldDsKKyAgICB4 Zl9pbml0KCZyZXQpOworICAgIGlmIChhLnNpZ24gIT0gYi5zaWduKSB7CisgICAgICAgIGIuc2ln biA9ICFiLnNpZ247CisgICAgICAgIHJldHVybiB4Zl9zdWIoYSwgYiwgMCk7CisgICAgfQorICAg IGlmIChiLmV4cCA+IGEuZXhwKSB7CisgICAgICAgIC8qIHNtYWxsICsgYmlnID09ICAoYmlnICsg c21hbGwpICovCisgICAgICAgIHJldHVybiB4Zl9hZGQoYiwgYSk7CisgICAgfQorICAgIGlmICgo Yi5leHAgPT0gYS5leHApICYmIGludDEyOF9ndChiLm1hbnQsIGEubWFudCkpIHsKKyAgICAgICAg Lyogc21hbGwgKyBiaWcgPT0gIChiaWcgKyBzbWFsbCkgKi8KKyAgICAgICAgcmV0dXJuIHhmX2Fk ZChiLCBhKTsKKyAgICB9CisKKyAgICB3aGlsZSAoYS5leHAgPiBiLmV4cCkgeworICAgICAgICAv KiBUcnkgdG8gbm9ybWFsaXplIGV4cG9uZW50czogc2hyaW5rIGEgZXhwb25lbnQgYW5kIGdyb3cg bWFudGlzc2EgKi8KKyAgICAgICAgaWYgKGEubWFudC5oaWdoICYgKDFVTEwgPDwgNjIpKSB7Cisg ICAgICAgICAgICAvKiBDYW4ndCBncm93IGEgYW55IG1vcmUgKi8KKyAgICAgICAgICAgIGJyZWFr OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYSA9IHhmX25vcm1fbGVmdChhKTsKKyAg ICAgICAgfQorICAgIH0KKworICAgIHdoaWxlIChhLmV4cCA+IGIuZXhwKSB7CisgICAgICAgIC8q IFRyeSB0byBub3JtYWxpemUgZXhwb25lbnRzOiBncm93IGIgZXhwb25lbnQgYW5kIHNocmluayBt YW50aXNzYSAqLworICAgICAgICAvKiBLZWVwIGFyb3VuZCBzaGlmdGVkIG91dCBiaXRzLi4uIHdl IG1pZ2h0IG5lZWQgdGhvc2UgbGF0ZXIgKi8KKyAgICAgICAgYiA9IHhmX25vcm1fcmlnaHQoYiwg YS5leHAgLSBiLmV4cCk7CisgICAgfQorCisgICAgLyogT0ssIG5vdyB0aGluZ3Mgc2hvdWxkIGJl IG5vcm1hbGl6ZWQhICovCisgICAgaWYgKGludDEyOF9ndChiLm1hbnQsIGEubWFudCkpIHsKKyAg ICAgICAgcmV0dXJuIHhmX2FkZChiLCBhKTsKKyAgICB9OworICAgIHJldC5zaWduID0gYS5zaWdu OworICAgIHJldC5leHAgPSBhLmV4cDsKKyAgICBhc3NlcnQoIWludDEyOF9ndChiLm1hbnQsIGEu bWFudCkpOworICAgIHJldC5tYW50ID0gaW50MTI4X2FkZChhLm1hbnQsIGIubWFudCk7CisgICAg cmV0Lmd1YXJkID0gYi5ndWFyZDsKKyAgICByZXQucm91bmQgPSBiLnJvdW5kOworICAgIHJldC5z dGlja3kgPSBiLnN0aWNreTsKKyAgICByZXR1cm4gcmV0OworfQorCisvKiBSZXR1cm4gYW4gaW5m aW5pdHkgd2l0aCB0aGUgc2FtZSBzaWduIGFzIGEgKi8KK3N0YXRpYyBpbmxpbmUgZGZfdCBpbmZp bml0ZV9kZl90KHhmX3QgYSkKK3sKKyAgICBkZl90IHJldDsKKyAgICByZXQueC5zaWduID0gYS5z aWduOworICAgIHJldC54LmV4cCA9IERGX0lORl9FWFA7CisgICAgcmV0LngubWFudCA9IDBVTEw7 CisgICAgcmV0dXJuIHJldDsKK30KKworLyogUmV0dXJuIGEgbWF4aW11bSBmaW5pdGUgdmFsdWUg d2l0aCB0aGUgc2FtZSBzaWduIGFzIGEgKi8KK3N0YXRpYyBpbmxpbmUgZGZfdCBtYXhmaW5pdGVf ZGZfdCh4Zl90IGEpCit7CisgICAgZGZfdCByZXQ7CisgICAgcmV0Lnguc2lnbiA9IGEuc2lnbjsK KyAgICByZXQueC5leHAgPSBERl9JTkZfRVhQIC0gMTsKKyAgICByZXQueC5tYW50ID0gMHgwMDBm ZmZmZmZmZmZmZmZmVUxMOworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgZGZf dCBmMmRmX3QoZG91YmxlIGluKQoreworICAgIGRmX3QgcmV0OworICAgIHJldC5mID0gaW47Cisg ICAgcmV0dXJuIHJldDsKK30KKworLyogUmV0dXJuIGFuIGluZmluaXR5IHdpdGggdGhlIHNhbWUg c2lnbiBhcyBhICovCitzdGF0aWMgaW5saW5lIHNmX3QgaW5maW5pdGVfc2ZfdCh4Zl90IGEpCit7 CisgICAgc2ZfdCByZXQ7CisgICAgcmV0Lnguc2lnbiA9IGEuc2lnbjsKKyAgICByZXQueC5leHAg PSBTRl9JTkZfRVhQOworICAgIHJldC54Lm1hbnQgPSAwVUxMOworICAgIHJldHVybiByZXQ7Cit9 CisKKy8qIFJldHVybiBhIG1heGltdW0gZmluaXRlIHZhbHVlIHdpdGggdGhlIHNhbWUgc2lnbiBh cyBhICovCitzdGF0aWMgaW5saW5lIHNmX3QgbWF4ZmluaXRlX3NmX3QoeGZfdCBhKQoreworICAg IHNmX3QgcmV0OworICAgIHJldC54LnNpZ24gPSBhLnNpZ247CisgICAgcmV0LnguZXhwID0gU0Zf SU5GX0VYUCAtIDE7CisgICAgcmV0LngubWFudCA9IDB4MDA3ZmZmZmZVTDsKKyAgICByZXR1cm4g cmV0OworfQorCitzdGF0aWMgaW5saW5lIHNmX3QgZjJzZl90KGZsb2F0IGluKQoreworICAgIHNm X3QgcmV0OworICAgIHJldC5mID0gaW47CisgICAgcmV0dXJuIHJldDsKK30KKworI2RlZmluZSBH RU5fWEZfUk9VTkQoVFlQRSwgTUFOVEJJVFMsIElORl9FWFApIFwKK3N0YXRpYyBpbmxpbmUgVFlQ RSB4Zl9yb3VuZF8jI1RZUEUoeGZfdCBhKSBcCit7IFwKKyAgICBUWVBFIHJldDsgXAorICAgIHJl dC5pID0gMDsgXAorICAgIHJldC54LnNpZ24gPSBhLnNpZ247IFwKKyAgICBpZiAoKGEubWFudC5o aWdoID09IDApICYmIChhLm1hbnQubG93ID09IDApIFwKKyAgICAgICAgJiYgKChhLmd1YXJkIHwg YS5yb3VuZCB8IGEuc3RpY2t5KSA9PSAwKSkgeyBcCisgICAgICAgIC8qIHJlc3VsdCB6ZXJvICov IFwKKyAgICAgICAgc3dpdGNoIChmZWdldHJvdW5kKCkpIHsgXAorICAgICAgICBjYXNlIEZFX0RP V05XQVJEOiBcCisgICAgICAgICAgICByZXR1cm4gZjIjI1RZUEUoLTAuMCk7IFwKKyAgICAgICAg ZGVmYXVsdDogXAorICAgICAgICAgICAgcmV0dXJuIGYyIyNUWVBFKDAuMCk7IFwKKyAgICAgICAg fSBcCisgICAgfSBcCisgICAgLyogTm9ybWFsaXplIHJpZ2h0ICovIFwKKyAgICAvKiBXZSB3YW50 IE1BTlRCSVRTIGJpdHMgb2YgbWFudGlzc2EgcGx1cyB0aGUgbGVhZGluZyBvbmUuICovIFwKKyAg ICAvKiBUaGF0IG1lYW5zIHRoYXQgd2Ugd2FudCBNQU5UQklUUysxIGJpdHMsIG9yIDB4MDAwMDAw MDAwMDAwRkZfRkZGRiAqLyBcCisgICAgLyogU28gd2UgbmVlZCB0byBub3JtYWxpemUgcmlnaHQg d2hpbGUgdGhlIGhpZ2ggd29yZCBpcyBub24temVybyBhbmQgXAorICAgICogd2hpbGUgdGhlIGxv dyB3b3JkIGlzIG5vbnplcm8gd2hlbiBtYXNrZWQgd2l0aCAweGZmZTBfMDAwMF8wMDAwXzAwMDAg Ki8gXAorICAgIHdoaWxlICgoYS5tYW50LmhpZ2ggIT0gMCkgfHwgKChhLm1hbnQubG93ID4+IChN QU5UQklUUyArIDEpKSAhPSAwKSkgeyBcCisgICAgICAgIGEgPSB4Zl9ub3JtX3JpZ2h0KGEsIDEp OyBcCisgICAgfSBcCisgICAgLyogXAorICAgICAqIE9LLCBub3cgbm9ybWFsaXplIGxlZnQgXAor ICAgICAqIFdlIHdhbnQgdG8gbm9ybWFsaXplIGxlZnQgdW50aWwgd2UgaGF2ZSBhIGxlYWRpbmcg b25lIGluIGJpdCAyNCBcCisgICAgICogVGhlb3JldGljYWxseSwgd2Ugb25seSBuZWVkIHRvIHNo aWZ0IGEgbWF4aW11bSBvZiBvbmUgdG8gdGhlIGxlZnQgaWYgd2UgXAorICAgICAqIHNoaWZ0ZWQg b3V0IGxvdHMgb2YgYml0cyBmcm9tIEIsIG9yIGlmIHdlIGhhZCBubyBzaGlmdCAvIDEgc2hpZnQg c3RpY2t5IFwKKyAgICAgKiBzaG91ZGwgYmUgMCAgXAorICAgICAqLyBcCisgICAgd2hpbGUgKChh Lm1hbnQubG93ICYgKDFVTEwgPDwgTUFOVEJJVFMpKSA9PSAwKSB7IFwKKyAgICAgICAgYSA9IHhm X25vcm1fbGVmdChhKTsgXAorICAgIH0gXAorICAgIC8qIFwKKyAgICAgKiBPSywgbm93IHdlIG1p Z2h0IG5lZWQgdG8gZGVub3JtYWxpemUgYmVjYXVzZSBvZiBwb3RlbnRpYWwgdW5kZXJmbG93LiBc CisgICAgICogV2UgbmVlZCB0byBkbyB0aGlzIGJlZm9yZSByb3VuZGluZywgYW5kIHJvdW5kaW5n IG1pZ2h0IG1ha2UgdXMgbm9ybWFsIFwKKyAgICAgKiBhZ2FpbiBcCisgICAgICovIFwKKyAgICB3 aGlsZSAoYS5leHAgPD0gMCkgeyBcCisgICAgICAgIGEgPSB4Zl9ub3JtX3JpZ2h0KGEsIDEgLSBh LmV4cCk7IFwKKyAgICAgICAgLyogXAorICAgICAgICAgKiBEbyB3ZSBoYXZlIHVuZGVyZmxvdz8g XAorICAgICAgICAgKiBUaGF0J3Mgd2hlbiB3ZSBnZXQgYW4gaW5leGFjdCBhbnN3ZXIgYmVjYXVz ZSB3ZSByYW4gb3V0IG9mIGJpdHMgXAorICAgICAgICAgKiBpbiBhIGRlbm9ybWFsLiBcCisgICAg ICAgICAqLyBcCisgICAgICAgIGlmIChhLmd1YXJkIHx8IGEucm91bmQgfHwgYS5zdGlja3kpIHsg XAorICAgICAgICAgICAgZmVyYWlzZWV4Y2VwdChGRV9VTkRFUkZMT1cpOyBcCisgICAgICAgIH0g XAorICAgIH0gXAorICAgIC8qIE9LLCB3ZSdyZSByZWxhdGl2ZWx5IGNhbm9uaWNhbC4uLiBub3cg d2UgbmVlZCB0byByb3VuZCAqLyBcCisgICAgaWYgKGEuZ3VhcmQgfHwgYS5yb3VuZCB8fCBhLnN0 aWNreSkgeyBcCisgICAgICAgIGZlcmFpc2VleGNlcHQoRkVfSU5FWEFDVCk7IFwKKyAgICAgICAg c3dpdGNoIChmZWdldHJvdW5kKCkpIHsgXAorICAgICAgICBjYXNlIEZFX1RPV0FSRFpFUk86IFwK KyAgICAgICAgICAgIC8qIENob3AgYW5kIHdlJ3JlIGRvbmUgKi8gXAorICAgICAgICAgICAgYnJl YWs7IFwKKyAgICAgICAgY2FzZSBGRV9VUFdBUkQ6IFwKKyAgICAgICAgICAgIGlmIChhLnNpZ24g PT0gMCkgeyBcCisgICAgICAgICAgICAgICAgYS5tYW50LmxvdyArPSAxOyBcCisgICAgICAgICAg ICB9IFwKKyAgICAgICAgICAgIGJyZWFrOyBcCisgICAgICAgIGNhc2UgRkVfRE9XTldBUkQ6IFwK KyAgICAgICAgICAgIGlmIChhLnNpZ24gIT0gMCkgeyBcCisgICAgICAgICAgICAgICAgYS5tYW50 LmxvdyArPSAxOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgICAgIGJyZWFrOyBcCisgICAg ICAgIGRlZmF1bHQ6IFwKKyAgICAgICAgICAgIGlmIChhLnJvdW5kIHx8IGEuc3RpY2t5KSB7IFwK KyAgICAgICAgICAgICAgICAvKiByb3VuZCB1cCBpZiBndWFyZCBpcyAxLCBkb3duIGlmIGd1YXJk IGlzIHplcm8gKi8gXAorICAgICAgICAgICAgICAgIGEubWFudC5sb3cgKz0gYS5ndWFyZDsgXAor ICAgICAgICAgICAgfSBlbHNlIGlmIChhLmd1YXJkKSB7IFwKKyAgICAgICAgICAgICAgICAvKiBl eGFjdGx5IC41LCByb3VuZCB1cCBpZiBvZGQgKi8gXAorICAgICAgICAgICAgICAgIGEubWFudC5s b3cgKz0gKGEubWFudC5sb3cgJiAxKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgICAgICBi cmVhazsgXAorICAgICAgICB9IFwKKyAgICB9IFwKKyAgICAvKiBcCisgICAgICogT0ssIG5vdyB3 ZSBtaWdodCBoYXZlIGNhcnJpZWQgYWxsIHRoZSB3YXkgdXAuIFwKKyAgICAgKiBTbyB3ZSBtaWdo dCBuZWVkIHRvIHNociBvbmNlIFwKKyAgICAgKiBhdCBsZWFzdCB3ZSBrbm93IHRoYXQgdGhlIGxz YiBzaG91bGQgYmUgemVybyBpZiB3ZSByb3VuZGVkIGFuZCBcCisgICAgICogZ290IGEgY2Fycnkg b3V0Li4uIFwKKyAgICAgKi8gXAorICAgIGlmICgoYS5tYW50LmxvdyA+PiAoTUFOVEJJVFMgKyAx KSkgIT0gMCkgeyBcCisgICAgICAgIGEgPSB4Zl9ub3JtX3JpZ2h0KGEsIDEpOyBcCisgICAgfSBc CisgICAgLyogT3ZlcmZsb3c/ICovIFwKKyAgICBpZiAoYS5leHAgPj0gSU5GX0VYUCkgeyBcCisg ICAgICAgIC8qIFllcCwgaW5mIHJlc3VsdCAqLyBcCisgICAgICAgIGZlcmFpc2VleGNlcHQoRkVf T1ZFUkZMT1cpOyBcCisgICAgICAgIGZlcmFpc2VleGNlcHQoRkVfSU5FWEFDVCk7IFwKKyAgICAg ICAgc3dpdGNoIChmZWdldHJvdW5kKCkpIHsgXAorICAgICAgICBjYXNlIEZFX1RPV0FSRFpFUk86 IFwKKyAgICAgICAgICAgIHJldHVybiBtYXhmaW5pdGVfIyNUWVBFKGEpOyBcCisgICAgICAgIGNh c2UgRkVfVVBXQVJEOiBcCisgICAgICAgICAgICBpZiAoYS5zaWduID09IDApIHsgXAorICAgICAg ICAgICAgICAgIHJldHVybiBpbmZpbml0ZV8jI1RZUEUoYSk7IFwKKyAgICAgICAgICAgIH0gZWxz ZSB7IFwKKyAgICAgICAgICAgICAgICByZXR1cm4gbWF4ZmluaXRlXyMjVFlQRShhKTsgXAorICAg ICAgICAgICAgfSBcCisgICAgICAgIGNhc2UgRkVfRE9XTldBUkQ6IFwKKyAgICAgICAgICAgIGlm IChhLnNpZ24gIT0gMCkgeyBcCisgICAgICAgICAgICAgICAgcmV0dXJuIGluZmluaXRlXyMjVFlQ RShhKTsgXAorICAgICAgICAgICAgfSBlbHNlIHsgXAorICAgICAgICAgICAgICAgIHJldHVybiBt YXhmaW5pdGVfIyNUWVBFKGEpOyBcCisgICAgICAgICAgICB9IFwKKyAgICAgICAgZGVmYXVsdDog XAorICAgICAgICAgICAgcmV0dXJuIGluZmluaXRlXyMjVFlQRShhKTsgXAorICAgICAgICB9IFwK KyAgICB9IFwKKyAgICAvKiBVbmRlcmZsb3c/ICovIFwKKyAgICBpZiAoYS5tYW50LmxvdyAmICgx VUxMIDw8IE1BTlRCSVRTKSkgeyBcCisgICAgICAgIC8qIExlYWRpbmcgb25lIG1lYW5zOiBObywg d2UncmUgbm9ybWFsLiBTbywgd2Ugc2hvdWxkIGJlIGRvbmUuLi4gKi8gXAorICAgICAgICByZXQu eC5leHAgPSBhLmV4cDsgXAorICAgICAgICByZXQueC5tYW50ID0gYS5tYW50LmxvdzsgXAorICAg ICAgICByZXR1cm4gcmV0OyBcCisgICAgfSBcCisgICAgaWYgKGEuZXhwICE9IDEpIHsgXAorICAg ICAgICBwcmludGYoImEuZXhwID09ICVkXG4iLCBhLmV4cCk7IFwKKyAgICB9IFwKKyAgICBhc3Nl cnQoYS5leHAgPT0gMSk7IFwKKyAgICByZXQueC5leHAgPSAwOyBcCisgICAgcmV0LngubWFudCA9 IGEubWFudC5sb3c7IFwKKyAgICByZXR1cm4gcmV0OyBcCit9CisKK0dFTl9YRl9ST1VORChkZl90 LCBmREZfTUFOVEJJVFMoKSwgREZfSU5GX0VYUCkKK0dFTl9YRl9ST1VORChzZl90LCBmU0ZfTUFO VEJJVFMoKSwgU0ZfSU5GX0VYUCkKKworc3RhdGljIGlubGluZSBkb3VibGUgc3BlY2lhbF9mbWEo ZGZfdCBhLCBkZl90IGIsIGRmX3QgYykKK3sKKyAgICBkZl90IHJldDsKKyAgICByZXQuaSA9IDA7 CisKKyAgICAvKgorICAgICAqIElmIEEgbXVsdGlwbGllZCBieSBCIGlzIGFuIGV4YWN0IGluZmlu aXR5IGFuZCBDIGlzIGFsc28gYW4gaW5maW5pdHkKKyAgICAgKiBidXQgd2l0aCB0aGUgb3Bwb3Np dGUgc2lnbiwgRk1BIHJldHVybnMgTmFOIGFuZCByYWlzZXMgaW52YWxpZC4KKyAgICAgKi8KKyAg ICBpZiAoZklTSU5GUFJPRChhLmYsIGIuZikgJiYgaXNpbmYoYy5mKSkgeworICAgICAgICBpZiAo KGEueC5zaWduIF4gYi54LnNpZ24pICE9IGMueC5zaWduKSB7CisgICAgICAgICAgICByZXQuaSA9 IGZERk5BTlZBTCgpOworICAgICAgICAgICAgZmVyYWlzZWV4Y2VwdChGRV9JTlZBTElEKTsKKyAg ICAgICAgICAgIHJldHVybiByZXQuZjsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKGlzaW5m KGEuZikgJiYgaXN6KGIuZikpIHx8IChpc3ooYS5mKSAmJiBpc2luZihiLmYpKSkgeworICAgICAg ICByZXQuaSA9IGZERk5BTlZBTCgpOworICAgICAgICBmZXJhaXNlZXhjZXB0KEZFX0lOVkFMSUQp OworICAgICAgICByZXR1cm4gcmV0LmY7CisgICAgfQorICAgIC8qCisgICAgICogSWYgbm9uZSBv ZiB0aGUgYWJvdmUgY2hlY2tzIGFyZSB0cnVlIGFuZCBDIGlzIGEgTmFOLAorICAgICAqIGEgTmFO IHNoYWxsIGJlIHJldHVybmVkCisgICAgICogSWYgQSBvciBCIGFyZSBOYU4sIGEgTkFOIHNoYWxs IGJlIHJldHVybmVkLgorICAgICAqLworICAgIGlmIChpc25hbihhLmYpIHx8IGlzbmFuKGIuZikg fHwgKGlzbmFuKGMuZikpKSB7CisgICAgICAgIGlmIChpc25hbihhLmYpICYmIChmR0VUQklUKDUx LCBhLmkpID09IDApKSB7CisgICAgICAgICAgICBmZXJhaXNlZXhjZXB0KEZFX0lOVkFMSUQpOwor ICAgICAgICB9CisgICAgICAgIGlmIChpc25hbihiLmYpICYmIChmR0VUQklUKDUxLCBiLmkpID09 IDApKSB7CisgICAgICAgICAgICBmZXJhaXNlZXhjZXB0KEZFX0lOVkFMSUQpOworICAgICAgICB9 CisgICAgICAgIGlmIChpc25hbihjLmYpICYmIChmR0VUQklUKDUxLCBjLmkpID09IDApKSB7Cisg ICAgICAgICAgICBmZXJhaXNlZXhjZXB0KEZFX0lOVkFMSUQpOworICAgICAgICB9CisgICAgICAg IHJldC5pID0gZkRGTkFOVkFMKCk7CisgICAgICAgIHJldHVybiByZXQuZjsKKyAgICB9CisgICAg LyoKKyAgICAgKiBXZSBoYXZlIGNoZWNrZWQgZm9yIGFkZGluZyBvcHBvc2l0ZS1zaWduZWQgaW5m aW5pdGllcy4KKyAgICAgKiBPdGhlciBpbmZpbml0aWVzIHJldHVybiBpbmZpbml0eSB3aXRoIHRo ZSBjb3JyZWN0IHNpZ24KKyAgICAgKi8KKyAgICBpZiAoaXNpbmYoYy5mKSkgeworICAgICAgICBy ZXQueC5leHAgPSBERl9JTkZfRVhQOworICAgICAgICByZXQueC5tYW50ID0gMDsKKyAgICAgICAg cmV0Lnguc2lnbiA9IGMueC5zaWduOworICAgICAgICByZXR1cm4gcmV0LmY7CisgICAgfQorICAg IGlmIChpc2luZihhLmYpIHx8IGlzaW5mKGIuZikpIHsKKyAgICAgICAgcmV0LnguZXhwID0gREZf SU5GX0VYUDsKKyAgICAgICAgcmV0LngubWFudCA9IDA7CisgICAgICAgIHJldC54LnNpZ24gPSAo YS54LnNpZ24gXiBiLnguc2lnbik7CisgICAgICAgIHJldHVybiByZXQuZjsKKyAgICB9CisgICAg Z19hc3NlcnRfbm90X3JlYWNoZWQoKTsKKyAgICByZXQueC5leHAgPSAweDEyMzsKKyAgICByZXQu eC5tYW50ID0gMHhkZWFkOworICAgIHJldHVybiByZXQuZjsKK30KKworc3RhdGljIGlubGluZSBm bG9hdCBzcGVjaWFsX2ZtYWYoc2ZfdCBhLCBzZl90IGIsIHNmX3QgYykKK3sKKyAgICBkZl90IGFh LCBiYiwgY2M7CisgICAgYWEuZiA9IGEuZjsKKyAgICBiYi5mID0gYi5mOworICAgIGNjLmYgPSBj LmY7CisgICAgcmV0dXJuIHNwZWNpYWxfZm1hKGFhLCBiYiwgY2MpOworfQorCitmbG9hdCBpbnRl cm5hbF9mbWFmeChmbG9hdCBhX2luLCBmbG9hdCBiX2luLCBmbG9hdCBjX2luLCBpbnQgc2NhbGUp Cit7CisgICAgc2ZfdCBhLCBiLCBjOworICAgIHhmX3QgcHJvZDsKKyAgICB4Zl90IGFjYzsKKyAg ICB4Zl90IHJlc3VsdDsKKyAgICB4Zl9pbml0KCZwcm9kKTsKKyAgICB4Zl9pbml0KCZhY2MpOwor ICAgIHhmX2luaXQoJnJlc3VsdCk7CisgICAgYS5mID0gYV9pbjsKKyAgICBiLmYgPSBiX2luOwor ICAgIGMuZiA9IGNfaW47CisKKyAgICBpZiAoaXNpbmYoYS5mKSB8fCBpc2luZihiLmYpIHx8IGlz aW5mKGMuZikpIHsKKyAgICAgICAgcmV0dXJuIHNwZWNpYWxfZm1hZihhLCBiLCBjKTsKKyAgICB9 CisgICAgaWYgKGlzbmFuKGEuZikgfHwgaXNuYW4oYi5mKSB8fCBpc25hbihjLmYpKSB7CisgICAg ICAgIHJldHVybiBzcGVjaWFsX2ZtYWYoYSwgYiwgYyk7CisgICAgfQorICAgIGlmICgoc2NhbGUg PT0gMCkgJiYgKGlzeihhLmYpIHx8IGlzeihiLmYpKSkgeworICAgICAgICByZXR1cm4gYS5mICog Yi5mICsgYy5mOworICAgIH0KKworICAgIC8qIChhICogMioqYikgKiAoYyAqIDIqKmQpID09IGEq YyAqIDIqKihiK2QpICovCisgICAgcHJvZC5tYW50ID0gaW50MTI4X211bF82NDY0KHNmX2dldG1h bnQoYSksIHNmX2dldG1hbnQoYikpOworCisgICAgLyoKKyAgICAgKiBOb3RlOiBleHRyYWN0aW5n IHRoZSBtYW50aXNzYSBpbnRvIGFuIGludCBpcyBtdWx0aXBseWluZyBieQorICAgICAqIDIqKjIz LCBzbyBhZGp1c3QgaGVyZQorICAgICAqLworICAgIHByb2QuZXhwID0gc2ZfZ2V0ZXhwKGEpICsg c2ZfZ2V0ZXhwKGIpIC0gU0ZfQklBUyAtIDIzOworICAgIHByb2Quc2lnbiA9IGEueC5zaWduIF4g Yi54LnNpZ247CisgICAgaWYgKGlzeihhLmYpIHx8IGlzeihiLmYpKSB7CisgICAgICAgIHByb2Qu ZXhwID0gLTIgKiBXQVlfQklHX0VYUDsKKyAgICB9CisgICAgaWYgKChzY2FsZSA+IDApICYmIChm cGNsYXNzaWZ5KGMuZikgPT0gRlBfU1VCTk9STUFMKSkgeworICAgICAgICBhY2MubWFudCA9IGlu dDEyOF9tdWxfNjQ2NCgwLCAwKTsKKyAgICAgICAgYWNjLmV4cCA9IC1XQVlfQklHX0VYUDsKKyAg ICAgICAgYWNjLnNpZ24gPSBjLnguc2lnbjsKKyAgICAgICAgYWNjLnN0aWNreSA9IDE7CisgICAg ICAgIHJlc3VsdCA9IHhmX2FkZChwcm9kLCBhY2MpOworICAgIH0gZWxzZSBpZiAoIWlzeihjLmYp KSB7CisgICAgICAgIGFjYy5tYW50ID0gaW50MTI4X211bF82NDY0KHNmX2dldG1hbnQoYyksIDEp OworICAgICAgICBhY2MuZXhwID0gc2ZfZ2V0ZXhwKGMpOworICAgICAgICBhY2Muc2lnbiA9IGMu eC5zaWduOworICAgICAgICByZXN1bHQgPSB4Zl9hZGQocHJvZCwgYWNjKTsKKyAgICB9IGVsc2Ug eworICAgICAgICByZXN1bHQgPSBwcm9kOworICAgIH0KKyAgICByZXN1bHQuZXhwICs9IHNjYWxl OworICAgIHJldHVybiB4Zl9yb3VuZF9zZl90KHJlc3VsdCkuZjsKK30KKworCitmbG9hdCBpbnRl cm5hbF9mbWFmKGZsb2F0IGFfaW4sIGZsb2F0IGJfaW4sIGZsb2F0IGNfaW4pCit7CisgICAgcmV0 dXJuIGludGVybmFsX2ZtYWZ4KGFfaW4sIGJfaW4sIGNfaW4sIDApOworfQorCitmbG9hdCBpbnRl cm5hbF9tcHlmKGZsb2F0IGFfaW4sIGZsb2F0IGJfaW4pCit7CisgICAgaWYgKGlzeihhX2luKSB8 fCBpc3ooYl9pbikpIHsKKyAgICAgICAgcmV0dXJuIGFfaW4gKiBiX2luOworICAgIH0KKyAgICBy ZXR1cm4gaW50ZXJuYWxfZm1hZngoYV9pbiwgYl9pbiwgMC4wLCAwKTsKK30KKworc3RhdGljIGlu bGluZSBkb3VibGUgaW50ZXJuYWxfbXB5aGhfc3BlY2lhbChkb3VibGUgYSwgZG91YmxlIGIpCit7 CisgICAgcmV0dXJuIGEgKiBiOworfQorCitkb3VibGUgaW50ZXJuYWxfbXB5aGgoZG91YmxlIGFf aW4sIGRvdWJsZSBiX2luLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9u ZyBpbnQgYWNjdW11bGF0ZWQpCit7CisgICAgZGZfdCBhLCBiOworICAgIHhmX3QgeDsKKyAgICB1 bnNpZ25lZCBsb25nIGxvbmcgaW50IHByb2Q7CisgICAgdW5zaWduZWQgaW50IHN0aWNreTsKKwor ICAgIGEuZiA9IGFfaW47CisgICAgYi5mID0gYl9pbjsKKyAgICBzdGlja3kgPSBhY2N1bXVsYXRl ZCAmIDE7CisgICAgYWNjdW11bGF0ZWQgPj49IDE7CisgICAgeGZfaW5pdCgmeCk7CisgICAgaWYg KGlzeihhX2luKSB8fCBpc25hbihhX2luKSB8fCBpc2luZihhX2luKSkgeworICAgICAgICByZXR1 cm4gaW50ZXJuYWxfbXB5aGhfc3BlY2lhbChhX2luLCBiX2luKTsKKyAgICB9CisgICAgaWYgKGlz eihiX2luKSB8fCBpc25hbihiX2luKSB8fCBpc2luZihiX2luKSkgeworICAgICAgICByZXR1cm4g aW50ZXJuYWxfbXB5aGhfc3BlY2lhbChhX2luLCBiX2luKTsKKyAgICB9CisgICAgeC5tYW50ID0g aW50MTI4X211bF82NDY0KGFjY3VtdWxhdGVkLCAxKTsKKyAgICB4LnN0aWNreSA9IHN0aWNreTsK KyAgICBwcm9kID0gZkdFVFVXT1JEKDEsIGRmX2dldG1hbnQoYSkpICogZkdFVFVXT1JEKDEsIGRm X2dldG1hbnQoYikpOworICAgIHgubWFudCA9IGludDEyOF9hZGQoeC5tYW50LCBpbnQxMjhfbXVs XzY0NjQocHJvZCwgMHgxMDAwMDAwMDBVTEwpKTsKKyAgICB4LmV4cCA9IGRmX2dldGV4cChhKSAr IGRmX2dldGV4cChiKSAtIERGX0JJQVMgLSAyMDsKKyAgICBpZiAoIWlzbm9ybWFsKGFfaW4pIHx8 ICFpc25vcm1hbChiX2luKSkgeworICAgICAgICAvKiBjcnVzaCB0byBpbmV4YWN0IHplcm8gKi8K KyAgICAgICAgeC5zdGlja3kgPSAxOworICAgICAgICB4LmV4cCA9IC00MDk2OworICAgIH0KKyAg ICB4LnNpZ24gPSBhLnguc2lnbiBeIGIueC5zaWduOworICAgIHJldHVybiB4Zl9yb3VuZF9kZl90 KHgpLmY7Cit9CisKK2Zsb2F0IGNvbnZfZGZfdG9fc2YoZG91YmxlIGluX2YpCit7CisgICAgeGZf dCB4OworICAgIGRmX3QgaW47CisgICAgaWYgKGlzeihpbl9mKSB8fCBpc25hbihpbl9mKSB8fCBp c2luZihpbl9mKSkgeworICAgICAgICByZXR1cm4gaW5fZjsKKyAgICB9CisgICAgeGZfaW5pdCgm eCk7CisgICAgaW4uZiA9IGluX2Y7CisgICAgeC5tYW50ID0gaW50MTI4X211bF82NDY0KGRmX2dl dG1hbnQoaW4pLCAxKTsKKyAgICB4LmV4cCA9IGRmX2dldGV4cChpbikgLSBERl9CSUFTICsgU0Zf QklBUyAtIDUyICsgMjM7CisgICAgeC5zaWduID0gaW4ueC5zaWduOworICAgIHJldHVybiB4Zl9y b3VuZF9zZl90KHgpLmY7Cit9CisKLS0gCjIuNy40Cgo=