From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf1-f179.google.com (mail-pf1-f179.google.com [209.85.210.179]) (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 DADEF21104 for ; Mon, 13 May 2024 16:56:38 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.179 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715619402; cv=none; b=BjM1DhKkZcYqC62pZ9yEVRqcw32eYSqq9OxQUCfnDg7h+wAi85MmymugeqJ9ai3zRQLrZbEx2llq/0EfqYN2+LJuIqfHMogwbYzxWW1B9ASTowdsCbIBEBkOlSNoQUMbi1pMFwZydkOvuFoez1tVP4LfowLclOLQvL7aW7BfzhE= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1715619402; c=relaxed/simple; bh=DGcXKTxrE/8EcGRNkXE90qCzUbC3/CI6HD/dP8pZ0UY=; h=Date:From:To:Cc:Subject:Message-ID:References:MIME-Version: Content-Type:Content-Disposition:In-Reply-To; b=ARV6AF0hD4W2HcDP72OX8upO/f3P/e4aWaVfQhjAkY8AZJtwHPCoWIincYkiOzcrhwswR02dBWh0qolnk2S/chXVO6B9w4tdAvCFJIXXwqclWfkhpFngeS/K1JpDy4bGW27vGgdC0vGxlbT7q5+oiOlVdTxcow/DfyyGAsyYxD8= 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=hcTDf93o; arc=none smtp.client-ip=209.85.210.179 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="hcTDf93o" Received: by mail-pf1-f179.google.com with SMTP id d2e1a72fcca58-6f44ed6e82fso4099851b3a.3 for ; Mon, 13 May 2024 09:56:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1715619398; x=1716224198; 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=VK8vYit8+gdtU6flQEkqpwhK6a5E14jjPOZSmkE0mPU=; b=hcTDf93ogUg/bzGeX7rgLqSmN0+VB/We1A2bE1FguXPfyhAIwLhuIvtUvmls9kwry1 bj6GgkFmdF8m48uSz5X62K1EtRaUh6aC7qV7sz6gn16QSnNfwVStjQUi9GW3d3Ut/mFr hguZzIY3zyW4mBCFngemrbfbx2gQnO4Cuq7l6uvX40vqL4AHPAqQupJzYWrYnLLJM2in y4znldI9Lk4IPmtISks2x65fp6IEckG0ko9pDW7oycM0IIrN0FkE4nYlk6QQTbp0VIjN 0ENiucpy7v5kwws2h3SZnhw3iFnRYfnlSNoW08mwZLQ7KvwTS+Yhrr9aKEJ3fyag9OeP jgeA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715619398; x=1716224198; 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=VK8vYit8+gdtU6flQEkqpwhK6a5E14jjPOZSmkE0mPU=; b=Mazib4dtQGXGOhMUPJRm5bVHLmRZWzpHz7oMSg0wz2O5RJkGPjY3sjLgxHO1cfR1KL vmgN62o113PR+3ucqQddyzyUv4SgTbE+lS++YaujY8QlmODfI5ccRoJ3YsHpd7YSIKNc nK741CwaM+gRL7XqzDLV6DLI8jEEX63tDi8J2b1wQHb0NiB6xjqUb3m5/G59WAyzaCLR QeAX9aqzOjMvQS86CdoF+M2cYHiZDWDsdEKxE47wugDAFs18YK8TjCWaSywLHLDAj8Gz MdK1xOdSMwXgaeWBzvnmxWnTL4d8pys4mEEH2AiveBqSl6aPjJxrFcG0i1j14JTMgWJJ PynA== X-Forwarded-Encrypted: i=1; AJvYcCVAPHc6vPErTcoFkoeBMrBv4LI2TJuZMcVaTu3xfgcj6l16iWy0vNM7N7HeUQ1IWNmjjF7XH6UsTcwiEFGSVCjwvwGs/qSJ3YAO X-Gm-Message-State: AOJu0Yw6prcQU8fLCEDT0YfhyLO1feB2TDCntC06Oq2nqWzjDHebrJFt ZJgSxniQhI6OmjE664UwqiZ7kFv1HbGSwXbhox9AToZ6LNXsPfusy3+NOCbOmR4= X-Google-Smtp-Source: AGHT+IHajz6ulNGvu1i/yT1eA7FdMl4NaAuxDNWOd+7lvJAt6WrPn9Bnm6rDLbkRgAASe47XyhLGBg== X-Received: by 2002:a05:6a20:7350:b0:1af:a72e:8b7e with SMTP id adf61e73a8af0-1afde1b6f32mr13102711637.50.1715619397966; Mon, 13 May 2024 09:56:37 -0700 (PDT) Received: from ghost ([2601:647:5700:6860:3a68:91f5:da04:ef09]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-6f4d2a87bb1sm7592789b3a.87.2024.05.13.09.56.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 May 2024 09:56:37 -0700 (PDT) Date: Mon, 13 May 2024 09:56:31 -0700 From: Charlie Jenkins To: Andy Chiu Cc: Conor Dooley , Rob Herring , Krzysztof Kozlowski , Paul Walmsley , Palmer Dabbelt , Albert Ou , Guo Ren , Conor Dooley , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Conor Dooley , Evan Green , =?iso-8859-1?Q?Cl=E9ment_L=E9ger?= , Jonathan Corbet , Shuah Khan , linux-riscv@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Palmer Dabbelt , linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: Re: [PATCH v6 13/17] riscv: vector: Support xtheadvector save/restore Message-ID: References: <20240503-dev-charlie-support_thead_vector_6_9-v6-0-cb7624e65d82@rivosinc.com> <20240503-dev-charlie-support_thead_vector_6_9-v6-13-cb7624e65d82@rivosinc.com> Precedence: bulk X-Mailing-List: linux-doc@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, May 13, 2024 at 04:45:18PM +0800, Andy Chiu wrote: > Hi Charlie, > > Sorry, I am late on this. I haven't looked through the entire series > yet, but here is something that I thought worth bringing up sooner. > > On Sat, May 4, 2024 at 2:22 AM Charlie Jenkins wrote: > > > > Use alternatives to add support for xtheadvector vector save/restore > > routines. > > > > Signed-off-by: Charlie Jenkins > > --- > > arch/riscv/Kconfig.vendor | 13 ++ > > arch/riscv/include/asm/csr.h | 6 + > > arch/riscv/include/asm/switch_to.h | 2 +- > > arch/riscv/include/asm/vector.h | 247 ++++++++++++++++++++++++++------- > > arch/riscv/kernel/cpufeature.c | 2 +- > > arch/riscv/kernel/kernel_mode_vector.c | 8 +- > > arch/riscv/kernel/process.c | 4 +- > > arch/riscv/kernel/signal.c | 6 +- > > arch/riscv/kernel/vector.c | 13 +- > > 9 files changed, 233 insertions(+), 68 deletions(-) > > > > diff --git a/arch/riscv/Kconfig.vendor b/arch/riscv/Kconfig.vendor > > index aa5a191e659e..edf49f3065ac 100644 > > --- a/arch/riscv/Kconfig.vendor > > +++ b/arch/riscv/Kconfig.vendor > > @@ -13,6 +13,19 @@ config RISCV_ISA_VENDOR_EXT_THEAD > > extensions. Without this option enabled, T-Head vendor extensions will > > not be detected at boot and their presence not reported to userspace. > > > > + If you don't know what to do here, say Y. > > + > > +config RISCV_ISA_XTHEADVECTOR > > + bool "xtheadvector extension support" > > + depends on RISCV_ISA_VENDOR_EXT_THEAD > > + depends on RISCV_ISA_V > > + depends on FPU > > + default y > > + help > > + Say N here if you want to disable all xtheadvector related procedure > > + in the kernel. This will disable vector for any T-Head board that > > + contains xtheadvector rather than the standard vector. > > + > > If you don't know what to do here, say Y. > > endmenu > > > > diff --git a/arch/riscv/include/asm/csr.h b/arch/riscv/include/asm/csr.h > > index e5a35efd56e0..13657d096e7d 100644 > > --- a/arch/riscv/include/asm/csr.h > > +++ b/arch/riscv/include/asm/csr.h > > @@ -30,6 +30,12 @@ > > #define SR_VS_CLEAN _AC(0x00000400, UL) > > #define SR_VS_DIRTY _AC(0x00000600, UL) > > > > +#define SR_VS_THEAD _AC(0x01800000, UL) /* xtheadvector Status */ > > +#define SR_VS_OFF_THEAD _AC(0x00000000, UL) > > +#define SR_VS_INITIAL_THEAD _AC(0x00800000, UL) > > +#define SR_VS_CLEAN_THEAD _AC(0x01000000, UL) > > +#define SR_VS_DIRTY_THEAD _AC(0x01800000, UL) > > + > > #define SR_XS _AC(0x00018000, UL) /* Extension Status */ > > #define SR_XS_OFF _AC(0x00000000, UL) > > #define SR_XS_INITIAL _AC(0x00008000, UL) > > diff --git a/arch/riscv/include/asm/switch_to.h b/arch/riscv/include/asm/switch_to.h > > index 7efdb0584d47..ada6b5cf2d94 100644 > > --- a/arch/riscv/include/asm/switch_to.h > > +++ b/arch/riscv/include/asm/switch_to.h > > @@ -78,7 +78,7 @@ do { \ > > struct task_struct *__next = (next); \ > > if (has_fpu()) \ > > __switch_to_fpu(__prev, __next); \ > > - if (has_vector()) \ > > + if (has_vector() || has_xtheadvector()) \ > > __switch_to_vector(__prev, __next); \ > > ((last) = __switch_to(__prev, __next)); \ > > } while (0) > > diff --git a/arch/riscv/include/asm/vector.h b/arch/riscv/include/asm/vector.h > > index 731dcd0ed4de..db851dc81870 100644 > > --- a/arch/riscv/include/asm/vector.h > > +++ b/arch/riscv/include/asm/vector.h > > @@ -18,6 +18,27 @@ > > #include > > #include > > #include > > +#include > > +#include > > +#include > > + > > +#define __riscv_v_vstate_or(_val, TYPE) ({ \ > > + typeof(_val) _res = _val; \ > > + if (has_xtheadvector()) \ > > + _res = (_res & ~SR_VS_THEAD) | SR_VS_##TYPE##_THEAD; \ > > + else \ > > + _res = (_res & ~SR_VS) | SR_VS_##TYPE; \ > > + _res; \ > > +}) > > + > > +#define __riscv_v_vstate_check(_val, TYPE) ({ \ > > + bool _res; \ > > + if (has_xtheadvector()) \ > > + _res = ((_val) & SR_VS_THEAD) == SR_VS_##TYPE##_THEAD; \ > > + else \ > > + _res = ((_val) & SR_VS) == SR_VS_##TYPE; \ > > + _res; \ > > +}) > > > > extern unsigned long riscv_v_vsize; > > int riscv_v_setup_vsize(void); > > @@ -40,39 +61,62 @@ static __always_inline bool has_vector(void) > > return riscv_has_extension_unlikely(RISCV_ISA_EXT_v); > > } > > > > +static __always_inline bool has_xtheadvector_no_alternatives(void) > > +{ > > + if (IS_ENABLED(CONFIG_RISCV_ISA_XTHEADVECTOR)) > > + return riscv_isa_vendor_extension_available(THEAD_VENDOR_ID, XTHEADVECTOR); > > + else > > + return false; > > +} > > + > > +static __always_inline bool has_xtheadvector(void) > > +{ > > + if (IS_ENABLED(CONFIG_RISCV_ISA_XTHEADVECTOR)) > > + return riscv_has_vendor_extension_unlikely(THEAD_VENDOR_ID, > > + RISCV_ISA_VENDOR_EXT_XTHEADVECTOR); > > + else > > + return false; > > +} > > + > > static inline void __riscv_v_vstate_clean(struct pt_regs *regs) > > { > > - regs->status = (regs->status & ~SR_VS) | SR_VS_CLEAN; > > + regs->status = __riscv_v_vstate_or(regs->status, CLEAN); > > } > > > > static inline void __riscv_v_vstate_dirty(struct pt_regs *regs) > > { > > - regs->status = (regs->status & ~SR_VS) | SR_VS_DIRTY; > > + regs->status = __riscv_v_vstate_or(regs->status, DIRTY); > > } > > > > static inline void riscv_v_vstate_off(struct pt_regs *regs) > > { > > - regs->status = (regs->status & ~SR_VS) | SR_VS_OFF; > > + regs->status = __riscv_v_vstate_or(regs->status, OFF); > > } > > > > static inline void riscv_v_vstate_on(struct pt_regs *regs) > > { > > - regs->status = (regs->status & ~SR_VS) | SR_VS_INITIAL; > > + regs->status = __riscv_v_vstate_or(regs->status, INITIAL); > > } > > > > static inline bool riscv_v_vstate_query(struct pt_regs *regs) > > { > > - return (regs->status & SR_VS) != 0; > > + return !__riscv_v_vstate_check(regs->status, OFF); > > } > > > > static __always_inline void riscv_v_enable(void) > > { > > - csr_set(CSR_SSTATUS, SR_VS); > > + if (has_xtheadvector()) > > + csr_set(CSR_SSTATUS, SR_VS_THEAD); > > + else > > + csr_set(CSR_SSTATUS, SR_VS); > > } > > > > static __always_inline void riscv_v_disable(void) > > { > > - csr_clear(CSR_SSTATUS, SR_VS); > > + if (has_xtheadvector()) > > + csr_clear(CSR_SSTATUS, SR_VS_THEAD); > > + else > > + csr_clear(CSR_SSTATUS, SR_VS); > > } > > > > static __always_inline void __vstate_csr_save(struct __riscv_v_ext_state *dest) > > @@ -81,10 +125,47 @@ static __always_inline void __vstate_csr_save(struct __riscv_v_ext_state *dest) > > "csrr %0, " __stringify(CSR_VSTART) "\n\t" > > "csrr %1, " __stringify(CSR_VTYPE) "\n\t" > > "csrr %2, " __stringify(CSR_VL) "\n\t" > > - "csrr %3, " __stringify(CSR_VCSR) "\n\t" > > - "csrr %4, " __stringify(CSR_VLENB) "\n\t" > > : "=r" (dest->vstart), "=r" (dest->vtype), "=r" (dest->vl), > > - "=r" (dest->vcsr), "=r" (dest->vlenb) : :); > > + "=r" (dest->vcsr) : :); > > + > > + if (has_xtheadvector()) { > > + u32 tmp_vcsr; > > + bool restore_fpu = false; > > + unsigned long status = csr_read(CSR_SSTATUS); > > + > > + /* > > + * CSR_VCSR is defined as > > + * [2:1] - vxrm[1:0] > > + * [0] - vxsat > > + * The earlier vector spec implemented by T-Head uses separate > > + * registers for the same bit-elements, so just combine those > > + * into the existing output field. > > + * > > + * Additionally T-Head cores need FS to be enabled when accessing > > + * the VXRM and VXSAT CSRs, otherwise ending in illegal instructions. > > + * Though the cores do not implement the VXRM and VXSAT fields in the > > + * FCSR CSR that vector-0.7.1 specifies. > > + */ > > + if ((status & SR_FS) == SR_FS_OFF) { > > + csr_set(CSR_SSTATUS, (status & ~SR_FS) | SR_FS_CLEAN); > > + restore_fpu = true; > > + } > > + > > + asm volatile ( > > + "csrr %[tmp_vcsr], " __stringify(VCSR_VXRM) "\n\t" > > + "slliw %[vcsr], %[tmp_vcsr], " __stringify(VCSR_VXRM_SHIFT) "\n\t" > > + "csrr %[tmp_vcsr], " __stringify(VCSR_VXSAT) "\n\t" > > + "or %[vcsr], %[vcsr], %[tmp_vcsr]\n\t" > > + : [vcsr] "=r" (dest->vcsr), [tmp_vcsr] "=&r" (tmp_vcsr)); > > + > > + if (restore_fpu) > > + csr_set(CSR_SSTATUS, status); > > vlenb is on ABI and ptrace needs that to recover the width of the > register. So we should probably save Xtheadvector's vlenb into vstate > if we meant to maintain ABI compatibility between V and Xtheadvector > from the kernel. We can pull the vlenb from riscv_v_vsize which gets populated from the devicetree for xtheadvector. I will change that in the next version! - Charlie > > > + } else { > > + asm volatile ( > > + "csrr %[vcsr], " __stringify(CSR_VCSR) "\n\t" > > + "csrr %[vlenb], " __stringify(CSR_VLENB) "\n\t" > > + : [vcsr] "=r" (dest->vcsr), [vlenb] "=r" (dest->vlenb)); > > + } > > } > > > > static __always_inline void __vstate_csr_restore(struct __riscv_v_ext_state *src) > > @@ -95,9 +176,37 @@ static __always_inline void __vstate_csr_restore(struct __riscv_v_ext_state *src > > "vsetvl x0, %2, %1\n\t" > > ".option pop\n\t" > > "csrw " __stringify(CSR_VSTART) ", %0\n\t" > > - "csrw " __stringify(CSR_VCSR) ", %3\n\t" > > - : : "r" (src->vstart), "r" (src->vtype), "r" (src->vl), > > - "r" (src->vcsr) :); > > + : : "r" (src->vstart), "r" (src->vtype), "r" (src->vl)); > > + > > + if (has_xtheadvector()) { > > + u32 tmp_vcsr; > > + bool restore_fpu = false; > > + unsigned long status = csr_read(CSR_SSTATUS); > > + > > + /* > > + * Similar to __vstate_csr_save above, restore values for the > > + * separate VXRM and VXSAT CSRs from the vcsr variable. > > + */ > > + if ((status & SR_FS) == SR_FS_OFF) { > > + csr_set(CSR_SSTATUS, (status & ~SR_FS) | SR_FS_CLEAN); > > + restore_fpu = true; > > + } > > + > > + asm volatile ( > > + "srliw %[tmp_vcsr], %[vcsr], " __stringify(VCSR_VXRM_SHIFT) "\n\t" > > + "andi %[tmp_vcsr], %[tmp_vcsr], " __stringify(VCSR_VXRM_MASK) "\n\t" > > + "csrw " __stringify(VCSR_VXRM) ", %[tmp_vcsr]\n\t" > > + "andi %[tmp_vcsr], %[vcsr], " __stringify(VCSR_VXSAT_MASK) "\n\t" > > + "csrw " __stringify(VCSR_VXSAT) ", %[tmp_vcsr]\n\t" > > + : [tmp_vcsr] "=&r" (tmp_vcsr) : [vcsr] "r" (src->vcsr)); > > + > > + if (restore_fpu) > > + csr_set(CSR_SSTATUS, status); > > + } else { > > + asm volatile ( > > + "csrw " __stringify(CSR_VCSR) ", %[vcsr]\n\t" > > + : : [vcsr] "r" (src->vcsr)); > > + } > > } > > > > static inline void __riscv_v_vstate_save(struct __riscv_v_ext_state *save_to, > > @@ -107,19 +216,33 @@ static inline void __riscv_v_vstate_save(struct __riscv_v_ext_state *save_to, > > > > riscv_v_enable(); > > __vstate_csr_save(save_to); > > - asm volatile ( > > - ".option push\n\t" > > - ".option arch, +v\n\t" > > - "vsetvli %0, x0, e8, m8, ta, ma\n\t" > > - "vse8.v v0, (%1)\n\t" > > - "add %1, %1, %0\n\t" > > - "vse8.v v8, (%1)\n\t" > > - "add %1, %1, %0\n\t" > > - "vse8.v v16, (%1)\n\t" > > - "add %1, %1, %0\n\t" > > - "vse8.v v24, (%1)\n\t" > > - ".option pop\n\t" > > - : "=&r" (vl) : "r" (datap) : "memory"); > > + if (has_xtheadvector()) { > > + asm volatile ( > > + "mv t0, %0\n\t" > > + THEAD_VSETVLI_T4X0E8M8D1 > > + THEAD_VSB_V_V0T0 > > + "add t0, t0, t4\n\t" > > + THEAD_VSB_V_V0T0 > > + "add t0, t0, t4\n\t" > > + THEAD_VSB_V_V0T0 > > + "add t0, t0, t4\n\t" > > + THEAD_VSB_V_V0T0 > > + : : "r" (datap) : "memory", "t0", "t4"); > > + } else { > > + asm volatile ( > > + ".option push\n\t" > > + ".option arch, +v\n\t" > > + "vsetvli %0, x0, e8, m8, ta, ma\n\t" > > + "vse8.v v0, (%1)\n\t" > > + "add %1, %1, %0\n\t" > > + "vse8.v v8, (%1)\n\t" > > + "add %1, %1, %0\n\t" > > + "vse8.v v16, (%1)\n\t" > > + "add %1, %1, %0\n\t" > > + "vse8.v v24, (%1)\n\t" > > + ".option pop\n\t" > > + : "=&r" (vl) : "r" (datap) : "memory"); > > + } > > riscv_v_disable(); > > } > > > > @@ -129,55 +252,77 @@ static inline void __riscv_v_vstate_restore(struct __riscv_v_ext_state *restore_ > > unsigned long vl; > > > > riscv_v_enable(); > > - asm volatile ( > > - ".option push\n\t" > > - ".option arch, +v\n\t" > > - "vsetvli %0, x0, e8, m8, ta, ma\n\t" > > - "vle8.v v0, (%1)\n\t" > > - "add %1, %1, %0\n\t" > > - "vle8.v v8, (%1)\n\t" > > - "add %1, %1, %0\n\t" > > - "vle8.v v16, (%1)\n\t" > > - "add %1, %1, %0\n\t" > > - "vle8.v v24, (%1)\n\t" > > - ".option pop\n\t" > > - : "=&r" (vl) : "r" (datap) : "memory"); > > + if (has_xtheadvector()) { > > + asm volatile ( > > + "mv t0, %0\n\t" > > + THEAD_VSETVLI_T4X0E8M8D1 > > + THEAD_VLB_V_V0T0 > > + "add t0, t0, t4\n\t" > > + THEAD_VLB_V_V0T0 > > + "add t0, t0, t4\n\t" > > + THEAD_VLB_V_V0T0 > > + "add t0, t0, t4\n\t" > > + THEAD_VLB_V_V0T0 > > + : : "r" (datap) : "memory", "t0", "t4"); > > + } else { > > + asm volatile ( > > + ".option push\n\t" > > + ".option arch, +v\n\t" > > + "vsetvli %0, x0, e8, m8, ta, ma\n\t" > > + "vle8.v v0, (%1)\n\t" > > + "add %1, %1, %0\n\t" > > + "vle8.v v8, (%1)\n\t" > > + "add %1, %1, %0\n\t" > > + "vle8.v v16, (%1)\n\t" > > + "add %1, %1, %0\n\t" > > + "vle8.v v24, (%1)\n\t" > > + ".option pop\n\t" > > + : "=&r" (vl) : "r" (datap) : "memory"); > > + } > > __vstate_csr_restore(restore_from); > > riscv_v_disable(); > > } > > > > static inline void __riscv_v_vstate_discard(void) > > { > > - unsigned long vl, vtype_inval = 1UL << (BITS_PER_LONG - 1); > > + unsigned long vtype_inval = 1UL << (BITS_PER_LONG - 1); > > > > riscv_v_enable(); > > + if (has_xtheadvector()) > > + asm volatile (THEAD_VSETVLI_X0X0E8M8D1); > > + else > > + asm volatile ( > > + ".option push\n\t" > > + ".option arch, +v\n\t" > > + "vsetvli x0, x0, e8, m8, ta, ma\n\t" > > + ".option pop\n\t"); > > + > > asm volatile ( > > ".option push\n\t" > > ".option arch, +v\n\t" > > - "vsetvli %0, x0, e8, m8, ta, ma\n\t" > > "vmv.v.i v0, -1\n\t" > > "vmv.v.i v8, -1\n\t" > > "vmv.v.i v16, -1\n\t" > > "vmv.v.i v24, -1\n\t" > > - "vsetvl %0, x0, %1\n\t" > > + "vsetvl x0, x0, %0\n\t" > > ".option pop\n\t" > > - : "=&r" (vl) : "r" (vtype_inval) : "memory"); > > + : : "r" (vtype_inval)); > > + > > riscv_v_disable(); > > } > > > > static inline void riscv_v_vstate_discard(struct pt_regs *regs) > > { > > - if ((regs->status & SR_VS) == SR_VS_OFF) > > - return; > > - > > - __riscv_v_vstate_discard(); > > - __riscv_v_vstate_dirty(regs); > > + if (riscv_v_vstate_query(regs)) { > > + __riscv_v_vstate_discard(); > > + __riscv_v_vstate_dirty(regs); > > + } > > } > > > > static inline void riscv_v_vstate_save(struct __riscv_v_ext_state *vstate, > > struct pt_regs *regs) > > { > > - if ((regs->status & SR_VS) == SR_VS_DIRTY) { > > + if (__riscv_v_vstate_check(regs->status, DIRTY)) { > > __riscv_v_vstate_save(vstate, vstate->datap); > > __riscv_v_vstate_clean(regs); > > } > > @@ -186,7 +331,7 @@ static inline void riscv_v_vstate_save(struct __riscv_v_ext_state *vstate, > > static inline void riscv_v_vstate_restore(struct __riscv_v_ext_state *vstate, > > struct pt_regs *regs) > > { > > - if ((regs->status & SR_VS) != SR_VS_OFF) { > > + if (riscv_v_vstate_query(regs)) { > > __riscv_v_vstate_restore(vstate, vstate->datap); > > __riscv_v_vstate_clean(regs); > > } > > @@ -195,7 +340,7 @@ static inline void riscv_v_vstate_restore(struct __riscv_v_ext_state *vstate, > > static inline void riscv_v_vstate_set_restore(struct task_struct *task, > > struct pt_regs *regs) > > { > > - if ((regs->status & SR_VS) != SR_VS_OFF) { > > + if (riscv_v_vstate_query(regs)) { > > set_tsk_thread_flag(task, TIF_RISCV_V_DEFER_RESTORE); > > riscv_v_vstate_on(regs); > > } > > diff --git a/arch/riscv/kernel/cpufeature.c b/arch/riscv/kernel/cpufeature.c > > index 2993318b8ea2..44f0017a98d5 100644 > > --- a/arch/riscv/kernel/cpufeature.c > > +++ b/arch/riscv/kernel/cpufeature.c > > @@ -781,7 +781,7 @@ void __init riscv_fill_hwcap(void) > > elf_hwcap &= ~COMPAT_HWCAP_ISA_F; > > } > > > > - if (elf_hwcap & COMPAT_HWCAP_ISA_V) { > > + if (elf_hwcap & COMPAT_HWCAP_ISA_V || has_xtheadvector_no_alternatives()) { > > riscv_v_setup_vsize(); > > /* > > * ISA string in device tree might have 'v' flag, but > > diff --git a/arch/riscv/kernel/kernel_mode_vector.c b/arch/riscv/kernel/kernel_mode_vector.c > > index 6afe80c7f03a..99972a48e86b 100644 > > --- a/arch/riscv/kernel/kernel_mode_vector.c > > +++ b/arch/riscv/kernel/kernel_mode_vector.c > > @@ -143,7 +143,7 @@ static int riscv_v_start_kernel_context(bool *is_nested) > > > > /* Transfer the ownership of V from user to kernel, then save */ > > riscv_v_start(RISCV_PREEMPT_V | RISCV_PREEMPT_V_DIRTY); > > - if ((task_pt_regs(current)->status & SR_VS) == SR_VS_DIRTY) { > > + if (__riscv_v_vstate_check(task_pt_regs(current)->status, DIRTY)) { > > uvstate = ¤t->thread.vstate; > > __riscv_v_vstate_save(uvstate, uvstate->datap); > > } > > @@ -160,7 +160,7 @@ asmlinkage void riscv_v_context_nesting_start(struct pt_regs *regs) > > return; > > > > depth = riscv_v_ctx_get_depth(); > > - if (depth == 0 && (regs->status & SR_VS) == SR_VS_DIRTY) > > + if (depth == 0 && __riscv_v_vstate_check(regs->status, DIRTY)) > > riscv_preempt_v_set_dirty(); > > > > riscv_v_ctx_depth_inc(); > > @@ -208,7 +208,7 @@ void kernel_vector_begin(void) > > { > > bool nested = false; > > > > - if (WARN_ON(!has_vector())) > > + if (WARN_ON(!(has_vector() || has_xtheadvector()))) > > return; > > > > BUG_ON(!may_use_simd()); > > @@ -236,7 +236,7 @@ EXPORT_SYMBOL_GPL(kernel_vector_begin); > > */ > > void kernel_vector_end(void) > > { > > - if (WARN_ON(!has_vector())) > > + if (WARN_ON(!(has_vector() || has_xtheadvector()))) > > return; > > > > riscv_v_disable(); > > diff --git a/arch/riscv/kernel/process.c b/arch/riscv/kernel/process.c > > index 92922dbd5b5c..eabca86fc3c0 100644 > > --- a/arch/riscv/kernel/process.c > > +++ b/arch/riscv/kernel/process.c > > @@ -178,7 +178,7 @@ void flush_thread(void) > > void arch_release_task_struct(struct task_struct *tsk) > > { > > /* Free the vector context of datap. */ > > - if (has_vector()) > > + if (has_vector() || has_xtheadvector()) > > riscv_v_thread_free(tsk); > > } > > > > @@ -225,7 +225,7 @@ int copy_thread(struct task_struct *p, const struct kernel_clone_args *args) > > p->thread.s[0] = 0; > > } > > p->thread.riscv_v_flags = 0; > > - if (has_vector()) > > + if (has_vector() || has_xtheadvector()) > > riscv_v_thread_alloc(p); > > p->thread.ra = (unsigned long)ret_from_fork; > > p->thread.sp = (unsigned long)childregs; /* kernel sp */ > > diff --git a/arch/riscv/kernel/signal.c b/arch/riscv/kernel/signal.c > > index 501e66debf69..5d3ba8e46807 100644 > > --- a/arch/riscv/kernel/signal.c > > +++ b/arch/riscv/kernel/signal.c > > @@ -188,7 +188,7 @@ static long restore_sigcontext(struct pt_regs *regs, > > > > return 0; > > case RISCV_V_MAGIC: > > - if (!has_vector() || !riscv_v_vstate_query(regs) || > > + if (!(has_vector() || has_xtheadvector()) || !riscv_v_vstate_query(regs) || > > size != riscv_v_sc_size) > > return -EINVAL; > > > > @@ -210,7 +210,7 @@ static size_t get_rt_frame_size(bool cal_all) > > > > frame_size = sizeof(*frame); > > > > - if (has_vector()) { > > + if (has_vector() || has_xtheadvector()) { > > if (cal_all || riscv_v_vstate_query(task_pt_regs(current))) > > total_context_size += riscv_v_sc_size; > > } > > @@ -283,7 +283,7 @@ static long setup_sigcontext(struct rt_sigframe __user *frame, > > if (has_fpu()) > > err |= save_fp_state(regs, &sc->sc_fpregs); > > /* Save the vector state. */ > > - if (has_vector() && riscv_v_vstate_query(regs)) > > + if ((has_vector() || has_xtheadvector()) && riscv_v_vstate_query(regs)) > > err |= save_v_state(regs, (void __user **)&sc_ext_ptr); > > /* Write zero to fp-reserved space and check it on restore_sigcontext */ > > err |= __put_user(0, &sc->sc_extdesc.reserved); > > diff --git a/arch/riscv/kernel/vector.c b/arch/riscv/kernel/vector.c > > index e04586cdb7f0..c12ea4547da6 100644 > > --- a/arch/riscv/kernel/vector.c > > +++ b/arch/riscv/kernel/vector.c > > @@ -63,7 +63,7 @@ int riscv_v_setup_vsize(void) > > > > void __init riscv_v_setup_ctx_cache(void) > > { > > - if (!has_vector()) > > + if (!(has_vector() || has_xtheadvector())) > > return; > > > > riscv_v_user_cachep = kmem_cache_create_usercopy("riscv_vector_ctx", > > @@ -184,7 +184,8 @@ bool riscv_v_first_use_handler(struct pt_regs *regs) > > u32 insn = (u32)regs->badaddr; > > > > /* Do not handle if V is not supported, or disabled */ > > - if (!(ELF_HWCAP & COMPAT_HWCAP_ISA_V)) > > + if (!(ELF_HWCAP & COMPAT_HWCAP_ISA_V) && > > + !(has_xtheadvector() && riscv_v_vstate_ctrl_user_allowed())) > > return false; > > > > /* If V has been enabled then it is not the first-use trap */ > > @@ -223,7 +224,7 @@ void riscv_v_vstate_ctrl_init(struct task_struct *tsk) > > bool inherit; > > int cur, next; > > > > - if (!has_vector()) > > + if (!(has_vector() || has_xtheadvector())) > > return; > > > > next = riscv_v_ctrl_get_next(tsk); > > @@ -245,7 +246,7 @@ void riscv_v_vstate_ctrl_init(struct task_struct *tsk) > > > > long riscv_v_vstate_ctrl_get_current(void) > > { > > - if (!has_vector()) > > + if (!(has_vector() || has_xtheadvector())) > > return -EINVAL; > > > > return current->thread.vstate_ctrl & PR_RISCV_V_VSTATE_CTRL_MASK; > > @@ -256,7 +257,7 @@ long riscv_v_vstate_ctrl_set_current(unsigned long arg) > > bool inherit; > > int cur, next; > > > > - if (!has_vector()) > > + if (!(has_vector() || has_xtheadvector())) > > return -EINVAL; > > > > if (arg & ~PR_RISCV_V_VSTATE_CTRL_MASK) > > @@ -306,7 +307,7 @@ static struct ctl_table riscv_v_default_vstate_table[] = { > > > > static int __init riscv_v_sysctl_init(void) > > { > > - if (has_vector()) > > + if (has_vector() || has_xtheadvector()) > > if (!register_sysctl("abi", riscv_v_default_vstate_table)) > > return -EINVAL; > > return 0; > > > > -- > > 2.44.0 > > > > > > _______________________________________________ > > linux-riscv mailing list > > linux-riscv@lists.infradead.org > > http://lists.infradead.org/mailman/listinfo/linux-riscv > > Cheers, > Andy 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 E012DC25B74 for ; Mon, 13 May 2024 16:56:50 +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=8UBztYbF+FqxFw+lpYjuAdGNM6AWrvu2gy31RGmnH1A=; b=VQR7q2MepOz8Fa QUxP1JrMc8vgorcWga4cQpmy6OrjbJtLrz4CAw0lXgNsIDGpSWTePC/YA6MOQ8ieKCOS5XrlYKjmH oJso9w+m/L+px0Ysrux/Y1Imo2VOk858RRT2TllK9GIrsdeknCCMRYfdNvUQDVoSpTsU+CiPZjbiV 0fgZpIr/CIkh53+KsKO3+VCSp3QcmNxoSOQjhPCfahUybV/NJ9g3tywuUPHyaFkn7wRHPM9zYFJEc rGcdQT5p+L+0KdnVTpRrpacfuytHHeDCfeGzrgfBjBGUTOw+8rS/zsXnm/lFAbhln9eY+Y+7JQaYf l8IwqmOFLhlPxHZZ+sSQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1s6Yyj-0000000DdMO-1QQv; Mon, 13 May 2024 16:56:45 +0000 Received: from mail-pf1-x42a.google.com ([2607:f8b0:4864:20::42a]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1s6Yye-0000000DdK4-2cAS for linux-riscv@lists.infradead.org; Mon, 13 May 2024 16:56:43 +0000 Received: by mail-pf1-x42a.google.com with SMTP id d2e1a72fcca58-6f467fb2e66so4129915b3a.1 for ; Mon, 13 May 2024 09:56:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1715619398; x=1716224198; 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=VK8vYit8+gdtU6flQEkqpwhK6a5E14jjPOZSmkE0mPU=; b=IXdz30ffZyi5sLTfuM8hvs7qdpBO45SrmGZTMFqTqZM2yP18oNd76hXROGRT9EeiN5 aj12ZS1cgz3n6/EheYzGsVodXzSAktvwtDuGNND7E8pxJSdopOGOu0iEzYtarK/A9XPp pjtyW+1QI9vXUi5f4ytlBmLR3RdzK4/dxT4Z3UUDCUcsJZSY6VPlFzDIvSR4yNBIouIE SsdNnKXKk3bIzd9W4Zl8RI4vC2oH/LCOGOF8BaYQflteA1ca7JrOYzPBV+ixCvhpfDKM pp0YlVXzxzgdnKSP9/cvFIRTCgn00BrmhdtZBnsc94kslYzqSx6ndXed4d2/Il1gWnhb bFGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715619398; x=1716224198; 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=VK8vYit8+gdtU6flQEkqpwhK6a5E14jjPOZSmkE0mPU=; b=bWUEAmhmFO/H4PJCFcvqMo4sCfnY0lJQZAWzE9X4k4OvYJa/e9Da5ChYurkZIMyE+d A21E5cxbNN7Xq3YT6N5x4ISJFNXsw9NLeIMvSd9GTmDL/ZjJ/+bKO8w9UsyPK32zNaPI 6SRxUEdiUwZiaKQRdblJH85vY0U6kry9sgF57rBJYjo5ZuxjHhwsGA44yEa8P/3yLVJ8 mVe7hECP/VwVeatcyZg8vuk3Db25EbCJNXCyb5/ahTP0UjnucKWOq7HRZ0/MXaMjHL3J 9DoiIurZ818QCDtQf9ToknJgzGzQe6kCJarzvxSZ8rwOQeFpV73YfGcj0VYPJSAs2/mW Xq7g== X-Forwarded-Encrypted: i=1; AJvYcCUwK+fCdV2a9MMOv9av7kC+tmYbU8Qx8BVRbS4DGo+DhACjOF4AeLoam1wHGw83LaxZ2fEaoRl3FasL2Z54aoeEobD60xFjxmB7YqKUh2hy X-Gm-Message-State: AOJu0YwLQBo4K6l+EJ/vaVheh1VOnHQleyjx9Gwk6djJlrO0sQn0kOSd BCiZ0La2pk0+37xeFEkEUM7d6vKFkOslUa9scu64tRKmyfCsGZf5/MzXHC2aLRs= X-Google-Smtp-Source: AGHT+IHajz6ulNGvu1i/yT1eA7FdMl4NaAuxDNWOd+7lvJAt6WrPn9Bnm6rDLbkRgAASe47XyhLGBg== X-Received: by 2002:a05:6a20:7350:b0:1af:a72e:8b7e with SMTP id adf61e73a8af0-1afde1b6f32mr13102711637.50.1715619397966; Mon, 13 May 2024 09:56:37 -0700 (PDT) Received: from ghost ([2601:647:5700:6860:3a68:91f5:da04:ef09]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-6f4d2a87bb1sm7592789b3a.87.2024.05.13.09.56.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 May 2024 09:56:37 -0700 (PDT) Date: Mon, 13 May 2024 09:56:31 -0700 From: Charlie Jenkins To: Andy Chiu Cc: Conor Dooley , Rob Herring , Krzysztof Kozlowski , Paul Walmsley , Palmer Dabbelt , Albert Ou , Guo Ren , Conor Dooley , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Conor Dooley , Evan Green , =?iso-8859-1?Q?Cl=E9ment_L=E9ger?= , Jonathan Corbet , Shuah Khan , linux-riscv@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Palmer Dabbelt , linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: Re: [PATCH v6 13/17] riscv: vector: Support xtheadvector save/restore Message-ID: References: <20240503-dev-charlie-support_thead_vector_6_9-v6-0-cb7624e65d82@rivosinc.com> <20240503-dev-charlie-support_thead_vector_6_9-v6-13-cb7624e65d82@rivosinc.com> 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-20240513_095640_824803_AE99FFD2 X-CRM114-Status: GOOD ( 37.92 ) 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 T24gTW9uLCBNYXkgMTMsIDIwMjQgYXQgMDQ6NDU6MThQTSArMDgwMCwgQW5keSBDaGl1IHdyb3Rl Ogo+IEhpIENoYXJsaWUsCj4gCj4gU29ycnksIEkgYW0gbGF0ZSBvbiB0aGlzLiBJIGhhdmVuJ3Qg bG9va2VkIHRocm91Z2ggdGhlIGVudGlyZSBzZXJpZXMKPiB5ZXQsIGJ1dCBoZXJlIGlzIHNvbWV0 aGluZyB0aGF0IEkgdGhvdWdodCB3b3J0aCBicmluZ2luZyB1cCBzb29uZXIuCj4gCj4gT24gU2F0 LCBNYXkgNCwgMjAyNCBhdCAyOjIy4oCvQU0gQ2hhcmxpZSBKZW5raW5zIDxjaGFybGllQHJpdm9z aW5jLmNvbT4gd3JvdGU6Cj4gPgo+ID4gVXNlIGFsdGVybmF0aXZlcyB0byBhZGQgc3VwcG9ydCBm b3IgeHRoZWFkdmVjdG9yIHZlY3RvciBzYXZlL3Jlc3RvcmUKPiA+IHJvdXRpbmVzLgo+ID4KPiA+ IFNpZ25lZC1vZmYtYnk6IENoYXJsaWUgSmVua2lucyA8Y2hhcmxpZUByaXZvc2luYy5jb20+Cj4g PiAtLS0KPiA+ICBhcmNoL3Jpc2N2L0tjb25maWcudmVuZG9yICAgICAgICAgICAgICB8ICAxMyAr Kwo+ID4gIGFyY2gvcmlzY3YvaW5jbHVkZS9hc20vY3NyLmggICAgICAgICAgIHwgICA2ICsKPiA+ ICBhcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3N3aXRjaF90by5oICAgICB8ICAgMiArLQo+ID4gIGFy Y2gvcmlzY3YvaW5jbHVkZS9hc20vdmVjdG9yLmggICAgICAgIHwgMjQ3ICsrKysrKysrKysrKysr KysrKysrKysrKysrLS0tLS0tLQo+ID4gIGFyY2gvcmlzY3Yva2VybmVsL2NwdWZlYXR1cmUuYyAg ICAgICAgIHwgICAyICstCj4gPiAgYXJjaC9yaXNjdi9rZXJuZWwva2VybmVsX21vZGVfdmVjdG9y LmMgfCAgIDggKy0KPiA+ICBhcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmMgICAgICAgICAgICB8 ICAgNCArLQo+ID4gIGFyY2gvcmlzY3Yva2VybmVsL3NpZ25hbC5jICAgICAgICAgICAgIHwgICA2 ICstCj4gPiAgYXJjaC9yaXNjdi9rZXJuZWwvdmVjdG9yLmMgICAgICAgICAgICAgfCAgMTMgKy0K PiA+ICA5IGZpbGVzIGNoYW5nZWQsIDIzMyBpbnNlcnRpb25zKCspLCA2OCBkZWxldGlvbnMoLSkK PiA+Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9LY29uZmlnLnZlbmRvciBiL2FyY2gvcmlz Y3YvS2NvbmZpZy52ZW5kb3IKPiA+IGluZGV4IGFhNWExOTFlNjU5ZS4uZWRmNDlmMzA2NWFjIDEw MDY0NAo+ID4gLS0tIGEvYXJjaC9yaXNjdi9LY29uZmlnLnZlbmRvcgo+ID4gKysrIGIvYXJjaC9y aXNjdi9LY29uZmlnLnZlbmRvcgo+ID4gQEAgLTEzLDYgKzEzLDE5IEBAIGNvbmZpZyBSSVNDVl9J U0FfVkVORE9SX0VYVF9USEVBRAo+ID4gICAgICAgICAgIGV4dGVuc2lvbnMuIFdpdGhvdXQgdGhp cyBvcHRpb24gZW5hYmxlZCwgVC1IZWFkIHZlbmRvciBleHRlbnNpb25zIHdpbGwKPiA+ICAgICAg ICAgICBub3QgYmUgZGV0ZWN0ZWQgYXQgYm9vdCBhbmQgdGhlaXIgcHJlc2VuY2Ugbm90IHJlcG9y dGVkIHRvIHVzZXJzcGFjZS4KPiA+Cj4gPiArICAgICAgICAgSWYgeW91IGRvbid0IGtub3cgd2hh dCB0byBkbyBoZXJlLCBzYXkgWS4KPiA+ICsKPiA+ICtjb25maWcgUklTQ1ZfSVNBX1hUSEVBRFZF Q1RPUgo+ID4gKyAgICAgICBib29sICJ4dGhlYWR2ZWN0b3IgZXh0ZW5zaW9uIHN1cHBvcnQiCj4g PiArICAgICAgIGRlcGVuZHMgb24gUklTQ1ZfSVNBX1ZFTkRPUl9FWFRfVEhFQUQKPiA+ICsgICAg ICAgZGVwZW5kcyBvbiBSSVNDVl9JU0FfVgo+ID4gKyAgICAgICBkZXBlbmRzIG9uIEZQVQo+ID4g KyAgICAgICBkZWZhdWx0IHkKPiA+ICsgICAgICAgaGVscAo+ID4gKyAgICAgICAgIFNheSBOIGhl cmUgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBhbGwgeHRoZWFkdmVjdG9yIHJlbGF0ZWQgcHJvY2Vk dXJlCj4gPiArICAgICAgICAgaW4gdGhlIGtlcm5lbC4gVGhpcyB3aWxsIGRpc2FibGUgdmVjdG9y IGZvciBhbnkgVC1IZWFkIGJvYXJkIHRoYXQKPiA+ICsgICAgICAgICBjb250YWlucyB4dGhlYWR2 ZWN0b3IgcmF0aGVyIHRoYW4gdGhlIHN0YW5kYXJkIHZlY3Rvci4KPiA+ICsKPiA+ICAgICAgICAg ICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBZLgo+ID4gIGVuZG1lbnUK PiA+Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9jc3IuaCBiL2FyY2gv cmlzY3YvaW5jbHVkZS9hc20vY3NyLmgKPiA+IGluZGV4IGU1YTM1ZWZkNTZlMC4uMTM2NTdkMDk2 ZTdkIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9jc3IuaAo+ID4gKysr IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9jc3IuaAo+ID4gQEAgLTMwLDYgKzMwLDEyIEBACj4g PiAgI2RlZmluZSBTUl9WU19DTEVBTiAgICBfQUMoMHgwMDAwMDQwMCwgVUwpCj4gPiAgI2RlZmlu ZSBTUl9WU19ESVJUWSAgICBfQUMoMHgwMDAwMDYwMCwgVUwpCj4gPgo+ID4gKyNkZWZpbmUgU1Jf VlNfVEhFQUQgICAgICAgICAgICBfQUMoMHgwMTgwMDAwMCwgVUwpIC8qIHh0aGVhZHZlY3RvciBT dGF0dXMgKi8KPiA+ICsjZGVmaW5lIFNSX1ZTX09GRl9USEVBRCAgICAgICAgICAgICAgICBfQUMo MHgwMDAwMDAwMCwgVUwpCj4gPiArI2RlZmluZSBTUl9WU19JTklUSUFMX1RIRUFEICAgIF9BQygw eDAwODAwMDAwLCBVTCkKPiA+ICsjZGVmaW5lIFNSX1ZTX0NMRUFOX1RIRUFEICAgICAgX0FDKDB4 MDEwMDAwMDAsIFVMKQo+ID4gKyNkZWZpbmUgU1JfVlNfRElSVFlfVEhFQUQgICAgICBfQUMoMHgw MTgwMDAwMCwgVUwpCj4gPiArCj4gPiAgI2RlZmluZSBTUl9YUyAgICAgICAgICBfQUMoMHgwMDAx ODAwMCwgVUwpIC8qIEV4dGVuc2lvbiBTdGF0dXMgKi8KPiA+ICAjZGVmaW5lIFNSX1hTX09GRiAg ICAgIF9BQygweDAwMDAwMDAwLCBVTCkKPiA+ICAjZGVmaW5lIFNSX1hTX0lOSVRJQUwgIF9BQygw eDAwMDA4MDAwLCBVTCkKPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3N3 aXRjaF90by5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9zd2l0Y2hfdG8uaAo+ID4gaW5kZXgg N2VmZGIwNTg0ZDQ3Li5hZGE2YjVjZjJkOTQgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL3Jpc2N2L2lu Y2x1ZGUvYXNtL3N3aXRjaF90by5oCj4gPiArKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3N3 aXRjaF90by5oCj4gPiBAQCAtNzgsNyArNzgsNyBAQCBkbyB7ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiAgICAgICAgIHN0cnVjdCB0YXNrX3N0 cnVjdCAqX19uZXh0ID0gKG5leHQpOyAgICAgICAgICAgIFwKPiA+ICAgICAgICAgaWYgKGhhc19m cHUoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gICAgICAgICAgICAg ICAgIF9fc3dpdGNoX3RvX2ZwdShfX3ByZXYsIF9fbmV4dCk7ICAgICAgICBcCj4gPiAtICAgICAg IGlmIChoYXNfdmVjdG9yKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAo+ID4gKyAgICAgICBpZiAoaGFzX3ZlY3RvcigpIHx8IGhhc194dGhlYWR2ZWN0b3IoKSkgICAg ICAgICBcCj4gPiAgICAgICAgICAgICAgICAgX19zd2l0Y2hfdG9fdmVjdG9yKF9fcHJldiwgX19u ZXh0KTsgICAgIFwKPiA+ICAgICAgICAgKChsYXN0KSA9IF9fc3dpdGNoX3RvKF9fcHJldiwgX19u ZXh0KSk7ICAgICAgICAgXAo+ID4gIH0gd2hpbGUgKDApCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9y aXNjdi9pbmNsdWRlL2FzbS92ZWN0b3IuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdmVjdG9y LmgKPiA+IGluZGV4IDczMWRjZDBlZDRkZS4uZGI4NTFkYzgxODcwIDEwMDY0NAo+ID4gLS0tIGEv YXJjaC9yaXNjdi9pbmNsdWRlL2FzbS92ZWN0b3IuaAo+ID4gKysrIGIvYXJjaC9yaXNjdi9pbmNs dWRlL2FzbS92ZWN0b3IuaAo+ID4gQEAgLTE4LDYgKzE4LDI3IEBACj4gPiAgI2luY2x1ZGUgPGFz bS9jcHVmZWF0dXJlLmg+Cj4gPiAgI2luY2x1ZGUgPGFzbS9jc3IuaD4KPiA+ICAjaW5jbHVkZSA8 YXNtL2FzbS5oPgo+ID4gKyNpbmNsdWRlIDxhc20vdmVuZG9yaWRfbGlzdC5oPgo+ID4gKyNpbmNs dWRlIDxhc20vdmVuZG9yX2V4dGVuc2lvbnMuaD4KPiA+ICsjaW5jbHVkZSA8YXNtL3ZlbmRvcl9l eHRlbnNpb25zL3RoZWFkLmg+Cj4gPiArCj4gPiArI2RlZmluZSBfX3Jpc2N2X3ZfdnN0YXRlX29y KF92YWwsIFRZUEUpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAg IHR5cGVvZihfdmFsKSBfcmVzID0gX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCj4gPiArICAgICAgIGlmIChoYXNfeHRoZWFkdmVjdG9yKCkpIFwKPiA+ICsgICAg ICAgICAgICAgICBfcmVzID0gKF9yZXMgJiB+U1JfVlNfVEhFQUQpIHwgU1JfVlNfIyNUWVBFIyNf VEhFQUQ7ICAgIFwKPiA+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgICAgICAgICAgICBfcmVz ID0gKF9yZXMgJiB+U1JfVlMpIHwgU1JfVlNfIyNUWVBFOyAgICAgICAgICAgICAgICAgIFwKPiA+ ICsgICAgICAgX3JlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKPiA+ICt9KQo+ID4gKwo+ID4gKyNkZWZpbmUgX19yaXNjdl92X3Zz dGF0ZV9jaGVjayhfdmFsLCBUWVBFKSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4g KyAgICAgICBib29sIF9yZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgICBpZiAoaGFzX3h0aGVhZHZlY3RvcigpKSBcCj4g PiArICAgICAgICAgICAgICAgX3JlcyA9ICgoX3ZhbCkgJiBTUl9WU19USEVBRCkgPT0gU1JfVlNf IyNUWVBFIyNfVEhFQUQ7ICBcCj4gPiArICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAgICAgICAg ICAgX3JlcyA9ICgoX3ZhbCkgJiBTUl9WUykgPT0gU1JfVlNfIyNUWVBFOyAgICAgICAgICAgICAg ICBcCj4gPiArICAgICAgIF9yZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArfSkKPiA+Cj4gPiAgZXh0ZXJuIHVuc2lnbmVk IGxvbmcgcmlzY3Zfdl92c2l6ZTsKPiA+ICBpbnQgcmlzY3Zfdl9zZXR1cF92c2l6ZSh2b2lkKTsK PiA+IEBAIC00MCwzOSArNjEsNjIgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGhhc192 ZWN0b3Iodm9pZCkKPiA+ICAgICAgICAgcmV0dXJuIHJpc2N2X2hhc19leHRlbnNpb25fdW5saWtl bHkoUklTQ1ZfSVNBX0VYVF92KTsKPiA+ICB9Cj4gPgo+ID4gK3N0YXRpYyBfX2Fsd2F5c19pbmxp bmUgYm9vbCBoYXNfeHRoZWFkdmVjdG9yX25vX2FsdGVybmF0aXZlcyh2b2lkKQo+ID4gK3sKPiA+ ICsgICAgICAgaWYgKElTX0VOQUJMRUQoQ09ORklHX1JJU0NWX0lTQV9YVEhFQURWRUNUT1IpKQo+ ID4gKyAgICAgICAgICAgICAgIHJldHVybiByaXNjdl9pc2FfdmVuZG9yX2V4dGVuc2lvbl9hdmFp bGFibGUoVEhFQURfVkVORE9SX0lELCBYVEhFQURWRUNUT1IpOwo+ID4gKyAgICAgICBlbHNlCj4g PiArICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMg X19hbHdheXNfaW5saW5lIGJvb2wgaGFzX3h0aGVhZHZlY3Rvcih2b2lkKQo+ID4gK3sKPiA+ICsg ICAgICAgaWYgKElTX0VOQUJMRUQoQ09ORklHX1JJU0NWX0lTQV9YVEhFQURWRUNUT1IpKQo+ID4g KyAgICAgICAgICAgICAgIHJldHVybiByaXNjdl9oYXNfdmVuZG9yX2V4dGVuc2lvbl91bmxpa2Vs eShUSEVBRF9WRU5ET1JfSUQsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFJJU0NWX0lTQV9WRU5ET1JfRVhUX1hUSEVBRFZFQ1RP Uik7Cj4gPiArICAgICAgIGVsc2UKPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4g PiArfQo+ID4gKwo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jpc2N2X3ZfdnN0YXRlX2NsZWFu KHN0cnVjdCBwdF9yZWdzICpyZWdzKQo+ID4gIHsKPiA+IC0gICAgICAgcmVncy0+c3RhdHVzID0g KHJlZ3MtPnN0YXR1cyAmIH5TUl9WUykgfCBTUl9WU19DTEVBTjsKPiA+ICsgICAgICAgcmVncy0+ c3RhdHVzID0gX19yaXNjdl92X3ZzdGF0ZV9vcihyZWdzLT5zdGF0dXMsIENMRUFOKTsKPiA+ICB9 Cj4gPgo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jpc2N2X3ZfdnN0YXRlX2RpcnR5KHN0cnVj dCBwdF9yZWdzICpyZWdzKQo+ID4gIHsKPiA+IC0gICAgICAgcmVncy0+c3RhdHVzID0gKHJlZ3Mt PnN0YXR1cyAmIH5TUl9WUykgfCBTUl9WU19ESVJUWTsKPiA+ICsgICAgICAgcmVncy0+c3RhdHVz ID0gX19yaXNjdl92X3ZzdGF0ZV9vcihyZWdzLT5zdGF0dXMsIERJUlRZKTsKPiA+ICB9Cj4gPgo+ ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCByaXNjdl92X3ZzdGF0ZV9vZmYoc3RydWN0IHB0X3JlZ3Mg KnJlZ3MpCj4gPiAgewo+ID4gLSAgICAgICByZWdzLT5zdGF0dXMgPSAocmVncy0+c3RhdHVzICYg flNSX1ZTKSB8IFNSX1ZTX09GRjsKPiA+ICsgICAgICAgcmVncy0+c3RhdHVzID0gX19yaXNjdl92 X3ZzdGF0ZV9vcihyZWdzLT5zdGF0dXMsIE9GRik7Cj4gPiAgfQo+ID4KPiA+ICBzdGF0aWMgaW5s aW5lIHZvaWQgcmlzY3Zfdl92c3RhdGVfb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCj4gPiAgewo+ ID4gLSAgICAgICByZWdzLT5zdGF0dXMgPSAocmVncy0+c3RhdHVzICYgflNSX1ZTKSB8IFNSX1ZT X0lOSVRJQUw7Cj4gPiArICAgICAgIHJlZ3MtPnN0YXR1cyA9IF9fcmlzY3Zfdl92c3RhdGVfb3Io cmVncy0+c3RhdHVzLCBJTklUSUFMKTsKPiA+ICB9Cj4gPgo+ID4gIHN0YXRpYyBpbmxpbmUgYm9v bCByaXNjdl92X3ZzdGF0ZV9xdWVyeShzdHJ1Y3QgcHRfcmVncyAqcmVncykKPiA+ICB7Cj4gPiAt ICAgICAgIHJldHVybiAocmVncy0+c3RhdHVzICYgU1JfVlMpICE9IDA7Cj4gPiArICAgICAgIHJl dHVybiAhX19yaXNjdl92X3ZzdGF0ZV9jaGVjayhyZWdzLT5zdGF0dXMsIE9GRik7Cj4gPiAgfQo+ ID4KPiA+ICBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgcmlzY3Zfdl9lbmFibGUodm9pZCkK PiA+ICB7Cj4gPiAtICAgICAgIGNzcl9zZXQoQ1NSX1NTVEFUVVMsIFNSX1ZTKTsKPiA+ICsgICAg ICAgaWYgKGhhc194dGhlYWR2ZWN0b3IoKSkKPiA+ICsgICAgICAgICAgICAgICBjc3Jfc2V0KENT Ul9TU1RBVFVTLCBTUl9WU19USEVBRCk7Cj4gPiArICAgICAgIGVsc2UKPiA+ICsgICAgICAgICAg ICAgICBjc3Jfc2V0KENTUl9TU1RBVFVTLCBTUl9WUyk7Cj4gPiAgfQo+ID4KPiA+ICBzdGF0aWMg X19hbHdheXNfaW5saW5lIHZvaWQgcmlzY3Zfdl9kaXNhYmxlKHZvaWQpCj4gPiAgewo+ID4gLSAg ICAgICBjc3JfY2xlYXIoQ1NSX1NTVEFUVVMsIFNSX1ZTKTsKPiA+ICsgICAgICAgaWYgKGhhc194 dGhlYWR2ZWN0b3IoKSkKPiA+ICsgICAgICAgICAgICAgICBjc3JfY2xlYXIoQ1NSX1NTVEFUVVMs IFNSX1ZTX1RIRUFEKTsKPiA+ICsgICAgICAgZWxzZQo+ID4gKyAgICAgICAgICAgICAgIGNzcl9j bGVhcihDU1JfU1NUQVRVUywgU1JfVlMpOwo+ID4gIH0KPiA+Cj4gPiAgc3RhdGljIF9fYWx3YXlz X2lubGluZSB2b2lkIF9fdnN0YXRlX2Nzcl9zYXZlKHN0cnVjdCBfX3Jpc2N2X3ZfZXh0X3N0YXRl ICpkZXN0KQo+ID4gQEAgLTgxLDEwICsxMjUsNDcgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSB2 b2lkIF9fdnN0YXRlX2Nzcl9zYXZlKHN0cnVjdCBfX3Jpc2N2X3ZfZXh0X3N0YXRlICpkZXN0KQo+ ID4gICAgICAgICAgICAgICAgICJjc3JyICAgJTAsICIgX19zdHJpbmdpZnkoQ1NSX1ZTVEFSVCkg IlxuXHQiCj4gPiAgICAgICAgICAgICAgICAgImNzcnIgICAlMSwgIiBfX3N0cmluZ2lmeShDU1Jf VlRZUEUpICJcblx0Igo+ID4gICAgICAgICAgICAgICAgICJjc3JyICAgJTIsICIgX19zdHJpbmdp ZnkoQ1NSX1ZMKSAiXG5cdCIKPiA+IC0gICAgICAgICAgICAgICAiY3NyciAgICUzLCAiIF9fc3Ry aW5naWZ5KENTUl9WQ1NSKSAiXG5cdCIKPiA+IC0gICAgICAgICAgICAgICAiY3NyciAgICU0LCAi IF9fc3RyaW5naWZ5KENTUl9WTEVOQikgIlxuXHQiCj4gPiAgICAgICAgICAgICAgICAgOiAiPXIi IChkZXN0LT52c3RhcnQpLCAiPXIiIChkZXN0LT52dHlwZSksICI9ciIgKGRlc3QtPnZsKSwKPiA+ IC0gICAgICAgICAgICAgICAgICI9ciIgKGRlc3QtPnZjc3IpLCAiPXIiIChkZXN0LT52bGVuYikg OiA6KTsKPiA+ICsgICAgICAgICAgICAgICAiPXIiIChkZXN0LT52Y3NyKSA6IDopOwo+ID4gKwo+ ID4gKyAgICAgICBpZiAoaGFzX3h0aGVhZHZlY3RvcigpKSB7Cj4gPiArICAgICAgICAgICAgICAg dTMyIHRtcF92Y3NyOwo+ID4gKyAgICAgICAgICAgICAgIGJvb2wgcmVzdG9yZV9mcHUgPSBmYWxz ZTsKPiA+ICsgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHN0YXR1cyA9IGNzcl9yZWFkKENT Ul9TU1RBVFVTKTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgICAvKgo+ID4gKyAgICAgICAgICAg ICAgICAqIENTUl9WQ1NSIGlzIGRlZmluZWQgYXMKPiA+ICsgICAgICAgICAgICAgICAgKiBbMjox XSAtIHZ4cm1bMTowXQo+ID4gKyAgICAgICAgICAgICAgICAqIFswXSAtIHZ4c2F0Cj4gPiArICAg ICAgICAgICAgICAgICogVGhlIGVhcmxpZXIgdmVjdG9yIHNwZWMgaW1wbGVtZW50ZWQgYnkgVC1I ZWFkIHVzZXMgc2VwYXJhdGUKPiA+ICsgICAgICAgICAgICAgICAgKiByZWdpc3RlcnMgZm9yIHRo ZSBzYW1lIGJpdC1lbGVtZW50cywgc28ganVzdCBjb21iaW5lIHRob3NlCj4gPiArICAgICAgICAg ICAgICAgICogaW50byB0aGUgZXhpc3Rpbmcgb3V0cHV0IGZpZWxkLgo+ID4gKyAgICAgICAgICAg ICAgICAqCj4gPiArICAgICAgICAgICAgICAgICogQWRkaXRpb25hbGx5IFQtSGVhZCBjb3JlcyBu ZWVkIEZTIHRvIGJlIGVuYWJsZWQgd2hlbiBhY2Nlc3NpbmcKPiA+ICsgICAgICAgICAgICAgICAg KiB0aGUgVlhSTSBhbmQgVlhTQVQgQ1NScywgb3RoZXJ3aXNlIGVuZGluZyBpbiBpbGxlZ2FsIGlu c3RydWN0aW9ucy4KPiA+ICsgICAgICAgICAgICAgICAgKiBUaG91Z2ggdGhlIGNvcmVzIGRvIG5v dCBpbXBsZW1lbnQgdGhlIFZYUk0gYW5kIFZYU0FUIGZpZWxkcyBpbiB0aGUKPiA+ICsgICAgICAg ICAgICAgICAgKiBGQ1NSIENTUiB0aGF0IHZlY3Rvci0wLjcuMSBzcGVjaWZpZXMuCj4gPiArICAg ICAgICAgICAgICAgICovCj4gPiArICAgICAgICAgICAgICAgaWYgKChzdGF0dXMgJiBTUl9GUykg PT0gU1JfRlNfT0ZGKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBjc3Jfc2V0KENTUl9T U1RBVFVTLCAoc3RhdHVzICYgflNSX0ZTKSB8IFNSX0ZTX0NMRUFOKTsKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIHJlc3RvcmVfZnB1ID0gdHJ1ZTsKPiA+ICsgICAgICAgICAgICAgICB9Cj4g PiArCj4gPiArICAgICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICJjc3JyICAgJVt0bXBfdmNzcl0sICIgX19zdHJpbmdpZnkoVkNTUl9WWFJNKSAi XG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJzbGxpdyAgJVt2Y3NyXSwgJVt0bXBf dmNzcl0sICIgX19zdHJpbmdpZnkoVkNTUl9WWFJNX1NISUZUKSAiXG5cdCIKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICJjc3JyICAgJVt0bXBfdmNzcl0sICIgX19zdHJpbmdpZnkoVkNTUl9W WFNBVCkgIlxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAib3IgICAgICVbdmNzcl0s ICVbdmNzcl0sICVbdG1wX3Zjc3JdXG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIDog W3Zjc3JdICI9ciIgKGRlc3QtPnZjc3IpLCBbdG1wX3Zjc3JdICI9JnIiICh0bXBfdmNzcikpOwo+ ID4gKwo+ID4gKyAgICAgICAgICAgICAgIGlmIChyZXN0b3JlX2ZwdSkKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIGNzcl9zZXQoQ1NSX1NTVEFUVVMsIHN0YXR1cyk7Cj4gCj4gdmxlbmIgaXMg b24gQUJJIGFuZCBwdHJhY2UgbmVlZHMgdGhhdCB0byByZWNvdmVyIHRoZSB3aWR0aCBvZiB0aGUK PiByZWdpc3Rlci4gU28gd2Ugc2hvdWxkIHByb2JhYmx5IHNhdmUgWHRoZWFkdmVjdG9yJ3Mgdmxl bmIgaW50byB2c3RhdGUKPiBpZiB3ZSBtZWFudCB0byBtYWludGFpbiBBQkkgY29tcGF0aWJpbGl0 eSBiZXR3ZWVuIFYgYW5kIFh0aGVhZHZlY3Rvcgo+IGZyb20gdGhlIGtlcm5lbC4KCldlIGNhbiBw dWxsIHRoZSB2bGVuYiBmcm9tIHJpc2N2X3ZfdnNpemUgd2hpY2ggZ2V0cyBwb3B1bGF0ZWQgZnJv bSB0aGUKZGV2aWNldHJlZSBmb3IgeHRoZWFkdmVjdG9yLiBJIHdpbGwgY2hhbmdlIHRoYXQgaW4g dGhlIG5leHQgdmVyc2lvbiEKCi0gQ2hhcmxpZQoKPiAKPiA+ICsgICAgICAgfSBlbHNlIHsKPiA+ ICsgICAgICAgICAgICAgICBhc20gdm9sYXRpbGUgKAo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgImNzcnIgICAlW3Zjc3JdLCAiIF9fc3RyaW5naWZ5KENTUl9WQ1NSKSAiXG5cdCIKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICJjc3JyICAgJVt2bGVuYl0sICIgX19zdHJpbmdpZnkoQ1NS X1ZMRU5CKSAiXG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIDogW3Zjc3JdICI9ciIg KGRlc3QtPnZjc3IpLCBbdmxlbmJdICI9ciIgKGRlc3QtPnZsZW5iKSk7Cj4gPiArICAgICAgIH0K PiA+ICB9Cj4gPgo+ID4gIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBfX3ZzdGF0ZV9jc3Jf cmVzdG9yZShzdHJ1Y3QgX19yaXNjdl92X2V4dF9zdGF0ZSAqc3JjKQo+ID4gQEAgLTk1LDkgKzE3 NiwzNyBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX192c3RhdGVfY3NyX3Jlc3RvcmUo c3RydWN0IF9fcmlzY3Zfdl9leHRfc3RhdGUgKnNyYwo+ID4gICAgICAgICAgICAgICAgICJ2c2V0 dmwgIHgwLCAlMiwgJTFcblx0Igo+ID4gICAgICAgICAgICAgICAgICIub3B0aW9uIHBvcFxuXHQi Cj4gPiAgICAgICAgICAgICAgICAgImNzcncgICAiIF9fc3RyaW5naWZ5KENTUl9WU1RBUlQpICIs ICUwXG5cdCIKPiA+IC0gICAgICAgICAgICAgICAiY3NydyAgICIgX19zdHJpbmdpZnkoQ1NSX1ZD U1IpICIsICUzXG5cdCIKPiA+IC0gICAgICAgICAgICAgICA6IDogInIiIChzcmMtPnZzdGFydCks ICJyIiAoc3JjLT52dHlwZSksICJyIiAoc3JjLT52bCksCj4gPiAtICAgICAgICAgICAgICAgICAg ICJyIiAoc3JjLT52Y3NyKSA6KTsKPiA+ICsgICAgICAgICAgICAgICA6IDogInIiIChzcmMtPnZz dGFydCksICJyIiAoc3JjLT52dHlwZSksICJyIiAoc3JjLT52bCkpOwo+ID4gKwo+ID4gKyAgICAg ICBpZiAoaGFzX3h0aGVhZHZlY3RvcigpKSB7Cj4gPiArICAgICAgICAgICAgICAgdTMyIHRtcF92 Y3NyOwo+ID4gKyAgICAgICAgICAgICAgIGJvb2wgcmVzdG9yZV9mcHUgPSBmYWxzZTsKPiA+ICsg ICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHN0YXR1cyA9IGNzcl9yZWFkKENTUl9TU1RBVFVT KTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgICAvKgo+ID4gKyAgICAgICAgICAgICAgICAqIFNp bWlsYXIgdG8gX192c3RhdGVfY3NyX3NhdmUgYWJvdmUsIHJlc3RvcmUgdmFsdWVzIGZvciB0aGUK PiA+ICsgICAgICAgICAgICAgICAgKiBzZXBhcmF0ZSBWWFJNIGFuZCBWWFNBVCBDU1JzIGZyb20g dGhlIHZjc3IgdmFyaWFibGUuCj4gPiArICAgICAgICAgICAgICAgICovCj4gPiArICAgICAgICAg ICAgICAgaWYgKChzdGF0dXMgJiBTUl9GUykgPT0gU1JfRlNfT0ZGKSB7Cj4gPiArICAgICAgICAg ICAgICAgICAgICAgICBjc3Jfc2V0KENTUl9TU1RBVFVTLCAoc3RhdHVzICYgflNSX0ZTKSB8IFNS X0ZTX0NMRUFOKTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfZnB1ID0gdHJ1 ZTsKPiA+ICsgICAgICAgICAgICAgICB9Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgYXNtIHZv bGF0aWxlICgKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJzcmxpdyAgJVt0bXBfdmNzcl0s ICVbdmNzcl0sICIgX19zdHJpbmdpZnkoVkNTUl9WWFJNX1NISUZUKSAiXG5cdCIKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICJhbmRpICAgJVt0bXBfdmNzcl0sICVbdG1wX3Zjc3JdLCAiIF9f c3RyaW5naWZ5KFZDU1JfVlhSTV9NQVNLKSAiXG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICJjc3J3ICAgIiBfX3N0cmluZ2lmeShWQ1NSX1ZYUk0pICIsICVbdG1wX3Zjc3JdXG5cdCIK PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJhbmRpICAgJVt0bXBfdmNzcl0sICVbdmNzcl0s ICIgX19zdHJpbmdpZnkoVkNTUl9WWFNBVF9NQVNLKSAiXG5cdCIKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICJjc3J3ICAgIiBfX3N0cmluZ2lmeShWQ1NSX1ZYU0FUKSAiLCAlW3RtcF92Y3Ny XVxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICA6IFt0bXBfdmNzcl0gIj0mciIgKHRt cF92Y3NyKSA6IFt2Y3NyXSAiciIgKHNyYy0+dmNzcikpOwo+ID4gKwo+ID4gKyAgICAgICAgICAg ICAgIGlmIChyZXN0b3JlX2ZwdSkKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGNzcl9zZXQo Q1NSX1NTVEFUVVMsIHN0YXR1cyk7Cj4gPiArICAgICAgIH0gZWxzZSB7Cj4gPiArICAgICAgICAg ICAgICAgYXNtIHZvbGF0aWxlICgKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJjc3J3ICAg IiBfX3N0cmluZ2lmeShDU1JfVkNTUikgIiwgJVt2Y3NyXVxuXHQiCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICA6IDogW3Zjc3JdICJyIiAoc3JjLT52Y3NyKSk7Cj4gPiArICAgICAgIH0KPiA+ ICB9Cj4gPgo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jpc2N2X3ZfdnN0YXRlX3NhdmUoc3Ry dWN0IF9fcmlzY3Zfdl9leHRfc3RhdGUgKnNhdmVfdG8sCj4gPiBAQCAtMTA3LDE5ICsyMTYsMzMg QEAgc3RhdGljIGlubGluZSB2b2lkIF9fcmlzY3Zfdl92c3RhdGVfc2F2ZShzdHJ1Y3QgX19yaXNj dl92X2V4dF9zdGF0ZSAqc2F2ZV90bywKPiA+Cj4gPiAgICAgICAgIHJpc2N2X3ZfZW5hYmxlKCk7 Cj4gPiAgICAgICAgIF9fdnN0YXRlX2Nzcl9zYXZlKHNhdmVfdG8pOwo+ID4gLSAgICAgICBhc20g dm9sYXRpbGUgKAo+ID4gLSAgICAgICAgICAgICAgICIub3B0aW9uIHB1c2hcblx0Igo+ID4gLSAg ICAgICAgICAgICAgICIub3B0aW9uIGFyY2gsICt2XG5cdCIKPiA+IC0gICAgICAgICAgICAgICAi dnNldHZsaSAgICAgICAgJTAsIHgwLCBlOCwgbTgsIHRhLCBtYVxuXHQiCj4gPiAtICAgICAgICAg ICAgICAgInZzZTgudiAgICAgICAgIHYwLCAoJTEpXG5cdCIKPiA+IC0gICAgICAgICAgICAgICAi YWRkICAgICAgICAgICAgJTEsICUxLCAlMFxuXHQiCj4gPiAtICAgICAgICAgICAgICAgInZzZTgu diAgICAgICAgIHY4LCAoJTEpXG5cdCIKPiA+IC0gICAgICAgICAgICAgICAiYWRkICAgICAgICAg ICAgJTEsICUxLCAlMFxuXHQiCj4gPiAtICAgICAgICAgICAgICAgInZzZTgudiAgICAgICAgIHYx NiwgKCUxKVxuXHQiCj4gPiAtICAgICAgICAgICAgICAgImFkZCAgICAgICAgICAgICUxLCAlMSwg JTBcblx0Igo+ID4gLSAgICAgICAgICAgICAgICJ2c2U4LnYgICAgICAgICB2MjQsICglMSlcblx0 Igo+ID4gLSAgICAgICAgICAgICAgICIub3B0aW9uIHBvcFxuXHQiCj4gPiAtICAgICAgICAgICAg ICAgOiAiPSZyIiAodmwpIDogInIiIChkYXRhcCkgOiAibWVtb3J5Iik7Cj4gPiArICAgICAgIGlm IChoYXNfeHRoZWFkdmVjdG9yKCkpIHsKPiA+ICsgICAgICAgICAgICAgICBhc20gdm9sYXRpbGUg KAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgIm12IHQwLCAlMFxuXHQiCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICBUSEVBRF9WU0VUVkxJX1Q0WDBFOE04RDEKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIFRIRUFEX1ZTQl9WX1YwVDAKPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICJhZGQgICAgICAgICAgICB0MCwgdDAsIHQ0XG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgIFRIRUFEX1ZTQl9WX1YwVDAKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJhZGQgICAg ICAgICAgICB0MCwgdDAsIHQ0XG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIFRIRUFE X1ZTQl9WX1YwVDAKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJhZGQgICAgICAgICAgICB0 MCwgdDAsIHQ0XG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIFRIRUFEX1ZTQl9WX1Yw VDAKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIDogOiAiciIgKGRhdGFwKSA6ICJtZW1vcnki LCAidDAiLCAidDQiKTsKPiA+ICsgICAgICAgfSBlbHNlIHsKPiA+ICsgICAgICAgICAgICAgICBh c20gdm9sYXRpbGUgKAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRpb24gcHVzaFxu XHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiLm9wdGlvbiBhcmNoLCArdlxuXHQiCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAidnNldHZsaSAgICAgICAgJTAsIHgwLCBlOCwgbTgs IHRhLCBtYVxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAidnNlOC52ICAgICAgICAg djAsICglMSlcblx0Igo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgImFkZCAgICAgICAgICAg ICUxLCAlMSwgJTBcblx0Igo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgInZzZTgudiAgICAg ICAgIHY4LCAoJTEpXG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJhZGQgICAgICAg ICAgICAlMSwgJTEsICUwXG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJ2c2U4LnYg ICAgICAgICB2MTYsICglMSlcblx0Igo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgImFkZCAg ICAgICAgICAgICUxLCAlMSwgJTBcblx0Igo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgInZz ZTgudiAgICAgICAgIHYyNCwgKCUxKVxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAi Lm9wdGlvbiBwb3Bcblx0Igo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgOiAiPSZyIiAodmwp IDogInIiIChkYXRhcCkgOiAibWVtb3J5Iik7Cj4gPiArICAgICAgIH0KPiA+ICAgICAgICAgcmlz Y3Zfdl9kaXNhYmxlKCk7Cj4gPiAgfQo+ID4KPiA+IEBAIC0xMjksNTUgKzI1Miw3NyBAQCBzdGF0 aWMgaW5saW5lIHZvaWQgX19yaXNjdl92X3ZzdGF0ZV9yZXN0b3JlKHN0cnVjdCBfX3Jpc2N2X3Zf ZXh0X3N0YXRlICpyZXN0b3JlXwo+ID4gICAgICAgICB1bnNpZ25lZCBsb25nIHZsOwo+ID4KPiA+ ICAgICAgICAgcmlzY3Zfdl9lbmFibGUoKTsKPiA+IC0gICAgICAgYXNtIHZvbGF0aWxlICgKPiA+ IC0gICAgICAgICAgICAgICAiLm9wdGlvbiBwdXNoXG5cdCIKPiA+IC0gICAgICAgICAgICAgICAi Lm9wdGlvbiBhcmNoLCArdlxuXHQiCj4gPiAtICAgICAgICAgICAgICAgInZzZXR2bGkgICAgICAg ICUwLCB4MCwgZTgsIG04LCB0YSwgbWFcblx0Igo+ID4gLSAgICAgICAgICAgICAgICJ2bGU4LnYg ICAgICAgICB2MCwgKCUxKVxuXHQiCj4gPiAtICAgICAgICAgICAgICAgImFkZCAgICAgICAgICAg ICUxLCAlMSwgJTBcblx0Igo+ID4gLSAgICAgICAgICAgICAgICJ2bGU4LnYgICAgICAgICB2OCwg KCUxKVxuXHQiCj4gPiAtICAgICAgICAgICAgICAgImFkZCAgICAgICAgICAgICUxLCAlMSwgJTBc blx0Igo+ID4gLSAgICAgICAgICAgICAgICJ2bGU4LnYgICAgICAgICB2MTYsICglMSlcblx0Igo+ ID4gLSAgICAgICAgICAgICAgICJhZGQgICAgICAgICAgICAlMSwgJTEsICUwXG5cdCIKPiA+IC0g ICAgICAgICAgICAgICAidmxlOC52ICAgICAgICAgdjI0LCAoJTEpXG5cdCIKPiA+IC0gICAgICAg ICAgICAgICAiLm9wdGlvbiBwb3Bcblx0Igo+ID4gLSAgICAgICAgICAgICAgIDogIj0mciIgKHZs KSA6ICJyIiAoZGF0YXApIDogIm1lbW9yeSIpOwo+ID4gKyAgICAgICBpZiAoaGFzX3h0aGVhZHZl Y3RvcigpKSB7Cj4gPiArICAgICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICJtdiB0MCwgJTBcblx0Igo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgVEhFQURfVlNFVFZMSV9UNFgwRThNOEQxCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBU SEVBRF9WTEJfVl9WMFQwCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiYWRkICAgICAgICAg ICAgdDAsIHQwLCB0NFxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBUSEVBRF9WTEJf Vl9WMFQwCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiYWRkICAgICAgICAgICAgdDAsIHQw LCB0NFxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBUSEVBRF9WTEJfVl9WMFQwCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAiYWRkICAgICAgICAgICAgdDAsIHQwLCB0NFxuXHQi Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBUSEVBRF9WTEJfVl9WMFQwCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICA6IDogInIiIChkYXRhcCkgOiAibWVtb3J5IiwgInQwIiwgInQ0Iik7 Cj4gPiArICAgICAgIH0gZWxzZSB7Cj4gPiArICAgICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgK PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uIHB1c2hcblx0Igo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgIi5vcHRpb24gYXJjaCwgK3Zcblx0Igo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgInZzZXR2bGkgICAgICAgICUwLCB4MCwgZTgsIG04LCB0YSwgbWFcblx0Igo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgInZsZTgudiAgICAgICAgIHYwLCAoJTEpXG5cdCIK PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJhZGQgICAgICAgICAgICAlMSwgJTEsICUwXG5c dCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJ2bGU4LnYgICAgICAgICB2OCwgKCUxKVxu XHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiYWRkICAgICAgICAgICAgJTEsICUxLCAl MFxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAidmxlOC52ICAgICAgICAgdjE2LCAo JTEpXG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJhZGQgICAgICAgICAgICAlMSwg JTEsICUwXG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJ2bGU4LnYgICAgICAgICB2 MjQsICglMSlcblx0Igo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRpb24gcG9wXG5c dCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIDogIj0mciIgKHZsKSA6ICJyIiAoZGF0YXAp IDogIm1lbW9yeSIpOwo+ID4gKyAgICAgICB9Cj4gPiAgICAgICAgIF9fdnN0YXRlX2Nzcl9yZXN0 b3JlKHJlc3RvcmVfZnJvbSk7Cj4gPiAgICAgICAgIHJpc2N2X3ZfZGlzYWJsZSgpOwo+ID4gIH0K PiA+Cj4gPiAgc3RhdGljIGlubGluZSB2b2lkIF9fcmlzY3Zfdl92c3RhdGVfZGlzY2FyZCh2b2lk KQo+ID4gIHsKPiA+IC0gICAgICAgdW5zaWduZWQgbG9uZyB2bCwgdnR5cGVfaW52YWwgPSAxVUwg PDwgKEJJVFNfUEVSX0xPTkcgLSAxKTsKPiA+ICsgICAgICAgdW5zaWduZWQgbG9uZyB2dHlwZV9p bnZhbCA9IDFVTCA8PCAoQklUU19QRVJfTE9ORyAtIDEpOwo+ID4KPiA+ICAgICAgICAgcmlzY3Zf dl9lbmFibGUoKTsKPiA+ICsgICAgICAgaWYgKGhhc194dGhlYWR2ZWN0b3IoKSkKPiA+ICsgICAg ICAgICAgICAgICBhc20gdm9sYXRpbGUgKFRIRUFEX1ZTRVRWTElfWDBYMEU4TThEMSk7Cj4gPiAr ICAgICAgIGVsc2UKPiA+ICsgICAgICAgICAgICAgICBhc20gdm9sYXRpbGUgKAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgIi5vcHRpb24gcHVzaFxuXHQiCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAiLm9wdGlvbiBhcmNoLCArdlxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAidnNldHZsaSAgICAgICAgeDAsIHgwLCBlOCwgbTgsIHRhLCBtYVxuXHQiCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAiLm9wdGlvbiBwb3Bcblx0Iik7Cj4gPiArCj4gPiAgICAgICAgIGFz bSB2b2xhdGlsZSAoCj4gPiAgICAgICAgICAgICAgICAgIi5vcHRpb24gcHVzaFxuXHQiCj4gPiAg ICAgICAgICAgICAgICAgIi5vcHRpb24gYXJjaCwgK3Zcblx0Igo+ID4gLSAgICAgICAgICAgICAg ICJ2c2V0dmxpICAgICAgICAlMCwgeDAsIGU4LCBtOCwgdGEsIG1hXG5cdCIKPiA+ICAgICAgICAg ICAgICAgICAidm12LnYuaSAgICAgICAgdjAsIC0xXG5cdCIKPiA+ICAgICAgICAgICAgICAgICAi dm12LnYuaSAgICAgICAgdjgsIC0xXG5cdCIKPiA+ICAgICAgICAgICAgICAgICAidm12LnYuaSAg ICAgICAgdjE2LCAtMVxuXHQiCj4gPiAgICAgICAgICAgICAgICAgInZtdi52LmkgICAgICAgIHYy NCwgLTFcblx0Igo+ID4gLSAgICAgICAgICAgICAgICJ2c2V0dmwgICAgICAgICAlMCwgeDAsICUx XG5cdCIKPiA+ICsgICAgICAgICAgICAgICAidnNldHZsICAgICAgICAgeDAsIHgwLCAlMFxuXHQi Cj4gPiAgICAgICAgICAgICAgICAgIi5vcHRpb24gcG9wXG5cdCIKPiA+IC0gICAgICAgICAgICAg ICA6ICI9JnIiICh2bCkgOiAiciIgKHZ0eXBlX2ludmFsKSA6ICJtZW1vcnkiKTsKPiA+ICsgICAg ICAgICAgICAgICA6IDogInIiICh2dHlwZV9pbnZhbCkpOwo+ID4gKwo+ID4gICAgICAgICByaXNj dl92X2Rpc2FibGUoKTsKPiA+ICB9Cj4gPgo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCByaXNjdl92 X3ZzdGF0ZV9kaXNjYXJkKHN0cnVjdCBwdF9yZWdzICpyZWdzKQo+ID4gIHsKPiA+IC0gICAgICAg aWYgKChyZWdzLT5zdGF0dXMgJiBTUl9WUykgPT0gU1JfVlNfT0ZGKQo+ID4gLSAgICAgICAgICAg ICAgIHJldHVybjsKPiA+IC0KPiA+IC0gICAgICAgX19yaXNjdl92X3ZzdGF0ZV9kaXNjYXJkKCk7 Cj4gPiAtICAgICAgIF9fcmlzY3Zfdl92c3RhdGVfZGlydHkocmVncyk7Cj4gPiArICAgICAgIGlm IChyaXNjdl92X3ZzdGF0ZV9xdWVyeShyZWdzKSkgewo+ID4gKyAgICAgICAgICAgICAgIF9fcmlz Y3Zfdl92c3RhdGVfZGlzY2FyZCgpOwo+ID4gKyAgICAgICAgICAgICAgIF9fcmlzY3Zfdl92c3Rh dGVfZGlydHkocmVncyk7Cj4gPiArICAgICAgIH0KPiA+ICB9Cj4gPgo+ID4gIHN0YXRpYyBpbmxp bmUgdm9pZCByaXNjdl92X3ZzdGF0ZV9zYXZlKHN0cnVjdCBfX3Jpc2N2X3ZfZXh0X3N0YXRlICp2 c3RhdGUsCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qg cHRfcmVncyAqcmVncykKPiA+ICB7Cj4gPiAtICAgICAgIGlmICgocmVncy0+c3RhdHVzICYgU1Jf VlMpID09IFNSX1ZTX0RJUlRZKSB7Cj4gPiArICAgICAgIGlmIChfX3Jpc2N2X3ZfdnN0YXRlX2No ZWNrKHJlZ3MtPnN0YXR1cywgRElSVFkpKSB7Cj4gPiAgICAgICAgICAgICAgICAgX19yaXNjdl92 X3ZzdGF0ZV9zYXZlKHZzdGF0ZSwgdnN0YXRlLT5kYXRhcCk7Cj4gPiAgICAgICAgICAgICAgICAg X19yaXNjdl92X3ZzdGF0ZV9jbGVhbihyZWdzKTsKPiA+ICAgICAgICAgfQo+ID4gQEAgLTE4Niw3 ICszMzEsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgcmlzY3Zfdl92c3RhdGVfc2F2ZShzdHJ1Y3Qg X19yaXNjdl92X2V4dF9zdGF0ZSAqdnN0YXRlLAo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCByaXNj dl92X3ZzdGF0ZV9yZXN0b3JlKHN0cnVjdCBfX3Jpc2N2X3ZfZXh0X3N0YXRlICp2c3RhdGUsCj4g PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHRfcmVn cyAqcmVncykKPiA+ICB7Cj4gPiAtICAgICAgIGlmICgocmVncy0+c3RhdHVzICYgU1JfVlMpICE9 IFNSX1ZTX09GRikgewo+ID4gKyAgICAgICBpZiAocmlzY3Zfdl92c3RhdGVfcXVlcnkocmVncykp IHsKPiA+ICAgICAgICAgICAgICAgICBfX3Jpc2N2X3ZfdnN0YXRlX3Jlc3RvcmUodnN0YXRlLCB2 c3RhdGUtPmRhdGFwKTsKPiA+ICAgICAgICAgICAgICAgICBfX3Jpc2N2X3ZfdnN0YXRlX2NsZWFu KHJlZ3MpOwo+ID4gICAgICAgICB9Cj4gPiBAQCAtMTk1LDcgKzM0MCw3IEBAIHN0YXRpYyBpbmxp bmUgdm9pZCByaXNjdl92X3ZzdGF0ZV9yZXN0b3JlKHN0cnVjdCBfX3Jpc2N2X3ZfZXh0X3N0YXRl ICp2c3RhdGUsCj4gPiAgc3RhdGljIGlubGluZSB2b2lkIHJpc2N2X3ZfdnN0YXRlX3NldF9yZXN0 b3JlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKPiA+ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKPiA+ICB7Cj4gPiAt ICAgICAgIGlmICgocmVncy0+c3RhdHVzICYgU1JfVlMpICE9IFNSX1ZTX09GRikgewo+ID4gKyAg ICAgICBpZiAocmlzY3Zfdl92c3RhdGVfcXVlcnkocmVncykpIHsKPiA+ICAgICAgICAgICAgICAg ICBzZXRfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9SSVNDVl9WX0RFRkVSX1JFU1RPUkUpOwo+ ID4gICAgICAgICAgICAgICAgIHJpc2N2X3ZfdnN0YXRlX29uKHJlZ3MpOwo+ID4gICAgICAgICB9 Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rZXJuZWwvY3B1ZmVhdHVyZS5jIGIvYXJjaC9y aXNjdi9rZXJuZWwvY3B1ZmVhdHVyZS5jCj4gPiBpbmRleCAyOTkzMzE4YjhlYTIuLjQ0ZjAwMTdh OThkNSAxMDA2NDQKPiA+IC0tLSBhL2FyY2gvcmlzY3Yva2VybmVsL2NwdWZlYXR1cmUuYwo+ID4g KysrIGIvYXJjaC9yaXNjdi9rZXJuZWwvY3B1ZmVhdHVyZS5jCj4gPiBAQCAtNzgxLDcgKzc4MSw3 IEBAIHZvaWQgX19pbml0IHJpc2N2X2ZpbGxfaHdjYXAodm9pZCkKPiA+ICAgICAgICAgICAgICAg ICBlbGZfaHdjYXAgJj0gfkNPTVBBVF9IV0NBUF9JU0FfRjsKPiA+ICAgICAgICAgfQo+ID4KPiA+ IC0gICAgICAgaWYgKGVsZl9od2NhcCAmIENPTVBBVF9IV0NBUF9JU0FfVikgewo+ID4gKyAgICAg ICBpZiAoZWxmX2h3Y2FwICYgQ09NUEFUX0hXQ0FQX0lTQV9WIHx8IGhhc194dGhlYWR2ZWN0b3Jf bm9fYWx0ZXJuYXRpdmVzKCkpIHsKPiA+ICAgICAgICAgICAgICAgICByaXNjdl92X3NldHVwX3Zz aXplKCk7Cj4gPiAgICAgICAgICAgICAgICAgLyoKPiA+ICAgICAgICAgICAgICAgICAgKiBJU0Eg c3RyaW5nIGluIGRldmljZSB0cmVlIG1pZ2h0IGhhdmUgJ3YnIGZsYWcsIGJ1dAo+ID4gZGlmZiAt LWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL2tlcm5lbF9tb2RlX3ZlY3Rvci5jIGIvYXJjaC9yaXNj di9rZXJuZWwva2VybmVsX21vZGVfdmVjdG9yLmMKPiA+IGluZGV4IDZhZmU4MGM3ZjAzYS4uOTk5 NzJhNDhlODZiIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9yaXNjdi9rZXJuZWwva2VybmVsX21vZGVf dmVjdG9yLmMKPiA+ICsrKyBiL2FyY2gvcmlzY3Yva2VybmVsL2tlcm5lbF9tb2RlX3ZlY3Rvci5j Cj4gPiBAQCAtMTQzLDcgKzE0Myw3IEBAIHN0YXRpYyBpbnQgcmlzY3Zfdl9zdGFydF9rZXJuZWxf Y29udGV4dChib29sICppc19uZXN0ZWQpCj4gPgo+ID4gICAgICAgICAvKiBUcmFuc2ZlciB0aGUg b3duZXJzaGlwIG9mIFYgZnJvbSB1c2VyIHRvIGtlcm5lbCwgdGhlbiBzYXZlICovCj4gPiAgICAg ICAgIHJpc2N2X3Zfc3RhcnQoUklTQ1ZfUFJFRU1QVF9WIHwgUklTQ1ZfUFJFRU1QVF9WX0RJUlRZ KTsKPiA+IC0gICAgICAgaWYgKCh0YXNrX3B0X3JlZ3MoY3VycmVudCktPnN0YXR1cyAmIFNSX1ZT KSA9PSBTUl9WU19ESVJUWSkgewo+ID4gKyAgICAgICBpZiAoX19yaXNjdl92X3ZzdGF0ZV9jaGVj ayh0YXNrX3B0X3JlZ3MoY3VycmVudCktPnN0YXR1cywgRElSVFkpKSB7Cj4gPiAgICAgICAgICAg ICAgICAgdXZzdGF0ZSA9ICZjdXJyZW50LT50aHJlYWQudnN0YXRlOwo+ID4gICAgICAgICAgICAg ICAgIF9fcmlzY3Zfdl92c3RhdGVfc2F2ZSh1dnN0YXRlLCB1dnN0YXRlLT5kYXRhcCk7Cj4gPiAg ICAgICAgIH0KPiA+IEBAIC0xNjAsNyArMTYwLDcgQEAgYXNtbGlua2FnZSB2b2lkIHJpc2N2X3Zf Y29udGV4dF9uZXN0aW5nX3N0YXJ0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQo+ID4gICAgICAgICAg ICAgICAgIHJldHVybjsKPiA+Cj4gPiAgICAgICAgIGRlcHRoID0gcmlzY3Zfdl9jdHhfZ2V0X2Rl cHRoKCk7Cj4gPiAtICAgICAgIGlmIChkZXB0aCA9PSAwICYmIChyZWdzLT5zdGF0dXMgJiBTUl9W UykgPT0gU1JfVlNfRElSVFkpCj4gPiArICAgICAgIGlmIChkZXB0aCA9PSAwICYmIF9fcmlzY3Zf dl92c3RhdGVfY2hlY2socmVncy0+c3RhdHVzLCBESVJUWSkpCj4gPiAgICAgICAgICAgICAgICAg cmlzY3ZfcHJlZW1wdF92X3NldF9kaXJ0eSgpOwo+ID4KPiA+ICAgICAgICAgcmlzY3Zfdl9jdHhf ZGVwdGhfaW5jKCk7Cj4gPiBAQCAtMjA4LDcgKzIwOCw3IEBAIHZvaWQga2VybmVsX3ZlY3Rvcl9i ZWdpbih2b2lkKQo+ID4gIHsKPiA+ICAgICAgICAgYm9vbCBuZXN0ZWQgPSBmYWxzZTsKPiA+Cj4g PiAtICAgICAgIGlmIChXQVJOX09OKCFoYXNfdmVjdG9yKCkpKQo+ID4gKyAgICAgICBpZiAoV0FS Tl9PTighKGhhc192ZWN0b3IoKSB8fCBoYXNfeHRoZWFkdmVjdG9yKCkpKSkKPiA+ICAgICAgICAg ICAgICAgICByZXR1cm47Cj4gPgo+ID4gICAgICAgICBCVUdfT04oIW1heV91c2Vfc2ltZCgpKTsK PiA+IEBAIC0yMzYsNyArMjM2LDcgQEAgRVhQT1JUX1NZTUJPTF9HUEwoa2VybmVsX3ZlY3Rvcl9i ZWdpbik7Cj4gPiAgICovCj4gPiAgdm9pZCBrZXJuZWxfdmVjdG9yX2VuZCh2b2lkKQo+ID4gIHsK PiA+IC0gICAgICAgaWYgKFdBUk5fT04oIWhhc192ZWN0b3IoKSkpCj4gPiArICAgICAgIGlmIChX QVJOX09OKCEoaGFzX3ZlY3RvcigpIHx8IGhhc194dGhlYWR2ZWN0b3IoKSkpKQo+ID4gICAgICAg ICAgICAgICAgIHJldHVybjsKPiA+Cj4gPiAgICAgICAgIHJpc2N2X3ZfZGlzYWJsZSgpOwo+ID4g ZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcmlzY3Yva2Vy bmVsL3Byb2Nlc3MuYwo+ID4gaW5kZXggOTI5MjJkYmQ1YjVjLi5lYWJjYTg2ZmMzYzAgMTAwNjQ0 Cj4gPiAtLS0gYS9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmMKPiA+ICsrKyBiL2FyY2gvcmlz Y3Yva2VybmVsL3Byb2Nlc3MuYwo+ID4gQEAgLTE3OCw3ICsxNzgsNyBAQCB2b2lkIGZsdXNoX3Ro cmVhZCh2b2lkKQo+ID4gIHZvaWQgYXJjaF9yZWxlYXNlX3Rhc2tfc3RydWN0KHN0cnVjdCB0YXNr X3N0cnVjdCAqdHNrKQo+ID4gIHsKPiA+ICAgICAgICAgLyogRnJlZSB0aGUgdmVjdG9yIGNvbnRl eHQgb2YgZGF0YXAuICovCj4gPiAtICAgICAgIGlmIChoYXNfdmVjdG9yKCkpCj4gPiArICAgICAg IGlmIChoYXNfdmVjdG9yKCkgfHwgaGFzX3h0aGVhZHZlY3RvcigpKQo+ID4gICAgICAgICAgICAg ICAgIHJpc2N2X3ZfdGhyZWFkX2ZyZWUodHNrKTsKPiA+ICB9Cj4gPgo+ID4gQEAgLTIyNSw3ICsy MjUsNyBAQCBpbnQgY29weV90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjb25zdCBzdHJ1 Y3Qga2VybmVsX2Nsb25lX2FyZ3MgKmFyZ3MpCj4gPiAgICAgICAgICAgICAgICAgcC0+dGhyZWFk LnNbMF0gPSAwOwo+ID4gICAgICAgICB9Cj4gPiAgICAgICAgIHAtPnRocmVhZC5yaXNjdl92X2Zs YWdzID0gMDsKPiA+IC0gICAgICAgaWYgKGhhc192ZWN0b3IoKSkKPiA+ICsgICAgICAgaWYgKGhh c192ZWN0b3IoKSB8fCBoYXNfeHRoZWFkdmVjdG9yKCkpCj4gPiAgICAgICAgICAgICAgICAgcmlz Y3Zfdl90aHJlYWRfYWxsb2MocCk7Cj4gPiAgICAgICAgIHAtPnRocmVhZC5yYSA9ICh1bnNpZ25l ZCBsb25nKXJldF9mcm9tX2Zvcms7Cj4gPiAgICAgICAgIHAtPnRocmVhZC5zcCA9ICh1bnNpZ25l ZCBsb25nKWNoaWxkcmVnczsgLyoga2VybmVsIHNwICovCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9y aXNjdi9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3Jpc2N2L2tlcm5lbC9zaWduYWwuYwo+ID4gaW5k ZXggNTAxZTY2ZGViZjY5Li41ZDNiYThlNDY4MDcgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL3Jpc2N2 L2tlcm5lbC9zaWduYWwuYwo+ID4gKysrIGIvYXJjaC9yaXNjdi9rZXJuZWwvc2lnbmFsLmMKPiA+ IEBAIC0xODgsNyArMTg4LDcgQEAgc3RhdGljIGxvbmcgcmVzdG9yZV9zaWdjb250ZXh0KHN0cnVj dCBwdF9yZWdzICpyZWdzLAo+ID4KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAw Owo+ID4gICAgICAgICAgICAgICAgIGNhc2UgUklTQ1ZfVl9NQUdJQzoKPiA+IC0gICAgICAgICAg ICAgICAgICAgICAgIGlmICghaGFzX3ZlY3RvcigpIHx8ICFyaXNjdl92X3ZzdGF0ZV9xdWVyeShy ZWdzKSB8fAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaGFzX3ZlY3RvcigpIHx8 IGhhc194dGhlYWR2ZWN0b3IoKSkgfHwgIXJpc2N2X3ZfdnN0YXRlX3F1ZXJ5KHJlZ3MpIHx8Cj4g PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAhPSByaXNjdl92X3NjX3NpemUpCj4g PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4KPiA+ IEBAIC0yMTAsNyArMjEwLDcgQEAgc3RhdGljIHNpemVfdCBnZXRfcnRfZnJhbWVfc2l6ZShib29s IGNhbF9hbGwpCj4gPgo+ID4gICAgICAgICBmcmFtZV9zaXplID0gc2l6ZW9mKCpmcmFtZSk7Cj4g Pgo+ID4gLSAgICAgICBpZiAoaGFzX3ZlY3RvcigpKSB7Cj4gPiArICAgICAgIGlmIChoYXNfdmVj dG9yKCkgfHwgaGFzX3h0aGVhZHZlY3RvcigpKSB7Cj4gPiAgICAgICAgICAgICAgICAgaWYgKGNh bF9hbGwgfHwgcmlzY3Zfdl92c3RhdGVfcXVlcnkodGFza19wdF9yZWdzKGN1cnJlbnQpKSkKPiA+ ICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2NvbnRleHRfc2l6ZSArPSByaXNjdl92X3Nj X3NpemU7Cj4gPiAgICAgICAgIH0KPiA+IEBAIC0yODMsNyArMjgzLDcgQEAgc3RhdGljIGxvbmcg c2V0dXBfc2lnY29udGV4dChzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZSwKPiA+ICAg ICAgICAgaWYgKGhhc19mcHUoKSkKPiA+ICAgICAgICAgICAgICAgICBlcnIgfD0gc2F2ZV9mcF9z dGF0ZShyZWdzLCAmc2MtPnNjX2ZwcmVncyk7Cj4gPiAgICAgICAgIC8qIFNhdmUgdGhlIHZlY3Rv ciBzdGF0ZS4gKi8KPiA+IC0gICAgICAgaWYgKGhhc192ZWN0b3IoKSAmJiByaXNjdl92X3ZzdGF0 ZV9xdWVyeShyZWdzKSkKPiA+ICsgICAgICAgaWYgKChoYXNfdmVjdG9yKCkgfHwgaGFzX3h0aGVh ZHZlY3RvcigpKSAmJiByaXNjdl92X3ZzdGF0ZV9xdWVyeShyZWdzKSkKPiA+ICAgICAgICAgICAg ICAgICBlcnIgfD0gc2F2ZV92X3N0YXRlKHJlZ3MsICh2b2lkIF9fdXNlciAqKikmc2NfZXh0X3B0 cik7Cj4gPiAgICAgICAgIC8qIFdyaXRlIHplcm8gdG8gZnAtcmVzZXJ2ZWQgc3BhY2UgYW5kIGNo ZWNrIGl0IG9uIHJlc3RvcmVfc2lnY29udGV4dCAqLwo+ID4gICAgICAgICBlcnIgfD0gX19wdXRf dXNlcigwLCAmc2MtPnNjX2V4dGRlc2MucmVzZXJ2ZWQpOwo+ID4gZGlmZiAtLWdpdCBhL2FyY2gv cmlzY3Yva2VybmVsL3ZlY3Rvci5jIGIvYXJjaC9yaXNjdi9rZXJuZWwvdmVjdG9yLmMKPiA+IGlu ZGV4IGUwNDU4NmNkYjdmMC4uYzEyZWE0NTQ3ZGE2IDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9yaXNj di9rZXJuZWwvdmVjdG9yLmMKPiA+ICsrKyBiL2FyY2gvcmlzY3Yva2VybmVsL3ZlY3Rvci5jCj4g PiBAQCAtNjMsNyArNjMsNyBAQCBpbnQgcmlzY3Zfdl9zZXR1cF92c2l6ZSh2b2lkKQo+ID4KPiA+ ICB2b2lkIF9faW5pdCByaXNjdl92X3NldHVwX2N0eF9jYWNoZSh2b2lkKQo+ID4gIHsKPiA+IC0g ICAgICAgaWYgKCFoYXNfdmVjdG9yKCkpCj4gPiArICAgICAgIGlmICghKGhhc192ZWN0b3IoKSB8 fCBoYXNfeHRoZWFkdmVjdG9yKCkpKQo+ID4gICAgICAgICAgICAgICAgIHJldHVybjsKPiA+Cj4g PiAgICAgICAgIHJpc2N2X3ZfdXNlcl9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZV91c2VyY29w eSgicmlzY3ZfdmVjdG9yX2N0eCIsCj4gPiBAQCAtMTg0LDcgKzE4NCw4IEBAIGJvb2wgcmlzY3Zf dl9maXJzdF91c2VfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKPiA+ICAgICAgICAgdTMy IGluc24gPSAodTMyKXJlZ3MtPmJhZGFkZHI7Cj4gPgo+ID4gICAgICAgICAvKiBEbyBub3QgaGFu ZGxlIGlmIFYgaXMgbm90IHN1cHBvcnRlZCwgb3IgZGlzYWJsZWQgKi8KPiA+IC0gICAgICAgaWYg KCEoRUxGX0hXQ0FQICYgQ09NUEFUX0hXQ0FQX0lTQV9WKSkKPiA+ICsgICAgICAgaWYgKCEoRUxG X0hXQ0FQICYgQ09NUEFUX0hXQ0FQX0lTQV9WKSAmJgo+ID4gKyAgICAgICAgICAgIShoYXNfeHRo ZWFkdmVjdG9yKCkgJiYgcmlzY3Zfdl92c3RhdGVfY3RybF91c2VyX2FsbG93ZWQoKSkpCj4gPiAg ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwo+ID4KPiA+ICAgICAgICAgLyogSWYgViBoYXMg YmVlbiBlbmFibGVkIHRoZW4gaXQgaXMgbm90IHRoZSBmaXJzdC11c2UgdHJhcCAqLwo+ID4gQEAg LTIyMyw3ICsyMjQsNyBAQCB2b2lkIHJpc2N2X3ZfdnN0YXRlX2N0cmxfaW5pdChzdHJ1Y3QgdGFz a19zdHJ1Y3QgKnRzaykKPiA+ICAgICAgICAgYm9vbCBpbmhlcml0Owo+ID4gICAgICAgICBpbnQg Y3VyLCBuZXh0Owo+ID4KPiA+IC0gICAgICAgaWYgKCFoYXNfdmVjdG9yKCkpCj4gPiArICAgICAg IGlmICghKGhhc192ZWN0b3IoKSB8fCBoYXNfeHRoZWFkdmVjdG9yKCkpKQo+ID4gICAgICAgICAg ICAgICAgIHJldHVybjsKPiA+Cj4gPiAgICAgICAgIG5leHQgPSByaXNjdl92X2N0cmxfZ2V0X25l eHQodHNrKTsKPiA+IEBAIC0yNDUsNyArMjQ2LDcgQEAgdm9pZCByaXNjdl92X3ZzdGF0ZV9jdHJs X2luaXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCj4gPgo+ID4gIGxvbmcgcmlzY3Zfdl92c3Rh dGVfY3RybF9nZXRfY3VycmVudCh2b2lkKQo+ID4gIHsKPiA+IC0gICAgICAgaWYgKCFoYXNfdmVj dG9yKCkpCj4gPiArICAgICAgIGlmICghKGhhc192ZWN0b3IoKSB8fCBoYXNfeHRoZWFkdmVjdG9y KCkpKQo+ID4gICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4KPiA+ICAgICAgICAg cmV0dXJuIGN1cnJlbnQtPnRocmVhZC52c3RhdGVfY3RybCAmIFBSX1JJU0NWX1ZfVlNUQVRFX0NU UkxfTUFTSzsKPiA+IEBAIC0yNTYsNyArMjU3LDcgQEAgbG9uZyByaXNjdl92X3ZzdGF0ZV9jdHJs X3NldF9jdXJyZW50KHVuc2lnbmVkIGxvbmcgYXJnKQo+ID4gICAgICAgICBib29sIGluaGVyaXQ7 Cj4gPiAgICAgICAgIGludCBjdXIsIG5leHQ7Cj4gPgo+ID4gLSAgICAgICBpZiAoIWhhc192ZWN0 b3IoKSkKPiA+ICsgICAgICAgaWYgKCEoaGFzX3ZlY3RvcigpIHx8IGhhc194dGhlYWR2ZWN0b3Io KSkpCj4gPiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gPgo+ID4gICAgICAgICBp ZiAoYXJnICYgflBSX1JJU0NWX1ZfVlNUQVRFX0NUUkxfTUFTSykKPiA+IEBAIC0zMDYsNyArMzA3 LDcgQEAgc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgcmlzY3Zfdl9kZWZhdWx0X3ZzdGF0ZV90YWJs ZVtdID0gewo+ID4KPiA+ICBzdGF0aWMgaW50IF9faW5pdCByaXNjdl92X3N5c2N0bF9pbml0KHZv aWQpCj4gPiAgewo+ID4gLSAgICAgICBpZiAoaGFzX3ZlY3RvcigpKQo+ID4gKyAgICAgICBpZiAo aGFzX3ZlY3RvcigpIHx8IGhhc194dGhlYWR2ZWN0b3IoKSkKPiA+ICAgICAgICAgICAgICAgICBp ZiAoIXJlZ2lzdGVyX3N5c2N0bCgiYWJpIiwgcmlzY3Zfdl9kZWZhdWx0X3ZzdGF0ZV90YWJsZSkp Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPiA+ICAgICAgICAg cmV0dXJuIDA7Cj4gPgo+ID4gLS0KPiA+IDIuNDQuMAo+ID4KPiA+Cj4gPiBfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+ID4gbGludXgtcmlzY3YgbWFpbGlu ZyBsaXN0Cj4gPiBsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnCj4gPiBodHRwOi8vbGlz dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cj4gCj4gQ2hlZXJz LAo+IEFuZHkKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CmxpbnV4LXJpc2N2IG1haWxpbmcgbGlzdApsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3Jn Cmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtcmlzY3YK 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 4C19BC25B10 for ; Mon, 13 May 2024 16:56:58 +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=v5N701YbuZp8Q9k1gHGzjK1bXWeFsZGjJ3Tt8DkSvQ8=; b=TvZAStMGcOxHhD 4bhcuYeMrsfLMu9ZXG+9SDmmROsrMUgtXmq6wxl8WG+BQHzZA3xLOYgvqnWGUAuo49+Bq/YxtoxAZ vpeeP1hc1zQUV1V50aFli5NPaBd0G3KoMPPx3rlZsIN+OAwAZpxWGntt+DbC7rRQx9ZIbghzatYsG fDHeHOD0wi6IroaC/Ow72Y1RNL04jzLWR8oO87DsnLeRmjWPFdfSlqt+VviWZ6SNQZoEsFZUXQPm5 +w8elEuZfrlFF+hJnFjZf/pC2HQ6zkg00chew7gd1gZPpjOn1V1KfbABEgeOjtVzl3NRO7EYfzFZh 60D+I2IF6pYsMCdqpy+w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1s6Yyk-0000000DdNe-2W7E; Mon, 13 May 2024 16:56:46 +0000 Received: from mail-pf1-x433.google.com ([2607:f8b0:4864:20::433]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1s6Yye-0000000DdK9-2ce3 for linux-arm-kernel@lists.infradead.org; Mon, 13 May 2024 16:56:43 +0000 Received: by mail-pf1-x433.google.com with SMTP id d2e1a72fcca58-6f44dd41a5cso4649364b3a.0 for ; Mon, 13 May 2024 09:56:39 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=rivosinc-com.20230601.gappssmtp.com; s=20230601; t=1715619398; x=1716224198; 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=VK8vYit8+gdtU6flQEkqpwhK6a5E14jjPOZSmkE0mPU=; b=IXdz30ffZyi5sLTfuM8hvs7qdpBO45SrmGZTMFqTqZM2yP18oNd76hXROGRT9EeiN5 aj12ZS1cgz3n6/EheYzGsVodXzSAktvwtDuGNND7E8pxJSdopOGOu0iEzYtarK/A9XPp pjtyW+1QI9vXUi5f4ytlBmLR3RdzK4/dxT4Z3UUDCUcsJZSY6VPlFzDIvSR4yNBIouIE SsdNnKXKk3bIzd9W4Zl8RI4vC2oH/LCOGOF8BaYQflteA1ca7JrOYzPBV+ixCvhpfDKM pp0YlVXzxzgdnKSP9/cvFIRTCgn00BrmhdtZBnsc94kslYzqSx6ndXed4d2/Il1gWnhb bFGA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715619398; x=1716224198; 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=VK8vYit8+gdtU6flQEkqpwhK6a5E14jjPOZSmkE0mPU=; b=i1ZWKYj3M/D8n0xPbnrL4FonARyBZSFWihL0gMH9erLffxeR/feTXEU1FbbOCVwmwI vqbJVpDyV9MlOR3g+YqtT3un8HiyBYcqG/R/hzg6w6Nd6iYS3Yv5+XTkTy8dXYItNvXd dAE9SbuZNFM33vH0nvWL8JI+w83qZikfG4owdRxAR7ECrYBzFz21Qr2L7LJBzilHggfk WDWCt9+u/hXWIohYr/jJYi39TQ88sepOQOP7vAtdv4jCC8CiShD6vlFucTHooFiwUnn2 /i38lzP9y4Kbbelq9UWCUb3OzIq3iXabmexsSbGLzWKtj7bC7+ViOkdbrBdrcXPJLxlI nYnA== X-Forwarded-Encrypted: i=1; AJvYcCVMhR0miV8s3nWFwjFqmVmSvb0KwdxoD5rLeLd5eFuK+sU2gPwlx4eapA4k4z6MVR7vAtxIi0hvlzxKD9ROoPcUHHgr0oW28P9Np9kBsBtIL4bqtek= X-Gm-Message-State: AOJu0Yx4bDNNsRMvz5Gv/9Bjkwr8Ex8tKim/I62u2+A5yRNgo5r+af/F QcEZpaDdoMUtym0cKapO3MVg8pD7oyxRpc+af/IpYrIBIAUvCOx/lcVAECf+Es0= X-Google-Smtp-Source: AGHT+IHajz6ulNGvu1i/yT1eA7FdMl4NaAuxDNWOd+7lvJAt6WrPn9Bnm6rDLbkRgAASe47XyhLGBg== X-Received: by 2002:a05:6a20:7350:b0:1af:a72e:8b7e with SMTP id adf61e73a8af0-1afde1b6f32mr13102711637.50.1715619397966; Mon, 13 May 2024 09:56:37 -0700 (PDT) Received: from ghost ([2601:647:5700:6860:3a68:91f5:da04:ef09]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-6f4d2a87bb1sm7592789b3a.87.2024.05.13.09.56.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 13 May 2024 09:56:37 -0700 (PDT) Date: Mon, 13 May 2024 09:56:31 -0700 From: Charlie Jenkins To: Andy Chiu Cc: Conor Dooley , Rob Herring , Krzysztof Kozlowski , Paul Walmsley , Palmer Dabbelt , Albert Ou , Guo Ren , Conor Dooley , Chen-Yu Tsai , Jernej Skrabec , Samuel Holland , Conor Dooley , Evan Green , =?iso-8859-1?Q?Cl=E9ment_L=E9ger?= , Jonathan Corbet , Shuah Khan , linux-riscv@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, Palmer Dabbelt , linux-arm-kernel@lists.infradead.org, linux-sunxi@lists.linux.dev, linux-doc@vger.kernel.org, linux-kselftest@vger.kernel.org Subject: Re: [PATCH v6 13/17] riscv: vector: Support xtheadvector save/restore Message-ID: References: <20240503-dev-charlie-support_thead_vector_6_9-v6-0-cb7624e65d82@rivosinc.com> <20240503-dev-charlie-support_thead_vector_6_9-v6-13-cb7624e65d82@rivosinc.com> 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-20240513_095640_825908_DFFA2D3A X-CRM114-Status: GOOD ( 39.55 ) X-BeenThere: linux-arm-kernel@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-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gTW9uLCBNYXkgMTMsIDIwMjQgYXQgMDQ6NDU6MThQTSArMDgwMCwgQW5keSBDaGl1IHdyb3Rl Ogo+IEhpIENoYXJsaWUsCj4gCj4gU29ycnksIEkgYW0gbGF0ZSBvbiB0aGlzLiBJIGhhdmVuJ3Qg bG9va2VkIHRocm91Z2ggdGhlIGVudGlyZSBzZXJpZXMKPiB5ZXQsIGJ1dCBoZXJlIGlzIHNvbWV0 aGluZyB0aGF0IEkgdGhvdWdodCB3b3J0aCBicmluZ2luZyB1cCBzb29uZXIuCj4gCj4gT24gU2F0 LCBNYXkgNCwgMjAyNCBhdCAyOjIy4oCvQU0gQ2hhcmxpZSBKZW5raW5zIDxjaGFybGllQHJpdm9z aW5jLmNvbT4gd3JvdGU6Cj4gPgo+ID4gVXNlIGFsdGVybmF0aXZlcyB0byBhZGQgc3VwcG9ydCBm b3IgeHRoZWFkdmVjdG9yIHZlY3RvciBzYXZlL3Jlc3RvcmUKPiA+IHJvdXRpbmVzLgo+ID4KPiA+ IFNpZ25lZC1vZmYtYnk6IENoYXJsaWUgSmVua2lucyA8Y2hhcmxpZUByaXZvc2luYy5jb20+Cj4g PiAtLS0KPiA+ICBhcmNoL3Jpc2N2L0tjb25maWcudmVuZG9yICAgICAgICAgICAgICB8ICAxMyAr Kwo+ID4gIGFyY2gvcmlzY3YvaW5jbHVkZS9hc20vY3NyLmggICAgICAgICAgIHwgICA2ICsKPiA+ ICBhcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3N3aXRjaF90by5oICAgICB8ICAgMiArLQo+ID4gIGFy Y2gvcmlzY3YvaW5jbHVkZS9hc20vdmVjdG9yLmggICAgICAgIHwgMjQ3ICsrKysrKysrKysrKysr KysrKysrKysrKysrLS0tLS0tLQo+ID4gIGFyY2gvcmlzY3Yva2VybmVsL2NwdWZlYXR1cmUuYyAg ICAgICAgIHwgICAyICstCj4gPiAgYXJjaC9yaXNjdi9rZXJuZWwva2VybmVsX21vZGVfdmVjdG9y LmMgfCAgIDggKy0KPiA+ICBhcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmMgICAgICAgICAgICB8 ICAgNCArLQo+ID4gIGFyY2gvcmlzY3Yva2VybmVsL3NpZ25hbC5jICAgICAgICAgICAgIHwgICA2 ICstCj4gPiAgYXJjaC9yaXNjdi9rZXJuZWwvdmVjdG9yLmMgICAgICAgICAgICAgfCAgMTMgKy0K PiA+ICA5IGZpbGVzIGNoYW5nZWQsIDIzMyBpbnNlcnRpb25zKCspLCA2OCBkZWxldGlvbnMoLSkK PiA+Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9LY29uZmlnLnZlbmRvciBiL2FyY2gvcmlz Y3YvS2NvbmZpZy52ZW5kb3IKPiA+IGluZGV4IGFhNWExOTFlNjU5ZS4uZWRmNDlmMzA2NWFjIDEw MDY0NAo+ID4gLS0tIGEvYXJjaC9yaXNjdi9LY29uZmlnLnZlbmRvcgo+ID4gKysrIGIvYXJjaC9y aXNjdi9LY29uZmlnLnZlbmRvcgo+ID4gQEAgLTEzLDYgKzEzLDE5IEBAIGNvbmZpZyBSSVNDVl9J U0FfVkVORE9SX0VYVF9USEVBRAo+ID4gICAgICAgICAgIGV4dGVuc2lvbnMuIFdpdGhvdXQgdGhp cyBvcHRpb24gZW5hYmxlZCwgVC1IZWFkIHZlbmRvciBleHRlbnNpb25zIHdpbGwKPiA+ICAgICAg ICAgICBub3QgYmUgZGV0ZWN0ZWQgYXQgYm9vdCBhbmQgdGhlaXIgcHJlc2VuY2Ugbm90IHJlcG9y dGVkIHRvIHVzZXJzcGFjZS4KPiA+Cj4gPiArICAgICAgICAgSWYgeW91IGRvbid0IGtub3cgd2hh dCB0byBkbyBoZXJlLCBzYXkgWS4KPiA+ICsKPiA+ICtjb25maWcgUklTQ1ZfSVNBX1hUSEVBRFZF Q1RPUgo+ID4gKyAgICAgICBib29sICJ4dGhlYWR2ZWN0b3IgZXh0ZW5zaW9uIHN1cHBvcnQiCj4g PiArICAgICAgIGRlcGVuZHMgb24gUklTQ1ZfSVNBX1ZFTkRPUl9FWFRfVEhFQUQKPiA+ICsgICAg ICAgZGVwZW5kcyBvbiBSSVNDVl9JU0FfVgo+ID4gKyAgICAgICBkZXBlbmRzIG9uIEZQVQo+ID4g KyAgICAgICBkZWZhdWx0IHkKPiA+ICsgICAgICAgaGVscAo+ID4gKyAgICAgICAgIFNheSBOIGhl cmUgaWYgeW91IHdhbnQgdG8gZGlzYWJsZSBhbGwgeHRoZWFkdmVjdG9yIHJlbGF0ZWQgcHJvY2Vk dXJlCj4gPiArICAgICAgICAgaW4gdGhlIGtlcm5lbC4gVGhpcyB3aWxsIGRpc2FibGUgdmVjdG9y IGZvciBhbnkgVC1IZWFkIGJvYXJkIHRoYXQKPiA+ICsgICAgICAgICBjb250YWlucyB4dGhlYWR2 ZWN0b3IgcmF0aGVyIHRoYW4gdGhlIHN0YW5kYXJkIHZlY3Rvci4KPiA+ICsKPiA+ICAgICAgICAg ICBJZiB5b3UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGhlcmUsIHNheSBZLgo+ID4gIGVuZG1lbnUK PiA+Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9jc3IuaCBiL2FyY2gv cmlzY3YvaW5jbHVkZS9hc20vY3NyLmgKPiA+IGluZGV4IGU1YTM1ZWZkNTZlMC4uMTM2NTdkMDk2 ZTdkIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9jc3IuaAo+ID4gKysr IGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9jc3IuaAo+ID4gQEAgLTMwLDYgKzMwLDEyIEBACj4g PiAgI2RlZmluZSBTUl9WU19DTEVBTiAgICBfQUMoMHgwMDAwMDQwMCwgVUwpCj4gPiAgI2RlZmlu ZSBTUl9WU19ESVJUWSAgICBfQUMoMHgwMDAwMDYwMCwgVUwpCj4gPgo+ID4gKyNkZWZpbmUgU1Jf VlNfVEhFQUQgICAgICAgICAgICBfQUMoMHgwMTgwMDAwMCwgVUwpIC8qIHh0aGVhZHZlY3RvciBT dGF0dXMgKi8KPiA+ICsjZGVmaW5lIFNSX1ZTX09GRl9USEVBRCAgICAgICAgICAgICAgICBfQUMo MHgwMDAwMDAwMCwgVUwpCj4gPiArI2RlZmluZSBTUl9WU19JTklUSUFMX1RIRUFEICAgIF9BQygw eDAwODAwMDAwLCBVTCkKPiA+ICsjZGVmaW5lIFNSX1ZTX0NMRUFOX1RIRUFEICAgICAgX0FDKDB4 MDEwMDAwMDAsIFVMKQo+ID4gKyNkZWZpbmUgU1JfVlNfRElSVFlfVEhFQUQgICAgICBfQUMoMHgw MTgwMDAwMCwgVUwpCj4gPiArCj4gPiAgI2RlZmluZSBTUl9YUyAgICAgICAgICBfQUMoMHgwMDAx ODAwMCwgVUwpIC8qIEV4dGVuc2lvbiBTdGF0dXMgKi8KPiA+ICAjZGVmaW5lIFNSX1hTX09GRiAg ICAgIF9BQygweDAwMDAwMDAwLCBVTCkKPiA+ICAjZGVmaW5lIFNSX1hTX0lOSVRJQUwgIF9BQygw eDAwMDA4MDAwLCBVTCkKPiA+IGRpZmYgLS1naXQgYS9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3N3 aXRjaF90by5oIGIvYXJjaC9yaXNjdi9pbmNsdWRlL2FzbS9zd2l0Y2hfdG8uaAo+ID4gaW5kZXgg N2VmZGIwNTg0ZDQ3Li5hZGE2YjVjZjJkOTQgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL3Jpc2N2L2lu Y2x1ZGUvYXNtL3N3aXRjaF90by5oCj4gPiArKysgYi9hcmNoL3Jpc2N2L2luY2x1ZGUvYXNtL3N3 aXRjaF90by5oCj4gPiBAQCAtNzgsNyArNzgsNyBAQCBkbyB7ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiAgICAgICAgIHN0cnVjdCB0YXNrX3N0 cnVjdCAqX19uZXh0ID0gKG5leHQpOyAgICAgICAgICAgIFwKPiA+ICAgICAgICAgaWYgKGhhc19m cHUoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4gICAgICAgICAgICAg ICAgIF9fc3dpdGNoX3RvX2ZwdShfX3ByZXYsIF9fbmV4dCk7ICAgICAgICBcCj4gPiAtICAgICAg IGlmIChoYXNfdmVjdG9yKCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAo+ID4gKyAgICAgICBpZiAoaGFzX3ZlY3RvcigpIHx8IGhhc194dGhlYWR2ZWN0b3IoKSkgICAg ICAgICBcCj4gPiAgICAgICAgICAgICAgICAgX19zd2l0Y2hfdG9fdmVjdG9yKF9fcHJldiwgX19u ZXh0KTsgICAgIFwKPiA+ICAgICAgICAgKChsYXN0KSA9IF9fc3dpdGNoX3RvKF9fcHJldiwgX19u ZXh0KSk7ICAgICAgICAgXAo+ID4gIH0gd2hpbGUgKDApCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9y aXNjdi9pbmNsdWRlL2FzbS92ZWN0b3IuaCBiL2FyY2gvcmlzY3YvaW5jbHVkZS9hc20vdmVjdG9y LmgKPiA+IGluZGV4IDczMWRjZDBlZDRkZS4uZGI4NTFkYzgxODcwIDEwMDY0NAo+ID4gLS0tIGEv YXJjaC9yaXNjdi9pbmNsdWRlL2FzbS92ZWN0b3IuaAo+ID4gKysrIGIvYXJjaC9yaXNjdi9pbmNs dWRlL2FzbS92ZWN0b3IuaAo+ID4gQEAgLTE4LDYgKzE4LDI3IEBACj4gPiAgI2luY2x1ZGUgPGFz bS9jcHVmZWF0dXJlLmg+Cj4gPiAgI2luY2x1ZGUgPGFzbS9jc3IuaD4KPiA+ICAjaW5jbHVkZSA8 YXNtL2FzbS5oPgo+ID4gKyNpbmNsdWRlIDxhc20vdmVuZG9yaWRfbGlzdC5oPgo+ID4gKyNpbmNs dWRlIDxhc20vdmVuZG9yX2V4dGVuc2lvbnMuaD4KPiA+ICsjaW5jbHVkZSA8YXNtL3ZlbmRvcl9l eHRlbnNpb25zL3RoZWFkLmg+Cj4gPiArCj4gPiArI2RlZmluZSBfX3Jpc2N2X3ZfdnN0YXRlX29y KF92YWwsIFRZUEUpICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAg IHR5cGVvZihfdmFsKSBfcmVzID0gX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCj4gPiArICAgICAgIGlmIChoYXNfeHRoZWFkdmVjdG9yKCkpIFwKPiA+ICsgICAg ICAgICAgICAgICBfcmVzID0gKF9yZXMgJiB+U1JfVlNfVEhFQUQpIHwgU1JfVlNfIyNUWVBFIyNf VEhFQUQ7ICAgIFwKPiA+ICsgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKPiA+ICsgICAgICAgICAgICAgICBfcmVz ID0gKF9yZXMgJiB+U1JfVlMpIHwgU1JfVlNfIyNUWVBFOyAgICAgICAgICAgICAgICAgIFwKPiA+ ICsgICAgICAgX3JlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKPiA+ICt9KQo+ID4gKwo+ID4gKyNkZWZpbmUgX19yaXNjdl92X3Zz dGF0ZV9jaGVjayhfdmFsLCBUWVBFKSAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAo+ID4g KyAgICAgICBib29sIF9yZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAo+ID4gKyAgICAgICBpZiAoaGFzX3h0aGVhZHZlY3RvcigpKSBcCj4g PiArICAgICAgICAgICAgICAgX3JlcyA9ICgoX3ZhbCkgJiBTUl9WU19USEVBRCkgPT0gU1JfVlNf IyNUWVBFIyNfVEhFQUQ7ICBcCj4gPiArICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArICAgICAgICAgICAg ICAgX3JlcyA9ICgoX3ZhbCkgJiBTUl9WUykgPT0gU1JfVlNfIyNUWVBFOyAgICAgICAgICAgICAg ICBcCj4gPiArICAgICAgIF9yZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCj4gPiArfSkKPiA+Cj4gPiAgZXh0ZXJuIHVuc2lnbmVk IGxvbmcgcmlzY3Zfdl92c2l6ZTsKPiA+ICBpbnQgcmlzY3Zfdl9zZXR1cF92c2l6ZSh2b2lkKTsK PiA+IEBAIC00MCwzOSArNjEsNjIgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSBib29sIGhhc192 ZWN0b3Iodm9pZCkKPiA+ICAgICAgICAgcmV0dXJuIHJpc2N2X2hhc19leHRlbnNpb25fdW5saWtl bHkoUklTQ1ZfSVNBX0VYVF92KTsKPiA+ICB9Cj4gPgo+ID4gK3N0YXRpYyBfX2Fsd2F5c19pbmxp bmUgYm9vbCBoYXNfeHRoZWFkdmVjdG9yX25vX2FsdGVybmF0aXZlcyh2b2lkKQo+ID4gK3sKPiA+ ICsgICAgICAgaWYgKElTX0VOQUJMRUQoQ09ORklHX1JJU0NWX0lTQV9YVEhFQURWRUNUT1IpKQo+ ID4gKyAgICAgICAgICAgICAgIHJldHVybiByaXNjdl9pc2FfdmVuZG9yX2V4dGVuc2lvbl9hdmFp bGFibGUoVEhFQURfVkVORE9SX0lELCBYVEhFQURWRUNUT1IpOwo+ID4gKyAgICAgICBlbHNlCj4g PiArICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwo+ID4gK30KPiA+ICsKPiA+ICtzdGF0aWMg X19hbHdheXNfaW5saW5lIGJvb2wgaGFzX3h0aGVhZHZlY3Rvcih2b2lkKQo+ID4gK3sKPiA+ICsg ICAgICAgaWYgKElTX0VOQUJMRUQoQ09ORklHX1JJU0NWX0lTQV9YVEhFQURWRUNUT1IpKQo+ID4g KyAgICAgICAgICAgICAgIHJldHVybiByaXNjdl9oYXNfdmVuZG9yX2V4dGVuc2lvbl91bmxpa2Vs eShUSEVBRF9WRU5ET1JfSUQsCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFJJU0NWX0lTQV9WRU5ET1JfRVhUX1hUSEVBRFZFQ1RP Uik7Cj4gPiArICAgICAgIGVsc2UKPiA+ICsgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Cj4g PiArfQo+ID4gKwo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jpc2N2X3ZfdnN0YXRlX2NsZWFu KHN0cnVjdCBwdF9yZWdzICpyZWdzKQo+ID4gIHsKPiA+IC0gICAgICAgcmVncy0+c3RhdHVzID0g KHJlZ3MtPnN0YXR1cyAmIH5TUl9WUykgfCBTUl9WU19DTEVBTjsKPiA+ICsgICAgICAgcmVncy0+ c3RhdHVzID0gX19yaXNjdl92X3ZzdGF0ZV9vcihyZWdzLT5zdGF0dXMsIENMRUFOKTsKPiA+ICB9 Cj4gPgo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jpc2N2X3ZfdnN0YXRlX2RpcnR5KHN0cnVj dCBwdF9yZWdzICpyZWdzKQo+ID4gIHsKPiA+IC0gICAgICAgcmVncy0+c3RhdHVzID0gKHJlZ3Mt PnN0YXR1cyAmIH5TUl9WUykgfCBTUl9WU19ESVJUWTsKPiA+ICsgICAgICAgcmVncy0+c3RhdHVz ID0gX19yaXNjdl92X3ZzdGF0ZV9vcihyZWdzLT5zdGF0dXMsIERJUlRZKTsKPiA+ICB9Cj4gPgo+ ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCByaXNjdl92X3ZzdGF0ZV9vZmYoc3RydWN0IHB0X3JlZ3Mg KnJlZ3MpCj4gPiAgewo+ID4gLSAgICAgICByZWdzLT5zdGF0dXMgPSAocmVncy0+c3RhdHVzICYg flNSX1ZTKSB8IFNSX1ZTX09GRjsKPiA+ICsgICAgICAgcmVncy0+c3RhdHVzID0gX19yaXNjdl92 X3ZzdGF0ZV9vcihyZWdzLT5zdGF0dXMsIE9GRik7Cj4gPiAgfQo+ID4KPiA+ICBzdGF0aWMgaW5s aW5lIHZvaWQgcmlzY3Zfdl92c3RhdGVfb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCj4gPiAgewo+ ID4gLSAgICAgICByZWdzLT5zdGF0dXMgPSAocmVncy0+c3RhdHVzICYgflNSX1ZTKSB8IFNSX1ZT X0lOSVRJQUw7Cj4gPiArICAgICAgIHJlZ3MtPnN0YXR1cyA9IF9fcmlzY3Zfdl92c3RhdGVfb3Io cmVncy0+c3RhdHVzLCBJTklUSUFMKTsKPiA+ICB9Cj4gPgo+ID4gIHN0YXRpYyBpbmxpbmUgYm9v bCByaXNjdl92X3ZzdGF0ZV9xdWVyeShzdHJ1Y3QgcHRfcmVncyAqcmVncykKPiA+ICB7Cj4gPiAt ICAgICAgIHJldHVybiAocmVncy0+c3RhdHVzICYgU1JfVlMpICE9IDA7Cj4gPiArICAgICAgIHJl dHVybiAhX19yaXNjdl92X3ZzdGF0ZV9jaGVjayhyZWdzLT5zdGF0dXMsIE9GRik7Cj4gPiAgfQo+ ID4KPiA+ICBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgcmlzY3Zfdl9lbmFibGUodm9pZCkK PiA+ICB7Cj4gPiAtICAgICAgIGNzcl9zZXQoQ1NSX1NTVEFUVVMsIFNSX1ZTKTsKPiA+ICsgICAg ICAgaWYgKGhhc194dGhlYWR2ZWN0b3IoKSkKPiA+ICsgICAgICAgICAgICAgICBjc3Jfc2V0KENT Ul9TU1RBVFVTLCBTUl9WU19USEVBRCk7Cj4gPiArICAgICAgIGVsc2UKPiA+ICsgICAgICAgICAg ICAgICBjc3Jfc2V0KENTUl9TU1RBVFVTLCBTUl9WUyk7Cj4gPiAgfQo+ID4KPiA+ICBzdGF0aWMg X19hbHdheXNfaW5saW5lIHZvaWQgcmlzY3Zfdl9kaXNhYmxlKHZvaWQpCj4gPiAgewo+ID4gLSAg ICAgICBjc3JfY2xlYXIoQ1NSX1NTVEFUVVMsIFNSX1ZTKTsKPiA+ICsgICAgICAgaWYgKGhhc194 dGhlYWR2ZWN0b3IoKSkKPiA+ICsgICAgICAgICAgICAgICBjc3JfY2xlYXIoQ1NSX1NTVEFUVVMs IFNSX1ZTX1RIRUFEKTsKPiA+ICsgICAgICAgZWxzZQo+ID4gKyAgICAgICAgICAgICAgIGNzcl9j bGVhcihDU1JfU1NUQVRVUywgU1JfVlMpOwo+ID4gIH0KPiA+Cj4gPiAgc3RhdGljIF9fYWx3YXlz X2lubGluZSB2b2lkIF9fdnN0YXRlX2Nzcl9zYXZlKHN0cnVjdCBfX3Jpc2N2X3ZfZXh0X3N0YXRl ICpkZXN0KQo+ID4gQEAgLTgxLDEwICsxMjUsNDcgQEAgc3RhdGljIF9fYWx3YXlzX2lubGluZSB2 b2lkIF9fdnN0YXRlX2Nzcl9zYXZlKHN0cnVjdCBfX3Jpc2N2X3ZfZXh0X3N0YXRlICpkZXN0KQo+ ID4gICAgICAgICAgICAgICAgICJjc3JyICAgJTAsICIgX19zdHJpbmdpZnkoQ1NSX1ZTVEFSVCkg IlxuXHQiCj4gPiAgICAgICAgICAgICAgICAgImNzcnIgICAlMSwgIiBfX3N0cmluZ2lmeShDU1Jf VlRZUEUpICJcblx0Igo+ID4gICAgICAgICAgICAgICAgICJjc3JyICAgJTIsICIgX19zdHJpbmdp ZnkoQ1NSX1ZMKSAiXG5cdCIKPiA+IC0gICAgICAgICAgICAgICAiY3NyciAgICUzLCAiIF9fc3Ry aW5naWZ5KENTUl9WQ1NSKSAiXG5cdCIKPiA+IC0gICAgICAgICAgICAgICAiY3NyciAgICU0LCAi IF9fc3RyaW5naWZ5KENTUl9WTEVOQikgIlxuXHQiCj4gPiAgICAgICAgICAgICAgICAgOiAiPXIi IChkZXN0LT52c3RhcnQpLCAiPXIiIChkZXN0LT52dHlwZSksICI9ciIgKGRlc3QtPnZsKSwKPiA+ IC0gICAgICAgICAgICAgICAgICI9ciIgKGRlc3QtPnZjc3IpLCAiPXIiIChkZXN0LT52bGVuYikg OiA6KTsKPiA+ICsgICAgICAgICAgICAgICAiPXIiIChkZXN0LT52Y3NyKSA6IDopOwo+ID4gKwo+ ID4gKyAgICAgICBpZiAoaGFzX3h0aGVhZHZlY3RvcigpKSB7Cj4gPiArICAgICAgICAgICAgICAg dTMyIHRtcF92Y3NyOwo+ID4gKyAgICAgICAgICAgICAgIGJvb2wgcmVzdG9yZV9mcHUgPSBmYWxz ZTsKPiA+ICsgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHN0YXR1cyA9IGNzcl9yZWFkKENT Ul9TU1RBVFVTKTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgICAvKgo+ID4gKyAgICAgICAgICAg ICAgICAqIENTUl9WQ1NSIGlzIGRlZmluZWQgYXMKPiA+ICsgICAgICAgICAgICAgICAgKiBbMjox XSAtIHZ4cm1bMTowXQo+ID4gKyAgICAgICAgICAgICAgICAqIFswXSAtIHZ4c2F0Cj4gPiArICAg ICAgICAgICAgICAgICogVGhlIGVhcmxpZXIgdmVjdG9yIHNwZWMgaW1wbGVtZW50ZWQgYnkgVC1I ZWFkIHVzZXMgc2VwYXJhdGUKPiA+ICsgICAgICAgICAgICAgICAgKiByZWdpc3RlcnMgZm9yIHRo ZSBzYW1lIGJpdC1lbGVtZW50cywgc28ganVzdCBjb21iaW5lIHRob3NlCj4gPiArICAgICAgICAg ICAgICAgICogaW50byB0aGUgZXhpc3Rpbmcgb3V0cHV0IGZpZWxkLgo+ID4gKyAgICAgICAgICAg ICAgICAqCj4gPiArICAgICAgICAgICAgICAgICogQWRkaXRpb25hbGx5IFQtSGVhZCBjb3JlcyBu ZWVkIEZTIHRvIGJlIGVuYWJsZWQgd2hlbiBhY2Nlc3NpbmcKPiA+ICsgICAgICAgICAgICAgICAg KiB0aGUgVlhSTSBhbmQgVlhTQVQgQ1NScywgb3RoZXJ3aXNlIGVuZGluZyBpbiBpbGxlZ2FsIGlu c3RydWN0aW9ucy4KPiA+ICsgICAgICAgICAgICAgICAgKiBUaG91Z2ggdGhlIGNvcmVzIGRvIG5v dCBpbXBsZW1lbnQgdGhlIFZYUk0gYW5kIFZYU0FUIGZpZWxkcyBpbiB0aGUKPiA+ICsgICAgICAg ICAgICAgICAgKiBGQ1NSIENTUiB0aGF0IHZlY3Rvci0wLjcuMSBzcGVjaWZpZXMuCj4gPiArICAg ICAgICAgICAgICAgICovCj4gPiArICAgICAgICAgICAgICAgaWYgKChzdGF0dXMgJiBTUl9GUykg PT0gU1JfRlNfT0ZGKSB7Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBjc3Jfc2V0KENTUl9T U1RBVFVTLCAoc3RhdHVzICYgflNSX0ZTKSB8IFNSX0ZTX0NMRUFOKTsKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIHJlc3RvcmVfZnB1ID0gdHJ1ZTsKPiA+ICsgICAgICAgICAgICAgICB9Cj4g PiArCj4gPiArICAgICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICJjc3JyICAgJVt0bXBfdmNzcl0sICIgX19zdHJpbmdpZnkoVkNTUl9WWFJNKSAi XG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJzbGxpdyAgJVt2Y3NyXSwgJVt0bXBf dmNzcl0sICIgX19zdHJpbmdpZnkoVkNTUl9WWFJNX1NISUZUKSAiXG5cdCIKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICJjc3JyICAgJVt0bXBfdmNzcl0sICIgX19zdHJpbmdpZnkoVkNTUl9W WFNBVCkgIlxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAib3IgICAgICVbdmNzcl0s ICVbdmNzcl0sICVbdG1wX3Zjc3JdXG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIDog W3Zjc3JdICI9ciIgKGRlc3QtPnZjc3IpLCBbdG1wX3Zjc3JdICI9JnIiICh0bXBfdmNzcikpOwo+ ID4gKwo+ID4gKyAgICAgICAgICAgICAgIGlmIChyZXN0b3JlX2ZwdSkKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIGNzcl9zZXQoQ1NSX1NTVEFUVVMsIHN0YXR1cyk7Cj4gCj4gdmxlbmIgaXMg b24gQUJJIGFuZCBwdHJhY2UgbmVlZHMgdGhhdCB0byByZWNvdmVyIHRoZSB3aWR0aCBvZiB0aGUK PiByZWdpc3Rlci4gU28gd2Ugc2hvdWxkIHByb2JhYmx5IHNhdmUgWHRoZWFkdmVjdG9yJ3Mgdmxl bmIgaW50byB2c3RhdGUKPiBpZiB3ZSBtZWFudCB0byBtYWludGFpbiBBQkkgY29tcGF0aWJpbGl0 eSBiZXR3ZWVuIFYgYW5kIFh0aGVhZHZlY3Rvcgo+IGZyb20gdGhlIGtlcm5lbC4KCldlIGNhbiBw dWxsIHRoZSB2bGVuYiBmcm9tIHJpc2N2X3ZfdnNpemUgd2hpY2ggZ2V0cyBwb3B1bGF0ZWQgZnJv bSB0aGUKZGV2aWNldHJlZSBmb3IgeHRoZWFkdmVjdG9yLiBJIHdpbGwgY2hhbmdlIHRoYXQgaW4g dGhlIG5leHQgdmVyc2lvbiEKCi0gQ2hhcmxpZQoKPiAKPiA+ICsgICAgICAgfSBlbHNlIHsKPiA+ ICsgICAgICAgICAgICAgICBhc20gdm9sYXRpbGUgKAo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgImNzcnIgICAlW3Zjc3JdLCAiIF9fc3RyaW5naWZ5KENTUl9WQ1NSKSAiXG5cdCIKPiA+ICsg ICAgICAgICAgICAgICAgICAgICAgICJjc3JyICAgJVt2bGVuYl0sICIgX19zdHJpbmdpZnkoQ1NS X1ZMRU5CKSAiXG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIDogW3Zjc3JdICI9ciIg KGRlc3QtPnZjc3IpLCBbdmxlbmJdICI9ciIgKGRlc3QtPnZsZW5iKSk7Cj4gPiArICAgICAgIH0K PiA+ICB9Cj4gPgo+ID4gIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBfX3ZzdGF0ZV9jc3Jf cmVzdG9yZShzdHJ1Y3QgX19yaXNjdl92X2V4dF9zdGF0ZSAqc3JjKQo+ID4gQEAgLTk1LDkgKzE3 NiwzNyBAQCBzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgX192c3RhdGVfY3NyX3Jlc3RvcmUo c3RydWN0IF9fcmlzY3Zfdl9leHRfc3RhdGUgKnNyYwo+ID4gICAgICAgICAgICAgICAgICJ2c2V0 dmwgIHgwLCAlMiwgJTFcblx0Igo+ID4gICAgICAgICAgICAgICAgICIub3B0aW9uIHBvcFxuXHQi Cj4gPiAgICAgICAgICAgICAgICAgImNzcncgICAiIF9fc3RyaW5naWZ5KENTUl9WU1RBUlQpICIs ICUwXG5cdCIKPiA+IC0gICAgICAgICAgICAgICAiY3NydyAgICIgX19zdHJpbmdpZnkoQ1NSX1ZD U1IpICIsICUzXG5cdCIKPiA+IC0gICAgICAgICAgICAgICA6IDogInIiIChzcmMtPnZzdGFydCks ICJyIiAoc3JjLT52dHlwZSksICJyIiAoc3JjLT52bCksCj4gPiAtICAgICAgICAgICAgICAgICAg ICJyIiAoc3JjLT52Y3NyKSA6KTsKPiA+ICsgICAgICAgICAgICAgICA6IDogInIiIChzcmMtPnZz dGFydCksICJyIiAoc3JjLT52dHlwZSksICJyIiAoc3JjLT52bCkpOwo+ID4gKwo+ID4gKyAgICAg ICBpZiAoaGFzX3h0aGVhZHZlY3RvcigpKSB7Cj4gPiArICAgICAgICAgICAgICAgdTMyIHRtcF92 Y3NyOwo+ID4gKyAgICAgICAgICAgICAgIGJvb2wgcmVzdG9yZV9mcHUgPSBmYWxzZTsKPiA+ICsg ICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nIHN0YXR1cyA9IGNzcl9yZWFkKENTUl9TU1RBVFVT KTsKPiA+ICsKPiA+ICsgICAgICAgICAgICAgICAvKgo+ID4gKyAgICAgICAgICAgICAgICAqIFNp bWlsYXIgdG8gX192c3RhdGVfY3NyX3NhdmUgYWJvdmUsIHJlc3RvcmUgdmFsdWVzIGZvciB0aGUK PiA+ICsgICAgICAgICAgICAgICAgKiBzZXBhcmF0ZSBWWFJNIGFuZCBWWFNBVCBDU1JzIGZyb20g dGhlIHZjc3IgdmFyaWFibGUuCj4gPiArICAgICAgICAgICAgICAgICovCj4gPiArICAgICAgICAg ICAgICAgaWYgKChzdGF0dXMgJiBTUl9GUykgPT0gU1JfRlNfT0ZGKSB7Cj4gPiArICAgICAgICAg ICAgICAgICAgICAgICBjc3Jfc2V0KENTUl9TU1RBVFVTLCAoc3RhdHVzICYgflNSX0ZTKSB8IFNS X0ZTX0NMRUFOKTsKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIHJlc3RvcmVfZnB1ID0gdHJ1 ZTsKPiA+ICsgICAgICAgICAgICAgICB9Cj4gPiArCj4gPiArICAgICAgICAgICAgICAgYXNtIHZv bGF0aWxlICgKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJzcmxpdyAgJVt0bXBfdmNzcl0s ICVbdmNzcl0sICIgX19zdHJpbmdpZnkoVkNTUl9WWFJNX1NISUZUKSAiXG5cdCIKPiA+ICsgICAg ICAgICAgICAgICAgICAgICAgICJhbmRpICAgJVt0bXBfdmNzcl0sICVbdG1wX3Zjc3JdLCAiIF9f c3RyaW5naWZ5KFZDU1JfVlhSTV9NQVNLKSAiXG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgICJjc3J3ICAgIiBfX3N0cmluZ2lmeShWQ1NSX1ZYUk0pICIsICVbdG1wX3Zjc3JdXG5cdCIK PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJhbmRpICAgJVt0bXBfdmNzcl0sICVbdmNzcl0s ICIgX19zdHJpbmdpZnkoVkNTUl9WWFNBVF9NQVNLKSAiXG5cdCIKPiA+ICsgICAgICAgICAgICAg ICAgICAgICAgICJjc3J3ICAgIiBfX3N0cmluZ2lmeShWQ1NSX1ZYU0FUKSAiLCAlW3RtcF92Y3Ny XVxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICA6IFt0bXBfdmNzcl0gIj0mciIgKHRt cF92Y3NyKSA6IFt2Y3NyXSAiciIgKHNyYy0+dmNzcikpOwo+ID4gKwo+ID4gKyAgICAgICAgICAg ICAgIGlmIChyZXN0b3JlX2ZwdSkKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIGNzcl9zZXQo Q1NSX1NTVEFUVVMsIHN0YXR1cyk7Cj4gPiArICAgICAgIH0gZWxzZSB7Cj4gPiArICAgICAgICAg ICAgICAgYXNtIHZvbGF0aWxlICgKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJjc3J3ICAg IiBfX3N0cmluZ2lmeShDU1JfVkNTUikgIiwgJVt2Y3NyXVxuXHQiCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICA6IDogW3Zjc3JdICJyIiAoc3JjLT52Y3NyKSk7Cj4gPiArICAgICAgIH0KPiA+ ICB9Cj4gPgo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCBfX3Jpc2N2X3ZfdnN0YXRlX3NhdmUoc3Ry dWN0IF9fcmlzY3Zfdl9leHRfc3RhdGUgKnNhdmVfdG8sCj4gPiBAQCAtMTA3LDE5ICsyMTYsMzMg QEAgc3RhdGljIGlubGluZSB2b2lkIF9fcmlzY3Zfdl92c3RhdGVfc2F2ZShzdHJ1Y3QgX19yaXNj dl92X2V4dF9zdGF0ZSAqc2F2ZV90bywKPiA+Cj4gPiAgICAgICAgIHJpc2N2X3ZfZW5hYmxlKCk7 Cj4gPiAgICAgICAgIF9fdnN0YXRlX2Nzcl9zYXZlKHNhdmVfdG8pOwo+ID4gLSAgICAgICBhc20g dm9sYXRpbGUgKAo+ID4gLSAgICAgICAgICAgICAgICIub3B0aW9uIHB1c2hcblx0Igo+ID4gLSAg ICAgICAgICAgICAgICIub3B0aW9uIGFyY2gsICt2XG5cdCIKPiA+IC0gICAgICAgICAgICAgICAi dnNldHZsaSAgICAgICAgJTAsIHgwLCBlOCwgbTgsIHRhLCBtYVxuXHQiCj4gPiAtICAgICAgICAg ICAgICAgInZzZTgudiAgICAgICAgIHYwLCAoJTEpXG5cdCIKPiA+IC0gICAgICAgICAgICAgICAi YWRkICAgICAgICAgICAgJTEsICUxLCAlMFxuXHQiCj4gPiAtICAgICAgICAgICAgICAgInZzZTgu diAgICAgICAgIHY4LCAoJTEpXG5cdCIKPiA+IC0gICAgICAgICAgICAgICAiYWRkICAgICAgICAg ICAgJTEsICUxLCAlMFxuXHQiCj4gPiAtICAgICAgICAgICAgICAgInZzZTgudiAgICAgICAgIHYx NiwgKCUxKVxuXHQiCj4gPiAtICAgICAgICAgICAgICAgImFkZCAgICAgICAgICAgICUxLCAlMSwg JTBcblx0Igo+ID4gLSAgICAgICAgICAgICAgICJ2c2U4LnYgICAgICAgICB2MjQsICglMSlcblx0 Igo+ID4gLSAgICAgICAgICAgICAgICIub3B0aW9uIHBvcFxuXHQiCj4gPiAtICAgICAgICAgICAg ICAgOiAiPSZyIiAodmwpIDogInIiIChkYXRhcCkgOiAibWVtb3J5Iik7Cj4gPiArICAgICAgIGlm IChoYXNfeHRoZWFkdmVjdG9yKCkpIHsKPiA+ICsgICAgICAgICAgICAgICBhc20gdm9sYXRpbGUg KAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgIm12IHQwLCAlMFxuXHQiCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICBUSEVBRF9WU0VUVkxJX1Q0WDBFOE04RDEKPiA+ICsgICAgICAgICAg ICAgICAgICAgICAgIFRIRUFEX1ZTQl9WX1YwVDAKPiA+ICsgICAgICAgICAgICAgICAgICAgICAg ICJhZGQgICAgICAgICAgICB0MCwgdDAsIHQ0XG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgIFRIRUFEX1ZTQl9WX1YwVDAKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJhZGQgICAg ICAgICAgICB0MCwgdDAsIHQ0XG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIFRIRUFE X1ZTQl9WX1YwVDAKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJhZGQgICAgICAgICAgICB0 MCwgdDAsIHQ0XG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIFRIRUFEX1ZTQl9WX1Yw VDAKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIDogOiAiciIgKGRhdGFwKSA6ICJtZW1vcnki LCAidDAiLCAidDQiKTsKPiA+ICsgICAgICAgfSBlbHNlIHsKPiA+ICsgICAgICAgICAgICAgICBh c20gdm9sYXRpbGUgKAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRpb24gcHVzaFxu XHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiLm9wdGlvbiBhcmNoLCArdlxuXHQiCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAidnNldHZsaSAgICAgICAgJTAsIHgwLCBlOCwgbTgs IHRhLCBtYVxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAidnNlOC52ICAgICAgICAg djAsICglMSlcblx0Igo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgImFkZCAgICAgICAgICAg ICUxLCAlMSwgJTBcblx0Igo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgInZzZTgudiAgICAg ICAgIHY4LCAoJTEpXG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJhZGQgICAgICAg ICAgICAlMSwgJTEsICUwXG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJ2c2U4LnYg ICAgICAgICB2MTYsICglMSlcblx0Igo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgImFkZCAg ICAgICAgICAgICUxLCAlMSwgJTBcblx0Igo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgInZz ZTgudiAgICAgICAgIHYyNCwgKCUxKVxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAi Lm9wdGlvbiBwb3Bcblx0Igo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgOiAiPSZyIiAodmwp IDogInIiIChkYXRhcCkgOiAibWVtb3J5Iik7Cj4gPiArICAgICAgIH0KPiA+ICAgICAgICAgcmlz Y3Zfdl9kaXNhYmxlKCk7Cj4gPiAgfQo+ID4KPiA+IEBAIC0xMjksNTUgKzI1Miw3NyBAQCBzdGF0 aWMgaW5saW5lIHZvaWQgX19yaXNjdl92X3ZzdGF0ZV9yZXN0b3JlKHN0cnVjdCBfX3Jpc2N2X3Zf ZXh0X3N0YXRlICpyZXN0b3JlXwo+ID4gICAgICAgICB1bnNpZ25lZCBsb25nIHZsOwo+ID4KPiA+ ICAgICAgICAgcmlzY3Zfdl9lbmFibGUoKTsKPiA+IC0gICAgICAgYXNtIHZvbGF0aWxlICgKPiA+ IC0gICAgICAgICAgICAgICAiLm9wdGlvbiBwdXNoXG5cdCIKPiA+IC0gICAgICAgICAgICAgICAi Lm9wdGlvbiBhcmNoLCArdlxuXHQiCj4gPiAtICAgICAgICAgICAgICAgInZzZXR2bGkgICAgICAg ICUwLCB4MCwgZTgsIG04LCB0YSwgbWFcblx0Igo+ID4gLSAgICAgICAgICAgICAgICJ2bGU4LnYg ICAgICAgICB2MCwgKCUxKVxuXHQiCj4gPiAtICAgICAgICAgICAgICAgImFkZCAgICAgICAgICAg ICUxLCAlMSwgJTBcblx0Igo+ID4gLSAgICAgICAgICAgICAgICJ2bGU4LnYgICAgICAgICB2OCwg KCUxKVxuXHQiCj4gPiAtICAgICAgICAgICAgICAgImFkZCAgICAgICAgICAgICUxLCAlMSwgJTBc blx0Igo+ID4gLSAgICAgICAgICAgICAgICJ2bGU4LnYgICAgICAgICB2MTYsICglMSlcblx0Igo+ ID4gLSAgICAgICAgICAgICAgICJhZGQgICAgICAgICAgICAlMSwgJTEsICUwXG5cdCIKPiA+IC0g ICAgICAgICAgICAgICAidmxlOC52ICAgICAgICAgdjI0LCAoJTEpXG5cdCIKPiA+IC0gICAgICAg ICAgICAgICAiLm9wdGlvbiBwb3Bcblx0Igo+ID4gLSAgICAgICAgICAgICAgIDogIj0mciIgKHZs KSA6ICJyIiAoZGF0YXApIDogIm1lbW9yeSIpOwo+ID4gKyAgICAgICBpZiAoaGFzX3h0aGVhZHZl Y3RvcigpKSB7Cj4gPiArICAgICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgKPiA+ICsgICAgICAg ICAgICAgICAgICAgICAgICJtdiB0MCwgJTBcblx0Igo+ID4gKyAgICAgICAgICAgICAgICAgICAg ICAgVEhFQURfVlNFVFZMSV9UNFgwRThNOEQxCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBU SEVBRF9WTEJfVl9WMFQwCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiYWRkICAgICAgICAg ICAgdDAsIHQwLCB0NFxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBUSEVBRF9WTEJf Vl9WMFQwCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiYWRkICAgICAgICAgICAgdDAsIHQw LCB0NFxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICBUSEVBRF9WTEJfVl9WMFQwCj4g PiArICAgICAgICAgICAgICAgICAgICAgICAiYWRkICAgICAgICAgICAgdDAsIHQwLCB0NFxuXHQi Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICBUSEVBRF9WTEJfVl9WMFQwCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICA6IDogInIiIChkYXRhcCkgOiAibWVtb3J5IiwgInQwIiwgInQ0Iik7 Cj4gPiArICAgICAgIH0gZWxzZSB7Cj4gPiArICAgICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgK PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICIub3B0aW9uIHB1c2hcblx0Igo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgIi5vcHRpb24gYXJjaCwgK3Zcblx0Igo+ID4gKyAgICAgICAgICAg ICAgICAgICAgICAgInZzZXR2bGkgICAgICAgICUwLCB4MCwgZTgsIG04LCB0YSwgbWFcblx0Igo+ ID4gKyAgICAgICAgICAgICAgICAgICAgICAgInZsZTgudiAgICAgICAgIHYwLCAoJTEpXG5cdCIK PiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJhZGQgICAgICAgICAgICAlMSwgJTEsICUwXG5c dCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJ2bGU4LnYgICAgICAgICB2OCwgKCUxKVxu XHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAiYWRkICAgICAgICAgICAgJTEsICUxLCAl MFxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAidmxlOC52ICAgICAgICAgdjE2LCAo JTEpXG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJhZGQgICAgICAgICAgICAlMSwg JTEsICUwXG5cdCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICJ2bGU4LnYgICAgICAgICB2 MjQsICglMSlcblx0Igo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgIi5vcHRpb24gcG9wXG5c dCIKPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIDogIj0mciIgKHZsKSA6ICJyIiAoZGF0YXAp IDogIm1lbW9yeSIpOwo+ID4gKyAgICAgICB9Cj4gPiAgICAgICAgIF9fdnN0YXRlX2Nzcl9yZXN0 b3JlKHJlc3RvcmVfZnJvbSk7Cj4gPiAgICAgICAgIHJpc2N2X3ZfZGlzYWJsZSgpOwo+ID4gIH0K PiA+Cj4gPiAgc3RhdGljIGlubGluZSB2b2lkIF9fcmlzY3Zfdl92c3RhdGVfZGlzY2FyZCh2b2lk KQo+ID4gIHsKPiA+IC0gICAgICAgdW5zaWduZWQgbG9uZyB2bCwgdnR5cGVfaW52YWwgPSAxVUwg PDwgKEJJVFNfUEVSX0xPTkcgLSAxKTsKPiA+ICsgICAgICAgdW5zaWduZWQgbG9uZyB2dHlwZV9p bnZhbCA9IDFVTCA8PCAoQklUU19QRVJfTE9ORyAtIDEpOwo+ID4KPiA+ICAgICAgICAgcmlzY3Zf dl9lbmFibGUoKTsKPiA+ICsgICAgICAgaWYgKGhhc194dGhlYWR2ZWN0b3IoKSkKPiA+ICsgICAg ICAgICAgICAgICBhc20gdm9sYXRpbGUgKFRIRUFEX1ZTRVRWTElfWDBYMEU4TThEMSk7Cj4gPiAr ICAgICAgIGVsc2UKPiA+ICsgICAgICAgICAgICAgICBhc20gdm9sYXRpbGUgKAo+ID4gKyAgICAg ICAgICAgICAgICAgICAgICAgIi5vcHRpb24gcHVzaFxuXHQiCj4gPiArICAgICAgICAgICAgICAg ICAgICAgICAiLm9wdGlvbiBhcmNoLCArdlxuXHQiCj4gPiArICAgICAgICAgICAgICAgICAgICAg ICAidnNldHZsaSAgICAgICAgeDAsIHgwLCBlOCwgbTgsIHRhLCBtYVxuXHQiCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAiLm9wdGlvbiBwb3Bcblx0Iik7Cj4gPiArCj4gPiAgICAgICAgIGFz bSB2b2xhdGlsZSAoCj4gPiAgICAgICAgICAgICAgICAgIi5vcHRpb24gcHVzaFxuXHQiCj4gPiAg ICAgICAgICAgICAgICAgIi5vcHRpb24gYXJjaCwgK3Zcblx0Igo+ID4gLSAgICAgICAgICAgICAg ICJ2c2V0dmxpICAgICAgICAlMCwgeDAsIGU4LCBtOCwgdGEsIG1hXG5cdCIKPiA+ICAgICAgICAg ICAgICAgICAidm12LnYuaSAgICAgICAgdjAsIC0xXG5cdCIKPiA+ICAgICAgICAgICAgICAgICAi dm12LnYuaSAgICAgICAgdjgsIC0xXG5cdCIKPiA+ICAgICAgICAgICAgICAgICAidm12LnYuaSAg ICAgICAgdjE2LCAtMVxuXHQiCj4gPiAgICAgICAgICAgICAgICAgInZtdi52LmkgICAgICAgIHYy NCwgLTFcblx0Igo+ID4gLSAgICAgICAgICAgICAgICJ2c2V0dmwgICAgICAgICAlMCwgeDAsICUx XG5cdCIKPiA+ICsgICAgICAgICAgICAgICAidnNldHZsICAgICAgICAgeDAsIHgwLCAlMFxuXHQi Cj4gPiAgICAgICAgICAgICAgICAgIi5vcHRpb24gcG9wXG5cdCIKPiA+IC0gICAgICAgICAgICAg ICA6ICI9JnIiICh2bCkgOiAiciIgKHZ0eXBlX2ludmFsKSA6ICJtZW1vcnkiKTsKPiA+ICsgICAg ICAgICAgICAgICA6IDogInIiICh2dHlwZV9pbnZhbCkpOwo+ID4gKwo+ID4gICAgICAgICByaXNj dl92X2Rpc2FibGUoKTsKPiA+ICB9Cj4gPgo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCByaXNjdl92 X3ZzdGF0ZV9kaXNjYXJkKHN0cnVjdCBwdF9yZWdzICpyZWdzKQo+ID4gIHsKPiA+IC0gICAgICAg aWYgKChyZWdzLT5zdGF0dXMgJiBTUl9WUykgPT0gU1JfVlNfT0ZGKQo+ID4gLSAgICAgICAgICAg ICAgIHJldHVybjsKPiA+IC0KPiA+IC0gICAgICAgX19yaXNjdl92X3ZzdGF0ZV9kaXNjYXJkKCk7 Cj4gPiAtICAgICAgIF9fcmlzY3Zfdl92c3RhdGVfZGlydHkocmVncyk7Cj4gPiArICAgICAgIGlm IChyaXNjdl92X3ZzdGF0ZV9xdWVyeShyZWdzKSkgewo+ID4gKyAgICAgICAgICAgICAgIF9fcmlz Y3Zfdl92c3RhdGVfZGlzY2FyZCgpOwo+ID4gKyAgICAgICAgICAgICAgIF9fcmlzY3Zfdl92c3Rh dGVfZGlydHkocmVncyk7Cj4gPiArICAgICAgIH0KPiA+ICB9Cj4gPgo+ID4gIHN0YXRpYyBpbmxp bmUgdm9pZCByaXNjdl92X3ZzdGF0ZV9zYXZlKHN0cnVjdCBfX3Jpc2N2X3ZfZXh0X3N0YXRlICp2 c3RhdGUsCj4gPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qg cHRfcmVncyAqcmVncykKPiA+ICB7Cj4gPiAtICAgICAgIGlmICgocmVncy0+c3RhdHVzICYgU1Jf VlMpID09IFNSX1ZTX0RJUlRZKSB7Cj4gPiArICAgICAgIGlmIChfX3Jpc2N2X3ZfdnN0YXRlX2No ZWNrKHJlZ3MtPnN0YXR1cywgRElSVFkpKSB7Cj4gPiAgICAgICAgICAgICAgICAgX19yaXNjdl92 X3ZzdGF0ZV9zYXZlKHZzdGF0ZSwgdnN0YXRlLT5kYXRhcCk7Cj4gPiAgICAgICAgICAgICAgICAg X19yaXNjdl92X3ZzdGF0ZV9jbGVhbihyZWdzKTsKPiA+ICAgICAgICAgfQo+ID4gQEAgLTE4Niw3 ICszMzEsNyBAQCBzdGF0aWMgaW5saW5lIHZvaWQgcmlzY3Zfdl92c3RhdGVfc2F2ZShzdHJ1Y3Qg X19yaXNjdl92X2V4dF9zdGF0ZSAqdnN0YXRlLAo+ID4gIHN0YXRpYyBpbmxpbmUgdm9pZCByaXNj dl92X3ZzdGF0ZV9yZXN0b3JlKHN0cnVjdCBfX3Jpc2N2X3ZfZXh0X3N0YXRlICp2c3RhdGUsCj4g PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHRfcmVn cyAqcmVncykKPiA+ICB7Cj4gPiAtICAgICAgIGlmICgocmVncy0+c3RhdHVzICYgU1JfVlMpICE9 IFNSX1ZTX09GRikgewo+ID4gKyAgICAgICBpZiAocmlzY3Zfdl92c3RhdGVfcXVlcnkocmVncykp IHsKPiA+ICAgICAgICAgICAgICAgICBfX3Jpc2N2X3ZfdnN0YXRlX3Jlc3RvcmUodnN0YXRlLCB2 c3RhdGUtPmRhdGFwKTsKPiA+ICAgICAgICAgICAgICAgICBfX3Jpc2N2X3ZfdnN0YXRlX2NsZWFu KHJlZ3MpOwo+ID4gICAgICAgICB9Cj4gPiBAQCAtMTk1LDcgKzM0MCw3IEBAIHN0YXRpYyBpbmxp bmUgdm9pZCByaXNjdl92X3ZzdGF0ZV9yZXN0b3JlKHN0cnVjdCBfX3Jpc2N2X3ZfZXh0X3N0YXRl ICp2c3RhdGUsCj4gPiAgc3RhdGljIGlubGluZSB2b2lkIHJpc2N2X3ZfdnN0YXRlX3NldF9yZXN0 b3JlKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKPiA+ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgcHRfcmVncyAqcmVncykKPiA+ICB7Cj4gPiAt ICAgICAgIGlmICgocmVncy0+c3RhdHVzICYgU1JfVlMpICE9IFNSX1ZTX09GRikgewo+ID4gKyAg ICAgICBpZiAocmlzY3Zfdl92c3RhdGVfcXVlcnkocmVncykpIHsKPiA+ICAgICAgICAgICAgICAg ICBzZXRfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9SSVNDVl9WX0RFRkVSX1JFU1RPUkUpOwo+ ID4gICAgICAgICAgICAgICAgIHJpc2N2X3ZfdnN0YXRlX29uKHJlZ3MpOwo+ID4gICAgICAgICB9 Cj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9yaXNjdi9rZXJuZWwvY3B1ZmVhdHVyZS5jIGIvYXJjaC9y aXNjdi9rZXJuZWwvY3B1ZmVhdHVyZS5jCj4gPiBpbmRleCAyOTkzMzE4YjhlYTIuLjQ0ZjAwMTdh OThkNSAxMDA2NDQKPiA+IC0tLSBhL2FyY2gvcmlzY3Yva2VybmVsL2NwdWZlYXR1cmUuYwo+ID4g KysrIGIvYXJjaC9yaXNjdi9rZXJuZWwvY3B1ZmVhdHVyZS5jCj4gPiBAQCAtNzgxLDcgKzc4MSw3 IEBAIHZvaWQgX19pbml0IHJpc2N2X2ZpbGxfaHdjYXAodm9pZCkKPiA+ICAgICAgICAgICAgICAg ICBlbGZfaHdjYXAgJj0gfkNPTVBBVF9IV0NBUF9JU0FfRjsKPiA+ICAgICAgICAgfQo+ID4KPiA+ IC0gICAgICAgaWYgKGVsZl9od2NhcCAmIENPTVBBVF9IV0NBUF9JU0FfVikgewo+ID4gKyAgICAg ICBpZiAoZWxmX2h3Y2FwICYgQ09NUEFUX0hXQ0FQX0lTQV9WIHx8IGhhc194dGhlYWR2ZWN0b3Jf bm9fYWx0ZXJuYXRpdmVzKCkpIHsKPiA+ICAgICAgICAgICAgICAgICByaXNjdl92X3NldHVwX3Zz aXplKCk7Cj4gPiAgICAgICAgICAgICAgICAgLyoKPiA+ICAgICAgICAgICAgICAgICAgKiBJU0Eg c3RyaW5nIGluIGRldmljZSB0cmVlIG1pZ2h0IGhhdmUgJ3YnIGZsYWcsIGJ1dAo+ID4gZGlmZiAt LWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL2tlcm5lbF9tb2RlX3ZlY3Rvci5jIGIvYXJjaC9yaXNj di9rZXJuZWwva2VybmVsX21vZGVfdmVjdG9yLmMKPiA+IGluZGV4IDZhZmU4MGM3ZjAzYS4uOTk5 NzJhNDhlODZiIDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9yaXNjdi9rZXJuZWwva2VybmVsX21vZGVf dmVjdG9yLmMKPiA+ICsrKyBiL2FyY2gvcmlzY3Yva2VybmVsL2tlcm5lbF9tb2RlX3ZlY3Rvci5j Cj4gPiBAQCAtMTQzLDcgKzE0Myw3IEBAIHN0YXRpYyBpbnQgcmlzY3Zfdl9zdGFydF9rZXJuZWxf Y29udGV4dChib29sICppc19uZXN0ZWQpCj4gPgo+ID4gICAgICAgICAvKiBUcmFuc2ZlciB0aGUg b3duZXJzaGlwIG9mIFYgZnJvbSB1c2VyIHRvIGtlcm5lbCwgdGhlbiBzYXZlICovCj4gPiAgICAg ICAgIHJpc2N2X3Zfc3RhcnQoUklTQ1ZfUFJFRU1QVF9WIHwgUklTQ1ZfUFJFRU1QVF9WX0RJUlRZ KTsKPiA+IC0gICAgICAgaWYgKCh0YXNrX3B0X3JlZ3MoY3VycmVudCktPnN0YXR1cyAmIFNSX1ZT KSA9PSBTUl9WU19ESVJUWSkgewo+ID4gKyAgICAgICBpZiAoX19yaXNjdl92X3ZzdGF0ZV9jaGVj ayh0YXNrX3B0X3JlZ3MoY3VycmVudCktPnN0YXR1cywgRElSVFkpKSB7Cj4gPiAgICAgICAgICAg ICAgICAgdXZzdGF0ZSA9ICZjdXJyZW50LT50aHJlYWQudnN0YXRlOwo+ID4gICAgICAgICAgICAg ICAgIF9fcmlzY3Zfdl92c3RhdGVfc2F2ZSh1dnN0YXRlLCB1dnN0YXRlLT5kYXRhcCk7Cj4gPiAg ICAgICAgIH0KPiA+IEBAIC0xNjAsNyArMTYwLDcgQEAgYXNtbGlua2FnZSB2b2lkIHJpc2N2X3Zf Y29udGV4dF9uZXN0aW5nX3N0YXJ0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQo+ID4gICAgICAgICAg ICAgICAgIHJldHVybjsKPiA+Cj4gPiAgICAgICAgIGRlcHRoID0gcmlzY3Zfdl9jdHhfZ2V0X2Rl cHRoKCk7Cj4gPiAtICAgICAgIGlmIChkZXB0aCA9PSAwICYmIChyZWdzLT5zdGF0dXMgJiBTUl9W UykgPT0gU1JfVlNfRElSVFkpCj4gPiArICAgICAgIGlmIChkZXB0aCA9PSAwICYmIF9fcmlzY3Zf dl92c3RhdGVfY2hlY2socmVncy0+c3RhdHVzLCBESVJUWSkpCj4gPiAgICAgICAgICAgICAgICAg cmlzY3ZfcHJlZW1wdF92X3NldF9kaXJ0eSgpOwo+ID4KPiA+ICAgICAgICAgcmlzY3Zfdl9jdHhf ZGVwdGhfaW5jKCk7Cj4gPiBAQCAtMjA4LDcgKzIwOCw3IEBAIHZvaWQga2VybmVsX3ZlY3Rvcl9i ZWdpbih2b2lkKQo+ID4gIHsKPiA+ICAgICAgICAgYm9vbCBuZXN0ZWQgPSBmYWxzZTsKPiA+Cj4g PiAtICAgICAgIGlmIChXQVJOX09OKCFoYXNfdmVjdG9yKCkpKQo+ID4gKyAgICAgICBpZiAoV0FS Tl9PTighKGhhc192ZWN0b3IoKSB8fCBoYXNfeHRoZWFkdmVjdG9yKCkpKSkKPiA+ICAgICAgICAg ICAgICAgICByZXR1cm47Cj4gPgo+ID4gICAgICAgICBCVUdfT04oIW1heV91c2Vfc2ltZCgpKTsK PiA+IEBAIC0yMzYsNyArMjM2LDcgQEAgRVhQT1JUX1NZTUJPTF9HUEwoa2VybmVsX3ZlY3Rvcl9i ZWdpbik7Cj4gPiAgICovCj4gPiAgdm9pZCBrZXJuZWxfdmVjdG9yX2VuZCh2b2lkKQo+ID4gIHsK PiA+IC0gICAgICAgaWYgKFdBUk5fT04oIWhhc192ZWN0b3IoKSkpCj4gPiArICAgICAgIGlmIChX QVJOX09OKCEoaGFzX3ZlY3RvcigpIHx8IGhhc194dGhlYWR2ZWN0b3IoKSkpKQo+ID4gICAgICAg ICAgICAgICAgIHJldHVybjsKPiA+Cj4gPiAgICAgICAgIHJpc2N2X3ZfZGlzYWJsZSgpOwo+ID4g ZGlmZiAtLWdpdCBhL2FyY2gvcmlzY3Yva2VybmVsL3Byb2Nlc3MuYyBiL2FyY2gvcmlzY3Yva2Vy bmVsL3Byb2Nlc3MuYwo+ID4gaW5kZXggOTI5MjJkYmQ1YjVjLi5lYWJjYTg2ZmMzYzAgMTAwNjQ0 Cj4gPiAtLS0gYS9hcmNoL3Jpc2N2L2tlcm5lbC9wcm9jZXNzLmMKPiA+ICsrKyBiL2FyY2gvcmlz Y3Yva2VybmVsL3Byb2Nlc3MuYwo+ID4gQEAgLTE3OCw3ICsxNzgsNyBAQCB2b2lkIGZsdXNoX3Ro cmVhZCh2b2lkKQo+ID4gIHZvaWQgYXJjaF9yZWxlYXNlX3Rhc2tfc3RydWN0KHN0cnVjdCB0YXNr X3N0cnVjdCAqdHNrKQo+ID4gIHsKPiA+ICAgICAgICAgLyogRnJlZSB0aGUgdmVjdG9yIGNvbnRl eHQgb2YgZGF0YXAuICovCj4gPiAtICAgICAgIGlmIChoYXNfdmVjdG9yKCkpCj4gPiArICAgICAg IGlmIChoYXNfdmVjdG9yKCkgfHwgaGFzX3h0aGVhZHZlY3RvcigpKQo+ID4gICAgICAgICAgICAg ICAgIHJpc2N2X3ZfdGhyZWFkX2ZyZWUodHNrKTsKPiA+ICB9Cj4gPgo+ID4gQEAgLTIyNSw3ICsy MjUsNyBAQCBpbnQgY29weV90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBjb25zdCBzdHJ1 Y3Qga2VybmVsX2Nsb25lX2FyZ3MgKmFyZ3MpCj4gPiAgICAgICAgICAgICAgICAgcC0+dGhyZWFk LnNbMF0gPSAwOwo+ID4gICAgICAgICB9Cj4gPiAgICAgICAgIHAtPnRocmVhZC5yaXNjdl92X2Zs YWdzID0gMDsKPiA+IC0gICAgICAgaWYgKGhhc192ZWN0b3IoKSkKPiA+ICsgICAgICAgaWYgKGhh c192ZWN0b3IoKSB8fCBoYXNfeHRoZWFkdmVjdG9yKCkpCj4gPiAgICAgICAgICAgICAgICAgcmlz Y3Zfdl90aHJlYWRfYWxsb2MocCk7Cj4gPiAgICAgICAgIHAtPnRocmVhZC5yYSA9ICh1bnNpZ25l ZCBsb25nKXJldF9mcm9tX2Zvcms7Cj4gPiAgICAgICAgIHAtPnRocmVhZC5zcCA9ICh1bnNpZ25l ZCBsb25nKWNoaWxkcmVnczsgLyoga2VybmVsIHNwICovCj4gPiBkaWZmIC0tZ2l0IGEvYXJjaC9y aXNjdi9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3Jpc2N2L2tlcm5lbC9zaWduYWwuYwo+ID4gaW5k ZXggNTAxZTY2ZGViZjY5Li41ZDNiYThlNDY4MDcgMTAwNjQ0Cj4gPiAtLS0gYS9hcmNoL3Jpc2N2 L2tlcm5lbC9zaWduYWwuYwo+ID4gKysrIGIvYXJjaC9yaXNjdi9rZXJuZWwvc2lnbmFsLmMKPiA+ IEBAIC0xODgsNyArMTg4LDcgQEAgc3RhdGljIGxvbmcgcmVzdG9yZV9zaWdjb250ZXh0KHN0cnVj dCBwdF9yZWdzICpyZWdzLAo+ID4KPiA+ICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAw Owo+ID4gICAgICAgICAgICAgICAgIGNhc2UgUklTQ1ZfVl9NQUdJQzoKPiA+IC0gICAgICAgICAg ICAgICAgICAgICAgIGlmICghaGFzX3ZlY3RvcigpIHx8ICFyaXNjdl92X3ZzdGF0ZV9xdWVyeShy ZWdzKSB8fAo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoaGFzX3ZlY3RvcigpIHx8 IGhhc194dGhlYWR2ZWN0b3IoKSkgfHwgIXJpc2N2X3ZfdnN0YXRlX3F1ZXJ5KHJlZ3MpIHx8Cj4g PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSAhPSByaXNjdl92X3NjX3NpemUpCj4g PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4KPiA+ IEBAIC0yMTAsNyArMjEwLDcgQEAgc3RhdGljIHNpemVfdCBnZXRfcnRfZnJhbWVfc2l6ZShib29s IGNhbF9hbGwpCj4gPgo+ID4gICAgICAgICBmcmFtZV9zaXplID0gc2l6ZW9mKCpmcmFtZSk7Cj4g Pgo+ID4gLSAgICAgICBpZiAoaGFzX3ZlY3RvcigpKSB7Cj4gPiArICAgICAgIGlmIChoYXNfdmVj dG9yKCkgfHwgaGFzX3h0aGVhZHZlY3RvcigpKSB7Cj4gPiAgICAgICAgICAgICAgICAgaWYgKGNh bF9hbGwgfHwgcmlzY3Zfdl92c3RhdGVfcXVlcnkodGFza19wdF9yZWdzKGN1cnJlbnQpKSkKPiA+ ICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsX2NvbnRleHRfc2l6ZSArPSByaXNjdl92X3Nj X3NpemU7Cj4gPiAgICAgICAgIH0KPiA+IEBAIC0yODMsNyArMjgzLDcgQEAgc3RhdGljIGxvbmcg c2V0dXBfc2lnY29udGV4dChzdHJ1Y3QgcnRfc2lnZnJhbWUgX191c2VyICpmcmFtZSwKPiA+ICAg ICAgICAgaWYgKGhhc19mcHUoKSkKPiA+ICAgICAgICAgICAgICAgICBlcnIgfD0gc2F2ZV9mcF9z dGF0ZShyZWdzLCAmc2MtPnNjX2ZwcmVncyk7Cj4gPiAgICAgICAgIC8qIFNhdmUgdGhlIHZlY3Rv ciBzdGF0ZS4gKi8KPiA+IC0gICAgICAgaWYgKGhhc192ZWN0b3IoKSAmJiByaXNjdl92X3ZzdGF0 ZV9xdWVyeShyZWdzKSkKPiA+ICsgICAgICAgaWYgKChoYXNfdmVjdG9yKCkgfHwgaGFzX3h0aGVh ZHZlY3RvcigpKSAmJiByaXNjdl92X3ZzdGF0ZV9xdWVyeShyZWdzKSkKPiA+ICAgICAgICAgICAg ICAgICBlcnIgfD0gc2F2ZV92X3N0YXRlKHJlZ3MsICh2b2lkIF9fdXNlciAqKikmc2NfZXh0X3B0 cik7Cj4gPiAgICAgICAgIC8qIFdyaXRlIHplcm8gdG8gZnAtcmVzZXJ2ZWQgc3BhY2UgYW5kIGNo ZWNrIGl0IG9uIHJlc3RvcmVfc2lnY29udGV4dCAqLwo+ID4gICAgICAgICBlcnIgfD0gX19wdXRf dXNlcigwLCAmc2MtPnNjX2V4dGRlc2MucmVzZXJ2ZWQpOwo+ID4gZGlmZiAtLWdpdCBhL2FyY2gv cmlzY3Yva2VybmVsL3ZlY3Rvci5jIGIvYXJjaC9yaXNjdi9rZXJuZWwvdmVjdG9yLmMKPiA+IGlu ZGV4IGUwNDU4NmNkYjdmMC4uYzEyZWE0NTQ3ZGE2IDEwMDY0NAo+ID4gLS0tIGEvYXJjaC9yaXNj di9rZXJuZWwvdmVjdG9yLmMKPiA+ICsrKyBiL2FyY2gvcmlzY3Yva2VybmVsL3ZlY3Rvci5jCj4g PiBAQCAtNjMsNyArNjMsNyBAQCBpbnQgcmlzY3Zfdl9zZXR1cF92c2l6ZSh2b2lkKQo+ID4KPiA+ ICB2b2lkIF9faW5pdCByaXNjdl92X3NldHVwX2N0eF9jYWNoZSh2b2lkKQo+ID4gIHsKPiA+IC0g ICAgICAgaWYgKCFoYXNfdmVjdG9yKCkpCj4gPiArICAgICAgIGlmICghKGhhc192ZWN0b3IoKSB8 fCBoYXNfeHRoZWFkdmVjdG9yKCkpKQo+ID4gICAgICAgICAgICAgICAgIHJldHVybjsKPiA+Cj4g PiAgICAgICAgIHJpc2N2X3ZfdXNlcl9jYWNoZXAgPSBrbWVtX2NhY2hlX2NyZWF0ZV91c2VyY29w eSgicmlzY3ZfdmVjdG9yX2N0eCIsCj4gPiBAQCAtMTg0LDcgKzE4NCw4IEBAIGJvb2wgcmlzY3Zf dl9maXJzdF91c2VfaGFuZGxlcihzdHJ1Y3QgcHRfcmVncyAqcmVncykKPiA+ICAgICAgICAgdTMy IGluc24gPSAodTMyKXJlZ3MtPmJhZGFkZHI7Cj4gPgo+ID4gICAgICAgICAvKiBEbyBub3QgaGFu ZGxlIGlmIFYgaXMgbm90IHN1cHBvcnRlZCwgb3IgZGlzYWJsZWQgKi8KPiA+IC0gICAgICAgaWYg KCEoRUxGX0hXQ0FQICYgQ09NUEFUX0hXQ0FQX0lTQV9WKSkKPiA+ICsgICAgICAgaWYgKCEoRUxG X0hXQ0FQICYgQ09NUEFUX0hXQ0FQX0lTQV9WKSAmJgo+ID4gKyAgICAgICAgICAgIShoYXNfeHRo ZWFkdmVjdG9yKCkgJiYgcmlzY3Zfdl92c3RhdGVfY3RybF91c2VyX2FsbG93ZWQoKSkpCj4gPiAg ICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwo+ID4KPiA+ICAgICAgICAgLyogSWYgViBoYXMg YmVlbiBlbmFibGVkIHRoZW4gaXQgaXMgbm90IHRoZSBmaXJzdC11c2UgdHJhcCAqLwo+ID4gQEAg LTIyMyw3ICsyMjQsNyBAQCB2b2lkIHJpc2N2X3ZfdnN0YXRlX2N0cmxfaW5pdChzdHJ1Y3QgdGFz a19zdHJ1Y3QgKnRzaykKPiA+ICAgICAgICAgYm9vbCBpbmhlcml0Owo+ID4gICAgICAgICBpbnQg Y3VyLCBuZXh0Owo+ID4KPiA+IC0gICAgICAgaWYgKCFoYXNfdmVjdG9yKCkpCj4gPiArICAgICAg IGlmICghKGhhc192ZWN0b3IoKSB8fCBoYXNfeHRoZWFkdmVjdG9yKCkpKQo+ID4gICAgICAgICAg ICAgICAgIHJldHVybjsKPiA+Cj4gPiAgICAgICAgIG5leHQgPSByaXNjdl92X2N0cmxfZ2V0X25l eHQodHNrKTsKPiA+IEBAIC0yNDUsNyArMjQ2LDcgQEAgdm9pZCByaXNjdl92X3ZzdGF0ZV9jdHJs X2luaXQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCj4gPgo+ID4gIGxvbmcgcmlzY3Zfdl92c3Rh dGVfY3RybF9nZXRfY3VycmVudCh2b2lkKQo+ID4gIHsKPiA+IC0gICAgICAgaWYgKCFoYXNfdmVj dG9yKCkpCj4gPiArICAgICAgIGlmICghKGhhc192ZWN0b3IoKSB8fCBoYXNfeHRoZWFkdmVjdG9y KCkpKQo+ID4gICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+ID4KPiA+ICAgICAgICAg cmV0dXJuIGN1cnJlbnQtPnRocmVhZC52c3RhdGVfY3RybCAmIFBSX1JJU0NWX1ZfVlNUQVRFX0NU UkxfTUFTSzsKPiA+IEBAIC0yNTYsNyArMjU3LDcgQEAgbG9uZyByaXNjdl92X3ZzdGF0ZV9jdHJs X3NldF9jdXJyZW50KHVuc2lnbmVkIGxvbmcgYXJnKQo+ID4gICAgICAgICBib29sIGluaGVyaXQ7 Cj4gPiAgICAgICAgIGludCBjdXIsIG5leHQ7Cj4gPgo+ID4gLSAgICAgICBpZiAoIWhhc192ZWN0 b3IoKSkKPiA+ICsgICAgICAgaWYgKCEoaGFzX3ZlY3RvcigpIHx8IGhhc194dGhlYWR2ZWN0b3Io KSkpCj4gPiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7Cj4gPgo+ID4gICAgICAgICBp ZiAoYXJnICYgflBSX1JJU0NWX1ZfVlNUQVRFX0NUUkxfTUFTSykKPiA+IEBAIC0zMDYsNyArMzA3 LDcgQEAgc3RhdGljIHN0cnVjdCBjdGxfdGFibGUgcmlzY3Zfdl9kZWZhdWx0X3ZzdGF0ZV90YWJs ZVtdID0gewo+ID4KPiA+ICBzdGF0aWMgaW50IF9faW5pdCByaXNjdl92X3N5c2N0bF9pbml0KHZv aWQpCj4gPiAgewo+ID4gLSAgICAgICBpZiAoaGFzX3ZlY3RvcigpKQo+ID4gKyAgICAgICBpZiAo aGFzX3ZlY3RvcigpIHx8IGhhc194dGhlYWR2ZWN0b3IoKSkKPiA+ICAgICAgICAgICAgICAgICBp ZiAoIXJlZ2lzdGVyX3N5c2N0bCgiYWJpIiwgcmlzY3Zfdl9kZWZhdWx0X3ZzdGF0ZV90YWJsZSkp Cj4gPiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKPiA+ICAgICAgICAg cmV0dXJuIDA7Cj4gPgo+ID4gLS0KPiA+IDIuNDQuMAo+ID4KPiA+Cj4gPiBfX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwo+ID4gbGludXgtcmlzY3YgbWFpbGlu ZyBsaXN0Cj4gPiBsaW51eC1yaXNjdkBsaXN0cy5pbmZyYWRlYWQub3JnCj4gPiBodHRwOi8vbGlz dHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LXJpc2N2Cj4gCj4gQ2hlZXJz LAo+IEFuZHkKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f CmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5m cmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xp bnV4LWFybS1rZXJuZWwK