From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pj1-x102f.google.com (mail-pj1-x102f.google.com [IPv6:2607:f8b0:4864:20::102f]) by sourceware.org (Postfix) with ESMTPS id C4C333888C54 for ; Sat, 17 Dec 2022 02:49:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C4C333888C54 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=golang.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=golang.org Received: by mail-pj1-x102f.google.com with SMTP id n65-20020a17090a2cc700b0021bc5ef7a14so4174536pjd.0 for ; Fri, 16 Dec 2022 18:49:02 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=golang-org.20210112.gappssmtp.com; s=20210112; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :from:to:cc:subject:date:message-id:reply-to; bh=Abi1b7YzAF7yBvY/5WuliC+nZ6728ETRef1C7xriNA8=; b=x68sW0WnauLzg5x6I28FvwJ1Sno6LRlSsTd4+ob/xxqXGlwmM3fyD8GnPjhY6mYE4H lg676wLSqQvQrfUhfIGC9IFZkIxVnSz29R1wkqTK1vfw5jwysDkak0CGQ4y15Q/okYSK kw293QslZwuWz2VvuLP/CLdB5h8Q65avoAkr3qi4JXHCk4TZ1X0dYWdf198oo13hPsc9 5sbDXkksVvJnM7/GUhxqeQ07qgwdJzVcb5QDIYfaE6PYIhgBgqBjqpIioW3oukqexriL qEKnxa+o6JX0/kSlJQxRAJlxndNa2tjVpNUElcucUcAd3YlCz7t3dFmUURGjoKtiwzuW Wdxg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=to:subject:message-id:date:from:in-reply-to:references:mime-version :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Abi1b7YzAF7yBvY/5WuliC+nZ6728ETRef1C7xriNA8=; b=W+oClGlzG2cdtT6td5JQ5oZH6wkbqqROpcSg7ysHBI3R2Q/db8M2OxJFiiAo/yomDx /mLo64jPRdAEpn1OMpuiTui7yYQnrA4mfS7wsSmdVNJjm6FnI2ODl0pgYNGPqbIrg0Fa FekqdNGoGM78Z2qEQ1jXtW+tiUBhoWL+6R/GhBIt0eLLGRTg1U37noVS14QMBRGaz6St K9O/T4t5PbLiOR69AY0Tqdo5P8BjZwe1CFwmtJb8CI0ZIlnW8lRGXQrhF8PtoJmofAqy 6aykj20beA9kJ5W35g1kcIhFwtmotQ4Dqu3+9UnGThhriokOczZ1qZtzFBB3cwGR2DGy a7rw== X-Gm-Message-State: AFqh2koXauIYVvcAKxDnOlv8B8aUYXAWvvckLpPe6+bHnnPga3R13nr/ GNKhhe1Kcg3avoFFYYnncuLPFp58XbVjAfUBdG3ZwFKWgjhuy96w X-Google-Smtp-Source: AMrXdXuJpj0H9PLnF53MBLy1N4KQEDVBHeSsOLEF4KDZPtiETMx6H2E0q4mEMb24wYBWqn1Hs5BFi8IQRyZTO36HXtc= X-Received: by 2002:a17:902:b097:b0:190:f88e:253 with SMTP id p23-20020a170902b09700b00190f88e0253mr556898plr.114.1671245341145; Fri, 16 Dec 2022 18:49:01 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: Ian Lance Taylor Date: Fri, 16 Dec 2022 18:48:49 -0800 Message-ID: Subject: Re: Add zstd support to libbacktrace To: gcc-patches Content-Type: multipart/mixed; boundary="000000000000e4ec2605effd205a" X-Spam-Status: No, score=-10.1 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: --000000000000e4ec2605effd205a Content-Type: text/plain; charset="UTF-8" Some more tweaks of the libbacktrace zstd decompressor to make decompressing slightly faster: unpack all the literal data into the output buffer, rather than using scratch space. Bootstrapped and ran libbacktrace tests on x86_64-pc-linux-gnu. Committed to mainline. Ian * elf.c (elf_fetch_backward_init): New static function. (ZSTD_TABLE_SIZE): Use huffman scratch space size rather than literal size. (ZSTD_TABLE_WORK_LIT_SIZE): Don't define. (elf_zstd_read_huff): Use elf_fetch_backward_init. (elf_zstd_read_literals): New static function. (ZSTD_LIT_RAW, ZSTD_LIT_RLE, ZSTD_LIT_HUFF): Don't define. (struct elf_zstd_literals): Don't define. (elf_zstd_literal_output): Remove static function. (elf_zstd_decompress): Use elf_fetch_backward_init and elf_zstd_read_literals. Rewrite literal copying.< --000000000000e4ec2605effd205a Content-Type: text/plain; charset="US-ASCII"; name="patch.txt" Content-Disposition: attachment; filename="patch.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_lbrc9xrg0 ZGlmZiAtLWdpdCBhL2xpYmJhY2t0cmFjZS9lbGYuYyBiL2xpYmJhY2t0cmFjZS9lbGYuYwppbmRl eCBlY2UwMmRiMjdmMS4uMTM1YTk0MjQ1YTQgMTAwNjQ0Ci0tLSBhL2xpYmJhY2t0cmFjZS9lbGYu YworKysgYi9saWJiYWNrdHJhY2UvZWxmLmMKQEAgLTEyMjMsNiArMTIyMyw1NyBAQCBlbGZfZmV0 Y2hfYml0c19iYWNrd2FyZCAoY29uc3QgdW5zaWduZWQgY2hhciAqKnBwaW4sCiAgIHJldHVybiAx OwogfQogCisvKiBJbml0aWFsaXplIGJhY2t3YXJkIGZldGNoaW5nIHdoZW4gdGhlIGJpdHN0cmVh bSBzdGFydHMgd2l0aCBhIDEgYml0IGluIHRoZQorICAgbGFzdCBieXRlIGluIG1lbW9yeSAod2hp Y2ggaXMgdGhlIGZpcnN0IG9uZSB0aGF0IHdlIHJlYWQpLiAgVGhpcyBpcyB1c2VkIGJ5CisgICB6 c3RkIGRlY29tcHJlc3Npb24uICBSZXR1cm5zIDEgb24gc3VjY2VzcywgMCBvbiBlcnJvci4gICov CisKK3N0YXRpYyBpbnQKK2VsZl9mZXRjaF9iYWNrd2FyZF9pbml0IChjb25zdCB1bnNpZ25lZCBj aGFyICoqcHBpbiwKKwkJCSBjb25zdCB1bnNpZ25lZCBjaGFyICpwaW5lbmQsCisJCQkgdWludDY0 X3QgKnB2YWwsIHVuc2lnbmVkIGludCAqcGJpdHMpCit7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIg KnBpbjsKKyAgdW5zaWduZWQgaW50IHN0cmVhbV9zdGFydDsKKyAgdWludDY0X3QgdmFsOworICB1 bnNpZ25lZCBpbnQgYml0czsKKworICBwaW4gPSAqcHBpbjsKKyAgc3RyZWFtX3N0YXJ0ID0gKHVu c2lnbmVkIGludCkqcGluOworICBpZiAodW5saWtlbHkgKHN0cmVhbV9zdGFydCA9PSAwKSkKKyAg ICB7CisgICAgICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisgICAgICByZXR1cm4gMDsKKyAg ICB9CisgIHZhbCA9IDA7CisgIGJpdHMgPSAwOworCisgIC8qIEFsaWduIHRvIGEgMzItYml0IGJv dW5kYXJ5LiAgKi8KKyAgd2hpbGUgKCgoKHVpbnRwdHJfdClwaW4pICYgMykgIT0gMCkKKyAgICB7 CisgICAgICB2YWwgPDw9IDg7CisgICAgICB2YWwgfD0gKHVpbnQ2NF90KSpwaW47CisgICAgICBi aXRzICs9IDg7CisgICAgICAtLXBpbjsKKyAgICB9CisKKyAgdmFsIDw8PSA4OworICB2YWwgfD0g KHVpbnQ2NF90KSpwaW47CisgIGJpdHMgKz0gODsKKworICAqcHBpbiA9IHBpbjsKKyAgKnB2YWwg PSB2YWw7CisgICpwYml0cyA9IGJpdHM7CisgIGlmICghZWxmX2ZldGNoX2JpdHNfYmFja3dhcmQg KHBwaW4sIHBpbmVuZCwgcHZhbCwgcGJpdHMpKQorICAgIHJldHVybiAwOworCisgICpwYml0cyAt PSBfX2J1aWx0aW5fY2x6IChzdHJlYW1fc3RhcnQpIC0gKHNpemVvZiAodW5zaWduZWQgaW50KSAt IDEpICogOCArIDE7CisKKyAgaWYgKCFlbGZfZmV0Y2hfYml0c19iYWNrd2FyZCAocHBpbiwgcGlu ZW5kLCBwdmFsLCBwYml0cykpCisgICAgcmV0dXJuIDA7CisKKyAgcmV0dXJuIDE7Cit9CisKIC8q IEh1ZmZtYW4gY29kZSB0YWJsZXMsIGxpa2UgdGhlIHJlc3Qgb2YgdGhlIHpsaWIgZm9ybWF0LCBh cmUgZGVmaW5lZAogICAgYnkgUkZDIDE5NTEuICBXZSBzdG9yZSBhIEh1ZmZtYW4gY29kZSB0YWJs ZSBhcyBhIHNlcmllcyBvZiB0YWJsZXMKICAgIHN0b3JlZCBzZXF1ZW50aWFsbHkgaW4gbWVtb3J5 LiAgRWFjaCBlbnRyeSBpbiBhIHRhYmxlIGlzIDE2IGJpdHMuCkBAIC0yNjE3LDE0ICsyNjY4LDEz IEBAIGVsZl96bGliX2luZmxhdGVfYW5kX3ZlcmlmeSAoY29uc3QgdW5zaWduZWQgY2hhciAqcGlu LCBzaXplX3Qgc2luLAogICAgLSBzY3JhdGNoIHNwYWNlLCBvbmUgb2YKICAgICAgLSB0byBidWls ZCBhbiBGU0UgdGFibGU6IDUxMiB1aW50MTZfdCB2YWx1ZXMgPT0gMTAyNCBieXRlcwogICAgICAt IHRvIGJ1aWxkIGEgSHVmZm1hbiB0cmVlOiA1MTIgdWludDE2X3QgKyAyNTYgdWludDMyX3QgPT0g MjA0OCBieXRlcwotICAgICAtIGJ1ZmZlciBmb3IgbGl0ZXJhbCB2YWx1ZXMgPT0gMjA0OCBieXRl cwogKi8KIAogI2RlZmluZSBaU1REX1RBQkxFX1NJWkUJCQkJCVwKICAgKDIgKiA1MTIgKiBzaXpl b2YgKHN0cnVjdCBlbGZfenN0ZF9mc2VfYmFzZWxpbmVfZW50cnkpCVwKICAgICsgMjU2ICogc2l6 ZW9mIChzdHJ1Y3QgZWxmX3pzdGRfZnNlX2Jhc2VsaW5lX2VudHJ5KQkJXAogICAgKyAyMDQ4ICog c2l6ZW9mICh1aW50MTZfdCkJCQkJCVwKLSAgICsgMjA0OCkKKyAgICsgNTEyICogc2l6ZW9mICh1 aW50MTZfdCkgKyAyNTYgKiBzaXplb2YgKHVpbnQzMl90KSkKIAogI2RlZmluZSBaU1REX1RBQkxF X0xJVEVSQUxfRlNFX09GRlNFVCAoMCkKIApAQCAtMjY0Miw4ICsyNjkyLDYgQEAgZWxmX3psaWJf aW5mbGF0ZV9hbmRfdmVyaWZ5IChjb25zdCB1bnNpZ25lZCBjaGFyICpwaW4sIHNpemVfdCBzaW4s CiAjZGVmaW5lIFpTVERfVEFCTEVfV09SS19PRkZTRVQgXAogICAoWlNURF9UQUJMRV9IVUZGTUFO X09GRlNFVCArIDIwNDggKiBzaXplb2YgKHVpbnQxNl90KSkKIAotI2RlZmluZSBaU1REX1RBQkxF X1dPUktfTElUX1NJWkUgMjA0OAotCiAvKiBBbiBlbnRyeSBpbiBhIHpzdGQgRlNFIHRhYmxlLiAg Ki8KIAogc3RydWN0IGVsZl96c3RkX2ZzZV9lbnRyeQpAQCAtMzQyNyw3ICszNDc1LDYgQEAgZWxm X3pzdGRfcmVhZF9odWZmIChjb25zdCB1bnNpZ25lZCBjaGFyICoqcHBpbiwgY29uc3QgdW5zaWdu ZWQgY2hhciAqcGluZW5kLAogICAgICAgdWludDE2X3QgKnNjcmF0Y2g7CiAgICAgICBjb25zdCB1 bnNpZ25lZCBjaGFyICpwZnNlOwogICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqcGJhY2s7Ci0g ICAgICB1bnNpZ25lZCBjaGFyIHN0cmVhbV9zdGFydDsKICAgICAgIHVpbnQ2NF90IHZhbDsKICAg ICAgIHVuc2lnbmVkIGludCBiaXRzOwogICAgICAgdW5zaWduZWQgaW50IHN0YXRlMSwgc3RhdGUy OwpAQCAtMzQ1NCwzMSArMzUwMSw4IEBAIGVsZl96c3RkX3JlYWRfaHVmZiAoY29uc3QgdW5zaWdu ZWQgY2hhciAqKnBwaW4sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBpbmVuZCwKIAkgRlNFX1RBQkxF LiAgKi8KIAogICAgICAgcGJhY2sgPSBwaW4gKyBoZHIgLSAxOwotICAgICAgc3RyZWFtX3N0YXJ0 ID0gKnBiYWNrOwotICAgICAgaWYgKHVubGlrZWx5IChzdHJlYW1fc3RhcnQgPT0gMCkpCi0Jewot CSAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOwotCSAgcmV0dXJuIDA7Ci0JfQotICAgICAgdmFs ID0gMDsKLSAgICAgIGJpdHMgPSAwOwotICAgICAgd2hpbGUgKCgoKHVpbnRwdHJfdClwYmFjaykg JiAzKSAhPSAwKQotCXsKLQkgIHZhbCA8PD0gODsKLQkgIHZhbCB8PSAodWludDY0X3QpKnBiYWNr OwotCSAgYml0cyArPSA4OwotCSAgLS1wYmFjazsKLQl9Ci0gICAgICB2YWwgPDw9IDg7Ci0gICAg ICB2YWwgfD0gKHVpbnQ2NF90KSpwYmFjazsKLSAgICAgIGJpdHMgKz0gODsKLQotICAgICAgaWYg KCFlbGZfZmV0Y2hfYml0c19iYWNrd2FyZCAoJnBiYWNrLCBwZnNlLCAmdmFsLCAmYml0cykpCi0J cmV0dXJuIDA7Ci0KLSAgICAgIGJpdHMgLT0gX19idWlsdGluX2NseiAoc3RyZWFtX3N0YXJ0KSAt IDI0ICsgMTsKIAotICAgICAgaWYgKCFlbGZfZmV0Y2hfYml0c19iYWNrd2FyZCAoJnBiYWNrLCBw ZnNlLCAmdmFsLCAmYml0cykpCisgICAgICBpZiAoIWVsZl9mZXRjaF9iYWNrd2FyZF9pbml0ICgm cGJhY2ssIHBmc2UsICZ2YWwsICZiaXRzKSkKIAlyZXR1cm4gMDsKIAogICAgICAgYml0cyAtPSBm c2VfdGFibGVfYml0czsKQEAgLTM3MDIsMzMxICszNzI2LDYxNSBAQCBlbGZfenN0ZF9yZWFkX2h1 ZmYgKGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcGluLCBjb25zdCB1bnNpZ25lZCBjaGFyICpwaW5l bmQsCiAgIHJldHVybiAxOwogfQogCi0vKiBUaGUgaW5mb3JtYXRpb24gdXNlZCB0byBkZWNvbXBy ZXNzIGEgc2VxdWVuY2UgY29kZSwgd2hpY2ggY2FuIGJlIGEgbGl0ZXJhbAotICAgbGVuZ3RoLCBh biBvZmZzZXQsIG9yIGEgbWF0Y2ggbGVuZ3RoLiAgKi8KKy8qIFJlYWQgYW5kIGRlY29tcHJlc3Mg dGhlIGxpdGVyYWxzIGFuZCBzdG9yZSB0aGVtIGVuZGluZyBhdCBQT1VURU5ELiAgVGhpcworICAg d29ya3MgYmVjYXVzZSB3ZSBhcmUgZ29pbmcgdG8gdXNlIGFsbCB0aGUgbGl0ZXJhbHMgaW4gdGhl IG91dHB1dCwgc28gdGhleQorICAgbXVzdCBmaXQgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4gIEhV RkZNQU5fVEFCTEUsIGFuZCBQSFVGRk1BTl9UQUJMRV9CSVRTCisgICBzdG9yZSB0aGUgSHVmZm1h biB0YWJsZSBhY3Jvc3MgY2FsbHMuICBTQ1JBVENIIGlzIHVzZWQgdG8gcmVhZCBhIEh1ZmZtYW4K KyAgIHRhYmxlLiAgU3RvcmUgdGhlIHN0YXJ0IG9mIHRoZSBkZWNvbXByZXNzZWQgbGl0ZXJhbHMg aW4gKlBQTElULiAgVXBkYXRlCisgICAqUFBJTi4gIFJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24g ZXJyb3IuICAqLwogCi1zdHJ1Y3QgZWxmX3pzdGRfc2VxX2RlY29kZQorc3RhdGljIGludAorZWxm X3pzdGRfcmVhZF9saXRlcmFscyAoY29uc3QgdW5zaWduZWQgY2hhciAqKnBwaW4sCisJCQljb25z dCB1bnNpZ25lZCBjaGFyICpwaW5lbmQsCisJCQl1bnNpZ25lZCBjaGFyICpwb3V0LAorCQkJdW5z aWduZWQgY2hhciAqcG91dGVuZCwKKwkJCXVpbnQxNl90ICpzY3JhdGNoLAorCQkJdWludDE2X3Qg Kmh1ZmZtYW5fdGFibGUsCisJCQlpbnQgKnBodWZmbWFuX3RhYmxlX2JpdHMsCisJCQl1bnNpZ25l ZCBjaGFyICoqcHBsaXQpCiB7Ci0gIGNvbnN0IHN0cnVjdCBlbGZfenN0ZF9mc2VfYmFzZWxpbmVf ZW50cnkgKnRhYmxlOwotICBpbnQgdGFibGVfYml0czsKLX07CisgIGNvbnN0IHVuc2lnbmVkIGNo YXIgKnBpbjsKKyAgdW5zaWduZWQgY2hhciAqcGxpdDsKKyAgdW5zaWduZWQgY2hhciBoZHI7Cisg IHVpbnQzMl90IHJlZ2VuZXJhdGVkX3NpemU7CisgIHVpbnQzMl90IGNvbXByZXNzZWRfc2l6ZTsK KyAgaW50IHN0cmVhbXM7CisgIHVpbnQzMl90IHRvdGFsX3N0cmVhbXNfc2l6ZTsKKyAgdW5zaWdu ZWQgaW50IGh1ZmZtYW5fdGFibGVfYml0czsKKyAgdWludDY0X3QgaHVmZm1hbl9tYXNrOwogCi0v KiBVbnBhY2sgYSBzZXF1ZW5jZSBjb2RlIGNvbXByZXNzaW9uIG1vZGUuICAqLworICBwaW4gPSAq cHBpbjsKKyAgaWYgKHVubGlrZWx5IChwaW4gPj0gcGluZW5kKSkKKyAgICB7CisgICAgICBlbGZf dW5jb21wcmVzc19mYWlsZWQgKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIGhkciA9ICpw aW47CisgICsrcGluOwogCi1zdGF0aWMgaW50Ci1lbGZfenN0ZF91bnBhY2tfc2VxX2RlY29kZSAo aW50IG1vZGUsCi0JCQkgICAgY29uc3QgdW5zaWduZWQgY2hhciAqKnBwaW4sCi0JCQkgICAgY29u c3QgdW5zaWduZWQgY2hhciAqcGluZW5kLAotCQkJICAgIGNvbnN0IHN0cnVjdCBlbGZfenN0ZF9m c2VfYmFzZWxpbmVfZW50cnkgKnByZWRlZiwKLQkJCSAgICBpbnQgcHJlZGVmX2JpdHMsCi0JCQkg ICAgdWludDE2X3QgKnNjcmF0Y2gsCi0JCQkgICAgaW50IG1heGlkeCwKLQkJCSAgICBzdHJ1Y3Qg ZWxmX3pzdGRfZnNlX2Jhc2VsaW5lX2VudHJ5ICp0YWJsZSwKLQkJCSAgICBpbnQgdGFibGVfYml0 cywKLQkJCSAgICBpbnQgKCpjb252KShjb25zdCBzdHJ1Y3QgZWxmX3pzdGRfZnNlX2VudHJ5ICos Ci0JCQkJCWludCwKLQkJCQkJc3RydWN0IGVsZl96c3RkX2ZzZV9iYXNlbGluZV9lbnRyeSAqKSwK LQkJCSAgICBzdHJ1Y3QgZWxmX3pzdGRfc2VxX2RlY29kZSAqZGVjb2RlKQotewotICBzd2l0Y2gg KG1vZGUpCisgIGlmICgoaGRyICYgMykgPT0gMCB8fCAoaGRyICYgMykgPT0gMSkKICAgICB7Ci0g ICAgY2FzZSAwOgotICAgICAgZGVjb2RlLT50YWJsZSA9IHByZWRlZjsKLSAgICAgIGRlY29kZS0+ dGFibGVfYml0cyA9IHByZWRlZl9iaXRzOwotICAgICAgYnJlYWs7CisgICAgICBpbnQgcmF3Owog Ci0gICAgY2FzZSAxOgotICAgICAgewotCXN0cnVjdCBlbGZfenN0ZF9mc2VfZW50cnkgZW50cnk7 CisgICAgICAvKiBSYXdfbGl0ZXJhbHNfQmxvY2sgb3IgUkxFX0xpdGVyYWxzX0Jsb2NrICovCiAK LQlpZiAodW5saWtlbHkgKCpwcGluID49IHBpbmVuZCkpCi0JICB7Ci0JICAgIGVsZl91bmNvbXBy ZXNzX2ZhaWxlZCAoKTsKLQkgICAgcmV0dXJuIDA7Ci0JICB9Ci0JZW50cnkuc3ltYm9sID0gKipw cGluOwotCSsrKnBwaW47Ci0JZW50cnkuYml0cyA9IDA7Ci0JZW50cnkuYmFzZSA9IDA7Ci0JZGVj b2RlLT50YWJsZV9iaXRzID0gMDsKLQlpZiAoIWNvbnYgKCZlbnRyeSwgMCwgdGFibGUpKQorICAg ICAgcmF3ID0gKGhkciAmIDMpID09IDA7CisKKyAgICAgIHN3aXRjaCAoKGhkciA+PiAyKSAmIDMp CisJeworCWNhc2UgMDogY2FzZSAyOgorCSAgcmVnZW5lcmF0ZWRfc2l6ZSA9IGhkciA+PiAzOwor CSAgYnJlYWs7CisJY2FzZSAxOgorCSAgaWYgKHVubGlrZWx5IChwaW4gPj0gcGluZW5kKSkKKwkg ICAgeworCSAgICAgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkgICAgICByZXR1cm4gMDsK KwkgICAgfQorCSAgcmVnZW5lcmF0ZWRfc2l6ZSA9IChoZHIgPj4gNCkgKyAoKHVpbnQzMl90KSgq cGluKSA8PCA0KTsKKwkgICsrcGluOworCSAgYnJlYWs7CisJY2FzZSAzOgorCSAgaWYgKHVubGlr ZWx5IChwaW4gKyAxID49IHBpbmVuZCkpCisJICAgIHsKKwkgICAgICBlbGZfdW5jb21wcmVzc19m YWlsZWQgKCk7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwkgIHJlZ2VuZXJhdGVkX3NpemUg PSAoKGhkciA+PiA0KQorCQkJICAgICAgKyAoKHVpbnQzMl90KSpwaW4gPDwgNCkKKwkJCSAgICAg ICsgKCh1aW50MzJfdClwaW5bMV0gPDwgMTIpKTsKKwkgIHBpbiArPSAyOworCSAgYnJlYWs7CisJ ZGVmYXVsdDoKKwkgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKIAkgIHJldHVybiAwOwotICAg ICAgfQotICAgICAgYnJlYWs7CisJfQogCi0gICAgY2FzZSAyOgotICAgICAgewotCXN0cnVjdCBl bGZfenN0ZF9mc2VfZW50cnkgKmZzZV90YWJsZTsKKyAgICAgIGlmICh1bmxpa2VseSAoKHNpemVf dCkocG91dGVuZCAtIHBvdXQpIDwgcmVnZW5lcmF0ZWRfc2l6ZSkpCisJeworCSAgZWxmX3VuY29t cHJlc3NfZmFpbGVkICgpOworCSAgcmV0dXJuIDA7CisJfQogCi0JLyogV2UgdXNlIHRoZSBzYW1l IHNwYWNlIGZvciB0aGUgc2ltcGxlIEZTRSB0YWJsZSBhbmQgdGhlIGJhc2VsaW5lCi0JICAgdGFi bGUuICAqLwotCWZzZV90YWJsZSA9IChzdHJ1Y3QgZWxmX3pzdGRfZnNlX2VudHJ5ICopdGFibGU7 Ci0JZGVjb2RlLT50YWJsZV9iaXRzID0gdGFibGVfYml0czsKLQlpZiAoIWVsZl96c3RkX3JlYWRf ZnNlIChwcGluLCBwaW5lbmQsIHNjcmF0Y2gsIG1heGlkeCwgZnNlX3RhYmxlLAotCQkJCSZkZWNv ZGUtPnRhYmxlX2JpdHMpKQorICAgICAgcGxpdCA9IHBvdXRlbmQgLSByZWdlbmVyYXRlZF9zaXpl OworCisgICAgICBpZiAocmF3KQorCXsKKwkgIGlmICh1bmxpa2VseSAocGluICsgcmVnZW5lcmF0 ZWRfc2l6ZSA+PSBwaW5lbmQpKQorCSAgICB7CisJICAgICAgZWxmX3VuY29tcHJlc3NfZmFpbGVk ICgpOworCSAgICAgIHJldHVybiAwOworCSAgICB9CisJICBtZW1jcHkgKHBsaXQsIHBpbiwgcmVn ZW5lcmF0ZWRfc2l6ZSk7CisJICBwaW4gKz0gcmVnZW5lcmF0ZWRfc2l6ZTsKKwl9CisgICAgICBl bHNlCisJeworCSAgaWYgKHBpbiA+PSBwaW5lbmQpCisJICAgIHsKKwkgICAgICBlbGZfdW5jb21w cmVzc19mYWlsZWQgKCk7CisJICAgICAgcmV0dXJuIDA7CisJICAgIH0KKwkgIG1lbXNldCAocGxp dCwgKnBpbiwgcmVnZW5lcmF0ZWRfc2l6ZSk7CisJICArK3BpbjsKKwl9CisKKyAgICAgICpwcGlu ID0gcGluOworICAgICAgKnBwbGl0ID0gcGxpdDsKKworICAgICAgcmV0dXJuIDE7CisgICAgfQor CisgIC8qIENvbXByZXNzZWRfTGl0ZXJhbHNfQmxvY2sgb3IgVHJlZWxlc3NfTGl0ZXJhbHNfQmxv Y2sgKi8KKworICBzd2l0Y2ggKChoZHIgPj4gMikgJiAzKQorICAgIHsKKyAgICBjYXNlIDA6IGNh c2UgMToKKyAgICAgIGlmICh1bmxpa2VseSAocGluICsgMSA+PSBwaW5lbmQpKQorCXsKKwkgIGVs Zl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKIAkgIHJldHVybiAwOwotCWlmICghY29udiAoZnNlX3Rh YmxlLCBkZWNvZGUtPnRhYmxlX2JpdHMsIHRhYmxlKSkKKwl9CisgICAgICByZWdlbmVyYXRlZF9z aXplID0gKGhkciA+PiA0KSB8ICgodWludDMyX3QpKCpwaW4gJiAweDNmKSA8PCA0KTsKKyAgICAg IGNvbXByZXNzZWRfc2l6ZSA9ICh1aW50MzJfdCkqcGluID4+IDYgfCAoKHVpbnQzMl90KXBpblsx XSA8PCAyKTsKKyAgICAgIHBpbiArPSAyOworICAgICAgc3RyZWFtcyA9ICgoaGRyID4+IDIpICYg MykgPT0gMCA/IDEgOiA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgaWYgKHVu bGlrZWx5IChwaW4gKyAyID49IHBpbmVuZCkpCisJeworCSAgZWxmX3VuY29tcHJlc3NfZmFpbGVk ICgpOwogCSAgcmV0dXJuIDA7Ci0JZGVjb2RlLT50YWJsZSA9IHRhYmxlOwotICAgICAgfQorCX0K KyAgICAgIHJlZ2VuZXJhdGVkX3NpemUgPSAoKCh1aW50MzJfdCloZHIgPj4gNCkKKwkJCSAgfCAo KHVpbnQzMl90KSpwaW4gPDwgNCkKKwkJCSAgfCAoKCh1aW50MzJfdClwaW5bMV0gJiAzKSA8PCAx MikpOworICAgICAgY29tcHJlc3NlZF9zaXplID0gKCgodWludDMyX3QpcGluWzFdID4+IDIpCisJ CQkgfCAoKHVpbnQzMl90KXBpblsyXSA8PCA2KSk7CisgICAgICBwaW4gKz0gMzsKKyAgICAgIHN0 cmVhbXMgPSA0OwogICAgICAgYnJlYWs7Ci0KICAgICBjYXNlIDM6Ci0gICAgICBpZiAodW5saWtl bHkgKGRlY29kZS0+dGFibGVfYml0cyA9PSAtMSkpCisgICAgICBpZiAodW5saWtlbHkgKHBpbiAr IDMgPj0gcGluZW5kKSkKIAl7CiAJICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CiAJICByZXR1 cm4gMDsKIAl9CisgICAgICByZWdlbmVyYXRlZF9zaXplID0gKCgodWludDMyX3QpaGRyID4+IDQp CisJCQkgIHwgKCh1aW50MzJfdCkqcGluIDw8IDQpCisJCQkgIHwgKCgodWludDMyX3QpcGluWzFd ICYgMHgzZikgPDwgMTIpKTsKKyAgICAgIGNvbXByZXNzZWRfc2l6ZSA9ICgoKHVpbnQzMl90KXBp blsxXSA+PiA2KQorCQkJIHwgKCh1aW50MzJfdClwaW5bMl0gPDwgMikKKwkJCSB8ICgodWludDMy X3QpcGluWzNdIDw8IDEwKSk7CisgICAgICBwaW4gKz0gNDsKKyAgICAgIHN0cmVhbXMgPSA0Owog ICAgICAgYnJlYWs7Ci0KICAgICBkZWZhdWx0OgogICAgICAgZWxmX3VuY29tcHJlc3NfZmFpbGVk ICgpOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gIHJldHVybiAxOwotfQotCi0vKiBUaGUg ZGlmZmVyZW50IHdheXMgdGhhdCB0aGUgbGl0ZXJhbHMgYXJlIGVuY29kZWQuICAqLwotCi0jZGVm aW5lIFpTVERfTElUX1JBVyAoMCkKLSNkZWZpbmUgWlNURF9MSVRfUkxFICgxKQotI2RlZmluZSBa U1REX0xJVF9IVUZGICgyKQotCi0vKiBBIHN0cnVjdCB1c2VkIHRvIGRlY29tcHJlc3MgdGhlIGxp dGVyYWxzLiAgVGhlIG9yZGVyIG9mIHRoZXNlIGZpZWxkcyBpcwotICAgY2hvc2VuIGZvciBwYWNr aW5nLCBub3QgZm9yIGNvbXByZWhlbnNpYmlsaXR5LiAgKi8KLQotc3RydWN0IGVsZl96c3RkX2xp dGVyYWxzCi17Ci0gIC8qIEN1cnJlbnQgYml0cyBpbiBIdWZmbWFuIGVuY29kZWQgc3RyZWFtLiAg Ki8KLSAgdWludDY0X3QgdmFsOwotCi0gIC8qIEZvciBSQVcsIHRoZSBjdXJyZW50IHBvc2l0aW9u IGluIHRoZSBieXRlIHN0cmVhbS4KLSAgICAgRm9yIFJMRSwgYSBwb2ludGVyIHRvIHRoZSBieXRl IGJlaW5nIHJlcGVhdGVkLgotICAgICBGb3IgSFVGRiwgc3RhcnQgb2YgZW5jb2RlZCBzdHJlYW1z LgotICAqLwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpwbGl0OworICBpZiAodW5saWtlbHkgKHBp biArIGNvbXByZXNzZWRfc2l6ZSA+IHBpbmVuZCkpCisgICAgeworICAgICAgZWxmX3VuY29tcHJl c3NfZmFpbGVkICgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0gIC8qIEN1cnJlbnQgcG9z aXRpb24gb2YgY3VycmVudCBIdWZmbWFuIGVuY29kZWQgc3RyZWFtLiAgKi8KLSAgY29uc3QgdW5z aWduZWQgY2hhciAqcGJhY2s7CisgIHBpbmVuZCA9IHBpbiArIGNvbXByZXNzZWRfc2l6ZTsKKyAg KnBwaW4gPSBwaW5lbmQ7CiAKLSAgLyogRW5kIChyZWFkaW5nIGJhY2t3YXJkKSBvZiBjdXJyZW50 IEh1ZmZtYW4gZW5jb2RlZCBzdHJlYW0uICAqLwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpwYmFj a2VuZDsKKyAgaWYgKHVubGlrZWx5ICgoc2l6ZV90KShwb3V0ZW5kIC0gcG91dCkgPCByZWdlbmVy YXRlZF9zaXplKSkKKyAgICB7CisgICAgICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisgICAg ICByZXR1cm4gMDsKKyAgICB9CiAKLSAgLyogVGhlIEh1ZmZtYW4gdGFibGUuICAqLwotICBjb25z dCB1aW50MTZfdCAqaHVmZm1hbl90YWJsZTsKKyAgcGxpdCA9IHBvdXRlbmQgLSByZWdlbmVyYXRl ZF9zaXplOwogCi0gIC8qIFJlbWFpbmluZyBudW1iZXIgb2YgdW5jb21wcmVzc2VkIGJ5dGVzLiAg Ki8KLSAgdWludDMyX3QgcmVnZW5lcmF0ZWRfc2l6ZTsKKyAgKnBwbGl0ID0gcGxpdDsKIAotICAv KiBDdXJyZW50IG51bWJlciBvZiBhdmFpbGFibGUgYml0cyBpbiBIdWZmbWFuIGVuY29kZWQgc3Ry ZWFtLiAgKi8KLSAgdW5zaWduZWQgaW50IGJpdHM7CisgIHRvdGFsX3N0cmVhbXNfc2l6ZSA9IGNv bXByZXNzZWRfc2l6ZTsKKyAgaWYgKChoZHIgJiAzKSA9PSAyKQorICAgIHsKKyAgICAgIGNvbnN0 IHVuc2lnbmVkIGNoYXIgKnB0YWJsZTsKIAotICAvKiBOdW1iZXIgb2YgYml0cyBpbiB0aGUgSHVm Zm1hbiB0YWJsZS4gICovCi0gIGludCBodWZmbWFuX3RhYmxlX2JpdHM7CisgICAgICAvKiBDb21w cmVzc2VkX0xpdGVyYWxzX0Jsb2NrLiAgUmVhZCBIdWZmbWFuIHRyZWUuICAqLwogCi0gIC8qIE9m ZnNldHMgZnJvbSBQTElUIHRvIG5leHQgSHVmZm1hbiBlbmNvZGVkIHN0cmVhbXMsIDAgaWYgbm9u ZS4gICovCi0gIHVpbnQzMl90IHN0cmVhbV9vZmZbM107CisgICAgICBwdGFibGUgPSBwaW47Cisg ICAgICBpZiAoIWVsZl96c3RkX3JlYWRfaHVmZiAoJnB0YWJsZSwgcGluZW5kLCBzY3JhdGNoLCBo dWZmbWFuX3RhYmxlLAorCQkJICAgICAgIHBodWZmbWFuX3RhYmxlX2JpdHMpKQorCXJldHVybiAw OwogCi0gIC8qIFNpemVzIG9mIG5leHQgSHVmZm1hbiBlbmNvZGVkIHN0cmVhbXMsIDAgaWYgbm9u ZS4gICovCi0gIHVpbnQzMl90IHN0cmVhbV9zaXplWzNdOworICAgICAgaWYgKHVubGlrZWx5ICh0 b3RhbF9zdHJlYW1zX3NpemUgPCAoc2l6ZV90KShwdGFibGUgLSBwaW4pKSkKKwl7CisJICBlbGZf dW5jb21wcmVzc19mYWlsZWQgKCk7CisJICByZXR1cm4gMDsKKwl9CiAKLSAgLyogQSBaU1REX0xJ VF8qIGNvZGUuICAqLwotICB1bnNpZ25lZCBjaGFyIHR5cGU7Ci19OworICAgICAgdG90YWxfc3Ry ZWFtc19zaXplIC09IHB0YWJsZSAtIHBpbjsKKyAgICAgIHBpbiA9IHB0YWJsZTsKKyAgICB9Cisg IGVsc2UKKyAgICB7CisgICAgICAvKiBUcmVlbGVzc19MaXRlcmFsc19CbG9jay4gIFJldXNlIHBy ZXZpb3VzIEh1ZmZtYW4gdHJlZS4gICovCisgICAgICBpZiAodW5saWtlbHkgKCpwaHVmZm1hbl90 YWJsZV9iaXRzID09IDApKQorCXsKKwkgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkgIHJl dHVybiAwOworCX0KKyAgICB9CiAKLS8qIE91dHB1dCBDT1VOVCBieXRlcyBmcm9tIHRoZSBsaXRl cmFsIGJ5dGUgc3RyZWFtIGluIExJVEVSQUxTIHRvIFBPVVQuICAqLworICAvKiBEZWNvbXByZXNz IENPTVBSRVNTRURfU0laRSBieXRlcyBvZiBkYXRhIGF0IFBJTiB1c2luZyB0aGUgaHVmZm1hbiB0 YWJsZSwKKyAgICAgc3RvcmluZyBSRUdFTkVSQVRFRF9TSVpFIGJ5dGVzIG9mIGRlY29tcHJlc3Nl ZCBkYXRhIGF0IFBMSVQuICAqLwogCi1zdGF0aWMgaW50Ci1lbGZfenN0ZF9saXRlcmFsX291dHB1 dCAoc3RydWN0IGVsZl96c3RkX2xpdGVyYWxzICpsaXRlcmFscywKLQkJCSBzaXplX3QgY291bnQs Ci0JCQkgdW5zaWduZWQgY2hhciAqcG91dCkKLXsKLSAgc2l6ZV90IGk7Ci0gIGNvbnN0IHVuc2ln bmVkIGNoYXIgKnBiYWNrOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpwYmFja2VuZDsKLSAgdWlu dDY0X3QgdmFsOwotICB1bnNpZ25lZCBpbnQgYml0czsKLSAgY29uc3QgdWludDE2X3QgKmh1ZmZt YW5fdGFibGU7Ci0gIHVuc2lnbmVkIGludCBodWZmbWFuX3RhYmxlX2JpdHM7Ci0gIHVpbnQ2NF90 IGh1ZmZtYW5fbWFzazsKKyAgaHVmZm1hbl90YWJsZV9iaXRzID0gKHVuc2lnbmVkIGludCkqcGh1 ZmZtYW5fdGFibGVfYml0czsKKyAgaHVmZm1hbl9tYXNrID0gKCh1aW50NjRfdCkxIDw8IGh1ZmZt YW5fdGFibGVfYml0cykgLSAxOwogCi0gIGlmIChsaXRlcmFscy0+cmVnZW5lcmF0ZWRfc2l6ZSA8 IGNvdW50KQorICBpZiAoc3RyZWFtcyA9PSAxKQogICAgIHsKLSAgICAgIGVsZl91bmNvbXByZXNz X2ZhaWxlZCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgbGl0ZXJhbHMtPnJlZ2VuZXJh dGVkX3NpemUgLT0gY291bnQ7CisgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwYmFjazsKKyAg ICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBiYWNrZW5kOworICAgICAgdWludDY0X3QgdmFsOwor ICAgICAgdW5zaWduZWQgaW50IGJpdHM7CisgICAgICB1aW50MzJfdCBpOwogCi0gIHN3aXRjaCAo bGl0ZXJhbHMtPnR5cGUpCi0gICAgewotICAgIGNhc2UgWlNURF9MSVRfUkFXOgotICAgICAgbWVt Y3B5IChwb3V0LCBsaXRlcmFscy0+cGxpdCwgY291bnQpOwotICAgICAgbGl0ZXJhbHMtPnBsaXQg Kz0gY291bnQ7Ci0gICAgICByZXR1cm4gMTsKKyAgICAgIHBiYWNrID0gcGluICsgY29tcHJlc3Nl ZF9zaXplIC0gMTsKKyAgICAgIHBiYWNrZW5kID0gcGluOworICAgICAgaWYgKCFlbGZfZmV0Y2hf YmFja3dhcmRfaW5pdCAoJnBiYWNrLCBwYmFja2VuZCwgJnZhbCwgJmJpdHMpKQorCXJldHVybiAw OwogCi0gICAgY2FzZSBaU1REX0xJVF9STEU6Ci0gICAgICBtZW1zZXQgKHBvdXQsICpsaXRlcmFs cy0+cGxpdCwgY291bnQpOwotICAgICAgcmV0dXJuIDE7CisgICAgICAvKiBUaGlzIGlzIG9uZSBv ZiB0aGUgaW5uZXIgbG9vcHMgb2YgdGhlIGRlY29tcHJlc3Npb24gYWxnb3JpdGhtLCBzbyB3ZQor CSBwdXQgc29tZSBlZmZvcnQgaW50byBvcHRpbWl6YXRpb24uICBXZSBjYW4ndCBnZXQgbW9yZSB0 aGFuIDY0IGJ5dGVzCisJIGZyb20gYSBzaW5nbGUgY2FsbCB0byBlbGZfZmV0Y2hfYml0c19iYWNr d2FyZCwgYW5kIHdlIGNhbid0IHN1YnRyYWN0CisJIG1vcmUgdGhhbiAxMSBiaXRzIGF0IGEgdGlt ZS4gICovCiAKLSAgICBjYXNlIFpTVERfTElUX0hVRkY6Ci0gICAgICBicmVhazsKKyAgICAgIGlm IChyZWdlbmVyYXRlZF9zaXplID49IDY0KQorCXsKKwkgIHVuc2lnbmVkIGNoYXIgKnBsaXRzdGFy dDsKKwkgIHVuc2lnbmVkIGNoYXIgKnBsaXRzdG9wOwogCi0gICAgZGVmYXVsdDoKLSAgICAgIGVs Zl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKLSAgICAgIHJldHVybiAwOwotICAgIH0KKwkgIHBsaXRz dGFydCA9IHBsaXQ7CisJICBwbGl0c3RvcCA9IHBsaXQgKyByZWdlbmVyYXRlZF9zaXplIC0gNjQ7 CisJICB3aGlsZSAocGxpdCA8IHBsaXRzdG9wKQorCSAgICB7CisJICAgICAgdWludDE2X3QgdDsK IAotICAvKiBUaGUgbGl0ZXJhbCBzdHJpbmcgaXMgSHVmZm1hbiBlbmNvZGVkLiAgKi8KKwkgICAg ICBpZiAoIWVsZl9mZXRjaF9iaXRzX2JhY2t3YXJkICgmcGJhY2ssIHBiYWNrZW5kLCAmdmFsLCAm Yml0cykpCisJCXJldHVybiAwOwogCi0gIHBiYWNrID0gbGl0ZXJhbHMtPnBiYWNrOwotICBwYmFj a2VuZCA9IGxpdGVyYWxzLT5wYmFja2VuZDsKLSAgdmFsID0gbGl0ZXJhbHMtPnZhbDsKLSAgYml0 cyA9IGxpdGVyYWxzLT5iaXRzOworCSAgICAgIGlmIChiaXRzIDwgMTYpCisJCWJyZWFrOwogCi0g IGh1ZmZtYW5fdGFibGUgPSBsaXRlcmFscy0+aHVmZm1hbl90YWJsZTsKLSAgaHVmZm1hbl90YWJs ZV9iaXRzID0gbGl0ZXJhbHMtPmh1ZmZtYW5fdGFibGVfYml0czsKLSAgaHVmZm1hbl9tYXNrID0g KCh1aW50NjRfdCkxIDw8IGh1ZmZtYW5fdGFibGVfYml0cykgLSAxOworCSAgICAgIHdoaWxlIChi aXRzID49IDMzKQorCQl7CisJCSAgdCA9IGh1ZmZtYW5fdGFibGVbKHZhbCA+PiAoYml0cyAtIGh1 ZmZtYW5fdGFibGVfYml0cykpCisJCQkJICAgICYgaHVmZm1hbl9tYXNrXTsKKwkJICAqcGxpdCA9 IHQgPj4gODsKKwkJICArK3BsaXQ7CisJCSAgYml0cyAtPSB0ICYgMHhmZjsKKworCQkgIHQgPSBo dWZmbWFuX3RhYmxlWyh2YWwgPj4gKGJpdHMgLSBodWZmbWFuX3RhYmxlX2JpdHMpKQorCQkJCSAg ICAmIGh1ZmZtYW5fbWFza107CisJCSAgKnBsaXQgPSB0ID4+IDg7CisJCSAgKytwbGl0OworCQkg IGJpdHMgLT0gdCAmIDB4ZmY7CisKKwkJICB0ID0gaHVmZm1hbl90YWJsZVsodmFsID4+IChiaXRz IC0gaHVmZm1hbl90YWJsZV9iaXRzKSkKKwkJCQkgICAgJiBodWZmbWFuX21hc2tdOworCQkgICpw bGl0ID0gdCA+PiA4OworCQkgICsrcGxpdDsKKwkJICBiaXRzIC09IHQgJiAweGZmOworCQl9CiAK LSAgLyogVGhpcyBpcyBvbmUgb2YgdGhlIGlubmVyIGxvb3BzIG9mIHRoZSBkZWNvbXByZXNzaW9u IGFsZ29yaXRobSwgc28gd2UgcHV0Ci0gICAgIHNvbWUgZWZmb3J0IGludG8gb3B0aW1pemF0aW9u LiAgV2UgY2FuJ3QgZ2V0IG1vcmUgdGhhbiA2NCBieXRlcyBmcm9tIGEKLSAgICAgc2luZ2xlIGNh bGwgdG8gZWxmX2ZldGNoX2JpdHNfYmFja3dhcmQsIGFuZCB3ZSBjYW4ndCBzdWJ0cmFjdCBtb3Jl IHRoYW4gMTEKLSAgICAgYml0cyBhdCBhIHRpbWUuICAqLworCSAgICAgIHdoaWxlIChiaXRzID4g MTEpCisJCXsKKwkJICB0ID0gaHVmZm1hbl90YWJsZVsodmFsID4+IChiaXRzIC0gaHVmZm1hbl90 YWJsZV9iaXRzKSkKKwkJCQkgICAgJiBodWZmbWFuX21hc2tdOworCQkgICpwbGl0ID0gdCA+PiA4 OworCQkgICsrcGxpdDsKKwkJICBiaXRzIC09IHQgJiAweGZmOworCQl9CisJICAgIH0KIAotICBp ZiAoY291bnQgPj0gNjQpCi0gICAgewotICAgICAgdW5zaWduZWQgY2hhciAqcG91dHN0YXJ0Owot ICAgICAgdW5zaWduZWQgY2hhciAqcG91dHN0b3A7CisJICByZWdlbmVyYXRlZF9zaXplIC09IHBs aXQgLSBwbGl0c3RhcnQ7CisJfQogCi0gICAgICBwb3V0c3RhcnQgPSBwb3V0OwotICAgICAgcG91 dHN0b3AgPSBwb3V0ICsgY291bnQgLSA2NDsKLSAgICAgIHdoaWxlIChwb3V0IDw9IHBvdXRzdG9w KQorICAgICAgZm9yIChpID0gMDsgaSA8IHJlZ2VuZXJhdGVkX3NpemU7ICsraSkKIAl7CiAJICB1 aW50MTZfdCB0OwogCiAJICBpZiAoIWVsZl9mZXRjaF9iaXRzX2JhY2t3YXJkICgmcGJhY2ssIHBi YWNrZW5kLCAmdmFsLCAmYml0cykpCiAJICAgIHJldHVybiAwOwogCi0JICBpZiAoYml0cyA8IDE2 KQotCSAgICBicmVhazsKLQotCSAgd2hpbGUgKGJpdHMgPj0gMzMpCisJICBpZiAodW5saWtlbHkg KGJpdHMgPCBodWZmbWFuX3RhYmxlX2JpdHMpKQogCSAgICB7Ci0JICAgICAgdCA9IGh1ZmZtYW5f dGFibGVbKHZhbCA+PiAoYml0cyAtIGh1ZmZtYW5fdGFibGVfYml0cykpCisJICAgICAgdCA9IGh1 ZmZtYW5fdGFibGVbKHZhbCA8PCAoaHVmZm1hbl90YWJsZV9iaXRzIC0gYml0cykpCiAJCQkJJiBo dWZmbWFuX21hc2tdOwotCSAgICAgICpwb3V0ID0gdCA+PiA4OwotCSAgICAgICsrcG91dDsKLQkg ICAgICBiaXRzIC09IHQgJiAweGZmOwotCi0JICAgICAgdCA9IGh1ZmZtYW5fdGFibGVbKHZhbCA+ PiAoYml0cyAtIGh1ZmZtYW5fdGFibGVfYml0cykpCi0JCQkJJiBodWZmbWFuX21hc2tdOwotCSAg ICAgICpwb3V0ID0gdCA+PiA4OwotCSAgICAgICsrcG91dDsKLQkgICAgICBiaXRzIC09IHQgJiAw eGZmOwotCi0JICAgICAgdCA9IGh1ZmZtYW5fdGFibGVbKHZhbCA+PiAoYml0cyAtIGh1ZmZtYW5f dGFibGVfYml0cykpCi0JCQkJJiBodWZmbWFuX21hc2tdOwotCSAgICAgICpwb3V0ID0gdCA+PiA4 OwotCSAgICAgICsrcG91dDsKLQkgICAgICBiaXRzIC09IHQgJiAweGZmOworCSAgICAgIGlmICh1 bmxpa2VseSAoYml0cyA8ICh0ICYgMHhmZikpKQorCQl7CisJCSAgZWxmX3VuY29tcHJlc3NfZmFp bGVkICgpOworCQkgIHJldHVybiAwOworCQl9CiAJICAgIH0KKwkgIGVsc2UKKwkgICAgdCA9IGh1 ZmZtYW5fdGFibGVbKHZhbCA+PiAoYml0cyAtIGh1ZmZtYW5fdGFibGVfYml0cykpCisJCQkgICAg ICAmIGh1ZmZtYW5fbWFza107CiAKLQkgIHdoaWxlIChiaXRzID4gMTEpCi0JICAgIHsKLQkgICAg ICB0ID0gaHVmZm1hbl90YWJsZVsodmFsID4+IChiaXRzIC0gaHVmZm1hbl90YWJsZV9iaXRzKSkK LQkJCQkmIGh1ZmZtYW5fbWFza107Ci0JICAgICAgKnBvdXQgPSB0ID4+IDg7Ci0JICAgICAgKytw b3V0OwotCSAgICAgIGJpdHMgLT0gdCAmIDB4ZmY7Ci0JICAgIH0KKwkgICpwbGl0ID0gdCA+PiA4 OworCSAgKytwbGl0OworCSAgYml0cyAtPSB0ICYgMHhmZjsKIAl9CiAKLSAgICAgIGNvdW50IC09 IHBvdXQgLSBwb3V0c3RhcnQ7CisgICAgICByZXR1cm4gMTsKKyAgICB9CiAKLSAgICAgIGlmICgh ZWxmX2ZldGNoX2JpdHNfYmFja3dhcmQgKCZwYmFjaywgcGJhY2tlbmQsICZ2YWwsICZiaXRzKSkK KyAgeworICAgIHVpbnQzMl90IHN0cmVhbV9zaXplMSwgc3RyZWFtX3NpemUyLCBzdHJlYW1fc2l6 ZTMsIHN0cmVhbV9zaXplNDsKKyAgICB1aW50MzJfdCB0b3Q7CisgICAgY29uc3QgdW5zaWduZWQg Y2hhciAqcGJhY2sxLCAqcGJhY2syLCAqcGJhY2szLCAqcGJhY2s0OworICAgIGNvbnN0IHVuc2ln bmVkIGNoYXIgKnBiYWNrZW5kMSwgKnBiYWNrZW5kMiwgKnBiYWNrZW5kMywgKnBiYWNrZW5kNDsK KyAgICB1aW50NjRfdCB2YWwxLCB2YWwyLCB2YWwzLCB2YWw0OworICAgIHVuc2lnbmVkIGludCBi aXRzMSwgYml0czIsIGJpdHMzLCBiaXRzNDsKKyAgICB1bnNpZ25lZCBjaGFyICpwbGl0MSwgKnBs aXQyLCAqcGxpdDMsICpwbGl0NDsKKyAgICB1aW50MzJfdCByZWdlbmVyYXRlZF9zdHJlYW1fc2l6 ZTsKKyAgICB1aW50MzJfdCByZWdlbmVyYXRlZF9zdHJlYW1fc2l6ZTQ7CisgICAgdWludDE2X3Qg dDEsIHQyLCB0MywgdDQ7CisgICAgdWludDMyX3QgaTsKKyAgICB1aW50MzJfdCBsaW1pdDsKKwor ICAgIC8qIFJlYWQganVtcCB0YWJsZS4gICovCisgICAgaWYgKHVubGlrZWx5IChwaW4gKyA1ID49 IHBpbmVuZCkpCisgICAgICB7CisJZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOwogCXJldHVybiAw OwotICAgIH0KKyAgICAgIH0KKyAgICBzdHJlYW1fc2l6ZTEgPSAodWludDMyX3QpKnBpbiB8ICgo dWludDMyX3QpcGluWzFdIDw8IDgpOworICAgIHBpbiArPSAyOworICAgIHN0cmVhbV9zaXplMiA9 ICh1aW50MzJfdCkqcGluIHwgKCh1aW50MzJfdClwaW5bMV0gPDwgOCk7CisgICAgcGluICs9IDI7 CisgICAgc3RyZWFtX3NpemUzID0gKHVpbnQzMl90KSpwaW4gfCAoKHVpbnQzMl90KXBpblsxXSA8 PCA4KTsKKyAgICBwaW4gKz0gMjsKKyAgICB0b3QgPSBzdHJlYW1fc2l6ZTEgKyBzdHJlYW1fc2l6 ZTIgKyBzdHJlYW1fc2l6ZTM7CisgICAgaWYgKHVubGlrZWx5ICh0b3QgPiB0b3RhbF9zdHJlYW1z X3NpemUgLSA2KSkKKyAgICAgIHsKKwllbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisJcmV0dXJu IDA7CisgICAgICB9CisgICAgc3RyZWFtX3NpemU0ID0gdG90YWxfc3RyZWFtc19zaXplIC0gNiAt IHRvdDsKIAotICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7ICsraSkKLSAgICB7Ci0gICAgICB1aW50 MTZfdCB0OworICAgIHBiYWNrMSA9IHBpbiArIHN0cmVhbV9zaXplMSAtIDE7CisgICAgcGJhY2tl bmQxID0gcGluOwogCi0gICAgICBpZiAodW5saWtlbHkgKGJpdHMgPT0gMCkpCi0JewotCSAgdW5z aWduZWQgY2hhciBzdHJlYW1fc3RhcnQ7CisgICAgcGJhY2syID0gcGJhY2sxICsgc3RyZWFtX3Np emUyOworICAgIHBiYWNrZW5kMiA9IHBiYWNrMSArIDE7CiAKLQkgIC8qIEFkdmFuY2UgdG8gbmV4 dCBzdHJlYW0uICAqLwotCSAgaWYgKHVubGlrZWx5IChsaXRlcmFscy0+c3RyZWFtX29mZlswXSA9 PSAwKSkKLQkgICAgewotCSAgICAgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKLQkgICAgICBy ZXR1cm4gMDsKLQkgICAgfQorICAgIHBiYWNrMyA9IHBiYWNrMiArIHN0cmVhbV9zaXplMzsKKyAg ICBwYmFja2VuZDMgPSBwYmFjazIgKyAxOwogCi0JICBwYmFjayA9IGxpdGVyYWxzLT5wbGl0ICsg bGl0ZXJhbHMtPnN0cmVhbV9vZmZbMF07Ci0JICBwYmFja2VuZCA9IHBiYWNrOwotCSAgcGJhY2sg Kz0gbGl0ZXJhbHMtPnN0cmVhbV9zaXplWzBdOworICAgIHBiYWNrNCA9IHBiYWNrMyArIHN0cmVh bV9zaXplNDsKKyAgICBwYmFja2VuZDQgPSBwYmFjazMgKyAxOwogCi0JICAvKiBBbGlnbiB0byBh IDMyLWJpdCBib3VuZGFyeS4gICovCi0JICB2YWwgPSAwOwotCSAgYml0cyA9IDA7Ci0JICAtLXBi YWNrOwotCSAgc3RyZWFtX3N0YXJ0ID0gKnBiYWNrOwotCSAgaWYgKHVubGlrZWx5IChzdHJlYW1f c3RhcnQgPT0gMCkpCi0JICAgIHsKLQkgICAgICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7Cisg ICAgaWYgKCFlbGZfZmV0Y2hfYmFja3dhcmRfaW5pdCAoJnBiYWNrMSwgcGJhY2tlbmQxLCAmdmFs MSwgJmJpdHMxKSkKKyAgICAgIHJldHVybiAwOworICAgIGlmICghZWxmX2ZldGNoX2JhY2t3YXJk X2luaXQgKCZwYmFjazIsIHBiYWNrZW5kMiwgJnZhbDIsICZiaXRzMikpCisgICAgICByZXR1cm4g MDsKKyAgICBpZiAoIWVsZl9mZXRjaF9iYWNrd2FyZF9pbml0ICgmcGJhY2szLCBwYmFja2VuZDMs ICZ2YWwzLCAmYml0czMpKQorICAgICAgcmV0dXJuIDA7CisgICAgaWYgKCFlbGZfZmV0Y2hfYmFj a3dhcmRfaW5pdCAoJnBiYWNrNCwgcGJhY2tlbmQ0LCAmdmFsNCwgJmJpdHM0KSkKKyAgICAgIHJl dHVybiAwOworCisgICAgcmVnZW5lcmF0ZWRfc3RyZWFtX3NpemUgPSAocmVnZW5lcmF0ZWRfc2l6 ZSArIDMpIC8gNDsKKworICAgIHBsaXQxID0gcGxpdDsKKyAgICBwbGl0MiA9IHBsaXQxICsgcmVn ZW5lcmF0ZWRfc3RyZWFtX3NpemU7CisgICAgcGxpdDMgPSBwbGl0MiArIHJlZ2VuZXJhdGVkX3N0 cmVhbV9zaXplOworICAgIHBsaXQ0ID0gcGxpdDMgKyByZWdlbmVyYXRlZF9zdHJlYW1fc2l6ZTsK KworICAgIHJlZ2VuZXJhdGVkX3N0cmVhbV9zaXplNCA9IHJlZ2VuZXJhdGVkX3NpemUgLSByZWdl bmVyYXRlZF9zdHJlYW1fc2l6ZSAqIDM7CisKKyAgICAvKiBXZSBjYW4ndCBnZXQgbW9yZSB0aGFu IDY0IGxpdGVyYWwgYnl0ZXMgZnJvbSBhIHNpbmdsZSBjYWxsIHRvCisgICAgICAgZWxmX2ZldGNo X2JpdHNfYmFja3dhcmQuICBUaGUgZm91cnRoIHN0cmVhbSBjYW4gYmUgdXAgdG8gMyBieXRlcyBs ZXNzLAorICAgICAgIHNvIHVzZSBhcyB0aGUgbGltaXQuICAqLworCisgICAgbGltaXQgPSByZWdl bmVyYXRlZF9zdHJlYW1fc2l6ZTQgPD0gNjQgPyAwIDogcmVnZW5lcmF0ZWRfc3RyZWFtX3NpemU0 IC0gNjQ7CisgICAgaSA9IDA7CisgICAgd2hpbGUgKGkgPCBsaW1pdCkKKyAgICAgIHsKKwlpZiAo IWVsZl9mZXRjaF9iaXRzX2JhY2t3YXJkICgmcGJhY2sxLCBwYmFja2VuZDEsICZ2YWwxLCAmYml0 czEpKQorCSAgcmV0dXJuIDA7CisJaWYgKCFlbGZfZmV0Y2hfYml0c19iYWNrd2FyZCAoJnBiYWNr MiwgcGJhY2tlbmQyLCAmdmFsMiwgJmJpdHMyKSkKKwkgIHJldHVybiAwOworCWlmICghZWxmX2Zl dGNoX2JpdHNfYmFja3dhcmQgKCZwYmFjazMsIHBiYWNrZW5kMywgJnZhbDMsICZiaXRzMykpCisJ ICByZXR1cm4gMDsKKwlpZiAoIWVsZl9mZXRjaF9iaXRzX2JhY2t3YXJkICgmcGJhY2s0LCBwYmFj a2VuZDQsICZ2YWw0LCAmYml0czQpKQorCSAgcmV0dXJuIDA7CisKKwkvKiBXZSBjYW4ndCBzdWJ0 cmFjdCBtb3JlIHRoYW4gMTEgYml0cyBhdCBhIHRpbWUuICAqLworCisJZG8KKwkgIHsKKwkgICAg dDEgPSBodWZmbWFuX3RhYmxlWyh2YWwxID4+IChiaXRzMSAtIGh1ZmZtYW5fdGFibGVfYml0cykp CisJCQkgICAgICAgJiBodWZmbWFuX21hc2tdOworCSAgICB0MiA9IGh1ZmZtYW5fdGFibGVbKHZh bDIgPj4gKGJpdHMyIC0gaHVmZm1hbl90YWJsZV9iaXRzKSkKKwkJCSAgICAgICAmIGh1ZmZtYW5f bWFza107CisJICAgIHQzID0gaHVmZm1hbl90YWJsZVsodmFsMyA+PiAoYml0czMgLSBodWZmbWFu X3RhYmxlX2JpdHMpKQorCQkJICAgICAgICYgaHVmZm1hbl9tYXNrXTsKKwkgICAgdDQgPSBodWZm bWFuX3RhYmxlWyh2YWw0ID4+IChiaXRzNCAtIGh1ZmZtYW5fdGFibGVfYml0cykpCisJCQkgICAg ICAgJiBodWZmbWFuX21hc2tdOworCisJICAgICpwbGl0MSA9IHQxID4+IDg7CisJICAgICsrcGxp dDE7CisJICAgIGJpdHMxIC09IHQxICYgMHhmZjsKKworCSAgICAqcGxpdDIgPSB0MiA+PiA4Owor CSAgICArK3BsaXQyOworCSAgICBiaXRzMiAtPSB0MiAmIDB4ZmY7CisKKwkgICAgKnBsaXQzID0g dDMgPj4gODsKKwkgICAgKytwbGl0MzsKKwkgICAgYml0czMgLT0gdDMgJiAweGZmOworCisJICAg ICpwbGl0NCA9IHQ0ID4+IDg7CisJICAgICsrcGxpdDQ7CisJICAgIGJpdHM0IC09IHQ0ICYgMHhm ZjsKKworCSAgICArK2k7CisJICB9CisJd2hpbGUgKGJpdHMxID4gMTEgJiYgYml0czIgPiAxMSAm JiBiaXRzMyA+IDExICYmIGJpdHM0ID4gMTEpOworICAgICAgfQorCisgICAgd2hpbGUgKGkgPCBy ZWdlbmVyYXRlZF9zdHJlYW1fc2l6ZSkKKyAgICAgIHsKKwlpbnQgdXNlNDsKKworCXVzZTQgPSBp IDwgcmVnZW5lcmF0ZWRfc3RyZWFtX3NpemU0OworCisJaWYgKCFlbGZfZmV0Y2hfYml0c19iYWNr d2FyZCAoJnBiYWNrMSwgcGJhY2tlbmQxLCAmdmFsMSwgJmJpdHMxKSkKKwkgIHJldHVybiAwOwor CWlmICghZWxmX2ZldGNoX2JpdHNfYmFja3dhcmQgKCZwYmFjazIsIHBiYWNrZW5kMiwgJnZhbDIs ICZiaXRzMikpCisJICByZXR1cm4gMDsKKwlpZiAoIWVsZl9mZXRjaF9iaXRzX2JhY2t3YXJkICgm cGJhY2szLCBwYmFja2VuZDMsICZ2YWwzLCAmYml0czMpKQorCSAgcmV0dXJuIDA7CisJaWYgKHVz ZTQpCisJICB7CisJICAgIGlmICghZWxmX2ZldGNoX2JpdHNfYmFja3dhcmQgKCZwYmFjazQsIHBi YWNrZW5kNCwgJnZhbDQsICZiaXRzNCkpCiAJICAgICAgcmV0dXJuIDA7Ci0JICAgIH0KLQkgIHdo aWxlICgoKCh1aW50cHRyX3QpIHBiYWNrKSAmIDMpICE9IDApCi0JICAgIHsKLQkgICAgICB2YWwg PDw9IDg7Ci0JICAgICAgdmFsIHw9ICh1aW50NjRfdCkqcGJhY2s7Ci0JICAgICAgYml0cyArPSA4 OwotCSAgICAgIC0tcGJhY2s7Ci0JICAgIH0KLQkgIHZhbCA8PD0gODsKLQkgIHZhbCB8PSAodWlu dDY0X3QpKnBiYWNrOwotCSAgYml0cyArPSA4OworCSAgfQogCi0JICBpZiAoIWVsZl9mZXRjaF9i aXRzX2JhY2t3YXJkICgmcGJhY2ssIHBiYWNrZW5kLCAmdmFsLCAmYml0cykpCi0JICAgIHJldHVy biAwOworCWlmICh1bmxpa2VseSAoYml0czEgPCBodWZmbWFuX3RhYmxlX2JpdHMpKQorCSAgewor CSAgICB0MSA9IGh1ZmZtYW5fdGFibGVbKHZhbDEgPDwgKGh1ZmZtYW5fdGFibGVfYml0cyAtIGJp dHMxKSkKKwkJCSAgICAgICAmIGh1ZmZtYW5fbWFza107CisJICAgIGlmICh1bmxpa2VseSAoYml0 czEgPCAodDEgJiAweGZmKSkpCisJICAgICAgeworCQllbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7 CisJCXJldHVybiAwOworCSAgICAgIH0KKwkgIH0KKwllbHNlCisJICB0MSA9IGh1ZmZtYW5fdGFi bGVbKHZhbDEgPj4gKGJpdHMxIC0gaHVmZm1hbl90YWJsZV9iaXRzKSkKKwkJCSAgICAgJiBodWZm bWFuX21hc2tdOwogCi0JICBiaXRzIC09IF9fYnVpbHRpbl9jbHogKHN0cmVhbV9zdGFydCkgLSAy NCArIDE7CisJaWYgKHVubGlrZWx5IChiaXRzMiA8IGh1ZmZtYW5fdGFibGVfYml0cykpCisJICB7 CisJICAgIHQyID0gaHVmZm1hbl90YWJsZVsodmFsMiA8PCAoaHVmZm1hbl90YWJsZV9iaXRzIC0g Yml0czIpKQorCQkJICAgICAgICYgaHVmZm1hbl9tYXNrXTsKKwkgICAgaWYgKHVubGlrZWx5IChi aXRzMiA8ICh0MiAmIDB4ZmYpKSkKKwkgICAgICB7CisJCWVsZl91bmNvbXByZXNzX2ZhaWxlZCAo KTsKKwkJcmV0dXJuIDA7CisJICAgICAgfQorCSAgfQorCWVsc2UKKwkgIHQyID0gaHVmZm1hbl90 YWJsZVsodmFsMiA+PiAoYml0czIgLSBodWZmbWFuX3RhYmxlX2JpdHMpKQorCQkJICAgICAmIGh1 ZmZtYW5fbWFza107CiAKLQkgIGxpdGVyYWxzLT5zdHJlYW1fb2ZmWzBdID0gbGl0ZXJhbHMtPnN0 cmVhbV9vZmZbMV07Ci0JICBsaXRlcmFscy0+c3RyZWFtX29mZlsxXSA9IGxpdGVyYWxzLT5zdHJl YW1fb2ZmWzJdOwotCSAgbGl0ZXJhbHMtPnN0cmVhbV9vZmZbMl0gPSAwOwotCSAgbGl0ZXJhbHMt PnN0cmVhbV9zaXplWzBdID0gbGl0ZXJhbHMtPnN0cmVhbV9zaXplWzFdOwotCSAgbGl0ZXJhbHMt PnN0cmVhbV9zaXplWzFdID0gbGl0ZXJhbHMtPnN0cmVhbV9zaXplWzJdOwotCSAgbGl0ZXJhbHMt PnN0cmVhbV9zaXplWzJdID0gMDsKLQl9CisJaWYgKHVubGlrZWx5IChiaXRzMyA8IGh1ZmZtYW5f dGFibGVfYml0cykpCisJICB7CisJICAgIHQzID0gaHVmZm1hbl90YWJsZVsodmFsMyA8PCAoaHVm Zm1hbl90YWJsZV9iaXRzIC0gYml0czMpKQorCQkJICAgICAgICYgaHVmZm1hbl9tYXNrXTsKKwkg ICAgaWYgKHVubGlrZWx5IChiaXRzMyA8ICh0MyAmIDB4ZmYpKSkKKwkgICAgICB7CisJCWVsZl91 bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkJcmV0dXJuIDA7CisJICAgICAgfQorCSAgfQorCWVsc2UK KwkgIHQzID0gaHVmZm1hbl90YWJsZVsodmFsMyA+PiAoYml0czMgLSBodWZmbWFuX3RhYmxlX2Jp dHMpKQorCQkJICAgICAmIGh1ZmZtYW5fbWFza107CiAKLSAgICAgIGlmICghZWxmX2ZldGNoX2Jp dHNfYmFja3dhcmQgKCZwYmFjaywgcGJhY2tlbmQsICZ2YWwsICZiaXRzKSkKLQlyZXR1cm4gMDsK KwlpZiAodXNlNCkKKwkgIHsKKwkgICAgaWYgKHVubGlrZWx5IChiaXRzNCA8IGh1ZmZtYW5fdGFi bGVfYml0cykpCisJICAgICAgeworCQl0NCA9IGh1ZmZtYW5fdGFibGVbKHZhbDQgPDwgKGh1ZmZt YW5fdGFibGVfYml0cyAtIGJpdHM0KSkKKwkJCQkgICAmIGh1ZmZtYW5fbWFza107CisJCWlmICh1 bmxpa2VseSAoYml0czQgPCAodDQgJiAweGZmKSkpCisJCSAgeworCQkgICAgZWxmX3VuY29tcHJl c3NfZmFpbGVkICgpOworCQkgICAgcmV0dXJuIDA7CisJCSAgfQorCSAgICAgIH0KKwkgICAgZWxz ZQorCSAgICAgIHQ0ID0gaHVmZm1hbl90YWJsZVsodmFsNCA+PiAoYml0czQgLSBodWZmbWFuX3Rh YmxlX2JpdHMpKQorCQkJCSAmIGh1ZmZtYW5fbWFza107CisKKwkgICAgKnBsaXQ0ID0gdDQgPj4g ODsKKwkgICAgKytwbGl0NDsKKwkgICAgYml0czQgLT0gdDQgJiAweGZmOworCSAgfQorCisJKnBs aXQxID0gdDEgPj4gODsKKwkrK3BsaXQxOworCWJpdHMxIC09IHQxICYgMHhmZjsKKworCSpwbGl0 MiA9IHQyID4+IDg7CisJKytwbGl0MjsKKwliaXRzMiAtPSB0MiAmIDB4ZmY7CisKKwkqcGxpdDMg PSB0MyA+PiA4OworCSsrcGxpdDM7CisJYml0czMgLT0gdDMgJiAweGZmOworCisJKytpOworICAg ICAgfQorICB9CisKKyAgcmV0dXJuIDE7Cit9CisKKy8qIFRoZSBpbmZvcm1hdGlvbiB1c2VkIHRv IGRlY29tcHJlc3MgYSBzZXF1ZW5jZSBjb2RlLCB3aGljaCBjYW4gYmUgYSBsaXRlcmFsCisgICBs ZW5ndGgsIGFuIG9mZnNldCwgb3IgYSBtYXRjaCBsZW5ndGguICAqLworCitzdHJ1Y3QgZWxmX3pz dGRfc2VxX2RlY29kZQoreworICBjb25zdCBzdHJ1Y3QgZWxmX3pzdGRfZnNlX2Jhc2VsaW5lX2Vu dHJ5ICp0YWJsZTsKKyAgaW50IHRhYmxlX2JpdHM7Cit9OworCisvKiBVbnBhY2sgYSBzZXF1ZW5j ZSBjb2RlIGNvbXByZXNzaW9uIG1vZGUuICAqLwogCi0gICAgICBpZiAodW5saWtlbHkgKGJpdHMg PCBodWZmbWFuX3RhYmxlX2JpdHMpKQorc3RhdGljIGludAorZWxmX3pzdGRfdW5wYWNrX3NlcV9k ZWNvZGUgKGludCBtb2RlLAorCQkJICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKipwcGluLAorCQkJ ICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnBpbmVuZCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZWxm X3pzdGRfZnNlX2Jhc2VsaW5lX2VudHJ5ICpwcmVkZWYsCisJCQkgICAgaW50IHByZWRlZl9iaXRz LAorCQkJICAgIHVpbnQxNl90ICpzY3JhdGNoLAorCQkJICAgIGludCBtYXhpZHgsCisJCQkgICAg c3RydWN0IGVsZl96c3RkX2ZzZV9iYXNlbGluZV9lbnRyeSAqdGFibGUsCisJCQkgICAgaW50IHRh YmxlX2JpdHMsCisJCQkgICAgaW50ICgqY29udikoY29uc3Qgc3RydWN0IGVsZl96c3RkX2ZzZV9l bnRyeSAqLAorCQkJCQlpbnQsCisJCQkJCXN0cnVjdCBlbGZfenN0ZF9mc2VfYmFzZWxpbmVfZW50 cnkgKiksCisJCQkgICAgc3RydWN0IGVsZl96c3RkX3NlcV9kZWNvZGUgKmRlY29kZSkKK3sKKyAg c3dpdGNoIChtb2RlKQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICBkZWNvZGUtPnRhYmxlID0g cHJlZGVmOworICAgICAgZGVjb2RlLT50YWJsZV9iaXRzID0gcHJlZGVmX2JpdHM7CisgICAgICBi cmVhazsKKworICAgIGNhc2UgMToKKyAgICAgIHsKKwlzdHJ1Y3QgZWxmX3pzdGRfZnNlX2VudHJ5 IGVudHJ5OworCisJaWYgKHVubGlrZWx5ICgqcHBpbiA+PSBwaW5lbmQpKQorCSAgeworCSAgICBl bGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisJICAgIHJldHVybiAwOworCSAgfQorCWVudHJ5LnN5 bWJvbCA9ICoqcHBpbjsKKwkrKypwcGluOworCWVudHJ5LmJpdHMgPSAwOworCWVudHJ5LmJhc2Ug PSAwOworCWRlY29kZS0+dGFibGVfYml0cyA9IDA7CisJaWYgKCFjb252ICgmZW50cnksIDAsIHRh YmxlKSkKKwkgIHJldHVybiAwOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDI6 CisgICAgICB7CisJc3RydWN0IGVsZl96c3RkX2ZzZV9lbnRyeSAqZnNlX3RhYmxlOworCisJLyog V2UgdXNlIHRoZSBzYW1lIHNwYWNlIGZvciB0aGUgc2ltcGxlIEZTRSB0YWJsZSBhbmQgdGhlIGJh c2VsaW5lCisJICAgdGFibGUuICAqLworCWZzZV90YWJsZSA9IChzdHJ1Y3QgZWxmX3pzdGRfZnNl X2VudHJ5ICopdGFibGU7CisJZGVjb2RlLT50YWJsZV9iaXRzID0gdGFibGVfYml0czsKKwlpZiAo IWVsZl96c3RkX3JlYWRfZnNlIChwcGluLCBwaW5lbmQsIHNjcmF0Y2gsIG1heGlkeCwgZnNlX3Rh YmxlLAorCQkJCSZkZWNvZGUtPnRhYmxlX2JpdHMpKQorCSAgcmV0dXJuIDA7CisJaWYgKCFjb252 IChmc2VfdGFibGUsIGRlY29kZS0+dGFibGVfYml0cywgdGFibGUpKQorCSAgcmV0dXJuIDA7CisJ ZGVjb2RlLT50YWJsZSA9IHRhYmxlOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNl IDM6CisgICAgICBpZiAodW5saWtlbHkgKGRlY29kZS0+dGFibGVfYml0cyA9PSAtMSkpCiAJewot CSAgdCA9IGh1ZmZtYW5fdGFibGVbKHZhbCA8PCAoaHVmZm1hbl90YWJsZV9iaXRzIC0gYml0cykp Ci0JCQkgICAgJiBodWZmbWFuX21hc2tdOwotCSAgaWYgKHVubGlrZWx5IChiaXRzIDwgKHQgJiAw eGZmKSkpCi0JICAgIHsKLQkgICAgICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7Ci0JICAgICAg cmV0dXJuIDA7Ci0JICAgIH0KKwkgIGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKKwkgIHJldHVy biAwOwogCX0KLSAgICAgIGVsc2UKLQl0ID0gaHVmZm1hbl90YWJsZVsodmFsID4+IChiaXRzIC0g aHVmZm1hbl90YWJsZV9iaXRzKSkgJiBodWZmbWFuX21hc2tdOwotCi0gICAgICAqcG91dCA9IHQg Pj4gODsKLSAgICAgICsrcG91dDsKKyAgICAgIGJyZWFrOwogCi0gICAgICBiaXRzIC09IHQgJiAw eGZmOworICAgIGRlZmF1bHQ6CisgICAgICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7CisgICAg ICByZXR1cm4gMDsKICAgICB9CiAKLSAgbGl0ZXJhbHMtPnBiYWNrID0gcGJhY2s7Ci0gIGxpdGVy YWxzLT5wYmFja2VuZCA9IHBiYWNrZW5kOwotICBsaXRlcmFscy0+dmFsID0gdmFsOwotICBsaXRl cmFscy0+Yml0cyA9IGJpdHM7Ci0KICAgcmV0dXJuIDE7CiB9CiAKQEAgLTQyNTAsMTYgKzQ1NTgs OSBAQCBlbGZfenN0ZF9kZWNvbXByZXNzIChjb25zdCB1bnNpZ25lZCBjaGFyICpwaW4sIHNpemVf dCBzaW4sCiAJY2FzZSAyOgogCSAgewogCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwYmxvY2tl bmQ7Ci0JICAgIHN0cnVjdCBlbGZfenN0ZF9saXRlcmFscyBsaXRlcmFsczsKLQkgICAgdW5zaWdu ZWQgY2hhciBsaXRfaGRyOwotCSAgICB1aW50MzJfdCBsaXRfc2VjdGlvbl9jb250ZW50OwotCSAg ICB1aW50MzJfdCBsaXRfY29tcHJlc3NlZF9zaXplOwotCSAgICB1aW50MzJfdCBsaXRfdG90YWxf c3RyZWFtc19zaXplOwotCSAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpwbGl0ZW5kOwotCSAgICB1 bnNpZ25lZCBjaGFyICpwbGl0ZXhwOwotCSAgICBzaXplX3QgbGl0ZXhwX2NvdW50OwotCSAgICBp bnQgbGl0X3N0cmVhbXM7Ci0JICAgIHVpbnQzMl90IHN0cmVhbV9zaXplXzE7CisJICAgIHVuc2ln bmVkIGNoYXIgKnBsaXRzdGFjazsKKwkgICAgdW5zaWduZWQgY2hhciAqcGxpdDsKKwkgICAgdWlu dDMyX3QgbGl0ZXJhbF9jb3VudDsKIAkgICAgdW5zaWduZWQgY2hhciBzZXFfaGRyOwogCSAgICBz aXplX3Qgc2VxX2NvdW50OwogCSAgICBzaXplX3Qgc2VxOwpAQCAtNDI2OSw3ICs0NTcwLDYgQEAg ZWxmX3pzdGRfZGVjb21wcmVzcyAoY29uc3QgdW5zaWduZWQgY2hhciAqcGluLCBzaXplX3Qgc2lu LAogCSAgICB1bnNpZ25lZCBpbnQgbGl0ZXJhbF9zdGF0ZTsKIAkgICAgdW5zaWduZWQgaW50IG9m ZnNldF9zdGF0ZTsKIAkgICAgdW5zaWduZWQgaW50IG1hdGNoX3N0YXRlOwotCSAgICB1bnNpZ25l ZCBjaGFyIHN0cmVhbV9zdGFydDsKIAogCSAgICAvKiBDb21wcmVzc2VkX0Jsb2NrICovCiAJICAg IGlmICh1bmxpa2VseSAoKHNpemVfdCkgYmxvY2tfc2l6ZSA+IChzaXplX3QpIChwaW5lbmQgLSBw aW4pKSkKQEAgLTQyODAsMjQ4ICs0NTgwLDE2IEBAIGVsZl96c3RkX2RlY29tcHJlc3MgKGNvbnN0 IHVuc2lnbmVkIGNoYXIgKnBpbiwgc2l6ZV90IHNpbiwKIAogCSAgICBwYmxvY2tlbmQgPSBwaW4g KyBibG9ja19zaXplOwogCi0JICAgIGlmICh1bmxpa2VseSAocGluID49IHBpbmVuZCkpCi0JICAg ICAgewotCQllbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7Ci0JCXJldHVybiAwOwotCSAgICAgIH0K LQkgICAgbGl0X2hkciA9ICpwaW47Ci0JICAgICsrcGluOwotCi0JICAgIGlmICgobGl0X2hkciAm IDMpID09IDAgfHwgKGxpdF9oZHIgJiAzKSA9PSAxKQotCSAgICAgIHsKLQkJaWYgKChsaXRfaGRy ICYgMykgPT0gMCkKLQkJICBsaXRlcmFscy50eXBlID0gWlNURF9MSVRfUkFXOwotCQllbHNlCi0J CSAgbGl0ZXJhbHMudHlwZSA9IFpTVERfTElUX1JMRTsKLQotCQkvKiBSYXdfbGl0ZXJhbHNfQmxv Y2sgb3IgUkxFX0xpdGVyYWxzX0Jsb2NrICovCi0JCXN3aXRjaCAoKGxpdF9oZHIgPj4gMikgJiAz KQotCQkgIHsKLQkJICBjYXNlIDA6IGNhc2UgMjoKLQkJICAgIGxpdGVyYWxzLnJlZ2VuZXJhdGVk X3NpemUgPSBsaXRfaGRyID4+IDM7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIDE6Ci0JCSAgICBp ZiAodW5saWtlbHkgKHBpbiA+PSBwaW5lbmQpKQotCQkgICAgICB7Ci0JCQllbGZfdW5jb21wcmVz c19mYWlsZWQgKCk7Ci0JCQlyZXR1cm4gMDsKLQkJICAgICAgfQotCQkgICAgbGl0ZXJhbHMucmVn ZW5lcmF0ZWRfc2l6ZSA9IChsaXRfaGRyID4+IDQpICsgKCgqcGluKSA8PCA0KTsKLQkJICAgIHBp bisrOwotCQkgICAgYnJlYWs7Ci0JCSAgY2FzZSAzOgotCQkgICAgaWYgKHVubGlrZWx5IChwaW4g KyAxID49IHBpbmVuZCkpCi0JCSAgICAgIHsKLQkJCWVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsK LQkJCXJldHVybiAwOwotCQkgICAgICB9Ci0JCSAgICBsaXRlcmFscy5yZWdlbmVyYXRlZF9zaXpl ID0gKChsaXRfaGRyID4+IDQpCi0JCQkJCQkgKyAoKnBpbiA8PCA0KQotCQkJCQkJICsgKHBpblsx XSA8PCAxMikpOwotCQkgICAgcGluICs9IDI7Ci0JCSAgICBicmVhazsKLQkJICBkZWZhdWx0Ogot CQkgICAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOwotCQkgICAgcmV0dXJuIDA7Ci0JCSAgfQot CQlpZiAobGl0ZXJhbHMudHlwZSA9PSBaU1REX0xJVF9SQVcpCi0JCSAgbGl0X3NlY3Rpb25fY29u dGVudCA9IGxpdGVyYWxzLnJlZ2VuZXJhdGVkX3NpemU7Ci0JCWVsc2UKLQkJICBsaXRfc2VjdGlv bl9jb250ZW50ID0gMTsKLQkJbGl0X2NvbXByZXNzZWRfc2l6ZSA9IDA7Ci0JCWxpdF9zdHJlYW1z ID0gMTsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkgICAgICB7Ci0JCS8qIENvbXByZXNzZWRfTGl0 ZXJhbHNfQmxvY2sgb3IgVHJlZWxlc3NfTGl0ZXJhbHNfQmxvY2sgKi8KLQkJbGl0ZXJhbHMudHlw ZSA9IFpTVERfTElUX0hVRkY7Ci0JCXN3aXRjaCAoKGxpdF9oZHIgPj4gMikgJiAzKQotCQkgIHsK LQkJICBjYXNlIDA6IGNhc2UgMToKLQkJICAgIGlmICh1bmxpa2VseSAocGluICsgMSA+PSBwaW5l bmQpKQotCQkgICAgICB7Ci0JCQllbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7Ci0JCQlyZXR1cm4g MDsKLQkJICAgICAgfQotCQkgICAgbGl0ZXJhbHMucmVnZW5lcmF0ZWRfc2l6ZSA9ICgobGl0X2hk ciA+PiA0KQotCQkJCQkJIHwgKCgqcGluICYgMHgzZikgPDwgNCkpOwotCQkgICAgbGl0X2NvbXBy ZXNzZWRfc2l6ZSA9ICgoKnBpbiA+PiA2KQotCQkJCQkgICB8IChwaW5bMV0gPDwgMikpOwotCQkg ICAgcGluICs9IDI7Ci0JCSAgICBsaXRfc3RyZWFtcyA9ICgobGl0X2hkciA+PiAyKSAmIDMpID09 IDAgPyAxIDogNDsKLQkJICAgIGJyZWFrOwotCQkgIGNhc2UgMjoKLQkJICAgIGlmICh1bmxpa2Vs eSAocGluICsgMiA+PSBwaW5lbmQpKQotCQkgICAgICB7Ci0JCQllbGZfdW5jb21wcmVzc19mYWls ZWQgKCk7Ci0JCQlyZXR1cm4gMDsKLQkJICAgICAgfQotCQkgICAgbGl0ZXJhbHMucmVnZW5lcmF0 ZWRfc2l6ZSA9ICgobGl0X2hkciA+PiA0KQotCQkJCQkJIHwgKCpwaW4gPDwgNCkKLQkJCQkJCSB8 ICgocGluWzFdICYgMykgPDwgMTIpKTsKLQkJICAgIGxpdF9jb21wcmVzc2VkX3NpemUgPSAoKHBp blsxXSA+PiAyKQotCQkJCQkgICB8IChwaW5bMl0gPDwgNikpOwotCQkgICAgcGluICs9IDM7Ci0J CSAgICBsaXRfc3RyZWFtcyA9IDQ7Ci0JCSAgICBicmVhazsKLQkJICBjYXNlIDM6Ci0JCSAgICBp ZiAodW5saWtlbHkgKHBpbiArIDMgPj0gcGluZW5kKSkKLQkJICAgICAgewotCQkJZWxmX3VuY29t cHJlc3NfZmFpbGVkICgpOwotCQkJcmV0dXJuIDA7Ci0JCSAgICAgIH0KLQkJICAgIGxpdGVyYWxz LnJlZ2VuZXJhdGVkX3NpemUgPSAoKGxpdF9oZHIgPj4gNCkKLQkJCQkJCSB8ICgqcGluIDw8IDQp Ci0JCQkJCQkgfCAoKHBpblsxXSAmIDB4M2YpIDw8IDEyKSk7Ci0JCSAgICBsaXRfY29tcHJlc3Nl ZF9zaXplID0gKChwaW5bMV0gPj4gNikKLQkJCQkJICAgfCAocGluWzJdIDw8IDIpCi0JCQkJCSAg IHwgKHBpblszXSA8PCAxMCkpOwotCQkgICAgcGluICs9IDQ7Ci0JCSAgICBsaXRfc3RyZWFtcyA9 IDQ7Ci0JCSAgICBicmVhazsKLQkJICBkZWZhdWx0OgotCQkgICAgZWxmX3VuY29tcHJlc3NfZmFp bGVkICgpOwotCQkgICAgcmV0dXJuIDA7Ci0JCSAgfQotCi0JCWxpdF9zZWN0aW9uX2NvbnRlbnQg PSBsaXRfY29tcHJlc3NlZF9zaXplOwotCSAgICAgIH0KLQotCSAgICBpZiAodW5saWtlbHkgKChz aXplX3QpbGl0X3NlY3Rpb25fY29udGVudCA+IChzaXplX3QpKHBpbmVuZCAtIHBpbikpKQotCSAg ICAgIHsKLQkJZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOwotCQlyZXR1cm4gMDsKLQkgICAgICB9 Ci0JICAgIHBsaXRlbmQgPSBwaW4gKyBsaXRfc2VjdGlvbl9jb250ZW50OwotCi0JICAgIGxpdF90 b3RhbF9zdHJlYW1zX3NpemUgPSBsaXRfY29tcHJlc3NlZF9zaXplOwotCSAgICBpZiAoKGxpdF9o ZHIgJiAzKSA9PSAyKQotCSAgICAgIHsKLQkJLyogQ29tcHJlc3NlZF9MaXRlcmFsc19CbG9jay4g IFJlYWQgSHVmZm1hbiB0cmVlLiAgKi8KLQotCQljb25zdCB1bnNpZ25lZCBjaGFyICpwdGFibGU7 Ci0KLQkJcHRhYmxlID0gcGluOwotCQlpZiAoIWVsZl96c3RkX3JlYWRfaHVmZiAoJnB0YWJsZSwg cGluZW5kLCBzY3JhdGNoLAotCQkJCQkgaHVmZm1hbl90YWJsZSwgJmh1ZmZtYW5fdGFibGVfYml0 cykpCi0JCSAgcmV0dXJuIDA7Ci0JCWxpdGVyYWxzLmh1ZmZtYW5fdGFibGUgPSBodWZmbWFuX3Rh YmxlOwotCQlsaXRlcmFscy5odWZmbWFuX3RhYmxlX2JpdHMgPSBodWZmbWFuX3RhYmxlX2JpdHM7 Ci0KLQkJbGl0X3RvdGFsX3N0cmVhbXNfc2l6ZSAtPSBwdGFibGUgLSBwaW47Ci0JCXBpbiA9IHB0 YWJsZTsKLQkgICAgICB9Ci0JICAgIGVsc2UgaWYgKChsaXRfaGRyICYgMykgPT0gMykKLQkgICAg ICB7Ci0JCS8qIFRyZWVsZXNzX0xpdGVyYWxzX0Jsb2NrLiAgUmV1c2UgcHJldmlvdXMgSHVmZm1h biB0cmVlLiAgKi8KLQkJaWYgKGh1ZmZtYW5fdGFibGVfYml0cyA9PSAwKQotCQkgIHsKLQkJICAg IGVsZl91bmNvbXByZXNzX2ZhaWxlZCAoKTsKLQkJICAgIHJldHVybiAwOwotCQkgIH0KLQkJbGl0 ZXJhbHMuaHVmZm1hbl90YWJsZSA9IGh1ZmZtYW5fdGFibGU7Ci0JCWxpdGVyYWxzLmh1ZmZtYW5f dGFibGVfYml0cyA9IGh1ZmZtYW5fdGFibGVfYml0czsKLQkgICAgICB9Ci0JICAgIGVsc2UKLQkg ICAgICB7Ci0JCWxpdGVyYWxzLmh1ZmZtYW5fdGFibGUgPSBOVUxMOwotCQlsaXRlcmFscy5odWZm bWFuX3RhYmxlX2JpdHMgPSAwOwotCSAgICAgIH0KKwkgICAgLyogUmVhZCB0aGUgbGl0ZXJhbHMg aW50byB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgc3BhY2UsIGFuZCBsZWF2ZQorCSAgICAgICBQTElU IHBvaW50aW5nIGF0IHRoZW0uICAqLwogCi0JICAgIGlmIChsaXRfc3RyZWFtcyA9PSAxKQotCSAg ICAgIHsKLQkJc3RyZWFtX3NpemVfMSA9IGJsb2NrX3NpemU7Ci0JCWxpdGVyYWxzLnN0cmVhbV9v ZmZbMF0gPSAwOwotCQlsaXRlcmFscy5zdHJlYW1fb2ZmWzFdID0gMDsKLQkJbGl0ZXJhbHMuc3Ry ZWFtX29mZlsyXSA9IDA7Ci0JCWxpdGVyYWxzLnN0cmVhbV9zaXplWzBdID0gMDsKLQkJbGl0ZXJh bHMuc3RyZWFtX3NpemVbMV0gPSAwOwotCQlsaXRlcmFscy5zdHJlYW1fc2l6ZVsyXSA9IDA7Ci0J ICAgICAgfQotCSAgICBlbHNlCi0JICAgICAgewotCQl1aW50MzJfdCB0b3Q7Ci0KLQkJLyogUmVh ZCBqdW1wIHRhYmxlLiAgKi8KLQkJaWYgKHVubGlrZWx5IChwaW4gKyA1ID49IHBpbmVuZCkpCi0J CSAgewotCQkgICAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOwotCQkgICAgcmV0dXJuIDA7Ci0J CSAgfQotCQlzdHJlYW1fc2l6ZV8xID0gKnBpbiB8IChwaW5bMV0gPDwgOCk7Ci0JCXBpbiArPSAy OwotCQlsaXRlcmFscy5zdHJlYW1fc2l6ZVswXSA9ICpwaW4gfCAocGluWzFdIDw8IDgpOwotCQlw aW4gKz0gMjsKLQkJbGl0ZXJhbHMuc3RyZWFtX3NpemVbMV0gPSAqcGluIHwgKHBpblsxXSA8PCA4 KTsKLQkJcGluICs9IDI7Ci0JCXRvdCA9IChzdHJlYW1fc2l6ZV8xCi0JCSAgICAgICArIGxpdGVy YWxzLnN0cmVhbV9zaXplWzBdCi0JCSAgICAgICArIGxpdGVyYWxzLnN0cmVhbV9zaXplWzFdKTsK LQkJaWYgKHVubGlrZWx5ICh0b3QgPiBsaXRfdG90YWxfc3RyZWFtc19zaXplIC0gNikpCi0JCSAg ewotCQkgICAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOwotCQkgICAgcmV0dXJuIDA7Ci0JCSAg fQotCQlsaXRlcmFscy5zdHJlYW1fc2l6ZVsyXSA9IGxpdF90b3RhbF9zdHJlYW1zX3NpemUgLSA2 IC0gdG90OwotCi0JCWxpdGVyYWxzLnN0cmVhbV9vZmZbMF0gPSBzdHJlYW1fc2l6ZV8xOwotCQls aXRlcmFscy5zdHJlYW1fb2ZmWzFdID0gKGxpdGVyYWxzLnN0cmVhbV9vZmZbMF0KLQkJCQkJICAr IGxpdGVyYWxzLnN0cmVhbV9zaXplWzBdKTsKLQkJbGl0ZXJhbHMuc3RyZWFtX29mZlsyXSA9IChs aXRlcmFscy5zdHJlYW1fb2ZmWzFdCi0JCQkJCSAgKyBsaXRlcmFscy5zdHJlYW1fc2l6ZVsxXSk7 Ci0JICAgICAgfQotCi0JICAgIGxpdGVyYWxzLnBsaXQgPSBwaW47Ci0KLQkgICAgaWYgKGxpdGVy YWxzLnR5cGUgPT0gWlNURF9MSVRfSFVGRikKLQkgICAgICB7Ci0JCWNvbnN0IHVuc2lnbmVkIGNo YXIgKnBsYmFjazsKLQotCQkvKiBTZXQgdXAgdGhlIGZpcnN0IGh1ZmZtYW4gc3RyZWFtLiAgKi8K LQotCQlsaXRlcmFscy5wYmFja2VuZCA9IGxpdGVyYWxzLnBsaXQ7Ci0JCXBsYmFjayA9IGxpdGVy YWxzLnBsaXQgKyBzdHJlYW1fc2l6ZV8xOwotCQlsaXRlcmFscy52YWwgPSAwOwotCQlsaXRlcmFs cy5iaXRzID0gMDsKLQkJLS1wbGJhY2s7Ci0JCXN0cmVhbV9zdGFydCA9ICpwbGJhY2s7Ci0JCWlm ICh1bmxpa2VseSAoc3RyZWFtX3N0YXJ0ID09IDApKQotCQkgIHsKLQkJICAgIGVsZl91bmNvbXBy ZXNzX2ZhaWxlZCAoKTsKLQkJICAgIHJldHVybiAwOwotCQkgIH0KLQkJd2hpbGUgKCgoKHVpbnRw dHJfdCkgcGxiYWNrKSAmIDMpICE9IDApCi0JCSAgewotCQkgICAgbGl0ZXJhbHMudmFsIDw8PSA4 OwotCQkgICAgbGl0ZXJhbHMudmFsIHw9ICh1aW50NjRfdCkqcGxiYWNrOwotCQkgICAgbGl0ZXJh bHMuYml0cyArPSA4OwotCQkgICAgLS1wbGJhY2s7Ci0JCSAgfQotCQlsaXRlcmFscy52YWwgPDw9 IDg7Ci0JCWxpdGVyYWxzLnZhbCB8PSAodWludDY0X3QpKnBsYmFjazsKLQkJbGl0ZXJhbHMuYml0 cyArPSA4OwotCi0JCWlmICghZWxmX2ZldGNoX2JpdHNfYmFja3dhcmQgKCZwbGJhY2ssIGxpdGVy YWxzLnBiYWNrZW5kLAotCQkJCQkgICAgICAmbGl0ZXJhbHMudmFsLCAmbGl0ZXJhbHMuYml0cykp Ci0JCSAgcmV0dXJuIDA7Ci0KLQkJbGl0ZXJhbHMuYml0cyAtPSBfX2J1aWx0aW5fY2x6IChzdHJl YW1fc3RhcnQpIC0gMjQgKyAxOwotCi0JCWxpdGVyYWxzLnBiYWNrID0gcGxiYWNrOwotCSAgICAg IH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJbGl0ZXJhbHMudmFsID0gMDsKLQkJbGl0ZXJhbHMu Yml0cyA9IDA7Ci0JCWxpdGVyYWxzLnBiYWNrID0gTlVMTDsKLQkJbGl0ZXJhbHMucGJhY2tlbmQg PSBOVUxMOwotCSAgICAgIH0KLQotCSAgICAvKiBXZSBoYXZlIHJlYWQgYWxsIHRoZSBsaXRlcmFs IGhlYWRlciBpbmZvcm1hdGlvbi4gIFRoZSBsaXRlcmFsCi0JICAgICAgIGRhdGEgc3RhcnRzIGF0 IExJVEVSQUxTLlBMSVQuICBTa2lwIGFoZWFkIHRvIHRoZSBzZXF1ZW5jZXMuICAqLwotCi0JICAg IHBpbiA9IHBsaXRlbmQ7CisJICAgIGlmICghZWxmX3pzdGRfcmVhZF9saXRlcmFscyAoJnBpbiwg cGJsb2NrZW5kLCBwb3V0LCBwb3V0ZW5kLAorCQkJCQkgc2NyYXRjaCwgaHVmZm1hbl90YWJsZSwK KwkJCQkJICZodWZmbWFuX3RhYmxlX2JpdHMsCisJCQkJCSAmcGxpdHN0YWNrKSkKKwkgICAgICBy ZXR1cm4gMDsKKwkgICAgcGxpdCA9IHBsaXRzdGFjazsKKwkgICAgbGl0ZXJhbF9jb3VudCA9IHBv dXRlbmQgLSBwbGl0OwogCiAJICAgIHNlcV9oZHIgPSAqcGluOwogCSAgICBwaW4rKzsKQEAgLTQ1 ODksNTMgKzQ2NTcsMTAgQEAgZWxmX3pzdGRfZGVjb21wcmVzcyAoY29uc3QgdW5zaWduZWQgY2hh ciAqcGluLCBzaXplX3Qgc2luLAogCQkgIHJldHVybiAwOwogCSAgICAgIH0KIAotCSAgICAvKiBF eHBhbmQgMjA0OCBieXRlcyBvZiBsaXRlcmFscy4gIFRoZSBleHBhbmRlZCBsaXRlcmFscyBhcmUK LQkgICAgICAgcmVjb3JkZWQgaW4gUExJVEVYUCBhbmQgTElURVhQX0NPVU5ULiAgKi8KLQotCSAg ICBpZiAobGl0ZXJhbHMudHlwZSAhPSBaU1REX0xJVF9IVUZGCi0JCXx8IGxpdGVyYWxzLnJlZ2Vu ZXJhdGVkX3NpemUgPT0gMCkKLQkgICAgICB7Ci0JCXBsaXRleHAgPSBOVUxMOwotCQlsaXRleHBf Y291bnQgPSAwOwotCSAgICAgIH0KLQkgICAgZWxzZQotCSAgICAgIHsKLQkJcGxpdGV4cCA9ICh1 bnNpZ25lZCBjaGFyICopc2NyYXRjaDsKLQkJbGl0ZXhwX2NvdW50ID0gWlNURF9UQUJMRV9XT1JL X0xJVF9TSVpFOwotCQlpZiAobGl0ZXhwX2NvdW50ID4gbGl0ZXJhbHMucmVnZW5lcmF0ZWRfc2l6 ZSkKLQkJICBsaXRleHBfY291bnQgPSBsaXRlcmFscy5yZWdlbmVyYXRlZF9zaXplOwotCQlpZiAo IWVsZl96c3RkX2xpdGVyYWxfb3V0cHV0ICgmbGl0ZXJhbHMsIGxpdGV4cF9jb3VudCwKLQkJCQkJ ICAgICAgcGxpdGV4cCkpCi0JCSAgcmV0dXJuIDA7Ci0JICAgICAgfQotCiAJICAgIHBiYWNrID0g cGJsb2NrZW5kIC0gMTsKLQkgICAgdmFsID0gMDsKLQkgICAgYml0cyA9IDA7Ci0JICAgIHN0cmVh bV9zdGFydCA9ICpwYmFjazsKLQkgICAgaWYgKHVubGlrZWx5IChzdHJlYW1fc3RhcnQgPT0gMCkp Ci0JICAgICAgewotCQllbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7Ci0JCXJldHVybiAwOwotCSAg ICAgIH0KLQkgICAgd2hpbGUgKCgoKHVpbnRwdHJfdClwYmFjaykgJiAzKSAhPSAwKQotCSAgICAg IHsKLQkJdmFsIDw8PSA4OwotCQl2YWwgfD0gKHVpbnQ2NF90KSpwYmFjazsKLQkJYml0cyArPSA4 OwotCQktLXBiYWNrOwotCSAgICAgIH0KLQkgICAgdmFsIDw8PSA4OwotCSAgICB2YWwgfD0gKHVp bnQ2NF90KSpwYmFjazsKLQkgICAgYml0cyArPSA4OwotCi0JICAgIGlmICghZWxmX2ZldGNoX2Jp dHNfYmFja3dhcmQgKCZwYmFjaywgcGluLCAmdmFsLCAmYml0cykpCisJICAgIGlmICghZWxmX2Zl dGNoX2JhY2t3YXJkX2luaXQgKCZwYmFjaywgcGluLCAmdmFsLCAmYml0cykpCiAJICAgICAgcmV0 dXJuIDA7CiAKLQkgICAgYml0cyAtPSBfX2J1aWx0aW5fY2x6IChzdHJlYW1fc3RhcnQpIC0gMjQg KyAxOwotCi0JICAgIGlmICghZWxmX2ZldGNoX2JpdHNfYmFja3dhcmQgKCZwYmFjaywgcGluLCAm dmFsLCAmYml0cykpCi0JICAgICAgcmV0dXJuIDA7CiAJICAgIGJpdHMgLT0gbGl0ZXJhbF9kZWNv ZGUudGFibGVfYml0czsKIAkgICAgbGl0ZXJhbF9zdGF0ZSA9ICgodmFsID4+IGJpdHMpCiAJCQkg ICAgICYgKCgxVSA8PCBsaXRlcmFsX2RlY29kZS50YWJsZV9iaXRzKSAtIDEpKTsKQEAgLTQ4MDgs NjYgKzQ4MzMsNzEgQEAgZWxmX3pzdGRfZGVjb21wcmVzcyAoY29uc3QgdW5zaWduZWQgY2hhciAq cGluLCBzaXplX3Qgc2luLAogCiAJCS8qIFRoZSBuZXh0IHNlcXVlbmNlIGlzIG5vdyBpbiBMSVRF UkFMLCBPRkZTRVQsIE1BVENILiAgKi8KIAotCQlpZiAobGl0ZXJhbCA+IDApCisJCS8qIENvcHkg TElURVJBTCBieXRlcyBmcm9tIHRoZSBsaXRlcmFscy4gICovCisKKwkJaWYgKHVubGlrZWx5ICgo c2l6ZV90KShwb3V0ZW5kIC0gcG91dCkgPCBsaXRlcmFsKSkKIAkJICB7Ci0JCSAgICAvKiBDb3B5 IExJVEVSQUwgYnl0ZXMgZnJvbSB0aGUgbGl0ZXJhbHMuICAqLworCQkgICAgZWxmX3VuY29tcHJl c3NfZmFpbGVkICgpOworCQkgICAgcmV0dXJuIDA7CisJCSAgfQogCi0JCSAgICBpZiAodW5saWtl bHkgKChzaXplX3QpKHBvdXRlbmQgLSBwb3V0KSA8IGxpdGVyYWwpKQotCQkgICAgICB7Ci0JCQll bGZfdW5jb21wcmVzc19mYWlsZWQgKCk7Ci0JCQlyZXR1cm4gMDsKLQkJICAgICAgfQorCQlpZiAo dW5saWtlbHkgKGxpdGVyYWxfY291bnQgPCBsaXRlcmFsKSkKKwkJICB7CisJCSAgICBlbGZfdW5j b21wcmVzc19mYWlsZWQgKCk7CisJCSAgICByZXR1cm4gMDsKKwkJICB9CiAKLQkJICAgIGlmIChs aXRlcmFscy50eXBlICE9IFpTVERfTElUX0hVRkYpCi0JCSAgICAgIHsKLQkJCWlmICghZWxmX3pz dGRfbGl0ZXJhbF9vdXRwdXQgKCZsaXRlcmFscywgbGl0ZXJhbCwKLQkJCQkJCSAgICAgIHBvdXQp KQotCQkJICByZXR1cm4gMDsKLQkJCXBvdXQgKz0gbGl0ZXJhbDsKLQkJICAgICAgfQotCQkgICAg ZWxzZSBpZiAobGl0ZXJhbCA8PSBsaXRleHBfY291bnQpCi0JCSAgICAgIHsKLQkJCW1lbWNweSAo cG91dCwgcGxpdGV4cCwgbGl0ZXJhbCk7Ci0JCQlwbGl0ZXhwICs9IGxpdGVyYWw7Ci0JCQlsaXRl eHBfY291bnQgLT0gbGl0ZXJhbDsKLQkJCXBvdXQgKz0gbGl0ZXJhbDsKLQkJICAgICAgfQotCQkg ICAgZWxzZQotCQkgICAgICB7Ci0JCQltZW1jcHkgKHBvdXQsIHBsaXRleHAsIGxpdGV4cF9jb3Vu dCk7Ci0JCQlwb3V0ICs9IGxpdGV4cF9jb3VudDsKLQkJCWxpdGVyYWwgLT0gbGl0ZXhwX2NvdW50 OwotCQkJbGl0ZXhwX2NvdW50ID0gMDsKKwkJbGl0ZXJhbF9jb3VudCAtPSBsaXRlcmFsOwogCi0J CQlpZiAodW5saWtlbHkgKGxpdGVyYWwgPj0gWlNURF9UQUJMRV9XT1JLX0xJVF9TSVpFKSkKLQkJ CSAgewotCQkJICAgIGlmICghZWxmX3pzdGRfbGl0ZXJhbF9vdXRwdXQgKCZsaXRlcmFscywgbGl0 ZXJhbCwKLQkJCQkJCQkgIHBvdXQpKQotCQkJICAgICAgcmV0dXJuIDA7Ci0JCQkgICAgcG91dCAr PSBsaXRlcmFsOwotCQkJICAgIGxpdGVyYWwgPSAwOwotCQkJICB9CisJCS8qIE9mdGVuIExJVEVS QUwgaXMgc21hbGwsIHNvIGhhbmRsZSBzbWFsbCBjYXNlcyBxdWlja2x5LiAgKi8KKwkJc3dpdGNo IChsaXRlcmFsKQorCQkgIHsKKwkJICBjYXNlIDg6CisJCSAgICAqcG91dCsrID0gKnBsaXQrKzsK KwkJICAgIC8qIEZBTExUSFJPVUdIICovCisJCSAgY2FzZSA3OgorCQkgICAgKnBvdXQrKyA9ICpw bGl0Kys7CisJCSAgICAvKiBGQUxMVEhST1VHSCAqLworCQkgIGNhc2UgNjoKKwkJICAgICpwb3V0 KysgPSAqcGxpdCsrOworCQkgICAgLyogRkFMTFRIUk9VR0ggKi8KKwkJICBjYXNlIDU6CisJCSAg ICAqcG91dCsrID0gKnBsaXQrKzsKKwkJICAgIC8qIEZBTExUSFJPVUdIICovCisJCSAgY2FzZSA0 OgorCQkgICAgKnBvdXQrKyA9ICpwbGl0Kys7CisJCSAgICAvKiBGQUxMVEhST1VHSCAqLworCQkg IGNhc2UgMzoKKwkJICAgICpwb3V0KysgPSAqcGxpdCsrOworCQkgICAgLyogRkFMTFRIUk9VR0gg Ki8KKwkJICBjYXNlIDI6CisJCSAgICAqcG91dCsrID0gKnBsaXQrKzsKKwkJICAgIC8qIEZBTExU SFJPVUdIICovCisJCSAgY2FzZSAxOgorCQkgICAgKnBvdXQrKyA9ICpwbGl0Kys7CisJCSAgICBi cmVhazsKIAotCQkJcGxpdGV4cCA9ICh1bnNpZ25lZCBjaGFyICopc2NyYXRjaDsKLQkJCWxpdGV4 cF9jb3VudCA9IFpTVERfVEFCTEVfV09SS19MSVRfU0laRTsKLQkJCWlmIChsaXRleHBfY291bnQg PiBsaXRlcmFscy5yZWdlbmVyYXRlZF9zaXplKQotCQkJICBsaXRleHBfY291bnQgPSBsaXRlcmFs cy5yZWdlbmVyYXRlZF9zaXplOwotCQkJaWYgKCFlbGZfenN0ZF9saXRlcmFsX291dHB1dCAoJmxp dGVyYWxzLAotCQkJCQkJICAgICAgbGl0ZXhwX2NvdW50LAotCQkJCQkJICAgICAgcGxpdGV4cCkp Ci0JCQkgIHJldHVybiAwOworCQkgIGNhc2UgMDoKKwkJICAgIGJyZWFrOwogCi0JCQlpZiAodW5s aWtlbHkgKGxpdGVyYWwgPiBsaXRleHBfY291bnQpKQorCQkgIGRlZmF1bHQ6CisJCSAgICBpZiAo dW5saWtlbHkgKChzaXplX3QpKHBsaXQgLSBwb3V0KSA8IGxpdGVyYWwpKQorCQkgICAgICB7CisJ CQl1aW50MzJfdCBtb3ZlOworCisJCQltb3ZlID0gcGxpdCAtIHBvdXQ7CisJCQl3aGlsZSAobGl0 ZXJhbCA+IG1vdmUpCiAJCQkgIHsKLQkJCSAgICBlbGZfdW5jb21wcmVzc19mYWlsZWQgKCk7Ci0J CQkgICAgcmV0dXJuIDA7CisJCQkgICAgbWVtY3B5IChwb3V0LCBwbGl0LCBtb3ZlKTsKKwkJCSAg ICBwb3V0ICs9IG1vdmU7CisJCQkgICAgcGxpdCArPSBtb3ZlOworCQkJICAgIGxpdGVyYWwgLT0g bW92ZTsKIAkJCSAgfQotCi0JCQltZW1jcHkgKHBvdXQsIHBsaXRleHAsIGxpdGVyYWwpOwotCQkJ cGxpdGV4cCArPSBsaXRlcmFsOwotCQkJbGl0ZXhwX2NvdW50IC09IGxpdGVyYWw7Ci0JCQlwb3V0 ICs9IGxpdGVyYWw7CiAJCSAgICAgIH0KKworCQkgICAgbWVtY3B5IChwb3V0LCBwbGl0LCBsaXRl cmFsKTsKKwkJICAgIHBvdXQgKz0gbGl0ZXJhbDsKKwkJICAgIHBsaXQgKz0gbGl0ZXJhbDsKIAkJ ICB9CiAKIAkJaWYgKG1hdGNoID4gMCkKQEAgLTQ5MDcsMzQgKzQ5MzcsMzUgQEAgZWxmX3pzdGRf ZGVjb21wcmVzcyAoY29uc3QgdW5zaWduZWQgY2hhciAqcGluLCBzaXplX3Qgc2luLAogCiAJCWlm ICh1bmxpa2VseSAoc2VxID49IHNlcV9jb3VudCkpCiAJCSAgewotCQkgICAgc2l6ZV90IGNvcHk7 Ci0KIAkJICAgIC8qIENvcHkgcmVtYWluaW5nIGxpdGVyYWxzLiAgKi8KLQkJICAgIGlmIChsaXRl eHBfY291bnQgPiAwKQorCQkgICAgaWYgKGxpdGVyYWxfY291bnQgPiAwICYmIHBsaXQgIT0gcG91 dCkKIAkJICAgICAgewotCQkJaWYgKHVubGlrZWx5ICgoc2l6ZV90KShwb3V0ZW5kIC0gcG91dCkg PCBsaXRleHBfY291bnQpKQorCQkJaWYgKHVubGlrZWx5ICgoc2l6ZV90KShwb3V0ZW5kIC0gcG91 dCkKKwkJCQkgICAgICA8IGxpdGVyYWxfY291bnQpKQogCQkJICB7CiAJCQkgICAgZWxmX3VuY29t cHJlc3NfZmFpbGVkICgpOwogCQkJICAgIHJldHVybiAwOwogCQkJICB9Ci0JCQltZW1jcHkgKHBv dXQsIHBsaXRleHAsIGxpdGV4cF9jb3VudCk7Ci0JCQlwb3V0ICs9IGxpdGV4cF9jb3VudDsKLQkJ ICAgICAgfQotCQkgICAgY29weSA9IGxpdGVyYWxzLnJlZ2VuZXJhdGVkX3NpemU7Ci0JCSAgICBp ZiAoY29weSA+IDApCi0JCSAgICAgIHsKLQkJCWlmICh1bmxpa2VseSAoKHNpemVfdCkocG91dGVu ZCAtIHBvdXQpIDwgY29weSkpCisKKwkJCWlmICgoc2l6ZV90KShwbGl0IC0gcG91dCkgPCBsaXRl cmFsX2NvdW50KQogCQkJICB7Ci0JCQkgICAgZWxmX3VuY29tcHJlc3NfZmFpbGVkICgpOwotCQkJ ICAgIHJldHVybiAwOworCQkJICAgIHVpbnQzMl90IG1vdmU7CisKKwkJCSAgICBtb3ZlID0gcGxp dCAtIHBvdXQ7CisJCQkgICAgd2hpbGUgKGxpdGVyYWxfY291bnQgPiBtb3ZlKQorCQkJICAgICAg eworCQkJCW1lbWNweSAocG91dCwgcGxpdCwgbW92ZSk7CisJCQkJcG91dCArPSBtb3ZlOworCQkJ CXBsaXQgKz0gbW92ZTsKKwkJCQlsaXRlcmFsX2NvdW50IC09IG1vdmU7CisJCQkgICAgICB9CiAJ CQkgIH0KIAotCQkJaWYgKCFlbGZfenN0ZF9saXRlcmFsX291dHB1dCAoJmxpdGVyYWxzLCBjb3B5 LCBwb3V0KSkKLQkJCSAgcmV0dXJuIDA7Ci0KLQkJCXBvdXQgKz0gY29weTsKKwkJCW1lbWNweSAo cG91dCwgcGxpdCwgbGl0ZXJhbF9jb3VudCk7CiAJCSAgICAgIH0KIAorCQkgICAgcG91dCArPSBs aXRlcmFsX2NvdW50OworCiAJCSAgICBicmVhazsKIAkJICB9CiAJICAgICAgfQo= --000000000000e4ec2605effd205a--