From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pl1-f174.google.com (mail-pl1-f174.google.com [209.85.214.174]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 022BC17E4 for ; Mon, 20 Jan 2025 04:50:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.174 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737348618; cv=none; b=pIRA3f+DCI9auURqCJLspQi/l0JICTq0EMg616Hh4H2zzRkS8ngFlyVT2r5fzC+Io9QvaAk5iiPIXzGw3e7bnszxjSyqog4crZaFBn5G6bO9nOzPdYhgX8lGpGkBop7sKeWdgHj7mdfh1V2uLy/W39FGm5D9niUxCTJpgcKeV1o= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1737348618; c=relaxed/simple; bh=6xgSNF6nm1/bOhS9EzsxubeHMdZiALiIz9hmBvxVXOU=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=tIL7dRoUmSoLtVYbRfnSj8VnUk1NB4AW7Mv/UQ0icorRIcUm7q34fpFqkd4MYOL3DP/P2mmj+yIFlfWlcQLo7to7W2/o1zrw0UwsdOneh9RBjEuUWtUwDIY0lngIlBrK1HE1VY0FJAqoKTYjg86WU0902+Bn3E5mL0ko7gWcH6w= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com; spf=pass smtp.mailfrom=rivosinc.com; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b=1YBlX7Mh; arc=none smtp.client-ip=209.85.214.174 Authentication-Results: smtp.subspace.kernel.org; dmarc=none (p=none dis=none) header.from=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=rivosinc.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=rivosinc-com.20230601.gappssmtp.com header.i=@rivosinc-com.20230601.gappssmtp.com header.b="1YBlX7Mh" Received: by mail-pl1-f174.google.com with SMTP id d9443c01a7336-2161eb94cceso49427045ad.2 for ; Sun, 19 Jan 2025 20:50:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1737348613; x=1737953413; darn=vger.kernel.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=YPxhHVSVg4x5plR0NRyuxvAYVrPGQG7JMzV/NLUrSvg=; b=1YBlX7MhllXA9xzPFNyTAY5re9lQNIyvxmi1usjRt879bd7M+ocjcKTofVgZ0P5BOI DDjUNLwDPTwL85h1SCqmZP9cWHfuFcMCzZ/LtoDwiFeBPjUWSwM0VKSp5C4kL31D4hs+ DdLojOFWg7jLA5fDGACxbJttt8ziPjq1iSmCcXiFNwBZ7dqvRROoUy65apI7I2bRhVBc XIyIcGc4V55r6C8+glcGbgmfYU9wP4PomHCGo7FFoP8WAJXHSfojG0hdJu5wCt5WscqI GzbTCKyH9Lt9ADUWXYv3Z+g9kvvAMr/D3sLjeJT1ljPAiWAQvAPxxgLBpdqJ1Cb0Q/2o BTlA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737348613; x=1737953413; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=YPxhHVSVg4x5plR0NRyuxvAYVrPGQG7JMzV/NLUrSvg=; b=setGw7+UtkWBZUOrmw46rsPHMl0ukZEPUYIV4/eIs4zOCYZni2+Z4BTYJWx0RlZxWS 4t+8O/PGHPVruV9uPCWlTv5D867kajxlB4sh1A7ePTPOCzR7eTY37jlIc6h4K7Y8XRQI DFyQbT1c8jdPBD+WpXQVjTZlzqNp5qrEp47cwhizwqzSd/RtVBhi3o6BtJKarkVyPYb4 HO0WOsg4SDkxpGWv0b+aup/IgLx/M1B8Fs0dRsR3ITLjCt/jQA6AmxFtGzLSr0kEnU9Z ND7JaH5GhTO4w+t5gk0T0jKlMUIgxrU8uvcieR8gPGh7fTTgaq5Kk0FOEeVVOMn5W2wV VTeQ== X-Forwarded-Encrypted: i=1; AJvYcCXjL0DYAp4g0bB4pyTVvfMArOf5SargVTXL9Jl7In+Sr9OWxyt4MzhMdjVric+pbs97mz/A09weJZ4s@vger.kernel.org X-Gm-Message-State: AOJu0Yx47y6lLmt4XHCDxq3/P99TWRaTUF8AY+qYSBBkHzx87YHRARut /p2/IyBjEKwQOpp7GREaX1cWLju2lcIlljcdc5TEdiwCMvjVTYLw1fsY1hQ6Y98= X-Gm-Gg: ASbGncsLv0EKBGJSOVESeNMn5ghBfYfvWjsZYmTZq1Ohr/nXvTLBWUY550IKHtWwJWS L8ShN/MT0WrP2xV7VCJjHN6FObyixRPYn9J9N327XoCNqHcZW7srLZsMw85pC2RVjfT9LDtGygC hPuOh2Z2oZ4JU5qOKW2oU/PFYjkpyq4kLgW7gp6pjeMJbnCBe+q/WBxRZr7+GWbwaPg6RTudv5V kwV8etByVJ9rCfaq8Kbm4RkCKtFq4aqQ8KjLxTroFw8nE+kk/hdHiiECxPIWkep0g== X-Google-Smtp-Source: AGHT+IFIEY4ZIPejTWRHsRYJkjY1IfqpikLXBclVzk1+nhDgXzd6BG6MUPgPBkaO9eRrXfYpCYcfHw== X-Received: by 2002:a17:903:1205:b0:216:7ee9:2227 with SMTP id d9443c01a7336-21c355dcff6mr173820715ad.36.1737348613063; Sun, 19 Jan 2025 20:50:13 -0800 (PST) Received: from ghost ([2601:647:6700:64d0:f6ba:e4b8:8306:4306]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-21c2d3acb53sm51659235ad.154.2025.01.19.20.50.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 19 Jan 2025 20:50:12 -0800 (PST) Date: Sun, 19 Jan 2025 20:50:09 -0800 From: Charlie Jenkins To: Chunyan Zhang Cc: Chunyan Zhang , Paul Walmsley , Palmer Dabbelt , Albert Ou , Song Liu , Yu Kuai , linux-riscv@lists.infradead.org, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [RFC PATCH] raid6: Add RISC-V SIMD syndrome and recovery calculations Message-ID: References: <20241220114023.667347-1-zhangchunyan@iscas.ac.cn> Precedence: bulk X-Mailing-List: linux-raid@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: On Mon, Jan 20, 2025 at 11:33:52AM +0800, Chunyan Zhang wrote: > Hi Charlie, > > On Thu, 9 Jan 2025 at 07:45, Charlie Jenkins wrote: > > > > On Fri, Dec 20, 2024 at 07:40:23PM +0800, Chunyan Zhang wrote: > [snip] > > > +static void raid6_2data_recov_rvv(int disks, size_t bytes, int faila, > > > + int failb, void **ptrs) > > > +{ > > > + u8 *p, *q, *dp, *dq; > > > + const u8 *pbmul; /* P multiplier table for B data */ > > > + const u8 *qmul; /* Q multiplier table (for both) */ > > > + > > > + p = (u8 *)ptrs[disks - 2]; > > > + q = (u8 *)ptrs[disks - 1]; > > > + > > > + /* > > > + * Compute syndrome with zero for the missing data pages > > > + * Use the dead data pages as temporary storage for > > > + * delta p and delta q > > > + */ > > > + dp = (u8 *)ptrs[faila]; > > > + ptrs[faila] = (void *)raid6_empty_zero_page; > > > + ptrs[disks - 2] = dp; > > > + dq = (u8 *)ptrs[failb]; > > > + ptrs[failb] = (void *)raid6_empty_zero_page; > > > + ptrs[disks - 1] = dq; > > > + > > > + raid6_call.gen_syndrome(disks, bytes, ptrs); > > > + > > > + /* Restore pointer table */ > > > + ptrs[faila] = dp; > > > + ptrs[failb] = dq; > > > + ptrs[disks - 2] = p; > > > + ptrs[disks - 1] = q; > > > + > > > + /* Now, pick the proper data tables */ > > > + pbmul = raid6_vgfmul[raid6_gfexi[failb-faila]]; > > > + qmul = raid6_vgfmul[raid6_gfinv[raid6_gfexp[faila] ^ > > > + raid6_gfexp[failb]]]; > > > + > > > + if (crypto_simd_usable()) { > > > > There should be an alternate recovery mechanism if it's not currently > > usable right? I don't know what case could happen when this function is > > called but crypto_simd_usable() returns false. > > crypto_simd_usable() looks like not needed here. > The callers would call preempt_disable() before calling this function. > And I will add .valid callback like you commented below. > > > > > > + kernel_vector_begin(); > > > + __raid6_2data_recov_rvv(bytes, p, q, dp, dq, pbmul, qmul); > > > + kernel_vector_end(); > > > + } > > > +} > > > + > > > +static void raid6_datap_recov_rvv(int disks, size_t bytes, int faila, > > > + void **ptrs) > > > +{ > > > + u8 *p, *q, *dq; > > > + const u8 *qmul; /* Q multiplier table */ > > > + > > > + p = (u8 *)ptrs[disks - 2]; > > > + q = (u8 *)ptrs[disks - 1]; > > > + > > > + /* > > > + * Compute syndrome with zero for the missing data page > > > + * Use the dead data page as temporary storage for delta q > > > + */ > > > + dq = (u8 *)ptrs[faila]; > > > + ptrs[faila] = (void *)raid6_empty_zero_page; > > > + ptrs[disks - 1] = dq; > > > + > > > + raid6_call.gen_syndrome(disks, bytes, ptrs); > > > + > > > + /* Restore pointer table */ > > > + ptrs[faila] = dq; > > > + ptrs[disks - 1] = q; > > > + > > > + /* Now, pick the proper data tables */ > > > + qmul = raid6_vgfmul[raid6_gfinv[raid6_gfexp[faila]]]; > > > + > > > + if (crypto_simd_usable()) { > > > > Same here > > > > > + kernel_vector_begin(); > > > + __raid6_datap_recov_rvv(bytes, p, q, dq, qmul); > > > + kernel_vector_end(); > > > + } > > > +} > > > + > > > +const struct raid6_recov_calls raid6_recov_rvv = { > > > + .data2 = raid6_2data_recov_rvv, > > > + .datap = raid6_datap_recov_rvv, > > > + .valid = NULL, > > > > These functions should only be called if vector is enabled, so this > > valid bit should call has_vector(). has_vector() returns a bool and > > valid expects an int so you can wrap it in something like: > > Ok, will add. > > > > static int check_vector(void) > > { > > return has_vector(); > > } > > > > Just casting has_vector to int (*)(void) doesn't work, I get: > > > > warning: cast between incompatible function types from ‘bool (*)(void)’ {aka ‘_Bool (*)(void)’} to ‘int (*)(void)’ [-Wcast-function-type] > > > > > [snip] > > > +#define RAID6_RVV_WRAPPER(_n) \ > > > + static void raid6_rvv ## _n ## _gen_syndrome(int disks, \ > > > + size_t bytes, void **ptrs) \ > > > + { \ > > > + void raid6_rvv ## _n ## _gen_syndrome_real(int, \ > > > + unsigned long, void**); \ > > > + if (crypto_simd_usable()) { \ > > > > Same note about crypto_simd_usable as above > > Ok. > > > > > > + kernel_vector_begin(); \ > > > + raid6_rvv ## _n ## _gen_syndrome_real(disks, \ > > > + (unsigned long)bytes, ptrs); \ > > > + kernel_vector_end(); \ > > > + } \ > > > + } \ > > > + static void raid6_rvv ## _n ## _xor_syndrome(int disks, \ > > > + int start, int stop, \ > > > + size_t bytes, void **ptrs) \ > > > + { \ > > > + void raid6_rvv ## _n ## _xor_syndrome_real(int, \ > > > + int, int, unsigned long, void**); \ > > > + if (crypto_simd_usable()) { \ > > > > ... and here > > Ok. > > > > > > + kernel_vector_begin(); \ > > > + raid6_rvv ## _n ## _xor_syndrome_real(disks, \ > > > + start, stop, (unsigned long)bytes, ptrs); \ > > > + kernel_vector_end(); \ > > > + } \ > > > + } \ > > > + struct raid6_calls const raid6_rvvx ## _n = { \ > > > + raid6_rvv ## _n ## _gen_syndrome, \ > > > + raid6_rvv ## _n ## _xor_syndrome, \ > > > + NULL, \ > > > > Same note about calling has_vector here. > > Yes. > > > > > > + "rvvx" #_n, \ > > > + 0 \ > > > + } > > > + > > > +RAID6_RVV_WRAPPER(1); > > > +RAID6_RVV_WRAPPER(2); > > > +RAID6_RVV_WRAPPER(4); > > > -- > > > 2.34.1 > > > > > > > > > _______________________________________________ > > > linux-riscv mailing list > > > linux-riscv@lists.infradead.org > > > http://lists.infradead.org/mailman/listinfo/linux-riscv > > > > Some interesting results, on QEMU (vlen=256) these vectorized versions > > are around 6x faster on my CPU. Vector in QEMU is not optimized so I am > > surprised that there is this much speedup. > > Which version of QEMU did you use? What options were used when running QEMU? > > I want to try on my side, since this test didn't run as fast like your > test result on my QEMU (I'm using v9.0.0, vlen=128). Oh interesting, I had the "icount" plugin enabled and that apparently really messes up this performance counting. My original test was on QEMU 9.1.0. I upgraded my QEMU to v9.2.0 and tested again. With the option "-icount shift=0" I get: [ 0.128304] raid6: rvvx1 gen() 2671 MB/s [ 0.196358] raid6: rvvx2 gen() 3101 MB/s [ 0.264410] raid6: rvvx4 gen() 3370 MB/s [ 0.332488] raid6: int64x8 gen() 548 MB/s [ 0.400552] raid6: int64x4 gen() 601 MB/s [ 0.468600] raid6: int64x2 gen() 585 MB/s [ 0.536661] raid6: int64x1 gen() 519 MB/s [ 0.536673] raid6: using algorithm rvvx4 gen() 3370 MB/s [ 0.604688] raid6: .... xor() 1944 MB/s, rmw enabled Without it I get: [ 0.366142] raid6: rvvx1 gen() 712 MB/s [ 0.440205] raid6: rvvx2 gen() 733 MB/s [ 0.508751] raid6: rvvx4 gen() 739 MB/s [ 0.577269] raid6: int64x8 gen() 1475 MB/s [ 0.645781] raid6: int64x4 gen() 2164 MB/s [ 0.714363] raid6: int64x2 gen() 1149 MB/s [ 0.782837] raid6: int64x1 gen() 1709 MB/s [ 0.782986] raid6: using algorithm int64x4 gen() 2164 MB/s [ 0.851910] raid6: .... xor() 1131 MB/s, rmw enabled I will need to keep that in mind when comparing vector performance! Seems like this option does something weird. - Charlie > > > > > # modprobe raid6_pq > > [ 36.238377] raid6: rvvx1 gen() 2668 MB/s > > [ 36.306381] raid6: rvvx2 gen() 3097 MB/s > > [ 36.374376] raid6: rvvx4 gen() 3366 MB/s > > [ 36.442385] raid6: int64x8 gen() 548 MB/s > > [ 36.510397] raid6: int64x4 gen() 600 MB/s > > [ 36.578388] raid6: int64x2 gen() 585 MB/s > > [ 36.646384] raid6: int64x1 gen() 518 MB/s > > [ 36.646395] raid6: using algorithm rvvx4 gen() 3366 MB/s > > [ 36.714377] raid6: .... xor() 1942 MB/s, rmw enabled > > [ 36.714387] raid6: using rvv recovery algorithm > > > > I also ran the raid6tests: > > > > raid6test: complete (2429 tests, 0 failures) > > > > I am not familiar with this algorithm, but since it passed all of the > > test cases and shows a remarkable speedup, this patch seems like a great > > improvement. > > > > As Jessica pointed out, please put the vector pop/push in the same block > > as your vector instructions. While testing this code, I threw together a > > patch for this that you can squash: > > Ok, will do. > > > > > From 32117c0a5b2bbba7439af37e55631e0e38b63a7c Mon Sep 17 00:00:00 2001 > > From: Charlie Jenkins > > Date: Wed, 8 Jan 2025 14:32:26 -0800 > > Subject: [PATCH] Fixup vector options > > > > Signed-off-by: Charlie Jenkins > > Thanks for the test, review and the patch. > Chunyan > > > --- > > lib/raid6/Makefile | 2 -- > > lib/raid6/recov_rvv.c | 12 ++++--- > > lib/raid6/rvv.c | 81 ++++++++++++++++++++++++++++++++++++------- > > 3 files changed, 77 insertions(+), 18 deletions(-) > > > > diff --git a/lib/raid6/Makefile b/lib/raid6/Makefile > > index e62fb7cd773e..5be0a4e60ab1 100644 > > --- a/lib/raid6/Makefile > > +++ b/lib/raid6/Makefile > > @@ -11,8 +11,6 @@ raid6_pq-$(CONFIG_KERNEL_MODE_NEON) += neon.o neon1.o neon2.o neon4.o neon8.o re > > raid6_pq-$(CONFIG_S390) += s390vx8.o recov_s390xc.o > > raid6_pq-$(CONFIG_LOONGARCH) += loongarch_simd.o recov_loongarch_simd.o > > raid6_pq-$(CONFIG_RISCV_ISA_V) += rvv.o recov_rvv.o > > -CFLAGS_rvv.o += -march=rv64gcv > > -CFLAGS_recov_rvv.o += -march=rv64gcv > > > > hostprogs += mktables > > > > diff --git a/lib/raid6/recov_rvv.c b/lib/raid6/recov_rvv.c > > index 8ae74803ea7f..02b97d885510 100644 > > --- a/lib/raid6/recov_rvv.c > > +++ b/lib/raid6/recov_rvv.c > > @@ -17,6 +17,7 @@ static void __raid6_2data_recov_rvv(int bytes, u8 *p, u8 *q, u8 *dp, > > ".option push\n" > > ".option arch,+v\n" > > "vsetvli x0, %[avl], e8, m1, ta, ma\n" > > + ".option pop\n" > > : : > > [avl]"r"(16) > > ); > > @@ -42,6 +43,8 @@ static void __raid6_2data_recov_rvv(int bytes, u8 *p, u8 *q, u8 *dp, > > * v14:p/qm[vx], v15:p/qm[vy] > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vle8.v v0, (%[px])\n" > > "vle8.v v1, (%[dp])\n" > > "vxor.vv v0, v0, v1\n" > > @@ -67,6 +70,7 @@ static void __raid6_2data_recov_rvv(int bytes, u8 *p, u8 *q, u8 *dp, > > "vxor.vv v1, v3, v0\n" /* v1 = db ^ px; */ > > "vse8.v v3, (%[dq])\n" > > "vse8.v v1, (%[dp])\n" > > + ".option pop\n" > > : : > > [px]"r"(p), > > [dp]"r"(dp), > > @@ -84,8 +88,6 @@ static void __raid6_2data_recov_rvv(int bytes, u8 *p, u8 *q, u8 *dp, > > dp += 16; > > dq += 16; > > } > > - > > - asm volatile (".option pop\n"); > > } > > > > static void __raid6_datap_recov_rvv(int bytes, uint8_t *p, uint8_t *q, uint8_t *dq, > > @@ -95,6 +97,7 @@ static void __raid6_datap_recov_rvv(int bytes, uint8_t *p, uint8_t *q, uint8_t * > > ".option push\n" > > ".option arch,+v\n" > > "vsetvli x0, %[avl], e8, m1, ta, ma\n" > > + ".option pop\n" > > : : > > [avl]"r"(16) > > ); > > @@ -113,6 +116,8 @@ static void __raid6_datap_recov_rvv(int bytes, uint8_t *p, uint8_t *q, uint8_t * > > * v10:m[vx], v11:m[vy] > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vle8.v v0, (%[vx])\n" > > "vle8.v v2, (%[dq])\n" > > "vxor.vv v0, v0, v2\n" > > @@ -127,6 +132,7 @@ static void __raid6_datap_recov_rvv(int bytes, uint8_t *p, uint8_t *q, uint8_t * > > "vxor.vv v1, v0, v1\n" > > "vse8.v v0, (%[dq])\n" > > "vse8.v v1, (%[vy])\n" > > + ".option pop\n" > > : : > > [vx]"r"(q), > > [vy]"r"(p), > > @@ -140,8 +146,6 @@ static void __raid6_datap_recov_rvv(int bytes, uint8_t *p, uint8_t *q, uint8_t * > > q += 16; > > dq += 16; > > } > > - > > - asm volatile (".option pop\n"); > > } > > > > > > diff --git a/lib/raid6/rvv.c b/lib/raid6/rvv.c > > index 21f5432506da..81b38dcafeb6 100644 > > --- a/lib/raid6/rvv.c > > +++ b/lib/raid6/rvv.c > > @@ -31,14 +31,18 @@ static void raid6_rvv1_gen_syndrome_real(int disks, unsigned long bytes, void ** > > ".option push\n" > > ".option arch,+v\n" > > "vsetvli t0, x0, e8, m1, ta, ma\n" > > + ".option pop\n" > > ); > > > > /* v0:wp0, v1:wq0, v2:wd0/w20, v3:w10 */ > > for (d = 0 ; d < bytes ; d += NSIZE*1) { > > /* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vle8.v v0, (%[wp0])\n" > > "vle8.v v1, (%[wp0])\n" > > + ".option pop\n" > > : : > > [wp0]"r"(&dptr[z0][d+0*NSIZE]) > > ); > > @@ -54,6 +58,8 @@ static void raid6_rvv1_gen_syndrome_real(int disks, unsigned long bytes, void ** > > * wp$$ ^= wd$$; > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vsra.vi v2, v1, 7\n" > > "vsll.vi v3, v1, 1\n" > > "vand.vx v2, v2, %[x1d]\n" > > @@ -61,6 +67,7 @@ static void raid6_rvv1_gen_syndrome_real(int disks, unsigned long bytes, void ** > > "vle8.v v2, (%[wd0])\n" > > "vxor.vv v1, v3, v2\n" > > "vxor.vv v0, v0, v2\n" > > + ".option pop\n" > > : : > > [wd0]"r"(&dptr[z][d+0*NSIZE]), > > [x1d]"r"(0x1d) > > @@ -72,15 +79,16 @@ static void raid6_rvv1_gen_syndrome_real(int disks, unsigned long bytes, void ** > > * *(unative_t *)&q[d+NSIZE*$$] = wq$$; > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vse8.v v0, (%[wp0])\n" > > "vse8.v v1, (%[wq0])\n" > > + ".option pop\n" > > : : > > [wp0]"r"(&p[d+NSIZE*0]), > > [wq0]"r"(&q[d+NSIZE*0]) > > ); > > } > > - > > - asm volatile (".option pop\n"); > > } > > > > static void raid6_rvv1_xor_syndrome_real(int disks, int start, int stop, > > @@ -98,14 +106,18 @@ static void raid6_rvv1_xor_syndrome_real(int disks, int start, int stop, > > ".option push\n" > > ".option arch,+v\n" > > "vsetvli t0, x0, e8, m1, ta, ma\n" > > + ".option pop\n" > > ); > > > > /* v0:wp0, v1:wq0, v2:wd0/w20, v3:w10 */ > > for (d = 0 ; d < bytes ; d += NSIZE*1) { > > /* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vle8.v v0, (%[wp0])\n" > > "vle8.v v1, (%[wp0])\n" > > + ".option pop\n" > > : : > > [wp0]"r"(&dptr[z0][d+0*NSIZE]) > > ); > > @@ -122,6 +134,8 @@ static void raid6_rvv1_xor_syndrome_real(int disks, int start, int stop, > > * wp$$ ^= wd$$; > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vsra.vi v2, v1, 7\n" > > "vsll.vi v3, v1, 1\n" > > "vand.vx v2, v2, %[x1d]\n" > > @@ -129,6 +143,7 @@ static void raid6_rvv1_xor_syndrome_real(int disks, int start, int stop, > > "vle8.v v2, (%[wd0])\n" > > "vxor.vv v1, v3, v2\n" > > "vxor.vv v0, v0, v2\n" > > + ".option pop\n" > > : : > > [wd0]"r"(&dptr[z][d+0*NSIZE]), > > [x1d]"r"(0x1d) > > @@ -144,10 +159,13 @@ static void raid6_rvv1_xor_syndrome_real(int disks, int start, int stop, > > * wq$$ = w1$$ ^ w2$$; > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vsra.vi v2, v1, 7\n" > > "vsll.vi v3, v1, 1\n" > > "vand.vx v2, v2, %[x1d]\n" > > "vxor.vv v1, v3, v2\n" > > + ".option pop\n" > > : : > > [x1d]"r"(0x1d) > > ); > > @@ -159,19 +177,20 @@ static void raid6_rvv1_xor_syndrome_real(int disks, int start, int stop, > > * v0:wp0, v1:wq0, v2:p0, v3:q0 > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vle8.v v2, (%[wp0])\n" > > "vle8.v v3, (%[wq0])\n" > > "vxor.vv v2, v2, v0\n" > > "vxor.vv v3, v3, v1\n" > > "vse8.v v2, (%[wp0])\n" > > "vse8.v v3, (%[wq0])\n" > > + ".option pop\n" > > : : > > [wp0]"r"(&p[d+NSIZE*0]), > > [wq0]"r"(&q[d+NSIZE*0]) > > ); > > } > > - > > - asm volatile (".option pop\n"); > > } > > > > static void raid6_rvv2_gen_syndrome_real(int disks, unsigned long bytes, void **ptrs) > > @@ -188,6 +207,7 @@ static void raid6_rvv2_gen_syndrome_real(int disks, unsigned long bytes, void ** > > ".option push\n" > > ".option arch,+v\n" > > "vsetvli t0, x0, e8, m1, ta, ma\n" > > + ".option pop\n" > > ); > > > > /* > > @@ -197,10 +217,13 @@ static void raid6_rvv2_gen_syndrome_real(int disks, unsigned long bytes, void ** > > for (d = 0 ; d < bytes ; d += NSIZE*2) { > > /* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vle8.v v0, (%[wp0])\n" > > "vle8.v v1, (%[wp0])\n" > > "vle8.v v4, (%[wp1])\n" > > "vle8.v v5, (%[wp1])\n" > > + ".option pop\n" > > : : > > [wp0]"r"(&dptr[z0][d+0*NSIZE]), > > [wp1]"r"(&dptr[z0][d+1*NSIZE]) > > @@ -217,6 +240,8 @@ static void raid6_rvv2_gen_syndrome_real(int disks, unsigned long bytes, void ** > > * wp$$ ^= wd$$; > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vsra.vi v2, v1, 7\n" > > "vsll.vi v3, v1, 1\n" > > "vand.vx v2, v2, %[x1d]\n" > > @@ -232,6 +257,7 @@ static void raid6_rvv2_gen_syndrome_real(int disks, unsigned long bytes, void ** > > "vle8.v v6, (%[wd1])\n" > > "vxor.vv v5, v7, v6\n" > > "vxor.vv v4, v4, v6\n" > > + ".option pop\n" > > : : > > [wd0]"r"(&dptr[z][d+0*NSIZE]), > > [wd1]"r"(&dptr[z][d+1*NSIZE]), > > @@ -244,10 +270,13 @@ static void raid6_rvv2_gen_syndrome_real(int disks, unsigned long bytes, void ** > > * *(unative_t *)&q[d+NSIZE*$$] = wq$$; > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vse8.v v0, (%[wp0])\n" > > "vse8.v v1, (%[wq0])\n" > > "vse8.v v4, (%[wp1])\n" > > "vse8.v v5, (%[wq1])\n" > > + ".option pop\n" > > : : > > [wp0]"r"(&p[d+NSIZE*0]), > > [wq0]"r"(&q[d+NSIZE*0]), > > @@ -255,8 +284,6 @@ static void raid6_rvv2_gen_syndrome_real(int disks, unsigned long bytes, void ** > > [wq1]"r"(&q[d+NSIZE*1]) > > ); > > } > > - > > - asm volatile (".option pop\n"); > > } > > > > static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop, > > @@ -274,6 +301,7 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop, > > ".option push\n" > > ".option arch,+v\n" > > "vsetvli t0, x0, e8, m1, ta, ma\n" > > + ".option pop\n" > > ); > > > > /* > > @@ -283,10 +311,13 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop, > > for (d = 0 ; d < bytes ; d += NSIZE*2) { > > /* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vle8.v v0, (%[wp0])\n" > > "vle8.v v1, (%[wp0])\n" > > "vle8.v v4, (%[wp1])\n" > > "vle8.v v5, (%[wp1])\n" > > + ".option pop\n" > > : : > > [wp0]"r"(&dptr[z0][d+0*NSIZE]), > > [wp1]"r"(&dptr[z0][d+1*NSIZE]) > > @@ -304,6 +335,8 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop, > > * wp$$ ^= wd$$; > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vsra.vi v2, v1, 7\n" > > "vsll.vi v3, v1, 1\n" > > "vand.vx v2, v2, %[x1d]\n" > > @@ -319,6 +352,7 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop, > > "vle8.v v6, (%[wd1])\n" > > "vxor.vv v5, v7, v6\n" > > "vxor.vv v4, v4, v6\n" > > + ".option pop\n" > > : : > > [wd0]"r"(&dptr[z][d+0*NSIZE]), > > [wd1]"r"(&dptr[z][d+1*NSIZE]), > > @@ -335,6 +369,8 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop, > > * wq$$ = w1$$ ^ w2$$; > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vsra.vi v2, v1, 7\n" > > "vsll.vi v3, v1, 1\n" > > "vand.vx v2, v2, %[x1d]\n" > > @@ -344,6 +380,7 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop, > > "vsll.vi v7, v5, 1\n" > > "vand.vx v6, v6, %[x1d]\n" > > "vxor.vv v5, v7, v6\n" > > + ".option pop\n" > > : : > > [x1d]"r"(0x1d) > > ); > > @@ -356,6 +393,8 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop, > > * v4:wp1, v5:wq1, v6:p1, v7:q1 > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vle8.v v2, (%[wp0])\n" > > "vle8.v v3, (%[wq0])\n" > > "vxor.vv v2, v2, v0\n" > > @@ -369,6 +408,7 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop, > > "vxor.vv v7, v7, v5\n" > > "vse8.v v6, (%[wp1])\n" > > "vse8.v v7, (%[wq1])\n" > > + ".option pop\n" > > : : > > [wp0]"r"(&p[d+NSIZE*0]), > > [wq0]"r"(&q[d+NSIZE*0]), > > @@ -376,8 +416,6 @@ static void raid6_rvv2_xor_syndrome_real(int disks, int start, int stop, > > [wq1]"r"(&q[d+NSIZE*1]) > > ); > > } > > - > > - asm volatile (".option pop\n"); > > } > > > > static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void **ptrs) > > @@ -394,6 +432,7 @@ static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void ** > > ".option push\n" > > ".option arch,+v\n" > > "vsetvli t0, x0, e8, m1, ta, ma\n" > > + ".option pop\n" > > ); > > > > /* > > @@ -405,6 +444,8 @@ static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void ** > > for (d = 0 ; d < bytes ; d += NSIZE*4) { > > /* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vle8.v v0, (%[wp0])\n" > > "vle8.v v1, (%[wp0])\n" > > "vle8.v v4, (%[wp1])\n" > > @@ -413,6 +454,7 @@ static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void ** > > "vle8.v v9, (%[wp2])\n" > > "vle8.v v12, (%[wp3])\n" > > "vle8.v v13, (%[wp3])\n" > > + ".option pop\n" > > : : > > [wp0]"r"(&dptr[z0][d+0*NSIZE]), > > [wp1]"r"(&dptr[z0][d+1*NSIZE]), > > @@ -431,6 +473,8 @@ static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void ** > > * wp$$ ^= wd$$; > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vsra.vi v2, v1, 7\n" > > "vsll.vi v3, v1, 1\n" > > "vand.vx v2, v2, %[x1d]\n" > > @@ -462,6 +506,7 @@ static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void ** > > "vle8.v v14, (%[wd3])\n" > > "vxor.vv v13, v15, v14\n" > > "vxor.vv v12, v12, v14\n" > > + ".option pop\n" > > : : > > [wd0]"r"(&dptr[z][d+0*NSIZE]), > > [wd1]"r"(&dptr[z][d+1*NSIZE]), > > @@ -476,6 +521,8 @@ static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void ** > > * *(unative_t *)&q[d+NSIZE*$$] = wq$$; > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vse8.v v0, (%[wp0])\n" > > "vse8.v v1, (%[wq0])\n" > > "vse8.v v4, (%[wp1])\n" > > @@ -484,6 +531,7 @@ static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void ** > > "vse8.v v9, (%[wq2])\n" > > "vse8.v v12, (%[wp3])\n" > > "vse8.v v13, (%[wq3])\n" > > + ".option pop\n" > > : : > > [wp0]"r"(&p[d+NSIZE*0]), > > [wq0]"r"(&q[d+NSIZE*0]), > > @@ -495,8 +543,6 @@ static void raid6_rvv4_gen_syndrome_real(int disks, unsigned long bytes, void ** > > [wq3]"r"(&q[d+NSIZE*3]) > > ); > > } > > - > > - asm volatile (".option pop\n"); > > } > > > > static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop, > > @@ -514,6 +560,7 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop, > > ".option push\n" > > ".option arch,+v\n" > > "vsetvli t0, x0, e8, m1, ta, ma\n" > > + ".option pop\n" > > ); > > > > /* > > @@ -525,6 +572,8 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop, > > for (d = 0 ; d < bytes ; d += NSIZE*4) { > > /* wq$$ = wp$$ = *(unative_t *)&dptr[z0][d+$$*NSIZE]; */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vle8.v v0, (%[wp0])\n" > > "vle8.v v1, (%[wp0])\n" > > "vle8.v v4, (%[wp1])\n" > > @@ -533,6 +582,7 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop, > > "vle8.v v9, (%[wp2])\n" > > "vle8.v v12, (%[wp3])\n" > > "vle8.v v13, (%[wp3])\n" > > + ".option pop\n" > > : : > > [wp0]"r"(&dptr[z0][d+0*NSIZE]), > > [wp1]"r"(&dptr[z0][d+1*NSIZE]), > > @@ -552,6 +602,8 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop, > > * wp$$ ^= wd$$; > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vsra.vi v2, v1, 7\n" > > "vsll.vi v3, v1, 1\n" > > "vand.vx v2, v2, %[x1d]\n" > > @@ -583,6 +635,7 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop, > > "vle8.v v14, (%[wd3])\n" > > "vxor.vv v13, v15, v14\n" > > "vxor.vv v12, v12, v14\n" > > + ".option pop\n" > > : : > > [wd0]"r"(&dptr[z][d+0*NSIZE]), > > [wd1]"r"(&dptr[z][d+1*NSIZE]), > > @@ -601,6 +654,8 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop, > > * wq$$ = w1$$ ^ w2$$; > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vsra.vi v2, v1, 7\n" > > "vsll.vi v3, v1, 1\n" > > "vand.vx v2, v2, %[x1d]\n" > > @@ -620,6 +675,7 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop, > > "vsll.vi v15, v13, 1\n" > > "vand.vx v14, v14, %[x1d]\n" > > "vxor.vv v13, v15, v14\n" > > + ".option pop\n" > > : : > > [x1d]"r"(0x1d) > > ); > > @@ -634,6 +690,8 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop, > > * v12:wp3, v13:wq3, v14:p3, v15:q3 > > */ > > asm volatile ( > > + ".option push\n" > > + ".option arch,+v\n" > > "vle8.v v2, (%[wp0])\n" > > "vle8.v v3, (%[wq0])\n" > > "vxor.vv v2, v2, v0\n" > > @@ -661,6 +719,7 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop, > > "vxor.vv v15, v15, v13\n" > > "vse8.v v14, (%[wp3])\n" > > "vse8.v v15, (%[wq3])\n" > > + ".option pop\n" > > : : > > [wp0]"r"(&p[d+NSIZE*0]), > > [wq0]"r"(&q[d+NSIZE*0]), > > @@ -672,8 +731,6 @@ static void raid6_rvv4_xor_syndrome_real(int disks, int start, int stop, > > [wq3]"r"(&q[d+NSIZE*3]) > > ); > > } > > - > > - asm volatile (".option pop\n"); > > } > > > > #define RAID6_RVV_WRAPPER(_n) \ > > -- > > 2.34.1 > > > > > > - Charlie > > 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 0043EC02185 for ; Mon, 20 Jan 2025 04:50:27 +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:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=VEXb0QiugtXulfpwBgNk33ODCMucuE5pwH3QAXvLalk=; b=h0vRohBrRfUomQ VgHu6GcnbJXncvsJKkBW1epOaqqjUtOOpa5f7wC0svCemWuD+kzZVSe01OB4Fq6v0fgxeAOFaAX+T rlyv9NUO+3C6SOPowXrodMYg1qzbUf0OmSNiqH5f6I6JsQ3tRvnk4iNuQN2IdJEZmWEOFGLzz4Tq9 2PmFr/teeQSqJJeCuNhCdl07pK0Vws8O5FasLkclBu7yv3sCuhiLmMC0pDZmmv8oSWMh9hNM32o1q u0z7RH2iSMmGXR0Dq8Ohi4yG5LNANyEJN3Vn8xMQeRtVwWF5t40CgB3jbzxQsN3/Q02T8Ig1B9Xg3 HO6PMQM/cPRBLFC1mzww==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.98 #2 (Red Hat Linux)) id 1tZjju-00000004jTl-3tcf; Mon, 20 Jan 2025 04:50:19 +0000 Received: from mail-pl1-x633.google.com ([2607:f8b0:4864:20::633]) by bombadil.infradead.org with esmtps (Exim 4.98 #2 (Red Hat Linux)) id 1tZjjq-00000004jTB-2AhN for linux-riscv@lists.infradead.org; Mon, 20 Jan 2025 04:50:16 +0000 Received: by mail-pl1-x633.google.com with SMTP id d9443c01a7336-2163dc5155fso74558805ad.0 for ; Sun, 19 Jan 2025 20:50:13 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1737348613; x=1737953413; darn=lists.infradead.org; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date:from:to :cc:subject:date:message-id:reply-to; bh=YPxhHVSVg4x5plR0NRyuxvAYVrPGQG7JMzV/NLUrSvg=; b=DujIybPPcuIfpU0goEPjlJzPIV+7LRXTxp5whifJpzpfOYEaXgb9cXvxJHXsgzBvqW 0Z1S9szWPwDGQQTNouOGOZa4Y4yvEDM/rVYMAqHYkobPoTID6tr3UKTknrDjflnDfo1k eDWV88i8ptzPM19IYgfmWwN+HTKe9TPMcjpz/TNvhaCPCc73mckpqlfZCvGW/zKz3RW8 dubQZbRYfLU4A4/NeYYUKz7Ov6ExP4kdhxxz9ptQAtfYjPLNnSDBiGqn0+WYD9Y11+4V sBC5p+Yoehl7dgkt5lSUtlwRdwsE0V/MJRdZD4lmLf5JwHFQyr8l2Tm2dFP4GEdQQx/t mWPQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1737348613; x=1737953413; h=in-reply-to:content-transfer-encoding:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=YPxhHVSVg4x5plR0NRyuxvAYVrPGQG7JMzV/NLUrSvg=; b=wXfH9wjOy8cB7MUfRLqWeAvzj2BtOzHd2wTkPx7AmcCbYMb9nVbxSxhshxeyJKiTtE ZIHQIF/rrW78P7cMX/UIKREXwkLrkrc8eKiY5su+bWAnNr5hBiHX/C6a8OKds99CTx/I ptoWf1MS6Ybjf3mVrAPi1C9LwsLtWeG6UM/yzcfyjggovrV63GhUCIX/2nrkKaVdz8PH nx1SHrCrYq2Dj22/LK1bcCsLLRzVd176m6BquZyfzchVOSLAdl+n6OWh/lR+f+1LGiNZ aAf8CHkiciZYqVsLztP1oYXvXBXKM+qgfjDbXk3FwLMW8BYSLYOqru2WwBo9Oz/i6Bcm 7LlA== X-Forwarded-Encrypted: i=1; AJvYcCXnaVPFtXLscPc/knL4DOvxEQmpJOM1oH5QkiFWJJYhqZxTW/T7po9+IToprUkyzFvDxfbgAuu6iqvVeA==@lists.infradead.org X-Gm-Message-State: AOJu0YyOAG0RhkW5Tp0xP1ahUnkz95qFwW648CiHFo8cpnZJe1vD3ECz gTw2uw4p/0RJnrELD7zdDel6PetaGH+RDZ3tV9Rgo2mPk7qmKjHU69nJKT9GG/WZNRNFioAIrlO QIxM= X-Gm-Gg: ASbGncsIpRiuSInoF+zwWp81rRNEX5ac9xjE8F2gs/w0+skLhTAApUr80JoMZFsQxxr o73iJNqotqmDCFyYcGi239S3ZIUd4KSbN87IZFRkwvtfVxWa2XC6OiLx5yDtKs3VWFHwWfFsuL+ Au26VQT/EPpBXfb+ujjKQfxS3Epi4R6f9IaDJwWqIqjNTBker3idqB5ooNzQqJMF9MwQw128joR msVzMZwHGkyOWP30RIpjwEMvJyKbSHEEVxTiiWhiWmjQNgP7KVPIxDS5Nyy2LGhfQ== X-Google-Smtp-Source: AGHT+IFIEY4ZIPejTWRHsRYJkjY1IfqpikLXBclVzk1+nhDgXzd6BG6MUPgPBkaO9eRrXfYpCYcfHw== X-Received: by 2002:a17:903:1205:b0:216:7ee9:2227 with SMTP id d9443c01a7336-21c355dcff6mr173820715ad.36.1737348613063; Sun, 19 Jan 2025 20:50:13 -0800 (PST) Received: from ghost ([2601:647:6700:64d0:f6ba:e4b8:8306:4306]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-21c2d3acb53sm51659235ad.154.2025.01.19.20.50.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 19 Jan 2025 20:50:12 -0800 (PST) Date: Sun, 19 Jan 2025 20:50:09 -0800 From: Charlie Jenkins To: Chunyan Zhang Cc: Chunyan Zhang , Paul Walmsley , Palmer Dabbelt , Albert Ou , Song Liu , Yu Kuai , linux-riscv@lists.infradead.org, linux-raid@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [RFC PATCH] raid6: Add RISC-V SIMD syndrome and recovery calculations Message-ID: References: <20241220114023.667347-1-zhangchunyan@iscas.ac.cn> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20250119_205014_781872_78F3FF25 X-CRM114-Status: GOOD ( 45.86 ) 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 T24gTW9uLCBKYW4gMjAsIDIwMjUgYXQgMTE6MzM6NTJBTSArMDgwMCwgQ2h1bnlhbiBaaGFuZyB3 cm90ZToKPiBIaSBDaGFybGllLAo+IAo+IE9uIFRodSwgOSBKYW4gMjAyNSBhdCAwNzo0NSwgQ2hh cmxpZSBKZW5raW5zIDxjaGFybGllQHJpdm9zaW5jLmNvbT4gd3JvdGU6Cj4gPgo+ID4gT24gRnJp LCBEZWMgMjAsIDIwMjQgYXQgMDc6NDA6MjNQTSArMDgwMCwgQ2h1bnlhbiBaaGFuZyB3cm90ZToK PiBbc25pcF0KPiA+ID4gK3N0YXRpYyB2b2lkIHJhaWQ2XzJkYXRhX3JlY292X3J2dihpbnQgZGlz a3MsIHNpemVfdCBieXRlcywgaW50IGZhaWxhLAo+ID4gPiArICAgICAgICAgICAgIGludCBmYWls Yiwgdm9pZCAqKnB0cnMpCj4gPiA+ICt7Cj4gPiA+ICsgICAgIHU4ICpwLCAqcSwgKmRwLCAqZHE7 Cj4gPiA+ICsgICAgIGNvbnN0IHU4ICpwYm11bDsgICAgICAgIC8qIFAgbXVsdGlwbGllciB0YWJs ZSBmb3IgQiBkYXRhICovCj4gPiA+ICsgICAgIGNvbnN0IHU4ICpxbXVsOyAgICAgICAgIC8qIFEg bXVsdGlwbGllciB0YWJsZSAoZm9yIGJvdGgpICovCj4gPiA+ICsKPiA+ID4gKyAgICAgcCA9ICh1 OCAqKXB0cnNbZGlza3MgLSAyXTsKPiA+ID4gKyAgICAgcSA9ICh1OCAqKXB0cnNbZGlza3MgLSAx XTsKPiA+ID4gKwo+ID4gPiArICAgICAvKgo+ID4gPiArICAgICAgKiBDb21wdXRlIHN5bmRyb21l IHdpdGggemVybyBmb3IgdGhlIG1pc3NpbmcgZGF0YSBwYWdlcwo+ID4gPiArICAgICAgKiBVc2Ug dGhlIGRlYWQgZGF0YSBwYWdlcyBhcyB0ZW1wb3Jhcnkgc3RvcmFnZSBmb3IKPiA+ID4gKyAgICAg ICogZGVsdGEgcCBhbmQgZGVsdGEgcQo+ID4gPiArICAgICAgKi8KPiA+ID4gKyAgICAgZHAgPSAo dTggKilwdHJzW2ZhaWxhXTsKPiA+ID4gKyAgICAgcHRyc1tmYWlsYV0gPSAodm9pZCAqKXJhaWQ2 X2VtcHR5X3plcm9fcGFnZTsKPiA+ID4gKyAgICAgcHRyc1tkaXNrcyAtIDJdID0gZHA7Cj4gPiA+ ICsgICAgIGRxID0gKHU4ICopcHRyc1tmYWlsYl07Cj4gPiA+ICsgICAgIHB0cnNbZmFpbGJdID0g KHZvaWQgKilyYWlkNl9lbXB0eV96ZXJvX3BhZ2U7Cj4gPiA+ICsgICAgIHB0cnNbZGlza3MgLSAx XSA9IGRxOwo+ID4gPiArCj4gPiA+ICsgICAgIHJhaWQ2X2NhbGwuZ2VuX3N5bmRyb21lKGRpc2tz LCBieXRlcywgcHRycyk7Cj4gPiA+ICsKPiA+ID4gKyAgICAgLyogUmVzdG9yZSBwb2ludGVyIHRh YmxlICovCj4gPiA+ICsgICAgIHB0cnNbZmFpbGFdICAgICA9IGRwOwo+ID4gPiArICAgICBwdHJz W2ZhaWxiXSAgICAgPSBkcTsKPiA+ID4gKyAgICAgcHRyc1tkaXNrcyAtIDJdID0gcDsKPiA+ID4g KyAgICAgcHRyc1tkaXNrcyAtIDFdID0gcTsKPiA+ID4gKwo+ID4gPiArICAgICAvKiBOb3csIHBp Y2sgdGhlIHByb3BlciBkYXRhIHRhYmxlcyAqLwo+ID4gPiArICAgICBwYm11bCA9IHJhaWQ2X3Zn Zm11bFtyYWlkNl9nZmV4aVtmYWlsYi1mYWlsYV1dOwo+ID4gPiArICAgICBxbXVsICA9IHJhaWQ2 X3ZnZm11bFtyYWlkNl9nZmludltyYWlkNl9nZmV4cFtmYWlsYV0gXgo+ID4gPiArICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWlkNl9nZmV4cFtmYWlsYl1dXTsKPiA+ID4g Kwo+ID4gPiArICAgICBpZiAoY3J5cHRvX3NpbWRfdXNhYmxlKCkpIHsKPiA+Cj4gPiBUaGVyZSBz aG91bGQgYmUgYW4gYWx0ZXJuYXRlIHJlY292ZXJ5IG1lY2hhbmlzbSBpZiBpdCdzIG5vdCBjdXJy ZW50bHkKPiA+IHVzYWJsZSByaWdodD8gSSBkb24ndCBrbm93IHdoYXQgY2FzZSBjb3VsZCBoYXBw ZW4gd2hlbiB0aGlzIGZ1bmN0aW9uIGlzCj4gPiBjYWxsZWQgYnV0IGNyeXB0b19zaW1kX3VzYWJs ZSgpIHJldHVybnMgZmFsc2UuCj4gCj4gY3J5cHRvX3NpbWRfdXNhYmxlKCkgbG9va3MgbGlrZSBu b3QgbmVlZGVkIGhlcmUuCj4gVGhlIGNhbGxlcnMgd291bGQgY2FsbCBwcmVlbXB0X2Rpc2FibGUo KSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgo+IEFuZCBJIHdpbGwgYWRkIC52YWxpZCBj YWxsYmFjayBsaWtlIHlvdSBjb21tZW50ZWQgYmVsb3cuCj4gCj4gPgo+ID4gPiArICAgICAgICAg ICAgIGtlcm5lbF92ZWN0b3JfYmVnaW4oKTsKPiA+ID4gKyAgICAgICAgICAgICBfX3JhaWQ2XzJk YXRhX3JlY292X3J2dihieXRlcywgcCwgcSwgZHAsIGRxLCBwYm11bCwgcW11bCk7Cj4gPiA+ICsg ICAgICAgICAgICAga2VybmVsX3ZlY3Rvcl9lbmQoKTsKPiA+ID4gKyAgICAgfQo+ID4gPiArfQo+ ID4gPiArCj4gPiA+ICtzdGF0aWMgdm9pZCByYWlkNl9kYXRhcF9yZWNvdl9ydnYoaW50IGRpc2tz LCBzaXplX3QgYnl0ZXMsIGludCBmYWlsYSwKPiA+ID4gKyAgICAgICAgICAgICB2b2lkICoqcHRy cykKPiA+ID4gK3sKPiA+ID4gKyAgICAgdTggKnAsICpxLCAqZHE7Cj4gPiA+ICsgICAgIGNvbnN0 IHU4ICpxbXVsOyAgICAgICAgIC8qIFEgbXVsdGlwbGllciB0YWJsZSAqLwo+ID4gPiArCj4gPiA+ ICsgICAgIHAgPSAodTggKilwdHJzW2Rpc2tzIC0gMl07Cj4gPiA+ICsgICAgIHEgPSAodTggKilw dHJzW2Rpc2tzIC0gMV07Cj4gPiA+ICsKPiA+ID4gKyAgICAgLyoKPiA+ID4gKyAgICAgICogQ29t cHV0ZSBzeW5kcm9tZSB3aXRoIHplcm8gZm9yIHRoZSBtaXNzaW5nIGRhdGEgcGFnZQo+ID4gPiAr ICAgICAgKiBVc2UgdGhlIGRlYWQgZGF0YSBwYWdlIGFzIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBk ZWx0YSBxCj4gPiA+ICsgICAgICAqLwo+ID4gPiArICAgICBkcSA9ICh1OCAqKXB0cnNbZmFpbGFd Owo+ID4gPiArICAgICBwdHJzW2ZhaWxhXSA9ICh2b2lkICopcmFpZDZfZW1wdHlfemVyb19wYWdl Owo+ID4gPiArICAgICBwdHJzW2Rpc2tzIC0gMV0gPSBkcTsKPiA+ID4gKwo+ID4gPiArICAgICBy YWlkNl9jYWxsLmdlbl9zeW5kcm9tZShkaXNrcywgYnl0ZXMsIHB0cnMpOwo+ID4gPiArCj4gPiA+ ICsgICAgIC8qIFJlc3RvcmUgcG9pbnRlciB0YWJsZSAqLwo+ID4gPiArICAgICBwdHJzW2ZhaWxh XSAgICAgPSBkcTsKPiA+ID4gKyAgICAgcHRyc1tkaXNrcyAtIDFdID0gcTsKPiA+ID4gKwo+ID4g PiArICAgICAvKiBOb3csIHBpY2sgdGhlIHByb3BlciBkYXRhIHRhYmxlcyAqLwo+ID4gPiArICAg ICBxbXVsID0gcmFpZDZfdmdmbXVsW3JhaWQ2X2dmaW52W3JhaWQ2X2dmZXhwW2ZhaWxhXV1dOwo+ ID4gPiArCj4gPiA+ICsgICAgIGlmIChjcnlwdG9fc2ltZF91c2FibGUoKSkgewo+ID4KPiA+IFNh bWUgaGVyZQo+ID4KPiA+ID4gKyAgICAgICAgICAgICBrZXJuZWxfdmVjdG9yX2JlZ2luKCk7Cj4g PiA+ICsgICAgICAgICAgICAgX19yYWlkNl9kYXRhcF9yZWNvdl9ydnYoYnl0ZXMsIHAsIHEsIGRx LCBxbXVsKTsKPiA+ID4gKyAgICAgICAgICAgICBrZXJuZWxfdmVjdG9yX2VuZCgpOwo+ID4gPiAr ICAgICB9Cj4gPiA+ICt9Cj4gPiA+ICsKPiA+ID4gK2NvbnN0IHN0cnVjdCByYWlkNl9yZWNvdl9j YWxscyByYWlkNl9yZWNvdl9ydnYgPSB7Cj4gPiA+ICsgICAgIC5kYXRhMiAgICAgICAgICA9IHJh aWQ2XzJkYXRhX3JlY292X3J2diwKPiA+ID4gKyAgICAgLmRhdGFwICAgICAgICAgID0gcmFpZDZf ZGF0YXBfcmVjb3ZfcnZ2LAo+ID4gPiArICAgICAudmFsaWQgICAgICAgICAgPSBOVUxMLAo+ID4K PiA+IFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgb25seSBiZSBjYWxsZWQgaWYgdmVjdG9yIGlzIGVu YWJsZWQsIHNvIHRoaXMKPiA+IHZhbGlkIGJpdCBzaG91bGQgY2FsbCBoYXNfdmVjdG9yKCkuIGhh c192ZWN0b3IoKSByZXR1cm5zIGEgYm9vbCBhbmQKPiA+IHZhbGlkIGV4cGVjdHMgYW4gaW50IHNv IHlvdSBjYW4gd3JhcCBpdCBpbiBzb21ldGhpbmcgbGlrZToKPiAKPiBPaywgd2lsbCBhZGQuCj4g Pgo+ID4gc3RhdGljIGludCBjaGVja192ZWN0b3Iodm9pZCkKPiA+IHsKPiA+ICAgICAgICAgcmV0 dXJuIGhhc192ZWN0b3IoKTsKPiA+IH0KPiA+Cj4gPiBKdXN0IGNhc3RpbmcgaGFzX3ZlY3RvciB0 byBpbnQgKCopKHZvaWQpIGRvZXNuJ3Qgd29yaywgSSBnZXQ6Cj4gPgo+ID4gd2FybmluZzogY2Fz dCBiZXR3ZWVuIGluY29tcGF0aWJsZSBmdW5jdGlvbiB0eXBlcyBmcm9tIOKAmGJvb2wgKCopKHZv aWQp4oCZIHtha2Eg4oCYX0Jvb2wgKCopKHZvaWQp4oCZfSB0byDigJhpbnQgKCopKHZvaWQp4oCZ IFstV2Nhc3QtZnVuY3Rpb24tdHlwZV0KPiA+Cj4gPgo+IFtzbmlwXQo+ID4gPiArI2RlZmluZSBS QUlENl9SVlZfV1JBUFBFUihfbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBcCj4gPiA+ICsgICAgIHN0YXRpYyB2b2lkIHJhaWQ2X3J2diAjIyBfbiAjIyBf Z2VuX3N5bmRyb21lKGludCBkaXNrcywgICAgICAgICBcCj4gPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLCB2b2lkICoqcHRycykgICAgICBcCj4g PiA+ICsgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCj4gPiA+ICsgICAgICAgICAgICAgdm9pZCByYWlkNl9ydnYgIyMg X24gICMjIF9nZW5fc3luZHJvbWVfcmVhbChpbnQsICAgICAgICBcCj4gPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nLCB2b2lkKiop OyBcCj4gPiA+ICsgICAgICAgICAgICAgaWYgKGNyeXB0b19zaW1kX3VzYWJsZSgpKSB7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCj4gPgo+ID4gU2FtZSBub3RlIGFib3V0IGNyeXB0b19z aW1kX3VzYWJsZSBhcyBhYm92ZQo+IAo+IE9rLgo+IAo+ID4KPiA+ID4gKyAgICAgICAgICAgICAg ICAgICAgIGtlcm5lbF92ZWN0b3JfYmVnaW4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwK PiA+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJhaWQ2X3J2diAjIyBfbiAjIyBfZ2VuX3N5bmRy b21lX3JlYWwoZGlza3MsICAgIFwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAodW5zaWduZWQgbG9uZylieXRlcywgcHRycyk7ICAgIFwKPiA+ID4gKyAgICAgICAg ICAgICAgICAgICAgIGtlcm5lbF92ZWN0b3JfZW5kKCk7ICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKPiA+ID4gKyAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ID4gKyAgICAgfSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ID4gKyAg ICAgc3RhdGljIHZvaWQgcmFpZDZfcnZ2ICMjIF9uICMjIF94b3Jfc3luZHJvbWUoaW50IGRpc2tz LCAgICAgICAgIFwKPiA+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBp bnQgc3RhcnQsIGludCBzdG9wLCAgICAgICAgICAgIFwKPiA+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnl0ZXMsIHZvaWQgKipwdHJzKSAgICAgIFwKPiA+ ID4gKyAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKPiA+ID4gKyAgICAgICAgICAgICB2b2lkIHJhaWQ2X3J2diAjIyBf biAgIyMgX3hvcl9zeW5kcm9tZV9yZWFsKGludCwgICAgICAgIFwKPiA+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgaW50LCBpbnQsIHVuc2lnbmVkIGxvbmcsIHZvaWQqKik7ICAgICAg IFwKPiA+ID4gKyAgICAgICAgICAgICBpZiAoY3J5cHRvX3NpbWRfdXNhYmxlKCkpIHsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIFwKPiA+Cj4gPiAuLi4gYW5kIGhlcmUKPiAKPiBPay4KPiAK PiA+Cj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICBrZXJuZWxfdmVjdG9yX2JlZ2luKCk7ICAg ICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiA+ICsgICAgICAgICAgICAgcmFpZDZfcnZ2ICMj IF9uICMjIF94b3Jfc3luZHJvbWVfcmVhbChkaXNrcywgICAgICAgICAgICBcCj4gPiA+ICsgICAg ICAgICAgICAgICAgICAgICBzdGFydCwgc3RvcCwgKHVuc2lnbmVkIGxvbmcpYnl0ZXMsIHB0cnMp OyAgICAgICBcCj4gPiA+ICsgICAgICAgICAgICAgICAgICAgICBrZXJuZWxfdmVjdG9yX2VuZCgp OyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiA+ICsgICAgICAgICAgICAgfSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiA+ ICsgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCj4gPiA+ICsgICAgIHN0cnVjdCByYWlkNl9jYWxscyBjb25zdCByYWlk Nl9ydnZ4ICMjIF9uID0geyAgICAgICAgICAgICAgICAgICBcCj4gPiA+ICsgICAgICAgICAgICAg cmFpZDZfcnZ2ICMjIF9uICMjIF9nZW5fc3luZHJvbWUsICAgICAgICAgICAgICAgICAgICAgICBc Cj4gPiA+ICsgICAgICAgICAgICAgcmFpZDZfcnZ2ICMjIF9uICMjIF94b3Jfc3luZHJvbWUsICAg ICAgICAgICAgICAgICAgICAgICBcCj4gPiA+ICsgICAgICAgICAgICAgTlVMTCwgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPgo+ID4gU2FtZSBu b3RlIGFib3V0IGNhbGxpbmcgaGFzX3ZlY3RvciBoZXJlLgo+IAo+IFllcy4KPiAKPiA+Cj4gPiA+ ICsgICAgICAgICAgICAgInJ2dngiICNfbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCj4gPiA+ICsgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiA+ICsgICAgIH0KPiA+ID4g Kwo+ID4gPiArUkFJRDZfUlZWX1dSQVBQRVIoMSk7Cj4gPiA+ICtSQUlENl9SVlZfV1JBUFBFUigy KTsKPiA+ID4gK1JBSUQ2X1JWVl9XUkFQUEVSKDQpOwo+ID4gPiAtLQo+ID4gPiAyLjM0LjEKPiA+ ID4KPiA+ID4KPiA+ID4gX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX18KPiA+ID4gbGludXgtcmlzY3YgbWFpbGluZyBsaXN0Cj4gPiA+IGxpbnV4LXJpc2N2QGxp c3RzLmluZnJhZGVhZC5vcmcKPiA+ID4gaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1h bi9saXN0aW5mby9saW51eC1yaXNjdgo+ID4KPiA+IFNvbWUgaW50ZXJlc3RpbmcgcmVzdWx0cywg b24gUUVNVSAodmxlbj0yNTYpIHRoZXNlIHZlY3Rvcml6ZWQgdmVyc2lvbnMKPiA+IGFyZSBhcm91 bmQgNnggZmFzdGVyIG9uIG15IENQVS4gVmVjdG9yIGluIFFFTVUgaXMgbm90IG9wdGltaXplZCBz byBJIGFtCj4gPiBzdXJwcmlzZWQgdGhhdCB0aGVyZSBpcyB0aGlzIG11Y2ggc3BlZWR1cC4KPiAK PiBXaGljaCB2ZXJzaW9uIG9mIFFFTVUgZGlkIHlvdSB1c2U/IFdoYXQgb3B0aW9ucyB3ZXJlIHVz ZWQgd2hlbiBydW5uaW5nIFFFTVU/Cj4gCj4gSSB3YW50IHRvIHRyeSBvbiBteSBzaWRlLCBzaW5j ZSB0aGlzIHRlc3QgZGlkbid0IHJ1biBhcyBmYXN0IGxpa2UgeW91cgo+IHRlc3QgcmVzdWx0IG9u IG15IFFFTVUgKEknbSB1c2luZyB2OS4wLjAsIHZsZW49MTI4KS4KCk9oIGludGVyZXN0aW5nLCBJ IGhhZCB0aGUgImljb3VudCIgcGx1Z2luIGVuYWJsZWQgYW5kIHRoYXQgYXBwYXJlbnRseQpyZWFs bHkgbWVzc2VzIHVwIHRoaXMgcGVyZm9ybWFuY2UgY291bnRpbmcuCgpNeSBvcmlnaW5hbCB0ZXN0 IHdhcyBvbiBRRU1VIDkuMS4wLgoKSSB1cGdyYWRlZCBteSBRRU1VIHRvIHY5LjIuMCBhbmQgdGVz dGVkIGFnYWluLgoKV2l0aCB0aGUgb3B0aW9uICItaWNvdW50IHNoaWZ0PTAiIEkgZ2V0OgoKWyAg ICAwLjEyODMwNF0gcmFpZDY6IHJ2dngxICAgIGdlbigpICAyNjcxIE1CL3MKWyAgICAwLjE5NjM1 OF0gcmFpZDY6IHJ2dngyICAgIGdlbigpICAzMTAxIE1CL3MKWyAgICAwLjI2NDQxMF0gcmFpZDY6 IHJ2dng0ICAgIGdlbigpICAzMzcwIE1CL3MKWyAgICAwLjMzMjQ4OF0gcmFpZDY6IGludDY0eDgg IGdlbigpICAgNTQ4IE1CL3MKWyAgICAwLjQwMDU1Ml0gcmFpZDY6IGludDY0eDQgIGdlbigpICAg NjAxIE1CL3MKWyAgICAwLjQ2ODYwMF0gcmFpZDY6IGludDY0eDIgIGdlbigpICAgNTg1IE1CL3MK WyAgICAwLjUzNjY2MV0gcmFpZDY6IGludDY0eDEgIGdlbigpICAgNTE5IE1CL3MKWyAgICAwLjUz NjY3M10gcmFpZDY6IHVzaW5nIGFsZ29yaXRobSBydnZ4NCBnZW4oKSAzMzcwIE1CL3MKWyAgICAw LjYwNDY4OF0gcmFpZDY6IC4uLi4geG9yKCkgMTk0NCBNQi9zLCBybXcgZW5hYmxlZAoKV2l0aG91 dCBpdCBJIGdldDoKClsgICAgMC4zNjYxNDJdIHJhaWQ2OiBydnZ4MSAgICBnZW4oKSAgIDcxMiBN Qi9zClsgICAgMC40NDAyMDVdIHJhaWQ2OiBydnZ4MiAgICBnZW4oKSAgIDczMyBNQi9zClsgICAg MC41MDg3NTFdIHJhaWQ2OiBydnZ4NCAgICBnZW4oKSAgIDczOSBNQi9zClsgICAgMC41NzcyNjld IHJhaWQ2OiBpbnQ2NHg4ICBnZW4oKSAgMTQ3NSBNQi9zClsgICAgMC42NDU3ODFdIHJhaWQ2OiBp bnQ2NHg0ICBnZW4oKSAgMjE2NCBNQi9zClsgICAgMC43MTQzNjNdIHJhaWQ2OiBpbnQ2NHgyICBn ZW4oKSAgMTE0OSBNQi9zClsgICAgMC43ODI4MzddIHJhaWQ2OiBpbnQ2NHgxICBnZW4oKSAgMTcw OSBNQi9zClsgICAgMC43ODI5ODZdIHJhaWQ2OiB1c2luZyBhbGdvcml0aG0gaW50NjR4NCBnZW4o KSAyMTY0IE1CL3MKWyAgICAwLjg1MTkxMF0gcmFpZDY6IC4uLi4geG9yKCkgMTEzMSBNQi9zLCBy bXcgZW5hYmxlZAoKSSB3aWxsIG5lZWQgdG8ga2VlcCB0aGF0IGluIG1pbmQgd2hlbiBjb21wYXJp bmcgdmVjdG9yIHBlcmZvcm1hbmNlIQpTZWVtcyBsaWtlIHRoaXMgb3B0aW9uIGRvZXMgc29tZXRo aW5nIHdlaXJkLgoKLSBDaGFybGllCgo+IAo+ID4KPiA+ICMgbW9kcHJvYmUgcmFpZDZfcHEKPiA+ IFsgICAzNi4yMzgzNzddIHJhaWQ2OiBydnZ4MSAgICBnZW4oKSAgMjY2OCBNQi9zCj4gPiBbICAg MzYuMzA2MzgxXSByYWlkNjogcnZ2eDIgICAgZ2VuKCkgIDMwOTcgTUIvcwo+ID4gWyAgIDM2LjM3 NDM3Nl0gcmFpZDY6IHJ2dng0ICAgIGdlbigpICAzMzY2IE1CL3MKPiA+IFsgICAzNi40NDIzODVd IHJhaWQ2OiBpbnQ2NHg4ICBnZW4oKSAgIDU0OCBNQi9zCj4gPiBbICAgMzYuNTEwMzk3XSByYWlk NjogaW50NjR4NCAgZ2VuKCkgICA2MDAgTUIvcwo+ID4gWyAgIDM2LjU3ODM4OF0gcmFpZDY6IGlu dDY0eDIgIGdlbigpICAgNTg1IE1CL3MKPiA+IFsgICAzNi42NDYzODRdIHJhaWQ2OiBpbnQ2NHgx ICBnZW4oKSAgIDUxOCBNQi9zCj4gPiBbICAgMzYuNjQ2Mzk1XSByYWlkNjogdXNpbmcgYWxnb3Jp dGhtIHJ2dng0IGdlbigpIDMzNjYgTUIvcwo+ID4gWyAgIDM2LjcxNDM3N10gcmFpZDY6IC4uLi4g eG9yKCkgMTk0MiBNQi9zLCBybXcgZW5hYmxlZAo+ID4gWyAgIDM2LjcxNDM4N10gcmFpZDY6IHVz aW5nIHJ2diByZWNvdmVyeSBhbGdvcml0aG0KPiA+Cj4gPiBJIGFsc28gcmFuIHRoZSByYWlkNnRl c3RzOgo+ID4KPiA+IHJhaWQ2dGVzdDogY29tcGxldGUgKDI0MjkgdGVzdHMsIDAgZmFpbHVyZXMp Cj4gPgo+ID4gSSBhbSBub3QgZmFtaWxpYXIgd2l0aCB0aGlzIGFsZ29yaXRobSwgYnV0IHNpbmNl IGl0IHBhc3NlZCBhbGwgb2YgdGhlCj4gPiB0ZXN0IGNhc2VzIGFuZCBzaG93cyBhIHJlbWFya2Fi bGUgc3BlZWR1cCwgdGhpcyBwYXRjaCBzZWVtcyBsaWtlIGEgZ3JlYXQKPiA+IGltcHJvdmVtZW50 Lgo+ID4KPiA+IEFzIEplc3NpY2EgcG9pbnRlZCBvdXQsIHBsZWFzZSBwdXQgdGhlIHZlY3RvciBw b3AvcHVzaCBpbiB0aGUgc2FtZSBibG9jawo+ID4gYXMgeW91ciB2ZWN0b3IgaW5zdHJ1Y3Rpb25z LiBXaGlsZSB0ZXN0aW5nIHRoaXMgY29kZSwgSSB0aHJldyB0b2dldGhlciBhCj4gPiBwYXRjaCBm b3IgdGhpcyB0aGF0IHlvdSBjYW4gc3F1YXNoOgo+IAo+IE9rLCB3aWxsIGRvLgo+IAo+ID4KPiA+ IEZyb20gMzIxMTdjMGE1YjJiYmJhNzQzOWFmMzdlNTU2MzFlMGUzOGI2M2E3YyBNb24gU2VwIDE3 IDAwOjAwOjAwIDIwMDEKPiA+IEZyb206IENoYXJsaWUgSmVua2lucyA8Y2hhcmxpZUByaXZvc2lu Yy5jb20+Cj4gPiBEYXRlOiBXZWQsIDggSmFuIDIwMjUgMTQ6MzI6MjYgLTA4MDAKPiA+IFN1Ympl Y3Q6IFtQQVRDSF0gRml4dXAgdmVjdG9yIG9wdGlvbnMKPiA+Cj4gPiBTaWduZWQtb2ZmLWJ5OiBD aGFybGllIEplbmtpbnMgPGNoYXJsaWVAcml2b3NpbmMuY29tPgo+IAo+IFRoYW5rcyBmb3IgdGhl IHRlc3QsIHJldmlldyBhbmQgdGhlIHBhdGNoLgo+IENodW55YW4KPiAKPiA+IC0tLQo+ID4gIGxp Yi9yYWlkNi9NYWtlZmlsZSAgICB8ICAyIC0tCj4gPiAgbGliL3JhaWQ2L3JlY292X3J2di5jIHwg MTIgKysrKy0tLQo+ID4gIGxpYi9yYWlkNi9ydnYuYyAgICAgICB8IDgxICsrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKy0tLS0tLS0KPiA+ICAzIGZpbGVzIGNoYW5nZWQsIDc3IGlu c2VydGlvbnMoKyksIDE4IGRlbGV0aW9ucygtKQo+ID4KPiA+IGRpZmYgLS1naXQgYS9saWIvcmFp ZDYvTWFrZWZpbGUgYi9saWIvcmFpZDYvTWFrZWZpbGUKPiA+IGluZGV4IGU2MmZiN2NkNzczZS4u NWJlMGE0ZTYwYWIxIDEwMDY0NAo+ID4gLS0tIGEvbGliL3JhaWQ2L01ha2VmaWxlCj4gPiArKysg Yi9saWIvcmFpZDYvTWFrZWZpbGUKPiA+IEBAIC0xMSw4ICsxMSw2IEBAIHJhaWQ2X3BxLSQoQ09O RklHX0tFUk5FTF9NT0RFX05FT04pICs9IG5lb24ubyBuZW9uMS5vIG5lb24yLm8gbmVvbjQubyBu ZW9uOC5vIHJlCj4gPiAgcmFpZDZfcHEtJChDT05GSUdfUzM5MCkgKz0gczM5MHZ4OC5vIHJlY292 X3MzOTB4Yy5vCj4gPiAgcmFpZDZfcHEtJChDT05GSUdfTE9PTkdBUkNIKSArPSBsb29uZ2FyY2hf c2ltZC5vIHJlY292X2xvb25nYXJjaF9zaW1kLm8KPiA+ICByYWlkNl9wcS0kKENPTkZJR19SSVND Vl9JU0FfVikgKz0gcnZ2Lm8gcmVjb3ZfcnZ2Lm8KPiA+IC1DRkxBR1NfcnZ2Lm8gKz0gLW1hcmNo PXJ2NjRnY3YKPiA+IC1DRkxBR1NfcmVjb3ZfcnZ2Lm8gKz0gLW1hcmNoPXJ2NjRnY3YKPiA+Cj4g PiAgaG9zdHByb2dzICAgICAgKz0gbWt0YWJsZXMKPiA+Cj4gPiBkaWZmIC0tZ2l0IGEvbGliL3Jh aWQ2L3JlY292X3J2di5jIGIvbGliL3JhaWQ2L3JlY292X3J2di5jCj4gPiBpbmRleCA4YWU3NDgw M2VhN2YuLjAyYjk3ZDg4NTUxMCAxMDA2NDQKPiA+IC0tLSBhL2xpYi9yYWlkNi9yZWNvdl9ydnYu Ywo+ID4gKysrIGIvbGliL3JhaWQ2L3JlY292X3J2di5jCj4gPiBAQCAtMTcsNiArMTcsNyBAQCBz dGF0aWMgdm9pZCBfX3JhaWQ2XzJkYXRhX3JlY292X3J2dihpbnQgYnl0ZXMsIHU4ICpwLCB1OCAq cSwgdTggKmRwLAo+ID4gICAgICAgICAgICAgICAgICIub3B0aW9uICAgICAgICBwdXNoXG4iCj4g PiAgICAgICAgICAgICAgICAgIi5vcHRpb24gICAgICAgIGFyY2gsK3ZcbiIKPiA+ICAgICAgICAg ICAgICAgICAidnNldHZsaSAgICAgICAgeDAsICVbYXZsXSwgZTgsIG0xLCB0YSwgbWFcbiIKPiA+ ICsgICAgICAgICAgICAgICAiLm9wdGlvbiAgICAgICAgcG9wXG4iCj4gPiAgICAgICAgICAgICAg ICAgOiA6Cj4gPiAgICAgICAgICAgICAgICAgW2F2bF0iciIoMTYpCj4gPiAgICAgICAgICk7Cj4g PiBAQCAtNDIsNiArNDMsOCBAQCBzdGF0aWMgdm9pZCBfX3JhaWQ2XzJkYXRhX3JlY292X3J2dihp bnQgYnl0ZXMsIHU4ICpwLCB1OCAqcSwgdTggKmRwLAo+ID4gICAgICAgICAgICAgICAgICAqIHYx NDpwL3FtW3Z4XSwgdjE1OnAvcW1bdnldCj4gPiAgICAgICAgICAgICAgICAgICovCj4gPiAgICAg ICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICIu b3B0aW9uICAgICAgICBwdXNoXG4iCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiLm9wdGlv biAgICAgICAgYXJjaCwrdlxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgInZsZTgudiAg ICAgICAgIHYwLCAoJVtweF0pXG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAidmxlOC52 ICAgICAgICAgdjEsICglW2RwXSlcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICJ2eG9y LnZ2ICAgICAgICB2MCwgdjAsIHYxXG4iCj4gPiBAQCAtNjcsNiArNzAsNyBAQCBzdGF0aWMgdm9p ZCBfX3JhaWQ2XzJkYXRhX3JlY292X3J2dihpbnQgYnl0ZXMsIHU4ICpwLCB1OCAqcSwgdTggKmRw LAo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgInZ4b3IudnYgICAgICAgIHYxLCB2MywgdjBc biIgLyogdjEgPSBkYiBeIHB4OyAqLwo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgInZzZTgu diAgICAgICAgIHYzLCAoJVtkcV0pXG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAidnNl OC52ICAgICAgICAgdjEsICglW2RwXSlcbiIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICIu b3B0aW9uICAgICAgICBwb3BcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIDogOgo+ID4g ICAgICAgICAgICAgICAgICAgICAgICAgW3B4XSJyIihwKSwKPiA+ICAgICAgICAgICAgICAgICAg ICAgICAgIFtkcF0iciIoZHApLAo+ID4gQEAgLTg0LDggKzg4LDYgQEAgc3RhdGljIHZvaWQgX19y YWlkNl8yZGF0YV9yZWNvdl9ydnYoaW50IGJ5dGVzLCB1OCAqcCwgdTggKnEsIHU4ICpkcCwKPiA+ ICAgICAgICAgICAgICAgICBkcCArPSAxNjsKPiA+ICAgICAgICAgICAgICAgICBkcSArPSAxNjsK PiA+ICAgICAgICAgfQo+ID4gLQo+ID4gLSAgICAgICBhc20gdm9sYXRpbGUgKCIub3B0aW9uIHBv cFxuIik7Cj4gPiAgfQo+ID4KPiA+ICBzdGF0aWMgdm9pZCBfX3JhaWQ2X2RhdGFwX3JlY292X3J2 dihpbnQgYnl0ZXMsIHVpbnQ4X3QgKnAsIHVpbnQ4X3QgKnEsIHVpbnQ4X3QgKmRxLAo+ID4gQEAg LTk1LDYgKzk3LDcgQEAgc3RhdGljIHZvaWQgX19yYWlkNl9kYXRhcF9yZWNvdl9ydnYoaW50IGJ5 dGVzLCB1aW50OF90ICpwLCB1aW50OF90ICpxLCB1aW50OF90ICoKPiA+ICAgICAgICAgICAgICAg ICAiLm9wdGlvbiAgICAgICAgcHVzaFxuIgo+ID4gICAgICAgICAgICAgICAgICIub3B0aW9uICAg ICAgICBhcmNoLCt2XG4iCj4gPiAgICAgICAgICAgICAgICAgInZzZXR2bGkgICAgICAgIHgwLCAl W2F2bF0sIGU4LCBtMSwgdGEsIG1hXG4iCj4gPiArICAgICAgICAgICAgICAgIi5vcHRpb24gICAg ICAgIHBvcFxuIgo+ID4gICAgICAgICAgICAgICAgIDogOgo+ID4gICAgICAgICAgICAgICAgIFth dmxdInIiKDE2KQo+ID4gICAgICAgICApOwo+ID4gQEAgLTExMyw2ICsxMTYsOCBAQCBzdGF0aWMg dm9pZCBfX3JhaWQ2X2RhdGFwX3JlY292X3J2dihpbnQgYnl0ZXMsIHVpbnQ4X3QgKnAsIHVpbnQ4 X3QgKnEsIHVpbnQ4X3QgKgo+ID4gICAgICAgICAgICAgICAgICAqIHYxMDptW3Z4XSwgdjExOm1b dnldCj4gPiAgICAgICAgICAgICAgICAgICovCj4gPiAgICAgICAgICAgICAgICAgYXNtIHZvbGF0 aWxlICgKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uICAgICAgICBwdXNoXG4i Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiLm9wdGlvbiAgICAgICAgYXJjaCwrdlxuIgo+ ID4gICAgICAgICAgICAgICAgICAgICAgICAgInZsZTgudiAgICAgICAgIHYwLCAoJVt2eF0pXG4i Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAidmxlOC52ICAgICAgICAgdjIsICglW2RxXSlc biIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICJ2eG9yLnZ2ICAgICAgICB2MCwgdjAsIHYy XG4iCj4gPiBAQCAtMTI3LDYgKzEzMiw3IEBAIHN0YXRpYyB2b2lkIF9fcmFpZDZfZGF0YXBfcmVj b3ZfcnZ2KGludCBieXRlcywgdWludDhfdCAqcCwgdWludDhfdCAqcSwgdWludDhfdCAqCj4gPiAg ICAgICAgICAgICAgICAgICAgICAgICAidnhvci52diAgICAgICAgdjEsIHYwLCB2MVxuIgo+ID4g ICAgICAgICAgICAgICAgICAgICAgICAgInZzZTgudiAgICAgICAgIHYwLCAoJVtkcV0pXG4iCj4g PiAgICAgICAgICAgICAgICAgICAgICAgICAidnNlOC52ICAgICAgICAgdjEsICglW3Z5XSlcbiIK PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uICAgICAgICBwb3BcbiIKPiA+ICAg ICAgICAgICAgICAgICAgICAgICAgIDogOgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgW3Z4 XSJyIihxKSwKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIFt2eV0iciIocCksCj4gPiBAQCAt MTQwLDggKzE0Niw2IEBAIHN0YXRpYyB2b2lkIF9fcmFpZDZfZGF0YXBfcmVjb3ZfcnZ2KGludCBi eXRlcywgdWludDhfdCAqcCwgdWludDhfdCAqcSwgdWludDhfdCAqCj4gPiAgICAgICAgICAgICAg ICAgcSArPSAxNjsKPiA+ICAgICAgICAgICAgICAgICBkcSArPSAxNjsKPiA+ICAgICAgICAgfQo+ ID4gLQo+ID4gLSAgICAgICBhc20gdm9sYXRpbGUgKCIub3B0aW9uIHBvcFxuIik7Cj4gPiAgfQo+ ID4KPiA+Cj4gPiBkaWZmIC0tZ2l0IGEvbGliL3JhaWQ2L3J2di5jIGIvbGliL3JhaWQ2L3J2di5j Cj4gPiBpbmRleCAyMWY1NDMyNTA2ZGEuLjgxYjM4ZGNhZmViNiAxMDA2NDQKPiA+IC0tLSBhL2xp Yi9yYWlkNi9ydnYuYwo+ID4gKysrIGIvbGliL3JhaWQ2L3J2di5jCj4gPiBAQCAtMzEsMTQgKzMx LDE4IEBAIHN0YXRpYyB2b2lkIHJhaWQ2X3J2djFfZ2VuX3N5bmRyb21lX3JlYWwoaW50IGRpc2tz LCB1bnNpZ25lZCBsb25nIGJ5dGVzLCB2b2lkICoqCj4gPiAgICAgICAgICAgICAgICAgIi5vcHRp b24gICAgICAgIHB1c2hcbiIKPiA+ICAgICAgICAgICAgICAgICAiLm9wdGlvbiAgICAgICAgYXJj aCwrdlxuIgo+ID4gICAgICAgICAgICAgICAgICJ2c2V0dmxpICAgICAgICB0MCwgeDAsIGU4LCBt MSwgdGEsIG1hXG4iCj4gPiArICAgICAgICAgICAgICAgIi5vcHRpb24gICAgICAgIHBvcFxuIgo+ ID4gICAgICAgICApOwo+ID4KPiA+ICAgICAgICAgIC8qIHYwOndwMCwgdjE6d3EwLCB2Mjp3ZDAv dzIwLCB2Mzp3MTAgKi8KPiA+ICAgICAgICAgZm9yIChkID0gMCA7IGQgPCBieXRlcyA7IGQgKz0g TlNJWkUqMSkgewo+ID4gICAgICAgICAgICAgICAgIC8qIHdxJCQgPSB3cCQkID0gKih1bmF0aXZl X3QgKikmZHB0clt6MF1bZCskJCpOU0laRV07ICovCj4gPiAgICAgICAgICAgICAgICAgYXNtIHZv bGF0aWxlICgKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uICAgICAgICBwdXNo XG4iCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiLm9wdGlvbiAgICAgICAgYXJjaCwrdlxu Igo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgInZsZTgudiB2MCwgKCVbd3AwXSlcbiIKPiA+ ICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGU4LnYgdjEsICglW3dwMF0pXG4iCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAiLm9wdGlvbiAgICAgICAgcG9wXG4iCj4gPiAgICAgICAgICAg ICAgICAgICAgICAgICA6IDoKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIFt3cDBdInIiKCZk cHRyW3owXVtkKzAqTlNJWkVdKQo+ID4gICAgICAgICAgICAgICAgICk7Cj4gPiBAQCAtNTQsNiAr NTgsOCBAQCBzdGF0aWMgdm9pZCByYWlkNl9ydnYxX2dlbl9zeW5kcm9tZV9yZWFsKGludCBkaXNr cywgdW5zaWduZWQgbG9uZyBieXRlcywgdm9pZCAqKgo+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgICogd3AkJCBePSB3ZCQkOwo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICovCj4gPiAg ICAgICAgICAgICAgICAgICAgICAgICBhc20gdm9sYXRpbGUgKAo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAiLm9wdGlvbiAgICAgICAgcHVzaFxuIgo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAiLm9wdGlvbiAgICAgICAgYXJjaCwrdlxuIgo+ID4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAidnNyYS52aSAgICAgICAgdjIsIHYxLCA3XG4iCj4g PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2c2xsLnZpICAgICAgICB2MywgdjEs IDFcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbmQudnggICAgICAg IHYyLCB2MiwgJVt4MWRdXG4iCj4gPiBAQCAtNjEsNiArNjcsNyBAQCBzdGF0aWMgdm9pZCByYWlk Nl9ydnYxX2dlbl9zeW5kcm9tZV9yZWFsKGludCBkaXNrcywgdW5zaWduZWQgbG9uZyBieXRlcywg dm9pZCAqKgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmxlOC52ICAgICAg ICAgdjIsICglW3dkMF0pXG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2 eG9yLnZ2ICAgICAgICB2MSwgdjMsIHYyXG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICJ2eG9yLnZ2ICAgICAgICB2MCwgdjAsIHYyXG4iCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICIub3B0aW9uICAgICAgICBwb3BcbiIKPiA+ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgOiA6Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFt3ZDBdInIiKCZkcHRyW3pdW2QrMCpOU0laRV0pLAo+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICBbeDFkXSJyIigweDFkKQo+ID4gQEAgLTcyLDE1ICs3OSwxNiBAQCBzdGF0aWMg dm9pZCByYWlkNl9ydnYxX2dlbl9zeW5kcm9tZV9yZWFsKGludCBkaXNrcywgdW5zaWduZWQgbG9u ZyBieXRlcywgdm9pZCAqKgo+ID4gICAgICAgICAgICAgICAgICAqICoodW5hdGl2ZV90ICopJnFb ZCtOU0laRSokJF0gPSB3cSQkOwo+ID4gICAgICAgICAgICAgICAgICAqLwo+ID4gICAgICAgICAg ICAgICAgIGFzbSB2b2xhdGlsZSAoCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiLm9wdGlv biAgICAgICAgcHVzaFxuIgo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRpb24gICAg ICAgIGFyY2gsK3ZcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICJ2c2U4LnYgICAgICAg ICB2MCwgKCVbd3AwXSlcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICJ2c2U4LnYgICAg ICAgICB2MSwgKCVbd3EwXSlcbiIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9u ICAgICAgICBwb3BcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIDogOgo+ID4gICAgICAg ICAgICAgICAgICAgICAgICAgW3dwMF0iciIoJnBbZCtOU0laRSowXSksCj4gPiAgICAgICAgICAg ICAgICAgICAgICAgICBbd3EwXSJyIigmcVtkK05TSVpFKjBdKQo+ID4gICAgICAgICAgICAgICAg ICk7Cj4gPiAgICAgICAgIH0KPiA+IC0KPiA+IC0gICAgICAgYXNtIHZvbGF0aWxlICgiLm9wdGlv biBwb3BcbiIpOwo+ID4gIH0KPiA+Cj4gPiAgc3RhdGljIHZvaWQgcmFpZDZfcnZ2MV94b3Jfc3lu ZHJvbWVfcmVhbChpbnQgZGlza3MsIGludCBzdGFydCwgaW50IHN0b3AsCj4gPiBAQCAtOTgsMTQg KzEwNiwxOCBAQCBzdGF0aWMgdm9pZCByYWlkNl9ydnYxX3hvcl9zeW5kcm9tZV9yZWFsKGludCBk aXNrcywgaW50IHN0YXJ0LCBpbnQgc3RvcCwKPiA+ICAgICAgICAgICAgICAgICAiLm9wdGlvbiBw dXNoXG4iCj4gPiAgICAgICAgICAgICAgICAgIi5vcHRpb24gYXJjaCwrdlxuIgo+ID4gICAgICAg ICAgICAgICAgICJ2c2V0dmxpICAgICAgICB0MCwgeDAsIGU4LCBtMSwgdGEsIG1hXG4iCj4gPiAr ICAgICAgICAgICAgICAgIi5vcHRpb24gICAgICAgIHBvcFxuIgo+ID4gICAgICAgICApOwo+ID4K PiA+ICAgICAgICAgLyogdjA6d3AwLCB2MTp3cTAsIHYyOndkMC93MjAsIHYzOncxMCAqLwo+ID4g ICAgICAgICBmb3IgKGQgPSAwIDsgZCA8IGJ5dGVzIDsgZCArPSBOU0laRSoxKSB7Cj4gPiAgICAg ICAgICAgICAgICAgLyogd3EkJCA9IHdwJCQgPSAqKHVuYXRpdmVfdCAqKSZkcHRyW3owXVtkKyQk Kk5TSVpFXTsgKi8KPiA+ICAgICAgICAgICAgICAgICBhc20gdm9sYXRpbGUgKAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgIi5vcHRpb24gICAgICAgIHB1c2hcbiIKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgICIub3B0aW9uICAgICAgICBhcmNoLCt2XG4iCj4gPiAgICAgICAgICAgICAg ICAgICAgICAgICAidmxlOC52IHYwLCAoJVt3cDBdKVxuIgo+ID4gICAgICAgICAgICAgICAgICAg ICAgICAgInZsZTgudiB2MSwgKCVbd3AwXSlcbiIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICIub3B0aW9uICAgICAgICBwb3BcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIDogOgo+ ID4gICAgICAgICAgICAgICAgICAgICAgICAgW3dwMF0iciIoJmRwdHJbejBdW2QrMCpOU0laRV0p Cj4gPiAgICAgICAgICAgICAgICAgKTsKPiA+IEBAIC0xMjIsNiArMTM0LDggQEAgc3RhdGljIHZv aWQgcmFpZDZfcnZ2MV94b3Jfc3luZHJvbWVfcmVhbChpbnQgZGlza3MsIGludCBzdGFydCwgaW50 IHN0b3AsCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3cCQkIF49IHdkJCQ7Cj4gPiAg ICAgICAgICAgICAgICAgICAgICAgICAgKi8KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIGFz bSB2b2xhdGlsZSAoCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9u ICAgICAgICBwdXNoXG4iCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIub3B0 aW9uICAgICAgICBhcmNoLCt2XG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICJ2c3JhLnZpICAgICAgICB2MiwgdjEsIDdcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgInZzbGwudmkgICAgICAgIHYzLCB2MSwgMVxuIgo+ID4gICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAidmFuZC52eCAgICAgICAgdjIsIHYyLCAlW3gxZF1cbiIKPiA+IEBA IC0xMjksNiArMTQzLDcgQEAgc3RhdGljIHZvaWQgcmFpZDZfcnZ2MV94b3Jfc3luZHJvbWVfcmVh bChpbnQgZGlza3MsIGludCBzdGFydCwgaW50IHN0b3AsCj4gPiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICJ2bGU4LnYgICAgICAgICB2MiwgKCVbd2QwXSlcbiIKPiA+ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgInZ4b3IudnYgICAgICAgIHYxLCB2MywgdjJcbiIKPiA+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZ4b3IudnYgICAgICAgIHYwLCB2MCwg djJcbiIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRpb24gICAgICAg IHBvcFxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDoKPiA+ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgW3dkMF0iciIoJmRwdHJbel1bZCswKk5TSVpFXSks Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt4MWRdInIiKDB4MWQpCj4gPiBA QCAtMTQ0LDEwICsxNTksMTMgQEAgc3RhdGljIHZvaWQgcmFpZDZfcnZ2MV94b3Jfc3luZHJvbWVf cmVhbChpbnQgZGlza3MsIGludCBzdGFydCwgaW50IHN0b3AsCj4gPiAgICAgICAgICAgICAgICAg ICAgICAgICAgKiB3cSQkID0gdzEkJCBeIHcyJCQ7Cj4gPiAgICAgICAgICAgICAgICAgICAgICAg ICAgKi8KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uICAgICAgICBwdXNoXG4iCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uICAgICAgICBhcmNoLCt2XG4i Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2c3JhLnZpICAgICAgICB2Miwg djEsIDdcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZzbGwudmkgICAg ICAgIHYzLCB2MSwgMVxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFu ZC52eCAgICAgICAgdjIsIHYyLCAlW3gxZF1cbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgInZ4b3IudnYgICAgICAgIHYxLCB2MywgdjJcbiIKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIi5vcHRpb24gICAgICAgIHBvcFxuIgo+ID4gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICA6IDoKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgW3gxZF0iciIoMHgxZCkKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICk7Cj4gPiBAQCAt MTU5LDE5ICsxNzcsMjAgQEAgc3RhdGljIHZvaWQgcmFpZDZfcnZ2MV94b3Jfc3luZHJvbWVfcmVh bChpbnQgZGlza3MsIGludCBzdGFydCwgaW50IHN0b3AsCj4gPiAgICAgICAgICAgICAgICAgICog djA6d3AwLCB2MTp3cTAsIHYyOnAwLCB2MzpxMAo+ID4gICAgICAgICAgICAgICAgICAqLwo+ID4g ICAgICAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAiLm9wdGlvbiAgICAgICAgcHVzaFxuIgo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgIi5v cHRpb24gICAgICAgIGFyY2gsK3ZcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGU4 LnYgICAgICAgICB2MiwgKCVbd3AwXSlcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICJ2 bGU4LnYgICAgICAgICB2MywgKCVbd3EwXSlcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAg ICJ2eG9yLnZ2ICAgICAgICB2MiwgdjIsIHYwXG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAg ICAidnhvci52diAgICAgICAgdjMsIHYzLCB2MVxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgInZzZTgudiAgICAgICAgIHYyLCAoJVt3cDBdKVxuIgo+ID4gICAgICAgICAgICAgICAgICAg ICAgICAgInZzZTgudiAgICAgICAgIHYzLCAoJVt3cTBdKVxuIgo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgIi5vcHRpb24gICAgICAgIHBvcFxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgOiA6Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBbd3AwXSJyIigmcFtkK05TSVpFKjBd KSwKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIFt3cTBdInIiKCZxW2QrTlNJWkUqMF0pCj4g PiAgICAgICAgICAgICAgICAgKTsKPiA+ICAgICAgICAgfQo+ID4gLQo+ID4gLSAgICAgICBhc20g dm9sYXRpbGUgKCIub3B0aW9uIHBvcFxuIik7Cj4gPiAgfQo+ID4KPiA+ICBzdGF0aWMgdm9pZCBy YWlkNl9ydnYyX2dlbl9zeW5kcm9tZV9yZWFsKGludCBkaXNrcywgdW5zaWduZWQgbG9uZyBieXRl cywgdm9pZCAqKnB0cnMpCj4gPiBAQCAtMTg4LDYgKzIwNyw3IEBAIHN0YXRpYyB2b2lkIHJhaWQ2 X3J2djJfZ2VuX3N5bmRyb21lX3JlYWwoaW50IGRpc2tzLCB1bnNpZ25lZCBsb25nIGJ5dGVzLCB2 b2lkICoqCj4gPiAgICAgICAgICAgICAgICAgIi5vcHRpb24gICAgICAgIHB1c2hcbiIKPiA+ICAg ICAgICAgICAgICAgICAiLm9wdGlvbiAgICAgICAgYXJjaCwrdlxuIgo+ID4gICAgICAgICAgICAg ICAgICJ2c2V0dmxpICAgICAgICB0MCwgeDAsIGU4LCBtMSwgdGEsIG1hXG4iCj4gPiArICAgICAg ICAgICAgICAgIi5vcHRpb24gICAgICAgIHBvcFxuIgo+ID4gICAgICAgICApOwo+ID4KPiA+ICAg ICAgICAgLyoKPiA+IEBAIC0xOTcsMTAgKzIxNywxMyBAQCBzdGF0aWMgdm9pZCByYWlkNl9ydnYy X2dlbl9zeW5kcm9tZV9yZWFsKGludCBkaXNrcywgdW5zaWduZWQgbG9uZyBieXRlcywgdm9pZCAq Kgo+ID4gICAgICAgICBmb3IgKGQgPSAwIDsgZCA8IGJ5dGVzIDsgZCArPSBOU0laRSoyKSB7Cj4g PiAgICAgICAgICAgICAgICAgLyogd3EkJCA9IHdwJCQgPSAqKHVuYXRpdmVfdCAqKSZkcHRyW3ow XVtkKyQkKk5TSVpFXTsgKi8KPiA+ICAgICAgICAgICAgICAgICBhc20gdm9sYXRpbGUgKAo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRpb24gICAgICAgIHB1c2hcbiIKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICIub3B0aW9uICAgICAgICBhcmNoLCt2XG4iCj4gPiAgICAgICAg ICAgICAgICAgICAgICAgICAidmxlOC52IHYwLCAoJVt3cDBdKVxuIgo+ID4gICAgICAgICAgICAg ICAgICAgICAgICAgInZsZTgudiB2MSwgKCVbd3AwXSlcbiIKPiA+ICAgICAgICAgICAgICAgICAg ICAgICAgICJ2bGU4LnYgdjQsICglW3dwMV0pXG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAg ICAidmxlOC52IHY1LCAoJVt3cDFdKVxuIgo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgIi5v cHRpb24gICAgICAgIHBvcFxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgOiA6Cj4gPiAg ICAgICAgICAgICAgICAgICAgICAgICBbd3AwXSJyIigmZHB0clt6MF1bZCswKk5TSVpFXSksCj4g PiAgICAgICAgICAgICAgICAgICAgICAgICBbd3AxXSJyIigmZHB0clt6MF1bZCsxKk5TSVpFXSkK PiA+IEBAIC0yMTcsNiArMjQwLDggQEAgc3RhdGljIHZvaWQgcmFpZDZfcnZ2Ml9nZW5fc3luZHJv bWVfcmVhbChpbnQgZGlza3MsIHVuc2lnbmVkIGxvbmcgYnl0ZXMsIHZvaWQgKioKPiA+ICAgICAg ICAgICAgICAgICAgICAgICAgICAqIHdwJCQgXj0gd2QkJDsKPiA+ICAgICAgICAgICAgICAgICAg ICAgICAgICAqLwo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgKPiA+ ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRpb24gICAgICAgIHB1c2hcbiIK PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRpb24gICAgICAgIGFyY2gs K3ZcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZzcmEudmkgICAgICAg IHYyLCB2MSwgN1xuIgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidnNsbC52 aSAgICAgICAgdjMsIHYxLCAxXG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICJ2YW5kLnZ4ICAgICAgICB2MiwgdjIsICVbeDFkXVxuIgo+ID4gQEAgLTIzMiw2ICsyNTcsNyBA QCBzdGF0aWMgdm9pZCByYWlkNl9ydnYyX2dlbl9zeW5kcm9tZV9yZWFsKGludCBkaXNrcywgdW5z aWduZWQgbG9uZyBieXRlcywgdm9pZCAqKgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAidmxlOC52ICAgICAgICAgdjYsICglW3dkMV0pXG4iCj4gPiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICJ2eG9yLnZ2ICAgICAgICB2NSwgdjcsIHY2XG4iCj4gPiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICJ2eG9yLnZ2ICAgICAgICB2NCwgdjQsIHY2XG4iCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uICAgICAgICBwb3BcbiIK PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA6Cj4gPiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFt3ZDBdInIiKCZkcHRyW3pdW2QrMCpOU0laRV0pLAo+ID4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbd2QxXSJyIigmZHB0clt6XVtkKzEqTlNJWkVd KSwKPiA+IEBAIC0yNDQsMTAgKzI3MCwxMyBAQCBzdGF0aWMgdm9pZCByYWlkNl9ydnYyX2dlbl9z eW5kcm9tZV9yZWFsKGludCBkaXNrcywgdW5zaWduZWQgbG9uZyBieXRlcywgdm9pZCAqKgo+ID4g ICAgICAgICAgICAgICAgICAqICoodW5hdGl2ZV90ICopJnFbZCtOU0laRSokJF0gPSB3cSQkOwo+ ID4gICAgICAgICAgICAgICAgICAqLwo+ID4gICAgICAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAo Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiLm9wdGlvbiAgICAgICAgcHVzaFxuIgo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRpb24gICAgICAgIGFyY2gsK3ZcbiIKPiA+ICAg ICAgICAgICAgICAgICAgICAgICAgICJ2c2U4LnYgICAgICAgICB2MCwgKCVbd3AwXSlcbiIKPiA+ ICAgICAgICAgICAgICAgICAgICAgICAgICJ2c2U4LnYgICAgICAgICB2MSwgKCVbd3EwXSlcbiIK PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICJ2c2U4LnYgICAgICAgICB2NCwgKCVbd3AxXSlc biIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICJ2c2U4LnYgICAgICAgICB2NSwgKCVbd3Ex XSlcbiIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uICAgICAgICBwb3BcbiIK PiA+ICAgICAgICAgICAgICAgICAgICAgICAgIDogOgo+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgW3dwMF0iciIoJnBbZCtOU0laRSowXSksCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBb d3EwXSJyIigmcVtkK05TSVpFKjBdKSwKPiA+IEBAIC0yNTUsOCArMjg0LDYgQEAgc3RhdGljIHZv aWQgcmFpZDZfcnZ2Ml9nZW5fc3luZHJvbWVfcmVhbChpbnQgZGlza3MsIHVuc2lnbmVkIGxvbmcg Ynl0ZXMsIHZvaWQgKioKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIFt3cTFdInIiKCZxW2Qr TlNJWkUqMV0pCj4gPiAgICAgICAgICAgICAgICAgKTsKPiA+ICAgICAgICAgfQo+ID4gLQo+ID4g LSAgICAgICBhc20gdm9sYXRpbGUgKCIub3B0aW9uIHBvcFxuIik7Cj4gPiAgfQo+ID4KPiA+ICBz dGF0aWMgdm9pZCByYWlkNl9ydnYyX3hvcl9zeW5kcm9tZV9yZWFsKGludCBkaXNrcywgaW50IHN0 YXJ0LCBpbnQgc3RvcCwKPiA+IEBAIC0yNzQsNiArMzAxLDcgQEAgc3RhdGljIHZvaWQgcmFpZDZf cnZ2Ml94b3Jfc3luZHJvbWVfcmVhbChpbnQgZGlza3MsIGludCBzdGFydCwgaW50IHN0b3AsCj4g PiAgICAgICAgICAgICAgICAgIi5vcHRpb24gcHVzaFxuIgo+ID4gICAgICAgICAgICAgICAgICIu b3B0aW9uIGFyY2gsK3ZcbiIKPiA+ICAgICAgICAgICAgICAgICAidnNldHZsaSAgICAgICAgdDAs IHgwLCBlOCwgbTEsIHRhLCBtYVxuIgo+ID4gKyAgICAgICAgICAgICAgICIub3B0aW9uICAgICAg ICBwb3BcbiIKPiA+ICAgICAgICAgKTsKPiA+Cj4gPiAgICAgICAgIC8qCj4gPiBAQCAtMjgzLDEw ICszMTEsMTMgQEAgc3RhdGljIHZvaWQgcmFpZDZfcnZ2Ml94b3Jfc3luZHJvbWVfcmVhbChpbnQg ZGlza3MsIGludCBzdGFydCwgaW50IHN0b3AsCj4gPiAgICAgICAgIGZvciAoZCA9IDAgOyBkIDwg Ynl0ZXMgOyBkICs9IE5TSVpFKjIpIHsKPiA+ICAgICAgICAgICAgICAgICAgLyogd3EkJCA9IHdw JCQgPSAqKHVuYXRpdmVfdCAqKSZkcHRyW3owXVtkKyQkKk5TSVpFXTsgKi8KPiA+ICAgICAgICAg ICAgICAgICBhc20gdm9sYXRpbGUgKAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRp b24gICAgICAgIHB1c2hcbiIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uICAg ICAgICBhcmNoLCt2XG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAidmxlOC52IHYwLCAo JVt3cDBdKVxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgInZsZTgudiB2MSwgKCVbd3Aw XSlcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGU4LnYgdjQsICglW3dwMV0pXG4i Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAidmxlOC52IHY1LCAoJVt3cDFdKVxuIgo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRpb24gICAgICAgIHBvcFxuIgo+ID4gICAgICAg ICAgICAgICAgICAgICAgICAgOiA6Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBbd3AwXSJy IigmZHB0clt6MF1bZCswKk5TSVpFXSksCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBbd3Ax XSJyIigmZHB0clt6MF1bZCsxKk5TSVpFXSkKPiA+IEBAIC0zMDQsNiArMzM1LDggQEAgc3RhdGlj IHZvaWQgcmFpZDZfcnZ2Ml94b3Jfc3luZHJvbWVfcmVhbChpbnQgZGlza3MsIGludCBzdGFydCwg aW50IHN0b3AsCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3cCQkIF49IHdkJCQ7Cj4g PiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KPiA+ICAgICAgICAgICAgICAgICAgICAgICAg IGFzbSB2b2xhdGlsZSAoCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIub3B0 aW9uIHB1c2hcbiIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRpb24g YXJjaCwrdlxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidnNyYS52aSAg ICAgICAgdjIsIHYxLCA3XG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2 c2xsLnZpICAgICAgICB2MywgdjEsIDFcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgInZhbmQudnggICAgICAgIHYyLCB2MiwgJVt4MWRdXG4iCj4gPiBAQCAtMzE5LDYgKzM1 Miw3IEBAIHN0YXRpYyB2b2lkIHJhaWQ2X3J2djJfeG9yX3N5bmRyb21lX3JlYWwoaW50IGRpc2tz LCBpbnQgc3RhcnQsIGludCBzdG9wLAo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAidmxlOC52ICAgICAgICAgdjYsICglW3dkMV0pXG4iCj4gPiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICJ2eG9yLnZ2ICAgICAgICB2NSwgdjcsIHY2XG4iCj4gPiAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICJ2eG9yLnZ2ICAgICAgICB2NCwgdjQsIHY2XG4iCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uICAgICAgICBwb3BcbiIKPiA+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiA6Cj4gPiAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFt3ZDBdInIiKCZkcHRyW3pdW2QrMCpOU0laRV0pLAo+ID4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBbd2QxXSJyIigmZHB0clt6XVtkKzEqTlNJWkVdKSwK PiA+IEBAIC0zMzUsNiArMzY5LDggQEAgc3RhdGljIHZvaWQgcmFpZDZfcnZ2Ml94b3Jfc3luZHJv bWVfcmVhbChpbnQgZGlza3MsIGludCBzdGFydCwgaW50IHN0b3AsCj4gPiAgICAgICAgICAgICAg ICAgICAgICAgICAgKiB3cSQkID0gdzEkJCBeIHcyJCQ7Cj4gPiAgICAgICAgICAgICAgICAgICAg ICAgICAgKi8KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIGFzbSB2b2xhdGlsZSAoCj4gPiAr ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uIHB1c2hcbiIKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRpb24gYXJjaCwrdlxuIgo+ID4gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAidnNyYS52aSAgICAgICAgdjIsIHYxLCA3XG4iCj4g PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2c2xsLnZpICAgICAgICB2MywgdjEs IDFcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbmQudnggICAgICAg IHYyLCB2MiwgJVt4MWRdXG4iCj4gPiBAQCAtMzQ0LDYgKzM4MCw3IEBAIHN0YXRpYyB2b2lkIHJh aWQ2X3J2djJfeG9yX3N5bmRyb21lX3JlYWwoaW50IGRpc2tzLCBpbnQgc3RhcnQsIGludCBzdG9w LAo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidnNsbC52aSAgICAgICAgdjcs IHY1LCAxXG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YW5kLnZ4ICAg ICAgICB2NiwgdjYsICVbeDFkXVxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAidnhvci52diAgICAgICAgdjUsIHY3LCB2NlxuIgo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAiLm9wdGlvbiAgICAgICAgcG9wXG4iCj4gPiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDogOgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbeDFk XSJyIigweDFkKQo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgKTsKPiA+IEBAIC0zNTYsNiAr MzkzLDggQEAgc3RhdGljIHZvaWQgcmFpZDZfcnZ2Ml94b3Jfc3luZHJvbWVfcmVhbChpbnQgZGlz a3MsIGludCBzdGFydCwgaW50IHN0b3AsCj4gPiAgICAgICAgICAgICAgICAgICogdjQ6d3AxLCB2 NTp3cTEsIHY2OnAxLCB2NzpxMQo+ID4gICAgICAgICAgICAgICAgICAqLwo+ID4gICAgICAgICAg ICAgICAgIGFzbSB2b2xhdGlsZSAoCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiLm9wdGlv biBwdXNoXG4iCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiLm9wdGlvbiBhcmNoLCt2XG4i Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAidmxlOC52ICAgICAgICAgdjIsICglW3dwMF0p XG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAidmxlOC52ICAgICAgICAgdjMsICglW3dx MF0pXG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAidnhvci52diAgICAgICAgdjIsIHYy LCB2MFxuIgo+ID4gQEAgLTM2OSw2ICs0MDgsNyBAQCBzdGF0aWMgdm9pZCByYWlkNl9ydnYyX3hv cl9zeW5kcm9tZV9yZWFsKGludCBkaXNrcywgaW50IHN0YXJ0LCBpbnQgc3RvcCwKPiA+ICAgICAg ICAgICAgICAgICAgICAgICAgICJ2eG9yLnZ2ICAgICAgICB2NywgdjcsIHY1XG4iCj4gPiAgICAg ICAgICAgICAgICAgICAgICAgICAidnNlOC52ICAgICAgICAgdjYsICglW3dwMV0pXG4iCj4gPiAg ICAgICAgICAgICAgICAgICAgICAgICAidnNlOC52ICAgICAgICAgdjcsICglW3dxMV0pXG4iCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAiLm9wdGlvbiAgICAgICAgcG9wXG4iCj4gPiAgICAg ICAgICAgICAgICAgICAgICAgICA6IDoKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIFt3cDBd InIiKCZwW2QrTlNJWkUqMF0pLAo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgW3dxMF0iciIo JnFbZCtOU0laRSowXSksCj4gPiBAQCAtMzc2LDggKzQxNiw2IEBAIHN0YXRpYyB2b2lkIHJhaWQ2 X3J2djJfeG9yX3N5bmRyb21lX3JlYWwoaW50IGRpc2tzLCBpbnQgc3RhcnQsIGludCBzdG9wLAo+ ID4gICAgICAgICAgICAgICAgICAgICAgICAgW3dxMV0iciIoJnFbZCtOU0laRSoxXSkKPiA+ICAg ICAgICAgICAgICAgICApOwo+ID4gICAgICAgICB9Cj4gPiAtCj4gPiAtICAgICAgIGFzbSB2b2xh dGlsZSAoIi5vcHRpb24gcG9wXG4iKTsKPiA+ICB9Cj4gPgo+ID4gIHN0YXRpYyB2b2lkIHJhaWQ2 X3J2djRfZ2VuX3N5bmRyb21lX3JlYWwoaW50IGRpc2tzLCB1bnNpZ25lZCBsb25nIGJ5dGVzLCB2 b2lkICoqcHRycykKPiA+IEBAIC0zOTQsNiArNDMyLDcgQEAgc3RhdGljIHZvaWQgcmFpZDZfcnZ2 NF9nZW5fc3luZHJvbWVfcmVhbChpbnQgZGlza3MsIHVuc2lnbmVkIGxvbmcgYnl0ZXMsIHZvaWQg KioKPiA+ICAgICAgICAgICAgICAgICAiLm9wdGlvbiAgICAgICAgcHVzaFxuIgo+ID4gICAgICAg ICAgICAgICAgICIub3B0aW9uICAgICAgICBhcmNoLCt2XG4iCj4gPiAgICAgICAgICAgICAgICAg InZzZXR2bGkgICAgICAgIHQwLCB4MCwgZTgsIG0xLCB0YSwgbWFcbiIKPiA+ICsgICAgICAgICAg ICAgICAiLm9wdGlvbiAgICAgICAgcG9wXG4iCj4gPiAgICAgICAgICk7Cj4gPgo+ID4gICAgICAg ICAvKgo+ID4gQEAgLTQwNSw2ICs0NDQsOCBAQCBzdGF0aWMgdm9pZCByYWlkNl9ydnY0X2dlbl9z eW5kcm9tZV9yZWFsKGludCBkaXNrcywgdW5zaWduZWQgbG9uZyBieXRlcywgdm9pZCAqKgo+ID4g ICAgICAgICBmb3IgKGQgPSAwIDsgZCA8IGJ5dGVzIDsgZCArPSBOU0laRSo0KSB7Cj4gPiAgICAg ICAgICAgICAgICAgLyogd3EkJCA9IHdwJCQgPSAqKHVuYXRpdmVfdCAqKSZkcHRyW3owXVtkKyQk Kk5TSVpFXTsgKi8KPiA+ICAgICAgICAgICAgICAgICBhc20gdm9sYXRpbGUgKAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgIi5vcHRpb24gcHVzaFxuIgo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgIi5vcHRpb24gYXJjaCwrdlxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgInZs ZTgudiB2MCwgKCVbd3AwXSlcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGU4LnYg djEsICglW3dwMF0pXG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAidmxlOC52IHY0LCAo JVt3cDFdKVxuIgo+ID4gQEAgLTQxMyw2ICs0NTQsNyBAQCBzdGF0aWMgdm9pZCByYWlkNl9ydnY0 X2dlbl9zeW5kcm9tZV9yZWFsKGludCBkaXNrcywgdW5zaWduZWQgbG9uZyBieXRlcywgdm9pZCAq Kgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgInZsZTgudiB2OSwgKCVbd3AyXSlcbiIKPiA+ ICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGU4LnYgdjEyLCAoJVt3cDNdKVxuIgo+ID4gICAg ICAgICAgICAgICAgICAgICAgICAgInZsZTgudiB2MTMsICglW3dwM10pXG4iCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAiLm9wdGlvbiAgICAgICAgcG9wXG4iCj4gPiAgICAgICAgICAgICAg ICAgICAgICAgICA6IDoKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIFt3cDBdInIiKCZkcHRy W3owXVtkKzAqTlNJWkVdKSwKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIFt3cDFdInIiKCZk cHRyW3owXVtkKzEqTlNJWkVdKSwKPiA+IEBAIC00MzEsNiArNDczLDggQEAgc3RhdGljIHZvaWQg cmFpZDZfcnZ2NF9nZW5fc3luZHJvbWVfcmVhbChpbnQgZGlza3MsIHVuc2lnbmVkIGxvbmcgYnl0 ZXMsIHZvaWQgKioKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAqIHdwJCQgXj0gd2QkJDsK PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwo+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgYXNtIHZvbGF0aWxlICgKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5v cHRpb24gcHVzaFxuIgo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLm9wdGlv biBhcmNoLCt2XG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2c3JhLnZp ICAgICAgICB2MiwgdjEsIDdcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg InZzbGwudmkgICAgICAgIHYzLCB2MSwgMVxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAidmFuZC52eCAgICAgICAgdjIsIHYyLCAlW3gxZF1cbiIKPiA+IEBAIC00NjIsNiAr NTA2LDcgQEAgc3RhdGljIHZvaWQgcmFpZDZfcnZ2NF9nZW5fc3luZHJvbWVfcmVhbChpbnQgZGlz a3MsIHVuc2lnbmVkIGxvbmcgYnl0ZXMsIHZvaWQgKioKPiA+ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgInZsZTgudiAgICAgICAgIHYxNCwgKCVbd2QzXSlcbiIKPiA+ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgInZ4b3IudnYgICAgICAgIHYxMywgdjE1LCB2MTRcbiIK PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZ4b3IudnYgICAgICAgIHYxMiwg djEyLCB2MTRcbiIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRpb24g ICAgICAgIHBvcFxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDoKPiA+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3dkMF0iciIoJmRwdHJbel1bZCswKk5T SVpFXSksCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt3ZDFdInIiKCZkcHRy W3pdW2QrMSpOU0laRV0pLAo+ID4gQEAgLTQ3Niw2ICs1MjEsOCBAQCBzdGF0aWMgdm9pZCByYWlk Nl9ydnY0X2dlbl9zeW5kcm9tZV9yZWFsKGludCBkaXNrcywgdW5zaWduZWQgbG9uZyBieXRlcywg dm9pZCAqKgo+ID4gICAgICAgICAgICAgICAgICAqICoodW5hdGl2ZV90ICopJnFbZCtOU0laRSok JF0gPSB3cSQkOwo+ID4gICAgICAgICAgICAgICAgICAqLwo+ID4gICAgICAgICAgICAgICAgIGFz bSB2b2xhdGlsZSAoCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiLm9wdGlvbiBwdXNoXG4i Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiLm9wdGlvbiBhcmNoLCt2XG4iCj4gPiAgICAg ICAgICAgICAgICAgICAgICAgICAidnNlOC52IHYwLCAoJVt3cDBdKVxuIgo+ID4gICAgICAgICAg ICAgICAgICAgICAgICAgInZzZTgudiB2MSwgKCVbd3EwXSlcbiIKPiA+ICAgICAgICAgICAgICAg ICAgICAgICAgICJ2c2U4LnYgdjQsICglW3dwMV0pXG4iCj4gPiBAQCAtNDg0LDYgKzUzMSw3IEBA IHN0YXRpYyB2b2lkIHJhaWQ2X3J2djRfZ2VuX3N5bmRyb21lX3JlYWwoaW50IGRpc2tzLCB1bnNp Z25lZCBsb25nIGJ5dGVzLCB2b2lkICoqCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAidnNl OC52IHY5LCAoJVt3cTJdKVxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgInZzZTgudiB2 MTIsICglW3dwM10pXG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAidnNlOC52IHYxMywg KCVbd3EzXSlcbiIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uICAgICAgICBw b3BcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIDogOgo+ID4gICAgICAgICAgICAgICAg ICAgICAgICAgW3dwMF0iciIoJnBbZCtOU0laRSowXSksCj4gPiAgICAgICAgICAgICAgICAgICAg ICAgICBbd3EwXSJyIigmcVtkK05TSVpFKjBdKSwKPiA+IEBAIC00OTUsOCArNTQzLDYgQEAgc3Rh dGljIHZvaWQgcmFpZDZfcnZ2NF9nZW5fc3luZHJvbWVfcmVhbChpbnQgZGlza3MsIHVuc2lnbmVk IGxvbmcgYnl0ZXMsIHZvaWQgKioKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIFt3cTNdInIi KCZxW2QrTlNJWkUqM10pCj4gPiAgICAgICAgICAgICAgICAgKTsKPiA+ICAgICAgICAgfQo+ID4g LQo+ID4gLSAgICAgICBhc20gdm9sYXRpbGUgKCIub3B0aW9uIHBvcFxuIik7Cj4gPiAgfQo+ID4K PiA+ICBzdGF0aWMgdm9pZCByYWlkNl9ydnY0X3hvcl9zeW5kcm9tZV9yZWFsKGludCBkaXNrcywg aW50IHN0YXJ0LCBpbnQgc3RvcCwKPiA+IEBAIC01MTQsNiArNTYwLDcgQEAgc3RhdGljIHZvaWQg cmFpZDZfcnZ2NF94b3Jfc3luZHJvbWVfcmVhbChpbnQgZGlza3MsIGludCBzdGFydCwgaW50IHN0 b3AsCj4gPiAgICAgICAgICAgICAgICAgIi5vcHRpb24gcHVzaFxuIgo+ID4gICAgICAgICAgICAg ICAgICIub3B0aW9uIGFyY2gsK3ZcbiIKPiA+ICAgICAgICAgICAgICAgICAidnNldHZsaSAgICAg ICAgdDAsIHgwLCBlOCwgbTEsIHRhLCBtYVxuIgo+ID4gKyAgICAgICAgICAgICAgICIub3B0aW9u ICAgICAgICBwb3BcbiIKPiA+ICAgICAgICAgKTsKPiA+Cj4gPiAgICAgICAgIC8qCj4gPiBAQCAt NTI1LDYgKzU3Miw4IEBAIHN0YXRpYyB2b2lkIHJhaWQ2X3J2djRfeG9yX3N5bmRyb21lX3JlYWwo aW50IGRpc2tzLCBpbnQgc3RhcnQsIGludCBzdG9wLAo+ID4gICAgICAgICBmb3IgKGQgPSAwIDsg ZCA8IGJ5dGVzIDsgZCArPSBOU0laRSo0KSB7Cj4gPiAgICAgICAgICAgICAgICAgIC8qIHdxJCQg PSB3cCQkID0gKih1bmF0aXZlX3QgKikmZHB0clt6MF1bZCskJCpOU0laRV07ICovCj4gPiAgICAg ICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICIu b3B0aW9uIHB1c2hcbiIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uIGFyY2gs K3ZcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGU4LnYgdjAsICglW3dwMF0pXG4i Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAidmxlOC52IHYxLCAoJVt3cDBdKVxuIgo+ID4g ICAgICAgICAgICAgICAgICAgICAgICAgInZsZTgudiB2NCwgKCVbd3AxXSlcbiIKPiA+IEBAIC01 MzMsNiArNTgyLDcgQEAgc3RhdGljIHZvaWQgcmFpZDZfcnZ2NF94b3Jfc3luZHJvbWVfcmVhbChp bnQgZGlza3MsIGludCBzdGFydCwgaW50IHN0b3AsCj4gPiAgICAgICAgICAgICAgICAgICAgICAg ICAidmxlOC52IHY5LCAoJVt3cDJdKVxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgInZs ZTgudiB2MTIsICglW3dwM10pXG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAidmxlOC52 IHYxMywgKCVbd3AzXSlcbiIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uICAg ICAgICBwb3BcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIDogOgo+ID4gICAgICAgICAg ICAgICAgICAgICAgICAgW3dwMF0iciIoJmRwdHJbejBdW2QrMCpOU0laRV0pLAo+ID4gICAgICAg ICAgICAgICAgICAgICAgICAgW3dwMV0iciIoJmRwdHJbejBdW2QrMSpOU0laRV0pLAo+ID4gQEAg LTU1Miw2ICs2MDIsOCBAQCBzdGF0aWMgdm9pZCByYWlkNl9ydnY0X3hvcl9zeW5kcm9tZV9yZWFs KGludCBkaXNrcywgaW50IHN0YXJ0LCBpbnQgc3RvcCwKPiA+ICAgICAgICAgICAgICAgICAgICAg ICAgICAqIHdwJCQgXj0gd2QkJDsKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwo+ID4g ICAgICAgICAgICAgICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIi5vcHRpb24gcHVzaFxuIgo+ID4gKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAiLm9wdGlvbiBhcmNoLCt2XG4iCj4gPiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICJ2c3JhLnZpICAgICAgICB2MiwgdjEsIDdcbiIKPiA+ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgInZzbGwudmkgICAgICAgIHYzLCB2MSwgMVxuIgo+ID4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFuZC52eCAgICAgICAgdjIsIHYyLCAlW3gx ZF1cbiIKPiA+IEBAIC01ODMsNiArNjM1LDcgQEAgc3RhdGljIHZvaWQgcmFpZDZfcnZ2NF94b3Jf c3luZHJvbWVfcmVhbChpbnQgZGlza3MsIGludCBzdGFydCwgaW50IHN0b3AsCj4gPiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICJ2bGU4LnYgICAgICAgICB2MTQsICglW3dkM10pXG4i Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2eG9yLnZ2ICAgICAgICB2MTMs IHYxNSwgdjE0XG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2eG9yLnZ2 ICAgICAgICB2MTIsIHYxMiwgdjE0XG4iCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICIub3B0aW9uICAgICAgICBwb3BcbiIKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgOiA6Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt3ZDBdInIiKCZk cHRyW3pdW2QrMCpOU0laRV0pLAo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBb d2QxXSJyIigmZHB0clt6XVtkKzEqTlNJWkVdKSwKPiA+IEBAIC02MDEsNiArNjU0LDggQEAgc3Rh dGljIHZvaWQgcmFpZDZfcnZ2NF94b3Jfc3luZHJvbWVfcmVhbChpbnQgZGlza3MsIGludCBzdGFy dCwgaW50IHN0b3AsCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgKiB3cSQkID0gdzEkJCBe IHcyJCQ7Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KPiA+ICAgICAgICAgICAgICAg ICAgICAgICAgIGFzbSB2b2xhdGlsZSAoCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICIub3B0aW9uIHB1c2hcbiIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg Ii5vcHRpb24gYXJjaCwrdlxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAi dnNyYS52aSAgICAgICAgdjIsIHYxLCA3XG4iCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICJ2c2xsLnZpICAgICAgICB2MywgdjEsIDFcbiIKPiA+ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgInZhbmQudnggICAgICAgIHYyLCB2MiwgJVt4MWRdXG4iCj4gPiBAQCAt NjIwLDYgKzY3NSw3IEBAIHN0YXRpYyB2b2lkIHJhaWQ2X3J2djRfeG9yX3N5bmRyb21lX3JlYWwo aW50IGRpc2tzLCBpbnQgc3RhcnQsIGludCBzdG9wLAo+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAidnNsbC52aSAgICAgICAgdjE1LCB2MTMsIDFcbiIKPiA+ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgInZhbmQudnggICAgICAgIHYxNCwgdjE0LCAlW3gxZF1cbiIK PiA+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZ4b3IudnYgICAgICAgIHYxMywg djE1LCB2MTRcbiIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRpb24g ICAgICAgIHBvcFxuIgo+ID4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDoKPiA+ ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3gxZF0iciIoMHgxZCkKPiA+ICAgICAg ICAgICAgICAgICAgICAgICAgICk7Cj4gPiBAQCAtNjM0LDYgKzY5MCw4IEBAIHN0YXRpYyB2b2lk IHJhaWQ2X3J2djRfeG9yX3N5bmRyb21lX3JlYWwoaW50IGRpc2tzLCBpbnQgc3RhcnQsIGludCBz dG9wLAo+ID4gICAgICAgICAgICAgICAgICAqIHYxMjp3cDMsIHYxMzp3cTMsIHYxNDpwMywgdjE1 OnEzCj4gPiAgICAgICAgICAgICAgICAgICovCj4gPiAgICAgICAgICAgICAgICAgYXNtIHZvbGF0 aWxlICgKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uIHB1c2hcbiIKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uIGFyY2gsK3ZcbiIKPiA+ICAgICAgICAgICAg ICAgICAgICAgICAgICJ2bGU4LnYgICAgICAgICB2MiwgKCVbd3AwXSlcbiIKPiA+ICAgICAgICAg ICAgICAgICAgICAgICAgICJ2bGU4LnYgICAgICAgICB2MywgKCVbd3EwXSlcbiIKPiA+ICAgICAg ICAgICAgICAgICAgICAgICAgICJ2eG9yLnZ2ICAgICAgICB2MiwgdjIsIHYwXG4iCj4gPiBAQCAt NjYxLDYgKzcxOSw3IEBAIHN0YXRpYyB2b2lkIHJhaWQ2X3J2djRfeG9yX3N5bmRyb21lX3JlYWwo aW50IGRpc2tzLCBpbnQgc3RhcnQsIGludCBzdG9wLAo+ID4gICAgICAgICAgICAgICAgICAgICAg ICAgInZ4b3IudnYgICAgICAgIHYxNSwgdjE1LCB2MTNcbiIKPiA+ICAgICAgICAgICAgICAgICAg ICAgICAgICJ2c2U4LnYgICAgICAgICB2MTQsICglW3dwM10pXG4iCj4gPiAgICAgICAgICAgICAg ICAgICAgICAgICAidnNlOC52ICAgICAgICAgdjE1LCAoJVt3cTNdKVxuIgo+ID4gKyAgICAgICAg ICAgICAgICAgICAgICAgIi5vcHRpb24gICAgICAgIHBvcFxuIgo+ID4gICAgICAgICAgICAgICAg ICAgICAgICAgOiA6Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICBbd3AwXSJyIigmcFtkK05T SVpFKjBdKSwKPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIFt3cTBdInIiKCZxW2QrTlNJWkUq MF0pLAo+ID4gQEAgLTY3Miw4ICs3MzEsNiBAQCBzdGF0aWMgdm9pZCByYWlkNl9ydnY0X3hvcl9z eW5kcm9tZV9yZWFsKGludCBkaXNrcywgaW50IHN0YXJ0LCBpbnQgc3RvcCwKPiA+ICAgICAgICAg ICAgICAgICAgICAgICAgIFt3cTNdInIiKCZxW2QrTlNJWkUqM10pCj4gPiAgICAgICAgICAgICAg ICAgKTsKPiA+ICAgICAgICAgfQo+ID4gLQo+ID4gLSAgICAgICBhc20gdm9sYXRpbGUgKCIub3B0 aW9uIHBvcFxuIik7Cj4gPiAgfQo+ID4KPiA+ICAjZGVmaW5lIFJBSUQ2X1JWVl9XUkFQUEVSKF9u KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+IC0tCj4gPiAy LjM0LjEKPiA+Cj4gPgo+ID4gLSBDaGFybGllCj4gPgoKX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX18KbGludXgtcmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4LXJp c2N2QGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1h bi9saXN0aW5mby9saW51eC1yaXNjdgo=