From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=sifive.com header.i=@sifive.com header.b="HDsTZeFH" Received: from mail-pl1-x635.google.com (mail-pl1-x635.google.com [IPv6:2607:f8b0:4864:20::635]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 365F412F for ; Sun, 26 Nov 2023 23:07:23 -0800 (PST) Received: by mail-pl1-x635.google.com with SMTP id d9443c01a7336-1cfaaa79766so18281555ad.3 for ; Sun, 26 Nov 2023 23:07:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1701068842; x=1701673642; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=N6MgwafsLqjywfMCXjdUW6zqI+itRnJtEI6/v6PIAPo=; b=HDsTZeFHrhC/ZurN+Vh7iwdexnyCCKCiL8kjau8wBfUZ0E5m+OTJxRIqseGzFuieAb fG0I3SVdpbZ8/OXf1X+HzN9LouEHU8MptalOvqHTRKWp4Dz3amDWq9cmgQWe/sTCw9qD 1GCJpd6nPpv9AtC66iNXq3x7itsDlKR9YdJbfCOgc+GtqXcaxkTZXjNskfGzOGUxldvS Awa3gOiilqpbibRK5+7Ry0SNCC6y0eYn0C85BIDxph7QHCtdB87hWkhWlMLYpzpsbep/ 2Yvct+4Xj7bA9YaRP1c33iAri6TWNJusZ9AMlcL+0e+HMMl6lM8kU1n+6ectGnUfEkbz ivog== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701068842; x=1701673642; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=N6MgwafsLqjywfMCXjdUW6zqI+itRnJtEI6/v6PIAPo=; b=gI50jRXI+8mKM44HqEhQ6GI9TETJCi0vblLAduiIbgaObhfRyy2+ZZlBrJnSGZcYEI hCUyZd9Dyw3wUtMDy9QjnUgtlKqK4vCjC0oL1vLMk71FXVrtBBepxSwcpi4mJDOBxJ7+ UdbeRt0DFrOHpxEnTBCTxWObg+bnPxVJ+22CNMGif7bOz8gv5BlIqCyA7LwqqCuobm9I 4Bd8uooEWS4lwtjcZjCbnfxB1gNA9RgyJ61sE5G5P31lyQe4RaEsGCz1RslMfMU4IKWI A3rk8wB6CH8yvZVoYE2MKH3ZBYFfpKS1LFAeWdtw+tydIUV2PY5h6ojPNNEqQrmVE9oc NmlQ== X-Gm-Message-State: AOJu0YyRZVTT/sDauSKXD3Bn4yhqxPN8ovcXLn9MYinBBApYalQyLRxt dlQD5X6TRzVa3X6z7PM0UboFTg== X-Google-Smtp-Source: AGHT+IHdcu5gU/CpFXYLjHgVWZvRsNwIrGTxKxdpB9YsVIiqrNzlaMEgYx7HAKNHw+RQcHOzvMld+w== X-Received: by 2002:a17:902:ce84:b0:1cf:b7ea:fea with SMTP id f4-20020a170902ce8400b001cfb7ea0feamr7251378plg.1.1701068842591; Sun, 26 Nov 2023 23:07:22 -0800 (PST) Received: from localhost.localdomain ([101.10.45.230]) by smtp.gmail.com with ESMTPSA id jh15-20020a170903328f00b001cfcd3a764esm1340134plb.77.2023.11.26.23.07.19 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sun, 26 Nov 2023 23:07:22 -0800 (PST) From: Jerry Shih To: paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, herbert@gondor.apana.org.au, davem@davemloft.net, conor.dooley@microchip.com, ebiggers@kernel.org, ardb@kernel.org Cc: heiko@sntech.de, phoebe.chen@sifive.com, hongrong.hsu@sifive.com, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org Subject: [PATCH v2 03/13] RISC-V: crypto: add OpenSSL perl module for vector instructions Date: Mon, 27 Nov 2023 15:06:53 +0800 Message-Id: <20231127070703.1697-4-jerry.shih@sifive.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20231127070703.1697-1-jerry.shih@sifive.com> References: <20231127070703.1697-1-jerry.shih@sifive.com> Precedence: bulk X-Mailing-List: linux-crypto@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The OpenSSL has some RISC-V vector cryptography implementations which could be reused for kernel. These implementations use a number of perl helpers for handling vector and vector-crypto-extension instructions. This patch take these perl helpers from OpenSSL(openssl/openssl#21923). The unused scalar crypto instructions in the original perl module are skipped. Co-developed-by: Christoph Müllner Signed-off-by: Christoph Müllner Co-developed-by: Heiko Stuebner Signed-off-by: Heiko Stuebner Co-developed-by: Phoebe Chen Signed-off-by: Phoebe Chen Signed-off-by: Jerry Shih --- arch/riscv/crypto/riscv.pm | 828 +++++++++++++++++++++++++++++++++++++ 1 file changed, 828 insertions(+) create mode 100644 arch/riscv/crypto/riscv.pm diff --git a/arch/riscv/crypto/riscv.pm b/arch/riscv/crypto/riscv.pm new file mode 100644 index 000000000000..e188f7476e3e --- /dev/null +++ b/arch/riscv/crypto/riscv.pm @@ -0,0 +1,828 @@ +#! /usr/bin/env perl +# SPDX-License-Identifier: Apache-2.0 OR BSD-2-Clause +# +# This file is dual-licensed, meaning that you can use it under your +# choice of either of the following two licenses: +# +# Copyright 2023 The OpenSSL Project Authors. All Rights Reserved. +# +# Licensed under the Apache License 2.0 (the "License"). You can obtain +# a copy in the file LICENSE in the source distribution or at +# https://www.openssl.org/source/license.html +# +# or +# +# Copyright (c) 2023, Christoph Müllner +# Copyright (c) 2023, Jerry Shih +# Copyright (c) 2023, Phoebe Chen +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +use strict; +use warnings; + +# Set $have_stacktrace to 1 if we have Devel::StackTrace +my $have_stacktrace = 0; +if (eval {require Devel::StackTrace;1;}) { + $have_stacktrace = 1; +} + +my @regs = map("x$_",(0..31)); +# Mapping from the RISC-V psABI ABI mnemonic names to the register number. +my @regaliases = ('zero','ra','sp','gp','tp','t0','t1','t2','s0','s1', + map("a$_",(0..7)), + map("s$_",(2..11)), + map("t$_",(3..6)) +); + +my %reglookup; +@reglookup{@regs} = @regs; +@reglookup{@regaliases} = @regs; + +# Takes a register name, possibly an alias, and converts it to a register index +# from 0 to 31 +sub read_reg { + my $reg = lc shift; + if (!exists($reglookup{$reg})) { + my $trace = ""; + if ($have_stacktrace) { + $trace = Devel::StackTrace->new->as_string; + } + die("Unknown register ".$reg."\n".$trace); + } + my $regstr = $reglookup{$reg}; + if (!($regstr =~ /^x([0-9]+)$/)) { + my $trace = ""; + if ($have_stacktrace) { + $trace = Devel::StackTrace->new->as_string; + } + die("Could not process register ".$reg."\n".$trace); + } + return $1; +} + +# Read the sew setting(8, 16, 32 and 64) and convert to vsew encoding. +sub read_sew { + my $sew_setting = shift; + + if ($sew_setting eq "e8") { + return 0; + } elsif ($sew_setting eq "e16") { + return 1; + } elsif ($sew_setting eq "e32") { + return 2; + } elsif ($sew_setting eq "e64") { + return 3; + } else { + my $trace = ""; + if ($have_stacktrace) { + $trace = Devel::StackTrace->new->as_string; + } + die("Unsupported SEW setting:".$sew_setting."\n".$trace); + } +} + +# Read the LMUL settings and convert to vlmul encoding. +sub read_lmul { + my $lmul_setting = shift; + + if ($lmul_setting eq "mf8") { + return 5; + } elsif ($lmul_setting eq "mf4") { + return 6; + } elsif ($lmul_setting eq "mf2") { + return 7; + } elsif ($lmul_setting eq "m1") { + return 0; + } elsif ($lmul_setting eq "m2") { + return 1; + } elsif ($lmul_setting eq "m4") { + return 2; + } elsif ($lmul_setting eq "m8") { + return 3; + } else { + my $trace = ""; + if ($have_stacktrace) { + $trace = Devel::StackTrace->new->as_string; + } + die("Unsupported LMUL setting:".$lmul_setting."\n".$trace); + } +} + +# Read the tail policy settings and convert to vta encoding. +sub read_tail_policy { + my $tail_setting = shift; + + if ($tail_setting eq "ta") { + return 1; + } elsif ($tail_setting eq "tu") { + return 0; + } else { + my $trace = ""; + if ($have_stacktrace) { + $trace = Devel::StackTrace->new->as_string; + } + die("Unsupported tail policy setting:".$tail_setting."\n".$trace); + } +} + +# Read the mask policy settings and convert to vma encoding. +sub read_mask_policy { + my $mask_setting = shift; + + if ($mask_setting eq "ma") { + return 1; + } elsif ($mask_setting eq "mu") { + return 0; + } else { + my $trace = ""; + if ($have_stacktrace) { + $trace = Devel::StackTrace->new->as_string; + } + die("Unsupported mask policy setting:".$mask_setting."\n".$trace); + } +} + +my @vregs = map("v$_",(0..31)); +my %vreglookup; +@vreglookup{@vregs} = @vregs; + +sub read_vreg { + my $vreg = lc shift; + if (!exists($vreglookup{$vreg})) { + my $trace = ""; + if ($have_stacktrace) { + $trace = Devel::StackTrace->new->as_string; + } + die("Unknown vector register ".$vreg."\n".$trace); + } + if (!($vreg =~ /^v([0-9]+)$/)) { + my $trace = ""; + if ($have_stacktrace) { + $trace = Devel::StackTrace->new->as_string; + } + die("Could not process vector register ".$vreg."\n".$trace); + } + return $1; +} + +# Read the vm settings and convert to mask encoding. +sub read_mask_vreg { + my $vreg = shift; + # The default value is unmasked. + my $mask_bit = 1; + + if (defined($vreg)) { + my $reg_id = read_vreg $vreg; + if ($reg_id == 0) { + $mask_bit = 0; + } else { + my $trace = ""; + if ($have_stacktrace) { + $trace = Devel::StackTrace->new->as_string; + } + die("The ".$vreg." is not the mask register v0.\n".$trace); + } + } + return $mask_bit; +} + +# Vector instructions + +sub vadd_vv { + # vadd.vv vd, vs2, vs1, vm + my $template = 0b000000_0_00000_00000_000_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($vs2 << 20) | ($vs1 << 15) | ($vd << 7)); +} + +sub vadd_vx { + # vadd.vx vd, vs2, rs1, vm + my $template = 0b000000_0_00000_00000_100_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $rs1 = read_reg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($vs2 << 20) | ($rs1 << 15) | ($vd << 7)); +} + +sub vsub_vv { + # vsub.vv vd, vs2, vs1, vm + my $template = 0b000010_0_00000_00000_000_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($vs2 << 20) | ($vs1 << 15) | ($vd << 7)); +} + +sub vsub_vx { + # vsub.vx vd, vs2, rs1, vm + my $template = 0b000010_0_00000_00000_100_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $rs1 = read_reg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($vs2 << 20) | ($rs1 << 15) | ($vd << 7)); +} + +sub vid_v { + # vid.v vd + my $template = 0b0101001_00000_10001_010_00000_1010111; + my $vd = read_vreg shift; + return ".word ".($template | ($vd << 7)); +} + +sub viota_m { + # viota.m vd, vs2, vm + my $template = 0b010100_0_00000_10000_010_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($vs2 << 20) | ($vd << 7)); +} + +sub vle8_v { + # vle8.v vd, (rs1), vm + my $template = 0b000000_0_00000_00000_000_00000_0000111; + my $vd = read_vreg shift; + my $rs1 = read_reg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($rs1 << 15) | ($vd << 7)); +} + +sub vle32_v { + # vle32.v vd, (rs1), vm + my $template = 0b000000_0_00000_00000_110_00000_0000111; + my $vd = read_vreg shift; + my $rs1 = read_reg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($rs1 << 15) | ($vd << 7)); +} + +sub vle64_v { + # vle64.v vd, (rs1) + my $template = 0b0000001_00000_00000_111_00000_0000111; + my $vd = read_vreg shift; + my $rs1 = read_reg shift; + return ".word ".($template | ($rs1 << 15) | ($vd << 7)); +} + +sub vlse32_v { + # vlse32.v vd, (rs1), rs2 + my $template = 0b0000101_00000_00000_110_00000_0000111; + my $vd = read_vreg shift; + my $rs1 = read_reg shift; + my $rs2 = read_reg shift; + return ".word ".($template | ($rs2 << 20) | ($rs1 << 15) | ($vd << 7)); +} + +sub vlsseg_nf_e32_v { + # vlssege32.v vd, (rs1), rs2 + my $template = 0b0000101_00000_00000_110_00000_0000111; + my $nf = shift; + $nf -= 1; + my $vd = read_vreg shift; + my $rs1 = read_reg shift; + my $rs2 = read_reg shift; + return ".word ".($template | ($nf << 29) | ($rs2 << 20) | ($rs1 << 15) | ($vd << 7)); +} + +sub vlse64_v { + # vlse64.v vd, (rs1), rs2 + my $template = 0b0000101_00000_00000_111_00000_0000111; + my $vd = read_vreg shift; + my $rs1 = read_reg shift; + my $rs2 = read_reg shift; + return ".word ".($template | ($rs2 << 20) | ($rs1 << 15) | ($vd << 7)); +} + +sub vluxei8_v { + # vluxei8.v vd, (rs1), vs2, vm + my $template = 0b000001_0_00000_00000_000_00000_0000111; + my $vd = read_vreg shift; + my $rs1 = read_reg shift; + my $vs2 = read_vreg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($vs2 << 20) | ($rs1 << 15) | ($vd << 7)); +} + +sub vmerge_vim { + # vmerge.vim vd, vs2, imm, v0 + my $template = 0b0101110_00000_00000_011_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $imm = shift; + return ".word ".($template | ($vs2 << 20) | ($imm << 15) | ($vd << 7)); +} + +sub vmerge_vvm { + # vmerge.vvm vd vs2 vs1 + my $template = 0b0101110_00000_00000_000_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vs1 << 15) | ($vd << 7)) +} + +sub vmseq_vi { + # vmseq.vi vd vs1, imm + my $template = 0b0110001_00000_00000_011_00000_1010111; + my $vd = read_vreg shift; + my $vs1 = read_vreg shift; + my $imm = shift; + return ".word ".($template | ($vs1 << 20) | ($imm << 15) | ($vd << 7)) +} + +sub vmsgtu_vx { + # vmsgtu.vx vd vs2, rs1, vm + my $template = 0b011110_0_00000_00000_100_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $rs1 = read_reg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($vs2 << 20) | ($rs1 << 15) | ($vd << 7)) +} + +sub vmv_v_i { + # vmv.v.i vd, imm + my $template = 0b0101111_00000_00000_011_00000_1010111; + my $vd = read_vreg shift; + my $imm = shift; + return ".word ".($template | ($imm << 15) | ($vd << 7)); +} + +sub vmv_v_x { + # vmv.v.x vd, rs1 + my $template = 0b0101111_00000_00000_100_00000_1010111; + my $vd = read_vreg shift; + my $rs1 = read_reg shift; + return ".word ".($template | ($rs1 << 15) | ($vd << 7)); +} + +sub vmv_v_v { + # vmv.v.v vd, vs1 + my $template = 0b0101111_00000_00000_000_00000_1010111; + my $vd = read_vreg shift; + my $vs1 = read_vreg shift; + return ".word ".($template | ($vs1 << 15) | ($vd << 7)); +} + +sub vor_vv_v0t { + # vor.vv vd, vs2, vs1, v0.t + my $template = 0b0010100_00000_00000_000_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vs1 << 15) | ($vd << 7)); +} + +sub vse8_v { + # vse8.v vd, (rs1), vm + my $template = 0b000000_0_00000_00000_000_00000_0100111; + my $vd = read_vreg shift; + my $rs1 = read_reg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($rs1 << 15) | ($vd << 7)); +} + +sub vse32_v { + # vse32.v vd, (rs1), vm + my $template = 0b000000_0_00000_00000_110_00000_0100111; + my $vd = read_vreg shift; + my $rs1 = read_reg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($rs1 << 15) | ($vd << 7)); +} + +sub vssseg_nf_e32_v { + # vsssege32.v vs3, (rs1), rs2 + my $template = 0b0000101_00000_00000_110_00000_0100111; + my $nf = shift; + $nf -= 1; + my $vs3 = read_vreg shift; + my $rs1 = read_reg shift; + my $rs2 = read_reg shift; + return ".word ".($template | ($nf << 29) | ($rs2 << 20) | ($rs1 << 15) | ($vs3 << 7)); +} + +sub vsuxei8_v { + # vsuxei8.v vs3, (rs1), vs2, vm + my $template = 0b000001_0_00000_00000_000_00000_0100111; + my $vs3 = read_vreg shift; + my $rs1 = read_reg shift; + my $vs2 = read_vreg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($vs2 << 20) | ($rs1 << 15) | ($vs3 << 7)); +} + +sub vse64_v { + # vse64.v vd, (rs1) + my $template = 0b0000001_00000_00000_111_00000_0100111; + my $vd = read_vreg shift; + my $rs1 = read_reg shift; + return ".word ".($template | ($rs1 << 15) | ($vd << 7)); +} + +sub vsetivli__x0_2_e64_m1_tu_mu { + # vsetivli x0, 2, e64, m1, tu, mu + return ".word 0xc1817057"; +} + +sub vsetivli__x0_4_e32_m1_tu_mu { + # vsetivli x0, 4, e32, m1, tu, mu + return ".word 0xc1027057"; +} + +sub vsetivli__x0_4_e64_m1_tu_mu { + # vsetivli x0, 4, e64, m1, tu, mu + return ".word 0xc1827057"; +} + +sub vsetivli__x0_8_e32_m1_tu_mu { + # vsetivli x0, 8, e32, m1, tu, mu + return ".word 0xc1047057"; +} + +sub vsetvli { + # vsetvli rd, rs1, vtypei + my $template = 0b0_00000000000_00000_111_00000_1010111; + my $rd = read_reg shift; + my $rs1 = read_reg shift; + my $sew = read_sew shift; + my $lmul = read_lmul shift; + my $tail_policy = read_tail_policy shift; + my $mask_policy = read_mask_policy shift; + my $vtypei = ($mask_policy << 7) | ($tail_policy << 6) | ($sew << 3) | $lmul; + + return ".word ".($template | ($vtypei << 20) | ($rs1 << 15) | ($rd << 7)); +} + +sub vsetivli { + # vsetvli rd, uimm, vtypei + my $template = 0b11_0000000000_00000_111_00000_1010111; + my $rd = read_reg shift; + my $uimm = shift; + my $sew = read_sew shift; + my $lmul = read_lmul shift; + my $tail_policy = read_tail_policy shift; + my $mask_policy = read_mask_policy shift; + my $vtypei = ($mask_policy << 7) | ($tail_policy << 6) | ($sew << 3) | $lmul; + + return ".word ".($template | ($vtypei << 20) | ($uimm << 15) | ($rd << 7)); +} + +sub vslidedown_vi { + # vslidedown.vi vd, vs2, uimm + my $template = 0b0011111_00000_00000_011_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $uimm = shift; + return ".word ".($template | ($vs2 << 20) | ($uimm << 15) | ($vd << 7)); +} + +sub vslidedown_vx { + # vslidedown.vx vd, vs2, rs1 + my $template = 0b0011111_00000_00000_100_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $rs1 = read_reg shift; + return ".word ".($template | ($vs2 << 20) | ($rs1 << 15) | ($vd << 7)); +} + +sub vslideup_vi_v0t { + # vslideup.vi vd, vs2, uimm, v0.t + my $template = 0b0011100_00000_00000_011_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $uimm = shift; + return ".word ".($template | ($vs2 << 20) | ($uimm << 15) | ($vd << 7)); +} + +sub vslideup_vi { + # vslideup.vi vd, vs2, uimm + my $template = 0b0011101_00000_00000_011_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $uimm = shift; + return ".word ".($template | ($vs2 << 20) | ($uimm << 15) | ($vd << 7)); +} + +sub vsll_vi { + # vsll.vi vd, vs2, uimm, vm + my $template = 0b1001011_00000_00000_011_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $uimm = shift; + return ".word ".($template | ($vs2 << 20) | ($uimm << 15) | ($vd << 7)); +} + +sub vsrl_vx { + # vsrl.vx vd, vs2, rs1 + my $template = 0b1010001_00000_00000_100_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $rs1 = read_reg shift; + return ".word ".($template | ($vs2 << 20) | ($rs1 << 15) | ($vd << 7)); +} + +sub vsse32_v { + # vse32.v vs3, (rs1), rs2 + my $template = 0b0000101_00000_00000_110_00000_0100111; + my $vs3 = read_vreg shift; + my $rs1 = read_reg shift; + my $rs2 = read_reg shift; + return ".word ".($template | ($rs2 << 20) | ($rs1 << 15) | ($vs3 << 7)); +} + +sub vsse64_v { + # vsse64.v vs3, (rs1), rs2 + my $template = 0b0000101_00000_00000_111_00000_0100111; + my $vs3 = read_vreg shift; + my $rs1 = read_reg shift; + my $rs2 = read_reg shift; + return ".word ".($template | ($rs2 << 20) | ($rs1 << 15) | ($vs3 << 7)); +} + +sub vxor_vv_v0t { + # vxor.vv vd, vs2, vs1, v0.t + my $template = 0b0010110_00000_00000_000_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vs1 << 15) | ($vd << 7)); +} + +sub vxor_vv { + # vxor.vv vd, vs2, vs1 + my $template = 0b0010111_00000_00000_000_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vs1 << 15) | ($vd << 7)); +} + +sub vzext_vf2 { + # vzext.vf2 vd, vs2, vm + my $template = 0b010010_0_00000_00110_010_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($vs2 << 20) | ($vd << 7)); +} + +# Vector crypto instructions + +## Zvbb and Zvkb instructions +## +## vandn (also in zvkb) +## vbrev +## vbrev8 (also in zvkb) +## vrev8 (also in zvkb) +## vclz +## vctz +## vcpop +## vrol (also in zvkb) +## vror (also in zvkb) +## vwsll + +sub vbrev8_v { + # vbrev8.v vd, vs2, vm + my $template = 0b010010_0_00000_01000_010_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($vs2 << 20) | ($vd << 7)); +} + +sub vrev8_v { + # vrev8.v vd, vs2, vm + my $template = 0b010010_0_00000_01001_010_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($vs2 << 20) | ($vd << 7)); +} + +sub vror_vi { + # vror.vi vd, vs2, uimm + my $template = 0b01010_0_1_00000_00000_011_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $uimm = shift; + my $uimm_i5 = $uimm >> 5; + my $uimm_i4_0 = $uimm & 0b11111; + + return ".word ".($template | ($uimm_i5 << 26) | ($vs2 << 20) | ($uimm_i4_0 << 15) | ($vd << 7)); +} + +sub vwsll_vv { + # vwsll.vv vd, vs2, vs1, vm + my $template = 0b110101_0_00000_00000_000_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + my $vm = read_mask_vreg shift; + return ".word ".($template | ($vm << 25) | ($vs2 << 20) | ($vs1 << 15) | ($vd << 7)); +} + +## Zvbc instructions + +sub vclmulh_vx { + # vclmulh.vx vd, vs2, rs1 + my $template = 0b0011011_00000_00000_110_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $rs1 = read_reg shift; + return ".word ".($template | ($vs2 << 20) | ($rs1 << 15) | ($vd << 7)); +} + +sub vclmul_vx_v0t { + # vclmul.vx vd, vs2, rs1, v0.t + my $template = 0b0011000_00000_00000_110_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $rs1 = read_reg shift; + return ".word ".($template | ($vs2 << 20) | ($rs1 << 15) | ($vd << 7)); +} + +sub vclmul_vx { + # vclmul.vx vd, vs2, rs1 + my $template = 0b0011001_00000_00000_110_00000_1010111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $rs1 = read_reg shift; + return ".word ".($template | ($vs2 << 20) | ($rs1 << 15) | ($vd << 7)); +} + +## Zvkg instructions + +sub vghsh_vv { + # vghsh.vv vd, vs2, vs1 + my $template = 0b1011001_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vs1 << 15) | ($vd << 7)); +} + +sub vgmul_vv { + # vgmul.vv vd, vs2 + my $template = 0b1010001_00000_10001_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vd << 7)); +} + +## Zvkned instructions + +sub vaesdf_vs { + # vaesdf.vs vd, vs2 + my $template = 0b101001_1_00000_00001_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vd << 7)); +} + +sub vaesdm_vs { + # vaesdm.vs vd, vs2 + my $template = 0b101001_1_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vd << 7)); +} + +sub vaesef_vs { + # vaesef.vs vd, vs2 + my $template = 0b101001_1_00000_00011_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vd << 7)); +} + +sub vaesem_vs { + # vaesem.vs vd, vs2 + my $template = 0b101001_1_00000_00010_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vd << 7)); +} + +sub vaeskf1_vi { + # vaeskf1.vi vd, vs2, uimmm + my $template = 0b100010_1_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $uimm = shift; + return ".word ".($template | ($uimm << 15) | ($vs2 << 20) | ($vd << 7)); +} + +sub vaeskf2_vi { + # vaeskf2.vi vd, vs2, uimm + my $template = 0b101010_1_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $uimm = shift; + return ".word ".($template | ($vs2 << 20) | ($uimm << 15) | ($vd << 7)); +} + +sub vaesz_vs { + # vaesz.vs vd, vs2 + my $template = 0b101001_1_00000_00111_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vd << 7)); +} + +## Zvknha and Zvknhb instructions + +sub vsha2ms_vv { + # vsha2ms.vv vd, vs2, vs1 + my $template = 0b1011011_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + return ".word ".($template | ($vs2 << 20)| ($vs1 << 15 )| ($vd << 7)); +} + +sub vsha2ch_vv { + # vsha2ch.vv vd, vs2, vs1 + my $template = 0b101110_10000_00000_001_00000_01110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + return ".word ".($template | ($vs2 << 20)| ($vs1 << 15 )| ($vd << 7)); +} + +sub vsha2cl_vv { + # vsha2cl.vv vd, vs2, vs1 + my $template = 0b101111_10000_00000_001_00000_01110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + return ".word ".($template | ($vs2 << 20)| ($vs1 << 15 )| ($vd << 7)); +} + +## Zvksed instructions + +sub vsm4k_vi { + # vsm4k.vi vd, vs2, uimm + my $template = 0b1000011_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $uimm = shift; + return ".word ".($template | ($vs2 << 20) | ($uimm << 15) | ($vd << 7)); +} + +sub vsm4r_vs { + # vsm4r.vs vd, vs2 + my $template = 0b1010011_00000_10000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vd << 7)); +} + +## zvksh instructions + +sub vsm3c_vi { + # vsm3c.vi vd, vs2, uimm + my $template = 0b1010111_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $uimm = shift; + return ".word ".($template | ($vs2 << 20) | ($uimm << 15 ) | ($vd << 7)); +} + +sub vsm3me_vv { + # vsm3me.vv vd, vs2, vs1 + my $template = 0b1000001_00000_00000_010_00000_1110111; + my $vd = read_vreg shift; + my $vs2 = read_vreg shift; + my $vs1 = read_vreg shift; + return ".word ".($template | ($vs2 << 20) | ($vs1 << 15 ) | ($vd << 7)); +} + +1; -- 2.28.0 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 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 42B58C07D5A for ; Mon, 27 Nov 2023 07:07:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Message-Id:Date:Subject:Cc:To:From:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=RLYbcEHdNH80gpfoa7e59RAXP4ep9QvkBCL027gWV2c=; b=t90Id2uV+SNd1N GbwhF93JnTLrQcRIIBVbVhwSC6+laRz8862eWK4n6doe+apSkkD7ejnz8fjbXM9F3Rk5Bq0/vA9ry UY9/VmObbvF4TsVqcYHAfC5I1M5vMtFA5pwi7EmRwSJXBT5mUgzjJDEbqG/Qp/EJcisp+ebVMknL5 9v7mpdC9ICeAiM0Waq9hj680XS0MVO7VLIqmDTYPTtT5NRf1wCH+R/1rrXX+F6+Nv8JyuJygG2Icb z3UmOchtSHHGVG4A9TyJGfdxbQSuNzl1iLY9B2OGvt8CVHW8+rLb9c7Ax+7R6C4S362IY7WO4SRma AC395gR5wLV7uhy9bJ5w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1r7ViP-001erq-2K; Mon, 27 Nov 2023 07:07:33 +0000 Received: from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1r7ViI-001epD-0I for linux-riscv@lists.infradead.org; Mon, 27 Nov 2023 07:07:29 +0000 Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-1cf80a7be0aso31918655ad.1 for ; Sun, 26 Nov 2023 23:07:23 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sifive.com; s=google; t=1701068842; x=1701673642; darn=lists.infradead.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=N6MgwafsLqjywfMCXjdUW6zqI+itRnJtEI6/v6PIAPo=; b=FqeejumM7TRxww1LAcEXCFSaCkduWcDAWVBsegfCs7JG7H9GCpnfXBXJcRckqkuFJu snR0MmCm8gSF0XRTlf8A/e8KLfSvTZl1n633tc3HKRv5CxmsJnNeh3luvTb0ZI7Zet94 yM7D+lw6DNtNjY+XDx7GE3g1s0Mr+BNTVpyTve5OgLT7IWBMn1j0FutxKCIyMq+5lVrP dJxERk1qKgYMP2CdySi9GNZXVdEv1ak/0uOLdwkMNpwcZorQl9JXlipwmXbKdCxDJjut os0O9hce7tmWCTP63emRO9VbLEQVMIlp8aUCG6yfSJZOJd7DvFY2wTFeSM0nbd0f45Lf eO5w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1701068842; x=1701673642; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=N6MgwafsLqjywfMCXjdUW6zqI+itRnJtEI6/v6PIAPo=; b=qRc4zvxMQn7Uo6vonv49F2uL8xSFEwWSdwykZJMTMXMxJlN64UfUlR4i2kdc/f0J2Y Iuz9xuj627qydfR+Lvu2jHKopp03F1WvCkjZBj/S3PMAV37RgZEQ4RNShR5r2OZ5pJ8M A24XxytiQp8fDtnVDnM7KtHB2aHkaMi8DWdR5b1paIkYqcYKi467eNenTzuUAmJnkMVb XXKQSEF51/FN6DfsNXOjvCaJMuhTCjLlk2qeQnV3SChLZ0pU2IxgiDx/ZbwtlDPInGlG 0joEtcf/2CB2zKj/aOdoeHAxA0NTjm4zPfZQ5Bq+wam/EU0LRg0xanL267AK/zi65lze +7PQ== X-Gm-Message-State: AOJu0Yyik/NRh0UbIRW+c9VP8AIvN9JjkwcErTE1+RL4DUijNd/XVipW oEmSRoqe+auQ0A4gQIra2pL2lw== X-Google-Smtp-Source: AGHT+IHdcu5gU/CpFXYLjHgVWZvRsNwIrGTxKxdpB9YsVIiqrNzlaMEgYx7HAKNHw+RQcHOzvMld+w== X-Received: by 2002:a17:902:ce84:b0:1cf:b7ea:fea with SMTP id f4-20020a170902ce8400b001cfb7ea0feamr7251378plg.1.1701068842591; Sun, 26 Nov 2023 23:07:22 -0800 (PST) Received: from localhost.localdomain ([101.10.45.230]) by smtp.gmail.com with ESMTPSA id jh15-20020a170903328f00b001cfcd3a764esm1340134plb.77.2023.11.26.23.07.19 (version=TLS1_2 cipher=ECDHE-ECDSA-AES128-GCM-SHA256 bits=128/128); Sun, 26 Nov 2023 23:07:22 -0800 (PST) From: Jerry Shih To: paul.walmsley@sifive.com, palmer@dabbelt.com, aou@eecs.berkeley.edu, herbert@gondor.apana.org.au, davem@davemloft.net, conor.dooley@microchip.com, ebiggers@kernel.org, ardb@kernel.org Cc: heiko@sntech.de, phoebe.chen@sifive.com, hongrong.hsu@sifive.com, linux-riscv@lists.infradead.org, linux-kernel@vger.kernel.org, linux-crypto@vger.kernel.org Subject: [PATCH v2 03/13] RISC-V: crypto: add OpenSSL perl module for vector instructions Date: Mon, 27 Nov 2023 15:06:53 +0800 Message-Id: <20231127070703.1697-4-jerry.shih@sifive.com> X-Mailer: git-send-email 2.28.0 In-Reply-To: <20231127070703.1697-1-jerry.shih@sifive.com> References: <20231127070703.1697-1-jerry.shih@sifive.com> MIME-Version: 1.0 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20231126_230726_184974_CCE1B925 X-CRM114-Status: GOOD ( 22.85 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org VGhlIE9wZW5TU0wgaGFzIHNvbWUgUklTQy1WIHZlY3RvciBjcnlwdG9ncmFwaHkgaW1wbGVtZW50 YXRpb25zIHdoaWNoCmNvdWxkIGJlIHJldXNlZCBmb3Iga2VybmVsLiBUaGVzZSBpbXBsZW1lbnRh dGlvbnMgdXNlIGEgbnVtYmVyIG9mIHBlcmwKaGVscGVycyBmb3IgaGFuZGxpbmcgdmVjdG9yIGFu ZCB2ZWN0b3ItY3J5cHRvLWV4dGVuc2lvbiBpbnN0cnVjdGlvbnMuClRoaXMgcGF0Y2ggdGFrZSB0 aGVzZSBwZXJsIGhlbHBlcnMgZnJvbSBPcGVuU1NMKG9wZW5zc2wvb3BlbnNzbCMyMTkyMykuClRo ZSB1bnVzZWQgc2NhbGFyIGNyeXB0byBpbnN0cnVjdGlvbnMgaW4gdGhlIG9yaWdpbmFsIHBlcmwg bW9kdWxlIGFyZQpza2lwcGVkLgoKQ28tZGV2ZWxvcGVkLWJ5OiBDaHJpc3RvcGggTcO8bGxuZXIg PGNocmlzdG9waC5tdWVsbG5lckB2cnVsbC5ldT4KU2lnbmVkLW9mZi1ieTogQ2hyaXN0b3BoIE3D vGxsbmVyIDxjaHJpc3RvcGgubXVlbGxuZXJAdnJ1bGwuZXU+CkNvLWRldmVsb3BlZC1ieTogSGVp a28gU3R1ZWJuZXIgPGhlaWtvLnN0dWVibmVyQHZydWxsLmV1PgpTaWduZWQtb2ZmLWJ5OiBIZWlr byBTdHVlYm5lciA8aGVpa28uc3R1ZWJuZXJAdnJ1bGwuZXU+CkNvLWRldmVsb3BlZC1ieTogUGhv ZWJlIENoZW4gPHBob2ViZS5jaGVuQHNpZml2ZS5jb20+ClNpZ25lZC1vZmYtYnk6IFBob2ViZSBD aGVuIDxwaG9lYmUuY2hlbkBzaWZpdmUuY29tPgpTaWduZWQtb2ZmLWJ5OiBKZXJyeSBTaGloIDxq ZXJyeS5zaGloQHNpZml2ZS5jb20+Ci0tLQogYXJjaC9yaXNjdi9jcnlwdG8vcmlzY3YucG0gfCA4 MjggKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwogMSBmaWxlIGNoYW5nZWQs IDgyOCBpbnNlcnRpb25zKCspCiBjcmVhdGUgbW9kZSAxMDA2NDQgYXJjaC9yaXNjdi9jcnlwdG8v cmlzY3YucG0KCmRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2NyeXB0by9yaXNjdi5wbSBiL2FyY2gv cmlzY3YvY3J5cHRvL3Jpc2N2LnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAw MDAwMC4uZTE4OGY3NDc2ZTNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9yaXNjdi9jcnlwdG8v cmlzY3YucG0KQEAgLTAsMCArMSw4MjggQEAKKyMhIC91c3IvYmluL2VudiBwZXJsCisjIFNQRFgt TGljZW5zZS1JZGVudGlmaWVyOiBBcGFjaGUtMi4wIE9SIEJTRC0yLUNsYXVzZQorIworIyBUaGlz IGZpbGUgaXMgZHVhbC1saWNlbnNlZCwgbWVhbmluZyB0aGF0IHlvdSBjYW4gdXNlIGl0IHVuZGVy IHlvdXIKKyMgY2hvaWNlIG9mIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nIHR3byBsaWNlbnNlczoK KyMKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIE9wZW5TU0wgUHJvamVjdCBBdXRob3JzLiBBbGwgUmln aHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UgMi4w ICh0aGUgIkxpY2Vuc2UiKS4gWW91IGNhbiBvYnRhaW4KKyMgYSBjb3B5IGluIHRoZSBmaWxlIExJ Q0VOU0UgaW4gdGhlIHNvdXJjZSBkaXN0cmlidXRpb24gb3IgYXQKKyMgaHR0cHM6Ly93d3cub3Bl bnNzbC5vcmcvc291cmNlL2xpY2Vuc2UuaHRtbAorIworIyBvcgorIworIyBDb3B5cmlnaHQgKGMp IDIwMjMsIENocmlzdG9waCBNw7xsbG5lciA8Y2hyaXN0b3BoLm11ZWxsbmVyQHZydWxsLmV1Pgor IyBDb3B5cmlnaHQgKGMpIDIwMjMsIEplcnJ5IFNoaWggPGplcnJ5LnNoaWhAc2lmaXZlLmNvbT4K KyMgQ29weXJpZ2h0IChjKSAyMDIzLCBQaG9lYmUgQ2hlbiA8cGhvZWJlLmNoZW5Ac2lmaXZlLmNv bT4KKyMgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBp biBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisjIG1vZGlmaWNhdGlv biwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwor IyBhcmUgbWV0OgorIyAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRh aW4gdGhlIGFib3ZlIGNvcHlyaWdodAorIyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRp b25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisjIDIuIFJlZGlzdHJpYnV0aW9ucyBp biBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisjICAgIG5v dGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l ciBpbiB0aGUKKyMgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3Zp ZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyMKKyMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURF RCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworIyAiQVMgSVMiIEFO RCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAor IyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBB TkQgRklUTkVTUyBGT1IKKyMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElO IE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJF IExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisjIFNQRUNJQUws IEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QK KyMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF UzsgTE9TUyBPRiBVU0UsCisjIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQ VElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorIyBUSEVPUlkgT0YgTElBQklMSVRZLCBX SEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisjIChJTkNMVURJ TkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhF IFVTRQorIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklM SVRZIE9GIFNVQ0ggREFNQUdFLgorCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCisjIFNl dCAkaGF2ZV9zdGFja3RyYWNlIHRvIDEgaWYgd2UgaGF2ZSBEZXZlbDo6U3RhY2tUcmFjZQorbXkg JGhhdmVfc3RhY2t0cmFjZSA9IDA7CitpZiAoZXZhbCB7cmVxdWlyZSBEZXZlbDo6U3RhY2tUcmFj ZTsxO30pIHsKKyAgICAkaGF2ZV9zdGFja3RyYWNlID0gMTsKK30KKworbXkgQHJlZ3MgPSBtYXAo IngkXyIsKDAuLjMxKSk7CisjIE1hcHBpbmcgZnJvbSB0aGUgUklTQy1WIHBzQUJJIEFCSSBtbmVt b25pYyBuYW1lcyB0byB0aGUgcmVnaXN0ZXIgbnVtYmVyLgorbXkgQHJlZ2FsaWFzZXMgPSAoJ3pl cm8nLCdyYScsJ3NwJywnZ3AnLCd0cCcsJ3QwJywndDEnLCd0MicsJ3MwJywnczEnLAorICAgIG1h cCgiYSRfIiwoMC4uNykpLAorICAgIG1hcCgicyRfIiwoMi4uMTEpKSwKKyAgICBtYXAoInQkXyIs KDMuLjYpKQorKTsKKworbXkgJXJlZ2xvb2t1cDsKK0ByZWdsb29rdXB7QHJlZ3N9ID0gQHJlZ3M7 CitAcmVnbG9va3Vwe0ByZWdhbGlhc2VzfSA9IEByZWdzOworCisjIFRha2VzIGEgcmVnaXN0ZXIg bmFtZSwgcG9zc2libHkgYW4gYWxpYXMsIGFuZCBjb252ZXJ0cyBpdCB0byBhIHJlZ2lzdGVyIGlu ZGV4CisjIGZyb20gMCB0byAzMQorc3ViIHJlYWRfcmVnIHsKKyAgICBteSAkcmVnID0gbGMgc2hp ZnQ7CisgICAgaWYgKCFleGlzdHMoJHJlZ2xvb2t1cHskcmVnfSkpIHsKKyAgICAgICAgbXkgJHRy YWNlID0gIiI7CisgICAgICAgIGlmICgkaGF2ZV9zdGFja3RyYWNlKSB7CisgICAgICAgICAgICAk dHJhY2UgPSBEZXZlbDo6U3RhY2tUcmFjZS0+bmV3LT5hc19zdHJpbmc7CisgICAgICAgIH0KKyAg ICAgICAgZGllKCJVbmtub3duIHJlZ2lzdGVyICIuJHJlZy4iXG4iLiR0cmFjZSk7CisgICAgfQor ICAgIG15ICRyZWdzdHIgPSAkcmVnbG9va3VweyRyZWd9OworICAgIGlmICghKCRyZWdzdHIgPX4g L154KFswLTldKykkLykpIHsKKyAgICAgICAgbXkgJHRyYWNlID0gIiI7CisgICAgICAgIGlmICgk aGF2ZV9zdGFja3RyYWNlKSB7CisgICAgICAgICAgICAkdHJhY2UgPSBEZXZlbDo6U3RhY2tUcmFj ZS0+bmV3LT5hc19zdHJpbmc7CisgICAgICAgIH0KKyAgICAgICAgZGllKCJDb3VsZCBub3QgcHJv Y2VzcyByZWdpc3RlciAiLiRyZWcuIlxuIi4kdHJhY2UpOworICAgIH0KKyAgICByZXR1cm4gJDE7 Cit9CisKKyMgUmVhZCB0aGUgc2V3IHNldHRpbmcoOCwgMTYsIDMyIGFuZCA2NCkgYW5kIGNvbnZl cnQgdG8gdnNldyBlbmNvZGluZy4KK3N1YiByZWFkX3NldyB7CisgICAgbXkgJHNld19zZXR0aW5n ID0gc2hpZnQ7CisKKyAgICBpZiAoJHNld19zZXR0aW5nIGVxICJlOCIpIHsKKyAgICAgICAgcmV0 dXJuIDA7CisgICAgfSBlbHNpZiAoJHNld19zZXR0aW5nIGVxICJlMTYiKSB7CisgICAgICAgIHJl dHVybiAxOworICAgIH0gZWxzaWYgKCRzZXdfc2V0dGluZyBlcSAiZTMyIikgeworICAgICAgICBy ZXR1cm4gMjsKKyAgICB9IGVsc2lmICgkc2V3X3NldHRpbmcgZXEgImU2NCIpIHsKKyAgICAgICAg cmV0dXJuIDM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbXkgJHRyYWNlID0gIiI7CisgICAgICAg IGlmICgkaGF2ZV9zdGFja3RyYWNlKSB7CisgICAgICAgICAgICAkdHJhY2UgPSBEZXZlbDo6U3Rh Y2tUcmFjZS0+bmV3LT5hc19zdHJpbmc7CisgICAgICAgIH0KKyAgICAgICAgZGllKCJVbnN1cHBv cnRlZCBTRVcgc2V0dGluZzoiLiRzZXdfc2V0dGluZy4iXG4iLiR0cmFjZSk7CisgICAgfQorfQor CisjIFJlYWQgdGhlIExNVUwgc2V0dGluZ3MgYW5kIGNvbnZlcnQgdG8gdmxtdWwgZW5jb2Rpbmcu CitzdWIgcmVhZF9sbXVsIHsKKyAgICBteSAkbG11bF9zZXR0aW5nID0gc2hpZnQ7CisKKyAgICBp ZiAoJGxtdWxfc2V0dGluZyBlcSAibWY4IikgeworICAgICAgICByZXR1cm4gNTsKKyAgICB9IGVs c2lmICgkbG11bF9zZXR0aW5nIGVxICJtZjQiKSB7CisgICAgICAgIHJldHVybiA2OworICAgIH0g ZWxzaWYgKCRsbXVsX3NldHRpbmcgZXEgIm1mMiIpIHsKKyAgICAgICAgcmV0dXJuIDc7CisgICAg fSBlbHNpZiAoJGxtdWxfc2V0dGluZyBlcSAibTEiKSB7CisgICAgICAgIHJldHVybiAwOworICAg IH0gZWxzaWYgKCRsbXVsX3NldHRpbmcgZXEgIm0yIikgeworICAgICAgICByZXR1cm4gMTsKKyAg ICB9IGVsc2lmICgkbG11bF9zZXR0aW5nIGVxICJtNCIpIHsKKyAgICAgICAgcmV0dXJuIDI7Cisg ICAgfSBlbHNpZiAoJGxtdWxfc2V0dGluZyBlcSAibTgiKSB7CisgICAgICAgIHJldHVybiAzOwor ICAgIH0gZWxzZSB7CisgICAgICAgIG15ICR0cmFjZSA9ICIiOworICAgICAgICBpZiAoJGhhdmVf c3RhY2t0cmFjZSkgeworICAgICAgICAgICAgJHRyYWNlID0gRGV2ZWw6OlN0YWNrVHJhY2UtPm5l dy0+YXNfc3RyaW5nOworICAgICAgICB9CisgICAgICAgIGRpZSgiVW5zdXBwb3J0ZWQgTE1VTCBz ZXR0aW5nOiIuJGxtdWxfc2V0dGluZy4iXG4iLiR0cmFjZSk7CisgICAgfQorfQorCisjIFJlYWQg dGhlIHRhaWwgcG9saWN5IHNldHRpbmdzIGFuZCBjb252ZXJ0IHRvIHZ0YSBlbmNvZGluZy4KK3N1 YiByZWFkX3RhaWxfcG9saWN5IHsKKyAgICBteSAkdGFpbF9zZXR0aW5nID0gc2hpZnQ7CisKKyAg ICBpZiAoJHRhaWxfc2V0dGluZyBlcSAidGEiKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0g ZWxzaWYgKCR0YWlsX3NldHRpbmcgZXEgInR1IikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9 IGVsc2UgeworICAgICAgICBteSAkdHJhY2UgPSAiIjsKKyAgICAgICAgaWYgKCRoYXZlX3N0YWNr dHJhY2UpIHsKKyAgICAgICAgICAgICR0cmFjZSA9IERldmVsOjpTdGFja1RyYWNlLT5uZXctPmFz X3N0cmluZzsKKyAgICAgICAgfQorICAgICAgICBkaWUoIlVuc3VwcG9ydGVkIHRhaWwgcG9saWN5 IHNldHRpbmc6Ii4kdGFpbF9zZXR0aW5nLiJcbiIuJHRyYWNlKTsKKyAgICB9Cit9CisKKyMgUmVh ZCB0aGUgbWFzayBwb2xpY3kgc2V0dGluZ3MgYW5kIGNvbnZlcnQgdG8gdm1hIGVuY29kaW5nLgor c3ViIHJlYWRfbWFza19wb2xpY3kgeworICAgIG15ICRtYXNrX3NldHRpbmcgPSBzaGlmdDsKKwor ICAgIGlmICgkbWFza19zZXR0aW5nIGVxICJtYSIpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAg fSBlbHNpZiAoJG1hc2tfc2V0dGluZyBlcSAibXUiKSB7CisgICAgICAgIHJldHVybiAwOworICAg IH0gZWxzZSB7CisgICAgICAgIG15ICR0cmFjZSA9ICIiOworICAgICAgICBpZiAoJGhhdmVfc3Rh Y2t0cmFjZSkgeworICAgICAgICAgICAgJHRyYWNlID0gRGV2ZWw6OlN0YWNrVHJhY2UtPm5ldy0+ YXNfc3RyaW5nOworICAgICAgICB9CisgICAgICAgIGRpZSgiVW5zdXBwb3J0ZWQgbWFzayBwb2xp Y3kgc2V0dGluZzoiLiRtYXNrX3NldHRpbmcuIlxuIi4kdHJhY2UpOworICAgIH0KK30KKworbXkg QHZyZWdzID0gbWFwKCJ2JF8iLCgwLi4zMSkpOworbXkgJXZyZWdsb29rdXA7CitAdnJlZ2xvb2t1 cHtAdnJlZ3N9ID0gQHZyZWdzOworCitzdWIgcmVhZF92cmVnIHsKKyAgICBteSAkdnJlZyA9IGxj IHNoaWZ0OworICAgIGlmICghZXhpc3RzKCR2cmVnbG9va3VweyR2cmVnfSkpIHsKKyAgICAgICAg bXkgJHRyYWNlID0gIiI7CisgICAgICAgIGlmICgkaGF2ZV9zdGFja3RyYWNlKSB7CisgICAgICAg ICAgICAkdHJhY2UgPSBEZXZlbDo6U3RhY2tUcmFjZS0+bmV3LT5hc19zdHJpbmc7CisgICAgICAg IH0KKyAgICAgICAgZGllKCJVbmtub3duIHZlY3RvciByZWdpc3RlciAiLiR2cmVnLiJcbiIuJHRy YWNlKTsKKyAgICB9CisgICAgaWYgKCEoJHZyZWcgPX4gL152KFswLTldKykkLykpIHsKKyAgICAg ICAgbXkgJHRyYWNlID0gIiI7CisgICAgICAgIGlmICgkaGF2ZV9zdGFja3RyYWNlKSB7CisgICAg ICAgICAgICAkdHJhY2UgPSBEZXZlbDo6U3RhY2tUcmFjZS0+bmV3LT5hc19zdHJpbmc7CisgICAg ICAgIH0KKyAgICAgICAgZGllKCJDb3VsZCBub3QgcHJvY2VzcyB2ZWN0b3IgcmVnaXN0ZXIgIi4k dnJlZy4iXG4iLiR0cmFjZSk7CisgICAgfQorICAgIHJldHVybiAkMTsKK30KKworIyBSZWFkIHRo ZSB2bSBzZXR0aW5ncyBhbmQgY29udmVydCB0byBtYXNrIGVuY29kaW5nLgorc3ViIHJlYWRfbWFz a192cmVnIHsKKyAgICBteSAkdnJlZyA9IHNoaWZ0OworICAgICMgVGhlIGRlZmF1bHQgdmFsdWUg aXMgdW5tYXNrZWQuCisgICAgbXkgJG1hc2tfYml0ID0gMTsKKworICAgIGlmIChkZWZpbmVkKCR2 cmVnKSkgeworICAgICAgICBteSAkcmVnX2lkID0gcmVhZF92cmVnICR2cmVnOworICAgICAgICBp ZiAoJHJlZ19pZCA9PSAwKSB7CisgICAgICAgICAgICAkbWFza19iaXQgPSAwOworICAgICAgICB9 IGVsc2UgeworICAgICAgICAgICAgbXkgJHRyYWNlID0gIiI7CisgICAgICAgICAgICBpZiAoJGhh dmVfc3RhY2t0cmFjZSkgeworICAgICAgICAgICAgICAgICR0cmFjZSA9IERldmVsOjpTdGFja1Ry YWNlLT5uZXctPmFzX3N0cmluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRpZSgiVGhl ICIuJHZyZWcuIiBpcyBub3QgdGhlIG1hc2sgcmVnaXN0ZXIgdjAuXG4iLiR0cmFjZSk7CisgICAg ICAgIH0KKyAgICB9CisgICAgcmV0dXJuICRtYXNrX2JpdDsKK30KKworIyBWZWN0b3IgaW5zdHJ1 Y3Rpb25zCisKK3N1YiB2YWRkX3Z2IHsKKyAgICAjIHZhZGQudnYgdmQsIHZzMiwgdnMxLCB2bQor ICAgIG15ICR0ZW1wbGF0ZSA9IDBiMDAwMDAwXzBfMDAwMDBfMDAwMDBfMDAwXzAwMDAwXzEwMTAx MTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2czIgPSByZWFkX3Zy ZWcgc2hpZnQ7CisgICAgbXkgJHZzMSA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdm0gPSBy ZWFkX21hc2tfdnJlZyBzaGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgk dm0gPDwgMjUpIHwgKCR2czIgPDwgMjApIHwgKCR2czEgPDwgMTUpIHwgKCR2ZCA8PCA3KSk7Cit9 CisKK3N1YiB2YWRkX3Z4IHsKKyAgICAjIHZhZGQudnggdmQsIHZzMiwgcnMxLCB2bQorICAgIG15 ICR0ZW1wbGF0ZSA9IDBiMDAwMDAwXzBfMDAwMDBfMDAwMDBfMTAwXzAwMDAwXzEwMTAxMTE7Cisg ICAgbXkgJHZkID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2czIgPSByZWFkX3ZyZWcgc2hp ZnQ7CisgICAgbXkgJHJzMSA9IHJlYWRfcmVnIHNoaWZ0OworICAgIG15ICR2bSA9IHJlYWRfbWFz a192cmVnIHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2bSA8PCAy NSkgfCAoJHZzMiA8PCAyMCkgfCAoJHJzMSA8PCAxNSkgfCAoJHZkIDw8IDcpKTsKK30KKworc3Vi IHZzdWJfdnYgeworICAgICMgdnN1Yi52diB2ZCwgdnMyLCB2czEsIHZtCisgICAgbXkgJHRlbXBs YXRlID0gMGIwMDAwMTBfMF8wMDAwMF8wMDAwMF8wMDBfMDAwMDBfMTAxMDExMTsKKyAgICBteSAk dmQgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMiA9IHJlYWRfdnJlZyBzaGlmdDsKKyAg ICBteSAkdnMxID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2bSA9IHJlYWRfbWFza192cmVn IHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2bSA8PCAyNSkgfCAo JHZzMiA8PCAyMCkgfCAoJHZzMSA8PCAxNSkgfCAoJHZkIDw8IDcpKTsKK30KKworc3ViIHZzdWJf dnggeworICAgICMgdnN1Yi52eCB2ZCwgdnMyLCByczEsIHZtCisgICAgbXkgJHRlbXBsYXRlID0g MGIwMDAwMTBfMF8wMDAwMF8wMDAwMF8xMDBfMDAwMDBfMTAxMDExMTsKKyAgICBteSAkdmQgPSBy ZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMiA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAk cnMxID0gcmVhZF9yZWcgc2hpZnQ7CisgICAgbXkgJHZtID0gcmVhZF9tYXNrX3ZyZWcgc2hpZnQ7 CisgICAgcmV0dXJuICIud29yZCAiLigkdGVtcGxhdGUgfCAoJHZtIDw8IDI1KSB8ICgkdnMyIDw8 IDIwKSB8ICgkcnMxIDw8IDE1KSB8ICgkdmQgPDwgNykpOworfQorCitzdWIgdmlkX3YgeworICAg ICMgdmlkLnYgdmQKKyAgICBteSAkdGVtcGxhdGUgPSAwYjAxMDEwMDFfMDAwMDBfMTAwMDFfMDEw XzAwMDAwXzEwMTAxMTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVnIHNoaWZ0OworICAgIHJldHVy biAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2aW90YV9tIHsK KyAgICAjIHZpb3RhLm0gdmQsIHZzMiwgdm0KKyAgICBteSAkdGVtcGxhdGUgPSAwYjAxMDEwMF8w XzAwMDAwXzEwMDAwXzAxMF8wMDAwMF8xMDEwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyBz aGlmdDsKKyAgICBteSAkdnMyID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2bSA9IHJlYWRf bWFza192cmVnIHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2bSA8 PCAyNSkgfCAoJHZzMiA8PCAyMCkgfCAoJHZkIDw8IDcpKTsKK30KKworc3ViIHZsZThfdiB7Cisg ICAgIyB2bGU4LnYgdmQsIChyczEpLCB2bQorICAgIG15ICR0ZW1wbGF0ZSA9IDBiMDAwMDAwXzBf MDAwMDBfMDAwMDBfMDAwXzAwMDAwXzAwMDAxMTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVnIHNo aWZ0OworICAgIG15ICRyczEgPSByZWFkX3JlZyBzaGlmdDsKKyAgICBteSAkdm0gPSByZWFkX21h c2tfdnJlZyBzaGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdm0gPDwg MjUpIHwgKCRyczEgPDwgMTUpIHwgKCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2bGUzMl92IHsKKyAg ICAjIHZsZTMyLnYgdmQsIChyczEpLCB2bQorICAgIG15ICR0ZW1wbGF0ZSA9IDBiMDAwMDAwXzBf MDAwMDBfMDAwMDBfMTEwXzAwMDAwXzAwMDAxMTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVnIHNo aWZ0OworICAgIG15ICRyczEgPSByZWFkX3JlZyBzaGlmdDsKKyAgICBteSAkdm0gPSByZWFkX21h c2tfdnJlZyBzaGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdm0gPDwg MjUpIHwgKCRyczEgPDwgMTUpIHwgKCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2bGU2NF92IHsKKyAg ICAjIHZsZTY0LnYgdmQsIChyczEpCisgICAgbXkgJHRlbXBsYXRlID0gMGIwMDAwMDAxXzAwMDAw XzAwMDAwXzExMV8wMDAwMF8wMDAwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyBzaGlmdDsK KyAgICBteSAkcnMxID0gcmVhZF9yZWcgc2hpZnQ7CisgICAgcmV0dXJuICIud29yZCAiLigkdGVt cGxhdGUgfCAoJHJzMSA8PCAxNSkgfCAoJHZkIDw8IDcpKTsKK30KKworc3ViIHZsc2UzMl92IHsK KyAgICAjIHZsc2UzMi52IHZkLCAocnMxKSwgcnMyCisgICAgbXkgJHRlbXBsYXRlID0gMGIwMDAw MTAxXzAwMDAwXzAwMDAwXzExMF8wMDAwMF8wMDAwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJl ZyBzaGlmdDsKKyAgICBteSAkcnMxID0gcmVhZF9yZWcgc2hpZnQ7CisgICAgbXkgJHJzMiA9IHJl YWRfcmVnIHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCRyczIgPDwg MjApIHwgKCRyczEgPDwgMTUpIHwgKCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2bHNzZWdfbmZfZTMy X3YgeworICAgICMgdmxzc2VnPG5mPmUzMi52IHZkLCAocnMxKSwgcnMyCisgICAgbXkgJHRlbXBs YXRlID0gMGIwMDAwMTAxXzAwMDAwXzAwMDAwXzExMF8wMDAwMF8wMDAwMTExOworICAgIG15ICRu ZiA9IHNoaWZ0OworICAgICRuZiAtPSAxOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyBzaGlmdDsK KyAgICBteSAkcnMxID0gcmVhZF9yZWcgc2hpZnQ7CisgICAgbXkgJHJzMiA9IHJlYWRfcmVnIHNo aWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCRuZiA8PCAyOSkgfCAoJHJz MiA8PCAyMCkgfCAoJHJzMSA8PCAxNSkgfCAoJHZkIDw8IDcpKTsKK30KKworc3ViIHZsc2U2NF92 IHsKKyAgICAjIHZsc2U2NC52IHZkLCAocnMxKSwgcnMyCisgICAgbXkgJHRlbXBsYXRlID0gMGIw MDAwMTAxXzAwMDAwXzAwMDAwXzExMV8wMDAwMF8wMDAwMTExOworICAgIG15ICR2ZCA9IHJlYWRf dnJlZyBzaGlmdDsKKyAgICBteSAkcnMxID0gcmVhZF9yZWcgc2hpZnQ7CisgICAgbXkgJHJzMiA9 IHJlYWRfcmVnIHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCRyczIg PDwgMjApIHwgKCRyczEgPDwgMTUpIHwgKCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2bHV4ZWk4X3Yg eworICAgICMgdmx1eGVpOC52IHZkLCAocnMxKSwgdnMyLCB2bQorICAgIG15ICR0ZW1wbGF0ZSA9 IDBiMDAwMDAxXzBfMDAwMDBfMDAwMDBfMDAwXzAwMDAwXzAwMDAxMTE7CisgICAgbXkgJHZkID0g cmVhZF92cmVnIHNoaWZ0OworICAgIG15ICRyczEgPSByZWFkX3JlZyBzaGlmdDsKKyAgICBteSAk dnMyID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2bSA9IHJlYWRfbWFza192cmVnIHNoaWZ0 OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2bSA8PCAyNSkgfCAoJHZzMiA8 PCAyMCkgfCAoJHJzMSA8PCAxNSkgfCAoJHZkIDw8IDcpKTsKK30KKworc3ViIHZtZXJnZV92aW0g eworICAgICMgdm1lcmdlLnZpbSB2ZCwgdnMyLCBpbW0sIHYwCisgICAgbXkgJHRlbXBsYXRlID0g MGIwMTAxMTEwXzAwMDAwXzAwMDAwXzAxMV8wMDAwMF8xMDEwMTExOworICAgIG15ICR2ZCA9IHJl YWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdnMyID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICRp bW0gPSBzaGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIw KSB8ICgkaW1tIDw8IDE1KSB8ICgkdmQgPDwgNykpOworfQorCitzdWIgdm1lcmdlX3Z2bSB7Cisg ICAgIyB2bWVyZ2UudnZtIHZkIHZzMiB2czEKKyAgICBteSAkdGVtcGxhdGUgPSAwYjAxMDExMTBf MDAwMDBfMDAwMDBfMDAwXzAwMDAwXzEwMTAxMTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVnIHNo aWZ0OworICAgIG15ICR2czIgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMSA9IHJlYWRf dnJlZyBzaGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIw KSB8ICgkdnMxIDw8IDE1KSB8ICgkdmQgPDwgNykpCit9CisKK3N1YiB2bXNlcV92aSB7CisgICAg IyB2bXNlcS52aSB2ZCB2czEsIGltbQorICAgIG15ICR0ZW1wbGF0ZSA9IDBiMDExMDAwMV8wMDAw MF8wMDAwMF8wMTFfMDAwMDBfMTAxMDExMTsKKyAgICBteSAkdmQgPSByZWFkX3ZyZWcgc2hpZnQ7 CisgICAgbXkgJHZzMSA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkaW1tID0gc2hpZnQ7Cisg ICAgcmV0dXJuICIud29yZCAiLigkdGVtcGxhdGUgfCAoJHZzMSA8PCAyMCkgfCAoJGltbSA8PCAx NSkgfCAoJHZkIDw8IDcpKQorfQorCitzdWIgdm1zZ3R1X3Z4IHsKKyAgICAjIHZtc2d0dS52eCB2 ZCB2czIsIHJzMSwgdm0KKyAgICBteSAkdGVtcGxhdGUgPSAwYjAxMTExMF8wXzAwMDAwXzAwMDAw XzEwMF8wMDAwMF8xMDEwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBt eSAkdnMyID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICRyczEgPSByZWFkX3JlZyBzaGlmdDsK KyAgICBteSAkdm0gPSByZWFkX21hc2tfdnJlZyBzaGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIu KCR0ZW1wbGF0ZSB8ICgkdm0gPDwgMjUpIHwgKCR2czIgPDwgMjApIHwgKCRyczEgPDwgMTUpIHwg KCR2ZCA8PCA3KSkKK30KKworc3ViIHZtdl92X2kgeworICAgICMgdm12LnYuaSB2ZCwgaW1tCisg ICAgbXkgJHRlbXBsYXRlID0gMGIwMTAxMTExXzAwMDAwXzAwMDAwXzAxMV8wMDAwMF8xMDEwMTEx OworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkaW1tID0gc2hpZnQ7Cisg ICAgcmV0dXJuICIud29yZCAiLigkdGVtcGxhdGUgfCAoJGltbSA8PCAxNSkgfCAoJHZkIDw8IDcp KTsKK30KKworc3ViIHZtdl92X3ggeworICAgICMgdm12LnYueCB2ZCwgcnMxCisgICAgbXkgJHRl bXBsYXRlID0gMGIwMTAxMTExXzAwMDAwXzAwMDAwXzEwMF8wMDAwMF8xMDEwMTExOworICAgIG15 ICR2ZCA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkcnMxID0gcmVhZF9yZWcgc2hpZnQ7Cisg ICAgcmV0dXJuICIud29yZCAiLigkdGVtcGxhdGUgfCAoJHJzMSA8PCAxNSkgfCAoJHZkIDw8IDcp KTsKK30KKworc3ViIHZtdl92X3YgeworICAgICMgdm12LnYudiB2ZCwgdnMxCisgICAgbXkgJHRl bXBsYXRlID0gMGIwMTAxMTExXzAwMDAwXzAwMDAwXzAwMF8wMDAwMF8xMDEwMTExOworICAgIG15 ICR2ZCA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdnMxID0gcmVhZF92cmVnIHNoaWZ0Owor ICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2czEgPDwgMTUpIHwgKCR2ZCA8PCA3 KSk7Cit9CisKK3N1YiB2b3JfdnZfdjB0IHsKKyAgICAjIHZvci52diB2ZCwgdnMyLCB2czEsIHYw LnQKKyAgICBteSAkdGVtcGxhdGUgPSAwYjAwMTAxMDBfMDAwMDBfMDAwMDBfMDAwXzAwMDAwXzEw MTAxMTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2czIgPSByZWFk X3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMSA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICByZXR1cm4g Ii53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIwKSB8ICgkdnMxIDw8IDE1KSB8ICgkdmQg PDwgNykpOworfQorCitzdWIgdnNlOF92IHsKKyAgICAjIHZzZTgudiB2ZCwgKHJzMSksIHZtCisg ICAgbXkgJHRlbXBsYXRlID0gMGIwMDAwMDBfMF8wMDAwMF8wMDAwMF8wMDBfMDAwMDBfMDEwMDEx MTsKKyAgICBteSAkdmQgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHJzMSA9IHJlYWRfcmVn IHNoaWZ0OworICAgIG15ICR2bSA9IHJlYWRfbWFza192cmVnIHNoaWZ0OworICAgIHJldHVybiAi LndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2bSA8PCAyNSkgfCAoJHJzMSA8PCAxNSkgfCAoJHZkIDw8 IDcpKTsKK30KKworc3ViIHZzZTMyX3YgeworICAgICMgdnNlMzIudiB2ZCwgKHJzMSksIHZtCisg ICAgbXkgJHRlbXBsYXRlID0gMGIwMDAwMDBfMF8wMDAwMF8wMDAwMF8xMTBfMDAwMDBfMDEwMDEx MTsKKyAgICBteSAkdmQgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHJzMSA9IHJlYWRfcmVn IHNoaWZ0OworICAgIG15ICR2bSA9IHJlYWRfbWFza192cmVnIHNoaWZ0OworICAgIHJldHVybiAi LndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2bSA8PCAyNSkgfCAoJHJzMSA8PCAxNSkgfCAoJHZkIDw8 IDcpKTsKK30KKworc3ViIHZzc3NlZ19uZl9lMzJfdiB7CisgICAgIyB2c3NzZWc8bmY+ZTMyLnYg dnMzLCAocnMxKSwgcnMyCisgICAgbXkgJHRlbXBsYXRlID0gMGIwMDAwMTAxXzAwMDAwXzAwMDAw XzExMF8wMDAwMF8wMTAwMTExOworICAgIG15ICRuZiA9IHNoaWZ0OworICAgICRuZiAtPSAxOwor ICAgIG15ICR2czMgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHJzMSA9IHJlYWRfcmVnIHNo aWZ0OworICAgIG15ICRyczIgPSByZWFkX3JlZyBzaGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIu KCR0ZW1wbGF0ZSB8ICgkbmYgPDwgMjkpIHwgKCRyczIgPDwgMjApIHwgKCRyczEgPDwgMTUpIHwg KCR2czMgPDwgNykpOworfQorCitzdWIgdnN1eGVpOF92IHsKKyAgICMgdnN1eGVpOC52IHZzMywg KHJzMSksIHZzMiwgdm0KKyAgIG15ICR0ZW1wbGF0ZSA9IDBiMDAwMDAxXzBfMDAwMDBfMDAwMDBf MDAwXzAwMDAwXzAxMDAxMTE7CisgICBteSAkdnMzID0gcmVhZF92cmVnIHNoaWZ0OworICAgbXkg JHJzMSA9IHJlYWRfcmVnIHNoaWZ0OworICAgbXkgJHZzMiA9IHJlYWRfdnJlZyBzaGlmdDsKKyAg IG15ICR2bSA9IHJlYWRfbWFza192cmVnIHNoaWZ0OworICAgcmV0dXJuICIud29yZCAiLigkdGVt cGxhdGUgfCAoJHZtIDw8IDI1KSB8ICgkdnMyIDw8IDIwKSB8ICgkcnMxIDw8IDE1KSB8ICgkdnMz IDw8IDcpKTsKK30KKworc3ViIHZzZTY0X3YgeworICAgICMgdnNlNjQudiB2ZCwgKHJzMSkKKyAg ICBteSAkdGVtcGxhdGUgPSAwYjAwMDAwMDFfMDAwMDBfMDAwMDBfMTExXzAwMDAwXzAxMDAxMTE7 CisgICAgbXkgJHZkID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICRyczEgPSByZWFkX3JlZyBz aGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkcnMxIDw8IDE1KSB8ICgk dmQgPDwgNykpOworfQorCitzdWIgdnNldGl2bGlfX3gwXzJfZTY0X20xX3R1X211IHsKKyAgICAj IHZzZXRpdmxpIHgwLCAyLCBlNjQsIG0xLCB0dSwgbXUKKyAgICByZXR1cm4gIi53b3JkIDB4YzE4 MTcwNTciOworfQorCitzdWIgdnNldGl2bGlfX3gwXzRfZTMyX20xX3R1X211IHsKKyAgICAjIHZz ZXRpdmxpIHgwLCA0LCBlMzIsIG0xLCB0dSwgbXUKKyAgICByZXR1cm4gIi53b3JkIDB4YzEwMjcw NTciOworfQorCitzdWIgdnNldGl2bGlfX3gwXzRfZTY0X20xX3R1X211IHsKKyAgICAjIHZzZXRp dmxpIHgwLCA0LCBlNjQsIG0xLCB0dSwgbXUKKyAgICByZXR1cm4gIi53b3JkIDB4YzE4MjcwNTci OworfQorCitzdWIgdnNldGl2bGlfX3gwXzhfZTMyX20xX3R1X211IHsKKyAgICAjIHZzZXRpdmxp IHgwLCA4LCBlMzIsIG0xLCB0dSwgbXUKKyAgICByZXR1cm4gIi53b3JkIDB4YzEwNDcwNTciOwor fQorCitzdWIgdnNldHZsaSB7CisgICAgIyB2c2V0dmxpIHJkLCByczEsIHZ0eXBlaQorICAgIG15 ICR0ZW1wbGF0ZSA9IDBiMF8wMDAwMDAwMDAwMF8wMDAwMF8xMTFfMDAwMDBfMTAxMDExMTsKKyAg ICBteSAkcmQgPSByZWFkX3JlZyBzaGlmdDsKKyAgICBteSAkcnMxID0gcmVhZF9yZWcgc2hpZnQ7 CisgICAgbXkgJHNldyA9IHJlYWRfc2V3IHNoaWZ0OworICAgIG15ICRsbXVsID0gcmVhZF9sbXVs IHNoaWZ0OworICAgIG15ICR0YWlsX3BvbGljeSA9IHJlYWRfdGFpbF9wb2xpY3kgc2hpZnQ7Cisg ICAgbXkgJG1hc2tfcG9saWN5ID0gcmVhZF9tYXNrX3BvbGljeSBzaGlmdDsKKyAgICBteSAkdnR5 cGVpID0gKCRtYXNrX3BvbGljeSA8PCA3KSB8ICgkdGFpbF9wb2xpY3kgPDwgNikgfCAoJHNldyA8 PCAzKSB8ICRsbXVsOworCisgICAgcmV0dXJuICIud29yZCAiLigkdGVtcGxhdGUgfCAoJHZ0eXBl aSA8PCAyMCkgfCAoJHJzMSA8PCAxNSkgfCAoJHJkIDw8IDcpKTsKK30KKworc3ViIHZzZXRpdmxp IHsKKyAgICAjIHZzZXR2bGkgcmQsIHVpbW0sIHZ0eXBlaQorICAgIG15ICR0ZW1wbGF0ZSA9IDBi MTFfMDAwMDAwMDAwMF8wMDAwMF8xMTFfMDAwMDBfMTAxMDExMTsKKyAgICBteSAkcmQgPSByZWFk X3JlZyBzaGlmdDsKKyAgICBteSAkdWltbSA9IHNoaWZ0OworICAgIG15ICRzZXcgPSByZWFkX3Nl dyBzaGlmdDsKKyAgICBteSAkbG11bCA9IHJlYWRfbG11bCBzaGlmdDsKKyAgICBteSAkdGFpbF9w b2xpY3kgPSByZWFkX3RhaWxfcG9saWN5IHNoaWZ0OworICAgIG15ICRtYXNrX3BvbGljeSA9IHJl YWRfbWFza19wb2xpY3kgc2hpZnQ7CisgICAgbXkgJHZ0eXBlaSA9ICgkbWFza19wb2xpY3kgPDwg NykgfCAoJHRhaWxfcG9saWN5IDw8IDYpIHwgKCRzZXcgPDwgMykgfCAkbG11bDsKKworICAgIHJl dHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2dHlwZWkgPDwgMjApIHwgKCR1aW1tIDw8IDE1 KSB8ICgkcmQgPDwgNykpOworfQorCitzdWIgdnNsaWRlZG93bl92aSB7CisgICAgIyB2c2xpZGVk b3duLnZpIHZkLCB2czIsIHVpbW0KKyAgICBteSAkdGVtcGxhdGUgPSAwYjAwMTExMTFfMDAwMDBf MDAwMDBfMDExXzAwMDAwXzEwMTAxMTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVnIHNoaWZ0Owor ICAgIG15ICR2czIgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHVpbW0gPSBzaGlmdDsKKyAg ICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIwKSB8ICgkdWltbSA8PCAx NSkgfCAoJHZkIDw8IDcpKTsKK30KKworc3ViIHZzbGlkZWRvd25fdnggeworICAgICMgdnNsaWRl ZG93bi52eCB2ZCwgdnMyLCByczEKKyAgICBteSAkdGVtcGxhdGUgPSAwYjAwMTExMTFfMDAwMDBf MDAwMDBfMTAwXzAwMDAwXzEwMTAxMTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVnIHNoaWZ0Owor ICAgIG15ICR2czIgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHJzMSA9IHJlYWRfcmVnIHNo aWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2czIgPDwgMjApIHwgKCRy czEgPDwgMTUpIHwgKCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2c2xpZGV1cF92aV92MHQgeworICAg ICMgdnNsaWRldXAudmkgdmQsIHZzMiwgdWltbSwgdjAudAorICAgIG15ICR0ZW1wbGF0ZSA9IDBi MDAxMTEwMF8wMDAwMF8wMDAwMF8wMTFfMDAwMDBfMTAxMDExMTsKKyAgICBteSAkdmQgPSByZWFk X3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMiA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdWlt bSA9IHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2czIgPDwgMjAp IHwgKCR1aW1tIDw8IDE1KSB8ICgkdmQgPDwgNykpOworfQorCitzdWIgdnNsaWRldXBfdmkgewor ICAgICMgdnNsaWRldXAudmkgdmQsIHZzMiwgdWltbQorICAgIG15ICR0ZW1wbGF0ZSA9IDBiMDAx MTEwMV8wMDAwMF8wMDAwMF8wMTFfMDAwMDBfMTAxMDExMTsKKyAgICBteSAkdmQgPSByZWFkX3Zy ZWcgc2hpZnQ7CisgICAgbXkgJHZzMiA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdWltbSA9 IHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2czIgPDwgMjApIHwg KCR1aW1tIDw8IDE1KSB8ICgkdmQgPDwgNykpOworfQorCitzdWIgdnNsbF92aSB7CisgICAgIyB2 c2xsLnZpIHZkLCB2czIsIHVpbW0sIHZtCisgICAgbXkgJHRlbXBsYXRlID0gMGIxMDAxMDExXzAw MDAwXzAwMDAwXzAxMV8wMDAwMF8xMDEwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyBzaGlm dDsKKyAgICBteSAkdnMyID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR1aW1tID0gc2hpZnQ7 CisgICAgcmV0dXJuICIud29yZCAiLigkdGVtcGxhdGUgfCAoJHZzMiA8PCAyMCkgfCAoJHVpbW0g PDwgMTUpIHwgKCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2c3JsX3Z4IHsKKyAgICAjIHZzcmwudngg dmQsIHZzMiwgcnMxCisgICAgbXkgJHRlbXBsYXRlID0gMGIxMDEwMDAxXzAwMDAwXzAwMDAwXzEw MF8wMDAwMF8xMDEwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAk dnMyID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICRyczEgPSByZWFkX3JlZyBzaGlmdDsKKyAg ICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIwKSB8ICgkcnMxIDw8IDE1 KSB8ICgkdmQgPDwgNykpOworfQorCitzdWIgdnNzZTMyX3YgeworICAgICMgdnNlMzIudiB2czMs IChyczEpLCByczIKKyAgICBteSAkdGVtcGxhdGUgPSAwYjAwMDAxMDFfMDAwMDBfMDAwMDBfMTEw XzAwMDAwXzAxMDAxMTE7CisgICAgbXkgJHZzMyA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAk cnMxID0gcmVhZF9yZWcgc2hpZnQ7CisgICAgbXkgJHJzMiA9IHJlYWRfcmVnIHNoaWZ0OworICAg IHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCRyczIgPDwgMjApIHwgKCRyczEgPDwgMTUp IHwgKCR2czMgPDwgNykpOworfQorCitzdWIgdnNzZTY0X3YgeworICAgICMgdnNzZTY0LnYgdnMz LCAocnMxKSwgcnMyCisgICAgbXkgJHRlbXBsYXRlID0gMGIwMDAwMTAxXzAwMDAwXzAwMDAwXzEx MV8wMDAwMF8wMTAwMTExOworICAgIG15ICR2czMgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkg JHJzMSA9IHJlYWRfcmVnIHNoaWZ0OworICAgIG15ICRyczIgPSByZWFkX3JlZyBzaGlmdDsKKyAg ICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkcnMyIDw8IDIwKSB8ICgkcnMxIDw8IDE1 KSB8ICgkdnMzIDw8IDcpKTsKK30KKworc3ViIHZ4b3JfdnZfdjB0IHsKKyAgICAjIHZ4b3IudnYg dmQsIHZzMiwgdnMxLCB2MC50CisgICAgbXkgJHRlbXBsYXRlID0gMGIwMDEwMTEwXzAwMDAwXzAw MDAwXzAwMF8wMDAwMF8xMDEwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyBzaGlmdDsKKyAg ICBteSAkdnMyID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2czEgPSByZWFkX3ZyZWcgc2hp ZnQ7CisgICAgcmV0dXJuICIud29yZCAiLigkdGVtcGxhdGUgfCAoJHZzMiA8PCAyMCkgfCAoJHZz MSA8PCAxNSkgfCAoJHZkIDw8IDcpKTsKK30KKworc3ViIHZ4b3JfdnYgeworICAgICMgdnhvci52 diB2ZCwgdnMyLCB2czEKKyAgICBteSAkdGVtcGxhdGUgPSAwYjAwMTAxMTFfMDAwMDBfMDAwMDBf MDAwXzAwMDAwXzEwMTAxMTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15 ICR2czIgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMSA9IHJlYWRfdnJlZyBzaGlmdDsK KyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIwKSB8ICgkdnMxIDw8 IDE1KSB8ICgkdmQgPDwgNykpOworfQorCitzdWIgdnpleHRfdmYyIHsKKyAgICAjIHZ6ZXh0LnZm MiB2ZCwgdnMyLCB2bQorICAgIG15ICR0ZW1wbGF0ZSA9IDBiMDEwMDEwXzBfMDAwMDBfMDAxMTBf MDEwXzAwMDAwXzEwMTAxMTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15 ICR2czIgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZtID0gcmVhZF9tYXNrX3ZyZWcgc2hp ZnQ7CisgICAgcmV0dXJuICIud29yZCAiLigkdGVtcGxhdGUgfCAoJHZtIDw8IDI1KSB8ICgkdnMy IDw8IDIwKSB8ICgkdmQgPDwgNykpOworfQorCisjIFZlY3RvciBjcnlwdG8gaW5zdHJ1Y3Rpb25z CisKKyMjIFp2YmIgYW5kIFp2a2IgaW5zdHJ1Y3Rpb25zCisjIworIyMgdmFuZG4gKGFsc28gaW4g enZrYikKKyMjIHZicmV2CisjIyB2YnJldjggKGFsc28gaW4genZrYikKKyMjIHZyZXY4IChhbHNv IGluIHp2a2IpCisjIyB2Y2x6CisjIyB2Y3R6CisjIyB2Y3BvcAorIyMgdnJvbCAoYWxzbyBpbiB6 dmtiKQorIyMgdnJvciAoYWxzbyBpbiB6dmtiKQorIyMgdndzbGwKKworc3ViIHZicmV2OF92IHsK KyAgICAjIHZicmV2OC52IHZkLCB2czIsIHZtCisgICAgbXkgJHRlbXBsYXRlID0gMGIwMTAwMTBf MF8wMDAwMF8wMTAwMF8wMTBfMDAwMDBfMTAxMDExMTsKKyAgICBteSAkdmQgPSByZWFkX3ZyZWcg c2hpZnQ7CisgICAgbXkgJHZzMiA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdm0gPSByZWFk X21hc2tfdnJlZyBzaGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdm0g PDwgMjUpIHwgKCR2czIgPDwgMjApIHwgKCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2cmV2OF92IHsK KyAgICAjIHZyZXY4LnYgdmQsIHZzMiwgdm0KKyAgICBteSAkdGVtcGxhdGUgPSAwYjAxMDAxMF8w XzAwMDAwXzAxMDAxXzAxMF8wMDAwMF8xMDEwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyBz aGlmdDsKKyAgICBteSAkdnMyID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2bSA9IHJlYWRf bWFza192cmVnIHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2bSA8 PCAyNSkgfCAoJHZzMiA8PCAyMCkgfCAoJHZkIDw8IDcpKTsKK30KKworc3ViIHZyb3Jfdmkgewor ICAgICMgdnJvci52aSB2ZCwgdnMyLCB1aW1tCisgICAgbXkgJHRlbXBsYXRlID0gMGIwMTAxMF8w XzFfMDAwMDBfMDAwMDBfMDExXzAwMDAwXzEwMTAxMTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVn IHNoaWZ0OworICAgIG15ICR2czIgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHVpbW0gPSBz aGlmdDsKKyAgICBteSAkdWltbV9pNSA9ICR1aW1tID4+IDU7CisgICAgbXkgJHVpbW1faTRfMCA9 ICR1aW1tICYgMGIxMTExMTsKKworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR1 aW1tX2k1IDw8IDI2KSB8ICgkdnMyIDw8IDIwKSB8ICgkdWltbV9pNF8wIDw8IDE1KSB8ICgkdmQg PDwgNykpOworfQorCitzdWIgdndzbGxfdnYgeworICAgICMgdndzbGwudnYgdmQsIHZzMiwgdnMx LCB2bQorICAgIG15ICR0ZW1wbGF0ZSA9IDBiMTEwMTAxXzBfMDAwMDBfMDAwMDBfMDAwXzAwMDAw XzEwMTAxMTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2czIgPSBy ZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMSA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAk dm0gPSByZWFkX21hc2tfdnJlZyBzaGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0 ZSB8ICgkdm0gPDwgMjUpIHwgKCR2czIgPDwgMjApIHwgKCR2czEgPDwgMTUpIHwgKCR2ZCA8PCA3 KSk7Cit9CisKKyMjIFp2YmMgaW5zdHJ1Y3Rpb25zCisKK3N1YiB2Y2xtdWxoX3Z4IHsKKyAgICAj IHZjbG11bGgudnggdmQsIHZzMiwgcnMxCisgICAgbXkgJHRlbXBsYXRlID0gMGIwMDExMDExXzAw MDAwXzAwMDAwXzExMF8wMDAwMF8xMDEwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyBzaGlm dDsKKyAgICBteSAkdnMyID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICRyczEgPSByZWFkX3Jl ZyBzaGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIwKSB8 ICgkcnMxIDw8IDE1KSB8ICgkdmQgPDwgNykpOworfQorCitzdWIgdmNsbXVsX3Z4X3YwdCB7Cisg ICAgIyB2Y2xtdWwudnggdmQsIHZzMiwgcnMxLCB2MC50CisgICAgbXkgJHRlbXBsYXRlID0gMGIw MDExMDAwXzAwMDAwXzAwMDAwXzExMF8wMDAwMF8xMDEwMTExOworICAgIG15ICR2ZCA9IHJlYWRf dnJlZyBzaGlmdDsKKyAgICBteSAkdnMyID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICRyczEg PSByZWFkX3JlZyBzaGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMy IDw8IDIwKSB8ICgkcnMxIDw8IDE1KSB8ICgkdmQgPDwgNykpOworfQorCitzdWIgdmNsbXVsX3Z4 IHsKKyAgICAjIHZjbG11bC52eCB2ZCwgdnMyLCByczEKKyAgICBteSAkdGVtcGxhdGUgPSAwYjAw MTEwMDFfMDAwMDBfMDAwMDBfMTEwXzAwMDAwXzEwMTAxMTE7CisgICAgbXkgJHZkID0gcmVhZF92 cmVnIHNoaWZ0OworICAgIG15ICR2czIgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHJzMSA9 IHJlYWRfcmVnIHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2czIg PDwgMjApIHwgKCRyczEgPDwgMTUpIHwgKCR2ZCA8PCA3KSk7Cit9CisKKyMjIFp2a2cgaW5zdHJ1 Y3Rpb25zCisKK3N1YiB2Z2hzaF92diB7CisgICAgIyB2Z2hzaC52diB2ZCwgdnMyLCB2czEKKyAg ICBteSAkdGVtcGxhdGUgPSAwYjEwMTEwMDFfMDAwMDBfMDAwMDBfMDEwXzAwMDAwXzExMTAxMTE7 CisgICAgbXkgJHZkID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2czIgPSByZWFkX3ZyZWcg c2hpZnQ7CisgICAgbXkgJHZzMSA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICByZXR1cm4gIi53b3Jk ICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIwKSB8ICgkdnMxIDw8IDE1KSB8ICgkdmQgPDwgNykp OworfQorCitzdWIgdmdtdWxfdnYgeworICAgICMgdmdtdWwudnYgdmQsIHZzMgorICAgIG15ICR0 ZW1wbGF0ZSA9IDBiMTAxMDAwMV8wMDAwMF8xMDAwMV8wMTBfMDAwMDBfMTExMDExMTsKKyAgICBt eSAkdmQgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMiA9IHJlYWRfdnJlZyBzaGlmdDsK KyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIwKSB8ICgkdmQgPDwg NykpOworfQorCisjIyBadmtuZWQgaW5zdHJ1Y3Rpb25zCisKK3N1YiB2YWVzZGZfdnMgeworICAg ICMgdmFlc2RmLnZzIHZkLCB2czIKKyAgICBteSAkdGVtcGxhdGUgPSAwYjEwMTAwMV8xXzAwMDAw XzAwMDAxXzAxMF8wMDAwMF8xMTEwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyAgc2hpZnQ7 CisgICAgbXkgJHZzMiA9IHJlYWRfdnJlZyAgc2hpZnQ7CisgICAgcmV0dXJuICIud29yZCAiLigk dGVtcGxhdGUgfCAoJHZzMiA8PCAyMCkgfCAoJHZkIDw8IDcpKTsKK30KKworc3ViIHZhZXNkbV92 cyB7CisgICAgIyB2YWVzZG0udnMgdmQsIHZzMgorICAgIG15ICR0ZW1wbGF0ZSA9IDBiMTAxMDAx XzFfMDAwMDBfMDAwMDBfMDEwXzAwMDAwXzExMTAxMTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVn IHNoaWZ0OworICAgIG15ICR2czIgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgcmV0dXJuICIud29y ZCAiLigkdGVtcGxhdGUgfCAoJHZzMiA8PCAyMCkgfCAoJHZkIDw8IDcpKTsKK30KKworc3ViIHZh ZXNlZl92cyB7CisgICAgIyB2YWVzZWYudnMgdmQsIHZzMgorICAgIG15ICR0ZW1wbGF0ZSA9IDBi MTAxMDAxXzFfMDAwMDBfMDAwMTFfMDEwXzAwMDAwXzExMTAxMTE7CisgICAgbXkgJHZkID0gcmVh ZF92cmVnICBzaGlmdDsKKyAgICBteSAkdnMyID0gcmVhZF92cmVnICBzaGlmdDsKKyAgICByZXR1 cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIwKSB8ICgkdmQgPDwgNykpOworfQor CitzdWIgdmFlc2VtX3ZzIHsKKyAgICAjIHZhZXNlbS52cyB2ZCwgdnMyCisgICAgbXkgJHRlbXBs YXRlID0gMGIxMDEwMDFfMV8wMDAwMF8wMDAxMF8wMTBfMDAwMDBfMTExMDExMTsKKyAgICBteSAk dmQgPSByZWFkX3ZyZWcgIHNoaWZ0OworICAgIG15ICR2czIgPSByZWFkX3ZyZWcgIHNoaWZ0Owor ICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2czIgPDwgMjApIHwgKCR2ZCA8PCA3 KSk7Cit9CisKK3N1YiB2YWVza2YxX3ZpIHsKKyAgICAjIHZhZXNrZjEudmkgdmQsIHZzMiwgdWlt bW0KKyAgICBteSAkdGVtcGxhdGUgPSAwYjEwMDAxMF8xXzAwMDAwXzAwMDAwXzAxMF8wMDAwMF8x MTEwMTExOworICAgIG15ICR2ZCA9IHJlYWRfdnJlZyAgc2hpZnQ7CisgICAgbXkgJHZzMiA9IHJl YWRfdnJlZyAgc2hpZnQ7CisgICAgbXkgJHVpbW0gPSBzaGlmdDsKKyAgICByZXR1cm4gIi53b3Jk ICIuKCR0ZW1wbGF0ZSB8ICgkdWltbSA8PCAxNSkgfCAoJHZzMiA8PCAyMCkgfCAoJHZkIDw8IDcp KTsKK30KKworc3ViIHZhZXNrZjJfdmkgeworICAgICMgdmFlc2tmMi52aSB2ZCwgdnMyLCB1aW1t CisgICAgbXkgJHRlbXBsYXRlID0gMGIxMDEwMTBfMV8wMDAwMF8wMDAwMF8wMTBfMDAwMDBfMTEx MDExMTsKKyAgICBteSAkdmQgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMiA9IHJlYWRf dnJlZyBzaGlmdDsKKyAgICBteSAkdWltbSA9IHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4o JHRlbXBsYXRlIHwgKCR2czIgPDwgMjApIHwgKCR1aW1tIDw8IDE1KSB8ICgkdmQgPDwgNykpOwor fQorCitzdWIgdmFlc3pfdnMgeworICAgICMgdmFlc3oudnMgdmQsIHZzMgorICAgIG15ICR0ZW1w bGF0ZSA9IDBiMTAxMDAxXzFfMDAwMDBfMDAxMTFfMDEwXzAwMDAwXzExMTAxMTE7CisgICAgbXkg JHZkID0gcmVhZF92cmVnICBzaGlmdDsKKyAgICBteSAkdnMyID0gcmVhZF92cmVnICBzaGlmdDsK KyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIwKSB8ICgkdmQgPDwg NykpOworfQorCisjIyBadmtuaGEgYW5kIFp2a25oYiBpbnN0cnVjdGlvbnMKKworc3ViIHZzaGEy bXNfdnYgeworICAgICMgdnNoYTJtcy52diB2ZCwgdnMyLCB2czEKKyAgICBteSAkdGVtcGxhdGUg PSAwYjEwMTEwMTFfMDAwMDBfMDAwMDBfMDEwXzAwMDAwXzExMTAxMTE7CisgICAgbXkgJHZkID0g cmVhZF92cmVnIHNoaWZ0OworICAgIG15ICR2czIgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkg JHZzMSA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8 ICgkdnMyIDw8IDIwKXwgKCR2czEgPDwgMTUgKXwgKCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2c2hh MmNoX3Z2IHsKKyAgICAjIHZzaGEyY2gudnYgdmQsIHZzMiwgdnMxCisgICAgbXkgJHRlbXBsYXRl ID0gMGIxMDExMTBfMTAwMDBfMDAwMDBfMDAxXzAwMDAwXzAxMTEwMTExOworICAgIG15ICR2ZCA9 IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdnMyID0gcmVhZF92cmVnIHNoaWZ0OworICAgIG15 ICR2czEgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgcmV0dXJuICIud29yZCAiLigkdGVtcGxhdGUg fCAoJHZzMiA8PCAyMCl8ICgkdnMxIDw8IDE1ICl8ICgkdmQgPDwgNykpOworfQorCitzdWIgdnNo YTJjbF92diB7CisgICAgIyB2c2hhMmNsLnZ2IHZkLCB2czIsIHZzMQorICAgIG15ICR0ZW1wbGF0 ZSA9IDBiMTAxMTExXzEwMDAwXzAwMDAwXzAwMV8wMDAwMF8wMTExMDExMTsKKyAgICBteSAkdmQg PSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMiA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBt eSAkdnMxID0gcmVhZF92cmVnIHNoaWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRl IHwgKCR2czIgPDwgMjApfCAoJHZzMSA8PCAxNSApfCAoJHZkIDw8IDcpKTsKK30KKworIyMgWnZr c2VkIGluc3RydWN0aW9ucworCitzdWIgdnNtNGtfdmkgeworICAgICMgdnNtNGsudmkgdmQsIHZz MiwgdWltbQorICAgIG15ICR0ZW1wbGF0ZSA9IDBiMTAwMDAxMV8wMDAwMF8wMDAwMF8wMTBfMDAw MDBfMTExMDExMTsKKyAgICBteSAkdmQgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMiA9 IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdWltbSA9IHNoaWZ0OworICAgIHJldHVybiAiLndv cmQgIi4oJHRlbXBsYXRlIHwgKCR2czIgPDwgMjApIHwgKCR1aW1tIDw8IDE1KSB8ICgkdmQgPDwg NykpOworfQorCitzdWIgdnNtNHJfdnMgeworICAgICMgdnNtNHIudnMgdmQsIHZzMgorICAgIG15 ICR0ZW1wbGF0ZSA9IDBiMTAxMDAxMV8wMDAwMF8xMDAwMF8wMTBfMDAwMDBfMTExMDExMTsKKyAg ICBteSAkdmQgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHZzMiA9IHJlYWRfdnJlZyBzaGlm dDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIwKSB8ICgkdmQg PDwgNykpOworfQorCisjIyB6dmtzaCBpbnN0cnVjdGlvbnMKKworc3ViIHZzbTNjX3ZpIHsKKyAg ICAjIHZzbTNjLnZpIHZkLCB2czIsIHVpbW0KKyAgICBteSAkdGVtcGxhdGUgPSAwYjEwMTAxMTFf MDAwMDBfMDAwMDBfMDEwXzAwMDAwXzExMTAxMTE7CisgICAgbXkgJHZkID0gcmVhZF92cmVnIHNo aWZ0OworICAgIG15ICR2czIgPSByZWFkX3ZyZWcgc2hpZnQ7CisgICAgbXkgJHVpbW0gPSBzaGlm dDsKKyAgICByZXR1cm4gIi53b3JkICIuKCR0ZW1wbGF0ZSB8ICgkdnMyIDw8IDIwKSB8ICgkdWlt bSA8PCAxNSApIHwgKCR2ZCA8PCA3KSk7Cit9CisKK3N1YiB2c20zbWVfdnYgeworICAgICMgdnNt M21lLnZ2IHZkLCB2czIsIHZzMQorICAgIG15ICR0ZW1wbGF0ZSA9IDBiMTAwMDAwMV8wMDAwMF8w MDAwMF8wMTBfMDAwMDBfMTExMDExMTsKKyAgICBteSAkdmQgPSByZWFkX3ZyZWcgc2hpZnQ7Cisg ICAgbXkgJHZzMiA9IHJlYWRfdnJlZyBzaGlmdDsKKyAgICBteSAkdnMxID0gcmVhZF92cmVnIHNo aWZ0OworICAgIHJldHVybiAiLndvcmQgIi4oJHRlbXBsYXRlIHwgKCR2czIgPDwgMjApIHwgKCR2 czEgPDwgMTUgKSB8ICgkdmQgPDwgNykpOworfQorCisxOwotLSAKMi4yOC4wCgoKX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFpbGlu ZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJh ZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yaXNjdgo=