* [PATCH 0/2] *** Add optimized memchr for power10 ***
@ 2023-11-13 16:33 bmahi496
2023-11-13 16:33 ` [PATCH 1/2] powerpc : Add optimized memchr for POWER10 bmahi496
2023-11-13 16:33 ` [PATCH 2/2] powerpc: memchr benchmarking results with power10 optimized memchr bmahi496
0 siblings, 2 replies; 4+ messages in thread
From: bmahi496 @ 2023-11-13 16:33 UTC (permalink / raw)
To: libc-alpha; +Cc: rajis, MAHESH BODAPATI
From: MAHESH BODAPATI <bmahi496@linux.ibm.com>
*** Series of 2 patches which are having the memchr implementation and benchmark
results ***
MAHESH BODAPATI (2):
powerpc : Add optimized memchr for POWER10
powerpc: memchr benchmarking results with power10 optimized memchr.
memchr_bench_report.txt | 1130 +++++++++++++++++
sysdeps/powerpc/powerpc64/le/power10/memchr.S | 315 +++++
sysdeps/powerpc/powerpc64/multiarch/Makefile | 9 +-
.../powerpc64/multiarch/ifunc-impl-list.c | 6 +
.../powerpc64/multiarch/memchr-power10.S | 28 +
sysdeps/powerpc/powerpc64/multiarch/memchr.c | 20 +-
6 files changed, 1498 insertions(+), 10 deletions(-)
create mode 100644 memchr_bench_report.txt
create mode 100644 sysdeps/powerpc/powerpc64/le/power10/memchr.S
create mode 100644 sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S
--
2.39.3
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/2] powerpc : Add optimized memchr for POWER10
2023-11-13 16:33 [PATCH 0/2] *** Add optimized memchr for power10 *** bmahi496
@ 2023-11-13 16:33 ` bmahi496
2023-11-13 16:33 ` [PATCH 2/2] powerpc: memchr benchmarking results with power10 optimized memchr bmahi496
1 sibling, 0 replies; 4+ messages in thread
From: bmahi496 @ 2023-11-13 16:33 UTC (permalink / raw)
To: libc-alpha; +Cc: rajis, MAHESH BODAPATI
From: MAHESH BODAPATI <bmahi496@linux.ibm.com>
Optimized memchr for POWER10 based on existing rawmemchr and strlen.
movement of code,dead code elimination and loop unrolling helped in
getting better performance.
---
sysdeps/powerpc/powerpc64/le/power10/memchr.S | 315 ++++++++++++++++++
sysdeps/powerpc/powerpc64/multiarch/Makefile | 9 +-
.../powerpc64/multiarch/ifunc-impl-list.c | 6 +
.../powerpc64/multiarch/memchr-power10.S | 28 ++
sysdeps/powerpc/powerpc64/multiarch/memchr.c | 20 +-
5 files changed, 368 insertions(+), 10 deletions(-)
create mode 100644 sysdeps/powerpc/powerpc64/le/power10/memchr.S
create mode 100644 sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S
diff --git a/sysdeps/powerpc/powerpc64/le/power10/memchr.S b/sysdeps/powerpc/powerpc64/le/power10/memchr.S
new file mode 100644
index 0000000000..faf293f344
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/le/power10/memchr.S
@@ -0,0 +1,315 @@
+/* Optimized memchr implementation for POWER10 LE.
+ Copyright (C) 2021-2023 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+
+# ifndef MEMCHR
+# define MEMCHR __memchr
+# endif
+# define M_VREG_ZERO v20
+# define M_OFF_START_LOOP 256
+# define MEMCHR_SUBTRACT_VECTORS \
+ vsububm v4,v4,v18; \
+ vsububm v5,v5,v18; \
+ vsububm v6,v6,v18; \
+ vsububm v7,v7,v18;
+# define M_TAIL(vreg,increment) \
+ vctzlsbb r4,vreg; \
+ cmpld r5,r4; \
+ ble L(null); \
+ addi r4,r4,increment; \
+ add r3,r6,r4; \
+ blr
+
+/* TODO: Replace macros by the actual instructions when minimum binutils becomes
+ >= 2.35. This is used to keep compatibility with older versions. */
+#define M_VEXTRACTBM(rt,vrb) \
+ .long(((4)<<(32-6)) \
+ | ((rt)<<(32-11)) \
+ | ((8)<<(32-16)) \
+ | ((vrb)<<(32-21)) \
+ | 1602)
+
+#define M_LXVP(xtp,dq,ra) \
+ .long(((6)<<(32-6)) \
+ | ((((xtp)-32)>>1)<<(32-10)) \
+ | ((1)<<(32-11)) \
+ | ((ra)<<(32-16)) \
+ | dq)
+
+#define CHECK16B(vreg,offset,addr,label) \
+ lxv vreg+32,offset(addr); \
+ vcmpequb. vreg,vreg,v18; \
+ bne cr6,L(label); \
+ cmpldi r5,16; \
+ ble L(null); \
+ addi r5,r5,-16;
+
+/* Load 4 quadwords, merge into one VR for speed and check for NULLs. r6 has #
+ of bytes already checked. */
+#define CHECK64B(offset,addr,label) \
+ M_LXVP(v4+32,offset,addr); \
+ M_LXVP(v6+32,offset+32,addr); \
+ MEMCHR_SUBTRACT_VECTORS; \
+ vminub v14,v4,v5; \
+ vminub v15,v6,v7; \
+ vminub v16,v14,v15; \
+ vcmpequb. v0,v16,M_VREG_ZERO; \
+ beq cr6,$+12; \
+ li r7,offset; \
+ b L(label); \
+ cmpldi r5,64; \
+ ble L(null); \
+ addi r5,r5,-64
+
+/* Implements the function
+ void *[r3] memchr (const void *s [r3], int c [r4], size_t n [r5]). */
+
+ .machine power9
+
+ENTRY_TOCLESS (MEMCHR)
+ CALL_MCOUNT 3
+
+ cmpldi r5,0
+ beq L(null)
+ mr r0,r5
+ xori r6,r4,0xff
+
+ mtvsrd v18+32,r4 /* matching char in v18 */
+ mtvsrd v19+32,r6 /* non matching char in v19 */
+
+ vspltb v18,v18,7 /* replicate */
+ vspltb v19,v19,7 /* replicate */
+ vspltisb M_VREG_ZERO,0
+
+ /* Next 16B-aligned address. Prepare address for L(aligned). */
+ addi r6,r3,16
+ clrrdi r6,r6,4
+
+ /* Align data and fill bytes not loaded with non matching char. */
+ lvx v0,0,r3
+ lvsr v1,0,r3
+ vperm v0,v19,v0,v1
+
+ vcmpequb. v6,v0,v18
+ bne cr6,L(found)
+ sub r4,r6,r3
+ cmpld r5,r4
+ ble L(null)
+ sub r5,r5,r4
+
+ /* Test up to OFF_START_LOOP-16 bytes in 16B chunks. The main loop is
+ optimized for longer strings, so checking the first bytes in 16B
+ chunks benefits a lot small strings. */
+ .p2align 5
+L(aligned):
+ cmpldi r5,0
+ beq L(null)
+
+ CHECK16B(v0,0,r6,tail1)
+ CHECK16B(v1,16,r6,tail2)
+ CHECK16B(v2,32,r6,tail3)
+ CHECK16B(v3,48,r6,tail4)
+ CHECK16B(v4,64,r6,tail5)
+ CHECK16B(v5,80,r6,tail6)
+ CHECK16B(v6,96,r6,tail7)
+ CHECK16B(v7,112,r6,tail8)
+ CHECK16B(v8,128,r6,tail9)
+ CHECK16B(v9,144,r6,tail10)
+ CHECK16B(v10,160,r6,tail11)
+ CHECK16B(v0,176,r6,tail12)
+ CHECK16B(v1,192,r6,tail13)
+ CHECK16B(v2,208,r6,tail14)
+ CHECK16B(v3,224,r6,tail15)
+
+ cmpdi cr5,r4,0 /* Check if c == 0. This will be useful to
+ choose how we will perform the main loop. */
+
+ /* Prepare address for the loop. */
+ addi r4,r3,M_OFF_START_LOOP
+ clrrdi r4,r4,6
+ sub r6,r4,r3
+ sub r5,r0,r6
+ addi r6,r4,128
+
+ /* If c == 0, use the loop without the vsububm. */
+ beq cr5,L(loop)
+
+ /* This is very similar to the block after L(loop), the difference is
+ that here MEMCHR_SUBTRACT_VECTORS is not empty, and we subtract
+ each byte loaded by the char we are looking for, this way we can keep
+ using vminub to merge the results and checking for nulls. */
+ .p2align 5
+L(memchr_loop):
+ CHECK64B(0,r4,pre_tail_64b)
+ CHECK64B(64,r4,pre_tail_64b)
+ addi r4,r4,256
+
+ CHECK64B(0,r6,tail_64b)
+ CHECK64B(64,r6,tail_64b)
+ addi r6,r6,256
+
+ CHECK64B(0,r4,pre_tail_64b)
+ CHECK64B(64,r4,pre_tail_64b)
+ addi r4,r4,256
+
+ CHECK64B(0,r6,tail_64b)
+ CHECK64B(64,r6,tail_64b)
+ addi r6,r6,256
+
+ b L(memchr_loop)
+ /* Switch to a more aggressive approach checking 64B each time. Use 2
+ pointers 128B apart and unroll the loop once to make the pointer
+ updates and usages separated enough to avoid stalls waiting for
+ address calculation. */
+ .p2align 5
+L(loop):
+#undef MEMCHR_SUBTRACT_VECTORS
+#define MEMCHR_SUBTRACT_VECTORS /* nothing */
+ CHECK64B(0,r4,pre_tail_64b)
+ CHECK64B(64,r4,pre_tail_64b)
+ addi r4,r4,256
+
+ CHECK64B(0,r6,tail_64b)
+ CHECK64B(64,r6,tail_64b)
+ addi r6,r6,256
+
+ CHECK64B(0,r4,pre_tail_64b)
+ CHECK64B(64,r4,pre_tail_64b)
+ addi r4,r4,256
+
+ CHECK64B(0,r6,tail_64b)
+ CHECK64B(64,r6,tail_64b)
+ addi r6,r6,256
+
+ b L(loop)
+
+ .p2align 5
+L(pre_tail_64b):
+ mr r6,r4
+L(tail_64b):
+ /* OK, we found a null byte. Let's look for it in the current 64-byte
+ block and mark it in its corresponding VR. lxvp vx,0(ry) puts the
+ low 16B bytes into vx+1, and the high into vx, so the order here is
+ v5, v4, v7, v6. */
+ vcmpequb v1,v5,M_VREG_ZERO
+ vcmpequb v2,v4,M_VREG_ZERO
+ vcmpequb v3,v7,M_VREG_ZERO
+ vcmpequb v4,v6,M_VREG_ZERO
+
+ /* Take into account the other 64B blocks we had already checked. */
+ add r6,r6,r7
+ /* Extract first bit of each byte. */
+ M_VEXTRACTBM(r8,v1)
+ M_VEXTRACTBM(r9,v2)
+ M_VEXTRACTBM(r10,v3)
+ M_VEXTRACTBM(r11,v4)
+
+ /* Shift each value into their corresponding position. */
+ sldi r9,r9,16
+ sldi r10,r10,32
+ sldi r11,r11,48
+
+ /* Merge the results. */
+ or r8,r8,r9
+ or r9,r10,r11
+ or r11,r9,r8
+
+ cnttzd r0,r11 /* Count trailing zeros before the match. */
+ cmpld r5,r0
+ ble L(null)
+ add r3,r6,r0 /* Compute final address. */
+ blr
+
+ .p2align 5
+L(tail1):
+ M_TAIL(v0,0)
+
+ .p2align 5
+L(tail2):
+ M_TAIL(v1,16)
+
+ .p2align 5
+L(tail3):
+ M_TAIL(v2,32)
+
+ .p2align 5
+L(tail4):
+ M_TAIL(v3,48)
+
+ .p2align 5
+L(tail5):
+ M_TAIL(v4,64)
+
+ .p2align 5
+L(tail6):
+ M_TAIL(v5,80)
+
+ .p2align 5
+L(tail7):
+ M_TAIL(v6,96)
+
+ .p2align 5
+L(tail8):
+ M_TAIL(v7,112)
+
+ .p2align 5
+L(tail9):
+ M_TAIL(v8,128)
+
+ .p2align 5
+L(tail10):
+ M_TAIL(v9,144)
+
+ .p2align 5
+L(tail11):
+ M_TAIL(v10,160)
+
+ .p2align 5
+L(tail12):
+ M_TAIL(v0,176)
+
+ .p2align 5
+L(tail13):
+ M_TAIL(v1,192)
+
+ .p2align 5
+L(tail14):
+ M_TAIL(v2,208)
+
+ .p2align 5
+L(tail15):
+ M_TAIL(v3,224)
+
+ .p2align 5
+L(found):
+ vctzlsbb r7,v6
+ cmpld r5,r7
+ ble L(null)
+ add r3,r3,r7
+ blr
+
+ .p2align 5
+L(null):
+ li r3,0
+ blr
+
+END (MEMCHR)
+
+weak_alias (__memchr, memchr)
+libc_hidden_builtin_def (memchr)
diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile
index 27d8495503..eb3d72a11c 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile
+++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile
@@ -31,10 +31,11 @@ sysdep_routines += memcpy-power8-cached memcpy-power7 memcpy-a2 memcpy-power6 \
strncase-power8
ifneq (,$(filter %le,$(config-machine)))
-sysdep_routines += memcmp-power10 memcpy-power10 memmove-power10 memset-power10 \
- rawmemchr-power9 rawmemchr-power10 \
- strcmp-power9 strncmp-power9 strcpy-power9 stpcpy-power9 \
- strlen-power9 strncpy-power9 stpncpy-power9 strlen-power10
+sysdep_routines += memchr-power10 memcmp-power10 memcpy-power10 \
+ memmove-power10 memset-power10 rawmemchr-power9 \
+ rawmemchr-power10 strcmp-power9 strncmp-power9 \
+ strcpy-power9 stpcpy-power9 strlen-power9 strncpy-power9 \
+ stpncpy-power9 strlen-power10
endif
CFLAGS-strncase-power7.c += -mcpu=power7 -funroll-loops
CFLAGS-strncase_l-power7.c += -mcpu=power7 -funroll-loops
diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
index fc26dd0e17..b353ca4c3a 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
+++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
@@ -226,6 +226,12 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
/* Support sysdeps/powerpc/powerpc64/multiarch/memchr.c. */
IFUNC_IMPL (i, name, memchr,
+#ifdef __LITTLE_ENDIAN__
+ IFUNC_IMPL_ADD (array, i, memchr,
+ hwcap2 & PPC_FEATURE2_ARCH_3_1
+ && hwcap & PPC_FEATURE_HAS_VSX,
+ __memchr_power10)
+#endif
IFUNC_IMPL_ADD (array, i, memchr,
hwcap2 & PPC_FEATURE2_ARCH_2_07
&& hwcap & PPC_FEATURE_HAS_ALTIVEC,
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S b/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S
new file mode 100644
index 0000000000..b9ed792676
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S
@@ -0,0 +1,28 @@
+/* Optimized memchr implementation for POWER10/PPC64.
+ Copyright (C) 2016-2023 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#if defined __LITTLE_ENDIAN__ && IS_IN (libc)
+#define MEMCHR __memchr_power10
+
+#undef libc_hidden_builtin_def
+#define libc_hidden_builtin_def(name)
+#undef weak_alias
+#define weak_alias(name,alias)
+
+#include <sysdeps/powerpc/powerpc64/le/power10/memchr.S>
+#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr.c b/sysdeps/powerpc/powerpc64/multiarch/memchr.c
index a1a8f3eedd..dbb30fe51d 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/memchr.c
+++ b/sysdeps/powerpc/powerpc64/multiarch/memchr.c
@@ -25,15 +25,23 @@ extern __typeof (__memchr) __memchr_ppc attribute_hidden;
extern __typeof (__memchr) __memchr_power7 attribute_hidden;
extern __typeof (__memchr) __memchr_power8 attribute_hidden;
+# ifdef __LITTLE_ENDIAN__
+extern __typeof (__memchr) __memchr_power10 attribute_hidden;
+# endif
/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
ifunc symbol properly. */
libc_ifunc (__memchr,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07
- && hwcap & PPC_FEATURE_HAS_ALTIVEC)
- ? __memchr_power8 :
- (hwcap & PPC_FEATURE_ARCH_2_06)
- ? __memchr_power7
- : __memchr_ppc);
+# ifdef __LITTLE_ENDIAN__
+ (hwcap2 & PPC_FEATURE2_ARCH_3_1
+ && hwcap & PPC_FEATURE_HAS_VSX)
+ ? __memchr_power10 :
+# endif
+ (hwcap2 & PPC_FEATURE2_ARCH_2_07
+ && hwcap & PPC_FEATURE_HAS_ALTIVEC)
+ ? __memchr_power8 :
+ (hwcap & PPC_FEATURE_ARCH_2_06)
+ ? __memchr_power7
+ : __memchr_ppc);
weak_alias (__memchr, memchr)
libc_hidden_builtin_def (memchr)
--
2.39.3
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 2/2] powerpc: memchr benchmarking results with power10 optimized memchr.
2023-11-13 16:33 [PATCH 0/2] *** Add optimized memchr for power10 *** bmahi496
2023-11-13 16:33 ` [PATCH 1/2] powerpc : Add optimized memchr for POWER10 bmahi496
@ 2023-11-13 16:33 ` bmahi496
1 sibling, 0 replies; 4+ messages in thread
From: bmahi496 @ 2023-11-13 16:33 UTC (permalink / raw)
To: libc-alpha; +Cc: rajis, MAHESH BODAPATI
From: MAHESH BODAPATI <bmahi496@linux.ibm.com>
---
memchr_bench_report.txt | 1130 +++++++++++++++++++++++++++++++++++++++
1 file changed, 1130 insertions(+)
create mode 100644 memchr_bench_report.txt
diff --git a/memchr_bench_report.txt b/memchr_bench_report.txt
new file mode 100644
index 0000000000..bc78e17422
--- /dev/null
+++ b/memchr_bench_report.txt
@@ -0,0 +1,1130 @@
+Function: memchr
+Variant:
+ __memchr_power10 __memchr_power8
+========================================================================================================================
+align=0, pos=32, len=2048, seek_char=23, invert_pos=0: 1.47 ( 42.59%) 2.57
+align=1, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 49.69%) 3.83
+align=0, pos=32, len=2048, seek_char=0, invert_pos=0: 1.47 ( 40.18%) 2.46
+align=1, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.66%) 3.83
+align=65521, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 35.39%) 2.98
+align=0, pos=64, len=2048, seek_char=23, invert_pos=0: 1.93 ( 34.41%) 2.94
+align=2, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 49.67%) 3.83
+align=0, pos=64, len=2048, seek_char=0, invert_pos=0: 1.93 ( 37.61%) 3.09
+align=2, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.63%) 3.82
+align=65521, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 35.23%) 2.97
+align=0, pos=128, len=2048, seek_char=23, invert_pos=0: 2.95 ( 17.04%) 3.55
+align=3, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 49.66%) 3.83
+align=0, pos=128, len=2048, seek_char=0, invert_pos=0: 2.95 ( 27.55%) 4.07
+align=3, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.62%) 3.82
+align=65521, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 35.21%) 2.97
+align=0, pos=256, len=2048, seek_char=23, invert_pos=0: 5.81 ( -8.78%) 5.34
+align=4, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 50.39%) 3.88
+align=0, pos=256, len=2048, seek_char=0, invert_pos=0: 5.80 ( -4.27%) 5.57
+align=4, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.68%) 3.83
+align=65521, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 35.31%) 2.98
+align=0, pos=512, len=2048, seek_char=23, invert_pos=0: 7.76 (-10.27%) 7.04
+align=5, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 49.65%) 3.83
+align=0, pos=512, len=2048, seek_char=0, invert_pos=0: 7.76 (-10.36%) 7.03
+align=5, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.63%) 3.83
+align=65521, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 35.27%) 2.98
+align=0, pos=1024, len=2048, seek_char=23, invert_pos=0: 11.50 ( -4.86%) 10.97
+align=6, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 49.62%) 3.82
+align=0, pos=1024, len=2048, seek_char=0, invert_pos=0: 11.50 ( -4.80%) 10.98
+align=6, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.66%) 3.83
+align=65521, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 35.25%) 2.98
+align=0, pos=2048, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.15%) 17.05
+align=7, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 49.65%) 3.83
+align=0, pos=2048, len=2048, seek_char=0, invert_pos=0: 18.17 ( -7.68%) 16.88
+align=7, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.65%) 3.83
+align=65521, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 35.17%) 2.97
+align=1, pos=32, len=192, seek_char=23, invert_pos=0: 1.48 ( 40.16%) 2.47
+align=1, pos=32, len=192, seek_char=0, invert_pos=0: 1.48 ( 40.14%) 2.47
+align=1, pos=32, len=256, seek_char=23, invert_pos=0: 1.48 ( 40.06%) 2.47
+align=1, pos=32, len=256, seek_char=0, invert_pos=0: 1.48 ( 40.17%) 2.47
+align=1, pos=32, len=512, seek_char=23, invert_pos=0: 1.48 ( 40.21%) 2.47
+align=1, pos=32, len=512, seek_char=0, invert_pos=0: 1.48 ( 40.12%) 2.47
+align=65521, pos=32, len=256, seek_char=23, invert_pos=0: 1.48 ( 50.27%) 2.98
+align=2, pos=64, len=192, seek_char=23, invert_pos=0: 1.93 ( 49.64%) 3.83
+align=2, pos=64, len=192, seek_char=0, invert_pos=0: 1.93 ( 49.70%) 3.83
+align=2, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 49.66%) 3.83
+align=2, pos=64, len=256, seek_char=0, invert_pos=0: 1.93 ( 49.67%) 3.83
+align=2, pos=64, len=512, seek_char=23, invert_pos=0: 1.93 ( 49.63%) 3.83
+align=2, pos=64, len=512, seek_char=0, invert_pos=0: 1.93 ( 49.63%) 3.83
+align=65521, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 35.23%) 2.97
+align=3, pos=96, len=192, seek_char=23, invert_pos=0: 2.44 ( 36.31%) 3.83
+align=3, pos=96, len=192, seek_char=0, invert_pos=0: 2.44 ( 36.31%) 3.82
+align=3, pos=96, len=256, seek_char=23, invert_pos=0: 2.44 ( 36.35%) 3.83
+align=3, pos=96, len=256, seek_char=0, invert_pos=0: 2.44 ( 36.33%) 3.83
+align=3, pos=96, len=512, seek_char=23, invert_pos=0: 2.44 ( 36.35%) 3.83
+align=3, pos=96, len=512, seek_char=0, invert_pos=0: 2.43 ( 36.32%) 3.82
+align=65521, pos=96, len=256, seek_char=23, invert_pos=0: 2.44 ( 31.33%) 3.55
+align=4, pos=128, len=192, seek_char=23, invert_pos=0: 2.95 ( 33.41%) 4.43
+align=4, pos=128, len=192, seek_char=0, invert_pos=0: 2.95 ( 33.42%) 4.43
+align=4, pos=128, len=256, seek_char=23, invert_pos=0: 2.95 ( 33.42%) 4.43
+align=4, pos=128, len=256, seek_char=0, invert_pos=0: 2.95 ( 33.40%) 4.43
+align=4, pos=128, len=512, seek_char=23, invert_pos=0: 2.95 ( 33.43%) 4.43
+align=4, pos=128, len=512, seek_char=0, invert_pos=0: 2.95 ( 33.46%) 4.43
+align=65521, pos=128, len=256, seek_char=23, invert_pos=0: 2.95 ( 16.84%) 3.54
+align=5, pos=160, len=192, seek_char=23, invert_pos=0: 3.46 ( 21.81%) 4.43
+align=5, pos=160, len=192, seek_char=0, invert_pos=0: 3.46 ( 21.83%) 4.43
+align=5, pos=160, len=256, seek_char=23, invert_pos=0: 3.46 ( 21.81%) 4.43
+align=5, pos=160, len=256, seek_char=0, invert_pos=0: 3.46 ( 21.77%) 4.42
+align=5, pos=160, len=512, seek_char=23, invert_pos=0: 3.46 ( 21.89%) 4.43
+align=5, pos=160, len=512, seek_char=0, invert_pos=0: 3.46 ( 21.84%) 4.43
+align=65521, pos=160, len=256, seek_char=23, invert_pos=0: 6.83 (-30.73%) 5.22
+align=6, pos=192, len=192, seek_char=23, invert_pos=0: 3.97 ( 10.39%) 4.44
+align=6, pos=192, len=192, seek_char=0, invert_pos=0: 3.97 ( 10.39%) 4.43
+align=6, pos=192, len=256, seek_char=23, invert_pos=0: 3.97 ( 21.26%) 5.05
+align=6, pos=192, len=256, seek_char=0, invert_pos=0: 3.97 ( 21.38%) 5.05
+align=6, pos=192, len=512, seek_char=23, invert_pos=0: 3.97 ( 21.22%) 5.04
+align=6, pos=192, len=512, seek_char=0, invert_pos=0: 3.97 ( 21.22%) 5.04
+align=65521, pos=192, len=256, seek_char=23, invert_pos=0: 3.97 ( 3.49%) 4.12
+align=7, pos=224, len=192, seek_char=23, invert_pos=0: 3.97 ( 10.37%) 4.43
+align=7, pos=224, len=192, seek_char=0, invert_pos=0: 3.97 ( 10.20%) 4.43
+align=7, pos=224, len=256, seek_char=23, invert_pos=0: 4.49 ( 10.96%) 5.04
+align=7, pos=224, len=256, seek_char=0, invert_pos=0: 4.49 ( 10.88%) 5.03
+align=7, pos=224, len=512, seek_char=23, invert_pos=0: 4.49 ( 10.89%) 5.03
+align=7, pos=224, len=512, seek_char=0, invert_pos=0: 4.49 ( 10.87%) 5.03
+align=65521, pos=224, len=256, seek_char=23, invert_pos=0: 4.48 ( 1.05%) 4.53
+align=0, pos=1, len=2, seek_char=23, invert_pos=0: 0.91 ( 39.10%) 1.50
+align=0, pos=1, len=2, seek_char=0, invert_pos=0: 0.91 ( 38.78%) 1.49
+align=1, pos=1, len=2, seek_char=23, invert_pos=0: 1.03 ( 30.50%) 1.49
+align=1, pos=1, len=2, seek_char=0, invert_pos=0: 1.03 ( 33.34%) 1.55
+align=0, pos=1, len=0, seek_char=23, invert_pos=0: 1.16 (-13.34%) 1.03
+align=0, pos=1, len=0, seek_char=0, invert_pos=0: 1.16 (-13.29%) 1.03
+align=1, pos=1, len=0, seek_char=23, invert_pos=0: 1.16 (-13.41%) 1.03
+align=1, pos=1, len=0, seek_char=0, invert_pos=0: 1.16 ( 40.45%) 1.95
+align=32768, pos=1, len=2, seek_char=23, invert_pos=0: 1.03 ( 28.84%) 1.45
+align=32768, pos=1, len=2, seek_char=0, invert_pos=0: 1.03 ( 33.32%) 1.55
+align=32769, pos=1, len=2, seek_char=23, invert_pos=0: 1.03 ( 33.33%) 1.55
+align=32769, pos=1, len=2, seek_char=0, invert_pos=0: 1.03 ( 33.35%) 1.55
+align=32768, pos=1, len=0, seek_char=23, invert_pos=0: 1.16 (-13.33%) 1.03
+align=32768, pos=1, len=0, seek_char=0, invert_pos=0: 1.16 (-13.40%) 1.03
+align=32769, pos=1, len=0, seek_char=23, invert_pos=0: 1.16 (-13.39%) 1.03
+align=32769, pos=1, len=0, seek_char=0, invert_pos=0: 1.16 ( 40.42%) 1.95
+align=65521, pos=1, len=0, seek_char=23, invert_pos=0: 1.16 ( 40.39%) 1.95
+align=65521, pos=1, len=0, seek_char=0, invert_pos=0: 1.16 ( 40.30%) 1.95
+align=65521, pos=1, len=2, seek_char=23, invert_pos=0: 1.03 ( 53.14%) 2.21
+align=65521, pos=1, len=2, seek_char=0, invert_pos=0: 1.03 ( 30.57%) 1.49
+align=0, pos=2, len=3, seek_char=23, invert_pos=0: 1.03 ( 28.84%) 1.45
+align=0, pos=2, len=3, seek_char=0, invert_pos=0: 1.03 ( 33.31%) 1.55
+align=2, pos=2, len=3, seek_char=23, invert_pos=0: 1.03 ( 33.29%) 1.55
+align=2, pos=2, len=3, seek_char=0, invert_pos=0: 1.03 ( 33.29%) 1.55
+align=0, pos=2, len=1, seek_char=23, invert_pos=0: 0.91 ( 38.90%) 1.50
+align=0, pos=2, len=1, seek_char=0, invert_pos=0: 1.16 ( 24.96%) 1.55
+align=2, pos=2, len=1, seek_char=23, invert_pos=0: 1.16 ( 25.03%) 1.55
+align=2, pos=2, len=1, seek_char=0, invert_pos=0: 1.16 ( 25.00%) 1.55
+align=32768, pos=2, len=3, seek_char=23, invert_pos=0: 1.03 ( 33.30%) 1.55
+align=32768, pos=2, len=3, seek_char=0, invert_pos=0: 1.03 ( 33.38%) 1.55
+align=32770, pos=2, len=3, seek_char=23, invert_pos=0: 1.03 ( 33.33%) 1.55
+align=32770, pos=2, len=3, seek_char=0, invert_pos=0: 1.03 ( 33.37%) 1.55
+align=32768, pos=2, len=1, seek_char=23, invert_pos=0: 1.16 ( 24.96%) 1.55
+align=32768, pos=2, len=1, seek_char=0, invert_pos=0: 1.16 ( 25.01%) 1.55
+align=32770, pos=2, len=1, seek_char=23, invert_pos=0: 1.16 ( 25.04%) 1.55
+align=32770, pos=2, len=1, seek_char=0, invert_pos=0: 1.16 ( 24.96%) 1.55
+align=65521, pos=2, len=1, seek_char=23, invert_pos=0: 1.16 ( 25.00%) 1.55
+align=65521, pos=2, len=1, seek_char=0, invert_pos=0: 1.16 ( 25.05%) 1.55
+align=65521, pos=2, len=3, seek_char=23, invert_pos=0: 1.04 ( 33.27%) 1.55
+align=65521, pos=2, len=3, seek_char=0, invert_pos=0: 1.03 ( 33.33%) 1.55
+align=0, pos=3, len=4, seek_char=23, invert_pos=0: 1.03 ( 33.31%) 1.55
+align=0, pos=3, len=4, seek_char=0, invert_pos=0: 1.03 ( 33.29%) 1.55
+align=3, pos=3, len=4, seek_char=23, invert_pos=0: 1.03 ( 33.29%) 1.55
+align=3, pos=3, len=4, seek_char=0, invert_pos=0: 1.03 ( 33.29%) 1.55
+align=0, pos=3, len=2, seek_char=23, invert_pos=0: 1.16 ( 24.98%) 1.55
+align=0, pos=3, len=2, seek_char=0, invert_pos=0: 1.16 ( 24.96%) 1.55
+align=3, pos=3, len=2, seek_char=23, invert_pos=0: 1.16 ( 24.95%) 1.55
+align=3, pos=3, len=2, seek_char=0, invert_pos=0: 1.16 ( 25.03%) 1.55
+align=32768, pos=3, len=4, seek_char=23, invert_pos=0: 1.03 ( 33.31%) 1.55
+align=32768, pos=3, len=4, seek_char=0, invert_pos=0: 1.03 ( 33.29%) 1.55
+align=32771, pos=3, len=4, seek_char=23, invert_pos=0: 1.03 ( 33.31%) 1.55
+align=32771, pos=3, len=4, seek_char=0, invert_pos=0: 1.03 ( 33.31%) 1.55
+align=32768, pos=3, len=2, seek_char=23, invert_pos=0: 1.43 ( 7.92%) 1.55
+align=32768, pos=3, len=2, seek_char=0, invert_pos=0: 1.16 ( 25.00%) 1.55
+align=32771, pos=3, len=2, seek_char=23, invert_pos=0: 1.16 ( 25.03%) 1.55
+align=32771, pos=3, len=2, seek_char=0, invert_pos=0: 1.16 ( 25.01%) 1.55
+align=65521, pos=3, len=2, seek_char=23, invert_pos=0: 1.16 ( 25.01%) 1.55
+align=65521, pos=3, len=2, seek_char=0, invert_pos=0: 1.16 ( 25.01%) 1.55
+align=65521, pos=3, len=4, seek_char=23, invert_pos=0: 1.03 ( 33.35%) 1.55
+align=65521, pos=3, len=4, seek_char=0, invert_pos=0: 1.03 ( 33.30%) 1.55
+align=0, pos=4, len=5, seek_char=23, invert_pos=0: 1.03 ( 33.31%) 1.55
+align=0, pos=4, len=5, seek_char=0, invert_pos=0: 1.03 ( 33.33%) 1.55
+align=4, pos=4, len=5, seek_char=23, invert_pos=0: 1.03 ( 38.09%) 1.67
+align=4, pos=4, len=5, seek_char=0, invert_pos=0: 0.91 ( 45.26%) 1.66
+align=0, pos=4, len=3, seek_char=23, invert_pos=0: 1.43 ( 4.54%) 1.50
+align=0, pos=4, len=3, seek_char=0, invert_pos=0: 1.16 ( 24.99%) 1.55
+align=4, pos=4, len=3, seek_char=23, invert_pos=0: 1.16 ( 24.98%) 1.55
+align=4, pos=4, len=3, seek_char=0, invert_pos=0: 1.16 ( 25.05%) 1.55
+align=32768, pos=4, len=5, seek_char=23, invert_pos=0: 1.03 ( 33.35%) 1.55
+align=32768, pos=4, len=5, seek_char=0, invert_pos=0: 1.03 ( 33.33%) 1.55
+align=32772, pos=4, len=5, seek_char=23, invert_pos=0: 1.03 ( 37.80%) 1.66
+align=32772, pos=4, len=5, seek_char=0, invert_pos=0: 1.03 ( 36.90%) 1.64
+align=32768, pos=4, len=3, seek_char=23, invert_pos=0: 1.43 ( 4.47%) 1.50
+align=32768, pos=4, len=3, seek_char=0, invert_pos=0: 1.16 ( 25.00%) 1.55
+align=32772, pos=4, len=3, seek_char=23, invert_pos=0: 1.16 ( 25.02%) 1.55
+align=32772, pos=4, len=3, seek_char=0, invert_pos=0: 1.16 ( 25.08%) 1.55
+align=65521, pos=4, len=3, seek_char=23, invert_pos=0: 1.16 ( 25.01%) 1.55
+align=65521, pos=4, len=3, seek_char=0, invert_pos=0: 1.16 ( 24.99%) 1.55
+align=65521, pos=4, len=5, seek_char=23, invert_pos=0: 1.03 ( 33.31%) 1.55
+align=65521, pos=4, len=5, seek_char=0, invert_pos=0: 1.03 ( 33.31%) 1.55
+align=0, pos=5, len=6, seek_char=23, invert_pos=0: 1.03 ( 33.32%) 1.55
+align=0, pos=5, len=6, seek_char=0, invert_pos=0: 1.03 ( 33.39%) 1.55
+align=5, pos=5, len=6, seek_char=23, invert_pos=0: 1.03 ( 37.80%) 1.66
+align=5, pos=5, len=6, seek_char=0, invert_pos=0: 1.03 ( 36.97%) 1.64
+align=0, pos=5, len=4, seek_char=23, invert_pos=0: 1.43 ( 4.39%) 1.49
+align=0, pos=5, len=4, seek_char=0, invert_pos=0: 1.43 ( 7.92%) 1.55
+align=5, pos=5, len=4, seek_char=23, invert_pos=0: 1.43 ( 15.84%) 1.70
+align=5, pos=5, len=4, seek_char=0, invert_pos=0: 1.43 ( 15.87%) 1.70
+align=32768, pos=5, len=6, seek_char=23, invert_pos=0: 1.03 ( 28.94%) 1.46
+align=32768, pos=5, len=6, seek_char=0, invert_pos=0: 1.23 ( 17.46%) 1.49
+align=32773, pos=5, len=6, seek_char=23, invert_pos=0: 1.03 ( 38.08%) 1.67
+align=32773, pos=5, len=6, seek_char=0, invert_pos=0: 1.03 ( 36.97%) 1.64
+align=32768, pos=5, len=4, seek_char=23, invert_pos=0: 1.16 ( 22.15%) 1.49
+align=32768, pos=5, len=4, seek_char=0, invert_pos=0: 1.16 ( 25.00%) 1.55
+align=32773, pos=5, len=4, seek_char=23, invert_pos=0: 1.16 ( 31.50%) 1.70
+align=32773, pos=5, len=4, seek_char=0, invert_pos=0: 1.16 ( 31.43%) 1.70
+align=65521, pos=5, len=4, seek_char=23, invert_pos=0: 1.16 ( 22.23%) 1.50
+align=65521, pos=5, len=4, seek_char=0, invert_pos=0: 1.16 ( 24.97%) 1.55
+align=65521, pos=5, len=6, seek_char=23, invert_pos=0: 1.03 ( 33.30%) 1.55
+align=65521, pos=5, len=6, seek_char=0, invert_pos=0: 1.03 ( 33.35%) 1.55
+align=0, pos=6, len=7, seek_char=23, invert_pos=0: 1.03 ( 33.31%) 1.55
+align=0, pos=6, len=7, seek_char=0, invert_pos=0: 1.03 ( 33.36%) 1.55
+align=6, pos=6, len=7, seek_char=23, invert_pos=0: 1.03 ( 37.78%) 1.66
+align=6, pos=6, len=7, seek_char=0, invert_pos=0: 1.03 ( 36.96%) 1.64
+align=0, pos=6, len=5, seek_char=23, invert_pos=0: 1.43 ( 4.42%) 1.49
+align=0, pos=6, len=5, seek_char=0, invert_pos=0: 1.16 ( 24.99%) 1.55
+align=6, pos=6, len=5, seek_char=23, invert_pos=0: 1.16 ( 31.40%) 1.70
+align=6, pos=6, len=5, seek_char=0, invert_pos=0: 1.16 ( 31.44%) 1.70
+align=32768, pos=6, len=7, seek_char=23, invert_pos=0: 1.03 ( 28.96%) 1.46
+align=32768, pos=6, len=7, seek_char=0, invert_pos=0: 1.03 ( 33.33%) 1.55
+align=32774, pos=6, len=7, seek_char=23, invert_pos=0: 1.03 ( 36.90%) 1.64
+align=32774, pos=6, len=7, seek_char=0, invert_pos=0: 1.03 ( 36.96%) 1.64
+align=32768, pos=6, len=5, seek_char=23, invert_pos=0: 1.43 ( 4.43%) 1.49
+align=32768, pos=6, len=5, seek_char=0, invert_pos=0: 1.16 ( 24.99%) 1.55
+align=32774, pos=6, len=5, seek_char=23, invert_pos=0: 1.16 ( 31.46%) 1.70
+align=32774, pos=6, len=5, seek_char=0, invert_pos=0: 1.16 ( 31.46%) 1.70
+align=65521, pos=6, len=5, seek_char=23, invert_pos=0: 1.16 ( 22.26%) 1.50
+align=65521, pos=6, len=5, seek_char=0, invert_pos=0: 1.16 ( 24.98%) 1.55
+align=65521, pos=6, len=7, seek_char=23, invert_pos=0: 1.03 ( 33.31%) 1.55
+align=65521, pos=6, len=7, seek_char=0, invert_pos=0: 1.03 ( 33.33%) 1.55
+align=0, pos=7, len=8, seek_char=23, invert_pos=0: 1.03 ( 33.28%) 1.55
+align=0, pos=7, len=8, seek_char=0, invert_pos=0: 1.03 ( 33.28%) 1.55
+align=7, pos=7, len=8, seek_char=23, invert_pos=0: 1.03 ( 37.81%) 1.66
+align=7, pos=7, len=8, seek_char=0, invert_pos=0: 1.03 ( 36.90%) 1.64
+align=0, pos=7, len=6, seek_char=23, invert_pos=0: 1.43 ( 4.49%) 1.50
+align=0, pos=7, len=6, seek_char=0, invert_pos=0: 1.16 ( 25.04%) 1.55
+align=7, pos=7, len=6, seek_char=23, invert_pos=0: 1.16 ( 31.45%) 1.70
+align=7, pos=7, len=6, seek_char=0, invert_pos=0: 1.16 ( 31.46%) 1.70
+align=32768, pos=7, len=8, seek_char=23, invert_pos=0: 1.03 ( 28.90%) 1.45
+align=32768, pos=7, len=8, seek_char=0, invert_pos=0: 1.03 ( 33.36%) 1.55
+align=32775, pos=7, len=8, seek_char=23, invert_pos=0: 1.03 ( 37.75%) 1.66
+align=32775, pos=7, len=8, seek_char=0, invert_pos=0: 1.03 ( 38.06%) 1.67
+align=32768, pos=7, len=6, seek_char=23, invert_pos=0: 1.43 ( 4.34%) 1.49
+align=32768, pos=7, len=6, seek_char=0, invert_pos=0: 1.16 ( 25.00%) 1.55
+align=32775, pos=7, len=6, seek_char=23, invert_pos=0: 1.16 ( 31.46%) 1.70
+align=32775, pos=7, len=6, seek_char=0, invert_pos=0: 1.16 ( 31.42%) 1.70
+align=65521, pos=7, len=6, seek_char=23, invert_pos=0: 1.16 ( 22.20%) 1.50
+align=65521, pos=7, len=6, seek_char=0, invert_pos=0: 1.16 ( 24.99%) 1.55
+align=65521, pos=7, len=8, seek_char=23, invert_pos=0: 1.03 ( 36.93%) 1.64
+align=65521, pos=7, len=8, seek_char=0, invert_pos=0: 1.03 ( 36.86%) 1.64
+align=0, pos=8, len=9, seek_char=23, invert_pos=0: 1.03 ( 36.93%) 1.64
+align=0, pos=8, len=9, seek_char=0, invert_pos=0: 1.03 ( 38.07%) 1.67
+align=8, pos=8, len=9, seek_char=23, invert_pos=0: 1.28 ( 22.06%) 1.64
+align=8, pos=8, len=9, seek_char=0, invert_pos=0: 1.30 ( 20.60%) 1.64
+align=0, pos=8, len=7, seek_char=23, invert_pos=0: 1.43 ( 4.32%) 1.49
+align=0, pos=8, len=7, seek_char=0, invert_pos=0: 1.16 ( 25.00%) 1.55
+align=8, pos=8, len=7, seek_char=23, invert_pos=0: 1.16 ( 24.99%) 1.55
+align=8, pos=8, len=7, seek_char=0, invert_pos=0: 1.16 ( 24.99%) 1.55
+align=32768, pos=8, len=9, seek_char=23, invert_pos=0: 1.03 ( 36.91%) 1.64
+align=32768, pos=8, len=9, seek_char=0, invert_pos=0: 1.03 ( 38.11%) 1.67
+align=32776, pos=8, len=9, seek_char=23, invert_pos=0: 1.30 ( 21.94%) 1.67
+align=32776, pos=8, len=9, seek_char=0, invert_pos=0: 1.30 ( 22.03%) 1.67
+align=32768, pos=8, len=7, seek_char=23, invert_pos=0: 1.43 ( 4.50%) 1.50
+align=32768, pos=8, len=7, seek_char=0, invert_pos=0: 1.43 ( 7.89%) 1.55
+align=32776, pos=8, len=7, seek_char=23, invert_pos=0: 1.43 ( 7.94%) 1.55
+align=32776, pos=8, len=7, seek_char=0, invert_pos=0: 1.43 ( 7.88%) 1.55
+align=65521, pos=8, len=7, seek_char=23, invert_pos=0: 1.43 (-29.96%) 1.10
+align=65521, pos=8, len=7, seek_char=0, invert_pos=0: 1.43 ( -9.59%) 1.30
+align=65521, pos=8, len=9, seek_char=23, invert_pos=0: 1.03 ( 36.90%) 1.64
+align=65521, pos=8, len=9, seek_char=0, invert_pos=0: 1.03 ( 36.92%) 1.64
+align=0, pos=9, len=10, seek_char=23, invert_pos=0: 1.03 ( 38.08%) 1.67
+align=0, pos=9, len=10, seek_char=0, invert_pos=0: 1.03 ( 39.15%) 1.70
+align=9, pos=9, len=10, seek_char=23, invert_pos=0: 1.30 ( 20.44%) 1.64
+align=9, pos=9, len=10, seek_char=0, invert_pos=0: 1.30 ( 21.67%) 1.66
+align=0, pos=9, len=8, seek_char=23, invert_pos=0: 3.44 ( 2.58%) 3.53
+align=0, pos=9, len=8, seek_char=0, invert_pos=0: 3.60 ( -4.96%) 3.43
+align=9, pos=9, len=8, seek_char=23, invert_pos=0: 3.98 ( 9.48%) 4.39
+align=9, pos=9, len=8, seek_char=0, invert_pos=0: 1.22 ( 45.64%) 2.24
+align=32768, pos=9, len=10, seek_char=23, invert_pos=0: 1.80 ( -9.63%) 1.64
+align=32768, pos=9, len=10, seek_char=0, invert_pos=0: 0.91 ( 45.22%) 1.66
+align=32777, pos=9, len=10, seek_char=23, invert_pos=0: 1.30 ( 20.49%) 1.64
+align=32777, pos=9, len=10, seek_char=0, invert_pos=0: 1.46 ( 10.78%) 1.64
+align=32768, pos=9, len=8, seek_char=23, invert_pos=0: 0.91 ( 16.49%) 1.09
+align=32768, pos=9, len=8, seek_char=0, invert_pos=0: 1.16 ( -4.55%) 1.11
+align=32777, pos=9, len=8, seek_char=23, invert_pos=0: 1.42 ( 16.55%) 1.70
+align=32777, pos=9, len=8, seek_char=0, invert_pos=0: 1.42 ( 16.53%) 1.70
+align=65521, pos=9, len=8, seek_char=23, invert_pos=0: 1.16 ( 31.40%) 1.70
+align=65521, pos=9, len=8, seek_char=0, invert_pos=0: 1.16 ( 31.51%) 1.70
+align=65521, pos=9, len=10, seek_char=23, invert_pos=0: 0.91 ( 46.40%) 1.70
+align=65521, pos=9, len=10, seek_char=0, invert_pos=0: 0.91 ( 45.46%) 1.67
+align=0, pos=10, len=11, seek_char=23, invert_pos=0: 0.91 ( 44.49%) 1.64
+align=0, pos=10, len=11, seek_char=0, invert_pos=0: 1.03 ( 36.92%) 1.64
+align=10, pos=10, len=11, seek_char=23, invert_pos=0: 1.30 ( 21.95%) 1.67
+align=10, pos=10, len=11, seek_char=0, invert_pos=0: 1.30 ( 21.99%) 1.67
+align=0, pos=10, len=9, seek_char=23, invert_pos=0: 1.68 ( 0.68%) 1.70
+align=0, pos=10, len=9, seek_char=0, invert_pos=0: 1.62 ( 4.40%) 1.70
+align=10, pos=10, len=9, seek_char=23, invert_pos=0: 1.42 ( 16.56%) 1.70
+align=10, pos=10, len=9, seek_char=0, invert_pos=0: 1.42 ( 16.57%) 1.70
+align=32768, pos=10, len=11, seek_char=23, invert_pos=0: 1.03 ( 38.10%) 1.67
+align=32768, pos=10, len=11, seek_char=0, invert_pos=0: 1.03 ( 39.15%) 1.70
+align=32778, pos=10, len=11, seek_char=23, invert_pos=0: 1.30 ( 21.98%) 1.67
+align=32778, pos=10, len=11, seek_char=0, invert_pos=0: 1.30 ( 22.01%) 1.67
+align=32768, pos=10, len=9, seek_char=23, invert_pos=0: 1.85 ( -2.22%) 1.81
+align=32768, pos=10, len=9, seek_char=0, invert_pos=0: 1.16 ( 31.47%) 1.70
+align=32778, pos=10, len=9, seek_char=23, invert_pos=0: 1.42 ( 16.41%) 1.70
+align=32778, pos=10, len=9, seek_char=0, invert_pos=0: 1.42 ( 28.00%) 1.97
+align=65521, pos=10, len=9, seek_char=23, invert_pos=0: 1.16 ( 31.36%) 1.70
+align=65521, pos=10, len=9, seek_char=0, invert_pos=0: 1.16 ( 31.44%) 1.70
+align=65521, pos=10, len=11, seek_char=23, invert_pos=0: 1.03 ( 36.95%) 1.64
+align=65521, pos=10, len=11, seek_char=0, invert_pos=0: 1.03 ( 36.85%) 1.64
+align=0, pos=11, len=12, seek_char=23, invert_pos=0: 1.03 ( 36.92%) 1.64
+align=0, pos=11, len=12, seek_char=0, invert_pos=0: 1.03 ( 37.78%) 1.66
+align=11, pos=11, len=12, seek_char=23, invert_pos=0: 1.30 ( 20.49%) 1.64
+align=11, pos=11, len=12, seek_char=0, invert_pos=0: 1.30 ( 20.54%) 1.64
+align=0, pos=11, len=10, seek_char=23, invert_pos=0: 1.68 ( 0.73%) 1.70
+align=0, pos=11, len=10, seek_char=0, invert_pos=0: 1.68 ( 0.72%) 1.70
+align=11, pos=11, len=10, seek_char=23, invert_pos=0: 1.42 ( 16.43%) 1.70
+align=11, pos=11, len=10, seek_char=0, invert_pos=0: 1.42 ( 16.56%) 1.70
+align=32768, pos=11, len=12, seek_char=23, invert_pos=0: 1.03 ( 38.06%) 1.67
+align=32768, pos=11, len=12, seek_char=0, invert_pos=0: 1.03 ( 36.89%) 1.64
+align=32779, pos=11, len=12, seek_char=23, invert_pos=0: 1.30 ( 23.29%) 1.70
+align=32779, pos=11, len=12, seek_char=0, invert_pos=0: 1.30 ( 21.95%) 1.67
+align=32768, pos=11, len=10, seek_char=23, invert_pos=0: 1.68 ( 0.73%) 1.70
+align=32768, pos=11, len=10, seek_char=0, invert_pos=0: 1.43 ( 15.87%) 1.70
+align=32779, pos=11, len=10, seek_char=23, invert_pos=0: 1.69 ( 0.64%) 1.70
+align=32779, pos=11, len=10, seek_char=0, invert_pos=0: 1.68 ( 0.68%) 1.70
+align=65521, pos=11, len=10, seek_char=23, invert_pos=0: 1.43 ( 15.79%) 1.70
+align=65521, pos=11, len=10, seek_char=0, invert_pos=0: 1.43 ( 15.77%) 1.70
+align=65521, pos=11, len=12, seek_char=23, invert_pos=0: 1.03 ( 36.94%) 1.64
+align=65521, pos=11, len=12, seek_char=0, invert_pos=0: 1.03 ( 36.90%) 1.64
+align=0, pos=12, len=13, seek_char=23, invert_pos=0: 1.03 ( 36.91%) 1.64
+align=0, pos=12, len=13, seek_char=0, invert_pos=0: 1.03 ( 36.92%) 1.64
+align=12, pos=12, len=13, seek_char=23, invert_pos=0: 1.30 ( 31.08%) 1.89
+align=12, pos=12, len=13, seek_char=0, invert_pos=0: 1.30 ( 31.04%) 1.89
+align=0, pos=12, len=11, seek_char=23, invert_pos=0: 1.68 ( 0.82%) 1.70
+align=0, pos=12, len=11, seek_char=0, invert_pos=0: 1.43 ( 15.74%) 1.70
+align=12, pos=12, len=11, seek_char=23, invert_pos=0: 1.42 ( 16.52%) 1.70
+align=12, pos=12, len=11, seek_char=0, invert_pos=0: 1.42 ( 16.49%) 1.70
+align=32768, pos=12, len=13, seek_char=23, invert_pos=0: 1.03 ( 38.06%) 1.67
+align=32768, pos=12, len=13, seek_char=0, invert_pos=0: 1.03 ( 36.90%) 1.64
+align=32780, pos=12, len=13, seek_char=23, invert_pos=0: 1.30 ( 40.52%) 2.19
+align=32780, pos=12, len=13, seek_char=0, invert_pos=0: 1.30 ( 31.03%) 1.89
+align=32768, pos=12, len=11, seek_char=23, invert_pos=0: 1.68 ( 0.82%) 1.70
+align=32768, pos=12, len=11, seek_char=0, invert_pos=0: 1.68 ( 0.69%) 1.70
+align=32780, pos=12, len=11, seek_char=23, invert_pos=0: 1.68 ( 0.72%) 1.70
+align=32780, pos=12, len=11, seek_char=0, invert_pos=0: 1.42 ( 16.60%) 1.70
+align=65521, pos=12, len=11, seek_char=23, invert_pos=0: 1.68 ( 0.76%) 1.70
+align=65521, pos=12, len=11, seek_char=0, invert_pos=0: 1.43 ( 15.87%) 1.70
+align=65521, pos=12, len=13, seek_char=23, invert_pos=0: 1.03 ( 37.77%) 1.66
+align=65521, pos=12, len=13, seek_char=0, invert_pos=0: 1.03 ( 36.92%) 1.64
+align=0, pos=13, len=14, seek_char=23, invert_pos=0: 1.03 ( 36.94%) 1.64
+align=0, pos=13, len=14, seek_char=0, invert_pos=0: 1.03 ( 36.95%) 1.64
+align=13, pos=13, len=14, seek_char=23, invert_pos=0: 1.30 ( 30.96%) 1.89
+align=13, pos=13, len=14, seek_char=0, invert_pos=0: 1.30 ( 31.00%) 1.89
+align=0, pos=13, len=12, seek_char=23, invert_pos=0: 1.68 ( 0.76%) 1.70
+align=0, pos=13, len=12, seek_char=0, invert_pos=0: 1.43 ( 15.83%) 1.70
+align=13, pos=13, len=12, seek_char=23, invert_pos=0: 1.68 ( 13.63%) 1.95
+align=13, pos=13, len=12, seek_char=0, invert_pos=0: 1.68 ( 13.55%) 1.95
+align=32768, pos=13, len=14, seek_char=23, invert_pos=0: 1.04 ( 36.85%) 1.64
+align=32768, pos=13, len=14, seek_char=0, invert_pos=0: 1.03 ( 36.92%) 1.64
+align=32781, pos=13, len=14, seek_char=23, invert_pos=0: 1.30 ( 31.00%) 1.89
+align=32781, pos=13, len=14, seek_char=0, invert_pos=0: 1.30 ( 31.05%) 1.89
+align=32768, pos=13, len=12, seek_char=23, invert_pos=0: 1.69 ( 0.71%) 1.70
+align=32768, pos=13, len=12, seek_char=0, invert_pos=0: 1.43 ( 15.86%) 1.70
+align=32781, pos=13, len=12, seek_char=23, invert_pos=0: 1.68 ( 13.65%) 1.95
+align=32781, pos=13, len=12, seek_char=0, invert_pos=0: 1.68 ( 13.69%) 1.95
+align=65521, pos=13, len=12, seek_char=23, invert_pos=0: 1.43 ( 15.88%) 1.70
+align=65521, pos=13, len=12, seek_char=0, invert_pos=0: 1.43 ( 15.82%) 1.70
+align=65521, pos=13, len=14, seek_char=23, invert_pos=0: 1.03 ( 37.83%) 1.66
+align=65521, pos=13, len=14, seek_char=0, invert_pos=0: 1.03 ( 38.14%) 1.67
+align=0, pos=14, len=15, seek_char=23, invert_pos=0: 1.03 ( 39.18%) 1.70
+align=0, pos=14, len=15, seek_char=0, invert_pos=0: 1.03 ( 37.78%) 1.66
+align=14, pos=14, len=15, seek_char=23, invert_pos=0: 1.30 ( 31.47%) 1.90
+align=14, pos=14, len=15, seek_char=0, invert_pos=0: 1.30 ( 31.09%) 1.89
+align=0, pos=14, len=13, seek_char=23, invert_pos=0: 2.30 (-17.05%) 1.96
+align=0, pos=14, len=13, seek_char=0, invert_pos=0: 1.16 ( 31.51%) 1.70
+align=14, pos=14, len=13, seek_char=23, invert_pos=0: 1.68 ( 13.69%) 1.95
+align=14, pos=14, len=13, seek_char=0, invert_pos=0: 1.68 ( 13.64%) 1.95
+align=32768, pos=14, len=15, seek_char=23, invert_pos=0: 1.03 ( 36.95%) 1.64
+align=32768, pos=14, len=15, seek_char=0, invert_pos=0: 1.03 ( 36.94%) 1.64
+align=32782, pos=14, len=15, seek_char=23, invert_pos=0: 1.30 ( 30.99%) 1.89
+align=32782, pos=14, len=15, seek_char=0, invert_pos=0: 1.30 ( 30.99%) 1.89
+align=32768, pos=14, len=13, seek_char=23, invert_pos=0: 1.68 ( 0.76%) 1.70
+align=32768, pos=14, len=13, seek_char=0, invert_pos=0: 1.43 ( 15.78%) 1.70
+align=32782, pos=14, len=13, seek_char=23, invert_pos=0: 1.68 ( 13.66%) 1.95
+align=32782, pos=14, len=13, seek_char=0, invert_pos=0: 1.68 ( 13.62%) 1.95
+align=65521, pos=14, len=13, seek_char=23, invert_pos=0: 1.43 ( 15.87%) 1.70
+align=65521, pos=14, len=13, seek_char=0, invert_pos=0: 1.43 ( 15.80%) 1.70
+align=65521, pos=14, len=15, seek_char=23, invert_pos=0: 1.03 ( 38.19%) 1.67
+align=65521, pos=14, len=15, seek_char=0, invert_pos=0: 1.03 ( 38.14%) 1.67
+align=0, pos=15, len=16, seek_char=23, invert_pos=0: 1.03 ( 37.99%) 1.67
+align=0, pos=15, len=16, seek_char=0, invert_pos=0: 1.03 ( 38.17%) 1.67
+align=15, pos=15, len=16, seek_char=23, invert_pos=0: 1.30 ( 31.42%) 1.90
+align=15, pos=15, len=16, seek_char=0, invert_pos=0: 1.30 ( 31.02%) 1.89
+align=0, pos=15, len=14, seek_char=23, invert_pos=0: 1.69 ( 0.69%) 1.70
+align=0, pos=15, len=14, seek_char=0, invert_pos=0: 1.43 ( 15.82%) 1.70
+align=15, pos=15, len=14, seek_char=23, invert_pos=0: 1.68 ( 13.64%) 1.95
+align=15, pos=15, len=14, seek_char=0, invert_pos=0: 1.68 ( 13.59%) 1.95
+align=32768, pos=15, len=16, seek_char=23, invert_pos=0: 1.04 ( 37.80%) 1.66
+align=32768, pos=15, len=16, seek_char=0, invert_pos=0: 1.03 ( 38.12%) 1.67
+align=32783, pos=15, len=16, seek_char=23, invert_pos=0: 1.30 ( 31.44%) 1.90
+align=32783, pos=15, len=16, seek_char=0, invert_pos=0: 1.30 ( 31.06%) 1.89
+align=32768, pos=15, len=14, seek_char=23, invert_pos=0: 1.68 ( 0.81%) 1.70
+align=32768, pos=15, len=14, seek_char=0, invert_pos=0: 1.43 ( 15.83%) 1.70
+align=32783, pos=15, len=14, seek_char=23, invert_pos=0: 1.68 ( 13.66%) 1.95
+align=32783, pos=15, len=14, seek_char=0, invert_pos=0: 1.68 ( 13.71%) 1.95
+align=65521, pos=15, len=14, seek_char=23, invert_pos=0: 1.43 ( 15.83%) 1.70
+align=65521, pos=15, len=14, seek_char=0, invert_pos=0: 1.43 ( 31.07%) 2.07
+align=65521, pos=15, len=16, seek_char=23, invert_pos=0: 1.30 ( 31.04%) 1.89
+align=65521, pos=15, len=16, seek_char=0, invert_pos=0: 1.30 ( 31.05%) 1.89
+align=0, pos=16, len=17, seek_char=23, invert_pos=0: 1.30 ( 30.99%) 1.89
+align=0, pos=16, len=17, seek_char=0, invert_pos=0: 1.30 ( 31.48%) 1.90
+align=16, pos=16, len=17, seek_char=23, invert_pos=0: 1.30 ( 31.02%) 1.89
+align=16, pos=16, len=17, seek_char=0, invert_pos=0: 1.30 ( 31.07%) 1.89
+align=0, pos=16, len=15, seek_char=23, invert_pos=0: 1.68 ( 0.70%) 1.70
+align=0, pos=16, len=15, seek_char=0, invert_pos=0: 1.43 ( 15.76%) 1.69
+align=16, pos=16, len=15, seek_char=23, invert_pos=0: 1.43 ( 15.82%) 1.70
+align=16, pos=16, len=15, seek_char=0, invert_pos=0: 1.43 ( 15.78%) 1.70
+align=32768, pos=16, len=17, seek_char=23, invert_pos=0: 1.30 ( 31.44%) 1.90
+align=32768, pos=16, len=17, seek_char=0, invert_pos=0: 1.30 ( 31.04%) 1.89
+align=32784, pos=16, len=17, seek_char=23, invert_pos=0: 1.30 ( 31.00%) 1.89
+align=32784, pos=16, len=17, seek_char=0, invert_pos=0: 1.30 ( 31.01%) 1.89
+align=32768, pos=16, len=15, seek_char=23, invert_pos=0: 1.43 ( 15.83%) 1.70
+align=32768, pos=16, len=15, seek_char=0, invert_pos=0: 1.43 ( 15.86%) 1.70
+align=32784, pos=16, len=15, seek_char=23, invert_pos=0: 1.43 ( 15.77%) 1.70
+align=32784, pos=16, len=15, seek_char=0, invert_pos=0: 1.43 ( 15.87%) 1.70
+align=65521, pos=16, len=15, seek_char=23, invert_pos=0: 1.42 (-10.93%) 1.28
+align=65521, pos=16, len=15, seek_char=0, invert_pos=0: 1.43 ( -5.51%) 1.35
+align=65521, pos=16, len=17, seek_char=23, invert_pos=0: 1.30 ( 32.30%) 1.92
+align=65521, pos=16, len=17, seek_char=0, invert_pos=0: 1.30 ( 32.57%) 1.93
+align=0, pos=17, len=18, seek_char=23, invert_pos=0: 1.30 ( 32.57%) 1.93
+align=0, pos=17, len=18, seek_char=0, invert_pos=0: 1.30 ( 32.56%) 1.93
+align=17, pos=17, len=18, seek_char=23, invert_pos=0: 1.30 ( 32.58%) 1.93
+align=17, pos=17, len=18, seek_char=0, invert_pos=0: 1.30 ( 32.56%) 1.93
+align=0, pos=17, len=16, seek_char=23, invert_pos=0: 1.43 ( 14.46%) 1.67
+align=0, pos=17, len=16, seek_char=0, invert_pos=0: 1.43 ( 0.01%) 1.43
+align=17, pos=17, len=16, seek_char=23, invert_pos=0: 1.68 ( 13.66%) 1.95
+align=17, pos=17, len=16, seek_char=0, invert_pos=0: 1.68 ( 13.66%) 1.95
+align=32768, pos=17, len=18, seek_char=23, invert_pos=0: 1.30 ( 31.02%) 1.89
+align=32768, pos=17, len=18, seek_char=0, invert_pos=0: 1.30 ( 31.01%) 1.89
+align=32785, pos=17, len=18, seek_char=23, invert_pos=0: 1.30 ( 40.75%) 2.20
+align=32785, pos=17, len=18, seek_char=0, invert_pos=0: 1.30 ( 30.98%) 1.89
+align=32768, pos=17, len=16, seek_char=23, invert_pos=0: 1.43 ( 0.00%) 1.43
+align=32768, pos=17, len=16, seek_char=0, invert_pos=0: 1.43 ( 0.02%) 1.43
+align=32785, pos=17, len=16, seek_char=23, invert_pos=0: 1.68 ( 13.66%) 1.95
+align=32785, pos=17, len=16, seek_char=0, invert_pos=0: 1.68 ( 13.63%) 1.95
+align=65521, pos=17, len=16, seek_char=23, invert_pos=0: 1.68 ( 13.66%) 1.95
+align=65521, pos=17, len=16, seek_char=0, invert_pos=0: 1.68 ( 13.67%) 1.95
+align=65521, pos=17, len=18, seek_char=23, invert_pos=0: 1.30 ( 31.01%) 1.89
+align=65521, pos=17, len=18, seek_char=0, invert_pos=0: 1.30 ( 31.02%) 1.89
+align=0, pos=18, len=19, seek_char=23, invert_pos=0: 1.30 ( 31.06%) 1.89
+align=0, pos=18, len=19, seek_char=0, invert_pos=0: 1.30 ( 32.45%) 1.93
+align=18, pos=18, len=19, seek_char=23, invert_pos=0: 1.30 ( 31.07%) 1.89
+align=18, pos=18, len=19, seek_char=0, invert_pos=0: 1.30 ( 31.03%) 1.89
+align=0, pos=18, len=17, seek_char=23, invert_pos=0: 1.68 ( 13.65%) 1.95
+align=0, pos=18, len=17, seek_char=0, invert_pos=0: 1.68 ( 13.66%) 1.95
+align=18, pos=18, len=17, seek_char=23, invert_pos=0: 1.68 ( 13.63%) 1.95
+align=18, pos=18, len=17, seek_char=0, invert_pos=0: 1.68 ( 13.67%) 1.95
+align=32768, pos=18, len=19, seek_char=23, invert_pos=0: 1.30 ( 31.46%) 1.90
+align=32768, pos=18, len=19, seek_char=0, invert_pos=0: 1.30 ( 31.03%) 1.89
+align=32786, pos=18, len=19, seek_char=23, invert_pos=0: 1.30 ( 31.06%) 1.89
+align=32786, pos=18, len=19, seek_char=0, invert_pos=0: 1.30 ( 31.02%) 1.89
+align=32768, pos=18, len=17, seek_char=23, invert_pos=0: 1.68 ( 13.78%) 1.95
+align=32768, pos=18, len=17, seek_char=0, invert_pos=0: 1.68 ( 13.67%) 1.95
+align=32786, pos=18, len=17, seek_char=23, invert_pos=0: 1.68 ( 13.74%) 1.95
+align=32786, pos=18, len=17, seek_char=0, invert_pos=0: 1.68 ( 13.62%) 1.95
+align=65521, pos=18, len=17, seek_char=23, invert_pos=0: 1.68 ( 13.63%) 1.95
+align=65521, pos=18, len=17, seek_char=0, invert_pos=0: 1.68 ( 13.61%) 1.95
+align=65521, pos=18, len=19, seek_char=23, invert_pos=0: 1.30 ( 31.10%) 1.89
+align=65521, pos=18, len=19, seek_char=0, invert_pos=0: 1.30 ( 31.00%) 1.89
+align=0, pos=19, len=20, seek_char=23, invert_pos=0: 1.30 ( 31.42%) 1.90
+align=0, pos=19, len=20, seek_char=0, invert_pos=0: 1.30 ( 31.05%) 1.89
+align=19, pos=19, len=20, seek_char=23, invert_pos=0: 1.30 ( 31.02%) 1.89
+align=19, pos=19, len=20, seek_char=0, invert_pos=0: 1.30 ( 31.01%) 1.89
+align=0, pos=19, len=18, seek_char=23, invert_pos=0: 1.68 ( 13.62%) 1.95
+align=0, pos=19, len=18, seek_char=0, invert_pos=0: 1.68 ( 13.66%) 1.95
+align=19, pos=19, len=18, seek_char=23, invert_pos=0: 1.68 ( 13.60%) 1.95
+align=19, pos=19, len=18, seek_char=0, invert_pos=0: 1.68 ( 13.61%) 1.95
+align=32768, pos=19, len=20, seek_char=23, invert_pos=0: 1.30 ( 31.06%) 1.89
+align=32768, pos=19, len=20, seek_char=0, invert_pos=0: 1.30 ( 31.06%) 1.89
+align=32787, pos=19, len=20, seek_char=23, invert_pos=0: 1.30 ( 31.05%) 1.89
+align=32787, pos=19, len=20, seek_char=0, invert_pos=0: 1.30 ( 31.46%) 1.90
+align=32768, pos=19, len=18, seek_char=23, invert_pos=0: 1.68 ( 13.67%) 1.95
+align=32768, pos=19, len=18, seek_char=0, invert_pos=0: 1.68 ( 13.63%) 1.95
+align=32787, pos=19, len=18, seek_char=23, invert_pos=0: 1.68 ( 13.64%) 1.95
+align=32787, pos=19, len=18, seek_char=0, invert_pos=0: 1.68 ( 13.63%) 1.95
+align=65521, pos=19, len=18, seek_char=23, invert_pos=0: 1.68 ( 13.59%) 1.95
+align=65521, pos=19, len=18, seek_char=0, invert_pos=0: 1.68 ( 13.70%) 1.95
+align=65521, pos=19, len=20, seek_char=23, invert_pos=0: 1.30 ( 31.05%) 1.89
+align=65521, pos=19, len=20, seek_char=0, invert_pos=0: 1.30 ( 31.03%) 1.89
+align=0, pos=20, len=21, seek_char=23, invert_pos=0: 1.30 ( 31.42%) 1.90
+align=0, pos=20, len=21, seek_char=0, invert_pos=0: 1.30 ( 30.98%) 1.89
+align=20, pos=20, len=21, seek_char=23, invert_pos=0: 1.30 ( 39.89%) 2.17
+align=20, pos=20, len=21, seek_char=0, invert_pos=0: 1.30 ( 38.76%) 2.13
+align=0, pos=20, len=19, seek_char=23, invert_pos=0: 1.68 ( 13.72%) 1.95
+align=0, pos=20, len=19, seek_char=0, invert_pos=0: 1.68 ( 13.72%) 1.95
+align=20, pos=20, len=19, seek_char=23, invert_pos=0: 1.68 ( 13.71%) 1.95
+align=20, pos=20, len=19, seek_char=0, invert_pos=0: 1.68 ( 13.73%) 1.95
+align=32768, pos=20, len=21, seek_char=23, invert_pos=0: 1.30 ( 32.58%) 1.93
+align=32768, pos=20, len=21, seek_char=0, invert_pos=0: 1.30 ( 32.59%) 1.93
+align=32788, pos=20, len=21, seek_char=23, invert_pos=0: 1.30 ( 39.87%) 2.17
+align=32788, pos=20, len=21, seek_char=0, invert_pos=0: 1.30 ( 38.76%) 2.13
+align=32768, pos=20, len=19, seek_char=23, invert_pos=0: 1.67 ( 14.31%) 1.95
+align=32768, pos=20, len=19, seek_char=0, invert_pos=0: 1.68 ( 13.60%) 1.95
+align=32788, pos=20, len=19, seek_char=23, invert_pos=0: 1.68 ( 13.69%) 1.95
+align=32788, pos=20, len=19, seek_char=0, invert_pos=0: 1.68 ( 13.62%) 1.95
+align=65521, pos=20, len=19, seek_char=23, invert_pos=0: 1.68 ( 13.71%) 1.95
+align=65521, pos=20, len=19, seek_char=0, invert_pos=0: 1.68 ( 13.71%) 1.95
+align=65521, pos=20, len=21, seek_char=23, invert_pos=0: 1.30 ( 32.60%) 1.93
+align=65521, pos=20, len=21, seek_char=0, invert_pos=0: 1.30 ( 32.56%) 1.93
+align=0, pos=21, len=22, seek_char=23, invert_pos=0: 1.30 ( 32.59%) 1.93
+align=0, pos=21, len=22, seek_char=0, invert_pos=0: 1.30 ( 32.57%) 1.93
+align=21, pos=21, len=22, seek_char=23, invert_pos=0: 1.30 ( 38.49%) 2.12
+align=21, pos=21, len=22, seek_char=0, invert_pos=0: 1.30 ( 38.44%) 2.12
+align=0, pos=21, len=20, seek_char=23, invert_pos=0: 1.68 ( 13.75%) 1.95
+align=0, pos=21, len=20, seek_char=0, invert_pos=0: 1.68 ( 13.58%) 1.95
+align=21, pos=21, len=20, seek_char=23, invert_pos=0: 1.68 ( 22.76%) 2.18
+align=21, pos=21, len=20, seek_char=0, invert_pos=0: 1.68 ( 22.74%) 2.18
+align=32768, pos=21, len=22, seek_char=23, invert_pos=0: 1.30 ( 32.59%) 1.93
+align=32768, pos=21, len=22, seek_char=0, invert_pos=0: 1.30 ( 32.56%) 1.93
+align=32789, pos=21, len=22, seek_char=23, invert_pos=0: 1.30 ( 38.49%) 2.12
+align=32789, pos=21, len=22, seek_char=0, invert_pos=0: 1.30 ( 39.87%) 2.17
+align=32768, pos=21, len=20, seek_char=23, invert_pos=0: 1.68 ( 13.77%) 1.95
+align=32768, pos=21, len=20, seek_char=0, invert_pos=0: 1.68 ( 13.66%) 1.95
+align=32789, pos=21, len=20, seek_char=23, invert_pos=0: 1.68 ( 22.76%) 2.18
+align=32789, pos=21, len=20, seek_char=0, invert_pos=0: 1.68 ( 22.78%) 2.18
+align=65521, pos=21, len=20, seek_char=23, invert_pos=0: 1.68 ( 13.70%) 1.95
+align=65521, pos=21, len=20, seek_char=0, invert_pos=0: 1.68 ( 13.70%) 1.95
+align=65521, pos=21, len=22, seek_char=23, invert_pos=0: 1.30 ( 32.58%) 1.93
+align=65521, pos=21, len=22, seek_char=0, invert_pos=0: 1.30 ( 32.56%) 1.93
+align=0, pos=22, len=23, seek_char=23, invert_pos=0: 1.30 ( 32.56%) 1.93
+align=0, pos=22, len=23, seek_char=0, invert_pos=0: 1.30 ( 32.57%) 1.93
+align=22, pos=22, len=23, seek_char=23, invert_pos=0: 1.36 ( 35.96%) 2.12
+align=22, pos=22, len=23, seek_char=0, invert_pos=0: 1.30 ( 43.38%) 2.30
+align=0, pos=22, len=21, seek_char=23, invert_pos=0: 1.68 ( 13.59%) 1.95
+align=0, pos=22, len=21, seek_char=0, invert_pos=0: 1.48 ( 24.16%) 1.95
+align=22, pos=22, len=21, seek_char=23, invert_pos=0: 1.48 ( 32.12%) 2.18
+align=22, pos=22, len=21, seek_char=0, invert_pos=0: 1.48 ( 32.13%) 2.18
+align=32768, pos=22, len=23, seek_char=23, invert_pos=0: 1.30 ( 32.59%) 1.93
+align=32768, pos=22, len=23, seek_char=0, invert_pos=0: 1.30 ( 32.57%) 1.93
+align=32790, pos=22, len=23, seek_char=23, invert_pos=0: 1.30 ( 38.39%) 2.11
+align=32790, pos=22, len=23, seek_char=0, invert_pos=0: 1.30 ( 38.53%) 2.12
+align=32768, pos=22, len=21, seek_char=23, invert_pos=0: 1.68 ( 13.70%) 1.95
+align=32768, pos=22, len=21, seek_char=0, invert_pos=0: 1.48 ( 24.20%) 1.95
+align=32790, pos=22, len=21, seek_char=23, invert_pos=0: 1.48 ( 32.19%) 2.18
+align=32790, pos=22, len=21, seek_char=0, invert_pos=0: 1.48 ( 32.14%) 2.18
+align=65521, pos=22, len=21, seek_char=23, invert_pos=0: 1.48 ( 24.14%) 1.95
+align=65521, pos=22, len=21, seek_char=0, invert_pos=0: 1.48 ( 24.15%) 1.95
+align=65521, pos=22, len=23, seek_char=23, invert_pos=0: 1.30 ( 32.58%) 1.93
+align=65521, pos=22, len=23, seek_char=0, invert_pos=0: 1.30 ( 32.60%) 1.93
+align=0, pos=23, len=24, seek_char=23, invert_pos=0: 1.30 ( 32.59%) 1.93
+align=0, pos=23, len=24, seek_char=0, invert_pos=0: 1.30 ( 32.56%) 1.93
+align=23, pos=23, len=24, seek_char=23, invert_pos=0: 1.30 ( 38.42%) 2.12
+align=23, pos=23, len=24, seek_char=0, invert_pos=0: 1.30 ( 38.43%) 2.12
+align=0, pos=23, len=22, seek_char=23, invert_pos=0: 1.68 ( 13.64%) 1.95
+align=0, pos=23, len=22, seek_char=0, invert_pos=0: 1.48 ( 24.15%) 1.95
+align=23, pos=23, len=22, seek_char=23, invert_pos=0: 1.48 ( 32.12%) 2.18
+align=23, pos=23, len=22, seek_char=0, invert_pos=0: 1.48 ( 32.12%) 2.18
+align=32768, pos=23, len=24, seek_char=23, invert_pos=0: 1.30 ( 32.59%) 1.93
+align=32768, pos=23, len=24, seek_char=0, invert_pos=0: 1.30 ( 32.56%) 1.93
+align=32791, pos=23, len=24, seek_char=23, invert_pos=0: 1.30 ( 38.78%) 2.13
+align=32791, pos=23, len=24, seek_char=0, invert_pos=0: 1.30 ( 38.51%) 2.12
+align=32768, pos=23, len=22, seek_char=23, invert_pos=0: 1.68 ( 13.66%) 1.95
+align=32768, pos=23, len=22, seek_char=0, invert_pos=0: 1.48 ( 24.12%) 1.95
+align=32791, pos=23, len=22, seek_char=23, invert_pos=0: 1.48 ( 32.18%) 2.18
+align=32791, pos=23, len=22, seek_char=0, invert_pos=0: 1.48 ( 32.12%) 2.18
+align=65521, pos=23, len=22, seek_char=23, invert_pos=0: 1.48 ( 24.09%) 1.95
+align=65521, pos=23, len=22, seek_char=0, invert_pos=0: 1.48 ( 24.10%) 1.95
+align=65521, pos=23, len=24, seek_char=23, invert_pos=0: 1.30 ( 39.72%) 2.16
+align=65521, pos=23, len=24, seek_char=0, invert_pos=0: 1.30 ( 38.44%) 2.12
+align=0, pos=24, len=25, seek_char=23, invert_pos=0: 1.30 ( 38.43%) 2.12
+align=0, pos=24, len=25, seek_char=0, invert_pos=0: 1.30 ( 38.46%) 2.12
+align=24, pos=24, len=25, seek_char=23, invert_pos=0: 1.47 ( 30.35%) 2.12
+align=24, pos=24, len=25, seek_char=0, invert_pos=0: 1.48 ( 30.15%) 2.12
+align=0, pos=24, len=23, seek_char=23, invert_pos=0: 1.92 ( 1.88%) 1.95
+align=0, pos=24, len=23, seek_char=0, invert_pos=0: 1.48 ( 24.10%) 1.95
+align=24, pos=24, len=23, seek_char=23, invert_pos=0: 1.48 ( 24.13%) 1.95
+align=24, pos=24, len=23, seek_char=0, invert_pos=0: 1.48 ( 24.12%) 1.95
+align=32768, pos=24, len=25, seek_char=23, invert_pos=0: 1.30 ( 38.75%) 2.13
+align=32768, pos=24, len=25, seek_char=0, invert_pos=0: 1.30 ( 38.47%) 2.12
+align=32792, pos=24, len=25, seek_char=23, invert_pos=0: 1.48 ( 30.18%) 2.12
+align=32792, pos=24, len=25, seek_char=0, invert_pos=0: 1.48 ( 30.17%) 2.12
+align=32768, pos=24, len=23, seek_char=23, invert_pos=0: 1.92 ( 1.74%) 1.95
+align=32768, pos=24, len=23, seek_char=0, invert_pos=0: 1.68 ( 13.63%) 1.95
+align=32792, pos=24, len=23, seek_char=23, invert_pos=0: 1.68 ( 13.65%) 1.95
+align=32792, pos=24, len=23, seek_char=0, invert_pos=0: 1.68 ( 13.60%) 1.95
+align=65521, pos=24, len=23, seek_char=23, invert_pos=0: 1.68 ( -0.77%) 1.67
+align=65521, pos=24, len=23, seek_char=0, invert_pos=0: 1.68 ( -0.88%) 1.67
+align=65521, pos=24, len=25, seek_char=23, invert_pos=0: 1.30 ( 39.81%) 2.16
+align=65521, pos=24, len=25, seek_char=0, invert_pos=0: 1.30 ( 38.44%) 2.12
+align=0, pos=25, len=26, seek_char=23, invert_pos=0: 1.30 ( 38.48%) 2.12
+align=0, pos=25, len=26, seek_char=0, invert_pos=0: 1.30 ( 39.80%) 2.16
+align=25, pos=25, len=26, seek_char=23, invert_pos=0: 1.48 ( 30.07%) 2.11
+align=25, pos=25, len=26, seek_char=0, invert_pos=0: 1.48 ( 30.15%) 2.12
+align=0, pos=25, len=24, seek_char=23, invert_pos=0: 1.68 (-10.34%) 1.53
+align=0, pos=25, len=24, seek_char=0, invert_pos=0: 1.68 (-10.29%) 1.53
+align=25, pos=25, len=24, seek_char=23, invert_pos=0: 1.43 ( 34.64%) 2.18
+align=25, pos=25, len=24, seek_char=0, invert_pos=0: 1.55 ( 28.81%) 2.18
+align=32768, pos=25, len=26, seek_char=23, invert_pos=0: 1.30 ( 39.84%) 2.17
+align=32768, pos=25, len=26, seek_char=0, invert_pos=0: 1.30 ( 38.74%) 2.13
+align=32793, pos=25, len=26, seek_char=23, invert_pos=0: 1.48 ( 30.05%) 2.12
+align=32793, pos=25, len=26, seek_char=0, invert_pos=0: 1.48 ( 30.44%) 2.13
+align=32768, pos=25, len=24, seek_char=23, invert_pos=0: 1.95 (-16.97%) 1.67
+align=32768, pos=25, len=24, seek_char=0, invert_pos=0: 1.95 (-17.01%) 1.67
+align=32793, pos=25, len=24, seek_char=23, invert_pos=0: 1.55 ( 28.82%) 2.18
+align=32793, pos=25, len=24, seek_char=0, invert_pos=0: 1.55 ( 28.85%) 2.18
+align=65521, pos=25, len=24, seek_char=23, invert_pos=0: 1.95 ( 10.38%) 2.18
+align=65521, pos=25, len=24, seek_char=0, invert_pos=0: 1.95 ( 10.40%) 2.18
+align=65521, pos=25, len=26, seek_char=23, invert_pos=0: 1.30 ( 39.83%) 2.16
+align=65521, pos=25, len=26, seek_char=0, invert_pos=0: 1.30 ( 38.48%) 2.12
+align=0, pos=26, len=27, seek_char=23, invert_pos=0: 1.30 ( 39.84%) 2.16
+align=0, pos=26, len=27, seek_char=0, invert_pos=0: 1.30 ( 38.48%) 2.12
+align=26, pos=26, len=27, seek_char=23, invert_pos=0: 1.48 ( 31.64%) 2.16
+align=26, pos=26, len=27, seek_char=0, invert_pos=0: 1.48 ( 30.15%) 2.12
+align=0, pos=26, len=25, seek_char=23, invert_pos=0: 1.95 ( 10.40%) 2.18
+align=0, pos=26, len=25, seek_char=0, invert_pos=0: 1.95 ( 10.39%) 2.18
+align=26, pos=26, len=25, seek_char=23, invert_pos=0: 1.55 ( 28.81%) 2.18
+align=26, pos=26, len=25, seek_char=0, invert_pos=0: 1.55 ( 28.85%) 2.18
+align=32768, pos=26, len=27, seek_char=23, invert_pos=0: 1.30 ( 38.52%) 2.12
+align=32768, pos=26, len=27, seek_char=0, invert_pos=0: 1.30 ( 38.79%) 2.13
+align=32794, pos=26, len=27, seek_char=23, invert_pos=0: 1.48 ( 30.05%) 2.12
+align=32794, pos=26, len=27, seek_char=0, invert_pos=0: 1.48 ( 30.22%) 2.12
+align=32768, pos=26, len=25, seek_char=23, invert_pos=0: 1.95 ( 10.41%) 2.18
+align=32768, pos=26, len=25, seek_char=0, invert_pos=0: 1.68 ( 22.75%) 2.18
+align=32794, pos=26, len=25, seek_char=23, invert_pos=0: 1.55 ( 28.80%) 2.18
+align=32794, pos=26, len=25, seek_char=0, invert_pos=0: 1.63 ( 25.30%) 2.18
+align=65521, pos=26, len=25, seek_char=23, invert_pos=0: 1.95 ( 10.40%) 2.18
+align=65521, pos=26, len=25, seek_char=0, invert_pos=0: 1.68 ( 22.70%) 2.18
+align=65521, pos=26, len=27, seek_char=23, invert_pos=0: 1.30 ( 38.47%) 2.12
+align=65521, pos=26, len=27, seek_char=0, invert_pos=0: 1.30 ( 38.76%) 2.13
+align=0, pos=27, len=28, seek_char=23, invert_pos=0: 1.30 ( 38.54%) 2.12
+align=0, pos=27, len=28, seek_char=0, invert_pos=0: 1.30 ( 38.50%) 2.12
+align=27, pos=27, len=28, seek_char=23, invert_pos=0: 1.48 ( 31.64%) 2.16
+align=27, pos=27, len=28, seek_char=0, invert_pos=0: 1.48 ( 30.11%) 2.12
+align=0, pos=27, len=26, seek_char=23, invert_pos=0: 1.95 ( 10.44%) 2.18
+align=0, pos=27, len=26, seek_char=0, invert_pos=0: 1.68 ( 22.67%) 2.18
+align=27, pos=27, len=26, seek_char=23, invert_pos=0: 1.55 ( 28.84%) 2.18
+align=27, pos=27, len=26, seek_char=0, invert_pos=0: 1.55 ( 28.81%) 2.18
+align=32768, pos=27, len=28, seek_char=23, invert_pos=0: 1.55 ( 26.73%) 2.12
+align=32768, pos=27, len=28, seek_char=0, invert_pos=0: 1.55 ( 26.73%) 2.12
+align=32795, pos=27, len=28, seek_char=23, invert_pos=0: 1.48 ( 30.16%) 2.12
+align=32795, pos=27, len=28, seek_char=0, invert_pos=0: 1.48 ( 31.67%) 2.16
+align=32768, pos=27, len=26, seek_char=23, invert_pos=0: 1.95 ( 10.48%) 2.18
+align=32768, pos=27, len=26, seek_char=0, invert_pos=0: 1.68 ( 22.73%) 2.18
+align=32795, pos=27, len=26, seek_char=23, invert_pos=0: 1.81 ( 17.05%) 2.18
+align=32795, pos=27, len=26, seek_char=0, invert_pos=0: 1.55 ( 28.88%) 2.18
+align=65521, pos=27, len=26, seek_char=23, invert_pos=0: 1.95 ( 10.40%) 2.18
+align=65521, pos=27, len=26, seek_char=0, invert_pos=0: 1.95 ( 10.38%) 2.18
+align=65521, pos=27, len=28, seek_char=23, invert_pos=0: 1.55 ( 26.81%) 2.12
+align=65521, pos=27, len=28, seek_char=0, invert_pos=0: 1.55 ( 26.82%) 2.12
+align=0, pos=28, len=29, seek_char=23, invert_pos=0: 1.55 ( 26.66%) 2.12
+align=0, pos=28, len=29, seek_char=0, invert_pos=0: 1.55 ( 26.80%) 2.12
+align=28, pos=28, len=29, seek_char=23, invert_pos=0: 1.48 ( 36.36%) 2.32
+align=28, pos=28, len=29, seek_char=0, invert_pos=0: 1.48 ( 36.71%) 2.34
+align=0, pos=28, len=27, seek_char=23, invert_pos=0: 1.95 ( 10.38%) 2.18
+align=0, pos=28, len=27, seek_char=0, invert_pos=0: 1.95 ( 10.44%) 2.18
+align=28, pos=28, len=27, seek_char=23, invert_pos=0: 1.81 ( 17.03%) 2.18
+align=28, pos=28, len=27, seek_char=0, invert_pos=0: 1.55 ( 28.85%) 2.18
+align=32768, pos=28, len=29, seek_char=23, invert_pos=0: 1.55 ( 26.82%) 2.12
+align=32768, pos=28, len=29, seek_char=0, invert_pos=0: 1.55 ( 28.49%) 2.17
+align=32796, pos=28, len=29, seek_char=23, invert_pos=0: 1.48 ( 36.25%) 2.32
+align=32796, pos=28, len=29, seek_char=0, invert_pos=0: 1.48 ( 36.28%) 2.32
+align=32768, pos=28, len=27, seek_char=23, invert_pos=0: 1.95 ( 10.37%) 2.18
+align=32768, pos=28, len=27, seek_char=0, invert_pos=0: 1.68 ( 22.75%) 2.18
+align=32796, pos=28, len=27, seek_char=23, invert_pos=0: 1.81 ( 17.02%) 2.18
+align=32796, pos=28, len=27, seek_char=0, invert_pos=0: 1.55 ( 28.87%) 2.18
+align=65521, pos=28, len=27, seek_char=23, invert_pos=0: 1.95 ( 10.44%) 2.18
+align=65521, pos=28, len=27, seek_char=0, invert_pos=0: 1.68 ( 22.78%) 2.18
+align=65521, pos=28, len=29, seek_char=23, invert_pos=0: 1.55 ( 26.81%) 2.12
+align=65521, pos=28, len=29, seek_char=0, invert_pos=0: 1.55 ( 26.76%) 2.12
+align=0, pos=29, len=30, seek_char=23, invert_pos=0: 1.30 ( 38.50%) 2.12
+align=0, pos=29, len=30, seek_char=0, invert_pos=0: 1.30 ( 38.43%) 2.12
+align=29, pos=29, len=30, seek_char=23, invert_pos=0: 1.48 ( 36.26%) 2.32
+align=29, pos=29, len=30, seek_char=0, invert_pos=0: 1.48 ( 36.28%) 2.32
+align=0, pos=29, len=28, seek_char=23, invert_pos=0: 1.95 ( 10.42%) 2.18
+align=0, pos=29, len=28, seek_char=0, invert_pos=0: 1.68 ( 22.77%) 2.18
+align=29, pos=29, len=28, seek_char=23, invert_pos=0: 1.81 ( 24.20%) 2.39
+align=29, pos=29, len=28, seek_char=0, invert_pos=0: 1.55 ( 34.98%) 2.38
+align=32768, pos=29, len=30, seek_char=23, invert_pos=0: 1.55 ( 28.48%) 2.17
+align=32768, pos=29, len=30, seek_char=0, invert_pos=0: 1.55 ( 26.80%) 2.12
+align=32797, pos=29, len=30, seek_char=23, invert_pos=0: 1.48 ( 36.83%) 2.34
+align=32797, pos=29, len=30, seek_char=0, invert_pos=0: 1.48 ( 36.26%) 2.32
+align=32768, pos=29, len=28, seek_char=23, invert_pos=0: 1.95 ( 10.44%) 2.18
+align=32768, pos=29, len=28, seek_char=0, invert_pos=0: 1.68 ( 22.75%) 2.18
+align=32797, pos=29, len=28, seek_char=23, invert_pos=0: 1.81 ( 24.16%) 2.39
+align=32797, pos=29, len=28, seek_char=0, invert_pos=0: 1.55 ( 35.00%) 2.39
+align=65521, pos=29, len=28, seek_char=23, invert_pos=0: 1.95 ( 10.47%) 2.18
+align=65521, pos=29, len=28, seek_char=0, invert_pos=0: 1.95 ( 10.39%) 2.18
+align=65521, pos=29, len=30, seek_char=23, invert_pos=0: 1.55 ( 26.78%) 2.12
+align=65521, pos=29, len=30, seek_char=0, invert_pos=0: 1.30 ( 38.53%) 2.12
+align=0, pos=30, len=31, seek_char=23, invert_pos=0: 1.55 ( 26.75%) 2.12
+align=0, pos=30, len=31, seek_char=0, invert_pos=0: 1.55 ( 28.43%) 2.17
+align=30, pos=30, len=31, seek_char=23, invert_pos=0: 1.48 ( 36.26%) 2.32
+align=30, pos=30, len=31, seek_char=0, invert_pos=0: 1.48 ( 36.32%) 2.32
+align=0, pos=30, len=29, seek_char=23, invert_pos=0: 1.95 ( 10.42%) 2.18
+align=0, pos=30, len=29, seek_char=0, invert_pos=0: 1.68 ( 22.69%) 2.18
+align=30, pos=30, len=29, seek_char=23, invert_pos=0: 1.81 ( 24.25%) 2.39
+align=30, pos=30, len=29, seek_char=0, invert_pos=0: 1.55 ( 35.08%) 2.39
+align=32768, pos=30, len=31, seek_char=23, invert_pos=0: 1.55 ( 26.69%) 2.12
+align=32768, pos=30, len=31, seek_char=0, invert_pos=0: 1.55 ( 26.75%) 2.12
+align=32798, pos=30, len=31, seek_char=23, invert_pos=0: 1.48 ( 36.31%) 2.32
+align=32798, pos=30, len=31, seek_char=0, invert_pos=0: 1.48 ( 36.32%) 2.32
+align=32768, pos=30, len=29, seek_char=23, invert_pos=0: 1.95 ( 10.37%) 2.18
+align=32768, pos=30, len=29, seek_char=0, invert_pos=0: 1.68 ( 22.73%) 2.18
+align=32798, pos=30, len=29, seek_char=23, invert_pos=0: 1.81 ( 24.24%) 2.39
+align=32798, pos=30, len=29, seek_char=0, invert_pos=0: 1.55 ( 35.00%) 2.39
+align=65521, pos=30, len=29, seek_char=23, invert_pos=0: 1.95 ( 10.39%) 2.18
+align=65521, pos=30, len=29, seek_char=0, invert_pos=0: 1.68 ( 22.72%) 2.18
+align=65521, pos=30, len=31, seek_char=23, invert_pos=0: 1.55 ( 28.34%) 2.16
+align=65521, pos=30, len=31, seek_char=0, invert_pos=0: 1.55 ( 28.35%) 2.16
+align=0, pos=31, len=32, seek_char=23, invert_pos=0: 1.55 ( 26.81%) 2.12
+align=0, pos=31, len=32, seek_char=0, invert_pos=0: 1.55 ( 26.75%) 2.12
+align=31, pos=31, len=32, seek_char=23, invert_pos=0: 1.48 ( 36.27%) 2.32
+align=31, pos=31, len=32, seek_char=0, invert_pos=0: 1.48 ( 36.29%) 2.32
+align=0, pos=31, len=30, seek_char=23, invert_pos=0: 1.95 ( 10.41%) 2.18
+align=0, pos=31, len=30, seek_char=0, invert_pos=0: 1.68 ( 22.78%) 2.18
+align=31, pos=31, len=30, seek_char=23, invert_pos=0: 1.55 ( 35.05%) 2.39
+align=31, pos=31, len=30, seek_char=0, invert_pos=0: 1.55 ( 35.03%) 2.39
+align=32768, pos=31, len=32, seek_char=23, invert_pos=0: 1.55 ( 26.78%) 2.12
+align=32768, pos=31, len=32, seek_char=0, invert_pos=0: 1.55 ( 26.80%) 2.12
+align=32799, pos=31, len=32, seek_char=23, invert_pos=0: 1.48 ( 36.24%) 2.32
+align=32799, pos=31, len=32, seek_char=0, invert_pos=0: 1.48 ( 36.37%) 2.32
+align=32768, pos=31, len=30, seek_char=23, invert_pos=0: 1.95 ( 10.47%) 2.18
+align=32768, pos=31, len=30, seek_char=0, invert_pos=0: 1.68 ( 22.69%) 2.18
+align=32799, pos=31, len=30, seek_char=23, invert_pos=0: 1.81 ( 24.25%) 2.39
+align=32799, pos=31, len=30, seek_char=0, invert_pos=0: 1.55 ( 35.04%) 2.39
+align=65521, pos=31, len=30, seek_char=23, invert_pos=0: 1.95 ( 10.40%) 2.18
+align=65521, pos=31, len=30, seek_char=0, invert_pos=0: 1.95 ( 10.43%) 2.18
+align=65521, pos=31, len=32, seek_char=23, invert_pos=0: 1.48 ( 37.27%) 2.36
+align=65521, pos=31, len=32, seek_char=0, invert_pos=0: 1.49 ( 36.67%) 2.36
+align=0, pos=16, len=16, seek_char=23, invert_pos=0: 1.16 ( 18.59%) 1.43
+align=0, pos=16, len=16, seek_char=23, invert_pos=0: 1.16 ( 18.58%) 1.43
+align=0, pos=16, len=16, seek_char=23, invert_pos=0: 1.16 ( 18.54%) 1.43
+align=0, pos=16, len=16, seek_char=23, invert_pos=0: 1.16 ( 18.50%) 1.43
+align=0, pos=48, len=16, seek_char=23, invert_pos=0: 1.16 ( 18.55%) 1.43
+align=0, pos=16, len=48, seek_char=23, invert_pos=0: 1.81 ( 3.14%) 1.87
+align=0, pos=80, len=16, seek_char=23, invert_pos=0: 1.43 (-11.95%) 1.28
+align=0, pos=16, len=80, seek_char=23, invert_pos=0: 1.30 ( 47.16%) 2.46
+align=0, pos=112, len=16, seek_char=23, invert_pos=0: 1.43 ( -0.00%) 1.43
+align=0, pos=16, len=112, seek_char=23, invert_pos=0: 1.55 ( 37.06%) 2.46
+align=0, pos=144, len=16, seek_char=23, invert_pos=0: 1.43 ( 0.02%) 1.43
+align=0, pos=16, len=144, seek_char=23, invert_pos=0: 1.55 ( 37.09%) 2.46
+align=0, pos=176, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.16%) 1.68
+align=0, pos=16, len=176, seek_char=23, invert_pos=0: 1.55 ( 37.06%) 2.46
+align=0, pos=208, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.23%) 1.68
+align=0, pos=16, len=208, seek_char=23, invert_pos=0: 1.55 ( 37.08%) 2.46
+align=0, pos=240, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.20%) 1.68
+align=0, pos=16, len=240, seek_char=23, invert_pos=0: 1.55 ( 37.04%) 2.46
+align=0, pos=272, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.16%) 1.68
+align=0, pos=16, len=272, seek_char=23, invert_pos=0: 1.55 ( 37.00%) 2.46
+align=0, pos=304, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.23%) 1.68
+align=0, pos=16, len=304, seek_char=23, invert_pos=0: 1.55 ( 37.08%) 2.47
+align=0, pos=336, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.20%) 1.68
+align=0, pos=16, len=336, seek_char=23, invert_pos=0: 1.55 ( 37.09%) 2.46
+align=0, pos=368, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.18%) 1.68
+align=0, pos=16, len=368, seek_char=23, invert_pos=0: 1.55 ( 37.07%) 2.46
+align=0, pos=400, len=16, seek_char=23, invert_pos=0: 1.43 ( 15.19%) 1.68
+align=0, pos=16, len=400, seek_char=23, invert_pos=0: 1.30 ( 47.05%) 2.46
+align=0, pos=32, len=32, seek_char=23, invert_pos=0: 1.30 ( 29.29%) 1.84
+align=0, pos=32, len=32, seek_char=23, invert_pos=0: 1.30 ( 27.90%) 1.81
+align=0, pos=32, len=32, seek_char=23, invert_pos=0: 1.30 ( 29.32%) 1.84
+align=0, pos=32, len=32, seek_char=23, invert_pos=0: 1.30 ( 27.94%) 1.81
+align=0, pos=64, len=32, seek_char=23, invert_pos=0: 1.30 ( 29.38%) 1.84
+align=0, pos=32, len=64, seek_char=23, invert_pos=0: 1.48 ( 28.84%) 2.08
+align=0, pos=96, len=32, seek_char=23, invert_pos=0: 1.55 ( 14.12%) 1.81
+align=0, pos=32, len=96, seek_char=23, invert_pos=0: 1.48 ( 40.07%) 2.47
+align=0, pos=128, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.86%) 1.84
+align=0, pos=32, len=128, seek_char=23, invert_pos=0: 1.48 ( 40.03%) 2.46
+align=0, pos=160, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.83%) 1.84
+align=0, pos=32, len=160, seek_char=23, invert_pos=0: 1.48 ( 39.96%) 2.46
+align=0, pos=192, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.86%) 1.84
+align=0, pos=32, len=192, seek_char=23, invert_pos=0: 1.48 ( 39.99%) 2.46
+align=0, pos=224, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.79%) 1.84
+align=0, pos=32, len=224, seek_char=23, invert_pos=0: 1.48 ( 39.97%) 2.46
+align=0, pos=256, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.83%) 1.84
+align=0, pos=32, len=256, seek_char=23, invert_pos=0: 1.48 ( 40.01%) 2.46
+align=0, pos=288, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.81%) 1.84
+align=0, pos=32, len=288, seek_char=23, invert_pos=0: 1.48 ( 39.92%) 2.46
+align=0, pos=320, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.92%) 1.84
+align=0, pos=32, len=320, seek_char=23, invert_pos=0: 1.48 ( 40.00%) 2.46
+align=0, pos=352, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.83%) 1.84
+align=0, pos=32, len=352, seek_char=23, invert_pos=0: 1.48 ( 39.91%) 2.46
+align=0, pos=384, len=32, seek_char=23, invert_pos=0: 1.55 ( 14.21%) 1.81
+align=0, pos=32, len=384, seek_char=23, invert_pos=0: 1.48 ( 39.96%) 2.46
+align=0, pos=416, len=32, seek_char=23, invert_pos=0: 1.55 ( 14.15%) 1.81
+align=0, pos=32, len=416, seek_char=23, invert_pos=0: 1.48 ( 39.98%) 2.46
+align=0, pos=64, len=64, seek_char=23, invert_pos=0: 1.67 ( 16.52%) 2.00
+align=0, pos=64, len=64, seek_char=23, invert_pos=0: 1.67 ( 15.56%) 1.98
+align=0, pos=64, len=64, seek_char=23, invert_pos=0: 1.67 ( 15.63%) 1.98
+align=0, pos=64, len=64, seek_char=23, invert_pos=0: 1.67 ( 15.64%) 1.98
+align=0, pos=96, len=64, seek_char=23, invert_pos=0: 1.67 ( 16.53%) 2.00
+align=0, pos=64, len=96, seek_char=23, invert_pos=0: 1.93 ( 21.57%) 2.46
+align=0, pos=32, len=64, seek_char=23, invert_pos=0: 1.48 ( 30.31%) 2.12
+align=0, pos=64, len=32, seek_char=23, invert_pos=0: 1.55 ( 15.89%) 1.84
+align=0, pos=128, len=64, seek_char=23, invert_pos=0: 1.67 ( 15.57%) 1.98
+align=0, pos=64, len=128, seek_char=23, invert_pos=0: 1.93 ( 35.15%) 2.97
+align=0, pos=160, len=64, seek_char=23, invert_pos=0: 1.67 ( 15.65%) 1.98
+align=0, pos=64, len=160, seek_char=23, invert_pos=0: 1.93 ( 35.19%) 2.97
+align=0, pos=192, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.23%) 2.20
+align=0, pos=64, len=192, seek_char=23, invert_pos=0: 1.93 ( 35.16%) 2.97
+align=0, pos=224, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.20%) 2.20
+align=0, pos=64, len=224, seek_char=23, invert_pos=0: 1.93 ( 35.20%) 2.97
+align=0, pos=256, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.24%) 2.20
+align=0, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 35.16%) 2.97
+align=0, pos=288, len=64, seek_char=23, invert_pos=0: 1.83 ( 16.59%) 2.20
+align=0, pos=64, len=288, seek_char=23, invert_pos=0: 1.93 ( 35.16%) 2.97
+align=0, pos=320, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.20%) 2.20
+align=0, pos=64, len=320, seek_char=23, invert_pos=0: 1.93 ( 35.14%) 2.97
+align=0, pos=352, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.23%) 2.20
+align=0, pos=64, len=352, seek_char=23, invert_pos=0: 1.93 ( 35.16%) 2.97
+align=0, pos=384, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.21%) 2.20
+align=0, pos=64, len=384, seek_char=23, invert_pos=0: 1.93 ( 35.19%) 2.97
+align=0, pos=416, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.19%) 2.20
+align=0, pos=64, len=416, seek_char=23, invert_pos=0: 1.93 ( 35.18%) 2.97
+align=0, pos=448, len=64, seek_char=23, invert_pos=0: 1.67 ( 24.18%) 2.20
+align=0, pos=64, len=448, seek_char=23, invert_pos=0: 1.93 ( 35.18%) 2.97
+align=0, pos=128, len=128, seek_char=23, invert_pos=0: 2.69 ( 0.81%) 2.71
+align=0, pos=128, len=128, seek_char=23, invert_pos=0: 2.69 ( 9.07%) 2.96
+align=0, pos=128, len=128, seek_char=23, invert_pos=0: 2.69 ( 9.09%) 2.96
+align=0, pos=128, len=128, seek_char=23, invert_pos=0: 2.69 ( 9.05%) 2.96
+align=0, pos=160, len=128, seek_char=23, invert_pos=0: 2.79 ( 5.72%) 2.96
+align=0, pos=128, len=160, seek_char=23, invert_pos=0: 2.95 ( -0.44%) 2.94
+align=0, pos=96, len=128, seek_char=23, invert_pos=0: 2.44 ( 17.11%) 2.94
+align=0, pos=128, len=96, seek_char=23, invert_pos=0: 2.18 ( 11.58%) 2.47
+align=0, pos=192, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.17%) 3.10
+align=0, pos=128, len=192, seek_char=23, invert_pos=0: 2.95 ( 26.61%) 4.02
+align=0, pos=64, len=128, seek_char=23, invert_pos=0: 1.93 ( 34.42%) 2.94
+align=0, pos=128, len=64, seek_char=23, invert_pos=0: 1.67 ( 15.62%) 1.98
+align=0, pos=224, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.17%) 3.10
+align=0, pos=128, len=224, seek_char=23, invert_pos=0: 2.95 ( 25.70%) 3.97
+align=0, pos=32, len=128, seek_char=23, invert_pos=0: 1.48 ( 40.01%) 2.46
+align=0, pos=128, len=32, seek_char=23, invert_pos=0: 1.30 ( 27.84%) 1.81
+align=0, pos=256, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.16%) 3.10
+align=0, pos=128, len=256, seek_char=23, invert_pos=0: 2.95 ( 19.11%) 3.64
+align=0, pos=288, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.16%) 3.10
+align=0, pos=128, len=288, seek_char=23, invert_pos=0: 2.95 ( 19.07%) 3.64
+align=0, pos=320, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.19%) 3.10
+align=0, pos=128, len=320, seek_char=23, invert_pos=0: 2.95 ( 19.13%) 3.65
+align=0, pos=352, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.17%) 3.10
+align=0, pos=128, len=352, seek_char=23, invert_pos=0: 2.95 ( 19.11%) 3.64
+align=0, pos=384, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.16%) 3.10
+align=0, pos=128, len=384, seek_char=23, invert_pos=0: 2.95 ( 19.14%) 3.65
+align=0, pos=416, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.18%) 3.10
+align=0, pos=128, len=416, seek_char=23, invert_pos=0: 2.95 ( 19.08%) 3.64
+align=0, pos=448, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.15%) 3.10
+align=0, pos=128, len=448, seek_char=23, invert_pos=0: 2.95 ( 19.04%) 3.64
+align=0, pos=480, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.17%) 3.10
+align=0, pos=128, len=480, seek_char=23, invert_pos=0: 2.95 ( 19.11%) 3.64
+align=0, pos=512, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.18%) 3.10
+align=0, pos=128, len=512, seek_char=23, invert_pos=0: 2.95 ( 19.08%) 3.64
+align=0, pos=256, len=256, seek_char=23, invert_pos=0: 4.74 ( 1.06%) 4.79
+align=0, pos=256, len=256, seek_char=23, invert_pos=0: 4.74 ( 3.91%) 4.93
+align=0, pos=256, len=256, seek_char=23, invert_pos=0: 4.74 ( 3.85%) 4.93
+align=0, pos=256, len=256, seek_char=23, invert_pos=0: 4.74 ( 3.99%) 4.94
+align=0, pos=288, len=256, seek_char=23, invert_pos=0: 4.74 ( 3.96%) 4.94
+align=0, pos=256, len=288, seek_char=23, invert_pos=0: 5.81 (-27.17%) 4.57
+align=0, pos=224, len=256, seek_char=23, invert_pos=0: 4.49 ( -7.31%) 4.18
+align=0, pos=256, len=224, seek_char=23, invert_pos=0: 4.23 (-23.95%) 3.41
+align=0, pos=320, len=256, seek_char=23, invert_pos=0: 4.74 ( 3.82%) 4.93
+align=0, pos=256, len=320, seek_char=23, invert_pos=0: 5.80 (-20.46%) 4.82
+align=0, pos=192, len=256, seek_char=23, invert_pos=0: 3.97 ( 10.12%) 4.42
+align=0, pos=256, len=192, seek_char=23, invert_pos=0: 3.72 ( 10.13%) 4.14
+align=0, pos=352, len=256, seek_char=23, invert_pos=0: 4.74 ( 3.90%) 4.93
+align=0, pos=256, len=352, seek_char=23, invert_pos=0: 5.80 (-20.56%) 4.81
+align=0, pos=160, len=256, seek_char=23, invert_pos=0: 3.46 ( -0.90%) 3.43
+align=0, pos=256, len=160, seek_char=23, invert_pos=0: 3.20 ( -8.80%) 2.95
+align=0, pos=384, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.42%) 4.37
+align=0, pos=256, len=384, seek_char=23, invert_pos=0: 5.81 (-20.57%) 4.82
+align=0, pos=128, len=256, seek_char=23, invert_pos=0: 2.95 ( 17.10%) 3.56
+align=0, pos=256, len=128, seek_char=23, invert_pos=0: 2.69 ( 13.22%) 3.10
+align=0, pos=416, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.47%) 4.37
+align=0, pos=256, len=416, seek_char=23, invert_pos=0: 5.80 (-14.73%) 5.06
+align=0, pos=96, len=256, seek_char=23, invert_pos=0: 2.44 ( 17.03%) 2.94
+align=0, pos=256, len=96, seek_char=23, invert_pos=0: 2.18 ( 11.74%) 2.47
+align=0, pos=448, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.45%) 4.37
+align=0, pos=256, len=448, seek_char=23, invert_pos=0: 5.80 (-20.57%) 4.81
+align=0, pos=64, len=256, seek_char=23, invert_pos=0: 1.93 ( 34.44%) 2.94
+align=0, pos=256, len=64, seek_char=23, invert_pos=0: 1.67 ( 15.62%) 1.98
+align=0, pos=480, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.44%) 4.37
+align=0, pos=256, len=480, seek_char=23, invert_pos=0: 5.81 (-14.50%) 5.07
+align=0, pos=32, len=256, seek_char=23, invert_pos=0: 1.48 ( 40.05%) 2.47
+align=0, pos=256, len=32, seek_char=23, invert_pos=0: 1.30 ( 27.92%) 1.81
+align=0, pos=512, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.47%) 4.37
+align=0, pos=256, len=512, seek_char=23, invert_pos=0: 5.80 (-20.38%) 4.82
+align=0, pos=544, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.46%) 4.37
+align=0, pos=256, len=544, seek_char=23, invert_pos=0: 5.80 (-14.15%) 5.08
+align=0, pos=576, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.44%) 4.37
+align=0, pos=256, len=576, seek_char=23, invert_pos=0: 5.80 (-20.59%) 4.81
+align=0, pos=608, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.45%) 4.37
+align=0, pos=256, len=608, seek_char=23, invert_pos=0: 5.93 (-17.33%) 5.05
+align=0, pos=640, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.45%) 4.37
+align=0, pos=256, len=640, seek_char=23, invert_pos=0: 5.80 (-20.53%) 4.82
+align=0, pos=512, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.44%) 6.86
+align=0, pos=512, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.45%) 6.86
+align=0, pos=512, len=512, seek_char=23, invert_pos=0: 6.77 ( 1.79%) 6.89
+align=0, pos=512, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.93%) 6.89
+align=0, pos=544, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.92%) 6.89
+align=0, pos=512, len=544, seek_char=23, invert_pos=0: 7.77 (-14.07%) 6.81
+align=0, pos=480, len=512, seek_char=23, invert_pos=0: 7.25 (-17.75%) 6.16
+align=0, pos=512, len=480, seek_char=23, invert_pos=0: 7.23 (-14.30%) 6.33
+align=0, pos=576, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.90%) 6.89
+align=0, pos=512, len=576, seek_char=23, invert_pos=0: 7.76 (-19.10%) 6.52
+align=0, pos=448, len=512, seek_char=23, invert_pos=0: 7.36 (-14.57%) 6.43
+align=0, pos=512, len=448, seek_char=23, invert_pos=0: 6.13 ( 2.88%) 6.31
+align=0, pos=608, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.90%) 6.89
+align=0, pos=512, len=608, seek_char=23, invert_pos=0: 7.77 (-18.82%) 6.54
+align=0, pos=416, len=512, seek_char=23, invert_pos=0: 6.79 ( -3.25%) 6.58
+align=0, pos=512, len=416, seek_char=23, invert_pos=0: 6.77 (-19.54%) 5.66
+align=0, pos=640, len=512, seek_char=23, invert_pos=0: 6.62 ( 1.53%) 6.72
+align=0, pos=512, len=640, seek_char=23, invert_pos=0: 7.76 (-18.82%) 6.53
+align=0, pos=384, len=512, seek_char=23, invert_pos=0: 6.79 ( -5.44%) 6.44
+align=0, pos=512, len=384, seek_char=23, invert_pos=0: 5.70 ( 11.27%) 6.43
+align=0, pos=672, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.98%) 6.90
+align=0, pos=512, len=672, seek_char=23, invert_pos=0: 7.77 (-19.32%) 6.51
+align=0, pos=352, len=512, seek_char=23, invert_pos=0: 6.29 ( -7.16%) 5.87
+align=0, pos=512, len=352, seek_char=23, invert_pos=0: 6.39 (-31.82%) 4.85
+align=0, pos=704, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.51%) 6.86
+align=0, pos=512, len=704, seek_char=23, invert_pos=0: 7.73 (-16.65%) 6.63
+align=0, pos=320, len=512, seek_char=23, invert_pos=0: 6.29 ( -7.27%) 5.86
+align=0, pos=512, len=320, seek_char=23, invert_pos=0: 5.27 ( 1.88%) 5.38
+align=0, pos=736, len=512, seek_char=23, invert_pos=0: 6.60 ( 4.26%) 6.89
+align=0, pos=512, len=736, seek_char=23, invert_pos=0: 7.76 (-16.98%) 6.64
+align=0, pos=288, len=512, seek_char=23, invert_pos=0: 5.80 (-14.13%) 5.09
+align=0, pos=512, len=288, seek_char=23, invert_pos=0: 5.79 (-48.42%) 3.90
+align=0, pos=768, len=512, seek_char=23, invert_pos=0: 6.59 ( 3.58%) 6.84
+align=0, pos=512, len=768, seek_char=23, invert_pos=0: 7.77 (-18.94%) 6.54
+align=0, pos=256, len=512, seek_char=23, invert_pos=0: 5.81 (-14.67%) 5.06
+align=0, pos=512, len=256, seek_char=23, invert_pos=0: 4.74 ( -8.43%) 4.37
+align=0, pos=800, len=512, seek_char=23, invert_pos=0: 6.59 ( 3.78%) 6.85
+align=0, pos=512, len=800, seek_char=23, invert_pos=0: 7.77 (-18.93%) 6.53
+align=0, pos=224, len=512, seek_char=23, invert_pos=0: 4.49 ( -1.45%) 4.42
+align=0, pos=512, len=224, seek_char=23, invert_pos=0: 4.23 (-21.06%) 3.49
+align=0, pos=832, len=512, seek_char=23, invert_pos=0: 6.59 ( 3.73%) 6.85
+align=0, pos=512, len=832, seek_char=23, invert_pos=0: 7.77 (-19.30%) 6.51
+align=0, pos=192, len=512, seek_char=23, invert_pos=0: 3.97 ( 10.18%) 4.42
+align=0, pos=512, len=192, seek_char=23, invert_pos=0: 3.72 ( 3.67%) 3.86
+align=0, pos=864, len=512, seek_char=23, invert_pos=0: 6.62 ( 3.90%) 6.89
+align=0, pos=512, len=864, seek_char=23, invert_pos=0: 7.76 (-18.92%) 6.53
+align=0, pos=160, len=512, seek_char=23, invert_pos=0: 3.46 ( 2.72%) 3.56
+align=0, pos=512, len=160, seek_char=23, invert_pos=0: 3.20 ( -9.03%) 2.94
+align=0, pos=896, len=512, seek_char=23, invert_pos=0: 6.62 ( 1.40%) 6.71
+align=0, pos=512, len=896, seek_char=23, invert_pos=0: 7.77 (-18.84%) 6.54
+align=0, pos=128, len=512, seek_char=23, invert_pos=0: 2.95 ( 17.19%) 3.56
+align=0, pos=512, len=128, seek_char=23, invert_pos=0: 2.69 ( 9.05%) 2.96
+align=0, pos=1024, len=1024, seek_char=23, invert_pos=0: 10.42 ( -6.46%) 9.78
+align=0, pos=1024, len=1024, seek_char=23, invert_pos=0: 10.43 ( 1.24%) 10.56
+align=0, pos=1024, len=1024, seek_char=23, invert_pos=0: 10.43 ( -6.62%) 9.78
+align=0, pos=1024, len=1024, seek_char=23, invert_pos=0: 10.43 ( 1.30%) 10.57
+align=0, pos=1056, len=1024, seek_char=23, invert_pos=0: 10.45 ( -6.73%) 9.79
+align=0, pos=1024, len=1056, seek_char=23, invert_pos=0: 11.51 (-10.21%) 10.44
+align=0, pos=992, len=1024, seek_char=23, invert_pos=0: 11.05 ( -9.43%) 10.10
+align=0, pos=1024, len=992, seek_char=23, invert_pos=0: 11.01 ( -8.27%) 10.17
+align=0, pos=1088, len=1024, seek_char=23, invert_pos=0: 10.42 ( -0.46%) 10.37
+align=0, pos=1024, len=1088, seek_char=23, invert_pos=0: 11.50 ( -9.66%) 10.49
+align=0, pos=960, len=1024, seek_char=23, invert_pos=0: 11.03 ( -6.84%) 10.33
+align=0, pos=1024, len=960, seek_char=23, invert_pos=0: 9.97 ( 0.61%) 10.03
+align=0, pos=1120, len=1024, seek_char=23, invert_pos=0: 10.42 ( -0.44%) 10.37
+align=0, pos=1024, len=1120, seek_char=23, invert_pos=0: 11.50 ( -6.25%) 10.83
+align=0, pos=928, len=1024, seek_char=23, invert_pos=0: 10.57 ( -6.46%) 9.92
+align=0, pos=1024, len=928, seek_char=23, invert_pos=0: 10.54 (-10.13%) 9.57
+align=0, pos=1152, len=1024, seek_char=23, invert_pos=0: 10.42 ( -6.55%) 9.78
+align=0, pos=1024, len=1152, seek_char=23, invert_pos=0: 11.50 (-12.53%) 10.22
+align=0, pos=896, len=1024, seek_char=23, invert_pos=0: 10.56 ( -6.39%) 9.93
+align=0, pos=1024, len=896, seek_char=23, invert_pos=0: 9.48 ( 2.04%) 9.68
+align=0, pos=1184, len=1024, seek_char=23, invert_pos=0: 10.42 ( 1.50%) 10.57
+align=0, pos=1024, len=1184, seek_char=23, invert_pos=0: 11.50 ( -9.66%) 10.49
+align=0, pos=864, len=1024, seek_char=23, invert_pos=0: 10.13 ( -6.12%) 9.54
+align=0, pos=1024, len=864, seek_char=23, invert_pos=0: 10.10 ( -7.61%) 9.39
+align=0, pos=1216, len=1024, seek_char=23, invert_pos=0: 10.41 ( 1.57%) 10.58
+align=0, pos=1024, len=1216, seek_char=23, invert_pos=0: 11.50 ( -9.73%) 10.48
+align=0, pos=832, len=1024, seek_char=23, invert_pos=0: 10.13 ( -6.10%) 9.54
+align=0, pos=1024, len=832, seek_char=23, invert_pos=0: 9.01 ( -3.04%) 8.75
+align=0, pos=1248, len=1024, seek_char=23, invert_pos=0: 10.41 ( -6.70%) 9.76
+align=0, pos=1024, len=1248, seek_char=23, invert_pos=0: 11.51 ( -9.70%) 10.49
+align=0, pos=800, len=1024, seek_char=23, invert_pos=0: 9.63 ( 22.00%) 12.34
+align=0, pos=1024, len=800, seek_char=23, invert_pos=0: 9.61 ( -7.98%) 8.90
+align=0, pos=1280, len=1024, seek_char=23, invert_pos=0: 10.42 ( 1.47%) 10.57
+align=0, pos=1024, len=1280, seek_char=23, invert_pos=0: 11.50 ( -6.28%) 10.82
+align=0, pos=768, len=1024, seek_char=23, invert_pos=0: 9.80 ( 22.53%) 12.66
+align=0, pos=1024, len=768, seek_char=23, invert_pos=0: 8.52 ( 4.58%) 8.92
+align=0, pos=1312, len=1024, seek_char=23, invert_pos=0: 10.42 ( 1.49%) 10.57
+align=0, pos=1024, len=1312, seek_char=23, invert_pos=0: 11.50 ( -9.64%) 10.49
+align=0, pos=736, len=1024, seek_char=23, invert_pos=0: 9.16 (-16.99%) 7.83
+align=0, pos=1024, len=736, seek_char=23, invert_pos=0: 9.28 (-21.76%) 7.62
+align=0, pos=1344, len=1024, seek_char=23, invert_pos=0: 10.41 ( -6.42%) 9.79
+align=0, pos=1024, len=1344, seek_char=23, invert_pos=0: 11.51 ( -9.67%) 10.49
+align=0, pos=704, len=1024, seek_char=23, invert_pos=0: 9.15 ( -4.59%) 8.75
+align=0, pos=1024, len=704, seek_char=23, invert_pos=0: 8.06 ( 0.92%) 8.14
+align=0, pos=1376, len=1024, seek_char=23, invert_pos=0: 10.42 ( 1.53%) 10.58
+align=0, pos=1024, len=1376, seek_char=23, invert_pos=0: 11.50 ( -9.65%) 10.49
+align=0, pos=672, len=1024, seek_char=23, invert_pos=0: 8.70 ( -6.79%) 8.15
+align=0, pos=1024, len=672, seek_char=23, invert_pos=0: 8.68 (-20.37%) 7.21
+align=0, pos=1408, len=1024, seek_char=23, invert_pos=0: 10.42 ( -0.30%) 10.38
+align=0, pos=1024, len=1408, seek_char=23, invert_pos=0: 11.51 ( -6.38%) 10.82
+align=0, pos=640, len=1024, seek_char=23, invert_pos=0: 8.71 ( -6.84%) 8.15
+align=0, pos=1024, len=640, seek_char=23, invert_pos=0: 7.61 ( 0.90%) 7.68
+align=0, pos=2048, len=2048, seek_char=23, invert_pos=0: 17.93 ( -5.51%) 16.99
+align=0, pos=2048, len=2048, seek_char=23, invert_pos=0: 17.92 ( -6.09%) 16.89
+align=0, pos=2048, len=2048, seek_char=23, invert_pos=0: 18.01 ( -5.80%) 17.02
+align=0, pos=2048, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.49%) 16.99
+align=0, pos=2080, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.50%) 16.99
+align=0, pos=2048, len=2080, seek_char=23, invert_pos=0: 19.08 ( -9.51%) 17.42
+align=0, pos=2016, len=2048, seek_char=23, invert_pos=0: 18.70 ( 13.66%) 21.66
+align=0, pos=2048, len=2016, seek_char=23, invert_pos=0: 18.69 (-10.90%) 16.85
+align=0, pos=2112, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.50%) 16.99
+align=0, pos=2048, len=2112, seek_char=23, invert_pos=0: 19.07 ( -6.48%) 17.91
+align=0, pos=1984, len=2048, seek_char=23, invert_pos=0: 18.71 ( 15.61%) 22.17
+align=0, pos=2048, len=1984, seek_char=23, invert_pos=0: 17.47 ( -5.68%) 16.53
+align=0, pos=2144, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.57%) 16.98
+align=0, pos=2048, len=2144, seek_char=23, invert_pos=0: 19.08 ( -6.63%) 17.89
+align=0, pos=1952, len=2048, seek_char=23, invert_pos=0: 18.14 ( 16.14%) 21.64
+align=0, pos=2048, len=1952, seek_char=23, invert_pos=0: 18.05 (-10.24%) 16.37
+align=0, pos=2176, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.51%) 16.99
+align=0, pos=2048, len=2176, seek_char=23, invert_pos=0: 19.07 ( -5.77%) 18.03
+align=0, pos=1920, len=2048, seek_char=23, invert_pos=0: 18.14 ( 15.45%) 21.46
+align=0, pos=2048, len=1920, seek_char=23, invert_pos=0: 16.99 ( -5.31%) 16.13
+align=0, pos=2208, len=2048, seek_char=23, invert_pos=0: 17.93 ( -5.50%) 17.00
+align=0, pos=2048, len=2208, seek_char=23, invert_pos=0: 19.08 ( -6.60%) 17.90
+align=0, pos=1888, len=2048, seek_char=23, invert_pos=0: 17.62 ( -7.15%) 16.44
+align=0, pos=2048, len=1888, seek_char=23, invert_pos=0: 17.78 (-11.78%) 15.91
+align=0, pos=2240, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.42%) 17.00
+align=0, pos=2048, len=2240, seek_char=23, invert_pos=0: 19.08 ( -6.68%) 17.88
+align=0, pos=1856, len=2048, seek_char=23, invert_pos=0: 17.62 ( -7.10%) 16.45
+align=0, pos=2048, len=1856, seek_char=23, invert_pos=0: 16.53 ( -6.91%) 15.46
+align=0, pos=2272, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.57%) 16.98
+align=0, pos=2048, len=2272, seek_char=23, invert_pos=0: 19.08 ( -6.58%) 17.90
+align=0, pos=1824, len=2048, seek_char=23, invert_pos=0: 17.23 ( -6.92%) 16.11
+align=0, pos=2048, len=1824, seek_char=23, invert_pos=0: 17.27 (-11.89%) 15.44
+align=0, pos=2304, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.44%) 17.00
+align=0, pos=2048, len=2304, seek_char=23, invert_pos=0: 19.07 ( -6.55%) 17.90
+align=0, pos=1792, len=2048, seek_char=23, invert_pos=0: 17.22 ( -7.80%) 15.97
+align=0, pos=2048, len=1792, seek_char=23, invert_pos=0: 16.16 ( -6.47%) 15.18
+align=0, pos=2336, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.68%) 16.96
+align=0, pos=2048, len=2336, seek_char=23, invert_pos=0: 19.07 ( -6.52%) 17.90
+align=0, pos=1760, len=2048, seek_char=23, invert_pos=0: 16.81 ( -8.40%) 15.51
+align=0, pos=2048, len=1760, seek_char=23, invert_pos=0: 16.77 (-12.25%) 14.94
+align=0, pos=2368, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.75%) 16.95
+align=0, pos=2048, len=2368, seek_char=23, invert_pos=0: 19.07 ( -5.98%) 18.00
+align=0, pos=1728, len=2048, seek_char=23, invert_pos=0: 16.79 ( -8.32%) 15.50
+align=0, pos=2048, len=1728, seek_char=23, invert_pos=0: 15.63 ( -5.39%) 14.83
+align=0, pos=2400, len=2048, seek_char=23, invert_pos=0: 17.92 ( -5.73%) 16.95
+align=0, pos=2048, len=2400, seek_char=23, invert_pos=0: 19.06 ( -6.43%) 17.91
+align=0, pos=1696, len=2048, seek_char=23, invert_pos=0: 16.35 ( -8.76%) 15.04
+align=0, pos=2048, len=1696, seek_char=23, invert_pos=0: 16.24 (-11.59%) 14.55
+align=0, pos=2432, len=2048, seek_char=23, invert_pos=0: 17.92 ( -6.01%) 16.90
+align=0, pos=2048, len=2432, seek_char=23, invert_pos=0: 19.07 ( -6.43%) 17.92
+align=0, pos=1664, len=2048, seek_char=23, invert_pos=0: 16.17 ( -7.71%) 15.01
+align=0, pos=2048, len=1664, seek_char=23, invert_pos=0: 15.28 ( -5.18%) 14.53
+align=0, pos=4096, len=4096, seek_char=23, invert_pos=0: 33.09 ( 9.41%) 36.53
+align=0, pos=4096, len=4096, seek_char=23, invert_pos=0: 32.95 ( 9.75%) 36.51
+align=0, pos=4096, len=4096, seek_char=23, invert_pos=0: 32.93 ( 9.83%) 36.52
+align=0, pos=4096, len=4096, seek_char=23, invert_pos=0: 32.94 ( 9.72%) 36.49
+align=0, pos=4128, len=4096, seek_char=23, invert_pos=0: 32.94 ( 10.14%) 36.66
+align=0, pos=4096, len=4128, seek_char=23, invert_pos=0: 34.66 ( 5.23%) 36.57
+align=0, pos=4064, len=4096, seek_char=23, invert_pos=0: 34.76 ( 6.82%) 37.31
+align=0, pos=4096, len=4064, seek_char=23, invert_pos=0: 34.77 ( 3.61%) 36.07
+align=0, pos=4160, len=4096, seek_char=23, invert_pos=0: 32.94 ( 10.36%) 36.75
+align=0, pos=4096, len=4160, seek_char=23, invert_pos=0: 34.63 ( 8.36%) 37.79
+align=0, pos=4032, len=4096, seek_char=23, invert_pos=0: 34.86 ( 6.59%) 37.31
+align=0, pos=4096, len=4032, seek_char=23, invert_pos=0: 32.52 ( 10.32%) 36.26
+align=0, pos=4192, len=4096, seek_char=23, invert_pos=0: 32.94 ( 10.34%) 36.73
+align=0, pos=4096, len=4192, seek_char=23, invert_pos=0: 34.84 ( 7.20%) 37.54
+align=0, pos=4000, len=4096, seek_char=23, invert_pos=0: 34.23 ( 7.68%) 37.07
+align=0, pos=4096, len=4000, seek_char=23, invert_pos=0: 33.52 ( 5.25%) 35.38
+align=0, pos=4224, len=4096, seek_char=23, invert_pos=0: 32.94 ( 10.10%) 36.64
+align=0, pos=4096, len=4224, seek_char=23, invert_pos=0: 34.74 ( 7.66%) 37.62
+align=0, pos=3968, len=4096, seek_char=23, invert_pos=0: 34.17 ( 7.88%) 37.09
+align=0, pos=4096, len=3968, seek_char=23, invert_pos=0: 32.27 ( 9.69%) 35.73
+align=0, pos=4256, len=4096, seek_char=23, invert_pos=0: 32.93 ( 10.55%) 36.81
+align=0, pos=4096, len=4256, seek_char=23, invert_pos=0: 34.72 ( 7.68%) 37.61
+align=0, pos=3936, len=4096, seek_char=23, invert_pos=0: 36.41 ( 0.93%) 36.76
+align=0, pos=4096, len=3936, seek_char=23, invert_pos=0: 36.49 ( -5.41%) 34.62
+align=0, pos=4288, len=4096, seek_char=23, invert_pos=0: 32.94 ( 10.32%) 36.72
+align=0, pos=4096, len=4288, seek_char=23, invert_pos=0: 34.69 ( 8.36%) 37.86
+align=0, pos=3904, len=4096, seek_char=23, invert_pos=0: 36.43 ( 1.33%) 36.92
+align=0, pos=4096, len=3904, seek_char=23, invert_pos=0: 34.89 ( 0.26%) 34.98
+align=0, pos=4320, len=4096, seek_char=23, invert_pos=0: 32.94 ( 9.65%) 36.45
+align=0, pos=4096, len=4320, seek_char=23, invert_pos=0: 34.71 ( 8.83%) 38.07
+align=0, pos=3872, len=4096, seek_char=23, invert_pos=0: 34.23 ( 6.08%) 36.45
+align=0, pos=4096, len=3872, seek_char=23, invert_pos=0: 34.42 ( -1.12%) 34.04
+align=0, pos=4352, len=4096, seek_char=23, invert_pos=0: 32.93 ( 9.51%) 36.39
+align=0, pos=4096, len=4352, seek_char=23, invert_pos=0: 34.69 ( 9.68%) 38.40
+align=0, pos=3840, len=4096, seek_char=23, invert_pos=0: 34.30 ( 5.95%) 36.47
+align=0, pos=4096, len=3840, seek_char=23, invert_pos=0: 32.94 ( 4.59%) 34.52
+align=0, pos=4384, len=4096, seek_char=23, invert_pos=0: 32.94 ( 9.67%) 36.47
+align=0, pos=4096, len=4384, seek_char=23, invert_pos=0: 34.68 ( 9.63%) 38.38
+align=0, pos=3808, len=4096, seek_char=23, invert_pos=0: 36.70 ( -2.66%) 35.75
+align=0, pos=4096, len=3808, seek_char=23, invert_pos=0: 36.20 ( -6.42%) 34.01
+align=0, pos=4416, len=4096, seek_char=23, invert_pos=0: 32.97 ( 9.29%) 36.35
+align=0, pos=4096, len=4416, seek_char=23, invert_pos=0: 34.71 ( 9.92%) 38.53
+align=0, pos=3776, len=4096, seek_char=23, invert_pos=0: 36.67 ( -1.47%) 36.14
+align=0, pos=4096, len=3776, seek_char=23, invert_pos=0: 34.80 ( -2.46%) 33.97
+align=0, pos=4448, len=4096, seek_char=23, invert_pos=0: 32.94 ( 9.68%) 36.47
+align=0, pos=4096, len=4448, seek_char=23, invert_pos=0: 34.71 ( 9.93%) 38.53
+align=0, pos=3744, len=4096, seek_char=23, invert_pos=0: 36.13 ( -1.24%) 35.69
+align=0, pos=4096, len=3744, seek_char=23, invert_pos=0: 35.29 ( -5.31%) 33.51
+align=0, pos=4480, len=4096, seek_char=23, invert_pos=0: 32.94 ( 9.54%) 36.41
+align=0, pos=4096, len=4480, seek_char=23, invert_pos=0: 34.71 ( 10.35%) 38.71
+align=0, pos=3712, len=4096, seek_char=23, invert_pos=0: 36.23 ( -1.39%) 35.74
+align=0, pos=4096, len=3712, seek_char=23, invert_pos=0: 34.50 ( -3.04%) 33.48
+align=0, pos=8192, len=8192, seek_char=23, invert_pos=0: 66.82 ( 0.37%) 67.07
+align=0, pos=8192, len=8192, seek_char=23, invert_pos=0: 66.85 ( 0.23%) 67.00
+align=0, pos=8192, len=8192, seek_char=23, invert_pos=0: 66.81 ( 0.48%) 67.14
+align=0, pos=8192, len=8192, seek_char=23, invert_pos=0: 67.25 ( -0.41%) 66.97
+align=0, pos=8224, len=8192, seek_char=23, invert_pos=0: 66.80 ( 0.32%) 67.01
+align=0, pos=8192, len=8224, seek_char=23, invert_pos=0: 67.47 ( -0.13%) 67.38
+align=0, pos=8160, len=8192, seek_char=23, invert_pos=0: 67.24 ( 0.87%) 67.83
+align=0, pos=8192, len=8160, seek_char=23, invert_pos=0: 66.90 ( -0.57%) 66.52
+align=0, pos=8256, len=8192, seek_char=23, invert_pos=0: 66.82 ( 1.37%) 67.75
+align=0, pos=8192, len=8256, seek_char=23, invert_pos=0: 67.51 ( 1.17%) 68.31
+align=0, pos=8128, len=8192, seek_char=23, invert_pos=0: 67.39 ( 1.13%) 68.16
+align=0, pos=8192, len=8128, seek_char=23, invert_pos=0: 66.11 ( 1.53%) 67.14
+align=0, pos=8288, len=8192, seek_char=23, invert_pos=0: 66.91 ( 1.00%) 67.59
+align=0, pos=8192, len=8288, seek_char=23, invert_pos=0: 68.28 ( 0.17%) 68.40
+align=0, pos=8096, len=8192, seek_char=23, invert_pos=0: 67.51 ( 0.30%) 67.71
+align=0, pos=8192, len=8096, seek_char=23, invert_pos=0: 67.57 ( -2.01%) 66.24
+align=0, pos=8320, len=8192, seek_char=23, invert_pos=0: 67.09 ( 0.74%) 67.59
+align=0, pos=8192, len=8320, seek_char=23, invert_pos=0: 68.77 ( -0.41%) 68.49
+align=0, pos=8064, len=8192, seek_char=23, invert_pos=0: 67.57 ( 0.39%) 67.84
+align=0, pos=8192, len=8064, seek_char=23, invert_pos=0: 66.10 ( 0.70%) 66.57
+align=0, pos=8352, len=8192, seek_char=23, invert_pos=0: 67.05 ( 1.23%) 67.89
+align=0, pos=8192, len=8352, seek_char=23, invert_pos=0: 68.54 ( -0.23%) 68.38
+align=0, pos=8032, len=8192, seek_char=23, invert_pos=0: 67.30 ( 0.37%) 67.55
+align=0, pos=8192, len=8032, seek_char=23, invert_pos=0: 66.62 ( -1.49%) 65.65
+align=0, pos=8384, len=8192, seek_char=23, invert_pos=0: 66.95 ( 0.11%) 67.02
+align=0, pos=8192, len=8384, seek_char=23, invert_pos=0: 68.77 ( -0.21%) 68.63
+align=0, pos=8000, len=8192, seek_char=23, invert_pos=0: 67.41 ( 0.04%) 67.43
+align=0, pos=8192, len=8000, seek_char=23, invert_pos=0: 65.51 ( 0.06%) 65.56
+align=0, pos=8416, len=8192, seek_char=23, invert_pos=0: 66.92 ( 0.21%) 67.06
+align=0, pos=8192, len=8416, seek_char=23, invert_pos=0: 68.94 ( -0.11%) 68.86
+align=0, pos=7968, len=8192, seek_char=23, invert_pos=0: 66.92 ( 0.28%) 67.11
+align=0, pos=8192, len=7968, seek_char=23, invert_pos=0: 66.27 ( -1.79%) 65.10
+align=0, pos=8448, len=8192, seek_char=23, invert_pos=0: 66.87 ( 0.21%) 67.01
+align=0, pos=8192, len=8448, seek_char=23, invert_pos=0: 68.90 ( 0.46%) 69.22
+align=0, pos=7936, len=8192, seek_char=23, invert_pos=0: 66.95 ( 0.28%) 67.14
+align=0, pos=8192, len=7936, seek_char=23, invert_pos=0: 65.09 ( 0.07%) 65.14
+align=0, pos=8480, len=8192, seek_char=23, invert_pos=0: 66.86 ( 0.34%) 67.09
+align=0, pos=8192, len=8480, seek_char=23, invert_pos=0: 68.91 ( 0.87%) 69.51
+align=0, pos=7904, len=8192, seek_char=23, invert_pos=0: 66.29 ( 1.10%) 67.03
+align=0, pos=8192, len=7904, seek_char=23, invert_pos=0: 65.09 ( -1.07%) 64.40
+align=0, pos=8512, len=8192, seek_char=23, invert_pos=0: 66.87 ( 0.87%) 67.46
+align=0, pos=8192, len=8512, seek_char=23, invert_pos=0: 68.99 ( 0.84%) 69.58
+align=0, pos=7872, len=8192, seek_char=23, invert_pos=0: 66.34 ( 1.17%) 67.12
+align=0, pos=8192, len=7872, seek_char=23, invert_pos=0: 64.72 ( 0.54%) 65.07
+align=0, pos=8544, len=8192, seek_char=23, invert_pos=0: 66.86 ( 1.63%) 67.97
+align=0, pos=8192, len=8544, seek_char=23, invert_pos=0: 68.68 ( 1.77%) 69.91
+align=0, pos=7840, len=8192, seek_char=23, invert_pos=0: 65.99 ( 1.59%) 67.05
+align=0, pos=8192, len=7840, seek_char=23, invert_pos=0: 65.62 ( -1.99%) 64.34
+align=0, pos=8576, len=8192, seek_char=23, invert_pos=0: 66.96 ( 1.51%) 67.98
+align=0, pos=8192, len=8576, seek_char=23, invert_pos=0: 68.73 ( 1.74%) 69.94
+align=0, pos=7808, len=8192, seek_char=23, invert_pos=0: 65.98 ( 1.51%) 66.99
+align=0, pos=8192, len=7808, seek_char=23, invert_pos=0: 65.09 ( -0.53%) 64.75
--
2.39.3
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH 1/2] powerpc : Add optimized memchr for POWER10
@ 2023-11-16 9:49 bmahi496
0 siblings, 0 replies; 4+ messages in thread
From: bmahi496 @ 2023-11-16 9:49 UTC (permalink / raw)
To: libc-alpha; +Cc: rajis, MAHESH BODAPATI
From: MAHESH BODAPATI <bmahi496@linux.ibm.com>
Optimized memchr for POWER10 based on existing rawmemchr and strlen.
movement of code,dead code elimination and loop unrolling helped in
getting better performance.
---
sysdeps/powerpc/powerpc64/le/power10/memchr.S | 315 ++++++++++++++++++
sysdeps/powerpc/powerpc64/multiarch/Makefile | 9 +-
.../powerpc64/multiarch/ifunc-impl-list.c | 6 +
.../powerpc64/multiarch/memchr-power10.S | 28 ++
sysdeps/powerpc/powerpc64/multiarch/memchr.c | 20 +-
5 files changed, 368 insertions(+), 10 deletions(-)
create mode 100644 sysdeps/powerpc/powerpc64/le/power10/memchr.S
create mode 100644 sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S
diff --git a/sysdeps/powerpc/powerpc64/le/power10/memchr.S b/sysdeps/powerpc/powerpc64/le/power10/memchr.S
new file mode 100644
index 0000000000..faf293f344
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/le/power10/memchr.S
@@ -0,0 +1,315 @@
+/* Optimized memchr implementation for POWER10 LE.
+ Copyright (C) 2021-2023 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#include <sysdep.h>
+
+# ifndef MEMCHR
+# define MEMCHR __memchr
+# endif
+# define M_VREG_ZERO v20
+# define M_OFF_START_LOOP 256
+# define MEMCHR_SUBTRACT_VECTORS \
+ vsububm v4,v4,v18; \
+ vsububm v5,v5,v18; \
+ vsububm v6,v6,v18; \
+ vsububm v7,v7,v18;
+# define M_TAIL(vreg,increment) \
+ vctzlsbb r4,vreg; \
+ cmpld r5,r4; \
+ ble L(null); \
+ addi r4,r4,increment; \
+ add r3,r6,r4; \
+ blr
+
+/* TODO: Replace macros by the actual instructions when minimum binutils becomes
+ >= 2.35. This is used to keep compatibility with older versions. */
+#define M_VEXTRACTBM(rt,vrb) \
+ .long(((4)<<(32-6)) \
+ | ((rt)<<(32-11)) \
+ | ((8)<<(32-16)) \
+ | ((vrb)<<(32-21)) \
+ | 1602)
+
+#define M_LXVP(xtp,dq,ra) \
+ .long(((6)<<(32-6)) \
+ | ((((xtp)-32)>>1)<<(32-10)) \
+ | ((1)<<(32-11)) \
+ | ((ra)<<(32-16)) \
+ | dq)
+
+#define CHECK16B(vreg,offset,addr,label) \
+ lxv vreg+32,offset(addr); \
+ vcmpequb. vreg,vreg,v18; \
+ bne cr6,L(label); \
+ cmpldi r5,16; \
+ ble L(null); \
+ addi r5,r5,-16;
+
+/* Load 4 quadwords, merge into one VR for speed and check for NULLs. r6 has #
+ of bytes already checked. */
+#define CHECK64B(offset,addr,label) \
+ M_LXVP(v4+32,offset,addr); \
+ M_LXVP(v6+32,offset+32,addr); \
+ MEMCHR_SUBTRACT_VECTORS; \
+ vminub v14,v4,v5; \
+ vminub v15,v6,v7; \
+ vminub v16,v14,v15; \
+ vcmpequb. v0,v16,M_VREG_ZERO; \
+ beq cr6,$+12; \
+ li r7,offset; \
+ b L(label); \
+ cmpldi r5,64; \
+ ble L(null); \
+ addi r5,r5,-64
+
+/* Implements the function
+ void *[r3] memchr (const void *s [r3], int c [r4], size_t n [r5]). */
+
+ .machine power9
+
+ENTRY_TOCLESS (MEMCHR)
+ CALL_MCOUNT 3
+
+ cmpldi r5,0
+ beq L(null)
+ mr r0,r5
+ xori r6,r4,0xff
+
+ mtvsrd v18+32,r4 /* matching char in v18 */
+ mtvsrd v19+32,r6 /* non matching char in v19 */
+
+ vspltb v18,v18,7 /* replicate */
+ vspltb v19,v19,7 /* replicate */
+ vspltisb M_VREG_ZERO,0
+
+ /* Next 16B-aligned address. Prepare address for L(aligned). */
+ addi r6,r3,16
+ clrrdi r6,r6,4
+
+ /* Align data and fill bytes not loaded with non matching char. */
+ lvx v0,0,r3
+ lvsr v1,0,r3
+ vperm v0,v19,v0,v1
+
+ vcmpequb. v6,v0,v18
+ bne cr6,L(found)
+ sub r4,r6,r3
+ cmpld r5,r4
+ ble L(null)
+ sub r5,r5,r4
+
+ /* Test up to OFF_START_LOOP-16 bytes in 16B chunks. The main loop is
+ optimized for longer strings, so checking the first bytes in 16B
+ chunks benefits a lot small strings. */
+ .p2align 5
+L(aligned):
+ cmpldi r5,0
+ beq L(null)
+
+ CHECK16B(v0,0,r6,tail1)
+ CHECK16B(v1,16,r6,tail2)
+ CHECK16B(v2,32,r6,tail3)
+ CHECK16B(v3,48,r6,tail4)
+ CHECK16B(v4,64,r6,tail5)
+ CHECK16B(v5,80,r6,tail6)
+ CHECK16B(v6,96,r6,tail7)
+ CHECK16B(v7,112,r6,tail8)
+ CHECK16B(v8,128,r6,tail9)
+ CHECK16B(v9,144,r6,tail10)
+ CHECK16B(v10,160,r6,tail11)
+ CHECK16B(v0,176,r6,tail12)
+ CHECK16B(v1,192,r6,tail13)
+ CHECK16B(v2,208,r6,tail14)
+ CHECK16B(v3,224,r6,tail15)
+
+ cmpdi cr5,r4,0 /* Check if c == 0. This will be useful to
+ choose how we will perform the main loop. */
+
+ /* Prepare address for the loop. */
+ addi r4,r3,M_OFF_START_LOOP
+ clrrdi r4,r4,6
+ sub r6,r4,r3
+ sub r5,r0,r6
+ addi r6,r4,128
+
+ /* If c == 0, use the loop without the vsububm. */
+ beq cr5,L(loop)
+
+ /* This is very similar to the block after L(loop), the difference is
+ that here MEMCHR_SUBTRACT_VECTORS is not empty, and we subtract
+ each byte loaded by the char we are looking for, this way we can keep
+ using vminub to merge the results and checking for nulls. */
+ .p2align 5
+L(memchr_loop):
+ CHECK64B(0,r4,pre_tail_64b)
+ CHECK64B(64,r4,pre_tail_64b)
+ addi r4,r4,256
+
+ CHECK64B(0,r6,tail_64b)
+ CHECK64B(64,r6,tail_64b)
+ addi r6,r6,256
+
+ CHECK64B(0,r4,pre_tail_64b)
+ CHECK64B(64,r4,pre_tail_64b)
+ addi r4,r4,256
+
+ CHECK64B(0,r6,tail_64b)
+ CHECK64B(64,r6,tail_64b)
+ addi r6,r6,256
+
+ b L(memchr_loop)
+ /* Switch to a more aggressive approach checking 64B each time. Use 2
+ pointers 128B apart and unroll the loop once to make the pointer
+ updates and usages separated enough to avoid stalls waiting for
+ address calculation. */
+ .p2align 5
+L(loop):
+#undef MEMCHR_SUBTRACT_VECTORS
+#define MEMCHR_SUBTRACT_VECTORS /* nothing */
+ CHECK64B(0,r4,pre_tail_64b)
+ CHECK64B(64,r4,pre_tail_64b)
+ addi r4,r4,256
+
+ CHECK64B(0,r6,tail_64b)
+ CHECK64B(64,r6,tail_64b)
+ addi r6,r6,256
+
+ CHECK64B(0,r4,pre_tail_64b)
+ CHECK64B(64,r4,pre_tail_64b)
+ addi r4,r4,256
+
+ CHECK64B(0,r6,tail_64b)
+ CHECK64B(64,r6,tail_64b)
+ addi r6,r6,256
+
+ b L(loop)
+
+ .p2align 5
+L(pre_tail_64b):
+ mr r6,r4
+L(tail_64b):
+ /* OK, we found a null byte. Let's look for it in the current 64-byte
+ block and mark it in its corresponding VR. lxvp vx,0(ry) puts the
+ low 16B bytes into vx+1, and the high into vx, so the order here is
+ v5, v4, v7, v6. */
+ vcmpequb v1,v5,M_VREG_ZERO
+ vcmpequb v2,v4,M_VREG_ZERO
+ vcmpequb v3,v7,M_VREG_ZERO
+ vcmpequb v4,v6,M_VREG_ZERO
+
+ /* Take into account the other 64B blocks we had already checked. */
+ add r6,r6,r7
+ /* Extract first bit of each byte. */
+ M_VEXTRACTBM(r8,v1)
+ M_VEXTRACTBM(r9,v2)
+ M_VEXTRACTBM(r10,v3)
+ M_VEXTRACTBM(r11,v4)
+
+ /* Shift each value into their corresponding position. */
+ sldi r9,r9,16
+ sldi r10,r10,32
+ sldi r11,r11,48
+
+ /* Merge the results. */
+ or r8,r8,r9
+ or r9,r10,r11
+ or r11,r9,r8
+
+ cnttzd r0,r11 /* Count trailing zeros before the match. */
+ cmpld r5,r0
+ ble L(null)
+ add r3,r6,r0 /* Compute final address. */
+ blr
+
+ .p2align 5
+L(tail1):
+ M_TAIL(v0,0)
+
+ .p2align 5
+L(tail2):
+ M_TAIL(v1,16)
+
+ .p2align 5
+L(tail3):
+ M_TAIL(v2,32)
+
+ .p2align 5
+L(tail4):
+ M_TAIL(v3,48)
+
+ .p2align 5
+L(tail5):
+ M_TAIL(v4,64)
+
+ .p2align 5
+L(tail6):
+ M_TAIL(v5,80)
+
+ .p2align 5
+L(tail7):
+ M_TAIL(v6,96)
+
+ .p2align 5
+L(tail8):
+ M_TAIL(v7,112)
+
+ .p2align 5
+L(tail9):
+ M_TAIL(v8,128)
+
+ .p2align 5
+L(tail10):
+ M_TAIL(v9,144)
+
+ .p2align 5
+L(tail11):
+ M_TAIL(v10,160)
+
+ .p2align 5
+L(tail12):
+ M_TAIL(v0,176)
+
+ .p2align 5
+L(tail13):
+ M_TAIL(v1,192)
+
+ .p2align 5
+L(tail14):
+ M_TAIL(v2,208)
+
+ .p2align 5
+L(tail15):
+ M_TAIL(v3,224)
+
+ .p2align 5
+L(found):
+ vctzlsbb r7,v6
+ cmpld r5,r7
+ ble L(null)
+ add r3,r3,r7
+ blr
+
+ .p2align 5
+L(null):
+ li r3,0
+ blr
+
+END (MEMCHR)
+
+weak_alias (__memchr, memchr)
+libc_hidden_builtin_def (memchr)
diff --git a/sysdeps/powerpc/powerpc64/multiarch/Makefile b/sysdeps/powerpc/powerpc64/multiarch/Makefile
index 27d8495503..eb3d72a11c 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/Makefile
+++ b/sysdeps/powerpc/powerpc64/multiarch/Makefile
@@ -31,10 +31,11 @@ sysdep_routines += memcpy-power8-cached memcpy-power7 memcpy-a2 memcpy-power6 \
strncase-power8
ifneq (,$(filter %le,$(config-machine)))
-sysdep_routines += memcmp-power10 memcpy-power10 memmove-power10 memset-power10 \
- rawmemchr-power9 rawmemchr-power10 \
- strcmp-power9 strncmp-power9 strcpy-power9 stpcpy-power9 \
- strlen-power9 strncpy-power9 stpncpy-power9 strlen-power10
+sysdep_routines += memchr-power10 memcmp-power10 memcpy-power10 \
+ memmove-power10 memset-power10 rawmemchr-power9 \
+ rawmemchr-power10 strcmp-power9 strncmp-power9 \
+ strcpy-power9 stpcpy-power9 strlen-power9 strncpy-power9 \
+ stpncpy-power9 strlen-power10
endif
CFLAGS-strncase-power7.c += -mcpu=power7 -funroll-loops
CFLAGS-strncase_l-power7.c += -mcpu=power7 -funroll-loops
diff --git a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
index fc26dd0e17..b353ca4c3a 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
+++ b/sysdeps/powerpc/powerpc64/multiarch/ifunc-impl-list.c
@@ -226,6 +226,12 @@ __libc_ifunc_impl_list (const char *name, struct libc_ifunc_impl *array,
/* Support sysdeps/powerpc/powerpc64/multiarch/memchr.c. */
IFUNC_IMPL (i, name, memchr,
+#ifdef __LITTLE_ENDIAN__
+ IFUNC_IMPL_ADD (array, i, memchr,
+ hwcap2 & PPC_FEATURE2_ARCH_3_1
+ && hwcap & PPC_FEATURE_HAS_VSX,
+ __memchr_power10)
+#endif
IFUNC_IMPL_ADD (array, i, memchr,
hwcap2 & PPC_FEATURE2_ARCH_2_07
&& hwcap & PPC_FEATURE_HAS_ALTIVEC,
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S b/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S
new file mode 100644
index 0000000000..b9ed792676
--- /dev/null
+++ b/sysdeps/powerpc/powerpc64/multiarch/memchr-power10.S
@@ -0,0 +1,28 @@
+/* Optimized memchr implementation for POWER10/PPC64.
+ Copyright (C) 2016-2023 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
+
+#if defined __LITTLE_ENDIAN__ && IS_IN (libc)
+#define MEMCHR __memchr_power10
+
+#undef libc_hidden_builtin_def
+#define libc_hidden_builtin_def(name)
+#undef weak_alias
+#define weak_alias(name,alias)
+
+#include <sysdeps/powerpc/powerpc64/le/power10/memchr.S>
+#endif
diff --git a/sysdeps/powerpc/powerpc64/multiarch/memchr.c b/sysdeps/powerpc/powerpc64/multiarch/memchr.c
index a1a8f3eedd..dbb30fe51d 100644
--- a/sysdeps/powerpc/powerpc64/multiarch/memchr.c
+++ b/sysdeps/powerpc/powerpc64/multiarch/memchr.c
@@ -25,15 +25,23 @@ extern __typeof (__memchr) __memchr_ppc attribute_hidden;
extern __typeof (__memchr) __memchr_power7 attribute_hidden;
extern __typeof (__memchr) __memchr_power8 attribute_hidden;
+# ifdef __LITTLE_ENDIAN__
+extern __typeof (__memchr) __memchr_power10 attribute_hidden;
+# endif
/* Avoid DWARF definition DIE on ifunc symbol so that GDB can handle
ifunc symbol properly. */
libc_ifunc (__memchr,
- (hwcap2 & PPC_FEATURE2_ARCH_2_07
- && hwcap & PPC_FEATURE_HAS_ALTIVEC)
- ? __memchr_power8 :
- (hwcap & PPC_FEATURE_ARCH_2_06)
- ? __memchr_power7
- : __memchr_ppc);
+# ifdef __LITTLE_ENDIAN__
+ (hwcap2 & PPC_FEATURE2_ARCH_3_1
+ && hwcap & PPC_FEATURE_HAS_VSX)
+ ? __memchr_power10 :
+# endif
+ (hwcap2 & PPC_FEATURE2_ARCH_2_07
+ && hwcap & PPC_FEATURE_HAS_ALTIVEC)
+ ? __memchr_power8 :
+ (hwcap & PPC_FEATURE_ARCH_2_06)
+ ? __memchr_power7
+ : __memchr_ppc);
weak_alias (__memchr, memchr)
libc_hidden_builtin_def (memchr)
--
2.39.3
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-11-16 9:49 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-11-13 16:33 [PATCH 0/2] *** Add optimized memchr for power10 *** bmahi496
2023-11-13 16:33 ` [PATCH 1/2] powerpc : Add optimized memchr for POWER10 bmahi496
2023-11-13 16:33 ` [PATCH 2/2] powerpc: memchr benchmarking results with power10 optimized memchr bmahi496
2023-11-16 9:49 [PATCH 1/2] powerpc : Add optimized memchr for POWER10 bmahi496
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).