From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-wm1-x333.google.com (mail-wm1-x333.google.com [IPv6:2a00:1450:4864:20::333]) by sourceware.org (Postfix) with ESMTPS id 8E7813858C2C for ; Tue, 28 Sep 2021 07:25:57 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 8E7813858C2C Received: by mail-wm1-x333.google.com with SMTP id j27so2607337wms.0 for ; Tue, 28 Sep 2021 00:25:57 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=3jgxHWgHUuoP6+KidGRXpR9zECCX4E3hgx2SZP+zJ4E=; b=mAaH6JpjMb07UIBFM5bS4Izqyyp1cwwO+RUAVwl07Go9pToYK3c5kHikPWeF+60xDa 8TJ8dD1Dc+bpriUz5/qhIAUvzUwOhrdqpxBHH1zmkXGfqGvjHwJtTujqlGattW6pb3QZ Ftu/4RZBb1ZbxzpSFITUEjKfNhLqhKuMGqpLUyFOU/iq2eqn9SXyPW2i2gKAZjAazA1K FnToXg1iQgUHUmAJXuHWacDy4Jxs0dfUdVG/+J0r59JdOoXxwIr/fYH5ZU52sDF9znxJ LqYuFPgpNx8fReavRV/5PQVdlPk5HjR8EOBV42uSQyRoQHhGxozjMBrA7cutEc0czQ0V Q8qQ== X-Gm-Message-State: AOAM533rfHt1jVOQd2vlVwDtiFuqhacTzNonUO+8Zd0ZERTBa2jEn19f z/hkILE41a1OMqh80Yx/YQ7HFvH49IsyQFHzt9Y= X-Google-Smtp-Source: ABdhPJzkZjo6vvDilTxZTtBwcvDU0P83KNz0V108vhi7SGSLYOtHx8XkSPeLcT4gU2oEYkq5i9eb4TTwE7Vq+zszZ+s= X-Received: by 2002:a1c:c906:: with SMTP id f6mr3279796wmb.136.1632813956053; Tue, 28 Sep 2021 00:25:56 -0700 (PDT) MIME-Version: 1.0 References: <20210927104251.81107-1-hongyu.wang@intel.com> In-Reply-To: From: Hongyu Wang Date: Tue, 28 Sep 2021 15:20:06 +0800 Message-ID: Subject: Re: [PATCH] AVX512FP16:support basic 64/32bit vector type and operation. To: Uros Bizjak Cc: Hongyu Wang , Hongtao Liu , "gcc-patches@gcc.gnu.org" Content-Type: multipart/mixed; boundary="000000000000d5e47705cd091f63" X-Spam-Status: No, score=-8.1 required=5.0 tests=BAYES_00, BODY_8BITS, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 28 Sep 2021 07:26:03 -0000 --000000000000d5e47705cd091f63 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable > I'd put this new pattern in mmx.md to keep 64bit/32bit modes in > mmx.md, similar to e.g. FMA patterns among others. Yes, I put it after single-float patterns. Attached the patch I'm going to check-in. Thanks for your review. Uros Bizjak =E4=BA=8E2021=E5=B9=B49=E6=9C=8828=E6=97=A5= =E5=91=A8=E4=BA=8C =E4=B8=8B=E5=8D=882:27=E5=86=99=E9=81=93=EF=BC=9A > > On Tue, Sep 28, 2021 at 6:48 AM Hongyu Wang wrot= e: > > > > > ia32 ABI declares that __m64 values pass via MMX registers. Due to > > > this, we are not able to fully disable MMX register usage, as is the > > > case with x86_64. So, V4HFmode values will pass to functions via MMX > > > registers on ia32 targets. > > > > > > So, there should be no additional define_insn, the addition to the > > > existing MMXMODE mode iterator should be enough. V4HFmodes should be > > > handled in the same way as e.g. V8QImode. > > > > > > This is not the case with 4-byte values, which should be passed using > > > integer ABI. > > > > Thanks for the explanation, updated patch by removing the extra define_= insn, > > and drop V4HFmode from VALID_AVX512FP16_REG_MODE. Now v4hf would behave > > same as v8qi. > > > > Bootsrapped and regtested on x86_64-pc-linux-gnu{-m32,} and sde. > > > > OK for master with the updated one? > > I'd put this new pattern in mmx.md to keep 64bit/32bit modes in > mmx.md, similar to e.g. FMA patterns among others. > > OK with the eventual above change. > > Thanks, > Uros. > > > > > Uros Bizjak via Gcc-patches =E4=BA=8E2021=E5= =B9=B49=E6=9C=8827=E6=97=A5=E5=91=A8=E4=B8=80 =E4=B8=8B=E5=8D=887:35=E5=86= =99=E9=81=93=EF=BC=9A > > > > > > On Mon, Sep 27, 2021 at 12:42 PM Hongyu Wang = wrote: > > > > > > > > Hi Uros, > > > > > > > > This patch intends to support V4HF/V2HF vector type and basic opera= tions. > > > > > > > > For 32bit target, V4HF vector is parsed same as __m64 type, V2HF > > > > is parsed by stack and returned from GPR since it is not specified > > > > by ABI. > > > > > > > > We found for 64bit vector in ia32, when mmx disabled there seems no > > > > mov_internal, so we add a define_insn for v4hf mode. It would= be very > > > > ppreciated if you know why the handling of 64bit vector looks as is= and > > > > give some advice. > > > > > > ia32 ABI declares that __m64 values pass via MMX registers. Due to > > > this, we are not able to fully disable MMX register usage, as is the > > > case with x86_64. So, V4HFmode values will pass to functions via MMX > > > registers on ia32 targets. > > > > > > So, there should be no additional define_insn, the addition to the > > > existing MMXMODE mode iterator should be enough. V4HFmodes should be > > > handled in the same way as e.g. V8QImode. > > > > > > This is not the case with 4-byte values, which should be passed using > > > integer ABI. > > > > > > Uros. > > > > > > > > > > > Bootstraped and regtested on x86_64-pc-linux-gnu{-m32,} and sde. > > > > > > > > OK for master? > > > > > > > > gcc/ChangeLog: > > > > > > > > PR target/102230 > > > > * config/i386/i386.h (VALID_AVX512FP16_REG_MODE): Add > > > > V4HF and V2HF mode check. > > > > (VALID_SSE2_REG_VHF_MODE): Likewise. > > > > (VALID_MMX_REG_MODE): Likewise. > > > > (SSE_REG_MODE_P): Replace VALID_AVX512FP16_REG_MODE with > > > > vector mode condition. > > > > * config/i386/i386.c (classify_argument): Parse V4HF/V2HF > > > > via sse regs. > > > > (function_arg_32): Add V4HFmode. > > > > (function_arg_advance_32): Likewise. > > > > * config/i386/i386.md (mode): Add V4HF/V2HF. > > > > (MODE_SIZE): Likewise. > > > > * config/i386/mmx.md (MMXMODE): Add V4HF mode. > > > > (V_32): Add V2HF mode. > > > > (*mov_internal): Adjust sse alternatives to support > > > > V4HF mode vector move. > > > > (*mov_internal): Adjust sse alternatives > > > > to support V2HF mode move. > > > > * config/i386/sse.md (VHF_32_64): New mode iterator. > > > > (3): New define_insn for add/sub/mul/div. > > > > (*movv4hf_internal_sse): New define_insn for -mno-mmx and -= msse. > > > > > > > > gcc/testsuite/ChangeLog: > > > > > > > > PR target/102230 > > > > * gcc.target/i386/avx512fp16-floatvnhf.c: Remove xfail. > > > > * gcc.target/i386/avx512fp16-trunc-extendvnhf.c: Ditto. > > > > * gcc.target/i386/avx512fp16-truncvnhf.c: Ditto. > > > > * gcc.target/i386/avx512fp16-64-32-vecop-1.c: New test. > > > > * gcc.target/i386/avx512fp16-64-32-vecop-2.c: Ditto. > > > > * gcc.target/i386/pr102230.c: Ditto. > > > > --- > > > > gcc/config/i386/i386.c | 4 + > > > > gcc/config/i386/i386.h | 12 ++- > > > > gcc/config/i386/i386.md | 5 +- > > > > gcc/config/i386/mmx.md | 27 ++++--- > > > > gcc/config/i386/sse.md | 49 ++++++++++++ > > > > .../i386/avx512fp16-64-32-vecop-1.c | 30 ++++++++ > > > > .../i386/avx512fp16-64-32-vecop-2.c | 75 +++++++++++++++= ++++ > > > > .../gcc.target/i386/avx512fp16-floatvnhf.c | 12 +-- > > > > .../i386/avx512fp16-trunc-extendvnhf.c | 12 +-- > > > > .../gcc.target/i386/avx512fp16-truncvnhf.c | 12 +-- > > > > gcc/testsuite/gcc.target/i386/pr102230.c | 38 ++++++++++ > > > > 11 files changed, 243 insertions(+), 33 deletions(-) > > > > create mode 100644 gcc/testsuite/gcc.target/i386/avx512fp16-64-32-= vecop-1.c > > > > create mode 100644 gcc/testsuite/gcc.target/i386/avx512fp16-64-32-= vecop-2.c > > > > create mode 100644 gcc/testsuite/gcc.target/i386/pr102230.c > > > > > > > > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > > > > index ba89e111d28..b3e4add4b9e 100644 > > > > --- a/gcc/config/i386/i386.c > > > > +++ b/gcc/config/i386/i386.c > > > > @@ -2462,6 +2462,8 @@ classify_argument (machine_mode mode, const_t= ree type, > > > > case E_V2SFmode: > > > > case E_V2SImode: > > > > case E_V4HImode: > > > > + case E_V4HFmode: > > > > + case E_V2HFmode: > > > > case E_V8QImode: > > > > classes[0] =3D X86_64_SSE_CLASS; > > > > return 1; > > > > @@ -2902,6 +2904,7 @@ pass_in_reg: > > > > > > > > case E_V8QImode: > > > > case E_V4HImode: > > > > + case E_V4HFmode: > > > > case E_V2SImode: > > > > case E_V2SFmode: > > > > case E_V1TImode: > > > > @@ -3149,6 +3152,7 @@ pass_in_reg: > > > > > > > > case E_V8QImode: > > > > case E_V4HImode: > > > > + case E_V4HFmode: > > > > case E_V2SImode: > > > > case E_V2SFmode: > > > > case E_V1TImode: > > > > diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h > > > > index 8a4251b4926..9f3cad31f96 100644 > > > > --- a/gcc/config/i386/i386.h > > > > +++ b/gcc/config/i386/i386.h > > > > @@ -1033,7 +1033,8 @@ extern const char *host_detect_local_cpu (int= argc, const char **argv); > > > > || (MODE) =3D=3D TImode) > > > > > > > > #define VALID_AVX512FP16_REG_MODE(MODE) = \ > > > > - ((MODE) =3D=3D V8HFmode || (MODE) =3D=3D V16HFmode || (MODE) =3D= =3D V32HFmode) > > > > + ((MODE) =3D=3D V8HFmode || (MODE) =3D=3D V16HFmode || (MODE) =3D= =3D V32HFmode \ > > > > + || (MODE) =3D=3D V4HFmode || (MODE) =3D=3D V2HFmode) > > > > > > > > #define VALID_SSE2_REG_MODE(MODE) = \ > > > > ((MODE) =3D=3D V16QImode || (MODE) =3D=3D V8HImode || (MODE) =3D= =3D V2DFmode \ > > > > @@ -1041,7 +1042,8 @@ extern const char *host_detect_local_cpu (int= argc, const char **argv); > > > > || (MODE) =3D=3D V2DImode || (MODE) =3D=3D DFmode || (MODE) =3D= =3D HFmode) > > > > > > > > #define VALID_SSE2_REG_VHF_MODE(MODE) \ > > > > - (VALID_SSE2_REG_MODE (MODE) || (MODE) =3D=3D V8HFmode) > > > > + (VALID_SSE2_REG_MODE (MODE) || (MODE) =3D=3D V8HFmode \ > > > > + || (MODE) =3D=3D V4HFmode || (MODE) =3D=3D V2HFmode) > > > > > > > > #define VALID_SSE_REG_MODE(MODE) = \ > > > > ((MODE) =3D=3D V1TImode || (MODE) =3D=3D TImode = \ > > > > @@ -1054,7 +1056,8 @@ extern const char *host_detect_local_cpu (int= argc, const char **argv); > > > > #define VALID_MMX_REG_MODE(MODE) = \ > > > > ((MODE) =3D=3D V1DImode || (MODE) =3D=3D DImode = \ > > > > || (MODE) =3D=3D V2SImode || (MODE) =3D=3D SImode = \ > > > > - || (MODE) =3D=3D V4HImode || (MODE) =3D=3D V8QImode) > > > > + || (MODE) =3D=3D V4HImode || (MODE) =3D=3D V8QImode = \ > > > > + || (MODE) =3D=3D V4HFmode) > > > > > > > > #define VALID_MASK_REG_MODE(MODE) ((MODE) =3D=3D HImode || (MODE) = =3D=3D QImode) > > > > > > > > @@ -1087,7 +1090,8 @@ extern const char *host_detect_local_cpu (int= argc, const char **argv); > > > > || (MODE) =3D=3D V4DImode || (MODE) =3D=3D V8SFmode || (MODE) = =3D=3D V4DFmode \ > > > > || (MODE) =3D=3D V2TImode || (MODE) =3D=3D V8DImode || (MODE) = =3D=3D V64QImode \ > > > > || (MODE) =3D=3D V16SImode || (MODE) =3D=3D V32HImode || (MODE)= =3D=3D V8DFmode \ > > > > - || (MODE) =3D=3D V16SFmode || VALID_AVX512FP16_REG_MODE (MODE)) > > > > + || (MODE) =3D=3D V16SFmode || (MODE) =3D=3D V32HFmode || (MODE)= =3D=3D V16HFmode \ > > > > + || (MODE) =3D=3D V8HFmode) > > > > > > > > #define X87_FLOAT_MODE_P(MODE) \ > > > > (TARGET_80387 && ((MODE) =3D=3D SFmode || (MODE) =3D=3D DFmode |= | (MODE) =3D=3D XFmode)) > > > > diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md > > > > index c6279e620c9..758d7d1e3c0 100644 > > > > --- a/gcc/config/i386/i386.md > > > > +++ b/gcc/config/i386/i386.md > > > > @@ -498,7 +498,7 @@ > > > > ;; Main data type used by the insn > > > > (define_attr "mode" > > > > "unknown,none,QI,HI,SI,DI,TI,OI,XI,HF,SF,DF,XF,TF,V32HF,V16HF,V8= HF, > > > > - V16SF,V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,V8DF" > > > > + V16SF,V8SF,V4DF,V4SF,V2DF,V2SF,V1DF,V8DF,V4HF,V2HF" > > > > (const_string "unknown")) > > > > > > > > ;; The CPU unit operations uses. > > > > @@ -1106,7 +1106,8 @@ > > > > (V1TI "16") (V2TI "32") (V4TI "64") > > > > (V2DF "16") (V4DF "32") (V8DF "64") > > > > (V4SF "16") (V8SF "32") (V16SF "64") > > > > - (V8HF "16") (V16HF "32") (V32HF "64")]= ) > > > > + (V8HF "16") (V16HF "32") (V32HF "64") > > > > + (V4HF "8") (V2HF "4")]) > > > > > > > > ;; Double word integer modes as mode attribute. > > > > (define_mode_attr DWI [(QI "HI") (HI "SI") (SI "DI") (DI "TI") (TI= "OI")]) > > > > diff --git a/gcc/config/i386/mmx.md b/gcc/config/i386/mmx.md > > > > index b0093778fc6..68e1c4b2dbd 100644 > > > > --- a/gcc/config/i386/mmx.md > > > > +++ b/gcc/config/i386/mmx.md > > > > @@ -48,7 +48,7 @@ > > > > (define_mode_iterator MMXMODEI8 [V8QI V4HI V2SI (V1DI "TARGET_SSE2= ")]) > > > > > > > > ;; All 8-byte vector modes handled by MMX > > > > -(define_mode_iterator MMXMODE [V8QI V4HI V2SI V1DI V2SF]) > > > > +(define_mode_iterator MMXMODE [V8QI V4HI V2SI V1DI V2SF V4HF]) > > > > (define_mode_iterator MMXMODE124 [V8QI V4HI V2SI V2SF]) > > > > > > > > ;; Mix-n-match > > > > @@ -57,8 +57,8 @@ > > > > (define_mode_iterator MMXMODE24 [V4HI V2SI]) > > > > (define_mode_iterator MMXMODE248 [V4HI V2SI V1DI]) > > > > > > > > -;; All 4-byte integer vector modes > > > > -(define_mode_iterator V_32 [V4QI V2HI V1SI]) > > > > +;; All 4-byte integer/float16 vector modes > > > > +(define_mode_iterator V_32 [V4QI V2HI V1SI V2HF]) > > > > > > > > ;; 4-byte integer vector modes > > > > (define_mode_iterator VI_32 [V4QI V2HI]) > > > > @@ -191,6 +191,8 @@ > > > > (eq_attr "alternative" "11,12") > > > > (cond [(match_test "mode =3D=3D V2SFmode") > > > > (const_string "V4SF") > > > > + (match_test "mode =3D=3D V4HFmode") > > > > + (const_string "V4SF") > > > > (ior (not (match_test "TARGET_SSE2")) > > > > (match_test "optimize_function_for_size_p= (cfun)")) > > > > (const_string "V4SF") > > > > @@ -198,14 +200,16 @@ > > > > (const_string "TI")) > > > > > > > > (and (eq_attr "alternative" "13") > > > > - (ior (and (match_test "mode =3D=3D V2SFmode"= ) > > > > - (not (match_test "TARGET_MMX_WITH_SSE"))= ) > > > > - (not (match_test "TARGET_SSE2")))) > > > > + (ior (ior (and (match_test "mode =3D=3D V2SF= mode") > > > > + (not (match_test "TARGET_MMX_WITH_S= SE"))) > > > > + (not (match_test "TARGET_SSE2"))) > > > > + (match_test "mode =3D=3D V4HFmode"))) > > > > (const_string "V2SF") > > > > > > > > (and (eq_attr "alternative" "14") > > > > - (ior (match_test "mode =3D=3D V2SFmode") > > > > - (not (match_test "TARGET_SSE2")))) > > > > + (ior (ior (match_test "mode =3D=3D V2SFmode"= ) > > > > + (not (match_test "TARGET_SSE2"))) > > > > + (match_test "mode =3D=3D V4HFmode"))) > > > > (const_string "V2SF") > > > > ] > > > > (const_string "DI"))) > > > > @@ -289,12 +293,17 @@ > > > > (const_string "*"))) > > > > (set (attr "mode") > > > > (cond [(eq_attr "alternative" "2,3") > > > > - (cond [(match_test "TARGET_AVX") > > > > + (cond [(match_test "mode =3D=3D V2HFmode") > > > > + (const_string "V4SF") > > > > + (match_test "TARGET_AVX") > > > > (const_string "TI") > > > > (match_test "optimize_function_for_size_p (cfu= n)") > > > > (const_string "V4SF") > > > > ] > > > > (const_string "TI")) > > > > + (and (eq_attr "alternative" "4,5") > > > > + (match_test "mode =3D=3D V2HFmode")) > > > > + (const_string "SF") > > > > ] > > > > (const_string "SI"))) > > > > (set (attr "preferred_for_speed") > > > > diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md > > > > index a446dedb2ec..b7832926287 100644 > > > > --- a/gcc/config/i386/sse.md > > > > +++ b/gcc/config/i386/sse.md > > > > @@ -671,6 +671,9 @@ > > > > [(V64QI "TARGET_AVX512BW") (V32QI "TARGET_AVX512VL") > > > > (V16QI "TARGET_AVX512VL")]) > > > > > > > > +(define_mode_iterator VHF_32_64 > > > > + [V4HF V2HF]) > > > > + > > > > (define_mode_attr avx512 > > > > [(V16QI "avx512vl") (V32QI "avx512vl") (V64QI "avx512bw") > > > > (V8HI "avx512vl") (V16HI "avx512vl") (V32HI "avx512bw") > > > > @@ -1313,6 +1316,36 @@ > > > > ] > > > > (symbol_ref "true")))]) > > > > > > > > +(define_insn "*movv4hf_internal_sse" > > > > + [(set (match_operand:V4HF 0 "nonimmediate_operand" > > > > + "=3Dv,v,v,m") > > > > + (match_operand:V4HF 1 "nonimmediate_or_sse_const_operand" > > > > + " C,v,m,v"))] > > > > + "!TARGET_MMX && TARGET_SSE2 > > > > + && (register_operand (operands[0], V4HFmode) > > > > + || register_operand (operands[1], V4HFmode))" > > > > +{ > > > > + switch (get_attr_type (insn)) > > > > + { > > > > + case TYPE_SSELOG1: > > > > + return standard_sse_constant_opcode (insn, operands); > > > > + > > > > + case TYPE_SSEMOV: > > > > + return ix86_output_ssemov (insn, operands); > > > > + > > > > + default: > > > > + gcc_unreachable (); > > > > + } > > > > +} > > > > + [(set_attr "type" "sselog1,ssemov,ssemov,ssemov") > > > > + (set_attr "prefix" "maybe_vex") > > > > + (set (attr "mode") > > > > + (cond [(eq_attr "alternative" "1") > > > > + (const_string "V4SF")] > > > > + (const_string "V2SF")))] > > > > +) > > > > + > > > > + > > > > ;; If mem_addr points to a memory region with less than whole vect= or size bytes > > > > ;; of accessible memory and k is a mask that would prevent reading= the inaccessible > > > > ;; bytes from mem_addr, add UNSPEC_MASKLOAD to prevent it to be tr= ansformed to vpblendd > > > > @@ -2165,6 +2198,22 @@ > > > > (set_attr "prefix" "") > > > > (set_attr "mode" "")]) > > > > > > > > +(define_insn "3" > > > > + [(set (match_operand:VHF_32_64 0 "register_operand" "=3Dv") > > > > + (plusminusmultdiv:VHF_32_64 > > > > + (match_operand:VHF_32_64 1 "register_operand" "v") > > > > + (match_operand:VHF_32_64 2 "register_operand" "v")))] > > > > + "TARGET_AVX512FP16 && TARGET_AVX512VL" > > > > + "vph\t{%2, %1, %0|%0, %1, %2}" > > > > + [(set (attr "type") > > > > + (cond [(match_test " =3D=3D MULT") > > > > + (const_string "ssemul") > > > > + (match_test " =3D=3D DIV") > > > > + (const_string "ssediv")] > > > > + (const_string "sseadd"))) > > > > + (set_attr "prefix" "evex") > > > > + (set_attr "mode" "V8HF")]) > > > > + > > > > ;; Standard scalar operation patterns which preserve the rest of t= he > > > > ;; vector for combiner. > > > > (define_insn "*_vm3" > > > > diff --git a/gcc/testsuite/gcc.target/i386/avx512fp16-64-32-vecop-1= .c b/gcc/testsuite/gcc.target/i386/avx512fp16-64-32-vecop-1.c > > > > new file mode 100644 > > > > index 00000000000..754e909d77b > > > > --- /dev/null > > > > +++ b/gcc/testsuite/gcc.target/i386/avx512fp16-64-32-vecop-1.c > > > > @@ -0,0 +1,30 @@ > > > > +/* { dg-do compile } */ > > > > +/* { dg-options "-O2 -mavx512fp16 -mavx512vl" } */ > > > > + > > > > +/* { dg-final { scan-assembler-times "vaddph" 2 } } */ > > > > +/* { dg-final { scan-assembler-times "vsubph" 2 } } */ > > > > +/* { dg-final { scan-assembler-times "vmulph" 2 } } */ > > > > +/* { dg-final { scan-assembler-times "vdivph" 2 } } */ > > > > + > > > > +#define DO_PRAGMA(X) _Pragma(#X) > > > > + > > > > +#define VEC_OP_VV(size, op, name) \ > > > > +void \ > > > > +__attribute__ ((noinline, noclone, optimize("tree-slp-vectorize"))= ) \ > > > > +vecop_v##size##hf##name (_Float16 * restrict dst, \ > > > > + _Float16 * restrict src1, _Float16 * restrict src2) \ > > > > +{ \ > > > > + int i; \ > > > > + DO_PRAGMA (GCC unroll size) \ > > > > + for (i =3D 0; i < size; i++) \ > > > > + dst[i] =3D src1[i] op src2[i]; \ > > > > +} > > > > + > > > > +VEC_OP_VV(4, +, add) > > > > +VEC_OP_VV(2, +, add) > > > > +VEC_OP_VV(4, -, sub) > > > > +VEC_OP_VV(2, -, sub) > > > > +VEC_OP_VV(4, *, mul) > > > > +VEC_OP_VV(2, *, mul) > > > > +VEC_OP_VV(4, /, div) > > > > +VEC_OP_VV(2, /, div) > > > > diff --git a/gcc/testsuite/gcc.target/i386/avx512fp16-64-32-vecop-2= .c b/gcc/testsuite/gcc.target/i386/avx512fp16-64-32-vecop-2.c > > > > new file mode 100644 > > > > index 00000000000..4dc6f9fb92e > > > > --- /dev/null > > > > +++ b/gcc/testsuite/gcc.target/i386/avx512fp16-64-32-vecop-2.c > > > > @@ -0,0 +1,75 @@ > > > > +/* { dg-do run { target avx512fp16 } } */ > > > > +/* { dg-options "-O2 -mavx512fp16 -mavx512vl" } */ > > > > + > > > > +static void vec_op_test (void); > > > > +#define DO_TEST vec_op_test > > > > +#define AVX512FP16 > > > > +#define AVX512VL > > > > +#include "avx512f-check.h" > > > > +#include "avx512fp16-64-32-vecop-1.c" > > > > + > > > > +_Float16 a[4], b[4], fexp[4], fref[4]; > > > > + > > > > +#define EMULATE_VEC_OP_VV(size, op, name) \ > > > > +void \ > > > > +__attribute__ ((noinline, noclone)) \ > > > > +scalar_vecop_v##size##hf##name ( \ > > > > + _Float16 * restrict dst, _Float16 * restrict src1, \ > > > > + _Float16 * restrict src2) \ > > > > +{ \ > > > > + int i; \ > > > > + for (i =3D 0; i < size; i++) \ > > > > + dst[i] =3D src1[i] op src2[i]; \ > > > > +} > > > > + > > > > +EMULATE_VEC_OP_VV (4, +, add) > > > > +EMULATE_VEC_OP_VV (2, +, add) > > > > +EMULATE_VEC_OP_VV (4, -, sub) > > > > +EMULATE_VEC_OP_VV (2, -, sub) > > > > +EMULATE_VEC_OP_VV (4, *, mul) > > > > +EMULATE_VEC_OP_VV (2, *, mul) > > > > +EMULATE_VEC_OP_VV (4, /, div) > > > > +EMULATE_VEC_OP_VV (2, /, div) > > > > + > > > > +void init() > > > > +{ > > > > + int i; > > > > + for (i =3D 0; i < 4; i++) > > > > + { > > > > + a[i] =3D i + 0.5; > > > > + b[i] =3D i * 1.5; > > > > + fexp[i] =3D fref[i] =3D 2.75 * i; > > > > + } > > > > +} > > > > + > > > > +int check_cond(void *a, void *b, int size) > > > > +{ > > > > + int i; > > > > + unsigned short *pa =3D (unsigned short *)a, > > > > + *pb =3D (unsigned short *)b; > > > > + for (i =3D 0; i < size; i++) > > > > + if (pa[i] !=3D pb[i]) > > > > + return 0; > > > > + return 1; > > > > +} > > > > + > > > > +#define TEST_VEC_OP_VV(size, name) \ > > > > +{ \ > > > > + init (); \ > > > > + scalar_vecop_v##size##hf##name (a, b, fexp); \ > > > > + vecop_v##size##hf##name (a, b, fref); \ > > > > + if (!check_cond ((void *)fexp, (void *)fref, size)) \ > > > > + abort(); \ > > > > +} > > > > + > > > > +static void vec_op_test() > > > > +{ > > > > + TEST_VEC_OP_VV (4, add) > > > > + TEST_VEC_OP_VV (2, add) > > > > + TEST_VEC_OP_VV (4, sub) > > > > + TEST_VEC_OP_VV (2, sub) > > > > + TEST_VEC_OP_VV (4, mul) > > > > + TEST_VEC_OP_VV (2, mul) > > > > + TEST_VEC_OP_VV (4, div) > > > > + TEST_VEC_OP_VV (2, div) > > > > +} > > > > diff --git a/gcc/testsuite/gcc.target/i386/avx512fp16-floatvnhf.c b= /gcc/testsuite/gcc.target/i386/avx512fp16-floatvnhf.c > > > > index 112ac3e74d5..8471a1d1d10 100644 > > > > --- a/gcc/testsuite/gcc.target/i386/avx512fp16-floatvnhf.c > > > > +++ b/gcc/testsuite/gcc.target/i386/avx512fp16-floatvnhf.c > > > > @@ -43,16 +43,16 @@ FLOATHFVV(2, udi) > > > > > > > > /* { dg-final { scan-assembler-times "vcvtqq2phz\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvtuqq2phz\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > -/* { dg-final { scan-assembler-times "vcvtqq2phy\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > -/* { dg-final { scan-assembler-times "vcvtuqq2phy\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > -/* { dg-final { scan-assembler-times "vcvtqq2phx\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > -/* { dg-final { scan-assembler-times "vcvtuqq2phx\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > +/* { dg-final { scan-assembler-times "vcvtqq2phy\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > +/* { dg-final { scan-assembler-times "vcvtuqq2phy\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > +/* { dg-final { scan-assembler-times "vcvtqq2phx\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > +/* { dg-final { scan-assembler-times "vcvtuqq2phx\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvtdq2ph\[ \\t\]+\[^\{\n\]*= \[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvtudq2ph\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvtdq2phy\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvtudq2phy\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > -/* { dg-final { scan-assembler-times "vcvtdq2phx\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > -/* { dg-final { scan-assembler-times "vcvtudq2phx\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > +/* { dg-final { scan-assembler-times "vcvtdq2phx\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > +/* { dg-final { scan-assembler-times "vcvtudq2phx\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvtw2ph\[ \\t\]+\[^\{\n\]*\= [^\n\r]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvtuw2ph\[ \\t\]+\[^\{\n\]*= \[^\n\r]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvtw2ph\[ \\t\]+\[^\{\n\]*\= [^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > diff --git a/gcc/testsuite/gcc.target/i386/avx512fp16-trunc-extendv= nhf.c b/gcc/testsuite/gcc.target/i386/avx512fp16-trunc-extendvnhf.c > > > > index 286ea9f2624..2ef901a0375 100644 > > > > --- a/gcc/testsuite/gcc.target/i386/avx512fp16-trunc-extendvnhf.c > > > > +++ b/gcc/testsuite/gcc.target/i386/avx512fp16-trunc-extendvnhf.c > > > > @@ -41,15 +41,15 @@ EXTENDHFVV(8, sf) > > > > EXTENDHFVV(4, sf) > > > > > > > > /* { dg-final { scan-assembler-times "vcvtpd2phz\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > -/* { dg-final { scan-assembler-times "vcvtpd2phy\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > -/* { dg-final { scan-assembler-times "vcvtpd2phx\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > +/* { dg-final { scan-assembler-times "vcvtpd2phy\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > +/* { dg-final { scan-assembler-times "vcvtpd2phx\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvtps2phx\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvtps2phxy\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > -/* { dg-final { scan-assembler-times "vcvtps2phxx\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > +/* { dg-final { scan-assembler-times "vcvtps2phxx\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvtph2pd\[ \\t\]+\[^\{\n\]*= \[^\n\r]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > -/* { dg-final { scan-assembler-times "vcvtph2pd\[ \\t\]+\[^\{\n\]*= \[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > -/* { dg-final { scan-assembler-times "vcvtph2pd\[ \\t\]+\[^\{\n\]*= \[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > +/* { dg-final { scan-assembler-times "vcvtph2pd\[ \\t\]+\[^\{\n\]*= \[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > +/* { dg-final { scan-assembler-times "vcvtph2pd\[ \\t\]+\[^\{\n\]*= \[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvtph2psx\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvtph2psx\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > -/* { dg-final { scan-assembler-times "vcvtph2psx\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > +/* { dg-final { scan-assembler-times "vcvtph2psx\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > > > > > diff --git a/gcc/testsuite/gcc.target/i386/avx512fp16-truncvnhf.c b= /gcc/testsuite/gcc.target/i386/avx512fp16-truncvnhf.c > > > > index ee55cd12300..7a51c9dd077 100644 > > > > --- a/gcc/testsuite/gcc.target/i386/avx512fp16-truncvnhf.c > > > > +++ b/gcc/testsuite/gcc.target/i386/avx512fp16-truncvnhf.c > > > > @@ -43,16 +43,16 @@ FIX_TRUNCHFVV(2, udi) > > > > > > > > /* { dg-final { scan-assembler-times "vcvttph2qq\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvttph2uqq\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > -/* { dg-final { scan-assembler-times "vcvttph2qq\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > -/* { dg-final { scan-assembler-times "vcvttph2uqq\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > -/* { dg-final { scan-assembler-times "vcvttph2qq\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > -/* { dg-final { scan-assembler-times "vcvttph2uqq\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > +/* { dg-final { scan-assembler-times "vcvttph2qq\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > +/* { dg-final { scan-assembler-times "vcvttph2uqq\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > +/* { dg-final { scan-assembler-times "vcvttph2qq\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > +/* { dg-final { scan-assembler-times "vcvttph2uqq\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvttph2dq\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvttph2udq\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvttph2dq\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvttph2udq\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > -/* { dg-final { scan-assembler-times "vcvttph2dq\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > -/* { dg-final { scan-assembler-times "vcvttph2udq\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 { xfail *-*-* } } } */ > > > > +/* { dg-final { scan-assembler-times "vcvttph2dq\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > +/* { dg-final { scan-assembler-times "vcvttph2udq\[ \\t\]+\[^\{\n\= ]*\[^\n\r]*%xmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvttph2w\[ \\t\]+\[^\{\n\]*= \[^\n\r]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvttph2uw\[ \\t\]+\[^\{\n\]= *\[^\n\r]*%zmm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > /* { dg-final { scan-assembler-times "vcvttph2w\[ \\t\]+\[^\{\n\]*= \[^\n\r]*%ymm\[0-9\]+(?:\n|\[ \\t\]+#)" 1 } } */ > > > > diff --git a/gcc/testsuite/gcc.target/i386/pr102230.c b/gcc/testsui= te/gcc.target/i386/pr102230.c > > > > new file mode 100644 > > > > index 00000000000..60cf1c32afe > > > > --- /dev/null > > > > +++ b/gcc/testsuite/gcc.target/i386/pr102230.c > > > > @@ -0,0 +1,38 @@ > > > > +/* { dg-do compile } */ > > > > +/* { dg-options "-O2 -mavx512fp16" } */ > > > > + > > > > +typedef _Float16 v4hf __attribute__ ((vector_size (8))); > > > > +typedef _Float16 v2hf __attribute__ ((vector_size (4))); > > > > + > > > > +v4hf > > > > +v4hf_abi_1 (v4hf a) > > > > +{ > > > > + return a; > > > > +} > > > > + > > > > +v4hf > > > > +v4hf_abi_3 (v4hf a, v4hf b, v4hf c) > > > > +{ > > > > + return c; > > > > +} > > > > + > > > > +/* { dg-final { scan-assembler-times "movq\[[\\t \]*%mm2, %mm0" 1 = { target { ia32 } } } } */ > > > > +/* { dg-final { scan-assembler-times "vmovaps\[[\\t \]*%xmm2, %xmm= 0" 1 { target { ! ia32 } } } } */ > > > > + > > > > +v4hf > > > > +v4hf_abi_4 (v4hf a, v4hf b, v4hf c, v4hf d) > > > > +{ > > > > + return d; > > > > +} > > > > + > > > > +/* { dg-final { scan-assembler-times "movq\[[\\t \]*4\[(\]%esp\[)\= ], %mm0" 1 { target { ia32 } } } } */ > > > > +/* { dg-final { scan-assembler-times "vmovaps\[[\\t \]*%xmm3, %xmm= 0" 1 { target { ! ia32 } } } } */ > > > > + > > > > +v2hf > > > > +v2hf_test (v2hf a, v2hf b, v2hf c, v2hf d) > > > > +{ > > > > + return b; > > > > +} > > > > + > > > > +/* { dg-final { scan-assembler-times "movl\[[\\t \]*8\[(\]%esp\[)\= ], %eax" 1 { target { ia32 } } } } */ > > > > +/* { dg-final { scan-assembler-times "vmovaps\[[\\t \]*%xmm1, %xmm= 0" 1 { target { ! ia32 } } } } */ > > > > -- > > > > 2.18.1 > > > > --000000000000d5e47705cd091f63 Content-Type: text/x-patch; charset="US-ASCII"; name="FP16_64_32bit_v3.patch" Content-Disposition: attachment; filename="FP16_64_32bit_v3.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ku3qzlfe0 RnJvbSAyNzYwNzZkOGQ4OGY5Zjg0MzYxYTUwMDEzNWJhNjFiZTMwNjExYTJhIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBIb25neXUgV2FuZyA8aG9uZ3l1LndhbmdAaW50ZWwuY29tPgpE YXRlOiBUaHUsIDE1IEp1bCAyMDIxIDEzOjMxOjI0ICswODAwClN1YmplY3Q6IFtQQVRDSF0gQVZY NTEyRlAxNjogU3VwcG9ydCBiYXNpYyA2NC8zMmJpdCB2ZWN0b3IgdHlwZSBhbmQgb3BlcmF0aW9u LgoKRm9yIDMyYml0IHRhcmdldCwgVjRIRiB2ZWN0b3IgaXMgcGFyc2VkIHNhbWUgYXMgX19tNjQg dHlwZSwgVjJIRgppcyBwYXJzZWQgYnkgc3RhY2sgYW5kIHJldHVybmVkIGZyb20gR1BSIHNpbmNl IGl0IGlzIG5vdCBzcGVjaWZpZWQKYnkgQUJJLgoKZ2NjL0NoYW5nZUxvZzoKCglQUiB0YXJnZXQv MTAyMjMwCgkqIGNvbmZpZy9pMzg2L2kzODYuaCAoVkFMSURfQVZYNTEyRlAxNl9SRUdfTU9ERSk6 IEFkZAoJVjJIRiBtb2RlIGNoZWNrLgoJKFZBTElEX1NTRTJfUkVHX1ZIRl9NT0RFKTogQWRkIFY0 SEZtb2RlIGFuZCBWMkhGbW9kZS4KCShWQUxJRF9NTVhfUkVHX01PREUpOiBBZGQgVjRIRm1vZGUu CgkoU1NFX1JFR19NT0RFX1ApOiBSZXBsYWNlIFZBTElEX0FWWDUxMkZQMTZfUkVHX01PREUgd2l0 aAoJdmVjdG9yIG1vZGUgY29uZGl0aW9uLgoJKiBjb25maWcvaTM4Ni9pMzg2LmMgKGNsYXNzaWZ5 X2FyZ3VtZW50KTogUGFyc2UgVjRIRi9WMkhGCgl2aWEgc3NlIHJlZ3MuCgkoZnVuY3Rpb25fYXJn XzMyKTogQWRkIFY0SEZtb2RlLgoJKGZ1bmN0aW9uX2FyZ19hZHZhbmNlXzMyKTogTGlrZXdpc2Uu CgkqIGNvbmZpZy9pMzg2L2kzODYubWQgKG1vZGUpOiBBZGQgVjRIRi9WMkhGLgoJKE1PREVfU0la RSk6IExpa2V3aXNlLgoJKiBjb25maWcvaTM4Ni9tbXgubWQgKE1NWE1PREUpOiBBZGQgVjRIRiBt b2RlLgoJKFZfMzIpOiBBZGQgVjJIRiBtb2RlLgoJKFZIRl8zMl82NCk6IE5ldyBtb2RlIGl0ZXJh dG9yLgoJKCptb3Y8bW9kZT5faW50ZXJuYWwpOiBBZGp1c3Qgc3NlIGFsdGVybmF0aXZlcyB0byBz dXBwb3J0CglWNEhGIG1vZGUgbW92ZS4KCSgqbW92PG1vZGU+X2ludGVybmFsKTogQWRqdXN0IHNz ZSBhbHRlcm5hdGl2ZXMgdG8gc3VwcG9ydAoJVjJIRiBtb2RlIG1vdmUuCgkoPGluc24+PG1vZGU+ Myk6IE5ldyBkZWZpbmVfaW5zbiBmb3IgYWRkL3N1Yi9tdWwvZGl2LgoKZ2NjL3Rlc3RzdWl0ZS9D aGFuZ2VMb2c6CgoJUFIgdGFyZ2V0LzEwMjIzMAoJKiBnY2MudGFyZ2V0L2kzODYvYXZ4NTEyZnAx Ni1mbG9hdHZuaGYuYzogUmVtb3ZlIHhmYWlsLgoJKiBnY2MudGFyZ2V0L2kzODYvYXZ4NTEyZnAx Ni10cnVuYy1leHRlbmR2bmhmLmM6IERpdHRvLgoJKiBnY2MudGFyZ2V0L2kzODYvYXZ4NTEyZnAx Ni10cnVuY3ZuaGYuYzogRGl0dG8uCgkqIGdjYy50YXJnZXQvaTM4Ni9hdng1MTJmcDE2LTY0LTMy LXZlY29wLTEuYzogTmV3IHRlc3QuCgkqIGdjYy50YXJnZXQvaTM4Ni9hdng1MTJmcDE2LTY0LTMy LXZlY29wLTIuYzogRGl0dG8uCgkqIGdjYy50YXJnZXQvaTM4Ni9wcjEwMjIzMC5jOiBEaXR0by4K LS0tCiBnY2MvY29uZmlnL2kzODYvaTM4Ni5jICAgICAgICAgICAgICAgICAgICAgICAgfCAgNCAr CiBnY2MvY29uZmlnL2kzODYvaTM4Ni5oICAgICAgICAgICAgICAgICAgICAgICAgfCAxMyArKyst CiBnY2MvY29uZmlnL2kzODYvaTM4Ni5tZCAgICAgICAgICAgICAgICAgICAgICAgfCAgNSArLQog Z2NjL2NvbmZpZy9pMzg2L21teC5tZCAgICAgICAgICAgICAgICAgICAgICAgIHwgNTIgKysrKysr KysrKy0tLQogLi4uL2kzODYvYXZ4NTEyZnAxNi02NC0zMi12ZWNvcC0xLmMgICAgICAgICAgIHwg MzAgKysrKysrKysKIC4uLi9pMzg2L2F2eDUxMmZwMTYtNjQtMzItdmVjb3AtMi5jICAgICAgICAg ICB8IDc1ICsrKysrKysrKysrKysrKysrKysKIC4uLi9nY2MudGFyZ2V0L2kzODYvYXZ4NTEyZnAx Ni1mbG9hdHZuaGYuYyAgICB8IDEyICstLQogLi4uL2kzODYvYXZ4NTEyZnAxNi10cnVuYy1leHRl bmR2bmhmLmMgICAgICAgIHwgMTIgKy0tCiAuLi4vZ2NjLnRhcmdldC9pMzg2L2F2eDUxMmZwMTYt dHJ1bmN2bmhmLmMgICAgfCAxMiArLS0KIGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L3By MTAyMjMwLmMgICAgICB8IDM4ICsrKysrKysrKysKIDEwIGZpbGVzIGNoYW5nZWQsIDIyMCBpbnNl cnRpb25zKCspLCAzMyBkZWxldGlvbnMoLSkKIGNyZWF0ZSBtb2RlIDEwMDY0NCBnY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvaTM4Ni9hdng1MTJmcDE2LTY0LTMyLXZlY29wLTEuYwogY3JlYXRlIG1v ZGUgMTAwNjQ0IGdjYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDUxMmZwMTYtNjQtMzIt dmVjb3AtMi5jCiBjcmVhdGUgbW9kZSAxMDA2NDQgZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kz ODYvcHIxMDIyMzAuYwoKZGlmZiAtLWdpdCBhL2djYy9jb25maWcvaTM4Ni9pMzg2LmMgYi9nY2Mv Y29uZmlnL2kzODYvaTM4Ni5jCmluZGV4IGJhODllMTExZDI4Li5iM2U0YWRkNGI5ZSAxMDA2NDQK LS0tIGEvZ2NjL2NvbmZpZy9pMzg2L2kzODYuYworKysgYi9nY2MvY29uZmlnL2kzODYvaTM4Ni5j CkBAIC0yNDYyLDYgKzI0NjIsOCBAQCBjbGFzc2lmeV9hcmd1bWVudCAobWFjaGluZV9tb2RlIG1v ZGUsIGNvbnN0X3RyZWUgdHlwZSwKICAgICBjYXNlIEVfVjJTRm1vZGU6CiAgICAgY2FzZSBFX1Yy U0ltb2RlOgogICAgIGNhc2UgRV9WNEhJbW9kZToKKyAgICBjYXNlIEVfVjRIRm1vZGU6CisgICAg Y2FzZSBFX1YySEZtb2RlOgogICAgIGNhc2UgRV9WOFFJbW9kZToKICAgICAgIGNsYXNzZXNbMF0g PSBYODZfNjRfU1NFX0NMQVNTOwogICAgICAgcmV0dXJuIDE7CkBAIC0yOTAyLDYgKzI5MDQsNyBA QCBwYXNzX2luX3JlZzoKIAogICAgIGNhc2UgRV9WOFFJbW9kZToKICAgICBjYXNlIEVfVjRISW1v ZGU6CisgICAgY2FzZSBFX1Y0SEZtb2RlOgogICAgIGNhc2UgRV9WMlNJbW9kZToKICAgICBjYXNl IEVfVjJTRm1vZGU6CiAgICAgY2FzZSBFX1YxVEltb2RlOgpAQCAtMzE0OSw2ICszMTUyLDcgQEAg cGFzc19pbl9yZWc6CiAKICAgICBjYXNlIEVfVjhRSW1vZGU6CiAgICAgY2FzZSBFX1Y0SEltb2Rl OgorICAgIGNhc2UgRV9WNEhGbW9kZToKICAgICBjYXNlIEVfVjJTSW1vZGU6CiAgICAgY2FzZSBF X1YyU0Ztb2RlOgogICAgIGNhc2UgRV9WMVRJbW9kZToKZGlmZiAtLWdpdCBhL2djYy9jb25maWcv aTM4Ni9pMzg2LmggYi9nY2MvY29uZmlnL2kzODYvaTM4Ni5oCmluZGV4IDhhNDI1MWI0OTI2Li5j YmE2ZDgzNTkxMCAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9pMzg2L2kzODYuaAorKysgYi9nY2Mv Y29uZmlnL2kzODYvaTM4Ni5oCkBAIC0xMDMzLDcgKzEwMzMsOCBAQCBleHRlcm4gY29uc3QgY2hh ciAqaG9zdF9kZXRlY3RfbG9jYWxfY3B1IChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpOwog ICAgfHwgKE1PREUpID09IFRJbW9kZSkKIAogI2RlZmluZSBWQUxJRF9BVlg1MTJGUDE2X1JFR19N T0RFKE1PREUpCQkJCQlcCi0gICgoTU9ERSkgPT0gVjhIRm1vZGUgfHwgKE1PREUpID09IFYxNkhG bW9kZSB8fCAoTU9ERSkgPT0gVjMySEZtb2RlKQorICAoKE1PREUpID09IFY4SEZtb2RlIHx8IChN T0RFKSA9PSBWMTZIRm1vZGUgfHwgKE1PREUpID09IFYzMkhGbW9kZQlcCisgICB8fCAoTU9ERSkg PT0gVjJIRm1vZGUpCiAKICNkZWZpbmUgVkFMSURfU1NFMl9SRUdfTU9ERShNT0RFKQkJCQkJXAog ICAoKE1PREUpID09IFYxNlFJbW9kZSB8fCAoTU9ERSkgPT0gVjhISW1vZGUgfHwgKE1PREUpID09 IFYyREZtb2RlCVwKQEAgLTEwNDEsNyArMTA0Miw4IEBAIGV4dGVybiBjb25zdCBjaGFyICpob3N0 X2RldGVjdF9sb2NhbF9jcHUgKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndik7CiAgICB8fCAo TU9ERSkgPT0gVjJESW1vZGUgfHwgKE1PREUpID09IERGbW9kZSB8fCAoTU9ERSkgPT0gSEZtb2Rl KQogCiAjZGVmaW5lIFZBTElEX1NTRTJfUkVHX1ZIRl9NT0RFKE1PREUpCQkJXAotICAoVkFMSURf U1NFMl9SRUdfTU9ERSAoTU9ERSkgfHwgKE1PREUpID09IFY4SEZtb2RlKQorICAoVkFMSURfU1NF Ml9SRUdfTU9ERSAoTU9ERSkgfHwgKE1PREUpID09IFY4SEZtb2RlCVwKKyAgIHx8IChNT0RFKSA9 PSBWNEhGbW9kZSB8fCAoTU9ERSkgPT0gVjJIRm1vZGUpCiAKICNkZWZpbmUgVkFMSURfU1NFX1JF R19NT0RFKE1PREUpCQkJCQlcCiAgICgoTU9ERSkgPT0gVjFUSW1vZGUgfHwgKE1PREUpID09IFRJ bW9kZQkJCQlcCkBAIC0xMDUxLDEwICsxMDUzLDEyIEBAIGV4dGVybiBjb25zdCBjaGFyICpob3N0 X2RldGVjdF9sb2NhbF9jcHUgKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndik7CiAjZGVmaW5l IFZBTElEX01NWF9SRUdfTU9ERV8zRE5PVyhNT0RFKSBcCiAgICgoTU9ERSkgPT0gVjJTRm1vZGUg fHwgKE1PREUpID09IFNGbW9kZSkKIAorLyogVG8gbWF0Y2ggaWEzMiBwc0FCSSwgVjRIRm1vZGUg c2hvdWxkIGJlIGFkZGVkIGhlcmUuICAqLwogI2RlZmluZSBWQUxJRF9NTVhfUkVHX01PREUoTU9E RSkJCQkJCVwKICAgKChNT0RFKSA9PSBWMURJbW9kZSB8fCAoTU9ERSkgPT0gREltb2RlCQkJCVwK ICAgIHx8IChNT0RFKSA9PSBWMlNJbW9kZSB8fCAoTU9ERSkgPT0gU0ltb2RlCQkJCVwKLSAgIHx8 IChNT0RFKSA9PSBWNEhJbW9kZSB8fCAoTU9ERSkgPT0gVjhRSW1vZGUpCisgICB8fCAoTU9ERSkg PT0gVjRISW1vZGUgfHwgKE1PREUpID09IFY4UUltb2RlCQkJCVwKKyAgIHx8IChNT0RFKSA9PSBW NEhGbW9kZSkKIAogI2RlZmluZSBWQUxJRF9NQVNLX1JFR19NT0RFKE1PREUpICgoTU9ERSkgPT0g SEltb2RlIHx8IChNT0RFKSA9PSBRSW1vZGUpCiAKQEAgLTEwODcsNyArMTA5MSw4IEBAIGV4dGVy biBjb25zdCBjaGFyICpob3N0X2RldGVjdF9sb2NhbF9jcHUgKGludCBhcmdjLCBjb25zdCBjaGFy ICoqYXJndik7CiAgICB8fCAoTU9ERSkgPT0gVjRESW1vZGUgfHwgKE1PREUpID09IFY4U0Ztb2Rl IHx8IChNT0RFKSA9PSBWNERGbW9kZQlcCiAgICB8fCAoTU9ERSkgPT0gVjJUSW1vZGUgfHwgKE1P REUpID09IFY4REltb2RlIHx8IChNT0RFKSA9PSBWNjRRSW1vZGUJXAogICAgfHwgKE1PREUpID09 IFYxNlNJbW9kZSB8fCAoTU9ERSkgPT0gVjMySEltb2RlIHx8IChNT0RFKSA9PSBWOERGbW9kZQlc Ci0gICB8fCAoTU9ERSkgPT0gVjE2U0Ztb2RlIHx8IFZBTElEX0FWWDUxMkZQMTZfUkVHX01PREUg KE1PREUpKQorICAgfHwgKE1PREUpID09IFYxNlNGbW9kZSB8fCAoTU9ERSkgPT0gVjMySEZtb2Rl IHx8IChNT0RFKSA9PSBWMTZIRm1vZGUgXAorICAgfHwgKE1PREUpID09IFY4SEZtb2RlKQogCiAj ZGVmaW5lIFg4N19GTE9BVF9NT0RFX1AoTU9ERSkJXAogICAoVEFSR0VUXzgwMzg3ICYmICgoTU9E RSkgPT0gU0Ztb2RlIHx8IChNT0RFKSA9PSBERm1vZGUgfHwgKE1PREUpID09IFhGbW9kZSkpCmRp ZmYgLS1naXQgYS9nY2MvY29uZmlnL2kzODYvaTM4Ni5tZCBiL2djYy9jb25maWcvaTM4Ni9pMzg2 Lm1kCmluZGV4IGM2Mjc5ZTYyMGM5Li43NThkN2QxZTNjMCAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZp Zy9pMzg2L2kzODYubWQKKysrIGIvZ2NjL2NvbmZpZy9pMzg2L2kzODYubWQKQEAgLTQ5OCw3ICs0 OTgsNyBAQAogOzsgTWFpbiBkYXRhIHR5cGUgdXNlZCBieSB0aGUgaW5zbgogKGRlZmluZV9hdHRy ICJtb2RlIgogICAidW5rbm93bixub25lLFFJLEhJLFNJLERJLFRJLE9JLFhJLEhGLFNGLERGLFhG LFRGLFYzMkhGLFYxNkhGLFY4SEYsCi0gICBWMTZTRixWOFNGLFY0REYsVjRTRixWMkRGLFYyU0Ys VjFERixWOERGIgorICAgVjE2U0YsVjhTRixWNERGLFY0U0YsVjJERixWMlNGLFYxREYsVjhERixW NEhGLFYySEYiCiAgIChjb25zdF9zdHJpbmcgInVua25vd24iKSkKIAogOzsgVGhlIENQVSB1bml0 IG9wZXJhdGlvbnMgdXNlcy4KQEAgLTExMDYsNyArMTEwNiw4IEBACiAJCQkgICAgIChWMVRJICIx NiIpIChWMlRJICIzMiIpIChWNFRJICI2NCIpCiAJCQkgICAgIChWMkRGICIxNiIpIChWNERGICIz MiIpIChWOERGICI2NCIpCiAJCQkgICAgIChWNFNGICIxNiIpIChWOFNGICIzMiIpIChWMTZTRiAi NjQiKQotCQkJICAgICAoVjhIRiAiMTYiKSAoVjE2SEYgIjMyIikgKFYzMkhGICI2NCIpXSkKKwkJ CSAgICAgKFY4SEYgIjE2IikgKFYxNkhGICIzMiIpIChWMzJIRiAiNjQiKQorCQkJICAgICAoVjRI RiAiOCIpIChWMkhGICI0IildKQogCiA7OyBEb3VibGUgd29yZCBpbnRlZ2VyIG1vZGVzIGFzIG1v ZGUgYXR0cmlidXRlLgogKGRlZmluZV9tb2RlX2F0dHIgRFdJIFsoUUkgIkhJIikgKEhJICJTSSIp IChTSSAiREkiKSAoREkgIlRJIikgKFRJICJPSSIpXSkKZGlmZiAtLWdpdCBhL2djYy9jb25maWcv aTM4Ni9tbXgubWQgYi9nY2MvY29uZmlnL2kzODYvbW14Lm1kCmluZGV4IGIwMDkzNzc4ZmM2Li5j OTQ2N2JjMDk1YSAxMDA2NDQKLS0tIGEvZ2NjL2NvbmZpZy9pMzg2L21teC5tZAorKysgYi9nY2Mv Y29uZmlnL2kzODYvbW14Lm1kCkBAIC00OCw3ICs0OCw3IEBACiAoZGVmaW5lX21vZGVfaXRlcmF0 b3IgTU1YTU9ERUk4IFtWOFFJIFY0SEkgVjJTSSAoVjFESSAiVEFSR0VUX1NTRTIiKV0pCiAKIDs7 IEFsbCA4LWJ5dGUgdmVjdG9yIG1vZGVzIGhhbmRsZWQgYnkgTU1YCi0oZGVmaW5lX21vZGVfaXRl cmF0b3IgTU1YTU9ERSBbVjhRSSBWNEhJIFYyU0kgVjFESSBWMlNGXSkKKyhkZWZpbmVfbW9kZV9p dGVyYXRvciBNTVhNT0RFIFtWOFFJIFY0SEkgVjJTSSBWMURJIFYyU0YgVjRIRl0pCiAoZGVmaW5l X21vZGVfaXRlcmF0b3IgTU1YTU9ERTEyNCBbVjhRSSBWNEhJIFYyU0kgVjJTRl0pCiAKIDs7IE1p eC1uLW1hdGNoCkBAIC01Nyw4ICs1Nyw4IEBACiAoZGVmaW5lX21vZGVfaXRlcmF0b3IgTU1YTU9E RTI0IFtWNEhJIFYyU0ldKQogKGRlZmluZV9tb2RlX2l0ZXJhdG9yIE1NWE1PREUyNDggW1Y0SEkg VjJTSSBWMURJXSkKIAotOzsgQWxsIDQtYnl0ZSBpbnRlZ2VyIHZlY3RvciBtb2RlcwotKGRlZmlu ZV9tb2RlX2l0ZXJhdG9yIFZfMzIgW1Y0UUkgVjJISSBWMVNJXSkKKzs7IEFsbCA0LWJ5dGUgaW50 ZWdlci9mbG9hdDE2IHZlY3RvciBtb2RlcworKGRlZmluZV9tb2RlX2l0ZXJhdG9yIFZfMzIgW1Y0 UUkgVjJISSBWMVNJIFYySEZdKQogCiA7OyA0LWJ5dGUgaW50ZWdlciB2ZWN0b3IgbW9kZXMKIChk ZWZpbmVfbW9kZV9pdGVyYXRvciBWSV8zMiBbVjRRSSBWMkhJXSkKQEAgLTY2LDYgKzY2LDkgQEAK IDs7IFYyUyogbW9kZXMKIChkZWZpbmVfbW9kZV9pdGVyYXRvciBWMkZJIFtWMlNGIFYyU0ldKQog Cis7OyA0LWJ5dGUgYW5kIDgtYnl0ZSBmbG9hdDE2IHZlY3RvciBtb2RlcworKGRlZmluZV9tb2Rl X2l0ZXJhdG9yIFZIRl8zMl82NCBbVjRIRiBWMkhGXSkKKwogOzsgTWFwcGluZyBmcm9tIGludGVn ZXIgdmVjdG9yIG1vZGUgdG8gbW5lbW9uaWMgc3VmZml4CiAoZGVmaW5lX21vZGVfYXR0ciBtbXh2 ZWNzaXplCiAgIFsoVjhRSSAiYiIpIChWNFFJICJiIikgKFY0SEkgInciKSAoVjJISSAidyIpIChW MlNJICJkIikgKFYxREkgInEiKV0pCkBAIC0xOTEsNiArMTk0LDggQEAKIAkgICAgKGVxX2F0dHIg ImFsdGVybmF0aXZlIiAiMTEsMTIiKQogCSAgICAgIChjb25kIFsobWF0Y2hfdGVzdCAiPE1PREU+ bW9kZSA9PSBWMlNGbW9kZSIpCiAJCSAgICAgICAoY29uc3Rfc3RyaW5nICJWNFNGIikKKwkJICAg ICAobWF0Y2hfdGVzdCAiPE1PREU+bW9kZSA9PSBWNEhGbW9kZSIpCisJCSAgICAgICAoY29uc3Rf c3RyaW5nICJWNFNGIikKIAkJICAgICAoaW9yIChub3QgKG1hdGNoX3Rlc3QgIlRBUkdFVF9TU0Uy IikpCiAJCQkgIChtYXRjaF90ZXN0ICJvcHRpbWl6ZV9mdW5jdGlvbl9mb3Jfc2l6ZV9wIChjZnVu KSIpKQogCQkgICAgICAgKGNvbnN0X3N0cmluZyAiVjRTRiIpCkBAIC0xOTgsMTQgKzIwMywxNiBA QAogCQkgICAgKGNvbnN0X3N0cmluZyAiVEkiKSkKIAogCSAgICAoYW5kIChlcV9hdHRyICJhbHRl cm5hdGl2ZSIgIjEzIikKLQkJIChpb3IgKGFuZCAobWF0Y2hfdGVzdCAiPE1PREU+bW9kZSA9PSBW MlNGbW9kZSIpCi0JCQkgICAobm90IChtYXRjaF90ZXN0ICJUQVJHRVRfTU1YX1dJVEhfU1NFIikp KQotCQkgICAgICAobm90IChtYXRjaF90ZXN0ICJUQVJHRVRfU1NFMiIpKSkpCisJCSAoaW9yIChp b3IgKGFuZCAobWF0Y2hfdGVzdCAiPE1PREU+bW9kZSA9PSBWMlNGbW9kZSIpCisJCQkJKG5vdCAo bWF0Y2hfdGVzdCAiVEFSR0VUX01NWF9XSVRIX1NTRSIpKSkKKwkJCSAgIChub3QgKG1hdGNoX3Rl c3QgIlRBUkdFVF9TU0UyIikpKQorCQkgICAgICAobWF0Y2hfdGVzdCAiPE1PREU+bW9kZSA9PSBW NEhGbW9kZSIpKSkKIAkgICAgICAoY29uc3Rfc3RyaW5nICJWMlNGIikKIAogCSAgICAoYW5kIChl cV9hdHRyICJhbHRlcm5hdGl2ZSIgIjE0IikKLQkgICAgCSAoaW9yIChtYXRjaF90ZXN0ICI8TU9E RT5tb2RlID09IFYyU0Ztb2RlIikKLQkJICAgICAgKG5vdCAobWF0Y2hfdGVzdCAiVEFSR0VUX1NT RTIiKSkpKQorCQkgKGlvciAoaW9yIChtYXRjaF90ZXN0ICI8TU9ERT5tb2RlID09IFYyU0Ztb2Rl IikKKwkJCSAgIChub3QgKG1hdGNoX3Rlc3QgIlRBUkdFVF9TU0UyIikpKQorCQkgICAgICAobWF0 Y2hfdGVzdCAiPE1PREU+bW9kZSA9PSBWNEhGbW9kZSIpKSkKIAkgICAgICAoY29uc3Rfc3RyaW5n ICJWMlNGIikKIAkgICBdCiAJICAgKGNvbnN0X3N0cmluZyAiREkiKSkpCkBAIC0yODksMTIgKzI5 NiwxNyBAQAogICAgICAgIChjb25zdF9zdHJpbmcgIioiKSkpCiAgICAoc2V0IChhdHRyICJtb2Rl IikKICAgICAgKGNvbmQgWyhlcV9hdHRyICJhbHRlcm5hdGl2ZSIgIjIsMyIpCi0JICAgICAgKGNv bmQgWyhtYXRjaF90ZXN0ICJUQVJHRVRfQVZYIikKKwkgICAgICAoY29uZCBbKG1hdGNoX3Rlc3Qg IjxNT0RFPm1vZGUgPT0gVjJIRm1vZGUiKQorCQkgICAgICAgKGNvbnN0X3N0cmluZyAiVjRTRiIp CisJCSAgICAgKG1hdGNoX3Rlc3QgIlRBUkdFVF9BVlgiKQogCQkgICAgICAgKGNvbnN0X3N0cmlu ZyAiVEkiKQogCQkgICAgIChtYXRjaF90ZXN0ICJvcHRpbWl6ZV9mdW5jdGlvbl9mb3Jfc2l6ZV9w IChjZnVuKSIpCiAJCSAgICAgICAoY29uc3Rfc3RyaW5nICJWNFNGIikKIAkJICAgIF0KIAkJICAg IChjb25zdF9zdHJpbmcgIlRJIikpCisJICAgIChhbmQgKGVxX2F0dHIgImFsdGVybmF0aXZlIiAi NCw1IikKKwkJIChtYXRjaF90ZXN0ICI8TU9ERT5tb2RlID09IFYySEZtb2RlIikpCisJICAgICAg KGNvbnN0X3N0cmluZyAiU0YiKQogCSAgIF0KIAkgICAoY29uc3Rfc3RyaW5nICJTSSIpKSkKICAg IChzZXQgKGF0dHIgInByZWZlcnJlZF9mb3Jfc3BlZWQiKQpAQCAtMTM5MSw2ICsxNDAzLDI4IEBA CiAgIERPTkU7CiB9KQogCis7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzsKKzs7Cis7OyBQYXJhbGxlbCBoYWxmLXByZWNp c2lvbiBmbG9hdGluZyBwb2ludCBhcml0aG1ldGljCis7OworOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7CisKKyhkZWZp bmVfaW5zbiAiPGluc24+PG1vZGU+MyIKKyAgWyhzZXQgKG1hdGNoX29wZXJhbmQ6VkhGXzMyXzY0 IDAgInJlZ2lzdGVyX29wZXJhbmQiICI9diIpCisJKHBsdXNtaW51c211bHRkaXY6VkhGXzMyXzY0 CisJICAobWF0Y2hfb3BlcmFuZDpWSEZfMzJfNjQgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIjxjb21t PnYiKQorCSAgKG1hdGNoX29wZXJhbmQ6VkhGXzMyXzY0IDIgInJlZ2lzdGVyX29wZXJhbmQiICJ2 IikpKV0KKyAgIlRBUkdFVF9BVlg1MTJGUDE2ICYmIFRBUkdFVF9BVlg1MTJWTCIKKyAgInY8aW5z bj5waFx0eyUyLCAlMSwgJTB8JTAsICUxLCAlMn0iCisgIFsoc2V0IChhdHRyICJ0eXBlIikKKyAg ICAgIChjb25kIFsobWF0Y2hfdGVzdCAiPENPREU+ID09IE1VTFQiKQorCQkoY29uc3Rfc3RyaW5n ICJzc2VtdWwiKQorCSAgICAgKG1hdGNoX3Rlc3QgIjxDT0RFPiA9PSBESVYiKQorCQkoY29uc3Rf c3RyaW5nICJzc2VkaXYiKV0KKwkgICAgIChjb25zdF9zdHJpbmcgInNzZWFkZCIpKSkKKyAgIChz ZXRfYXR0ciAicHJlZml4IiAiZXZleCIpCisgICAoc2V0X2F0dHIgIm1vZGUiICJWOEhGIildKQor CiA7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7 Ozs7Ozs7Ozs7Ozs7OzsKIDs7CiA7OyBQYXJhbGxlbCBpbnRlZ3JhbCBhcml0aG1ldGljCmRpZmYg LS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9hdng1MTJmcDE2LTY0LTMyLXZl Y29wLTEuYyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDUxMmZwMTYtNjQtMzIt dmVjb3AtMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAwMDAwLi43NTRlOTA5 ZDc3YgotLS0gL2Rldi9udWxsCisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2 eDUxMmZwMTYtNjQtMzItdmVjb3AtMS5jCkBAIC0wLDAgKzEsMzAgQEAKKy8qIHsgZGctZG8gY29t cGlsZSB9ICovCisvKiB7IGRnLW9wdGlvbnMgIi1PMiAtbWF2eDUxMmZwMTYgLW1hdng1MTJ2bCIg fSAqLworCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInZhZGRwaCIgMiB9 IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidnN1YnBoIiAyIH0g fSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2bXVscGgiIDIgfSB9 ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInZkaXZwaCIgMiB9IH0g Ki8KKworI2RlZmluZSBET19QUkFHTUEoWCkgX1ByYWdtYSgjWCkKKworI2RlZmluZSBWRUNfT1Bf VlYoc2l6ZSwgb3AsIG5hbWUpICAgICAgIFwKK3ZvaWQgXAorX19hdHRyaWJ1dGVfXyAoKG5vaW5s aW5lLCBub2Nsb25lLCBvcHRpbWl6ZSgidHJlZS1zbHAtdmVjdG9yaXplIikpKSBcCit2ZWNvcF92 IyNzaXplIyNoZiMjbmFtZSAoX0Zsb2F0MTYgKiByZXN0cmljdCBkc3QsICBcCisgX0Zsb2F0MTYg KiByZXN0cmljdCBzcmMxLCBfRmxvYXQxNiAqIHJlc3RyaWN0IHNyYzIpICAgXAoreyBcCisgICAg aW50IGk7ICBcCisgICAgRE9fUFJBR01BIChHQ0MgdW5yb2xsIHNpemUpICAgXAorICAgIGZvciAo aSA9IDA7IGkgPCBzaXplOyBpKyspICBcCisgICAgICBkc3RbaV0gPSBzcmMxW2ldIG9wIHNyYzJb aV07ICBcCit9CisKK1ZFQ19PUF9WVig0LCArLCBhZGQpCitWRUNfT1BfVlYoMiwgKywgYWRkKQor VkVDX09QX1ZWKDQsIC0sIHN1YikKK1ZFQ19PUF9WVigyLCAtLCBzdWIpCitWRUNfT1BfVlYoNCwg KiwgbXVsKQorVkVDX09QX1ZWKDIsICosIG11bCkKK1ZFQ19PUF9WVig0LCAvLCBkaXYpCitWRUNf T1BfVlYoMiwgLywgZGl2KQpkaWZmIC0tZ2l0IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kz ODYvYXZ4NTEyZnAxNi02NC0zMi12ZWNvcC0yLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQv aTM4Ni9hdng1MTJmcDE2LTY0LTMyLXZlY29wLTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRl eCAwMDAwMDAwMDAwMC4uNGRjNmY5ZmI5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1 aXRlL2djYy50YXJnZXQvaTM4Ni9hdng1MTJmcDE2LTY0LTMyLXZlY29wLTIuYwpAQCAtMCwwICsx LDc1IEBACisvKiB7IGRnLWRvIHJ1biB7IHRhcmdldCBhdng1MTJmcDE2IH0gfSAqLworLyogeyBk Zy1vcHRpb25zICItTzIgLW1hdng1MTJmcDE2IC1tYXZ4NTEydmwiIH0gKi8KKworc3RhdGljIHZv aWQgdmVjX29wX3Rlc3QgKHZvaWQpOworI2RlZmluZSBET19URVNUIHZlY19vcF90ZXN0CisjZGVm aW5lIEFWWDUxMkZQMTYKKyNkZWZpbmUgQVZYNTEyVkwKKyNpbmNsdWRlICJhdng1MTJmLWNoZWNr LmgiCisjaW5jbHVkZSAiYXZ4NTEyZnAxNi02NC0zMi12ZWNvcC0xLmMiCisKK19GbG9hdDE2IGFb NF0sIGJbNF0sIGZleHBbNF0sIGZyZWZbNF07CisKKyNkZWZpbmUgRU1VTEFURV9WRUNfT1BfVlYo c2l6ZSwgb3AsIG5hbWUpIFwKK3ZvaWQgXAorX19hdHRyaWJ1dGVfXyAoKG5vaW5saW5lLCBub2Ns b25lKSkgXAorc2NhbGFyX3ZlY29wX3YjI3NpemUjI2hmIyNuYW1lICggXAorICBfRmxvYXQxNiAq IHJlc3RyaWN0IGRzdCwgX0Zsb2F0MTYgKiByZXN0cmljdCBzcmMxLCAgXAorICBfRmxvYXQxNiAq IHJlc3RyaWN0IHNyYzIpICBcCit7IFwKKyAgaW50IGk7ICBcCisgIGZvciAoaSA9IDA7IGkgPCBz aXplOyBpKyspICBcCisgICAgZHN0W2ldID0gc3JjMVtpXSBvcCBzcmMyW2ldOyAgXAorfQorCitF TVVMQVRFX1ZFQ19PUF9WViAoNCwgKywgYWRkKQorRU1VTEFURV9WRUNfT1BfVlYgKDIsICssIGFk ZCkKK0VNVUxBVEVfVkVDX09QX1ZWICg0LCAtLCBzdWIpCitFTVVMQVRFX1ZFQ19PUF9WViAoMiwg LSwgc3ViKQorRU1VTEFURV9WRUNfT1BfVlYgKDQsICosIG11bCkKK0VNVUxBVEVfVkVDX09QX1ZW ICgyLCAqLCBtdWwpCitFTVVMQVRFX1ZFQ19PUF9WViAoNCwgLywgZGl2KQorRU1VTEFURV9WRUNf T1BfVlYgKDIsIC8sIGRpdikKKwordm9pZCBpbml0KCkKK3sKKyAgaW50IGk7CisgIGZvciAoaSA9 IDA7IGkgPCA0OyBpKyspCisgICAgeworICAgICAgYVtpXSA9IGkgKyAwLjU7IAorICAgICAgYltp XSA9IGkgKiAxLjU7CisgICAgICBmZXhwW2ldID0gZnJlZltpXSA9IDIuNzUgKiBpOworICAgIH0K K30KKworaW50IGNoZWNrX2NvbmQodm9pZCAqYSwgdm9pZCAqYiwgaW50IHNpemUpCit7CisgIGlu dCBpOworICB1bnNpZ25lZCBzaG9ydCAqcGEgPSAodW5zaWduZWQgc2hvcnQgKilhLAorCQkgKnBi ID0gKHVuc2lnbmVkIHNob3J0ICopYjsKKyAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKyAg ICBpZiAocGFbaV0gIT0gcGJbaV0pCisgICAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDE7Cit9CisK KyNkZWZpbmUgVEVTVF9WRUNfT1BfVlYoc2l6ZSwgbmFtZSkJXAoreyBcCisgIGluaXQgKCk7ICBc CisgIHNjYWxhcl92ZWNvcF92IyNzaXplIyNoZiMjbmFtZSAoYSwgYiwgZmV4cCk7ICBcCisgIHZl Y29wX3YjI3NpemUjI2hmIyNuYW1lIChhLCBiLCBmcmVmKTsgIFwKKyAgaWYgKCFjaGVja19jb25k ICgodm9pZCAqKWZleHAsICh2b2lkICopZnJlZiwgc2l6ZSkpIFwKKyAgICBhYm9ydCgpOyAgXAor fQorCitzdGF0aWMgdm9pZCB2ZWNfb3BfdGVzdCgpCit7CisgIFRFU1RfVkVDX09QX1ZWICg0LCBh ZGQpCisgIFRFU1RfVkVDX09QX1ZWICgyLCBhZGQpCisgIFRFU1RfVkVDX09QX1ZWICg0LCBzdWIp CisgIFRFU1RfVkVDX09QX1ZWICgyLCBzdWIpCisgIFRFU1RfVkVDX09QX1ZWICg0LCBtdWwpCisg IFRFU1RfVkVDX09QX1ZWICgyLCBtdWwpCisgIFRFU1RfVkVDX09QX1ZWICg0LCBkaXYpCisgIFRF U1RfVkVDX09QX1ZWICgyLCBkaXYpCit9CmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50 YXJnZXQvaTM4Ni9hdng1MTJmcDE2LWZsb2F0dm5oZi5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFy Z2V0L2kzODYvYXZ4NTEyZnAxNi1mbG9hdHZuaGYuYwppbmRleCAxMTJhYzNlNzRkNS4uODQ3MWEx ZDFkMTAgMTAwNjQ0Ci0tLSBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDUxMmZw MTYtZmxvYXR2bmhmLmMKKysrIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvYXZ4NTEy ZnAxNi1mbG9hdHZuaGYuYwpAQCAtNDMsMTYgKzQzLDE2IEBAIEZMT0FUSEZWVigyLCB1ZGkpCiAK IC8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidmN2dHFxMnBoelxbIFxcdFxd K1xbXlx7XG5cXSpcW15cblxyXSoleG1tXFswLTlcXSsoPzpcbnxcWyBcXHRcXSsjKSIgMSB9IH0g Ki8KIC8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidmN2dHVxcTJwaHpcWyBc XHRcXStcW15ce1xuXF0qXFteXG5ccl0qJXhtbVxbMC05XF0rKD86XG58XFsgXFx0XF0rIykiIDEg fSB9ICovCi0vKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInZjdnRxcTJwaHlc WyBcXHRcXStcW15ce1xuXF0qXFteXG5ccl0qJXhtbVxbMC05XF0rKD86XG58XFsgXFx0XF0rIyki IDEgeyB4ZmFpbCAqLSotKiB9IH0gfSAqLwotLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LXRpbWVzICJ2Y3Z0dXFxMnBoeVxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSoleG1tXFswLTlc XSsoPzpcbnxcWyBcXHRcXSsjKSIgMSB7IHhmYWlsICotKi0qIH0gfSB9ICovCi0vKiB7IGRnLWZp bmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInZjdnRxcTJwaHhcWyBcXHRcXStcW15ce1xuXF0q XFteXG5ccl0qJXhtbVxbMC05XF0rKD86XG58XFsgXFx0XF0rIykiIDEgeyB4ZmFpbCAqLSotKiB9 IH0gfSAqLwotLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0dXFxMnBo eFxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSoleG1tXFswLTlcXSsoPzpcbnxcWyBcXHRcXSsj KSIgMSB7IHhmYWlsICotKi0qIH0gfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJs ZXItdGltZXMgInZjdnRxcTJwaHlcWyBcXHRcXStcW15ce1xuXF0qXFteXG5ccl0qJXhtbVxbMC05 XF0rKD86XG58XFsgXFx0XF0rIykiIDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3Nl bWJsZXItdGltZXMgInZjdnR1cXEycGh5XFsgXFx0XF0rXFteXHtcblxdKlxbXlxuXHJdKiV4bW1c WzAtOVxdKyg/OlxufFxbIFxcdFxdKyMpIiAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4t YXNzZW1ibGVyLXRpbWVzICJ2Y3Z0cXEycGh4XFsgXFx0XF0rXFteXHtcblxdKlxbXlxuXHJdKiV4 bW1cWzAtOVxdKyg/OlxufFxbIFxcdFxdKyMpIiAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNj YW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0dXFxMnBoeFxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxy XSoleG1tXFswLTlcXSsoPzpcbnxcWyBcXHRcXSsjKSIgMSB9IH0gKi8KIC8qIHsgZGctZmluYWwg eyBzY2FuLWFzc2VtYmxlci10aW1lcyAidmN2dGRxMnBoXFsgXFx0XF0rXFteXHtcblxdKlxbXlxu XHJdKiV5bW1cWzAtOVxdKyg/OlxufFxbIFxcdFxdKyMpIiAxIH0gfSAqLwogLyogeyBkZy1maW5h bCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0dWRxMnBoXFsgXFx0XF0rXFteXHtcblxdKlxb XlxuXHJdKiV5bW1cWzAtOVxdKyg/OlxufFxbIFxcdFxdKyMpIiAxIH0gfSAqLwogLyogeyBkZy1m aW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0ZHEycGh5XFsgXFx0XF0rXFteXHtcblxd KlxbXlxuXHJdKiV4bW1cWzAtOVxdKyg/OlxufFxbIFxcdFxdKyMpIiAxIH0gfSAqLwogLyogeyBk Zy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0dWRxMnBoeVxbIFxcdFxdK1xbXlx7 XG5cXSpcW15cblxyXSoleG1tXFswLTlcXSsoPzpcbnxcWyBcXHRcXSsjKSIgMSB9IH0gKi8KLS8q IHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidmN2dGRxMnBoeFxbIFxcdFxdK1xb Xlx7XG5cXSpcW15cblxyXSoleG1tXFswLTlcXSsoPzpcbnxcWyBcXHRcXSsjKSIgMSB7IHhmYWls ICotKi0qIH0gfSB9ICovCi0vKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInZj dnR1ZHEycGh4XFsgXFx0XF0rXFteXHtcblxdKlxbXlxuXHJdKiV4bW1cWzAtOVxdKyg/OlxufFxb IFxcdFxdKyMpIiAxIHsgeGZhaWwgKi0qLSogfSB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2Fu LWFzc2VtYmxlci10aW1lcyAidmN2dGRxMnBoeFxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSol eG1tXFswLTlcXSsoPzpcbnxcWyBcXHRcXSsjKSIgMSB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBz Y2FuLWFzc2VtYmxlci10aW1lcyAidmN2dHVkcTJwaHhcWyBcXHRcXStcW15ce1xuXF0qXFteXG5c cl0qJXhtbVxbMC05XF0rKD86XG58XFsgXFx0XF0rIykiIDEgfSB9ICovCiAvKiB7IGRnLWZpbmFs IHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInZjdnR3MnBoXFsgXFx0XF0rXFteXHtcblxdKlxbXlxu XHJdKiV6bW1cWzAtOVxdKyg/OlxufFxbIFxcdFxdKyMpIiAxIH0gfSAqLwogLyogeyBkZy1maW5h bCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0dXcycGhcWyBcXHRcXStcW15ce1xuXF0qXFte XG5ccl0qJXptbVxbMC05XF0rKD86XG58XFsgXFx0XF0rIykiIDEgfSB9ICovCiAvKiB7IGRnLWZp bmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInZjdnR3MnBoXFsgXFx0XF0rXFteXHtcblxdKlxb XlxuXHJdKiV5bW1cWzAtOVxdKyg/OlxufFxbIFxcdFxdKyMpIiAxIH0gfSAqLwpkaWZmIC0tZ2l0 IGEvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvYXZ4NTEyZnAxNi10cnVuYy1leHRlbmR2 bmhmLmMgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9hdng1MTJmcDE2LXRydW5jLWV4 dGVuZHZuaGYuYwppbmRleCAyODZlYTlmMjYyNC4uMmVmOTAxYTAzNzUgMTAwNjQ0Ci0tLSBhL2dj Yy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDUxMmZwMTYtdHJ1bmMtZXh0ZW5kdm5oZi5j CisrKyBiL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDUxMmZwMTYtdHJ1bmMtZXh0 ZW5kdm5oZi5jCkBAIC00MSwxNSArNDEsMTUgQEAgRVhURU5ESEZWVig4LCBzZikKIEVYVEVOREhG VlYoNCwgc2YpCiAKIC8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidmN2dHBk MnBoelxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSoleG1tXFswLTlcXSsoPzpcbnxcWyBcXHRc XSsjKSIgMSB9IH0gKi8KLS8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidmN2 dHBkMnBoeVxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSoleG1tXFswLTlcXSsoPzpcbnxcWyBc XHRcXSsjKSIgMSB7IHhmYWlsICotKi0qIH0gfSB9ICovCi0vKiB7IGRnLWZpbmFsIHsgc2Nhbi1h c3NlbWJsZXItdGltZXMgInZjdnRwZDJwaHhcWyBcXHRcXStcW15ce1xuXF0qXFteXG5ccl0qJXht bVxbMC05XF0rKD86XG58XFsgXFx0XF0rIykiIDEgeyB4ZmFpbCAqLSotKiB9IH0gfSAqLworLyog eyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0cGQycGh5XFsgXFx0XF0rXFte XHtcblxdKlxbXlxuXHJdKiV4bW1cWzAtOVxdKyg/OlxufFxbIFxcdFxdKyMpIiAxIH0gfSAqLwor LyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0cGQycGh4XFsgXFx0XF0r XFteXHtcblxdKlxbXlxuXHJdKiV4bW1cWzAtOVxdKyg/OlxufFxbIFxcdFxdKyMpIiAxIH0gfSAq LwogLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0cHMycGh4XFsgXFx0 XF0rXFteXHtcblxdKlxbXlxuXHJdKiV5bW1cWzAtOVxdKyg/OlxufFxbIFxcdFxdKyMpIiAxIH0g fSAqLwogLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0cHMycGh4eVxb IFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSoleG1tXFswLTlcXSsoPzpcbnxcWyBcXHRcXSsjKSIg MSB9IH0gKi8KLS8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidmN2dHBzMnBo eHhcWyBcXHRcXStcW15ce1xuXF0qXFteXG5ccl0qJXhtbVxbMC05XF0rKD86XG58XFsgXFx0XF0r IykiIDEgeyB4ZmFpbCAqLSotKiB9IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1i bGVyLXRpbWVzICJ2Y3Z0cHMycGh4eFxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSoleG1tXFsw LTlcXSsoPzpcbnxcWyBcXHRcXSsjKSIgMSB9IH0gKi8KIC8qIHsgZGctZmluYWwgeyBzY2FuLWFz c2VtYmxlci10aW1lcyAidmN2dHBoMnBkXFsgXFx0XF0rXFteXHtcblxdKlxbXlxuXHJdKiV6bW1c WzAtOVxdKyg/OlxufFxbIFxcdFxdKyMpIiAxIH0gfSAqLwotLyogeyBkZy1maW5hbCB7IHNjYW4t YXNzZW1ibGVyLXRpbWVzICJ2Y3Z0cGgycGRcWyBcXHRcXStcW15ce1xuXF0qXFteXG5ccl0qJXlt bVxbMC05XF0rKD86XG58XFsgXFx0XF0rIykiIDEgeyB4ZmFpbCAqLSotKiB9IH0gfSAqLwotLyog eyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0cGgycGRcWyBcXHRcXStcW15c e1xuXF0qXFteXG5ccl0qJXhtbVxbMC05XF0rKD86XG58XFsgXFx0XF0rIykiIDEgeyB4ZmFpbCAq LSotKiB9IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0 cGgycGRcWyBcXHRcXStcW15ce1xuXF0qXFteXG5ccl0qJXltbVxbMC05XF0rKD86XG58XFsgXFx0 XF0rIykiIDEgfSB9ICovCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInZj dnRwaDJwZFxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSoleG1tXFswLTlcXSsoPzpcbnxcWyBc XHRcXSsjKSIgMSB9IH0gKi8KIC8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAi dmN2dHBoMnBzeFxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSolem1tXFswLTlcXSsoPzpcbnxc WyBcXHRcXSsjKSIgMSB9IH0gKi8KIC8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1l cyAidmN2dHBoMnBzeFxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSoleW1tXFswLTlcXSsoPzpc bnxcWyBcXHRcXSsjKSIgMSB9IH0gKi8KLS8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10 aW1lcyAidmN2dHBoMnBzeFxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSoleG1tXFswLTlcXSso PzpcbnxcWyBcXHRcXSsjKSIgMSB7IHhmYWlsICotKi0qIH0gfSB9ICovCisvKiB7IGRnLWZpbmFs IHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInZjdnRwaDJwc3hcWyBcXHRcXStcW15ce1xuXF0qXFte XG5ccl0qJXhtbVxbMC05XF0rKD86XG58XFsgXFx0XF0rIykiIDEgfSB9ICovCiAKZGlmZiAtLWdp dCBhL2djYy90ZXN0c3VpdGUvZ2NjLnRhcmdldC9pMzg2L2F2eDUxMmZwMTYtdHJ1bmN2bmhmLmMg Yi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9hdng1MTJmcDE2LXRydW5jdm5oZi5jCmlu ZGV4IGVlNTVjZDEyMzAwLi43YTUxYzlkZDA3NyAxMDA2NDQKLS0tIGEvZ2NjL3Rlc3RzdWl0ZS9n Y2MudGFyZ2V0L2kzODYvYXZ4NTEyZnAxNi10cnVuY3ZuaGYuYworKysgYi9nY2MvdGVzdHN1aXRl L2djYy50YXJnZXQvaTM4Ni9hdng1MTJmcDE2LXRydW5jdm5oZi5jCkBAIC00MywxNiArNDMsMTYg QEAgRklYX1RSVU5DSEZWVigyLCB1ZGkpCiAKIC8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxl ci10aW1lcyAidmN2dHRwaDJxcVxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSolem1tXFswLTlc XSsoPzpcbnxcWyBcXHRcXSsjKSIgMSB9IH0gKi8KIC8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2Vt Ymxlci10aW1lcyAidmN2dHRwaDJ1cXFcWyBcXHRcXStcW15ce1xuXF0qXFteXG5ccl0qJXptbVxb MC05XF0rKD86XG58XFsgXFx0XF0rIykiIDEgfSB9ICovCi0vKiB7IGRnLWZpbmFsIHsgc2Nhbi1h c3NlbWJsZXItdGltZXMgInZjdnR0cGgycXFcWyBcXHRcXStcW15ce1xuXF0qXFteXG5ccl0qJXlt bVxbMC05XF0rKD86XG58XFsgXFx0XF0rIykiIDEgeyB4ZmFpbCAqLSotKiB9IH0gfSAqLwotLyog eyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0dHBoMnVxcVxbIFxcdFxdK1xb Xlx7XG5cXSpcW15cblxyXSoleW1tXFswLTlcXSsoPzpcbnxcWyBcXHRcXSsjKSIgMSB7IHhmYWls ICotKi0qIH0gfSB9ICovCi0vKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInZj dnR0cGgycXFcWyBcXHRcXStcW15ce1xuXF0qXFteXG5ccl0qJXhtbVxbMC05XF0rKD86XG58XFsg XFx0XF0rIykiIDEgeyB4ZmFpbCAqLSotKiB9IH0gfSAqLwotLyogeyBkZy1maW5hbCB7IHNjYW4t YXNzZW1ibGVyLXRpbWVzICJ2Y3Z0dHBoMnVxcVxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSol eG1tXFswLTlcXSsoPzpcbnxcWyBcXHRcXSsjKSIgMSB7IHhmYWlsICotKi0qIH0gfSB9ICovCisv KiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInZjdnR0cGgycXFcWyBcXHRcXStc W15ce1xuXF0qXFteXG5ccl0qJXltbVxbMC05XF0rKD86XG58XFsgXFx0XF0rIykiIDEgfSB9ICov CisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMgInZjdnR0cGgydXFxXFsgXFx0 XF0rXFteXHtcblxdKlxbXlxuXHJdKiV5bW1cWzAtOVxdKyg/OlxufFxbIFxcdFxdKyMpIiAxIH0g fSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0dHBoMnFxXFsg XFx0XF0rXFteXHtcblxdKlxbXlxuXHJdKiV4bW1cWzAtOVxdKyg/OlxufFxbIFxcdFxdKyMpIiAx IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0dHBoMnVx cVxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSoleG1tXFswLTlcXSsoPzpcbnxcWyBcXHRcXSsj KSIgMSB9IH0gKi8KIC8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidmN2dHRw aDJkcVxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSolem1tXFswLTlcXSsoPzpcbnxcWyBcXHRc XSsjKSIgMSB9IH0gKi8KIC8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidmN2 dHRwaDJ1ZHFcWyBcXHRcXStcW15ce1xuXF0qXFteXG5ccl0qJXptbVxbMC05XF0rKD86XG58XFsg XFx0XF0rIykiIDEgfSB9ICovCiAvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGltZXMg InZjdnR0cGgyZHFcWyBcXHRcXStcW15ce1xuXF0qXFteXG5ccl0qJXltbVxbMC05XF0rKD86XG58 XFsgXFx0XF0rIykiIDEgfSB9ICovCiAvKiB7IGRnLWZpbmFsIHsgc2Nhbi1hc3NlbWJsZXItdGlt ZXMgInZjdnR0cGgydWRxXFsgXFx0XF0rXFteXHtcblxdKlxbXlxuXHJdKiV5bW1cWzAtOVxdKyg/ OlxufFxbIFxcdFxdKyMpIiAxIH0gfSAqLwotLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVy LXRpbWVzICJ2Y3Z0dHBoMmRxXFsgXFx0XF0rXFteXHtcblxdKlxbXlxuXHJdKiV4bW1cWzAtOVxd Kyg/OlxufFxbIFxcdFxdKyMpIiAxIHsgeGZhaWwgKi0qLSogfSB9IH0gKi8KLS8qIHsgZGctZmlu YWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidmN2dHRwaDJ1ZHFcWyBcXHRcXStcW15ce1xuXF0q XFteXG5ccl0qJXhtbVxbMC05XF0rKD86XG58XFsgXFx0XF0rIykiIDEgeyB4ZmFpbCAqLSotKiB9 IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0dHBoMmRx XFsgXFx0XF0rXFteXHtcblxdKlxbXlxuXHJdKiV4bW1cWzAtOVxdKyg/OlxufFxbIFxcdFxdKyMp IiAxIH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2Y3Z0dHBo MnVkcVxbIFxcdFxdK1xbXlx7XG5cXSpcW15cblxyXSoleG1tXFswLTlcXSsoPzpcbnxcWyBcXHRc XSsjKSIgMSB9IH0gKi8KIC8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidmN2 dHRwaDJ3XFsgXFx0XF0rXFteXHtcblxdKlxbXlxuXHJdKiV6bW1cWzAtOVxdKyg/OlxufFxbIFxc dFxdKyMpIiAxIH0gfSAqLwogLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2 Y3Z0dHBoMnV3XFsgXFx0XF0rXFteXHtcblxdKlxbXlxuXHJdKiV6bW1cWzAtOVxdKyg/OlxufFxb IFxcdFxdKyMpIiAxIH0gfSAqLwogLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVz ICJ2Y3Z0dHBoMndcWyBcXHRcXStcW15ce1xuXF0qXFteXG5ccl0qJXltbVxbMC05XF0rKD86XG58 XFsgXFx0XF0rIykiIDEgfSB9ICovCmRpZmYgLS1naXQgYS9nY2MvdGVzdHN1aXRlL2djYy50YXJn ZXQvaTM4Ni9wcjEwMjIzMC5jIGIvZ2NjL3Rlc3RzdWl0ZS9nY2MudGFyZ2V0L2kzODYvcHIxMDIy MzAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwMDAwMC4uNjBjZjFjMzJhZmUK LS0tIC9kZXYvbnVsbAorKysgYi9nY2MvdGVzdHN1aXRlL2djYy50YXJnZXQvaTM4Ni9wcjEwMjIz MC5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIHsgZGctZG8gY29tcGlsZSB9ICovCisvKiB7IGRnLW9w dGlvbnMgIi1PMiAtbWF2eDUxMmZwMTYiIH0gKi8KKwordHlwZWRlZiBfRmxvYXQxNiB2NGhmIF9f YXR0cmlidXRlX18gKCh2ZWN0b3Jfc2l6ZSAoOCkpKTsKK3R5cGVkZWYgX0Zsb2F0MTYgdjJoZiBf X2F0dHJpYnV0ZV9fICgodmVjdG9yX3NpemUgKDQpKSk7CisKK3Y0aGYKK3Y0aGZfYWJpXzEgKHY0 aGYgYSkKK3sKKyAgcmV0dXJuIGE7Cit9CisKK3Y0aGYKK3Y0aGZfYWJpXzMgKHY0aGYgYSwgdjRo ZiBiLCB2NGhmIGMpCit7CisgIHJldHVybiBjOworfQorCisvKiB7IGRnLWZpbmFsIHsgc2Nhbi1h c3NlbWJsZXItdGltZXMgIm1vdnFcW1tcXHQgXF0qJW1tMiwgJW1tMCIgMSB7IHRhcmdldCB7IGlh MzIgfSB9IH0gfSAqLworLyogeyBkZy1maW5hbCB7IHNjYW4tYXNzZW1ibGVyLXRpbWVzICJ2bW92 YXBzXFtbXFx0IFxdKiV4bW0yLCAleG1tMCIgMSB7IHRhcmdldCB7ICEgaWEzMiB9IH0gfSB9ICov CisKK3Y0aGYKK3Y0aGZfYWJpXzQgKHY0aGYgYSwgdjRoZiBiLCB2NGhmIGMsIHY0aGYgZCkKK3sK KyAgcmV0dXJuIGQ7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAi bW92cVxbW1xcdCBcXSo0XFsoXF0lZXNwXFspXF0sICVtbTAiIDEgeyB0YXJnZXQgeyBpYTMyIH0g fSB9IH0gKi8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidm1vdmFwc1xb W1xcdCBcXSoleG1tMywgJXhtbTAiIDEgeyB0YXJnZXQgeyAhIGlhMzIgfSB9IH0gfSAqLworCit2 MmhmCit2MmhmX3Rlc3QgKHYyaGYgYSwgdjJoZiBiLCB2MmhmIGMsIHYyaGYgZCkKK3sKKyAgcmV0 dXJuIGI7Cit9CisKKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAibW92bFxb W1xcdCBcXSo4XFsoXF0lZXNwXFspXF0sICVlYXgiIDEgeyB0YXJnZXQgeyBpYTMyIH0gfSB9IH0g Ki8KKy8qIHsgZGctZmluYWwgeyBzY2FuLWFzc2VtYmxlci10aW1lcyAidm1vdmFwc1xbW1xcdCBc XSoleG1tMSwgJXhtbTAiIDEgeyB0YXJnZXQgeyAhIGlhMzIgfSB9IH0gfSAqLwotLSAKMi4yNy4x Cgo= --000000000000d5e47705cd091f63--