From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9274 invoked by alias); 12 Mar 2015 11:16:01 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 123657 invoked by uid 89); 12 Mar 2015 11:13:34 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.5 required=5.0 tests=BAYES_05,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: lhrrgout.huawei.com Received: from lhrrgout.huawei.com (HELO lhrrgout.huawei.com) (194.213.3.17) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Thu, 12 Mar 2015 11:13:14 +0000 Received: from 172.24.2.61 (EHLO szxga01-in.huawei.com) ([172.24.2.61]) by lhrrg01-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id BTO29145; Thu, 12 Mar 2015 11:13:08 +0000 (GMT) Received: from 172.24.2.119 (EHLO nkgeml406-hub.china.huawei.com) ([172.24.2.119]) by szxrg01-dlp.huawei.com (MOS 4.3.7-GA FastPath queued) with ESMTP id CKR95713; Thu, 12 Mar 2015 17:20:25 +0800 (CST) Received: from NKGEML511-MBX.china.huawei.com ([169.254.5.161]) by nkgeml406-hub.china.huawei.com ([10.98.56.37]) with mapi id 14.03.0158.001; Thu, 12 Mar 2015 17:20:15 +0800 From: Jiangjiji To: "gcc-patches@gcc.gnu.org" , Richard Earnshaw , "Yangfei (Felix)" Subject: [PING^2] [PATCH] [AArch64, NEON] Improve vmulX intrinsics Date: Thu, 12 Mar 2015 11:16:00 -0000 Message-ID: Content-Type: multipart/mixed; boundary="_002_B34C25384B9D7A428FF276D3AE7D6BDC7B4FE913nkgeml511mbxchi_" MIME-Version: 1.0 X-CFilter-Loop: Reflected X-SW-Source: 2015-03/txt/msg00661.txt.bz2 --_002_B34C25384B9D7A428FF276D3AE7D6BDC7B4FE913nkgeml511mbxchi_ Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable Content-length: 56675 Hi,=20 This is a ping for: https://gcc.gnu.org/ml/gcc-patches/2014-12/msg00775.h= tml Regtested with aarch64-linux-gnu on QEMU. This patch has no regressions for aarch64_be-linux-gnu big-endian target = too.=20 OK for the trunk? Thanks. Index: gcc/ChangeLog =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gcc/ChangeLog (revision 219845) +++ gcc/ChangeLog (working copy) @@ -1,3 +1,38 @@ +2014-12-11 Felix Yang + Jiji Jiang + + * config/aarch64/aarch64-simd.md (aarch64_mul_n, + aarch64_mull_n, aarch64_mull, + aarch64_simd_mull2_n, aarch64_mull2_n, + aarch64_mull_lane, aarch64_mull2_lane_internal, + aarch64_mull_laneq, aarch64_mull2_laneq_internal, + aarch64_smull2_lane, aarch64_umull2_lane, + aarch64_smull2_laneq, aarch64_umull2_laneq, + aarch64_fmulx, aarch64_fmulx, aarch64_fmulx_lane, + aarch64_pmull2v16qi, aarch64_pmullv8qi): New patterns. + * config/aarch64/aarch64-simd-builtins.def (vec_widen_smult_hi_, + vec_widen_umult_hi_, umull, smull, smull_n, umull_n, mul_n, smull2_n, + umull2_n, smull_lane, umull_lane, smull_laneq, umull_laneq, pmull, + umull2_lane, smull2_laneq, umull2_laneq, fmulx, fmulx_lane, pmull2, + smull2_lane): New builtins. + * config/aarch64/arm_neon.h (vmul_n_f32, vmul_n_s16, vmul_n_s32, + vmul_n_u16, vmul_n_u32, vmulq_n_f32, vmulq_n_f64, vmulq_n_s16, + vmulq_n_s32, vmulq_n_u16, vmulq_n_u32, vmull_high_lane_s16, + vmull_high_lane_s32, vmull_high_lane_u16, vmull_high_lane_u32, + vmull_high_laneq_s16, vmull_high_laneq_s32, vmull_high_laneq_u16, + vmull_high_laneq_u32, vmull_high_n_s16, vmull_high_n_s32, + vmull_high_n_u16, vmull_high_n_u32, vmull_high_p8, vmull_high_s8, + vmull_high_s16, vmull_high_s32, vmull_high_u8, vmull_high_u16, + vmull_high_u32, vmull_lane_s16, vmull_lane_s32, vmull_lane_u16, + vmull_lane_u32, vmull_laneq_s16, vmull_laneq_s32, vmull_laneq_u16, + vmull_laneq_u32, vmull_n_s16, vmull_n_s32, vmull_n_u16, vmull_n_u32, + vmull_p8, vmull_s8, vmull_s16, vmull_s32, vmull_u8, vmull_u16, + vmull_u32, vmulx_f32, vmulx_lane_f32, vmulxd_f64, vmulxq_f32, + vmulxq_f64, vmulxq_lane_f32, vmulxq_lane_f64, vmulxs_f32): Rewrite + using builtin functions. + * config/aarch64/iterators.md (UNSPEC_FMULX, UNSPEC_FMULX_LANE, + VDQF_Q): New unspec and int iterator. + 2015-01-19 Jiong Wang Andrew Pinski =20 Index: gcc/config/aarch64/arm_neon.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gcc/config/aarch64/arm_neon.h (revision 219845) +++ gcc/config/aarch64/arm_neon.h (working copy) @@ -7580,671 +7580,6 @@ vmovn_u64 (uint64x2_t a) return result; } =20 -__extension__ static __inline float32x2_t __attribute__ ((__always_inline_= _)) -vmul_n_f32 (float32x2_t a, float32_t b) -{ - float32x2_t result; - __asm__ ("fmul %0.2s,%1.2s,%2.s[0]" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) -vmul_n_s16 (int16x4_t a, int16_t b) -{ - int16x4_t result; - __asm__ ("mul %0.4h,%1.4h,%2.h[0]" - : "=3Dw"(result) - : "w"(a), "x"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) -vmul_n_s32 (int32x2_t a, int32_t b) -{ - int32x2_t result; - __asm__ ("mul %0.2s,%1.2s,%2.s[0]" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__= )) -vmul_n_u16 (uint16x4_t a, uint16_t b) -{ - uint16x4_t result; - __asm__ ("mul %0.4h,%1.4h,%2.h[0]" - : "=3Dw"(result) - : "w"(a), "x"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__= )) -vmul_n_u32 (uint32x2_t a, uint32_t b) -{ - uint32x2_t result; - __asm__ ("mul %0.2s,%1.2s,%2.s[0]" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -#define vmull_high_lane_s16(a, b, c) \ - __extension__ \ - ({ \ - int16x4_t b_ =3D (b); \ - int16x8_t a_ =3D (a); \ - int32x4_t result; \ - __asm__ ("smull2 %0.4s, %1.8h, %2.h[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "x"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -#define vmull_high_lane_s32(a, b, c) \ - __extension__ \ - ({ \ - int32x2_t b_ =3D (b); \ - int32x4_t a_ =3D (a); \ - int64x2_t result; \ - __asm__ ("smull2 %0.2d, %1.4s, %2.s[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "w"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -#define vmull_high_lane_u16(a, b, c) \ - __extension__ \ - ({ \ - uint16x4_t b_ =3D (b); \ - uint16x8_t a_ =3D (a); \ - uint32x4_t result; \ - __asm__ ("umull2 %0.4s, %1.8h, %2.h[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "x"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -#define vmull_high_lane_u32(a, b, c) \ - __extension__ \ - ({ \ - uint32x2_t b_ =3D (b); \ - uint32x4_t a_ =3D (a); \ - uint64x2_t result; \ - __asm__ ("umull2 %0.2d, %1.4s, %2.s[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "w"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -#define vmull_high_laneq_s16(a, b, c) \ - __extension__ \ - ({ \ - int16x8_t b_ =3D (b); \ - int16x8_t a_ =3D (a); \ - int32x4_t result; \ - __asm__ ("smull2 %0.4s, %1.8h, %2.h[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "x"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -#define vmull_high_laneq_s32(a, b, c) \ - __extension__ \ - ({ \ - int32x4_t b_ =3D (b); \ - int32x4_t a_ =3D (a); \ - int64x2_t result; \ - __asm__ ("smull2 %0.2d, %1.4s, %2.s[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "w"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -#define vmull_high_laneq_u16(a, b, c) \ - __extension__ \ - ({ \ - uint16x8_t b_ =3D (b); \ - uint16x8_t a_ =3D (a); \ - uint32x4_t result; \ - __asm__ ("umull2 %0.4s, %1.8h, %2.h[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "x"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -#define vmull_high_laneq_u32(a, b, c) \ - __extension__ \ - ({ \ - uint32x4_t b_ =3D (b); \ - uint32x4_t a_ =3D (a); \ - uint64x2_t result; \ - __asm__ ("umull2 %0.2d, %1.4s, %2.s[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "w"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) -vmull_high_n_s16 (int16x8_t a, int16_t b) -{ - int32x4_t result; - __asm__ ("smull2 %0.4s,%1.8h,%2.h[0]" - : "=3Dw"(result) - : "w"(a), "x"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) -vmull_high_n_s32 (int32x4_t a, int32_t b) -{ - int64x2_t result; - __asm__ ("smull2 %0.2d,%1.4s,%2.s[0]" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__= )) -vmull_high_n_u16 (uint16x8_t a, uint16_t b) -{ - uint32x4_t result; - __asm__ ("umull2 %0.4s,%1.8h,%2.h[0]" - : "=3Dw"(result) - : "w"(a), "x"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__= )) -vmull_high_n_u32 (uint32x4_t a, uint32_t b) -{ - uint64x2_t result; - __asm__ ("umull2 %0.2d,%1.4s,%2.s[0]" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__= )) -vmull_high_p8 (poly8x16_t a, poly8x16_t b) -{ - poly16x8_t result; - __asm__ ("pmull2 %0.8h,%1.16b,%2.16b" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) -vmull_high_s8 (int8x16_t a, int8x16_t b) -{ - int16x8_t result; - __asm__ ("smull2 %0.8h,%1.16b,%2.16b" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) -vmull_high_s16 (int16x8_t a, int16x8_t b) -{ - int32x4_t result; - __asm__ ("smull2 %0.4s,%1.8h,%2.8h" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) -vmull_high_s32 (int32x4_t a, int32x4_t b) -{ - int64x2_t result; - __asm__ ("smull2 %0.2d,%1.4s,%2.4s" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__= )) -vmull_high_u8 (uint8x16_t a, uint8x16_t b) -{ - uint16x8_t result; - __asm__ ("umull2 %0.8h,%1.16b,%2.16b" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__= )) -vmull_high_u16 (uint16x8_t a, uint16x8_t b) -{ - uint32x4_t result; - __asm__ ("umull2 %0.4s,%1.8h,%2.8h" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__= )) -vmull_high_u32 (uint32x4_t a, uint32x4_t b) -{ - uint64x2_t result; - __asm__ ("umull2 %0.2d,%1.4s,%2.4s" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -#define vmull_lane_s16(a, b, c) \ - __extension__ \ - ({ \ - int16x4_t b_ =3D (b); \ - int16x4_t a_ =3D (a); \ - int32x4_t result; \ - __asm__ ("smull %0.4s,%1.4h,%2.h[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "x"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -#define vmull_lane_s32(a, b, c) \ - __extension__ \ - ({ \ - int32x2_t b_ =3D (b); \ - int32x2_t a_ =3D (a); \ - int64x2_t result; \ - __asm__ ("smull %0.2d,%1.2s,%2.s[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "w"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -#define vmull_lane_u16(a, b, c) \ - __extension__ \ - ({ \ - uint16x4_t b_ =3D (b); \ - uint16x4_t a_ =3D (a); \ - uint32x4_t result; \ - __asm__ ("umull %0.4s,%1.4h,%2.h[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "x"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -#define vmull_lane_u32(a, b, c) \ - __extension__ \ - ({ \ - uint32x2_t b_ =3D (b); \ - uint32x2_t a_ =3D (a); \ - uint64x2_t result; \ - __asm__ ("umull %0.2d, %1.2s, %2.s[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "w"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -#define vmull_laneq_s16(a, b, c) \ - __extension__ \ - ({ \ - int16x8_t b_ =3D (b); \ - int16x4_t a_ =3D (a); \ - int32x4_t result; \ - __asm__ ("smull %0.4s, %1.4h, %2.h[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "x"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -#define vmull_laneq_s32(a, b, c) \ - __extension__ \ - ({ \ - int32x4_t b_ =3D (b); \ - int32x2_t a_ =3D (a); \ - int64x2_t result; \ - __asm__ ("smull %0.2d, %1.2s, %2.s[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "w"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -#define vmull_laneq_u16(a, b, c) \ - __extension__ \ - ({ \ - uint16x8_t b_ =3D (b); \ - uint16x4_t a_ =3D (a); \ - uint32x4_t result; \ - __asm__ ("umull %0.4s, %1.4h, %2.h[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "x"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -#define vmull_laneq_u32(a, b, c) \ - __extension__ \ - ({ \ - uint32x4_t b_ =3D (b); \ - uint32x2_t a_ =3D (a); \ - uint64x2_t result; \ - __asm__ ("umull %0.2d, %1.2s, %2.s[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "w"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) -vmull_n_s16 (int16x4_t a, int16_t b) -{ - int32x4_t result; - __asm__ ("smull %0.4s,%1.4h,%2.h[0]" - : "=3Dw"(result) - : "w"(a), "x"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) -vmull_n_s32 (int32x2_t a, int32_t b) -{ - int64x2_t result; - __asm__ ("smull %0.2d,%1.2s,%2.s[0]" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__= )) -vmull_n_u16 (uint16x4_t a, uint16_t b) -{ - uint32x4_t result; - __asm__ ("umull %0.4s,%1.4h,%2.h[0]" - : "=3Dw"(result) - : "w"(a), "x"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__= )) -vmull_n_u32 (uint32x2_t a, uint32_t b) -{ - uint64x2_t result; - __asm__ ("umull %0.2d,%1.2s,%2.s[0]" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__= )) -vmull_p8 (poly8x8_t a, poly8x8_t b) -{ - poly16x8_t result; - __asm__ ("pmull %0.8h, %1.8b, %2.8b" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) -vmull_s8 (int8x8_t a, int8x8_t b) -{ - int16x8_t result; - __asm__ ("smull %0.8h, %1.8b, %2.8b" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) -vmull_s16 (int16x4_t a, int16x4_t b) -{ - int32x4_t result; - __asm__ ("smull %0.4s, %1.4h, %2.4h" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) -vmull_s32 (int32x2_t a, int32x2_t b) -{ - int64x2_t result; - __asm__ ("smull %0.2d, %1.2s, %2.2s" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__= )) -vmull_u8 (uint8x8_t a, uint8x8_t b) -{ - uint16x8_t result; - __asm__ ("umull %0.8h, %1.8b, %2.8b" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__= )) -vmull_u16 (uint16x4_t a, uint16x4_t b) -{ - uint32x4_t result; - __asm__ ("umull %0.4s, %1.4h, %2.4h" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__= )) -vmull_u32 (uint32x2_t a, uint32x2_t b) -{ - uint64x2_t result; - __asm__ ("umull %0.2d, %1.2s, %2.2s" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline float32x4_t __attribute__ ((__always_inline_= _)) -vmulq_n_f32 (float32x4_t a, float32_t b) -{ - float32x4_t result; - __asm__ ("fmul %0.4s,%1.4s,%2.s[0]" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline float64x2_t __attribute__ ((__always_inline_= _)) -vmulq_n_f64 (float64x2_t a, float64_t b) -{ - float64x2_t result; - __asm__ ("fmul %0.2d,%1.2d,%2.d[0]" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) -vmulq_n_s16 (int16x8_t a, int16_t b) -{ - int16x8_t result; - __asm__ ("mul %0.8h,%1.8h,%2.h[0]" - : "=3Dw"(result) - : "w"(a), "x"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) -vmulq_n_s32 (int32x4_t a, int32_t b) -{ - int32x4_t result; - __asm__ ("mul %0.4s,%1.4s,%2.s[0]" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__= )) -vmulq_n_u16 (uint16x8_t a, uint16_t b) -{ - uint16x8_t result; - __asm__ ("mul %0.8h,%1.8h,%2.h[0]" - : "=3Dw"(result) - : "w"(a), "x"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__= )) -vmulq_n_u32 (uint32x4_t a, uint32_t b) -{ - uint32x4_t result; - __asm__ ("mul %0.4s,%1.4s,%2.s[0]" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline float32x2_t __attribute__ ((__always_inline_= _)) -vmulx_f32 (float32x2_t a, float32x2_t b) -{ - float32x2_t result; - __asm__ ("fmulx %0.2s,%1.2s,%2.2s" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -#define vmulx_lane_f32(a, b, c) \ - __extension__ \ - ({ \ - float32x4_t b_ =3D (b); \ - float32x2_t a_ =3D (a); \ - float32x2_t result; \ - __asm__ ("fmulx %0.2s,%1.2s,%2.s[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "w"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -__extension__ static __inline float64_t __attribute__ ((__always_inline__)) -vmulxd_f64 (float64_t a, float64_t b) -{ - float64_t result; - __asm__ ("fmulx %d0, %d1, %d2" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline float32x4_t __attribute__ ((__always_inline_= _)) -vmulxq_f32 (float32x4_t a, float32x4_t b) -{ - float32x4_t result; - __asm__ ("fmulx %0.4s,%1.4s,%2.4s" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -__extension__ static __inline float64x2_t __attribute__ ((__always_inline_= _)) -vmulxq_f64 (float64x2_t a, float64x2_t b) -{ - float64x2_t result; - __asm__ ("fmulx %0.2d,%1.2d,%2.2d" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - -#define vmulxq_lane_f32(a, b, c) \ - __extension__ \ - ({ \ - float32x4_t b_ =3D (b); \ - float32x4_t a_ =3D (a); \ - float32x4_t result; \ - __asm__ ("fmulx %0.4s,%1.4s,%2.s[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "w"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -#define vmulxq_lane_f64(a, b, c) \ - __extension__ \ - ({ \ - float64x2_t b_ =3D (b); \ - float64x2_t a_ =3D (a); \ - float64x2_t result; \ - __asm__ ("fmulx %0.2d,%1.2d,%2.d[%3]" \ - : "=3Dw"(result) \ - : "w"(a_), "w"(b_), "i"(c) \ - : /* No clobbers */); \ - result; \ - }) - -__extension__ static __inline float32_t __attribute__ ((__always_inline__)) -vmulxs_f32 (float32_t a, float32_t b) -{ - float32_t result; - __asm__ ("fmulx %s0, %s1, %s2" - : "=3Dw"(result) - : "w"(a), "w"(b) - : /* No clobbers */); - return result; -} - __extension__ static __inline poly8x8_t __attribute__ ((__always_inline__)) vmvn_p8 (poly8x8_t a) { @@ -18695,6 +18030,78 @@ vmul_n_f64 (float64x1_t __a, float64_t __b) return (float64x1_t) { vget_lane_f64 (__a, 0) * __b }; } =20 +__extension__ static __inline float32x2_t __attribute__ ((__always_inline_= _)) +vmul_n_f32 (float32x2_t __a, float32_t __b) +{ + return __builtin_aarch64_mul_nv2sf (__a, __b); +} + +__extension__ static __inline int16x4_t __attribute__ ((__always_inline__)) +vmul_n_s16 (int16x4_t __a, int16_t __b) +{ + return __builtin_aarch64_mul_nv4hi (__a, __b); +} + +__extension__ static __inline int32x2_t __attribute__ ((__always_inline__)) +vmul_n_s32 (int32x2_t __a, int32_t __b) +{ + return __builtin_aarch64_mul_nv2si (__a, __b); +} + +__extension__ static __inline uint16x4_t __attribute__ ((__always_inline__= )) +vmul_n_u16 (uint16x4_t __a, uint16_t __b) +{ + return (uint16x4_t) __builtin_aarch64_mul_nv4hi ((int16x4_t)__a, + (int16_t)__b); +} + +__extension__ static __inline uint32x2_t __attribute__ ((__always_inline__= )) +vmul_n_u32 (uint32x2_t __a, uint32_t __b) +{ + return (uint32x2_t) __builtin_aarch64_mul_nv2si ((int32x2_t)__a, + (int32_t)__b); +} + +/* vmulq_n */ + +__extension__ static __inline float32x4_t __attribute__ ((__always_inline_= _)) +vmulq_n_f32 (float32x4_t __a, float32_t __b) +{ + return __builtin_aarch64_mul_nv4sf (__a, __b); +} + +__extension__ static __inline float64x2_t __attribute__ ((__always_inline_= _)) +vmulq_n_f64 (float64x2_t __a, float64_t __b) +{ + return __builtin_aarch64_mul_nv2df (__a, __b); +} + +__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) +vmulq_n_s16 (int16x8_t __a, int16_t __b) +{ + return __builtin_aarch64_mul_nv8hi (__a, __b); +} + +__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +vmulq_n_s32 (int32x4_t __a, int32_t __b) +{ + return __builtin_aarch64_mul_nv4si (__a, __b); +} + +__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__= )) +vmulq_n_u16 (uint16x8_t __a, uint16_t __b) +{ + return (uint16x8_t) __builtin_aarch64_mul_nv8hi ((int16x8_t)__a, + (int16_t)__b); +} + +__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__= )) +vmulq_n_u32 (uint32x4_t __a, uint32_t __b) +{ + return (uint32x4_t) __builtin_aarch64_mul_nv4si ((int32x4_t)__a, + (int32_t)__b); +} + /* vmulq_lane */ =20 __extension__ static __inline float32x4_t __attribute__ ((__always_inline_= _)) @@ -18772,6 +18179,308 @@ vmulq_laneq_u32 (uint32x4_t __a, uint32x4_t __b, c return __a * __aarch64_vget_lane_any (__b, __lane); } =20 +/* vmull_high_lane */ + +__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +vmull_high_lane_s16 (int16x8_t __a, int16x4_t __b, const int __c) +{ + return __builtin_aarch64_smull2_lanev8hi (__a, __b, __c); +} + +__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +vmull_high_lane_s32 (int32x4_t __a, int32x2_t __b, const int __c) +{ + return __builtin_aarch64_smull2_lanev4si (__a, __b, __c); +} + +__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__= )) +vmull_high_lane_u16 (uint16x8_t __a, uint16x4_t __b, const int __c) +{ + return (uint32x4_t) __builtin_aarch64_umull2_lanev8hi ((int16x8_t) __a, + (int16x4_t) __b, + __c); +} + +__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__= )) +vmull_high_lane_u32 (uint32x4_t __a, uint32x2_t __b, const int __c) +{ + return (uint64x2_t) __builtin_aarch64_umull2_lanev4si ((int32x4_t) __a, + (int32x2_t) __b, + __c); +} + +/* vmull_high_laneq */ + +__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +vmull_high_laneq_s16 (int16x8_t __a, int16x8_t __b, const int __c) +{ + return __builtin_aarch64_smull2_laneqv8hi (__a, __b, __c); +} + +__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +vmull_high_laneq_s32 (int32x4_t __a, int32x4_t __b, const int __c) +{ + return __builtin_aarch64_smull2_laneqv4si (__a, __b, __c); +} + +__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__= )) +vmull_high_laneq_u16 (uint16x8_t __a, uint16x8_t __b, const int __c) +{ + return (uint32x4_t) __builtin_aarch64_umull2_laneqv8hi ((int16x8_t)__a, + (int16x8_t)__b, + __c); +} + +__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__= )) +vmull_high_laneq_u32 (uint32x4_t __a, uint32x4_t __b, const int __c) +{ + return (uint64x2_t) __builtin_aarch64_umull2_laneqv4si ((int32x4_t) __a, + (int32x4_t) __b, + __c); +} + +/* vmull_high_n */ + +__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +vmull_high_n_s16 (int16x8_t __a, int16_t __b) +{ + return __builtin_aarch64_smull2_nv8hi (__a, __b); +} + +__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +vmull_high_n_s32 (int32x4_t __a, int32_t __b) +{ + return __builtin_aarch64_smull2_nv4si (__a, __b); +} + +__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__= )) +vmull_high_n_u16 (uint16x8_t __a, uint16_t __b) +{ + return __builtin_aarch64_umull2_nv8hi_uuu (__a, __b); +} + +__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__= )) +vmull_high_n_u32 (uint32x4_t __a, uint32_t __b) +{ + return __builtin_aarch64_umull2_nv4si_uuu (__a, __b); +} + +/* vmull_high */ + +__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__= )) +vmull_high_p8 (poly8x16_t __a, poly8x16_t __b) +{ + return __builtin_aarch64_pmull2v16qi_ppp (__a, __b); +} + +__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) +vmull_high_s8 (int8x16_t __a, int8x16_t __b) +{ + return __builtin_aarch64_vec_widen_smult_hi_v16qi (__a, __b); +} + +__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +vmull_high_s16 (int16x8_t __a, int16x8_t __b) +{ + return __builtin_aarch64_vec_widen_smult_hi_v8hi (__a, __b); +} + +__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +vmull_high_s32 (int32x4_t __a, int32x4_t __b) +{ + return __builtin_aarch64_vec_widen_smult_hi_v4si (__a, __b); +} + +__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__= )) +vmull_high_u8 (uint8x16_t __a, uint8x16_t __b) +{ + return __builtin_aarch64_vec_widen_umult_hi_v16qi_uuu (__a, __b); +} + +__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__= )) +vmull_high_u16 (uint16x8_t __a, uint16x8_t __b) +{ + return __builtin_aarch64_vec_widen_umult_hi_v8hi_uuu (__a, __b); +} + +__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__= )) +vmull_high_u32 (uint32x4_t __a, uint32x4_t __b) +{ + return __builtin_aarch64_vec_widen_umult_hi_v4si_uuu (__a, __b); +} + +/* vmull_lane */ + +__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +vmull_lane_s16 (int16x4_t __a, int16x4_t __b, const int __c) +{ + return __builtin_aarch64_smull_lanev4hi (__a, __b, __c); +} + +__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +vmull_lane_s32 (int32x2_t __a, int32x2_t __b, const int __c) +{ + return __builtin_aarch64_smull_lanev2si (__a, __b, __c); +} + +__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__= )) +vmull_lane_u16 (uint16x4_t __a, uint16x4_t __b, const unsigned int __c) +{ + return __builtin_aarch64_umull_lanev4hi_uuuu (__a, __b, __c); +} + +__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__= )) +vmull_lane_u32 (uint32x2_t __a, uint32x2_t __b, const unsigned int __c) +{ + return __builtin_aarch64_umull_lanev2si_uuuu (__a, __b, __c); +} + +/* vmull_laneq */ + +__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +vmull_laneq_s16 (int16x4_t __a, int16x8_t __b, const int __c) +{ + return __builtin_aarch64_smull_laneqv4hi (__a, __b, __c); +} + +__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +vmull_laneq_s32 (int32x2_t __a, int32x4_t __b, const int __c) +{ + return __builtin_aarch64_smull_laneqv2si (__a, __b, __c); +} + +__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__= )) +vmull_laneq_u16 (uint16x4_t __a, uint16x8_t __b, const unsigned int __c) +{ + return __builtin_aarch64_umull_laneqv4hi_uuuu (__a, __b, __c); +} + +__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__= )) +vmull_laneq_u32 (uint32x2_t __a, uint32x4_t __b, const unsigned int __c) +{ + return __builtin_aarch64_umull_laneqv2si_uuuu (__a, __b, __c); +} + +/* vmull_n */ + +__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +vmull_n_s16 (int16x4_t __a, int16_t __b) +{ + return __builtin_aarch64_smull_nv4hi (__a, __b); +} + +__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +vmull_n_s32 (int32x2_t __a, int32_t __b) +{ + return __builtin_aarch64_smull_nv2si (__a, __b); +} + +__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__= )) +vmull_n_u16 (uint16x4_t __a, uint16_t __b) +{ + return __builtin_aarch64_umull_nv4hi_uuu (__a, __b); +} + +__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__= )) +vmull_n_u32 (uint32x2_t __a, uint32_t __b) +{ + return __builtin_aarch64_umull_nv2si_uuu (__a, __b); +} + +/* vmull */ +__extension__ static __inline poly16x8_t __attribute__ ((__always_inline__= )) +vmull_p8 (poly8x8_t __a, poly8x8_t __b) +{ + return __builtin_aarch64_pmullv8qi_ppp (__a, __b); +} + +__extension__ static __inline int16x8_t __attribute__ ((__always_inline__)) +vmull_s8 (int8x8_t __a, int8x8_t __b) +{ + return __builtin_aarch64_smullv8qi (__a, __b); +} + +__extension__ static __inline int32x4_t __attribute__ ((__always_inline__)) +vmull_s16 (int16x4_t __a, int16x4_t __b) +{ + return __builtin_aarch64_smullv4hi (__a, __b); +} + +__extension__ static __inline int64x2_t __attribute__ ((__always_inline__)) +vmull_s32 (int32x2_t __a, int32x2_t __b) +{ + return __builtin_aarch64_smullv2si (__a, __b); +} + +__extension__ static __inline uint16x8_t __attribute__ ((__always_inline__= )) +vmull_u8 (uint8x8_t __a, uint8x8_t __b) +{ + return __builtin_aarch64_umullv8qi_uuu (__a, __b); +} + +__extension__ static __inline uint32x4_t __attribute__ ((__always_inline__= )) +vmull_u16 (uint16x4_t __a, uint16x4_t __b) +{ + return __builtin_aarch64_umullv4hi_uuu (__a, __b); +} + +__extension__ static __inline uint64x2_t __attribute__ ((__always_inline__= )) +vmull_u32 (uint32x2_t __a, uint32x2_t __b) +{ + return __builtin_aarch64_umullv2si_uuu (__a, __b); +} + +/* vmulx */ + +__extension__ static __inline float32x2_t __attribute__ ((__always_inline_= _)) +vmulx_f32 (float32x2_t __a, float32x2_t __b) +{ + return __builtin_aarch64_fmulxv2sf (__a, __b); +} + +__extension__ static __inline float32x2_t __attribute__ ((__always_inline_= _)) +vmulx_lane_f32 (float32x2_t __a, float32x4_t __b, const int __c) +{ + return __builtin_aarch64_fmulx_lanev2sf (__a, __b, __c); +} + + +__extension__ static __inline float64_t __attribute__ ((__always_inline__)) +vmulxd_f64 (float64_t __a, float64_t __b) +{ + return __builtin_aarch64_fmulxdf (__a, __b); +} + +__extension__ static __inline float32x4_t __attribute__ ((__always_inline_= _)) +vmulxq_f32 (float32x4_t __a, float32x4_t __b) +{ + return __builtin_aarch64_fmulxv4sf (__a, __b); +} + +__extension__ static __inline float64x2_t __attribute__ ((__always_inline_= _)) +vmulxq_f64 (float64x2_t __a, float64x2_t __b) +{ + return __builtin_aarch64_fmulxv2df (__a, __b); +} + +__extension__ static __inline float32x4_t __attribute__ ((__always_inline_= _)) +vmulxq_lane_f32 (float32x4_t __a, float32x4_t __b, const int __c) +{ + return __builtin_aarch64_fmulx_lanev4sf (__a, __b, __c); +} + +__extension__ static __inline float64x2_t __attribute__ ((__always_inline_= _)) +vmulxq_lane_f64 (float64x2_t __a, float64x2_t __b, const int __c) +{ + return __builtin_aarch64_fmulx_lanev2df (__a, __b, __c); +} + +__extension__ static __inline float32_t __attribute__ ((__always_inline__)) +vmulxs_f32 (float32_t __a, float32_t __b) +{ + return __builtin_aarch64_fmulxsf (__a, __b); +} + /* vneg */ =20 __extension__ static __inline float32x2_t __attribute__ ((__always_inline_= _)) Index: gcc/config/aarch64/iterators.md =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gcc/config/aarch64/iterators.md (revision 219845) +++ gcc/config/aarch64/iterators.md (working copy) @@ -276,6 +276,8 @@ UNSPEC_SHA256SU1 ; Used in aarch64-simd.md. UNSPEC_PMULL ; Used in aarch64-simd.md. UNSPEC_PMULL2 ; Used in aarch64-simd.md. + UNSPEC_FMULX ; Used in aarch64-simd.md. + UNSPEC_FMULX_LANE ; Used in aarch64-simd.md. ]) =20 ;; ------------------------------------------------------------------- @@ -466,6 +468,9 @@ =20 ) =20 +(define_mode_attr VDQF_Q [(V2SF "V4SF") (V4SF "V4SF") + (V2DF "V2DF")]) + ;; Widened mode register suffixes for VD_BHSI/VQW. (define_mode_attr Vwtype [(V8QI "8h") (V4HI "4s") (V2SI "2d") (V16QI "8h")=20 Index: gcc/config/aarch64/aarch64-simd.md =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gcc/config/aarch64/aarch64-simd.md (revision 219845) +++ gcc/config/aarch64/aarch64-simd.md (working copy) @@ -1396,6 +1396,253 @@ } ) =20 +(define_insn "aarch64_mul_n" + [(set (match_operand:VMUL 0 "register_operand" "=3Dw") + (mult:VMUL + (match_operand:VMUL 1 "register_operand" "w") + (vec_duplicate:VMUL + (match_operand: 2 "register_operand" ""))))] + "TARGET_SIMD" + "mul\t%0., %1., %2.[0]" + [(set_attr "type" "neon_mul__long")] +) + +(define_insn "aarch64_mull_n" + [(set (match_operand: 0 "register_operand" "=3Dw") + (mult: + (ANY_EXTEND: + (match_operand:VD_HSI 1 "register_operand" "w")) + (ANY_EXTEND: + (vec_duplicate:VD_HSI + (match_operand: 2 "register_operand" "")))))] + "TARGET_SIMD" + "mull\t%0., %1., %2.[0]" + [(set_attr "type" "neon_mul__scalar_long")] +) + + +(define_insn "aarch64_mull" + [(set (match_operand: 0 "register_operand" "=3Dw") + (mult: + (ANY_EXTEND: + (match_operand:VD_BHSI 1 "register_operand" "w")) + (ANY_EXTEND: + (match_operand:VD_BHSI 2 "register_operand" "w"))))] + "TARGET_SIMD" + "mull\\t%0., %1., %2." + [(set_attr "type" "neon_mul__long")] +) + +(define_insn "aarch64_simd_mull2_n" + [(set (match_operand: 0 "register_operand" "=3Dw") + (mult: (ANY_EXTEND: (vec_select: + (match_operand:VQ_HSI 1 "register_operand" "w") + (match_operand:VQ_HSI 3 "vect_par_cnst_hi_half= " ""))) + (ANY_EXTEND: (vec_duplicate: + (match_operand: 2 "register_operand" "")))))] + "TARGET_SIMD" + "mull2\\t%0., %1., %2.[0]" + [(set_attr "type" "neon_mul__scalar_long")] +) + +(define_expand "aarch64_mull2_n" + [(match_operand: 0 "register_operand" "") + (ANY_EXTEND: (match_operand:VQ_HSI 1 "register_operand" "")) + (match_operand: 2 "register_operand" "")] + "TARGET_SIMD" + { + rtx p =3D aarch64_simd_vect_par_cnst_half (mode, true); + emit_insn (gen_aarch64_simd_mull2_n (operands[0], + operands[1], + operands[2], p)); + DONE; + + } +) + +(define_insn "aarch64_mull_lane" + [(set (match_operand: 0 "register_operand" "=3Dw") + (mult: + (ANY_EXTEND: + (match_operand:VD_HSI 1 "register_operand" "w")) + (ANY_EXTEND: + (vec_duplicate:VD_HSI + (vec_select: + (match_operand: 2 "register_operand" "") + (parallel [(match_operand:SI 3 "immediate_operand" "i")]= ))))))] + "TARGET_SIMD" + { + operands[3] =3D GEN_INT (ENDIAN_LANE_N (mode, INTVAL (operands[= 3]))); + return "mull\\t%0., %1., %2.[%3]"; + } + [(set_attr "type" "neon_mul__scalar_long")] +) + +(define_insn "aarch64_mull_laneq" + [(set (match_operand: 0 "register_operand" "=3Dw") + (mult: + (ANY_EXTEND: + (match_operand:VD_HSI 1 "register_operand" "w")) + (ANY_EXTEND: + (vec_duplicate:VD_HSI + (vec_select: + (match_operand: 2 "register_operand" "") + (parallel [(match_operand:SI 3 "immediate_operand" "i")]= ))))))] + "TARGET_SIMD" + { + operands[3] =3D GEN_INT (ENDIAN_LANE_N (mode, INTVAL (operands[= 3]))); + return "mull\\t%0., %1., %2.[%3]"; + } + [(set_attr "type" "neon_mul__scalar_long")] +) + +(define_insn "aarch64_mull2_lane_internal" + [(set (match_operand: 0 "register_operand" "=3Dw") + (mult: + (ANY_EXTEND: + (vec_select: + (match_operand:VQ_HSI 1 "register_operand" "w") + (match_operand:VQ_HSI 4 "vect_par_cnst_hi_half" ""))) + (ANY_EXTEND: + (vec_duplicate: + (vec_select: + (match_operand: 2 "register_operand" "") + (parallel [(match_operand:SI 3 "immediate_operand" "i")]= ))))))] + "TARGET_SIMD" + { + operands[3] =3D GEN_INT (ENDIAN_LANE_N (mode, INTVAL (operands[= 3]))); + return "mull2\\t%0., %1., %2.[%3]"; + } + [(set_attr "type" "neon_mul__scalar_long")] +) + +(define_insn "aarch64_mull2_laneq_internal" + [(set (match_operand: 0 "register_operand" "=3Dw") + (mult: + (ANY_EXTEND: + (vec_select: + (match_operand:VQ_HSI 1 "register_operand" "w") + (match_operand:VQ_HSI 4 "vect_par_cnst_hi_half" ""))) + (ANY_EXTEND: + (vec_duplicate: + (vec_select: + (match_operand: 2 "register_operand" "") + (parallel [(match_operand:SI 3 "immediate_operand" "i")]= ))))))] + "TARGET_SIMD" + { + operands[3] =3D GEN_INT (ENDIAN_LANE_N (mode, INTVAL (operands[= 3]))); + return "mull2\\t%0., %1., %2.[%3]"; + } + [(set_attr "type" "neon_mul__scalar_long")] +) + +(define_expand "aarch64_smull2_lane" + [(match_operand: 0 "register_operand" "=3Dw") + (match_operand:VQ_HSI 1 "register_operand" "w") + (match_operand: 2 "register_operand" "") + (match_operand:SI 3 "immediate_operand" "i")] + "TARGET_SIMD" +{ + rtx p =3D aarch64_simd_vect_par_cnst_half (mode, true); + emit_insn (gen_aarch64_smull2_lane_internal (operands[0], operands= [1], + operands[2], operands= [3], + p)); + DONE; +}) + +(define_expand "aarch64_umull2_lane" + [(match_operand: 0 "register_operand" "=3Dw") + (match_operand:VQ_HSI 1 "register_operand" "w") + (match_operand: 2 "register_operand" "") + (match_operand:SI 3 "immediate_operand" "i")] + "TARGET_SIMD" +{ + rtx p =3D aarch64_simd_vect_par_cnst_half (mode, true); + emit_insn (gen_aarch64_umull2_lane_internal (operands[0], operands= [1], + operands[2], operands= [3], + p)); + DONE; +}) + +(define_expand "aarch64_smull2_laneq" + [(match_operand: 0 "register_operand" "=3Dw") + (match_operand:VQ_HSI 1 "register_operand" "w") + (match_operand: 2 "register_operand" "") + (match_operand:SI 3 "immediate_operand" "i")] + "TARGET_SIMD" +{ + rtx p =3D aarch64_simd_vect_par_cnst_half (mode, true); + emit_insn (gen_aarch64_smull2_laneq_internal (operands[0], operand= s[1], + operands[2], operand= s[3], + p)); + DONE; +}) + +(define_expand "aarch64_umull2_laneq" + [(match_operand: 0 "register_operand" "=3Dw") + (match_operand:VQ_HSI 1 "register_operand" "w") + (match_operand: 2 "register_operand" "") + (match_operand:SI 3 "immediate_operand" "i")] + "TARGET_SIMD" +{ + rtx p =3D aarch64_simd_vect_par_cnst_half (mode, true); + emit_insn (gen_aarch64_umull2_laneq_internal (operands[0], operand= s[1], + operands[2], operand= s[3], + p)); + DONE; +}) + +(define_insn "aarch64_fmulx" + [(set (match_operand:VDQF 0 "register_operand" "=3Dw") + (unspec:VDQF [(match_operand:VDQF 1 "register_operand" "w") + (match_operand:VDQF 2 "register_operand" "w")] + UNSPEC_FMULX))] + "TARGET_SIMD" + "fmulx\\t%0., %1., %2." + [(set_attr "type" "neon_mul_s")] +) + +(define_insn "aarch64_fmulx" + [(set (match_operand:GPF 0 "register_operand" "=3Dw") + (unspec:GPF [(match_operand:GPF 1 "register_operand" "w") + (match_operand:GPF 2 "register_operand" "w")] + UNSPEC_FMULX))] + "TARGET_SIMD" + "fmulx\\t%0, %1, %2" + [(set_attr "type" "neon_mul_s")] +) + +(define_insn "aarch64_fmulx_lane" + [(set (match_operand:VDQF 0 "register_operand" "=3Dw") + (unspec:VDQF [(match_operand:VDQF 1 "register_operand" "w") + (match_operand: 2 "register_operand" "w") + (match_operand:SI 3 "immediate_operand" "i")] + UNSPEC_FMULX_LANE))] + "TARGET_SIMD" + "fmulx\\t%0., %1., %2." + [(set_attr "type" "neon_mul_s")] +) + +(define_insn "aarch64_pmull2v16qi" + [(set (match_operand:V8HI 0 "register_operand" "=3Dw") + (unspec:V8HI [(match_operand:V16QI 1 "register_operand" "w") + (match_operand:V16QI 2 "register_operand" "w")] + UNSPEC_PMULL2))] + "TARGET_SIMD" + "pmull2\\t%0.8h, %1.16b, %2.16b" + [(set_attr "type" "neon_mul_b_long")] +) + +(define_insn "aarch64_pmullv8qi" + [(set (match_operand:V8HI 0 "register_operand" "=3Dw") + (unspec:V8HI [(match_operand:V8QI 1 "register_operand" "w") + (match_operand:V8QI 2 "register_operand" "w")] + UNSPEC_PMULL))] + "TARGET_SIMD" + "pmull\\t%0.8h, %1.8b, %2.8b" + [(set_attr "type" "neon_mul_b_long")] +) + ;; FP vector operations. ;; AArch64 AdvSIMD supports single-precision (32-bit) and=20 ;; double-precision (64-bit) floating-point data types and arithmetic as Index: gcc/config/aarch64/aarch64-simd-builtins.def =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- gcc/config/aarch64/aarch64-simd-builtins.def (revision 219845) +++ gcc/config/aarch64/aarch64-simd-builtins.def (working copy) @@ -187,6 +187,39 @@ BUILTIN_VSDQ_HSI (TERNOP_LANE, sqrdmulh_lane, 0) BUILTIN_VSDQ_HSI (TERNOP_LANE, sqrdmulh_laneq, 0) =20 + /* Implemented by vec_widen_mult_hi_. */ + BUILTIN_VQW (BINOP, vec_widen_smult_hi_, 10) + BUILTIN_VQW (BINOPU, vec_widen_umult_hi_, 10) + /* Implemented by aarch64_mull. */ + BUILTIN_VD_BHSI (BINOPU, umull, 0) + BUILTIN_VD_BHSI (BINOP, smull, 0) + /* Implemented by aarch64_mull_n. */ + BUILTIN_VD_HSI (BINOP, smull_n, 0) + BUILTIN_VD_HSI (BINOPU, umull_n, 0) + /* Implemented by aarch64_mul_n. */ + BUILTIN_VMUL (BINOP, mul_n, 0) + /* Implemented by aarch64_mull2_n. */ + BUILTIN_VQ_HSI (BINOP, smull2_n, 0) + BUILTIN_VQ_HSI (BINOPU, umull2_n, 0) + /* Implemented by aarch64_mull_lane. */ + BUILTIN_VD_HSI (TERNOP, smull_lane, 0) + BUILTIN_VD_HSI (TERNOPU, umull_lane, 0) + BUILTIN_VD_HSI (TERNOP, smull_laneq, 0) + BUILTIN_VD_HSI (TERNOPU, umull_laneq, 0) + /* Implemented by aarch64_mull2_lane. */ + BUILTIN_VQ_HSI (TERNOP, smull2_lane, 0) + BUILTIN_VQ_HSI (TERNOP_LANE, umull2_lane, 0) + BUILTIN_VQ_HSI (TERNOP, smull2_laneq, 0) + BUILTIN_VQ_HSI (TERNOP_LANE, umull2_laneq, 0) + /* Implemented by aarch64_fmulx. */ + BUILTIN_VDQF (BINOP, fmulx, 0) + BUILTIN_GPF (BINOP, fmulx, 0) + BUILTIN_VDQF (BINOP, fmulx_lane, 0) + + /* Implemented by aarch64_pmull<2>.*/ + VAR1 (BINOPP, pmull, 0, v8qi) + VAR1 (BINOPP, pmull2, 0, v16qi) + BUILTIN_VSDQ_I_DI (BINOP, ashl, 3) /* Implemented by aarch64_shl. */ BUILTIN_VSDQ_I_DI (BINOP, sshl, 0) --_002_B34C25384B9D7A428FF276D3AE7D6BDC7B4FE913nkgeml511mbxchi_ Content-Type: application/octet-stream; name="aarch64_vmull_X_v4.diff" Content-Description: aarch64_vmull_X_v4.diff Content-Disposition: attachment; filename="aarch64_vmull_X_v4.diff"; size=55320; creation-date="Thu, 12 Mar 2015 09:17:02 GMT"; modification-date="Thu, 12 Mar 2015 09:17:02 GMT" Content-Transfer-Encoding: base64 Content-length: 74990 SW5kZXg6IGdjYy9DaGFuZ2VMb2cKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQot LS0gZ2NjL0NoYW5nZUxvZwkocmV2aXNpb24gMjE5ODQ1KQorKysgZ2NjL0No YW5nZUxvZwkod29ya2luZyBjb3B5KQpAQCAtMSwzICsxLDM4IEBACisyMDE0 LTEyLTExICBGZWxpeCBZYW5nICA8ZmVsaXgueWFuZ0BodWF3ZWkuY29tPgor CSAgICBKaWppIEppYW5nICA8amlhbmdqaWppQGh1YXdlaS5jb20+CisKKwkq IGNvbmZpZy9hYXJjaDY0L2FhcmNoNjQtc2ltZC5tZCAoYWFyY2g2NF9tdWxf bjxtb2RlPiwKKwlhYXJjaDY0XzxzdT5tdWxsX248bW9kZT4sIGFhcmNoNjRf PHN1Pm11bGw8bW9kZT4sCisJYWFyY2g2NF9zaW1kXzxzdT5tdWxsMl9uPG1v ZGU+LCBhYXJjaDY0XzxzdT5tdWxsMl9uPG1vZGU+LAorCWFhcmNoNjRfPHN1 Pm11bGxfbGFuZTxtb2RlPiwgYWFyY2g2NF88c3U+bXVsbDJfbGFuZTxtb2Rl Pl9pbnRlcm5hbCwKKwlhYXJjaDY0XzxzdT5tdWxsX2xhbmVxPG1vZGU+LCBh YXJjaDY0XzxzdT5tdWxsMl9sYW5lcTxtb2RlPl9pbnRlcm5hbCwKKwlhYXJj aDY0X3NtdWxsMl9sYW5lPG1vZGU+LCBhYXJjaDY0X3VtdWxsMl9sYW5lPG1v ZGU+LAorCWFhcmNoNjRfc211bGwyX2xhbmVxPG1vZGU+LCBhYXJjaDY0X3Vt dWxsMl9sYW5lcTxtb2RlPiwKKwlhYXJjaDY0X2ZtdWx4PG1vZGU+LCBhYXJj aDY0X2ZtdWx4PG1vZGU+LCBhYXJjaDY0X2ZtdWx4X2xhbmU8bW9kZT4sCisJ YWFyY2g2NF9wbXVsbDJ2MTZxaSwgYWFyY2g2NF9wbXVsbHY4cWkpOiBOZXcg cGF0dGVybnMuCisJKiBjb25maWcvYWFyY2g2NC9hYXJjaDY0LXNpbWQtYnVp bHRpbnMuZGVmICh2ZWNfd2lkZW5fc211bHRfaGlfLAorCXZlY193aWRlbl91 bXVsdF9oaV8sIHVtdWxsLCBzbXVsbCwgc211bGxfbiwgdW11bGxfbiwgbXVs X24sIHNtdWxsMl9uLAorCXVtdWxsMl9uLCBzbXVsbF9sYW5lLCB1bXVsbF9s YW5lLCBzbXVsbF9sYW5lcSwgdW11bGxfbGFuZXEsIHBtdWxsLAorCXVtdWxs Ml9sYW5lLCBzbXVsbDJfbGFuZXEsIHVtdWxsMl9sYW5lcSwgZm11bHgsIGZt dWx4X2xhbmUsIHBtdWxsMiwKKwlzbXVsbDJfbGFuZSk6IE5ldyBidWlsdGlu cy4KKwkqIGNvbmZpZy9hYXJjaDY0L2FybV9uZW9uLmggKHZtdWxfbl9mMzIs IHZtdWxfbl9zMTYsIHZtdWxfbl9zMzIsCisJdm11bF9uX3UxNiwgdm11bF9u X3UzMiwgdm11bHFfbl9mMzIsIHZtdWxxX25fZjY0LCB2bXVscV9uX3MxNiwK Kwl2bXVscV9uX3MzMiwgdm11bHFfbl91MTYsIHZtdWxxX25fdTMyLCB2bXVs bF9oaWdoX2xhbmVfczE2LAorCXZtdWxsX2hpZ2hfbGFuZV9zMzIsIHZtdWxs X2hpZ2hfbGFuZV91MTYsIHZtdWxsX2hpZ2hfbGFuZV91MzIsCisJdm11bGxf aGlnaF9sYW5lcV9zMTYsIHZtdWxsX2hpZ2hfbGFuZXFfczMyLCB2bXVsbF9o aWdoX2xhbmVxX3UxNiwKKwl2bXVsbF9oaWdoX2xhbmVxX3UzMiwgdm11bGxf aGlnaF9uX3MxNiwgdm11bGxfaGlnaF9uX3MzMiwKKwl2bXVsbF9oaWdoX25f dTE2LCB2bXVsbF9oaWdoX25fdTMyLCB2bXVsbF9oaWdoX3A4LCB2bXVsbF9o aWdoX3M4LAorCXZtdWxsX2hpZ2hfczE2LCB2bXVsbF9oaWdoX3MzMiwgdm11 bGxfaGlnaF91OCwgdm11bGxfaGlnaF91MTYsCisJdm11bGxfaGlnaF91MzIs IHZtdWxsX2xhbmVfczE2LCB2bXVsbF9sYW5lX3MzMiwgdm11bGxfbGFuZV91 MTYsCisJdm11bGxfbGFuZV91MzIsIHZtdWxsX2xhbmVxX3MxNiwgdm11bGxf bGFuZXFfczMyLCB2bXVsbF9sYW5lcV91MTYsCisJdm11bGxfbGFuZXFfdTMy LCB2bXVsbF9uX3MxNiwgdm11bGxfbl9zMzIsIHZtdWxsX25fdTE2LCB2bXVs bF9uX3UzMiwKKwl2bXVsbF9wOCwgdm11bGxfczgsIHZtdWxsX3MxNiwgdm11 bGxfczMyLCB2bXVsbF91OCwgdm11bGxfdTE2LAorCXZtdWxsX3UzMiwgdm11 bHhfZjMyLCB2bXVseF9sYW5lX2YzMiwgdm11bHhkX2Y2NCwgdm11bHhxX2Yz MiwKKwl2bXVseHFfZjY0LCB2bXVseHFfbGFuZV9mMzIsIHZtdWx4cV9sYW5l X2Y2NCwgdm11bHhzX2YzMik6IFJld3JpdGUKKwl1c2luZyBidWlsdGluIGZ1 bmN0aW9ucy4KKwkqIGNvbmZpZy9hYXJjaDY0L2l0ZXJhdG9ycy5tZCAoVU5T UEVDX0ZNVUxYLCBVTlNQRUNfRk1VTFhfTEFORSwKKwlWRFFGX1EpOiBOZXcg dW5zcGVjIGFuZCBpbnQgaXRlcmF0b3IuCisKIDIwMTUtMDEtMTkgIEppb25n IFdhbmcgIDxqaW9uZy53YW5nQGFybS5jb20+CiAJICAgIEFuZHJldyBQaW5z a2kgIDxhcGluc2tpQGNhdml1bS5jb20+CiAKSW5kZXg6IGdjYy9jb25maWcv YWFyY2g2NC9hcm1fbmVvbi5oCj09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t IGdjYy9jb25maWcvYWFyY2g2NC9hcm1fbmVvbi5oCShyZXZpc2lvbiAyMTk4 NDUpCisrKyBnY2MvY29uZmlnL2FhcmNoNjQvYXJtX25lb24uaAkod29ya2lu ZyBjb3B5KQpAQCAtNzU4MCw2NzEgKzc1ODAsNiBAQCB2bW92bl91NjQgKHVp bnQ2NHgyX3QgYSkKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotX19leHRlbnNp b25fXyBzdGF0aWMgX19pbmxpbmUgZmxvYXQzMngyX3QgX19hdHRyaWJ1dGVf XyAoKF9fYWx3YXlzX2lubGluZV9fKSkKLXZtdWxfbl9mMzIgKGZsb2F0MzJ4 Ml90IGEsIGZsb2F0MzJfdCBiKQotewotICBmbG9hdDMyeDJfdCByZXN1bHQ7 Ci0gIF9fYXNtX18gKCJmbXVsICUwLjJzLCUxLjJzLCUyLnNbMF0iCi0gICAg ICAgICAgIDogIj13IihyZXN1bHQpCi0gICAgICAgICAgIDogInciKGEpLCAi dyIoYikKLSAgICAgICAgICAgOiAvKiBObyBjbG9iYmVycyAqLyk7Ci0gIHJl dHVybiByZXN1bHQ7Ci19Ci0KLV9fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5s aW5lIGludDE2eDRfdCBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5l X18pKQotdm11bF9uX3MxNiAoaW50MTZ4NF90IGEsIGludDE2X3QgYikKLXsK LSAgaW50MTZ4NF90IHJlc3VsdDsKLSAgX19hc21fXyAoIm11bCAlMC40aCwl MS40aCwlMi5oWzBdIgotICAgICAgICAgICA6ICI9dyIocmVzdWx0KQotICAg ICAgICAgICA6ICJ3IihhKSwgIngiKGIpCi0gICAgICAgICAgIDogLyogTm8g Y2xvYmJlcnMgKi8pOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1fX2V4dGVu c2lvbl9fIHN0YXRpYyBfX2lubGluZSBpbnQzMngyX3QgX19hdHRyaWJ1dGVf XyAoKF9fYWx3YXlzX2lubGluZV9fKSkKLXZtdWxfbl9zMzIgKGludDMyeDJf dCBhLCBpbnQzMl90IGIpCi17Ci0gIGludDMyeDJfdCByZXN1bHQ7Ci0gIF9f YXNtX18gKCJtdWwgJTAuMnMsJTEuMnMsJTIuc1swXSIKLSAgICAgICAgICAg OiAiPXciKHJlc3VsdCkKLSAgICAgICAgICAgOiAidyIoYSksICJ3IihiKQot ICAgICAgICAgICA6IC8qIE5vIGNsb2JiZXJzICovKTsKLSAgcmV0dXJuIHJl c3VsdDsKLX0KLQotX19leHRlbnNpb25fXyBzdGF0aWMgX19pbmxpbmUgdWlu dDE2eDRfdCBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQot dm11bF9uX3UxNiAodWludDE2eDRfdCBhLCB1aW50MTZfdCBiKQotewotICB1 aW50MTZ4NF90IHJlc3VsdDsKLSAgX19hc21fXyAoIm11bCAlMC40aCwlMS40 aCwlMi5oWzBdIgotICAgICAgICAgICA6ICI9dyIocmVzdWx0KQotICAgICAg ICAgICA6ICJ3IihhKSwgIngiKGIpCi0gICAgICAgICAgIDogLyogTm8gY2xv YmJlcnMgKi8pOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1fX2V4dGVuc2lv bl9fIHN0YXRpYyBfX2lubGluZSB1aW50MzJ4Ml90IF9fYXR0cmlidXRlX18g KChfX2Fsd2F5c19pbmxpbmVfXykpCi12bXVsX25fdTMyICh1aW50MzJ4Ml90 IGEsIHVpbnQzMl90IGIpCi17Ci0gIHVpbnQzMngyX3QgcmVzdWx0OwotICBf X2FzbV9fICgibXVsICUwLjJzLCUxLjJzLCUyLnNbMF0iCi0gICAgICAgICAg IDogIj13IihyZXN1bHQpCi0gICAgICAgICAgIDogInciKGEpLCAidyIoYikK LSAgICAgICAgICAgOiAvKiBObyBjbG9iYmVycyAqLyk7Ci0gIHJldHVybiBy ZXN1bHQ7Ci19Ci0KLSNkZWZpbmUgdm11bGxfaGlnaF9sYW5lX3MxNihhLCBi LCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAg X19leHRlbnNpb25fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoeyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKLSAgICAgICBpbnQxNng0X3QgYl8gPSAoYik7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAg ICAgICBpbnQxNng4X3QgYV8gPSAoYSk7ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBpbnQzMng0X3Qg cmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKLSAgICAgICBfX2FzbV9fICgic211bGwyICUwLjRzLCAl MS44aCwgJTIuaFslM10iICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAg ICAgICAgICAgICAgICA6ICI9dyIocmVzdWx0KSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICA6 ICJ3IihhXyksICJ4IihiXyksICJpIihjKSAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICA6IC8qIE5vIGNsb2JiZXJz ICovKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAg ICAgICByZXN1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgfSkKLQotI2RlZmlu ZSB2bXVsbF9oaWdoX2xhbmVfczMyKGEsIGIsIGMpICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAotICBfX2V4dGVuc2lvbl9fICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAotICAgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAg IGludDMyeDJfdCBiXyA9IChiKTsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGludDMyeDRfdCBhXyA9 IChhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAotICAgICAgIGludDY0eDJfdCByZXN1bHQ7ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAg IF9fYXNtX18gKCJzbXVsbDIgJTAuMmQsICUxLjRzLCAlMi5zWyUzXSIgICAg ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIDogIj13 IihyZXN1bHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAotICAgICAgICAgICAgICAgIDogInciKGFfKSwgInciKGJfKSwg ImkiKGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAg ICAgICAgICAgIDogLyogTm8gY2xvYmJlcnMgKi8pOyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHJlc3VsdDsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAotICAgICB9KQotCi0jZGVmaW5lIHZtdWxsX2hpZ2hfbGFuZV91 MTYoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCi0gIF9fZXh0ZW5zaW9uX18gICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCi0gICAgICAgdWludDE2eDRfdCBiXyA9IChi KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCi0gICAgICAgdWludDE2eDhfdCBhXyA9IChhKTsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgdWlu dDMyeDRfdCByZXN1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCi0gICAgICAgX19hc21fXyAoInVtdWxsMiAl MC40cywgJTEuOGgsICUyLmhbJTNdIiAgICAgICAgICAgICAgICAgICAgICAg ICBcCi0gICAgICAgICAgICAgICAgOiAiPXciKHJlc3VsdCkgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAg ICAgICAgOiAidyIoYV8pLCAieCIoYl8pLCAiaSIoYykgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAvKiBObyBj bG9iYmVycyAqLyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCi0gICAgICAgcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0pCi0K LSNkZWZpbmUgdm11bGxfaGlnaF9sYW5lX3UzMihhLCBiLCBjKSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgX19leHRlbnNpb25f XyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKLSAgICAoeyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK LSAgICAgICB1aW50MzJ4Ml90IGJfID0gKGIpOyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB1aW50MzJ4 NF90IGFfID0gKGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKLSAgICAgICB1aW50NjR4Ml90IHJlc3VsdDsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK LSAgICAgICBfX2FzbV9fICgidW11bGwyICUwLjJkLCAlMS40cywgJTIuc1sl M10iICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAg ICA6ICI9dyIocmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICA6ICJ3IihhXyksICJ3 IihiXyksICJpIihjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK LSAgICAgICAgICAgICAgICA6IC8qIE5vIGNsb2JiZXJzICovKTsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICByZXN1bHQ7 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKLSAgICAgfSkKLQotI2RlZmluZSB2bXVsbF9oaWdo X2xhbmVxX3MxNihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAotICBfX2V4dGVuc2lvbl9fICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAg ICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGludDE2eDhfdCBi XyA9IChiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAotICAgICAgIGludDE2eDhfdCBhXyA9IChhKTsgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAg ICAgIGludDMyeDRfdCByZXN1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIF9fYXNtX18gKCJz bXVsbDIgJTAuNHMsICUxLjhoLCAlMi5oWyUzXSIgICAgICAgICAgICAgICAg ICAgICAgICAgXAotICAgICAgICAgICAgICAgIDogIj13IihyZXN1bHQpICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAg ICAgICAgICAgICAgIDogInciKGFfKSwgIngiKGJfKSwgImkiKGMpICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIDog LyogTm8gY2xvYmJlcnMgKi8pOyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAotICAgICAgIHJlc3VsdDsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAg ICB9KQotCi0jZGVmaW5lIHZtdWxsX2hpZ2hfbGFuZXFfczMyKGEsIGIsIGMp ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9fZXh0 ZW5zaW9uX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCi0gICAgICAgaW50MzJ4NF90IGJfID0gKGIpOyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAg aW50MzJ4NF90IGFfID0gKGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgaW50NjR4Ml90IHJlc3Vs dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCi0gICAgICAgX19hc21fXyAoInNtdWxsMiAlMC4yZCwgJTEuNHMs ICUyLnNbJTNdIiAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAg ICAgICAgICAgOiAiPXciKHJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAidyIo YV8pLCAidyIoYl8pLCAiaSIoYykgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCi0gICAgICAgICAgICAgICAgOiAvKiBObyBjbG9iYmVycyAqLyk7 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAg cmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0pCi0KLSNkZWZpbmUgdm11 bGxfaGlnaF9sYW5lcV91MTYoYSwgYiwgYykgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKLSAgX19leHRlbnNpb25fXyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKLSAgICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB1aW50 MTZ4OF90IGJfID0gKGIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKLSAgICAgICB1aW50MTZ4OF90IGFfID0gKGEp OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKLSAgICAgICB1aW50MzJ4NF90IHJlc3VsdDsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBfX2Fz bV9fICgidW11bGwyICUwLjRzLCAlMS44aCwgJTIuaFslM10iICAgICAgICAg ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICA6ICI9dyIocmVz dWx0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKLSAgICAgICAgICAgICAgICA6ICJ3IihhXyksICJ4IihiXyksICJpIihj KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAg ICAgICA6IC8qIE5vIGNsb2JiZXJzICovKTsgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKLSAgICAgICByZXN1bHQ7ICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKLSAgICAgfSkKLQotI2RlZmluZSB2bXVsbF9oaWdoX2xhbmVxX3UzMihh LCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAot ICBfX2V4dGVuc2lvbl9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICh7ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXAotICAgICAgIHVpbnQzMng0X3QgYl8gPSAoYik7ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAot ICAgICAgIHVpbnQzMng0X3QgYV8gPSAoYSk7ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHVpbnQ2NHgy X3QgcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXAotICAgICAgIF9fYXNtX18gKCJ1bXVsbDIgJTAuMmQs ICUxLjRzLCAlMi5zWyUzXSIgICAgICAgICAgICAgICAgICAgICAgICAgXAot ICAgICAgICAgICAgICAgIDogIj13IihyZXN1bHQpICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAg IDogInciKGFfKSwgInciKGJfKSwgImkiKGMpICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIDogLyogTm8gY2xvYmJl cnMgKi8pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAot ICAgICAgIHJlc3VsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICB9KQotCi1fX2V4 dGVuc2lvbl9fIHN0YXRpYyBfX2lubGluZSBpbnQzMng0X3QgX19hdHRyaWJ1 dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKLXZtdWxsX2hpZ2hfbl9zMTYg KGludDE2eDhfdCBhLCBpbnQxNl90IGIpCi17Ci0gIGludDMyeDRfdCByZXN1 bHQ7Ci0gIF9fYXNtX18gKCJzbXVsbDIgJTAuNHMsJTEuOGgsJTIuaFswXSIK LSAgICAgICAgICAgOiAiPXciKHJlc3VsdCkKLSAgICAgICAgICAgOiAidyIo YSksICJ4IihiKQotICAgICAgICAgICA6IC8qIE5vIGNsb2JiZXJzICovKTsK LSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotX19leHRlbnNpb25fXyBzdGF0aWMg X19pbmxpbmUgaW50NjR4Ml90IF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19p bmxpbmVfXykpCi12bXVsbF9oaWdoX25fczMyIChpbnQzMng0X3QgYSwgaW50 MzJfdCBiKQotewotICBpbnQ2NHgyX3QgcmVzdWx0OwotICBfX2FzbV9fICgi c211bGwyICUwLjJkLCUxLjRzLCUyLnNbMF0iCi0gICAgICAgICAgIDogIj13 IihyZXN1bHQpCi0gICAgICAgICAgIDogInciKGEpLCAidyIoYikKLSAgICAg ICAgICAgOiAvKiBObyBjbG9iYmVycyAqLyk7Ci0gIHJldHVybiByZXN1bHQ7 Ci19Ci0KLV9fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIHVpbnQzMng0 X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKLXZtdWxs X2hpZ2hfbl91MTYgKHVpbnQxNng4X3QgYSwgdWludDE2X3QgYikKLXsKLSAg dWludDMyeDRfdCByZXN1bHQ7Ci0gIF9fYXNtX18gKCJ1bXVsbDIgJTAuNHMs JTEuOGgsJTIuaFswXSIKLSAgICAgICAgICAgOiAiPXciKHJlc3VsdCkKLSAg ICAgICAgICAgOiAidyIoYSksICJ4IihiKQotICAgICAgICAgICA6IC8qIE5v IGNsb2JiZXJzICovKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotX19leHRl bnNpb25fXyBzdGF0aWMgX19pbmxpbmUgdWludDY0eDJfdCBfX2F0dHJpYnV0 ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQotdm11bGxfaGlnaF9uX3UzMiAo dWludDMyeDRfdCBhLCB1aW50MzJfdCBiKQotewotICB1aW50NjR4Ml90IHJl c3VsdDsKLSAgX19hc21fXyAoInVtdWxsMiAlMC4yZCwlMS40cywlMi5zWzBd IgotICAgICAgICAgICA6ICI9dyIocmVzdWx0KQotICAgICAgICAgICA6ICJ3 IihhKSwgInciKGIpCi0gICAgICAgICAgIDogLyogTm8gY2xvYmJlcnMgKi8p OwotICByZXR1cm4gcmVzdWx0OwotfQotCi1fX2V4dGVuc2lvbl9fIHN0YXRp YyBfX2lubGluZSBwb2x5MTZ4OF90IF9fYXR0cmlidXRlX18gKChfX2Fsd2F5 c19pbmxpbmVfXykpCi12bXVsbF9oaWdoX3A4IChwb2x5OHgxNl90IGEsIHBv bHk4eDE2X3QgYikKLXsKLSAgcG9seTE2eDhfdCByZXN1bHQ7Ci0gIF9fYXNt X18gKCJwbXVsbDIgJTAuOGgsJTEuMTZiLCUyLjE2YiIKLSAgICAgICAgICAg OiAiPXciKHJlc3VsdCkKLSAgICAgICAgICAgOiAidyIoYSksICJ3IihiKQot ICAgICAgICAgICA6IC8qIE5vIGNsb2JiZXJzICovKTsKLSAgcmV0dXJuIHJl c3VsdDsKLX0KLQotX19leHRlbnNpb25fXyBzdGF0aWMgX19pbmxpbmUgaW50 MTZ4OF90IF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXykpCi12 bXVsbF9oaWdoX3M4IChpbnQ4eDE2X3QgYSwgaW50OHgxNl90IGIpCi17Ci0g IGludDE2eDhfdCByZXN1bHQ7Ci0gIF9fYXNtX18gKCJzbXVsbDIgJTAuOGgs JTEuMTZiLCUyLjE2YiIKLSAgICAgICAgICAgOiAiPXciKHJlc3VsdCkKLSAg ICAgICAgICAgOiAidyIoYSksICJ3IihiKQotICAgICAgICAgICA6IC8qIE5v IGNsb2JiZXJzICovKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotX19leHRl bnNpb25fXyBzdGF0aWMgX19pbmxpbmUgaW50MzJ4NF90IF9fYXR0cmlidXRl X18gKChfX2Fsd2F5c19pbmxpbmVfXykpCi12bXVsbF9oaWdoX3MxNiAoaW50 MTZ4OF90IGEsIGludDE2eDhfdCBiKQotewotICBpbnQzMng0X3QgcmVzdWx0 OwotICBfX2FzbV9fICgic211bGwyICUwLjRzLCUxLjhoLCUyLjhoIgotICAg ICAgICAgICA6ICI9dyIocmVzdWx0KQotICAgICAgICAgICA6ICJ3IihhKSwg InciKGIpCi0gICAgICAgICAgIDogLyogTm8gY2xvYmJlcnMgKi8pOwotICBy ZXR1cm4gcmVzdWx0OwotfQotCi1fX2V4dGVuc2lvbl9fIHN0YXRpYyBfX2lu bGluZSBpbnQ2NHgyX3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGlu ZV9fKSkKLXZtdWxsX2hpZ2hfczMyIChpbnQzMng0X3QgYSwgaW50MzJ4NF90 IGIpCi17Ci0gIGludDY0eDJfdCByZXN1bHQ7Ci0gIF9fYXNtX18gKCJzbXVs bDIgJTAuMmQsJTEuNHMsJTIuNHMiCi0gICAgICAgICAgIDogIj13IihyZXN1 bHQpCi0gICAgICAgICAgIDogInciKGEpLCAidyIoYikKLSAgICAgICAgICAg OiAvKiBObyBjbG9iYmVycyAqLyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0K LV9fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIHVpbnQxNng4X3QgX19h dHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKLXZtdWxsX2hpZ2hf dTggKHVpbnQ4eDE2X3QgYSwgdWludDh4MTZfdCBiKQotewotICB1aW50MTZ4 OF90IHJlc3VsdDsKLSAgX19hc21fXyAoInVtdWxsMiAlMC44aCwlMS4xNmIs JTIuMTZiIgotICAgICAgICAgICA6ICI9dyIocmVzdWx0KQotICAgICAgICAg ICA6ICJ3IihhKSwgInciKGIpCi0gICAgICAgICAgIDogLyogTm8gY2xvYmJl cnMgKi8pOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1fX2V4dGVuc2lvbl9f IHN0YXRpYyBfX2lubGluZSB1aW50MzJ4NF90IF9fYXR0cmlidXRlX18gKChf X2Fsd2F5c19pbmxpbmVfXykpCi12bXVsbF9oaWdoX3UxNiAodWludDE2eDhf dCBhLCB1aW50MTZ4OF90IGIpCi17Ci0gIHVpbnQzMng0X3QgcmVzdWx0Owot ICBfX2FzbV9fICgidW11bGwyICUwLjRzLCUxLjhoLCUyLjhoIgotICAgICAg ICAgICA6ICI9dyIocmVzdWx0KQotICAgICAgICAgICA6ICJ3IihhKSwgInci KGIpCi0gICAgICAgICAgIDogLyogTm8gY2xvYmJlcnMgKi8pOwotICByZXR1 cm4gcmVzdWx0OwotfQotCi1fX2V4dGVuc2lvbl9fIHN0YXRpYyBfX2lubGlu ZSB1aW50NjR4Ml90IF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVf XykpCi12bXVsbF9oaWdoX3UzMiAodWludDMyeDRfdCBhLCB1aW50MzJ4NF90 IGIpCi17Ci0gIHVpbnQ2NHgyX3QgcmVzdWx0OwotICBfX2FzbV9fICgidW11 bGwyICUwLjJkLCUxLjRzLCUyLjRzIgotICAgICAgICAgICA6ICI9dyIocmVz dWx0KQotICAgICAgICAgICA6ICJ3IihhKSwgInciKGIpCi0gICAgICAgICAg IDogLyogTm8gY2xvYmJlcnMgKi8pOwotICByZXR1cm4gcmVzdWx0OwotfQot Ci0jZGVmaW5lIHZtdWxsX2xhbmVfczE2KGEsIGIsIGMpICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9fZXh0ZW5zaW9u X18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCi0gICAgKHsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc Ci0gICAgICAgaW50MTZ4NF90IGJfID0gKGIpOyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgaW50MTZ4 NF90IGFfID0gKGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCi0gICAgICAgaW50MzJ4NF90IHJlc3VsdDsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc Ci0gICAgICAgX19hc21fXyAoInNtdWxsICUwLjRzLCUxLjRoLCUyLmhbJTNd IiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAg ICAgOiAiPXciKHJlc3VsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAidyIoYV8pLCAi eCIoYl8pLCAiaSIoYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBc Ci0gICAgICAgICAgICAgICAgOiAvKiBObyBjbG9iYmVycyAqLyk7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgcmVzdWx0 OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICBcCi0gICAgIH0pCi0KLSNkZWZpbmUgdm11bGxfbGFu ZV9zMzIoYSwgYiwgYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKLSAgX19leHRlbnNpb25fXyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAg ICAoeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBpbnQzMngyX3Qg Yl8gPSAoYik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKLSAgICAgICBpbnQzMngyX3QgYV8gPSAoYSk7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAg ICAgICBpbnQ2NHgyX3QgcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBfX2FzbV9fICgi c211bGwgJTAuMmQsJTEuMnMsJTIuc1slM10iICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICA6ICI9dyIocmVzdWx0KSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAg ICAgICAgICAgICAgICA6ICJ3IihhXyksICJ3IihiXyksICJpIihjKSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICA6 IC8qIE5vIGNsb2JiZXJzICovKTsgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIFwKLSAgICAgICByZXN1bHQ7ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAg ICAgfSkKLQotI2RlZmluZSB2bXVsbF9sYW5lX3UxNihhLCBiLCBjKSAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBfX2V4 dGVuc2lvbl9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAotICAgICh7ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAotICAgICAgIHVpbnQxNng0X3QgYl8gPSAoYik7ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAg IHVpbnQxNng0X3QgYV8gPSAoYSk7ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHVpbnQzMng0X3QgcmVz dWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAotICAgICAgIF9fYXNtX18gKCJ1bXVsbCAlMC40cywlMS40aCwl Mi5oWyUzXSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAg ICAgICAgICAgIDogIj13IihyZXN1bHQpICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIDogInci KGFfKSwgIngiKGJfKSwgImkiKGMpICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgXAotICAgICAgICAgICAgICAgIDogLyogTm8gY2xvYmJlcnMgKi8p OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAg IHJlc3VsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgXAotICAgICB9KQotCi0jZGVmaW5lIHZt dWxsX2xhbmVfdTMyKGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCi0gIF9fZXh0ZW5zaW9uX18gICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCi0gICAgKHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgdWlu dDMyeDJfdCBiXyA9IChiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCi0gICAgICAgdWludDMyeDJfdCBhXyA9IChh KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCi0gICAgICAgdWludDY0eDJfdCByZXN1bHQ7ICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgX19h c21fXyAoInVtdWxsICUwLjJkLCAlMS4ycywgJTIuc1slM10iICAgICAgICAg ICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAiPXciKHJl c3VsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCi0gICAgICAgICAgICAgICAgOiAidyIoYV8pLCAidyIoYl8pLCAiaSIo YykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAg ICAgICAgOiAvKiBObyBjbG9iYmVycyAqLyk7ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICBcCi0gICAgICAgcmVzdWx0OyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBcCi0gICAgIH0pCi0KLSNkZWZpbmUgdm11bGxfbGFuZXFfczE2KGEsIGIs IGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK LSAgX19leHRlbnNpb25fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoeyAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKLSAgICAgICBpbnQxNng4X3QgYl8gPSAoYik7ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK LSAgICAgICBpbnQxNng0X3QgYV8gPSAoYSk7ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBpbnQzMng0 X3QgcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKLSAgICAgICBfX2FzbV9fICgic211bGwgJTAuNHMs ICUxLjRoLCAlMi5oWyUzXSIgICAgICAgICAgICAgICAgICAgICAgICAgIFwK LSAgICAgICAgICAgICAgICA6ICI9dyIocmVzdWx0KSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAg ICA6ICJ3IihhXyksICJ4IihiXyksICJpIihjKSAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICA6IC8qIE5vIGNsb2Ji ZXJzICovKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwK LSAgICAgICByZXN1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgfSkKLQotI2Rl ZmluZSB2bXVsbF9sYW5lcV9zMzIoYSwgYiwgYykgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAotICBfX2V4dGVuc2lvbl9fICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAotICAgICh7ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAg ICAgIGludDMyeDRfdCBiXyA9IChiKTsgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGludDMyeDJfdCBh XyA9IChhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAotICAgICAgIGludDY0eDJfdCByZXN1bHQ7ICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAg ICAgIF9fYXNtX18gKCJzbXVsbCAlMC4yZCwgJTEuMnMsICUyLnNbJTNdIiAg ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIDog Ij13IihyZXN1bHQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAotICAgICAgICAgICAgICAgIDogInciKGFfKSwgInciKGJf KSwgImkiKGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAg ICAgICAgICAgICAgIDogLyogTm8gY2xvYmJlcnMgKi8pOyAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHJlc3VsdDsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgXAotICAgICB9KQotCi0jZGVmaW5lIHZtdWxsX2xhbmVxX3Ux NihhLCBiLCBjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCi0gIF9fZXh0ZW5zaW9uX18gICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgdWludDE2eDhfdCBiXyA9 IChiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCi0gICAgICAgdWludDE2eDRfdCBhXyA9IChhKTsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAg dWludDMyeDRfdCByZXN1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgX19hc21fXyAoInVtdWxs ICUwLjRzLCAlMS40aCwgJTIuaFslM10iICAgICAgICAgICAgICAgICAgICAg ICAgICBcCi0gICAgICAgICAgICAgICAgOiAiPXciKHJlc3VsdCkgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAg ICAgICAgICAgOiAidyIoYV8pLCAieCIoYl8pLCAiaSIoYykgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAvKiBO byBjbG9iYmVycyAqLyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICBcCi0gICAgICAgcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0p Ci0KLSNkZWZpbmUgdm11bGxfbGFuZXFfdTMyKGEsIGIsIGMpICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgX19leHRlbnNp b25fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKLSAgICAoeyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKLSAgICAgICB1aW50MzJ4NF90IGJfID0gKGIpOyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICB1aW50 MzJ4Ml90IGFfID0gKGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKLSAgICAgICB1aW50NjR4Ml90IHJlc3VsdDsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKLSAgICAgICBfX2FzbV9fICgidW11bGwgJTAuMmQsICUxLjJzLCAlMi5z WyUzXSIgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAg ICAgICA6ICI9dyIocmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICA6ICJ3IihhXyks ICJ3IihiXyksICJpIihjKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAg IFwKLSAgICAgICAgICAgICAgICA6IC8qIE5vIGNsb2JiZXJzICovKTsgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICByZXN1 bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIFwKLSAgICAgfSkKLQotX19leHRlbnNpb25fXyBz dGF0aWMgX19pbmxpbmUgaW50MzJ4NF90IF9fYXR0cmlidXRlX18gKChfX2Fs d2F5c19pbmxpbmVfXykpCi12bXVsbF9uX3MxNiAoaW50MTZ4NF90IGEsIGlu dDE2X3QgYikKLXsKLSAgaW50MzJ4NF90IHJlc3VsdDsKLSAgX19hc21fXyAo InNtdWxsICUwLjRzLCUxLjRoLCUyLmhbMF0iCi0gICAgICAgICAgIDogIj13 IihyZXN1bHQpCi0gICAgICAgICAgIDogInciKGEpLCAieCIoYikKLSAgICAg ICAgICAgOiAvKiBObyBjbG9iYmVycyAqLyk7Ci0gIHJldHVybiByZXN1bHQ7 Ci19Ci0KLV9fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIGludDY0eDJf dCBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQotdm11bGxf bl9zMzIgKGludDMyeDJfdCBhLCBpbnQzMl90IGIpCi17Ci0gIGludDY0eDJf dCByZXN1bHQ7Ci0gIF9fYXNtX18gKCJzbXVsbCAlMC4yZCwlMS4ycywlMi5z WzBdIgotICAgICAgICAgICA6ICI9dyIocmVzdWx0KQotICAgICAgICAgICA6 ICJ3IihhKSwgInciKGIpCi0gICAgICAgICAgIDogLyogTm8gY2xvYmJlcnMg Ki8pOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1fX2V4dGVuc2lvbl9fIHN0 YXRpYyBfX2lubGluZSB1aW50MzJ4NF90IF9fYXR0cmlidXRlX18gKChfX2Fs d2F5c19pbmxpbmVfXykpCi12bXVsbF9uX3UxNiAodWludDE2eDRfdCBhLCB1 aW50MTZfdCBiKQotewotICB1aW50MzJ4NF90IHJlc3VsdDsKLSAgX19hc21f XyAoInVtdWxsICUwLjRzLCUxLjRoLCUyLmhbMF0iCi0gICAgICAgICAgIDog Ij13IihyZXN1bHQpCi0gICAgICAgICAgIDogInciKGEpLCAieCIoYikKLSAg ICAgICAgICAgOiAvKiBObyBjbG9iYmVycyAqLyk7Ci0gIHJldHVybiByZXN1 bHQ7Ci19Ci0KLV9fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIHVpbnQ2 NHgyX3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKLXZt dWxsX25fdTMyICh1aW50MzJ4Ml90IGEsIHVpbnQzMl90IGIpCi17Ci0gIHVp bnQ2NHgyX3QgcmVzdWx0OwotICBfX2FzbV9fICgidW11bGwgJTAuMmQsJTEu MnMsJTIuc1swXSIKLSAgICAgICAgICAgOiAiPXciKHJlc3VsdCkKLSAgICAg ICAgICAgOiAidyIoYSksICJ3IihiKQotICAgICAgICAgICA6IC8qIE5vIGNs b2JiZXJzICovKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotX19leHRlbnNp b25fXyBzdGF0aWMgX19pbmxpbmUgcG9seTE2eDhfdCBfX2F0dHJpYnV0ZV9f ICgoX19hbHdheXNfaW5saW5lX18pKQotdm11bGxfcDggKHBvbHk4eDhfdCBh LCBwb2x5OHg4X3QgYikKLXsKLSAgcG9seTE2eDhfdCByZXN1bHQ7Ci0gIF9f YXNtX18gKCJwbXVsbCAlMC44aCwgJTEuOGIsICUyLjhiIgotICAgICAgICAg ICA6ICI9dyIocmVzdWx0KQotICAgICAgICAgICA6ICJ3IihhKSwgInciKGIp Ci0gICAgICAgICAgIDogLyogTm8gY2xvYmJlcnMgKi8pOwotICByZXR1cm4g cmVzdWx0OwotfQotCi1fX2V4dGVuc2lvbl9fIHN0YXRpYyBfX2lubGluZSBp bnQxNng4X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkK LXZtdWxsX3M4IChpbnQ4eDhfdCBhLCBpbnQ4eDhfdCBiKQotewotICBpbnQx Nng4X3QgcmVzdWx0OwotICBfX2FzbV9fICgic211bGwgJTAuOGgsICUxLjhi LCAlMi44YiIKLSAgICAgICAgICAgOiAiPXciKHJlc3VsdCkKLSAgICAgICAg ICAgOiAidyIoYSksICJ3IihiKQotICAgICAgICAgICA6IC8qIE5vIGNsb2Ji ZXJzICovKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotX19leHRlbnNpb25f XyBzdGF0aWMgX19pbmxpbmUgaW50MzJ4NF90IF9fYXR0cmlidXRlX18gKChf X2Fsd2F5c19pbmxpbmVfXykpCi12bXVsbF9zMTYgKGludDE2eDRfdCBhLCBp bnQxNng0X3QgYikKLXsKLSAgaW50MzJ4NF90IHJlc3VsdDsKLSAgX19hc21f XyAoInNtdWxsICUwLjRzLCAlMS40aCwgJTIuNGgiCi0gICAgICAgICAgIDog Ij13IihyZXN1bHQpCi0gICAgICAgICAgIDogInciKGEpLCAidyIoYikKLSAg ICAgICAgICAgOiAvKiBObyBjbG9iYmVycyAqLyk7Ci0gIHJldHVybiByZXN1 bHQ7Ci19Ci0KLV9fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIGludDY0 eDJfdCBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQotdm11 bGxfczMyIChpbnQzMngyX3QgYSwgaW50MzJ4Ml90IGIpCi17Ci0gIGludDY0 eDJfdCByZXN1bHQ7Ci0gIF9fYXNtX18gKCJzbXVsbCAlMC4yZCwgJTEuMnMs ICUyLjJzIgotICAgICAgICAgICA6ICI9dyIocmVzdWx0KQotICAgICAgICAg ICA6ICJ3IihhKSwgInciKGIpCi0gICAgICAgICAgIDogLyogTm8gY2xvYmJl cnMgKi8pOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1fX2V4dGVuc2lvbl9f IHN0YXRpYyBfX2lubGluZSB1aW50MTZ4OF90IF9fYXR0cmlidXRlX18gKChf X2Fsd2F5c19pbmxpbmVfXykpCi12bXVsbF91OCAodWludDh4OF90IGEsIHVp bnQ4eDhfdCBiKQotewotICB1aW50MTZ4OF90IHJlc3VsdDsKLSAgX19hc21f XyAoInVtdWxsICUwLjhoLCAlMS44YiwgJTIuOGIiCi0gICAgICAgICAgIDog Ij13IihyZXN1bHQpCi0gICAgICAgICAgIDogInciKGEpLCAidyIoYikKLSAg ICAgICAgICAgOiAvKiBObyBjbG9iYmVycyAqLyk7Ci0gIHJldHVybiByZXN1 bHQ7Ci19Ci0KLV9fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIHVpbnQz Mng0X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKLXZt dWxsX3UxNiAodWludDE2eDRfdCBhLCB1aW50MTZ4NF90IGIpCi17Ci0gIHVp bnQzMng0X3QgcmVzdWx0OwotICBfX2FzbV9fICgidW11bGwgJTAuNHMsICUx LjRoLCAlMi40aCIKLSAgICAgICAgICAgOiAiPXciKHJlc3VsdCkKLSAgICAg ICAgICAgOiAidyIoYSksICJ3IihiKQotICAgICAgICAgICA6IC8qIE5vIGNs b2JiZXJzICovKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotX19leHRlbnNp b25fXyBzdGF0aWMgX19pbmxpbmUgdWludDY0eDJfdCBfX2F0dHJpYnV0ZV9f ICgoX19hbHdheXNfaW5saW5lX18pKQotdm11bGxfdTMyICh1aW50MzJ4Ml90 IGEsIHVpbnQzMngyX3QgYikKLXsKLSAgdWludDY0eDJfdCByZXN1bHQ7Ci0g IF9fYXNtX18gKCJ1bXVsbCAlMC4yZCwgJTEuMnMsICUyLjJzIgotICAgICAg ICAgICA6ICI9dyIocmVzdWx0KQotICAgICAgICAgICA6ICJ3IihhKSwgInci KGIpCi0gICAgICAgICAgIDogLyogTm8gY2xvYmJlcnMgKi8pOwotICByZXR1 cm4gcmVzdWx0OwotfQotCi1fX2V4dGVuc2lvbl9fIHN0YXRpYyBfX2lubGlu ZSBmbG9hdDMyeDRfdCBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5l X18pKQotdm11bHFfbl9mMzIgKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJfdCBi KQotewotICBmbG9hdDMyeDRfdCByZXN1bHQ7Ci0gIF9fYXNtX18gKCJmbXVs ICUwLjRzLCUxLjRzLCUyLnNbMF0iCi0gICAgICAgICAgIDogIj13IihyZXN1 bHQpCi0gICAgICAgICAgIDogInciKGEpLCAidyIoYikKLSAgICAgICAgICAg OiAvKiBObyBjbG9iYmVycyAqLyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0K LV9fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIGZsb2F0NjR4Ml90IF9f YXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXykpCi12bXVscV9uX2Y2 NCAoZmxvYXQ2NHgyX3QgYSwgZmxvYXQ2NF90IGIpCi17Ci0gIGZsb2F0NjR4 Ml90IHJlc3VsdDsKLSAgX19hc21fXyAoImZtdWwgJTAuMmQsJTEuMmQsJTIu ZFswXSIKLSAgICAgICAgICAgOiAiPXciKHJlc3VsdCkKLSAgICAgICAgICAg OiAidyIoYSksICJ3IihiKQotICAgICAgICAgICA6IC8qIE5vIGNsb2JiZXJz ICovKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotX19leHRlbnNpb25fXyBz dGF0aWMgX19pbmxpbmUgaW50MTZ4OF90IF9fYXR0cmlidXRlX18gKChfX2Fs d2F5c19pbmxpbmVfXykpCi12bXVscV9uX3MxNiAoaW50MTZ4OF90IGEsIGlu dDE2X3QgYikKLXsKLSAgaW50MTZ4OF90IHJlc3VsdDsKLSAgX19hc21fXyAo Im11bCAlMC44aCwlMS44aCwlMi5oWzBdIgotICAgICAgICAgICA6ICI9dyIo cmVzdWx0KQotICAgICAgICAgICA6ICJ3IihhKSwgIngiKGIpCi0gICAgICAg ICAgIDogLyogTm8gY2xvYmJlcnMgKi8pOwotICByZXR1cm4gcmVzdWx0Owot fQotCi1fX2V4dGVuc2lvbl9fIHN0YXRpYyBfX2lubGluZSBpbnQzMng0X3Qg X19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKLXZtdWxxX25f czMyIChpbnQzMng0X3QgYSwgaW50MzJfdCBiKQotewotICBpbnQzMng0X3Qg cmVzdWx0OwotICBfX2FzbV9fICgibXVsICUwLjRzLCUxLjRzLCUyLnNbMF0i Ci0gICAgICAgICAgIDogIj13IihyZXN1bHQpCi0gICAgICAgICAgIDogInci KGEpLCAidyIoYikKLSAgICAgICAgICAgOiAvKiBObyBjbG9iYmVycyAqLyk7 Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLV9fZXh0ZW5zaW9uX18gc3RhdGlj IF9faW5saW5lIHVpbnQxNng4X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlz X2lubGluZV9fKSkKLXZtdWxxX25fdTE2ICh1aW50MTZ4OF90IGEsIHVpbnQx Nl90IGIpCi17Ci0gIHVpbnQxNng4X3QgcmVzdWx0OwotICBfX2FzbV9fICgi bXVsICUwLjhoLCUxLjhoLCUyLmhbMF0iCi0gICAgICAgICAgIDogIj13Iihy ZXN1bHQpCi0gICAgICAgICAgIDogInciKGEpLCAieCIoYikKLSAgICAgICAg ICAgOiAvKiBObyBjbG9iYmVycyAqLyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19 Ci0KLV9fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIHVpbnQzMng0X3Qg X19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKLXZtdWxxX25f dTMyICh1aW50MzJ4NF90IGEsIHVpbnQzMl90IGIpCi17Ci0gIHVpbnQzMng0 X3QgcmVzdWx0OwotICBfX2FzbV9fICgibXVsICUwLjRzLCUxLjRzLCUyLnNb MF0iCi0gICAgICAgICAgIDogIj13IihyZXN1bHQpCi0gICAgICAgICAgIDog InciKGEpLCAidyIoYikKLSAgICAgICAgICAgOiAvKiBObyBjbG9iYmVycyAq Lyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLV9fZXh0ZW5zaW9uX18gc3Rh dGljIF9faW5saW5lIGZsb2F0MzJ4Ml90IF9fYXR0cmlidXRlX18gKChfX2Fs d2F5c19pbmxpbmVfXykpCi12bXVseF9mMzIgKGZsb2F0MzJ4Ml90IGEsIGZs b2F0MzJ4Ml90IGIpCi17Ci0gIGZsb2F0MzJ4Ml90IHJlc3VsdDsKLSAgX19h c21fXyAoImZtdWx4ICUwLjJzLCUxLjJzLCUyLjJzIgotICAgICAgICAgICA6 ICI9dyIocmVzdWx0KQotICAgICAgICAgICA6ICJ3IihhKSwgInciKGIpCi0g ICAgICAgICAgIDogLyogTm8gY2xvYmJlcnMgKi8pOwotICByZXR1cm4gcmVz dWx0OwotfQotCi0jZGVmaW5lIHZtdWx4X2xhbmVfZjMyKGEsIGIsIGMpICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9f ZXh0ZW5zaW9uX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKHsgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCi0gICAgICAgZmxvYXQzMng0X3QgYl8gPSAoYik7ICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAg ICAgZmxvYXQzMngyX3QgYV8gPSAoYSk7ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgZmxvYXQzMngyX3Qg cmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCi0gICAgICAgX19hc21fXyAoImZtdWx4ICUwLjJzLCUxLjJz LCUyLnNbJTNdIiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAg ICAgICAgICAgICAgOiAiPXciKHJlc3VsdCkgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAi dyIoYV8pLCAidyIoYl8pLCAiaSIoYykgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBcCi0gICAgICAgICAgICAgICAgOiAvKiBObyBjbG9iYmVycyAq Lyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAg ICAgcmVzdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0pCi0KLV9fZXh0ZW5z aW9uX18gc3RhdGljIF9faW5saW5lIGZsb2F0NjRfdCBfX2F0dHJpYnV0ZV9f ICgoX19hbHdheXNfaW5saW5lX18pKQotdm11bHhkX2Y2NCAoZmxvYXQ2NF90 IGEsIGZsb2F0NjRfdCBiKQotewotICBmbG9hdDY0X3QgcmVzdWx0OwotICBf X2FzbV9fICgiZm11bHggJWQwLCAlZDEsICVkMiIKLSAgICAgICAgICAgOiAi PXciKHJlc3VsdCkKLSAgICAgICAgICAgOiAidyIoYSksICJ3IihiKQotICAg ICAgICAgICA6IC8qIE5vIGNsb2JiZXJzICovKTsKLSAgcmV0dXJuIHJlc3Vs dDsKLX0KLQotX19leHRlbnNpb25fXyBzdGF0aWMgX19pbmxpbmUgZmxvYXQz Mng0X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKLXZt dWx4cV9mMzIgKGZsb2F0MzJ4NF90IGEsIGZsb2F0MzJ4NF90IGIpCi17Ci0g IGZsb2F0MzJ4NF90IHJlc3VsdDsKLSAgX19hc21fXyAoImZtdWx4ICUwLjRz LCUxLjRzLCUyLjRzIgotICAgICAgICAgICA6ICI9dyIocmVzdWx0KQotICAg ICAgICAgICA6ICJ3IihhKSwgInciKGIpCi0gICAgICAgICAgIDogLyogTm8g Y2xvYmJlcnMgKi8pOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1fX2V4dGVu c2lvbl9fIHN0YXRpYyBfX2lubGluZSBmbG9hdDY0eDJfdCBfX2F0dHJpYnV0 ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQotdm11bHhxX2Y2NCAoZmxvYXQ2 NHgyX3QgYSwgZmxvYXQ2NHgyX3QgYikKLXsKLSAgZmxvYXQ2NHgyX3QgcmVz dWx0OwotICBfX2FzbV9fICgiZm11bHggJTAuMmQsJTEuMmQsJTIuMmQiCi0g ICAgICAgICAgIDogIj13IihyZXN1bHQpCi0gICAgICAgICAgIDogInciKGEp LCAidyIoYikKLSAgICAgICAgICAgOiAvKiBObyBjbG9iYmVycyAqLyk7Ci0g IHJldHVybiByZXN1bHQ7Ci19Ci0KLSNkZWZpbmUgdm11bHhxX2xhbmVfZjMy KGEsIGIsIGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKLSAgX19leHRlbnNpb25fXyAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAoeyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBmbG9hdDMyeDRfdCBiXyA9 IChiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKLSAgICAgICBmbG9hdDMyeDRfdCBhXyA9IChhKTsgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBm bG9hdDMyeDRfdCByZXN1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICBfX2FzbV9fICgiZm11bHgg JTAuNHMsJTEuNHMsJTIuc1slM10iICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKLSAgICAgICAgICAgICAgICA6ICI9dyIocmVzdWx0KSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAg ICAgICAgICA6ICJ3IihhXyksICJ3IihiXyksICJpIihjKSAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICA6IC8qIE5v IGNsb2JiZXJzICovKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIFwKLSAgICAgICByZXN1bHQ7ICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgfSkK LQotI2RlZmluZSB2bXVseHFfbGFuZV9mNjQoYSwgYiwgYykgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBfX2V4dGVuc2lv bl9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAotICAgICh7ICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAotICAgICAgIGZsb2F0NjR4Ml90IGJfID0gKGIpOyAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIGZsb2F0 NjR4Ml90IGFfID0gKGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAotICAgICAgIGZsb2F0NjR4Ml90IHJlc3VsdDsg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAotICAgICAgIF9fYXNtX18gKCJmbXVseCAlMC4yZCwlMS4yZCwlMi5kWyUz XSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAg ICAgIDogIj13IihyZXN1bHQpICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIDogInciKGFfKSwg InciKGJfKSwgImkiKGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg XAotICAgICAgICAgICAgICAgIDogLyogTm8gY2xvYmJlcnMgKi8pOyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgIHJlc3Vs dDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgXAotICAgICB9KQotCi1fX2V4dGVuc2lvbl9fIHN0 YXRpYyBfX2lubGluZSBmbG9hdDMyX3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3 YXlzX2lubGluZV9fKSkKLXZtdWx4c19mMzIgKGZsb2F0MzJfdCBhLCBmbG9h dDMyX3QgYikKLXsKLSAgZmxvYXQzMl90IHJlc3VsdDsKLSAgX19hc21fXyAo ImZtdWx4ICVzMCwgJXMxLCAlczIiCi0gICAgICAgICAgIDogIj13IihyZXN1 bHQpCi0gICAgICAgICAgIDogInciKGEpLCAidyIoYikKLSAgICAgICAgICAg OiAvKiBObyBjbG9iYmVycyAqLyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0K IF9fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIHBvbHk4eDhfdCBfX2F0 dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQogdm12bl9wOCAocG9s eTh4OF90IGEpCiB7CkBAIC0xODY5NSw2ICsxODAzMCw3OCBAQCB2bXVsX25f ZjY0ICAoZmxvYXQ2NHgxX3QgX19hLCBmbG9hdDY0X3QgX19iKQogICByZXR1 cm4gKGZsb2F0NjR4MV90KSB7IHZnZXRfbGFuZV9mNjQgKF9fYSwgMCkgKiBf X2IgfTsKIH0KIAorX19leHRlbnNpb25fXyBzdGF0aWMgX19pbmxpbmUgZmxv YXQzMngyX3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkK K3ZtdWxfbl9mMzIgKGZsb2F0MzJ4Ml90IF9fYSwgZmxvYXQzMl90IF9fYikK K3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9hYXJjaDY0X211bF9udjJzZiAoX19h LCBfX2IpOworfQorCitfX2V4dGVuc2lvbl9fIHN0YXRpYyBfX2lubGluZSBp bnQxNng0X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkK K3ZtdWxfbl9zMTYgKGludDE2eDRfdCBfX2EsIGludDE2X3QgX19iKQorewor ICByZXR1cm4gX19idWlsdGluX2FhcmNoNjRfbXVsX252NGhpIChfX2EsIF9f Yik7Cit9CisKK19fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIGludDMy eDJfdCBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQordm11 bF9uX3MzMiAoaW50MzJ4Ml90IF9fYSwgaW50MzJfdCBfX2IpCit7CisgIHJl dHVybiBfX2J1aWx0aW5fYWFyY2g2NF9tdWxfbnYyc2kgKF9fYSwgX19iKTsK K30KKworX19leHRlbnNpb25fXyBzdGF0aWMgX19pbmxpbmUgdWludDE2eDRf dCBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQordm11bF9u X3UxNiAodWludDE2eDRfdCBfX2EsIHVpbnQxNl90IF9fYikKK3sKKyAgcmV0 dXJuICh1aW50MTZ4NF90KSBfX2J1aWx0aW5fYWFyY2g2NF9tdWxfbnY0aGkg KChpbnQxNng0X3QpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QpX19iKTsKK30KKwor X19leHRlbnNpb25fXyBzdGF0aWMgX19pbmxpbmUgdWludDMyeDJfdCBfX2F0 dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQordm11bF9uX3UzMiAo dWludDMyeDJfdCBfX2EsIHVpbnQzMl90IF9fYikKK3sKKyAgcmV0dXJuICh1 aW50MzJ4Ml90KSBfX2J1aWx0aW5fYWFyY2g2NF9tdWxfbnYyc2kgKChpbnQz MngyX3QpX19hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgKGludDMyX3QpX19iKTsKK30KKworLyogdm11 bHFfbiAgKi8KKworX19leHRlbnNpb25fXyBzdGF0aWMgX19pbmxpbmUgZmxv YXQzMng0X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkK K3ZtdWxxX25fZjMyIChmbG9hdDMyeDRfdCBfX2EsIGZsb2F0MzJfdCBfX2Ip Cit7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF9tdWxfbnY0c2YgKF9f YSwgX19iKTsKK30KKworX19leHRlbnNpb25fXyBzdGF0aWMgX19pbmxpbmUg ZmxvYXQ2NHgyX3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9f KSkKK3ZtdWxxX25fZjY0IChmbG9hdDY0eDJfdCBfX2EsIGZsb2F0NjRfdCBf X2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF9tdWxfbnYyZGYg KF9fYSwgX19iKTsKK30KKworX19leHRlbnNpb25fXyBzdGF0aWMgX19pbmxp bmUgaW50MTZ4OF90IF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVf XykpCit2bXVscV9uX3MxNiAoaW50MTZ4OF90IF9fYSwgaW50MTZfdCBfX2Ip Cit7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF9tdWxfbnY4aGkgKF9f YSwgX19iKTsKK30KKworX19leHRlbnNpb25fXyBzdGF0aWMgX19pbmxpbmUg aW50MzJ4NF90IF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXykp Cit2bXVscV9uX3MzMiAoaW50MzJ4NF90IF9fYSwgaW50MzJfdCBfX2IpCit7 CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF9tdWxfbnY0c2kgKF9fYSwg X19iKTsKK30KKworX19leHRlbnNpb25fXyBzdGF0aWMgX19pbmxpbmUgdWlu dDE2eDhfdCBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQor dm11bHFfbl91MTYgKHVpbnQxNng4X3QgX19hLCB1aW50MTZfdCBfX2IpCit7 CisgIHJldHVybiAodWludDE2eDhfdCkgX19idWlsdGluX2FhcmNoNjRfbXVs X252OGhpICgoaW50MTZ4OF90KV9fYSwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90KV9fYik7 Cit9CisKK19fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIHVpbnQzMng0 X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZtdWxx X25fdTMyICh1aW50MzJ4NF90IF9fYSwgdWludDMyX3QgX19iKQoreworICBy ZXR1cm4gKHVpbnQzMng0X3QpIF9fYnVpbHRpbl9hYXJjaDY0X211bF9udjRz aSAoKGludDMyeDRfdClfX2EsCisgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClfX2IpOworfQor CiAvKiB2bXVscV9sYW5lICAqLwogCiBfX2V4dGVuc2lvbl9fIHN0YXRpYyBf X2lubGluZSBmbG9hdDMyeDRfdCBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNf aW5saW5lX18pKQpAQCAtMTg3NzIsNiArMTgxNzksMzA4IEBAIHZtdWxxX2xh bmVxX3UzMiAodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3QgX19iLCBjCiAg IHJldHVybiBfX2EgKiBfX2FhcmNoNjRfdmdldF9sYW5lX2FueSAoX19iLCBf X2xhbmUpOwogfQogCisvKiB2bXVsbF9oaWdoX2xhbmUgICovCisKK19fZXh0 ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIGludDMyeDRfdCBfX2F0dHJpYnV0 ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQordm11bGxfaGlnaF9sYW5lX3Mx NiAoaW50MTZ4OF90IF9fYSwgaW50MTZ4NF90IF9fYiwgY29uc3QgaW50IF9f YykKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9hYXJjaDY0X3NtdWxsMl9sYW5l djhoaSAoX19hLCBfX2IsIF9fYyk7Cit9CisKK19fZXh0ZW5zaW9uX18gc3Rh dGljIF9faW5saW5lIGludDY0eDJfdCBfX2F0dHJpYnV0ZV9fICgoX19hbHdh eXNfaW5saW5lX18pKQordm11bGxfaGlnaF9sYW5lX3MzMiAoaW50MzJ4NF90 IF9fYSwgaW50MzJ4Ml90IF9fYiwgY29uc3QgaW50IF9fYykKK3sKKyAgcmV0 dXJuIF9fYnVpbHRpbl9hYXJjaDY0X3NtdWxsMl9sYW5ldjRzaSAoX19hLCBf X2IsIF9fYyk7Cit9CisKK19fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5l IHVpbnQzMng0X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9f KSkKK3ZtdWxsX2hpZ2hfbGFuZV91MTYgKHVpbnQxNng4X3QgX19hLCB1aW50 MTZ4NF90IF9fYiwgY29uc3QgaW50IF9fYykKK3sKKyAgcmV0dXJuICh1aW50 MzJ4NF90KSBfX2J1aWx0aW5fYWFyY2g2NF91bXVsbDJfbGFuZXY4aGkgKChp bnQxNng4X3QpIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNng0X3QpIF9fYiwK KyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIF9fYyk7Cit9CisKK19fZXh0ZW5zaW9uX18gc3RhdGlj IF9faW5saW5lIHVpbnQ2NHgyX3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlz X2lubGluZV9fKSkKK3ZtdWxsX2hpZ2hfbGFuZV91MzIgKHVpbnQzMng0X3Qg X19hLCB1aW50MzJ4Ml90IF9fYiwgY29uc3QgaW50IF9fYykKK3sKKyAgcmV0 dXJuICh1aW50NjR4Ml90KSBfX2J1aWx0aW5fYWFyY2g2NF91bXVsbDJfbGFu ZXY0c2kgKChpbnQzMng0X3QpIF9fYSwKKyAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMngy X3QpIF9fYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBfX2MpOworfQorCisvKiB2bXVsbF9o aWdoX2xhbmVxICAqLworCitfX2V4dGVuc2lvbl9fIHN0YXRpYyBfX2lubGlu ZSBpbnQzMng0X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9f KSkKK3ZtdWxsX2hpZ2hfbGFuZXFfczE2IChpbnQxNng4X3QgX19hLCBpbnQx Nng4X3QgX19iLCBjb25zdCBpbnQgX19jKQoreworICByZXR1cm4gX19idWls dGluX2FhcmNoNjRfc211bGwyX2xhbmVxdjhoaSAoX19hLCBfX2IsIF9fYyk7 Cit9CisKK19fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIGludDY0eDJf dCBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQordm11bGxf aGlnaF9sYW5lcV9zMzIgKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2Is IGNvbnN0IGludCBfX2MpCit7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2 NF9zbXVsbDJfbGFuZXF2NHNpIChfX2EsIF9fYiwgX19jKTsKK30KKworX19l eHRlbnNpb25fXyBzdGF0aWMgX19pbmxpbmUgdWludDMyeDRfdCBfX2F0dHJp YnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQordm11bGxfaGlnaF9sYW5l cV91MTYgKHVpbnQxNng4X3QgX19hLCB1aW50MTZ4OF90IF9fYiwgY29uc3Qg aW50IF9fYykKK3sKKyAgcmV0dXJuICh1aW50MzJ4NF90KSBfX2J1aWx0aW5f YWFyY2g2NF91bXVsbDJfbGFuZXF2OGhpICgoaW50MTZ4OF90KV9fYSwKKyAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAoaW50MTZ4OF90KV9fYiwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Mp OworfQorCitfX2V4dGVuc2lvbl9fIHN0YXRpYyBfX2lubGluZSB1aW50NjR4 Ml90IF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXykpCit2bXVs bF9oaWdoX2xhbmVxX3UzMiAodWludDMyeDRfdCBfX2EsIHVpbnQzMng0X3Qg X19iLCBjb25zdCBpbnQgX19jKQoreworICByZXR1cm4gKHVpbnQ2NHgyX3Qp IF9fYnVpbHRpbl9hYXJjaDY0X3VtdWxsMl9sYW5lcXY0c2kgKChpbnQzMng0 X3QpIF9fYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJ4NF90KSBfX2IsCisgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIF9fYyk7Cit9CisKKy8qIHZtdWxsX2hpZ2hfbiAgKi8KKwor X19leHRlbnNpb25fXyBzdGF0aWMgX19pbmxpbmUgaW50MzJ4NF90IF9fYXR0 cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXykpCit2bXVsbF9oaWdoX25f czE2IChpbnQxNng4X3QgX19hLCBpbnQxNl90IF9fYikKK3sKKyAgcmV0dXJu IF9fYnVpbHRpbl9hYXJjaDY0X3NtdWxsMl9udjhoaSAoX19hLCBfX2IpOwor fQorCitfX2V4dGVuc2lvbl9fIHN0YXRpYyBfX2lubGluZSBpbnQ2NHgyX3Qg X19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZtdWxsX2hp Z2hfbl9zMzIgKGludDMyeDRfdCBfX2EsIGludDMyX3QgX19iKQoreworICBy ZXR1cm4gX19idWlsdGluX2FhcmNoNjRfc211bGwyX252NHNpIChfX2EsIF9f Yik7Cit9CisKK19fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIHVpbnQz Mng0X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKK3Zt dWxsX2hpZ2hfbl91MTYgKHVpbnQxNng4X3QgX19hLCB1aW50MTZfdCBfX2Ip Cit7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF91bXVsbDJfbnY4aGlf dXV1IChfX2EsIF9fYik7Cit9CisKK19fZXh0ZW5zaW9uX18gc3RhdGljIF9f aW5saW5lIHVpbnQ2NHgyX3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lu bGluZV9fKSkKK3ZtdWxsX2hpZ2hfbl91MzIgKHVpbnQzMng0X3QgX19hLCB1 aW50MzJfdCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF91 bXVsbDJfbnY0c2lfdXV1IChfX2EsIF9fYik7Cit9CisKKy8qIHZtdWxsX2hp Z2ggICovCisKK19fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIHBvbHkx Nng4X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKK3Zt dWxsX2hpZ2hfcDggKHBvbHk4eDE2X3QgX19hLCBwb2x5OHgxNl90IF9fYikK K3sKKyAgICByZXR1cm4gIF9fYnVpbHRpbl9hYXJjaDY0X3BtdWxsMnYxNnFp X3BwcCAoX19hLCBfX2IpOworfQorCitfX2V4dGVuc2lvbl9fIHN0YXRpYyBf X2lubGluZSBpbnQxNng4X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lu bGluZV9fKSkKK3ZtdWxsX2hpZ2hfczggKGludDh4MTZfdCBfX2EsIGludDh4 MTZfdCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF92ZWNf d2lkZW5fc211bHRfaGlfdjE2cWkgKF9fYSwgX19iKTsKK30KKworX19leHRl bnNpb25fXyBzdGF0aWMgX19pbmxpbmUgaW50MzJ4NF90IF9fYXR0cmlidXRl X18gKChfX2Fsd2F5c19pbmxpbmVfXykpCit2bXVsbF9oaWdoX3MxNiAoaW50 MTZ4OF90IF9fYSwgaW50MTZ4OF90IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVp bHRpbl9hYXJjaDY0X3ZlY193aWRlbl9zbXVsdF9oaV92OGhpIChfX2EsIF9f Yik7Cit9CisKK19fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIGludDY0 eDJfdCBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQordm11 bGxfaGlnaF9zMzIgKGludDMyeDRfdCBfX2EsIGludDMyeDRfdCBfX2IpCit7 CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF92ZWNfd2lkZW5fc211bHRf aGlfdjRzaSAoX19hLCBfX2IpOworfQorCitfX2V4dGVuc2lvbl9fIHN0YXRp YyBfX2lubGluZSB1aW50MTZ4OF90IF9fYXR0cmlidXRlX18gKChfX2Fsd2F5 c19pbmxpbmVfXykpCit2bXVsbF9oaWdoX3U4ICh1aW50OHgxNl90IF9fYSwg dWludDh4MTZfdCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2 NF92ZWNfd2lkZW5fdW11bHRfaGlfdjE2cWlfdXV1IChfX2EsIF9fYik7Cit9 CisKK19fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIHVpbnQzMng0X3Qg X19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZtdWxsX2hp Z2hfdTE2ICh1aW50MTZ4OF90IF9fYSwgdWludDE2eDhfdCBfX2IpCit7Cisg IHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF92ZWNfd2lkZW5fdW11bHRfaGlf djhoaV91dXUgKF9fYSwgX19iKTsKK30KKworX19leHRlbnNpb25fXyBzdGF0 aWMgX19pbmxpbmUgdWludDY0eDJfdCBfX2F0dHJpYnV0ZV9fICgoX19hbHdh eXNfaW5saW5lX18pKQordm11bGxfaGlnaF91MzIgKHVpbnQzMng0X3QgX19h LCB1aW50MzJ4NF90IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9hYXJj aDY0X3ZlY193aWRlbl91bXVsdF9oaV92NHNpX3V1dSAoX19hLCBfX2IpOwor fQorCisvKiB2bXVsbF9sYW5lICAqLworCitfX2V4dGVuc2lvbl9fIHN0YXRp YyBfX2lubGluZSBpbnQzMng0X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlz X2lubGluZV9fKSkKK3ZtdWxsX2xhbmVfczE2IChpbnQxNng0X3QgX19hLCBp bnQxNng0X3QgX19iLCBjb25zdCBpbnQgX19jKQoreworICByZXR1cm4gX19i dWlsdGluX2FhcmNoNjRfc211bGxfbGFuZXY0aGkgKF9fYSwgX19iLCBfX2Mp OworfQorCitfX2V4dGVuc2lvbl9fIHN0YXRpYyBfX2lubGluZSBpbnQ2NHgy X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZtdWxs X2xhbmVfczMyIChpbnQzMngyX3QgX19hLCBpbnQzMngyX3QgX19iLCBjb25z dCBpbnQgX19jKQoreworICByZXR1cm4gX19idWlsdGluX2FhcmNoNjRfc211 bGxfbGFuZXYyc2kgKF9fYSwgX19iLCBfX2MpOworfQorCitfX2V4dGVuc2lv bl9fIHN0YXRpYyBfX2lubGluZSB1aW50MzJ4NF90IF9fYXR0cmlidXRlX18g KChfX2Fsd2F5c19pbmxpbmVfXykpCit2bXVsbF9sYW5lX3UxNiAodWludDE2 eDRfdCBfX2EsIHVpbnQxNng0X3QgX19iLCBjb25zdCB1bnNpZ25lZCBpbnQg X19jKQoreworICByZXR1cm4gX19idWlsdGluX2FhcmNoNjRfdW11bGxfbGFu ZXY0aGlfdXV1dSAoX19hLCBfX2IsIF9fYyk7Cit9CisKK19fZXh0ZW5zaW9u X18gc3RhdGljIF9faW5saW5lIHVpbnQ2NHgyX3QgX19hdHRyaWJ1dGVfXyAo KF9fYWx3YXlzX2lubGluZV9fKSkKK3ZtdWxsX2xhbmVfdTMyICh1aW50MzJ4 Ml90IF9fYSwgdWludDMyeDJfdCBfX2IsIGNvbnN0IHVuc2lnbmVkIGludCBf X2MpCit7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF91bXVsbF9sYW5l djJzaV91dXV1IChfX2EsIF9fYiwgX19jKTsKK30KKworLyogdm11bGxfbGFu ZXEgICovCisKK19fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIGludDMy eDRfdCBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQordm11 bGxfbGFuZXFfczE2IChpbnQxNng0X3QgX19hLCBpbnQxNng4X3QgX19iLCBj b25zdCBpbnQgX19jKQoreworICByZXR1cm4gX19idWlsdGluX2FhcmNoNjRf c211bGxfbGFuZXF2NGhpIChfX2EsIF9fYiwgX19jKTsKK30KKworX19leHRl bnNpb25fXyBzdGF0aWMgX19pbmxpbmUgaW50NjR4Ml90IF9fYXR0cmlidXRl X18gKChfX2Fsd2F5c19pbmxpbmVfXykpCit2bXVsbF9sYW5lcV9zMzIgKGlu dDMyeDJfdCBfX2EsIGludDMyeDRfdCBfX2IsIGNvbnN0IGludCBfX2MpCit7 CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF9zbXVsbF9sYW5lcXYyc2kg KF9fYSwgX19iLCBfX2MpOworfQorCitfX2V4dGVuc2lvbl9fIHN0YXRpYyBf X2lubGluZSB1aW50MzJ4NF90IF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19p bmxpbmVfXykpCit2bXVsbF9sYW5lcV91MTYgKHVpbnQxNng0X3QgX19hLCB1 aW50MTZ4OF90IF9fYiwgY29uc3QgdW5zaWduZWQgaW50IF9fYykKK3sKKyAg cmV0dXJuIF9fYnVpbHRpbl9hYXJjaDY0X3VtdWxsX2xhbmVxdjRoaV91dXV1 IChfX2EsIF9fYiwgX19jKTsKK30KKworX19leHRlbnNpb25fXyBzdGF0aWMg X19pbmxpbmUgdWludDY0eDJfdCBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNf aW5saW5lX18pKQordm11bGxfbGFuZXFfdTMyICh1aW50MzJ4Ml90IF9fYSwg dWludDMyeDRfdCBfX2IsIGNvbnN0IHVuc2lnbmVkIGludCBfX2MpCit7Cisg IHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF91bXVsbF9sYW5lcXYyc2lfdXV1 dSAoX19hLCBfX2IsIF9fYyk7Cit9CisKKy8qIHZtdWxsX24gICovCisKK19f ZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIGludDMyeDRfdCBfX2F0dHJp YnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQordm11bGxfbl9zMTYgKGlu dDE2eDRfdCBfX2EsIGludDE2X3QgX19iKQoreworICAgcmV0dXJuIF9fYnVp bHRpbl9hYXJjaDY0X3NtdWxsX252NGhpIChfX2EsIF9fYik7Cit9CisKK19f ZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIGludDY0eDJfdCBfX2F0dHJp YnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18pKQordm11bGxfbl9zMzIgKGlu dDMyeDJfdCBfX2EsIGludDMyX3QgX19iKQoreworICAgcmV0dXJuIF9fYnVp bHRpbl9hYXJjaDY0X3NtdWxsX252MnNpIChfX2EsIF9fYik7Cit9CisKK19f ZXh0ZW5zaW9uX18gc3RhdGljIF9faW5saW5lIHVpbnQzMng0X3QgX19hdHRy aWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZtdWxsX25fdTE2ICh1 aW50MTZ4NF90IF9fYSwgdWludDE2X3QgX19iKQoreworICAgcmV0dXJuIF9f YnVpbHRpbl9hYXJjaDY0X3VtdWxsX252NGhpX3V1dSAoX19hLCBfX2IpOwor fQorCitfX2V4dGVuc2lvbl9fIHN0YXRpYyBfX2lubGluZSB1aW50NjR4Ml90 IF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXykpCit2bXVsbF9u X3UzMiAodWludDMyeDJfdCBfX2EsIHVpbnQzMl90IF9fYikKK3sKKyAgcmV0 dXJuIF9fYnVpbHRpbl9hYXJjaDY0X3VtdWxsX252MnNpX3V1dSAoX19hLCBf X2IpOworfQorCisvKiB2bXVsbCAgKi8KK19fZXh0ZW5zaW9uX18gc3RhdGlj IF9faW5saW5lIHBvbHkxNng4X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlz X2lubGluZV9fKSkKK3ZtdWxsX3A4IChwb2x5OHg4X3QgX19hLCBwb2x5OHg4 X3QgX19iKQoreworICByZXR1cm4gX19idWlsdGluX2FhcmNoNjRfcG11bGx2 OHFpX3BwcCAoX19hLCBfX2IpOworfQorCitfX2V4dGVuc2lvbl9fIHN0YXRp YyBfX2lubGluZSBpbnQxNng4X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlz X2lubGluZV9fKSkKK3ZtdWxsX3M4IChpbnQ4eDhfdCBfX2EsIGludDh4OF90 IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9hYXJjaDY0X3NtdWxsdjhx aSAoX19hLCBfX2IpOworfQorCitfX2V4dGVuc2lvbl9fIHN0YXRpYyBfX2lu bGluZSBpbnQzMng0X3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGlu ZV9fKSkKK3ZtdWxsX3MxNiAoaW50MTZ4NF90IF9fYSwgaW50MTZ4NF90IF9f YikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9hYXJjaDY0X3NtdWxsdjRoaSAo X19hLCBfX2IpOworfQorCitfX2V4dGVuc2lvbl9fIHN0YXRpYyBfX2lubGlu ZSBpbnQ2NHgyX3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9f KSkKK3ZtdWxsX3MzMiAoaW50MzJ4Ml90IF9fYSwgaW50MzJ4Ml90IF9fYikK K3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9hYXJjaDY0X3NtdWxsdjJzaSAoX19h LCBfX2IpOworfQorCitfX2V4dGVuc2lvbl9fIHN0YXRpYyBfX2lubGluZSB1 aW50MTZ4OF90IF9fYXR0cmlidXRlX18gKChfX2Fsd2F5c19pbmxpbmVfXykp Cit2bXVsbF91OCAodWludDh4OF90IF9fYSwgdWludDh4OF90IF9fYikKK3sK KyAgcmV0dXJuIF9fYnVpbHRpbl9hYXJjaDY0X3VtdWxsdjhxaV91dXUgKF9f YSwgX19iKTsKK30KKworX19leHRlbnNpb25fXyBzdGF0aWMgX19pbmxpbmUg dWludDMyeDRfdCBfX2F0dHJpYnV0ZV9fICgoX19hbHdheXNfaW5saW5lX18p KQordm11bGxfdTE2ICh1aW50MTZ4NF90IF9fYSwgdWludDE2eDRfdCBfX2Ip Cit7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF91bXVsbHY0aGlfdXV1 IChfX2EsIF9fYik7Cit9CisKK19fZXh0ZW5zaW9uX18gc3RhdGljIF9faW5s aW5lIHVpbnQ2NHgyX3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGlu ZV9fKSkKK3ZtdWxsX3UzMiAodWludDMyeDJfdCBfX2EsIHVpbnQzMngyX3Qg X19iKQoreworICByZXR1cm4gX19idWlsdGluX2FhcmNoNjRfdW11bGx2MnNp X3V1dSAoX19hLCBfX2IpOworfQorCisvKiB2bXVseCAgKi8KKworX19leHRl bnNpb25fXyBzdGF0aWMgX19pbmxpbmUgZmxvYXQzMngyX3QgX19hdHRyaWJ1 dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZtdWx4X2YzMiAoZmxvYXQz MngyX3QgX19hLCBmbG9hdDMyeDJfdCBfX2IpCit7CisgIHJldHVybiBfX2J1 aWx0aW5fYWFyY2g2NF9mbXVseHYyc2YgKF9fYSwgX19iKTsKK30KKworX19l eHRlbnNpb25fXyBzdGF0aWMgX19pbmxpbmUgZmxvYXQzMngyX3QgX19hdHRy aWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZtdWx4X2xhbmVfZjMy IChmbG9hdDMyeDJfdCBfX2EsIGZsb2F0MzJ4NF90IF9fYiwgY29uc3QgaW50 IF9fYykKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9hYXJjaDY0X2ZtdWx4X2xh bmV2MnNmIChfX2EsIF9fYiwgX19jKTsKK30KKworCitfX2V4dGVuc2lvbl9f IHN0YXRpYyBfX2lubGluZSBmbG9hdDY0X3QgX19hdHRyaWJ1dGVfXyAoKF9f YWx3YXlzX2lubGluZV9fKSkKK3ZtdWx4ZF9mNjQgKGZsb2F0NjRfdCBfX2Es IGZsb2F0NjRfdCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2 NF9mbXVseGRmIChfX2EsIF9fYik7Cit9CisKK19fZXh0ZW5zaW9uX18gc3Rh dGljIF9faW5saW5lIGZsb2F0MzJ4NF90IF9fYXR0cmlidXRlX18gKChfX2Fs d2F5c19pbmxpbmVfXykpCit2bXVseHFfZjMyIChmbG9hdDMyeDRfdCBfX2Es IGZsb2F0MzJ4NF90IF9fYikKK3sKKyAgcmV0dXJuIF9fYnVpbHRpbl9hYXJj aDY0X2ZtdWx4djRzZiAoX19hLCBfX2IpOworfQorCitfX2V4dGVuc2lvbl9f IHN0YXRpYyBfX2lubGluZSBmbG9hdDY0eDJfdCBfX2F0dHJpYnV0ZV9fICgo X19hbHdheXNfaW5saW5lX18pKQordm11bHhxX2Y2NCAoZmxvYXQ2NHgyX3Qg X19hLCBmbG9hdDY0eDJfdCBfX2IpCit7CisgIHJldHVybiBfX2J1aWx0aW5f YWFyY2g2NF9mbXVseHYyZGYgKF9fYSwgX19iKTsKK30KKworX19leHRlbnNp b25fXyBzdGF0aWMgX19pbmxpbmUgZmxvYXQzMng0X3QgX19hdHRyaWJ1dGVf XyAoKF9fYWx3YXlzX2lubGluZV9fKSkKK3ZtdWx4cV9sYW5lX2YzMiAoZmxv YXQzMng0X3QgX19hLCBmbG9hdDMyeDRfdCBfX2IsIGNvbnN0IGludCBfX2Mp Cit7CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF9mbXVseF9sYW5ldjRz ZiAoX19hLCBfX2IsIF9fYyk7Cit9CisKK19fZXh0ZW5zaW9uX18gc3RhdGlj IF9faW5saW5lIGZsb2F0NjR4Ml90IF9fYXR0cmlidXRlX18gKChfX2Fsd2F5 c19pbmxpbmVfXykpCit2bXVseHFfbGFuZV9mNjQgKGZsb2F0NjR4Ml90IF9f YSwgZmxvYXQ2NHgyX3QgX19iLCBjb25zdCBpbnQgX19jKQoreworICByZXR1 cm4gX19idWlsdGluX2FhcmNoNjRfZm11bHhfbGFuZXYyZGYgKF9fYSwgX19i LCBfX2MpOworfQorCitfX2V4dGVuc2lvbl9fIHN0YXRpYyBfX2lubGluZSBm bG9hdDMyX3QgX19hdHRyaWJ1dGVfXyAoKF9fYWx3YXlzX2lubGluZV9fKSkK K3ZtdWx4c19mMzIgKGZsb2F0MzJfdCBfX2EsIGZsb2F0MzJfdCBfX2IpCit7 CisgIHJldHVybiBfX2J1aWx0aW5fYWFyY2g2NF9mbXVseHNmIChfX2EsIF9f Yik7Cit9CisKIC8qIHZuZWcgICovCiAKIF9fZXh0ZW5zaW9uX18gc3RhdGlj IF9faW5saW5lIGZsb2F0MzJ4Ml90IF9fYXR0cmlidXRlX18gKChfX2Fsd2F5 c19pbmxpbmVfXykpCkluZGV4OiBnY2MvY29uZmlnL2FhcmNoNjQvaXRlcmF0 b3JzLm1kCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGdjYy9jb25maWcv YWFyY2g2NC9pdGVyYXRvcnMubWQJKHJldmlzaW9uIDIxOTg0NSkKKysrIGdj Yy9jb25maWcvYWFyY2g2NC9pdGVyYXRvcnMubWQJKHdvcmtpbmcgY29weSkK QEAgLTI3Niw2ICsyNzYsOCBAQAogICAgIFVOU1BFQ19TSEEyNTZTVTEgICAg OyBVc2VkIGluIGFhcmNoNjQtc2ltZC5tZC4KICAgICBVTlNQRUNfUE1VTEwg ICAgICAgIDsgVXNlZCBpbiBhYXJjaDY0LXNpbWQubWQuCiAgICAgVU5TUEVD X1BNVUxMMiAgICAgICA7IFVzZWQgaW4gYWFyY2g2NC1zaW1kLm1kLgorICAg IFVOU1BFQ19GTVVMWCAgICAgICAgOyBVc2VkIGluIGFhcmNoNjQtc2ltZC5t ZC4KKyAgICBVTlNQRUNfRk1VTFhfTEFORSAgIDsgVXNlZCBpbiBhYXJjaDY0 LXNpbWQubWQuCiBdKQogCiA7OyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBA IC00NjYsNiArNDY4LDkgQEAKIAogKQogCisoZGVmaW5lX21vZGVfYXR0ciBW RFFGX1EgWyhWMlNGICJWNFNGIikgKFY0U0YgIlY0U0YiKQorICAgICAgICAg ICAgICAgICAgICAgICAgICAoVjJERiAiVjJERiIpXSkKKwogOzsgV2lkZW5l ZCBtb2RlIHJlZ2lzdGVyIHN1ZmZpeGVzIGZvciBWRF9CSFNJL1ZRVy4KIChk ZWZpbmVfbW9kZV9hdHRyIFZ3dHlwZSBbKFY4UUkgIjhoIikgKFY0SEkgIjRz IikKIAkJCSAgKFYyU0kgIjJkIikgKFYxNlFJICI4aCIpIApJbmRleDogZ2Nj L2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQtc2ltZC5tZAo9PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09Ci0tLSBnY2MvY29uZmlnL2FhcmNoNjQvYWFyY2g2NC1zaW1k Lm1kCShyZXZpc2lvbiAyMTk4NDUpCisrKyBnY2MvY29uZmlnL2FhcmNoNjQv YWFyY2g2NC1zaW1kLm1kCSh3b3JraW5nIGNvcHkpCkBAIC0xMzk2LDYgKzEz OTYsMjUzIEBACiAgfQogKQogCisoZGVmaW5lX2luc24gImFhcmNoNjRfbXVs X248bW9kZT4iCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlZNVUwgMCAicmVn aXN0ZXJfb3BlcmFuZCIgIj13IikKKyAgICAgICAgKG11bHQ6Vk1VTAorICAg ICAgICAgIChtYXRjaF9vcGVyYW5kOlZNVUwgMSAicmVnaXN0ZXJfb3BlcmFu ZCIgInciKQorICAgICAgICAgICh2ZWNfZHVwbGljYXRlOlZNVUwKKyAgICAg ICAgICAgIChtYXRjaF9vcGVyYW5kOjxWRUw+IDIgInJlZ2lzdGVyX29wZXJh bmQiICI8aF9jb24+IikpKSldCisgICJUQVJHRVRfU0lNRCIKKyAgIjxmPm11 bFx0JTAuPFZ0eXBlPiwgJTEuPFZ0eXBlPiwgJTIuPFZldHlwZT5bMF0iCisg IFsoc2V0X2F0dHIgInR5cGUiICJuZW9uX211bF88VmV0eXBlPl9sb25nIild CispCisKKyhkZWZpbmVfaW5zbiAiYWFyY2g2NF88c3U+bXVsbF9uPG1vZGU+ IgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDo8VldJREU+IDAgInJlZ2lzdGVy X29wZXJhbmQiICI9dyIpCisgICAgICAgIChtdWx0OjxWV0lERT4KKyAgICAg ICAgICAoQU5ZX0VYVEVORDo8VldJREU+CisgICAgICAgICAgICAobWF0Y2hf b3BlcmFuZDpWRF9IU0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInciKSkKKyAg ICAgICAgICAoQU5ZX0VYVEVORDo8VldJREU+CisgICAgICAgICAgICAodmVj X2R1cGxpY2F0ZTpWRF9IU0kKKyAgICAgICAgICAgICAgKG1hdGNoX29wZXJh bmQ6PFZFTD4gMiAicmVnaXN0ZXJfb3BlcmFuZCIgIjx2d3g+IikpKSkpXQor ICAiVEFSR0VUX1NJTUQiCisgICI8c3U+bXVsbFx0JTAuPFZ3dHlwZT4sICUx LjxWdHlwZT4sICUyLjxWZXR5cGU+WzBdIgorICBbKHNldF9hdHRyICJ0eXBl IiAibmVvbl9tdWxfPFZldHlwZT5fc2NhbGFyX2xvbmciKV0KKykKKworCiso ZGVmaW5lX2luc24gImFhcmNoNjRfPHN1Pm11bGw8bW9kZT4iCisgIFsoc2V0 IChtYXRjaF9vcGVyYW5kOjxWV0lERT4gMCAicmVnaXN0ZXJfb3BlcmFuZCIg Ij13IikKKyAgICAgICAgKG11bHQ6PFZXSURFPgorICAgICAgICAgIChBTllf RVhURU5EOjxWV0lERT4KKyAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlZE X0JIU0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInciKSkKKyAgICAgICAgICAo QU5ZX0VYVEVORDo8VldJREU+CisgICAgICAgICAgICAobWF0Y2hfb3BlcmFu ZDpWRF9CSFNJIDIgInJlZ2lzdGVyX29wZXJhbmQiICJ3IikpKSldCisgIlRB UkdFVF9TSU1EIgorICI8c3U+bXVsbFxcdCUwLjxWd3R5cGU+LCAlMS48VnR5 cGU+LCAlMi48VnR5cGU+IgorICBbKHNldF9hdHRyICJ0eXBlIiAibmVvbl9t dWxfPFZldHlwZT5fbG9uZyIpXQorKQorCisoZGVmaW5lX2luc24gImFhcmNo NjRfc2ltZF88c3U+bXVsbDJfbjxtb2RlPiIKKyBbKHNldCAobWF0Y2hfb3Bl cmFuZDo8VldJREU+IDAgInJlZ2lzdGVyX29wZXJhbmQiICI9dyIpCisgICAg ICAgKG11bHQ6PFZXSURFPiAoQU5ZX0VYVEVORDo8VldJREU+ICh2ZWNfc2Vs ZWN0OjxWSEFMRj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0 Y2hfb3BlcmFuZDpWUV9IU0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInciKQor ICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlZR X0hTSSAzICJ2ZWN0X3Bhcl9jbnN0X2hpX2hhbGYiICIiKSkpCisgICAgICAg ICAgICAgICAgICAgICAoQU5ZX0VYVEVORDo8VldJREU+ICh2ZWNfZHVwbGlj YXRlOjxWSEFMRj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0 Y2hfb3BlcmFuZDo8VkVMPiAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiPHZ3PiIp KSkpKV0KKyAgIlRBUkdFVF9TSU1EIgorICAiPHN1Pm11bGwyXFx0JTAuPFZ3 dHlwZT4sICUxLjxWdHlwZT4sICUyLjxWZXR5cGU+WzBdIgorICBbKHNldF9h dHRyICJ0eXBlIiAibmVvbl9tdWxfPFZldHlwZT5fc2NhbGFyX2xvbmciKV0K KykKKworKGRlZmluZV9leHBhbmQgImFhcmNoNjRfPHN1Pm11bGwyX248bW9k ZT4iCisgIFsobWF0Y2hfb3BlcmFuZDo8VldJREU+IDAgInJlZ2lzdGVyX29w ZXJhbmQiICIiKQorICAgKEFOWV9FWFRFTkQ6PFZXSURFPiAobWF0Y2hfb3Bl cmFuZDpWUV9IU0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpKQorICAgKG1h dGNoX29wZXJhbmQ6PFZFTD4gMiAicmVnaXN0ZXJfb3BlcmFuZCIgIiIpXQor ICJUQVJHRVRfU0lNRCIKKyB7CisgICBydHggcCA9IGFhcmNoNjRfc2ltZF92 ZWN0X3Bhcl9jbnN0X2hhbGYgKDxNT0RFPm1vZGUsIHRydWUpOworICAgZW1p dF9pbnNuIChnZW5fYWFyY2g2NF9zaW1kXzxzdT5tdWxsMl9uPG1vZGU+IChv cGVyYW5kc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgb3BlcmFuZHNbMV0sCisgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhbmRz WzJdLCBwKSk7CisgICBET05FOworCisgfQorKQorCisoZGVmaW5lX2luc24g ImFhcmNoNjRfPHN1Pm11bGxfbGFuZTxtb2RlPiIKKyAgWyhzZXQgKG1hdGNo X29wZXJhbmQ6PFZXSURFPiAwICJyZWdpc3Rlcl9vcGVyYW5kIiAiPXciKQor ICAgICAgICAobXVsdDo8VldJREU+CisgICAgICAgICAgKEFOWV9FWFRFTkQ6 PFZXSURFPgorICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6VkRfSFNJIDEg InJlZ2lzdGVyX29wZXJhbmQiICJ3IikpCisgICAgICAgICAgKEFOWV9FWFRF TkQ6PFZXSURFPgorICAgICAgICAgICAgKHZlY19kdXBsaWNhdGU6VkRfSFNJ CisgICAgICAgICAgICAgICh2ZWNfc2VsZWN0OjxWRUw+CisgICAgICAgICAg ICAgICAgKG1hdGNoX29wZXJhbmQ6PFZDT05EPiAyICJyZWdpc3Rlcl9vcGVy YW5kIiAiPHZ3eD4iKQorICAgICAgICAgICAgICAgICAgKHBhcmFsbGVsIFso bWF0Y2hfb3BlcmFuZDpTSSAzICJpbW1lZGlhdGVfb3BlcmFuZCIgImkiKV0p KSkpKSldCisgICJUQVJHRVRfU0lNRCIKKyAgeworICAgIG9wZXJhbmRzWzNd ID0gR0VOX0lOVCAoRU5ESUFOX0xBTkVfTiAoPFZDT05EPm1vZGUsIElOVFZB TCAob3BlcmFuZHNbM10pKSk7CisgICAgcmV0dXJuICI8c3U+bXVsbFxcdCUw LjxWd3R5cGU+LCAlMS48VnR5cGU+LCAlMi48VmV0eXBlPlslM10iOworICB9 CisgIFsoc2V0X2F0dHIgInR5cGUiICJuZW9uX211bF88VmV0eXBlPl9zY2Fs YXJfbG9uZyIpXQorKQorCisoZGVmaW5lX2luc24gImFhcmNoNjRfPHN1Pm11 bGxfbGFuZXE8bW9kZT4iCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOjxWV0lE RT4gMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj13IikKKyAgICAgICAgKG11bHQ6 PFZXSURFPgorICAgICAgICAgIChBTllfRVhURU5EOjxWV0lERT4KKyAgICAg ICAgICAgIChtYXRjaF9vcGVyYW5kOlZEX0hTSSAxICJyZWdpc3Rlcl9vcGVy YW5kIiAidyIpKQorICAgICAgICAgIChBTllfRVhURU5EOjxWV0lERT4KKyAg ICAgICAgICAgICh2ZWNfZHVwbGljYXRlOlZEX0hTSQorICAgICAgICAgICAg ICAodmVjX3NlbGVjdDo8VkVMPgorICAgICAgICAgICAgICAgIChtYXRjaF9v cGVyYW5kOjxWQ09OUT4gMiAicmVnaXN0ZXJfb3BlcmFuZCIgIjx2d3g+IikK KyAgICAgICAgICAgICAgICAgIChwYXJhbGxlbCBbKG1hdGNoX29wZXJhbmQ6 U0kgMyAiaW1tZWRpYXRlX29wZXJhbmQiICJpIildKSkpKSkpXQorICAiVEFS R0VUX1NJTUQiCisgIHsKKyAgICBvcGVyYW5kc1szXSA9IEdFTl9JTlQgKEVO RElBTl9MQU5FX04gKDxWQ09OUT5tb2RlLCBJTlRWQUwgKG9wZXJhbmRzWzNd KSkpOworICAgIHJldHVybiAiPHN1Pm11bGxcXHQlMC48Vnd0eXBlPiwgJTEu PFZ0eXBlPiwgJTIuPFZldHlwZT5bJTNdIjsKKyAgfQorICBbKHNldF9hdHRy ICJ0eXBlIiAibmVvbl9tdWxfPFZldHlwZT5fc2NhbGFyX2xvbmciKV0KKykK KworKGRlZmluZV9pbnNuICJhYXJjaDY0XzxzdT5tdWxsMl9sYW5lPG1vZGU+ X2ludGVybmFsIgorICBbKHNldCAobWF0Y2hfb3BlcmFuZDo8VldJREU+IDAg InJlZ2lzdGVyX29wZXJhbmQiICI9dyIpCisgICAgICAgIChtdWx0OjxWV0lE RT4KKyAgICAgICAgICAoQU5ZX0VYVEVORDo8VldJREU+CisgICAgICAgICAg ICAodmVjX3NlbGVjdDo8VkhBTEY+CisgICAgICAgICAgICAgIChtYXRjaF9v cGVyYW5kOlZRX0hTSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAidyIpCisgICAg ICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlZRX0hTSSA0ICJ2ZWN0X3Bhcl9j bnN0X2hpX2hhbGYiICIiKSkpCisgICAgICAgICAgKEFOWV9FWFRFTkQ6PFZX SURFPgorICAgICAgICAgICAgKHZlY19kdXBsaWNhdGU6PFZIQUxGPgorICAg ICAgICAgICAgICAodmVjX3NlbGVjdDo8VkVMPgorICAgICAgICAgICAgICAg IChtYXRjaF9vcGVyYW5kOjxWQ09ORD4gMiAicmVnaXN0ZXJfb3BlcmFuZCIg Ijx2d3g+IikKKyAgICAgICAgICAgICAgICAgIChwYXJhbGxlbCBbKG1hdGNo X29wZXJhbmQ6U0kgMyAiaW1tZWRpYXRlX29wZXJhbmQiICJpIildKSkpKSkp XQorICAiVEFSR0VUX1NJTUQiCisgIHsKKyAgICBvcGVyYW5kc1szXSA9IEdF Tl9JTlQgKEVORElBTl9MQU5FX04gKDxWQ09ORD5tb2RlLCBJTlRWQUwgKG9w ZXJhbmRzWzNdKSkpOworICAgIHJldHVybiAiPHN1Pm11bGwyXFx0JTAuPFZ3 dHlwZT4sICUxLjxWdHlwZT4sICUyLjxWZXR5cGU+WyUzXSI7CisgIH0KKyAg WyhzZXRfYXR0ciAidHlwZSIgIm5lb25fbXVsXzxWZXR5cGU+X3NjYWxhcl9s b25nIildCispCisKKyhkZWZpbmVfaW5zbiAiYWFyY2g2NF88c3U+bXVsbDJf bGFuZXE8bW9kZT5faW50ZXJuYWwiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5k OjxWV0lERT4gMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj13IikKKyAgICAgICAg KG11bHQ6PFZXSURFPgorICAgICAgICAgIChBTllfRVhURU5EOjxWV0lERT4K KyAgICAgICAgICAgICh2ZWNfc2VsZWN0OjxWSEFMRj4KKyAgICAgICAgICAg ICAgKG1hdGNoX29wZXJhbmQ6VlFfSFNJIDEgInJlZ2lzdGVyX29wZXJhbmQi ICJ3IikKKyAgICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6VlFfSFNJIDQg InZlY3RfcGFyX2Nuc3RfaGlfaGFsZiIgIiIpKSkKKyAgICAgICAgICAoQU5Z X0VYVEVORDo8VldJREU+CisgICAgICAgICAgICAodmVjX2R1cGxpY2F0ZTo8 VkhBTEY+CisgICAgICAgICAgICAgICh2ZWNfc2VsZWN0OjxWRUw+CisgICAg ICAgICAgICAgICAgKG1hdGNoX29wZXJhbmQ6PFZDT05RPiAyICJyZWdpc3Rl cl9vcGVyYW5kIiAiPHZ3eD4iKQorICAgICAgICAgICAgICAgICAgKHBhcmFs bGVsIFsobWF0Y2hfb3BlcmFuZDpTSSAzICJpbW1lZGlhdGVfb3BlcmFuZCIg ImkiKV0pKSkpKSldCisgICJUQVJHRVRfU0lNRCIKKyAgeworICAgIG9wZXJh bmRzWzNdID0gR0VOX0lOVCAoRU5ESUFOX0xBTkVfTiAoPFZDT05RPm1vZGUs IElOVFZBTCAob3BlcmFuZHNbM10pKSk7CisgICAgcmV0dXJuICI8c3U+bXVs bDJcXHQlMC48Vnd0eXBlPiwgJTEuPFZ0eXBlPiwgJTIuPFZldHlwZT5bJTNd IjsKKyAgfQorICBbKHNldF9hdHRyICJ0eXBlIiAibmVvbl9tdWxfPFZldHlw ZT5fc2NhbGFyX2xvbmciKV0KKykKKworKGRlZmluZV9leHBhbmQgImFhcmNo NjRfc211bGwyX2xhbmU8bW9kZT4iCisgIFsobWF0Y2hfb3BlcmFuZDo8VldJ REU+IDAgInJlZ2lzdGVyX29wZXJhbmQiICI9dyIpCisgICAobWF0Y2hfb3Bl cmFuZDpWUV9IU0kgMSAicmVnaXN0ZXJfb3BlcmFuZCIgInciKQorICAgKG1h dGNoX29wZXJhbmQ6PFZDT05EPiAyICJyZWdpc3Rlcl9vcGVyYW5kIiAiPHZ3 eD4iKQorICAgKG1hdGNoX29wZXJhbmQ6U0kgMyAiaW1tZWRpYXRlX29wZXJh bmQiICJpIildCisgICJUQVJHRVRfU0lNRCIKK3sKKyAgcnR4IHAgPSBhYXJj aDY0X3NpbWRfdmVjdF9wYXJfY25zdF9oYWxmICg8TU9ERT5tb2RlLCB0cnVl KTsKKyAgZW1pdF9pbnNuIChnZW5fYWFyY2g2NF9zbXVsbDJfbGFuZTxtb2Rl Pl9pbnRlcm5hbCAob3BlcmFuZHNbMF0sIG9wZXJhbmRzWzFdLAorICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICBvcGVyYW5kc1syXSwgb3BlcmFuZHNbM10sCisgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHApKTsKKyAg RE9ORTsKK30pCisKKyhkZWZpbmVfZXhwYW5kICJhYXJjaDY0X3VtdWxsMl9s YW5lPG1vZGU+IgorICBbKG1hdGNoX29wZXJhbmQ6PFZXSURFPiAwICJyZWdp c3Rlcl9vcGVyYW5kIiAiPXciKQorICAgKG1hdGNoX29wZXJhbmQ6VlFfSFNJ IDEgInJlZ2lzdGVyX29wZXJhbmQiICJ3IikKKyAgIChtYXRjaF9vcGVyYW5k OjxWQ09ORD4gMiAicmVnaXN0ZXJfb3BlcmFuZCIgIjx2d3g+IikKKyAgICht YXRjaF9vcGVyYW5kOlNJIDMgImltbWVkaWF0ZV9vcGVyYW5kIiAiaSIpXQor ICAiVEFSR0VUX1NJTUQiCit7CisgIHJ0eCBwID0gYWFyY2g2NF9zaW1kX3Zl Y3RfcGFyX2Nuc3RfaGFsZiAoPE1PREU+bW9kZSwgdHJ1ZSk7CisgIGVtaXRf aW5zbiAoZ2VuX2FhcmNoNjRfdW11bGwyX2xhbmU8bW9kZT5faW50ZXJuYWwg KG9wZXJhbmRzWzBdLCBvcGVyYW5kc1sxXSwKKyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHNb Ml0sIG9wZXJhbmRzWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICBwKSk7CisgIERPTkU7Cit9KQor CisoZGVmaW5lX2V4cGFuZCAiYWFyY2g2NF9zbXVsbDJfbGFuZXE8bW9kZT4i CisgIFsobWF0Y2hfb3BlcmFuZDo8VldJREU+IDAgInJlZ2lzdGVyX29wZXJh bmQiICI9dyIpCisgICAobWF0Y2hfb3BlcmFuZDpWUV9IU0kgMSAicmVnaXN0 ZXJfb3BlcmFuZCIgInciKQorICAgKG1hdGNoX29wZXJhbmQ6PFZDT05RPiAy ICJyZWdpc3Rlcl9vcGVyYW5kIiAiPHZ3eD4iKQorICAgKG1hdGNoX29wZXJh bmQ6U0kgMyAiaW1tZWRpYXRlX29wZXJhbmQiICJpIildCisgICJUQVJHRVRf U0lNRCIKK3sKKyAgcnR4IHAgPSBhYXJjaDY0X3NpbWRfdmVjdF9wYXJfY25z dF9oYWxmICg8TU9ERT5tb2RlLCB0cnVlKTsKKyAgZW1pdF9pbnNuIChnZW5f YWFyY2g2NF9zbXVsbDJfbGFuZXE8bW9kZT5faW50ZXJuYWwgKG9wZXJhbmRz WzBdLCBvcGVyYW5kc1sxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhbmRzWzJdLCBvcGVy YW5kc1szXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIHApKTsKKyAgRE9ORTsKK30pCisKKyhkZWZp bmVfZXhwYW5kICJhYXJjaDY0X3VtdWxsMl9sYW5lcTxtb2RlPiIKKyAgWyht YXRjaF9vcGVyYW5kOjxWV0lERT4gMCAicmVnaXN0ZXJfb3BlcmFuZCIgIj13 IikKKyAgIChtYXRjaF9vcGVyYW5kOlZRX0hTSSAxICJyZWdpc3Rlcl9vcGVy YW5kIiAidyIpCisgICAobWF0Y2hfb3BlcmFuZDo8VkNPTlE+IDIgInJlZ2lz dGVyX29wZXJhbmQiICI8dnd4PiIpCisgICAobWF0Y2hfb3BlcmFuZDpTSSAz ICJpbW1lZGlhdGVfb3BlcmFuZCIgImkiKV0KKyAgIlRBUkdFVF9TSU1EIgor eworICBydHggcCA9IGFhcmNoNjRfc2ltZF92ZWN0X3Bhcl9jbnN0X2hhbGYg KDxNT0RFPm1vZGUsIHRydWUpOworICBlbWl0X2luc24gKGdlbl9hYXJjaDY0 X3VtdWxsMl9sYW5lcTxtb2RlPl9pbnRlcm5hbCAob3BlcmFuZHNbMF0sIG9w ZXJhbmRzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHNbMl0sIG9wZXJhbmRzWzNd LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgcCkpOworICBET05FOworfSkKKworKGRlZmluZV9pbnNu ICJhYXJjaDY0X2ZtdWx4PG1vZGU+IgorICBbKHNldCAobWF0Y2hfb3BlcmFu ZDpWRFFGIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9dyIpCisgICAgICAgICh1 bnNwZWM6VkRRRiAgWyhtYXRjaF9vcGVyYW5kOlZEUUYgMSAicmVnaXN0ZXJf b3BlcmFuZCIgInciKQorICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hf b3BlcmFuZDpWRFFGIDIgInJlZ2lzdGVyX29wZXJhbmQiICJ3IildCisgICAg ICAgICAgICAgICAgICAgICAgVU5TUEVDX0ZNVUxYKSldCisgIlRBUkdFVF9T SU1EIgorICJmbXVseFxcdCUwLjx2dHlwZT4sICUxLjx2dHlwZT4sICUyLjx2 dHlwZT4iCisgIFsoc2V0X2F0dHIgInR5cGUiICJuZW9uX211bF9zIildCisp CisKKyhkZWZpbmVfaW5zbiAiYWFyY2g2NF9mbXVseDxtb2RlPiIKKyAgWyhz ZXQgKG1hdGNoX29wZXJhbmQ6R1BGIDAgInJlZ2lzdGVyX29wZXJhbmQiICI9 dyIpCisgICAgICAgICh1bnNwZWM6R1BGICBbKG1hdGNoX29wZXJhbmQ6R1BG IDEgInJlZ2lzdGVyX29wZXJhbmQiICJ3IikKKyAgICAgICAgICAgICAgICAg ICAgICAobWF0Y2hfb3BlcmFuZDpHUEYgMiAicmVnaXN0ZXJfb3BlcmFuZCIg InciKV0KKyAgICAgICAgICAgICAgICAgICAgIFVOU1BFQ19GTVVMWCkpXQor ICJUQVJHRVRfU0lNRCIKKyAiZm11bHhcXHQlPHM+MCwgJTxzPjEsICU8cz4y IgorICBbKHNldF9hdHRyICJ0eXBlIiAibmVvbl9tdWxfcyIpXQorKQorCiso ZGVmaW5lX2luc24gImFhcmNoNjRfZm11bHhfbGFuZTxtb2RlPiIKKyAgWyhz ZXQgKG1hdGNoX29wZXJhbmQ6VkRRRiAwICJyZWdpc3Rlcl9vcGVyYW5kIiAi PXciKQorICAgICAgICAodW5zcGVjOlZEUUYgIFsobWF0Y2hfb3BlcmFuZDpW RFFGIDEgInJlZ2lzdGVyX29wZXJhbmQiICJ3IikKKyAgICAgICAgICAgICAg ICAgICAgICAgKG1hdGNoX29wZXJhbmQ6PFZEUUZfUT4gMiAicmVnaXN0ZXJf b3BlcmFuZCIgInciKQorICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2hf b3BlcmFuZDpTSSAzICJpbW1lZGlhdGVfb3BlcmFuZCIgImkiKV0KKyAgICAg ICAgICAgICAgICAgICAgICBVTlNQRUNfRk1VTFhfTEFORSkpXQorICJUQVJH RVRfU0lNRCIKKyAiZm11bHhcXHQlMC48dnR5cGU+LCAlMS48dnR5cGU+LCAl Mi48dmV0eXBlPiIKKyAgWyhzZXRfYXR0ciAidHlwZSIgIm5lb25fbXVsX3Mi KV0KKykKKworKGRlZmluZV9pbnNuICJhYXJjaDY0X3BtdWxsMnYxNnFpIgor IFsoc2V0IChtYXRjaF9vcGVyYW5kOlY4SEkgMCAicmVnaXN0ZXJfb3BlcmFu ZCIgIj13IikKKyAgICAgICAodW5zcGVjOlY4SEkgWyhtYXRjaF9vcGVyYW5k OlYxNlFJIDEgInJlZ2lzdGVyX29wZXJhbmQiICJ3IikKKyAgICAgICAgICAg ICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlYxNlFJIDIgInJlZ2lzdGVyX29w ZXJhbmQiICJ3IildCisgICAgICAgICAgICAgICAgICAgIFVOU1BFQ19QTVVM TDIpKV0KKyAgIlRBUkdFVF9TSU1EIgorICAicG11bGwyXFx0JTAuOGgsICUx LjE2YiwgJTIuMTZiIgorICBbKHNldF9hdHRyICJ0eXBlIiAibmVvbl9tdWxf Yl9sb25nIildCispCisKKyhkZWZpbmVfaW5zbiAiYWFyY2g2NF9wbXVsbHY4 cWkiCisgIFsoc2V0IChtYXRjaF9vcGVyYW5kOlY4SEkgMCAicmVnaXN0ZXJf b3BlcmFuZCIgIj13IikKKyAgICAgICAgKHVuc3BlYzpWOEhJICBbKG1hdGNo X29wZXJhbmQ6VjhRSSAxICJyZWdpc3Rlcl9vcGVyYW5kIiAidyIpCisgICAg ICAgICAgICAgICAgICAgICAgIChtYXRjaF9vcGVyYW5kOlY4UUkgMiAicmVn aXN0ZXJfb3BlcmFuZCIgInciKV0KKyAgICAgICAgICAgICAgICAgICAgICBV TlNQRUNfUE1VTEwpKV0KKyAiVEFSR0VUX1NJTUQiCisgInBtdWxsXFx0JTAu OGgsICUxLjhiLCAlMi44YiIKKyAgWyhzZXRfYXR0ciAidHlwZSIgIm5lb25f bXVsX2JfbG9uZyIpXQorKQorCiA7OyBGUCB2ZWN0b3Igb3BlcmF0aW9ucy4K IDs7IEFBcmNoNjQgQWR2U0lNRCBzdXBwb3J0cyBzaW5nbGUtcHJlY2lzaW9u ICgzMi1iaXQpIGFuZCAKIDs7IGRvdWJsZS1wcmVjaXNpb24gKDY0LWJpdCkg ZmxvYXRpbmctcG9pbnQgZGF0YSB0eXBlcyBhbmQgYXJpdGhtZXRpYyBhcwpJ bmRleDogZ2NjL2NvbmZpZy9hYXJjaDY0L2FhcmNoNjQtc2ltZC1idWlsdGlu cy5kZWYKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gZ2NjL2NvbmZpZy9h YXJjaDY0L2FhcmNoNjQtc2ltZC1idWlsdGlucy5kZWYJKHJldmlzaW9uIDIx OTg0NSkKKysrIGdjYy9jb25maWcvYWFyY2g2NC9hYXJjaDY0LXNpbWQtYnVp bHRpbnMuZGVmCSh3b3JraW5nIGNvcHkpCkBAIC0xODcsNiArMTg3LDM5IEBA CiAgIEJVSUxUSU5fVlNEUV9IU0kgKFRFUk5PUF9MQU5FLCBzcXJkbXVsaF9s YW5lLCAwKQogICBCVUlMVElOX1ZTRFFfSFNJIChURVJOT1BfTEFORSwgc3Fy ZG11bGhfbGFuZXEsIDApCiAKKyAgLyogSW1wbGVtZW50ZWQgYnkgdmVjX3dp ZGVuXzxzdT5tdWx0X2hpXzxtb2RlPi4gICovCisgIEJVSUxUSU5fVlFXIChC SU5PUCwgdmVjX3dpZGVuX3NtdWx0X2hpXywgMTApCisgIEJVSUxUSU5fVlFX IChCSU5PUFUsIHZlY193aWRlbl91bXVsdF9oaV8sIDEwKQorICAvKiBJbXBs ZW1lbnRlZCBieSBhYXJjaDY0XzxzdT5tdWxsPG1vZGU+LiAgKi8KKyAgQlVJ TFRJTl9WRF9CSFNJIChCSU5PUFUsIHVtdWxsLCAwKQorICBCVUlMVElOX1ZE X0JIU0kgKEJJTk9QLCBzbXVsbCwgMCkKKyAgLyogSW1wbGVtZW50ZWQgYnkg YWFyY2g2NF88c3U+bXVsbF9uPG1vZGU+LiAgKi8KKyAgQlVJTFRJTl9WRF9I U0kgKEJJTk9QLCBzbXVsbF9uLCAwKQorICBCVUlMVElOX1ZEX0hTSSAoQklO T1BVLCB1bXVsbF9uLCAwKQorICAvKiBJbXBsZW1lbnRlZCBieSBhYXJjaDY0 X211bF9uPG1vZGU+LiAgKi8KKyAgQlVJTFRJTl9WTVVMIChCSU5PUCwgbXVs X24sIDApCisgIC8qIEltcGxlbWVudGVkIGJ5IGFhcmNoNjRfPHN1Pm11bGwy X248bW9kZT4uICAqLworICBCVUlMVElOX1ZRX0hTSSAoQklOT1AsIHNtdWxs Ml9uLCAwKQorICBCVUlMVElOX1ZRX0hTSSAoQklOT1BVLCB1bXVsbDJfbiwg MCkKKyAgLyogSW1wbGVtZW50ZWQgYnkgYWFyY2g2NF88c3U+bXVsbF9sYW5l PHE+PG1vZGU+LiAgKi8KKyAgQlVJTFRJTl9WRF9IU0kgKFRFUk5PUCwgc211 bGxfbGFuZSwgMCkKKyAgQlVJTFRJTl9WRF9IU0kgKFRFUk5PUFUsIHVtdWxs X2xhbmUsIDApCisgIEJVSUxUSU5fVkRfSFNJIChURVJOT1AsIHNtdWxsX2xh bmVxLCAwKQorICBCVUlMVElOX1ZEX0hTSSAoVEVSTk9QVSwgdW11bGxfbGFu ZXEsIDApCisgIC8qIEltcGxlbWVudGVkIGJ5IGFhcmNoNjRfPHN1Pm11bGwy X2xhbmU8cT48bW9kZT4uICAqLworICBCVUlMVElOX1ZRX0hTSSAoVEVSTk9Q LCBzbXVsbDJfbGFuZSwgMCkKKyAgQlVJTFRJTl9WUV9IU0kgKFRFUk5PUF9M QU5FLCB1bXVsbDJfbGFuZSwgMCkKKyAgQlVJTFRJTl9WUV9IU0kgKFRFUk5P UCwgc211bGwyX2xhbmVxLCAwKQorICBCVUlMVElOX1ZRX0hTSSAoVEVSTk9Q X0xBTkUsIHVtdWxsMl9sYW5lcSwgMCkKKyAgLyogSW1wbGVtZW50ZWQgYnkg YWFyY2g2NF9mbXVseDxtb2RlPi4gICovCisgIEJVSUxUSU5fVkRRRiAoQklO T1AsIGZtdWx4LCAwKQorICBCVUlMVElOX0dQRiAoQklOT1AsIGZtdWx4LCAw KQorICBCVUlMVElOX1ZEUUYgKEJJTk9QLCBmbXVseF9sYW5lLCAwKQorCisg IC8qIEltcGxlbWVudGVkIGJ5IGFhcmNoNjRfcG11bGw8Mj48bW9kZT4uKi8K KyAgVkFSMSAoQklOT1BQLCBwbXVsbCwgMCwgdjhxaSkKKyAgVkFSMSAoQklO T1BQLCBwbXVsbDIsIDAsIHYxNnFpKQorCiAgIEJVSUxUSU5fVlNEUV9JX0RJ IChCSU5PUCwgYXNobCwgMykKICAgLyogSW1wbGVtZW50ZWQgYnkgYWFyY2g2 NF88c3VyPnNobDxtb2RlPi4gICovCiAgIEJVSUxUSU5fVlNEUV9JX0RJIChC SU5PUCwgc3NobCwgMCkK --_002_B34C25384B9D7A428FF276D3AE7D6BDC7B4FE913nkgeml511mbxchi_--