summaryrefslogtreecommitdiffstats
path: root/lib/iolog
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 14:37:38 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 14:37:38 +0000
commitae581a19fbe896a797450b9d9573fb66f2735227 (patch)
tree56c40be8518a29c9351364d13a9676aa83932dc0 /lib/iolog
parentInitial commit. (diff)
downloadsudo-ae581a19fbe896a797450b9d9573fb66f2735227.tar.xz
sudo-ae581a19fbe896a797450b9d9573fb66f2735227.zip
Adding upstream version 1.9.13p3.upstream/1.9.13p3upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'lib/iolog')
-rw-r--r--lib/iolog/Makefile.in851
-rw-r--r--lib/iolog/host_port.c109
-rw-r--r--lib/iolog/hostcheck.c400
-rw-r--r--lib/iolog/iolog_clearerr.c45
-rw-r--r--lib/iolog/iolog_close.c80
-rw-r--r--lib/iolog/iolog_conf.c202
-rw-r--r--lib/iolog/iolog_eof.c54
-rw-r--r--lib/iolog/iolog_filter.c248
-rw-r--r--lib/iolog/iolog_flush.c66
-rw-r--r--lib/iolog/iolog_gets.c78
-rw-r--r--lib/iolog/iolog_json.c938
-rw-r--r--lib/iolog/iolog_json.h50
-rw-r--r--lib/iolog/iolog_legacy.c168
-rw-r--r--lib/iolog/iolog_loginfo.c238
-rw-r--r--lib/iolog/iolog_mkdirs.c143
-rw-r--r--lib/iolog/iolog_mkdtemp.c99
-rw-r--r--lib/iolog/iolog_mkpath.c65
-rw-r--r--lib/iolog/iolog_nextid.c151
-rw-r--r--lib/iolog/iolog_open.c127
-rw-r--r--lib/iolog/iolog_openat.c90
-rw-r--r--lib/iolog/iolog_path.c130
-rw-r--r--lib/iolog/iolog_read.c79
-rw-r--r--lib/iolog/iolog_seek.c69
-rw-r--r--lib/iolog/iolog_swapids.c95
-rw-r--r--lib/iolog/iolog_timing.c273
-rw-r--r--lib/iolog/iolog_util.c74
-rw-r--r--lib/iolog/iolog_write.c105
-rw-r--r--lib/iolog/regress/corpus/seed/log_json/id.json36
-rw-r--r--lib/iolog/regress/corpus/seed/log_json/ls.json31
-rw-r--r--lib/iolog/regress/corpus/seed/log_json/mailq.json31
-rw-r--r--lib/iolog/regress/corpus/seed/log_json/make.json36
-rw-r--r--lib/iolog/regress/corpus/seed/log_json/pkg_add.json34
-rw-r--r--lib/iolog/regress/corpus/seed/log_json/pkg_delete.json34
-rw-r--r--lib/iolog/regress/corpus/seed/log_json/printenv.json34
-rw-r--r--lib/iolog/regress/corpus/seed/log_legacy/id.log3
-rw-r--r--lib/iolog/regress/corpus/seed/log_legacy/less.log3
-rw-r--r--lib/iolog/regress/corpus/seed/log_legacy/ls.log3
-rw-r--r--lib/iolog/regress/corpus/seed/log_legacy/mailq.log3
-rw-r--r--lib/iolog/regress/corpus/seed/log_legacy/make.log3
-rw-r--r--lib/iolog/regress/corpus/seed/log_legacy/pkg_add.log3
-rw-r--r--lib/iolog/regress/corpus/seed/log_legacy/pkg_delete.log3
-rw-r--r--lib/iolog/regress/corpus/seed/log_legacy/printenv.log3
-rw-r--r--lib/iolog/regress/corpus/seed/log_legacy/smtpctl.log3
-rw-r--r--lib/iolog/regress/corpus/seed/log_legacy/vi.log3
-rw-r--r--lib/iolog/regress/corpus/seed/timing/timing.151
-rw-r--r--lib/iolog/regress/corpus/seed/timing/timing.2196
-rw-r--r--lib/iolog/regress/corpus/seed/timing/timing.3988
-rw-r--r--lib/iolog/regress/corpus/seed/timing/timing.48
-rw-r--r--lib/iolog/regress/corpus/seed/timing/timing.5110
-rw-r--r--lib/iolog/regress/corpus/seed/timing/timing.615185
-rw-r--r--lib/iolog/regress/corpus/seed/timing/timing.710
-rw-r--r--lib/iolog/regress/corpus/seed/timing/timing.8891
-rw-r--r--lib/iolog/regress/corpus/seed/timing/timing.9416
-rw-r--r--lib/iolog/regress/fuzz/fuzz_iolog_json.c123
-rw-r--r--lib/iolog/regress/fuzz/fuzz_iolog_json.dict21
-rw-r--r--lib/iolog/regress/fuzz/fuzz_iolog_legacy.c119
-rw-r--r--lib/iolog/regress/fuzz/fuzz_iolog_legacy.dict42
-rw-r--r--lib/iolog/regress/fuzz/fuzz_iolog_timing.c132
-rw-r--r--lib/iolog/regress/fuzz/fuzz_iolog_timing.dict89
-rw-r--r--lib/iolog/regress/host_port/host_port_test.c145
-rw-r--r--lib/iolog/regress/iolog_filter/check_iolog_filter.c203
-rw-r--r--lib/iolog/regress/iolog_filter/test1/log3
-rw-r--r--lib/iolog/regress/iolog_filter/test1/timing44
-rw-r--r--lib/iolog/regress/iolog_filter/test1/ttyin1
-rw-r--r--lib/iolog/regress/iolog_filter/test1/ttyin.filtered1
-rw-r--r--lib/iolog/regress/iolog_filter/test1/ttyout7
-rw-r--r--lib/iolog/regress/iolog_filter/test2/log3
-rw-r--r--lib/iolog/regress/iolog_filter/test2/timing73
-rw-r--r--lib/iolog/regress/iolog_filter/test2/ttyin1
-rw-r--r--lib/iolog/regress/iolog_filter/test2/ttyin.filtered1
-rw-r--r--lib/iolog/regress/iolog_filter/test2/ttyout4
-rw-r--r--lib/iolog/regress/iolog_filter/test3/log3
-rw-r--r--lib/iolog/regress/iolog_filter/test3/timing54
-rw-r--r--lib/iolog/regress/iolog_filter/test3/ttyin1
-rw-r--r--lib/iolog/regress/iolog_filter/test3/ttyin.filtered1
-rw-r--r--lib/iolog/regress/iolog_filter/test3/ttyout6
-rw-r--r--lib/iolog/regress/iolog_json/check_iolog_json.c265
-rw-r--r--lib/iolog/regress/iolog_json/test1.in34
-rw-r--r--lib/iolog/regress/iolog_json/test2.in28
-rw-r--r--lib/iolog/regress/iolog_json/test2.out.ok34
-rw-r--r--lib/iolog/regress/iolog_json/test3.in22
-rw-r--r--lib/iolog/regress/iolog_json/test3.out.ok22
-rw-r--r--lib/iolog/regress/iolog_mkpath/check_iolog_mkpath.c115
-rw-r--r--lib/iolog/regress/iolog_path/check_iolog_path.c296
-rw-r--r--lib/iolog/regress/iolog_path/data96
-rw-r--r--lib/iolog/regress/iolog_timing/check_iolog_timing.c161
86 files changed, 25298 insertions, 0 deletions
diff --git a/lib/iolog/Makefile.in b/lib/iolog/Makefile.in
new file mode 100644
index 0000000..61bc058
--- /dev/null
+++ b/lib/iolog/Makefile.in
@@ -0,0 +1,851 @@
+#
+# SPDX-License-Identifier: ISC
+#
+# Copyright (c) 2011-2022 Todd C. Miller <Todd.Miller@sudo.ws>
+#
+# Permission to use, copy, modify, and distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+# @configure_input@
+#
+
+#### Start of system configuration section. ####
+
+srcdir = @srcdir@
+abs_srcdir = @abs_srcdir@
+top_srcdir = @top_srcdir@
+abs_top_srcdir = @abs_top_srcdir@
+top_builddir = @top_builddir@
+abs_top_builddir = @abs_top_builddir@
+devdir = @devdir@
+incdir = $(top_srcdir)/include
+scriptdir = $(top_srcdir)/scripts
+cross_compiling = @CROSS_COMPILING@
+
+# Compiler & tools to use
+CC = @CC@
+LIBTOOL = @LIBTOOL@
+SHA1SUM = @SHA1SUM@
+EGREP = @EGREP@
+SED = @SED@
+
+# Libraries
+LT_LIBS = $(top_builddir)/lib/util/libsudo_util.la
+LIBS = @LIBS@ @ZLIB@ $(LT_LIBS)
+
+# C preprocessor flags
+CPPFLAGS = -I$(incdir) -I$(top_builddir) -I$(srcdir) @CPPFLAGS@
+
+# Usually -O and/or -g
+CFLAGS = @CFLAGS@
+
+# Flags to pass to the link stage
+LDFLAGS = @LDFLAGS@
+
+# Flags to pass to libtool
+LTFLAGS = @LT_STATIC@
+
+# Address sanitizer flags
+ASAN_CFLAGS = @ASAN_CFLAGS@
+ASAN_LDFLAGS = @ASAN_LDFLAGS@
+
+# PIE flags
+PIE_CFLAGS = @PIE_CFLAGS@
+PIE_LDFLAGS = @PIE_LDFLAGS@
+
+# Stack smashing protection flags
+HARDENING_CFLAGS = @HARDENING_CFLAGS@
+HARDENING_LDFLAGS = @HARDENING_LDFLAGS@
+
+# cppcheck options, usually set in the top-level Makefile
+CPPCHECK_OPTS = -q --enable=warning,performance,portability --suppress=constStatement --suppress=compareBoolExpressionWithInt --error-exitcode=1 --inline-suppr -Dva_copy=va_copy -U__cplusplus -UQUAD_MAX -UQUAD_MIN -UUQUAD_MAX -U_POSIX_HOST_NAME_MAX -U_POSIX_PATH_MAX -U__NBBY -DNSIG=64
+
+# splint options, usually set in the top-level Makefile
+SPLINT_OPTS = -D__restrict= -checks
+
+# PVS-studio options
+PVS_CFG = $(top_srcdir)/PVS-Studio.cfg
+PVS_IGNORE = 'V707,V011,V002,V536'
+PVS_LOG_OPTS = -a 'GA:1,2' -e -t errorfile -d $(PVS_IGNORE)
+
+# Regression tests
+TEST_PROGS = check_iolog_filter check_iolog_json check_iolog_mkpath \
+ check_iolog_path check_iolog_timing host_port_test
+TEST_LIBS = @LIBS@
+TEST_LDFLAGS = @LDFLAGS@
+TEST_VERBOSE =
+
+# Fuzzers
+LIBFUZZSTUB = $(top_builddir)/lib/fuzzstub/libsudo_fuzzstub.la
+LIB_FUZZING_ENGINE = @FUZZ_ENGINE@
+FUZZ_PROGS = fuzz_iolog_json fuzz_iolog_legacy fuzz_iolog_timing
+FUZZ_SEED_CORPUS = ${FUZZ_PROGS:=_seed_corpus.zip}
+FUZZ_LIBS = $(LIB_FUZZING_ENGINE) @LIBS@ \
+ $(top_builddir)/lib/eventlog/libsudo_eventlog.la
+FUZZ_LDFLAGS = @LDFLAGS@
+FUZZ_MAX_LEN = 4096
+FUZZ_RUNS = 8192
+FUZZ_VERBOSE =
+
+# Set to non-empty for development mode
+DEVEL = @DEVEL@
+
+#### End of system configuration section. ####
+
+SHELL = @SHELL@
+
+LIBIOLOG_OBJS = host_port.lo hostcheck.lo iolog_clearerr.lo iolog_close.lo \
+ iolog_conf.lo iolog_eof.lo iolog_filter.lo iolog_flush.lo \
+ iolog_gets.lo iolog_json.lo iolog_legacy.lo iolog_loginfo.lo \
+ iolog_mkdirs.lo iolog_mkdtemp.lo iolog_mkpath.lo \
+ iolog_nextid.lo iolog_open.lo iolog_openat.lo iolog_path.lo \
+ iolog_read.lo iolog_seek.lo iolog_swapids.lo iolog_timing.lo \
+ iolog_util.lo iolog_write.lo
+
+IOBJS = $(LIBIOLOG_OBJS:.lo=.i)
+
+POBJS = $(IOBJS:.i=.plog)
+
+CHECK_IOLOG_MKPATH_OBJS = check_iolog_mkpath.lo
+
+CHECK_IOLOG_PATH_OBJS = check_iolog_path.lo
+
+CHECK_IOLOG_TIMING_OBJS = check_iolog_timing.lo
+
+CHECK_IOLOG_FILTER_OBJS = check_iolog_filter.lo
+
+CHECK_IOLOG_JSON_OBJS = check_iolog_json.lo
+
+HOST_PORT_TEST_OBJS = host_port_test.lo
+
+FUZZ_IOLOG_JSON_OBJS = fuzz_iolog_json.lo
+
+FUZZ_IOLOG_JSON_CORPUS = $(srcdir)/regress/corpus/seed/log_json/*.json
+
+FUZZ_IOLOG_LEGACY_OBJS = fuzz_iolog_legacy.lo
+
+FUZZ_IOLOG_LEGACY_CORPUS = $(srcdir)/regress/corpus/seed/log_legacy/*.log
+
+FUZZ_IOLOG_TIMING_OBJS = fuzz_iolog_timing.lo
+
+FUZZ_IOLOG_TIMING_CORPUS = $(srcdir)/regress/corpus/seed/timing/timing.*
+
+all: libsudo_iolog.la
+
+depend:
+ $(scriptdir)/mkdep.pl --srcdir=$(abs_top_srcdir) \
+ --builddir=$(abs_top_builddir) lib/iolog/Makefile.in
+ cd $(top_builddir) && ./config.status --file lib/iolog/Makefile
+
+Makefile: $(srcdir)/Makefile.in
+ cd $(top_builddir) && ./config.status --file lib/iolog/Makefile
+
+.SUFFIXES: .c .h .i .lo .plog
+
+.c.lo:
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $<
+
+.c.i:
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+
+.i.plog:
+ ifile=$<; rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $${ifile%i}c --i-file $< --output-file $@
+
+libsudo_iolog.la: $(LIBIOLOG_OBJS) $(LT_LIBS)
+ $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(LIBIOLOG_OBJS) $(LT_LIBS) @ZLIB@ @NET_LIBS@
+
+check_iolog_path: $(CHECK_IOLOG_PATH_OBJS) libsudo_iolog.la
+ $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_IOLOG_PATH_OBJS) libsudo_iolog.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS)
+
+check_iolog_mkpath: $(CHECK_IOLOG_MKPATH_OBJS) libsudo_iolog.la
+ $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_IOLOG_MKPATH_OBJS) libsudo_iolog.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS)
+
+check_iolog_timing: $(CHECK_IOLOG_TIMING_OBJS) libsudo_iolog.la
+ $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_IOLOG_TIMING_OBJS) libsudo_iolog.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS)
+
+check_iolog_filter: $(CHECK_IOLOG_FILTER_OBJS) libsudo_iolog.la
+ $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_IOLOG_FILTER_OBJS) libsudo_iolog.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS)
+
+check_iolog_json: $(CHECK_IOLOG_JSON_OBJS) libsudo_iolog.la
+ $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(CHECK_IOLOG_JSON_OBJS) libsudo_iolog.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS)
+
+host_port_test: $(HOST_PORT_TEST_OBJS) libsudo_iolog.la
+ $(LIBTOOL) $(LTFLAGS) --mode=link $(CC) -o $@ $(HOST_PORT_TEST_OBJS) libsudo_iolog.la $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(TEST_LDFLAGS) $(TEST_LIBS)
+
+fuzz_iolog_json: $(FUZZ_IOLOG_JSON_OBJS) $(LIBFUZZSTUB) libsudo_iolog.la
+ $(LIBTOOL) $(LTFLAGS) --mode=link @FUZZ_LD@ -o $@ $(FUZZ_IOLOG_JSON_OBJS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(FUZZ_LDFLAGS) $(FUZZ_LIBS) libsudo_iolog.la
+
+fuzz_iolog_legacy: $(FUZZ_IOLOG_LEGACY_OBJS) $(LIBFUZZSTUB) libsudo_iolog.la
+ $(LIBTOOL) $(LTFLAGS) --mode=link @FUZZ_LD@ -o $@ $(FUZZ_IOLOG_LEGACY_OBJS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(FUZZ_LDFLAGS) $(FUZZ_LIBS) libsudo_iolog.la
+
+fuzz_iolog_timing: $(FUZZ_IOLOG_TIMING_OBJS) $(LIBFUZZSTUB) libsudo_iolog.la
+ $(LIBTOOL) $(LTFLAGS) --mode=link @FUZZ_LD@ -o $@ $(FUZZ_IOLOG_TIMING_OBJS) $(ASAN_LDFLAGS) $(PIE_LDFLAGS) $(HARDENING_LDFLAGS) $(FUZZ_LDFLAGS) $(FUZZ_LIBS) libsudo_iolog.la
+
+fuzz_iolog_json_seed_corpus.zip:
+ tdir=fuzz_iolog_json.$$$$; \
+ mkdir $$tdir; \
+ for f in $(FUZZ_IOLOG_JSON_CORPUS); do \
+ cp $$f $$tdir/`$(SHA1SUM) $$f | $(SED) -e 's/^.*= *//' -e 's/ .*//'`; \
+ done; \
+ zip -j $@ $$tdir/*; \
+ rm -rf $$tdir
+
+run-fuzz_iolog_json: fuzz_iolog_json
+ l=`locale -a 2>&1 | $(EGREP) -i '^C\.UTF-?8$$' | $(SED) 1q` || true; \
+ test -n "$$l" || l="C"; \
+ LC_ALL="$$l"; export LC_ALL; \
+ unset LANG || LANG=; \
+ unset LANGUAGE || LANGUAGE=; \
+ MALLOC_OPTIONS=S; export MALLOC_OPTIONS; \
+ MALLOC_CONF="abort:true,junk:true"; export MALLOC_CONF; \
+ umask 022; \
+ corpus=regress/corpus/iolog_json; \
+ mkdir -p $$corpus; \
+ for f in $(FUZZ_IOLOG_JSON_CORPUS); do \
+ cp $$f $$corpus; \
+ done; \
+ ./fuzz_iolog_json -dict=$(srcdir)/regress/fuzz/fuzz_iolog_json.dict -max_len=$(FUZZ_MAX_LEN) -runs=$(FUZZ_RUNS) $(FUZZ_VERBOSE) $$corpus
+
+fuzz_iolog_legacy_seed_corpus.zip:
+ tdir=fuzz_iolog_legacy.$$$$; \
+ mkdir $$tdir; \
+ for f in $(FUZZ_IOLOG_LEGACY_CORPUS); do \
+ cp $$f $$tdir/`$(SHA1SUM) $$f | $(SED) -e 's/^.*= *//' -e 's/ .*//'`; \
+ done; \
+ zip -j $@ $$tdir/*; \
+ rm -rf $$tdir
+
+run-fuzz_iolog_legacy: fuzz_iolog_legacy
+ l=`locale -a 2>&1 | $(EGREP) -i '^C\.UTF-?8$$' | $(SED) 1q` || true; \
+ test -n "$$l" || l="C"; \
+ LC_ALL="$$l"; export LC_ALL; \
+ unset LANG || LANG=; \
+ unset LANGUAGE || LANGUAGE=; \
+ MALLOC_OPTIONS=S; export MALLOC_OPTIONS; \
+ MALLOC_CONF="abort:true,junk:true"; export MALLOC_CONF; \
+ umask 022; \
+ corpus=regress/corpus/iolog_legacy; \
+ mkdir -p $$corpus; \
+ for f in $(FUZZ_IOLOG_LEGACY_CORPUS); do \
+ cp $$f $$corpus; \
+ done; \
+ ./fuzz_iolog_legacy -dict=$(srcdir)/regress/fuzz/fuzz_iolog_legacy.dict -max_len=$(FUZZ_MAX_LEN) -runs=$(FUZZ_RUNS) $(FUZZ_VERBOSE) $$corpus
+
+fuzz_iolog_timing_seed_corpus.zip:
+ tdir=fuzz_iolog_timing.$$$$; \
+ mkdir $$tdir; \
+ for f in $(FUZZ_IOLOG_TIMING_CORPUS); do \
+ cp $$f $$tdir/`$(SHA1SUM) $$f | $(SED) -e 's/^.*= *//' -e 's/ .*//'`; \
+ done; \
+ zip -j $@ $$tdir/*; \
+ rm -rf $$tdir
+
+run-fuzz_iolog_timing: fuzz_iolog_timing
+ l=`locale -a 2>&1 | $(EGREP) -i '^C\.UTF-?8$$' | $(SED) 1q` || true; \
+ test -n "$$l" || l="C"; \
+ LC_ALL="$$l"; export LC_ALL; \
+ unset LANG || LANG=; \
+ unset LANGUAGE || LANGUAGE=; \
+ MALLOC_OPTIONS=S; export MALLOC_OPTIONS; \
+ MALLOC_CONF="abort:true,junk:true"; export MALLOC_CONF; \
+ umask 022; \
+ corpus=regress/corpus/iolog_timing; \
+ mkdir -p $$corpus; \
+ for f in $(FUZZ_IOLOG_TIMING_CORPUS); do \
+ cp $$f $$corpus; \
+ done; \
+ ./fuzz_iolog_timing -dict=$(srcdir)/regress/fuzz/fuzz_iolog_timing.dict -max_len=$(FUZZ_MAX_LEN) -runs=$(FUZZ_RUNS) $(FUZZ_VERBOSE) $$corpus
+
+pre-install:
+
+install:
+
+install-binaries:
+
+install-includes:
+
+install-doc:
+
+install-plugin:
+
+install-fuzzer: $(FUZZ_PROGS) $(FUZZ_SEED_CORPUS)
+ @if test X"$(FUZZ_DESTDIR)" = X""; then \
+ echo "must set FUZZ_DESTDIR for install-fuzzer target"; \
+ else \
+ cp $(FUZZ_PROGS) $(FUZZ_SEED_CORPUS) $(FUZZ_DESTDIR); \
+ cp $(srcdir)/regress/fuzz/*.dict $(FUZZ_DESTDIR); \
+ fi
+
+uninstall:
+
+splint:
+ splint $(SPLINT_OPTS) -I$(incdir) -I$(top_builddir) $(srcdir)/*.c
+
+cppcheck:
+ cppcheck $(CPPCHECK_OPTS) -I$(incdir) -I$(top_builddir) $(srcdir)/*.c
+
+pvs-log-files: $(POBJS)
+
+pvs-studio: $(POBJS)
+ plog-converter $(PVS_LOG_OPTS) $(POBJS)
+
+fuzz: run-fuzz_iolog_json run-fuzz_iolog_legacy run-fuzz_iolog_timing
+
+check-fuzzer: $(FUZZ_PROGS)
+ @if test X"$(cross_compiling)" != X"yes"; then \
+ l=`locale -a 2>&1 | $(EGREP) -i '^C\.UTF-?8$$' | $(SED) 1q` || true; \
+ test -n "$$l" || l="C"; \
+ LC_ALL="$$l"; export LC_ALL; \
+ unset LANG || LANG=; \
+ unset LANGUAGE || LANGUAGE=; \
+ MALLOC_OPTIONS=S; export MALLOC_OPTIONS; \
+ MALLOC_CONF="abort:true,junk:true"; export MALLOC_CONF; \
+ echo "fuzz_iolog_legacy: verifying corpus"; \
+ ./fuzz_iolog_legacy $(FUZZ_VERBOSE) $(FUZZ_IOLOG_LEGACY_CORPUS); \
+ echo "fuzz_iolog_json: verifying corpus"; \
+ ./fuzz_iolog_json $(FUZZ_VERBOSE) $(FUZZ_IOLOG_JSON_CORPUS); \
+ echo "fuzz_iolog_timing: verifying corpus"; \
+ ./fuzz_iolog_timing $(FUZZ_VERBOSE) $(FUZZ_IOLOG_TIMING_CORPUS); \
+ fi
+
+check: $(TEST_PROGS) check-fuzzer
+ @if test X"$(cross_compiling)" != X"yes"; then \
+ l=`locale -a 2>&1 | $(EGREP) -i '^C\.UTF-?8$$' | $(SED) 1q` || true; \
+ test -n "$$l" || l="C"; \
+ LC_ALL="$$l"; export LC_ALL; \
+ unset LANG || LANG=; \
+ unset LANGUAGE || LANGUAGE=; \
+ MALLOC_OPTIONS=S; export MALLOC_OPTIONS; \
+ MALLOC_CONF="abort:true,junk:true"; export MALLOC_CONF; \
+ rval=0; \
+ ./check_iolog_filter $(srcdir)/regress/iolog_filter/test[1-9]* || rval=`expr $$rval + $$?`; \
+ ./check_iolog_json $(srcdir)/regress/iolog_json/*.in || rval=`expr $$rval + $$?`; \
+ ./check_iolog_path $(srcdir)/regress/iolog_path/data || rval=`expr $$rval + $$?`; \
+ ./check_iolog_mkpath || rval=`expr $$rval + $$?`; \
+ ./check_iolog_timing || rval=`expr $$rval + $$?`; \
+ ./host_port_test || rval=`expr $$rval + $$?`; \
+ exit $$rval; \
+ fi
+
+check-verbose:
+ exec $(MAKE) $(MFLAGS) TEST_VERBOSE=-v FUZZ_VERBOSE=-verbosity=1 check
+
+clean:
+ -$(LIBTOOL) $(LTFLAGS) --mode=clean rm -f $(TEST_PROGS) $(FUZZ_PROGS) \
+ *.lo *.o *.la
+ -rm -f *.i *.plog stamp-* core *.core core.* regress/*/*.out \
+ regress/*/*.err regress/corpus/iolog_json \
+ regress/corpus/iolog_legacy regress/corpus/iolog_timing
+
+mostlyclean: clean
+
+distclean: clean
+ -rm -rf Makefile .libs
+
+clobber: distclean
+
+realclean: distclean
+ rm -f TAGS tags
+
+cleandir: realclean
+
+.PHONY: clean mostlyclean distclean cleandir clobber realclean \
+ $(FUZZ_SEED_CORPUS) run-fuzz_iolog_json run-fuzz_iolog_legacy \
+ run-fuzz_iolog_timing
+
+# Autogenerated dependencies, do not modify
+check_iolog_filter.lo: $(srcdir)/regress/iolog_filter/check_iolog_filter.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/regress/iolog_filter/check_iolog_filter.c
+check_iolog_filter.i: $(srcdir)/regress/iolog_filter/check_iolog_filter.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+check_iolog_filter.plog: check_iolog_filter.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/iolog_filter/check_iolog_filter.c --i-file $< --output-file $@
+check_iolog_json.lo: $(srcdir)/regress/iolog_json/check_iolog_json.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_json.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(srcdir)/iolog_json.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/regress/iolog_json/check_iolog_json.c
+check_iolog_json.i: $(srcdir)/regress/iolog_json/check_iolog_json.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_json.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(srcdir)/iolog_json.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+check_iolog_json.plog: check_iolog_json.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/iolog_json/check_iolog_json.c --i-file $< --output-file $@
+check_iolog_mkpath.lo: $(srcdir)/regress/iolog_mkpath/check_iolog_mkpath.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/regress/iolog_mkpath/check_iolog_mkpath.c
+check_iolog_mkpath.i: $(srcdir)/regress/iolog_mkpath/check_iolog_mkpath.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+check_iolog_mkpath.plog: check_iolog_mkpath.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/iolog_mkpath/check_iolog_mkpath.c --i-file $< --output-file $@
+check_iolog_path.lo: $(srcdir)/regress/iolog_path/check_iolog_path.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/regress/iolog_path/check_iolog_path.c
+check_iolog_path.i: $(srcdir)/regress/iolog_path/check_iolog_path.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+check_iolog_path.plog: check_iolog_path.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/iolog_path/check_iolog_path.c --i-file $< --output-file $@
+check_iolog_timing.lo: $(srcdir)/regress/iolog_timing/check_iolog_timing.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/regress/iolog_timing/check_iolog_timing.c
+check_iolog_timing.i: $(srcdir)/regress/iolog_timing/check_iolog_timing.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+check_iolog_timing.plog: check_iolog_timing.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/iolog_timing/check_iolog_timing.c --i-file $< --output-file $@
+fuzz_iolog_json.lo: $(srcdir)/regress/fuzz/fuzz_iolog_json.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_json.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(srcdir)/iolog_json.h $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/regress/fuzz/fuzz_iolog_json.c
+fuzz_iolog_json.i: $(srcdir)/regress/fuzz/fuzz_iolog_json.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_json.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(srcdir)/iolog_json.h $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+fuzz_iolog_json.plog: fuzz_iolog_json.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/fuzz/fuzz_iolog_json.c --i-file $< --output-file $@
+fuzz_iolog_legacy.lo: $(srcdir)/regress/fuzz/fuzz_iolog_legacy.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/regress/fuzz/fuzz_iolog_legacy.c
+fuzz_iolog_legacy.i: $(srcdir)/regress/fuzz/fuzz_iolog_legacy.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+fuzz_iolog_legacy.plog: fuzz_iolog_legacy.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/fuzz/fuzz_iolog_legacy.c --i-file $< --output-file $@
+fuzz_iolog_timing.lo: $(srcdir)/regress/fuzz/fuzz_iolog_timing.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/regress/fuzz/fuzz_iolog_timing.c
+fuzz_iolog_timing.i: $(srcdir)/regress/fuzz/fuzz_iolog_timing.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_debug.h $(incdir)/sudo_eventlog.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+fuzz_iolog_timing.plog: fuzz_iolog_timing.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/fuzz/fuzz_iolog_timing.c --i-file $< --output-file $@
+host_port.lo: $(srcdir)/host_port.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/host_port.c
+host_port.i: $(srcdir)/host_port.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+host_port.plog: host_port.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/host_port.c --i-file $< --output-file $@
+host_port_test.lo: $(srcdir)/regress/host_port/host_port_test.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/regress/host_port/host_port_test.c
+host_port_test.i: $(srcdir)/regress/host_port/host_port_test.c \
+ $(incdir)/compat/stdbool.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+host_port_test.plog: host_port_test.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/regress/host_port/host_port_test.c --i-file $< --output-file $@
+hostcheck.lo: $(srcdir)/hostcheck.c $(incdir)/compat/stdbool.h \
+ $(incdir)/hostcheck.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_debug.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/hostcheck.c
+hostcheck.i: $(srcdir)/hostcheck.c $(incdir)/compat/stdbool.h \
+ $(incdir)/hostcheck.h $(incdir)/sudo_compat.h \
+ $(incdir)/sudo_debug.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+hostcheck.plog: hostcheck.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/hostcheck.c --i-file $< --output-file $@
+iolog_clearerr.lo: $(srcdir)/iolog_clearerr.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_clearerr.c
+iolog_clearerr.i: $(srcdir)/iolog_clearerr.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_clearerr.plog: iolog_clearerr.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_clearerr.c --i-file $< --output-file $@
+iolog_close.lo: $(srcdir)/iolog_close.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_close.c
+iolog_close.i: $(srcdir)/iolog_close.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_close.plog: iolog_close.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_close.c --i-file $< --output-file $@
+iolog_conf.lo: $(srcdir)/iolog_conf.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h \
+ $(top_builddir)/pathnames.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_conf.c
+iolog_conf.i: $(srcdir)/iolog_conf.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h \
+ $(top_builddir)/pathnames.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_conf.plog: iolog_conf.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_conf.c --i-file $< --output-file $@
+iolog_eof.lo: $(srcdir)/iolog_eof.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_eof.c
+iolog_eof.i: $(srcdir)/iolog_eof.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_eof.plog: iolog_eof.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_eof.c --i-file $< --output-file $@
+iolog_filter.lo: $(srcdir)/iolog_filter.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_filter.c
+iolog_filter.i: $(srcdir)/iolog_filter.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_filter.plog: iolog_filter.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_filter.c --i-file $< --output-file $@
+iolog_flush.lo: $(srcdir)/iolog_flush.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_flush.c
+iolog_flush.i: $(srcdir)/iolog_flush.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_flush.plog: iolog_flush.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_flush.c --i-file $< --output-file $@
+iolog_gets.lo: $(srcdir)/iolog_gets.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_gets.c
+iolog_gets.i: $(srcdir)/iolog_gets.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_gets.plog: iolog_gets.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_gets.c --i-file $< --output-file $@
+iolog_json.lo: $(srcdir)/iolog_json.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
+ $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_json.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(srcdir)/iolog_json.h $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_json.c
+iolog_json.i: $(srcdir)/iolog_json.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
+ $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_json.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(srcdir)/iolog_json.h $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_json.plog: iolog_json.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_json.c --i-file $< --output-file $@
+iolog_legacy.lo: $(srcdir)/iolog_legacy.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
+ $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_legacy.c
+iolog_legacy.i: $(srcdir)/iolog_legacy.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
+ $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_legacy.plog: iolog_legacy.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_legacy.c --i-file $< --output-file $@
+iolog_loginfo.lo: $(srcdir)/iolog_loginfo.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
+ $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_json.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_loginfo.c
+iolog_loginfo.i: $(srcdir)/iolog_loginfo.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
+ $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_json.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_loginfo.plog: iolog_loginfo.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_loginfo.c --i-file $< --output-file $@
+iolog_mkdirs.lo: $(srcdir)/iolog_mkdirs.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_mkdirs.c
+iolog_mkdirs.i: $(srcdir)/iolog_mkdirs.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_mkdirs.plog: iolog_mkdirs.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_mkdirs.c --i-file $< --output-file $@
+iolog_mkdtemp.lo: $(srcdir)/iolog_mkdtemp.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_mkdtemp.c
+iolog_mkdtemp.i: $(srcdir)/iolog_mkdtemp.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_mkdtemp.plog: iolog_mkdtemp.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_mkdtemp.c --i-file $< --output-file $@
+iolog_mkpath.lo: $(srcdir)/iolog_mkpath.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_mkpath.c
+iolog_mkpath.i: $(srcdir)/iolog_mkpath.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_mkpath.plog: iolog_mkpath.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_mkpath.c --i-file $< --output-file $@
+iolog_nextid.lo: $(srcdir)/iolog_nextid.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_nextid.c
+iolog_nextid.i: $(srcdir)/iolog_nextid.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_nextid.plog: iolog_nextid.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_nextid.c --i-file $< --output-file $@
+iolog_open.lo: $(srcdir)/iolog_open.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_open.c
+iolog_open.i: $(srcdir)/iolog_open.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_open.plog: iolog_open.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_open.c --i-file $< --output-file $@
+iolog_openat.lo: $(srcdir)/iolog_openat.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_openat.c
+iolog_openat.i: $(srcdir)/iolog_openat.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_openat.plog: iolog_openat.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_openat.c --i-file $< --output-file $@
+iolog_path.lo: $(srcdir)/iolog_path.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_path.c
+iolog_path.i: $(srcdir)/iolog_path.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(incdir)/sudo_util.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_path.plog: iolog_path.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_path.c --i-file $< --output-file $@
+iolog_read.lo: $(srcdir)/iolog_read.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_read.c
+iolog_read.i: $(srcdir)/iolog_read.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_read.plog: iolog_read.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_read.c --i-file $< --output-file $@
+iolog_seek.lo: $(srcdir)/iolog_seek.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_seek.c
+iolog_seek.i: $(srcdir)/iolog_seek.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_seek.plog: iolog_seek.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_seek.c --i-file $< --output-file $@
+iolog_swapids.lo: $(srcdir)/iolog_swapids.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_swapids.c
+iolog_swapids.i: $(srcdir)/iolog_swapids.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_fatal.h $(incdir)/sudo_gettext.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_plugin.h \
+ $(incdir)/sudo_queue.h $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_swapids.plog: iolog_swapids.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_swapids.c --i-file $< --output-file $@
+iolog_timing.lo: $(srcdir)/iolog_timing.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
+ $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_timing.c
+iolog_timing.i: $(srcdir)/iolog_timing.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_eventlog.h $(incdir)/sudo_fatal.h \
+ $(incdir)/sudo_gettext.h $(incdir)/sudo_iolog.h \
+ $(incdir)/sudo_plugin.h $(incdir)/sudo_queue.h \
+ $(incdir)/sudo_util.h $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_timing.plog: iolog_timing.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_timing.c --i-file $< --output-file $@
+iolog_util.lo: $(srcdir)/iolog_util.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_util.c
+iolog_util.i: $(srcdir)/iolog_util.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_util.plog: iolog_util.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_util.c --i-file $< --output-file $@
+iolog_write.lo: $(srcdir)/iolog_write.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(LIBTOOL) $(LTFLAGS) --mode=compile $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $(ASAN_CFLAGS) $(PIE_CFLAGS) $(HARDENING_CFLAGS) $(srcdir)/iolog_write.c
+iolog_write.i: $(srcdir)/iolog_write.c $(incdir)/compat/stdbool.h \
+ $(incdir)/sudo_compat.h $(incdir)/sudo_debug.h \
+ $(incdir)/sudo_iolog.h $(incdir)/sudo_queue.h \
+ $(top_builddir)/config.h
+ $(CC) -E -o $@ $(CPPFLAGS) $<
+iolog_write.plog: iolog_write.i
+ rm -f $@; pvs-studio --cfg $(PVS_CFG) --sourcetree-root $(top_srcdir) --skip-cl-exe yes --source-file $(srcdir)/iolog_write.c --i-file $< --output-file $@
diff --git a/lib/iolog/host_port.c b/lib/iolog/host_port.c
new file mode 100644
index 0000000..7fcc0b0
--- /dev/null
+++ b/lib/iolog/host_port.c
@@ -0,0 +1,109 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2019-2020 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif /* HAVE_STDBOOL_H */
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_gettext.h"
+#include "sudo_util.h"
+#include "sudo_iolog.h"
+
+/*
+ * Parse a string in the form host[:port] where host can also be
+ * an IPv4 address or an IPv6 address in square brackets.
+ * Fills in hostp and portp which may point within str, which is modified.
+ */
+bool
+iolog_parse_host_port(char *str, char **hostp, char **portp, bool *tlsp,
+ const char *defport, const char *defport_tls)
+{
+ char *flags, *port, *host = str;
+ bool ret = false;
+ bool tls = false;
+ debug_decl(iolog_parse_host_port, SUDO_DEBUG_UTIL);
+
+ /* Check for IPv6 address like [::0] followed by optional port */
+ if (*host == '[') {
+ host++;
+ port = strchr(host, ']');
+ if (port == NULL) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "invalid IPv6 address %s", str);
+ goto done;
+ }
+ *port++ = '\0';
+ switch (*port) {
+ case ':':
+ port++;
+ break;
+ case '\0':
+ port = NULL; /* no port specified */
+ break;
+ case '(':
+ /* flag, handled below */
+ break;
+ default:
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "invalid IPv6 address %s", str);
+ goto done;
+ }
+ } else {
+ port = strrchr(host, ':');
+ if (port != NULL)
+ *port++ = '\0';
+ }
+
+ /* Check for optional tls flag at the end. */
+ flags = strchr(port ? port : host, '(');
+ if (flags != NULL) {
+ if (strcasecmp(flags, "(tls)") == 0)
+ tls = true;
+ *flags = '\0';
+ if (port == flags)
+ port = NULL;
+ }
+
+ if (port == NULL)
+ port = tls ? (char *)defport_tls : (char *)defport;
+ else if (*port == '\0')
+ goto done;
+
+ *hostp = host;
+ *portp = port;
+ *tlsp = tls;
+
+ ret = true;
+
+done:
+ debug_return_bool(ret);
+}
diff --git a/lib/iolog/hostcheck.c b/lib/iolog/hostcheck.c
new file mode 100644
index 0000000..d23514e
--- /dev/null
+++ b/lib/iolog/hostcheck.c
@@ -0,0 +1,400 @@
+/*
+ * Copyright (c) 2020 Laszlo Orban <laszlo.orban@oneidentity.com>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#if defined(HAVE_OPENSSL)
+# if defined(HAVE_WOLFSSL)
+# include <wolfssl/options.h>
+# endif
+# include <sys/types.h>
+# include <sys/socket.h>
+# include <netinet/in.h>
+# include <arpa/inet.h>
+# include <stdlib.h>
+# include <string.h>
+# include <netdb.h>
+
+# define NEED_INET_NTOP /* to expose sudo_inet_ntop in sudo_compat.h */
+
+# include "sudo_compat.h"
+# include "sudo_debug.h"
+# include "sudo_util.h"
+# include "hostcheck.h"
+
+#ifndef INET_ADDRSTRLEN
+# define INET_ADDRSTRLEN 16
+#endif
+#ifndef INET6_ADDRSTRLEN
+# define INET6_ADDRSTRLEN 46
+#endif
+
+/**
+ * @brief Checks if given hostname resolves to the given IP address.
+ *
+ * @param hostname hostname to be resolved
+ * @param ipaddr ip address to be checked
+ *
+ * @return 1 if hostname resolves to the given IP address
+ * 0 otherwise
+ */
+static int
+forward_lookup_match(const char *hostname, const char *ipaddr)
+{
+ int rc, ret = 0;
+ struct addrinfo *res = NULL, *p;
+ void *addr;
+ struct sockaddr_in *ipv4;
+#if defined(HAVE_STRUCT_IN6_ADDR)
+ struct sockaddr_in6 *ipv6;
+ char ipstr[INET6_ADDRSTRLEN];
+#else
+ char ipstr[INET_ADDRSTRLEN];
+#endif
+ debug_decl(forward_lookup_match, SUDO_DEBUG_UTIL);
+
+ sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
+ "verify %s resolves to %s", hostname, ipaddr);
+
+ if ((rc = getaddrinfo(hostname, NULL, NULL, &res)) != 0) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "unable to resolve %s: %s", hostname, gai_strerror(rc));
+ goto exit;
+ }
+
+ for (p = res; p != NULL; p = p->ai_next) {
+ if (p->ai_family == AF_INET) {
+ ipv4 = (struct sockaddr_in *)p->ai_addr;
+ addr = &(ipv4->sin_addr);
+#if defined(HAVE_STRUCT_IN6_ADDR)
+ } else if (p->ai_family == AF_INET6) {
+ ipv6 = (struct sockaddr_in6 *)p->ai_addr;
+ addr = &(ipv6->sin6_addr);
+#endif
+ } else {
+ goto exit;
+ }
+
+ if (inet_ntop(p->ai_family, addr, ipstr, sizeof(ipstr)) != 0) {
+ sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
+ "comparing %s to %s", ipstr, ipaddr);
+ if (strcmp(ipaddr, ipstr) == 0) {
+ ret = 1;
+ break;
+ }
+ }
+ }
+
+exit:
+ if (res != NULL) {
+ freeaddrinfo(res);
+ }
+ debug_return_int(ret);
+}
+
+/**
+ * @brief Compares the given hostname with a DNS entry in a certificate.
+ *
+ * The certificate DNS name can contain wildcards in the left-most label.
+ * A wildcard can match only one label.
+ * Accepted names:
+ * - foo.bar.example.com
+ * - *.example.com
+ * - *.bar.example.com
+ *
+ * @param hostname peer's name
+ * @param certname_asn1 hostname in the certificate
+ *
+ * @return MatchFound
+ * MatchNotFound
+ */
+static HostnameValidationResult
+validate_name(const char *hostname, ASN1_STRING *certname_asn1)
+{
+ char *certname_s = (char *) ASN1_STRING_get0_data(certname_asn1);
+ int certname_len = ASN1_STRING_length(certname_asn1);
+ int hostname_len = strlen(hostname);
+ debug_decl(validate_name, SUDO_DEBUG_UTIL);
+
+ /* remove last '.' from hostname if exists */
+ if (hostname_len != 0 && hostname[hostname_len - 1] == '.') {
+ --hostname_len;
+ }
+
+ sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO,
+ "comparing %.*s to %.*s in cert", hostname_len, hostname,
+ certname_len, certname_s);
+
+ /* skip the first label if wildcard */
+ if (certname_len > 2 && certname_s[0] == '*' && certname_s[1] == '.') {
+ if (hostname_len != 0) {
+ do {
+ --hostname_len;
+ if (*hostname++ == '.') {
+ break;
+ }
+ } while (hostname_len != 0);
+ }
+ certname_s += 2;
+ certname_len -= 2;
+ }
+ /* Compare expected hostname with the DNS name */
+ if (certname_len != hostname_len) {
+ debug_return_int(MatchNotFound);
+ }
+ if (strncasecmp(hostname, certname_s, hostname_len) != 0) {
+ debug_return_int(MatchNotFound);
+ }
+
+ debug_return_int(MatchFound);
+}
+
+/**
+ * @brief Matches a hostname with the cert's CN.
+ *
+ * @param hostname peer's name
+ * on client side: it is the name where the client is connected to
+ * on server side, it is in fact an IP address of the remote client
+ * @param ipaddr peer's IP address
+ * @param cert peer's X509 certificate
+ * @param resolve if the value is not 0, the function checks that the value of the CN
+ * resolves to the given ipaddr or not.
+ *
+ * @return MatchFound
+ * MatchNotFound
+ * MalformedCertificate
+ * Error
+ */
+static HostnameValidationResult
+matches_common_name(const char *hostname, const char *ipaddr, const X509 *cert, int resolve)
+{
+ X509_NAME_ENTRY *common_name_entry = NULL;
+ ASN1_STRING *common_name_asn1 = NULL;
+ int common_name_loc;
+ debug_decl(matches_common_name, SUDO_DEBUG_UTIL);
+
+ /* Find the position of the CN field in the Subject field of the certificate */
+ common_name_loc = X509_NAME_get_index_by_NID(X509_get_subject_name((X509 *) cert), NID_commonName, -1);
+ if (common_name_loc < 0) {
+ debug_return_int(Error);
+ }
+
+ /* Extract the CN field */
+ common_name_entry = X509_NAME_get_entry(X509_get_subject_name((X509 *) cert), common_name_loc);
+ if (common_name_entry == NULL) {
+ debug_return_int(Error);
+ }
+
+ /* Convert the CN field to a C string */
+ common_name_asn1 = X509_NAME_ENTRY_get_data(common_name_entry);
+ if (common_name_asn1 == NULL) {
+ debug_return_int(Error);
+ }
+ const unsigned char *common_name_str = ASN1_STRING_get0_data(common_name_asn1);
+
+ /* Make sure there isn't an embedded NUL character in the CN */
+ if (memchr(common_name_str, '\0', ASN1_STRING_length(common_name_asn1)) != NULL) {
+ debug_return_int(MalformedCertificate);
+ }
+
+ /* Compare expected hostname with the CN */
+ if (validate_name(hostname, common_name_asn1) == MatchFound) {
+ debug_return_int(MatchFound);
+ }
+
+ int common_name_length = ASN1_STRING_length(common_name_asn1);
+ char *nullterm_common_name = malloc(common_name_length + 1);
+
+ if (nullterm_common_name == NULL) {
+ debug_return_int(Error);
+ }
+
+ memcpy(nullterm_common_name, common_name_str, common_name_length);
+ nullterm_common_name[common_name_length] = '\0';
+
+
+ /* check if hostname in the CN field resolves to the given ip address */
+ if (resolve && forward_lookup_match(nullterm_common_name, ipaddr)) {
+ free(nullterm_common_name);
+ debug_return_int(MatchFound);
+ }
+
+ free(nullterm_common_name);
+ debug_return_int(MatchNotFound);
+}
+
+/**
+ * @brief Matches a hostname or ipaddr with the cert's corresponding SAN field.
+ *
+ * SAN can have different fields. For hostname matching, the GEN_DNS field is used,
+ * for IP address matching, the GEN_IPADD field is used.
+ * Since SAN is an X503 v3 extension, it can happen that the cert does
+ * not contain SAN at all.
+ *
+ * @param hostname remote peer's name
+ * on client side: it is the name where the client is connected to
+ * on server side, it is in fact an IP address of the remote client
+ * @param ipaddr remote peer's IP address
+ * @param cert peer's X509 certificate
+ * @param resolve if the value is not 0, the function checks that the value of the
+ * SAN GEN_DNS resolves to the given ipaddr or not.
+ *
+ * @return MatchFound
+ * MatchNotFound
+ * NoSANPresent
+ * MalformedCertificate
+ * Error
+ */
+static HostnameValidationResult
+matches_subject_alternative_name(const char *hostname, const char *ipaddr, const X509 *cert, int resolve)
+{
+ HostnameValidationResult result = MatchNotFound;
+ int i;
+ int san_names_nb;
+ STACK_OF(GENERAL_NAME) *san_names = NULL;
+ debug_decl(matches_subject_alternative_name, SUDO_DEBUG_UTIL);
+
+ /* Try to extract the names within the SAN extension from the certificate */
+ san_names = X509_get_ext_d2i((X509 *) cert, NID_subject_alt_name, NULL, NULL);
+ if (san_names == NULL) {
+ debug_return_int(NoSANPresent);
+ }
+ san_names_nb = sk_GENERAL_NAME_num(san_names);
+
+ /* Check each name within the extension */
+ for (i=0; i<san_names_nb; i++) {
+ const GENERAL_NAME *current_name = sk_GENERAL_NAME_value(san_names, i);
+
+ if (current_name->type == GEN_DNS) {
+ const unsigned char *dns_name = ASN1_STRING_get0_data(current_name->d.dNSName);
+
+ /* Make sure there isn't an embedded NUL character in the DNS name */
+ if (memchr(dns_name, '\0', ASN1_STRING_length(current_name->d.dNSName)) != NULL) {
+ result = MalformedCertificate;
+ break;
+ } else {
+ /* Compare expected hostname with the DNS name */
+ if (validate_name(hostname, current_name->d.dNSName) == MatchFound) {
+ result = MatchFound;
+ break;
+ }
+
+ int dns_name_length = ASN1_STRING_length(current_name->d.dNSName);
+ char *nullterm_dns_name = malloc(dns_name_length + 1);
+
+ if (nullterm_dns_name == NULL) {
+ debug_return_int(Error);
+ }
+
+ memcpy(nullterm_dns_name, dns_name, dns_name_length);
+ nullterm_dns_name[dns_name_length] = '\0';
+
+ if (resolve && forward_lookup_match(nullterm_dns_name, ipaddr)) {
+ free(nullterm_dns_name);
+ result = MatchFound;
+ break;
+ }
+ free(nullterm_dns_name);
+ }
+ } else if (current_name->type == GEN_IPADD) {
+ const unsigned char *san_ip = ASN1_STRING_get0_data(current_name->d.iPAddress);
+#if defined(HAVE_STRUCT_IN6_ADDR)
+ char san_ip_str[INET6_ADDRSTRLEN];
+#else
+ char san_ip_str[INET_ADDRSTRLEN];
+#endif
+
+ /* IPV4 address */
+ if(current_name->d.iPAddress->length == 4) {
+ if (inet_ntop(AF_INET, san_ip, san_ip_str, INET_ADDRSTRLEN) == NULL) {
+ result = MalformedCertificate;
+ break;
+ }
+#if defined(HAVE_STRUCT_IN6_ADDR)
+ /* IPV6 address */
+ } else if (current_name->d.iPAddress->length == 16) {
+ if (inet_ntop(AF_INET6, san_ip, san_ip_str, INET6_ADDRSTRLEN) == NULL) {
+ result = MalformedCertificate;
+ break;
+ }
+# endif
+ } else {
+ result = MalformedCertificate;
+ break;
+ }
+
+ if (strcasecmp(ipaddr, san_ip_str) == 0) {
+ result = MatchFound;
+ break;
+ }
+ }
+ }
+ sk_GENERAL_NAME_pop_free(san_names, GENERAL_NAME_free);
+
+ debug_return_int(result);
+}
+
+/**
+ * @brief Do hostname/IP validation on the given X509 certificate.
+ *
+ * According to RFC 6125 section 6.4.4, first the certificate's SAN field
+ * has to be checked. If there is no SAN field, the certificate's CN field
+ * has to be checked.
+ *
+ * @param cert X509 certificate
+ * @param hostname remote peer's name
+ * on client side: it is the name where the client is connected to
+ * on server side, it is in fact an IP address of the remote client
+ * @param ipaddr remote peer's IP address
+ * @param resolve if the value is not 0, the function checks that the value of the
+ * SAN GEN_DNS or the value of CN resolves to the given ipaddr or not.
+ *
+ * @return MatchFound
+ * MatchNotFound
+ * MalformedCertificate
+ * Error
+ */
+HostnameValidationResult
+validate_hostname(const X509 *cert, const char *hostname, const char *ipaddr, int resolve)
+{
+ HostnameValidationResult res = MatchFound;
+ debug_decl(validate_hostname, SUDO_DEBUG_UTIL);
+
+ /* hostname can be also an ip address, if client connects
+ * to ip instead of FQDN
+ */
+ if((ipaddr == NULL) || (cert == NULL)) {
+ debug_return_int(Error);
+ }
+
+ /* check SAN first if exists */
+ res = matches_subject_alternative_name(hostname, ipaddr, cert, resolve);
+
+ /* According to RFC 6125 section 6.4.4, check CN only,
+ * if no SAN name was provided
+ */
+ if (res == NoSANPresent) {
+ res = matches_common_name(hostname, ipaddr, cert, resolve);
+ }
+
+ debug_return_int(res);
+}
+#endif /* HAVE_OPENSSL */
diff --git a/lib/iolog/iolog_clearerr.c b/lib/iolog/iolog_clearerr.c
new file mode 100644
index 0000000..631e020
--- /dev/null
+++ b/lib/iolog/iolog_clearerr.c
@@ -0,0 +1,45 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <time.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_iolog.h"
+
+void
+iolog_clearerr(struct iolog_file *iol)
+{
+ debug_decl(iolog_eof, SUDO_DEBUG_UTIL);
+
+#ifdef HAVE_ZLIB_H
+ if (iol->compressed)
+ gzclearerr(iol->fd.g);
+ else
+#endif
+ clearerr(iol->fd.f);
+ debug_return;
+}
diff --git a/lib/iolog/iolog_close.c b/lib/iolog/iolog_close.c
new file mode 100644
index 0000000..caa68c6
--- /dev/null
+++ b/lib/iolog/iolog_close.c
@@ -0,0 +1,80 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+#include <string.h>
+#include <errno.h>
+#include <time.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_iolog.h"
+
+/*
+ * Close an I/O log.
+ */
+bool
+iolog_close(struct iolog_file *iol, const char **errstr)
+{
+ bool ret = true;
+ debug_decl(iolog_close, SUDO_DEBUG_UTIL);
+
+#ifdef HAVE_ZLIB_H
+ if (iol->compressed) {
+ int errnum;
+
+ /* Must check error indicator before closing. */
+ if (iol->writable) {
+ if (gzflush(iol->fd.g, Z_SYNC_FLUSH) != Z_OK) {
+ ret = false;
+ if (errstr != NULL) {
+ *errstr = gzerror(iol->fd.g, &errnum);
+ if (errnum == Z_ERRNO)
+ *errstr = strerror(errno);
+ }
+ }
+ }
+ errnum = gzclose(iol->fd.g);
+ if (ret && errnum != Z_OK) {
+ ret = false;
+ if (errstr != NULL)
+ *errstr = errnum == Z_ERRNO ? strerror(errno) : "unknown error";
+ }
+ } else
+#endif
+ if (fclose(iol->fd.f) != 0) {
+ ret = false;
+ if (errstr != NULL)
+ *errstr = strerror(errno);
+ }
+
+ debug_return_bool(ret);
+}
diff --git a/lib/iolog/iolog_conf.c b/lib/iolog/iolog_conf.c
new file mode 100644
index 0000000..61a35a5
--- /dev/null
+++ b/lib/iolog/iolog_conf.c
@@ -0,0 +1,202 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+
+#include "pathnames.h"
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_util.h"
+#include "sudo_iolog.h"
+
+static unsigned int sessid_max = SESSID_MAX;
+static mode_t iolog_filemode = S_IRUSR|S_IWUSR;
+static mode_t iolog_dirmode = S_IRWXU;
+static uid_t iolog_uid = ROOT_UID;
+static gid_t iolog_gid = ROOT_GID;
+static bool iolog_gid_set;
+static bool iolog_docompress;
+static bool iolog_doflush;
+
+/*
+ * Reset I/O log settings to default values.
+ */
+void
+iolog_set_defaults(void)
+{
+ sessid_max = SESSID_MAX;
+ iolog_filemode = S_IRUSR|S_IWUSR;
+ iolog_dirmode = S_IRWXU;
+ iolog_uid = ROOT_UID;
+ iolog_gid = ROOT_GID;
+ iolog_gid_set = false;
+ iolog_docompress = false;
+ iolog_doflush = false;
+}
+
+/*
+ * Set max sequence number (aka session ID)
+ */
+void
+iolog_set_maxseq(unsigned int newval)
+{
+ debug_decl(iolog_set_maxseq, SUDO_DEBUG_UTIL);
+
+ /* Clamp to SESSID_MAX as documented. */
+ if (newval > SESSID_MAX)
+ newval = SESSID_MAX;
+ sessid_max = newval;
+
+ debug_return;
+}
+
+/*
+ * Set iolog_uid (and iolog_gid if gid not explicitly set).
+ */
+void
+iolog_set_owner(uid_t uid, gid_t gid)
+{
+ debug_decl(iolog_set_owner, SUDO_DEBUG_UTIL);
+
+ iolog_uid = uid;
+ if (!iolog_gid_set)
+ iolog_gid = gid;
+
+ debug_return;
+}
+
+/*
+ * Set iolog_gid.
+ */
+void
+iolog_set_gid(gid_t gid)
+{
+ debug_decl(iolog_set_gid, SUDO_DEBUG_UTIL);
+
+ iolog_gid = gid;
+ iolog_gid_set = true;
+
+ debug_return;
+}
+
+/*
+ * Set iolog_filemode and iolog_dirmode.
+ */
+void
+iolog_set_mode(mode_t mode)
+{
+ debug_decl(iolog_set_mode, SUDO_DEBUG_UTIL);
+
+ /* I/O log files must be readable and writable by owner. */
+ iolog_filemode = S_IRUSR|S_IWUSR;
+
+ /* Add in group and other read/write if specified. */
+ iolog_filemode |= mode & (S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
+
+ /* For directory mode, add execute bits as needed. */
+ iolog_dirmode = iolog_filemode | S_IXUSR;
+ if (iolog_dirmode & (S_IRGRP|S_IWGRP))
+ iolog_dirmode |= S_IXGRP;
+ if (iolog_dirmode & (S_IROTH|S_IWOTH))
+ iolog_dirmode |= S_IXOTH;
+
+ debug_return;
+}
+
+/*
+ * Set iolog_docompress
+ */
+void
+iolog_set_compress(bool newval)
+{
+ debug_decl(iolog_set_compress, SUDO_DEBUG_UTIL);
+ iolog_docompress = newval;
+ debug_return;
+}
+
+/*
+ * Set iolog_doflush
+ */
+void
+iolog_set_flush(bool newval)
+{
+ debug_decl(iolog_set_flush, SUDO_DEBUG_UTIL);
+ iolog_doflush = newval;
+ debug_return;
+}
+
+/*
+ * Getters.
+ */
+
+unsigned int
+iolog_get_maxseq(void)
+{
+ return sessid_max;
+}
+
+uid_t
+iolog_get_uid(void)
+{
+ return iolog_uid;
+}
+
+gid_t
+iolog_get_gid(void)
+{
+ return iolog_gid;
+}
+
+mode_t
+iolog_get_file_mode(void)
+{
+ return iolog_filemode;
+}
+
+mode_t
+iolog_get_dir_mode(void)
+{
+ return iolog_dirmode;
+}
+
+bool
+iolog_get_compress(void)
+{
+ return iolog_docompress;
+}
+
+bool
+iolog_get_flush(void)
+{
+ return iolog_doflush;
+}
diff --git a/lib/iolog/iolog_eof.c b/lib/iolog/iolog_eof.c
new file mode 100644
index 0000000..c1cece2
--- /dev/null
+++ b/lib/iolog/iolog_eof.c
@@ -0,0 +1,54 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+#include <time.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_iolog.h"
+
+/*
+ * Returns true if at end of I/O log file, else false.
+ */
+bool
+iolog_eof(struct iolog_file *iol)
+{
+ bool ret;
+ debug_decl(iolog_eof, SUDO_DEBUG_UTIL);
+
+#ifdef HAVE_ZLIB_H
+ if (iol->compressed)
+ ret = gzeof(iol->fd.g) != 0;
+ else
+#endif
+ ret = feof(iol->fd.f) != 0;
+ debug_return_int(ret);
+}
diff --git a/lib/iolog/iolog_filter.c b/lib/iolog/iolog_filter.c
new file mode 100644
index 0000000..ecccf18
--- /dev/null
+++ b/lib/iolog/iolog_filter.c
@@ -0,0 +1,248 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2022 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+#include <regex.h>
+#include <string.h>
+#include <time.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_fatal.h"
+#include "sudo_gettext.h"
+#include "sudo_iolog.h"
+#include "sudo_queue.h"
+#include "sudo_util.h"
+
+struct pwfilt_regex {
+ TAILQ_ENTRY(pwfilt_regex) entries;
+ char *pattern;
+ regex_t regex;
+};
+TAILQ_HEAD(pwfilt_regex_list, pwfilt_regex);
+
+struct pwfilt_handle {
+ struct pwfilt_regex_list filters;
+ bool is_filtered;
+};
+
+/*
+ * Allocate a new filter handle.
+ */
+void *
+iolog_pwfilt_alloc(void)
+{
+ struct pwfilt_handle *handle;
+ debug_decl(iolog_pwfilt_alloc, SUDO_DEBUG_UTIL);
+
+ handle = malloc(sizeof(*handle));
+ if (handle != NULL) {
+ TAILQ_INIT(&handle->filters);
+ handle->is_filtered = false;
+ }
+
+ debug_return_ptr(handle);
+}
+
+/*
+ * Unlink filt from filters and free it.
+ */
+static void
+iolog_pwfilt_free_filter(struct pwfilt_regex_list *filters,
+ struct pwfilt_regex *filt)
+{
+ debug_decl(iolog_pwfilt_free_filter, SUDO_DEBUG_UTIL);
+
+ if (filt != NULL) {
+ TAILQ_REMOVE(filters, filt, entries);
+ regfree(&filt->regex);
+ free(filt->pattern);
+ free(filt);
+ }
+
+ debug_return;
+}
+
+/*
+ * Free the given password filter handle.
+ */
+void
+iolog_pwfilt_free(void *vhandle)
+{
+ struct pwfilt_handle *handle = vhandle;
+ struct pwfilt_regex *filt;
+ debug_decl(iolog_pwfilt_free, SUDO_DEBUG_UTIL);
+
+ if (handle != NULL) {
+ while ((filt = TAILQ_FIRST(&handle->filters)) != NULL) {
+ iolog_pwfilt_free_filter(&handle->filters, filt);
+ }
+ free(handle);
+ }
+ debug_return;
+}
+
+/*
+ * Add a pattern to the password filter list.
+ */
+bool
+iolog_pwfilt_add(void *vhandle, const char *pattern)
+{
+ struct pwfilt_handle *handle = vhandle;
+ struct pwfilt_regex *filt;
+ const char *errstr;
+ debug_decl(iolog_pwfilt_add, SUDO_DEBUG_UTIL);
+
+ filt = malloc(sizeof(*filt));
+ if (filt == NULL)
+ goto oom;
+ filt->pattern = strdup(pattern);
+ if (filt->pattern == NULL)
+ goto oom;
+
+ if (!sudo_regex_compile(&filt->regex, filt->pattern, &errstr)) {
+ sudo_warnx(U_("invalid regular expression \"%s\": %s"),
+ pattern, U_(errstr));
+ goto bad;
+ }
+
+ TAILQ_INSERT_TAIL(&handle->filters, filt, entries);
+ debug_return_bool(true);
+
+oom:
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+bad:
+ if (filt != NULL) {
+ free(filt->pattern);
+ free(filt);
+ }
+ debug_return_bool(false);
+}
+
+/*
+ * Remove a pattern from the password filter list.
+ */
+bool
+iolog_pwfilt_remove(void *vhandle, const char *pattern)
+{
+ struct pwfilt_handle *handle = vhandle;
+ struct pwfilt_regex *filt, *next;
+ bool ret = false;
+ debug_decl(iolog_pwfilt_remove, SUDO_DEBUG_UTIL);
+
+ TAILQ_FOREACH_SAFE(filt, &handle->filters, entries, next) {
+ if (strcmp(filt->pattern, pattern) == 0) {
+ iolog_pwfilt_free_filter(&handle->filters, filt);
+ ret = true;
+ }
+ }
+ debug_return_bool(ret);
+}
+
+/*
+ * If logging output and filtering is _not_ enabled, match buf against the
+ * password filter list patterns and, if there is a match, enable filtering.
+ * If logging output and filtering _is_ enabled, disable filtering.
+ * If logging input and filtering is enabled, replace all characters in
+ * buf with stars ('*') up to the next linefeed or carriage return.
+ */
+bool
+iolog_pwfilt_run(void *vhandle, int event, const char *buf,
+ unsigned int len, char **newbuf)
+{
+ struct pwfilt_handle *handle = vhandle;
+ struct pwfilt_regex *filt;
+ char *copy;
+ debug_decl(iolog_pwfilt_run, SUDO_DEBUG_UTIL);
+
+ /*
+ * We only filter ttyin/ttyout. It is only possible to disable
+ * echo when a tty is present. Filtering passwords in the input
+ * log when they appear in the output is pointless. This does
+ * assume that the password prompt is written to the tty as well.
+ */
+ switch (event) {
+ case IO_EVENT_TTYOUT:
+ /* If filtering passwords and we receive output, disable it. */
+ if (handle->is_filtered)
+ handle->is_filtered = false;
+
+ /* Make a copy of buf that is NUL-terminated. */
+ copy = malloc(len + 1);
+ if (copy == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ debug_return_bool(false);
+ }
+ memcpy(copy, buf, len);
+ copy[len] = '\0';
+
+ /* Check output for a password prompt. */
+ TAILQ_FOREACH(filt, &handle->filters, entries) {
+ if (regexec(&filt->regex, copy, 0, NULL, 0) == 0) {
+ handle->is_filtered = true;
+ break;
+ }
+ }
+ free(copy);
+ break;
+ case IO_EVENT_TTYIN:
+ if (handle->is_filtered) {
+ unsigned int i;
+
+ for (i = 0; i < len; i++) {
+ /* We will stop filtering after reaching cr/nl. */
+ if (buf[i] == '\r' || buf[i] == '\n') {
+ handle->is_filtered = false;
+ break;
+ }
+ }
+ if (i != 0) {
+ /* Filtered, replace buffer with '*' chars. */
+ copy = malloc(len);
+ if (copy == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__,
+ U_("unable to allocate memory"));
+ debug_return_bool(false);
+ }
+ memset(copy, '*', i);
+ if (i != len) {
+ /* Done filtering, copy cr/nl and subsequent characters. */
+ memcpy(copy + i, buf + i, len - i);
+ }
+ *newbuf = copy;
+ }
+ }
+ break;
+ }
+
+ debug_return_bool(true);
+}
diff --git a/lib/iolog/iolog_flush.c b/lib/iolog/iolog_flush.c
new file mode 100644
index 0000000..f7a0b08
--- /dev/null
+++ b/lib/iolog/iolog_flush.c
@@ -0,0 +1,66 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <string.h>
+#include <time.h>
+#include <errno.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_iolog.h"
+
+/*
+ * I/O log wrapper for fflush/gzflush.
+ */
+bool
+iolog_flush(struct iolog_file *iol, const char **errstr)
+{
+ debug_decl(iolog_flush, SUDO_DEBUG_UTIL);
+ bool ret = true;
+
+#ifdef HAVE_ZLIB_H
+ if (iol->compressed) {
+ int errnum;
+ if (gzflush(iol->fd.g, Z_SYNC_FLUSH) != Z_OK) {
+ if (errstr != NULL) {
+ *errstr = gzerror(iol->fd.g, &errnum);
+ if (errnum == Z_ERRNO)
+ *errstr = strerror(errno);
+ }
+ ret = false;
+ }
+ } else
+#endif
+ {
+ if (fflush(iol->fd.f) != 0) {
+ if (errstr != NULL)
+ *errstr = strerror(errno);
+ ret = false;
+ }
+ }
+
+ debug_return_bool(ret);
+}
diff --git a/lib/iolog/iolog_gets.c b/lib/iolog/iolog_gets.c
new file mode 100644
index 0000000..0ef5a23
--- /dev/null
+++ b/lib/iolog/iolog_gets.c
@@ -0,0 +1,78 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+#include <time.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_iolog.h"
+
+/*
+ * Like gets() but for struct iolog_file.
+ */
+char *
+iolog_gets(struct iolog_file *iol, char *buf, size_t nbytes,
+ const char **errstr)
+{
+ char *str;
+ debug_decl(iolog_gets, SUDO_DEBUG_UTIL);
+
+ if (nbytes > UINT_MAX) {
+ errno = EINVAL;
+ if (errstr != NULL)
+ *errstr = strerror(errno);
+ debug_return_str(NULL);
+ }
+
+#ifdef HAVE_ZLIB_H
+ if (iol->compressed) {
+ if ((str = gzgets(iol->fd.g, buf, nbytes)) == NULL) {
+ if (errstr != NULL) {
+ int errnum;
+ *errstr = gzerror(iol->fd.g, &errnum);
+ if (errnum == Z_ERRNO)
+ *errstr = strerror(errno);
+ }
+ }
+ } else
+#endif
+ {
+ if ((str = fgets(buf, nbytes, iol->fd.f)) == NULL) {
+ if (errstr != NULL)
+ *errstr = strerror(errno);
+ }
+ }
+ debug_return_str(str);
+}
diff --git a/lib/iolog/iolog_json.c b/lib/iolog/iolog_json.c
new file mode 100644
index 0000000..6f384ea
--- /dev/null
+++ b/lib/iolog/iolog_json.c
@@ -0,0 +1,938 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2020-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif /* HAVE_STDBOOL_H */
+#include <string.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <limits.h>
+#include <fcntl.h>
+#include <time.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_eventlog.h"
+#include "sudo_fatal.h"
+#include "sudo_gettext.h"
+#include "sudo_iolog.h"
+#include "sudo_util.h"
+
+#include "iolog_json.h"
+
+struct json_stack {
+ unsigned int depth;
+ unsigned int maxdepth;
+ struct json_object *frames[64];
+};
+#define JSON_STACK_INTIALIZER(s) { 0, nitems((s).frames) };
+
+static bool
+json_store_columns(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_columns, SUDO_DEBUG_UTIL);
+
+ if (item->u.number < 1 || item->u.number > INT_MAX) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "tty cols %lld: out of range", item->u.number);
+ evlog->columns = 0;
+ debug_return_bool(false);
+ }
+
+ evlog->columns = item->u.number;
+ debug_return_bool(true);
+}
+
+static bool
+json_store_command(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_command, SUDO_DEBUG_UTIL);
+
+ /*
+ * Note: struct eventlog must store command + args.
+ * We don't have argv yet so we append the args later.
+ */
+ free(evlog->command);
+ evlog->command = item->u.string;
+ item->u.string = NULL;
+ debug_return_bool(true);
+}
+
+static bool
+json_store_dumped_core(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_dumped_core, SUDO_DEBUG_UTIL);
+
+ evlog->dumped_core = item->u.boolean;
+ debug_return_bool(true);
+}
+
+static bool
+json_store_exit_value(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_exit_value, SUDO_DEBUG_UTIL);
+
+ if (item->u.number < 0 || item->u.number > INT_MAX) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "exit value %lld: out of range", item->u.number);
+ evlog->exit_value = -1;
+ debug_return_bool(false);
+ }
+
+ evlog->exit_value = item->u.number;
+ debug_return_bool(true);
+}
+
+static bool
+json_store_lines(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_lines, SUDO_DEBUG_UTIL);
+
+ if (item->u.number < 1 || item->u.number > INT_MAX) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "tty lines %lld: out of range", item->u.number);
+ evlog->lines = 0;
+ debug_return_bool(false);
+ }
+
+ evlog->lines = item->u.number;
+ debug_return_bool(true);
+}
+
+char **
+json_array_to_strvec(struct json_object *array)
+{
+ struct json_item *item;
+ int len = 0;
+ char **ret;
+ debug_decl(json_array_to_strvec, SUDO_DEBUG_UTIL);
+
+ TAILQ_FOREACH(item, &array->items, entries) {
+ /* Can only convert arrays of string. */
+ if (item->type != JSON_STRING) {
+ sudo_warnx(U_("expected JSON_STRING, got %d"), item->type);
+ debug_return_ptr(NULL);
+ }
+ /* Prevent integer overflow. */
+ if (++len == INT_MAX) {
+ sudo_warnx("%s", U_("JSON_ARRAY too large"));
+ debug_return_ptr(NULL);
+ }
+ }
+ if ((ret = reallocarray(NULL, len + 1, sizeof(char *))) == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ debug_return_ptr(NULL);
+ }
+ len = 0;
+ TAILQ_FOREACH(item, &array->items, entries) {
+ ret[len++] = item->u.string;
+ item->u.string = NULL;
+ }
+ ret[len] = NULL;
+
+ debug_return_ptr(ret);
+}
+
+static bool
+json_store_runargv(struct json_item *item, struct eventlog *evlog)
+{
+ int i;
+ debug_decl(json_store_runargv, SUDO_DEBUG_UTIL);
+
+ if (evlog->argv != NULL) {
+ for (i = 0; evlog->argv[i] != NULL; i++)
+ free(evlog->argv[i]);
+ free(evlog->argv);
+ }
+ evlog->argv = json_array_to_strvec(&item->u.child);
+
+ debug_return_bool(evlog->argv != NULL);
+}
+
+static bool
+json_store_runenv(struct json_item *item, struct eventlog *evlog)
+{
+ int i;
+ debug_decl(json_store_runenv, SUDO_DEBUG_UTIL);
+
+ if (evlog->envp != NULL) {
+ for (i = 0; evlog->envp[i] != NULL; i++)
+ free(evlog->envp[i]);
+ free(evlog->envp);
+ }
+ evlog->envp = json_array_to_strvec(&item->u.child);
+
+ debug_return_bool(evlog->envp != NULL);
+}
+
+static bool
+json_store_rungid(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_rungid, SUDO_DEBUG_UTIL);
+
+ evlog->rungid = (gid_t)item->u.number;
+ debug_return_bool(true);
+}
+
+static bool
+json_store_rungroup(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_rungroup, SUDO_DEBUG_UTIL);
+
+ free(evlog->rungroup);
+ evlog->rungroup = item->u.string;
+ item->u.string = NULL;
+ debug_return_bool(true);
+}
+
+static bool
+json_store_runuid(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_runuid, SUDO_DEBUG_UTIL);
+
+ evlog->runuid = (uid_t)item->u.number;
+ debug_return_bool(true);
+}
+
+static bool
+json_store_runuser(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_runuser, SUDO_DEBUG_UTIL);
+
+ free(evlog->runuser);
+ evlog->runuser = item->u.string;
+ item->u.string = NULL;
+ debug_return_bool(true);
+}
+
+static bool
+json_store_runchroot(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_runchroot, SUDO_DEBUG_UTIL);
+
+ free(evlog->runchroot);
+ evlog->runchroot = item->u.string;
+ item->u.string = NULL;
+ debug_return_bool(true);
+}
+
+static bool
+json_store_runcwd(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_runcwd, SUDO_DEBUG_UTIL);
+
+ free(evlog->runcwd);
+ evlog->runcwd = item->u.string;
+ item->u.string = NULL;
+ debug_return_bool(true);
+}
+
+static bool
+json_store_signal(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_signal, SUDO_DEBUG_UTIL);
+
+ free(evlog->signal_name);
+ evlog->signal_name = item->u.string;
+ item->u.string = NULL;
+ debug_return_bool(true);
+}
+
+static bool
+json_store_submitcwd(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_submitcwd, SUDO_DEBUG_UTIL);
+
+ free(evlog->cwd);
+ evlog->cwd = item->u.string;
+ item->u.string = NULL;
+ debug_return_bool(true);
+}
+
+static bool
+json_store_submithost(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_submithost, SUDO_DEBUG_UTIL);
+
+ free(evlog->submithost);
+ evlog->submithost = item->u.string;
+ item->u.string = NULL;
+ debug_return_bool(true);
+}
+
+static bool
+json_store_submituser(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_submituser, SUDO_DEBUG_UTIL);
+
+ free(evlog->submituser);
+ evlog->submituser = item->u.string;
+ item->u.string = NULL;
+ debug_return_bool(true);
+}
+
+static bool
+json_store_timespec(struct json_item *item, struct timespec *ts)
+{
+ struct json_object *object;
+ debug_decl(json_store_timespec, SUDO_DEBUG_UTIL);
+
+ object = &item->u.child;
+ TAILQ_FOREACH(item, &object->items, entries) {
+ if (item->type != JSON_NUMBER)
+ continue;
+ if (strcmp(item->name, "seconds") == 0) {
+ ts->tv_sec = item->u.number;
+ continue;
+ }
+ if (strcmp(item->name, "nanoseconds") == 0) {
+ ts->tv_nsec = item->u.number;
+ continue;
+ }
+ }
+ debug_return_bool(true);
+}
+
+static bool
+json_store_run_time(struct json_item *item, struct eventlog *evlog)
+{
+ return json_store_timespec(item, &evlog->run_time);
+}
+
+static bool
+json_store_timestamp(struct json_item *item, struct eventlog *evlog)
+{
+ return json_store_timespec(item, &evlog->submit_time);
+}
+
+static bool
+json_store_ttyname(struct json_item *item, struct eventlog *evlog)
+{
+ debug_decl(json_store_ttyname, SUDO_DEBUG_UTIL);
+
+ free(evlog->ttyname);
+ evlog->ttyname = item->u.string;
+ item->u.string = NULL;
+ debug_return_bool(true);
+}
+
+static struct iolog_json_key {
+ const char *name;
+ enum json_value_type type;
+ bool (*setter)(struct json_item *, struct eventlog *);
+} iolog_json_keys[] = {
+ { "columns", JSON_NUMBER, json_store_columns },
+ { "command", JSON_STRING, json_store_command },
+ { "dumped_core", JSON_BOOL, json_store_dumped_core },
+ { "exit_value", JSON_NUMBER, json_store_exit_value },
+ { "lines", JSON_NUMBER, json_store_lines },
+ { "run_time", JSON_OBJECT, json_store_run_time },
+ { "runargv", JSON_ARRAY, json_store_runargv },
+ { "runenv", JSON_ARRAY, json_store_runenv },
+ { "rungid", JSON_ID, json_store_rungid },
+ { "rungroup", JSON_STRING, json_store_rungroup },
+ { "runuid", JSON_ID, json_store_runuid },
+ { "runuser", JSON_STRING, json_store_runuser },
+ { "runchroot", JSON_STRING, json_store_runchroot },
+ { "runcwd", JSON_STRING, json_store_runcwd },
+ { "signal", JSON_STRING, json_store_signal },
+ { "submitcwd", JSON_STRING, json_store_submitcwd },
+ { "submithost", JSON_STRING, json_store_submithost },
+ { "submituser", JSON_STRING, json_store_submituser },
+ { "timestamp", JSON_OBJECT, json_store_timestamp },
+ { "ttyname", JSON_STRING, json_store_ttyname },
+ { NULL }
+};
+
+static struct json_item *
+new_json_item(enum json_value_type type, char *name, unsigned int lineno)
+{
+ struct json_item *item;
+ debug_decl(new_json_item, SUDO_DEBUG_UTIL);
+
+ if ((item = malloc(sizeof(*item))) == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__,
+ U_("unable to allocate memory"));
+ debug_return_ptr(NULL);
+ }
+ item->name = name;
+ item->type = type;
+ item->lineno = lineno;
+
+ debug_return_ptr(item);
+}
+
+static char *
+json_parse_string(char **strp)
+{
+ char *dst, *end, *ret, *src = *strp + 1;
+ size_t len;
+ debug_decl(json_parse_string, SUDO_DEBUG_UTIL);
+
+ for (end = src; *end != '"' && *end != '\0'; end++) {
+ if (end[0] == '\\' && end[1] == '"')
+ end++;
+ }
+ if (*end != '"') {
+ sudo_warnx("%s", U_("missing double quote in name"));
+ debug_return_str(NULL);
+ }
+ len = (size_t)(end - src);
+
+ /* Copy string, flattening escaped chars. */
+ dst = ret = malloc(len + 1);
+ if (dst == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ debug_return_str(NULL);
+ }
+ while (src < end) {
+ char ch = *src++;
+ if (ch == '\\') {
+ switch (*src) {
+ case 'b':
+ ch = '\b';
+ break;
+ case 'f':
+ ch = '\f';
+ break;
+ case 'n':
+ ch = '\n';
+ break;
+ case 'r':
+ ch = '\r';
+ break;
+ case 't':
+ ch = '\t';
+ break;
+ case 'u':
+ /* Only currently handles 8-bit ASCII. */
+ if (src[1] == '0' && src[2] == '0') {
+ ch = sudo_hexchar(&src[3]);
+ if (ch != -1) {
+ src += 4;
+ break;
+ }
+ }
+ /* Not in \u00XX format. */
+ FALLTHROUGH;
+ case '"':
+ case '\\':
+ default:
+ /* Note: a bare \ at the end of a string will be removed. */
+ ch = *src;
+ break;
+ }
+ src++;
+ }
+ *dst++ = ch;
+ }
+ *dst = '\0';
+
+ /* Trim trailing whitespace. */
+ do {
+ end++;
+ } while (isspace((unsigned char)*end));
+ *strp = end;
+
+ debug_return_str(ret);
+}
+
+void
+free_json_items(struct json_item_list *items)
+{
+ struct json_item *item;
+ debug_decl(free_json_items, SUDO_DEBUG_UTIL);
+
+ while ((item = TAILQ_FIRST(items)) != NULL) {
+ TAILQ_REMOVE(items, item, entries);
+ switch (item->type) {
+ case JSON_STRING:
+ free(item->u.string);
+ break;
+ case JSON_ARRAY:
+ case JSON_OBJECT:
+ free_json_items(&item->u.child.items);
+ break;
+ case JSON_ID:
+ case JSON_NUMBER:
+ case JSON_BOOL:
+ case JSON_NULL:
+ /* Nothing to free. */
+ break;
+ default:
+ sudo_warnx("%s: internal error, invalid JSON type %d",
+ __func__, item->type);
+ break;
+ }
+ free(item->name);
+ free(item);
+ }
+
+ debug_return;
+}
+
+static bool
+iolog_parse_json_object(struct json_object *object, struct eventlog *evlog)
+{
+ struct json_item *item;
+ bool ret = false;
+ debug_decl(iolog_parse_json_object, SUDO_DEBUG_UTIL);
+
+ /* First object holds all the actual data. */
+ item = TAILQ_FIRST(&object->items);
+ if (item == NULL) {
+ sudo_warnx("%s", U_("missing JSON_OBJECT"));
+ goto done;
+ }
+ if (item->type != JSON_OBJECT) {
+ sudo_warnx(U_("expected JSON_OBJECT, got %d"), item->type);
+ goto done;
+ }
+ object = &item->u.child;
+
+ TAILQ_FOREACH(item, &object->items, entries) {
+ struct iolog_json_key *key;
+
+ /* expecting key:value pairs */
+ if (item->name == NULL) {
+ sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO,
+ "%s: missing object name", __func__);
+ goto done;
+ }
+
+ /* lookup name */
+ for (key = iolog_json_keys; key->name != NULL; key++) {
+ if (strcmp(item->name, key->name) == 0)
+ break;
+ }
+ if (key->name == NULL) {
+ sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO,
+ "%s: unknown key %s", __func__, item->name);
+ } else if (key->type != item->type &&
+ (key->type != JSON_ID || item->type != JSON_NUMBER)) {
+ sudo_debug_printf(SUDO_DEBUG_WARN|SUDO_DEBUG_LINENO,
+ "%s: key mismatch %s type %d, expected %d", __func__,
+ item->name, item->type, key->type);
+ goto done;
+ } else {
+ /* Matched name and type. */
+ if (!key->setter(item, evlog)) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "unable to store %s", key->name);
+ goto done;
+ }
+ }
+ }
+
+ ret = true;
+
+done:
+ debug_return_bool(ret);
+}
+
+static bool
+json_insert_bool(struct json_item_list *items, char *name, bool value,
+ unsigned int lineno)
+{
+ struct json_item *item;
+ debug_decl(json_insert_bool, SUDO_DEBUG_UTIL);
+
+ if ((item = new_json_item(JSON_BOOL, name, lineno)) == NULL)
+ debug_return_bool(false);
+ item->u.boolean = value;
+ TAILQ_INSERT_TAIL(items, item, entries);
+
+ debug_return_bool(true);
+}
+
+static bool
+json_insert_null(struct json_item_list *items, char *name, unsigned int lineno)
+{
+ struct json_item *item;
+ debug_decl(json_insert_null, SUDO_DEBUG_UTIL);
+
+ if ((item = new_json_item(JSON_NULL, name, lineno)) == NULL)
+ debug_return_bool(false);
+ TAILQ_INSERT_TAIL(items, item, entries);
+
+ debug_return_bool(true);
+}
+
+static bool
+json_insert_num(struct json_item_list *items, char *name, long long value,
+ unsigned int lineno)
+{
+ struct json_item *item;
+ debug_decl(json_insert_num, SUDO_DEBUG_UTIL);
+
+ if ((item = new_json_item(JSON_NUMBER, name, lineno)) == NULL)
+ debug_return_bool(false);
+ item->u.number = value;
+ TAILQ_INSERT_TAIL(items, item, entries);
+
+ debug_return_bool(true);
+}
+
+static bool
+json_insert_str(struct json_item_list *items, char *name, char **strp,
+ unsigned int lineno)
+{
+ struct json_item *item;
+ debug_decl(json_insert_str, SUDO_DEBUG_UTIL);
+
+ if ((item = new_json_item(JSON_STRING, name, lineno)) == NULL)
+ debug_return_bool(false);
+ item->u.string = json_parse_string(strp);
+ if (item->u.string == NULL) {
+ free(item);
+ debug_return_bool(false);
+ }
+ TAILQ_INSERT_TAIL(items, item, entries);
+
+ debug_return_bool(true);
+}
+
+static struct json_object *
+json_stack_push(struct json_stack *stack, struct json_item_list *items,
+ struct json_object *frame, enum json_value_type type, char *name,
+ unsigned int lineno)
+{
+ struct json_item *item;
+ debug_decl(json_stack_push, SUDO_DEBUG_UTIL);
+
+ /* We limit the stack size rather than expanding it. */
+ if (stack->depth >= stack->maxdepth) {
+ sudo_warnx(U_("json stack exhausted (max %u frames)"), stack->maxdepth);
+ debug_return_ptr(NULL);
+ }
+
+ /* Allocate a new item and insert it into the list. */
+ if ((item = new_json_item(type, name, lineno)) == NULL)
+ debug_return_ptr(NULL);
+ TAILQ_INIT(&item->u.child.items);
+ item->u.child.parent = item;
+ TAILQ_INSERT_TAIL(items, item, entries);
+
+ /* Push the current frame onto the stack (depth check performed above). */
+ stack->frames[stack->depth++] = frame;
+
+ /* Return the new frame */
+ debug_return_ptr(&item->u.child);
+}
+
+/* Only expect a value if a name is defined or we are in an array. */
+#define expect_value (name != NULL || (frame->parent != NULL && frame->parent->type == JSON_ARRAY))
+
+bool
+iolog_parse_json(FILE *fp, const char *filename, struct json_object *root)
+{
+ struct json_object *frame = root;
+ struct json_stack stack = JSON_STACK_INTIALIZER(stack);
+ unsigned int lineno = 0;
+ char *name = NULL;
+ char *cp, *buf = NULL;
+ size_t bufsize = 0;
+ ssize_t len;
+ bool ret = false;
+ bool saw_comma = false;
+ long long num;
+ char ch;
+ debug_decl(iolog_parse_json, SUDO_DEBUG_UTIL);
+
+ root->parent = NULL;
+ TAILQ_INIT(&root->items);
+
+ while ((len = getdelim(&buf, &bufsize, '\n', fp)) != -1) {
+ char *ep = buf + len - 1;
+ cp = buf;
+
+ lineno++;
+
+ /* Trim trailing whitespace. */
+ while (ep > cp && isspace((unsigned char)*ep))
+ ep--;
+ ep[1] = '\0';
+
+ for (;;) {
+ const char *errstr;
+
+ /* Trim leading whitespace, skip blank lines. */
+ while (isspace((unsigned char)*cp))
+ cp++;
+
+ /* Check for comma separator and strip it out. */
+ if (*cp == ',') {
+ saw_comma = true;
+ cp++;
+ while (isspace((unsigned char)*cp))
+ cp++;
+ }
+
+ /* End of line? */
+ if (*cp == '\0')
+ break;
+
+ switch (*cp) {
+ case '{':
+ if (name == NULL && frame->parent != NULL) {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("objects must consist of name:value pairs"));
+ goto done;
+ }
+ if (!saw_comma && !TAILQ_EMPTY(&frame->items)) {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("missing separator between values"));
+ goto done;
+ }
+ cp++;
+ saw_comma = false;
+ frame = json_stack_push(&stack, &frame->items, frame,
+ JSON_OBJECT, name, lineno);
+ if (frame == NULL)
+ goto done;
+ name = NULL;
+ break;
+ case '}':
+ if (stack.depth == 0 || frame->parent == NULL ||
+ frame->parent->type != JSON_OBJECT) {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("unmatched close brace"));
+ goto done;
+ }
+ cp++;
+ frame = stack.frames[--stack.depth];
+ saw_comma = false;
+ break;
+ case '[':
+ if (frame->parent == NULL) {
+ /* Must have an enclosing object. */
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("unexpected array"));
+ goto done;
+ }
+ if (!saw_comma && !TAILQ_EMPTY(&frame->items)) {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("missing separator between values"));
+ goto done;
+ }
+ cp++;
+ saw_comma = false;
+ frame = json_stack_push(&stack, &frame->items, frame,
+ JSON_ARRAY, name, lineno);
+ if (frame == NULL)
+ goto done;
+ name = NULL;
+ break;
+ case ']':
+ if (stack.depth == 0 || frame->parent == NULL ||
+ frame->parent->type != JSON_ARRAY) {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("unmatched close bracket"));
+ goto done;
+ }
+ cp++;
+ frame = stack.frames[--stack.depth];
+ saw_comma = false;
+ break;
+ case '"':
+ if (frame->parent == NULL) {
+ /* Must have an enclosing object. */
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("unexpected string"));
+ goto done;
+ }
+
+ if (!expect_value) {
+ /* Parse "name": */
+ if ((name = json_parse_string(&cp)) == NULL)
+ goto done;
+ /* TODO: allow colon on next line? */
+ if (*cp != ':') {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("missing colon after name"));
+ goto done;
+ }
+ cp++;
+ } else {
+ if (!saw_comma && !TAILQ_EMPTY(&frame->items)) {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("missing separator between values"));
+ goto done;
+ }
+ saw_comma = false;
+ if (!json_insert_str(&frame->items, name, &cp, lineno))
+ goto done;
+ name = NULL;
+ }
+ break;
+ case 't':
+ if (strncmp(cp, "true", sizeof("true") - 1) != 0)
+ goto parse_error;
+ if (!expect_value) {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("unexpected boolean"));
+ goto done;
+ }
+ cp += sizeof("true") - 1;
+ if (*cp != ',' && !isspace((unsigned char)*cp) && *cp != '\0')
+ goto parse_error;
+ if (!saw_comma && !TAILQ_EMPTY(&frame->items)) {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("missing separator between values"));
+ goto done;
+ }
+ saw_comma = false;
+
+ if (!json_insert_bool(&frame->items, name, true, lineno))
+ goto done;
+ name = NULL;
+ break;
+ case 'f':
+ if (strncmp(cp, "false", sizeof("false") - 1) != 0)
+ goto parse_error;
+ if (!expect_value) {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("unexpected boolean"));
+ goto done;
+ }
+ cp += sizeof("false") - 1;
+ if (*cp != ',' && !isspace((unsigned char)*cp) && *cp != '\0')
+ goto parse_error;
+ if (!saw_comma && !TAILQ_EMPTY(&frame->items)) {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("missing separator between values"));
+ goto done;
+ }
+ saw_comma = false;
+
+ if (!json_insert_bool(&frame->items, name, false, lineno))
+ goto done;
+ name = NULL;
+ break;
+ case 'n':
+ if (strncmp(cp, "null", sizeof("null") - 1) != 0)
+ goto parse_error;
+ if (!expect_value) {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("unexpected null"));
+ goto done;
+ }
+ cp += sizeof("null") - 1;
+ if (*cp != ',' && !isspace((unsigned char)*cp) && *cp != '\0')
+ goto parse_error;
+ if (!saw_comma && !TAILQ_EMPTY(&frame->items)) {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("missing separator between values"));
+ goto done;
+ }
+ saw_comma = false;
+
+ if (!json_insert_null(&frame->items, name, lineno))
+ goto done;
+ name = NULL;
+ break;
+ case '+': case '-': case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7': case '8': case '9':
+ if (!expect_value) {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("unexpected number"));
+ goto done;
+ }
+ /* XXX - strtonumx() would be simpler here. */
+ len = strcspn(cp, " \f\n\r\t\v,");
+ ch = cp[len];
+ cp[len] = '\0';
+ if (!saw_comma && !TAILQ_EMPTY(&frame->items)) {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("missing separator between values"));
+ goto done;
+ }
+ saw_comma = false;
+ num = sudo_strtonum(cp, LLONG_MIN, LLONG_MAX, &errstr);
+ if (errstr != NULL) {
+ sudo_warnx("%s:%u:%td: %s: %s", filename, lineno, cp - buf,
+ cp, U_(errstr));
+ goto done;
+ }
+ cp += len;
+ *cp = ch;
+
+ if (!json_insert_num(&frame->items, name, num, lineno))
+ goto done;
+ name = NULL;
+ break;
+ default:
+ goto parse_error;
+ }
+ }
+ }
+ if (stack.depth != 0) {
+ frame = stack.frames[stack.depth - 1];
+ if (frame->parent == NULL || frame->parent->type == JSON_OBJECT) {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("unmatched close brace"));
+ } else {
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf,
+ U_("unmatched close bracket"));
+ }
+ goto done;
+ }
+
+ ret = true;
+ goto done;
+
+parse_error:
+ sudo_warnx("%s:%u:%td: %s", filename, lineno, cp - buf, U_("parse error"));
+done:
+ free(buf);
+ free(name);
+ if (!ret)
+ free_json_items(&root->items);
+
+ debug_return_bool(ret);
+}
+
+bool
+iolog_parse_loginfo_json(FILE *fp, const char *iolog_dir, struct eventlog *evlog)
+{
+ struct json_object root;
+ bool ret = false;
+ debug_decl(iolog_parse_loginfo_json, SUDO_DEBUG_UTIL);
+
+ if (iolog_parse_json(fp, iolog_dir, &root)) {
+ /* Walk the stack and parse entries. */
+ ret = iolog_parse_json_object(&root, evlog);
+
+ /* Cleanup. */
+ free_json_items(&root.items);
+ }
+
+ debug_return_bool(ret);
+}
diff --git a/lib/iolog/iolog_json.h b/lib/iolog/iolog_json.h
new file mode 100644
index 0000000..bc28dfa
--- /dev/null
+++ b/lib/iolog/iolog_json.h
@@ -0,0 +1,50 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2020 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef IOLOG_JSON_H
+#define IOLOG_JSON_H
+
+#include "sudo_json.h"
+#include "sudo_queue.h"
+
+TAILQ_HEAD(json_item_list, json_item);
+
+struct json_object {
+ struct json_item *parent;
+ struct json_item_list items;
+};
+
+struct json_item {
+ TAILQ_ENTRY(json_item) entries;
+ char *name; /* may be NULL for first brace */
+ unsigned int lineno;
+ enum json_value_type type;
+ union {
+ struct json_object child;
+ char *string;
+ long long number;
+ id_t id;
+ bool boolean;
+ } u;
+};
+
+void free_json_items(struct json_item_list *items);
+bool iolog_parse_json(FILE *fp, const char *filename, struct json_object *root);
+char **json_array_to_strvec(struct json_object *array);
+
+#endif /* IOLOG_JSON_H */
diff --git a/lib/iolog/iolog_legacy.c b/lib/iolog/iolog_legacy.c
new file mode 100644
index 0000000..5d987ae
--- /dev/null
+++ b/lib/iolog/iolog_legacy.c
@@ -0,0 +1,168 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2020 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif /* HAVE_STDBOOL_H */
+#include <string.h>
+#include <signal.h>
+#include <limits.h>
+#include <time.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_eventlog.h"
+#include "sudo_fatal.h"
+#include "sudo_gettext.h"
+#include "sudo_iolog.h"
+#include "sudo_util.h"
+
+bool
+iolog_parse_loginfo_legacy(FILE *fp, const char *iolog_dir,
+ struct eventlog *evlog)
+{
+ char *buf = NULL, *cp, *ep;
+ const char *errstr;
+ size_t bufsize = 0, cwdsize = 0, cmdsize = 0;
+ bool ret = false;
+ debug_decl(iolog_parse_loginfo_legacy, SUDO_DEBUG_UTIL);
+
+ /*
+ * Info file has three lines:
+ * 1) a log info line
+ * 2) cwd
+ * 3) command with args
+ */
+ if (getdelim(&buf, &bufsize, '\n', fp) == -1 ||
+ getdelim(&evlog->cwd, &cwdsize, '\n', fp) == -1 ||
+ getdelim(&evlog->command, &cmdsize, '\n', fp) == -1) {
+ sudo_warn(U_("%s: invalid log file"), iolog_dir);
+ goto done;
+ }
+
+ /* Strip the newline from the cwd and command. */
+ evlog->cwd[strcspn(evlog->cwd, "\n")] = '\0';
+ evlog->command[strcspn(evlog->command, "\n")] = '\0';
+
+ /*
+ * Crack the log line (lines and cols not present in old versions).
+ * timestamp:user:runas_user:runas_group:tty:lines:cols
+ * XXX - probably better to use strtok and switch on the state.
+ */
+ buf[strcspn(buf, "\n")] = '\0';
+ cp = buf;
+
+ /* timestamp */
+ if ((ep = strchr(cp, ':')) == NULL) {
+ sudo_warn(U_("%s: time stamp field is missing"), iolog_dir);
+ goto done;
+ }
+ *ep = '\0';
+ evlog->submit_time.tv_sec = sudo_strtonum(cp, 0, TIME_T_MAX, &errstr);
+ if (errstr != NULL) {
+ sudo_warn(U_("%s: time stamp %s: %s"), iolog_dir, cp, errstr);
+ goto done;
+ }
+
+ /* submit user */
+ cp = ep + 1;
+ if ((ep = strchr(cp, ':')) == NULL) {
+ sudo_warn(U_("%s: user field is missing"), iolog_dir);
+ goto done;
+ }
+ if ((evlog->submituser = strndup(cp, (size_t)(ep - cp))) == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ goto done;
+ }
+
+ /* runas user */
+ cp = ep + 1;
+ if ((ep = strchr(cp, ':')) == NULL) {
+ sudo_warn(U_("%s: runas user field is missing"), iolog_dir);
+ goto done;
+ }
+ if ((evlog->runuser = strndup(cp, (size_t)(ep - cp))) == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ goto done;
+ }
+
+ /* runas group */
+ cp = ep + 1;
+ if ((ep = strchr(cp, ':')) == NULL) {
+ sudo_warn(U_("%s: runas group field is missing"), iolog_dir);
+ goto done;
+ }
+ if (cp != ep) {
+ if ((evlog->rungroup = strndup(cp, (size_t)(ep - cp))) == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ goto done;
+ }
+ }
+
+ /* tty, followed by optional lines + cols */
+ cp = ep + 1;
+ if ((ep = strchr(cp, ':')) == NULL) {
+ /* just the tty */
+ if ((evlog->ttyname = strdup(cp)) == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ goto done;
+ }
+ } else {
+ /* tty followed by lines + cols */
+ if ((evlog->ttyname = strndup(cp, (size_t)(ep - cp))) == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ goto done;
+ }
+ cp = ep + 1;
+ /* need to NULL out separator to use sudo_strtonum() */
+ /* XXX - use sudo_strtonumx */
+ if ((ep = strchr(cp, ':')) != NULL) {
+ *ep = '\0';
+ }
+ evlog->lines = sudo_strtonum(cp, 1, INT_MAX, &errstr);
+ if (errstr != NULL) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "%s: tty lines %s: %s", iolog_dir, cp, errstr);
+ }
+ if (ep != NULL) {
+ cp = ep + 1;
+ evlog->columns = sudo_strtonum(cp, 1, INT_MAX, &errstr);
+ if (errstr != NULL) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "%s: tty cols %s: %s", iolog_dir, cp, errstr);
+ }
+ }
+ }
+
+ ret = true;
+
+done:
+ free(buf);
+ debug_return_bool(ret);
+}
diff --git a/lib/iolog/iolog_loginfo.c b/lib/iolog/iolog_loginfo.c
new file mode 100644
index 0000000..373a81e
--- /dev/null
+++ b/lib/iolog/iolog_loginfo.c
@@ -0,0 +1,238 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2020 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif /* HAVE_STDBOOL_H */
+#include <string.h>
+#include <unistd.h>
+#include <fcntl.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_eventlog.h"
+#include "sudo_fatal.h"
+#include "sudo_gettext.h"
+#include "sudo_json.h"
+#include "sudo_iolog.h"
+#include "sudo_util.h"
+
+struct eventlog *
+iolog_parse_loginfo(int dfd, const char *iolog_dir)
+{
+ struct eventlog *evlog = NULL;
+ FILE *fp = NULL;
+ int fd = -1;
+ int tmpfd = -1;
+ bool ok, legacy = false;
+ debug_decl(iolog_parse_loginfo, SUDO_DEBUG_UTIL);
+
+ if (dfd == -1) {
+ if ((tmpfd = open(iolog_dir, O_RDONLY)) == -1) {
+ sudo_warn("%s", iolog_dir);
+ goto bad;
+ }
+ dfd = tmpfd;
+ }
+ if ((fd = openat(dfd, "log.json", O_RDONLY, 0)) == -1) {
+ fd = openat(dfd, "log", O_RDONLY, 0);
+ legacy = true;
+ }
+ if (tmpfd != -1)
+ close(tmpfd);
+ if (fd == -1 || (fp = fdopen(fd, "r")) == NULL) {
+ sudo_warn("%s/log", iolog_dir);
+ goto bad;
+ }
+ fd = -1;
+
+ if ((evlog = calloc(1, sizeof(*evlog))) == NULL) {
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+ goto bad;
+ }
+ evlog->runuid = (uid_t)-1;
+ evlog->rungid = (gid_t)-1;
+ evlog->exit_value = -1;
+
+ ok = legacy ? iolog_parse_loginfo_legacy(fp, iolog_dir, evlog) :
+ iolog_parse_loginfo_json(fp, iolog_dir, evlog);
+ if (ok) {
+ fclose(fp);
+ debug_return_ptr(evlog);
+ }
+
+bad:
+ if (fd != -1)
+ close(fd);
+ if (fp != NULL)
+ fclose(fp);
+ eventlog_free(evlog);
+ debug_return_ptr(NULL);
+}
+
+/*
+ * Write the legacy I/O log file that contains the user and command info.
+ * This file is not compressed.
+ */
+static bool
+iolog_write_info_file_legacy(int dfd, struct eventlog *evlog)
+{
+ char * const *av;
+ FILE *fp;
+ int error, fd;
+ debug_decl(iolog_info_write_log, SUDO_DEBUG_UTIL);
+
+ fd = iolog_openat(dfd, "log", O_CREAT|O_TRUNC|O_WRONLY);
+ if (fd == -1 || (fp = fdopen(fd, "w")) == NULL) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
+ "unable to %sopen %s/log", fd == -1 ? "" : "fd", evlog->iolog_path);
+ if (fd != -1)
+ close(fd);
+ debug_return_bool(false);
+ }
+ if (fchown(fd, iolog_get_uid(), iolog_get_gid()) != 0) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to fchown %d:%d %s/log", __func__,
+ (int)iolog_get_uid(), (int)iolog_get_gid(), evlog->iolog_path);
+ }
+
+ fprintf(fp, "%lld:%s:%s:%s:%s:%d:%d\n%s\n",
+ (long long)evlog->submit_time.tv_sec,
+ evlog->submituser ? evlog->submituser : "unknown",
+ evlog->runuser ? evlog->runuser : RUNAS_DEFAULT,
+ evlog->rungroup ? evlog->rungroup : "",
+ evlog->ttyname ? evlog->ttyname : "unknown",
+ evlog->lines, evlog->columns,
+ evlog->cwd ? evlog->cwd : "unknown");
+ fputs(evlog->command ? evlog->command : "unknown", fp);
+ for (av = evlog->argv + 1; *av != NULL; av++) {
+ fputc(' ', fp);
+ fputs(*av, fp);
+ }
+ fputc('\n', fp);
+ fflush(fp);
+ if ((error = ferror(fp))) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
+ "unable to write to I/O log file %s/log", evlog->iolog_path);
+ }
+ fclose(fp);
+
+ debug_return_bool(!error);
+}
+
+/*
+ * Write the "log.json" file that contains the user and command info.
+ * This file is not compressed.
+ */
+static bool
+iolog_write_info_file_json(int dfd, struct eventlog *evlog)
+{
+ struct json_container jsonc;
+ struct json_value json_value;
+ bool ret = false;
+ FILE *fp = NULL;
+ int fd = -1;
+ debug_decl(iolog_write_info_file_json, SUDO_DEBUG_UTIL);
+
+ if (!sudo_json_init(&jsonc, 4, false, false, false))
+ debug_return_bool(false);
+
+ /* Timestamp */
+ if (!sudo_json_open_object(&jsonc, "timestamp"))
+ goto oom;
+
+ json_value.type = JSON_NUMBER;
+ json_value.u.number = evlog->submit_time.tv_sec;
+ if (!sudo_json_add_value(&jsonc, "seconds", &json_value))
+ goto oom;
+
+ json_value.type = JSON_NUMBER;
+ json_value.u.number = evlog->submit_time.tv_nsec;
+ if (!sudo_json_add_value(&jsonc, "nanoseconds", &json_value))
+ goto oom;
+
+ if (!sudo_json_close_object(&jsonc))
+ goto oom;
+
+ if (!eventlog_store_json(&jsonc, evlog))
+ goto done;
+
+ fd = iolog_openat(dfd, "log.json", O_CREAT|O_TRUNC|O_WRONLY);
+ if (fd == -1 || (fp = fdopen(fd, "w")) == NULL) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
+ "unable to %sopen %s/log.json", fd == -1 ? "" : "fd",
+ evlog->iolog_path);
+ goto done;
+ }
+ if (fchown(fd, iolog_get_uid(), iolog_get_gid()) != 0) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to fchown %d:%d %s/log.json", __func__,
+ (int)iolog_get_uid(), (int)iolog_get_gid(), evlog->iolog_path);
+ }
+ fd = -1;
+
+ fprintf(fp, "{%s\n}\n", sudo_json_get_buf(&jsonc));
+ fflush(fp);
+ if (ferror(fp)) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO|SUDO_DEBUG_ERRNO,
+ "unable to write to I/O log file %s/log.json", evlog->iolog_path);
+ goto done;
+ }
+
+ ret = true;
+ goto done;
+
+oom:
+ sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
+done:
+ sudo_json_free(&jsonc);
+ if (fp != NULL)
+ fclose(fp);
+ if (fd != -1)
+ close(fd);
+
+ debug_return_bool(ret);
+}
+
+/*
+ * Write the I/O log and log.json files that contain user and command info.
+ * These files are not compressed.
+ */
+bool
+iolog_write_info_file(int dfd, struct eventlog *evlog)
+{
+ debug_decl(iolog_write_info_file, SUDO_DEBUG_UTIL);
+
+ if (!iolog_write_info_file_legacy(dfd, evlog))
+ debug_return_bool(false);
+ if (!iolog_write_info_file_json(dfd, evlog))
+ debug_return_bool(false);
+
+ debug_return_bool(true);
+}
diff --git a/lib/iolog/iolog_mkdirs.c b/lib/iolog/iolog_mkdirs.c
new file mode 100644
index 0000000..c9ab980
--- /dev/null
+++ b/lib/iolog/iolog_mkdirs.c
@@ -0,0 +1,143 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2022 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_fatal.h"
+#include "sudo_gettext.h"
+#include "sudo_iolog.h"
+#include "sudo_util.h"
+
+/*
+ * Create directory and any parent directories as needed.
+ */
+bool
+iolog_mkdirs(const char *path)
+{
+ const mode_t iolog_filemode = iolog_get_file_mode();
+ const mode_t iolog_dirmode = iolog_get_dir_mode();
+ const uid_t iolog_uid = iolog_get_uid();
+ const gid_t iolog_gid = iolog_get_gid();
+ bool ok = true, uid_changed = false;
+ struct stat sb;
+ mode_t omask;
+ int dfd;
+ debug_decl(iolog_mkdirs, SUDO_DEBUG_UTIL);
+
+ dfd = open(path, O_RDONLY|O_NONBLOCK);
+ if (dfd == -1 && errno == EACCES) {
+ /* Try again as the I/O log owner (for NFS). */
+ if (iolog_swapids(false)) {
+ dfd = open(path, O_RDONLY|O_NONBLOCK);
+ if (!iolog_swapids(true)) {
+ ok = false;
+ goto done;
+ }
+ }
+ }
+ if (dfd != -1 && fstat(dfd, &sb) != -1) {
+ if (S_ISDIR(sb.st_mode)) {
+ if (sb.st_uid != iolog_uid || sb.st_gid != iolog_gid) {
+ if (fchown(dfd, iolog_uid, iolog_gid) != 0) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to chown %d:%d %s", __func__,
+ (int)iolog_uid, (int)iolog_gid, path);
+ }
+ }
+ if ((sb.st_mode & ALLPERMS) != iolog_dirmode) {
+ if (fchmod(dfd, iolog_dirmode) != 0) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to chmod 0%o %s", __func__,
+ (int)iolog_dirmode, path);
+ }
+ }
+ } else {
+ sudo_warnx(U_("%s exists but is not a directory (0%o)"),
+ path, (unsigned int) sb.st_mode);
+ ok = false;
+ }
+ goto done;
+ }
+
+ /* umask must not be more restrictive than the file modes. */
+ omask = umask(ACCESSPERMS & ~(iolog_filemode|iolog_dirmode));
+
+ ok = false;
+ if (dfd != -1)
+ close(dfd);
+ dfd = sudo_open_parent_dir(path, iolog_uid, iolog_gid, iolog_dirmode, true);
+ if (dfd == -1 && errno == EACCES) {
+ /* Try again as the I/O log owner (for NFS). */
+ uid_changed = iolog_swapids(false);
+ if (uid_changed)
+ dfd = sudo_open_parent_dir(path, -1, -1, iolog_dirmode, false);
+ }
+ if (dfd != -1) {
+ /* Create final path component. */
+ const char *base = sudo_basename(path);
+ sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO,
+ "mkdir %s, mode 0%o", path, (unsigned int) iolog_dirmode);
+ ok = mkdirat(dfd, base, iolog_dirmode) == 0 || errno == EEXIST;
+ if (!ok) {
+ if (errno == EACCES && !uid_changed) {
+ /* Try again as the I/O log owner (for NFS). */
+ uid_changed = iolog_swapids(false);
+ if (uid_changed)
+ ok = mkdirat(dfd, base, iolog_dirmode) == 0 || errno == EEXIST;
+ }
+ if (!ok)
+ sudo_warn(U_("unable to mkdir %s"), path);
+ } else {
+ if (fchownat(dfd, base, iolog_uid, iolog_gid, AT_SYMLINK_NOFOLLOW) != 0) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to chown %d:%d %s", __func__,
+ (int)iolog_uid, (int)iolog_gid, path);
+ }
+ }
+ }
+ if (uid_changed) {
+ if (!iolog_swapids(true))
+ ok = false;
+ }
+
+ umask(omask);
+
+done:
+ if (dfd != -1)
+ close(dfd);
+ debug_return_bool(ok);
+}
diff --git a/lib/iolog/iolog_mkdtemp.c b/lib/iolog/iolog_mkdtemp.c
new file mode 100644
index 0000000..cf06a6c
--- /dev/null
+++ b/lib/iolog/iolog_mkdtemp.c
@@ -0,0 +1,99 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+#include <time.h>
+#include <errno.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_fatal.h"
+#include "sudo_gettext.h"
+#include "sudo_util.h"
+#include "sudo_iolog.h"
+
+/*
+ * Create temporary directory and any parent directories as needed.
+ */
+bool
+iolog_mkdtemp(char *path)
+{
+ const mode_t iolog_filemode = iolog_get_file_mode();
+ const mode_t iolog_dirmode = iolog_get_dir_mode();
+ const uid_t iolog_uid = iolog_get_uid();
+ const gid_t iolog_gid = iolog_get_gid();
+ bool ok = false, uid_changed = false;
+ char *dir = sudo_basename(path);
+ mode_t omask;
+ int dfd;
+ debug_decl(iolog_mkdtemp, SUDO_DEBUG_UTIL);
+
+ /* umask must not be more restrictive than the file modes. */
+ omask = umask(ACCESSPERMS & ~(iolog_filemode|iolog_dirmode));
+
+ dfd = sudo_open_parent_dir(path, iolog_uid, iolog_gid, iolog_dirmode, true);
+ if (dfd == -1 && errno == EACCES) {
+ /* Try again as the I/O log owner (for NFS). */
+ uid_changed = iolog_swapids(false);
+ if (uid_changed)
+ dfd = sudo_open_parent_dir(path, -1, -1, iolog_dirmode, false);
+ }
+ if (dfd != -1) {
+ /* Create final path component. */
+ sudo_debug_printf(SUDO_DEBUG_DEBUG|SUDO_DEBUG_LINENO,
+ "mkdtemp %s", path);
+ /* We cannot retry mkdtemp() so always open as iolog user */
+ if (!uid_changed)
+ uid_changed = iolog_swapids(false);
+ if (mkdtempat(dfd, dir) == NULL) {
+ sudo_warn(U_("unable to mkdir %s"), path);
+ ok = false;
+ } else {
+ if (fchmodat(dfd, dir, iolog_dirmode, 0) != 0) {
+ /* Not a fatal error, pre-existing mode is 0700. */
+ sudo_warn(U_("unable to change mode of %s to 0%o"),
+ path, (unsigned int)iolog_dirmode);
+ }
+ ok = true;
+ }
+ close(dfd);
+ }
+
+ umask(omask);
+
+ if (uid_changed) {
+ if (!iolog_swapids(true))
+ ok = false;
+ }
+ debug_return_bool(ok);
+}
diff --git a/lib/iolog/iolog_mkpath.c b/lib/iolog/iolog_mkpath.c
new file mode 100644
index 0000000..b4d177a
--- /dev/null
+++ b/lib/iolog/iolog_mkpath.c
@@ -0,0 +1,65 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+#include <string.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_iolog.h"
+
+/*
+ * Create path and any intermediate directories.
+ * If path ends in 'XXXXXX', use mkdtemp().
+ */
+bool
+iolog_mkpath(char *path)
+{
+ size_t len;
+ bool ret;
+ debug_decl(iolog_mkpath, SUDO_DEBUG_UTIL);
+
+ /*
+ * Create path and intermediate subdirs as needed.
+ * If path ends in at least 6 Xs (ala POSIX mktemp), use mkdtemp().
+ * Sets iolog_gid (if it is not already set) as a side effect.
+ */
+ len = strlen(path);
+ if (len >= 6 && strcmp(&path[len - 6], "XXXXXX") == 0)
+ ret = iolog_mkdtemp(path);
+ else
+ ret = iolog_mkdirs(path);
+
+ sudo_debug_printf(SUDO_DEBUG_INFO|SUDO_DEBUG_LINENO, "iolog path %s", path);
+
+ debug_return_bool(ret);
+}
diff --git a/lib/iolog/iolog_nextid.c b/lib/iolog/iolog_nextid.c
new file mode 100644
index 0000000..8977a35
--- /dev/null
+++ b/lib/iolog/iolog_nextid.c
@@ -0,0 +1,151 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+#include <string.h>
+#include <unistd.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <limits.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_fatal.h"
+#include "sudo_gettext.h"
+#include "sudo_iolog.h"
+#include "sudo_util.h"
+
+/*
+ * Read the on-disk sequence number, set sessid to the next
+ * number, and update the on-disk copy.
+ * Uses file locking to avoid sequence number collisions.
+ */
+bool
+iolog_nextid(const char *iolog_dir, char sessid[7])
+{
+ char buf[32], *ep;
+ int i, fd = -1;
+ unsigned long id = 0;
+ size_t len;
+ ssize_t nread;
+ bool ret = false;
+ char pathbuf[PATH_MAX];
+ static const char b36char[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
+ const uid_t iolog_uid = iolog_get_uid();
+ const gid_t iolog_gid = iolog_get_gid();
+ debug_decl(iolog_nextid, SUDO_DEBUG_UTIL);
+
+ /*
+ * Create I/O log directory if it doesn't already exist.
+ */
+ len = strlcpy(pathbuf, iolog_dir, sizeof(pathbuf));
+ if (len >= sizeof(pathbuf)) {
+ errno = ENAMETOOLONG;
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: %s", __func__, iolog_dir);
+ goto done;
+ }
+ if (!iolog_mkdirs(pathbuf))
+ goto done;
+
+ /*
+ * Open sequence file
+ */
+ len = strlcat(pathbuf, "/seq", sizeof(pathbuf));
+ if (len >= sizeof(pathbuf)) {
+ errno = ENAMETOOLONG;
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: %s/seq", __func__, iolog_dir);
+ goto done;
+ }
+ fd = iolog_openat(AT_FDCWD, pathbuf, O_RDWR|O_CREAT);
+ if (fd == -1) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to open %s", __func__, pathbuf);
+ goto done;
+ }
+ if (!sudo_lock_file(fd, SUDO_LOCK)) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "unable to lock %s", pathbuf);
+ goto done;
+ }
+ if (fchown(fd, iolog_uid, iolog_gid) != 0) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to fchown %d:%d %s", __func__,
+ (int)iolog_uid, (int)iolog_gid, pathbuf);
+ }
+
+ /* Read current seq number (base 36). */
+ nread = read(fd, buf, sizeof(buf) - 1);
+ if (nread != 0) {
+ if (nread == -1) {
+ goto done;
+ }
+ if (buf[nread - 1] == '\n')
+ nread--;
+ buf[nread] = '\0';
+ id = strtoul(buf, &ep, 36);
+ if (ep == buf || *ep != '\0' || id >= iolog_get_maxseq()) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "%s: bad sequence number: %s", pathbuf, buf);
+ id = 0;
+ }
+ }
+ id++;
+
+ /*
+ * Convert id to a string and stash in sessid.
+ * Note that that least significant digits go at the end of the string.
+ */
+ for (i = 5; i >= 0; i--) {
+ buf[i] = b36char[id % 36];
+ id /= 36;
+ }
+ buf[6] = '\n';
+
+ /* Stash id for logging purposes. */
+ memcpy(sessid, buf, 6);
+ sessid[6] = '\0';
+
+ /* Rewind and overwrite old seq file, including the NUL byte. */
+ if (pwrite(fd, buf, 7, 0) != 7) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to write %s", __func__, pathbuf);
+ goto done;
+ }
+ ret = true;
+
+done:
+ if (fd != -1)
+ close(fd);
+ debug_return_bool(ret);
+}
diff --git a/lib/iolog/iolog_open.c b/lib/iolog/iolog_open.c
new file mode 100644
index 0000000..c2556a7
--- /dev/null
+++ b/lib/iolog/iolog_open.c
@@ -0,0 +1,127 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+#include <errno.h>
+#include <fcntl.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_iolog.h"
+#include "sudo_util.h"
+
+static unsigned char const gzip_magic[2] = {0x1f, 0x8b};
+
+/*
+ * Open the specified I/O log file and store in iol.
+ * Stores the open file handle which has the close-on-exec flag set.
+ */
+bool
+iolog_open(struct iolog_file *iol, int dfd, int iofd, const char *mode)
+{
+ int flags;
+ const char *file;
+ unsigned char magic[2];
+ const uid_t iolog_uid = iolog_get_uid();
+ const gid_t iolog_gid = iolog_get_gid();
+ debug_decl(iolog_open, SUDO_DEBUG_UTIL);
+
+ if (mode[0] == 'r') {
+ flags = mode[1] == '+' ? O_RDWR : O_RDONLY;
+ } else if (mode[0] == 'w') {
+ flags = O_CREAT|O_TRUNC;
+ flags |= mode[1] == '+' ? O_RDWR : O_WRONLY;
+ } else {
+ sudo_debug_printf(SUDO_DEBUG_ERROR,
+ "%s: invalid I/O mode %s", __func__, mode);
+ debug_return_bool(false);
+ }
+ if ((file = iolog_fd_to_name(iofd)) == NULL) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR,
+ "%s: invalid iofd %d", __func__, iofd);
+ debug_return_bool(false);
+ }
+
+ iol->writable = false;
+ iol->compressed = false;
+ if (iol->enabled) {
+ int fd = iolog_openat(dfd, file, flags);
+ if (fd != -1) {
+ if (*mode == 'w') {
+ if (fchown(fd, iolog_uid, iolog_gid) != 0) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to fchown %d:%d %s", __func__,
+ (int)iolog_uid, (int)iolog_gid, file);
+ }
+ iol->compressed = iolog_get_compress();
+ } else {
+ /* check for gzip magic number */
+ if (pread(fd, magic, sizeof(magic), 0) == ssizeof(magic)) {
+ if (magic[0] == gzip_magic[0] && magic[1] == gzip_magic[1])
+ iol->compressed = true;
+ }
+ }
+ if (fcntl(fd, F_SETFD, FD_CLOEXEC) != -1) {
+#ifdef HAVE_ZLIB_H
+ if (iol->compressed)
+ iol->fd.g = gzdopen(fd, mode);
+ else
+#endif
+ iol->fd.f = fdopen(fd, mode);
+ }
+ if (iol->fd.v != NULL) {
+ switch ((flags & O_ACCMODE)) {
+ case O_WRONLY:
+ case O_RDWR:
+ iol->writable = true;
+ break;
+ }
+ } else {
+ int save_errno = errno;
+ close(fd);
+ errno = save_errno;
+ fd = -1;
+ }
+ }
+ if (fd == -1) {
+ iol->enabled = false;
+ debug_return_bool(false);
+ }
+ } else {
+ if (*mode == 'w') {
+ /* Remove old log file in case we recycled sequence numbers. */
+ (void)unlinkat(dfd, file, 0);
+ }
+ }
+ debug_return_bool(true);
+}
diff --git a/lib/iolog/iolog_openat.c b/lib/iolog/iolog_openat.c
new file mode 100644
index 0000000..f6cd21b
--- /dev/null
+++ b/lib/iolog/iolog_openat.c
@@ -0,0 +1,90 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_fatal.h"
+#include "sudo_gettext.h"
+#include "sudo_iolog.h"
+#include "sudo_util.h"
+
+/*
+ * Wrapper for openat(2) that sets umask and retries as iolog_uid/iolog_gid
+ * if openat(2) returns EACCES.
+ */
+int
+iolog_openat(int dfd, const char *path, int flags)
+{
+ const mode_t iolog_filemode = iolog_get_file_mode();
+ const mode_t iolog_dirmode = iolog_get_dir_mode();
+ mode_t omask = S_IRWXG|S_IRWXO;
+ int fd;
+ debug_decl(iolog_openat, SUDO_DEBUG_UTIL);
+
+ if (ISSET(flags, O_CREAT)) {
+ /* umask must not be more restrictive than the file modes. */
+ omask = umask(ACCESSPERMS & ~(iolog_filemode|iolog_dirmode));
+ }
+ fd = openat(dfd, path, flags, iolog_filemode);
+ if (fd == -1 && errno == EACCES) {
+ /* Enable write bit if it is missing. */
+ struct stat sb;
+ if (fstatat(dfd, path, &sb, 0) == 0) {
+ mode_t write_bits = iolog_filemode & (S_IWUSR|S_IWGRP|S_IWOTH);
+ if ((sb.st_mode & write_bits) != write_bits) {
+ if (fchmodat(dfd, path, iolog_filemode, 0) == 0)
+ fd = openat(dfd, path, flags, iolog_filemode);
+ }
+ }
+ }
+ if (fd == -1 && errno == EACCES) {
+ /* Try again as the I/O log owner (for NFS). */
+ if (iolog_swapids(false)) {
+ fd = openat(dfd, path, flags, iolog_filemode);
+ if (!iolog_swapids(true)) {
+ /* iolog_swapids() warns on error. */
+ if (fd != -1) {
+ close(fd);
+ fd = -1;
+ }
+ }
+ }
+ }
+ if (ISSET(flags, O_CREAT))
+ umask(omask);
+ debug_return_int(fd);
+}
diff --git a/lib/iolog/iolog_path.c b/lib/iolog/iolog_path.c
new file mode 100644
index 0000000..16f228c
--- /dev/null
+++ b/lib/iolog/iolog_path.c
@@ -0,0 +1,130 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2011-2015 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif /* HAVE_STDBOOL_H */
+#include <string.h>
+#include <limits.h>
+#include <time.h>
+#include <unistd.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_fatal.h"
+#include "sudo_gettext.h"
+#include "sudo_iolog.h"
+#include "sudo_util.h"
+
+/*
+ * Expand any escape sequences in inpath, returning the expanded path.
+ */
+bool
+expand_iolog_path(const char *inpath, char *path, size_t pathlen,
+ const struct iolog_path_escape *escapes, void *closure)
+{
+ char *dst, *pathend, tmpbuf[PATH_MAX];
+ const char *endbrace, *src;
+ bool strfit = false;
+ size_t len;
+ debug_decl(expand_iolog_path, SUDO_DEBUG_UTIL);
+
+ /* Collapse multiple leading slashes. */
+ while (inpath[0] == '/' && inpath[1] == '/')
+ inpath++;
+
+ pathend = path + pathlen;
+ for (src = inpath, dst = path; *src != '\0'; src++) {
+ if (src[0] == '%') {
+ if (src[1] == '{') {
+ endbrace = strchr(src + 2, '}');
+ if (endbrace != NULL) {
+ const struct iolog_path_escape *esc;
+ len = (size_t)(endbrace - src - 2);
+ for (esc = escapes; esc->name != NULL; esc++) {
+ if (strncmp(src + 2, esc->name, len) == 0 &&
+ esc->name[len] == '\0')
+ break;
+ }
+ if (esc->name != NULL) {
+ len = esc->copy_fn(dst, (size_t)(pathend - dst),
+ closure);
+ if (len >= (size_t)(pathend - dst))
+ goto bad;
+ dst += len;
+ src = endbrace;
+ continue;
+ }
+ }
+ } else if (src[1] == '%') {
+ /* Collapse %% -> % */
+ src++;
+ } else {
+ /* May need strftime() */
+ strfit = true;
+ }
+ }
+ /* Need at least 2 chars, including the NUL terminator. */
+ if (dst + 1 >= pathend)
+ goto bad;
+ *dst++ = *src;
+ }
+
+ /* Trim trailing slashes and NUL terminate. */
+ while (dst > path && dst[-1] == '/')
+ dst--;
+ *dst = '\0';
+
+ /* Expand strftime escapes as needed. */
+ if (strfit) {
+ struct tm tm;
+ time_t now;
+
+ time(&now);
+ if (localtime_r(&now, &tm) == NULL)
+ goto bad;
+
+ /* We only call strftime() on the current part of the buffer. */
+ tmpbuf[sizeof(tmpbuf) - 1] = '\0';
+ len = strftime(tmpbuf, sizeof(tmpbuf), path, &tm);
+
+ if (len == 0 || tmpbuf[sizeof(tmpbuf) - 1] != '\0')
+ goto bad; /* strftime() failed, buf too small? */
+
+ if (len >= (size_t)(pathend - path))
+ goto bad; /* expanded buffer too big to fit. */
+ memcpy(path, tmpbuf, len);
+ dst = path + len;
+ *dst = '\0';
+ }
+
+ debug_return_bool(true);
+bad:
+ debug_return_bool(false);
+}
diff --git a/lib/iolog/iolog_read.c b/lib/iolog/iolog_read.c
new file mode 100644
index 0000000..71f778a
--- /dev/null
+++ b/lib/iolog/iolog_read.c
@@ -0,0 +1,79 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+#include <time.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_iolog.h"
+
+/*
+ * Read from a (possibly compressed) I/O log file.
+ */
+ssize_t
+iolog_read(struct iolog_file *iol, void *buf, size_t nbytes,
+ const char **errstr)
+{
+ ssize_t nread;
+ debug_decl(iolog_read, SUDO_DEBUG_UTIL);
+
+ if (nbytes > UINT_MAX) {
+ errno = EINVAL;
+ if (errstr != NULL)
+ *errstr = strerror(errno);
+ debug_return_ssize_t(-1);
+ }
+
+#ifdef HAVE_ZLIB_H
+ if (iol->compressed) {
+ if ((nread = gzread(iol->fd.g, buf, nbytes)) == -1) {
+ if (errstr != NULL) {
+ int errnum;
+ *errstr = gzerror(iol->fd.g, &errnum);
+ if (errnum == Z_ERRNO)
+ *errstr = strerror(errno);
+ }
+ }
+ } else
+#endif
+ {
+ nread = (ssize_t)fread(buf, 1, nbytes, iol->fd.f);
+ if (nread == 0 && ferror(iol->fd.f)) {
+ nread = -1;
+ if (errstr != NULL)
+ *errstr = strerror(errno);
+ }
+ }
+ debug_return_ssize_t(nread);
+}
diff --git a/lib/iolog/iolog_seek.c b/lib/iolog/iolog_seek.c
new file mode 100644
index 0000000..928ae6e
--- /dev/null
+++ b/lib/iolog/iolog_seek.c
@@ -0,0 +1,69 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <time.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_iolog.h"
+
+/*
+ * I/O log wrapper for fseek/gzseek.
+ */
+off_t
+iolog_seek(struct iolog_file *iol, off_t offset, int whence)
+{
+ off_t ret;
+ //debug_decl(iolog_seek, SUDO_DEBUG_UTIL);
+
+#ifdef HAVE_ZLIB_H
+ if (iol->compressed)
+ ret = gzseek(iol->fd.g, offset, whence);
+ else
+#endif
+ ret = fseeko(iol->fd.f, offset, whence);
+
+ //debug_return_off_t(ret);
+ return ret;
+}
+
+/*
+ * I/O log wrapper for rewind/gzrewind.
+ */
+void
+iolog_rewind(struct iolog_file *iol)
+{
+ debug_decl(iolog_rewind, SUDO_DEBUG_UTIL);
+
+#ifdef HAVE_ZLIB_H
+ if (iol->compressed)
+ (void)gzrewind(iol->fd.g);
+ else
+#endif
+ rewind(iol->fd.f);
+
+ debug_return;
+}
diff --git a/lib/iolog/iolog_swapids.c b/lib/iolog/iolog_swapids.c
new file mode 100644
index 0000000..a0a3614
--- /dev/null
+++ b/lib/iolog/iolog_swapids.c
@@ -0,0 +1,95 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+#include <time.h>
+#include <unistd.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_fatal.h"
+#include "sudo_gettext.h"
+#include "sudo_iolog.h"
+
+/*
+ * Set effective user and group-IDs to iolog_uid and iolog_gid.
+ * If restore flag is set, swap them back.
+ */
+bool
+iolog_swapids(bool restore)
+{
+#ifdef HAVE_SETEUID
+ static uid_t user_euid = (uid_t)-1;
+ static gid_t user_egid = (gid_t)-1;
+ const uid_t iolog_uid = iolog_get_uid();
+ const gid_t iolog_gid = iolog_get_gid();
+ debug_decl(io_swapids, SUDO_DEBUG_UTIL);
+
+ if (user_euid == (uid_t)-1)
+ user_euid = geteuid();
+ if (user_egid == (gid_t)-1)
+ user_egid = getegid();
+
+ if (restore) {
+ if (seteuid(user_euid) == -1) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to restore effective uid to %d", __func__,
+ (int)user_euid);
+ sudo_warn("seteuid() %d -> %d", (int)iolog_uid, (int)user_euid);
+ debug_return_bool(false);
+ }
+ if (setegid(user_egid) == -1) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to restore effective gid to %d", __func__,
+ (int)user_egid);
+ sudo_warn("setegid() %d -> %d", (int)iolog_gid, (int)user_egid);
+ debug_return_bool(false);
+ }
+ } else {
+ /* Fail silently if the user has insufficient privileges. */
+ if (setegid(iolog_gid) == -1) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to set effective gid to %d", __func__,
+ (int)iolog_gid);
+ debug_return_bool(false);
+ }
+ if (seteuid(iolog_uid) == -1) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_ERRNO,
+ "%s: unable to set effective uid to %d", __func__,
+ (int)iolog_uid);
+ debug_return_bool(false);
+ }
+ }
+ debug_return_bool(true);
+#else
+ return false;
+#endif
+}
diff --git a/lib/iolog/iolog_timing.c b/lib/iolog/iolog_timing.c
new file mode 100644
index 0000000..9eddce8
--- /dev/null
+++ b/lib/iolog/iolog_timing.c
@@ -0,0 +1,273 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2020 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif /* HAVE_STDBOOL_H */
+#include <string.h>
+#include <signal.h>
+#include <unistd.h>
+#include <ctype.h>
+#include <errno.h>
+#include <limits.h>
+#include <fcntl.h>
+#include <time.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_eventlog.h"
+#include "sudo_fatal.h"
+#include "sudo_gettext.h"
+#include "sudo_iolog.h"
+#include "sudo_util.h"
+
+static int timing_event_adj;
+
+void
+iolog_adjust_delay(struct timespec *delay, struct timespec *max_delay,
+ double scale_factor)
+{
+ double seconds;
+ debug_decl(iolog_adjust_delay, SUDO_DEBUG_UTIL);
+
+ if (scale_factor != 1.0) {
+ /* Order is important: we don't want to double the remainder. */
+ seconds = (double)delay->tv_sec / scale_factor;
+ delay->tv_sec = (time_t)seconds;
+ delay->tv_nsec /= scale_factor;
+ delay->tv_nsec += (seconds - delay->tv_sec) * 1000000000;
+ while (delay->tv_nsec >= 1000000000) {
+ delay->tv_sec++;
+ delay->tv_nsec -= 1000000000;
+ }
+ }
+
+ /* Clamp to max delay. */
+ if (max_delay != NULL) {
+ if (sudo_timespeccmp(delay, max_delay, >)) {
+ delay->tv_sec = max_delay->tv_sec;
+ delay->tv_nsec = max_delay->tv_nsec;
+ }
+ }
+
+ debug_return;
+}
+
+/*
+ * Parse the delay as seconds and nanoseconds: %lld.%09ld
+ * Sudo used to write this as a double, but since timing data is logged
+ * in the C locale this may not match the current locale.
+ */
+char *
+iolog_parse_delay(const char *cp, struct timespec *delay,
+ const char *decimal_point)
+{
+ char numbuf[(((sizeof(long long) * 8) + 2) / 3) + 2];
+ const char *errstr, *ep;
+ long long llval;
+ size_t len;
+ debug_decl(iolog_parse_delay, SUDO_DEBUG_UTIL);
+
+ /* Parse seconds (whole number portion). */
+ for (ep = cp; isdigit((unsigned char)*ep); ep++)
+ continue;
+ len = (size_t)(ep - cp);
+ if (len >= sizeof(numbuf)) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "%s: number of seconds is too large", cp);
+ debug_return_ptr(NULL);
+ }
+ memcpy(numbuf, cp, len);
+ numbuf[len] = '\0';
+ delay->tv_sec = sudo_strtonum(numbuf, 0, TIME_T_MAX, &errstr);
+ if (errstr != NULL) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "%s: number of seconds is %s", numbuf, errstr);
+ debug_return_ptr(NULL);
+ }
+
+ /* Radix may be in user's locale for sudo < 1.7.4 so accept that too. */
+ if (*ep != '.' && *ep != *decimal_point) {
+ if (*ep == '\0' || isspace((unsigned char)*ep)) {
+ /* No fractional part. */
+ delay->tv_nsec = 0;
+ goto done;
+ }
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "invalid characters after seconds: %s", ep);
+ debug_return_ptr(NULL);
+ }
+ cp = ep + 1;
+
+ /* Parse fractional part, we may read more precision than we can store. */
+ for (ep = cp; isdigit((unsigned char)*ep); ep++)
+ continue;
+ len = (size_t)(ep - cp);
+ if (len >= sizeof(numbuf)) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "%s: number of nanoseconds is too large", cp);
+ debug_return_ptr(NULL);
+ }
+ memcpy(numbuf, cp, len);
+ numbuf[len] = '\0';
+ llval = sudo_strtonum(numbuf, 0, LLONG_MAX, &errstr);
+ if (errstr != NULL) {
+ sudo_debug_printf(SUDO_DEBUG_ERROR|SUDO_DEBUG_LINENO,
+ "%s: number of nanoseconds is %s", numbuf, errstr);
+ debug_return_ptr(NULL);
+ }
+
+ /* Adjust fractional part to nanosecond precision. */
+ if (len < 9) {
+ /* Convert to nanosecond precision. */
+ do {
+ llval *= 10;
+ } while (++len < 9);
+ } else if (len > 9) {
+ /* Clamp to nanoseconds. */
+ do {
+ llval /= 10;
+ } while (--len > 9);
+ }
+ delay->tv_nsec = (long)llval;
+
+done:
+ /* Advance to the next field. */
+ while (isspace((unsigned char)*ep))
+ ep++;
+
+ debug_return_str((char *)ep);
+}
+
+/*
+ * Parse a timing line, which is formatted as:
+ * IO_EVENT_TTYOUT sleep_time num_bytes
+ * IO_EVENT_WINSIZE sleep_time lines cols
+ * IO_EVENT_SUSPEND sleep_time signo
+ * Where type is IO_EVENT_*, sleep_time is the number of seconds to sleep
+ * before writing the data and num_bytes is the number of bytes to output.
+ * Returns true on success and false on failure.
+ */
+bool
+iolog_parse_timing(const char *line, struct timing_closure *timing)
+{
+ unsigned long ulval;
+ char *cp, *ep;
+ debug_decl(iolog_parse_timing, SUDO_DEBUG_UTIL);
+
+ /* Clear iolog descriptor. */
+ timing->iol = NULL;
+
+ /* Parse event type. */
+ ulval = strtoul(line, &ep, 10);
+ if (ep == line || !isspace((unsigned char) *ep))
+ goto bad;
+ if (ulval >= IO_EVENT_COUNT)
+ goto bad;
+ if (ulval == IO_EVENT_TTYOUT_1_8_7) {
+ /* work around a bug in timing files generated by sudo 1.8.7 */
+ timing_event_adj = 2;
+ }
+ timing->event = (int)ulval - timing_event_adj;
+ for (cp = ep + 1; isspace((unsigned char) *cp); cp++)
+ continue;
+
+ /* Parse delay, returns the next field or NULL on error. */
+ if ((cp = iolog_parse_delay(cp, &timing->delay, timing->decimal)) == NULL)
+ goto bad;
+
+ switch (timing->event) {
+ case IO_EVENT_SUSPEND:
+ /* Signal name (no leading SIG prefix) or number. */
+ if (str2sig(cp, &timing->u.signo) == -1)
+ goto bad;
+ break;
+ case IO_EVENT_WINSIZE:
+ ulval = strtoul(cp, &ep, 10);
+ if (ep == cp || !isspace((unsigned char) *ep))
+ goto bad;
+ if (ulval > INT_MAX)
+ goto bad;
+ timing->u.winsize.lines = (int)ulval;
+ for (cp = ep + 1; isspace((unsigned char) *cp); cp++)
+ continue;
+
+ ulval = strtoul(cp, &ep, 10);
+ if (ep == cp || *ep != '\0')
+ goto bad;
+ if (ulval > INT_MAX)
+ goto bad;
+ timing->u.winsize.cols = (int)ulval;
+ break;
+ default:
+ errno = 0;
+ ulval = strtoul(cp, &ep, 10);
+ if (ep == cp || *ep != '\0')
+ goto bad;
+ /* Note: assumes SIZE_MAX == ULONG_MAX */
+ if (errno == ERANGE && ulval == ULONG_MAX)
+ goto bad;
+ timing->u.nbytes = (size_t)ulval;
+ break;
+ }
+
+ debug_return_bool(true);
+bad:
+ debug_return_bool(false);
+}
+
+/*
+ * Read the next record from the timing file.
+ * Return 0 on success, 1 on EOF and -1 on error.
+ */
+int
+iolog_read_timing_record(struct iolog_file *iol, struct timing_closure *timing)
+{
+ char line[LINE_MAX];
+ const char *errstr;
+ debug_decl(iolog_read_timing_record, SUDO_DEBUG_UTIL);
+
+ /* Read next record from timing file. */
+ if (iolog_gets(iol, line, sizeof(line), &errstr) == NULL) {
+ /* EOF or error reading timing file, we are done. */
+ if (iolog_eof(iol))
+ debug_return_int(1);
+ sudo_warnx(U_("error reading timing file: %s"), errstr);
+ debug_return_int(-1);
+ }
+
+ /* Parse timing file record. */
+ line[strcspn(line, "\n")] = '\0';
+ if (!iolog_parse_timing(line, timing)) {
+ sudo_warnx(U_("invalid timing file line: %s"), line);
+ debug_return_int(-1);
+ }
+
+ debug_return_int(0);
+}
diff --git a/lib/iolog/iolog_util.c b/lib/iolog/iolog_util.c
new file mode 100644
index 0000000..bb1dde8
--- /dev/null
+++ b/lib/iolog/iolog_util.c
@@ -0,0 +1,74 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+#include <time.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_iolog.h"
+
+/*
+ * Map IOFD_* -> name.
+ */
+const char *
+iolog_fd_to_name(int iofd)
+{
+ const char *ret;
+ debug_decl(iolog_fd_to_name, SUDO_DEBUG_UTIL);
+
+ switch (iofd) {
+ case IOFD_STDIN:
+ ret = "stdin";
+ break;
+ case IOFD_STDOUT:
+ ret = "stdout";
+ break;
+ case IOFD_STDERR:
+ ret = "stderr";
+ break;
+ case IOFD_TTYIN:
+ ret = "ttyin";
+ break;
+ case IOFD_TTYOUT:
+ ret = "ttyout";
+ break;
+ case IOFD_TIMING:
+ ret = "timing";
+ break;
+ default:
+ ret = "unknown";
+ sudo_debug_printf(SUDO_DEBUG_ERROR, "%s: unexpected iofd %d",
+ __func__, iofd);
+ break;
+ }
+ debug_return_const_str(ret);
+}
diff --git a/lib/iolog/iolog_write.c b/lib/iolog/iolog_write.c
new file mode 100644
index 0000000..82a3f6d
--- /dev/null
+++ b/lib/iolog/iolog_write.c
@@ -0,0 +1,105 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2009-2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/*
+ * This is an open source non-commercial project. Dear PVS-Studio, please check it.
+ * PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+#include <string.h>
+#include <errno.h>
+#include <limits.h>
+#include <time.h>
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_iolog.h"
+
+/*
+ * Write to an I/O log, optionally compressing.
+ */
+ssize_t
+iolog_write(struct iolog_file *iol, const void *buf, size_t len,
+ const char **errstr)
+{
+ ssize_t ret;
+ debug_decl(iolog_write, SUDO_DEBUG_UTIL);
+
+ if (len > UINT_MAX) {
+ errno = EINVAL;
+ if (errstr != NULL)
+ *errstr = strerror(errno);
+ debug_return_ssize_t(-1);
+ }
+
+#ifdef HAVE_ZLIB_H
+ if (iol->compressed) {
+ int errnum;
+
+ ret = gzwrite(iol->fd.g, (const voidp)buf, len);
+ if (ret == 0) {
+ ret = -1;
+ if (errstr != NULL) {
+ *errstr = gzerror(iol->fd.g, &errnum);
+ if (errnum == Z_ERRNO)
+ *errstr = strerror(errno);
+ }
+ goto done;
+ }
+ if (iolog_get_flush()) {
+ if (gzflush(iol->fd.g, Z_SYNC_FLUSH) != Z_OK) {
+ ret = -1;
+ if (errstr != NULL) {
+ *errstr = gzerror(iol->fd.g, &errnum);
+ if (errnum == Z_ERRNO)
+ *errstr = strerror(errno);
+ }
+ goto done;
+ }
+ }
+ } else
+#endif
+ {
+ ret = fwrite(buf, 1, len, iol->fd.f);
+ if (ret == 0) {
+ ret = -1;
+ if (errstr != NULL)
+ *errstr = strerror(errno);
+ goto done;
+ }
+ if (iolog_get_flush()) {
+ if (fflush(iol->fd.f) != 0) {
+ ret = -1;
+ if (errstr != NULL)
+ *errstr = strerror(errno);
+ goto done;
+ }
+ }
+ }
+
+done:
+ debug_return_ssize_t(ret);
+}
diff --git a/lib/iolog/regress/corpus/seed/log_json/id.json b/lib/iolog/regress/corpus/seed/log_json/id.json
new file mode 100644
index 0000000..5655639
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_json/id.json
@@ -0,0 +1,36 @@
+{
+ "timestamp": {
+ "seconds": 1603746837,
+ "nanoseconds": 16450063
+ },
+ "columns": 80,
+ "command": "/usr/bin/id",
+ "lines": 24,
+ "runargv": [
+ "id"
+ ],
+ "runenv": [
+ "PATH=/home/millert/bin/OpenBSD.amd64:/home/millert/bin:/home/millert/bin/scripts:/home/millert/node_modules/.bin:/usr/local/gnu/bin:/usr/local/bin:/usr/local/sbin:/usr/local/etc:/usr/local/rcs/bin:/usr/local/nmh/bin:/usr/local/news/bin:/usr/local/emacs/bin:/usr/local/netpbm/bin:/usr/local/mtools/bin:/usr/local/netscape/bin:/usr/local/ghostscript/bin:/usr/local/frame-5.5.6/bin:/usr/local/teTeX/bin:/usr/local/cvs-1.10.1/bin:/usr/local/games/bin:/usr/local/archivers/bin:/usr/local/skey/bin:/usr/local/audio/bin:/usr/local/rtty/bin:/bin:/sbin:/usr/games:/usr/bin:/usr/sbin:/usr/etc:/etc:/usr/X11R6/bin:/usr/local/bin:/usr/obj/bin:/usr/src/bin",
+ "TERM=xterm-color",
+ "LANG=en_US.UTF-8",
+ "MAIL=/var/mail/root",
+ "LOGNAME=root",
+ "USER=root",
+ "HOME=/root",
+ "SHELL=/bin/ksh",
+ "SUDO_COMMAND=/usr/bin/id",
+ "SUDO_USER=millert",
+ "SUDO_UID=8036",
+ "SUDO_GID=20",
+ "KRB5CCNAME=bogus"
+ ],
+ "runuid": 0,
+ "rungid": 0,
+ "runcwd": "/usr/src/local/millert/sudo/trunk/lib/eventlog/regress",
+ "runuser": "root",
+ "rungroup": "wheel",
+ "submitcwd": "/usr/src/local/millert/sudo/trunk/lib/eventlog/regress",
+ "submithost": "xerxes.sudo.ws",
+ "submituser": "millert",
+ "ttyname": "/dev/ttypb"
+}
diff --git a/lib/iolog/regress/corpus/seed/log_json/ls.json b/lib/iolog/regress/corpus/seed/log_json/ls.json
new file mode 100644
index 0000000..17c99d8
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_json/ls.json
@@ -0,0 +1,31 @@
+{
+ "timestamp": {
+ "seconds": 1584790549,
+ "nanoseconds": 782859154
+ },
+ "columns": 80,
+ "command": "/bin/ls",
+ "lines": 24,
+ "runargv": [ "ls" ],
+ "runenv": [
+ "LANG=en_US.UTF-8",
+ "TERM=tmux",
+ "PATH=/home/millert/bin/OpenBSD.amd64:/home/millert/bin:/home/millert/bin/scripts:/home/millert/node_modules/.bin:/usr/local/gnu/bin:/usr/local/bin:/usr/local/sbin:/usr/local/etc:/usr/local/rcs/bin:/usr/local/nmh/bin:/usr/local/news/bin:/usr/local/emacs/bin:/usr/local/netpbm/bin:/usr/local/mtools/bin:/usr/local/netscape/bin:/usr/local/ghostscript/bin:/usr/local/frame-5.5.6/bin:/usr/local/teTeX/bin:/usr/local/cvs-1.10.1/bin:/usr/local/games/bin:/usr/local/archivers/bin:/usr/local/skey/bin:/usr/local/audio/bin:/usr/local/rtty/bin:/bin:/sbin:/usr/games:/usr/bin:/usr/sbin:/usr/etc:/etc:/usr/X11R6/bin:/usr/local/bin:/usr/obj/bin:/usr/src/bin",
+ "MAIL=/var/mail/root",
+ "LOGNAME=root",
+ "USER=root",
+ "HOME=/root",
+ "SHELL=/bin/ksh",
+ "SUDO_COMMAND=/bin/ls",
+ "SUDO_USER=millert",
+ "SUDO_UID=8036",
+ "SUDO_GID=20",
+ "KRB5CCNAME=bogus"
+ ],
+ "runuid": 0,
+ "runuser": "root",
+ "submitcwd": "/usr/src/local/millert/hg/sudo/1.7",
+ "submithost": "xerxes.sudo.ws",
+ "submituser": "millert",
+ "ttyname": "/dev/ttyp3"
+}
diff --git a/lib/iolog/regress/corpus/seed/log_json/mailq.json b/lib/iolog/regress/corpus/seed/log_json/mailq.json
new file mode 100644
index 0000000..669090d
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_json/mailq.json
@@ -0,0 +1,31 @@
+{
+ "timestamp": {
+ "seconds": 1584884264,
+ "nanoseconds": 499794755
+ },
+ "columns": 80,
+ "command": "/usr/bin/mailq",
+ "lines": 24,
+ "runargv": [ "mailq" ],
+ "runenv": [
+ "LANG=en_US.UTF-8",
+ "PATH=/home/millert/bin/OpenBSD.amd64:/home/millert/bin:/home/millert/bin/scripts:/home/millert/node_modules/.bin:/usr/local/gnu/bin:/usr/local/bin:/usr/local/sbin:/usr/local/etc:/usr/local/rcs/bin:/usr/local/nmh/bin:/usr/local/news/bin:/usr/local/emacs/bin:/usr/local/netpbm/bin:/usr/local/mtools/bin:/usr/local/netscape/bin:/usr/local/ghostscript/bin:/usr/local/frame-5.5.6/bin:/usr/local/teTeX/bin:/usr/local/cvs-1.10.1/bin:/usr/local/games/bin:/usr/local/archivers/bin:/usr/local/skey/bin:/usr/local/audio/bin:/usr/local/rtty/bin:/bin:/sbin:/usr/games:/usr/bin:/usr/sbin:/usr/etc:/etc:/usr/X11R6/bin:/usr/local/bin:/usr/obj/bin:/usr/src/bin",
+ "TERM=tmux",
+ "MAIL=/var/mail/root",
+ "LOGNAME=root",
+ "USER=root",
+ "HOME=/root",
+ "SHELL=/bin/ksh",
+ "SUDO_COMMAND=/usr/bin/mailq",
+ "SUDO_USER=millert",
+ "SUDO_UID=8036",
+ "SUDO_GID=20",
+ "KRB5CCNAME=bogus"
+ ],
+ "runuid": 0,
+ "runuser": "root",
+ "submitcwd": "/home/millert",
+ "submithost": "xerxes.sudo.ws",
+ "submituser": "millert",
+ "ttyname": "/dev/ttyp3"
+}
diff --git a/lib/iolog/regress/corpus/seed/log_json/make.json b/lib/iolog/regress/corpus/seed/log_json/make.json
new file mode 100644
index 0000000..dcc4736
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_json/make.json
@@ -0,0 +1,36 @@
+{
+ "timestamp": {
+ "seconds": 1584977889,
+ "nanoseconds": 510217787
+ },
+ "columns": 80,
+ "command": "/usr/bin/make",
+ "lines": 24,
+ "runargv": [
+ "make",
+ "-C",
+ "/usr/src/usr.bin/sort",
+ "install"
+ ],
+ "runenv": [
+ "PATH=/home/millert/bin/OpenBSD.amd64:/home/millert/bin:/home/millert/bin/scripts:/home/millert/node_modules/.bin:/usr/local/gnu/bin:/usr/local/bin:/usr/local/sbin:/usr/local/etc:/usr/local/rcs/bin:/usr/local/nmh/bin:/usr/local/news/bin:/usr/local/emacs/bin:/usr/local/netpbm/bin:/usr/local/mtools/bin:/usr/local/netscape/bin:/usr/local/ghostscript/bin:/usr/local/frame-5.5.6/bin:/usr/local/teTeX/bin:/usr/local/cvs-1.10.1/bin:/usr/local/games/bin:/usr/local/archivers/bin:/usr/local/skey/bin:/usr/local/audio/bin:/usr/local/rtty/bin:/bin:/sbin:/usr/games:/usr/bin:/usr/sbin:/usr/etc:/etc:/usr/X11R6/bin:/usr/local/bin:/usr/obj/bin:/usr/src/bin",
+ "TERM=xterm-color",
+ "LANG=en_US.UTF-8",
+ "MAIL=/var/mail/root",
+ "LOGNAME=root",
+ "USER=root",
+ "HOME=/root",
+ "SHELL=/bin/ksh",
+ "SUDO_COMMAND=/usr/bin/make -C /usr/src/usr.bin/sort install",
+ "SUDO_USER=millert",
+ "SUDO_UID=8036",
+ "SUDO_GID=20",
+ "KRB5CCNAME=bogus"
+ ],
+ "runuid": 0,
+ "runuser": "root",
+ "submitcwd": "/home/millert/tmp/src/usr.bin/sort",
+ "submithost": "xerxes.sudo.ws",
+ "submituser": "millert",
+ "ttyname": "/dev/ttypi"
+}
diff --git a/lib/iolog/regress/corpus/seed/log_json/pkg_add.json b/lib/iolog/regress/corpus/seed/log_json/pkg_add.json
new file mode 100644
index 0000000..bfebc76
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_json/pkg_add.json
@@ -0,0 +1,34 @@
+{
+ "timestamp": {
+ "seconds": 1595281300,
+ "nanoseconds": 130458256
+ },
+ "columns": 80,
+ "command": "/usr/sbin/pkg_add",
+ "lines": 24,
+ "runargv": [
+ "pkg_add",
+ "p5-PDF-API2"
+ ],
+ "runenv": [
+ "PATH=/home/millert/bin/OpenBSD.amd64:/home/millert/bin:/home/millert/bin/scripts:/home/millert/node_modules/.bin:/usr/local/gnu/bin:/usr/local/bin:/usr/local/sbin:/usr/local/etc:/usr/local/rcs/bin:/usr/local/nmh/bin:/usr/local/news/bin:/usr/local/emacs/bin:/usr/local/netpbm/bin:/usr/local/mtools/bin:/usr/local/netscape/bin:/usr/local/ghostscript/bin:/usr/local/frame-5.5.6/bin:/usr/local/teTeX/bin:/usr/local/cvs-1.10.1/bin:/usr/local/games/bin:/usr/local/archivers/bin:/usr/local/skey/bin:/usr/local/audio/bin:/usr/local/rtty/bin:/bin:/sbin:/usr/games:/usr/bin:/usr/sbin:/usr/etc:/etc:/usr/X11R6/bin:/usr/local/bin:/usr/obj/bin:/usr/src/bin",
+ "TERM=xterm-color",
+ "LANG=en_US.UTF-8",
+ "MAIL=/var/mail/root",
+ "LOGNAME=root",
+ "USER=root",
+ "HOME=/root",
+ "SHELL=/bin/ksh",
+ "SUDO_COMMAND=/usr/sbin/pkg_add p5-PDF-API2",
+ "SUDO_USER=millert",
+ "SUDO_UID=8036",
+ "SUDO_GID=20",
+ "KRB5CCNAME=bogus"
+ ],
+ "runuid": 0,
+ "runuser": "root",
+ "submitcwd": "/usr/src/local/Music/chordpro",
+ "submithost": "xerxes.sudo.ws",
+ "submituser": "millert",
+ "ttyname": "/dev/ttypd"
+}
diff --git a/lib/iolog/regress/corpus/seed/log_json/pkg_delete.json b/lib/iolog/regress/corpus/seed/log_json/pkg_delete.json
new file mode 100644
index 0000000..f0e4fba
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_json/pkg_delete.json
@@ -0,0 +1,34 @@
+{
+ "timestamp": {
+ "seconds": 1595620314,
+ "nanoseconds": 965982512
+ },
+ "columns": 80,
+ "command": "/usr/sbin/pkg_delete",
+ "lines": 24,
+ "runargv": [
+ "pkg_delete",
+ "chordpro"
+ ],
+ "runenv": [
+ "PATH=/home/millert/bin/OpenBSD.amd64:/home/millert/bin:/home/millert/bin/scripts:/home/millert/node_modules/.bin:/usr/local/gnu/bin:/usr/local/bin:/usr/local/sbin:/usr/local/etc:/usr/local/rcs/bin:/usr/local/nmh/bin:/usr/local/news/bin:/usr/local/emacs/bin:/usr/local/netpbm/bin:/usr/local/mtools/bin:/usr/local/netscape/bin:/usr/local/ghostscript/bin:/usr/local/frame-5.5.6/bin:/usr/local/teTeX/bin:/usr/local/cvs-1.10.1/bin:/usr/local/games/bin:/usr/local/archivers/bin:/usr/local/skey/bin:/usr/local/audio/bin:/usr/local/rtty/bin:/bin:/sbin:/usr/games:/usr/bin:/usr/sbin:/usr/etc:/etc:/usr/X11R6/bin:/usr/local/bin:/usr/obj/bin:/usr/src/bin",
+ "TERM=xterm-color",
+ "LANG=en_US.UTF-8",
+ "MAIL=/var/mail/root",
+ "LOGNAME=root",
+ "USER=root",
+ "HOME=/root",
+ "SHELL=/bin/ksh",
+ "SUDO_COMMAND=/usr/sbin/pkg_delete chordpro",
+ "SUDO_USER=millert",
+ "SUDO_UID=8036",
+ "SUDO_GID=20",
+ "KRB5CCNAME=bogus"
+ ],
+ "runuid": 0,
+ "runuser": "root",
+ "submitcwd": "/usr/ports/textproc/chordpro/pkg",
+ "submithost": "xerxes.sudo.ws",
+ "submituser": "millert",
+ "ttyname": "/dev/ttypd"
+}
diff --git a/lib/iolog/regress/corpus/seed/log_json/printenv.json b/lib/iolog/regress/corpus/seed/log_json/printenv.json
new file mode 100644
index 0000000..6e78719
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_json/printenv.json
@@ -0,0 +1,34 @@
+{
+ "timestamp": {
+ "seconds": 1601411718,
+ "nanoseconds": 269131020
+ },
+ "columns": 80,
+ "command": "/usr/bin/printenv",
+ "lines": 24,
+ "runargv": [
+ "/usr/bin/printenv"
+ ],
+ "runenv": [
+ "KRB5CCNAME=bogus",
+ "LANG=en_US.UTF-8",
+ "PATH=/tmp",
+ "TERM=xterm-color",
+ "MAIL=/var/mail/root",
+ "LOGNAME=root",
+ "USER=root",
+ "HOME=/root",
+ "SHELL=/bin/ksh",
+ "SUDO_COMMAND=/usr/bin/printenv",
+ "SUDO_USER=testdude",
+ "SUDO_UID=1000",
+ "SUDO_GID=1000"
+ ],
+ "runuid": 0,
+ "runcwd": "/usr/src/local/millert/sudo/trunk/plugins/sudoers",
+ "runuser": "root",
+ "submitcwd": "/usr/src/local/millert/sudo/trunk/plugins/sudoers",
+ "submithost": "xerxes.sudo.ws",
+ "submituser": "testdude",
+ "ttyname": "/dev/ttypb"
+}
diff --git a/lib/iolog/regress/corpus/seed/log_legacy/id.log b/lib/iolog/regress/corpus/seed/log_legacy/id.log
new file mode 100644
index 0000000..e59965e
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_legacy/id.log
@@ -0,0 +1,3 @@
+1603746837:millert:root::/dev/ttypb:24:80
+/usr/src/local/millert/sudo/trunk/lib/eventlog/regress
+/usr/bin/id
diff --git a/lib/iolog/regress/corpus/seed/log_legacy/less.log b/lib/iolog/regress/corpus/seed/log_legacy/less.log
new file mode 100644
index 0000000..66e2929
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_legacy/less.log
@@ -0,0 +1,3 @@
+1611859113:bob:bob:ldap:/dev/console:24:80
+/var/tmp
+/usr/bin/less /etc/ldapd.conf
diff --git a/lib/iolog/regress/corpus/seed/log_legacy/ls.log b/lib/iolog/regress/corpus/seed/log_legacy/ls.log
new file mode 100644
index 0000000..808605c
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_legacy/ls.log
@@ -0,0 +1,3 @@
+1584790549:millert:root::/dev/ttyp3:24:80
+/usr/src/local/millert/hg/sudo/1.7
+/bin/ls
diff --git a/lib/iolog/regress/corpus/seed/log_legacy/mailq.log b/lib/iolog/regress/corpus/seed/log_legacy/mailq.log
new file mode 100644
index 0000000..9b1fdd6
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_legacy/mailq.log
@@ -0,0 +1,3 @@
+1584884264:millert:root::/dev/ttyp3:24:80
+/home/millert
+/usr/bin/mailq
diff --git a/lib/iolog/regress/corpus/seed/log_legacy/make.log b/lib/iolog/regress/corpus/seed/log_legacy/make.log
new file mode 100644
index 0000000..c27798a
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_legacy/make.log
@@ -0,0 +1,3 @@
+1584977889:millert:root::/dev/ttypi:24:80
+/home/millert/tmp/src/usr.bin/sort
+/usr/bin/make -C /usr/src/usr.bin/sort install
diff --git a/lib/iolog/regress/corpus/seed/log_legacy/pkg_add.log b/lib/iolog/regress/corpus/seed/log_legacy/pkg_add.log
new file mode 100644
index 0000000..78358e7
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_legacy/pkg_add.log
@@ -0,0 +1,3 @@
+1595281300:millert:root::/dev/ttypd:24:80
+/usr/src/local/Music/chordpro
+/usr/sbin/pkg_add p5-PDF-API2
diff --git a/lib/iolog/regress/corpus/seed/log_legacy/pkg_delete.log b/lib/iolog/regress/corpus/seed/log_legacy/pkg_delete.log
new file mode 100644
index 0000000..ce0899a
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_legacy/pkg_delete.log
@@ -0,0 +1,3 @@
+1595620314:millert:root::/dev/ttypd:24:80
+/usr/ports/textproc/chordpro/pkg
+/usr/sbin/pkg_delete chordpro
diff --git a/lib/iolog/regress/corpus/seed/log_legacy/printenv.log b/lib/iolog/regress/corpus/seed/log_legacy/printenv.log
new file mode 100644
index 0000000..dbc739a
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_legacy/printenv.log
@@ -0,0 +1,3 @@
+1601411718:testdude:root::/dev/ttypb:24:80
+/usr/src/local/millert/sudo/trunk/plugins/sudoers
+/usr/bin/printenv
diff --git a/lib/iolog/regress/corpus/seed/log_legacy/smtpctl.log b/lib/iolog/regress/corpus/seed/log_legacy/smtpctl.log
new file mode 100644
index 0000000..d365617
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_legacy/smtpctl.log
@@ -0,0 +1,3 @@
+1666108884:aemon:root::/dev/pts/4:64:128
+/home/aemon
+/usr/sbin/smtpctl remove 272a4d27e1fd732e
diff --git a/lib/iolog/regress/corpus/seed/log_legacy/vi.log b/lib/iolog/regress/corpus/seed/log_legacy/vi.log
new file mode 100644
index 0000000..c95f061
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/log_legacy/vi.log
@@ -0,0 +1,3 @@
+1611849879:alice:root::/dev/pts/0:24:80
+/export/home/alice
+/usr/bin/vi /etc/nsswitch.conf
diff --git a/lib/iolog/regress/corpus/seed/timing/timing.1 b/lib/iolog/regress/corpus/seed/timing/timing.1
new file mode 100644
index 0000000..e954cda
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/timing/timing.1
@@ -0,0 +1,51 @@
+4 0.032200538 32
+4 0.000461816 917
+4 0.000260488 41
+3 0.748747801 1
+4 0.002709345 1040
+3 0.605486330 1
+4 0.002136958 792
+3 0.981620620 1
+4 0.001898021 39
+7 0.002496718 TSTP
+7 11.781181911 CONT
+5 0.000331519 59 120
+4 0.002261240 7
+4 0.005713594 7
+4 0.001005416 974
+4 0.004255422 2064
+4 0.001929362 445
+3 0.632938830 1
+4 0.001316335 15
+3 0.989972022 1
+4 0.001419091 39
+7 0.002164759 TSTP
+7 1.195700989 CONT
+4 0.001525087 7
+7 0.002025577 TTOU
+7 0.908621867 CONT
+4 0.001755079 7
+4 0.001712634 2064
+4 0.001236879 467
+3 0.347054501 1
+4 0.003931829 2082
+3 0.236017124 1
+4 0.002960088 618
+3 0.285032645 1
+4 0.000951230 1
+3 0.470931231 1
+4 0.001103587 8
+3 0.142977268 1
+4 0.001048037 1
+3 0.126189543 1
+4 0.000255520 1
+4 0.000641997 2064
+4 0.000298772 176
+3 3.183861587 1
+4 0.001098032 9
+3 0.142511842 1
+4 0.000995141 1
+3 0.191337037 1
+4 0.001096192 1
+4 0.001180378 7
+4 0.000838979 28
diff --git a/lib/iolog/regress/corpus/seed/timing/timing.2 b/lib/iolog/regress/corpus/seed/timing/timing.2
new file mode 100644
index 0000000..d3e8da0
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/timing/timing.2
@@ -0,0 +1,196 @@
+4 0.017420446 378
+4 0.101673410 78
+4 0.020237132 106
+4 32.406835619 258
+4 0.071903094 51
+4 0.044405150 53
+4 0.002465527 153
+4 0.061104878 37
+4 0.037284253 3
+4 0.035933494 3
+4 0.035405047 3
+4 0.035096439 3
+4 0.035427343 3
+4 0.035278610 3
+4 0.035503923 3
+4 0.034726429 3
+4 0.035415822 3
+4 0.035642850 4
+4 0.035104123 3
+4 0.035177940 3
+4 0.035114787 3
+4 0.035398463 3
+4 0.035774228 3
+4 0.034687088 3
+4 0.035231607 3
+4 0.035235355 3
+4 0.035430098 3
+4 0.035238761 3
+4 0.035310472 3
+4 0.035678834 6
+4 0.035098980 3
+4 0.034974643 3
+4 0.034769832 3
+4 0.035066706 3
+4 0.034910781 3
+4 0.034939164 3
+4 0.035387880 3
+4 0.036229124 3
+4 0.035210123 6
+4 0.034996626 6
+4 0.034484929 2
+4 0.014762481 40
+4 0.034798156 3
+4 0.035382724 3
+4 0.035200992 3
+4 0.035793731 3
+4 0.036046635 3
+4 0.035232505 3
+4 0.035596184 3
+4 0.034359958 3
+4 0.034881742 3
+4 0.036581308 4
+4 0.035716612 3
+4 0.034981224 3
+4 0.034653311 3
+4 0.035700405 3
+4 0.035204600 3
+4 0.035080066 3
+4 0.035072298 3
+4 0.035950557 3
+4 0.034524949 3
+4 0.035231401 3
+4 0.035918148 6
+4 0.035009022 3
+4 0.034086126 3
+4 0.034031601 3
+4 0.035507794 3
+4 0.035359991 3
+4 0.035451670 3
+4 0.034207436 3
+4 0.036154464 3
+4 0.034687026 6
+4 0.034511000 6
+4 0.035712971 2
+4 0.001114632 280
+4 0.013357954 70
+4 0.009099934 250
+4 0.345595767 59
+4 0.014672692 168
+4 0.165009111 119
+4 0.037129573 168
+4 0.163729717 119
+4 0.046685595 70
+4 0.010058716 205
+4 0.335682997 62
+4 0.009757680 403
+4 0.764539162 234
+4 0.126274733 133
+4 0.035954324 133
+4 0.160744133 706
+4 0.012594228 389
+4 0.000600099 337
+4 0.008974842 70
+4 0.009992828 205
+4 0.333655416 62
+4 0.009799688 415
+4 0.768206552 251
+4 0.123329919 133
+4 0.036529633 133
+4 0.131658603 706
+4 0.009965871 452
+4 0.000352099 274
+4 0.006881291 70
+4 0.007616147 210
+4 0.258108895 67
+4 0.007582335 418
+4 0.592632286 244
+4 0.096206429 143
+4 0.028539423 143
+4 0.124772846 706
+4 0.009854967 389
+4 0.000365510 337
+4 0.038009729 245
+4 0.044260031 73
+4 0.013835442 72
+4 0.013734457 81
+4 0.013966252 260
+4 0.233058895 59
+4 0.007278138 869
+4 1.481039643 148
+4 0.089258162 158
+4 0.082642822 151
+4 0.051838211 2202
+4 0.164269353 45
+4 0.014776451 127
+4 0.033523033 127
+4 0.102601946 706
+4 0.009758392 475
+4 0.000371524 251
+4 0.006895216 149
+4 0.101515800 117
+4 0.049231011 149
+4 0.100724385 117
+4 0.028593605 142
+4 0.100398116 110
+4 0.033582408 74
+4 0.013919259 82
+4 0.020859788 63
+4 0.007864945 70
+4 0.007803279 207
+4 0.258587972 64
+4 0.007479117 409
+4 0.590341346 238
+4 0.095587884 137
+4 0.028246058 137
+4 0.125974303 706
+4 0.009846897 475
+4 0.000398383 251
+4 0.007711302 101
+4 0.013103236 208
+4 0.261674900 65
+4 0.007528283 730
+4 0.890361622 601
+4 0.126547307 139
+4 0.034250610 139
+4 0.126209288 706
+4 0.009859395 475
+4 0.000386854 251
+4 0.002122077 310
+4 0.153210769 179
+4 0.014128026 253
+4 0.007009755 152
+4 0.127577685 103
+4 0.029587241 31
+4 0.001733173 36
+4 0.001730350 187
+4 0.002311429 334
+4 0.002449265 165
+4 0.089927714 131
+4 0.028627022 132
+4 0.124746485 706
+4 0.009744954 452
+4 0.000377336 274
+4 0.006732444 62
+4 0.006519788 106
+4 0.024636847 130
+4 0.018143227 294
+4 0.177574909 150
+4 0.124543833 104
+4 0.021106187 92
+4 0.021020993 108
+4 0.019733705 106
+4 0.021929696 120
+4 0.021340851 108
+4 0.020144663 104
+4 0.019972905 96
+4 0.019911985 102
+4 0.020978336 118
+4 0.020270010 118
+4 0.020800394 98
+4 0.023331698 118
+4 0.020625734 108
+4 0.024362590 45
+4 0.006712794 74
+4 0.008052322 209
+4 0.088262080 95
diff --git a/lib/iolog/regress/corpus/seed/timing/timing.3 b/lib/iolog/regress/corpus/seed/timing/timing.3
new file mode 100644
index 0000000..4034898
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/timing/timing.3
@@ -0,0 +1,988 @@
+4 0.004667517 65
+1 0.000204598 16384
+1 0.000232870 16384
+1 0.000182715 16384
+1 0.000233631 16384
+1 0.000180381 16384
+1 0.000175649 16384
+1 0.000175959 16384
+1 0.000214345 16384
+1 0.000184234 16384
+1 0.000227610 16384
+1 0.000185340 16384
+1 0.000176307 16384
+1 0.000175898 16384
+1 0.000268993 16384
+1 0.000183674 16384
+1 0.000215319 16384
+1 0.000175147 16384
+1 0.000175248 16384
+1 0.000175224 16384
+1 0.000215165 16384
+1 0.000186660 16384
+1 0.000175657 16384
+1 0.000212448 16384
+1 0.000176406 16384
+1 0.000176418 16384
+1 0.000175909 16384
+1 0.000233918 16384
+1 0.000175175 16384
+1 0.000210767 16384
+1 0.000176349 16384
+1 0.000175932 16384
+1 0.000223892 16384
+1 0.000204215 16384
+1 0.000182071 16384
+1 0.000174307 16384
+1 0.000212948 16384
+1 0.000174008 16384
+1 0.000183305 16384
+1 0.000210859 16384
+1 0.000173624 16384
+1 0.000174269 16384
+1 0.000173759 16384
+1 0.000211001 16384
+1 0.000188432 16384
+1 0.000208482 16384
+1 0.000173818 16384
+1 0.000173706 16384
+1 0.000172848 16384
+1 0.000219983 16384
+1 0.000173715 16384
+1 0.000173231 16384
+1 0.000207740 16384
+1 0.000172355 16384
+1 0.000173862 16384
+1 0.000218171 16384
+1 0.000172711 16384
+1 0.000171980 16384
+1 0.000173769 16384
+1 0.000209693 16384
+1 0.000182913 16384
+1 0.000213414 16384
+1 0.000174563 16384
+1 0.000176066 16384
+1 0.000178416 16384
+1 0.000211025 16384
+1 0.000184019 16384
+1 0.000172715 16384
+1 0.000211906 16384
+1 0.000172898 16384
+1 0.000172698 16384
+1 0.000172687 16384
+1 0.000219835 16384
+1 0.000175073 16384
+1 0.000172194 16384
+1 0.000210039 16384
+1 0.000172651 16384
+1 0.000180363 16384
+1 0.000207814 16384
+1 0.000181339 16384
+1 0.000172957 16384
+1 0.000210462 16384
+1 0.000173359 16384
+1 0.000183117 16384
+1 0.000211472 16384
+1 0.000172785 16384
+1 0.000173065 16384
+1 0.000172556 16384
+1 0.000219412 16384
+1 0.000175049 16384
+1 0.000172688 16384
+1 0.000212409 16384
+1 0.000173995 16384
+1 0.000173362 16384
+1 0.000217888 16384
+1 0.000174519 16384
+1 0.000179535 16384
+1 0.000210660 16384
+1 0.000173236 16384
+1 0.000172656 16384
+1 0.000218333 16384
+1 0.000175598 16384
+1 0.000173390 16384
+1 0.000174078 16384
+1 0.000210326 16384
+1 0.000182926 16384
+1 0.000173350 16384
+1 0.000211036 16384
+1 0.000174038 16384
+1 0.000173647 16384
+1 0.000173506 16384
+1 0.000219713 16384
+1 0.000173048 16384
+1 0.000216544 16384
+1 0.000173473 16384
+1 0.000173584 16384
+1 0.000217290 16384
+1 0.000221436 16384
+1 0.000181452 16384
+1 0.000175981 16384
+1 0.000216787 16384
+1 0.000176126 16384
+1 0.000192080 16384
+1 0.000218372 16384
+1 0.000176383 16384
+1 0.000175741 16384
+1 0.000176882 16384
+1 0.000211760 16384
+1 0.000180460 16384
+1 0.000171301 16384
+1 0.000217254 16384
+1 0.000171345 16384
+1 0.000171068 16384
+1 0.000217296 16384
+1 0.000171584 16384
+1 0.000171382 16384
+1 0.000211004 16384
+1 0.000171735 16384
+1 0.000171288 16384
+1 0.000217634 16384
+1 0.000171509 16384
+1 0.000171665 16384
+1 0.000171047 16384
+1 0.000232622 16384
+1 0.000200850 16384
+1 0.000186185 16384
+1 0.000236223 16384
+1 0.000189277 16384
+1 0.000184901 16384
+1 0.000218248 16384
+1 0.000186495 16384
+1 0.000197206 16384
+1 0.000211952 16384
+1 0.000175248 16384
+1 0.000173748 16384
+1 0.000174236 16384
+1 0.000222111 16384
+1 0.000174574 16384
+1 0.000174434 16384
+1 0.000212226 16384
+1 0.000174342 16384
+1 0.000184829 16384
+1 0.000213260 16384
+1 0.000173502 16384
+1 0.000173093 16384
+1 0.000221162 16384
+1 0.000174153 16384
+1 0.000182299 16384
+1 0.000210864 16384
+1 0.000203068 16384
+1 0.000219136 16384
+1 0.000174002 16384
+1 0.000213188 16384
+1 0.000183505 16384
+1 0.000172565 16384
+1 0.000209734 16384
+1 0.000174341 16384
+1 0.000172264 16384
+1 0.000221781 16384
+1 0.000174790 16384
+1 0.000172739 16384
+1 0.000174020 16384
+1 0.000221785 16384
+1 0.000172995 16384
+1 0.000222941 16384
+1 0.000173977 16384
+1 0.000172728 16384
+1 0.000173524 16384
+1 0.000214508 16384
+1 0.000180455 16384
+1 0.000173688 16384
+1 0.000218400 16384
+1 0.000173836 16384
+1 0.000173021 16384
+1 0.000174233 16384
+1 0.000211773 16384
+1 0.000173345 16384
+1 0.000172586 16384
+1 0.000209547 16384
+1 0.000173828 16384
+1 0.000177025 16384
+1 0.000219995 16384
+1 0.000172918 16384
+1 0.000173449 16384
+1 0.000209423 16384
+1 0.000181676 16384
+1 0.000183441 16384
+1 0.000209581 16384
+1 0.000173832 16384
+1 0.000173270 16384
+1 0.000172904 16384
+1 0.000210702 16384
+1 0.000182215 16384
+1 0.000189641 16384
+1 0.000284181 16384
+1 0.000175365 16384
+1 0.000172881 16384
+1 0.000228551 16384
+1 0.000183598 16384
+1 0.000212813 16384
+1 0.000171234 16384
+1 0.000171113 16384
+1 0.000265216 16384
+1 0.000256766 16384
+1 0.000177761 16384
+1 0.000176795 16384
+1 0.000216366 16384
+1 0.000176847 16384
+1 0.000176382 16384
+1 0.000196256 16384
+1 0.000185652 16384
+1 0.000191254 16384
+1 0.000184776 16384
+1 0.000217719 16384
+1 0.000196783 16384
+1 0.000214624 16384
+1 0.000176543 16384
+1 0.000176621 16384
+1 0.000176781 16384
+1 0.000214375 16384
+1 0.000187073 16384
+1 0.000175881 16384
+1 0.000214427 16384
+1 0.000176819 16384
+1 0.000186002 16384
+1 0.000223983 16384
+1 0.000173340 16384
+1 0.000180282 16384
+1 0.000175780 16384
+1 0.000216125 16384
+1 0.000176193 16384
+1 0.000234609 16384
+1 0.000175698 16384
+1 0.000174926 16384
+1 0.000175740 16384
+1 0.000213854 16384
+1 0.000176984 16384
+1 0.000186810 16384
+1 0.000210152 16384
+1 0.000174875 16384
+1 0.000174813 16384
+1 0.000175036 16384
+1 0.000226974 16384
+1 0.000174660 16384
+1 0.000174744 16384
+1 0.000204522 16384
+1 0.000174780 16384
+1 0.000174814 16384
+1 0.000221269 16384
+1 0.000188334 16384
+1 0.000175739 16384
+1 0.000209695 16384
+1 0.000193824 16384
+1 0.000188632 16384
+1 0.000210526 16384
+1 0.000174158 16384
+1 0.000174339 16384
+1 0.000174180 16384
+1 0.000206907 16384
+1 0.000182368 16384
+1 0.000173833 16384
+1 0.000209012 16384
+1 0.000173131 16384
+1 0.000172859 16384
+1 0.000172674 16384
+1 0.000219815 16384
+1 0.000182668 16384
+1 0.000212487 16384
+1 0.000173833 16384
+1 0.000173242 16384
+1 0.000221886 16384
+1 0.000174126 16384
+1 0.000173782 16384
+1 0.000173083 16384
+1 0.000212048 16384
+1 0.000173991 16384
+1 0.000183737 16384
+1 0.000212986 16384
+1 0.000175737 16384
+1 0.000171877 16384
+1 0.000173977 16384
+1 0.000212917 16384
+1 0.000183401 16384
+1 0.000220644 16384
+1 0.000174845 16384
+1 0.000173519 16384
+1 0.000173358 16384
+1 0.000221424 16384
+1 0.000174225 16384
+1 0.000174026 16384
+1 0.000181262 16384
+1 0.000181238 16384
+1 0.000179989 16384
+1 0.000234088 16384
+1 0.000174627 16384
+1 0.000174688 16384
+1 0.000175388 16384
+1 0.000214217 16384
+1 0.000182064 16384
+1 0.000175192 16384
+1 0.000221012 16384
+1 0.000175500 16384
+1 0.000173344 16384
+1 0.000212621 16384
+1 0.000182532 16384
+1 0.000174054 16384
+1 0.000213046 16384
+1 0.000178598 16384
+1 0.000172744 16384
+1 0.000174442 16384
+1 0.000224111 16384
+1 0.000174925 16384
+1 0.000173327 16384
+1 0.000212011 16384
+1 0.000174397 16384
+1 0.000183846 16384
+1 0.000211973 16384
+1 0.000174197 16384
+1 0.000181158 16384
+1 0.000211734 16384
+1 0.000174521 16384
+1 0.000185459 16384
+1 0.000210420 16384
+1 0.000173614 16384
+1 0.000174063 16384
+1 0.000173928 16384
+1 0.000221641 16384
+1 0.000174892 16384
+1 0.000173602 16384
+1 0.000213548 16384
+1 0.000173288 16384
+1 0.000174566 16384
+1 0.000221746 16384
+1 0.000173691 16384
+1 0.000172544 16384
+1 0.000221593 16384
+1 0.000174859 16384
+1 0.000174593 16384
+1 0.000221470 16384
+1 0.000174906 16384
+1 0.000174414 16384
+1 0.000174643 16384
+1 0.000180381 16384
+1 0.000228118 16384
+1 0.000174372 16384
+1 0.000172894 16384
+1 0.000174088 16384
+1 0.000210179 16384
+1 0.000173018 16384
+1 0.000183585 16384
+1 0.000212582 16384
+1 0.000174028 16384
+1 0.000180274 16384
+1 0.000210011 16384
+1 0.000181061 16384
+1 0.000171667 16384
+1 0.000212975 16384
+1 0.000173474 16384
+1 0.000174824 16384
+1 0.000174770 16384
+1 0.000259517 16384
+1 0.000175254 16384
+1 0.000174674 16384
+1 0.000211257 16384
+1 0.000173914 16384
+1 0.000173226 16384
+1 0.000218736 16384
+1 0.000174777 16384
+1 0.000174287 16384
+1 0.000173806 16384
+1 0.000223350 16384
+1 0.000182470 16384
+1 0.000173368 16384
+1 0.000210632 16384
+1 0.000173962 16384
+1 0.000174398 16384
+1 0.000173870 16384
+1 0.000219226 16384
+1 0.000174328 16384
+1 0.000173605 16384
+1 0.000207352 16384
+1 0.000175893 16384
+1 0.000181901 16384
+1 0.000210141 16384
+1 0.000174263 16384
+1 0.000174436 16384
+1 0.000173800 16384
+1 0.000218953 16384
+1 0.000182143 16384
+1 0.000209929 16384
+1 0.000181286 16384
+1 0.000175206 16384
+1 0.000175289 16384
+1 0.000211021 16384
+1 0.000184189 16384
+1 0.000173899 16384
+1 0.000208349 16384
+1 0.000173540 16384
+1 0.000173470 16384
+1 0.000218306 16384
+1 0.000174466 16384
+1 0.000173733 16384
+1 0.000174997 16384
+1 0.000208404 16384
+1 0.000183404 16384
+1 0.000216987 16384
+1 0.000174787 16384
+1 0.000172001 16384
+1 0.000174352 16384
+1 0.000210113 16384
+1 0.000174975 16384
+1 0.000181474 16384
+1 0.000208027 16384
+1 0.000220815 16384
+1 0.000182672 16384
+1 0.000177670 16384
+1 0.000226754 16384
+1 0.000176226 16384
+1 0.000176257 16384
+1 0.000213945 16384
+1 0.000177178 16384
+1 0.000184848 16384
+1 0.000227104 16384
+1 0.000176737 16384
+1 0.000176047 16384
+1 0.000213861 16384
+1 0.000176249 16384
+1 0.000192460 16384
+1 0.000213055 16384
+1 0.000176122 16384
+1 0.000175803 16384
+1 0.000176855 16384
+1 0.000213759 16384
+1 0.000183896 16384
+1 0.000176042 16384
+1 0.000215572 16384
+1 0.000177052 16384
+1 0.000176248 16384
+1 0.000176225 16384
+1 0.000232080 16384
+1 0.000175961 16384
+1 0.000214198 16384
+1 0.000176799 16384
+1 0.000175935 16384
+1 0.000223226 16384
+1 0.000176909 16384
+1 0.000176795 16384
+1 0.000176510 16384
+1 0.000214109 16384
+1 0.000176961 16384
+1 0.000186460 16384
+1 0.000211960 16384
+1 0.000176559 16384
+1 0.000175660 16384
+1 0.000176204 16384
+1 0.000219927 16384
+1 0.000189594 16384
+1 0.000214824 16384
+1 0.000176935 16384
+1 0.000176513 16384
+1 0.000176800 16384
+1 0.000224628 16384
+1 0.000176509 16384
+1 0.000175911 16384
+1 0.000214526 16384
+1 0.000185996 16384
+1 0.000177260 16384
+1 0.000222187 16384
+1 0.000176306 16384
+1 0.000175852 16384
+1 0.000176047 16384
+1 0.000213267 16384
+1 0.000187775 16384
+1 0.000223034 16384
+1 0.000178203 16384
+1 0.000176681 16384
+1 0.000176577 16384
+1 0.000211623 16384
+1 0.000187933 16384
+1 0.000176091 16384
+1 0.000213563 16384
+1 0.000176665 16384
+1 0.000175972 16384
+1 0.000221236 16384
+1 0.000177542 16384
+1 0.000176816 16384
+1 0.000176855 16384
+1 0.000214626 16384
+1 0.000176270 16384
+1 0.000187315 16384
+1 0.000213606 16384
+1 0.000185588 16384
+1 0.000175148 16384
+1 0.000211150 16384
+1 0.000175119 16384
+1 0.000186448 16384
+1 0.000212381 16384
+1 0.000177247 16384
+1 0.000175999 16384
+1 0.000176495 16384
+1 0.000222973 16384
+1 0.000175776 16384
+1 0.000176586 16384
+1 0.000212810 16384
+1 0.000176501 16384
+1 0.000176409 16384
+1 0.000223551 16384
+1 0.000177325 16384
+1 0.000185881 16384
+1 0.000212232 16384
+1 0.000176149 16384
+1 0.000182616 16384
+1 0.000216249 16384
+1 0.000183941 16384
+1 0.000179989 16384
+1 0.000176223 16384
+1 0.000212771 16384
+1 0.000187318 16384
+1 0.000336166 16384
+1 0.000219610 16384
+1 0.000176123 16384
+1 0.000176534 16384
+1 0.000176734 16384
+1 0.000224839 16384
+1 0.000176819 16384
+1 0.000222734 16384
+1 0.000177474 16384
+1 0.000176537 16384
+1 0.000225175 16384
+1 0.000177148 16384
+1 0.000176676 16384
+1 0.000176364 16384
+1 0.000211976 16384
+1 0.000176519 16384
+1 0.000186739 16384
+1 0.000213745 16384
+1 0.000176337 16384
+1 0.000175372 16384
+1 0.000175256 16384
+1 0.000191167 16384
+1 0.000227098 16384
+1 0.000203959 16384
+1 0.000194934 16384
+1 0.000214879 16384
+1 0.000174297 16384
+1 0.000184364 16384
+1 0.000215725 16384
+1 0.000173186 16384
+1 0.000174405 16384
+1 0.000173021 16384
+1 0.000212846 16384
+1 0.000181787 16384
+1 0.000173693 16384
+1 0.000211996 16384
+1 0.000174205 16384
+1 0.000175232 16384
+1 0.000222319 16384
+1 0.000174473 16384
+1 0.000173905 16384
+1 0.000174245 16384
+1 0.000222767 16384
+1 0.000174680 16384
+1 0.000217322 16384
+1 0.000175657 16384
+1 0.000172138 16384
+1 0.000173154 16384
+1 0.000181922 16384
+1 0.000211261 16384
+1 0.000184041 16384
+1 0.000173746 16384
+1 0.000243145 16384
+1 0.000179559 16384
+1 0.000176514 16384
+1 0.000228488 16384
+1 0.000177394 16384
+1 0.000177116 16384
+1 0.000176330 16384
+1 0.000223859 16384
+1 0.000182981 16384
+1 0.000227680 16384
+1 0.000177529 16384
+1 0.000177276 16384
+1 0.000176643 16384
+1 0.000213851 16384
+1 0.000184064 16384
+1 0.000178917 16384
+1 0.000183389 16384
+1 0.000213760 16384
+1 0.000176615 16384
+1 0.000177014 16384
+1 0.000222460 16384
+1 0.000177618 16384
+1 0.000177433 16384
+1 0.000176751 16384
+1 0.000220289 16384
+1 0.000183874 16384
+1 0.000223291 16384
+1 0.000176584 16384
+1 0.000175356 16384
+1 0.000176131 16384
+1 0.000238184 16384
+1 0.000193171 16384
+1 0.000174034 16384
+1 0.000215225 16384
+1 0.000174230 16384
+1 0.000174692 16384
+1 0.000175198 16384
+1 0.000220923 16384
+1 0.000174519 16384
+1 0.000173328 16384
+1 0.000210593 16384
+1 0.000175280 16384
+1 0.000223725 16384
+1 0.000174043 16384
+1 0.000172213 16384
+1 0.000174386 16384
+1 0.000210062 16384
+1 0.000172668 16384
+1 0.000182741 16384
+1 0.000209600 16384
+1 0.000173388 16384
+1 0.000174516 16384
+1 0.000204938 16384
+1 0.000219722 16384
+1 0.000186264 16384
+1 0.000175835 16384
+1 0.000216579 16384
+1 0.000176859 16384
+1 0.000185424 16384
+1 0.000256274 16384
+1 0.000177038 16384
+1 0.000177028 16384
+1 0.000177097 16384
+1 0.000218396 16384
+1 0.000176244 16384
+1 0.000186753 16384
+1 0.000216613 16384
+1 0.000177165 16384
+1 0.000175987 16384
+1 0.000176194 16384
+1 0.000224954 16384
+1 0.000176241 16384
+1 0.000179706 16384
+1 0.000215687 16384
+1 0.000176822 16384
+1 0.000176959 16384
+1 0.000238809 16384
+1 0.000176021 16384
+1 0.000176005 16384
+1 0.000215081 16384
+1 0.000176917 16384
+1 0.000176841 16384
+1 0.000226806 16384
+1 0.000176823 16384
+1 0.000176219 16384
+1 0.000176206 16384
+1 0.000215191 16384
+1 0.000187089 16384
+1 0.000175357 16384
+1 0.000215160 16384
+1 0.000175506 16384
+1 0.000176262 16384
+1 0.000176893 16384
+1 0.000234077 16384
+1 0.000179820 16384
+1 0.000216583 16384
+1 0.000179626 16384
+1 0.000177220 16384
+1 0.000176652 16384
+1 0.000227752 16384
+1 0.000176586 16384
+1 0.000176687 16384
+1 0.000214614 16384
+1 0.000177012 16384
+1 0.000195925 16384
+1 0.000217877 16384
+1 0.000176660 16384
+1 0.000176628 16384
+1 0.000176518 16384
+1 0.000215128 16384
+1 0.000187158 16384
+1 0.000225865 16384
+1 0.000176883 16384
+1 0.000176479 16384
+1 0.000176918 16384
+1 0.000224584 16384
+1 0.000180642 16384
+1 0.000176575 16384
+1 0.000244591 16384
+1 0.000178884 16384
+1 0.000174478 16384
+1 0.000226308 16384
+1 0.000174493 16384
+1 0.000174253 16384
+1 0.000176100 16384
+1 0.000215833 16384
+1 0.000176009 16384
+1 0.000183651 16384
+1 0.000223742 16384
+1 0.000174847 16384
+1 0.000174555 16384
+1 0.000213911 16384
+1 0.000182787 16384
+1 0.000174312 16384
+1 0.000213740 16384
+1 0.000175147 16384
+1 0.000174444 16384
+1 0.000174608 16384
+1 0.000222736 16384
+1 0.000174226 16384
+1 0.000174346 16384
+1 0.000216076 16384
+1 0.000174753 16384
+1 0.000182164 16384
+1 0.000217255 16384
+1 0.000182199 16384
+1 0.000176654 16384
+1 0.000184926 16384
+1 0.000214193 16384
+1 0.000184332 16384
+1 0.000175061 16384
+1 0.000214842 16384
+1 0.000174290 16384
+1 0.000175230 16384
+1 0.000174584 16384
+1 0.000222141 16384
+1 0.000175004 16384
+1 0.000221859 16384
+1 0.000215405 16384
+1 0.000174805 16384
+1 0.000184484 16384
+1 0.000212251 16384
+1 0.000173998 16384
+1 0.000179855 16384
+1 0.000214218 16384
+1 0.000173891 16384
+1 0.000183743 16384
+1 0.000213744 16384
+1 0.000173599 16384
+1 0.000173705 16384
+1 0.000172790 16384
+1 0.000220443 16384
+1 0.000176454 16384
+1 0.000174052 16384
+1 0.000182942 16384
+1 0.000182499 16384
+1 0.000182752 16384
+1 0.000218520 16384
+1 0.000174344 16384
+1 0.000174067 16384
+1 0.000221027 16384
+1 0.000174479 16384
+1 0.000173231 16384
+1 0.000219055 16384
+1 0.000173519 16384
+1 0.000173592 16384
+1 0.000187641 16384
+1 0.000180615 16384
+1 0.000221532 16384
+1 0.000173358 16384
+1 0.000173716 16384
+1 0.000212930 16384
+1 0.000173799 16384
+1 0.000173265 16384
+1 0.000220938 16384
+1 0.000174478 16384
+1 0.000174193 16384
+1 0.000218225 16384
+1 0.000175334 16384
+1 0.000174731 16384
+1 0.000221306 16384
+1 0.000173339 16384
+1 0.000172534 16384
+1 0.000174621 16384
+1 0.000211371 16384
+1 0.000184274 16384
+1 0.000173693 16384
+1 0.000210738 16384
+1 0.000172870 16384
+1 0.000173658 16384
+1 0.000174610 16384
+1 0.000227013 16384
+1 0.000174377 16384
+1 0.000173774 16384
+1 0.000216715 16384
+1 0.000174562 16384
+1 0.000184457 16384
+1 0.000212227 16384
+1 0.000174285 16384
+1 0.000172947 16384
+1 0.000172874 16384
+1 0.000209950 16384
+1 0.000183721 16384
+1 0.000173842 16384
+1 0.000181812 16384
+1 0.000209234 16384
+1 0.000173865 16384
+1 0.000174440 16384
+1 0.000219158 16384
+1 0.000173688 16384
+1 0.000186204 16384
+1 0.000187117 16384
+1 0.000224835 16384
+1 0.000186466 16384
+1 0.000215016 16384
+1 0.000173500 16384
+1 0.000172877 16384
+1 0.000173607 16384
+1 0.000212322 16384
+1 0.000183453 16384
+1 0.000173058 16384
+1 0.000212908 16384
+1 0.000174174 16384
+1 0.000173832 16384
+1 0.000220095 16384
+1 0.000174213 16384
+1 0.000173628 16384
+1 0.000173636 16384
+1 0.000214330 16384
+1 0.000181537 16384
+1 0.000218378 16384
+1 0.000176719 16384
+1 0.000173799 16384
+1 0.000175342 16384
+1 0.000180003 16384
+1 0.000180824 16384
+1 0.000206418 16384
+1 0.000180934 16384
+1 0.000213981 16384
+1 0.000173692 16384
+1 0.000174841 16384
+1 0.000219890 16384
+1 0.000174085 16384
+1 0.000178707 16384
+1 0.000173240 16384
+1 0.000212296 16384
+1 0.000183092 16384
+1 0.000223713 16384
+1 0.000174196 16384
+1 0.000174774 16384
+1 0.000176585 16384
+1 0.000213063 16384
+1 0.000181023 16384
+1 0.000174437 16384
+1 0.000212119 16384
+1 0.000174637 16384
+1 0.000174680 16384
+1 0.000172043 16384
+1 0.000225831 16384
+1 0.000174957 16384
+1 0.000173717 16384
+1 0.000204836 16384
+1 0.000174480 16384
+1 0.000174503 16384
+1 0.000227562 16384
+1 0.000174648 16384
+1 0.000173883 16384
+1 0.000210909 16384
+1 0.000175163 16384
+1 0.000185280 16384
+1 0.000188143 16384
+1 0.000213442 16384
+1 0.000175698 16384
+1 0.000174523 16384
+1 0.000173744 16384
+1 0.000222276 16384
+1 0.000173932 16384
+1 0.000174101 16384
+1 0.000228212 16384
+1 0.000179652 16384
+1 0.000182744 16384
+1 0.000219840 16384
+1 0.000171827 16384
+1 0.000172109 16384
+1 0.000213111 16384
+1 0.000175428 16384
+1 0.000182643 16384
+1 0.000180712 16384
+1 0.000212075 16384
+1 0.000174431 16384
+1 0.000174165 16384
+1 0.000173958 16384
+1 0.000221502 16384
+1 0.000174430 16384
+1 0.000172987 16384
+1 0.000213347 16384
+1 0.000179394 16384
+1 0.000184413 16384
+1 0.000221817 16384
+1 0.000173676 16384
+1 0.000173467 16384
+1 0.000211345 16384
+1 0.000173427 16384
+1 0.000183070 16384
+1 0.000214273 16384
+1 0.000173861 16384
+1 0.000172542 16384
+1 0.000172972 16384
+1 0.000212044 16384
+1 0.000179707 16384
+1 0.000173853 16384
+1 0.000214614 16384
+1 0.000175333 16384
+1 0.000174546 16384
+1 0.000219227 16384
+1 0.000182069 16384
+1 0.000174346 16384
+1 0.000213209 16384
+1 0.000174893 16384
+1 0.000173416 16384
+1 0.000220164 16384
+1 0.000174433 16384
+1 0.000173567 16384
+1 0.000174038 16384
+1 0.000211480 16384
+1 0.000181584 16384
+1 0.000174524 16384
+1 0.000212783 16384
+1 0.000173224 16384
+1 0.000173899 16384
+1 0.000173311 16384
+1 0.000227583 16384
+1 0.000173853 16384
+1 0.000181100 16384
+1 0.000210033 16384
+1 0.000173540 16384
+1 0.000173247 16384
+1 0.000216875 16384
+1 0.000176372 16384
+1 0.000174152 16384
+1 0.000173313 16384
+1 0.000180973 16384
+1 0.000219101 16384
+1 0.000174160 16384
+1 0.000173459 16384
+1 0.000208939 16384
+1 0.000173989 16384
+1 0.000173410 16384
+1 0.000218716 16384
+1 0.000177116 16384
+1 0.000182663 16384
+1 0.000212028 16384
+1 0.000173705 16384
+1 0.000181046 16384
+1 0.000209238 16384
+1 0.000174394 16384
+1 0.000174024 16384
+1 0.000173850 16384
+1 0.000210442 16384
+1 0.000181175 16384
+1 0.000171863 16384
+1 0.000211097 16384
+1 0.000174362 16384
+1 0.000174110 16384
+1 0.000174258 16384
+1 0.000222086 16384
+1 0.000173989 16384
+1 0.000232996 16384
+1 0.000178935 16384
+1 0.000174268 16384
+1 0.000224038 16384
+1 0.000174040 16384
+1 0.000174231 16384
+1 0.000174277 16384
+1 0.000216674 16384
+1 0.000175634 16384
+4 0.000634865 54
+1 0.000552527 10240
diff --git a/lib/iolog/regress/corpus/seed/timing/timing.4 b/lib/iolog/regress/corpus/seed/timing/timing.4
new file mode 100644
index 0000000..20e0bb0
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/timing/timing.4
@@ -0,0 +1,8 @@
+2 0.025750192 5
+0 0.670737828 2
+0 2.832110312 2
+0 0.903947334 2
+0 1.727798521 3
+0 2.040329883 2
+2 0.001192523 2
+1 0.001253839 77
diff --git a/lib/iolog/regress/corpus/seed/timing/timing.5 b/lib/iolog/regress/corpus/seed/timing/timing.5
new file mode 100644
index 0000000..53e6c24
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/timing/timing.5
@@ -0,0 +1,110 @@
+4 0.094338301 36
+4 0.000886452 454
+4 0.000419509 47
+3 0.578593257 1
+4 0.000401105 9
+3 0.239515513 1
+4 0.000346806 1
+3 0.087693564 1
+4 0.000347787 1
+3 0.143659822 1
+4 0.000358177 1
+3 0.144622999 1
+4 0.000365053 1
+3 0.334698655 1
+4 0.000383718 1
+3 0.143675707 1
+4 0.000490451 38
+3 0.607406896 1
+4 0.000371268 14
+3 0.215742108 1
+4 0.000405734 20
+3 0.167496479 1
+4 0.000397476 32
+3 0.231540616 2
+4 0.001466590 36
+4 0.000350286 42
+3 0.158274203 1
+4 0.000370821 60
+3 0.120308265 1
+4 0.000415876 15
+3 0.142813715 1
+4 0.000334956 44
+3 0.303764107 1
+4 0.000391847 8
+3 0.095659280 1
+4 0.000378759 1
+3 0.175643525 1
+4 0.000322526 1
+3 0.135538631 1
+4 0.000350139 1
+4 0.000387250 43
+4 0.000294911 14
+3 1.167339458 1
+4 0.000459546 34
+7 0.000701240 TSTP
+7 14.031400225 CONT
+4 0.000703876 7
+4 0.000318515 552
+3 0.519022507 1
+4 0.000353381 8
+3 0.151484068 1
+4 0.000408559 1
+3 0.111526674 1
+4 0.000332701 1
+3 0.640246014 1
+4 0.000595362 2
+3 0.262836266 1
+4 0.000548454 34
+3 0.431603931 1
+4 0.000412839 34
+7 0.000525770 TSTP
+7 14.791352365 CONT
+4 0.000694230 7
+4 0.000302349 493
+3 0.727405050 1
+4 0.000500700 34
+7 0.000535360 TSTP
+7 3.670976441 CONT
+4 0.000618883 7
+4 0.000329643 493
+3 0.726805533 1
+4 0.000401741 15
+3 0.169615608 1
+4 0.000404146 14
+3 0.149519005 1
+4 0.000346040 14
+3 0.153626768 1
+4 0.000374982 14
+3 10.982612173 1
+3 0.499604568 1
+4 0.000430040 54
+3 0.082890262 1
+3 0.083639576 1
+4 0.000372554 36
+3 0.083005173 1
+3 0.083770729 1
+4 0.000362184 30
+3 0.082958130 1
+3 0.083891314 1
+4 0.000406165 69
+3 0.083110106 1
+3 0.083892294 1
+4 0.000367886 54
+3 0.224878822 1
+3 0.197955553 1
+4 0.000374885 45
+3 1.639667508 1
+4 0.000391391 8
+3 0.127675700 1
+4 0.000336583 1
+3 0.159694034 1
+4 0.000460055 1
+4 0.000356674 57
+3 12.784074969 1
+4 0.000383899 8
+3 0.319071776 1
+4 0.000350990 1
+3 0.375753852 1
+4 0.000391679 1
+4 0.000470435 31
diff --git a/lib/iolog/regress/corpus/seed/timing/timing.6 b/lib/iolog/regress/corpus/seed/timing/timing.6
new file mode 100644
index 0000000..2cfb414
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/timing/timing.6
@@ -0,0 +1,15185 @@
+4 0.097693988 36
+4 0.000957658 581
+3 1.103319620 1
+4 0.000458372 9
+3 0.343116579 1
+4 0.000338600 1
+3 0.167807742 1
+4 0.000347723 1
+3 0.168370615 1
+4 0.000331790 1
+3 0.126841177 1
+4 0.000494776 21
+4 0.000389804 737
+3 3.911758825 1
+4 0.000589551 589
+3 1.199213488 1
+4 0.000571867 671
+3 0.175283013 1
+4 0.000551106 788
+3 0.927605729 1
+4 0.000592528 778
+3 0.727361437 1
+4 0.000600088 810
+3 0.151449161 1
+4 0.000549159 703
+3 0.151365424 1
+4 0.000521802 579
+3 0.175504252 1
+4 0.000572822 841
+3 1.479559831 1
+4 0.000566667 671
+3 1.215437518 1
+4 0.000560614 732
+3 6.359874366 1
+4 0.000586055 517
+3 0.711069519 1
+4 0.000624372 678
+3 1.967625161 1
+4 0.000587631 788
+3 2.959415103 1
+4 0.000467050 52
+3 0.258284691 1
+4 0.000359406 17
+3 0.150663754 1
+4 0.000345830 16
+3 0.629841487 1
+3 0.130078374 1
+4 0.000427154 28
+3 1.573712476 1
+4 0.000597951 683
+3 0.679455332 1
+4 0.000624382 625
+3 0.863325943 1
+4 0.000589350 849
+3 0.871257287 1
+4 0.000377259 15
+3 0.500679027 1
+4 0.000338887 15
+3 0.082915074 1
+4 0.000418604 17
+3 0.082596070 1
+4 0.000321263 17
+3 0.083131776 1
+4 0.000330500 17
+3 0.083371296 1
+4 0.000345874 15
+3 0.083108756 1
+4 0.000389047 15
+3 0.082748138 1
+4 0.000315527 16
+3 0.083950965 1
+4 0.000325339 16
+3 0.548314643 1
+4 0.000410020 17
+3 0.429723783 1
+4 0.001632651 37
+4 0.000426417 133
+3 0.693988537 1
+4 0.000351760 16
+3 0.463602549 1
+4 0.000356594 10
+3 0.415613181 1
+4 0.000366763 1
+3 0.135780117 1
+4 0.000335017 1
+3 0.175462207 1
+4 0.000330054 1
+3 0.079900650 1
+4 0.000334757 1
+3 0.103456346 1
+4 0.000319517 1
+3 0.103817387 1
+4 0.000323711 1
+3 0.063555555 1
+4 0.000319964 1
+3 0.119579686 1
+4 0.000404602 1
+3 0.223797910 1
+4 0.000389022 40
+3 2.503757937 1
+4 0.000390701 10
+3 0.055447548 1
+4 0.000533591 690
+3 2.903881053 1
+4 0.000568568 726
+3 0.145177548 1
+4 0.000362889 102
+3 1.894563020 1
+4 0.000338633 18
+3 0.168988785 1
+4 0.000374107 18
+3 0.173551488 1
+4 0.000384121 17
+3 0.161628071 1
+4 0.000403103 18
+3 0.149569901 1
+4 0.000370231 17
+3 0.201795897 1
+4 0.000371537 17
+3 0.277452123 1
+3 0.312120348 1
+4 0.000382358 65
+3 0.135528556 1
+4 0.000376779 79
+3 0.655753048 2
+4 0.000393158 103
+3 0.311981813 1
+4 0.000358735 18
+3 0.153241402 1
+4 0.000357208 18
+3 0.149367912 1
+4 0.000341365 17
+3 0.153758664 1
+4 0.000409446 18
+3 0.141572461 1
+4 0.000334930 17
+3 0.281753655 1
+4 0.000313237 17
+3 0.253785106 1
+3 0.048044598 1
+4 0.000390744 29
+3 0.199848389 1
+4 0.000351924 18
+3 0.095365075 1
+4 0.000367343 18
+3 0.103384570 1
+4 0.000330248 18
+3 0.087929267 1
+4 0.000363207 18
+3 0.263566078 2
+4 0.000365425 28
+3 0.129673483 1
+4 0.000418293 18
+3 0.245509930 1
+3 0.072023907 1
+4 0.000346915 27
+3 0.233641617 1
+4 0.000371518 18
+3 0.149968246 1
+4 0.000329324 18
+3 0.750253477 1
+4 0.109987655 37
+3 24.356082499 2
+4 0.000575072 18
+3 0.311960778 1
+4 0.000363365 17
+3 6.328346132 1
+4 0.000383670 31
+3 0.374564260 1
+4 0.000364229 31
+3 4.263853812 1
+4 0.000385394 31
+3 0.072217819 1
+4 0.000359701 31
+3 0.142867118 1
+4 0.000386346 31
+3 0.127731426 1
+4 0.000511355 31
+3 0.055387421 1
+4 0.000385155 31
+3 1.695812701 1
+4 0.000358800 31
+3 0.697693334 1
+4 0.109968812 31
+3 3.968687583 1
+4 0.000582462 652
+3 2.087163132 1
+4 0.000600691 922
+3 1.671266499 1
+4 0.000436508 36
+3 0.500227380 1
+4 0.000409164 78
+3 0.083208834 1
+4 0.000483458 69
+3 0.082631972 1
+4 0.000394210 73
+3 0.083382084 1
+4 0.000400565 84
+3 13.617030561 1
+4 0.000354061 15
+3 0.500733232 1
+4 0.000347347 15
+3 0.082671126 1
+4 0.000355244 15
+3 0.082945476 1
+4 0.000365822 18
+3 0.082683300 1
+4 0.000403621 17
+3 0.083034469 1
+4 0.000356155 15
+3 0.083001633 1
+4 0.000378724 15
+3 0.082987035 1
+4 0.000356646 15
+3 0.083172601 1
+4 0.000347790 17
+3 0.082982191 1
+4 0.000354769 18
+3 0.083231707 1
+4 0.000356674 16
+3 0.083455577 1
+4 0.000375342 16
+3 0.082774961 1
+4 0.000345080 16
+3 0.083148577 1
+4 0.000372898 17
+3 0.082488084 1
+4 0.000351168 18
+3 0.361137018 1
+4 0.000520394 16
+3 0.557563133 1
+4 0.000365756 16
+3 0.217686213 1
+4 0.000405765 16
+3 0.213411640 1
+4 0.000437376 16
+3 0.201749904 1
+4 0.000417367 16
+3 1.077644672 1
+3 0.183765838 1
+3 0.114281411 1
+4 0.000415479 29
+3 1.797684026 1
+4 0.000592681 817
+3 2.423564964 1
+4 0.000635387 721
+3 0.735894059 1
+4 0.000366561 16
+3 0.499433634 1
+4 0.000403990 18
+3 0.083697754 1
+4 0.000353510 16
+3 0.082821690 1
+4 0.000460907 16
+3 0.083470466 1
+4 0.000391016 18
+3 0.351749864 1
+4 0.000435746 219
+3 0.335662878 1
+4 0.000385166 36
+3 0.455599429 2
+4 0.000450086 32
+3 0.311480720 1
+3 0.130132593 1
+4 0.000422315 30
+3 0.141538312 1
+4 0.000350580 18
+3 0.161698419 1
+4 0.000450382 16
+3 0.149595861 1
+4 0.000357490 16
+3 0.216118106 1
+4 0.000392863 80
+3 0.287025425 1
+4 0.000368499 16
+3 0.217810528 1
+4 0.000368675 16
+3 0.173583780 1
+4 0.000612887 16
+3 0.185363502 1
+4 0.000357218 16
+3 0.558456948 1
+4 0.000384082 18
+3 0.478831088 1
+4 0.000373041 47
+3 0.143904945 1
+4 0.000423017 19
+3 0.143222621 1
+4 0.000362659 17
+3 1.143703843 1
+4 0.000371411 18
+3 0.167600427 1
+4 0.000358131 18
+3 0.175738166 1
+4 0.000372615 18
+3 0.119668569 1
+4 0.000396472 18
+3 0.095593535 1
+4 0.000371665 18
+3 0.191668990 1
+4 0.000415434 18
+3 0.215453670 1
+4 0.000353548 18
+3 0.215843292 1
+4 0.000368685 18
+3 0.543724152 1
+4 0.000363077 18
+3 0.423428920 1
+4 0.000565616 18
+3 0.119487325 1
+4 0.000392118 18
+3 0.135715995 1
+4 0.000360686 18
+3 0.071574120 1
+4 0.000439295 18
+3 0.191534353 1
+4 0.000349726 18
+3 0.231687599 1
+4 0.000350854 18
+3 0.247590333 1
+4 0.000349565 18
+3 0.399664247 1
+4 0.000399287 17
+3 0.199694033 1
+4 0.000399199 18
+3 0.103461914 1
+4 0.000385370 18
+3 0.095701982 1
+4 0.000393397 18
+3 0.295621485 1
+4 0.000348993 19
+3 0.144437413 1
+4 0.000379088 18
+3 0.198764313 1
+4 0.000397818 18
+3 12.245000582 1
+3 0.067286171 1
+4 0.000930451 647
+3 1.271066901 1
+4 0.000611308 785
+3 0.967396885 1
+4 0.000391811 9
+3 2.013803015 12
+4 0.000359778 12
+3 0.354058672 1
+4 0.000442726 15
+4 0.000353259 38
+3 0.454372890 1
+4 0.000353679 43
+3 0.201776929 1
+4 0.000449372 21
+3 0.165645069 1
+4 0.000388749 56
+4 0.000394368 7
+3 0.369116907 1
+4 0.000346666 43
+3 0.381642743 1
+4 0.000350900 21
+3 0.489700692 1
+4 0.000403145 56
+4 0.000284088 7
+3 0.357448445 1
+4 0.000432074 43
+3 1.625632487 1
+4 0.000561739 21
+3 2.749500295 1
+4 0.000382505 32
+3 0.127541732 1
+4 0.000349587 17
+3 0.879715291 1
+4 0.000422238 18
+3 0.079504711 1
+4 0.000358804 18
+3 0.071640554 1
+4 0.000462190 17
+3 1.511581913 1
+4 0.000370736 18
+3 0.137723663 1
+4 0.000576506 18
+3 0.157423583 1
+4 0.000359301 18
+3 0.111569388 1
+4 0.000370080 19
+3 0.175788910 1
+4 0.000390579 18
+3 0.127548586 1
+4 0.000517405 16
+3 0.087543039 1
+4 0.000389857 13
+3 0.087475036 1
+4 0.000385001 11
+3 0.263652341 1
+4 0.000362769 11
+3 0.079606457 1
+4 0.000456234 13
+3 0.151586763 1
+4 0.000576884 16
+3 0.119449667 1
+4 0.000391357 18
+3 0.248391442 1
+4 0.000348267 18
+3 0.070873604 1
+4 0.000395821 19
+3 0.031479523 1
+4 0.000339832 18
+3 0.215879653 1
+4 0.000371564 18
+3 0.208675804 1
+4 0.000364165 18
+3 0.781127774 1
+4 0.110104180 31
+3 0.347449927 1
+4 0.000391058 17
+3 0.759576804 1
+4 0.000399054 17
+3 0.719475822 1
+4 0.000363481 16
+3 0.209764674 1
+4 0.000420853 18
+3 0.181543921 1
+4 0.000446865 18
+3 0.695649553 1
+4 0.000364348 17
+3 5.655914971 1
+4 0.000371102 17
+3 0.501146264 1
+4 0.000390485 19
+3 0.082334811 1
+4 0.000389853 104
+3 0.082770985 1
+4 0.000640857 35
+3 0.082634854 1
+4 0.000391535 63
+3 0.082831129 1
+4 0.000395020 74
+3 0.083338259 1
+4 0.000765883 37
+3 0.305557932 1
+4 0.000358155 22
+3 0.500134468 1
+4 0.000373010 20
+3 0.082875224 1
+4 0.000369529 17
+3 0.083206683 1
+4 0.000650077 20
+3 0.820266736 1
+4 0.000372327 17
+3 0.500281203 1
+4 0.000356297 20
+3 0.083495657 1
+4 0.000352191 20
+3 0.082911125 1
+4 0.000345727 17
+3 0.084251862 1
+4 0.000421566 63
+3 0.198985382 1
+4 0.000347753 17
+3 0.169733060 1
+4 0.000561367 22
+3 0.165295001 1
+4 0.000351808 20
+3 2.623960816 1
+3 0.199877174 1
+3 0.154622991 1
+4 0.000424027 149
+3 0.116976645 1
+4 0.000356668 39
+3 0.500771628 1
+4 0.000453280 18
+3 0.083310622 1
+4 0.000333387 16
+3 0.083360523 1
+4 0.000588696 16
+3 0.083278747 1
+4 0.000364923 16
+3 0.083317744 1
+4 0.000363486 16
+3 0.082785265 1
+4 0.000334722 17
+3 0.083134633 1
+4 0.000327780 18
+3 0.388953653 1
+4 0.000397659 17
+3 0.279631899 1
+4 0.000443440 116
+3 0.735498889 1
+4 0.000402995 40
+3 0.161654066 1
+4 0.000360349 18
+3 0.645690164 1
+3 0.122095192 1
+4 0.000550745 75
+3 0.861346110 1
+4 0.000368374 18
+3 0.297657683 1
+4 0.000409950 16
+3 0.221573357 1
+4 0.000359706 17
+3 0.201590265 1
+4 0.000420145 18
+3 0.725891565 1
+4 0.000410403 94
+3 2.343419099 1
+3 0.138014095 1
+4 0.000406190 75
+3 0.149528893 1
+4 0.000376405 18
+3 0.233967970 1
+4 0.000362616 16
+3 0.181388607 1
+4 0.000375845 17
+3 0.169715363 1
+4 0.000358644 18
+3 0.421516995 1
+4 0.000423347 16
+3 0.223600858 1
+4 0.000351994 16
+3 0.169858347 1
+4 0.000372798 18
+3 0.165442069 1
+4 0.000437843 18
+3 47.612015956 1
+4 0.000420777 17
+3 7.645117521 1
+4 0.000357043 17
+3 0.203064792 1
+4 0.000404651 19
+3 0.148078594 1
+4 0.000372767 20
+3 14.800360987 1
+4 0.000372152 19
+3 0.193409434 1
+4 0.000360058 20
+3 0.181573590 1
+4 0.000334749 17
+3 4.672137645 1
+4 0.000547796 17
+3 0.201216303 1
+4 0.000350221 17
+3 0.493727268 1
+4 0.000394587 79
+3 1.239531925 1
+4 0.000411232 17
+3 0.201577596 1
+4 0.000363153 17
+3 0.181839196 1
+4 0.000365743 17
+3 0.217580259 1
+4 0.000419291 17
+3 0.413603793 1
+4 0.000389252 17
+3 4.879696734 1
+3 0.087993182 1
+4 0.000359318 28
+3 1.183741831 1
+4 0.000392000 18
+3 0.072371680 1
+4 0.000344036 18
+3 0.102840326 1
+4 0.000339979 18
+3 0.263644252 1
+4 0.000364716 18
+3 0.239809832 1
+4 0.000367180 107
+3 1.841911098 1
+4 0.109988327 33
+3 0.183660214 1
+4 0.000468781 9
+3 0.439556740 1
+4 0.000343767 1
+3 0.455845269 1
+4 0.000558674 54
+3 0.735274963 1
+4 0.000346882 9
+3 0.343642094 1
+4 0.000339960 1
+3 1.135630546 1
+4 0.000319323 1
+3 0.336150973 1
+4 0.002246722 58
+3 0.725368029 1
+4 0.000365124 9
+3 0.513883520 1
+4 0.000327517 1
+3 0.245487314 1
+4 0.000376272 1
+3 0.207695699 1
+4 0.000583922 779
+3 3.047550138 1
+3 0.129914536 1
+4 0.000361284 30
+3 0.517742428 1
+4 0.000876578 750
+3 0.153144700 1
+4 0.000827063 111
+3 1.077031634 1
+4 0.000385969 71
+3 0.671823909 1
+4 0.000700510 18
+3 0.177114177 1
+4 0.000365033 18
+3 0.165687178 1
+4 0.000364717 17
+3 0.351744220 1
+3 0.071908205 1
+4 0.000407900 28
+3 0.151677345 1
+4 0.000736606 18
+3 0.079541471 1
+4 0.000340519 18
+3 0.063463155 1
+4 0.000367949 18
+3 0.223506778 1
+4 0.000413034 18
+3 0.191692925 1
+4 0.000356857 26
+3 0.731677511 1
+4 0.109976927 33
+3 0.637929593 1
+4 0.000343755 17
+3 2.143779663 1
+4 0.000397634 4
+3 1.194158239 1
+4 0.000365274 4
+3 0.333180352 1
+4 0.000422079 17
+3 0.153395992 1
+4 0.000325371 17
+3 0.277789897 1
+4 0.000338965 4
+3 2.791906961 1
+4 0.000353063 17
+3 0.447635092 1
+3 0.138080657 1
+4 0.000566001 123
+3 0.253283500 1
+4 0.000734297 18
+3 2.401408669 1
+4 0.000329021 17
+3 0.229622809 1
+4 0.000368301 17
+3 0.249743461 1
+4 0.000332259 18
+3 1.405520404 1
+4 0.000626065 17
+3 0.513922219 1
+4 0.000352021 4
+3 0.317143072 1
+3 0.096174521 1
+4 0.000367483 33
+3 0.289500737 1
+4 0.000337331 18
+3 0.141681003 1
+4 0.000524692 18
+3 0.137672726 1
+4 0.000685531 18
+3 0.133085948 1
+4 0.000369897 18
+3 0.231827680 1
+4 0.000447277 18
+3 0.095501521 1
+4 0.000366060 18
+3 0.119494082 1
+4 0.001318263 18
+3 0.086667164 1
+4 0.000415062 19
+3 0.279538386 1
+4 0.000366880 18
+3 0.111882109 1
+4 0.000655035 18
+3 0.151184959 1
+4 0.000339245 18
+3 1.025459480 1
+3 0.006208551 1
+4 0.000357062 24
+3 0.219848723 1
+4 0.000409328 17
+3 3.732349804 1
+4 0.000364343 33
+3 0.593127057 13
+4 0.000410474 31
+3 0.797100093 1
+4 0.109976757 36
+3 1.778343138 1
+4 0.000499455 19
+3 0.217486897 1
+4 0.000362913 20
+3 1.989787928 1
+3 0.138144962 1
+4 0.000396217 89
+3 0.117343236 1
+4 0.000350336 18
+3 0.185752941 1
+4 0.000436495 16
+3 0.181922256 1
+4 0.000521924 16
+3 1.039959830 1
+4 0.000421118 16
+3 0.302818771 1
+3 0.121940521 1
+4 0.000714028 29
+3 0.197500732 1
+4 0.000364824 41
+3 1.223352169 1
+4 0.000384389 98
+3 0.368054015 1
+3 0.145929723 1
+4 0.000360153 22
+3 0.349490946 1
+4 0.000403415 18
+3 0.185711754 1
+4 0.000411094 18
+3 3.309560066 1
+4 0.000424639 17
+3 0.201622600 1
+4 0.000332911 17
+3 0.165514358 1
+4 0.000442890 18
+3 0.161627298 1
+4 0.000349309 17
+3 0.174031062 1
+4 0.000359363 17
+3 0.233245167 1
+4 0.000367185 17
+3 0.421696528 1
+4 0.000411396 17
+3 0.137662000 1
+4 0.000391667 17
+3 0.149641485 1
+4 0.000356515 18
+3 0.167537597 1
+4 0.000361277 24
+3 0.263817838 1
+4 0.000694390 31
+3 0.087126940 1
+4 0.000318414 31
+3 0.047574605 1
+4 0.000421695 31
+3 0.199647884 1
+4 0.000311776 31
+3 0.167877106 1
+4 0.000365130 31
+3 0.167451081 1
+4 0.000321456 31
+3 0.689076734 1
+4 0.110105163 33
+3 0.584921459 1
+4 0.000348307 9
+3 0.143224088 1
+4 0.000343586 1
+3 0.071732407 1
+4 0.000409628 1
+4 0.000372659 70
+3 0.655337176 1
+4 0.000404457 35
+3 0.499593688 1
+4 0.000366052 22
+3 0.083397439 1
+4 0.000368501 20
+3 0.083071213 1
+4 0.000340792 16
+3 0.083428883 1
+4 0.000350381 16
+3 0.083093697 1
+4 0.000392045 17
+3 0.083057376 1
+4 0.000365675 16
+3 0.083710948 1
+4 0.000327269 18
+3 0.083119476 1
+4 0.000474101 85
+3 0.083493053 1
+4 0.000360764 47
+3 0.082641058 1
+4 0.000398974 46
+3 0.083186621 1
+4 0.000365016 35
+3 0.083157636 1
+4 0.000398605 55
+3 0.082965738 1
+4 0.000428731 55
+3 0.160742908 1
+4 0.000439591 20
+3 0.500151554 1
+4 0.000351208 17
+3 0.084287672 1
+4 0.000493732 19
+3 0.082375156 1
+4 0.000384640 18
+3 0.082970019 1
+4 0.000397199 16
+3 0.082867805 1
+4 0.000318173 20
+3 0.083465407 1
+4 0.000390887 20
+3 0.082803369 1
+4 0.000334778 17
+3 0.083401403 1
+4 0.000375336 17
+3 0.082724495 1
+4 0.000320315 20
+3 0.247278331 1
+4 0.000447587 20
+3 0.575539980 1
+4 0.000355606 20
+3 0.185633872 1
+4 0.000356683 20
+3 0.149543565 1
+4 0.000362475 20
+3 0.439731864 1
+4 0.000424684 20
+3 0.233648427 1
+4 0.000350978 20
+3 0.213624195 1
+4 0.000395175 20
+3 0.225668560 1
+4 0.000421855 17
+3 0.221519026 1
+4 0.000369391 17
+3 0.209697790 1
+4 0.000352732 20
+3 0.229431459 1
+4 0.000408315 16
+3 0.233795367 1
+4 0.000353754 19
+3 0.349714972 1
+4 0.000374089 16
+3 0.499556051 1
+4 0.000350045 20
+3 0.082976420 1
+4 0.000426476 20
+3 0.082721495 1
+4 0.000346098 17
+3 0.082736431 1
+4 0.000369046 17
+3 0.083222016 1
+4 0.000406594 20
+3 0.083347906 1
+4 0.000343270 20
+3 0.083681978 1
+4 0.000476449 20
+3 0.082863415 1
+4 0.000529778 20
+3 0.443298219 1
+4 0.000822688 22
+3 0.729154569 1
+4 0.000334348 20
+3 0.237781665 1
+4 0.000355457 20
+3 0.249570764 1
+4 0.000354909 20
+3 0.221637136 1
+4 0.000349387 17
+3 0.217649492 1
+4 0.000389379 17
+3 0.213410528 1
+4 0.000345541 20
+3 0.257915898 1
+4 0.000375323 16
+3 0.317549640 1
+4 0.000351138 19
+3 0.327647625 1
+4 0.000508773 16
+3 0.499759639 1
+4 0.000351912 20
+3 0.083489529 1
+4 0.000340082 20
+3 0.083360580 1
+4 0.000341345 17
+3 0.083050464 1
+4 0.000348861 17
+3 0.083594027 1
+4 0.000410636 20
+3 0.083859543 1
+4 0.000339867 20
+3 0.378370667 1
+4 0.000353882 20
+3 26.654551214 2
+4 0.000299370 1
+4 0.000385007 20
+3 0.185788276 1
+4 0.000347829 19
+3 0.165558740 1
+4 0.000378265 18
+3 0.177115827 1
+4 0.000434495 19
+3 0.165615248 1
+4 0.000539262 19
+3 0.167652319 1
+4 0.000582877 17
+3 0.185338981 1
+4 0.000352150 16
+3 0.149631534 1
+4 0.000340936 16
+3 0.327728843 1
+4 0.000355118 16
+3 0.207710858 1
+4 0.000356196 22
+3 0.247467447 1
+4 0.000408781 27
+3 0.730114735 1
+4 0.110011184 32
+3 0.639487397 1
+4 0.000361215 30
+3 0.239789830 1
+4 0.000414086 27
+3 0.143501290 1
+4 0.000357619 27
+3 0.137600846 1
+4 0.000349030 29
+3 0.117672637 1
+4 0.000345332 27
+3 0.335762608 1
+4 0.000371813 16
+3 0.151515079 1
+4 0.000333398 17
+3 0.687814969 1
+4 0.000343303 27
+3 0.009771867 1
+4 0.000327767 27
+3 0.437553675 1
+4 0.000342484 16
+3 0.319573265 2
+4 0.000350629 35
+3 0.175819045 1
+4 0.000402475 30
+3 0.439484588 1
+4 0.000423719 39
+3 0.709999823 1
+4 0.000148519 17
+4 0.109827205 30
+3 8.507894554 1
+4 0.000410327 10
+3 0.151626335 1
+4 0.000353842 1
+3 0.087531531 1
+4 0.000371017 1
+4 0.000383910 69
+3 26.896906288 1
+4 0.000458838 38
+3 0.184859903 1
+4 0.000353687 18
+3 0.149756379 1
+4 0.000376787 19
+3 0.137592999 1
+4 0.000388187 18
+3 0.133791741 1
+4 0.000365782 22
+3 0.385421417 1
+4 0.000438732 20
+3 0.181646957 1
+4 0.000398813 20
+3 0.193545413 1
+4 0.000339360 20
+3 0.189661040 1
+4 0.000577231 17
+3 0.201388878 1
+4 0.000354544 17
+3 0.181736570 1
+4 0.000359366 17
+3 0.201709891 1
+4 0.000362687 17
+3 0.181657511 1
+4 0.000434378 19
+3 0.287459023 1
+4 0.000347569 20
+3 0.499939467 1
+4 0.000399194 17
+3 0.083057931 1
+4 0.000326400 17
+3 0.083236239 1
+4 0.000434921 17
+3 0.083397703 1
+4 0.000359935 17
+3 0.082995075 1
+4 0.000348933 20
+3 0.083447945 1
+4 0.000441606 20
+3 0.082804793 1
+4 0.000374644 20
+3 0.328091598 1
+4 0.000353006 20
+3 0.749778667 1
+3 0.159831338 1
+3 0.138127251 1
+4 0.000507113 453
+3 2.181672845 1
+4 0.000491811 452
+3 0.703366636 1
+3 0.199981256 1
+4 0.000352191 41
+3 0.567809983 1
+4 0.000527156 16
+3 0.499777301 1
+4 0.000341032 16
+3 0.083424938 1
+4 0.000359035 16
+3 0.083015258 1
+4 0.000314614 16
+3 0.083460885 1
+4 0.000361793 16
+3 0.083777579 1
+4 0.000313755 16
+3 0.083579493 1
+4 0.000367356 16
+3 0.083140437 1
+4 0.000317726 16
+3 0.278778522 1
+4 0.000341987 19
+3 0.141637962 1
+3 0.144050458 1
+3 0.127942512 1
+3 0.155207765 1
+4 0.000490014 479
+3 0.748564240 1
+4 0.000373697 40
+3 0.655960408 1
+4 0.000679698 869
+3 0.646826081 1
+4 0.000418888 15
+3 0.500527307 1
+4 0.000346354 15
+3 0.081843651 1
+4 0.000374311 17
+3 0.083519997 1
+4 0.000347824 17
+3 0.083477961 1
+4 0.000344511 15
+3 0.083426619 1
+4 0.000355385 15
+3 0.082727163 1
+4 0.000347717 15
+3 0.082932280 1
+4 0.000389440 17
+3 0.083334199 1
+4 0.000622308 19
+3 0.082558753 1
+4 0.000355512 16
+3 0.082872242 1
+4 0.000351363 16
+3 0.260990699 1
+4 0.000542866 646
+3 1.655439535 1
+4 0.000819821 437
+3 0.806961778 1
+4 0.000393280 66
+3 0.775566971 1
+4 0.000423759 18
+3 0.783885933 1
+4 0.000485141 363
+3 1.831723483 1
+4 0.000554379 40
+3 0.279058688 1
+4 0.000359222 15
+3 0.281709081 1
+4 0.000352527 17
+3 0.213643780 1
+4 0.000615478 23
+3 0.175421229 1
+4 0.000702794 32
+3 0.223239931 1
+4 0.000612203 32
+3 0.151359913 1
+4 0.000733272 32
+3 0.055356863 1
+4 0.000504130 32
+3 0.063391699 1
+4 0.000438785 32
+3 0.343892463 2
+4 0.000677091 23
+3 0.119234648 1
+4 0.000610279 17
+3 1.159306399 1
+4 0.000532996 10
+3 0.135332780 1
+4 0.000370068 1
+3 0.119678333 1
+4 0.000371365 1
+4 0.000295812 53
+4 0.000412108 16
+3 1.455822582 1
+4 0.000619925 646
+3 0.862826551 1
+4 0.000884052 592
+3 2.015014662 1
+4 0.000601988 628
+3 1.559569350 1
+4 0.000797895 926
+3 1.839221425 1
+4 0.000452782 47
+3 0.499724782 1
+4 0.000394463 34
+3 0.083061436 1
+4 0.000461010 74
+3 0.083213071 1
+4 0.000394094 72
+3 0.082597592 1
+4 0.000629094 87
+3 1.210968921 1
+4 0.000429352 47
+3 0.498607568 1
+4 0.000631607 34
+3 0.082584482 1
+4 0.000639306 64
+3 0.083305880 1
+4 0.000400040 72
+3 0.083135273 1
+4 0.000621457 104
+3 0.082893886 1
+4 0.000670785 47
+3 3.940356908 1
+4 0.000388271 34
+3 0.499602664 1
+4 0.000411279 56
+3 0.082931528 1
+4 0.000386802 72
+3 0.192151484 1
+4 0.000412085 17
+3 0.500050387 1
+4 0.000354066 17
+3 0.082906636 1
+4 0.000379668 18
+3 0.083693206 1
+4 0.000423020 20
+3 0.082953035 1
+4 0.000441869 18
+3 0.168429833 1
+4 0.000500791 18
+3 0.171526741 1
+4 0.000367870 19
+3 0.179690436 1
+4 0.000467217 16
+3 0.215673132 1
+4 0.000363513 18
+3 0.500350987 1
+4 0.000410286 20
+3 0.083205181 1
+4 0.000333549 18
+3 0.082500549 1
+4 0.000329966 17
+3 0.083050700 1
+4 0.000395420 17
+3 0.082862144 1
+4 0.000335598 18
+3 0.082684797 1
+4 0.000383548 20
+3 0.274747992 1
+4 0.000613396 839
+3 8.831964575 1
+4 0.000640423 801
+3 1.631181039 1
+4 0.000375831 17
+3 1.305627476 1
+4 0.000428633 15
+3 0.497733854 1
+4 0.000360959 15
+3 0.083122017 1
+4 0.000368287 15
+3 0.083642407 1
+4 0.000333844 15
+3 0.083295622 1
+4 0.000370535 16
+3 1.736553561 1
+4 0.000629246 838
+3 1.335539707 1
+4 0.000438005 16
+3 0.499718772 1
+4 0.000376280 18
+3 0.082613486 1
+4 0.000373838 16
+3 0.083636145 1
+4 0.000364210 16
+3 0.082920470 1
+4 0.000359328 16
+3 0.456951382 1
+4 0.000352142 16
+3 0.201656565 1
+4 0.000439855 16
+3 0.205465187 1
+4 0.000371276 16
+3 0.297745871 1
+4 0.000412243 16
+3 0.469760981 1
+4 0.000450415 18
+3 0.695465699 1
+4 0.000564386 801
+3 1.519622937 1
+4 0.000587351 836
+3 1.439344375 1
+4 0.000483671 115
+3 0.499715623 1
+4 0.000578789 133
+3 0.082560675 1
+4 0.000401248 44
+3 0.082898904 1
+4 0.000463999 115
+3 0.083267781 1
+4 0.000428878 130
+3 0.083135862 1
+4 0.000374468 44
+3 0.301722353 1
+4 0.000497865 16
+3 0.499837789 1
+4 0.000339484 17
+3 0.082709505 1
+4 0.000413937 16
+3 0.083176641 1
+4 0.000330187 16
+3 0.083139526 1
+4 0.000543854 16
+3 0.394988957 1
+4 0.000343115 16
+3 0.269629692 1
+4 0.000348912 28
+3 0.071635991 1
+4 0.000362496 17
+3 0.159759804 1
+4 0.000347896 18
+3 0.183536253 1
+4 0.000423127 18
+3 0.183529976 1
+4 0.000359333 18
+3 0.111615035 1
+4 0.000361619 18
+3 0.175838486 1
+4 0.000358092 35
+3 0.343534013 2
+4 0.000377489 31
+3 0.169506249 1
+4 0.000329047 17
+3 0.205756115 1
+4 0.000343659 17
+3 0.265598752 1
+4 0.000374504 17
+3 0.277776817 1
+4 0.000385196 18
+3 0.623607466 1
+4 0.000465991 17
+3 0.407578830 1
+4 0.000377308 17
+3 0.383596590 1
+4 0.000344645 17
+3 0.287624982 1
+4 0.000338938 17
+3 0.500058529 1
+4 0.000361373 18
+3 0.083005940 1
+4 0.000368949 18
+3 0.083199114 1
+4 0.000331711 20
+3 0.083023505 1
+4 0.000487715 17
+3 0.083150658 1
+4 0.000352183 17
+3 0.083005686 1
+4 0.000420446 19
+3 0.082645909 1
+4 0.000443195 17
+3 0.082880092 1
+4 0.000348592 19
+3 0.084370020 1
+4 0.000554421 19
+3 0.082753405 1
+4 0.000344666 19
+3 0.082759368 1
+4 0.000370472 18
+3 0.273664109 1
+4 0.000349786 20
+3 0.414549669 2
+4 0.000469361 31
+3 0.183558246 1
+4 0.000349709 31
+3 0.079685759 1
+4 0.000383733 16
+3 0.207556160 1
+4 0.000425055 17
+3 0.175532538 1
+4 0.000353824 17
+3 0.151619008 1
+4 0.000454891 17
+3 0.127532347 1
+4 0.000370301 18
+3 0.151735505 1
+4 0.000380548 34
+4 0.703909264 17
+3 0.079980896 1
+4 0.110019529 30
+3 0.905877768 1
+4 0.000445492 24
+3 1.047415902 1
+4 0.000332007 19
+3 0.499902514 1
+4 0.000439156 19
+3 0.082836836 1
+4 0.000478012 18
+3 0.082851279 1
+4 0.000358081 17
+3 0.083713388 1
+4 0.000610451 21
+3 0.082968659 1
+4 0.000359505 17
+3 0.277418759 1
+4 0.000341648 10
+3 0.135643786 1
+4 0.000345552 1
+3 0.087654054 1
+4 0.000422437 1
+4 0.000449764 70
+3 0.503010874 1
+4 0.000354564 39
+3 0.501454976 1
+4 0.000364633 19
+3 0.081948991 1
+4 0.000319512 17
+3 0.082820842 1
+4 0.000330816 20
+3 0.083311309 1
+4 0.000348309 20
+3 0.083663099 1
+4 0.000353884 17
+3 0.082662925 1
+4 0.000340642 19
+3 0.084299043 1
+4 0.000352433 20
+3 0.081663755 1
+4 0.000380282 18
+3 0.082756710 1
+4 0.000316548 19
+3 0.083824192 1
+4 0.000345942 34
+3 0.083168918 1
+4 0.000445371 74
+3 0.082953951 1
+4 0.000355228 73
+3 0.083088287 1
+4 0.000367068 90
+3 0.083149922 1
+4 0.000348080 47
+3 0.688053329 1
+4 0.000381554 34
+3 0.497613523 1
+4 0.000366693 64
+3 0.083561312 1
+4 0.000419851 75
+3 0.199676372 1
+4 0.000672162 20
+3 0.201352501 1
+4 0.000605369 17
+3 0.498124334 1
+4 0.000639937 18
+3 0.082473199 1
+4 0.000457451 20
+3 0.083307226 1
+4 0.000353384 20
+3 0.082727515 1
+4 0.000534145 17
+3 0.082859004 1
+4 0.000345422 17
+3 0.082716025 1
+4 0.000444831 18
+3 0.083456421 1
+4 0.000566420 20
+3 0.082288311 1
+4 0.000575933 18
+3 0.083136546 1
+4 0.000336951 19
+3 0.083151116 1
+4 0.000532592 20
+3 0.082635042 1
+4 0.000346929 16
+3 0.083301988 1
+4 0.000532397 19
+3 0.083170403 1
+4 0.000414279 18
+3 0.083016143 1
+4 0.000369031 17
+3 0.166586961 1
+4 0.000586191 17
+3 0.201647795 1
+4 0.000355931 19
+3 0.157534136 1
+4 0.000355658 16
+3 0.185688458 1
+4 0.000350437 16
+3 0.405343831 1
+4 0.000338913 16
+3 2.776772946 1
+4 0.000765659 16
+3 0.498951429 1
+4 0.000358422 17
+3 0.082649556 1
+4 0.000356330 19
+3 0.083223260 1
+4 0.000434303 20
+3 0.082959209 1
+4 0.000343712 18
+3 0.083665361 1
+4 0.000351377 19
+3 0.082729431 1
+4 0.000343251 16
+3 0.083766736 1
+4 0.000369217 20
+3 0.082957236 1
+4 0.000506694 20
+3 0.514406159 1
+4 0.000384271 17
+3 0.135711038 1
+4 0.000448742 27
+3 0.095642611 1
+4 0.000353778 18
+3 0.143502669 1
+4 0.000343133 18
+3 0.191824914 1
+4 0.000345515 18
+3 0.167508155 1
+4 0.000439012 18
+3 0.119586152 1
+4 0.000364246 14
+3 0.199599029 1
+4 0.000394824 31
+3 0.359494159 2
+4 0.000360391 31
+3 0.500491661 1
+4 0.000348030 14
+3 0.083022059 1
+4 0.000354076 19
+3 0.082658870 1
+4 0.000334284 16
+3 0.082744416 1
+4 0.000375206 20
+3 0.082793199 1
+4 0.000335734 20
+3 0.083032690 1
+4 0.000390111 102
+3 0.083169309 1
+4 0.000564309 47
+3 0.082834177 1
+4 0.000370394 34
+3 0.083161897 1
+4 0.000555561 56
+3 0.083027258 1
+4 0.000411563 72
+3 0.083065270 1
+4 0.000438012 111
+3 0.083244716 1
+4 0.000388982 61
+3 5.390076001 1
+4 0.000361755 17
+3 0.500376102 1
+4 0.000346290 20
+3 0.083773871 1
+4 0.000339582 19
+3 0.082705021 1
+4 0.000343591 17
+3 0.083076161 1
+4 0.000351006 18
+3 0.083267781 1
+4 0.000353708 20
+3 0.860627549 1
+4 0.000413376 9
+3 0.159561144 1
+4 0.000536985 1
+3 0.055446008 1
+4 0.000397264 1
+4 0.000412078 70
+3 0.303331126 1
+4 0.000419620 37
+3 0.500407349 1
+4 0.000345294 16
+3 0.083195438 1
+4 0.000349955 20
+3 0.083323730 1
+4 0.000359940 19
+3 0.083153203 1
+4 0.000351876 17
+3 0.083203532 1
+4 0.000348572 19
+3 0.083551307 1
+4 0.000405705 34
+3 0.083713520 1
+4 0.000475964 63
+3 0.082759958 1
+4 0.000642429 67
+3 0.082355568 1
+4 0.000391276 36
+3 0.150523447 1
+4 0.000359130 21
+3 0.499631795 1
+4 0.000429306 20
+3 0.082668851 1
+4 0.000394256 17
+3 0.083587363 1
+4 0.000550229 18
+3 0.083265075 1
+4 0.000418526 20
+3 0.082872392 1
+4 0.000485616 20
+3 0.084466364 1
+4 0.000508445 19
+3 1.586077941 1
+4 0.000347002 18
+3 0.565763557 1
+4 0.000371357 18
+3 1.121561378 1
+4 0.000438793 20
+3 0.165842554 1
+4 0.000511685 21
+3 0.161127237 1
+4 0.000424980 20
+3 3.077818632 1
+4 0.000452650 20
+3 0.185586315 1
+4 0.000371881 21
+3 0.181483248 1
+4 0.000352713 19
+3 0.265640013 1
+4 0.000356845 17
+3 0.237734230 1
+4 0.000335245 18
+3 0.169878470 1
+4 0.000349162 20
+3 0.157400611 1
+4 0.000384050 21
+3 0.137767120 1
+4 0.000353454 20
+3 0.885723127 1
+3 0.127835187 1
+3 0.146006447 1
+4 0.000416838 248
+3 0.325825520 1
+4 0.000662162 941
+3 0.399307036 1
+4 0.000356040 18
+3 0.499876896 1
+4 0.000349176 19
+3 0.082827014 1
+4 0.000409474 20
+3 0.083267243 1
+4 0.000498996 17
+3 0.083253106 1
+4 0.000358544 17
+3 0.083263726 1
+4 0.000337032 17
+3 0.083042359 1
+4 0.000358627 18
+3 0.083620693 1
+4 0.000350194 20
+3 0.082760510 1
+4 0.000630143 17
+3 0.082784874 1
+4 0.000550076 17
+3 0.082704841 1
+4 0.000574716 19
+3 0.082744908 1
+4 0.000418352 17
+3 0.082774202 1
+4 0.000354258 19
+3 0.082677819 1
+4 0.000378462 16
+3 0.083521815 1
+4 0.000768416 16
+3 0.083022700 1
+4 0.000438248 18
+3 0.450666400 1
+4 0.000497195 188
+3 1.007600483 1
+4 0.000581024 778
+3 0.599384935 1
+4 0.000360129 15
+3 0.500500421 1
+4 0.000365977 15
+3 0.083046809 1
+4 0.000346430 15
+3 0.083022384 1
+4 0.000366479 15
+3 0.083224960 1
+4 0.000465202 15
+3 0.082781315 1
+4 0.001236088 17
+3 0.082531962 1
+4 0.000465791 18
+3 0.083206979 1
+4 0.000429056 16
+3 0.083211682 1
+4 0.000333562 17
+3 0.082977928 1
+4 0.000367388 16
+3 0.082943957 1
+4 0.000365290 17
+3 0.315483208 1
+4 0.000393839 51
+3 1.167665625 2
+4 0.000913033 53
+3 0.182978821 1
+4 0.000398811 41
+3 0.153587089 1
+4 0.000595040 16
+3 0.157539637 1
+4 0.000569714 17
+3 0.137512376 1
+4 0.000658573 16
+3 0.309205758 1
+4 0.000382197 16
+3 0.185911600 1
+4 0.000512091 17
+3 0.149111251 1
+4 0.000396892 16
+3 0.169839512 1
+4 0.000356643 17
+3 0.197498698 1
+4 0.000403258 18
+3 0.169593924 1
+4 0.000339724 16
+3 0.133707454 1
+4 0.000411193 17
+3 0.145624323 1
+4 0.000402009 16
+3 0.613718602 1
+3 0.143849770 1
+3 0.113977538 1
+4 0.000399485 30
+3 0.189809136 1
+4 0.000489080 184
+3 0.207464929 1
+4 0.000396541 41
+3 0.185688210 1
+4 0.000382841 17
+3 0.173560003 1
+4 0.000349710 16
+3 0.169557571 1
+4 0.000380527 17
+3 0.141625411 1
+4 0.000349480 18
+3 0.143540418 1
+4 0.000404076 18
+3 0.500446448 1
+4 0.000528431 18
+3 0.083456864 1
+4 0.000358381 17
+3 0.082908576 1
+4 0.000332441 18
+3 0.082997287 1
+4 0.000323440 17
+3 0.084391379 1
+4 0.000338972 18
+3 0.363607768 1
+4 0.000372113 18
+3 0.153661829 1
+4 0.000360189 17
+3 0.149657377 1
+4 0.000337623 18
+3 0.153708359 1
+4 0.000371589 17
+3 0.197639231 1
+3 0.071919331 1
+4 0.000535106 6
+3 0.281484931 1
+4 0.000363947 17
+3 0.149715247 1
+4 0.000446534 17
+3 0.185630636 1
+4 0.000352668 18
+3 0.301625584 1
+4 0.000420794 17
+3 0.111541731 1
+4 0.000362384 17
+3 0.153487339 1
+4 0.000384289 17
+3 1.077671578 1
+4 0.000373787 29
+3 1.135694313 2
+4 0.000455849 38
+3 0.161894671 1
+4 0.000424980 17
+3 0.157286557 1
+4 0.000414068 24
+3 0.215649944 1
+4 0.000362453 27
+3 0.279634478 1
+4 0.000382029 27
+3 0.079771511 1
+4 0.000338178 27
+3 0.111424942 1
+4 0.000389236 27
+3 0.103723776 1
+4 0.000408895 27
+3 0.279611650 1
+4 0.000438696 28
+3 0.167489619 1
+4 0.000340970 27
+3 0.121779530 1
+4 0.000381886 29
+3 0.141467726 1
+4 0.000342816 27
+3 0.263712595 1
+4 0.000389215 27
+3 0.111460903 1
+4 0.000341648 27
+3 0.207878690 1
+4 0.000441034 27
+3 0.063483895 1
+4 0.000337227 27
+3 0.391866272 1
+4 0.000430578 45
+3 0.087431813 1
+4 0.000346458 36
+3 0.786929049 1
+4 0.109919332 33
+3 0.750768305 1
+4 0.000369786 17
+3 0.295716194 1
+4 0.000366326 17
+3 0.218629147 1
+4 0.000367947 17
+3 5.636919818 1
+4 0.000374497 17
+3 1355.286048369 1
+4 0.109011400 1
+3 1.490559382 1
+4 0.000357441 17
+3 0.295055507 1
+4 0.000315393 17
+3 2.111778287 1
+3 0.096511683 1
+3 0.105319373 1
+4 0.000335261 30
+3 0.253704552 1
+4 0.000436942 149
+3 0.343686706 1
+4 0.000328610 43
+3 0.170833496 1
+4 0.000336496 18
+3 0.164434028 1
+4 0.000314439 17
+3 0.177767839 1
+4 0.000322700 17
+3 0.197573428 1
+4 0.000324172 18
+3 0.177835910 1
+4 0.000312284 17
+3 0.309632372 1
+4 0.000343358 17
+3 0.271619755 1
+3 0.104063983 1
+4 0.000372121 26
+3 0.287775040 1
+4 0.000363707 18
+3 0.111377554 1
+4 0.000349460 18
+3 0.239645302 1
+4 0.000336576 27
+3 0.071735089 1
+4 0.000330810 27
+3 0.151774365 1
+4 0.000323559 27
+3 0.207685137 1
+4 0.000352612 27
+3 0.743594889 1
+4 0.109994294 33
+3 0.402123637 1
+4 0.000459725 31
+3 0.847552031 2
+4 0.000372091 31
+3 2.015571160 1
+4 0.000385207 31
+3 1.631737529 1
+4 0.000360234 27
+3 0.679716084 1
+4 0.000367304 17
+3 0.279650564 1
+4 0.000324321 18
+3 0.655637050 1
+4 0.000411043 27
+3 9.936312957 1
+4 0.000350518 27
+3 0.431347782 1
+4 0.000355531 28
+3 0.503565171 1
+4 0.000398839 27
+3 0.503617679 1
+4 0.000357867 27
+3 0.423588873 1
+4 0.000358174 27
+3 1.847873914 1
+4 0.000405355 27
+3 0.319511106 1
+4 0.000318428 45
+4 0.707294448 18
+3 0.689969912 1
+4 0.110044320 31
+3 1.717323869 1
+4 0.000346123 17
+3 0.414922328 1
+4 0.000333108 9
+3 3.656376669 1
+4 0.000355126 24
+3 0.294989399 1
+4 0.000325068 28
+3 0.167577032 1
+4 0.000325343 28
+3 0.176570876 1
+4 0.000355360 28
+3 0.062913079 1
+4 0.000319204 28
+3 0.183638201 1
+4 0.000305624 29
+3 0.063720709 1
+4 0.000330903 28
+3 0.151643423 1
+4 0.000309986 28
+3 0.087702635 1
+4 0.000315924 28
+3 0.687627731 1
+4 0.000334813 28
+3 1.759871422 1
+4 0.000380929 28
+3 0.215524344 1
+4 0.000325008 28
+3 0.167570983 1
+4 0.000308543 28
+3 0.112563005 1
+4 0.000324025 28
+3 1.343008921 1
+4 0.000329887 28
+3 0.071597918 1
+4 0.000323210 29
+3 0.079624009 1
+4 0.000298985 28
+3 1.015958588 1
+4 0.000369154 17
+3 0.135463553 1
+4 0.000307810 18
+3 0.128003674 1
+4 0.000334953 28
+3 0.111341087 1
+4 0.000312659 28
+3 0.167803786 1
+4 0.000307857 28
+3 1.735851319 1
+4 0.000370105 28
+3 0.383452951 2
+4 0.000317159 24
+3 0.832455739 1
+3 0.079253131 1
+4 0.000431951 28
+3 0.415703583 1
+4 0.000328586 18
+3 0.311548333 1
+4 0.000328201 18
+3 0.698955582 1
+4 0.109992859 37
+3 0.462971498 1
+4 0.000380718 23
+3 0.135433447 1
+4 0.000336163 24
+3 62.410493085 1
+4 0.000358077 19
+3 0.176982743 1
+4 0.000323854 20
+3 0.582668503 1
+3 0.215073430 1
+3 0.129961162 1
+4 0.000381255 162
+3 0.158277679 1
+4 0.000346224 41
+3 0.145075471 1
+4 0.000349158 16
+3 0.165624343 1
+4 0.000418271 16
+3 0.155440827 1
+4 0.000319586 16
+3 0.211726570 1
+4 0.000356541 158
+3 5.368078153 1
+4 0.000354072 43
+3 0.218658167 1
+4 0.000325955 18
+3 0.196551091 1
+4 0.000302677 17
+3 0.201642786 1
+4 0.000340321 17
+3 0.149635875 1
+4 0.000300915 18
+3 2.184866499 1
+4 0.000345788 4
+3 0.272660452 1
+4 0.000348781 4
+3 0.277607983 1
+4 0.000316319 24
+3 0.327564491 1
+4 0.000322444 27
+3 2.751905926 1
+4 0.000336694 27
+3 0.423623387 1
+4 0.000352361 27
+3 0.511757455 1
+4 0.000344154 27
+3 0.071574193 1
+4 0.000315063 27
+3 0.175774578 1
+4 0.000321676 27
+3 0.207621572 1
+4 0.000312464 27
+3 0.319717021 1
+4 0.000340340 27
+3 4.391800618 2
+3 0.138077046 1
+4 0.000353195 94
+3 0.261583195 1
+4 0.000408997 85
+3 0.327629465 1
+4 0.000339131 29
+3 0.217602626 1
+4 0.000355921 18
+3 0.469620162 1
+4 0.000331587 19
+3 0.305749384 1
+4 0.000477633 166
+3 0.597426029 1
+4 0.000373177 150
+3 0.471823730 1
+4 0.000384326 41
+3 0.233567792 1
+4 0.000416471 16
+3 0.165717168 1
+4 0.000363228 16
+3 4.759691707 1
+3 0.167982627 1
+3 0.090004510 1
+4 0.000374936 29
+3 0.333497762 1
+4 0.000442909 142
+3 0.279708427 1
+4 0.000354939 43
+3 0.500668158 1
+4 0.000342487 18
+3 0.083288958 1
+4 0.000393562 17
+3 0.083496591 1
+4 0.000305439 17
+3 0.509420052 1
+4 0.000345250 18
+3 0.181420224 1
+4 0.000338016 17
+3 0.186424176 1
+4 0.000408116 16
+3 0.292862348 1
+4 0.000327081 14
+3 0.239622003 1
+4 0.000405427 17
+3 0.185653517 1
+4 0.000326735 17
+3 0.301690532 1
+4 0.000333015 17
+3 0.185686888 1
+4 0.000320161 17
+3 0.133603576 1
+4 0.000389670 17
+3 0.121537455 1
+4 0.000349007 17
+3 0.133756554 1
+4 0.000348035 17
+3 0.113708278 1
+4 0.000375077 17
+3 0.181588197 1
+4 0.000320146 17
+3 0.247725864 1
+4 0.000345665 4
+3 0.145694291 1
+4 0.000395946 4
+3 0.165451544 1
+4 0.000323197 4
+3 0.161705030 1
+4 0.000344935 4
+3 0.125705497 1
+4 0.000306407 4
+3 0.139302910 1
+4 0.000407498 4
+3 0.164048481 1
+4 0.000320381 4
+3 0.417597010 1
+4 0.000379491 4
+3 0.173635897 1
+4 0.000319662 24
+3 0.193688535 1
+4 0.000335694 27
+3 0.093672109 1
+4 0.000419259 27
+3 0.071599550 1
+4 0.000311541 28
+3 0.183773162 1
+4 0.000338949 27
+3 0.215666458 1
+4 0.000321816 27
+3 0.671793710 2
+4 0.000341553 33
+3 1.047583259 1
+4 0.000344162 16
+3 0.183654957 1
+4 0.000323913 18
+3 0.233793694 1
+4 0.000390101 17
+3 0.509576860 1
+4 0.000325925 17
+3 0.689747099 1
+4 0.000366075 17
+3 2.157542223 1
+4 0.000414784 26
+3 0.199608787 1
+4 0.000327154 18
+3 0.996848027 1
+4 0.109971083 36
+3 5.677291390 1
+4 0.000352075 20
+3 0.287541649 1
+4 0.000324724 20
+3 0.303777177 1
+4 0.000335877 20
+3 4.027017614 1
+4 0.000376221 19
+3 0.148151160 1
+4 0.000318898 20
+3 0.153996016 1
+4 0.000336099 20
+3 0.141326062 1
+4 0.000301818 20
+3 0.247873353 1
+3 0.113937336 1
+4 0.000345598 29
+3 0.229781504 1
+4 0.000361327 43
+3 0.121498710 1
+4 0.000317212 20
+3 0.141844049 1
+4 0.000337465 19
+3 0.247712021 1
+4 0.000355190 88
+3 0.703645321 1
+4 0.000419216 45
+3 0.207377514 2
+4 0.000328790 34
+3 0.159694452 1
+4 0.000339405 16
+3 0.161693631 1
+4 0.000303017 18
+3 0.341763799 1
+4 0.000344438 18
+3 1.015607522 1
+4 0.000337297 33
+3 0.231808474 1
+4 0.000345310 18
+3 0.183609427 1
+4 0.000348803 18
+3 0.151621169 1
+4 0.000340968 18
+3 0.071617354 1
+4 0.000340082 18
+3 0.151636128 1
+4 0.000326752 18
+3 0.127790406 1
+4 0.000347013 18
+3 0.167664123 1
+4 0.000361627 18
+3 0.119539753 1
+4 0.000334043 18
+3 0.303835058 1
+4 0.000393910 18
+3 0.087515898 1
+4 0.000330357 19
+3 0.375829127 1
+4 0.000381315 18
+3 0.129554274 1
+4 0.000329974 17
+3 0.085547027 1
+4 0.000333917 18
+3 0.159760955 1
+4 0.000319214 19
+3 0.119675564 1
+4 0.000324081 18
+3 0.231671824 1
+4 0.000344584 17
+3 0.081850440 1
+4 0.000328694 18
+3 0.133533946 1
+4 0.000338481 18
+3 0.207610747 1
+4 0.000320407 18
+3 0.095620195 1
+4 0.000305295 18
+3 0.519738841 1
+4 0.000347186 18
+3 0.095699160 1
+4 0.000321257 18
+3 0.103615810 1
+4 0.000349111 17
+3 0.719747780 1
+4 0.000329712 18
+3 0.263761306 1
+4 0.000343076 18
+3 0.199484445 1
+4 0.000335516 16
+3 0.128462380 1
+4 0.000339980 13
+3 0.118964420 1
+4 0.000322799 11
+3 0.079629165 1
+4 0.000320585 11
+3 0.119613685 1
+4 0.000365738 13
+3 0.071779378 1
+4 0.000333589 16
+3 0.119539596 1
+4 0.000330669 18
+3 0.191683622 1
+4 0.000320680 18
+3 0.183700306 1
+4 0.000306913 19
+3 0.183773381 1
+4 0.000328223 18
+3 0.095678195 1
+4 0.000312077 18
+3 0.175588035 1
+4 0.000333542 18
+3 0.087738779 1
+4 0.000302918 18
+3 0.047544625 1
+4 0.000384855 18
+3 0.255723045 1
+4 0.000313346 18
+3 0.160157003 1
+4 0.000324507 18
+3 0.111359765 1
+4 0.000333551 18
+3 0.151767421 1
+4 0.000312405 18
+3 0.303397461 2
+4 0.000363249 33
+3 0.177841572 1
+4 0.000320580 17
+3 0.149535897 1
+4 0.000335614 17
+3 0.154196825 1
+4 0.000320025 17
+3 0.109240108 1
+4 0.000315702 4
+3 0.639770085 1
+4 0.000346749 19
+3 0.535670249 1
+4 0.000331265 17
+3 0.185671951 1
+4 0.000350951 16
+3 5.125904385 1
+4 0.000431425 88
+3 0.186977482 1
+4 0.000385201 104
+3 0.452241058 1
+4 0.000375841 44
+3 0.121656381 1
+4 0.000360525 34
+3 0.165573345 1
+4 0.000356146 54
+3 0.263466455 1
+4 0.000328059 16
+3 0.209585261 1
+4 0.000316103 18
+3 0.157813780 1
+4 0.000328357 16
+3 0.169852196 1
+4 0.000395202 16
+3 3.461723285 1
+4 0.000362811 16
+3 0.255532421 1
+4 0.000339689 18
+3 0.119616008 1
+4 0.000325998 18
+3 0.170355554 1
+4 0.000367394 17
+3 0.285071366 1
+3 0.071817285 1
+4 0.000412397 4
+3 0.143702867 1
+3 0.055910855 1
+4 0.000414719 5
+3 14.440866789 1
+4 0.000355757 24
+3 0.270870488 1
+4 0.000344692 19
+3 1.003915582 1
+4 0.109901407 33
+3 7.398756208 1
+4 0.000565541 905
+3 2.151348317 1
+4 0.000597751 775
+3 0.535104159 1
+4 0.000567414 885
+3 3.455623341 1
+4 0.000356962 15
+3 0.499621583 1
+4 0.000334991 15
+3 0.082746921 1
+4 0.000367092 15
+3 0.082809523 1
+4 0.000307765 17
+3 0.083042775 1
+4 0.000305767 18
+3 0.083620957 1
+4 0.000303635 15
+3 0.083543148 1
+4 0.000395460 15
+3 0.082977878 1
+4 0.000345953 15
+3 0.083546396 1
+4 0.000356394 17
+3 0.083402942 1
+4 0.000380225 18
+3 0.083511060 1
+4 0.000337833 16
+3 0.317250225 1
+4 0.000347420 16
+3 3.269957967 1
+4 0.000411221 16
+3 0.500100450 1
+4 0.000332747 16
+3 0.083269372 1
+4 0.000375851 17
+3 0.083184899 1
+4 0.000355772 17
+3 0.084111434 1
+4 0.000404485 15
+3 0.082862947 1
+4 0.000324645 15
+3 0.082880334 1
+4 0.000364168 15
+3 0.082942671 1
+4 0.000348189 18
+3 1.733670017 1
+4 0.000367479 18
+3 0.169798494 1
+4 0.000316243 15
+3 0.165723069 1
+4 0.000409110 15
+3 0.359556527 1
+3 0.146319761 1
+4 0.000380726 28
+3 0.421481252 1
+4 0.000588725 806
+3 0.399268717 1
+4 0.000413960 19
+3 0.499965393 1
+4 0.000374304 18
+3 0.083201716 1
+4 0.000362287 17
+3 0.083516925 1
+4 0.000308564 19
+3 0.083207789 1
+4 0.000305446 19
+3 0.083147296 1
+4 0.000321533 20
+3 0.495046928 1
+4 0.000326144 18
+3 0.497512357 1
+4 0.000354661 17
+3 0.083577867 1
+4 0.000325406 20
+3 0.082751067 1
+4 0.000332784 20
+3 0.083050111 1
+4 0.000325669 20
+3 0.083128025 1
+4 0.000339349 19
+3 0.083053302 1
+4 0.000322173 17
+3 0.083069129 1
+4 0.000329116 20
+3 0.082803835 1
+4 0.000342221 20
+3 0.083184165 1
+4 0.000319960 21
+3 0.083367062 1
+4 0.000313845 19
+3 0.082733046 1
+4 0.000314193 20
+3 1.273743625 1
+4 0.000382171 61
+3 0.911675042 2
+4 0.000413945 91
+3 0.335606840 1
+4 0.000338940 17
+3 0.223600080 1
+3 0.154015266 1
+4 0.000350944 40
+3 0.237638708 1
+4 0.000387173 18
+3 0.137585301 1
+4 0.000364394 17
+3 6.941973560 1
+3 0.169994410 1
+4 0.000351093 57
+3 5.229817087 1
+4 0.000353408 17
+3 0.895529177 1
+4 0.000378019 63
+3 1.823769261 1
+4 0.000558188 48
+3 0.727480849 1
+4 0.000346612 9
+3 0.103564042 1
+4 0.000418594 43
+3 0.479619362 1
+4 0.000581226 17
+3 0.783466733 1
+4 0.000397266 10
+3 0.311567758 1
+4 0.000468045 1
+3 0.183529936 1
+4 0.000446948 1
+3 0.175665108 1
+4 0.000347008 1
+3 0.295546700 1
+4 0.000488259 1
+3 0.311713969 1
+4 0.000708820 426
+3 0.543277569 1
+4 0.000468093 191
+3 0.370453129 1
+4 0.000436304 195
+3 0.332492711 1
+4 0.000516417 629
+3 2.297769577 1
+4 0.000375844 17
+3 1.349639570 1
+4 0.000539640 516
+3 0.169431993 1
+4 0.000381393 58
+3 0.957581268 1
+4 0.000369523 10
+3 0.159576813 1
+4 0.000359247 1
+3 0.087702014 1
+4 0.000325770 1
+4 0.000404527 71
+3 0.471205359 1
+4 0.000347201 37
+3 0.499925798 1
+4 0.000339188 20
+3 0.083415211 1
+4 0.000310028 17
+3 0.083391046 1
+4 0.000307447 16
+3 0.082895739 1
+4 0.000307431 18
+3 0.083394592 1
+4 0.000310969 17
+3 0.083139837 1
+4 0.000339507 19
+3 0.082927037 1
+4 0.000310078 16
+3 8.255292921 1
+4 0.000399911 16
+3 0.154649653 1
+4 0.000327368 18
+3 0.156068589 1
+4 0.000333478 17
+3 0.185684061 1
+4 0.000303888 19
+3 0.645740718 1
+4 0.000339869 17
+3 0.209568252 1
+4 0.000352399 16
+3 0.181665352 1
+4 0.000300823 17
+3 1.183886754 1
+3 0.079931813 1
+4 0.000368609 24
+3 0.135650054 1
+4 0.000331397 17
+3 0.287578764 1
+4 0.000408887 17
+3 0.511566421 2
+4 0.000358917 32
+3 0.183823846 1
+4 0.000359244 22
+3 0.175544051 1
+4 0.000339007 23
+3 0.743690311 1
+4 0.000388158 16
+3 0.242018541 1
+4 0.000324740 18
+3 0.205240057 1
+4 0.000326932 19
+3 0.201744955 1
+4 0.000384731 20
+3 0.197564455 1
+4 0.000331179 17
+3 0.202047265 1
+4 0.000343138 19
+3 0.205735276 1
+4 0.000394812 16
+3 0.279264151 1
+4 0.000323404 18
+3 0.499895957 1
+4 0.000369741 20
+3 0.083569476 1
+4 0.000307162 17
+3 0.083267533 1
+4 0.000382126 19
+3 0.083133696 1
+4 0.000319785 20
+3 0.083082217 1
+4 0.000311716 17
+3 0.438926962 1
+4 0.000308596 16
+3 0.381920137 1
+3 0.223951188 1
+3 0.105984888 1
+4 0.000342800 30
+3 0.373632952 1
+4 0.000429730 329
+3 0.671880020 1
+4 0.000368303 42
+3 0.145342356 1
+4 0.000319131 17
+3 0.405714676 1
+3 0.064015291 1
+4 0.000407190 28
+3 0.159571256 1
+4 0.000359129 17
+3 0.135739925 1
+4 0.000342254 17
+3 0.095414506 1
+4 0.000385877 17
+3 0.263781157 1
+4 0.000341915 17
+3 0.143633585 1
+4 0.000341779 17
+3 0.127773709 1
+4 0.000326438 17
+3 0.096178447 1
+4 0.000407714 17
+3 0.150944671 1
+4 0.000324320 17
+3 1.167778613 2
+4 0.000450760 32
+3 1.151657400 1
+3 0.087857087 1
+4 0.000353619 28
+3 1.343853416 2
+4 0.000410493 36
+3 0.767628835 1
+4 0.000393689 17
+3 0.823535322 1
+4 0.000350832 17
+3 0.607779189 1
+4 0.000330991 23
+3 0.567719946 1
+4 0.000345112 41
+3 0.415541324 1
+4 0.000342291 40
+3 0.215587583 1
+4 0.000332996 40
+3 0.271815338 1
+4 0.000356992 40
+3 0.726008674 1
+4 0.110033117 32
+3 0.739536474 1
+4 0.000366927 16
+3 0.431716905 1
+4 0.000367342 20
+3 0.247730542 1
+4 0.000435044 16
+3 0.153581531 1
+4 0.000328017 18
+3 0.165388638 1
+4 0.000321800 19
+3 0.161953265 1
+4 0.000356221 20
+3 0.157434805 1
+4 0.000324051 17
+3 0.137776152 1
+4 0.000331819 19
+3 0.166259555 1
+4 0.000312381 16
+3 0.247121126 1
+4 0.000392045 18
+3 0.499770198 1
+4 0.000333407 20
+3 0.083248530 1
+4 0.000307234 17
+3 0.083307513 1
+4 0.000409962 19
+3 0.082946162 1
+4 0.000312854 20
+3 0.363169418 1
+4 0.000346906 17
+3 8.429939840 1
+4 0.000355388 16
+3 0.239519158 1
+3 0.079944635 1
+4 0.000446971 28
+3 0.999708399 1
+4 0.000371364 17
+3 0.231399429 1
+4 0.000337278 17
+3 0.247770548 1
+4 0.000331658 17
+3 0.807599971 2
+4 0.000440067 27
+3 0.137837192 1
+4 0.000320814 16
+3 3.277671637 1
+4 0.000349084 23
+3 2.479738186 1
+4 0.000437566 31
+3 0.383502557 1
+4 0.000352195 31
+3 0.815744863 1
+4 0.000353932 31
+3 2.607751895 1
+4 0.000414627 31
+3 0.471841722 1
+4 0.000350908 31
+3 4.223463535 1
+4 0.000364000 32
+3 0.895657056 1
+4 0.000342411 31
+3 6.560153255 2
+4 0.000392008 35
+3 0.487401076 1
+4 0.000331628 19
+3 0.359759861 1
+4 0.000431837 16
+3 0.727411615 1
+3 0.071871017 1
+4 0.000334399 28
+3 0.184029362 1
+4 0.000357277 17
+3 0.271597042 1
+4 0.000333227 17
+3 0.007953852 1
+4 0.000353027 17
+3 0.407629558 1
+4 0.000342284 16
+3 0.239440204 1
+4 0.000399439 16
+3 0.271562646 1
+4 0.000315251 17
+3 0.015736464 1
+4 0.000328911 17
+3 0.463671983 1
+4 0.000386971 16
+3 0.255520313 1
+4 0.000396876 17
+3 0.255575574 1
+4 0.000319696 17
+3 0.327885831 1
+4 0.000370830 17
+3 0.135785420 1
+4 0.000308482 26
+3 0.063340907 1
+4 0.000354097 26
+3 0.760099189 2
+4 0.000349488 35
+3 0.263620209 1
+4 0.000430686 19
+3 2.655481019 1
+4 0.000352994 16
+3 0.201493229 1
+4 0.000388037 17
+3 0.565590496 1
+4 0.000340637 17
+3 0.279623962 1
+4 0.000403302 16
+3 0.217726250 1
+4 0.000330488 16
+3 0.157942626 1
+4 0.000341139 16
+3 0.153577727 1
+4 0.000391217 16
+3 1.629471085 1
+4 0.000365359 4
+3 0.153936121 1
+4 0.000353264 4
+3 0.157494105 1
+4 0.000387426 23
+3 3.815804737 2
+4 0.000555868 607
+3 0.185304508 1
+3 0.726180765 1
+4 0.000587305 896
+3 0.145166099 1
+4 0.000343318 17
+3 0.453717138 1
+4 0.000343318 18
+3 0.423806171 1
+4 0.000328304 32
+3 0.311473677 1
+4 0.000356712 51
+3 0.463701906 2
+4 0.000363047 31
+3 0.162468850 1
+4 0.000381771 17
+3 0.212936288 1
+4 0.000328744 17
+3 0.201572542 1
+4 0.000318393 17
+3 0.158188635 1
+4 0.000346781 17
+3 0.153086812 1
+4 0.000310759 17
+3 0.181748570 1
+4 0.000327495 17
+3 0.224633589 1
+4 0.000327160 24
+3 3.083265476 7
+4 0.000413328 55
+4 0.708396562 17
+3 0.109938943 1
+4 0.110046238 33
+3 1.131997691 1
+4 0.000368514 18
+3 0.614589204 1
+4 0.000348852 17
+3 7.328427097 1
+3 0.071398870 1
+4 0.000340671 29
+3 0.247583410 1
+4 0.000325206 18
+3 0.191682188 1
+4 0.000318153 18
+3 0.103684604 1
+4 0.000308663 17
+3 0.119653908 1
+4 0.000354466 18
+3 0.007920117 1
+4 0.000312124 19
+3 0.503678429 1
+4 0.000342666 18
+3 0.247490366 1
+4 0.000315711 19
+3 0.879814337 1
+4 0.000355112 18
+3 0.191647045 1
+4 0.000415816 18
+3 0.095496496 1
+4 0.000324130 18
+3 1.727941926 2
+4 0.000390151 24
+3 0.145311050 1
+4 0.000361530 17
+3 0.351067244 1
+3 0.086891293 1
+4 0.000376008 33
+3 1.159520811 1
+4 0.000356484 18
+3 1.631586569 1
+4 0.000360394 18
+3 2.223806976 1
+4 0.000348027 18
+3 5.303916208 2
+4 0.000397893 42
+3 0.383392549 1
+4 0.000343944 17
+3 0.153586044 1
+4 0.000327230 17
+3 0.165955767 1
+4 0.000350745 17
+3 0.145506471 1
+4 0.000327568 17
+3 0.149646704 1
+4 0.000394312 17
+3 0.177641094 1
+4 0.000337041 17
+3 0.165864558 1
+4 0.000322018 18
+3 0.137981608 1
+4 0.000327508 17
+3 0.485219823 1
+4 0.000357033 4
+3 0.311700882 1
+4 0.000414137 17
+3 0.500029320 1
+4 0.000351715 18
+3 0.082610702 1
+4 0.000335635 17
+3 0.083552630 1
+4 0.000323946 17
+3 0.083191415 1
+4 0.000311562 17
+3 0.250983064 1
+4 0.000322803 17
+3 0.189509172 1
+4 0.000311570 24
+3 0.367953067 1
+4 0.000402579 44
+4 0.708053942 18
+3 0.083378469 2
+4 0.000421970 37
+3 1.377642309 1
+4 0.000354773 19
+3 0.197731080 1
+4 0.000340457 20
+3 0.385502092 1
+4 0.000390110 20
+3 0.541627942 1
+4 0.000395369 18
+3 0.215837621 1
+4 0.000316576 24
+3 0.311575327 1
+4 0.000375469 19
+3 0.399886694 1
+4 0.000335074 20
+3 0.863526521 1
+4 0.000439261 19
+3 0.699983695 1
+4 0.110027389 33
+3 5.894499112 1
+4 0.000451518 20
+3 0.202621066 1
+4 0.000320801 19
+3 0.155971941 1
+4 0.000410889 20
+3 1.207458435 1
+4 0.000353441 17
+3 0.519857411 1
+4 0.000348953 24
+3 0.335643444 1
+4 0.000335709 20
+3 0.935719660 1
+4 0.000407745 20
+3 0.745725890 1
+4 0.110057260 33
+3 5.096001875 1
+4 0.000375705 18
+3 0.208285701 1
+4 0.000335118 17
+3 0.500229484 1
+4 0.000351746 17
+3 0.082089645 1
+4 0.000304275 17
+3 0.082961955 1
+4 0.000381201 18
+3 0.083131641 1
+4 0.000306994 17
+3 0.083585185 1
+4 0.000395186 18
+3 0.373142920 1
+4 0.000344102 18
+3 0.169563174 1
+4 0.000352400 17
+3 0.229835133 1
+4 0.000324837 17
+3 4.448064965 1
+4 0.000354894 18
+3 0.225338934 1
+4 0.000348300 17
+3 0.293659106 1
+4 0.000321764 17
+3 0.201812583 1
+4 0.000386869 18
+3 0.405460344 1
+4 0.000346744 17
+3 0.500122367 1
+4 0.000358785 17
+3 0.083259233 1
+4 0.000314479 17
+3 0.083574798 1
+4 0.000311706 17
+3 0.082828057 1
+4 0.000319412 17
+3 0.083388392 1
+4 0.000321179 17
+3 0.083681547 1
+4 0.000355028 18
+3 0.466832397 1
+4 0.000344230 17
+3 26.935338372 1
+4 0.000437200 17
+3 0.499741069 1
+4 0.000354244 17
+3 0.082820682 1
+4 0.000311809 17
+3 0.082888909 1
+4 0.000309663 17
+3 0.083270332 1
+4 0.000323716 17
+3 0.083815610 1
+4 0.000312243 17
+3 0.082827600 1
+4 0.000321313 17
+3 0.083498993 1
+4 0.000338685 17
+3 0.082869333 1
+4 0.000321419 18
+3 0.083316232 1
+4 0.000312199 17
+3 5.871279492 1
+4 0.000344698 18
+3 0.249514726 1
+4 0.000383238 19
+3 0.317703189 1
+4 0.000323249 20
+3 0.193482584 1
+4 0.000305137 18
+3 0.949820398 1
+3 0.096099933 1
+3 0.122987696 1
+4 0.000418853 31
+3 0.212453658 1
+4 0.000364048 179
+3 0.287711755 1
+4 0.000331579 41
+3 0.153836709 1
+4 0.000311394 16
+3 0.373422885 1
+4 0.000355467 16
+3 0.263747926 1
+4 0.000343796 16
+3 0.185613747 1
+4 0.000355462 16
+3 0.253735948 1
+4 0.000305528 16
+3 0.185902430 1
+4 0.000346254 16
+3 0.157376420 1
+4 0.000314771 17
+3 0.145911915 1
+4 0.000322312 16
+3 0.101681818 1
+4 0.000309979 18
+3 0.137425196 1
+4 0.000309656 18
+3 0.373925187 1
+4 0.000365363 24
+3 0.191397497 1
+4 0.000334851 31
+3 0.152638766 1
+4 0.000332264 31
+3 0.062935512 1
+4 0.000317057 31
+3 0.191640837 1
+4 0.000332105 31
+3 0.111562845 1
+4 0.000334212 31
+3 0.087713075 1
+4 0.000307308 31
+3 0.023895233 1
+4 0.000376620 31
+3 0.071305173 1
+4 0.000314625 31
+3 0.135882091 1
+4 0.000331895 31
+3 0.112892436 1
+4 0.000318745 32
+3 0.398540363 2
+4 0.000347929 36
+3 0.145543747 1
+4 0.000310408 18
+3 0.181733383 1
+4 0.000310710 19
+3 0.225791287 1
+4 0.000358431 20
+3 0.293422000 1
+4 0.000413438 19
+3 0.287674279 1
+4 0.000331060 20
+3 1.751776737 1
+4 0.000386746 18
+3 0.255480713 1
+4 0.000355248 17
+3 0.193905578 1
+4 0.000354053 18
+3 0.277552573 1
+3 0.056022450 1
+4 0.000337430 28
+3 0.215669320 1
+4 0.000392293 18
+3 0.751567284 1
+4 0.000343946 18
+3 0.159544512 1
+4 0.000339343 18
+3 0.738907235 1
+4 0.110079893 37
+3 0.046918166 1
+4 0.000346342 17
+3 1.951583337 1
+4 0.000336705 17
+3 0.271900166 1
+4 0.000329704 17
+3 0.201801219 1
+4 0.000320399 17
+3 0.181508584 1
+4 0.000311770 17
+3 0.169907266 1
+4 0.000367005 17
+3 0.661357828 1
+4 0.000358258 17
+3 2.167868078 1
+4 0.000422447 19
+3 0.201708762 1
+4 0.000321464 20
+3 0.285464595 1
+4 0.000333990 18
+3 1.951700809 1
+4 0.000347358 4
+3 0.391721772 1
+4 0.000337571 18
+3 0.185483810 1
+4 0.000353506 19
+3 0.213953442 1
+4 0.000308516 20
+3 1.199619712 1
+4 0.000420574 4
+3 1.935588071 1
+4 0.000340007 17
+3 0.500493774 1
+4 0.000344335 19
+3 0.082886485 1
+4 0.000376775 20
+3 0.083138078 1
+4 0.000321539 17
+3 0.083191881 1
+4 0.000305872 19
+3 0.083334596 1
+4 0.000308127 16
+3 0.083456869 1
+4 0.000337756 20
+3 0.083357583 1
+4 0.000327672 19
+3 0.245553300 1
+4 0.000334643 21
+3 0.217664280 1
+4 0.000336961 17
+3 0.189667138 1
+4 0.000313081 18
+3 0.169903078 1
+4 0.000322471 20
+3 0.149403068 1
+4 0.000373311 17
+3 0.583752446 1
+4 0.000365052 9
+3 0.311420326 1
+4 0.000334050 1
+3 0.113709736 1
+4 0.000328754 1
+3 0.269629311 1
+4 0.000334443 1
+3 0.199817057 1
+4 0.000336559 13
+4 0.000338588 45
+3 1.063427309 1
+4 0.000394966 41
+3 0.500115589 1
+4 0.000345806 20
+3 0.083139629 1
+4 0.000358336 17
+3 0.082598810 1
+4 0.000345737 19
+3 0.084031462 1
+4 0.000343220 20
+3 0.208172960 1
+4 0.000333316 19
+3 0.353593933 1
+4 0.000364028 20
+3 1.638053347 1
+4 0.000376336 4
+3 0.455382229 1
+4 0.000333648 17
+3 0.247648687 1
+4 0.000335276 31
+3 0.711882600 1
+4 0.000350656 39
+4 0.708294247 18
+3 0.319934314 1
+4 0.110026734 31
+3 31.510486412 1
+4 0.000365444 19
+3 0.217423519 1
+4 0.000342183 20
+3 0.165727326 1
+4 0.000373901 18
+3 0.193576422 1
+4 0.000389807 20
+3 0.501809418 1
+4 0.000370361 18
+3 0.185479186 1
+4 0.000353245 17
+3 0.165738100 1
+4 0.000391552 17
+3 0.185568811 1
+4 0.000326827 17
+3 0.389645144 1
+3 0.079955068 1
+4 0.000362696 7
+3 0.239817965 1
+4 0.000337478 17
+3 0.499804687 1
+4 0.000329867 18
+3 0.083927622 1
+4 0.000336878 19
+3 0.082239166 1
+4 0.000320152 20
+3 0.083317108 1
+4 0.000311769 17
+3 0.083328906 1
+4 0.000349950 19
+3 10.398342245 1
+4 0.000339689 20
+3 0.190926873 1
+4 0.000343843 17
+3 0.193983113 1
+4 0.000311998 17
+3 0.181405177 1
+4 0.000335518 18
+3 0.743747351 1
+3 0.080750263 1
+4 0.000362917 29
+3 0.983969402 2
+4 0.000361177 28
+3 0.326649869 1
+4 0.000392960 6
+3 0.185789164 1
+4 0.000325462 4
+3 0.157535507 1
+4 0.000411977 4
+3 0.129429124 1
+4 0.000316986 4
+3 0.134168711 1
+4 0.000349959 4
+3 0.161309787 1
+4 0.000338609 4
+3 0.117658051 1
+4 0.000363040 4
+3 0.249687333 1
+4 0.000333827 4
+3 0.397558284 1
+4 0.000342014 4
+3 0.143659469 1
+4 0.000318067 24
+3 0.223862839 1
+4 0.000406197 27
+3 0.159432209 1
+4 0.000353186 27
+3 0.183718252 1
+4 0.000352853 27
+3 0.560775341 2
+4 0.000342059 36
+3 0.366510501 1
+4 0.000346896 17
+3 0.169856402 1
+4 0.000338191 15
+3 0.181495702 1
+4 0.000381002 9
+3 0.959741177 1
+3 0.063922857 1
+4 0.000342183 29
+3 0.231615735 1
+4 0.000340924 13
+3 0.135678664 1
+4 0.000323864 16
+3 0.111820454 1
+4 0.000345612 17
+3 0.111566508 1
+4 0.000389733 18
+3 0.415649943 2
+4 0.000341770 28
+3 0.137739006 1
+4 0.000318061 18
+3 0.445512459 1
+3 0.072001743 1
+4 0.000404452 33
+3 0.159687980 1
+4 0.000323236 18
+3 0.087563053 1
+4 0.000315358 18
+3 0.095820094 1
+4 0.000368675 18
+3 0.207459649 1
+4 0.000327594 18
+3 0.143768333 1
+4 0.000349465 18
+3 0.511556634 1
+4 0.000336677 18
+3 0.137695863 1
+4 0.000335991 18
+3 0.397707766 1
+4 0.000343216 18
+3 0.423783351 2
+4 0.000347446 28
+3 1.055613217 1
+4 0.000340383 17
+3 0.215749254 1
+4 0.000342298 33
+3 0.199529985 1
+4 0.000397427 18
+3 0.191675036 1
+4 0.000346706 18
+3 0.359683867 2
+4 0.000369961 12
+3 0.119499816 1
+4 0.000316543 1
+3 0.071884463 1
+4 0.000337752 1
+4 0.000406056 71
+3 16.864636688 1
+4 0.000417982 39
+3 1.982761857 1
+4 0.000364483 16
+3 0.201773522 1
+4 0.000370579 19
+3 0.197459498 1
+4 0.000330729 20
+3 0.185686403 1
+4 0.000365432 20
+3 0.325699985 1
+3 0.279889565 1
+3 0.122194256 1
+4 0.000397331 158
+3 0.141506476 1
+4 0.000328477 41
+3 0.161643732 1
+4 0.000402495 16
+3 0.133583723 1
+4 0.000327938 16
+3 0.146028919 1
+4 0.000349062 16
+3 0.117267672 1
+4 0.000323723 16
+3 0.121732123 1
+4 0.000382146 17
+3 0.181705721 1
+4 0.000361214 16
+3 0.295675391 1
+4 0.000433182 164
+3 36.441560549 1
+4 0.000394892 41
+3 0.176818774 1
+4 0.000337521 16
+3 0.157633029 1
+4 0.000312926 16
+3 0.185768636 1
+4 0.000395215 16
+3 0.381511190 1
+4 0.000334361 16
+3 0.167888328 1
+4 0.000342384 18
+3 0.153562610 1
+4 0.000304993 17
+3 0.181654295 1
+4 0.000423831 18
+3 0.161419461 1
+4 0.000311281 17
+3 0.141734011 1
+4 0.000325034 17
+3 0.169768560 1
+4 0.000328403 18
+3 0.149646269 1
+4 0.000346239 18
+3 0.319604919 1
+4 0.000331568 18
+3 0.431854030 1
+4 0.000383382 18
+3 0.500341945 1
+4 0.000361535 17
+3 0.082386950 1
+4 0.000334650 17
+3 0.082928473 1
+4 0.000324967 17
+3 0.083439928 1
+4 0.000338704 17
+3 0.082800886 1
+4 0.000320995 17
+3 0.083070466 1
+4 0.000375476 17
+3 0.083388393 1
+4 0.000332583 17
+3 0.083681173 1
+4 0.000338640 17
+3 0.732952042 1
+4 0.000336557 17
+3 0.477571104 1
+4 0.000341230 4
+3 0.111584609 1
+4 0.000329798 39
+3 0.807798820 1
+4 0.000371883 31
+3 1.879777050 1
+4 0.000346880 38
+3 0.575594195 2
+4 0.000403331 34
+3 0.279481085 1
+4 0.000341609 17
+3 0.193731862 1
+4 0.000353646 17
+3 0.133635967 1
+4 0.000326808 17
+3 0.199653806 1
+4 0.000343865 18
+3 0.217632124 1
+4 0.000327499 17
+3 0.333914145 1
+4 0.000346748 17
+3 0.201475101 1
+4 0.000325034 17
+3 0.253845553 1
+4 0.000353298 17
+3 0.217519276 1
+4 0.000317614 17
+3 0.197699767 1
+4 0.000341367 17
+3 0.279697713 1
+4 0.000347395 4
+3 4.391931838 1
+4 0.000382826 9
+3 0.159420283 1
+4 0.000335654 1
+3 0.111719368 1
+4 0.000347944 1
+4 0.000972742 10
+4 0.000403494 61
+3 2.110386452 1
+4 0.000369178 39
+3 17.034834764 1
+4 0.000383986 19
+3 0.497234888 1
+4 0.000337602 20
+3 0.084271274 1
+4 0.000325667 21
+3 0.082062227 1
+4 0.000307956 20
+3 0.083458142 1
+4 0.000378024 18
+3 0.083199922 1
+4 0.000337838 17
+3 0.082989013 1
+4 0.000313158 19
+3 0.082832977 1
+4 0.000348033 19
+3 0.083541463 1
+4 0.000328121 19
+3 0.082929197 1
+4 0.000313910 18
+3 0.083452781 1
+4 0.000309767 17
+3 0.082767924 1
+4 0.000311219 19
+3 0.083015240 1
+4 0.000346502 20
+3 0.082732345 1
+4 0.000313155 19
+3 0.083514591 1
+4 0.000374006 37
+3 0.083202819 1
+4 0.000344767 46
+3 0.082762877 1
+4 0.000359216 94
+3 0.083311882 1
+4 0.000376838 152
+3 0.082723059 1
+4 0.000363037 47
+3 0.083441576 1
+4 0.000382240 98
+3 0.083381556 1
+4 0.000379171 152
+3 0.082387028 1
+4 0.000371299 86
+3 0.083603851 1
+4 0.000352149 38
+3 13.187291173 1
+4 0.000364475 20
+3 0.201591490 1
+4 0.000341083 19
+3 0.181550902 1
+4 0.000331003 16
+3 0.351762681 1
+4 0.000348213 16
+3 0.218037835 1
+4 0.000314279 19
+3 0.141360603 1
+4 0.000334775 16
+3 0.217421174 1
+4 0.000347537 16
+3 1.613955996 1
+4 0.000399838 20
+3 0.153400809 1
+4 0.000326442 4
+3 0.605790128 1
+4 0.000375715 16
+3 0.159963188 1
+4 0.000369091 20
+3 0.175264072 1
+4 0.000390057 17
+3 0.201687192 1
+4 0.000344551 16
+3 0.157495908 1
+4 0.000339017 17
+3 0.169631706 1
+4 0.000328428 16
+3 0.325859306 1
+4 0.000351315 16
+3 0.201655096 1
+4 0.000338171 16
+3 0.197485573 1
+4 0.000406494 18
+3 0.375701536 1
+4 0.000333841 19
+3 8.552199557 1
+4 0.000384966 16
+3 0.499368787 1
+4 0.000326486 17
+3 0.083035429 1
+4 0.000395329 17
+3 0.082744859 1
+4 0.000316918 16
+3 0.083822819 1
+4 0.000348257 16
+3 2.153854370 1
+4 0.000359777 16
+3 0.454970727 1
+4 0.000381231 16
+3 2.903628235 1
+4 0.000397139 4
+3 0.137652738 1
+4 0.000370089 4
+3 14.879197379 1
+4 0.000588898 762
+3 5.222678102 1
+4 0.000550454 793
+3 0.153450247 1
+4 0.000348693 4
+3 1.341483527 1
+4 0.000389025 17
+3 0.199684507 1
+4 0.000320075 24
+3 0.119439232 1
+4 0.000384750 34
+3 0.143774044 1
+4 0.000316257 34
+3 0.079693380 1
+4 0.000378889 34
+3 0.111870144 1
+4 0.000321397 34
+3 0.191442427 1
+4 0.000335188 35
+3 0.495698254 2
+4 0.000347889 34
+3 0.135636537 1
+4 0.000331297 17
+3 0.169760444 1
+4 0.000355278 17
+3 0.165496749 1
+4 0.000346968 17
+3 0.153680419 1
+4 0.000318333 17
+3 0.125792663 1
+4 0.000339694 17
+3 0.183624102 1
+4 0.000334578 4
+3 0.153758616 1
+4 0.000342895 4
+3 0.165566675 1
+4 0.000329560 4
+3 0.137908416 1
+4 0.000404009 7
+3 0.349276207 1
+4 0.000346136 5
+3 18.160593708 1
+4 0.000363397 19
+3 0.337569975 1
+4 0.000330696 20
+3 0.165697402 1
+4 0.000342986 20
+3 0.169507433 1
+4 0.000333203 19
+3 0.413625250 1
+4 0.000359561 20
+3 0.271674243 1
+4 0.000361874 17
+3 0.169540245 1
+4 0.000346444 17
+3 0.173734662 1
+4 0.000349677 17
+3 0.169738408 1
+4 0.000351974 17
+3 0.197583944 1
+4 0.000319564 18
+3 0.185640509 1
+4 0.000343136 17
+3 0.285756461 1
+4 0.000326809 17
+3 0.232292994 1
+4 0.000388610 17
+3 0.110906483 1
+4 0.000307183 24
+3 0.623734540 2
+4 0.000376785 33
+3 0.223759608 1
+4 0.000342357 24
+3 0.160654122 1
+4 0.000315471 32
+3 0.134793593 1
+4 0.000329562 32
+3 0.167385993 1
+4 0.000319999 32
+3 0.087692138 1
+4 0.000358351 32
+3 0.199660073 1
+4 0.000344751 33
+3 0.407927178 2
+4 0.000420648 36
+3 0.543366155 1
+4 0.000340478 17
+3 0.375853191 1
+4 0.000378380 18
+3 0.217433113 1
+4 0.000328987 17
+3 1.405781702 1
+4 0.000347724 4
+3 0.137652772 1
+4 0.000364203 4
+3 2.253770331 1
+4 0.000337139 17
+3 0.257778530 1
+4 0.000387409 17
+3 3.269870180 1
+4 0.000343585 17
+3 0.271446679 1
+3 0.095813564 1
+4 0.000386545 28
+3 0.359667828 1
+4 0.000342076 18
+3 0.143686060 1
+4 0.000393273 18
+3 0.095738892 1
+4 0.000330771 19
+3 6.037626129 1
+4 0.110016314 38
+3 23.541898745 1
+4 0.000366452 17
+3 0.094576810 1
+4 0.000364105 18
+3 0.439953748 1
+4 0.000334744 17
+3 0.143475210 1
+4 0.000412452 17
+3 0.499995276 1
+4 0.000361066 18
+3 0.083070390 1
+4 0.000359463 17
+3 0.083581776 1
+4 0.000306816 17
+3 0.083458877 1
+4 0.000343769 18
+3 0.082669993 1
+4 0.000315571 17
+3 0.083198248 1
+4 0.000384370 17
+3 0.083694700 1
+4 0.000314496 18
+3 0.082887020 1
+4 0.000375129 17
+3 0.083594365 1
+4 0.000312188 17
+3 20.247243326 1
+4 0.000431676 23
+3 0.239385283 1
+4 0.000340447 23
+3 0.399672296 1
+4 0.000362638 24
+3 0.295931090 1
+4 0.000348452 19
+3 0.359425905 2
+4 0.000382605 36
+3 0.154451375 1
+4 0.000362061 19
+3 0.148799278 1
+4 0.000368235 20
+3 0.279663320 1
+4 0.000353554 24
+3 0.295672037 1
+4 0.000346773 19
+3 0.623692871 2
+4 0.000390137 10
+3 0.167677853 1
+4 0.000353614 1
+3 0.135699710 1
+4 0.000381724 1
+4 0.000311595 71
+3 35.888691525 1
+4 0.000380571 39
+3 5.423523165 1
+4 0.000341236 17
+3 0.217798218 1
+4 0.000344187 19
+3 0.397690449 1
+4 0.000366442 20
+3 2.513732807 1
+4 0.000387679 17
+3 0.197384328 1
+4 0.000331356 19
+3 0.335674728 1
+4 0.000339958 20
+3 0.185593608 1
+4 0.000311937 17
+3 1.334051578 1
+3 0.359853017 1
+3 0.155216835 1
+4 0.000430781 184
+3 0.140258689 1
+4 0.000335231 41
+3 0.169686067 1
+4 0.000345717 16
+3 0.157818890 1
+4 0.000347461 16
+3 0.303708008 1
+4 0.000444404 233
+3 4.759801138 1
+4 0.000363526 41
+3 0.499823451 1
+4 0.000347010 16
+3 0.083712879 1
+4 0.000317597 16
+3 0.082796797 1
+4 0.000326708 16
+3 0.083007561 1
+4 0.000341557 16
+3 0.083728222 1
+4 0.000327262 16
+3 0.082587059 1
+4 0.000378164 18
+3 0.082926527 1
+4 0.000327341 16
+3 1.312661937 1
+4 0.000398033 17
+3 0.709613047 1
+4 0.000346253 17
+3 0.169590463 1
+4 0.000412545 16
+3 0.421534122 1
+4 0.000403937 15
+3 0.991714169 1
+4 0.000427131 13
+3 0.241399307 1
+4 0.000356090 17
+3 0.453824047 1
+4 0.000379495 18
+3 0.320876867 1
+4 0.000359400 21
+3 0.782515366 1
+4 0.000389596 17
+3 0.217394721 1
+4 0.000363849 16
+3 3.470053717 1
+4 0.000447022 15
+3 0.345406299 1
+4 0.000347561 9
+3 24.583114102 1
+4 0.000394154 24
+3 0.286974944 1
+4 0.000370130 25
+3 0.135644134 1
+4 0.000373238 26
+3 0.263746811 1
+4 0.000351969 28
+3 0.145520398 1
+4 0.000370469 30
+3 0.093587014 1
+4 0.000329265 29
+3 0.055637504 1
+4 0.000358894 28
+3 0.079593004 1
+4 0.000356934 28
+3 0.175807494 1
+4 0.000369155 28
+3 0.335557147 2
+4 0.000401615 24
+3 0.169616376 1
+4 0.000346995 17
+3 0.365655153 1
+3 0.079819032 1
+4 0.000359693 4
+3 0.351689460 1
+3 0.088197773 1
+4 0.000344617 28
+3 0.111462078 1
+4 0.000376654 18
+3 0.664739248 1
+4 0.110064490 37
+3 3.473586517 1
+4 0.000625635 794
+3 1.015071437 1
+4 0.000386082 34
+3 0.499932551 1
+4 0.000430947 92
+3 0.082826258 1
+4 0.000386639 96
+3 0.082746645 1
+4 0.000372811 93
+3 0.083326197 1
+4 0.000379790 44
+3 0.083016049 1
+4 0.000432717 34
+3 0.083078196 1
+4 0.000361275 76
+3 9.652630453 1
+4 0.000418614 115
+3 0.497876596 1
+4 0.000388240 132
+3 0.082670210 1
+4 0.000418183 44
+3 0.082847437 1
+4 0.000361215 115
+3 0.083045506 1
+4 0.000420881 132
+3 0.083327586 1
+4 0.000358546 44
+3 0.173799235 1
+4 0.000399280 16
+3 0.500016895 1
+4 0.000351978 16
+3 0.082774164 1
+4 0.000347894 16
+3 0.083041816 1
+4 0.000321530 16
+3 0.083247592 1
+4 0.000333520 16
+3 0.083307658 1
+4 0.000353112 16
+3 0.083097481 1
+4 0.000378219 18
+3 0.586188721 1
+4 0.000361755 9
+3 0.135471484 1
+4 0.000324248 1
+3 0.103678962 1
+4 0.000339098 1
+4 0.000603521 69
+3 1.103030135 1
+4 0.000396260 37
+3 0.169851746 1
+4 0.000331487 16
+3 6.261932030 1
+4 0.000339833 16
+3 0.265472283 1
+4 0.000313612 18
+3 0.381799465 1
+4 0.000334484 18
+3 0.951572234 1
+4 0.000348900 17
+3 1.735823832 1
+4 0.000404114 17
+3 0.201548379 1
+4 0.000334137 19
+3 0.197764185 1
+4 0.000410260 18
+3 0.177546445 1
+4 0.000371907 20
+3 2.429781261 1
+4 0.000610228 797
+3 0.879438495 1
+4 0.000585346 869
+3 10.951858610 1
+4 0.000440909 15
+3 10.799940923 1
+4 0.000341886 10
+3 0.303350678 1
+4 0.000343017 1
+3 0.167643177 1
+4 0.000374399 1
+3 0.175754245 1
+4 0.000347929 1
+3 0.647646181 1
+4 0.000353274 1
+3 0.175767904 1
+4 0.000379161 1
+3 0.271525075 1
+4 0.000347821 38
+3 1.639717397 1
+4 0.000588717 732
+3 3.839532834 1
+4 0.000340486 10
+3 0.087734228 1
+4 0.000652134 783
+3 3.535513042 1
+4 0.000356527 19
+3 0.500583414 1
+4 0.000399680 17
+3 0.083518452 1
+4 0.000321724 21
+3 0.083699460 1
+4 0.000391997 20
+3 0.082616070 1
+4 0.000323285 20
+3 0.083314663 1
+4 0.000339676 19
+3 0.083051219 1
+4 0.000339791 16
+3 0.083546343 1
+4 0.000381123 20
+3 0.083323899 1
+4 0.000324578 20
+3 0.082941783 1
+4 0.000349620 17
+3 0.082666144 1
+4 0.000313653 19
+3 0.082949171 1
+4 0.000384689 34
+3 0.083319014 1
+4 0.000363061 76
+3 0.084397062 1
+4 0.000456607 118
+3 0.082312231 1
+4 0.000361616 133
+3 1.734451501 1
+4 0.000426216 47
+3 0.381438416 1
+4 0.000343299 20
+3 0.455708441 1
+3 0.122319633 1
+4 0.000364578 29
+3 0.245415055 1
+4 0.000343142 39
+3 0.500119816 1
+4 0.000342403 19
+3 0.083415591 1
+4 0.000325276 15
+3 0.083065498 1
+4 0.000321760 18
+3 0.083456733 1
+4 0.000371619 20
+3 0.083754254 1
+4 0.000325312 17
+3 0.082940409 1
+4 0.000332374 20
+3 0.082932899 1
+4 0.000312083 18
+3 0.083389380 1
+4 0.000315540 18
+3 0.083010926 1
+4 0.000317392 20
+3 0.082698803 1
+4 0.000315490 20
+3 0.083225849 1
+4 0.000330847 19
+3 0.082970489 1
+4 0.000337374 19
+3 0.083452587 1
+4 0.000341626 17
+3 0.083398248 1
+4 0.000383430 19
+3 0.573224781 1
+4 0.000391364 109
+3 0.871546645 1
+4 0.000360210 17
+3 0.577727169 1
+4 0.000331132 16
+3 0.229592433 1
+4 0.000362804 16
+3 1.057743977 1
+4 0.000350083 17
+3 1.765762623 1
+4 0.000428124 16
+3 1.383694692 1
+4 0.000358331 17
+3 0.297640829 1
+4 0.000327893 16
+3 4.910395239 1
+4 0.000406035 31
+3 1.397314945 21
+4 0.000359083 37
+3 1.609793354 1
+4 0.000384455 17
+3 1.696416598 1
+4 0.109980578 35
+3 13.121523751 1
+4 0.000366600 16
+3 0.809510869 1
+4 0.000352286 19
+3 0.317591826 1
+4 0.000394635 16
+3 0.143487508 1
+4 0.000321175 15
+3 0.217761934 1
+4 0.000319186 17
+3 0.149758961 1
+4 0.000324585 17
+3 0.161655829 1
+4 0.000324805 16
+3 0.325490170 1
+4 0.000367580 16
+3 0.391654555 1
+4 0.000365332 4
+3 0.159725048 1
+4 0.000383846 16
+3 0.161781642 1
+4 0.000363862 16
+3 0.133365775 1
+4 0.000316864 16
+3 0.113801837 1
+4 0.000380328 16
+3 0.117553141 1
+4 0.000313111 16
+3 0.145746732 1
+4 0.000370316 16
+3 0.301631901 1
+4 0.000324591 4
+3 0.223737158 1
+4 0.000420746 16
+3 0.295476548 1
+4 0.000341334 16
+3 0.767843686 1
+4 0.000394438 16
+3 0.695710039 1
+4 0.000332074 16
+3 0.471539808 1
+4 0.000386183 16
+3 0.495629753 1
+4 0.000364721 16
+3 0.169471254 1
+4 0.000395600 17
+3 0.157824880 1
+4 0.000343854 16
+3 0.439781914 1
+4 0.000356489 16
+3 0.111383855 1
+4 0.000325492 4
+3 0.185756624 1
+4 0.000356705 4
+3 0.117635696 1
+4 0.000335667 6
+3 0.151711751 1
+4 0.000414281 23
+3 0.231635316 1
+4 0.000328243 24
+3 0.087619785 1
+4 0.000356361 24
+3 0.223603835 1
+4 0.000338573 24
+3 0.479888257 1
+4 0.000351910 16
+3 0.071516472 1
+4 0.000333981 17
+3 0.167572694 1
+4 0.000344816 25
+3 0.103655085 1
+4 0.000349044 24
+3 0.031695949 1
+4 0.000326415 24
+3 0.774499266 1
+4 0.110011972 32
+3 0.035262855 1
+4 0.000332976 30
+3 0.168385201 1
+4 0.000354280 24
+3 0.494758039 2
+4 0.000380367 33
+3 0.303743033 1
+3 0.139108924 1
+4 0.000390353 47
+3 8.332910848 1
+4 0.000343885 10
+3 0.143572664 1
+4 0.000304229 1
+3 0.071928794 1
+4 0.000353615 1
+4 0.000389971 70
+3 4.743276758 1
+4 0.000417445 36
+3 0.499719386 1
+4 0.000360638 17
+3 0.083358699 1
+4 0.000352661 20
+3 0.082721814 1
+4 0.000313192 17
+3 3.870979071 1
+4 0.000383594 17
+3 0.498026409 1
+4 0.000375845 19
+3 0.083003383 1
+4 0.000386986 17
+3 0.083129783 1
+4 0.000326125 20
+3 0.083434987 1
+4 0.000323584 17
+3 0.084191069 1
+4 0.000320855 17
+3 0.081883819 1
+4 0.000322254 19
+3 0.083758626 1
+4 0.000327114 16
+3 0.084057046 1
+4 0.000392717 21
+3 0.082125748 1
+4 0.000322579 17
+3 0.083188434 1
+4 0.000311301 17
+3 0.084080430 1
+4 0.000373902 19
+3 0.082827532 1
+4 0.000358945 119
+3 0.083087590 1
+4 0.000373025 133
+3 0.083085520 1
+4 0.000383822 47
+3 0.082890926 1
+4 0.000432347 34
+3 0.083149409 1
+4 0.000365709 74
+3 0.083323885 1
+4 0.000360498 72
+3 0.082904465 1
+4 0.000363469 92
+3 0.083277200 1
+4 0.000353641 47
+3 0.083035549 1
+4 0.000364001 34
+3 0.083024694 1
+4 0.000354147 85
+3 0.436548943 1
+4 0.000391764 17
+3 0.501119745 1
+4 0.000334290 18
+3 0.082300439 1
+4 0.000338687 20
+3 0.083169014 1
+4 0.000322771 18
+3 0.082941715 1
+4 0.000309774 17
+3 0.083080152 1
+4 0.000331539 17
+3 0.083061608 1
+4 0.000316191 18
+3 0.083320427 1
+4 0.000363945 20
+3 0.254308068 1
+4 0.000313941 19
+3 0.392092048 1
+4 0.000561957 754
+3 4.767660373 1
+4 0.000562641 699
+3 1.224209205 1
+4 0.000584624 755
+3 1.086712767 1
+4 0.000554301 858
+3 173.398125109 1
+4 0.000597114 751
+3 3.710424528 1
+4 0.000434863 92
+3 0.499993413 1
+4 0.000383464 96
+3 0.084353418 1
+4 0.000379985 93
+3 0.082259439 1
+4 0.000359586 44
+3 0.083467923 1
+4 0.000352713 34
+3 0.082973101 1
+4 0.000356854 76
+3 0.083846608 1
+4 0.000371618 115
+3 25.122087962 1
+4 0.000567705 880
+3 7.942980934 1
+4 0.000356889 15
+3 0.500276063 1
+4 0.000385987 15
+3 0.083330134 1
+4 0.000317600 15
+3 0.082887076 1
+4 0.000314367 15
+3 0.083197735 1
+4 0.000324356 15
+3 0.083567058 1
+4 0.000337583 15
+3 0.082868538 1
+4 0.000310929 17
+3 0.083759940 1
+4 0.000324532 18
+3 0.082131535 1
+4 0.000349180 16
+3 0.083376306 1
+4 0.000311864 17
+3 0.083677997 1
+4 0.000324080 16
+3 0.083654014 1
+4 0.000313726 16
+3 0.083737061 1
+4 0.000314814 18
+3 0.082964153 1
+4 0.000336715 16
+3 0.082726858 1
+4 0.000312325 16
+3 0.083101948 1
+4 0.000348739 16
+3 0.083329035 1
+4 0.000320928 16
+3 0.083216977 1
+4 0.000319246 18
+3 0.082672314 1
+4 0.000307806 16
+3 0.084325873 1
+4 0.000348140 17
+3 0.082422366 1
+4 0.000363604 44
+3 0.083049231 1
+4 0.000363395 97
+3 0.082753897 1
+4 0.000393840 91
+3 0.083559486 1
+4 0.000386767 44
+3 0.082939324 1
+4 0.000373976 95
+3 0.082706022 1
+4 0.000386850 92
+3 0.083500496 1
+4 0.000358572 44
+3 0.885104924 1
+4 0.000421535 34
+3 39.951501347 1
+4 0.000583653 755
+3 0.926849683 1
+4 0.000617545 735
+3 0.559514961 1
+4 0.000566334 818
+3 0.959282192 1
+4 0.000479931 72
+3 0.499546453 1
+4 0.000396574 62
+3 0.083434377 1
+4 0.000398163 37
+3 40.722109863 1
+4 0.000577903 859
+3 1.430611693 1
+4 0.000391510 15
+3 0.500163171 1
+4 0.000337607 15
+3 0.083759610 1
+4 0.000359738 17
+3 0.082655315 1
+4 0.000343770 17
+3 0.082732761 1
+4 0.000335851 15
+3 0.082743430 1
+4 0.000319388 16
+3 0.083822318 1
+4 0.000352233 15
+3 0.083089759 1
+4 0.000321641 17
+3 0.082825352 1
+4 0.000349164 18
+3 0.083791797 1
+4 0.000325299 16
+3 0.083068212 1
+4 0.000370780 16
+3 0.083765591 1
+4 0.000323828 16
+3 0.082813122 1
+4 0.000339110 16
+3 0.083608168 1
+4 0.000322280 18
+3 0.083010845 1
+4 0.000341757 16
+3 9.471316892 1
+4 0.000343512 17
+3 0.498328117 1
+4 0.000368632 16
+3 0.083500772 1
+4 0.000364604 16
+3 0.083649960 1
+4 0.000343547 16
+3 0.083296348 1
+4 0.000348931 16
+3 0.084231077 1
+4 0.000367471 16
+3 0.081395597 1
+4 0.000362010 92
+3 0.083224218 1
+4 0.000388863 44
+3 0.083188442 1
+4 0.000366450 34
+3 0.083088798 1
+4 0.000405215 93
+3 15.687256348 1
+4 0.000365620 16
+3 0.499769431 1
+4 0.000377466 18
+3 0.082966183 1
+4 0.000326121 16
+3 0.083061395 1
+4 0.000345310 16
+3 0.082797922 1
+4 0.000323222 16
+3 0.083003183 1
+4 0.000322430 16
+3 0.083640542 1
+4 0.000343474 16
+3 0.082662134 1
+4 0.000329010 16
+3 0.083433826 1
+4 0.000326679 16
+3 0.717295792 1
+4 0.000362489 17
+3 9.246256414 1
+3 0.121762406 1
+4 0.000372802 29
+3 0.261669317 1
+4 0.000374347 103
+3 0.471606299 1
+4 0.000349599 18
+3 0.177723317 1
+4 0.000320525 18
+3 0.149531376 1
+4 0.000317570 17
+3 0.145788692 1
+4 0.000327977 17
+3 0.261597392 1
+4 0.000354466 18
+3 0.360741810 1
+4 0.000357309 17
+3 0.200460328 1
+4 0.000321081 17
+3 0.149905846 1
+4 0.000357241 17
+3 6.279812516 1
+4 0.000353334 4
+3 0.599555710 1
+4 0.000335743 17
+3 0.127714321 1
+3 0.080017049 1
+4 0.000382513 28
+3 0.639577091 1
+4 0.000358401 18
+3 0.767003151 1
+4 0.109989259 37
+3 0.187151499 1
+4 0.000346591 40
+3 0.287392683 1
+4 0.000385092 40
+3 0.343723079 2
+4 0.000368831 33
+3 0.463491583 1
+4 0.000435988 59
+3 0.327520206 1
+4 0.000348395 18
+3 4.636741822 7
+4 0.000401747 25
+3 0.339403889 1
+4 0.000331128 17
+3 33.096554304 2
+4 0.000410601 36
+7 0.000507670 TSTP
+7 33.592008232 CONT
+4 0.000786179 7
+4 0.000280514 799
+3 2.606784744 1
+4 0.000379428 31
+3 4.594248745 20
+4 0.000361507 37
+3 0.325405936 1
+4 0.000357059 17
+3 7.476120404 34
+4 0.000555940 52
+3 0.325399978 1
+4 0.000542024 17
+3 4.543750298 34
+4 0.000453705 98
+3 4.538399418 1
+3 0.034736034 1
+4 0.000347439 9
+3 0.111485082 1
+4 0.000389472 1
+3 0.191836691 1
+4 0.000349003 43
+3 0.623558211 1
+4 0.000440117 33
+3 0.143477527 1
+4 0.000352203 17
+3 0.231866390 1
+4 0.000362754 18
+3 0.159597752 1
+4 0.000336335 18
+3 0.167693314 1
+4 0.000347364 19
+3 0.207554391 1
+4 0.000341936 15
+3 0.343822076 1
+4 0.000344344 16
+3 0.215594862 1
+4 0.000368821 17
+3 0.135544701 1
+4 0.000334504 17
+3 0.047720903 1
+4 0.000328578 17
+3 0.183610492 1
+4 0.000331143 17
+3 0.271651176 1
+4 0.000376779 17
+3 0.503763620 2
+4 0.000394028 36
+3 37.745595101 1
+4 0.000349121 19
+3 0.217034267 1
+4 0.000399334 20
+3 0.205427082 1
+4 0.000354892 16
+3 1.065863721 1
+4 0.000425449 19
+3 0.533513377 1
+4 0.000380448 20
+3 0.567672251 1
+3 0.130101959 1
+4 0.000424973 29
+3 0.269547621 1
+4 0.000352307 41
+3 0.161465729 1
+4 0.000365436 20
+3 0.149596147 1
+4 0.000333491 20
+3 0.153692873 1
+4 0.000313810 15
+3 0.133632562 1
+4 0.000321132 20
+3 0.311801949 1
+4 0.000361249 104
+3 0.639725752 1
+3 0.135963947 1
+4 0.000352421 84
+3 0.311597013 1
+3 0.064147385 1
+4 0.000357800 29
+3 1.630121451 7
+4 0.000369118 25
+3 0.313043225 2
+4 0.000350825 37
+3 0.255962410 1
+3 0.047636991 1
+4 0.000408675 6
+3 1.608788858 1
+4 0.000456490 18
+3 1.238824509 1
+4 0.000384430 25
+3 4.331991931 36
+4 0.000410721 95
+3 0.971262804 1
+3 0.079976027 1
+4 0.000361427 28
+3 0.287589060 1
+4 0.000339987 19
+3 2.168861266 4
+4 0.000371567 28
+3 1.252918183 5
+4 0.000370132 23
+3 0.699263778 1
+4 0.110142043 33
+3 0.199951622 1
+4 0.000324229 22
+3 0.145600189 1
+4 0.000345335 20
+3 0.149617621 1
+4 0.000318206 16
+3 0.153737423 1
+4 0.000312236 19
+3 0.133659447 1
+4 0.000325207 20
+3 0.129660650 1
+4 0.000317376 20
+3 0.133666439 1
+4 0.000389246 47
+3 0.161655933 1
+4 0.000362612 99
+3 0.117684704 1
+4 0.000437356 94
+3 0.177589087 1
+4 0.000369371 47
+3 0.285712479 1
+4 0.000324828 20
+3 0.360734950 1
+3 0.112810885 1
+4 0.000351088 29
+3 0.245748660 1
+4 0.000356700 43
+3 0.153487510 1
+4 0.000317802 19
+3 0.157776976 1
+4 0.000397700 20
+3 0.161456001 1
+4 0.000324479 20
+3 0.141774119 1
+4 0.000336573 19
+3 0.153774037 1
+4 0.000386267 20
+3 0.141530271 1
+4 0.000359167 20
+3 0.153608292 1
+4 0.000322263 19
+3 0.333868354 1
+4 0.000409765 20
+3 0.311476384 1
+4 0.000372037 100
+3 2.152494115 1
+3 0.079338693 1
+4 0.000362088 29
+3 0.315948467 7
+4 0.000515412 67
+3 0.323213155 2
+4 0.000377947 33
+3 0.535531343 1
+3 0.047994706 1
+4 0.000354636 6
+3 2.440374530 1
+4 0.000373870 24
+3 3.805683567 39
+4 0.000449189 135
+3 1.001622387 1
+4 0.000369665 62
+3 0.479049305 2
+4 0.000365282 34
+3 0.143687740 1
+4 0.000360857 24
+3 0.159547482 1
+4 0.000343495 19
+3 1.880106562 9
+4 0.000356396 33
+3 0.627014310 1
+4 0.110003044 33
+3 13.303015767 1
+4 0.000429375 17
+3 0.193335351 1
+4 0.000328035 21
+3 0.485715287 1
+4 0.000337050 22
+3 9.129944515 1
+4 0.000391862 17
+3 0.498215899 1
+4 0.000338218 22
+3 0.082904375 1
+4 0.000355741 20
+3 0.082657933 1
+4 0.000328584 16
+3 0.084061572 1
+4 0.000314004 19
+3 0.082824895 1
+4 0.000324312 20
+3 0.083443491 1
+4 0.000334772 20
+3 0.082809770 1
+4 0.000334535 19
+3 0.082798218 1
+4 0.000313383 21
+3 0.243187561 1
+4 0.000365955 20
+3 0.500230870 1
+4 0.000341683 20
+3 0.083274854 1
+4 0.000325193 20
+3 0.082818560 1
+4 0.000308637 19
+3 0.083960978 1
+4 0.000333325 20
+3 0.426000229 1
+4 0.000336973 20
+3 0.213830366 1
+3 0.500687773 1
+4 0.000446693 97
+3 0.082796026 1
+3 0.083635363 1
+4 0.000355972 48
+3 0.082901407 1
+3 0.084268407 1
+4 0.000398718 30
+3 0.082863130 1
+3 0.083385320 1
+4 0.000346105 97
+3 0.083059996 1
+3 0.083058962 1
+4 0.000381019 89
+3 0.083075946 1
+3 0.206334017 1
+4 0.000373633 91
+3 0.181859768 1
+3 0.169812993 1
+4 0.000375620 49
+3 0.165644564 1
+3 0.185971061 1
+4 0.000363444 92
+3 0.165789845 1
+3 0.385925308 1
+4 0.000391649 101
+3 0.365499576 1
+4 0.000350679 18
+3 0.500122316 1
+4 0.000344882 16
+3 0.082779027 1
+4 0.000333228 16
+3 0.082804862 1
+4 0.000310371 16
+3 0.082768243 1
+4 0.000428173 16
+3 0.083085458 1
+4 0.000322093 17
+3 0.082817450 1
+4 0.000373640 44
+3 0.082831867 1
+4 0.000374277 34
+3 0.083265891 1
+4 0.000400726 54
+3 0.082799250 1
+4 0.000359395 71
+3 0.083042042 1
+4 0.000421075 112
+3 0.205828346 1
+4 0.000350861 16
+3 0.500128122 1
+4 0.000374088 16
+3 0.082996870 1
+4 0.000316414 16
+3 0.083574926 1
+4 0.000330608 18
+3 0.083434733 1
+4 0.000319073 16
+3 0.082945777 1
+4 0.000327451 17
+3 0.083062480 1
+4 0.000326098 16
+3 12.468055977 1
+4 0.000403075 16
+3 0.229340834 1
+4 0.000334437 16
+3 0.170011338 1
+4 0.000350252 16
+3 305.080853416 1
+4 0.000357297 16
+3 0.499712144 1
+4 0.000390246 16
+3 0.082811528 1
+4 0.000342959 16
+3 0.082280939 1
+4 0.000605643 16
+3 0.083090027 1
+4 0.000350823 17
+3 0.082792526 1
+4 0.000353048 16
+3 0.082663170 1
+4 0.000369943 16
+3 0.083655848 1
+4 0.000418055 18
+3 0.083146383 1
+4 0.000405476 16
+3 0.082986955 1
+4 0.000338767 16
+3 0.083275055 1
+4 0.000521216 58
+3 0.082562989 1
+4 0.000640961 34
+3 0.083339019 1
+4 0.000398237 61
+3 0.082783475 1
+4 0.000397557 63
+3 0.185961846 1
+4 0.000350742 16
+3 0.153606324 1
+4 0.000351134 16
+3 0.150396884 1
+4 0.000351210 18
+3 0.136918460 1
+4 0.000371616 16
+3 0.117674373 1
+4 0.000356828 16
+3 0.145572057 1
+4 0.000367855 16
+3 0.309608021 1
+4 0.000435564 32
+3 0.080303026 1
+4 0.000348265 18
+3 0.167081174 1
+4 0.000362195 18
+3 0.287604394 1
+4 0.000365589 18
+3 0.119596079 1
+4 0.000332452 17
+3 0.423673342 1
+4 0.000366852 18
+3 0.160327894 1
+4 0.000360262 18
+3 0.158978615 1
+4 0.000364156 18
+3 0.575597191 1
+4 0.000344260 17
+3 0.111804373 1
+4 0.000347689 18
+3 0.439457400 2
+4 0.000358797 31
+3 0.281796283 1
+4 0.000352656 17
+3 0.357515641 1
+4 0.000370017 21
+3 0.559558022 1
+4 0.000448963 31
+3 0.079815133 1
+4 0.000348358 18
+3 0.591688138 2
+4 0.000374344 32
+3 0.327539528 1
+4 0.000330647 9
+3 0.143633680 1
+4 0.000590716 1
+3 0.087503013 1
+4 0.000756019 11
+4 0.000400148 61
+3 31.448295918 1
+4 0.000629257 883
+3 5.111258039 1
+4 0.000351808 17
+3 0.499703034 1
+4 0.000400652 18
+3 0.082635319 1
+4 0.000540967 17
+3 0.082868149 1
+4 0.000494295 17
+3 0.082901520 1
+4 0.000313138 18
+3 0.083421936 1
+4 0.000373402 20
+3 0.083218793 1
+4 0.000328879 17
+3 0.083214530 1
+4 0.000346025 17
+3 0.082578627 1
+4 0.000346003 18
+3 8.150269658 1
+4 0.000363903 18
+3 0.213378491 1
+4 0.000461823 20
+3 0.186770439 1
+4 0.000581424 18
+3 0.164286182 1
+4 0.000380816 16
+3 4.903982535 1
+4 0.000367656 17
+3 0.153510666 1
+4 0.000341938 18
+3 0.149697119 1
+4 0.000343747 19
+3 0.211556218 1
+4 0.000342054 17
+3 0.195592296 1
+4 0.000378550 20
+3 0.463600866 1
+3 0.106134844 1
+4 0.000357633 30
+3 0.261639119 1
+4 0.000384154 36
+3 0.145573011 1
+4 0.000357779 18
+3 0.677693415 1
+4 0.000439066 20
+3 0.145508251 1
+4 0.000342164 18
+3 0.149604994 1
+4 0.000364306 16
+3 0.161842107 1
+4 0.000355461 18
+3 0.221457848 1
+4 0.000361987 17
+3 0.311692567 1
+4 0.000369625 22
+3 0.879888862 1
+4 0.000711855 830
+3 1.271520325 1
+4 0.000610571 862
+3 1.279280274 1
+4 0.000383892 18
+3 0.499390638 1
+4 0.000348084 18
+3 0.083076480 1
+4 0.000413453 18
+3 0.083421410 1
+4 0.000354474 18
+3 0.082785003 1
+4 0.000367550 18
+3 0.082898553 1
+4 0.000341109 17
+3 0.083529978 1
+4 0.000385285 19
+3 0.083015081 1
+4 0.000339409 20
+3 0.082823787 1
+4 0.000429733 21
+3 0.083276952 1
+4 0.000352359 19
+3 0.083412063 1
+4 0.000367975 17
+3 0.082673286 1
+4 0.000343524 20
+3 0.721130396 1
+3 0.154070246 1
+4 0.000379984 84
+3 0.229604850 1
+3 0.170532585 1
+4 0.000436692 117
+3 0.285020611 1
+3 0.170262550 1
+4 0.000389631 74
+3 0.197440319 1
+3 0.121861653 1
+4 0.000376338 46
+3 0.197838152 1
+3 0.113796320 1
+4 0.000378746 39
+3 0.349874483 1
+4 0.000398965 10
+3 0.199647430 1
+4 0.000331110 1
+3 0.071427202 1
+4 0.000348580 1
+4 0.000415405 70
+3 2.887476526 1
+4 0.000583736 861
+3 5.975968449 1
+4 0.000599183 878
+3 1.639218505 1
+4 0.000676829 840
+3 18.640117849 1
+4 0.000708879 878
+3 1.351029379 1
+4 0.000338065 18
+3 0.551726408 1
+4 0.000638251 708
+3 1.592390050 1
+4 0.000614038 17
+3 0.499281201 1
+4 0.000361723 18
+3 0.082802459 1
+4 0.000331499 15
+3 0.082807536 1
+4 0.000364739 15
+3 0.083525030 1
+4 0.000333271 15
+3 0.083423790 1
+4 0.000431876 15
+3 0.082820704 1
+4 0.000334049 15
+3 0.083016323 1
+4 0.000374775 15
+3 0.083125769 1
+4 0.000453713 17
+3 0.082969191 1
+4 0.000428278 18
+3 0.083106971 1
+4 0.000319947 16
+3 1.419992144 1
+4 0.000550351 570
+3 1.263381917 1
+4 0.000390523 76
+3 0.185466776 1
+4 0.000397981 65
+3 0.173625432 1
+4 0.000416718 36
+3 0.519672264 1
+4 0.000353401 17
+3 0.177834237 1
+4 0.000342628 15
+3 8.141768786 1
+4 0.000534125 663
+3 2.503599942 1
+4 0.000580856 741
+3 0.711629519 1
+4 0.000690980 716
+3 0.591114578 1
+4 0.000781048 597
+3 0.487249694 1
+4 0.000577707 733
+3 3.063293774 1
+4 0.000333000 16
+3 0.500323845 1
+4 0.000417908 18
+3 0.082467932 1
+4 0.000337739 16
+3 0.082923122 1
+4 0.000454304 16
+3 0.082945644 1
+4 0.000330324 18
+3 0.083710325 1
+4 0.000365034 16
+3 0.083364206 1
+4 0.000433299 17
+3 0.083042008 1
+4 0.000342279 16
+3 0.083093016 1
+4 0.000400053 17
+3 0.082978936 1
+4 0.000351761 18
+3 2.063541504 1
+4 0.000395230 54
+3 0.287753625 1
+4 0.000378037 38
+3 0.359454900 1
+4 0.000361308 19
+3 0.111878081 1
+4 0.000458391 17
+3 3.319525627 1
+4 0.000335753 18
+3 0.223942086 1
+4 0.000385710 18
+3 0.127326902 1
+4 0.000334250 18
+3 0.135655063 1
+4 0.000365659 17
+3 0.479710733 1
+4 0.000346918 17
+3 2.327788491 1
+4 0.000347750 18
+3 0.175614082 1
+4 0.000383315 18
+3 0.119598238 1
+4 0.000337943 18
+3 0.071602147 1
+4 0.000395307 18
+3 0.328027592 1
+4 0.000367378 18
+3 0.119221737 1
+4 0.000337344 18
+3 0.129844131 1
+4 0.000343188 18
+3 0.109624618 1
+4 0.000334550 18
+3 0.239511917 1
+4 0.000385675 19
+3 0.191870639 1
+4 0.000452720 18
+3 0.351475579 1
+4 0.000440246 17
+3 0.121703509 1
+4 0.000364897 18
+3 0.093347207 1
+4 0.000344195 19
+3 0.135668364 1
+4 0.000341657 17
+3 0.248582905 1
+4 0.000347392 18
+3 0.007185995 1
+4 0.000356981 18
+3 0.839249703 1
+4 0.000482206 17
+3 0.139523516 1
+4 0.000378338 17
+3 0.115728849 1
+4 0.000341072 18
+3 0.087463961 1
+4 0.000341446 18
+3 0.103741610 1
+4 0.000467615 17
+3 1.031668138 1
+4 0.000373832 18
+3 0.111444149 1
+4 0.000341171 18
+3 0.135576625 1
+4 0.000360623 18
+3 0.095768198 1
+4 0.000389785 18
+3 0.071643746 1
+4 0.000382010 17
+3 0.111541595 1
+4 0.000337322 19
+3 0.119745737 1
+4 0.000367651 18
+3 0.152010598 1
+4 0.000336790 18
+3 0.071249469 1
+4 0.000355612 18
+3 0.111595064 1
+4 0.000347300 18
+3 0.127714645 1
+4 0.000395856 18
+3 0.167639654 1
+4 0.000350440 18
+3 0.175765275 1
+4 0.000433003 18
+3 0.759538185 1
+4 0.000359089 18
+3 0.709730548 1
+4 0.109927658 33
+3 4.268095613 1
+4 0.000426077 61
+3 14.006783454 53
+4 0.000444446 71
+3 0.936872940 2
+3 0.151954890 1
+4 0.000383324 39
+3 0.471870533 1
+4 0.000369988 22
+3 1.175527431 1
+4 0.000429277 62
+3 0.239737011 1
+4 0.000341658 40
+3 0.439415420 2
+4 0.000383170 33
+3 0.175640302 1
+4 0.000349671 18
+3 0.169845963 1
+4 0.000433399 18
+3 0.197402764 1
+4 0.000346099 17
+3 0.161737299 1
+4 0.000359958 17
+3 0.157603293 1
+4 0.000746578 18
+3 0.185302491 1
+4 0.000515689 17
+3 0.293429490 1
+4 0.000369115 17
+3 51.473362785 2
+4 0.000339224 18
+3 0.320202308 1
+4 0.000376746 61
+3 0.935101651 2
+4 0.000353311 9
+3 0.111679022 1
+4 0.000316888 1
+3 0.167660090 1
+4 0.000323413 1
+3 0.191624800 1
+4 0.000319812 1
+3 0.031835341 1
+4 0.000373940 1
+3 0.127624294 1
+4 0.000367299 1
+3 0.081461257 1
+4 0.000311281 1
+3 0.069641656 1
+4 0.000295870 1
+3 0.055794153 1
+4 0.000295469 1
+3 0.335808944 1
+4 0.000319378 1
+4 0.000324449 39
+3 0.223383309 1
+4 0.000385035 21
+3 0.220343199 339
+4 0.000652037 372
+4 0.000353694 167
+3 0.506204321 2
+4 0.000364502 32
+3 0.169938430 1
+4 0.000364254 47
+3 0.181399879 1
+4 0.000405858 34
+3 0.185574231 1
+4 0.000362139 57
+3 0.149529480 1
+4 0.000386950 18
+3 0.137724101 1
+4 0.000361077 18
+3 0.157610025 1
+4 0.000349608 20
+3 0.169682124 1
+4 0.000329677 12
+3 0.181623016 1
+4 0.000355865 18
+3 0.231693664 1
+4 0.000328066 15
+3 0.103674216 1
+4 0.000411816 17
+3 0.185557476 1
+4 0.000351002 17
+3 0.693724611 1
+3 0.063986470 1
+4 0.000414948 4
+3 3.599898900 1
+4 0.000366572 6
+3 0.487570874 1
+3 0.080006699 1
+4 0.000328093 5
+3 0.807685354 1
+4 0.000391036 25
+3 1.007602547 1
+4 0.000336740 17
+3 0.495687132 1
+4 0.000388623 4
+3 0.377692091 1
+4 0.000381859 4
+3 0.197468637 1
+4 0.000381306 4
+3 0.177657772 1
+4 0.000334142 4
+3 0.149706863 1
+4 0.000371475 4
+3 0.161661316 1
+4 0.000329386 4
+3 1.093766694 1
+4 0.000420679 24
+3 4.439891434 10
+4 0.000348675 37
+3 0.352440612 1
+4 0.000403922 16
+3 0.446694400 1
+4 0.000401831 17
+3 0.479474969 1
+4 0.000375148 18
+3 0.503577308 1
+4 0.000339713 19
+3 0.151622771 1
+4 0.000390220 18
+3 0.119655893 1
+4 0.000327642 28
+3 0.095751225 1
+4 0.000334422 26
+3 0.271708489 1
+4 0.000401127 25
+3 1.479669755 1
+4 0.000379663 24
+3 0.111444615 1
+4 0.000347160 25
+3 0.007708330 1
+4 0.000390990 26
+3 0.223674227 1
+4 0.000327520 28
+3 0.143656115 1
+4 0.000344246 28
+3 0.095909278 1
+4 0.000319979 29
+3 0.127422801 1
+4 0.000406591 28
+3 0.359643369 1
+4 0.000333786 28
+3 0.327801354 1
+4 0.000378689 28
+3 0.063505708 1
+4 0.000332085 28
+3 0.111747253 1
+4 0.000337853 28
+3 0.127691320 1
+4 0.000319370 28
+3 0.079634322 1
+4 0.000373251 28
+3 0.896332843 1
+4 0.000359424 28
+3 3.653371335 12
+4 0.000369213 40
+3 0.593809187 1
+4 0.000376704 28
+3 5.631641259 12
+4 0.000391907 62
+3 2.632260317 1
+4 0.000363200 27
+3 1.094876417 1
+4 0.000392616 27
+3 0.047462202 1
+4 0.000323871 27
+3 0.223743446 1
+4 0.000385249 27
+3 0.103613398 1
+4 0.000329889 27
+3 0.063570291 1
+4 0.000363991 27
+3 0.055665091 1
+4 0.000321541 29
+3 0.119674787 1
+4 0.000339864 28
+3 1.071411539 1
+4 0.110001408 33
+3 1.122489595 1
+4 0.000350324 31
+3 0.207610556 1
+4 0.000360506 28
+3 0.271567088 1
+4 0.000338646 28
+3 0.151734822 1
+4 0.000371033 28
+3 0.103646643 1
+4 0.000337889 28
+3 0.055549958 1
+4 0.000331959 28
+3 0.071686557 1
+4 0.000324418 28
+3 0.153778079 1
+4 0.000318098 28
+3 0.719215427 1
+4 0.110062736 31
+3 0.152536689 1
+4 0.000325753 17
+3 0.727619168 1
+4 0.000368041 23
+3 6.023891164 1
+4 0.000336216 22
+3 0.095570673 1
+4 0.000318568 16
+3 0.499855446 1
+4 0.000353077 18
+3 0.082638388 1
+4 0.000326471 18
+3 0.082879773 1
+4 0.000315071 17
+3 0.083689718 1
+4 0.000333563 17
+3 0.083360147 1
+4 0.000393187 18
+3 0.083148721 1
+4 0.000322239 17
+3 0.083354258 1
+4 0.000329533 17
+3 0.082806829 1
+4 0.000339056 16
+3 0.629283940 1
+4 0.000340408 11
+3 0.389693443 1
+4 0.000353240 15
+3 0.265630733 1
+4 0.000321777 17
+3 0.181760862 1
+4 0.000380341 17
+3 0.500533616 1
+4 0.000338907 17
+3 0.082780232 1
+4 0.000308097 18
+3 0.083082240 1
+4 0.000322838 17
+3 0.082938916 1
+4 0.000311577 17
+3 0.609047833 1
+4 0.000360384 19
+3 0.281657639 1
+4 0.000341025 14
+3 0.253757988 1
+4 0.000368631 57
+3 0.215391235 1
+4 0.000331700 18
+3 0.177775992 1
+4 0.000330974 18
+3 0.173604257 1
+4 0.000320234 19
+3 0.500281398 1
+4 0.000333548 20
+3 0.083166069 1
+4 0.000351326 17
+3 0.083450551 1
+4 0.000328254 16
+3 0.083462620 1
+4 0.000342748 17
+3 0.083735805 1
+4 0.000319693 20
+3 0.082628406 1
+4 0.000308331 20
+3 0.083855967 1
+4 0.000324968 20
+3 0.082664905 1
+4 0.000308269 21
+3 0.243994363 1
+4 0.000439045 20
+3 0.197383047 1
+4 0.000357385 20
+3 1.168840173 1
+4 0.000444723 20
+3 0.184593663 1
+4 0.000330398 18
+3 0.141457719 1
+4 0.000338424 17
+3 0.161879283 1
+4 0.000319779 19
+3 0.253472046 1
+3 0.106079505 1
+4 0.000355040 29
+3 0.262307417 1
+4 0.000345156 40
+3 0.499552302 1
+4 0.000327899 17
+3 0.082863917 1
+4 0.000309780 20
+3 0.083328104 1
+4 0.000316051 20
+3 0.083075176 1
+4 0.000336459 21
+3 0.083178617 1
+4 0.000301976 20
+3 0.083526705 1
+4 0.000321293 20
+3 0.082815633 1
+4 0.000309968 20
+3 0.082956521 1
+4 0.000321659 17
+3 0.082694681 1
+4 0.000314372 20
+3 0.083698296 1
+4 0.000321880 16
+3 0.286269190 1
+4 0.000394631 17
+3 0.205612385 1
+4 0.000318983 19
+3 0.439725478 1
+4 0.000417959 92
+3 0.751637278 1
+4 0.000346364 40
+3 0.263542843 1
+4 0.000348710 94
+3 0.487682780 1
+4 0.000325684 18
+3 0.169702256 1
+4 0.000326697 17
+3 0.181639480 1
+4 0.000380232 17
+3 0.185691871 1
+4 0.000319615 18
+3 0.173642179 1
+4 0.000331672 15
+3 0.185625540 1
+4 0.000348856 9
+3 3.133919522 1
+3 0.087839815 1
+4 0.000409867 29
+3 0.479718852 1
+4 0.000363015 13
+3 0.096415306 1
+4 0.000357976 16
+3 0.190844518 1
+4 0.000336645 18
+3 0.071557006 1
+4 0.000339644 17
+3 0.079679438 1
+4 0.000345309 19
+3 0.623703198 2
+4 0.000436476 28
+3 0.457657334 1
+4 0.000341136 17
+3 0.277631894 1
+3 0.056041376 1
+4 0.000334450 5
+3 0.575568521 1
+4 0.000382138 6
+3 37.135276709 1
+4 0.109949460 1
+3 0.532250295 1
+4 0.000382436 17
+3 0.487109631 1
+4 0.000347002 17
+3 0.169619784 1
+4 0.000475929 17
+3 0.365596129 1
+4 0.000336175 17
+3 0.279601149 1
+3 0.055955606 1
+4 0.000368805 43
+3 0.215822365 1
+4 0.000335052 42
+3 11.816224383 1
+4 0.000418215 20
+3 0.273365040 1
+4 0.000342733 19
+3 6.333922854 1
+4 0.000360305 20
+3 0.217709489 1
+4 0.000409785 20
+3 0.245465986 1
+4 0.000341101 20
+3 0.311678496 1
+4 0.000371672 20
+3 1.199840369 1
+3 0.159795890 1
+3 0.121940449 1
+4 0.000340981 30
+3 0.285755030 1
+4 0.000386875 109
+3 0.367693758 1
+4 0.000333904 43
+3 0.169692707 1
+4 0.000372716 18
+3 0.173550378 1
+4 0.000337946 17
+3 0.177683749 1
+4 0.000411044 17
+3 0.165552334 1
+4 0.000328781 18
+3 0.169847364 1
+4 0.000343848 17
+3 0.349475197 1
+4 0.000338459 17
+3 0.199688020 1
+3 0.048091986 1
+4 0.000373727 69
+3 0.183600558 1
+3 0.071954096 1
+4 0.000341226 69
+3 0.143583093 1
+3 0.072123557 1
+4 0.000351541 70
+3 0.143624734 1
+3 0.071961404 1
+4 0.000345451 21
+3 0.159839162 1
+3 0.055884309 1
+4 0.000407696 105
+3 0.143631378 1
+3 0.072088178 1
+4 0.000421948 4
+3 0.159495000 1
+3 0.055895829 1
+4 0.000337136 4
+3 0.167754686 1
+3 0.056028754 1
+4 0.000406078 4
+3 0.223455056 1
+3 0.031991668 1
+4 0.000387841 5
+3 0.400327077 1
+3 0.063267058 1
+4 0.000353785 4
+3 0.383868089 1
+3 0.079890355 1
+4 0.000333697 4
+3 0.455722661 1
+4 0.000398118 17
+3 0.167692715 1
+4 0.000337065 4
+3 0.383631375 1
+3 0.087948554 1
+4 0.000343360 4
+3 0.191610058 1
+3 0.056338319 1
+4 0.000357270 4
+3 0.335332459 1
+4 0.000332694 4
+3 0.191988912 1
+4 0.000388017 24
+3 0.255408656 1
+4 0.000327531 27
+3 0.311964670 1
+4 0.000329936 27
+3 0.535282635 1
+4 0.000351203 25
+3 0.647773276 2
+4 0.000455207 36
+3 0.391515669 1
+4 0.000351281 17
+3 0.169667094 1
+4 0.000405985 15
+3 0.149563591 1
+4 0.000334695 9
+3 0.441740673 1
+4 0.000380755 16
+3 0.333631683 1
+4 0.000341236 17
+3 0.263603265 1
+4 0.000353596 17
+3 0.207649137 1
+4 0.000346167 4
+3 0.145751757 1
+4 0.000332387 7
+3 0.109543845 1
+4 0.000311179 24
+3 0.183897677 1
+4 0.000328809 20
+3 0.007351151 1
+4 0.000312790 20
+3 0.129932470 1
+4 0.000339756 22
+3 0.397882668 1
+4 0.000351199 17
+3 0.191341819 1
+4 0.000365951 18
+3 0.135882881 1
+4 0.000329121 20
+3 0.143446050 1
+4 0.000319704 20
+3 0.199607207 1
+4 0.000351943 20
+3 0.167824352 1
+4 0.000315567 20
+3 0.247614467 1
+4 0.000342691 20
+3 0.055736817 1
+4 0.000307130 21
+3 0.063593990 1
+4 0.000331799 20
+3 0.015658267 1
+4 0.000312669 20
+3 0.543777302 1
+4 0.000406003 20
+3 0.757150037 1
+4 0.110005761 33
+3 8.530119335 1
+4 0.109944528 1
+3 37.460552135 1
+3 0.097390628 1
+4 0.000319727 21
+3 1.408422266 1
+4 0.000364515 16
+3 0.200914972 1
+4 0.000369363 19
+3 0.253657346 1
+4 0.000311340 20
+3 0.145663954 1
+4 0.000402758 20
+3 1.141692288 1
+3 0.144013908 1
+3 0.122031340 1
+4 0.000500023 30
+3 0.181343851 1
+4 0.000381788 118
+3 0.159761862 1
+4 0.000369254 43
+3 0.153674795 1
+4 0.000330265 18
+3 0.173816829 1
+4 0.000349210 17
+3 0.169495023 1
+4 0.000341292 17
+3 0.181618874 1
+4 0.000352165 18
+3 0.217642100 1
+4 0.000347284 17
+3 0.229581941 1
+4 0.000395292 17
+3 0.103730075 1
+3 0.080645875 1
+4 0.000334303 27
+3 0.199303016 1
+4 0.000314887 18
+3 0.095439448 1
+4 0.000409778 18
+3 0.119587852 1
+4 0.000327680 18
+3 0.103733059 1
+4 0.000326631 24
+3 0.271534140 2
+4 0.000416677 36
+3 0.159607458 1
+4 0.000328158 15
+3 0.162032829 1
+4 0.000336834 9
+3 0.909222034 1
+3 0.072113027 1
+4 0.000401278 4
+3 0.295626428 1
+3 0.055830914 1
+4 0.000342416 6
+3 0.551895662 1
+3 0.079965287 1
+4 0.000383645 7
+3 0.415814232 1
+4 0.000398259 7
+3 1.095530830 1
+4 0.000332068 24
+3 0.249480319 1
+4 0.000367411 16
+3 0.069703592 1
+4 0.000309604 17
+3 0.031736612 1
+4 0.000332510 19
+3 0.135653206 1
+4 0.000344851 19
+3 0.151760722 1
+4 0.000414377 20
+3 0.135442232 1
+4 0.000320695 19
+3 0.215735795 1
+4 0.000379862 19
+3 0.143675662 1
+4 0.000333069 19
+3 0.119611034 1
+4 0.000388026 19
+3 0.095667408 1
+4 0.000322488 19
+3 0.391754973 2
+4 0.000406533 9
+3 0.095435400 1
+4 0.000352384 1
+3 0.103698735 1
+4 0.000337172 1
+4 0.000406655 71
+3 2.807345891 1
+4 0.000352232 39
+3 0.193837807 1
+4 0.000430656 17
+3 0.277359668 1
+4 0.000492549 14
+3 0.207629890 1
+3 0.096070940 1
+4 0.000406128 21
+3 0.201357121 1
+3 0.062198393 1
+4 0.000509318 4
+3 0.647524515 1
+3 0.058847717 1
+4 0.001006521 5
+3 0.268140710 1
+4 0.000355018 9
+3 0.127573024 1
+4 0.000314944 1
+3 0.087755708 1
+4 0.000373545 1
+4 0.000733677 71
+3 25.680327100 2
+4 0.000415360 40
+3 0.500168461 1
+4 0.000345733 17
+3 0.082014980 1
+4 0.000343734 17
+3 0.082732160 1
+4 0.000308449 16
+3 0.083085216 1
+4 0.000347725 17
+3 0.083293791 1
+4 0.000335752 20
+3 0.083300563 1
+4 0.000333679 20
+3 0.082744557 1
+4 0.000336053 20
+3 0.083491280 1
+4 0.000332338 21
+3 0.379409860 1
+3 0.500660526 1
+4 0.000392326 56
+3 0.082903979 1
+3 0.083893553 1
+4 0.000359338 109
+3 0.082775650 1
+3 0.083271789 1
+4 0.000351209 50
+3 0.082798483 1
+3 0.083266529 1
+4 0.000380645 79
+3 0.083243559 1
+3 0.083454583 1
+4 0.000356844 37
+3 0.083466983 1
+3 0.083394091 1
+4 0.000347213 30
+3 0.082976787 1
+3 0.083665025 1
+4 0.000350425 46
+3 0.083447438 1
+3 0.496309135 1
+4 0.000396465 76
+3 0.413792647 1
+4 0.000332448 10
+3 0.127516669 1
+4 0.000319480 1
+3 0.135976584 1
+4 0.000330092 1
+4 0.000371342 70
+3 0.615159903 1
+4 0.000381340 37
+3 0.193423073 1
+4 0.000311446 16
+3 0.197763128 1
+4 0.000365698 16
+3 0.201717774 1
+4 0.000326641 16
+3 0.165578714 1
+4 0.000378396 16
+3 0.561741684 1
+4 0.000330516 16
+3 31.791327930 1
+4 0.000410781 16
+3 0.144878230 1
+4 0.000313374 16
+3 0.166528198 1
+4 0.000355110 16
+3 0.255128716 1
+4 0.000327253 18
+3 0.623592858 1
+4 0.000398111 56
+3 0.484581327 482
+4 0.000648644 327
+4 0.000281574 297
+3 0.474031925 2
+4 0.000390452 51
+3 0.499760537 1
+4 0.000362859 57
+3 0.147600416 1
+4 0.000328532 18
+3 0.499730413 1
+4 0.000367052 20
+3 0.082609608 1
+4 0.000308948 20
+3 0.083518076 1
+4 0.000336197 17
+3 0.083368597 1
+4 0.000363839 20
+3 0.083226698 1
+4 0.000314125 14
+3 0.083626568 1
+4 0.000320239 20
+3 0.083315917 1
+4 0.000311907 20
+3 0.082827275 1
+4 0.000348916 20
+3 0.083415597 1
+4 0.000308781 20
+3 0.084330134 1
+4 0.000372289 18
+3 0.082708926 1
+4 0.000318105 19
+3 0.083442131 1
+4 0.000309499 19
+3 0.082831846 1
+4 0.000324884 19
+3 0.083502220 1
+4 0.000310053 16
+3 0.083391652 1
+4 0.000336717 18
+3 0.312867040 1
+4 0.000343477 19
+3 0.967726339 1
+3 0.183872709 1
+3 0.114021623 1
+4 0.000351377 30
+3 0.421787047 1
+4 0.000331517 42
+3 0.177689750 1
+4 0.000331284 19
+3 0.165569011 1
+4 0.000315404 20
+3 0.649914652 1
+4 0.000356583 19
+3 0.498184093 1
+4 0.000340550 18
+3 0.083446321 1
+4 0.000323868 20
+3 0.081995170 1
+4 0.000313058 20
+3 0.083345668 1
+4 0.000321728 20
+3 0.083106825 1
+4 0.000311740 20
+3 0.083763827 1
+4 0.000342292 17
+3 0.083422989 1
+4 0.000343899 17
+3 0.083296303 1
+4 0.000382450 20
+3 0.386287427 1
+4 0.000340438 17
+3 0.303729371 1
+4 0.000390762 139
+3 1.743796971 1
+4 0.000366338 43
+3 0.249498115 1
+4 0.000349871 18
+3 0.229570730 1
+4 0.000331705 17
+3 15.760889770 1
+4 0.000409383 92
+3 0.248996787 1
+4 0.000555008 47
+3 0.237465819 1
+4 0.000370083 20
+3 0.201728425 1
+4 0.000330774 18
+3 1.597483199 1
+4 0.000359256 17
+3 0.187300351 1
+4 0.000325557 18
+3 0.196007135 1
+4 0.000402731 17
+3 0.271755807 1
+4 0.000330358 17
+3 0.135391799 1
+3 0.064279766 1
+4 0.000345506 29
+3 0.471782423 2
+4 0.000401253 29
+3 0.295480571 1
+3 0.615908125 2
+4 0.000351774 17
+3 0.423865831 1
+4 0.000414001 24
+3 0.167449862 1
+4 0.000337963 90
+3 0.143709501 1
+4 0.000399620 90
+3 0.351544993 2
+4 0.000433133 97
+3 0.175501386 1
+4 0.000364540 17
+3 0.247753373 1
+3 0.071950244 1
+4 0.000350965 29
+3 0.199788929 1
+4 0.000362167 18
+3 0.327454931 1
+4 0.000340203 18
+3 0.415799497 1
+4 0.000388320 17
+3 0.039693974 1
+4 0.000325919 18
+3 0.159589337 1
+4 0.000354441 18
+3 0.167737055 1
+4 0.000329736 18
+3 0.135529240 1
+4 0.000323341 18
+3 0.111785235 1
+4 0.000370118 18
+3 0.327533134 2
+4 0.000359409 79
+3 0.153678584 1
+4 0.000342212 17
+3 0.373732092 1
+4 0.000344131 28
+4 0.000335541 99
+3 0.607480075 1
+4 0.000421897 28
+3 0.503372723 1
+4 0.000353922 73
+3 0.231700166 1
+4 0.000387482 74
+3 0.087547841 1
+4 0.000343386 75
+3 0.967852369 1
+4 0.000357882 77
+3 0.119760772 1
+4 0.000327700 77
+3 0.495430199 2
+4 0.000409435 22
+3 1.455670962 1
+3 0.136049650 1
+4 0.000407127 9
+3 0.607658736 1
+4 0.000334196 1
+3 0.111608823 1
+4 0.000422528 138
+3 0.847566104 1
+4 0.000337607 18
+3 0.239593294 1
+4 0.000453913 13
+3 0.815744351 1
+3 0.095810438 1
+4 0.000563110 29
+3 0.335618566 1
+4 0.000473371 13
+3 0.063541474 1
+4 0.000356626 16
+3 0.127674719 1
+4 0.000572425 18
+3 0.135320159 1
+4 0.000468512 18
+3 0.167562653 1
+4 0.000349390 19
+3 0.423803062 1
+4 0.000356501 23
+3 0.151579025 1
+4 0.000365639 23
+3 0.184373685 1
+4 0.000494081 23
+3 0.166790569 1
+4 0.000351437 23
+3 0.143673253 1
+4 0.000340845 23
+3 0.143583097 1
+4 0.000329542 23
+3 1.061800155 1
+4 0.110035826 33
+3 11.230177681 1
+4 0.109894286 1
+3 0.144779688 1
+4 0.000313719 18
+3 0.499170658 1
+4 0.000355520 20
+3 0.082890827 1
+4 0.000326134 20
+3 0.082812159 1
+4 0.000353703 17
+3 0.083534823 1
+4 0.000321899 20
+3 0.083823155 1
+4 0.000328459 17
+3 0.083063504 1
+4 0.000326317 20
+3 0.082630883 1
+4 0.000349978 20
+3 0.082977332 1
+4 0.000362105 20
+3 0.082647748 1
+4 0.000538387 20
+3 0.083605349 1
+4 0.000352822 18
+3 0.083226123 1
+4 0.000341422 18
+3 0.432770428 1
+3 0.500922303 1
+4 0.000402545 55
+3 0.082605686 1
+3 0.083208646 1
+4 0.000365150 65
+3 0.083378933 1
+3 0.083849630 1
+4 0.000385798 104
+3 0.398970997 1
+3 0.438007413 1
+4 0.000393754 38
+3 6.970020862 1
+3 0.125928496 1
+4 0.000363261 36
+3 20.400806501 1
+4 0.000457508 15
+3 0.499017393 1
+4 0.000333411 16
+3 0.082977503 1
+4 0.000339093 15
+3 0.083176300 1
+4 0.000338799 15
+3 0.083177846 1
+4 0.000390102 15
+3 0.083624712 1
+4 0.000325837 18
+3 0.471595615 1
+4 0.000389240 16
+3 0.181397975 1
+4 0.000406234 16
+3 0.183472337 1
+4 0.000328933 16
+3 0.201743125 1
+4 0.000345084 16
+3 1.157743437 1
+3 0.167917005 1
+3 0.114115602 1
+4 0.000348750 29
+3 0.205470455 1
+4 0.000412451 168
+3 0.239697388 1
+4 0.000335225 41
+3 0.153641480 1
+4 0.000406105 16
+3 0.173497615 1
+4 0.000328928 16
+3 0.169690697 1
+4 0.000389667 16
+3 0.437681597 1
+4 0.000331343 18
+3 0.167688715 1
+4 0.000340679 18
+3 0.186123336 1
+4 0.000324602 17
+3 0.181070872 1
+4 0.000391565 17
+3 0.185935537 1
+4 0.000351646 17
+3 0.205541082 1
+3 0.079898558 1
+4 0.000347454 4
+3 0.183833396 1
+4 0.000350846 6
+3 0.255464528 1
+4 0.000356907 17
+3 0.103755323 1
+4 0.000338515 18
+3 0.201671821 1
+4 0.000391423 18
+3 0.149456132 1
+4 0.000311397 17
+3 0.185895976 1
+4 0.000348917 17
+3 1.766458957 1
+3 0.111748001 1
+4 0.000342213 29
+3 3.009475648 13
+4 0.000366756 50
+3 3.533449180 2
+4 0.000377710 35
+3 0.193494105 1
+4 0.000372244 20
+3 0.245805875 1
+4 0.000360129 38
+3 0.215558489 1
+4 0.000355014 19
+3 0.169780542 1
+4 0.000328647 20
+3 0.157458487 1
+4 0.000396414 17
+3 0.137650747 1
+4 0.000347145 17
+3 0.126381715 1
+4 0.000320292 17
+3 0.121045758 1
+4 0.000313152 17
+3 0.141670376 1
+4 0.000323232 17
+3 0.129670629 1
+4 0.000357552 18
+3 0.134123742 1
+4 0.000321029 16
+3 0.199272519 1
+3 0.154085494 1
+4 0.000405687 114
+3 3.414143106 1
+3 0.145794378 1
+4 0.000366336 38
+3 0.773973986 1
+4 0.000346917 9
+3 0.263659920 1
+4 0.000331238 1
+3 0.063057300 1
+4 0.000312699 1
+3 0.039609940 1
+4 0.000310816 1
+3 0.199833113 1
+4 0.000354866 1
+3 0.183408742 1
+4 0.000321901 1
+3 0.151895847 1
+4 0.000312409 1
+3 0.143668554 1
+4 0.000345163 42
+3 4.816406965 1
+4 0.000356929 17
+3 0.169107106 1
+4 0.000320840 18
+3 0.133669171 1
+4 0.000307794 17
+3 0.153798546 1
+4 0.000375121 17
+3 0.221497804 1
+3 0.080011551 1
+4 0.000339785 29
+3 0.135585549 1
+4 0.000366028 18
+3 0.416084841 1
+4 0.000345946 17
+3 0.119140269 1
+4 0.000385091 18
+3 0.071633955 1
+4 0.000339052 18
+3 0.063691059 1
+4 0.000335902 18
+3 0.199683965 1
+4 0.000337395 18
+3 0.183745149 1
+4 0.000363842 18
+3 0.055538150 1
+4 0.000354163 18
+3 0.121754583 1
+4 0.000405515 42
+3 0.221720024 2
+4 0.000341910 24
+3 0.129582201 1
+4 0.000342469 17
+3 0.237651901 1
+3 0.064652588 1
+4 0.000357747 33
+3 0.134849167 1
+4 0.000360703 19
+3 0.135710909 1
+4 0.000316010 18
+3 0.095563112 1
+4 0.000387194 18
+3 0.120230822 1
+4 0.000339029 18
+3 0.055130444 1
+4 0.000409056 18
+3 1.374432178 1
+4 0.109982395 37
+3 48.370700967 1
+4 0.109937620 1
+3 0.356890712 1
+4 0.000327038 18
+3 0.407155126 1
+4 0.000352911 24
+3 0.255744725 1
+4 0.000335455 34
+3 0.135529116 1
+4 0.000330631 33
+3 0.143803776 1
+4 0.000311379 33
+3 0.487583780 1
+4 0.000342134 33
+3 0.671346413 1
+4 0.109925140 33
+3 4.546670271 1
+3 0.143813430 1
+3 0.122041644 1
+4 0.000413285 31
+3 0.237567793 1
+4 0.000397703 174
+3 0.639827081 1
+4 0.000348563 43
+3 0.201765239 1
+4 0.000413365 18
+3 0.197467535 1
+4 0.000325038 17
+3 0.185511784 1
+4 0.000363859 17
+3 0.317787633 1
+4 0.000360147 17
+3 0.185639356 1
+4 0.000394657 17
+3 0.149574807 1
+4 0.000313383 18
+3 0.287591136 1
+3 0.088011658 1
+4 0.000363159 4
+3 0.199715538 1
+3 0.064018271 1
+4 0.000358743 4
+3 0.519699010 1
+4 0.000408737 4
+3 0.255615399 1
+4 0.000360562 17
+3 0.423601363 1
+4 0.000382063 4
+3 0.719940695 1
+4 0.000436410 17
+3 0.287256454 1
+4 0.000327343 18
+3 0.209763170 1
+4 0.000341903 17
+3 0.229558968 1
+4 0.000324724 17
+3 0.201843917 1
+4 0.000387559 18
+3 0.277373847 1
+3 0.072253667 1
+4 0.000386864 29
+3 0.135401781 1
+4 0.000369952 18
+3 0.135684962 1
+4 0.000336159 18
+3 0.079554769 1
+4 0.000345051 18
+3 0.103783530 1
+4 0.000325816 18
+3 0.071570269 1
+4 0.000316469 18
+3 0.455813369 2
+4 0.000351968 40
+3 0.359747698 1
+4 0.000331253 20
+3 0.203367315 1
+4 0.000322835 19
+3 0.180023613 1
+4 0.000341577 20
+3 0.231451705 1
+4 0.000405716 17
+3 0.185669610 1
+4 0.000339183 18
+3 0.165678940 1
+4 0.000313232 18
+3 0.146003186 1
+4 0.000311441 17
+3 0.597478758 1
+4 0.000337850 19
+3 0.201801336 1
+4 0.000318510 20
+3 0.149506466 1
+4 0.000313023 17
+3 0.162112343 1
+4 0.000351940 17
+3 0.109200955 1
+4 0.000327850 17
+3 0.137872830 1
+4 0.000333502 18
+3 0.117568342 1
+4 0.000333679 16
+3 0.311639974 1
+3 0.162003130 1
+4 0.000379755 75
+3 0.261545399 1
+3 0.122065898 1
+4 0.000456392 104
+3 0.117453068 1
+4 0.000373602 15
+3 1.409741982 1
+4 0.000446896 19
+3 0.181656097 1
+4 0.000329522 16
+3 0.169639882 1
+4 0.000373205 16
+3 0.165528402 1
+4 0.000335128 16
+3 9.040562010 1
+4 0.000370820 16
+3 0.161235472 1
+4 0.000332626 18
+3 0.157502963 1
+4 0.000419027 18
+3 0.138188933 1
+4 0.000314842 17
+3 0.157156218 1
+4 0.000379167 17
+3 0.153473962 1
+4 0.000315378 18
+3 0.133800302 1
+4 0.000388554 17
+3 0.145594867 1
+4 0.000337298 17
+3 0.277627903 1
+3 0.072079917 1
+4 0.000347425 33
+3 0.103483251 1
+4 0.000356924 19
+3 0.135734917 1
+4 0.000323910 18
+3 0.199753900 1
+4 0.000334302 17
+3 0.063635876 1
+4 0.000341138 18
+3 0.183611705 1
+4 0.000364358 18
+3 0.119829742 1
+4 0.000337920 18
+3 0.263566945 1
+4 0.000333138 18
+3 0.063997843 1
+4 0.000328836 18
+3 0.055383715 1
+4 0.000317688 18
+3 0.716639951 1
+4 0.110075430 33
+3 0.805765447 1
+4 0.000508410 17
+3 0.222761693 1
+4 0.000394105 17
+3 0.185504503 1
+4 0.000321400 18
+3 1.677965485 1
+3 0.039881330 1
+4 0.000369242 4
+3 0.199610204 1
+4 0.000347055 6
+3 5.135801847 2
+4 0.000452682 12
+3 0.288286666 1
+4 0.000394276 19
+3 0.168847062 1
+4 0.000343905 37
+3 0.501746799 1
+4 0.000419846 85
+3 0.575522020 1
+4 0.000385413 104
+3 0.279741971 1
+4 0.000389606 38
+3 0.703500287 1
+4 0.000347354 35
+3 0.367655223 1
+4 0.000440241 17
+3 0.169886001 1
+4 0.000322410 19
+3 0.165459397 1
+4 0.000343386 20
+3 0.783680443 1
+3 1.728216886 2
+4 0.000360084 18
+3 0.170121193 1
+4 0.000340091 18
+3 0.236945841 1
+4 0.000355168 17
+3 0.175714857 1
+4 0.000334692 17
+3 0.567775846 1
+4 0.000380103 17
+3 0.127481824 1
+4 0.000316456 24
+3 0.111589708 1
+4 0.000357462 22
+3 0.127897662 1
+4 0.000314507 22
+3 0.191536188 1
+4 0.000362848 22
+3 0.167705788 1
+4 0.000352659 22
+3 0.095456418 1
+4 0.000356951 22
+3 0.103850853 1
+4 0.000349034 22
+3 0.744244200 1
+4 0.000355774 17
+3 0.319046499 1
+4 0.000442546 17
+3 0.143575233 1
+4 0.000360203 17
+3 0.183669560 1
+4 0.000358766 17
+3 0.183618884 1
+4 0.000353155 17
+3 0.071676335 1
+4 0.000406601 18
+3 0.135535452 1
+4 0.000424665 17
+3 0.135675891 1
+4 0.000400942 22
+3 0.407376145 2
+4 0.000442732 36
+3 0.201778282 1
+4 0.000379741 19
+3 0.165544242 1
+4 0.000363140 20
+3 0.881872514 1
+4 0.000443857 17
+3 0.709387659 1
+4 0.000355279 17
+3 0.185624354 1
+4 0.000430600 17
+3 0.165649264 1
+4 0.000342672 18
+3 0.209736385 1
+4 0.000368710 18
+3 0.925502720 1
+3 0.103977414 1
+4 0.000346841 33
+3 3.192451814 1
+4 0.000363895 19
+3 0.126932545 1
+4 0.000319243 18
+3 0.199693950 1
+4 0.000339547 17
+3 0.111660863 1
+4 0.000331957 18
+3 0.247850101 1
+4 0.000338948 18
+3 0.175556736 1
+4 0.000389250 18
+3 0.231664064 1
+4 0.000337667 18
+3 0.071549899 1
+4 0.000315591 18
+3 0.071706185 1
+4 0.000309370 18
+3 0.375803703 2
+4 0.000395729 10
+3 0.127643695 1
+4 0.000307878 1
+3 0.071834668 1
+4 0.000355001 1
+4 0.000417061 71
+3 0.375146422 1
+4 0.000339288 39
+3 0.151503993 1
+4 0.000321562 17
+3 0.169772264 1
+4 0.000325145 18
+3 1.045757585 1
+3 0.095851424 1
+4 0.000379875 21
+3 0.167626919 1
+4 0.000353220 6
+3 1.975821698 1
+4 0.000408611 17
+3 0.177503624 1
+4 0.000334285 19
+3 0.173754324 1
+4 0.000328232 20
+3 0.703659513 1
+4 0.000322992 17
+3 0.456054539 1
+4 0.000342364 4
+3 0.169341293 1
+4 0.000360693 4
+3 0.141649340 1
+4 0.000346621 7
+3 4.439967084 1
+4 0.000355890 20
+3 0.185564983 1
+4 0.000336582 21
+3 0.181527451 1
+4 0.000375780 21
+3 0.185605030 1
+4 0.000333384 20
+3 0.133758247 1
+4 0.000319822 19
+3 1.890366705 1
+4 0.000424785 20
+3 0.268973084 1
+4 0.000383056 17
+3 0.135742214 1
+4 0.000324542 17
+3 0.185611026 1
+4 0.000329502 17
+3 0.157585660 1
+4 0.000319498 18
+3 0.137843567 1
+4 0.000322983 18
+3 0.421548220 1
+4 0.000347243 18
+3 0.167696564 1
+4 0.000363056 31
+3 0.183842979 1
+4 0.000363409 28
+3 0.543684667 1
+4 0.000396383 17
+3 0.199383764 1
+4 0.000354674 18
+3 3.312107842 15
+4 0.000361784 43
+3 0.575321321 2
+4 0.000410440 33
+3 0.193579312 1
+4 0.000343675 20
+3 0.165802683 1
+4 0.000390893 20
+3 0.155701490 1
+4 0.000336779 21
+3 0.155391198 1
+4 0.000442939 19
+3 0.192317929 1
+3 0.167344553 1
+3 0.153916527 1
+4 0.000442250 57
+3 1.965674558 1
+4 0.000451457 40
+3 0.499764594 1
+4 0.000396980 15
+3 0.082979766 1
+4 0.000325901 15
+3 0.083061258 1
+4 0.000394347 15
+3 0.082997320 1
+4 0.000349944 15
+3 0.082916734 1
+4 0.000353710 15
+3 0.082907630 1
+4 0.000321255 15
+3 0.084252453 1
+4 0.000385319 77
+3 0.082080906 1
+4 0.000348032 78
+3 0.082745791 1
+4 0.000444184 72
+3 0.082981982 1
+4 0.000346113 36
+3 0.083731417 1
+4 0.000385605 46
+3 0.082942554 1
+4 0.000378678 100
+3 0.083760268 1
+4 0.000439603 88
+3 0.082953919 1
+4 0.000360369 44
+3 0.174291698 1
+4 0.000337277 15
+3 0.500579794 1
+4 0.000402079 15
+3 0.083593537 1
+4 0.000343839 15
+3 0.083042831 1
+4 0.000330159 17
+3 0.083311131 1
+4 0.000383417 17
+3 0.083070405 1
+4 0.000322192 15
+3 0.082817202 1
+4 0.000324962 16
+3 0.082955668 1
+4 0.000352557 15
+3 0.551931053 1
+4 0.000422846 16
+3 2.029544042 1
+4 0.000380646 53
+3 0.263684538 1
+4 0.000403640 36
+3 1.071617388 2
+4 0.000404052 120
+3 0.879674421 1
+4 0.000392763 41
+3 0.500303514 1
+4 0.000344169 16
+3 0.084517571 1
+4 0.000383004 16
+3 0.081634254 1
+4 0.000357732 16
+3 1.142049302 1
+4 0.000390219 16
+3 0.221699701 1
+4 0.000424641 16
+3 0.521657225 1
+4 0.000350753 16
+3 0.581563664 1
+4 0.000367152 17
+3 0.257531636 1
+4 0.000395919 16
+3 0.229855554 1
+4 0.000345921 16
+3 0.499956178 1
+4 0.000387651 16
+3 0.083525574 1
+4 0.000328273 16
+3 0.083559651 1
+4 0.000448435 92
+3 0.082634412 1
+4 0.000371538 44
+3 0.084196617 1
+4 0.000374507 34
+3 0.082463247 1
+4 0.000368721 54
+3 0.225010916 1
+4 0.000343039 16
+3 0.217584858 1
+4 0.000343449 18
+3 0.165678539 1
+4 0.000323934 16
+3 0.521585543 1
+4 0.000374796 16
+3 1.421720860 1
+4 0.000342931 16
+3 0.623662268 1
+4 0.000356870 16
+3 0.415818209 1
+4 0.000338788 16
+3 0.185610370 1
+4 0.000327341 16
+3 56.863558864 2
+4 0.000372835 17
+3 0.500188793 1
+4 0.000338762 16
+3 0.082791915 1
+4 0.000373587 16
+3 0.082892994 1
+4 0.000310608 16
+3 0.083644957 1
+4 0.000323414 16
+3 0.082564517 1
+4 0.000316353 16
+3 0.082823382 1
+4 0.000327113 17
+3 0.420762239 1
+4 0.000341057 16
+3 0.725683280 1
+4 0.000347385 16
+3 0.169601783 1
+4 0.000349340 17
+3 0.149560568 1
+4 0.000310762 16
+3 0.296088444 1
+4 0.000367454 52
+3 0.111316743 1
+4 0.000342702 16
+3 0.159628313 1
+4 0.000317998 16
+3 0.487871378 1
+4 0.000351865 17
+3 0.015419206 1
+4 0.000327941 17
+3 0.183829312 1
+4 0.000369127 17
+3 1.016087062 1
+4 0.000342832 14
+3 0.359359352 1
+4 0.000348427 20
+3 0.015437651 1
+4 0.000321955 18
+3 0.159885333 1
+4 0.000340734 16
+3 0.671697063 1
+4 0.000354526 16
+3 0.271587848 1
+4 0.000326924 20
+3 0.247596505 1
+4 0.000360905 14
+3 0.167722031 1
+4 0.000326457 1
+3 0.224174607 1
+4 0.000419383 16
+3 0.215153787 1
+4 0.000333891 16
+3 0.391504699 1
+4 0.000333100 19
+3 0.103595519 1
+4 0.000394378 17
+3 0.279805680 1
+4 0.000404785 18
+3 0.159573060 1
+4 0.000390699 18
+3 0.095574834 1
+4 0.000331628 18
+3 0.111597223 1
+4 0.000318922 17
+3 0.135793057 1
+4 0.000363708 18
+3 0.087540509 1
+4 0.000336322 17
+3 0.159752029 1
+4 0.000390604 18
+3 0.087611800 1
+4 0.000383487 18
+3 0.056742351 1
+4 0.000465323 19
+3 0.104304822 1
+4 0.000356671 18
+3 0.085617326 1
+4 0.000358310 18
+3 0.071768679 1
+4 0.000304527 18
+3 0.087588588 1
+4 0.000401929 18
+3 0.095604151 1
+4 0.000315903 17
+3 0.103694046 1
+4 0.000346116 18
+3 0.087606667 1
+4 0.000375860 18
+3 0.079815608 1
+4 0.000340996 18
+3 0.232588017 1
+4 0.000325128 18
+3 0.254726895 1
+4 0.000353367 19
+3 0.111576060 1
+4 0.000339386 18
+3 0.095602835 1
+4 0.000339095 18
+3 0.103790138 1
+4 0.000339718 18
+3 0.087671506 1
+4 0.000415849 18
+3 0.985995502 1
+4 0.110005593 33
+3 2.607663495 1
+4 0.000374918 19
+3 0.225767927 1
+4 0.000345812 21
+3 0.277624993 1
+4 0.000404794 17
+3 0.407409999 1
+4 0.000343714 17
+3 0.201843922 1
+4 0.000373062 20
+3 0.173597223 1
+4 0.000400054 20
+3 0.185479258 1
+4 0.000322413 17
+3 0.717710421 1
+4 0.000344428 17
+3 0.209787831 1
+4 0.000395843 17
+3 0.525563477 1
+4 0.000337454 31
+3 0.479842633 1
+4 0.000379006 54
+3 0.143380297 1
+4 0.000333983 53
+3 0.047700484 1
+4 0.000405173 53
+3 0.143889187 1
+4 0.000341593 53
+3 0.055310108 1
+4 0.000335033 53
+3 0.223859077 1
+4 0.000345699 49
+3 0.367648069 2
+4 0.000413740 34
+3 0.201608958 1
+4 0.000355101 19
+3 1.117664776 1
+4 0.000363813 21
+3 0.201520385 1
+4 0.000366371 17
+3 0.525715747 1
+3 0.216059662 1
+3 0.139194879 1
+4 0.000420538 177
+3 0.980364282 1
+4 0.000359846 10
+3 0.143577346 1
+4 0.000324217 1
+3 0.103734730 1
+4 0.000388367 1
+4 0.000325011 70
+3 34.000539382 2
+4 0.000409555 38
+3 0.170109040 1
+4 0.000332830 17
+3 0.133255641 1
+4 0.000337807 16
+3 0.161597428 1
+4 0.000350663 16
+3 0.117553372 1
+4 0.000335532 16
+3 0.145851410 1
+4 0.000366825 16
+3 0.557738013 1
+4 0.000375498 54
+3 0.503544954 1
+4 0.000354412 35
+3 0.196026505 312
+4 0.000580006 327
+4 0.000364241 109
+3 0.482383695 2
+4 0.000418500 36
+3 0.225817667 1
+4 0.000331601 14
+3 0.149639782 1
+4 0.000322562 20
+3 0.399640121 1
+4 0.000352179 14
+3 0.185857789 1
+4 0.000364838 21
+3 0.133867146 1
+4 0.000362586 10
+3 0.255247637 1
+3 0.138165075 1
+4 0.000359884 38
+3 0.325583677 1
+4 0.000355319 14
+3 0.500205808 1
+4 0.000355091 15
+3 0.083618019 1
+4 0.000398399 14
+3 0.087175131 1
+4 0.000318895 14
+3 0.185452694 1
+4 0.000374563 15
+3 0.157599866 1
+4 0.000323648 14
+3 0.153792848 1
+4 0.000368093 14
+3 0.125478695 1
+4 0.000318600 14
+3 0.153909002 1
+4 0.000408088 14
+3 0.117457249 1
+4 0.000342417 18
+3 0.500068003 1
+4 0.000349528 16
+3 0.082970902 1
+4 0.000324961 16
+3 0.083438608 1
+4 0.000341588 16
+3 0.083172836 1
+4 0.000363292 16
+3 0.083089491 1
+4 0.000389105 17
+3 0.863300330 1
+4 0.000378973 15
+3 0.285475036 1
+4 0.000375948 15
+3 0.256278631 1
+4 0.000584535 894
+3 0.446763867 1
+4 0.000404832 16
+3 0.500276476 1
+4 0.000363390 16
+3 0.083456225 1
+4 0.000336862 17
+3 0.082927433 1
+4 0.000328319 16
+3 0.083688812 1
+4 0.000339892 16
+3 0.082802915 1
+4 0.000358656 18
+3 0.082716245 1
+4 0.000348332 16
+3 0.082738342 1
+4 0.000357387 16
+3 0.083145079 1
+4 0.000328128 16
+3 0.082874154 1
+4 0.000322745 16
+3 0.083506173 1
+4 0.000314595 16
+3 0.082634175 1
+4 0.000309010 16
+3 0.113315995 1
+4 0.000351674 18
+3 2.711790189 1
+3 0.121811708 1
+4 0.000342354 30
+3 1.350780677 1
+4 0.000484288 43
+3 0.499582593 1
+4 0.000364018 17
+3 0.082898191 1
+4 0.000411469 19
+3 0.082727601 1
+4 0.000316052 20
+3 0.083071661 1
+4 0.000344978 17
+3 0.083232812 1
+4 0.000314568 19
+3 0.082802022 1
+4 0.000650484 16
+3 0.082775725 1
+4 0.000390980 20
+3 0.082924623 1
+4 0.000372701 17
+3 0.082767449 1
+4 0.000413153 18
+3 0.082665069 1
+4 0.000335966 19
+3 0.083807830 1
+4 0.000323808 20
+3 0.082809994 1
+4 0.000442159 97
+3 0.083449431 1
+4 0.000360868 47
+3 0.082590256 1
+4 0.000410985 119
+3 0.083417111 1
+4 0.000363701 110
+3 0.082967041 1
+4 0.000441623 47
+3 0.083131456 1
+4 0.000353412 72
+3 0.083159443 1
+4 0.000398348 115
+3 0.082743335 1
+4 0.000361302 87
+3 0.173665158 1
+4 0.000346653 18
+3 0.500511599 1
+4 0.000381397 17
+3 0.082614069 1
+4 0.000344279 19
+3 0.083045344 1
+4 0.000389864 20
+3 0.083123871 1
+4 0.000325308 17
+3 0.083441137 1
+4 0.000311326 19
+3 0.083141430 1
+4 0.000396549 20
+3 0.082617036 1
+4 0.000319848 17
+3 0.083321903 1
+4 0.000365649 19
+3 0.082906019 1
+4 0.000325418 20
+3 0.083867395 1
+4 0.000387734 18
+3 0.082253100 1
+4 0.000327111 17
+3 5.209306135 1
+4 0.000356936 17
+3 0.499498038 1
+4 0.000338429 18
+3 0.083248941 1
+4 0.000349050 19
+3 0.082998680 1
+4 0.000338105 20
+3 0.083409580 1
+4 0.000370794 17
+3 0.248980850 1
+4 0.000336665 17
+3 0.500064336 1
+4 0.000378903 19
+3 0.083450003 1
+4 0.000327997 20
+3 0.083058283 1
+4 0.000348129 18
+3 0.342141965 1
+4 0.000344336 17
+3 2.309742734 1
+4 0.000361916 32
+3 0.023594273 1
+4 0.000341553 17
+3 0.455682228 1
+4 0.000391532 19
+3 0.239511887 1
+4 0.000330122 18
+3 0.095768258 1
+4 0.000318396 18
+3 0.191721877 1
+4 0.000330911 18
+3 0.071563823 1
+4 0.000317252 18
+3 0.055776677 1
+4 0.000334562 18
+3 0.239666474 1
+4 0.000316451 36
+3 0.359606042 2
+3 0.130090139 1
+4 0.000333990 30
+3 0.277709067 1
+4 0.000407820 43
+3 0.499829756 1
+4 0.000372602 21
+3 0.083237824 1
+4 0.000358203 19
+3 0.082780471 1
+4 0.000314001 20
+3 0.083331423 1
+4 0.000364130 20
+3 0.082893794 1
+4 0.000313460 19
+3 0.241005525 1
+4 0.000560889 16
+3 0.172332582 1
+4 0.000362109 17
+3 0.161543688 1
+4 0.000383005 19
+3 0.141590926 1
+4 0.000316806 20
+3 0.831752554 1
+4 0.000452418 173
+3 0.431577690 1
+4 0.000357268 112
+3 0.255558635 2
+4 0.000368567 34
+3 0.153660452 1
+4 0.000311132 17
+3 0.181775527 1
+4 0.000403350 114
+3 0.161501956 1
+4 0.000406326 85
+3 0.157630278 1
+4 0.000440968 44
+3 0.175647759 1
+4 0.000337343 16
+3 0.169626426 1
+4 0.000363192 16
+3 0.157530000 1
+4 0.000394097 16
+3 0.145792064 1
+4 0.000346868 17
+3 0.341531021 1
+4 0.000334808 14
+3 0.295732817 1
+4 0.000407270 14
+3 2.871705613 1
+3 0.095882751 1
+4 0.000343000 29
+3 0.231720463 1
+4 0.000344213 18
+3 0.119827603 1
+4 0.000329884 16
+3 0.111545685 1
+4 0.000376956 13
+3 0.087503250 1
+4 0.000330464 11
+3 0.343792660 2
+4 0.000351276 41
+3 0.500314061 1
+4 0.000349806 16
+3 0.083047818 1
+4 0.000333175 12
+3 0.082653704 1
+4 0.000318647 17
+3 0.083646378 1
+4 0.000379608 93
+3 0.082873806 1
+4 0.000389031 88
+3 0.083588092 1
+4 0.000348052 47
+3 0.082953785 1
+4 0.000418760 34
+3 0.083057976 1
+4 0.000363325 83
+3 0.082940781 1
+4 0.000363256 87
+3 0.083293536 1
+4 0.000377127 87
+3 0.082681683 1
+4 0.000362138 87
+3 0.272565953 1
+4 0.000435778 17
+3 0.499770637 1
+4 0.000340514 17
+3 0.083160135 1
+4 0.000358875 18
+3 0.082910009 1
+4 0.000334212 14
+3 0.083181014 1
+4 0.000344586 18
+3 0.083669914 1
+4 0.000373685 20
+3 0.082643920 1
+4 0.000399210 17
+3 0.083361848 1
+4 0.000346453 19
+3 0.082790860 1
+4 0.000341810 20
+3 0.083299434 1
+4 0.000312008 17
+3 0.083016580 1
+4 0.000347551 19
+3 0.082919542 1
+4 0.000314294 20
+3 0.313175103 1
+3 0.146080553 1
+4 0.000344070 30
+3 0.229642077 1
+4 0.000339589 43
+3 0.137635985 1
+4 0.000326642 19
+3 0.133717887 1
+4 0.000321032 17
+3 0.145653934 1
+4 0.000369265 19
+3 0.133492222 1
+4 0.000312544 20
+3 0.137737194 1
+4 0.000321177 17
+3 0.117801793 1
+4 0.000333762 19
+3 0.343597995 1
+4 0.000380476 85
+3 0.287646986 1
+4 0.000361537 52
+3 0.231510696 2
+4 0.000336455 34
+3 0.175869250 1
+4 0.000383886 15
+3 0.119538844 1
+4 0.000334277 13
+3 0.351730609 1
+3 0.095873721 1
+4 0.000372055 28
+3 0.175831831 1
+4 0.000360643 18
+3 0.151492854 1
+4 0.000393452 16
+3 0.087491223 1
+4 0.000345820 13
+3 0.121899184 1
+4 0.000363901 11
+3 0.197590595 1
+4 0.000350851 13
+3 0.008260737 1
+4 0.000353771 16
+3 0.127012728 1
+4 0.000339277 17
+3 0.327792032 1
+4 0.000381745 14
+3 0.123116629 1
+4 0.000374609 11
+3 0.236049131 1
+4 0.000386290 13
+3 0.047514475 1
+4 0.000406455 13
+3 0.263703469 2
+4 0.000370569 33
+3 0.500296560 1
+4 0.000360875 20
+3 0.082780693 1
+4 0.000416335 12
+3 0.082633911 1
+4 0.000381199 84
+3 0.083575166 1
+4 0.000418162 86
+3 0.082666881 1
+4 0.000376174 81
+3 0.083380645 1
+4 0.000371076 94
+3 0.083205627 1
+4 0.000371207 35
+3 0.082737781 1
+4 0.000481356 56
+3 0.083041576 1
+4 0.000423818 72
+3 0.071806079 1
+4 0.000339931 19
+3 0.500183823 1
+4 0.000385364 17
+3 0.082827724 1
+4 0.000353565 17
+3 0.083656119 1
+4 0.000341832 20
+3 0.082794864 1
+4 0.000338655 14
+3 0.083175690 1
+4 0.000316477 20
+3 0.082761809 1
+4 0.000403365 20
+3 0.082924047 1
+4 0.000317314 20
+3 0.082885107 1
+4 0.000347656 19
+3 0.082790687 1
+4 0.000331263 20
+3 0.083246887 1
+4 0.000326722 18
+3 0.083814619 1
+4 0.000331605 18
+3 0.082931200 1
+4 0.000331613 20
+3 0.083060683 1
+4 0.000378291 16
+3 0.083759840 1
+4 0.000322280 18
+3 0.083622004 1
+4 0.000361180 19
+3 0.308971204 1
+4 0.000319377 16
+3 0.868939444 1
+3 0.103877213 1
+3 0.105874567 1
+4 0.000334379 30
+3 0.261832718 1
+4 0.000348964 42
+3 0.161559851 1
+4 0.000366215 18
+3 0.149614795 1
+4 0.000344224 19
+3 0.137701948 1
+4 0.000358859 17
+3 0.125690550 1
+4 0.000337707 19
+3 0.137576502 1
+4 0.000322554 17
+3 0.214943184 1
+4 0.000355615 20
+3 0.262553259 1
+4 0.000392429 177
+3 0.879507130 1
+4 0.000382009 43
+3 0.499698962 1
+4 0.000356425 18
+3 0.082880019 1
+4 0.000346907 17
+3 0.626329712 1
+4 0.000359114 17
+3 0.197623254 1
+4 0.000329710 18
+3 0.185875211 1
+4 0.000351555 17
+3 0.989598679 1
+4 0.000360673 17
+3 11.816695526 1
+3 0.079221270 1
+4 0.000364779 29
+3 0.271784652 1
+4 0.000358693 18
+3 0.103629336 1
+4 0.000396262 18
+3 0.136661000 1
+4 0.000355047 18
+3 0.136461950 1
+4 0.000346455 18
+3 0.109841872 1
+4 0.000366960 18
+3 0.063581292 1
+4 0.000463782 18
+3 0.583768705 2
+4 0.000388785 28
+3 0.121456522 1
+4 0.000369572 17
+3 0.229573850 1
+3 0.080078948 1
+4 0.000376905 29
+3 0.168466698 1
+4 0.000367279 18
+3 0.086775728 1
+4 0.000376735 19
+3 0.143609462 1
+4 0.000386832 18
+3 0.087614344 1
+4 0.000364885 18
+3 0.191548043 1
+4 0.000456479 18
+3 0.135645856 1
+4 0.000381937 54
+3 0.047636999 1
+4 0.000359263 54
+3 0.215682793 1
+4 0.000375939 95
+3 0.600259093 2
+4 0.000518686 36
+7 0.000524969 TSTP
+7 0.934500773 CONT
+4 0.000608780 7
+4 0.000283100 902
+3 12.831529799 2
+4 0.000406864 19
+3 0.193942526 1
+4 0.000331562 19
+3 0.141002438 1
+4 0.000349896 16
+3 0.154083839 1
+4 0.000318132 20
+3 0.269538392 1
+3 0.137867205 1
+4 0.000367111 97
+3 2.573897292 1
+3 0.121815978 1
+4 0.000423477 30
+3 0.125502227 1
+4 0.000342705 14
+3 0.177671569 1
+4 0.000392414 18
+3 0.165702251 1
+4 0.000355251 16
+3 0.161611438 1
+4 0.000358127 17
+3 0.157739165 1
+4 0.000399045 16
+3 0.201530843 1
+4 0.000385973 18
+3 0.181540334 1
+4 0.000344512 18
+3 0.177678136 1
+4 0.000372884 17
+3 0.133790538 1
+4 0.000328319 17
+3 0.177633734 1
+4 0.000381932 18
+3 0.134352460 1
+4 0.000326386 17
+3 0.144902210 1
+4 0.000422863 17
+3 0.149559996 1
+4 0.000338509 18
+3 0.153694128 1
+4 0.000338244 17
+3 4.206426919 1
+3 0.103717321 1
+4 0.000360936 33
+3 0.619710519 16
+4 0.000530304 67
+3 0.822678487 1
+4 0.110011343 33
+3 2.430491651 1
+4 0.000383286 17
+3 0.489593323 1
+4 0.000336921 17
+3 0.261771486 1
+3 0.055956088 1
+4 0.000425498 30
+3 1.317893619 6
+4 0.000381459 24
+3 0.513259308 2
+4 0.000379054 53
+3 0.251556729 6
+4 0.000429874 6
+3 0.123850490 1
+4 0.000376758 43
+3 0.455590257 1
+4 0.000373481 17
+3 0.009327020 1
+4 0.000336126 18
+3 0.895963662 1
+4 0.000447140 18
+3 0.589748576 1
+3 0.071809754 1
+4 0.000350926 4
+3 0.199565306 1
+4 0.000413549 4
+3 0.319747540 1
+4 0.000350618 17
+3 0.201699161 1
+4 0.000347274 18
+3 1.549587898 1
+4 0.000352369 18
+3 0.177712722 1
+4 0.000339430 19
+3 0.149611635 1
+4 0.000330970 16
+3 0.145801068 1
+4 0.000337969 20
+3 0.317648862 1
+4 0.000421408 15
+4 0.018480285 86
+3 0.485114517 1
+4 0.000499266 39
+3 0.201386408 1
+4 0.000462504 18
+3 0.189506678 1
+4 0.000355374 16
+3 0.170158573 1
+4 0.000436753 17
+3 0.965253218 1
+4 0.000369171 17
+3 0.185558447 1
+4 0.000345242 16
+3 0.149548076 1
+4 0.000345254 16
+3 0.155337511 1
+4 0.000346110 14
+3 0.332079954 1
+3 0.153896742 1
+4 0.000394003 65
+3 0.189619752 1
+4 0.000359015 14
+3 0.201770281 1
+4 0.000322599 18
+3 0.165592397 1
+4 0.000371551 16
+3 0.169598000 1
+4 0.000372484 17
+3 0.141619226 1
+4 0.000426226 16
+3 0.499911586 1
+4 0.000358731 18
+3 0.083382753 1
+4 0.000369646 18
+3 0.082957105 1
+4 0.000327406 17
+3 0.082715862 1
+4 0.000349219 17
+3 0.082762668 1
+4 0.000334275 18
+3 0.083555638 1
+4 0.000430642 17
+3 0.083462271 1
+4 0.000330495 18
+3 0.083430157 1
+4 0.000377314 18
+3 0.083701151 1
+4 0.000322508 17
+3 0.494763645 1
+4 0.000433546 18
+3 0.215492413 1
+4 0.000384989 31
+3 0.815854569 1
+4 0.000391280 28
+3 0.583465415 1
+4 0.000394001 17
+3 0.591890813 1
+4 0.000386881 18
+3 67.177561192 2
+4 0.105917815 49
+3 0.038088666 1
+4 0.000352776 17
+3 0.199862087 1
+4 0.000339868 16
+3 0.151309765 1
+4 0.000355404 17
+3 0.320348551 1
+4 0.000358010 16
+3 0.185209753 1
+4 0.000413594 16
+3 0.125500032 1
+4 0.000329879 15
+3 0.464186187 1
+4 0.000389574 19
+3 0.143198480 1
+4 0.000386303 16
+3 0.335490147 1
+4 0.000343078 19
+3 0.127700355 1
+4 0.000331710 17
+3 0.119411202 1
+4 0.000343321 18
+3 0.167759692 1
+4 0.000375966 18
+3 0.119802854 1
+4 0.000354809 18
+3 0.119509308 1
+4 0.000324820 17
+3 0.143667106 1
+4 0.000382790 18
+3 0.103673680 1
+4 0.000335793 17
+3 0.135643969 1
+4 0.000340830 18
+3 0.119781457 1
+4 0.000414540 18
+3 0.151559279 1
+4 0.000376428 19
+3 0.103502352 1
+4 0.000343095 18
+3 0.327918937 1
+4 0.000369007 18
+3 0.191386211 1
+4 0.000323451 18
+3 0.055833584 1
+4 0.000339316 18
+3 0.183497133 1
+4 0.000341701 18
+3 2.759884215 1
+4 0.000353817 17
+3 1.343698374 1
+4 0.000398678 18
+3 0.263597194 1
+4 0.000351283 18
+3 0.136171086 1
+4 0.000323570 18
+3 0.383311119 1
+4 0.000368396 17
+3 0.129580242 1
+4 0.000326319 17
+3 0.125535686 1
+4 0.000356268 18
+3 0.119521654 1
+4 0.000334366 17
+3 0.071742130 1
+4 0.000373644 19
+3 0.103629767 1
+4 0.000352929 17
+3 0.143690325 1
+4 0.000332635 18
+3 0.111666624 1
+4 0.000331586 18
+3 0.087678783 1
+4 0.000335957 17
+3 0.087739242 1
+4 0.000345426 18
+3 0.087665513 1
+4 0.000329670 18
+3 0.135534046 1
+4 0.000408805 18
+3 0.063614214 1
+4 0.000326288 17
+3 0.503854866 1
+4 0.000386003 18
+3 0.079473988 1
+4 0.000341047 19
+3 0.007840380 1
+4 0.000339496 18
+3 0.183870771 1
+4 0.000329080 18
+3 0.063320318 1
+4 0.000322379 18
+3 0.135725119 1
+4 0.000358219 18
+3 0.111524351 1
+4 0.000343725 18
+3 0.359700050 2
+4 0.000378278 37
+3 0.343740597 1
+4 0.000348623 18
+3 0.185974011 1
+4 0.000324519 17
+3 0.221497352 1
+4 0.000348255 18
+3 61.266181291 1
+4 0.000354372 31
+3 0.551303471 1
+4 0.000368484 29
+3 0.599410219 1
+4 0.000400874 29
+3 0.127552920 1
+4 0.000362578 29
+3 0.071716928 1
+4 0.000344303 29
+3 0.087544652 1
+4 0.000340316 29
+3 0.722100185 1
+4 0.110021264 31
+3 20.680890782 1
+4 0.000373634 20
+3 0.185089699 1
+4 0.000362602 19
+3 0.165544295 1
+4 0.000352237 16
+3 0.257714646 1
+4 0.000382170 17
+3 4.566358379 1
+3 0.169459880 1
+4 0.000375644 75
+3 0.190699375 1
+3 0.152920201 1
+4 0.000380041 106
+3 0.205688285 1
+3 0.154039503 1
+4 0.000492548 38
+3 0.189318760 1
+3 0.124691703 1
+4 0.000364730 47
+3 1.411224968 1
+4 0.000369994 9
+3 0.167522151 1
+4 0.000349130 1
+3 0.143891438 1
+4 0.000383205 1
+4 0.000545951 10
+4 0.000360470 60
+3 1.470625810 1
+4 0.000386167 35
+3 0.153570765 1
+4 0.000350691 18
+3 0.149620068 1
+4 0.000365596 16
+3 0.137623239 1
+4 0.000387301 16
+3 0.149520210 1
+4 0.000415206 17
+3 0.151625465 1
+4 0.000371854 28
+3 0.080573318 1
+4 0.000357410 17
+3 0.110579480 1
+4 0.000325456 18
+3 0.239863880 1
+4 0.000385086 18
+3 0.183564586 1
+4 0.000366174 18
+3 0.087765549 1
+4 0.000427781 19
+3 0.239509128 1
+4 0.000346854 18
+3 0.007633165 1
+4 0.000373394 18
+3 0.087639180 1
+4 0.000337988 18
+3 0.319775512 1
+4 0.000505715 17
+3 0.161491658 1
+4 0.000352871 17
+3 0.085589099 1
+4 0.000370120 17
+3 0.184838360 1
+4 0.000409714 18
+3 0.094224328 1
+4 0.000370512 18
+3 0.047660818 1
+4 0.000328388 18
+3 0.111610547 1
+4 0.000404627 18
+3 0.055751577 1
+4 0.000325479 18
+3 0.127599689 1
+4 0.000375926 18
+3 0.071769878 1
+4 0.000327629 18
+3 0.087684664 1
+4 0.000416728 17
+3 0.111457791 1
+4 0.000327898 18
+3 0.087812327 1
+4 0.000351461 19
+3 0.055612649 1
+4 0.000328030 18
+3 0.072130867 1
+4 0.000369877 18
+3 0.167161278 1
+4 0.000329555 18
+3 0.087618415 1
+4 0.000413663 18
+3 0.063484181 1
+4 0.000352491 17
+3 0.567916037 1
+4 0.000387987 18
+3 0.103339604 1
+4 0.000330244 18
+3 0.103795367 1
+4 0.000370998 18
+3 0.095640338 1
+4 0.000342275 17
+3 1.007620119 1
+4 0.000417762 19
+3 0.063692281 1
+4 0.000343725 18
+3 0.193859611 1
+4 0.000369170 18
+3 0.085516875 1
+4 0.000350647 18
+3 0.111527754 1
+4 0.000404490 18
+3 0.639826877 1
+4 0.000376295 18
+3 0.135447001 1
+4 0.000358152 18
+3 0.239822952 1
+4 0.000348368 17
+3 0.138692136 1
+4 0.000337824 17
+3 0.220537966 1
+4 0.000384335 18
+3 0.063512962 1
+4 0.000341670 18
+3 0.135704602 1
+4 0.000330981 18
+3 0.327799432 1
+4 0.000380412 36
+4 0.705157028 18
+3 0.019950283 1
+4 0.110054367 29
+3 2.316470417 1
+4 0.000419398 10
+3 0.095529461 1
+4 0.000330058 1
+3 0.111813412 1
+4 0.000463456 1
+4 0.000412210 71
+3 2.943675520 1
+4 0.000400463 39
+3 2.063298340 1
+4 0.000355686 19
+3 0.185555546 1
+4 0.000362504 18
+3 0.165455731 1
+4 0.000345161 20
+3 0.153747794 1
+4 0.000330354 19
+3 0.301780484 1
+4 0.000382464 20
+3 0.177433698 1
+4 0.000348824 20
+3 0.133755788 1
+4 0.000339111 18
+3 0.233597558 1
+4 0.000335806 19
+3 0.773747586 1
+3 0.272072108 1
+3 0.113925233 1
+4 0.000355719 31
+3 0.237636070 1
+4 0.000413470 284
+3 0.223648251 1
+4 0.000386499 41
+3 0.161577638 1
+4 0.000347935 17
+3 0.141694835 1
+4 0.000323027 16
+3 0.161769830 1
+4 0.000321395 16
+3 0.133603573 1
+4 0.000358816 16
+3 0.129628258 1
+4 0.000324973 18
+3 15.158245983 2
+4 0.000381351 17
+3 0.144128400 1
+4 0.000402588 17
+3 0.311178227 1
+3 0.071831442 1
+4 0.000370743 29
+3 0.215685324 1
+4 0.000337607 18
+3 0.127651179 1
+4 0.000407826 17
+3 0.087480453 1
+4 0.000371903 13
+3 0.079895733 1
+4 0.000341664 11
+3 0.175686154 1
+4 0.000346960 11
+3 0.183434115 1
+4 0.000425501 13
+3 0.183686290 1
+4 0.000371790 16
+3 0.119704637 1
+4 0.000422827 19
+3 0.658458051 1
+4 0.110009419 33
+3 4.095778374 1
+4 0.000412939 17
+3 0.499871945 1
+4 0.000365514 17
+3 0.083258950 1
+4 0.000457382 17
+3 0.083555168 1
+4 0.000333139 19
+3 0.082757480 1
+4 0.000427081 34
+3 0.082955737 1
+4 0.000369778 57
+3 0.083140434 1
+4 0.000400397 72
+3 0.168959595 1
+4 0.000427643 19
+3 0.500214531 1
+4 0.000366360 18
+3 0.082637030 1
+4 0.000321226 18
+3 0.083382411 1
+4 0.000321180 18
+3 0.083317085 1
+4 0.000352069 17
+3 0.083060249 1
+4 0.000326548 17
+3 0.083291726 1
+4 0.000320362 17
+3 0.769933000 1
+4 0.000393975 17
+3 0.919667510 1
+4 0.000352380 17
+3 0.311512747 1
+4 0.000342246 17
+3 0.201904768 1
+4 0.000337561 17
+3 0.149354708 1
+4 0.000330234 17
+3 0.161865319 1
+4 0.000344640 19
+3 0.197546984 1
+4 0.000398805 16
+3 0.263704802 1
+4 0.000365442 18
+3 0.209456425 1
+4 0.000346204 18
+3 0.149810929 1
+4 0.000326993 17
+3 0.145647497 1
+4 0.000336915 17
+3 0.117654947 1
+4 0.000326396 17
+3 0.711858350 1
+3 0.215794237 1
+3 0.098692624 1
+4 0.000352279 30
+3 0.245072663 1
+4 0.000413162 152
+3 0.343589827 1
+4 0.000353535 43
+3 0.217628262 1
+4 0.000388389 17
+3 0.285641658 1
+4 0.000349375 17
+3 0.169616288 1
+4 0.000329603 18
+3 0.181998092 1
+4 0.000355735 17
+3 0.185294964 1
+4 0.000335426 17
+3 0.197804731 1
+4 0.000561390 18
+3 0.167404808 1
+4 0.000356999 18
+3 0.185860111 1
+4 0.000339021 17
+3 0.781427426 1
+4 0.000345923 17
+3 0.185697121 1
+4 0.000347099 18
+3 0.413672727 1
+3 0.072009864 1
+4 0.000367795 29
+3 1.239791419 1
+4 0.000372411 18
+3 0.071340348 1
+4 0.000349935 18
+3 0.087787090 1
+4 0.000341787 18
+3 0.064184380 1
+4 0.000373641 18
+3 0.343127607 2
+4 0.000363811 40
+3 0.495728208 1
+3 0.153866919 1
+4 0.000381217 117
+3 0.317668622 1
+4 0.000343528 18
+3 0.201756661 1
+4 0.000357579 18
+3 0.181438883 1
+4 0.000431407 17
+3 0.169782035 1
+4 0.000355737 17
+3 0.158459464 1
+4 0.000368564 18
+3 0.168862312 1
+4 0.000353069 17
+3 0.309583374 1
+4 0.000341940 17
+3 6.528430103 1
+3 0.055462031 1
+4 0.000367215 29
+3 0.351596495 1
+4 0.000434845 18
+3 0.055556172 1
+4 0.000345054 18
+3 0.127601700 1
+4 0.000369145 18
+3 0.119719841 1
+4 0.000352897 18
+3 0.071669428 1
+4 0.000421346 18
+3 0.263567769 2
+4 0.000393053 28
+3 0.153564993 1
+4 0.000338198 17
+3 0.229730832 1
+3 0.063895311 1
+4 0.000359651 33
+3 0.127722731 1
+4 0.000449988 18
+3 0.103515795 1
+4 0.000359790 18
+3 0.151624155 1
+4 0.000389670 18
+3 0.151650854 1
+4 0.000371329 18
+3 0.624624544 2
+4 0.000416918 29
+3 0.168504380 1
+4 0.000421755 17
+3 10.654173843 2
+4 0.000352326 18
+3 0.424138296 1
+3 0.055311738 1
+4 0.000356667 4
+3 0.183672243 1
+3 0.047968635 1
+4 0.000396462 4
+3 0.183787577 1
+3 0.063925096 1
+4 0.000358036 4
+3 0.319605460 1
+3 0.071929449 1
+4 0.000465348 4
+3 0.223722878 1
+4 0.000363252 10
+3 0.183587733 1
+4 0.000433712 14
+3 0.647630308 1
+3 0.063895585 1
+4 0.000417815 4
+3 0.535615893 1
+3 0.064012416 1
+4 0.000348669 4
+3 0.175726381 1
+4 0.000365969 17
+3 0.169966104 1
+4 0.000357277 17
+3 0.133255650 1
+4 0.000403378 17
+3 0.137644548 1
+4 0.000350718 18
+3 0.229589398 1
+4 0.000365216 20
+3 0.463682245 1
+4 0.000350292 17
+3 0.503710571 1
+3 0.071984253 1
+4 0.000365719 28
+3 0.239651030 1
+4 0.000371735 18
+3 0.135639150 1
+4 0.000347031 18
+3 0.375716854 1
+4 0.000353884 18
+3 0.145568976 1
+4 0.000359135 18
+3 0.141844499 1
+4 0.000342832 24
+3 0.055394243 1
+4 0.000427838 23
+3 0.055635519 1
+4 0.000326181 23
+3 0.591843859 2
+4 0.000389100 35
+3 0.499738355 1
+4 0.000369830 16
+3 0.083117755 1
+4 0.000333179 20
+3 0.082622531 1
+4 0.000326263 20
+3 0.082752732 1
+4 0.000351052 20
+3 0.082639690 1
+4 0.000397694 19
+3 0.083120133 1
+4 0.000365561 16
+3 0.084210436 1
+4 0.000333697 20
+3 0.082058788 1
+4 0.000410842 21
+3 0.083103481 1
+4 0.000345452 17
+3 0.083358651 1
+4 0.000425225 86
+3 0.082712757 1
+4 0.000367934 47
+3 0.330067959 1
+4 0.000525402 20
+3 0.191546795 1
+4 0.000484461 18
+3 0.161572675 1
+4 0.000409905 13
+3 0.229427039 1
+3 0.072238531 1
+4 0.000384219 28
+3 0.199416678 1
+4 0.000369245 13
+3 0.159740429 1
+4 0.000359174 16
+3 0.103384937 1
+4 0.000342926 17
+3 0.111719927 1
+4 0.000334395 18
+3 0.191704946 1
+4 0.000351843 24
+3 0.135694345 1
+4 0.000385816 23
+3 0.183679105 1
+4 0.000341780 23
+3 0.135643465 1
+4 0.000409507 23
+3 0.263719585 2
+4 0.000430565 36
+3 0.745526976 1
+4 0.000349700 17
+3 0.221526461 1
+3 0.154139252 1
+4 0.000363741 40
+3 0.197648612 1
+4 0.000380234 18
+3 0.145592219 1
+4 0.000347438 18
+3 0.497692162 1
+4 0.000559334 17
+3 0.083258084 1
+4 0.000366159 17
+3 0.082714433 1
+4 0.000363401 18
+3 0.284743957 1
+4 0.000380457 17
+3 0.983705644 1
+4 0.000455424 17
+3 4.128251235 1
+3 0.055263603 1
+4 0.000392117 29
+3 0.311678075 1
+4 0.000364203 17
+3 0.183681414 1
+4 0.000440272 18
+3 0.055707892 1
+4 0.000336896 18
+3 0.127524254 1
+4 0.000347727 18
+3 0.119410661 1
+4 0.000362210 17
+3 0.352201070 2
+4 0.000382496 28
+3 0.161470026 1
+4 0.000366634 17
+3 0.981529955 1
+3 0.071904396 1
+4 0.000375458 33
+3 1.687914699 1
+4 0.000375000 18
+3 0.095554075 1
+4 0.000395143 18
+3 0.335928270 1
+4 0.000415245 19
+3 0.151152635 1
+4 0.000403090 18
+3 0.223691617 1
+4 0.000382719 16
+3 0.095596121 1
+4 0.000552478 13
+3 0.479860646 2
+4 0.000394744 29
+3 0.145244202 1
+4 0.000428117 11
+3 0.334356045 1
+3 0.047245638 1
+4 0.000364391 29
+3 0.231474679 1
+4 0.000366527 11
+3 0.127831282 1
+4 0.000348438 13
+3 0.119706825 1
+4 0.000413701 16
+3 0.159493916 1
+4 0.000337168 18
+3 0.063503681 1
+4 0.000413528 18
+3 0.017324370 1
+4 0.000363635 19
+3 0.037925101 1
+4 0.000359329 34
+3 0.447799378 1
+4 0.000354927 17
+3 0.155150106 1
+4 0.000358097 18
+3 0.548165767 1
+4 0.000435383 19
+3 0.709231736 1
+4 0.110013539 39
+3 2.317003920 1
+4 0.000370810 18
+3 0.137062672 1
+4 0.000451671 17
+3 0.269450345 1
+3 0.055962476 1
+4 0.000376465 28
+3 0.143660940 1
+4 0.000324800 18
+3 0.047648307 1
+4 0.000324962 18
+3 0.159709120 1
+4 0.000330247 18
+3 0.055824884 1
+4 0.000344909 18
+3 0.175503094 1
+4 0.000417635 29
+3 0.071590626 1
+4 0.000343271 29
+3 0.183678892 1
+4 0.000381034 29
+3 0.319724383 2
+4 0.000383703 24
+3 0.191668805 1
+4 0.000371153 4
+3 0.631573623 1
+4 0.000351948 9
+3 3.567896880 1
+4 0.000413212 1
+3 0.351539578 1
+4 0.000365350 1
+3 0.191536273 1
+4 0.000372288 43
+3 1.055699949 1
+4 0.000397684 4
+3 1.199544502 1
+4 0.000366758 20
+3 1.959891454 1
+4 0.000383916 4
+3 0.391505464 1
+4 0.000517804 21
+4 0.000377686 41
+3 0.623122013 1
+4 0.000404023 43
+3 0.500068594 1
+4 0.000367278 19
+3 0.082673669 1
+4 0.000414010 17
+3 0.083212499 1
+4 0.000361841 20
+3 0.083398609 1
+4 0.000378938 20
+3 0.083503493 1
+4 0.000339474 20
+3 0.083548955 1
+4 0.000350817 19
+3 0.082922183 1
+4 0.000380499 16
+3 0.082633674 1
+4 0.000419267 20
+3 0.346679965 1
+4 0.000345699 9
+3 0.127600231 1
+4 0.000348823 1
+3 0.079852974 1
+4 0.000384659 1
+4 0.000487278 71
+3 1.047053399 1
+4 0.000371454 35
+3 0.201577612 1
+4 0.000346492 18
+3 0.141620220 1
+4 0.000434290 20
+3 0.161725379 1
+4 0.000349536 17
+3 0.381540104 1
+4 0.000458714 20
+3 0.255538554 1
+4 0.000362273 20
+3 0.217589396 1
+4 0.000442248 17
+3 0.197745827 1
+4 0.000361737 19
+3 0.217592627 1
+4 0.000417554 16
+3 0.237510507 1
+4 0.000365859 18
+3 0.185442213 1
+4 0.000383843 20
+3 0.157776099 1
+4 0.000388969 17
+3 0.145656120 1
+4 0.000432544 20
+3 0.725571649 1
+3 0.224026841 1
+3 0.130120797 1
+4 0.000463027 195
+3 0.413944645 1
+4 0.000590754 739
+3 3.767186937 1
+4 0.000401657 17
+3 0.501150681 1
+4 0.000383413 17
+3 0.083052650 1
+4 0.000406041 18
+3 0.082919414 1
+4 0.000341142 17
+3 0.083048449 1
+4 0.000389613 18
+3 0.083058567 1
+4 0.000341517 20
+3 0.083738747 1
+4 0.000401697 17
+3 0.083487118 1
+4 0.000318078 19
+3 0.082386624 1
+4 0.000349825 20
+3 0.083549970 1
+4 0.000348323 17
+3 0.083216984 1
+4 0.000357428 19
+3 2.002381804 1
+4 0.000472399 182
+3 0.391433807 1
+4 0.000415113 41
+3 0.153619892 1
+4 0.000339569 16
+3 0.157579095 1
+4 0.000381298 16
+3 0.137710185 1
+4 0.000331000 15
+3 0.237609414 1
+3 0.154038387 1
+4 0.000386302 28
+3 0.085678700 1
+4 0.000342804 15
+3 0.137577797 1
+4 0.000325385 17
+3 0.125663214 1
+4 0.000339410 16
+3 0.129648391 1
+4 0.000371056 16
+3 0.133745687 1
+4 0.000344839 16
+3 0.121870473 1
+4 0.000344271 16
+3 0.141414753 1
+4 0.000349286 16
+3 0.279635191 1
+4 0.000368680 83
+3 0.919741389 1
+4 0.000372528 16
+3 0.185634184 1
+4 0.000334268 18
+3 0.149643991 1
+4 0.000381864 16
+3 0.178813890 1
+4 0.000340575 16
+3 0.132512157 1
+4 0.000326605 16
+3 0.207669487 1
+3 0.130001555 1
+4 0.000373613 30
+3 0.101685025 1
+4 0.000359406 16
+3 0.169496704 1
+4 0.000347369 16
+3 0.117830690 1
+4 0.000346260 15
+3 0.271560924 1
+4 0.000378261 70
+3 0.335674560 1
+4 0.000334295 17
+3 0.319680454 1
+4 0.000381445 17
+3 0.111605973 1
+4 0.000330906 16
+3 0.351541311 1
+3 0.055960494 1
+4 0.000350943 27
+3 0.231761623 1
+4 0.000365793 17
+3 0.071605203 1
+4 0.000375718 17
+3 0.063717020 1
+4 0.000426567 17
+3 0.167512881 1
+4 0.000373898 17
+3 0.215669475 1
+4 0.000387267 18
+3 0.119543451 1
+4 0.000350589 18
+3 0.119698085 1
+4 0.000383518 18
+3 0.063626059 1
+4 0.000331352 18
+3 0.151709723 1
+4 0.000444992 18
+3 0.415446226 2
+4 0.000358904 10
+3 0.111754384 1
+4 0.000375156 1
+3 0.087635169 1
+4 0.000352317 1
+4 0.000356910 70
+3 0.647287901 1
+4 0.000418985 38
+3 0.500906857 1
+4 0.000359649 21
+3 0.082239879 1
+4 0.000401465 19
+3 0.082678794 1
+4 0.000349987 20
+3 6.253213528 1
+4 0.000594687 818
+3 0.943207476 1
+4 0.000359186 18
+3 0.500411947 1
+4 0.000363800 17
+3 0.082935185 1
+4 0.000364544 19
+3 0.083270215 1
+4 0.000324230 16
+3 0.082879840 1
+4 0.000328773 16
+3 0.394701064 1
+4 0.000342138 16
+3 0.498004689 1
+4 0.000343189 18
+3 0.084036201 1
+4 0.000328291 19
+3 0.082809036 1
+4 0.000320226 18
+3 0.083381699 1
+4 0.000356306 19
+3 0.082845594 1
+4 0.000362854 17
+3 0.082591044 1
+4 0.000330810 20
+3 0.274046350 1
+4 0.000358247 17
+3 1.663733384 1
+4 0.000385247 17
+3 0.169387535 1
+4 0.000338773 18
+3 0.453821805 1
+4 0.000364475 17
+3 0.815670849 1
+4 0.000397658 21
+3 3.463852526 1
+4 0.000372814 10
+3 0.135519697 1
+4 0.000323566 1
+3 0.087713390 1
+4 0.000342568 1
+4 0.000308209 14
+4 0.000365143 57
+3 0.366888761 1
+4 0.000410446 39
+3 0.500676434 1
+4 0.000348263 17
+3 0.083090874 1
+4 0.000434494 19
+3 0.082830339 1
+4 0.000324887 16
+3 0.083566806 1
+4 0.000402301 20
+3 0.083173820 1
+4 0.000334397 18
+3 0.082730980 1
+4 0.000393689 17
+3 0.082825052 1
+4 0.000341337 19
+3 0.083170302 1
+4 0.000377153 14
+3 0.083072838 1
+4 0.000390173 56
+3 0.082999886 1
+4 0.000439470 75
+3 0.082762651 1
+4 0.000395232 113
+3 0.082620995 1
+4 0.000397350 61
+3 0.082871001 1
+4 0.000373226 34
+3 0.083575770 1
+4 0.000409959 63
+3 0.082917348 1
+4 0.000372697 69
+3 0.163160664 1
+4 0.000430026 22
+3 0.499891634 1
+4 0.000363031 17
+3 0.083667974 1
+4 0.000358611 18
+3 0.083655556 1
+4 0.000331308 20
+3 0.082933196 1
+4 0.000406880 17
+3 0.083358936 1
+4 0.000338614 20
+3 0.082833576 1
+4 0.000352971 17
+3 0.083692508 1
+4 0.000408021 18
+3 0.082857776 1
+4 0.000367410 20
+3 0.083019645 1
+4 0.000332219 17
+3 21.927781806 1
+4 0.000441868 10
+3 0.502837059 1
+4 0.000350164 1
+3 0.151681189 1
+4 0.000353626 1
+3 0.151622397 1
+4 0.000311634 1
+3 0.087826712 1
+4 0.000353519 1
+3 0.151558813 1
+4 0.000327227 1
+3 0.231730506 1
+4 0.000651083 903
+3 32.501930553 1
+4 0.109975552 1
+3 0.028943050 1
+4 0.000370553 17
+3 0.193248641 1
+4 0.000388154 19
+3 0.197569088 1
+4 0.000387741 19
+3 0.337809277 1
+4 0.000368492 16
+3 1.509640262 1
+4 0.000364843 16
+3 0.169678380 1
+4 0.000390517 16
+3 0.149422705 1
+4 0.000422957 17
+3 0.177633505 1
+4 0.000350401 16
+3 0.149621210 1
+4 0.000384687 16
+3 0.327694270 1
+4 0.000358998 22
+3 0.911712189 1
+4 0.000401784 38
+3 0.504510471 1
+4 0.000396015 38
+3 0.526653542 2
+4 0.000493199 32
+3 0.169493494 1
+4 0.000336623 16
+3 0.149703387 1
+4 0.000357534 17
+3 0.105766267 1
+4 0.000329302 16
+3 0.245599159 1
+4 0.000406078 16
+3 0.575618562 1
+4 0.000364879 16
+3 0.311608382 1
+4 0.000349871 16
+3 0.185596270 1
+4 0.000398002 16
+3 1.365688778 1
+4 0.000363466 16
+3 0.255699476 1
+4 0.000359577 16
+3 0.153604076 1
+4 0.000329306 16
+3 0.389581420 1
+4 0.000348745 30
+3 0.335840754 1
+4 0.000400729 43
+3 0.447431650 2
+4 0.000390504 30
+3 0.185734624 1
+4 0.000385907 16
+3 0.285715442 1
+4 0.000366225 16
+3 0.319421703 1
+4 0.000358107 16
+3 0.207748026 1
+4 0.000353624 23
+3 0.143468126 1
+4 0.000390232 40
+3 0.199737673 1
+4 0.000360893 40
+3 0.151876766 1
+4 0.000363927 40
+3 0.103505994 1
+4 0.000400039 40
+3 0.127470683 1
+4 0.000351737 40
+3 0.087789128 1
+4 0.000364161 40
+3 0.103384124 1
+4 0.000355439 40
+3 0.127838284 1
+4 0.000363215 40
+3 0.647731652 2
+4 0.000391568 10
+3 0.095454269 1
+4 0.000345634 1
+3 0.119803172 1
+4 0.000395598 1
+4 0.000411305 70
+3 2.687757586 1
+4 0.000771462 909
+3 0.831467981 1
+4 0.003215880 778
+3 11.679345950 1
+3 0.021098554 1
+4 0.000353074 16
+3 0.500492644 1
+4 0.000350399 15
+3 16.339427653 2
+4 0.000483019 18
+3 0.234059151 1
+4 0.000399213 17
+3 0.181245736 1
+4 0.000373271 16
+3 0.377574752 1
+4 0.000399487 15
+3 0.213541131 1
+4 0.000363939 15
+3 0.455592358 1
+4 0.000368419 15
+3 0.217860660 1
+4 0.000362396 15
+3 0.829822342 1
+3 0.199520605 1
+3 0.122077648 1
+4 0.000371995 29
+3 0.301692078 1
+4 0.000429013 168
+3 0.263429942 1
+4 0.000439329 42
+3 0.185772461 1
+4 0.000367660 17
+3 0.173522004 1
+4 0.000351702 16
+3 0.169723295 1
+4 0.000353912 16
+3 0.181558878 1
+4 0.000346110 17
+3 0.360811073 1
+4 0.000384036 16
+3 0.406733402 1
+3 0.071723810 1
+4 0.000435085 4
+3 0.183594255 1
+3 0.064832901 1
+4 0.000364702 4
+3 0.182897521 1
+3 0.063976876 1
+4 0.000447247 4
+3 0.183453955 1
+3 0.063996744 1
+4 0.000368818 4
+3 0.199914064 1
+3 0.055782650 1
+4 0.000429917 4
+3 0.527557291 1
+3 0.081236809 1
+4 0.000396926 4
+3 0.958840513 1
+4 0.000419130 4
+3 0.239238446 1
+4 0.000358296 16
+3 0.383668436 1
+4 0.000430813 4
+3 0.311593779 1
+4 0.000372858 16
+3 0.255700878 1
+4 0.000468984 17
+3 0.170610780 1
+4 0.000348450 16
+3 0.180469947 1
+4 0.000550694 17
+3 0.201643938 1
+4 0.000372859 16
+3 0.229538559 1
+4 0.000382536 16
+3 0.185532139 1
+4 0.000356124 16
+3 0.261601985 1
+4 0.000387245 16
+3 0.135920173 1
+4 0.000364712 4
+3 0.137582828 1
+4 0.000406378 7
+3 0.101406308 1
+4 0.000378019 23
+3 0.127611094 1
+4 0.000416266 19
+3 0.063597802 1
+4 0.000351139 19
+3 0.135777101 1
+4 0.000383814 19
+3 0.071872137 1
+4 0.000347966 19
+3 0.183497136 1
+4 0.000388051 19
+3 0.087333908 1
+4 0.000347077 20
+3 0.167728912 1
+4 0.000446104 19
+3 0.152024080 1
+4 0.000347542 19
+3 0.055241445 1
+4 0.000385482 19
+3 0.719955348 1
+4 0.109930592 32
+3 4.609864082 1
+4 0.000458471 18
+3 0.185496737 1
+4 0.000353455 19
+3 0.173481209 1
+4 0.000412202 16
+3 0.185800042 1
+4 0.000371954 17
+3 0.165563687 1
+4 0.000383396 16
+3 0.455705316 1
+4 0.000519137 16
+3 0.183502619 1
+3 0.087954866 1
+4 0.000398623 4
+3 0.127667464 1
+3 0.048005922 1
+4 0.000556711 4
+3 0.271606905 1
+4 0.000365658 10
+3 0.111439488 1
+4 0.000364614 1
+3 0.119629265 1
+4 0.000356249 1
+4 0.000358164 70
+3 23.456782660 1
+4 0.000420244 39
+3 0.185036269 1
+4 0.000378673 19
+3 0.261464712 1
+4 0.000358112 20
+3 0.185802233 1
+4 0.000354946 16
+3 0.133526698 1
+4 0.000351124 18
+3 0.145720194 1
+4 0.000346442 19
+3 0.141404511 1
+4 0.000347248 19
+3 0.903765278 1
+3 0.160022307 1
+3 0.122095060 1
+4 0.000359637 30
+3 0.229676169 1
+4 0.000458957 160
+3 0.281155229 1
+4 0.000370937 40
+3 0.176037772 1
+4 0.000338887 15
+3 0.141472526 1
+4 0.000364237 15
+3 0.087748400 1
+4 0.000345260 17
+3 0.185814611 1
+4 0.000402835 17
+3 0.157522572 1
+4 0.000354716 16
+3 0.145735709 1
+4 0.000442894 16
+3 0.157390360 1
+4 0.000374352 17
+3 0.519794542 1
+3 0.071877963 1
+4 0.000385470 28
+3 2.666067450 16
+4 0.000385961 42
+3 0.653306438 2
+4 0.000389654 32
+3 0.335636999 1
+3 0.055882266 1
+4 0.000376155 4
+3 0.191644598 1
+4 0.000421996 4
+3 0.159629868 1
+4 0.000380822 17
+3 0.247669348 1
+4 0.000354744 17
+3 0.233607882 1
+4 0.000474290 17
+3 0.237582654 1
+4 0.000391815 18
+3 0.265544774 1
+4 0.000403142 17
+3 2.045831577 1
+3 0.071988213 1
+4 0.000365710 33
+3 0.183567304 1
+4 0.000340983 18
+3 0.135520945 1
+4 0.000339207 18
+3 0.375758029 1
+4 0.000437595 18
+3 0.255608738 1
+4 0.000342984 18
+3 0.231779299 1
+4 0.000385756 18
+3 0.623567503 1
+4 0.000408780 19
+3 0.706978607 1
+3 0.092654921 1
+4 0.000392070 40
+3 0.151447284 1
+4 0.000397522 16
+3 0.177694701 1
+4 0.000349486 16
+3 0.237684625 1
+4 0.000395108 16
+3 0.169524623 1
+4 0.000332610 16
+3 0.109663657 1
+4 0.000393453 4
+3 18.720866665 1
+4 0.000378684 10
+3 0.183076196 1
+4 0.000372289 1
+3 0.143478724 1
+4 0.000321412 1
+3 0.223863235 1
+4 0.000329886 1
+3 0.095739590 1
+4 0.000344349 1
+3 0.255589294 1
+4 0.000381290 42
+3 6.352356328 1
+4 0.000370173 10
+3 0.247069394 1
+4 0.000358856 1
+3 0.111615287 1
+4 0.000352443 1
+3 0.095530677 1
+4 0.000320066 1
+3 0.119880870 1
+4 0.000346334 1
+3 0.071569135 1
+4 0.000389853 1
+3 0.135694663 1
+4 0.000369364 21
+4 0.000400694 626
+3 0.903231822 1
+4 0.000640086 932
+3 0.137505949 1
+4 0.000414885 4
+3 0.293443410 1
+4 0.000342797 10
+3 0.095633509 1
+4 0.000321921 1
+3 0.111824456 1
+4 0.000392877 1
+4 0.000692568 10
+4 0.000315916 61
+3 51.768343604 2
+4 0.000413690 38
+3 0.178048003 1
+4 0.000354008 20
+3 0.181050315 1
+4 0.000399295 16
+3 0.367773466 1
+4 0.000350064 17
+3 0.185496152 1
+4 0.000457337 19
+3 0.165580652 1
+4 0.000373275 20
+3 0.943666684 1
+3 0.143938971 1
+3 0.138092960 1
+4 0.000446899 31
+3 0.189573253 1
+4 0.000434622 166
+3 0.415594353 1
+4 0.000353175 43
+3 0.119498545 1
+4 0.000416279 17
+3 0.153622082 1
+4 0.000325486 17
+3 0.149797383 1
+4 0.000364900 17
+3 0.145463973 1
+4 0.000320115 18
+3 0.245861873 1
+3 0.055899416 1
+4 0.000346184 33
+3 0.145440842 1
+4 0.000330750 18
+3 0.093927827 1
+4 0.000402535 18
+3 0.151636302 1
+4 0.000334025 18
+3 0.137649589 1
+4 0.000327258 18
+3 0.165641957 1
+4 0.000344676 18
+3 0.103530501 1
+4 0.000394530 18
+3 0.119730331 1
+4 0.000344489 18
+3 0.191797816 1
+4 0.000345030 18
+3 0.519553219 1
+4 0.000375999 17
+3 0.271649244 2
+4 0.000369176 40
+3 0.159664026 1
+4 0.000343802 18
+3 0.079615085 1
+4 0.000343537 17
+3 0.145638061 1
+4 0.000343617 18
+3 0.213673268 1
+3 0.072064928 1
+4 0.000393468 29
+3 0.159540889 1
+4 0.000361177 18
+3 0.184772577 1
+4 0.000362006 18
+3 0.182583209 1
+4 0.000390393 18
+3 0.063563677 1
+4 0.000353075 18
+3 0.087721187 1
+4 0.000352908 18
+3 0.063547733 1
+4 0.000347315 19
+3 0.359639301 2
+4 0.000394679 10
+3 0.127782684 1
+4 0.000360020 1
+3 0.071659375 1
+4 0.000364721 1
+4 0.000372040 71
+3 6.634229053 1
+4 0.000421555 39
+3 2.772844912 1
+3 0.183934845 1
+3 0.122103896 1
+4 0.000367222 31
+3 0.206475986 1
+4 0.000393142 162
+3 0.398737041 1
+4 0.000358632 43
+3 0.169656431 1
+4 0.000426268 18
+3 0.141499927 1
+4 0.000324744 17
+3 0.129908896 1
+4 0.000431243 17
+3 0.157477718 1
+4 0.000331106 18
+3 0.169510188 1
+4 0.000371123 17
+3 0.349819526 1
+4 0.000346283 17
+3 0.135620817 1
+3 0.063908244 1
+4 0.000349393 29
+3 0.639705380 1
+4 0.000358994 18
+3 0.079608415 1
+4 0.000349582 18
+3 0.167641208 1
+4 0.000333097 18
+3 0.119635150 1
+4 0.000325893 18
+3 0.335988537 2
+4 0.000388503 40
+3 0.151517652 1
+4 0.000335407 18
+3 0.127531426 1
+4 0.000328917 17
+3 0.169831361 1
+4 0.000355114 18
+3 0.133559681 1
+3 0.063905257 1
+4 0.000385249 29
+3 0.183692948 1
+4 0.000348863 18
+3 0.159623972 1
+4 0.000374389 18
+3 0.063535418 1
+4 0.000350747 18
+3 0.119697622 1
+4 0.000358409 18
+3 0.151553538 1
+4 0.000402518 17
+3 0.629201687 1
+4 0.109983114 38
+3 298.263891899 1
+4 0.000588358 699
+3 1.606355242 1
+4 0.000872215 897
+3 76.011148005 2
+4 0.000390311 10
+3 0.312238015 1
+4 0.000502056 1
+3 0.102935471 1
+4 0.000351174 1
+3 0.127581255 1
+4 0.000380726 1
+3 0.103742863 1
+4 0.000384563 1
+3 0.063444415 1
+4 0.000359179 1
+3 0.359878770 1
+4 0.000473029 315
+3 0.935393460 1
+4 0.000483869 72
+3 0.217488870 1
+4 0.000383700 83
+3 0.197755857 1
+4 0.000399680 37
+3 0.353532689 1
+4 0.000393040 46
+3 0.445939810 1
+4 0.000403231 17
+3 0.193269546 1
+4 0.000384174 19
+3 0.141479206 1
+4 0.000416231 19
+3 0.185773593 1
+4 0.000344559 19
+3 1.013564710 1
+4 0.000371861 19
+3 0.500236837 1
+4 0.000349341 19
+3 0.083152533 1
+4 0.000362027 18
+3 0.083278402 1
+4 0.000337363 17
+3 0.082801903 1
+4 0.000476148 90
+3 0.082979424 1
+4 0.000371072 138
+3 0.082892788 1
+4 0.000404162 48
+3 0.083297138 1
+4 0.000374667 100
+3 0.082743191 1
+4 0.000454006 77
+3 0.171217027 1
+4 0.000357358 16
+3 0.499821948 1
+4 0.000389587 18
+3 0.083044901 1
+4 0.000359768 20
+3 0.083408324 1
+4 0.000361675 16
+3 0.083595084 1
+4 0.000345073 18
+3 0.082858679 1
+4 0.000353379 17
+3 0.083066037 1
+4 0.000364008 19
+3 0.082619739 1
+4 0.000372550 20
+3 0.083322360 1
+4 0.000335888 20
+3 0.659095664 1
+3 0.064103392 1
+4 0.000413047 4
+3 0.199480585 1
+4 0.000369964 6
+3 0.983673021 1
+3 0.192162767 1
+3 0.137843351 1
+4 0.000374780 31
+3 0.253735860 1
+4 0.000416276 35
+3 0.007498793 1
+4 0.000332880 17
+3 0.567618789 2
+4 0.000441430 56
+3 0.791639884 1
+3 0.216076388 1
+3 0.113871034 1
+4 0.000397392 30
+3 0.269670795 1
+4 0.000500106 176
+3 0.575691826 1
+4 0.000411222 43
+3 0.201417974 1
+4 0.000358402 18
+3 0.213703365 1
+4 0.000369426 17
+3 0.233813941 1
+4 0.000335005 17
+3 0.357464711 1
+4 0.000368953 18
+3 0.431768171 1
+4 0.000345909 17
+3 0.119700892 1
+3 0.063770807 1
+4 0.000352332 4
+3 0.167672569 1
+3 0.063967435 1
+4 0.000368483 4
+3 0.143672983 1
+3 0.056030855 1
+4 0.000352227 4
+3 0.160407573 1
+3 0.071172537 1
+4 0.000355767 4
+3 0.159739816 1
+3 0.039912535 1
+4 0.000347316 4
+3 0.447779307 1
+3 0.055839304 1
+4 0.000379150 5
+3 0.279712819 1
+4 0.000386731 4
+3 0.095611959 1
+4 0.000400849 24
+3 0.207798321 1
+4 0.000337390 27
+3 0.087597784 1
+4 0.000389358 27
+3 0.111494118 1
+4 0.000360532 27
+3 0.119583518 1
+4 0.000460045 27
+3 0.079741611 1
+4 0.000374955 27
+3 0.343562146 2
+4 0.000420269 36
+3 0.143619037 1
+4 0.000485945 17
+3 0.161838563 1
+4 0.000410377 17
+3 0.165388957 1
+4 0.000503584 17
+3 0.351458028 1
+4 0.002150537 18
+3 0.181744478 1
+4 0.000567521 4
+3 0.145375184 1
+4 0.000549998 7
+3 0.445548680 1
+4 0.000495244 24
+3 3.452580790 12
+4 0.000391347 32
+3 0.578726807 2
+4 0.000391488 34
+3 0.359677949 1
+4 0.000383036 17
+3 0.011477617 1
+4 0.000333260 16
+3 0.755720694 2
+4 0.000352425 1
+4 0.000440325 31
+3 0.505727615 1
+4 0.000386077 32
+3 0.341197056 1
+4 0.000373183 18
+3 0.295516508 1
+4 0.000360937 18
+3 7.173168110 1
+3 0.026864958 1
+4 0.000303644 11
+3 0.176044754 1
+4 0.000355252 1
+3 0.111242246 1
+4 0.000392288 1
+4 0.000366758 71
+3 3.295308862 1
+4 0.000416904 37
+3 0.401523517 1
+4 0.000360580 20
+3 0.405717920 1
+4 0.000389768 18
+3 0.577791745 1
+4 0.000400066 17
+3 0.181468215 1
+4 0.000401772 18
+3 0.209541880 1
+4 0.000374824 17
+3 0.213643227 1
+4 0.000387221 17
+3 0.327539140 1
+4 0.000439965 23
+3 0.143698704 1
+4 0.000385017 61
+3 0.119542477 1
+4 0.000354853 61
+3 0.095593840 1
+4 0.000456266 61
+3 0.295655918 1
+4 0.000372849 61
+3 0.375733076 1
+4 0.000403936 61
+3 0.119288440 1
+4 0.000337659 61
+3 0.056065244 1
+4 0.000361086 61
+3 0.143433148 1
+4 0.000362130 102
+3 0.087713046 1
+4 0.000372159 69
+3 1.919627989 2
+4 0.000464314 187
+3 3.551728192 1
+4 0.000393181 19
+3 0.201557515 1
+4 0.000372588 20
+3 0.349688057 1
+4 0.000420833 17
+3 4.831747260 1
+3 0.111871581 1
+3 0.114122553 1
+4 0.000354640 31
+3 0.221585743 1
+4 0.000391777 163
+3 0.240467032 1
+4 0.000434937 41
+3 0.152672352 1
+4 0.000344560 16
+3 0.149768362 1
+4 0.000434848 16
+3 0.127472340 1
+4 0.000339760 18
+3 0.178623535 1
+4 0.000353469 18
+3 0.148709804 1
+4 0.000343942 17
+3 0.153727092 1
+4 0.000386014 17
+3 0.142593698 1
+4 0.000368171 18
+3 0.208699427 1
+4 0.000396993 17
+3 0.333603582 1
+4 0.000538131 17
+3 0.135265076 1
+4 0.000339192 24
+3 0.127829179 1
+4 0.000323979 32
+3 0.119545651 1
+4 0.000342267 32
+3 0.119718848 1
+4 0.000346974 32
+3 0.223585570 1
+4 0.000369503 32
+3 0.288598091 2
+4 0.000382734 37
+3 0.286827308 1
+4 0.000406692 17
+3 0.111520326 1
+4 0.000324944 17
+3 0.153897651 1
+4 0.000346842 18
+3 0.197541026 1
+3 0.071959249 1
+4 0.000341812 33
+3 0.151570364 1
+4 0.000366159 18
+3 0.135625141 1
+4 0.000356074 18
+3 0.063913211 1
+4 0.000401265 18
+3 0.135397091 1
+4 0.000357625 17
+3 0.063550006 1
+4 0.000362082 17
+3 0.279790276 2
+4 0.000441836 42
+3 0.145473116 1
+4 0.000368696 19
+3 0.158423711 1
+4 0.000538310 20
+3 0.152974603 1
+4 0.000396211 20
+3 0.229515269 1
+4 0.000358456 19
+3 0.375529290 1
+3 0.122053636 1
+4 0.000396379 86
+3 5.117682119 1
+4 0.000355614 10
+3 0.143687036 1
+4 0.000342123 1
+3 0.103779058 1
+4 0.000338014 1
+4 0.000471743 70
+3 36.697316637 1
+4 0.000360502 36
+7 0.000559521 TSTP
+7 1.118239345 CONT
+4 0.000607646 7
+4 0.000313754 926
+3 137.956669383 1
+4 0.000608610 896
+3 4.694772644 1
+4 0.000627083 865
+3 0.527194435 1
+4 0.000635130 878
+3 0.743371590 1
+4 0.000677426 934
+3 1.135313487 1
+4 0.000611580 865
+3 31.114191724 1
+4 0.000400871 16
+3 0.498748730 1
+4 0.000370612 17
+3 0.083393608 1
+4 0.000349957 18
+3 0.083228301 1
+4 0.000357796 16
+3 0.083284779 1
+4 0.000421892 16
+3 0.083464480 1
+4 0.000364048 16
+3 0.083115757 1
+4 0.000365411 16
+3 0.545452921 1
+4 0.000375613 18
+3 0.184571070 1
+4 0.000356358 16
+3 2.197804352 1
+4 0.000397371 18
+3 0.201554287 1
+4 0.000400853 18
+3 0.405725695 1
+4 0.000372011 17
+3 2.775555603 1
+4 0.000390934 21
+3 0.501263659 1
+4 0.000381829 4
+3 0.082749646 1
+4 0.000342354 4
+3 0.082921972 1
+4 0.000334667 4
+3 0.084067835 1
+4 0.000353635 4
+3 0.083089249 1
+4 0.000368937 4
+3 0.082963484 1
+4 0.000354061 4
+3 0.242701309 1
+4 0.000354086 4
+3 1.477591715 1
+4 0.000353246 9
+3 0.592358558 1
+4 0.000377591 1
+3 0.174795711 1
+4 0.000321748 1
+3 0.247794938 1
+4 0.000338889 1
+3 0.112209648 1
+4 0.000340485 1
+3 0.135029439 1
+4 0.000341037 1
+3 0.055554909 1
+4 0.000345707 1
+3 0.191736684 1
+4 0.000358563 43
+3 0.319684203 1
+4 0.000365506 17
+3 0.399790968 1
+4 0.000361879 17
+3 0.241394863 1
+4 0.000352882 17
+3 0.725887828 1
+4 0.000477986 17
+3 0.353608370 1
+4 0.000354885 21
+3 0.429584062 1
+4 0.000396938 133
+3 0.279378180 1
+4 0.000358585 17
+3 0.175723038 1
+4 0.000409308 17
+3 4.095816823 1
+3 0.095825766 1
+4 0.000392721 79
+3 0.271896964 1
+3 0.063763870 1
+4 0.000434312 79
+3 12.400029830 2
+4 0.000385072 18
+3 0.500489311 1
+4 0.000381535 18
+3 0.082115608 1
+4 0.000331586 18
+3 0.083558181 1
+4 0.000322628 20
+3 0.082878969 1
+4 0.000412686 17
+3 0.083102007 1
+4 0.000331306 17
+3 0.083058770 1
+4 0.000368108 18
+3 0.083335584 1
+4 0.000328856 18
+3 0.083122443 1
+4 0.000375361 20
+3 0.083140106 1
+4 0.000329073 17
+3 0.535854127 1
+4 0.000363332 17
+3 0.303667929 1
+4 0.000345811 16
+3 0.127414119 1
+4 0.000329253 16
+3 0.575842927 1
+4 0.000372816 18
+3 0.207521448 1
+4 0.000380002 33
+3 0.191680395 1
+4 0.000415139 18
+3 0.239721569 1
+4 0.000359173 18
+3 0.135707566 1
+4 0.000348263 18
+3 0.127456151 1
+4 0.000345213 18
+3 0.113021388 1
+4 0.000349421 18
+3 0.070170448 1
+4 0.000383365 18
+3 0.175705240 1
+4 0.000341282 18
+3 0.039635955 1
+4 0.000448486 18
+3 0.023475627 1
+4 0.000329365 19
+3 0.151772167 1
+4 0.000355765 18
+3 0.151811396 1
+4 0.000345209 18
+3 0.311602242 1
+4 0.000376122 17
+3 0.145722459 1
+4 0.000374938 17
+3 0.141488289 1
+4 0.000411336 18
+3 0.121640620 1
+4 0.000343935 17
+3 0.157504669 1
+4 0.000368814 18
+3 0.095638665 1
+4 0.000335562 18
+3 0.151826083 1
+4 0.000370317 17
+3 0.159537640 1
+4 0.000337397 17
+3 0.200748674 1
+4 0.000433909 17
+3 0.152593300 1
+4 0.000336655 17
+3 0.157635603 1
+4 0.000376891 18
+3 0.137603741 1
+4 0.000350292 17
+3 0.061550084 1
+4 0.000403425 18
+3 0.167783816 1
+4 0.000358165 19
+3 0.159454522 1
+4 0.000356062 18
+3 0.111783645 1
+4 0.000402895 18
+3 0.071540835 1
+4 0.000352165 18
+3 0.079665713 1
+4 0.000441442 18
+3 0.087580841 1
+4 0.000427823 18
+3 0.359989306 1
+4 0.000358601 18
+3 0.239226909 1
+4 0.000373383 17
+3 0.143514814 1
+4 0.000349556 17
+3 0.167751454 1
+4 0.000392330 19
+3 0.159585858 1
+4 0.000355057 17
+3 0.111688172 1
+4 0.000435191 17
+3 0.039591792 1
+4 0.000333307 17
+3 0.079745614 1
+4 0.000380560 17
+3 0.087569485 1
+4 0.000327945 17
+3 0.143716242 1
+4 0.000362228 18
+3 0.151621835 1
+4 0.000377097 18
+3 0.119543924 1
+4 0.000402925 18
+3 0.087366870 1
+4 0.000347471 18
+3 0.087783726 1
+4 0.000351720 19
+3 0.119580802 1
+4 0.000327089 18
+3 1.399803885 1
+4 0.000373000 18
+3 0.135758540 1
+4 0.000388294 18
+3 0.063433900 1
+4 0.000389975 18
+3 0.087873763 1
+4 0.000346176 18
+3 0.015454620 1
+4 0.000345227 18
+3 0.183740784 1
+4 0.000340555 17
+3 0.183687529 1
+4 0.000350207 18
+3 0.087651959 1
+4 0.000354004 18
+3 0.095470793 1
+4 0.000329564 18
+3 0.344080703 1
+4 0.000407214 18
+3 0.375679144 1
+4 0.000386215 18
+3 0.151253567 1
+4 0.000376792 18
+3 0.368260780 1
+4 0.000426592 18
+3 0.463141441 2
+4 0.000372831 39
+3 0.499616728 1
+4 0.000349728 20
+3 0.083258270 1
+4 0.000321692 19
+3 0.082820913 1
+4 0.000371649 17
+3 0.083827042 1
+4 0.000332168 20
+3 0.083185308 1
+4 0.000332464 17
+3 0.083697529 1
+4 0.000339107 17
+3 0.083415893 1
+4 0.000364753 19
+3 0.083598749 1
+4 0.000352820 16
+3 0.083088290 1
+4 0.000427827 21
+3 0.083525197 1
+4 0.000368018 14
+3 0.506039084 1
+4 0.000379518 13
+3 0.095386336 1
+4 0.000367863 16
+3 0.161923430 1
+4 0.000354726 18
+3 0.157560479 1
+4 0.000358988 18
+3 0.423659737 1
+4 0.000353732 17
+3 0.847670925 1
+4 0.000393746 17
+3 0.431620650 1
+4 0.000403175 17
+3 1.167679625 1
+4 0.000387411 79
+3 0.249536457 1
+4 0.000365653 79
+3 0.605670872 1
+4 0.000369650 79
+3 1.783802629 2
+4 0.000379593 18
+3 0.186118123 1
+4 0.000378437 47
+3 0.180976931 1
+4 0.000351710 20
+3 0.217856920 1
+4 0.000408993 17
+3 3.517731838 1
+4 0.000373305 17
+3 0.201450541 1
+4 0.000356815 19
+3 0.245571264 1
+4 0.000341944 20
+3 0.239848248 1
+4 0.000359928 17
+3 0.311511301 1
+4 0.000351362 17
+3 0.161756301 1
+4 0.000334570 18
+3 0.205588500 1
+4 0.000426037 17
+3 0.169868284 1
+4 0.000338882 17
+3 0.109390361 1
+4 0.000355237 23
+3 0.151655281 1
+4 0.000384306 24
+3 0.327530229 1
+4 0.000345480 9
+3 0.127757608 1
+4 0.000403946 1
+3 0.175935105 1
+4 0.000454742 11
+4 0.000420094 61
+3 1.103044519 1
+4 0.000612613 922
+3 0.415175455 1
+4 0.000358090 19
+3 0.527767062 1
+4 0.000379689 16
+3 0.351574936 1
+4 0.000384239 86
+3 0.500235440 1
+4 0.000400092 77
+3 0.082757413 1
+4 0.000376150 77
+3 0.083308781 1
+4 0.000340141 77
+3 0.082992475 1
+4 0.000435990 77
+3 0.178905212 1
+4 0.000364419 77
+3 0.173403319 1
+4 0.000354806 77
+3 0.225831910 1
+4 0.000359714 77
+3 0.749493093 1
+4 0.000391440 22
+3 0.191682853 1
+4 0.000370273 22
+3 0.223780980 1
+4 0.000332007 16
+3 0.217892668 1
+4 0.000356396 17
+3 0.165424257 1
+4 0.000364054 16
+3 0.287407138 1
+4 0.000385048 16
+3 0.113280849 1
+4 0.000358545 22
+3 0.150104957 1
+4 0.000385980 23
+3 0.303582804 1
+4 0.000361146 19
+3 0.743725373 1
+4 0.000360773 16
+3 1.167690376 1
+3 0.087968963 1
+4 0.000380787 4
+3 0.159570709 1
+3 0.072026816 1
+4 0.000350365 4
+3 0.287679924 1
+4 0.000368317 4
+3 0.169859422 1
+4 0.000673128 4
+3 7.632381569 1
+4 0.109950952 1
+3 1.959673015 1
+4 0.000376965 16
+3 1.287215620 1
+3 0.210513588 1
+4 0.000391697 98
+3 0.172921613 1
+3 0.154136665 1
+4 0.000415202 100
+3 0.141822554 1
+3 0.161743453 1
+4 0.000507720 46
+3 0.157412835 1
+3 0.162251948 1
+4 0.000409228 89
+3 0.157538347 1
+3 0.401929979 1
+4 0.000406217 101
+3 0.317547177 1
+4 0.000423142 10
+3 0.151581196 1
+4 0.000518330 1
+3 0.143492974 1
+4 0.000373153 1
+3 0.079624129 1
+4 0.000337376 1
+3 0.047604678 1
+4 0.000383266 1
+3 0.184669164 1
+4 0.000601798 918
+3 3.046839043 1
+4 0.000371088 17
+3 0.145363443 1
+4 0.000371312 18
+3 0.837658318 1
+4 0.000444343 24
+3 0.575418335 1
+4 0.000377676 39
+3 0.055609717 1
+4 0.000364620 39
+3 0.287765120 1
+4 0.000386080 40
+3 0.703784086 2
+4 0.000653224 828
+3 0.319288655 1
+4 0.000622814 874
+3 0.215393969 1
+4 0.000638096 800
+3 0.631478728 1
+4 0.000380618 8
+3 0.151549926 1
+4 0.000337736 1
+3 0.039574688 1
+4 0.000329953 1
+4 0.000375688 632
+3 0.135215715 1
+4 0.000359826 9
+3 0.255687730 1
+4 0.000415834 1
+3 0.135563818 1
+4 0.000346850 1
+3 0.367827358 1
+4 0.000369753 1
+3 0.103438993 1
+4 0.000352540 1
+3 0.103648809 1
+4 0.000327471 1
+3 0.071756608 1
+4 0.000380862 1
+3 0.183704141 1
+4 0.000601790 861
+3 1.415585005 1
+4 0.000682731 1087
+3 0.167337750 1
+4 0.000612615 728
+3 0.455244017 1
+4 0.000448561 31
+4 0.000374506 698
+3 0.745164190 1
+4 0.000372895 21
+3 1.309719317 1
+4 0.000599452 914
+3 0.255336273 1
+4 0.000354554 19
+3 0.825640669 1
+4 0.000387518 21
+3 1.621708460 1
+4 0.000355082 18
+3 0.255636360 1
+4 0.000373358 18
+3 0.199571666 1
+4 0.000368407 17
+3 1.007788881 1
+4 0.000374963 4
+3 0.201587592 1
+4 0.000358092 4
+3 0.133609220 1
+4 0.000452236 4
+3 0.145869939 1
+4 0.000382109 4
+3 0.149274181 1
+4 0.000343534 4
+3 0.145708143 1
+4 0.000351243 4
+3 0.437543032 1
+4 0.000399236 4
+3 0.289909705 1
+4 0.000334891 4
+3 2.605615048 1
+4 0.000409755 18
+3 0.295695513 1
+4 0.000378715 19
+3 0.153513460 1
+4 0.000349889 20
+3 0.213713492 1
+4 0.000411932 21
+3 0.401647731 1
+4 0.000377474 22
+3 0.797560567 1
+4 0.000396681 23
+3 0.425614010 1
+4 0.000359595 24
+3 0.549657260 1
+4 0.000349846 25
+3 2.551724694 1
+4 0.000399019 18
+3 0.499929100 1
+4 0.000352614 17
+3 0.083705797 1
+4 0.000380299 117
+3 0.082983597 1
+4 0.000377553 85
+3 0.082727485 1
+4 0.000455291 34
+3 0.083219394 1
+4 0.000374830 95
+3 0.083604190 1
+4 0.000388504 97
+3 0.169736721 1
+4 0.000350924 17
+3 0.499883640 1
+4 0.000361798 17
+3 0.082699677 1
+4 0.000340410 18
+3 0.082924380 1
+4 0.000368512 20
+3 0.083266795 1
+4 0.000404601 17
+3 0.082798017 1
+4 0.000374351 17
+3 0.082640844 1
+4 0.000347335 18
+3 0.083292975 1
+4 0.000426983 17
+3 0.286914609 1
+4 0.000340747 17
+3 0.295806957 1
+4 0.000376555 4
+3 0.500023921 1
+4 0.000363726 4
+3 0.082953992 1
+4 0.000433494 4
+3 0.082709404 1
+4 0.000336450 4
+3 0.083676007 1
+4 0.000364435 4
+3 0.082964062 1
+4 0.000340507 4
+3 0.082922325 1
+4 0.000365499 4
+3 0.788259159 1
+4 0.000370031 4
+3 1.253521471 1
+4 0.000391511 4
+3 6.599914770 1
+4 0.000380933 18
+3 0.319446621 1
+4 0.000385693 17
+3 3.439896624 1
+4 0.000432834 78
+3 0.500445476 1
+4 0.000417865 78
+3 0.702340298 1
+4 0.000370513 78
+3 0.496989320 1
+4 0.000420677 79
+3 0.083494250 1
+4 0.000359145 78
+3 0.083621482 1
+4 0.000402832 159
+3 0.084331945 1
+4 0.000340128 4
+3 0.742005260 1
+4 0.000404598 4
+3 0.353637154 1
+4 0.000363675 4
+3 5.509918559 1
+4 0.000383274 17
+3 1.479529377 1
+4 0.000380697 78
+3 0.500411556 1
+4 0.000459808 78
+3 0.082778013 1
+4 0.000340857 78
+3 0.083111298 1
+4 0.000404997 78
+3 0.082735630 1
+4 0.000384490 78
+3 0.083630656 1
+4 0.000371814 78
+3 0.359183488 1
+4 0.000355458 78
+3 0.189465730 1
+4 0.000356717 78
+3 0.553740617 1
+4 0.000452195 78
+3 1.621707077 1
+4 0.000382454 18
+3 0.207563026 1
+4 0.000345149 17
+3 0.177616185 1
+4 0.000463753 17
+3 0.133458797 1
+4 0.000328028 16
+3 0.311812562 1
+4 0.000375537 16
+3 0.209715537 1
+4 0.000365633 16
+3 0.213545705 1
+4 0.000386233 22
+3 0.167579291 1
+4 0.000372100 23
+3 0.135611283 1
+4 0.000410175 16
+3 0.209722417 1
+4 0.000362663 16
+3 0.157486100 1
+4 0.000350318 22
+3 0.231957603 1
+4 0.000371729 23
+3 0.512250024 1
+4 0.000429872 16
+3 0.550878919 1
+4 0.000376199 22
+3 0.135440425 1
+4 0.000332319 23
+3 0.170257807 1
+4 0.000325663 17
+3 0.285265098 1
+4 0.000363966 17
+3 0.201519231 1
+4 0.000339678 17
+3 0.181742156 1
+4 0.000331342 17
+3 0.170582676 1
+4 0.000354224 17
+3 0.204709227 1
+4 0.000332339 17
+3 0.521756570 1
+4 0.000364615 17
+3 0.197634097 1
+4 0.000336843 17
+3 0.255701032 1
+4 0.000382266 2
+3 0.159464709 1
+4 0.000368805 17
+3 0.169720266 1
+4 0.000348238 17
+3 0.165632676 1
+4 0.000349272 17
+3 0.351517390 1
+3 0.464418734 1
+4 0.000404631 2
+3 0.743489820 1
+4 0.000405586 17
+3 0.127375207 1
+4 0.000337043 18
+3 0.170141567 1
+4 0.000393307 18
+3 0.333178526 1
+4 0.000357925 17
+3 0.183833666 1
+4 0.000467932 78
+3 0.500190251 1
+4 0.000373160 78
+3 0.082685764 1
+4 0.000385147 78
+3 0.083008182 1
+4 0.000351039 78
+3 0.083037265 1
+4 0.000434460 78
+3 0.082892682 1
+4 0.000355135 78
+3 0.083533921 1
+4 0.000377191 78
+3 0.243935726 1
+4 0.000449754 78
+3 0.213479932 1
+4 0.000382132 78
+3 2.239710334 1
+4 0.000401714 9
+3 0.159516587 1
+4 0.000408303 1
+3 0.063670632 1
+4 0.000355716 1
+4 0.000381180 71
+3 3.663406855 1
+4 0.000379384 37
+3 0.201655132 1
+4 0.000378782 16
+3 0.182043250 1
+4 0.000334297 20
+3 0.153295765 1
+4 0.000329281 17
+3 0.645757822 1
+4 0.000363122 17
+3 0.351475229 1
+4 0.000338047 17
+3 0.231540164 1
+4 0.000365529 17
+3 0.287723036 1
+4 0.000345992 17
+3 0.500168935 1
+4 0.000408512 47
+3 0.082426580 1
+4 0.000367480 92
+3 0.083224488 1
+4 0.000370449 102
+3 0.116669549 1
+4 0.000346915 18
+3 0.500213750 1
+4 0.000350082 19
+3 0.083127552 1
+4 0.000360786 20
+3 0.082980819 1
+4 0.000363822 17
+3 6.310589126 1
+4 0.000394153 17
+3 0.498354169 1
+4 0.000387554 17
+3 0.083219103 1
+4 0.000342153 18
+3 0.083160066 1
+4 0.000360452 20
+3 0.083474179 1
+4 0.000333867 17
+3 0.083153173 1
+4 0.000345219 17
+3 0.082945600 1
+4 0.000324201 18
+3 0.082839985 1
+4 0.000400573 16
+3 0.253944964 1
+4 0.000364001 17
+3 0.303707859 1
+4 0.000380456 23
+3 0.319493883 1
+4 0.000337420 26
+3 0.439684657 2
+4 0.000456120 37
+3 0.231704010 1
+4 0.000364217 17
+3 0.279796722 1
+4 0.000405976 24
+3 0.343401231 1
+4 0.000388183 74
+3 0.303555553 2
+4 0.000394285 36
+3 0.439664416 1
+4 0.000382079 134
+3 0.215740167 1
+4 0.000413677 17
+3 0.154031244 1
+4 0.000370217 19
+3 0.317173508 1
+4 0.000398654 20
+3 0.312109507 1
+4 0.000384129 133
+3 1.311086895 1
+4 0.000468258 17
+3 0.247670264 1
+4 0.000566957 765
+3 2.135572935 1
+4 0.000401778 17
+3 0.559496218 1
+4 0.000356911 17
+3 0.257605602 1
+4 0.000370437 18
+3 0.557561536 1
+4 0.000365280 17
+3 0.183589462 1
+4 0.000407185 24
+3 0.335713990 1
+4 0.000399405 104
+3 0.455592372 2
+4 0.000428032 36
+3 0.201827538 1
+4 0.000396177 47
+3 0.165325141 1
+4 0.000398182 119
+3 0.169743508 1
+4 0.000503484 125
+3 0.197465764 1
+4 0.000403824 47
+3 0.367566207 1
+4 0.000345422 20
+3 0.499948646 1
+4 0.000450718 17
+3 0.082916345 1
+4 0.000334208 19
+3 0.083743043 1
+4 0.000365424 20
+3 0.668027305 1
+4 0.000344319 9
+3 0.127616885 1
+4 0.000389556 1
+3 0.063698609 1
+4 0.000367317 1
+4 0.000308014 14
+4 0.000311920 57
+3 3.103058907 1
+4 0.000420309 37
+3 0.281430416 1
+4 0.000391572 20
+3 0.653620110 1
+4 0.000346649 17
+3 0.441696601 1
+4 0.000351826 19
+3 2.981870284 1
+4 0.000420171 34
+3 0.945760713 1
+4 0.000431728 70
+3 14.926277405 1
+4 0.000381836 17
+3 0.500010040 1
+4 0.000418235 18
+3 0.083287212 1
+4 0.000331118 20
+3 0.083248663 1
+4 0.000425143 17
+3 0.083076968 1
+4 0.000322811 19
+3 0.082702205 1
+4 0.000337987 20
+3 0.575256615 1
+4 0.000363130 17
+3 0.677561508 1
+4 0.000396849 17
+3 0.500089770 1
+4 0.000405668 17
+3 0.082727833 1
+4 0.000337580 17
+3 0.083052744 1
+4 0.000341862 18
+3 0.083609893 1
+4 0.000352462 17
+3 0.082848311 1
+4 0.000321241 17
+3 0.083823926 1
+4 0.000348848 17
+3 0.082284757 1
+4 0.000328215 18
+3 0.083189559 1
+4 0.000355194 17
+3 0.082971342 1
+4 0.000357883 18
+3 0.083156952 1
+4 0.000344987 17
+3 0.082919646 1
+4 0.000320014 18
+3 0.083883272 1
+4 0.000332894 17
+3 0.082801049 1
+4 0.000335230 17
+3 0.083369966 1
+4 0.000331249 18
+3 0.083247646 1
+4 0.000409715 17
+3 0.083043049 1
+4 0.000342522 14
+3 0.084233866 1
+4 0.000339196 16
+3 0.082430678 1
+4 0.000338452 16
+3 0.495768575 1
+4 0.000369233 18
+3 3.663651029 1
+4 0.000357787 17
+3 0.311840767 1
+4 0.000358067 22
+3 0.447516612 1
+4 0.000444672 31
+3 0.527438065 2
+4 0.000368557 24
+3 0.145854319 1
+4 0.000357463 17
+3 0.389686435 1
+4 0.000377187 17
+3 0.295524943 1
+4 0.000347405 31
+3 0.431602915 1
+4 0.000385636 42
+3 0.351714465 1
+4 0.000396298 30
+3 1.175715288 2
+4 0.000417190 37
+3 0.359523623 1
+4 0.000350170 17
+3 0.287663316 1
+4 0.000361177 31
+3 0.287672759 1
+4 0.000377838 43
+3 0.487561501 1
+4 0.000392311 31
+3 0.623635902 2
+4 0.000416460 22
+3 0.231611039 1
+4 0.000358732 24
+3 0.271842044 1
+4 0.000406813 26
+3 0.343370365 2
+4 0.000380928 33
+3 0.170726284 1
+4 0.000380691 17
+3 0.180613035 1
+4 0.000350015 17
+3 0.439559561 1
+4 0.000350252 16
+3 0.169573482 1
+4 0.000362390 18
+3 0.157768876 1
+4 0.000333562 24
+3 0.327944225 1
+4 0.000376491 33
+3 0.823624768 1
+4 0.109929671 33
+3 11.346442722 1
+4 0.000384715 17
+3 0.135385039 1
+4 0.000346971 16
+3 0.153650783 1
+4 0.000366514 18
+3 0.181638007 1
+4 0.000355682 18
+3 0.304121026 1
+4 0.000348081 17
+3 0.185381126 1
+4 0.000349748 17
+3 0.237505223 1
+4 0.000355453 24
+3 1.863642855 1
+4 0.000413811 109
+3 1.328116581 1
+4 0.000406424 109
+3 0.527169793 1
+4 0.000378795 109
+3 0.279499340 1
+4 0.000384060 109
+3 0.695805322 1
+4 0.000379395 109
+3 0.327475776 1
+4 0.000400691 126
+3 0.287808853 1
+4 0.000365527 113
+3 0.811365647 1
+4 0.110066681 33
+3 3.790382320 1
+4 0.000384889 23
+3 2.559652278 1
+3 0.279861622 1
+4 0.000346426 23
+3 0.327756463 1
+4 0.000345382 17
+3 0.169619186 1
+4 0.000355833 18
+3 0.141625037 1
+4 0.000345513 17
+3 0.279692210 1
+4 0.000350600 17
+3 0.135688208 1
+4 0.000339452 23
+3 0.087794348 1
+4 0.000357403 24
+3 4.679945306 1
+4 0.000391928 19
+3 0.369277719 1
+4 0.000362685 20
+3 0.541904679 1
+3 0.169919904 1
+4 0.000407758 146
+3 0.189486320 1
+3 0.154049223 1
+4 0.000376602 116
+3 0.173563108 1
+3 0.122124061 1
+4 0.000379450 64
+3 0.485534711 1
+4 0.000431899 8
+3 0.143536054 1
+4 0.000322833 1
+3 0.103805995 1
+4 0.000353146 1
+4 0.000876790 10
+4 0.000394966 58
+3 0.366300801 1
+4 0.000446745 37
+3 0.169506941 1
+4 0.000361830 16
+3 0.157737806 1
+4 0.000384886 16
+3 0.249607015 1
+4 0.000427266 16
+3 0.181405289 1
+4 0.000362563 16
+3 0.143733834 1
+4 0.000354720 16
+3 0.500558910 1
+4 0.000415658 18
+3 0.083461755 1
+4 0.000349338 18
+3 0.082788023 1
+4 0.000359309 17
+3 0.082908063 1
+4 0.000324597 17
+3 3.224714789 1
+4 0.000379721 17
+3 0.499538503 1
+4 0.000353926 19
+3 0.083267339 1
+4 0.000360067 16
+3 0.083652153 1
+4 0.000335256 20
+3 0.083433569 1
+4 0.000356133 17
+3 0.082976121 1
+4 0.000390926 17
+3 0.083053557 1
+4 0.000419727 17
+3 0.082594671 1
+4 0.000405612 117
+3 0.082932847 1
+4 0.000421645 78
+3 0.082956612 1
+4 0.000375613 34
+3 0.083414152 1
+4 0.000636990 95
+3 0.291714750 1
+4 0.000490907 17
+3 0.499951467 1
+4 0.000568886 18
+3 0.082670852 1
+4 0.000498291 21
+3 0.082713051 1
+4 0.000590882 17
+3 0.083230712 1
+4 0.000519918 17
+3 0.083090766 1
+4 0.000561212 17
+3 1.709356913 1
+4 0.000384305 17
+3 0.499886762 1
+4 0.000363184 17
+3 0.083006562 1
+4 0.000345084 17
+3 0.083533142 1
+4 0.000346778 20
+3 0.083482127 1
+4 0.000365645 16
+3 0.083693772 1
+4 0.000322166 20
+3 0.083716517 1
+4 0.000396755 97
+3 0.082845649 1
+4 0.000373926 98
+3 0.083463729 1
+4 0.000382354 47
+3 0.082898629 1
+4 0.000381183 92
+3 0.083018539 1
+4 0.000389878 101
+3 0.083403555 1
+4 0.000388824 47
+3 0.175108423 1
+4 0.000347562 20
+3 0.217146999 1
+4 0.000350923 17
+3 0.165603007 1
+4 0.000346764 19
+3 0.137694771 1
+4 0.000349303 20
+3 0.157613162 1
+4 0.000382712 17
+3 0.167650866 1
+4 0.000342564 17
+3 0.311745700 1
+4 0.000378919 17
+3 0.153516781 1
+4 0.000389323 17
+3 0.325654480 1
+4 0.000391744 21
+3 0.169688353 1
+4 0.000357614 4
+3 0.157534808 1
+4 0.000353330 4
+3 0.154886136 1
+4 0.000425480 4
+3 0.124415471 1
+4 0.000353887 4
+3 0.137713377 1
+4 0.000385011 4
+3 0.149458119 1
+4 0.000354594 4
+3 0.121685638 1
+4 0.000361286 4
+3 0.973709966 1
+4 0.000376678 17
+3 1.009665186 1
+4 0.000377569 19
+3 0.205524115 1
+4 0.000387418 20
+3 0.495785323 1
+4 0.000385730 4
+3 0.499647967 1
+4 0.000375708 4
+3 0.083155548 1
+4 0.000381245 4
+3 0.083038932 1
+4 0.000350367 4
+3 0.083074377 1
+4 0.000350422 4
+3 0.082811653 1
+4 0.000345684 4
+3 0.082843827 1
+4 0.000429483 4
+3 0.082536445 1
+4 0.000329136 4
+3 0.744076080 1
+4 0.000388774 17
+3 0.303425704 1
+4 0.000346177 18
+3 0.119614101 1
+4 0.000332779 17
+3 0.140024791 1
+4 0.000347506 17
+3 0.107287043 1
+4 0.000413799 23
+3 0.207633584 1
+4 0.000427452 24
+3 0.495798375 1
+4 0.000591242 838
+3 0.415387430 1
+4 0.000400310 18
+3 0.185488924 1
+4 0.000353861 17
+3 0.165759249 1
+4 0.000397123 20
+3 0.169620639 1
+4 0.000359521 16
+3 0.718012984 1
+4 0.000402799 16
+3 0.177357060 1
+4 0.000365666 17
+3 0.325489631 1
+4 0.000397737 16
+3 0.167680709 1
+4 0.000400409 4
+3 0.499983596 1
+4 0.000443905 4
+3 0.082783046 1
+4 0.000424726 4
+3 0.082516554 1
+4 0.000366547 4
+3 0.083271276 1
+4 0.000338383 4
+3 0.083111548 1
+4 0.000445116 4
+3 0.082715200 1
+4 0.000343684 4
+3 0.444670136 1
+4 0.000424947 4
+3 1.461772429 1
+4 0.000372625 16
+3 0.161544881 1
+4 0.000389758 18
+3 0.133779295 1
+4 0.000356464 19
+3 0.375657353 1
+4 0.000409811 4
+3 0.500130550 1
+4 0.000446349 4
+3 0.084072290 1
+4 0.000405097 4
+3 0.081983605 1
+4 0.000433410 4
+3 0.083212407 1
+4 0.000385627 4
+3 0.082625138 1
+4 0.000355126 4
+3 0.082970102 1
+4 0.000433675 4
+3 0.083703605 1
+4 0.000355807 4
+3 0.941974868 1
+4 0.000401594 16
+3 0.287662486 1
+4 0.000370377 17
+3 0.175662421 1
+4 0.000450268 16
+3 0.137429599 1
+4 0.000349171 16
+3 0.117702694 1
+4 0.000364947 22
+3 0.207886655 1
+4 0.000341449 23
+3 1.104204534 1
+4 0.000595586 19
+3 0.499726414 1
+4 0.000412254 17
+3 0.082763129 1
+4 0.000422345 20
+3 0.083462409 1
+4 0.000367752 20
+3 0.083536698 1
+4 0.000350644 21
+3 0.663735900 1
+4 0.000378557 21
+3 0.263573715 1
+4 0.000380666 17
+3 0.047575241 1
+4 0.000343907 16
+3 0.170558034 1
+4 0.000366080 18
+3 0.156796717 1
+4 0.000415633 18
+3 0.359565909 1
+4 0.000389897 18
+3 0.119534956 1
+4 0.000333576 18
+3 0.225726019 1
+4 0.000418449 17
+3 0.205589490 1
+4 0.000353991 4
+3 0.499804267 1
+4 0.000354127 4
+3 0.083319670 1
+4 0.000579498 4
+3 0.082781763 1
+4 0.000385999 4
+3 0.082551312 1
+4 0.000360121 4
+3 0.083515411 1
+4 0.000336331 4
+3 0.084003421 1
+4 0.000330381 4
+3 0.363489014 1
+4 0.000365388 4
+3 0.165517621 1
+4 0.000341948 18
+3 0.201602455 1
+4 0.000426000 19
+3 0.269700353 1
+4 0.000346176 20
+3 0.287606038 1
+4 0.000387541 79
+3 0.500757622 1
+4 0.000381185 79
+3 0.082492019 1
+4 0.000348990 79
+3 0.083543179 1
+4 0.000357938 79
+3 0.083056603 1
+4 0.000356201 79
+3 0.082954796 1
+4 0.000390463 79
+3 0.083051835 1
+4 0.000340912 79
+3 0.082798583 1
+4 0.000374209 79
+3 1.262590706 1
+4 0.000395391 17
+3 0.199750642 1
+4 0.000340637 20
+3 0.287499305 1
+4 0.000344857 17
+3 0.153627834 1
+4 0.000361415 17
+3 0.133617182 1
+4 0.000423563 23
+3 0.183659316 1
+4 0.000363558 24
+3 0.175599840 1
+4 0.000340404 19
+3 0.241835755 1
+4 0.000348606 16
+3 0.229516546 1
+4 0.000345795 17
+3 0.185609469 1
+4 0.000340789 18
+3 0.149637670 1
+4 0.000345723 18
+3 0.500791570 1
+4 0.000445016 47
+3 0.082583390 1
+4 0.000377035 83
+3 0.083365873 1
+4 0.000460660 92
+3 0.082824087 1
+4 0.000376083 47
+3 0.083414413 1
+4 0.000371807 112
+3 0.083491880 1
+4 0.000376482 86
+3 0.083854113 1
+4 0.000371886 47
+3 0.300784350 1
+4 0.000492564 20
+3 0.499820846 1
+4 0.000378588 17
+3 0.083179389 1
+4 0.000362515 19
+3 0.083469929 1
+4 0.000340053 20
+3 0.082670043 1
+4 0.000349875 20
+3 0.083500008 1
+4 0.000342594 20
+3 0.082973318 1
+4 0.000343174 20
+3 0.217746683 1
+4 0.000363125 17
+3 0.128338762 1
+4 0.000334453 18
+3 0.168770898 1
+4 0.000443666 18
+3 0.213671488 1
+4 0.000328120 17
+3 0.025716945 1
+4 0.000370642 17
+3 0.357758108 1
+4 0.000351117 17
+3 0.169543519 1
+4 0.000392530 17
+3 0.141609781 1
+4 0.000347500 17
+3 0.727612317 1
+4 0.000399071 4
+3 0.187152626 1
+4 0.000362028 4
+3 0.148122889 1
+4 0.000444145 4
+3 0.145526596 1
+4 0.000342455 4
+3 0.197732554 1
+4 0.000376040 4
+3 0.177643966 1
+4 0.000342032 4
+3 0.181679284 1
+4 0.000394013 4
+3 0.593474459 1
+4 0.000369757 4
+3 0.237802186 1
+4 0.000452974 17
+3 0.201487042 1
+4 0.000346969 19
+3 0.181551425 1
+4 0.000373977 21
+3 0.711760029 1
+3 0.088219534 1
+4 0.000357894 4
+3 1.759548545 1
+4 0.000542106 17
+3 0.217450484 1
+4 0.000543141 19
+3 0.277457836 1
+4 0.000376117 20
+3 0.399547567 1
+4 0.000372843 4
+3 0.239770273 1
+4 0.000341606 17
+3 0.239459643 1
+4 0.000354375 18
+3 0.167748072 1
+4 0.000368185 17
+3 0.161714100 1
+4 0.000331686 17
+3 0.141647695 1
+4 0.000343859 23
+3 0.175629679 1
+4 0.000372694 24
+3 0.103554779 1
+4 0.000439057 19
+3 0.169664638 1
+4 0.000417062 95
+3 0.165604493 1
+4 0.000408782 93
+3 0.169626978 1
+4 0.000388267 47
+3 0.197489319 1
+4 0.000353575 20
+3 0.169870056 1
+4 0.000355273 17
+3 0.213649084 1
+4 0.000350989 17
+3 0.047486240 1
+4 0.000324129 16
+3 0.161671274 1
+4 0.000346250 18
+3 0.141689031 1
+4 0.000379799 18
+3 0.183639098 1
+4 0.000335563 17
+3 0.431604394 1
+3 0.072073842 1
+4 0.000397484 4
+3 0.199608915 1
+4 0.000333885 17
+3 0.711716130 1
+4 0.000444465 18
+3 0.111475471 1
+4 0.000342124 16
+3 0.143705701 1
+4 0.000364229 1
+3 0.072023722 1
+4 0.000315558 1
+3 0.447214710 2
+4 0.000338835 1
+4 0.000399088 67
+3 0.162072418 1
+4 0.000343971 4
+3 0.492889031 1
+4 0.000433418 17
+3 0.183511417 1
+4 0.000338202 18
+3 0.151760080 1
+4 0.000353876 18
+3 0.177669887 1
+4 0.000373866 17
+3 0.101681943 1
+4 0.000427001 23
+3 0.167488100 1
+4 0.000346252 24
+3 0.079733083 1
+4 0.000378997 19
+3 0.161602206 1
+4 0.000383186 34
+3 0.158769842 1
+4 0.000424969 82
+3 0.168544633 1
+4 0.000383672 115
+3 0.469599939 1
+4 0.000497017 116
+3 0.169647661 1
+4 0.000401025 92
+3 0.181501628 1
+4 0.000412609 47
+3 0.201461558 1
+4 0.000376930 34
+3 0.469729442 1
+4 0.000517278 18
+3 3.634148108 1
+4 0.000353365 20
+3 0.197171038 1
+4 0.000395122 20
+3 0.439500765 1
+4 0.000381673 20
+3 0.319544893 1
+4 0.000367765 17
+3 0.153726098 1
+4 0.000350973 17
+3 0.149624446 1
+4 0.000421456 17
+3 0.095585004 1
+4 0.000353419 23
+3 0.439530502 2
+4 0.000366432 29
+3 0.144480307 1
+4 0.000346839 23
+3 0.214910498 1
+4 0.000544866 24
+3 0.239634133 1
+4 0.000347315 17
+3 0.151450031 1
+4 0.000421811 18
+3 0.193713288 1
+4 0.000350838 18
+3 0.053541780 1
+4 0.000395381 17
+3 0.159637998 1
+4 0.000349715 17
+3 0.343839411 1
+4 0.000424118 17
+3 0.169593905 1
+4 0.000361401 17
+3 0.213455686 1
+3 0.088162845 1
+4 0.000349742 4
+3 0.807653749 1
+4 0.000590419 811
+3 0.327398399 1
+4 0.000350294 10
+3 0.135653423 1
+4 0.000360454 1
+3 0.119713405 1
+4 0.000366595 1
+4 0.000367560 69
+3 0.391102699 1
+4 0.000393085 36
+3 0.171125079 1
+4 0.000346290 17
+3 0.164187638 1
+4 0.000370940 15
+3 0.279596206 1
+4 0.000339502 17
+3 0.187105726 1
+4 0.000333155 17
+3 0.468493314 1
+4 0.000376724 16
+3 0.463535375 1
+3 0.151953765 1
+4 0.000383799 20
+3 0.335625730 1
+4 0.000356158 16
+3 0.177858248 1
+4 0.000444427 18
+3 0.318031680 1
+4 0.000354948 20
+3 0.598943884 1
+4 0.000419828 4
+3 0.376477818 1
+4 0.000405880 16
+3 0.200943755 1
+4 0.000380972 18
+3 0.197394866 1
+4 0.000346636 20
+3 0.311586026 1
+4 0.000444641 4
+3 0.343674151 1
+4 0.000364287 17
+3 0.169615881 1
+4 0.000388487 19
+3 0.181685338 1
+4 0.000348924 20
+3 1.599598489 1
+4 0.000580054 4
+3 0.383449244 1
+4 0.000377671 17
+3 0.185655545 1
+4 0.000488395 19
+3 0.165740137 1
+4 0.000484289 20
+3 0.407297798 1
+4 0.000410615 4
+3 0.239601119 1
+4 0.000369584 19
+3 0.199583063 1
+4 0.000379429 18
+3 0.199690679 1
+4 0.000387326 17
+3 0.185636739 1
+4 0.000375703 17
+3 0.389683301 1
+4 0.000375682 23
+3 0.168057557 1
+4 0.000387858 24
+3 0.343110087 1
+4 0.000351349 19
+3 0.201702332 1
+4 0.000364174 16
+3 0.189587561 1
+4 0.000338508 20
+3 0.233660534 1
+4 0.000392796 19
+3 1.573761567 1
+4 0.000390660 9
+3 0.095555823 1
+4 0.000343815 1
+3 0.159632041 1
+4 0.000337522 1
+3 0.079673356 1
+4 0.000359858 1
+4 0.000980505 10
+4 0.000359183 61
+3 0.342306424 1
+4 0.000389909 35
+3 0.500321479 1
+4 0.000444199 51
+3 0.083255876 1
+4 0.000405104 34
+3 0.082790624 1
+4 0.000375824 63
+3 0.172274916 1
+4 0.000340301 17
+3 0.500388717 1
+4 0.000371203 18
+3 0.083013323 1
+4 0.000343404 20
+3 0.083474899 1
+4 0.000325347 17
+3 0.083312871 1
+4 0.000372762 19
+3 0.083168494 1
+4 0.000358499 17
+3 0.082694849 1
+4 0.000328069 18
+3 0.083686067 1
+4 0.000327436 20
+3 0.082873073 1
+4 0.000334989 19
+3 7.891431332 1
+4 0.000664983 937
+3 0.286472250 1
+4 0.000579445 770
+3 0.247373909 1
+4 0.000576050 932
+3 0.455528649 1
+4 0.000573675 716
+3 0.383576281 1
+4 0.000669928 615
+3 0.551140399 1
+4 0.000697621 647
+3 1.335153592 1
+4 0.000522782 15
+3 0.500175251 1
+4 0.000382502 15
+3 0.083026774 1
+4 0.000352613 16
+3 0.083259074 1
+4 0.000372923 15
+3 0.083595977 1
+4 0.000378020 17
+3 0.082989066 1
+4 0.000411759 17
+3 0.188640354 1
+4 0.000355060 16
+3 0.247867350 1
+4 0.000468442 22
+3 1.399357655 1
+4 0.000366174 18
+3 0.759786035 1
+4 0.000413566 18
+3 0.071606423 1
+4 0.000394679 18
+3 0.112732241 1
+4 0.000412462 18
+3 0.118313899 1
+4 0.000430946 18
+3 0.071392479 1
+4 0.000368698 18
+3 0.103767191 1
+4 0.000387429 19
+3 0.721284357 1
+4 0.110006112 33
+3 0.424351588 1
+4 0.000378997 16
+3 0.161596483 1
+4 0.000498455 16
+3 0.349667671 1
+4 0.000375140 23
+3 0.223531420 1
+4 0.000411806 25
+3 0.991724465 1
+4 0.000381443 25
+3 0.167557833 1
+4 0.000442192 25
+3 0.137535956 1
+4 0.000360285 27
+3 0.117626571 1
+4 0.000390086 25
+3 0.703759347 1
+4 0.000371237 25
+3 0.119686952 1
+4 0.000374561 26
+3 0.191588087 1
+4 0.000395497 25
+3 0.088293034 1
+4 0.000380320 25
+3 0.742746392 2
+4 0.105697838 37
+3 0.023053975 1
+4 0.000383199 17
+3 0.126989308 1
+4 0.000356697 15
+3 0.751825140 1
+4 0.000381633 15
+3 1.159592105 1
+4 0.000371959 18
+3 0.151667092 1
+4 0.000393159 15
+3 0.423468492 1
+4 0.000361709 18
+3 0.143701173 1
+4 0.000417394 16
+3 0.135456882 1
+4 0.000361989 17
+3 0.151678345 1
+4 0.000369964 17
+3 0.135731878 1
+4 0.000344024 17
+3 2.919857971 1
+4 0.000396250 16
+3 0.279536198 1
+4 0.000398445 17
+3 0.511886168 1
+4 0.000397594 16
+3 0.231441322 1
+4 0.000356468 17
+3 0.103510344 1
+4 0.000380772 16
+3 0.135673632 1
+4 0.000350063 17
+3 0.135497894 1
+4 0.000436801 17
+3 0.095578070 1
+4 0.000354244 18
+3 0.135695039 1
+4 0.000452497 17
+3 0.055691179 1
+4 0.000363124 17
+3 0.143563638 1
+4 0.000361664 17
+3 0.399694195 1
+4 0.000367626 16
+3 0.231529790 1
+4 0.000433258 17
+3 0.063518663 1
+4 0.000336569 17
+3 0.063690859 1
+4 0.000359410 16
+3 0.200158477 1
+4 0.000396737 17
+3 0.167138258 1
+4 0.000376001 17
+3 0.055644122 1
+4 0.000374781 18
+3 0.167654564 1
+4 0.000349898 17
+3 0.063605224 1
+4 0.000354548 16
+3 0.152392989 1
+4 0.000354777 17
+3 0.062843544 1
+4 0.000342127 17
+3 0.103807551 1
+4 0.000404765 17
+3 0.111572012 1
+4 0.000351588 17
+3 0.367715454 2
+4 0.000376739 10
+3 0.111597239 1
+4 0.000337430 1
+3 0.207800105 1
+4 0.000373721 1
+3 0.927574858 1
+4 0.000378119 1
+4 0.000910395 10
+4 0.000349291 60
+3 13.327831835 1
+4 0.000645291 927
+3 0.526431244 1
+4 0.000596756 751
+3 0.567378071 1
+4 0.000653579 861
+3 0.439652125 1
+4 0.000583643 774
+3 1.063130218 1
+4 0.000562647 610
+3 2.735568898 1
+4 0.000545164 558
+3 0.591456258 1
+4 0.000606715 830
+3 1.023525670 1
+4 0.000649515 694
+3 0.455261151 1
+4 0.000556382 473
+3 1.135566027 1
+4 0.000598606 612
+3 0.231338607 1
+4 0.000627040 879
+3 0.215256263 1
+4 0.000554070 616
+3 0.191478140 1
+4 0.000579073 606
+3 0.719585214 1
+4 0.000578407 753
+3 19.504875154 1
+4 0.000361189 34
+7 0.000562995 TSTP
+7 3.126512649 CONT
+4 0.000588769 7
+4 0.000380269 7
+4 0.000354194 750
+3 311.641897994 1
+4 0.000604112 877
+3 0.998748534 1
+4 0.000585499 736
+3 0.543243285 1
+4 0.000590598 920
+3 1.215382810 1
+4 0.000626907 748
+3 0.759577586 1
+4 0.000378405 16
+3 0.500355277 1
+4 0.000378008 16
+3 0.082934555 1
+4 0.000333983 16
+3 0.083181849 1
+4 0.000345495 16
+3 0.083045391 1
+4 0.000332502 18
+3 0.322425180 1
+4 0.000333350 16
+3 0.189693383 1
+4 0.000364966 16
+3 0.151719082 1
+4 0.000328601 16
+3 0.201621575 1
+4 0.000353389 16
+3 0.317554951 1
+4 0.000368242 16
+3 0.169513519 1
+4 0.000344426 16
+3 4.302883350 1
+3 0.183082352 1
+3 0.130055613 1
+4 0.000367496 29
+3 0.333626376 1
+4 0.000364249 37
+3 0.169648346 1
+4 0.000332523 16
+3 0.213809620 1
+4 0.000450185 131
+3 0.383346101 1
+4 0.000393992 126
+3 0.295802735 2
+4 0.000356949 34
+3 0.137805466 1
+4 0.000356504 16
+3 0.141251852 1
+4 0.000328164 18
+3 0.186312331 1
+4 0.000325851 18
+3 0.157293999 1
+4 0.000357570 17
+3 0.119801855 1
+4 0.000392268 17
+3 0.711658819 1
+3 0.079877700 1
+4 0.000364041 28
+3 0.191593101 1
+4 0.000405981 18
+3 0.111644357 1
+4 0.000330638 18
+3 0.111417820 1
+4 0.000400641 18
+3 0.215732039 1
+4 0.000356014 18
+3 0.423839652 2
+4 0.000368967 36
+3 1.359666507 1
+4 0.000360121 17
+3 22.696217775 2
+4 0.000364050 18
+3 0.240160250 1
+4 0.000372361 17
+3 2.479207069 1
+3 0.071960936 1
+4 0.000361362 28
+3 0.175536104 1
+4 0.000345406 18
+3 0.111798617 1
+4 0.000344638 18
+3 0.135680226 1
+4 0.000374027 18
+3 0.175718654 1
+4 0.000354925 18
+3 0.543588816 2
+4 0.000353300 33
+3 0.407616585 1
+4 0.000341374 17
+3 0.153794364 1
+4 0.000357012 17
+3 2.813745145 1
+4 0.000360069 24
+3 3.687602308 2
+4 0.000404036 33
+3 0.423620674 1
+4 0.000373787 17
+3 2.545818720 1
+4 0.000377595 17
+3 0.781588378 1
+4 0.000374532 24
+3 1.895694680 1
+4 0.000362996 21
+3 0.137583514 1
+4 0.000363227 23
+3 0.125608581 1
+4 0.000354598 21
+3 0.255686021 1
+4 0.000384391 19
+3 0.129658171 1
+4 0.000383271 20
+3 0.109489916 1
+4 0.000431427 17
+3 13.248049988 2
+4 0.000424076 31
+3 0.319697438 1
+4 0.000367284 20
+3 0.671588544 1
+4 0.000382924 49
+3 0.800196597 1
+4 0.000395701 16
+3 0.168100866 1
+4 0.000346183 16
+3 0.110656936 1
+4 0.000371000 18
+3 1.584289938 1
+4 0.000362400 18
+3 0.199015099 1
+4 0.000442427 18
+3 0.129483498 1
+4 0.000348687 18
+3 0.189607259 1
+4 0.000393515 18
+3 0.167777309 1
+4 0.000361169 17
+3 3.546079966 15
+4 0.000455112 33
+3 9.347909578 1
+4 0.109990815 33
+3 0.627551628 1
+4 0.000381786 18
+3 0.399697487 1
+4 0.000395214 29
+3 0.243427135 13
+4 0.000446506 31
+3 1.248157353 1
+4 0.109995515 34
+3 4.490067760 1
+3 0.083856092 1
+4 0.000387412 16
+3 0.528023063 1
+3 0.153386148 1
+4 0.000397320 74
+3 0.413628130 1
+4 0.000351231 18
+3 0.471818832 1
+4 0.000500237 25
+3 0.207428342 1
+4 0.000377993 19
+3 0.311628436 2
+4 0.000388215 9
+3 0.143596403 1
+4 0.000347411 1
+3 0.175732792 1
+4 0.000407666 1
+3 0.079541562 1
+4 0.000370632 1
+4 0.000314804 54
+4 0.000331122 15
+3 52.370415160 1
+4 0.000650054 891
+3 0.589851841 1
+4 0.000625414 814
+3 0.559417946 1
+4 0.000662742 922
+3 2.183633578 1
+4 0.000600612 797
+3 1.111368831 1
+4 0.000580402 680
+3 3.023420204 1
+4 0.000783246 783
+3 0.303155855 1
+4 0.000851199 923
+3 0.383194869 1
+4 0.000791889 809
+3 0.607230184 1
+4 0.000745230 883
+3 2.695368393 1
+4 0.000589889 689
+3 2.607443931 1
+4 0.000423971 18
+3 0.249494793 1
+4 0.000343334 16
+3 25.495109330 1
+4 0.000397043 16
+3 0.185120056 1
+4 0.000355099 16
+3 0.151116361 1
+4 0.000361796 18
+3 0.160043361 1
+4 0.000346922 16
+3 0.301642111 1
+3 0.137906881 1
+4 0.000349964 28
+3 0.205709678 1
+4 0.000366959 37
+3 0.162539226 1
+4 0.000344278 16
+3 0.156614882 1
+4 0.000390682 18
+3 0.217739910 1
+4 0.000412163 16
+3 0.293620538 1
+4 0.000371324 71
+3 4.383928242 1
+4 0.000384727 18
+3 0.201504645 1
+4 0.000342978 17
+3 1.421781402 1
+3 0.055847564 1
+4 0.000363371 28
+3 0.255754333 1
+4 0.000376076 18
+3 0.159453995 1
+4 0.000341660 18
+3 0.136324941 1
+4 0.000381340 18
+3 0.246976566 1
+4 0.000365764 18
+3 0.782015232 1
+4 0.110026089 33
+3 1.003877816 1
+4 0.000423505 9
+3 0.127449232 1
+4 0.000350303 1
+3 0.159619209 1
+4 0.000328406 1
+3 0.192771301 1
+4 0.000410219 1
+4 0.000369259 10
+4 0.000297636 61
+3 9.231636766 1
+4 0.000364204 35
+7 0.000533543 TSTP
+7 1.677861371 CONT
+4 0.000709404 7
+4 0.000258601 722
+3 3.296041959 1
+4 0.000394331 35
+7 0.000524420 TSTP
+7 9.622426511 CONT
+4 0.000536008 7
+4 0.000294990 664
+3 32.720725744 1
+4 0.000462659 17
+3 0.359159217 1
+3 0.138045550 1
+4 0.000394501 81
+3 0.053564869 1
+4 0.000376500 63
+3 41.185576701 1
+4 0.000378621 17
+3 0.374911082 1
+3 0.130036236 1
+4 0.000385894 54
+3 0.077434689 1
+4 0.000387997 61
+3 3.256007840 1
+4 0.000380680 9
+3 0.111427215 1
+4 0.000329944 1
+3 0.151767387 1
+4 0.000401364 1
+3 0.119783561 1
+4 0.000357625 1
+4 0.000330857 14
+4 0.000321627 57
+3 26.432783973 1
+4 0.000360734 35
+7 0.000540272 TSTP
+7 1.638401958 CONT
+4 0.000620050 7
+4 0.000263276 722
+3 20.040125363 1
+4 0.000376103 19
+3 0.499356754 1
+4 0.000396980 35
+3 0.082717724 1
+4 0.000378205 94
+3 0.083076036 1
+4 0.000423738 89
+3 0.083778095 1
+4 0.000408547 94
+3 4.960955350 1
+4 0.000381038 17
+3 0.201194482 1
+4 0.000357095 17
+3 0.149608263 1
+4 0.000362816 17
+3 0.170104859 1
+4 0.000347020 19
+3 0.421481515 1
+4 0.000344429 20
+3 1.311561552 1
+4 0.000419294 18
+3 1.215535250 1
+4 0.000406120 23
+3 0.111510392 1
+4 0.000342121 19
+3 0.127732346 1
+4 0.000333493 19
+3 0.079906920 1
+4 0.000340861 20
+3 0.135354815 1
+4 0.000336685 19
+3 0.215895431 1
+4 0.000359662 16
+3 0.471864560 2
+4 0.000427681 9
+3 0.103542921 1
+4 0.000380301 1
+3 0.111394516 1
+4 0.000623447 1
+3 0.135586436 1
+4 0.000662568 11
+4 0.000491916 57
+3 0.367199525 1
+4 0.000417002 35
+7 0.000579930 TSTP
+7 3.190750507 CONT
+4 0.000593766 7
+4 0.000284779 774
+3 5.471359994 1
+4 0.000459874 16
+3 0.153533655 1
+4 0.000361816 20
+3 0.469318465 1
+3 0.007847296 1
+3 0.845079062 1
+3 0.035052113 1
+4 0.000355537 18
+3 0.208313541 1
+4 0.000436611 22
+3 0.206993239 1
+4 0.000425016 17
+3 0.231936612 2
+4 0.000426777 34
+3 0.159141599 1
+4 0.000405512 55
+3 0.135576787 1
+4 0.000343081 18
+3 0.175634789 1
+4 0.000441921 55
+3 0.072012783 1
+4 0.000351657 18
+3 0.127822426 1
+4 0.000455363 55
+3 0.327044101 1
+4 0.000375474 8
+3 0.063577551 1
+4 0.000349591 1
+3 0.159970670 1
+4 0.000353036 1
+3 0.103682984 1
+4 0.000424628 1
+4 0.000792283 10
+4 0.000364645 58
+3 1.078671651 1
+4 0.000391093 34
+7 0.000513596 TSTP
+7 2.591065402 CONT
+4 0.000601346 7
+4 0.000287188 791
+3 37.760831992 1
+4 0.000443768 14
+3 0.160747888 1
+4 0.000344691 14
+3 0.133686815 1
+4 0.000334620 14
+3 0.263782102 1
+4 0.000373509 44
+3 0.191557949 1
+4 0.000363541 16
+3 0.295618804 1
+4 0.000389317 16
+3 0.415866786 1
+4 0.000372879 19
+3 0.175714516 1
+4 0.000381307 18
+3 0.095311527 1
+4 0.000376169 18
+3 0.143728133 1
+4 0.000357376 17
+3 0.143807808 1
+4 0.000395966 18
+3 0.095362582 1
+4 0.000329435 17
+3 0.576008873 1
+4 0.000456409 18
+3 0.135118685 1
+4 0.000373175 18
+3 0.023614825 1
+4 0.000400278 18
+3 0.199667163 1
+4 0.000344809 18
+3 0.087976135 1
+4 0.000370895 18
+3 0.095574375 1
+4 0.000329680 18
+3 0.199431335 1
+4 0.000372131 18
+3 0.127554755 1
+4 0.000392708 18
+3 0.192014997 1
+4 0.000427810 18
+3 0.215260752 1
+4 0.000394722 18
+3 0.183626456 1
+4 0.000400192 18
+3 0.079732331 1
+4 0.000387065 17
+3 0.232420431 1
+4 0.000491812 18
+3 0.166613868 1
+4 0.000495342 18
+3 0.071768069 1
+4 0.000442951 19
+3 0.127220424 1
+4 0.000356692 18
+3 0.137877295 1
+4 0.000415021 17
+3 0.181293341 1
+4 0.000358763 18
+3 0.095706054 1
+4 0.000354026 18
+3 0.088033930 1
+4 0.000345101 17
+3 0.375264587 1
+4 0.000490245 18
+3 0.071473917 1
+4 0.000417871 18
+3 0.135625942 1
+4 0.000380041 18
+3 0.119745699 1
+4 0.000368423 18
+3 0.071518698 1
+4 0.000412694 19
+3 0.087535976 1
+4 0.000355199 18
+3 0.095721416 1
+4 0.000397695 17
+3 0.167747682 1
+4 0.000332670 18
+3 0.079805314 1
+4 0.000417932 18
+3 0.119643272 1
+4 0.000352331 18
+3 0.223328679 1
+4 0.000396868 18
+3 0.303678505 2
+4 0.000380271 9
+3 0.047529437 1
+4 0.000363105 1
+3 0.224008517 1
+4 0.000337254 1
+3 0.207354297 1
+4 0.000399690 1
+4 0.000906479 10
+4 0.000402682 61
+3 1444.511782296 1
+4 0.000357469 35
+3 1.342687924 1
+4 0.000366400 14
+3 0.407610514 1
+4 0.000351696 33
+3 0.520420433 1
+4 0.000350931 16
+3 0.230857014 1
+4 0.000341388 14
+3 0.159793954 1
+4 0.000346996 28
+3 0.159601748 1
+4 0.000366510 16
+3 0.247626520 1
+4 0.000406626 14
+3 0.143416056 1
+4 0.000355414 28
+3 0.143689211 1
+4 0.000331886 17
+3 0.247721225 1
+4 0.000343072 14
+3 0.112647575 1
+4 0.000342353 24
+3 0.222669051 1
+4 0.000339199 17
+3 0.185998654 1
+4 0.000370907 16
+3 1.949534608 1
+4 0.000351397 16
+3 3.199702184 1
+4 0.000367257 18
+3 0.177412774 1
+4 0.000310564 17
+3 0.149758084 1
+4 0.000399511 18
+3 0.137634608 1
+4 0.000328197 17
+3 0.630029674 1
+4 0.000364345 31
+3 0.008581525 1
+4 0.000315502 26
+3 0.606622757 1
+4 0.000342426 17
+3 0.183407419 1
+4 0.000354683 18
+3 0.551780711 2
+4 0.000353001 34
+3 0.319603902 1
+4 0.000324205 17
+3 37.505124390 2
+4 0.109937326 1
+4 0.000284505 53
+3 0.314168709 1
+4 0.000448015 16
+3 0.351243330 1
+4 0.000329283 14
+3 0.247724391 1
+4 0.000348110 19
+3 0.935489659 2
+4 0.000358535 34
+3 0.255623807 1
+4 0.000348768 1
+3 0.186146414 1
+4 0.000360970 1
+3 0.213625304 1
+4 0.000367568 16
+3 0.191209864 1
+4 0.000348053 30
+3 0.311505848 1
+4 0.000407475 19
+3 0.111493980 1
+4 0.000336532 18
+3 0.047993277 1
+4 0.000317649 17
+3 0.415678954 1
+4 0.000349863 18
+3 62.666060129 2
+4 0.000606532 931
+3 4.375431732 1
+4 0.000582261 864
+3 4.007561683 1
+4 0.000606428 920
+3 0.615130627 1
+4 0.000395265 152
+3 0.623644967 1
+4 0.000464766 85
+3 0.500366140 1
+4 0.000387863 36
+3 0.082937457 1
+4 0.000538294 46
+3 0.082774391 1
+4 0.000439587 69
+3 0.900148919 1
+4 0.000413634 15
+3 0.500630508 1
+4 0.000370006 17
+3 0.082212526 1
+4 0.000358776 17
+3 0.458020142 1
+4 0.000352446 15
+3 0.741673343 1
+3 0.153841053 1
+4 0.000382350 111
+3 8.134125152 1
+4 0.000409732 15
+3 0.185466395 1
+4 0.000328110 15
+3 0.101576738 1
+4 0.000327092 17
+3 0.185854954 1
+4 0.000335670 17
+3 0.149600279 1
+4 0.000362093 16
+3 0.423566779 1
+4 0.000340985 30
+3 0.247704807 1
+4 0.000415144 33
+3 0.698039358 1
+4 0.109954509 30
+3 1.183854845 1
+4 0.000587227 743
+3 6.823896413 1
+4 0.000639671 794
+3 3.543257902 1
+4 0.000353344 18
+3 0.217631915 1
+4 0.000336459 17
+3 0.197417741 1
+4 0.000349473 19
+3 0.187658067 1
+4 0.000335192 16
+3 151.345510542 1
+4 0.000365247 16
+3 0.590975836 1
+4 0.000393298 16
+3 0.463692786 1
+3 0.145831771 1
+4 0.000398722 114
+3 0.557795268 1
+4 0.000392380 52
+3 0.936298833 1
+4 0.000358777 15
+3 0.680089190 1
+4 0.000346781 17
+3 5.979960398 44
+4 0.000422221 96
+3 0.554367727 2
+3 0.162133998 1
+4 0.000396206 82
+3 0.141456616 1
+4 0.000407998 19
+3 0.191551242 1
+3 0.146260670 1
+4 0.000428847 112
+3 0.205228187 1
+4 0.000340512 16
+3 0.127846804 1
+4 0.000330859 16
+3 0.185792950 1
+4 0.000331302 16
+3 3.933610220 1
+4 0.000343234 16
+3 1.863725787 1
+4 0.000356375 23
+3 0.327644144 1
+4 0.000344743 48
+3 0.063482729 1
+4 0.000348582 48
+3 0.279936861 1
+4 0.000340867 48
+3 0.271691438 1
+4 0.000336898 48
+3 0.319538697 1
+4 0.000331634 48
+3 1.167651877 1
+4 0.000356329 48
+3 0.167654474 1
+4 0.000345840 49
+3 0.071693547 1
+4 0.000326721 48
+3 0.247570408 1
+4 0.000370740 48
+3 0.615741893 1
+4 0.000464667 16
+3 0.215612366 1
+4 0.000355715 17
+3 0.599537487 1
+4 0.000358534 48
+3 0.087817960 1
+4 0.000340005 48
+3 0.087692776 1
+4 0.000326620 48
+3 0.239713026 1
+4 0.000346762 48
+3 0.255488394 1
+4 0.000369661 48
+3 0.280455348 1
+4 0.000349905 48
+3 0.310991988 1
+4 0.000369127 16
+3 0.359660061 1
+4 0.000341556 17
+3 0.119479788 1
+4 0.000413928 48
+3 0.105672374 1
+4 0.000362396 49
+3 0.453571012 1
+4 0.000373295 48
+3 0.799768052 1
+4 0.000408525 48
+3 0.487553934 1
+4 0.000443791 48
+3 2.456102815 1
+4 0.000354594 48
+3 79.488811236 1
+4 0.110023221 32
+3 0.715179515 1
+4 0.000381592 16
+3 0.391509277 1
+4 0.000393526 29
+3 0.943740666 1
+4 0.000349374 17
+3 0.207526246 1
+4 0.000485668 17
+3 0.143704057 1
+4 0.000348007 17
+3 0.143435378 1
+4 0.000368142 17
+3 0.772597412 1
+4 0.110063985 36
+3 13.022095358 1
+4 0.000403981 16
+3 0.318925791 1
+4 0.000336517 16
+3 0.231729783 1
+4 0.000376458 22
+3 0.327623023 1
+4 0.000356997 23
+3 4.863969747 1
+4 0.000400224 19
+3 0.271571541 1
+3 0.121996556 1
+4 0.000371499 114
+3 1.221527164 1
+4 0.000358054 10
+3 0.135648707 1
+4 0.000346341 1
+3 0.191734839 1
+4 0.000327609 1
+3 0.855719441 1
+4 0.000405426 1
+4 0.000913135 10
+4 0.000366858 59
+3 1.639324634 1
+4 0.000346597 36
+7 0.000524874 TSTP
+7 7.390665382 CONT
+4 0.000577837 7
+4 0.000278006 890
+3 0.943025876 1
+4 0.000390314 36
+7 0.000583277 TSTP
+7 3.655223483 CONT
+4 0.000662626 7
+4 0.000274567 832
+3 0.238863751 1
+4 0.000341171 10
+3 0.151505929 1
+4 0.000391834 1
+3 0.137883068 1
+4 0.000322436 1
+3 0.109515330 1
+4 0.000404666 1
+3 0.103717451 1
+4 0.000357360 37
+3 0.815709527 1
+4 0.000352853 15
+3 0.159532468 1
+4 0.000363590 27
+3 0.135611441 1
+4 0.000325560 17
+3 0.279702847 2
+4 0.000381860 10
+3 0.111647606 1
+4 0.000319571 1
+3 0.151625318 1
+4 0.000400472 1
+3 0.111620405 1
+4 0.000357341 1
+4 0.000349341 70
+3 0.271431357 1
+4 0.000442392 36
+7 0.000589559 TSTP
+7 5.007416369 CONT
+4 0.000611646 7
+4 0.000285315 894
+3 139.067795008 1
+4 0.000366007 10
+3 0.175382851 1
+4 0.000358223 1
+3 0.111476767 1
+4 0.000329678 1
+3 0.175716778 1
+4 0.000320858 1
+3 0.079671236 1
+4 0.000316534 1
+3 0.151560952 1
+4 0.000326277 1
+3 0.488409850 1
+4 0.000363235 2
+3 0.190930680 1
+4 0.000375687 1
+3 0.087882121 1
+4 0.000362324 1
+3 0.191550670 1
+4 0.000377130 1
+3 0.079498486 1
+4 0.000329328 1
+3 0.159837929 1
+4 0.000368066 1
+3 0.191679354 1
+4 0.000347134 1
+3 0.111522730 1
+4 0.000495846 230
+3 0.935864352 1
+4 0.000425402 92
+3 0.471305015 1
+4 0.000458137 99
+3 0.500865580 1
+4 0.000398986 47
+3 0.082631283 1
+4 0.000414903 84
+3 0.183422133 1
+4 0.000400867 19
+3 0.500266352 1
+4 0.000375323 20
+3 0.083307165 1
+4 0.000331403 18
+3 0.415194545 1
+4 0.000402584 20
+3 1.023936226 1
+4 0.000497916 101
+3 0.500055301 1
+4 0.000417051 47
+3 0.082510846 1
+4 0.000372054 34
+3 0.224011651 1
+4 0.000378891 18
+3 0.500202057 1
+4 0.000358539 20
+3 0.082465930 1
+4 0.000364336 17
+3 1.576237965 1
+4 0.000351901 17
+3 0.500393152 1
+4 0.000424266 17
+3 0.082998040 1
+4 0.000337146 17
+3 0.083361640 1
+4 0.000366396 17
+3 0.083026828 1
+4 0.000328046 17
+3 0.322675228 1
+4 0.000358470 17
+3 0.197462184 1
+4 0.000327079 17
+3 8.983859141 1
+4 0.000370774 19
+3 0.185493393 1
+4 0.000377384 20
+3 0.245713013 1
+4 0.000360578 18
+3 1.775859748 1
+4 0.000390726 17
+3 0.217434224 1
+4 0.000437951 17
+3 0.613590208 1
+4 0.000343518 17
+3 0.401991192 1
+4 0.000365295 17
+3 0.613633274 1
+4 0.000386015 23
+3 4.831604582 2
+4 0.000418606 24
+3 0.609550222 1
+4 0.000349183 17
+3 1.197892808 1
+4 0.000392443 18
+3 0.743417992 1
+4 0.000355778 31
+3 0.135791222 1
+4 0.000363517 41
+3 0.255623210 1
+4 0.000348819 41
+3 0.135439706 1
+4 0.000355313 41
+3 0.127642166 1
+4 0.000343773 41
+3 0.087597337 1
+4 0.000413648 41
+3 0.511757339 1
+4 0.000386501 17
+3 0.295549405 1
+4 0.000354872 17
+3 0.247871391 1
+4 0.000336372 18
+3 0.423687804 1
+4 0.000366803 18
+3 0.312824699 1
+4 0.000346374 18
+3 0.166498953 1
+4 0.000392980 18
+3 0.175434190 1
+4 0.000342254 18
+3 0.048255175 1
+4 0.000380756 41
+3 0.407030000 2
+4 0.000370220 22
+3 0.217738714 1
+4 0.000353696 17
+3 0.181536597 1
+4 0.000332401 18
+3 0.231541475 1
+4 0.000345720 13
+3 0.415750621 1
+4 0.000338210 32
+4 0.000414623 47
+3 0.759277247 1
+4 0.000397349 17
+3 0.169834065 1
+4 0.000337775 17
+3 0.261383628 1
+3 0.064153359 1
+4 0.000348148 4
+3 0.231520166 1
+3 0.056531856 1
+4 0.000382853 4
+3 1.895342307 1
+4 0.000456643 17
+3 0.201356339 1
+4 0.000378326 17
+3 0.181691568 1
+4 0.000363113 17
+3 0.249584295 1
+4 0.000389502 14
+3 0.165768928 1
+4 0.000340410 17
+3 0.305572986 1
+4 0.000431361 18
+3 0.317493918 1
+4 0.000350985 24
+3 0.184487115 1
+4 0.000458530 40
+3 0.126821620 1
+4 0.000338513 41
+3 0.151634183 1
+4 0.000388402 40
+3 0.087626685 1
+4 0.000340338 40
+3 0.175741439 1
+4 0.000438664 40
+3 0.191535949 1
+4 0.000441000 40
+3 2.983589796 1
+4 0.000394143 36
+3 3.876142022 1
+4 0.110035167 33
+3 2.245808557 1
+4 0.000385760 9
+3 0.479480256 1
+4 0.000346419 1
+3 0.175540002 1
+4 0.000401919 1
+3 0.144704507 1
+4 0.000414907 1
+4 0.000994584 33
+4 0.000359030 234
+3 1.077365878 1
+4 0.000452370 1
+4 0.000529473 39
+3 0.975461430 1
+4 0.000369082 10
+3 0.079079752 1
+4 0.000333556 1
+3 0.111602431 1
+4 0.000355467 1
+3 0.143759103 1
+4 0.000351076 1
+3 0.079804287 1
+4 0.000390138 1
+3 0.159501313 1
+4 0.000336925 1
+3 0.191638893 1
+4 0.000321370 1
+3 0.087790847 1
+4 0.000365868 39
+3 0.951692897 1
+4 0.000388405 20
+4 0.000296957 44
+3 0.943170547 1
+4 0.000385451 39
+3 1.015715447 1
+4 0.000368926 18
+3 0.495572904 1
+4 0.000357103 27
+3 0.271727558 1
+4 0.000354500 41
+3 0.279593281 1
+4 0.000368767 41
+3 0.279729949 1
+4 0.000344578 41
+3 0.119512584 1
+4 0.000335820 41
+3 0.127658598 1
+4 0.000350615 41
+3 0.112015544 1
+4 0.000350583 41
+3 0.359414507 2
+4 0.001179038 37
+4 0.000369617 50
+3 0.152403225 1
+4 0.000364549 18
+3 0.157671627 1
+4 0.000394073 17
+3 0.145641042 1
+4 0.000347979 17
+3 0.309696044 1
+4 0.000435866 79
+3 0.375578806 1
+4 0.000369602 17
+3 0.367673524 1
+4 0.000357062 17
+3 0.159409371 1
+3 0.072207178 1
+4 0.000343349 4
+3 0.159688152 1
+3 0.055847137 1
+4 0.000362818 4
+3 0.671784890 1
+4 0.000363347 7
+3 0.343688525 1
+4 0.000415495 6
+3 0.543510360 1
+4 0.000344138 17
+3 0.209642619 1
+4 0.000352097 17
+3 0.181762731 1
+4 0.000331216 17
+3 0.201586802 1
+4 0.000345010 18
+3 0.365829346 1
+4 0.000350518 17
+3 0.137561319 1
+4 0.000347562 18
+3 0.197610494 1
+4 0.000367008 17
+3 0.319585496 1
+4 0.000425341 31
+3 0.223569372 1
+4 0.000376930 22
+3 0.263653708 1
+4 0.000353015 22
+3 0.095704747 1
+4 0.000337212 22
+3 0.031598269 1
+4 0.000390594 23
+3 0.159870952 1
+4 0.000373548 22
+3 0.087394680 1
+4 0.000441986 22
+3 0.135671073 1
+4 0.000346682 17
+3 0.171746131 1
+4 0.000372517 17
+3 0.123510868 1
+4 0.000334221 18
+3 0.039498943 1
+4 0.000397046 19
+3 0.095672146 1
+4 0.000325363 18
+3 0.143754279 1
+4 0.000368239 18
+3 0.223605386 1
+4 0.000426063 22
+3 0.471610261 2
+4 0.000363802 10
+3 0.015554665 1
+4 0.000331508 1
+3 0.519817760 1
+4 0.000334263 1
+3 0.095415578 1
+4 0.000337575 1
+3 0.207982629 1
+4 0.000324473 1
+3 0.199753320 1
+4 0.000356718 1
+4 0.000355183 71
+3 0.631202493 1
+4 0.000368000 36
+7 0.000533702 TSTP
+7 9.719803852 CONT
+4 0.000717076 7
+4 0.000281202 935
+3 1.910931388 1
+4 0.000374954 27
+3 0.791476970 1
+4 0.000428506 22
+3 0.503506447 1
+4 0.000359931 22
+3 0.783341366 1
+4 0.110007030 31
+3 1.274470397 1
+4 0.000387502 10
+3 0.535680050 1
+4 0.000383579 1
+3 0.231451119 1
+4 0.000348086 1
+3 0.567827770 1
+4 0.000370217 1
+4 0.000969074 10
+4 0.000368597 61
+3 0.390582206 1
+4 0.000343682 36
+7 0.000550450 TSTP
+7 7.671269982 CONT
+4 0.000521260 7
+4 0.000313171 937
+3 3.359782410 1
+4 0.000585741 735
+3 0.582616667 1
+4 0.000372238 9
+3 0.239602178 1
+4 0.000379157 1
+3 0.071530109 1
+4 0.000409901 1
+3 0.047637382 1
+4 0.000337421 1
+3 0.151664776 1
+4 0.000346153 1
+3 0.159637490 1
+4 0.000337865 1
+3 0.095592779 1
+4 0.000543052 483
+3 1.175692739 1
+4 0.000522195 459
+3 0.959460007 1
+4 0.000413312 10
+3 0.087665908 1
+4 0.000588781 901
+3 20.248284711 1
+4 0.000628499 735
+3 0.703151451 1
+4 0.000394160 16
+3 0.500440767 1
+4 0.000364519 19
+3 0.083350811 1
+4 0.000339014 16
+3 0.083368775 1
+4 0.000367441 16
+3 0.082421879 1
+4 0.000334253 16
+3 0.083399387 1
+4 0.000373818 16
+3 0.082500566 1
+4 0.000352212 18
+3 0.083488959 1
+4 0.000393128 16
+3 0.083496147 1
+4 0.000331955 16
+3 0.083871243 1
+4 0.000343925 16
+3 0.081931645 1
+4 0.000370064 17
+3 0.082703361 1
+4 0.000366468 19
+3 0.083019623 1
+4 0.000334439 15
+3 20.326566240 1
+4 0.000471274 48
+3 0.327106449 1
+4 0.000353524 17
+3 0.311706322 1
+4 0.000347343 15
+3 0.303618878 1
+4 0.000346708 18
+3 0.728839583 1
+4 0.000354561 17
+3 0.238385696 1
+4 0.000352209 17
+3 0.112615975 1
+4 0.000399816 17
+3 0.120579656 1
+4 0.000385619 17
+3 0.133655702 1
+4 0.000344040 17
+3 0.095466522 1
+4 0.000360328 16
+3 3.910454605 17
+4 0.000387696 34
+3 0.882055600 1
+4 0.000366495 17
+3 0.703083657 1
+4 0.109998917 32
+3 12.138355281 1
+4 0.000353524 17
+3 0.391376221 1
+3 0.114111346 1
+4 0.000390180 30
+3 0.733514800 2
+4 0.000318313 43
+3 0.296185035 1
+4 0.000370741 10
+3 0.095073316 1
+4 0.000320445 1
+3 0.159714469 1
+4 0.000398610 1
+3 0.671756082 1
+4 0.000389472 1
+4 0.000316261 54
+4 0.000335938 16
+3 3.918991433 1
+4 0.000381639 39
+3 1.391820866 1
+3 0.122572983 1
+4 0.000360413 30
+3 0.204894183 1
+4 0.000384831 86
+3 0.271578260 1
+4 0.000331163 18
+3 0.191741559 1
+4 0.000335189 24
+3 0.199800770 1
+4 0.000354462 54
+3 0.303563006 2
+4 0.000393336 37
+3 0.479595529 1
+4 0.000347304 17
+3 0.169714473 1
+4 0.000343137 17
+3 1.181838714 1
+4 0.000350867 17
+3 0.215787302 1
+3 0.055719028 1
+4 0.000390356 4
+3 0.183565376 1
+3 0.048098033 1
+4 0.000346186 4
+3 0.183546432 1
+3 0.064027289 1
+4 0.000349285 4
+3 0.183726774 1
+3 0.064156076 1
+4 0.000362277 4
+3 0.215339578 1
+3 0.072071346 1
+4 0.000363777 4
+3 0.231873889 1
+3 0.063969603 1
+4 0.000402839 4
+3 0.263444177 1
+3 0.063964083 1
+4 0.000342881 4
+3 0.343905078 1
+3 0.071787058 1
+4 0.000406727 4
+3 0.383604382 1
+4 0.000364356 4
+3 0.487710026 1
+4 0.000347111 10
+3 0.111479835 1
+4 0.000339801 1
+3 0.159905658 1
+4 0.000329563 1
+3 0.151681622 1
+4 0.000380117 1
+4 0.000362919 71
+3 0.351505640 1
+4 0.000382206 36
+7 0.000580633 TSTP
+7 32.463933608 CONT
+4 0.000537317 7
+4 0.000244099 818
+3 47.356867926 1
+4 0.109957000 1
+3 0.806463708 1
+4 0.000358654 26
+3 0.263077121 1
+4 0.000404056 21
+3 0.201777643 1
+4 0.000340541 22
+3 0.181498047 1
+4 0.000391365 25
+3 0.201749986 1
+4 0.000410354 26
+3 0.213830902 1
+4 0.000374860 29
+3 0.242743477 1
+4 0.000394934 30
+3 0.244272733 1
+4 0.000385118 33
+3 0.209309059 1
+4 0.000340397 34
+3 0.214094906 1
+4 0.000378032 32
+3 0.251108045 1
+4 0.000372349 41
+3 0.587937535 1
+4 0.000481045 90
+3 0.841658979 1
+4 0.000494395 486
+3 1.341390713 1
+4 0.000486133 24
+3 0.519694376 1
+4 0.000393747 155
+3 0.831485644 1
+4 0.000447253 77
+3 0.169721938 1
+4 0.000424379 89
+3 0.173329315 1
+4 0.000399653 37
+3 0.695943082 1
+4 0.000396328 19
+3 0.217744022 1
+4 0.000371435 19
+3 1.013539345 1
+4 0.000351822 19
+3 0.201679794 1
+4 0.000371668 16
+3 0.381651959 1
+4 0.000347085 16
+3 0.111281352 1
+4 0.000372287 17
+3 40.945109689 2
+4 0.000383051 1
+3 0.146046290 1
+4 0.000424718 114
+3 0.293110069 1
+4 0.000349116 18
+3 0.343611868 1
+4 0.000465799 21
+3 0.152039383 1
+4 0.000341033 18
+3 0.895491197 1
+4 0.000431804 85
+3 0.121643026 1
+4 0.000380059 114
+3 0.717740102 1
+4 0.000388116 10
+3 0.136135528 1
+4 0.000338595 1
+3 0.159004015 1
+4 0.000358829 1
+3 0.127435366 1
+4 0.000419382 1
+4 0.000360168 69
+3 0.351579698 1
+4 0.000340105 36
+7 0.000542662 TSTP
+7 3.574908791 CONT
+4 0.000647797 7
+4 0.000365803 7
+4 0.000333531 932
+3 25.144213797 1
+4 0.000398416 15
+3 0.498848979 1
+4 0.000351256 15
+3 0.082812596 1
+4 0.000329004 15
+3 0.083143137 1
+4 0.000348013 14
+3 0.082660556 1
+4 0.000387320 46
+3 0.082704152 1
+4 0.000439266 69
+3 0.083314713 1
+4 0.000433380 68
+3 1.363337851 1
+4 0.000425625 15
+3 0.535453563 1
+3 0.131077452 1
+4 0.000364806 28
+3 0.476484778 1
+4 0.000402903 36
+3 0.169805705 1
+4 0.000360465 17
+3 0.157433074 1
+4 0.000344571 17
+3 0.161739168 1
+4 0.000359301 15
+3 0.165484321 1
+4 0.000349031 15
+3 1.320462291 1
+4 0.000400814 85
+3 0.855094187 1
+4 0.000374453 17
+3 0.185572957 1
+4 0.000418129 16
+3 0.558124604 1
+3 0.063631937 1
+4 0.000407487 27
+3 0.199283070 1
+4 0.000443065 17
+3 0.112006975 1
+4 0.000373057 17
+3 0.151304036 1
+4 0.000393661 17
+3 0.223637698 1
+4 0.000412293 17
+3 0.239479322 1
+4 0.000353837 28
+3 0.758172425 1
+4 0.109982937 32
+3 3.740049129 1
+4 0.000367935 10
+3 0.119621049 1
+4 0.000373245 1
+3 0.143618739 1
+4 0.000352990 1
+3 0.127356695 1
+4 0.000448660 1
+4 0.000735504 10
+4 0.000317788 60
+3 0.254609036 1
+4 0.000391575 38
+3 0.153508364 1
+4 0.000345369 16
+3 0.158001131 1
+4 0.000370827 16
+3 0.407492826 1
+3 0.122224923 1
+4 0.000402076 121
+3 0.213027993 1
+4 0.000368828 10
+3 0.160033352 1
+4 0.000312779 1
+3 0.127679358 1
+4 0.000325689 1
+3 0.111858366 1
+4 0.000427966 1
+4 0.000728807 10
+4 0.000310549 59
+3 0.358674147 1
+4 0.000381775 36
+7 0.000556280 TSTP
+7 3.398953112 CONT
+4 0.000585693 7
+4 0.000258047 816
+3 8.359823493 1
+4 0.000364980 15
+3 0.398872193 1
+4 0.000355369 15
+3 0.223880601 1
+3 0.113803831 1
+4 0.000440426 124
+3 0.093815211 1
+4 0.000425262 71
+3 0.311346433 1
+4 0.000346301 10
+3 0.079595192 1
+4 0.000380864 1
+3 0.144039791 1
+4 0.000317825 1
+3 0.135665510 1
+4 0.000416861 1
+4 0.000694595 10
+4 0.000313831 60
+3 0.631121519 1
+4 0.000437524 36
+7 0.000499301 TSTP
+7 1.455005436 CONT
+4 0.000590497 7
+4 0.000254139 819
+3 9.727355907 1
+4 0.000415913 18
+3 0.463029287 1
+4 0.000347850 19
+3 0.202215316 1
+4 0.000372760 16
+3 0.829066678 1
+3 0.122203769 1
+4 0.000439313 114
+3 0.453506556 1
+4 0.000421375 10
+3 0.167711639 1
+4 0.000365479 1
+3 0.159427775 1
+4 0.000336347 1
+3 0.175990250 1
+4 0.000538887 11
+4 0.000378672 60
+3 0.439932577 1
+4 0.000405067 36
+7 0.000552412 TSTP
+7 1.518019485 CONT
+4 0.000663787 7
+4 0.000252195 864
+3 19.912570325 1
+4 0.000392436 16
+3 0.192646540 1
+4 0.000357344 18
+3 0.165647707 1
+4 0.000375569 17
+3 0.156129872 1
+4 0.000346051 19
+3 0.259497708 1
+3 0.122179663 1
+4 0.000393729 29
+3 0.213048153 1
+4 0.000370261 36
+3 0.146222355 1
+4 0.000344307 17
+3 0.141011473 1
+4 0.000349990 19
+3 0.231654842 1
+4 0.000402098 82
+3 1.559949739 1
+4 0.000411193 17
+3 0.231403233 1
+4 0.000346807 23
+3 0.071911835 1
+4 0.000379667 18
+3 0.119365932 1
+4 0.000346694 18
+3 0.071560426 1
+4 0.000376899 19
+3 0.159663650 1
+4 0.000362636 18
+3 0.167663410 1
+4 0.000353339 18
+3 0.079650029 1
+4 0.000406404 18
+3 0.527922390 2
+4 0.000543237 32
+3 0.151624218 1
+4 0.001092944 17
+3 0.160825397 1
+4 0.000389846 17
+3 0.165772322 1
+4 0.000392250 16
+3 0.391473104 1
+3 0.071853894 1
+4 0.000411310 27
+3 0.175424679 1
+4 0.000350117 17
+3 0.095606766 1
+4 0.000384163 17
+3 0.095548028 1
+4 0.000345581 17
+3 0.176055076 1
+4 0.000386596 17
+3 0.199374962 1
+4 0.000351586 34
+3 0.671730466 2
+4 0.000465209 10
+3 0.087443393 1
+4 0.000336542 1
+3 0.127659853 1
+4 0.000395755 1
+3 0.111659148 1
+4 0.000357388 1
+4 0.000365768 70
+3 0.359942717 1
+4 0.000474416 36
+7 0.000526799 TSTP
+7 16.391336233 CONT
+4 0.000606739 7
+4 0.000252703 825
+3 9.423126066 1
+4 0.000404453 17
+3 0.103478360 1
+4 0.000379639 17
+3 0.215753975 1
+3 0.055777719 1
+4 0.000374798 27
+3 2.192310846 1
+4 0.000364538 18
+3 0.095017669 1
+4 0.000374579 17
+3 0.167858272 1
+4 0.000394995 17
+3 0.183487470 1
+4 0.000328229 17
+3 0.424749918 2
+4 0.000375944 14
+3 0.086373079 1
+4 0.000342026 1
+3 0.143957741 1
+4 0.000323698 1
+3 0.095552429 1
+4 0.000351824 1
+4 0.000369679 14
+4 0.000331407 56
+3 0.407347448 1
+4 0.000387372 36
+7 0.000639935 TSTP
+7 3.249297749 CONT
+4 0.000674732 7
+4 0.000254330 824
+3 83.655961172 1
+4 0.000430093 19
+3 0.271188534 1
+4 0.000394617 19
+3 27.608941812 1
+3 0.161186568 1
+4 0.000450516 124
+3 0.437705088 1
+3 0.079896297 1
+4 0.000395445 27
+3 0.207743933 1
+4 0.000356038 17
+3 0.111692035 1
+4 0.000370128 17
+3 0.095509613 1
+4 0.000337918 16
+3 0.112097732 1
+4 0.000401108 17
+3 0.063059306 1
+4 0.000361219 36
+3 0.552280978 1
+4 0.000415916 16
+3 0.135428657 1
+4 0.000336479 16
+3 0.367466610 1
+4 0.000411259 16
+3 0.247878161 1
+4 0.000349830 16
+3 0.103207817 1
+4 0.000381731 17
+3 0.207641973 1
+4 0.000394821 17
+3 0.111713293 1
+4 0.000365416 16
+3 0.079649048 1
+4 0.000356122 16
+3 0.795727480 1
+4 0.110053931 32
+3 0.038080066 1
+4 0.000342743 17
+3 0.279446216 1
+4 0.000374827 23
+3 0.295697084 1
+4 0.000354596 18
+3 0.535620025 1
+4 0.000454264 18
+3 0.095457715 1
+4 0.000349601 18
+3 0.103619461 1
+4 0.000371113 19
+3 0.247658136 1
+4 0.000352418 18
+3 0.223712040 1
+4 0.000394071 18
+3 0.215535872 1
+4 0.000349938 18
+3 0.399676754 2
+4 0.000391624 10
+3 0.120019780 1
+4 0.000385700 1
+3 0.287262291 1
+4 0.000410793 1
+3 5.687972903 1
+4 0.000422720 1
+4 0.000835771 10
+4 0.000338408 60
+3 3.654443851 1
+4 0.000358954 36
+7 0.000568777 TSTP
+7 2.735311839 CONT
+4 0.000617805 7
+4 0.000258026 872
+3 6.247684694 1
+4 0.000381665 17
+3 0.271033476 1
+3 0.080017407 1
+4 0.000376864 21
+3 0.183514484 1
+4 0.000400388 7
+3 0.543949651 1
+4 0.000355286 10
+3 0.119603286 1
+4 0.000363348 1
+3 0.127447163 1
+4 0.000341483 1
+3 0.327721799 1
+4 0.000428809 1
+4 0.000707831 10
+4 0.000323420 60
+3 0.343068111 1
+4 0.000514657 36
+7 0.000473004 TSTP
+7 14.439862195 CONT
+4 0.000539168 7
+4 0.000254087 866
+3 0.614218693 1
+4 0.000363210 16
+3 0.177673946 1
+4 0.000353681 16
+3 0.157793450 1
+4 0.000325782 16
+3 0.161671660 1
+4 0.000395594 17
+3 0.157483187 1
+4 0.000332878 16
+3 0.123732328 1
+4 0.000401784 16
+3 0.187796972 1
+4 0.000357585 22
+3 0.119318881 1
+4 0.000324225 31
+3 0.138162368 1
+4 0.000379037 33
+3 0.117380233 1
+4 0.000358787 35
+3 0.359435429 2
+4 0.000397934 10
+3 0.479762921 1
+4 0.000361008 42
+3 0.311959467 1
+4 0.000390897 30
+3 0.135228283 1
+4 0.000363360 31
+3 0.592821208 2
+4 0.000371179 32
+3 0.102464558 1
+4 0.000401580 23
+3 0.271758514 1
+4 0.000352094 10
+3 0.095461652 1
+4 0.000352317 1
+3 0.175740178 1
+4 0.000360447 1
+3 0.119944584 1
+4 0.000369823 1
+4 0.000418330 54
+4 0.000290714 16
+3 0.535003752 1
+4 0.000347906 36
+7 0.000540252 TSTP
+7 8.119422644 CONT
+4 0.000550546 7
+4 0.000270883 7
+4 0.000309568 863
+3 4.439312397 1
+4 0.000422377 10
+3 0.126842073 1
+4 0.000374980 1
+3 0.191573294 1
+4 0.000343883 1
+3 0.104338672 1
+4 0.000337400 1
+3 0.095097124 1
+4 0.000333834 1
+3 0.183571932 1
+4 0.000343439 1
+3 0.071851031 1
+4 0.000341209 1
+3 0.215747016 1
+4 0.000416855 21
+4 0.000328367 433
+3 1.303495007 1
+3 0.105633305 1
+4 0.000369836 30
+3 0.317692992 1
+4 0.000596648 512
+3 2.639519736 1
+4 0.000636971 842
+3 0.153213684 1
+4 0.000353795 2
+3 0.445780954 1
+4 0.000386371 61
+3 0.823774769 1
+4 0.000441965 10
+3 0.097360557 1
+4 0.000493182 1
+3 0.157577353 1
+4 0.000729707 11
+4 0.000470530 61
+3 3.390825751 1
+4 0.000405386 39
+3 0.255568652 1
+3 0.055907219 1
+4 0.000356174 28
+3 0.223697836 1
+4 0.000363714 18
+3 0.071906737 1
+4 0.000392293 18
+3 0.137411001 1
+4 0.000339774 18
+3 0.069925847 1
+4 0.000366418 18
+3 0.415281632 2
+4 0.000369014 14
+3 0.175719944 1
+4 0.000341084 1
+3 0.159555979 1
+4 0.000344904 1
+3 0.111749441 1
+4 0.000375281 1
+4 0.000410804 71
+3 6.504533238 1
+4 0.000361531 36
+7 0.000558118 TSTP
+7 1.278101661 CONT
+4 0.000811650 7
+4 0.000376336 769
+3 11.511743118 1
+4 0.000364527 17
+3 0.161438531 1
+4 0.000345224 17
+3 0.157323414 1
+4 0.000537486 18
+3 0.121528105 1
+4 0.000498558 17
+3 0.125526397 1
+4 0.000482108 19
+3 0.255732231 1
+3 0.121881198 1
+4 0.000345581 29
+3 0.213459919 1
+4 0.000395734 36
+3 0.161822173 1
+4 0.000357575 17
+3 0.157298340 1
+4 0.000412710 20
+3 0.178299484 1
+4 0.000327592 17
+3 0.237035658 1
+4 0.000416700 88
+3 0.631761843 1
+4 0.000402040 17
+3 0.151418917 1
+3 0.154220895 1
+4 0.000423284 70
+3 0.101389342 1
+4 0.000335849 17
+3 0.359970840 1
+4 0.000403114 64
+3 0.255375492 1
+4 0.000350430 17
+3 0.153935811 1
+4 0.000325999 17
+3 0.357694905 1
+4 0.000363787 18
+3 0.137455631 1
+4 0.000495269 17
+3 0.565508737 1
+3 0.047830147 1
+4 0.000532450 28
+3 0.351524429 1
+4 0.000467173 18
+3 0.071666434 1
+4 0.000641468 18
+3 0.167194718 1
+4 0.000489431 18
+3 0.200295616 1
+4 0.000551093 18
+3 0.224195045 1
+4 0.000490351 29
+3 0.942128105 2
+4 0.000420457 10
+3 0.159520647 1
+4 0.000340538 1
+3 0.191674682 1
+4 0.000341809 1
+3 0.162114470 1
+4 0.000403173 1
+4 0.000370828 71
+3 3.453730031 1
+4 0.000407152 36
+7 0.000532697 TSTP
+7 1.279692927 CONT
+4 0.000594321 7
+4 0.000338319 766
+3 20.543075366 1
+3 0.161678515 1
+4 0.000393388 89
+3 0.109518649 1
+4 0.000377129 77
+3 0.487449518 1
+4 0.000414332 10
+3 0.103420818 1
+4 0.000327642 1
+3 0.160021081 1
+4 0.000339209 1
+3 0.103534453 1
+4 0.000352986 1
+4 0.000362220 71
+3 11.872264722 1
+4 0.000426217 10
+3 0.143175518 1
+4 0.000337384 1
+3 0.143330589 1
+4 0.000347866 1
+3 0.095812134 1
+4 0.000395322 1
+4 0.000374560 71
+3 0.719728666 1
+4 0.000364309 36
+7 0.000545907 TSTP
+7 1.382542565 CONT
+4 0.000623723 7
+4 0.000296046 766
+3 9.311903448 1
+3 0.145546621 1
+4 0.000387557 79
+3 0.597650202 1
+4 0.000355720 10
+3 0.127432037 1
+4 0.000369744 1
+3 0.175848436 1
+4 0.000346841 1
+3 0.111455892 1
+4 0.000363654 1
+4 0.000784986 10
+4 0.000316427 61
+3 2.342798974 1
+4 0.000586526 81
+3 0.263320080 1
+4 0.000396667 17
+3 0.175857695 1
+4 0.000346577 18
+3 0.175300181 1
+4 0.000422884 18
+3 0.151615841 1
+4 0.000365608 5
+3 0.255672928 1
+4 0.000377346 20
+3 1.335841010 1
+4 0.000350921 10
+3 0.103478377 1
+4 0.000340388 1
+3 0.079799956 1
+4 0.000377597 1
+4 0.000340277 619
+3 0.088604932 1
+4 0.000347462 9
+3 0.110282970 1
+4 0.000362487 1
+3 0.112068737 1
+4 0.000335578 1
+3 0.137441147 1
+4 0.000356006 1
+3 0.021400111 1
+4 0.000315926 1
+3 0.343808846 1
+4 0.000695257 21
+4 0.000443236 818
+3 1.342789495 1
+4 0.000576959 740
+3 0.153934670 1
+4 0.000389186 5
+3 0.645080930 1
+4 0.000358932 10
+3 0.095733242 1
+4 0.000334965 1
+3 0.143733003 1
+4 0.000330461 1
+3 0.079904187 1
+4 0.000340350 1
+4 0.000651650 10
+4 0.000323088 61
+3 1.886982413 1
+4 0.000364249 36
+7 0.000518790 TSTP
+7 1.438859082 CONT
+4 0.000639886 7
+4 0.000308077 765
+3 19.960179842 1
+3 0.137318544 1
+4 0.000425193 89
+3 0.101456129 1
+4 0.000385837 78
+3 0.687735193 1
+4 0.000344463 10
+3 0.111760772 1
+4 0.000372205 1
+3 0.143536207 1
+4 0.000334583 1
+3 0.095671266 1
+4 0.000382623 1
+4 0.000308090 14
+4 0.000326265 57
+3 0.287477689 1
+4 0.000340497 36
+7 0.000549212 TSTP
+7 1.334882104 CONT
+4 0.000566744 7
+4 0.000445456 7
+4 0.000310448 758
+3 21.919165309 1
+4 0.000389164 17
+3 1.607860009 1
+3 0.145916570 1
+4 0.000550629 79
+3 40.887569204 1
+3 0.063226887 1
+4 0.000407176 28
+3 0.231577718 1
+4 0.000347207 18
+3 0.135826371 1
+4 0.000348097 18
+3 0.135755107 1
+4 0.000342546 18
+3 0.513437669 1
+4 0.000352245 17
+3 0.333870129 1
+4 0.000348692 17
+3 0.271457790 1
+4 0.000354921 17
+3 0.567782986 1
+4 0.000403925 17
+3 0.087387382 1
+4 0.000330600 18
+3 0.064692221 1
+4 0.000374641 41
+3 0.334386122 2
+4 0.000368782 36
+3 0.095813194 1
+4 0.000326974 17
+3 0.319688238 1
+4 0.000400214 4
+3 0.217758066 1
+4 0.000382550 6
+3 0.181472137 1
+4 0.000377069 4
+3 0.351749687 1
+4 0.000351451 17
+3 0.337577822 1
+4 0.000361249 18
+3 0.477870170 1
+4 0.000357175 17
+3 0.249462376 1
+4 0.000361629 17
+3 0.205554148 1
+4 0.000429511 17
+3 0.271772888 1
+4 0.000366700 4
+3 0.185663908 1
+4 0.000801799 4
+3 0.149332116 1
+4 0.000354948 4
+3 0.137604340 1
+4 0.000341941 4
+3 0.149596246 1
+4 0.000347968 7
+3 0.879575837 1
+4 0.000371385 6
+3 0.495575891 1
+4 0.000410648 7
+3 0.535996334 1
+4 0.000346507 17
+3 3.031472869 1
+4 0.000383621 10
+3 0.111534733 1
+4 0.000341148 1
+3 0.127793429 1
+4 0.000314986 1
+3 0.135521274 1
+4 0.000370481 1
+4 0.000315991 10
+4 0.000321545 61
+3 0.287211223 1
+4 0.000349261 36
+7 0.000625125 TSTP
+7 18.263683258 CONT
+4 0.000498815 7
+4 0.000274045 761
+3 1.023194790 1
+4 0.000373438 18
+3 0.143586996 1
+4 0.000363107 23
+3 0.295540816 1
+4 0.000393611 19
+3 0.455657673 2
+4 0.000426373 10
+3 0.113703338 1
+4 0.000378402 1
+3 0.157390675 1
+4 0.000357087 1
+3 0.151742623 1
+4 0.000372121 1
+4 0.000389981 71
+3 4.695812081 1
+4 0.000435116 47
+3 0.279470887 1
+4 0.000352451 20
+3 0.135503138 1
+4 0.000416970 17
+3 0.264941187 1
+4 0.000350779 17
+3 0.150132591 1
+4 0.000411483 4
+3 0.311846550 1
+4 0.000391644 8
+3 0.183614576 1
+4 0.000404638 17
+3 0.175683730 1
+4 0.000357988 7
+3 0.423533239 1
+4 0.000398142 10
+3 0.095915760 1
+4 0.000332763 1
+3 0.143141796 1
+4 0.000384253 1
+3 0.127668348 1
+4 0.000355276 1
+4 0.000376278 71
+3 2.375919235 1
+4 0.000378363 36
+7 0.000560572 TSTP
+7 15.551189540 CONT
+4 0.000539521 7
+4 0.000299553 760
+3 23.695858735 2
+4 0.000359908 18
+3 0.170196607 1
+4 0.000348039 17
+3 0.573067146 2
+4 0.000315257 18
+3 0.664401104 1
+3 0.105229177 1
+4 0.000345009 30
+3 0.221703840 1
+4 0.000407918 101
+3 0.527554619 1
+4 0.000353805 17
+3 0.135802397 1
+3 0.071781394 1
+4 0.000350908 29
+3 0.247749684 1
+4 0.000361118 18
+3 0.103453369 1
+4 0.000336479 18
+3 0.137722936 1
+4 0.000361246 18
+3 0.517919323 2
+4 0.000389552 40
+3 1.831522136 1
+4 0.000398435 17
+3 0.249614782 1
+4 0.000388303 18
+3 3.541891503 1
+4 0.000378322 17
+3 0.295458712 1
+4 0.000363984 17
+3 0.095756287 1
+4 0.000364362 18
+3 0.199627897 1
+3 0.055865953 1
+4 0.000355114 27
+3 0.223763732 1
+4 0.000376939 18
+3 0.064087461 1
+4 0.000346247 17
+3 0.145196165 1
+4 0.000374948 18
+3 0.077578841 1
+4 0.000345534 41
+3 0.703167850 1
+4 0.110020471 33
+3 0.538607790 1
+4 0.000410711 17
+3 0.161582846 1
+4 0.000363956 17
+3 0.141494482 1
+4 0.000353886 18
+3 0.169681414 1
+4 0.000383409 17
+3 0.421508228 1
+4 0.000358304 17
+3 0.568001575 1
+4 0.000413829 17
+3 0.209401778 1
+4 0.000350372 18
+3 2.102060980 1
+3 0.055601917 1
+4 0.000394102 4
+3 0.215605473 1
+3 0.064149899 1
+4 0.000341844 4
+3 0.215470952 1
+3 0.040040524 1
+4 0.000342404 4
+3 0.615762246 1
+3 0.032063265 1
+4 0.000365036 4
+3 0.247519203 1
+3 0.056030347 1
+4 0.000378459 4
+3 0.224142535 1
+3 0.031523638 1
+4 0.000358178 4
+3 0.423666972 1
+4 0.000376999 4
+3 0.255643217 1
+4 0.000343531 17
+3 4.856027841 1
+4 0.000500863 18
+3 0.193366280 1
+4 0.000389063 17
+3 0.165522421 1
+4 0.000344857 17
+3 0.473753484 1
+4 0.000400177 17
+3 0.437554096 1
+4 0.000359468 18
+3 1.607761052 1
+4 0.000366734 33
+3 0.151682280 1
+4 0.000346026 18
+3 0.407553246 2
+4 0.000364683 13
+3 0.127618024 1
+4 0.000319068 1
+3 0.143660206 1
+4 0.000364479 1
+3 0.143742384 1
+4 0.000406650 1
+4 0.000367797 71
+3 0.351557499 1
+4 0.000402956 36
+7 0.000565724 TSTP
+7 2.191516357 CONT
+4 0.000601223 7
+4 0.000313328 736
+3 0.486301431 1
+4 0.000401910 27
+3 0.719571416 1
+4 0.000386112 38
+3 0.369728756 1
+4 0.000378489 21
+3 0.349666198 1
+4 0.000466278 22
+3 0.361397835 1
+4 0.000376363 25
+3 0.381641787 1
+4 0.000422633 26
+3 0.386758659 1
+4 0.000357995 29
+3 0.556543071 1
+4 0.000385322 30
+3 0.543559098 1
+4 0.000354657 4
+3 0.191664837 1
+4 0.000384254 4
+3 0.153687121 1
+4 0.000395274 4
+3 0.133534453 1
+4 0.000396348 4
+3 0.121659912 1
+4 0.000413405 4
+3 0.125573096 1
+4 0.000387566 4
+3 0.139150330 1
+4 0.000327305 4
+3 0.148154366 1
+4 0.000372650 32
+3 0.249863620 1
+4 0.000339958 1
+3 0.637929725 1
+4 0.000396127 10
+3 0.111347453 1
+4 0.000349649 1
+3 0.239519890 1
+4 0.000376892 1
+4 0.000894005 10
+4 0.000362047 61
+3 0.718355866 1
+4 0.000378376 36
+7 0.000534690 TSTP
+7 5.191647462 CONT
+4 0.000706786 7
+4 0.000362129 736
+3 0.686656947 1
+4 0.000446177 27
+3 0.295649306 1
+4 0.000566542 38
+3 0.409198821 1
+4 0.000441251 21
+3 0.621630445 1
+4 0.000366152 22
+3 0.305683015 1
+4 0.000432894 25
+3 0.309555663 1
+4 0.000358268 26
+3 0.361574083 1
+4 0.000411224 29
+3 0.381625199 1
+4 0.000357855 30
+3 0.961682942 1
+4 0.000419125 33
+3 0.669684753 1
+4 0.000434909 44
+3 0.655678777 1
+4 0.000427507 17
+3 20.106525371 1
+3 0.045647273 1
+4 0.000365446 18
+3 0.186268181 1
+4 0.000372156 17
+3 0.132866873 1
+4 0.000376959 17
+3 0.185773537 1
+4 0.000351543 18
+3 0.221453445 1
+4 0.000393827 31
+3 0.184683590 1
+4 0.000337990 20
+3 0.651084582 1
+3 0.091972978 1
+4 0.000436889 34
+3 0.247353084 1
+4 0.000389987 17
+3 0.087558484 1
+4 0.000370313 18
+3 0.159730348 1
+4 0.000342223 24
+3 0.223550409 1
+4 0.000404235 45
+3 0.279483799 2
+4 0.000368998 36
+3 0.207881506 1
+4 0.000385223 17
+3 0.217550024 1
+4 0.000377422 18
+3 0.293652368 1
+4 0.000374239 17
+3 0.231611804 1
+4 0.000354648 24
+3 0.255771372 1
+4 0.000396653 19
+3 0.709843468 1
+4 0.109945476 33
+3 2.772403375 1
+4 0.000405016 10
+3 0.159034249 1
+4 0.000343155 1
+3 0.175485925 1
+4 0.000390619 1
+3 0.127848732 1
+4 0.000380434 1
+4 0.000358212 71
+3 0.751855132 1
+4 0.000404622 36
+7 0.000608357 TSTP
+7 2.502601867 CONT
+4 0.000660954 7
+4 0.000292705 761
+3 42.344294221 2
+4 0.000346361 21
+3 0.232300274 1
+4 0.000397957 17
+3 0.110977267 1
+4 0.000347456 18
+3 0.191542148 1
+4 0.000421802 23
+3 0.191648097 1
+4 0.000390839 31
+3 0.423642384 2
+4 0.000417125 10
+3 0.095563652 1
+4 0.000328914 1
+3 0.162289389 1
+4 0.000386050 1
+3 0.132960135 1
+4 0.000421188 1
+4 0.000357036 71
+3 2.528509506 1
+4 0.000374574 36
+7 0.000558417 TSTP
+7 1.326200172 CONT
+4 0.000651198 7
+4 0.000368984 7
+4 0.000333315 755
+3 10.759500663 1
+4 0.000424380 21
+3 0.366812536 1
+4 0.000354543 18
+3 0.127689176 1
+4 0.000369158 17
+3 0.175591974 1
+3 0.048660960 1
+4 0.000359942 26
+3 0.087772999 1
+4 0.000337647 17
+3 0.110972447 1
+4 0.000331622 18
+3 0.129662149 1
+4 0.000359074 21
+3 0.341590744 2
+4 0.000418281 10
+3 0.175657585 1
+4 0.000350980 1
+3 0.119880120 1
+4 0.000393669 1
+3 0.143461878 1
+4 0.000387547 1
+4 0.000367203 10
+4 0.000313262 61
+3 1.423356906 1
+4 0.000369190 36
+7 0.000544947 TSTP
+7 1.086855932 CONT
+4 0.000600841 7
+4 0.000259936 762
+3 29.456688546 1
+4 0.000382210 17
+3 0.166860376 1
+3 0.072853854 1
+4 0.000486510 26
+3 0.094686413 1
+4 0.000397296 17
+3 0.055880947 1
+4 0.000550370 18
+3 0.359221233 2
+4 0.000388415 14
+3 0.111920171 1
+4 0.000344960 1
+3 0.119262715 1
+4 0.000351551 1
+3 0.135698555 1
+4 0.000358834 1
+4 0.000370376 71
+3 7.200064723 1
+4 0.000396296 39
+3 0.201124997 1
+4 0.000353353 17
+3 12.583077072 1
+4 0.000405715 36
+7 0.000556650 TSTP
+7 2.166256425 CONT
+4 0.000595403 7
+4 0.000284965 701
+3 34.464618235 1
+3 0.137495155 1
+4 0.000393855 89
+3 6.333858500 1
+4 0.000421474 17
+3 0.247499316 1
+4 0.000344421 17
+3 0.201481700 1
+4 0.000396558 17
+3 0.165632278 1
+4 0.000384607 19
+3 0.287697103 1
+4 0.000394441 20
+3 0.185936115 1
+4 0.000389601 17
+3 0.197247752 1
+4 0.000421181 17
+3 10.256287285 1
+4 0.000401831 17
+3 0.463252389 1
+4 0.000411884 24
+3 0.919761790 1
+4 0.000376261 27
+3 0.599663943 1
+4 0.000430115 28
+3 1.727519207 1
+4 0.000366528 27
+3 0.775678123 2
+4 0.000446678 33
+3 0.127615264 1
+4 0.000336915 17
+3 0.169691032 1
+4 0.000404518 17
+3 14.214084103 2
+4 0.000406930 31
+3 1.064172346 1
+4 0.000446106 82
+3 0.462979744 1
+4 0.000425667 80
+3 0.455412593 1
+4 0.000399671 17
+3 1.015850622 1
+3 0.200009465 1
+3 0.121842965 1
+4 0.000413815 31
+3 0.197469351 1
+4 0.000429019 144
+3 0.313156262 1
+4 0.000562658 43
+3 0.168267990 1
+4 0.000376310 17
+3 0.149529087 1
+4 0.000561536 18
+3 0.161330526 1
+4 0.000487524 17
+3 0.333469617 1
+4 0.000432119 7
+3 2.407756190 1
+4 0.000399637 18
+3 0.185510385 1
+4 0.000403515 17
+3 0.397545429 1
+4 0.000349287 24
+3 0.455775587 1
+4 0.000382010 26
+3 0.119660765 1
+4 0.000344743 27
+3 0.983754654 1
+4 0.000391754 26
+3 0.367444466 2
+4 0.000479735 24
+3 0.153584990 1
+4 0.000518767 17
+3 0.333432343 1
+4 0.000451263 31
+3 0.951762306 1
+4 0.000390342 20
+3 0.799717393 1
+4 0.110050651 31
+3 6.394224606 1
+4 0.000399427 17
+3 0.201242861 1
+4 0.000362093 17
+3 0.805831872 1
+4 0.000492597 24
+3 0.463611154 1
+4 0.000353344 28
+3 0.495490410 2
+4 0.000435363 33
+3 0.153574646 1
+4 0.000344398 17
+3 0.205530768 1
+4 0.000359665 17
+3 0.368002084 1
+4 0.000369806 31
+3 5.543652529 1
+4 0.000405256 21
+3 2.319551608 2
+4 0.000402605 31
+3 0.127672928 1
+4 0.000396047 16
+3 0.145521021 1
+4 0.000370101 18
+3 0.198850123 1
+4 0.000380497 18
+3 0.374518191 1
+4 0.000376497 4
+3 0.071763335 1
+4 0.000357445 29
+3 1.991623930 1
+4 0.000360230 17
+3 0.153682265 1
+4 0.000355502 17
+3 0.141566970 1
+4 0.000343818 17
+3 0.319546316 1
+4 0.000381425 32
+3 0.415753148 1
+4 0.000376296 20
+3 0.111609906 1
+4 0.000376038 20
+3 0.111683841 1
+4 0.000339838 20
+3 0.223663238 1
+4 0.000345139 20
+3 1.735836126 1
+4 0.000383634 20
+3 1.431546931 1
+4 0.000376084 20
+3 0.471593841 1
+4 0.000359976 38
+4 0.703414565 18
+3 0.529968458 1
+4 0.110004687 31
+3 0.344443632 1
+4 0.000377377 17
+3 0.161592431 1
+4 0.000373603 20
+3 0.149541334 1
+4 0.000376216 19
+3 0.169770415 1
+4 0.000380554 21
+3 0.237617326 1
+4 0.000353075 17
+3 0.271492043 1
+4 0.000393653 23
+3 0.847577958 1
+4 0.000355919 17
+3 0.215824561 2
+4 0.000420253 34
+3 0.159446820 1
+4 0.000385845 55
+3 0.119529700 1
+4 0.000443729 18
+3 0.143622153 1
+4 0.000371709 55
+3 0.087744678 1
+4 0.000432932 18
+3 0.135547822 1
+4 0.000387780 55
+3 0.367740510 1
+4 0.000403129 8
+3 0.119486192 1
+4 0.000352406 1
+3 0.159480106 1
+4 0.000381349 1
+3 0.095840317 1
+4 0.000406279 1
+4 0.000347860 68
+3 0.296854807 1
+4 0.000333832 34
+7 0.000530929 TSTP
+7 18.711040311 CONT
+4 0.000722739 7
+4 0.000294419 720
+3 1.878490908 1
+4 0.000385552 14
+3 0.499457577 1
+4 0.000364101 14
+3 0.083000133 1
+4 0.000374483 14
+3 0.083512020 1
+4 0.000330702 19
+3 0.082876543 1
+4 0.000450885 16
+3 0.082872661 1
+4 0.000348207 16
+3 0.455801267 1
+4 0.000408033 16
+3 22.718850312 1
+4 0.000367782 16
+3 0.499319128 1
+4 0.000440603 18
+3 0.083031219 1
+4 0.000339332 18
+3 5.992261219 1
+4 0.000404772 17
+3 1.015513604 1
+4 0.000428246 21
+3 0.343708648 1
+4 0.000407440 17
+3 0.499501973 1
+4 0.000404036 17
+3 0.082759959 1
+4 0.000405669 17
+3 0.082706521 1
+4 0.000350717 17
+3 0.082937503 1
+4 0.000415135 17
+3 0.204004487 1
+4 0.000358586 17
+3 2.061676979 1
+3 0.178034321 1
+4 0.000458403 41
+3 0.157662119 1
+3 0.162192601 1
+4 0.000462507 71
+3 0.173246535 1
+3 0.153994123 1
+4 0.000444605 119
+3 0.173440035 1
+3 0.122042974 1
+4 0.000383053 77
+3 0.357731675 1
+4 0.000408902 18
+3 0.735691322 1
+4 0.000400895 16
+3 0.367560977 1
+4 0.000392665 24
+3 0.143760259 1
+4 0.000398216 16
+3 0.367347853 1
+4 0.000417748 15
+3 0.119692664 1
+4 0.000357595 28
+3 0.175609639 1
+4 0.000389132 16
+3 0.215606599 1
+4 0.000346514 15
+3 0.079667984 1
+4 0.000454884 28
+3 0.175582670 1
+4 0.000358310 16
+3 0.239689561 1
+4 0.000413015 15
+3 0.079470073 1
+4 0.000357373 24
+3 0.391674008 1
+4 0.000382927 16
+3 0.153648702 1
+4 0.000342793 16
+3 0.149695017 1
+4 0.000398179 16
+3 0.119534529 1
+4 0.000382745 18
+3 0.207754094 1
+4 0.000381072 17
+3 0.185524250 1
+4 0.000387534 17
+3 0.117594633 1
+4 0.000385616 7
+3 0.527773376 1
+4 0.000363479 10
+3 0.143658968 1
+4 0.000374950 1
+3 0.151534283 1
+4 0.000338832 1
+3 0.247642362 1
+4 0.000414888 1
+4 0.000623078 10
+4 0.000327615 61
+3 0.679143212 1
+4 0.000428228 36
+7 0.000498302 TSTP
+7 15.759302739 CONT
+4 0.000709658 7
+4 0.000259898 761
+3 1.447011203 1
+4 0.000422073 52
+3 0.111465797 1
+4 0.000378643 17
+3 0.112301851 1
+4 0.000341490 16
+3 0.599047398 1
+4 0.000373061 16
+3 0.137569975 1
+4 0.000351584 15
+3 0.133686062 1
+4 0.000363926 19
+3 0.455652573 1
+4 0.000404204 19
+3 0.095485987 1
+4 0.000330733 17
+3 3.896053197 1
+4 0.000419108 18
+3 0.103484157 1
+4 0.000355073 18
+3 0.103427073 1
+4 0.000339638 18
+3 0.088569795 1
+4 0.000347190 18
+3 0.054934884 1
+4 0.000344192 17
+3 0.071779814 1
+4 0.000390972 18
+3 0.103236039 1
+4 0.000394154 18
+3 0.079809854 1
+4 0.000388847 18
+3 0.207558980 1
+4 0.000358322 19
+3 0.119757145 1
+4 0.000373061 18
+3 0.079697457 1
+4 0.000366006 18
+3 0.207569155 1
+4 0.000635030 18
+3 0.263316887 1
+4 0.000556093 18
+3 0.183554241 1
+4 0.000414673 18
+3 0.095605329 1
+4 0.000367209 18
+3 0.088897668 1
+4 0.000400849 18
+3 0.023143466 1
+4 0.000358736 18
+3 0.086779107 1
+4 0.000390339 17
+3 0.079564663 1
+4 0.000339080 19
+3 0.119593603 1
+4 0.000432584 18
+3 0.095575470 1
+4 0.000338328 18
+3 0.015961962 1
+4 0.000398069 18
+3 0.151235025 1
+4 0.000341615 18
+3 0.263735292 2
+4 0.000416151 36
+3 0.344262441 1
+4 0.000347914 17
+3 0.162363392 1
+4 0.000380379 17
+3 0.188195394 1
+4 0.000401011 7
+3 0.175818950 1
+4 0.000394224 17
+3 0.537388667 1
+4 0.000378779 17
+3 1.661891035 1
+4 0.000410197 10
+3 0.089165673 1
+4 0.000321823 1
+3 0.149978075 1
+4 0.000387317 1
+3 0.095732547 1
+4 0.000376913 1
+4 0.000309348 54
+4 0.000366179 17
+3 1.463359603 1
+4 0.000359983 36
+7 0.000588293 TSTP
+7 1.494986237 CONT
+4 0.000710772 7
+4 0.000476110 755
+3 0.815254487 1
+4 0.000413124 36
+7 0.000500056 TSTP
+7 5.470841894 CONT
+4 0.000537987 7
+4 0.000309014 695
+3 1.103014779 1
+4 0.000479227 10
+3 0.255480340 1
+4 0.000377261 1
+3 0.095464134 1
+4 0.000369958 1
+3 0.239785146 1
+4 0.000349997 1
+3 0.111606627 1
+4 0.000387143 1
+3 0.095592443 1
+4 0.000362436 1
+3 0.209546330 1
+4 0.000383199 1
+3 0.069908389 1
+4 0.000388572 13
+4 0.000356399 40
+3 0.391033583 1
+4 0.000463571 22
+4 0.000339472 36
+3 22.904792991 1
+4 0.000415262 10
+3 0.142951874 1
+4 0.000403144 1
+3 0.128583126 1
+4 0.000412641 1
+3 0.166690878 1
+4 0.000689289 739
+3 2.624041365 1
+4 0.000400916 9
+3 0.174887138 1
+4 0.000384252 1
+3 0.119405108 1
+4 0.000372425 1
+3 0.167720375 1
+4 0.000332687 1
+4 0.000349403 35
+3 0.423713292 1
+4 0.000375338 35
+7 0.000583271 TSTP
+7 70.969129284 CONT
+4 0.000697139 7
+4 0.000259336 690
+3 0.222944020 1
+4 0.000347798 9
+3 0.111816210 1
+4 0.000335574 1
+3 0.103568627 1
+4 0.000378947 1
+3 0.135595030 1
+4 0.000396827 1
+3 0.137532828 1
+4 0.000358634 1
+3 0.117757171 1
+4 0.000375277 1
+3 0.055587721 1
+4 0.000394197 1
+3 0.191608522 1
+4 0.000361412 1
+3 0.199704361 1
+4 0.000402536 1
+3 0.207616763 1
+4 0.000411565 25
+4 0.000397031 586
+3 0.631256050 1
+4 0.000424291 33
+4 0.000316004 581
+3 0.521136839 1
+4 0.000435811 57
+4 0.000341314 400
+3 0.813835754 1
+4 0.000377370 34
+4 0.000433569 581
+3 0.352584941 1
+4 0.000397390 57
+4 0.000363548 400
+3 0.733347389 1
+4 0.000405165 10
+3 0.167473344 1
+4 0.000351018 1
+3 0.079771169 1
+4 0.000353889 1
+4 0.000318311 603
+3 0.103143305 1
+4 0.000341409 9
+3 0.087795642 1
+4 0.000383953 18
+4 0.000367685 594
+3 2.327546392 1
+4 0.000646503 717
+3 0.519264719 1
+4 0.000577177 820
+3 0.487328825 1
+4 0.000621281 777
+3 0.255472449 1
+4 0.000560288 838
+3 0.431395389 1
+4 0.000543030 491
+3 1.815692773 1
+4 0.000376360 36
+7 0.000559203 TSTP
+7 36.256087000 CONT
+4 0.000670313 7
+4 0.000314670 514
+3 1.007150321 1
+4 0.000371526 10
+3 0.111658445 1
+4 0.000365925 1
+3 0.127497532 1
+4 0.000344023 1
+3 0.008585145 1
+4 0.000359333 1
+3 0.062918881 1
+4 0.000337433 1
+3 0.520163861 1
+4 0.000437412 2
+3 0.294795978 1
+4 0.000381118 1
+3 0.071692988 1
+4 0.000376974 1
+3 0.143539792 1
+4 0.000323794 1
+3 0.183757372 1
+4 0.000393274 1
+3 0.063755161 1
+4 0.000544230 660
+3 0.639400190 1
+4 0.000381233 17
+3 0.185646026 1
+4 0.000387918 17
+3 0.165576131 1
+4 0.000370784 17
+3 0.169594206 1
+4 0.000346486 20
+3 0.165630517 1
+4 0.000379258 16
+3 0.247663006 1
+4 0.000384711 18
+3 0.153654800 1
+4 0.000384127 21
+3 0.133594381 1
+4 0.000358222 17
+3 0.153676469 1
+4 0.000411504 17
+3 0.143149979 1
+4 0.000355384 17
+3 0.702200221 1
+3 0.144007022 1
+3 0.129890903 1
+4 0.000355329 31
+3 0.797783059 1
+4 0.000398510 39
+3 0.615529280 1
+4 0.000363986 10
+3 0.095683598 1
+4 0.000325788 1
+3 0.103551436 1
+4 0.000383441 1
+3 0.119607986 1
+4 0.000347694 1
+3 0.145819004 1
+4 0.000319052 1
+3 0.125546782 1
+4 0.000367240 1
+3 0.039546567 1
+4 0.000326530 1
+3 0.183922235 1
+4 0.000373559 21
+4 0.000353866 702
+3 2.087798526 1
+4 0.000539051 571
+3 0.487204393 1
+4 0.000612492 688
+3 0.567301355 1
+4 0.000529935 569
+3 0.183352643 1
+4 0.000572020 259
+3 1.895653835 1
+4 0.000559693 676
+3 0.183349956 1
+4 0.000627051 788
+3 0.311439753 1
+4 0.000520169 684
+3 0.223235251 1
+4 0.000556696 706
+3 1.855807818 1
+4 0.000623383 754
+3 0.399430211 1
+4 0.000666082 755
+3 0.678992219 1
+4 0.000407642 9
+3 0.071844278 1
+4 0.000408252 39
+3 2.271730493 1
+4 0.000695074 754
+3 0.951239040 1
+4 0.000655239 755
+3 0.199279212 1
+4 0.000524359 568
+3 0.351523060 1
+4 0.000597140 688
+3 0.375552882 1
+4 0.000572100 882
+3 0.335236477 1
+4 0.000595587 797
+3 0.335527330 1
+4 0.000590118 858
+3 0.335478957 1
+4 0.000645679 720
+3 0.335412572 1
+4 0.000564452 692
+3 0.447292502 1
+4 0.000617332 631
+3 0.439511370 1
+4 0.000599395 551
+3 1.255467302 1
+4 0.000612853 695
+3 0.975312065 1
+4 0.000556515 535
+3 0.849295704 1
+4 0.000409538 21
+4 0.000423212 591
+3 0.821288316 1
+4 0.000544036 588
+3 0.503545779 1
+4 0.000591477 688
+3 0.759494154 1
+4 0.000630742 882
+3 0.383301604 1
+4 0.000361161 32
+4 0.000355504 586
+3 0.425292376 1
+4 0.000427732 57
+4 0.000374856 555
+3 0.213333573 1
+4 0.000533322 588
+3 0.440372326 1
+4 0.000558654 688
+3 0.478209058 1
+4 0.000375810 9
+3 0.135845091 1
+4 0.000342553 1
+3 0.055731981 1
+4 0.000322099 1
+4 0.000333614 606
+3 0.095106089 1
+4 0.000343483 9
+3 0.511910900 1
+4 0.000395045 18
+4 0.000423280 594
+3 0.551397717 1
+4 0.000373563 62
+3 0.831401151 1
+4 0.000373044 33
+4 0.000436827 581
+3 0.359415188 1
+4 0.000369864 62
+3 1.559405239 1
+4 0.000385266 21
+4 0.000454423 436
+3 0.720007528 1
+4 0.000685988 734
+3 0.422694195 1
+4 0.000616489 820
+3 0.319316852 1
+4 0.000618298 761
+3 1.575514606 1
+4 0.000601742 540
+3 0.191314674 1
+4 0.000505078 21
+3 2.239427678 1
+4 0.000379643 17
+3 0.489926311 1
+4 0.000480378 18
+3 0.261299017 1
+4 0.000443556 156
+3 0.727585489 1
+4 0.000403010 43
+3 0.279611069 1
+3 0.079889305 1
+4 0.000401246 28
+3 0.239587313 1
+4 0.000397168 18
+3 0.072427298 1
+4 0.000333939 18
+3 0.342923416 1
+4 0.000398306 18
+3 0.183637399 1
+4 0.000381758 18
+3 0.111595657 1
+4 0.000361019 37
+3 0.063655434 1
+4 0.000399939 37
+3 0.503644352 2
+4 0.000390806 36
+3 0.161502231 1
+4 0.000365327 17
+3 0.141749408 1
+4 0.000369984 17
+3 0.185648138 1
+4 0.000356033 18
+3 0.165731462 1
+4 0.000352816 17
+3 0.161555741 1
+4 0.000359941 17
+3 0.149736702 1
+4 0.000425806 17
+3 0.113442477 1
+4 0.000355350 17
+3 0.149749419 1
+4 0.000381168 18
+3 0.201596848 1
+4 0.000367273 17
+3 0.213610750 1
+4 0.000357214 17
+3 0.233632365 1
+4 0.000352405 17
+3 0.237703831 1
+3 0.080015656 1
+4 0.000390973 28
+3 0.127528045 1
+4 0.000376775 18
+3 0.079637141 1
+4 0.000351734 18
+3 0.311727166 1
+4 0.000398259 18
+3 0.167561704 1
+4 0.000358484 19
+3 0.103706101 1
+4 0.000403651 20
+3 0.047631111 1
+4 0.000352065 20
+3 0.615677935 2
+4 0.000405081 10
+3 0.112025215 1
+4 0.000345942 1
+3 0.119151839 1
+4 0.000395602 1
+4 0.000393444 71
+3 7.400109465 1
+4 0.000377879 10
+3 0.182947979 1
+4 0.000348115 1
+3 0.063744236 1
+4 0.000406283 1
+4 0.000387358 71
+3 0.535224823 1
+4 0.000495439 39
+3 1.033667865 1
+4 0.000395791 32
+4 0.000389749 580
+3 2.085715205 1
+4 0.000595160 571
+3 1.063184152 1
+4 0.000601361 688
+3 4.184426491 1
+4 0.000611529 882
+3 198.294712987 1
+4 0.000500980 9
+3 0.189589980 1
+4 0.000719043 1
+3 0.119318988 1
+4 0.000564771 1
+3 0.151441953 1
+4 0.000358560 1
+3 0.137706675 1
+4 0.000460100 1
+3 0.149441070 1
+4 0.000384899 1
+3 0.071650668 1
+4 0.000445636 1
+3 0.191711996 1
+4 0.000613876 706
+3 1.015888491 1
+4 0.000617595 571
+3 0.438878102 1
+4 0.000577367 688
+3 0.447478114 1
+4 0.000689566 882
+3 0.359286096 1
+4 0.000640649 797
+3 0.335430267 1
+4 0.000677678 858
+3 0.472182198 1
+4 0.000627037 720
+3 0.366435323 1
+4 0.001010110 692
+3 4.511252143 1
+4 0.000650383 695
+3 0.255194042 1
+4 0.000405046 27
+4 0.000383570 722
+3 32.216371870 1
+4 0.000375360 10
+3 0.359619347 1
+4 0.000373969 1
+3 0.015453064 1
+4 0.000338365 1
+3 0.135960195 1
+4 0.000425283 1
+3 0.327618492 1
+4 0.000378966 1
+3 0.137620317 1
+4 0.000466152 1
+3 0.061246195 1
+4 0.000375182 1
+3 0.183740916 1
+4 0.000390135 1
+3 0.087550652 1
+4 0.000351053 1
+3 0.239890261 1
+4 0.000688894 800
+3 0.799211665 1
+4 0.000379792 20
+3 0.337657412 1
+4 0.000425576 20
+3 0.613410916 1
+4 0.000437220 9
+3 0.231802960 1
+4 0.000363706 1
+3 0.095550999 1
+4 0.000355948 1
+3 0.311690991 1
+4 0.000360403 1
+3 0.119493793 1
+4 0.000381406 1
+3 0.145015673 1
+4 0.000614387 1
+3 0.062048669 1
+4 0.000369418 1
+3 0.191858922 1
+4 0.000451365 46
+4 0.000332511 12
+3 0.783070466 1
+4 0.000399820 9
+3 0.231602050 1
+4 0.000506878 1
+3 0.079371339 1
+4 0.000374732 1
+3 0.143672519 1
+4 0.000357272 1
+3 0.063707147 1
+4 0.000360474 1
+3 0.199859218 1
+4 0.000407986 39
+3 0.463330673 1
+4 0.000427909 41
+4 0.000329585 727
+3 4.048292042 1
+4 0.000659682 987
+3 1.046745489 1
+4 0.000708998 1031
+3 0.623413444 1
+4 0.000606119 737
+3 1.391046737 1
+4 0.000385105 10
+3 0.103821049 1
+4 0.000344610 1
+3 0.151389382 1
+4 0.000492370 1
+3 0.135684531 1
+4 0.000350529 1
+3 0.167734456 1
+4 0.000379684 1
+3 0.063573356 1
+4 0.000336023 1
+3 0.063502987 1
+4 0.000363503 1
+3 0.223733380 1
+4 0.000655733 700
+3 25.104799626 1
+4 0.000399281 10
+3 0.159008041 1
+4 0.000402494 1
+3 0.159700848 1
+4 0.000402276 1
+3 0.063353917 1
+4 0.000404021 1
+3 0.215798492 1
+4 0.000405804 1
+3 0.119647512 1
+4 0.000477310 191
+3 0.871404448 1
+4 0.000469989 63
+3 0.663591548 1
+4 0.000421793 71
+3 0.499801607 1
+4 0.000527248 58
+3 0.083029044 1
+4 0.000401822 47
+3 0.083244748 1
+4 0.000470973 34
+3 38.037421477 1
+4 0.000348897 8
+3 0.079604312 1
+4 0.000382227 1
+3 0.159674301 1
+4 0.000343747 1
+3 0.088281992 1
+4 0.000366830 1
+3 0.087830069 1
+4 0.000359714 1
+3 0.150800262 1
+4 0.000394596 1
+3 0.167596087 1
+4 0.000375193 1
+3 0.191569013 1
+4 0.000356516 1
+3 0.247780823 1
+4 0.000422578 24
+4 0.000446540 801
+3 1.551406059 1
+4 0.000405220 57
+4 0.000399134 749
+3 1.166934863 1
+4 0.000381655 10
+3 0.087671380 1
+4 0.000582668 41
+4 0.000415955 771
+3 6.511197329 1
+4 0.000613896 34
+4 0.000290759 791
+3 17.855985952 1
+4 0.000392818 17
+3 0.569405413 1
+4 0.000358391 17
+3 0.497800637 1
+4 0.000387651 17
+3 0.083195865 1
+4 0.000355967 17
+3 0.083425185 1
+4 0.000856532 18
+3 1.547546742 1
+4 0.000503055 23
+3 0.183568509 1
+4 0.000385734 23
+3 0.071482783 1
+4 0.000413536 19
+3 0.119783893 1
+4 0.000374924 20
+3 0.175621531 1
+4 0.000688902 19
+3 0.111129585 1
+4 0.000543899 19
+3 0.007492305 1
+4 0.000320451 19
+3 0.328076834 1
+4 0.000603112 17
+3 0.161056013 1
+4 0.000377849 17
+3 0.141748645 1
+4 0.000437131 18
+3 0.239569515 1
+4 0.000391192 18
+3 0.175630219 1
+4 0.000559085 19
+3 0.095322294 1
+4 0.000536504 19
+3 0.111530509 1
+4 0.000359670 19
+3 0.055675989 1
+4 0.000385189 19
+3 0.247503945 1
+4 0.000392250 19
+3 0.103561293 1
+4 0.000360224 19
+3 0.127872954 1
+4 0.000366021 20
+3 0.511480153 2
+4 0.000401829 10
+3 0.103750841 1
+4 0.000506651 1
+3 0.143407021 1
+4 0.000400126 1
+3 0.095528275 1
+4 0.000406794 1
+4 0.000373737 71
+3 0.287782083 1
+4 0.000341659 36
+7 0.000558827 TSTP
+7 25.999831488 CONT
+4 0.000523441 7
+4 0.000236712 754
+3 3.303725066 1
+4 0.000699688 639
+3 0.558943365 1
+4 0.000358426 9
+3 0.375464515 1
+4 0.000728486 1
+3 0.007507401 1
+4 0.000316351 1
+3 0.055107562 1
+4 0.000363764 1
+3 0.415905885 1
+4 0.000376008 1
+3 0.147347883 1
+4 0.000412975 1
+3 0.163923920 1
+4 0.000377046 1
+3 18.472815831 1
+4 0.000455734 1
+3 0.303014397 1
+4 0.000357172 1
+3 0.224750112 1
+4 0.000406001 1
+3 0.136844895 1
+4 0.000346398 1
+3 0.109232604 1
+4 0.000427810 1
+3 0.392148315 1
+4 0.000344556 2
+3 0.263814421 1
+4 0.000428066 1
+3 0.166663903 1
+4 0.000342941 1
+3 0.137990258 1
+4 0.001053470 1
+3 0.100790618 1
+4 0.000343833 1
+3 0.207661471 1
+4 0.000377886 40
+3 0.473599768 1
+4 0.000391002 32
+4 0.000360855 705
+3 1.261382162 1
+4 0.000364648 10
+3 0.087533109 1
+4 0.000377866 18
+4 0.000361082 674
+3 11.896125981 1
+4 0.001620248 10
+3 0.101985297 1
+4 0.000430458 18
+4 0.000294990 689
+3 184.533873636 1
+4 0.000421301 10
+3 0.599060170 1
+4 0.000463651 1
+3 0.087494112 1
+4 0.000321414 1
+3 0.256043716 1
+4 0.000326971 1
+3 0.047318053 1
+4 0.000334214 1
+3 0.095759799 1
+4 0.000512111 1
+3 0.239470833 1
+4 0.000347820 1
+3 0.191631063 1
+4 0.000347219 1
+3 0.119784608 1
+4 0.000438453 41
+4 0.000335714 585
+3 106.586128074 1
+4 0.000418614 39
+3 1.752608685 1
+4 0.000380543 20
+3 0.197628987 1
+4 0.000427663 19
+3 0.153554957 1
+4 0.000366344 20
+3 0.725566286 1
+4 0.000597954 19
+3 0.201493802 1
+4 0.000352051 20
+3 0.149624969 1
+4 0.000355754 20
+3 0.304030193 1
+3 0.122005589 1
+4 0.000429672 30
+3 0.253251625 1
+4 0.000383425 100
+3 0.279685150 1
+4 0.000355705 18
+3 1.263760746 2
+4 0.000459528 73
+3 0.624090280 1
+4 0.000353236 17
+3 0.318943178 1
+4 0.000359400 23
+3 0.959672316 1
+4 0.000342497 18
+3 0.231808080 2
+4 0.000363647 34
+3 0.159515378 1
+4 0.000358754 56
+3 0.087619052 1
+4 0.000318953 18
+3 0.151754660 1
+4 0.000323220 55
+3 0.207648573 1
+4 0.000323762 15
+3 0.169611195 1
+4 0.000337631 15
+3 0.101863938 1
+4 0.000344067 18
+3 0.247531118 1
+3 0.311838031 2
+4 0.000341970 16
+3 0.207759216 1
+3 0.146055428 1
+4 0.000332071 29
+3 0.477715855 2
+4 0.000389217 1
+3 0.168124794 1
+3 0.130429375 1
+4 0.000514504 26
+3 0.172489164 1
+4 0.000548759 158
+3 0.431574679 1
+4 0.000379927 49
+3 0.127541264 1
+4 0.000340955 16
+3 0.431668893 1
+4 0.000460327 15
+3 0.127600772 1
+4 0.000499579 28
+3 0.127808975 1
+4 0.000355777 16
+3 0.199339957 1
+4 0.000432400 14
+3 0.095445357 1
+4 0.000358959 24
+3 0.143812536 1
+4 0.000343400 16
+3 0.169745514 1
+4 0.000382521 16
+3 0.109556607 1
+4 0.000352115 16
+3 0.177670917 1
+4 0.000384687 18
+3 0.149600436 1
+4 0.000343239 18
+3 0.247641731 1
+4 0.000340803 18
+3 0.185516724 1
+4 0.000495872 17
+3 0.205772317 1
+4 0.000346917 4
+3 0.217825586 1
+4 0.000364003 6
+3 0.213423459 1
+4 0.000365457 4
+3 0.319585038 1
+4 0.000363926 17
+3 0.743639537 1
+3 0.080133792 1
+4 0.000416927 4
+3 0.167620249 1
+3 0.063765726 1
+4 0.000355550 4
+3 0.215720694 1
+3 0.048014069 1
+4 0.000424490 4
+3 0.367576945 1
+4 0.000384582 4
+3 0.500931653 1
+4 0.000368133 4
+3 0.082891603 1
+4 0.000385176 4
+3 0.083267710 1
+4 0.000363598 4
+3 0.083295317 1
+4 0.000413402 4
+3 0.082848953 1
+4 0.000331234 4
+3 0.083350265 1
+4 0.000547179 4
+3 0.082820949 1
+4 0.000361568 4
+3 0.083960695 1
+4 0.000599924 7
+3 1.097009841 1
+4 0.000362618 17
+3 4.935746168 1
+4 0.000391970 18
+3 0.207704955 1
+4 0.000365172 18
+3 0.169509675 1
+4 0.000379055 17
+3 0.589730872 1
+4 0.000369999 31
+3 0.255624532 1
+4 0.000519728 31
+3 0.031432160 1
+4 0.000429333 31
+3 1.407646041 2
+4 0.000394802 37
+3 2.151660008 1
+4 0.000461818 19
+3 0.185651627 1
+4 0.000432896 20
+3 0.165569201 1
+4 0.000345574 20
+3 0.169659802 1
+4 0.000422324 19
+3 0.405722651 1
+4 0.000363552 18
+3 3.271568134 1
+4 0.000350266 17
+3 0.137754674 1
+4 0.000365437 20
+3 0.213454126 1
+4 0.000397014 20
+3 0.169607523 1
+4 0.000371113 19
+3 0.213714772 1
+4 0.000342087 20
+3 7.642107866 1
+4 0.000376375 20
+3 0.509523548 1
+3 0.161824934 1
+4 0.000463161 68
+3 0.189569262 1
+3 0.153980331 1
+4 0.000399471 74
+3 0.173817347 1
+3 0.145850395 1
+4 0.000417591 70
+3 0.661702198 1
+4 0.000438025 15
+3 0.169527617 1
+4 0.000463697 14
+3 0.149577133 1
+4 0.000424375 18
+3 0.295466207 1
+4 0.000352364 18
+3 0.263549511 1
+4 0.000393437 18
+3 0.194132483 1
+4 0.000343541 17
+3 0.149512046 1
+4 0.000382610 17
+3 0.201498788 1
+4 0.000370958 18
+3 0.421511751 1
+4 0.000417087 18
+3 0.199729040 1
+3 0.071874021 1
+4 0.000343081 4
+3 0.247672408 1
+4 0.000396139 6
+3 0.319652955 1
+4 0.000346619 18
+3 0.199599960 1
+4 0.000357428 24
+3 0.231697594 1
+4 0.000359225 19
+3 0.223551535 1
+4 0.000672168 19
+3 0.047319029 1
+4 0.000387753 19
+3 0.087690646 1
+4 0.000363889 19
+3 0.247534002 1
+4 0.000352289 19
+3 0.191815082 1
+4 0.000347206 19
+3 0.367633035 2
+4 0.000392641 35
+3 0.351613781 1
+4 0.000353246 14
+3 0.271717046 1
+4 0.000497230 15
+3 0.290351570 1
+4 0.000373981 15
+3 0.460691814 1
+4 0.000381376 24
+3 0.167560576 1
+4 0.000364462 16
+3 0.471798818 1
+4 0.000361187 15
+3 0.143835098 1
+4 0.000479757 28
+3 0.159300413 1
+4 0.000361310 16
+3 0.295658858 1
+4 0.000359389 14
+3 0.103530627 1
+4 0.000376373 24
+3 0.295767100 1
+4 0.000347813 9
+3 0.927716879 1
+4 0.000483703 1
+3 0.199479229 1
+4 0.000474704 1
+3 0.151658838 1
+4 0.000428612 1
+4 0.000433767 70
+3 0.439462066 1
+4 0.000355872 35
+7 0.000597311 TSTP
+7 5.374814287 CONT
+4 0.000587921 7
+4 0.000356356 7
+4 0.000298048 646
+3 4.015465365 1
+4 0.000391700 16
+3 0.727171357 1
+4 0.000368542 18
+3 0.591349323 1
+4 0.000354578 18
+3 0.177802364 1
+4 0.000347755 17
+3 0.381697828 1
+4 0.000367834 21
+3 0.343728825 1
+4 0.000563400 10
+3 0.135223999 1
+4 0.000362096 1
+3 0.247882945 1
+4 0.000394669 1
+3 0.247599306 1
+4 0.000403518 1
+4 0.000402784 71
+3 1.639191893 1
+4 0.000430769 36
+7 0.000577903 TSTP
+7 1.455151930 CONT
+4 0.000599454 7
+4 0.000277477 655
+3 19.808624383 1
+4 0.000620969 730
+3 1.550627339 1
+4 0.000575359 607
+3 2.135387686 1
+4 0.000551566 16
+3 0.499508523 1
+4 0.000368551 17
+3 0.082895069 1
+4 0.000407322 16
+3 0.082724768 1
+4 0.000355119 16
+3 0.083289719 1
+4 0.000359989 16
+3 0.082972034 1
+4 0.000358664 18
+3 0.083550867 1
+4 0.000357394 18
+3 0.682393143 1
+4 0.000514469 18
+3 5.239464747 1
+4 0.000357573 17
+3 0.303718219 1
+4 0.000389341 16
+3 0.153497530 1
+4 0.000362550 16
+3 0.197645169 1
+4 0.000344754 16
+3 1.015752224 1
+3 0.247971976 1
+4 0.000381490 22
+3 0.191674293 1
+4 0.000436538 18
+3 0.207618715 2
+4 0.000372068 34
+3 0.175537166 1
+4 0.000369702 23
+4 0.000358929 33
+3 0.127364793 1
+4 0.000354324 18
+3 0.151376226 1
+4 0.000366593 55
+3 0.255738152 1
+4 0.000344903 18
+3 0.257391796 1
+3 0.104301529 1
+4 0.000360991 28
+3 0.237644139 1
+4 0.000392513 120
+3 0.255590357 1
+4 0.000351348 16
+3 0.775731688 1
+4 0.000417487 16
+3 0.255723760 1
+4 0.000358589 23
+3 0.183461158 1
+4 0.000403981 17
+3 0.295703357 2
+4 0.000381414 34
+3 0.224477384 1
+4 0.000394858 16
+3 0.152747648 1
+4 0.000333163 18
+3 0.318739023 1
+4 0.000365360 18
+3 0.166589978 1
+4 0.000330995 17
+3 0.169695514 1
+4 0.000365565 17
+3 0.453575751 1
+4 0.000391533 20
+3 3.511826680 1
+4 0.000379165 9
+3 0.231519861 1
+4 0.000355888 1
+3 0.151728131 1
+4 0.000402742 1
+3 0.191560006 1
+4 0.000330002 1
+3 0.111720453 1
+4 0.000427301 141
+3 1.015593541 1
+4 0.000366551 20
+3 0.499780992 1
+4 0.000390781 13
+3 0.083591972 1
+4 0.000338616 20
+3 0.083173877 1
+4 0.000348954 17
+3 0.082791217 1
+4 0.000315724 20
+3 0.082888571 1
+4 0.000324345 17
+3 0.082877315 1
+4 0.000342978 18
+3 0.228477607 1
+4 0.000354424 20
+3 0.253676349 1
+4 0.000352173 17
+3 0.177609442 1
+4 0.000324841 18
+3 0.997767898 1
+4 0.000411047 4
+3 0.399462155 1
+4 0.000341911 19
+3 0.401740314 1
+4 0.000350008 16
+3 0.498318919 1
+4 0.000342628 20
+3 0.083051030 1
+4 0.001183443 20
+3 0.082368509 1
+4 0.000430734 21
+3 0.083436563 1
+4 0.000409277 15
+3 0.083261267 1
+4 0.000520477 14
+3 0.082682237 1
+4 0.000479996 12
+3 0.083276505 1
+4 0.000406351 47
+3 0.083040343 1
+4 0.000376074 55
+3 0.083884389 1
+4 0.000367499 82
+3 0.083670398 1
+4 0.000460801 83
+3 0.121882354 1
+4 0.000333662 14
+3 0.499710087 1
+4 0.000350508 18
+3 0.083149838 1
+4 0.000329768 19
+3 0.082760868 1
+4 0.000338668 20
+3 0.083287297 1
+4 0.000329723 15
+3 0.083433722 1
+4 0.000318367 17
+3 0.082885103 1
+4 0.000391176 17
+3 0.083185700 1
+4 0.000338025 21
+3 0.082696974 1
+4 0.000339598 20
+3 0.083223383 1
+4 0.000339001 18
+3 0.280193383 1
+4 0.000362337 9
+3 0.119712471 1
+4 0.000323805 1
+3 0.167634103 1
+4 0.000324327 1
+3 0.095701181 1
+4 0.000382500 1
+4 0.000612131 10
+4 0.000366488 59
+3 0.310748273 1
+4 0.000361886 35
+7 0.000565278 TSTP
+7 1.319347496 CONT
+4 0.000644159 7
+4 0.000301609 786
+3 1.446800162 1
+4 0.000415385 15
+3 0.147274104 1
+4 0.000411903 18
+3 0.156549622 1
+4 0.000342514 28
+3 0.158945907 1
+4 0.000383638 18
+3 0.407592647 2
+4 0.107006610 32
+3 0.134968216 1
+4 0.000374285 10
+3 0.093619166 1
+4 0.000321406 1
+3 0.135669132 1
+4 0.000418615 1
+3 0.111632584 1
+4 0.000440515 1
+4 0.000418319 71
+3 0.223294460 1
+4 0.000391684 36
+7 0.000579182 TSTP
+7 1.231321848 CONT
+4 0.000599653 7
+4 0.000272461 792
+3 22.632186080 1
+4 0.000378197 10
+3 0.159171346 1
+4 0.000358639 1
+3 0.175482875 1
+4 0.000330726 1
+3 0.295940912 1
+4 0.000358370 1
+4 0.000559630 10
+4 0.000318172 61
+3 4.462731189 1
+4 0.000387862 10
+3 0.871705771 1
+4 0.000359601 1
+3 0.087987496 1
+4 0.000319220 1
+3 0.070927565 1
+4 0.000390511 1
+3 0.199889669 1
+4 0.000351310 1
+3 0.175724658 1
+4 0.000332611 1
+3 0.119842732 1
+4 0.000370593 13
+4 0.000387753 39
+3 0.767555090 1
+4 0.000493540 36
+7 0.000508215 TSTP
+7 1.966763075 CONT
+4 0.000741179 7
+4 0.000279981 775
+3 25.824754391 1
+4 0.000470756 36
+7 0.000494758 TSTP
+7 65.088723394 CONT
+4 0.000679719 7
+4 0.000275667 733
+3 6.927156213 1
+4 0.000373384 16
+3 0.496363737 1
+4 0.000376392 15
+3 0.470682080 1
+4 0.000349852 15
+3 0.391716421 1
+4 0.000394592 32
+3 0.247584509 1
+4 0.000420580 15
+3 0.311530292 1
+4 0.000370720 15
+3 0.183777268 1
+4 0.000363324 26
+3 0.151478625 1
+4 0.000446062 15
+3 0.231612927 1
+4 0.000339645 15
+3 0.127583911 1
+4 0.000373080 23
+3 0.176030220 1
+4 0.000348512 16
+3 0.335461954 1
+4 0.000445479 15
+3 1.183603443 1
+4 0.000391993 24
+3 0.159550415 1
+4 0.000429718 16
+3 1.815580809 1
+3 0.138366471 1
+4 0.000385973 75
+3 0.357256096 1
+4 0.000370503 10
+3 0.103593163 1
+4 0.000327301 1
+3 0.135668931 1
+4 0.000339880 1
+3 0.135758729 1
+4 0.000374779 1
+4 0.000383260 14
+4 0.000381334 56
+3 1.295293307 1
+4 0.000397081 36
+7 0.000524204 TSTP
+7 26.187658124 CONT
+4 0.000555116 7
+4 0.000279669 721
+4 0.000500127 37
+3 2.138534979 1
+4 0.000382233 18
+3 1.319434356 1
+4 0.000371323 18
+3 0.391746191 1
+4 0.000430419 118
+3 2.183749419 1
+4 0.000416517 16
+3 0.499887990 1
+4 0.000346047 16
+3 0.083137968 1
+4 0.000364435 16
+3 0.082712342 1
+4 0.000410273 18
+3 0.083108498 1
+4 0.000332183 19
+3 0.083055230 1
+4 0.000334342 16
+3 0.083178624 1
+4 0.000350218 18
+3 0.083412336 1
+4 0.000324054 21
+3 0.083131851 1
+4 0.000336146 17
+3 0.082551557 1
+4 0.000353136 17
+3 31.721861726 1
+4 0.000361401 10
+3 0.223027249 1
+4 0.000363075 1
+3 0.143735767 1
+4 0.000404044 1
+3 0.047432050 1
+4 0.000315162 1
+3 0.183901229 1
+4 0.000344476 1
+3 0.103401044 1
+4 0.000342643 1
+3 0.519775970 1
+4 0.000387978 1
+3 0.023680438 1
+4 0.000321479 1
+3 0.521798478 1
+4 0.000343976 1
+3 0.109494999 1
+4 0.000336452 1
+3 0.143885891 1
+4 0.000339551 1
+3 0.047382978 1
+4 0.000312934 1
+3 0.039850761 1
+4 0.000335274 1
+3 0.223626456 1
+4 0.000598221 357
+3 2.759557850 1
+4 0.000454453 165
+3 6.463847512 1
+4 0.000484059 69
+3 0.233266723 1
+4 0.000376357 45
+3 0.189701742 1
+4 0.000378185 34
+3 2.088931237 1
+4 0.000487228 18
+3 0.498740683 1
+4 0.000530493 17
+3 0.083294029 1
+4 0.000517648 16
+3 0.082933704 1
+4 0.000589034 16
+3 0.083121594 1
+4 0.000381672 16
+3 0.083190653 1
+4 0.000378804 18
+3 0.083077548 1
+4 0.000584605 16
+3 0.082964696 1
+4 0.000477948 16
+3 1.229635017 1
+3 0.111955978 1
+3 0.106424974 1
+4 0.000402502 29
+3 0.701155126 1
+4 0.000353726 9
+3 0.072668400 1
+4 0.000476573 243
+3 0.862667867 1
+4 0.000408783 87
+3 0.169676459 1
+4 0.000385322 38
+3 0.245570905 1
+4 0.000340632 19
+3 0.169687251 1
+4 0.000347165 15
+3 0.597576864 1
+4 0.000498113 136
+3 5.727928438 1
+4 0.000378035 42
+3 0.249524958 1
+4 0.000421281 17
+3 0.365535485 1
+4 0.000362850 16
+3 6.880479377 1
+3 0.087821755 1
+4 0.000404628 28
+3 0.367357626 12
+4 0.000426716 55
+4 0.707348201 17
+3 0.130074470 1
+4 0.109903231 32
+3 1.027983646 1
+4 0.000356073 16
+3 0.655678250 1
+4 0.000371281 16
+3 0.537767701 1
+4 0.000346343 16
+3 0.349609359 1
+3 0.047872207 1
+4 0.000418273 28
+3 0.215773114 1
+4 0.000347070 17
+3 0.087473202 1
+4 0.000346937 17
+3 0.103719147 1
+4 0.000344838 17
+3 0.063617875 1
+4 0.000328166 18
+3 0.583689531 1
+4 0.000365628 17
+3 0.311682441 1
+4 0.000360082 16
+3 0.527836560 2
+4 0.000441033 27
+3 0.167394327 1
+4 0.000340744 16
+3 0.247578360 1
+3 0.048043305 1
+4 0.000443248 26
+3 0.225666468 1
+4 0.000344870 17
+3 0.213619058 1
+4 0.000394568 17
+3 0.559562890 2
+4 0.000394478 27
+3 15.848324193 1
+4 0.000419279 19
+3 0.183489003 1
+4 0.000345899 17
+3 2.687855479 1
+4 0.000386428 16
+3 0.231489856 1
+4 0.000344842 16
+3 0.500614309 1
+4 0.000372932 16
+3 0.082950621 1
+4 0.000424711 16
+3 0.082927846 1
+4 0.000359324 16
+3 0.082941249 1
+4 0.000359952 16
+3 0.083537449 1
+4 0.000432234 16
+3 0.083639033 1
+4 0.000319760 17
+3 0.082940801 1
+4 0.000367004 16
+3 0.082525413 1
+4 0.000343394 16
+3 0.364577942 1
+4 0.000374545 16
+3 0.221683183 1
+4 0.000344868 4
+3 0.175628924 1
+4 0.000394552 23
+3 0.487635634 1
+4 0.000354558 20
+3 0.304027953 1
+4 0.000420292 20
+3 0.716794830 1
+4 0.109962082 32
+3 0.588597619 1
+4 0.000363484 18
+3 0.153596439 1
+4 0.000393960 19
+3 0.205857650 1
+4 0.000340264 16
+3 0.279444090 1
+4 0.000355102 22
+3 0.223662246 1
+4 0.000430116 18
+3 0.823680490 2
+4 0.000386804 39
+3 0.367559652 1
+4 0.000371871 22
+3 0.231607979 1
+4 0.000350902 18
+3 0.803025775 1
+4 0.110021990 31
+3 0.142996783 1
+4 0.000338813 17
+3 0.247082307 1
+4 0.000455963 55
+3 0.175699074 1
+4 0.000337278 17
+3 0.159629093 1
+4 0.000409539 55
+3 8.752156863 1
+4 0.000371058 9
+3 0.159565505 1
+4 0.000362081 1
+3 0.159543856 1
+4 0.000364929 1
+3 0.135718484 1
+4 0.000430600 11
+4 0.000388491 59
+3 0.879830763 1
+4 0.000351088 35
+7 0.000591714 TSTP
+7 10.775074428 CONT
+4 0.000532260 7
+4 0.000283695 801
+3 122.379680708 1
+4 0.000338202 1
+3 0.975616476 1
+4 0.000372258 17
+3 0.471044194 1
+4 0.000365445 21
+3 0.319595247 1
+4 0.000347971 18
+3 0.479822759 2
+4 0.000381076 10
+3 0.087500836 1
+4 0.000372536 1
+3 0.143525511 1
+4 0.000343071 1
+3 0.095868843 1
+4 0.000446368 1
+4 0.000368224 69
+3 0.375411408 1
+4 0.000338057 35
+7 0.000563565 TSTP
+7 34.800073031 CONT
+4 0.000746321 7
+4 0.000257701 806
+3 1.343129903 1
+4 0.000460083 15
+3 0.499812064 1
+4 0.000412548 15
+3 0.083184054 1
+4 0.000376452 15
+3 0.083522459 1
+4 0.000408231 17
+3 0.082785596 1
+4 0.000371098 15
+3 0.488374234 1
+4 0.000340219 17
+3 0.143810199 1
+4 0.000418250 16
+3 0.153628152 1
+4 0.000340937 16
+3 0.149498016 1
+4 0.000371942 16
+3 0.153786227 1
+4 0.000337495 16
+3 0.157573629 1
+4 0.000438718 22
+3 0.312586383 1
+4 0.000370158 22
+3 0.730315193 1
+4 0.110086103 32
+3 0.382311887 2
+4 0.000382288 11
+3 0.224281839 1
+4 0.000428709 1
+3 0.126845647 1
+4 0.000438222 1
+3 0.103578691 1
+4 0.000389511 1
+4 0.000367224 70
+3 0.327889257 1
+4 0.000461851 36
+7 0.000523766 TSTP
+7 14.535079922 CONT
+4 0.000670302 7
+4 0.000265270 810
+3 9.103631881 1
+4 0.000367466 18
+3 0.217331832 1
+4 0.000399854 19
+3 1.421553205 1
+4 0.000361412 19
+3 0.193680658 1
+4 0.000361545 18
+3 0.141506554 1
+4 0.000387865 19
+3 0.199722276 1
+4 0.000355568 16
+3 0.223687340 1
+4 0.000436533 32
+3 0.311582460 1
+4 0.000362446 10
+3 0.119464594 1
+4 0.000321298 1
+3 0.127769465 1
+4 0.000342437 1
+3 0.103694545 1
+4 0.000358101 1
+4 0.000603249 10
+4 0.000399811 59
+3 8.535483151 1
+4 0.000405372 36
+7 0.000583666 TSTP
+7 5.998846396 CONT
+4 0.000580307 7
+4 0.000295594 766
+4 0.000503637 36
+3 2.294722820 1
+4 0.000388838 26
+3 3.503556579 1
+4 0.000373627 9
+3 0.143605993 1
+4 0.000330021 1
+3 0.175570042 1
+4 0.000329775 1
+3 0.119669497 1
+4 0.000384506 1
+4 0.000341788 54
+4 0.000338318 15
+3 21.992383039 1
+4 0.000380385 9
+3 0.334960478 1
+4 0.000376254 1
+3 0.159566818 1
+4 0.000360293 1
+3 0.175726678 1
+4 0.000340187 1
+3 0.215654078 1
+4 0.000324899 1
+3 0.127898264 1
+4 0.000574071 755
+3 1.687538943 1
+3 0.129829547 1
+4 0.000370848 30
+3 0.957674306 1
+4 0.000593030 675
+3 0.137423633 1
+4 0.000468474 17
+3 0.909460482 1
+4 0.000495247 15
+3 0.169503370 1
+4 0.000378756 15
+3 0.157521154 1
+4 0.000329270 15
+3 0.153895847 1
+4 0.000350257 17
+3 0.141571021 1
+4 0.000342057 15
+3 0.121773778 1
+4 0.000365563 15
+3 0.101450868 1
+4 0.000354511 15
+3 0.248445006 1
+4 0.000408703 76
+3 0.446846618 1
+3 0.135861200 1
+4 0.000378781 21
+3 0.399849423 1
+4 0.000333820 17
+3 0.167659310 1
+4 0.000360256 23
+3 0.087678898 1
+4 0.000330257 18
+3 0.223584124 1
+4 0.000395566 18
+3 0.015619789 1
+4 0.000336952 18
+3 0.392545632 1
+4 0.000342836 16
+3 0.118843946 1
+4 0.000372277 17
+3 0.151461990 1
+4 0.000336400 18
+3 0.264330546 1
+4 0.000391538 18
+3 0.167508769 1
+4 0.000346292 18
+3 0.151135765 1
+4 0.000432924 19
+3 0.111685031 1
+4 0.000331441 18
+3 0.079619828 1
+4 0.000361622 18
+3 0.119696776 1
+4 0.000336516 18
+3 0.713742396 1
+3 0.086780048 1
+4 0.000360976 32
+3 0.110696559 1
+4 0.000325357 15
+3 0.153844943 1
+4 0.000350991 17
+3 0.335340094 1
+4 0.000353421 16
+3 5.974912521 1
+4 0.000358901 16
+3 0.129029239 1
+4 0.000374149 16
+3 0.237395351 1
+3 0.088025697 1
+4 0.000363525 4
+3 0.167722244 1
+3 0.055909963 1
+4 0.000352863 4
+3 0.175656873 1
+3 0.040047222 1
+4 0.000400447 6
+3 0.247662054 1
+3 0.055969909 1
+4 0.000361014 4
+3 0.591591932 1
+4 0.000389174 21
+3 0.599701281 1
+4 0.000383012 4
+3 0.185704845 1
+4 0.000340460 4
+3 0.117530795 1
+4 0.000336025 4
+3 0.127651288 1
+4 0.000326314 23
+3 0.227617576 21
+4 0.000394931 49
+3 0.739762936 1
+4 0.000364907 28
+3 2.933895249 24
+4 0.000409806 52
+3 0.809380993 2
+4 0.000386852 35
+3 0.359707158 1
+3 0.145967481 1
+4 0.000488735 83
+3 0.245435757 1
+3 0.153976145 1
+4 0.000379350 87
+3 0.205686113 1
+3 0.171590848 1
+4 0.000383419 73
+3 0.180070094 1
+3 0.169972937 1
+4 0.000411777 62
+3 0.205778448 1
+3 0.170474122 1
+4 0.000392368 62
+3 0.228967146 1
+3 0.154108572 1
+4 0.000466808 84
+3 0.669659733 1
+4 0.000357843 17
+3 0.279718786 1
+4 0.000387121 58
+3 3.863563779 2
+3 0.129957922 1
+4 0.000396599 98
+3 0.717649806 1
+4 0.000393166 23
+3 0.399692174 1
+4 0.000384597 10
+3 0.112958508 1
+4 0.000337201 1
+3 0.126218681 1
+4 0.000316153 1
+3 0.095579406 1
+4 0.000400509 1
+4 0.000780511 10
+4 0.000384998 59
+3 1.879097413 1
+4 0.000405332 36
+7 0.000520590 TSTP
+7 119.826827916 CONT
+4 0.000775849 7
+4 0.000260731 821
+3 4.375067531 1
+4 0.000381934 10
+3 0.279467306 1
+4 0.000361364 1
+3 0.207587374 1
+4 0.000343894 1
+3 0.167709587 1
+4 0.000368746 1
+3 0.215741233 1
+4 0.000337767 1
+3 0.223551818 1
+4 0.000538641 264
+3 2.239531984 1
+4 0.000353768 9
+3 0.087861376 1
+4 0.000434604 172
+3 0.591198116 1
+4 0.000413197 87
+3 27.650282086 1
+4 0.000375320 15
+3 0.216036186 1
+4 0.000339618 15
+3 0.557577555 1
+4 0.000361545 17
+3 0.135514992 1
+4 0.000849186 16
+3 0.209302149 1
+4 0.000328994 16
+3 0.213714076 1
+4 0.000342101 17
+3 0.169517039 1
+4 0.000346635 17
+3 0.421847735 1
+4 0.000351468 17
+3 0.151544748 1
+3 0.080143076 1
+4 0.000351960 20
+3 0.263690201 1
+3 0.055774217 1
+4 0.000399576 5
+3 0.367654328 1
+4 0.000375681 6
+3 0.719657836 1
+4 0.000434688 16
+3 0.263521851 1
+4 0.000346499 23
+3 0.279746476 1
+4 0.000380054 18
+3 0.710073289 1
+4 0.110008539 32
+3 2.347598243 1
+4 0.000393924 10
+3 0.079685270 1
+4 0.000401395 1
+3 0.135456431 1
+4 0.000371437 1
+3 0.103691393 1
+4 0.000349437 1
+4 0.000385114 70
+3 0.239821236 1
+4 0.000335297 36
+7 0.000505632 TSTP
+7 1.230823148 CONT
+4 0.000675817 7
+4 0.000350616 7
+4 0.000294831 850
+3 23.808037641 1
+4 0.000483238 16
+3 0.200756075 1
+4 0.000342844 16
+3 0.165768291 1
+4 0.000389865 39
+3 0.161467370 1
+4 0.000407762 73
+3 0.317657050 1
+4 0.000374583 18
+3 0.185507615 1
+4 0.000350344 21
+3 1.685930882 1
+4 0.000430918 10
+3 0.199468221 1
+4 0.000349579 1
+3 0.143750021 1
+4 0.000326515 1
+3 0.119605560 1
+4 0.000326526 1
+3 0.119984250 1
+4 0.000409566 39
+3 0.615348721 1
+4 0.000597532 913
+3 1.681877265 1
+4 0.000578058 666
+3 1.213063033 1
+4 0.000566762 724
+3 0.953636042 1
+4 0.000630790 344
+3 0.957197011 1
+4 0.000371631 20
+4 0.000424486 669
+3 31.555179780 1
+4 0.000616650 744
+3 1.020593190 1
+4 0.000362479 10
+3 0.071589347 1
+4 0.000625290 674
+3 3.136312054 1
+4 0.000364258 62
+3 0.679052733 1
+4 0.000576460 579
+3 0.487292331 1
+4 0.000395222 55
+3 1.047614227 1
+4 0.000459645 19
+4 0.000402406 782
+3 0.689108023 1
+4 0.000509481 408
+3 0.709404492 1
+4 0.000578293 720
+3 1.201603521 1
+4 0.000570565 855
+3 0.661291698 1
+4 0.000581138 748
+3 3.121724722 1
+4 0.000605819 657
+3 0.933460490 1
+4 0.000563268 560
+3 0.655363138 1
+4 0.000617957 838
+3 0.895563613 1
+4 0.000555777 612
+3 0.471409918 1
+4 0.000558188 583
+3 0.503285278 1
+4 0.000412215 55
+4 0.000375934 748
+3 0.999404469 1
+4 0.000397323 10
+3 0.119496582 1
+4 0.000334729 1
+3 0.119657542 1
+4 0.000366361 1
+4 0.001255341 8
+4 0.000320612 23
diff --git a/lib/iolog/regress/corpus/seed/timing/timing.7 b/lib/iolog/regress/corpus/seed/timing/timing.7
new file mode 100644
index 0000000..320a868
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/timing/timing.7
@@ -0,0 +1,10 @@
+3 0.731998581 1
+4 0.001916416 2
+7 0.002850082 TSTP
+7 0.683456735 CONT
+3 0.688967687 1
+4 0.001667674 2
+7 0.002277631 TSTP
+7 0.515107145 CONT
+3 0.343713993 1
+4 0.002050968 2
diff --git a/lib/iolog/regress/corpus/seed/timing/timing.8 b/lib/iolog/regress/corpus/seed/timing/timing.8
new file mode 100644
index 0000000..5fabcc4
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/timing/timing.8
@@ -0,0 +1,891 @@
+4 0.064664132 32
+4 0.000859566 850
+3 1.028898872 1
+4 0.001747739 9
+3 0.926126566 1
+4 0.001425060 1
+3 0.198414833 1
+4 0.001499542 1
+3 0.134447257 1
+4 0.001506297 1
+3 0.118268537 1
+4 0.001541057 1
+3 0.086780988 1
+4 0.001622847 1
+3 0.062239852 1
+4 0.001588923 1
+3 0.214384951 1
+4 0.001460651 1
+3 0.086510579 1
+4 0.003193030 911
+3 1.981206350 1
+4 0.001460605 17
+3 0.342451860 1
+3 0.121863647 1
+4 0.001573592 30
+3 0.260718112 1
+4 0.104455308 53
+3 0.215829722 1
+4 0.001744179 18
+3 0.365827912 1
+4 0.001569107 23
+3 0.846427645 1
+4 0.001572957 19
+3 0.814749657 1
+4 0.001575922 19
+3 0.182163938 1
+4 0.001568547 19
+3 0.414578434 1
+4 0.001656973 19
+3 0.318272879 1
+4 0.001584842 19
+3 0.262367325 1
+4 0.001488336 19
+3 0.230410279 1
+4 0.109315456 37
+4 0.001609717 49
+3 0.353056895 1
+4 0.001788404 10
+3 0.094128417 1
+4 0.001531837 1
+3 0.142508934 1
+4 0.001593153 1
+3 0.126357885 1
+4 0.002388055 15
+4 0.001432636 58
+3 1.228902472 1
+4 0.002391036 40
+7 0.002743419 TSTP
+7 5025.564659632 CONT
+4 0.003192704 7
+4 0.001526602 997
+3 0.793028278 1
+4 0.003000277 40
+7 0.002235214 TSTP
+7 5925.171790777 CONT
+4 0.002096058 7
+4 0.001318204 7
+4 0.001159538 900
+3 0.984554657 1
+4 0.001469616 40
+7 0.002327650 TSTP
+7 6189.225069749 CONT
+4 0.002104678 7
+4 0.001037801 7
+4 0.001216318 900
+3 1.161146125 1
+4 0.001439585 16
+3 0.814606611 1
+4 0.001606528 21
+3 0.230277078 1
+4 0.001975296 53
+3 0.190021728 1
+3 0.096129999 1
+4 0.001594887 33
+3 0.182291714 1
+4 0.001773170 4
+3 0.326454021 1
+4 0.001484961 9
+3 0.366715902 1
+4 0.001543752 1
+3 0.446210491 1
+4 0.001689363 1
+3 0.006253433 1
+4 0.001433390 1
+3 0.064300445 1
+4 0.001604202 1
+3 0.340813942 1
+4 0.001517377 1
+3 0.160276062 1
+4 0.002970366 1
+3 0.058797601 1
+4 0.001392200 1
+3 0.127730195 1
+4 0.001667163 1
+3 0.094630017 1
+4 0.001782949 1
+4 0.001676588 70
+3 0.355976786 1
+4 0.001506307 39
+7 0.002105798 TSTP
+7 14.292867168 CONT
+4 0.002398126 7
+4 0.001008191 7
+4 0.001088992 984
+3 1.219079321 1
+4 0.001760534 21
+3 0.285906574 1
+4 0.001752349 60
+3 0.190367416 1
+4 0.105561951 31
+3 0.022256270 1
+4 0.001478141 15
+3 0.206781774 1
+4 0.001554002 4
+3 0.270277605 1
+4 0.001420215 9
+3 0.118523501 1
+4 0.001731089 1
+3 0.126173273 1
+4 0.001409300 1
+3 0.118763318 1
+4 0.001517062 1
+4 0.001639842 70
+3 0.293063491 1
+4 0.001358755 39
+7 0.002350591 TSTP
+7 88449.593270142 CONT
+4 0.002494607 7
+4 0.001958302 991
+3 0.825250499 1
+4 0.001436475 9
+3 0.438398078 1
+4 0.001697468 32
+3 1.350305447 1
+4 0.001477446 15
+3 0.168253265 1
+4 0.001493751 15
+3 0.180841618 1
+4 0.001722349 21
+3 0.182231663 1
+4 0.001695639 47
+3 0.230290135 1
+4 0.109360689 31
+3 0.178605949 1
+4 0.111499107 1
+3 0.144875484 1
+4 0.001417120 9
+3 0.150117516 1
+4 0.001488857 1
+3 0.110446391 1
+4 0.001616968 1
+3 0.110541552 1
+4 0.001419525 1
+4 0.001945622 10
+4 0.001402320 60
+3 6.452086794 1
+4 0.001500216 73
+3 0.405864230 1
+4 0.001626618 9
+3 0.134289323 1
+4 0.001338674 1
+3 0.142601704 1
+4 0.001527262 1
+3 0.102629985 1
+4 0.001900211 11
+4 0.001350750 60
+3 0.405180113 1
+4 0.001535457 39
+7 0.002495892 TSTP
+7 221561.264483987 CONT
+4 0.002009587 7
+4 0.001101567 7
+4 0.001442021 919
+4 0.001278489 65
+3 5.463826160 1
+4 0.001484976 15
+3 0.184226629 1
+4 0.001414341 15
+3 0.292783684 1
+3 0.153810375 1
+4 0.001446971 27
+3 0.268656044 1
+4 0.002896326 120
+3 0.285181477 1
+4 0.001661168 15
+3 0.150478007 1
+4 0.001453396 22
+3 0.230540344 1
+4 0.001440316 53
+3 0.166485119 1
+3 0.087962359 1
+4 0.001508426 33
+3 0.222749504 1
+4 0.001509546 18
+3 1.894427201 1
+4 0.001588127 26
+3 1.518514800 1
+4 0.001448627 18
+3 0.222417824 1
+4 0.001472537 24
+3 0.190411167 1
+4 0.001525827 19
+3 0.838594711 1
+3 0.031760695 1
+4 0.001551002 38
+3 0.870824301 1
+4 0.001489017 16
+3 1.014356232 1
+4 0.001701719 18
+3 0.822415083 1
+4 0.001494696 24
+3 0.222596147 1
+4 0.001432681 19
+3 0.310526270 1
+4 0.001596028 19
+3 0.126330981 1
+4 0.001500257 19
+3 0.174752799 1
+4 0.001638468 20
+3 0.253981113 1
+4 0.001461846 37
+3 0.254649605 1
+4 0.103883614 34
+3 0.200314766 1
+4 0.001387905 20
+3 0.406667304 1
+4 0.001731770 17
+3 0.110003286 1
+4 0.001520397 23
+3 0.230621930 1
+4 0.001493146 24
+3 0.446629930 1
+4 0.001496936 16
+3 0.254613349 1
+4 0.001397571 15
+3 0.166240486 1
+4 0.001700974 22
+3 0.190319056 1
+4 0.001517261 58
+3 0.254819347 1
+4 0.107582560 31
+3 0.292233944 1
+4 0.001445151 9
+3 0.110475422 1
+4 0.001698858 1
+3 0.094333824 1
+4 0.001586513 77
+3 0.326387580 1
+4 0.001661283 39
+7 0.002204689 TSTP
+7 0.556717292 CONT
+4 0.002623429 7
+4 0.001179768 1027
+3 0.267631453 1
+4 0.001424285 9
+3 0.110521878 1
+4 0.001441585 1
+3 0.127356593 1
+4 0.001510382 1
+3 0.077681400 1
+4 0.001539912 1
+4 0.001640563 70
+3 0.388998560 1
+4 0.001719929 39
+7 0.002200549 TSTP
+7 13.244385459 CONT
+4 0.000729218 7
+4 0.000294418 1005
+3 7.079466151 1
+4 0.001791190 45
+3 0.205970549 1
+4 0.001643508 17
+3 0.414571661 1
+4 0.001531132 16
+3 0.222850249 1
+4 0.001640468 17
+3 0.205982399 1
+4 0.001558167 17
+3 0.134087222 1
+4 0.001465226 17
+3 0.166847603 1
+4 0.001662358 17
+3 0.126370137 1
+4 0.001446416 17
+3 0.550630445 1
+4 0.001435360 16
+3 0.334496380 1
+4 0.001602892 19
+3 1.686172041 1
+4 0.000346437 17
+3 0.151576266 1
+4 0.000349729 16
+3 0.319957850 1
+4 0.001433906 17
+3 0.166454049 1
+4 0.001689503 17
+3 0.062391632 1
+4 0.001573468 17
+3 0.150461777 1
+4 0.001457996 16
+3 0.070532447 1
+4 0.001422680 17
+3 0.086873802 1
+4 0.001815970 16
+3 0.189849021 1
+4 0.001595918 19
+3 0.126580914 1
+4 0.001572067 18
+3 0.102119195 1
+4 0.001489716 18
+3 0.110616169 1
+4 0.001610073 18
+3 0.142382103 1
+4 0.001462456 18
+3 0.062502293 1
+4 0.001701379 17
+3 0.214412562 1
+4 0.001462741 18
+3 1.198409314 1
+4 0.000460850 17
+3 0.999678958 1
+4 0.000331997 17
+3 0.127804986 1
+4 0.000303396 18
+3 0.151363097 1
+4 0.000316266 18
+3 0.112134826 1
+4 0.001454656 18
+3 0.150624064 1
+4 0.001407951 37
+3 0.222441090 1
+4 0.111006972 33
+3 0.281208333 1
+4 0.001415495 17
+3 0.150437782 1
+3 0.063714477 1
+4 0.001565847 27
+3 0.214617624 1
+4 0.001526422 18
+3 0.062489458 1
+4 0.001570842 18
+3 0.166474689 1
+4 0.001500832 18
+3 0.030451545 1
+4 0.001512782 20
+3 0.222611776 1
+4 0.001628519 19
+3 0.030120866 1
+4 0.001466336 19
+3 0.030404355 1
+4 0.001619698 19
+3 0.334815583 1
+4 0.108865834 33
+3 0.187010010 1
+4 0.001488371 17
+3 0.126381232 1
+4 0.001505957 14
+3 0.126545303 1
+3 0.112060040 1
+4 0.001389665 9
+3 0.422737541 1
+4 0.001438741 1
+3 0.286661427 1
+4 0.001490682 1
+3 0.152535520 1
+4 0.001536577 36
+3 0.324257351 1
+4 0.001444521 9
+3 0.142471479 1
+4 0.001356360 1
+3 0.158776959 1
+4 0.001371060 1
+3 0.094594897 1
+4 0.001367810 33
+4 0.001464076 23
+3 0.549135158 1
+4 0.001431856 9
+3 0.126501453 1
+4 0.001472637 1
+3 0.126547613 1
+4 0.001491527 1
+3 0.078728327 1
+4 0.001626128 11
+4 0.001487806 59
+3 0.340831284 1
+4 0.001617373 39
+7 0.002583839 TSTP
+7 514445.097903843 CONT
+4 0.002257030 7
+4 0.002294835 1007
+3 0.945625170 1
+4 0.002777691 39
+7 0.002355126 TSTP
+7 86184.341362582 CONT
+4 0.002221120 7
+4 0.001443996 7
+4 0.001283714 914
+3 2.392062045 1
+4 0.002652904 12
+4 0.001409386 27
+7 0.002425876 TSTP
+7 21288.589641005 CONT
+4 0.002742450 7
+4 0.001324494 7
+4 0.002229915 914
+3 1.223042554 1
+4 0.001448160 39
+7 0.002279495 TSTP
+7 2137.685708492 CONT
+4 0.004071430 7
+4 0.001616922 7
+4 0.001927357 914
+3 0.830124110 1
+4 0.001490492 39
+7 0.003177815 TSTP
+7 17415.985595701 CONT
+4 0.002433577 7
+4 0.000994215 7
+4 0.001078497 914
+3 1.240972872 1
+4 0.001393460 39
+7 0.002303475 TSTP
+7 601.486631680 CONT
+4 0.002426206 7
+4 0.001210918 7
+4 0.001102268 914
+3 0.857339012 1
+4 0.001674773 39
+7 0.002435617 TSTP
+7 391818.529264947 CONT
+4 0.000657391 7
+4 0.000218089 7
+4 0.000220770 914
+3 0.357849108 1
+4 0.001405050 9
+3 0.166742233 1
+4 0.001567897 1
+3 0.438304127 1
+4 0.001349665 1
+3 0.168918821 1
+4 0.001550563 32
+3 0.308645085 1
+4 0.001736869 39
+7 0.002554823 TSTP
+7 303016.218109119 CONT
+4 0.002752175 7
+4 0.001469450 7
+4 0.001455036 914
+3 0.887365475 1
+4 0.001395045 39
+7 0.002446251 TSTP
+7 215139.725383626 CONT
+4 0.002051468 7
+4 0.001705964 7
+4 0.001550202 914
+3 2.231928411 1
+4 0.001527117 15
+3 0.498266348 1
+4 0.001486902 15
+3 0.082105873 1
+4 0.001468756 15
+3 0.081830336 1
+4 0.001803544 15
+3 0.081630069 1
+4 0.001465996 15
+3 0.082089163 1
+4 0.001416686 15
+3 0.081225139 1
+4 0.001559182 15
+3 0.081618058 1
+4 0.001515897 15
+3 0.358906691 1
+4 0.001396906 14
+3 0.470357374 1
+4 0.001615638 20
+3 0.590548039 1
+4 0.001531272 52
+3 0.318289227 1
+4 0.106849942 30
+3 0.589134119 1
+4 0.001647973 13
+3 0.238312812 1
+4 0.001495872 14
+3 0.254615192 1
+3 0.680285637 1
+4 0.001795360 57
+3 0.013906154 1
+3 0.616146242 1
+3 0.409887356 1
+4 0.001467901 76
+3 0.516728247 1
+4 0.001690474 38
+3 0.382235119 1
+4 0.001520617 8
+3 0.142389056 1
+4 0.001473906 1
+3 0.142420386 1
+4 0.001444666 1
+3 0.174696653 1
+4 0.001473371 1
+4 0.001439716 69
+3 19.886035460 1
+4 0.001387176 8
+3 0.198563762 1
+4 0.001444846 1
+3 0.150104471 1
+4 0.001389040 1
+3 0.070689737 1
+4 0.001632588 1
+3 0.222393421 1
+4 0.001440621 1
+3 0.238663600 1
+4 0.001475092 1
+3 0.062492711 1
+4 0.001421216 1
+3 0.182816888 1
+4 0.002090833 97
+3 1.334082056 1
+4 0.001590818 13
+3 0.305939475 1
+4 0.001700324 67
+3 0.235779724 1
+4 0.001464116 19
+4 0.001492152 35
+3 0.964004231 1
+4 0.001741719 50
+3 0.278959707 1
+4 0.001432251 21
+3 0.182114085 1
+4 0.001620368 47
+3 0.350179179 1
+4 0.107922284 31
+3 0.131951961 1
+4 0.001523742 9
+3 0.094135896 1
+4 0.001403400 1
+3 0.142636459 1
+4 0.001577172 1
+3 0.094638578 1
+4 0.001459331 1
+4 0.001541516 70
+3 96.145045437 1
+4 0.001549497 73
+3 0.341566794 1
+4 0.001548772 24
+3 0.498636188 1
+4 0.001599858 36
+3 0.081953121 1
+4 0.001685429 80
+3 0.081549192 1
+4 0.001707554 73
+3 0.081462547 1
+4 0.001545412 29
+3 0.081530717 1
+4 0.001500116 28
+3 0.082355147 1
+4 0.001531262 66
+3 0.081767874 1
+4 0.001744160 38
+3 0.789979541 1
+4 0.001606227 4
+3 0.358523227 1
+4 0.001604633 82
+3 0.272270038 1
+4 0.001443841 34
+3 0.332620240 1
+4 0.001770160 29
+3 0.624231837 1
+4 0.001632883 64
+3 1.652451899 1
+4 0.001654788 70
+3 0.734505012 1
+4 0.001562342 93
+3 1.880416967 1
+4 0.001634748 95
+3 0.428543082 1
+4 0.001622603 82
+3 0.984350791 1
+4 0.001579713 61
+3 2.260460546 1
+4 0.001487417 4
+3 1.174634347 1
+4 0.109238624 1
+3 0.122995541 1
+4 0.001469521 9
+3 0.205892618 1
+4 0.001436966 1
+3 0.190721400 1
+4 0.001453656 1
+3 0.230410960 1
+4 0.001382565 1
+4 0.001685329 10
+4 0.001422790 60
+3 497.229682755 1
+4 0.001702369 64
+3 0.373140824 1
+4 0.001650363 53
+3 0.222094912 1
+4 0.108091981 31
+3 0.020290645 1
+4 0.002822676 16
+3 0.429852456 1
+4 0.001597523 4
+3 0.309925354 1
+4 0.004018280 9
+3 0.107818588 1
+4 0.002077103 1
+3 0.157934667 1
+4 0.001607838 1
+3 0.142065202 1
+4 0.001527667 1
+4 0.001288279 70
+3 3.669505533 1
+4 0.001787579 112
+3 0.333964666 1
+4 0.001474371 16
+3 0.350737976 1
+4 0.001566112 4
+3 0.390887715 1
+4 0.002744260 9
+3 0.140604781 1
+4 0.001397456 1
+3 0.142504391 1
+4 0.001401601 1
+3 0.134659340 1
+4 0.001721459 11
+4 0.001419231 60
+3 26.822251418 1
+4 0.001519201 39
+7 0.002500413 TSTP
+7 525.340953853 CONT
+4 0.002230704 7
+4 0.001091722 7
+4 0.001688199 989
+3 11.498496123 1
+4 0.001568418 21
+3 0.270488068 1
+4 0.001494706 53
+3 0.181928393 1
+4 0.108733447 31
+3 0.011220234 1
+4 0.000300299 16
+3 0.186000031 1
+4 0.000368706 15
+3 0.165946487 1
+4 0.001458631 15
+3 0.206296603 1
+4 0.001388705 4
+3 0.398763618 1
+4 0.001733419 9
+3 0.134039163 1
+4 0.001352560 1
+3 0.150563986 1
+4 0.001774664 1
+3 0.118604493 1
+4 0.001889116 1
+4 0.001338740 10
+4 0.001224763 60
+3 39.317057656 1
+4 0.001529292 114
+3 0.526420139 1
+4 0.001762420 24
+3 1.453889027 1
+4 0.001660013 9
+3 0.142498857 1
+4 0.001503141 1
+3 0.158253476 1
+4 0.001575483 1
+3 0.126616056 1
+4 0.001599948 11
+4 0.001609493 60
+3 18.669558170 1
+4 0.001706343 39
+7 0.002530179 TSTP
+7 899.138795805 CONT
+4 0.002583274 7
+4 0.001100897 996
+3 22.924250602 1
+4 0.001534347 39
+7 0.002390422 TSTP
+7 33.389385737 CONT
+4 0.002581218 7
+4 0.001103253 909
+3 1.300181276 1
+4 0.001546257 21
+3 0.222059492 1
+4 0.001546522 53
+3 0.238415013 1
+4 0.109184843 31
+3 0.379042919 1
+4 0.001510807 16
+3 0.728577452 1
+4 0.001415450 15
+3 0.348526297 1
+4 0.001532597 15
+3 0.238429373 1
+4 0.001420890 4
+3 0.494674934 1
+4 0.001382005 9
+3 0.142381471 1
+4 0.001641738 1
+3 0.158314351 1
+4 0.001517022 1
+3 0.110660725 1
+4 0.001756579 11
+4 0.001475116 60
+3 4.469140151 1
+4 0.001770309 114
+3 1.342163731 1
+4 0.001480936 15
+3 0.120459473 1
+4 0.001589178 15
+3 0.356430164 1
+4 0.001456581 4
+3 0.334376125 1
+4 0.001466151 9
+3 0.126632301 1
+4 0.001454071 1
+3 0.126422069 1
+4 0.001605663 1
+3 0.150550710 1
+4 0.001745935 11
+4 0.001392925 60
+3 4.325068886 1
+4 0.001720604 39
+7 0.002486903 TSTP
+7 891.514393588 CONT
+4 0.002117423 7
+4 0.001018707 7
+4 0.001061871 989
+3 0.962925345 1
+4 0.001912621 39
+7 0.002395502 TSTP
+7 223.988309212 CONT
+4 0.004026484 7
+4 0.003277921 909
+3 0.824140274 1
+4 0.001467277 39
+7 0.002166324 TSTP
+7 165.969859204 CONT
+4 0.002685960 7
+4 0.001102062 909
+3 1.204357411 1
+4 0.001592647 39
+7 0.002600499 TSTP
+7 365.952349812 CONT
+4 0.002136278 7
+4 0.001015612 7
+4 0.001090512 902
+3 2.587193742 1
+4 0.001677088 21
+3 0.238212841 1
+4 0.001453711 58
+3 0.182738187 1
+4 0.103895514 31
+3 0.015860486 1
+4 0.001442766 16
+3 0.175100452 1
+4 0.001623353 4
+3 0.317922373 1
+4 0.001434376 9
+3 0.118643218 1
+4 0.001451876 1
+3 0.143568628 1
+4 0.001493967 1
+3 0.133445736 1
+4 0.001666329 11
+4 0.001563117 60
+3 10.886975712 1
+4 0.001788550 107
+3 1.028357489 1
+4 0.001568272 16
+3 0.222512547 1
+4 0.001624668 4
+3 0.422244017 1
+4 0.001640078 9
+3 0.118441936 1
+4 0.001454661 1
+3 0.190559708 1
+4 0.001502192 1
+3 0.063679725 1
+4 0.001555767 1
+4 0.001457386 70
+3 1.371874710 1
+4 0.001718184 39
+7 0.002116473 TSTP
+7 1576.050026568 CONT
+4 0.002127468 7
+4 0.001049282 7
+4 0.001639418 924
+4 0.001391265 65
+3 1.523879474 1
+4 0.001548957 21
+3 0.250838772 1
+4 0.001700133 58
+3 0.230340197 1
+4 0.104563743 31
+3 0.239123573 1
+4 0.001496932 15
+3 0.729816646 1
+4 0.001550162 15
+3 1.187192299 1
+4 0.001481971 9
+3 0.110402577 1
+4 0.001412975 1
+3 0.158515493 1
+4 0.001436916 1
+3 0.094598474 1
+4 0.001499411 1
+4 0.001518196 70
+3 9.365579810 1
+4 0.001831315 77
+3 1.182085879 1
+4 0.001472681 43
+3 0.390399757 1
+4 0.001662683 15
+3 0.184476161 1
+4 0.001397095 15
+3 0.348555334 1
+4 0.001499592 4
+3 0.270318004 1
+4 0.001536837 9
+3 0.150522705 1
+4 0.001440726 1
+3 0.150446974 1
+4 0.001533892 1
+3 0.102548415 1
+4 0.001787650 11
+4 0.001647433 60
+3 2.916930093 1
+4 0.001625608 114
+3 0.214224046 1
+4 0.001634898 15
+3 0.184268399 1
+4 0.001487721 15
+3 0.564812318 1
+4 0.001470741 4
+3 0.342338326 1
+4 0.001475527 9
+3 0.102308113 1
+4 0.001503831 1
+3 0.142560303 1
+4 0.001449421 1
+3 0.086868864 1
+4 0.001684149 11
+4 0.001568817 60
+3 2.300776175 1
+4 0.001568797 65
+3 0.182344003 1
+4 0.001525456 19
+3 0.270439101 1
+4 0.001373955 9
+3 0.126832641 1
+4 0.001451926 1
+3 0.126404321 1
+4 0.001414901 1
+3 0.102456485 1
+4 0.001882240 11
+4 0.001455061 60
+3 2.589161412 1
+4 0.001532046 107
+3 0.310199760 1
+4 0.001553737 9
+3 0.102485115 1
+4 0.001450441 1
+3 0.142337871 1
+4 0.001438495 1
+3 0.102649342 1
+4 0.001621893 11
+4 0.001480321 60
+3 1.557961175 1
+4 0.000416039 39
+7 0.000477545 TSTP
+7 8128.685130733 CONT
+4 0.002319896 7
+4 0.001163737 996
+3 0.290820915 1
+4 0.000331067 9
+3 0.616107098 1
+4 0.001559643 32
+3 0.238160217 1
diff --git a/lib/iolog/regress/corpus/seed/timing/timing.9 b/lib/iolog/regress/corpus/seed/timing/timing.9
new file mode 100644
index 0000000..2d566ba
--- /dev/null
+++ b/lib/iolog/regress/corpus/seed/timing/timing.9
@@ -0,0 +1,416 @@
+4 0.026820058 32
+4 0.001711422 762
+4 0.000339736 53
+3 0.905773982 1
+4 0.000700765 860
+3 0.407034180 1
+4 0.001790364 9
+3 0.510563157 1
+4 0.002274839 29
+3 0.269760922 1
+4 0.002799020 895
+3 0.261256015 1
+4 0.001780719 8
+3 0.285937300 1
+4 0.002033227 1
+3 0.062079447 1
+4 0.001816029 1
+3 0.198257089 1
+4 0.001487481 1
+3 0.128223837 1
+4 0.001924376 1
+3 0.108202451 1
+4 0.002071588 1
+3 0.069737343 1
+4 0.001511027 1
+3 0.174650250 1
+4 0.001780474 1
+3 0.062641443 1
+4 0.002176683 40
+3 0.877270244 1
+4 0.000430823 16
+3 0.289936925 1
+4 0.002316440 15
+3 0.363768246 1
+4 0.001806569 15
+3 0.320027982 1
+4 0.002890541 232
+3 8.683563015 1
+4 0.000607468 172
+3 0.735169546 1
+4 0.000381425 40
+7 0.000714068 TSTP
+7 4.679016635 CONT
+4 0.001236107 7
+4 0.000355486 868
+3 0.486326156 1
+4 0.000368280 16
+3 0.500332044 1
+4 0.001645467 19
+3 0.081610572 1
+4 0.002250109 18
+3 0.081911959 1
+4 0.001516567 17
+3 0.082431635 1
+4 0.001610247 18
+3 0.082161797 1
+4 0.003386766 17
+3 0.080508120 1
+4 0.001542922 18
+3 0.082616917 1
+4 0.001645122 16
+3 0.081939075 1
+4 0.001501656 16
+3 0.511385566 1
+4 0.002390561 15
+3 0.245498856 1
+4 0.001952776 21
+3 0.223035995 1
+4 0.003835676 55
+3 0.186797228 1
+3 0.047844172 1
+4 0.000732686 37
+4 0.000319482 45
+3 0.143148267 1
+4 0.000323210 22
+4 0.000313341 53
+3 0.167541047 1
+4 0.001531157 15
+3 0.126430707 1
+4 0.001452986 73
+3 0.142488895 1
+4 0.001809904 15
+3 0.158496117 1
+4 0.001794434 70
+3 0.206419877 1
+4 0.002088947 16
+3 0.143391926 1
+4 0.000370251 15
+3 0.141381098 1
+4 0.000358046 15
+3 0.191688547 1
+4 0.000427144 46
+3 0.208167967 1
+4 0.102311817 22
+3 0.089357005 1
+4 0.000398479 9
+3 0.127420516 1
+4 0.000380604 1
+3 0.143659945 1
+4 0.000327122 1
+3 0.096070029 1
+4 0.002590102 1
+4 0.002764385 70
+3 0.506400385 1
+4 0.000377794 39
+7 0.000611796 TSTP
+7 2.327330424 CONT
+4 0.000495748 7
+4 0.000441282 7
+4 0.000373026 881
+3 0.735006268 1
+4 0.001573642 9
+3 0.342034557 1
+4 0.000484931 1
+3 0.103713531 1
+4 0.000637123 1
+3 0.183071121 1
+4 0.000357114 1
+3 0.119472186 1
+4 0.000380389 1
+3 0.207816458 1
+4 0.000336918 1
+3 0.079764969 1
+4 0.000396629 1
+3 0.063696314 1
+4 0.001863508 1
+3 0.270414990 1
+4 0.003903627 1
+3 0.276201466 1
+4 0.002198988 1
+3 0.149500975 1
+4 0.001513607 1
+3 0.215266651 1
+4 0.002604633 13
+4 0.002562303 871
+3 0.738702176 1
+4 0.002825906 1002
+3 2.005235450 1
+4 0.004513134 16
+3 0.523238388 1
+4 0.001690173 21
+3 0.293580307 1
+4 0.000509384 59
+3 0.279677930 1
+4 0.106364722 31
+3 0.661572887 1
+4 0.000362005 9
+3 0.127723461 1
+4 0.000433533 1
+3 0.143495220 1
+4 0.000559143 1
+3 0.095541842 1
+4 0.000617635 1
+4 0.000341242 55
+4 0.000258160 15
+3 0.302985707 1
+4 0.000369362 69
+3 0.353548453 1
+4 0.000657140 1249
+3 0.934092779 1
+4 0.002462327 53
+4 0.002104332 869
+3 0.634609718 1
+4 0.000441319 40
+7 0.000443732 TSTP
+7 1.744019170 CONT
+4 0.001795958 7
+4 0.000416107 7
+4 0.000539438 866
+4 0.000421610 53
+3 0.588160440 1
+4 0.001847652 773
+3 0.382350930 1
+4 0.002998357 995
+3 0.212912612 1
+4 0.001679020 988
+3 0.454277400 1
+4 0.000594016 763
+3 0.608608241 1
+4 0.003235459 255
+3 0.619577351 1
+4 0.000444752 12
+3 0.576479814 1
+4 0.003941878 9
+3 0.267043488 1
+4 0.000498001 1
+3 0.143318045 1
+4 0.000893037 1
+3 0.191448484 1
+4 0.000462690 1
+3 0.071606137 1
+4 0.000681691 1
+3 1.055203591 1
+4 0.000340939 1
+3 0.151234915 1
+4 0.000386658 1
+3 0.231980036 1
+4 0.000384274 1
+3 0.224097550 1
+4 0.002980857 1
+3 0.316956963 1
+4 0.002499527 41
+3 0.765698516 1
+4 0.004091634 814
+3 0.811449495 1
+4 0.000770341 56
+3 0.487224212 1
+4 0.000351782 15
+3 4.072509089 1
+3 0.129548871 1
+4 0.002049532 27
+3 0.212133148 1
+4 0.001864670 127
+3 0.293976096 1
+3 0.079927799 1
+4 0.001776949 13
+3 0.456159524 1
+4 0.000484628 16
+3 0.181365177 1
+4 0.000330693 17
+3 0.241967560 1
+4 0.003597134 16
+3 0.242152690 1
+4 0.001952176 17
+3 0.477814310 1
+4 0.000393908 19
+3 1.279717661 1
+4 0.000354247 10
+3 0.161660774 1
+4 0.001684608 1
+3 0.116305564 1
+4 0.000545227 1
+3 0.111377593 1
+4 0.000357819 1
+3 0.121894944 1
+4 0.000372917 1
+3 0.133460281 1
+4 0.000348850 1
+3 0.136188546 1
+4 0.003970087 951
+3 0.563603446 1
+4 0.000905922 1231
+3 0.505214773 1
+4 0.000614466 885
+3 0.693135780 1
+4 0.000384251 10
+3 0.071878551 1
+4 0.000600843 1209
+3 5.919638901 1
+4 0.000618364 947
+3 1.023329385 1
+4 0.000765748 975
+3 0.170239029 1
+4 0.004114269 20
+3 0.944977220 1
+4 0.000813752 923
+3 0.591209323 1
+4 0.000642505 1013
+3 0.855854140 1
+4 0.002983512 910
+3 0.468501621 1
+4 0.001040724 747
+3 0.630997945 1
+4 0.000557718 627
+3 0.568268097 1
+4 0.002969451 604
+3 0.372751868 1
+4 0.003244305 597
+3 1.748017891 1
+4 0.000318899 9
+3 0.112209702 1
+4 0.001585602 1
+3 0.126237191 1
+4 0.001430490 55
+4 0.002520732 19
+3 0.332580571 1
+4 0.003443457 1341
+3 0.555906216 1
+4 0.000345676 9
+3 0.127700075 1
+4 0.000364774 1
+3 0.191792996 1
+4 0.001614682 1
+3 0.430688655 1
+4 0.002797525 1
+4 0.002209299 67
+3 0.578767196 1
+4 0.000721267 664
+3 2.103369630 1
+4 0.000778525 1285
+3 2.487079900 1
+4 0.000722413 1131
+3 1.743405354 1
+4 0.000701480 876
+3 1.551102701 1
+4 0.000365233 15
+3 0.186125212 1
+4 0.002986112 15
+3 0.346545258 1
+3 0.121964530 1
+4 0.000408994 27
+3 0.285901647 1
+4 0.000553920 102
+3 0.287259743 1
+4 0.000348243 15
+3 0.223770096 1
+4 0.000406451 22
+3 0.240395190 1
+4 0.004131039 37
+3 0.203426649 1
+4 0.111240280 31
+3 0.016527422 1
+4 0.001560067 15
+3 0.958779715 1
+4 0.001824469 4
+3 0.014727259 1
+3 0.447093611 1
+3 0.320953147 1
+3 0.070854407 1
+4 0.000362686 27
+3 0.248016393 1
+4 0.001856075 17
+3 0.181888557 1
+4 0.000362541 16
+3 0.095577241 1
+4 0.000446013 16
+3 0.143582924 1
+4 0.000641692 16
+3 0.087370271 1
+4 0.000410273 16
+3 0.255775198 1
+4 0.000349423 30
+3 0.159417098 1
+4 0.101629346 31
+3 0.106812822 1
+4 0.001794174 10
+3 0.150640833 1
+4 0.001973111 1
+3 0.229540234 1
+4 0.002537393 1
+3 0.189596890 1
+4 0.001555707 1
+3 0.166481893 1
+4 0.001832689 1
+3 0.086653686 1
+4 0.002660778 1
+3 0.196235441 1
+4 0.000767079 42
+3 0.319661955 1
+4 0.000409364 29
+4 0.000770391 950
+3 1.230617822 1
+4 0.000497367 10
+3 0.071849269 1
+4 0.001265887 18
+4 0.001255668 849
+3 0.309179080 1
+4 0.001531469 9
+3 0.230462157 1
+4 0.001149025 1
+3 0.158773274 1
+4 0.000864557 1
+3 0.087581903 1
+4 0.002618648 71
+3 0.325070173 1
+4 0.000861044 39
+7 0.001361477 TSTP
+7 2.677917273 CONT
+4 0.001090445 7
+4 0.000695543 914
+3 1.566157098 1
+3 0.130276992 1
+4 0.003990123 27
+3 0.201715122 1
+4 0.000382345 105
+3 0.239728138 1
+4 0.000703854 15
+3 0.183585413 1
+4 0.001608753 22
+3 0.198057579 1
+4 0.000422730 37
+3 0.167314657 1
+4 0.101159452 31
+3 0.043125007 1
+4 0.000340134 16
+3 0.167883234 1
+3 0.056208548 1
+4 0.001792780 28
+3 0.317497649 1
+4 0.000387046 17
+3 0.103776317 1
+4 0.000373976 17
+3 0.135697848 1
+4 0.000467905 17
+3 0.135580381 1
+4 0.000480750 17
+3 0.031618064 1
+4 0.000861943 17
+3 0.110813826 1
+4 0.000349600 17
+3 0.183789669 1
+4 0.000339386 31
+3 0.216650735 1
+4 0.112823566 32
+3 0.174864673 1
+4 0.003063388 10
+3 0.180669765 1
+4 0.001724638 1
+3 0.174368732 1
+4 0.002114123 1
+3 0.134554835 1
+4 0.002041362 1
+4 0.001560387 71
+3 0.980188224 1
+3 0.135913384 1
+4 0.002612273 41
diff --git a/lib/iolog/regress/fuzz/fuzz_iolog_json.c b/lib/iolog/regress/fuzz/fuzz_iolog_json.c
new file mode 100644
index 0000000..80f6c9f
--- /dev/null
+++ b/lib/iolog/regress/fuzz/fuzz_iolog_json.c
@@ -0,0 +1,123 @@
+/*
+ * Copyright (c) 2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#if defined(HAVE_STDINT_H)
+# include <stdint.h>
+#elif defined(HAVE_INTTYPES_H)
+# include <inttypes.h>
+#endif
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_eventlog.h"
+#include "sudo_fatal.h"
+#include "sudo_iolog.h"
+#include "sudo_plugin.h"
+#include "sudo_util.h"
+
+#include "iolog_json.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+
+static FILE *
+open_data(const uint8_t *data, size_t size)
+{
+#ifdef HAVE_FMEMOPEN
+ /* Operate in-memory. */
+ return fmemopen((void *)data, size, "r");
+#else
+ char tempfile[] = "/tmp/json.XXXXXX";
+ size_t nwritten;
+ int fd;
+
+ /* Use (unlinked) temporary file. */
+ fd = mkstemp(tempfile);
+ if (fd == -1)
+ return NULL;
+ unlink(tempfile);
+ nwritten = write(fd, data, size);
+ if (nwritten != size) {
+ close(fd);
+ return NULL;
+ }
+ lseek(fd, 0, SEEK_SET);
+ return fdopen(fd, "r");
+#endif
+}
+
+static int
+fuzz_conversation(int num_msgs, const struct sudo_conv_message msgs[],
+ struct sudo_conv_reply replies[], struct sudo_conv_callback *callback)
+{
+ int n;
+
+ for (n = 0; n < num_msgs; n++) {
+ const struct sudo_conv_message *msg = &msgs[n];
+
+ switch (msg->msg_type & 0xff) {
+ case SUDO_CONV_PROMPT_ECHO_ON:
+ case SUDO_CONV_PROMPT_MASK:
+ case SUDO_CONV_PROMPT_ECHO_OFF:
+ /* input not supported */
+ return -1;
+ case SUDO_CONV_ERROR_MSG:
+ case SUDO_CONV_INFO_MSG:
+ /* no output for fuzzers */
+ break;
+ default:
+ return -1;
+ }
+ }
+ return 0;
+}
+
+int
+LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+ struct eventlog *evlog = NULL;
+ FILE *fp;
+
+ initprogname("fuzz_iolog_json");
+ if (getenv("SUDO_FUZZ_VERBOSE") == NULL)
+ sudo_warn_set_conversation(fuzz_conversation);
+
+ fp = open_data(data, size);
+ if (fp == NULL)
+ return 0;
+
+ /* Parsed contents of an log.json file are stored in evlog. */
+ evlog = calloc(1, sizeof(*evlog));
+ if (evlog != NULL) {
+ evlog->runuid = (uid_t)-1;
+ evlog->rungid = (gid_t)-1;
+ evlog->exit_value = -1;
+
+ /* Try to parse buffer as a JSON-format I/O log info file. */
+ iolog_parse_loginfo_json(fp, "fuzz.json", evlog);
+ eventlog_free(evlog);
+ }
+ fclose(fp);
+
+ fflush(stdout);
+
+ return 0;
+}
diff --git a/lib/iolog/regress/fuzz/fuzz_iolog_json.dict b/lib/iolog/regress/fuzz/fuzz_iolog_json.dict
new file mode 100644
index 0000000..2caf63d
--- /dev/null
+++ b/lib/iolog/regress/fuzz/fuzz_iolog_json.dict
@@ -0,0 +1,21 @@
+# I/O log JSON keywords
+"\"columns\""
+"\"command\""
+"\"dumped_core\""
+"\"exit_value\""
+"\"lines\""
+"\"run_time\""
+"\"runargv\""
+"\"runenv\""
+"\"rungid\""
+"\"rungroup\""
+"\"runuid\""
+"\"runuser\""
+"\"runchroot\""
+"\"runcwd\""
+"\"signal\""
+"\"submitcwd\""
+"\"submithost\""
+"\"submituser\""
+"\"timestamp\""
+"\"ttyname\"""
diff --git a/lib/iolog/regress/fuzz/fuzz_iolog_legacy.c b/lib/iolog/regress/fuzz/fuzz_iolog_legacy.c
new file mode 100644
index 0000000..207374c
--- /dev/null
+++ b/lib/iolog/regress/fuzz/fuzz_iolog_legacy.c
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <unistd.h>
+#if defined(HAVE_STDINT_H)
+# include <stdint.h>
+#elif defined(HAVE_INTTYPES_H)
+# include <inttypes.h>
+#endif
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_eventlog.h"
+#include "sudo_fatal.h"
+#include "sudo_iolog.h"
+#include "sudo_plugin.h"
+#include "sudo_util.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+
+static FILE *
+open_data(const uint8_t *data, size_t size)
+{
+#ifdef HAVE_FMEMOPEN
+ /* Operate in-memory. */
+ return fmemopen((void *)data, size, "r");
+#else
+ char tempfile[] = "/tmp/legacy.XXXXXX";
+ size_t nwritten;
+ int fd;
+
+ /* Use (unlinked) temporary file. */
+ fd = mkstemp(tempfile);
+ if (fd == -1)
+ return NULL;
+ unlink(tempfile);
+ nwritten = write(fd, data, size);
+ if (nwritten != size) {
+ close(fd);
+ return NULL;
+ }
+ lseek(fd, 0, SEEK_SET);
+ return fdopen(fd, "r");
+#endif
+}
+
+static int
+fuzz_conversation(int num_msgs, const struct sudo_conv_message msgs[],
+ struct sudo_conv_reply replies[], struct sudo_conv_callback *callback)
+{
+ int n;
+
+ for (n = 0; n < num_msgs; n++) {
+ const struct sudo_conv_message *msg = &msgs[n];
+
+ switch (msg->msg_type & 0xff) {
+ case SUDO_CONV_PROMPT_ECHO_ON:
+ case SUDO_CONV_PROMPT_MASK:
+ case SUDO_CONV_PROMPT_ECHO_OFF:
+ /* input not supported */
+ return -1;
+ case SUDO_CONV_ERROR_MSG:
+ case SUDO_CONV_INFO_MSG:
+ /* no output for fuzzers */
+ break;
+ default:
+ return -1;
+ }
+ }
+ return 0;
+}
+
+int
+LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+ struct eventlog *evlog = NULL;
+ FILE *fp;
+
+ initprogname("fuzz_iolog_legacy");
+ if (getenv("SUDO_FUZZ_VERBOSE") == NULL)
+ sudo_warn_set_conversation(fuzz_conversation);
+
+ fp = open_data(data, size);
+ if (fp == NULL)
+ return 0;
+
+ /* Parsed contents of an I/O log info file are stored in evlog. */
+ evlog = calloc(1, sizeof(*evlog));
+ if (evlog != NULL) {
+ evlog->runuid = (uid_t)-1;
+ evlog->rungid = (gid_t)-1;
+
+ /* Try to parse buffer as a legacy-format I/O log info file. */
+ iolog_parse_loginfo_legacy(fp, "fuzz.legacy", evlog);
+ eventlog_free(evlog);
+ }
+ fclose(fp);
+ fflush(stdout);
+
+ return 0;
+}
diff --git a/lib/iolog/regress/fuzz/fuzz_iolog_legacy.dict b/lib/iolog/regress/fuzz/fuzz_iolog_legacy.dict
new file mode 100644
index 0000000..d524d49
--- /dev/null
+++ b/lib/iolog/regress/fuzz/fuzz_iolog_legacy.dict
@@ -0,0 +1,42 @@
+# Legacy I/O log info file:
+# timestamp:submit_user:run_user:run_group:tty:lines:columns
+# working directory
+# command [args]
+
+# users and groups
+"millert"
+"root"
+"bin"
+"wheel"
+"operator"
+"testuser"
+"alice"
+"bob"
+"users"
+
+# terminals
+"/dev/console"
+"/dev/tty00"
+"/dev/tty01"
+"/dev/pts/0"
+"/dev/pts/1"
+"/dev/ttyp2"
+"/dev/ttyp3"
+
+# directories
+"/root"
+"/home/millert"
+"/home/alice"
+"/home/bob"
+"/tmp"
+"/usr/local"
+"/usr/src"
+
+# commands
+"/bin/ls"
+"/usr/bin/id -u"
+"/usr/bin/su -"
+"/usr/bin/mailq"
+"/usr/bin/make -C /usr/src/usr.bin/sort install"
+"/usr/bin/apt update"
+"/usr/bin/rpm -e sudo"
diff --git a/lib/iolog/regress/fuzz/fuzz_iolog_timing.c b/lib/iolog/regress/fuzz/fuzz_iolog_timing.c
new file mode 100644
index 0000000..dac9736
--- /dev/null
+++ b/lib/iolog/regress/fuzz/fuzz_iolog_timing.c
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2021 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <config.h>
+
+#include <sys/stat.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#if defined(HAVE_STDINT_H)
+# include <stdint.h>
+#elif defined(HAVE_INTTYPES_H)
+# include <inttypes.h>
+#endif
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif /* HAVE_STDBOOL_H */
+
+#include "sudo_compat.h"
+#include "sudo_debug.h"
+#include "sudo_eventlog.h"
+#include "sudo_fatal.h"
+#include "sudo_iolog.h"
+#include "sudo_plugin.h"
+#include "sudo_util.h"
+
+int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size);
+
+static int
+fuzz_conversation(int num_msgs, const struct sudo_conv_message msgs[],
+ struct sudo_conv_reply replies[], struct sudo_conv_callback *callback)
+{
+ int n;
+
+ for (n = 0; n < num_msgs; n++) {
+ const struct sudo_conv_message *msg = &msgs[n];
+
+ switch (msg->msg_type & 0xff) {
+ case SUDO_CONV_PROMPT_ECHO_ON:
+ case SUDO_CONV_PROMPT_MASK:
+ case SUDO_CONV_PROMPT_ECHO_OFF:
+ /* input not supported */
+ return -1;
+ case SUDO_CONV_ERROR_MSG:
+ case SUDO_CONV_INFO_MSG:
+ /* no output for fuzzers */
+ break;
+ default:
+ return -1;
+ }
+ }
+ return 0;
+}
+
+int
+LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+ struct iolog_file iolog_file = { true };
+ struct timing_closure closure;
+ char logdir[] = "/tmp/timing.XXXXXX";
+ int dfd = -1, fd = -1;
+
+ initprogname("fuzz_iolog_timing");
+ if (getenv("SUDO_FUZZ_VERBOSE") == NULL)
+ sudo_warn_set_conversation(fuzz_conversation);
+
+ /* I/O logs consist of multiple files in a directory. */
+ if (mkdtemp(logdir) == NULL)
+ return 0;
+
+ /* Create a timing file from the supplied data. */
+ dfd = open(logdir, O_RDONLY);
+ if (dfd == -1)
+ goto cleanup;
+
+ fd = openat(dfd, "timing", O_WRONLY|O_CREAT|O_EXCL, S_IRWXU);
+ if (fd == -1)
+ goto cleanup;
+
+ if (write(fd, data, size) != (ssize_t)size)
+ goto cleanup;
+ close(fd);
+ fd = -1;
+
+ /* Open the timing file we wrote and try to parse it. */
+ if (!iolog_open(&iolog_file, dfd, IOFD_TIMING, "r"))
+ goto cleanup;
+
+ memset(&closure, 0, sizeof(closure));
+ closure.decimal = ".";
+ for (;;) {
+ if (iolog_read_timing_record(&iolog_file, &closure) != 0)
+ break;
+ }
+ iolog_close(&iolog_file, NULL);
+
+cleanup:
+ if (dfd != -1) {
+ if (fd != -1)
+ close(fd);
+ unlinkat(dfd, "timing", 0);
+ close(dfd);
+ }
+ rmdir(logdir);
+ fflush(stdout);
+
+ return 0;
+}
+
+/* STUB */
+bool
+iolog_swapids(bool restore)
+{
+ return false;
+}
diff --git a/lib/iolog/regress/fuzz/fuzz_iolog_timing.dict b/lib/iolog/regress/fuzz/fuzz_iolog_timing.dict
new file mode 100644
index 0000000..42bdeb5
--- /dev/null
+++ b/lib/iolog/regress/fuzz/fuzz_iolog_timing.dict
@@ -0,0 +1,89 @@
+# I/O log timing lines are formatted as:
+# [0-4] sleep_time num_bytes
+# 5 sleep_time lines cols
+# 7 sleep_time signum|sigabbrev
+
+# Signal abbreviations
+"ABRT"
+"ALRM"
+"BUS"
+"CANCEL"
+"CHLD"
+"CLD"
+"CONT"
+"CONT"
+"EMT"
+"FPE"
+"FREEZE"
+"HUP"
+"ILL"
+"INFO"
+"INT"
+"IO"
+"IOT"
+"KILL"
+"LOST"
+"LWP"
+"PIPE"
+"POLL"
+"PROF"
+"PWR"
+"QUIT"
+"SEGV"
+"STKFLT"
+"STOP"
+"STOP"
+"SYS"
+"TERM"
+"THAW"
+"TRAP"
+"TSTP"
+"TSTP"
+"TTIN"
+"TTIN"
+"TTOU"
+"TTOU"
+"UNUSED"
+"URG"
+"USR1"
+"USR2"
+"VTALRM"
+"WAITING"
+"WINCH"
+"XCPU"
+"XFSZ"
+
+# Signal numbers, 0-32
+"0"
+"1"
+"2"
+"3"
+"4"
+"5"
+"6"
+"7"
+"8"
+"9"
+"10"
+"11"
+"12"
+"13"
+"14"
+"15"
+"16"
+"17"
+"18"
+"19"
+"20"
+"21"
+"22"
+"23"
+"24"
+"25"
+"26"
+"27"
+"28"
+"29"
+"30"
+"31"
+"32"
diff --git a/lib/iolog/regress/host_port/host_port_test.c b/lib/iolog/regress/host_port/host_port_test.c
new file mode 100644
index 0000000..9b504e1
--- /dev/null
+++ b/lib/iolog/regress/host_port/host_port_test.c
@@ -0,0 +1,145 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2019-2020 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_STDBOOL_H
+# include <stdbool.h>
+#else
+# include "compat/stdbool.h"
+#endif
+#include <time.h>
+#include <unistd.h>
+
+#include "sudo_compat.h"
+#include "sudo_fatal.h"
+#include "sudo_iolog.h"
+#include "sudo_util.h"
+
+sudo_dso_public int main(int argc, char *argv[]);
+
+/*
+ * Test that iolog_parse_host_port() works as expected.
+ */
+
+struct host_port_test {
+ const char *str; /* input string */
+ const char *host; /* parsed host */
+ const char *port; /* parsed port */
+ bool tls; /* parsed TLS flag */
+ const char *defport; /* default port */
+ const char *defport_tls; /* default port */
+ bool ret; /* return value */
+};
+
+static struct host_port_test test_data[] = {
+ /* No TLS */
+ { "xerxes", "xerxes", "12345", false, "12345", NULL, true },
+ { "xerxes:12345", "xerxes", "12345", false, "67890", NULL, true },
+ { "127.0.0.1", "127.0.0.1", "12345", false, "12345", NULL, true },
+ { "127.0.0.1:12345", "127.0.0.1", "12345", false, "67890", NULL, true },
+ { "[::1]", "::1", "12345", false, "12345", NULL, true },
+ { "[::1]:12345", "::1", "12345", false, "67890", NULL, true },
+
+ /* With TLS */
+ { "xerxes(tls)", "xerxes", "12345", true, "5678", "12345", true },
+ { "xerxes:12345(tls)", "xerxes", "12345", true, "5678", "67890", true },
+ { "127.0.0.1(tls)", "127.0.0.1", "12345", true, "5678", "12345", true },
+ { "127.0.0.1:12345(tls)", "127.0.0.1", "12345", true, "5678", "67890", true },
+ { "[::1](tls)", "::1", "12345", true, "5678", "12345", true },
+ { "[::1]:12345(tls)", "::1", "12345", true, "5678", "67890", true },
+
+ /* Errors */
+ { "xerxes:", NULL, NULL, false, "12345", NULL, false }, /* missing port */
+ { "127.0.0.1:", NULL, NULL, false, "12345", NULL, false }, /* missing port */
+ { "[::1:12345", NULL, NULL, false, "67890", NULL, false }, /* missing bracket */
+ { "[::1]:", NULL, NULL, false, "12345", NULL, false }, /* missing port */
+ { NULL }
+};
+
+int
+main(int argc, char *argv[])
+{
+ int i, errors = 0, ntests = 0;
+ char *host, *port, *copy = NULL;
+ bool ret, tls;
+
+ initprogname(argc > 0 ? argv[0] : "host_port_test");
+
+ for (i = 0; test_data[i].str != NULL; i++) {
+ host = port = NULL;
+ tls = false;
+ free(copy);
+ if ((copy = strdup(test_data[i].str)) == NULL)
+ sudo_fatal_nodebug(NULL);
+
+ ntests++;
+ ret = iolog_parse_host_port(copy, &host, &port, &tls,
+ test_data[i].defport, test_data[i].defport_tls);
+ if (ret != test_data[i].ret) {
+ sudo_warnx_nodebug("test #%d: %s: returned %s, expected %s",
+ ntests, test_data[i].str, ret ? "true" : "false",
+ test_data[i].ret ? "true" : "false");
+ errors++;
+ continue;
+ }
+ if (!ret)
+ continue;
+
+ if (host == NULL) {
+ sudo_warnx_nodebug("test #%d: %s: NULL host",
+ ntests, test_data[i].str);
+ errors++;
+ continue;
+ }
+ if (strcmp(host, test_data[i].host) != 0) {
+ sudo_warnx_nodebug("test #%d: %s: bad host, expected %s, got %s",
+ ntests, test_data[i].str, test_data[i].host, host);
+ errors++;
+ continue;
+ }
+ if (port == NULL) {
+ sudo_warnx_nodebug("test #%d: %s: NULL port",
+ ntests, test_data[i].str);
+ errors++;
+ continue;
+ }
+ if (strcmp(port, test_data[i].port) != 0) {
+ sudo_warnx_nodebug("test #%d: %s: bad port, expected %s, got %s",
+ ntests, test_data[i].str, test_data[i].port, port);
+ errors++;
+ continue;
+ }
+ if (tls != test_data[i].tls) {
+ sudo_warnx_nodebug("test #%d: %s: bad tls, expected %s, got %s",
+ ntests, test_data[i].str, test_data[i].tls ? "true" : "false",
+ tls ? "true" : "false");
+ errors++;
+ continue;
+ }
+ }
+ free(copy);
+ if (ntests != 0) {
+ printf("%s: %d tests run, %d errors, %d%% success rate\n",
+ getprogname(), ntests, errors, (ntests - errors) * 100 / ntests);
+ }
+ return errors;
+}
diff --git a/lib/iolog/regress/iolog_filter/check_iolog_filter.c b/lib/iolog/regress/iolog_filter/check_iolog_filter.c
new file mode 100644
index 0000000..d24f12f
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/check_iolog_filter.c
@@ -0,0 +1,203 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2022 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#define SUDO_ERROR_WRAP 0
+
+#include "sudo_compat.h"
+#include "sudo_util.h"
+#include "sudo_fatal.h"
+
+#include "sudo_iolog.h"
+
+sudo_dso_public int main(int argc, char *argv[]);
+
+int
+main(int argc, char *argv[])
+{
+ int dfd = -1, ttyin_fd = -1, ttyout_fd = -1, ttyin_ok_fd = -1;
+ int ch, i, ntests = 0, errors = 0;
+ void *passprompt_regex = NULL;
+
+ initprogname(argc > 0 ? argv[0] : "check_iolog_filter");
+
+ while ((ch = getopt(argc, argv, "v")) != -1) {
+ switch (ch) {
+ case 'v':
+ /* ignore */
+ break;
+ default:
+ fprintf(stderr, "usage: %s [-v] iolog_dir ...\n", getprogname());
+ return EXIT_FAILURE;
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ passprompt_regex = iolog_pwfilt_alloc();
+ if (passprompt_regex == NULL)
+ sudo_fatalx("unable to allocate memory");
+ if (!iolog_pwfilt_add(passprompt_regex, "(?i)password[: ]*"))
+ exit(1);
+
+ for (i = 0; i < argc; i++) {
+ struct iolog_file iolog_timing = { true };
+ struct timing_closure timing;
+ const char *logdir = argv[i];
+ char tbuf[8192], fbuf[8192];
+ ssize_t nread;
+
+ ntests++;
+
+ /* I/O logs consist of multiple files in a directory. */
+ dfd = open(logdir, O_RDONLY);
+ if (dfd == -1) {
+ sudo_warn("%s", logdir);
+ errors++;
+ continue;
+ }
+
+ if (!iolog_open(&iolog_timing, dfd, IOFD_TIMING, "r")) {
+ sudo_warn("timing");
+ errors++;
+ goto next;
+ }
+
+ ttyout_fd = openat(dfd, "ttyout", O_RDONLY, 0644);
+ if (ttyout_fd == -1) {
+ sudo_warn("ttyout");
+ errors++;
+ goto next;
+ }
+
+ ttyin_fd = openat(dfd, "ttyin", O_RDONLY, 0644);
+ if (ttyin_fd == -1) {
+ sudo_warn("ttyin");
+ errors++;
+ goto next;
+ }
+
+ ttyin_ok_fd = openat(dfd, "ttyin.filtered", O_RDONLY, 0644);
+ if (ttyin_ok_fd == -1) {
+ sudo_warn("ttyin.filtered");
+ errors++;
+ goto next;
+ }
+
+ memset(&timing, 0, sizeof(timing));
+ timing.decimal = ".";
+ for (;;) {
+ char *newbuf = NULL;
+ const char *name;
+ int fd;
+
+ if (iolog_read_timing_record(&iolog_timing, &timing) != 0)
+ break;
+
+ switch (timing.event) {
+ case IO_EVENT_TTYOUT:
+ fd = ttyout_fd;
+ name = "ttyout";
+ break;
+ case IO_EVENT_TTYIN:
+ fd = ttyin_fd;
+ name = "ttyin";
+ break;
+ default:
+ continue;
+ }
+
+ if (timing.u.nbytes > sizeof(tbuf)) {
+ sudo_warn("buffer too small, %zu > %zu", timing.u.nbytes,
+ sizeof(tbuf));
+ errors++;
+ continue;
+ }
+
+ nread = read(fd, tbuf, timing.u.nbytes);
+ if ((size_t)nread != timing.u.nbytes) {
+ if (nread == -1)
+ sudo_warn("%s/%s", argv[i], name);
+ else
+ sudo_warnx("%s/%s: short read", argv[i], name);
+ errors++;
+ continue;
+ }
+
+ /* Apply filter. */
+ if (!iolog_pwfilt_run(passprompt_regex, timing.event, tbuf,
+ timing.u.nbytes, &newbuf)) {
+ errors++;
+ continue;
+ }
+
+ if (timing.event == IO_EVENT_TTYIN) {
+ nread = read(ttyin_ok_fd, fbuf, timing.u.nbytes);
+ if (nread == -1) {
+ if (nread == -1)
+ sudo_warn("%s/ttyin.filtered", argv[i]);
+ else
+ sudo_warnx("%s/ttyin.filtered: short read", argv[i]);
+ errors++;
+ free(newbuf);
+ break;
+ }
+ if (memcmp(fbuf, newbuf ? newbuf : tbuf, timing.u.nbytes) != 0) {
+ sudo_warnx("%s: ttyin mismatch at byte %lld", argv[i],
+ (long long)lseek(fd, 0, SEEK_CUR));
+ errors++;
+ free(newbuf);
+ break;
+ }
+ }
+
+ free(newbuf);
+ }
+next:
+ if (ttyin_fd != -1) {
+ close(ttyin_fd);
+ ttyin_fd = -1;
+ }
+ if (ttyin_ok_fd != -1) {
+ close(ttyin_ok_fd);
+ ttyin_ok_fd = -1;
+ }
+ if (dfd != -1) {
+ close(dfd);
+ dfd = -1;
+ }
+ if (iolog_timing.enabled)
+ iolog_close(&iolog_timing, NULL);
+ }
+ iolog_pwfilt_free(passprompt_regex);
+
+ if (ntests != 0) {
+ printf("iolog_filter: %d test%s run, %d errors, %d%% success rate\n",
+ ntests, ntests == 1 ? "" : "s", errors,
+ (ntests - errors) * 100 / ntests);
+ }
+
+ return errors;
+}
diff --git a/lib/iolog/regress/iolog_filter/test1/log b/lib/iolog/regress/iolog_filter/test1/log
new file mode 100644
index 0000000..551adfb
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/test1/log
@@ -0,0 +1,3 @@
+1645151020:millert:root::/dev/ttypb:24:80
+/home/millert
+/usr/bin/passwd
diff --git a/lib/iolog/regress/iolog_filter/test1/timing b/lib/iolog/regress/iolog_filter/test1/timing
new file mode 100644
index 0000000..3a62388
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/test1/timing
@@ -0,0 +1,44 @@
+4 0.087089703 32
+4 0.000503221 13
+3 1.617732029 1
+3 0.671818399 1
+3 0.632182533 1
+3 0.135484597 1
+3 0.120171445 1
+3 0.120200768 1
+3 0.239782513 1
+3 0.064059449 1
+3 0.184048364 1
+3 0.135992479 1
+3 0.167905298 1
+3 0.087948033 1
+3 0.135913060 1
+3 0.136306311 1
+3 0.279830387 1
+3 0.280221744 1
+4 0.000453682 2
+4 0.001188404 20
+3 0.678534827 1
+3 1.912119627 1
+3 0.303804149 1
+3 0.071831900 1
+3 0.248608651 1
+3 0.088758738 1
+3 0.262821628 1
+3 0.111839737 1
+3 0.184326849 1
+3 0.119709565 1
+3 0.184446495 1
+3 0.089439595 1
+3 0.150353799 1
+3 0.152035883 1
+3 0.392237165 1
+3 0.183498720 1
+3 0.136099560 1
+3 0.256165394 1
+4 0.000392254 2
+4 0.000348360 35
+4 0.000330782 13
+3 0.871580665 1
+4 0.000434371 2
+4 0.001150945 23
diff --git a/lib/iolog/regress/iolog_filter/test1/ttyin b/lib/iolog/regress/iolog_filter/test1/ttyin
new file mode 100644
index 0000000..5a2067d
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/test1/ttyin
@@ -0,0 +1 @@
+A new password? A bad password...  \ No newline at end of file
diff --git a/lib/iolog/regress/iolog_filter/test1/ttyin.filtered b/lib/iolog/regress/iolog_filter/test1/ttyin.filtered
new file mode 100644
index 0000000..d4943b3
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/test1/ttyin.filtered
@@ -0,0 +1 @@
+*************** ***************** * \ No newline at end of file
diff --git a/lib/iolog/regress/iolog_filter/test1/ttyout b/lib/iolog/regress/iolog_filter/test1/ttyout
new file mode 100644
index 0000000..bac1f87
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/test1/ttyout
@@ -0,0 +1,7 @@
+Changing password for millert.
+New password:
+Retype new password:
+Mismatch; try again, EOF to quit.
+New password:
+
+Password unchanged.
diff --git a/lib/iolog/regress/iolog_filter/test2/log b/lib/iolog/regress/iolog_filter/test2/log
new file mode 100644
index 0000000..8790573
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/test2/log
@@ -0,0 +1,3 @@
+1645153850:millert:millert::/dev/ttypb:24:80
+/home/millert
+/usr/bin/su testdude
diff --git a/lib/iolog/regress/iolog_filter/test2/timing b/lib/iolog/regress/iolog_filter/test2/timing
new file mode 100644
index 0000000..7e6b1cc
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/test2/timing
@@ -0,0 +1,73 @@
+4 0.077895153 9
+3 9.876530326 1
+3 0.191980568 1
+3 0.168017746 1
+3 0.088081740 1
+3 0.183886638 1
+3 0.071966892 1
+3 0.175772878 1
+3 0.672270691 1
+4 0.000336085 2
+4 0.022264031 8
+3 4.721817713 1
+4 0.001379444 1
+3 0.086406844 1
+4 0.000383615 1
+3 0.055583229 1
+4 0.000353543 1
+3 0.079726966 1
+4 0.000336390 1
+3 0.063626746 1
+4 0.000719018 1
+3 0.135204338 1
+4 0.000342720 1
+3 0.095976209 1
+4 0.000338049 1
+3 0.047259669 1
+4 0.000339501 1
+3 0.399809817 1
+4 0.000345392 1
+3 0.111587761 1
+4 0.000366589 1
+3 0.087582640 1
+4 0.000328160 1
+3 0.480159500 1
+4 0.000370778 3
+3 0.143285883 1
+4 0.000332529 3
+3 0.135841236 1
+4 0.000343729 3
+3 0.223401313 1
+4 0.000329496 1
+3 0.063760060 1
+4 0.000382349 1
+3 0.087442363 1
+4 0.000345787 1
+3 0.095598655 1
+4 0.000343712 1
+3 0.560106197 1
+4 0.000405183 3
+3 0.151363786 1
+4 0.000345085 3
+3 0.167809002 1
+4 0.000326037 3
+3 0.135471962 1
+4 0.000378004 3
+3 0.111681517 1
+4 0.000329093 1
+3 0.127537491 1
+4 0.000355403 1
+3 0.103896235 1
+4 0.000320608 1
+3 0.095563437 1
+4 0.000327463 1
+3 0.087808248 1
+4 0.000321244 1
+3 0.503531970 1
+4 0.000338699 1
+3 1.383887942 1
+4 0.000324499 3
+4 0.000334583 11
+4 0.000324866 8
+3 0.999440679 1
+4 0.000365851 5
diff --git a/lib/iolog/regress/iolog_filter/test2/ttyin b/lib/iolog/regress/iolog_filter/test2/ttyin
new file mode 100644
index 0000000..29482c0
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/test2/ttyin
@@ -0,0 +1 @@
+test123 echo hi ereherethere!  \ No newline at end of file
diff --git a/lib/iolog/regress/iolog_filter/test2/ttyin.filtered b/lib/iolog/regress/iolog_filter/test2/ttyin.filtered
new file mode 100644
index 0000000..e3c303d
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/test2/ttyin.filtered
@@ -0,0 +1 @@
+******* echo hi ereherethere!  \ No newline at end of file
diff --git a/lib/iolog/regress/iolog_filter/test2/ttyout b/lib/iolog/regress/iolog_filter/test2/ttyout
new file mode 100644
index 0000000..dbb7124
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/test2/ttyout
@@ -0,0 +1,4 @@
+Password:
+xerxes$ echo hi ere   here    there!
+hi there!
+xerxes$ ^D
diff --git a/lib/iolog/regress/iolog_filter/test3/log b/lib/iolog/regress/iolog_filter/test3/log
new file mode 100644
index 0000000..f0500f4
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/test3/log
@@ -0,0 +1,3 @@
+1645201461:millert:root::/dev/ttyp0:24:80
+/home/millert
+/usr/bin/ssh -oPubkeyAuthentication=no localhost
diff --git a/lib/iolog/regress/iolog_filter/test3/timing b/lib/iolog/regress/iolog_filter/test3/timing
new file mode 100644
index 0000000..03b67f4
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/test3/timing
@@ -0,0 +1,54 @@
+4 0.158768144 1
+4 0.000406264 27
+3 4.390837642 1
+3 0.119705081 1
+3 0.175600726 1
+3 0.064357615 1
+3 0.239945395 1
+3 0.088142451 1
+3 0.143665762 1
+3 0.071941169 1
+3 0.208359675 1
+3 0.145706215 1
+3 0.302231926 1
+3 0.079805215 1
+3 0.112114024 1
+3 0.143802378 1
+3 0.160033289 1
+4 0.000416283 2
+4 0.042939142 40
+4 0.000399448 27
+3 1.084753026 1
+3 0.087720859 1
+3 0.215896027 1
+3 0.167921572 1
+3 0.304253899 1
+3 0.103807201 1
+3 0.191962088 1
+3 0.071989566 1
+3 0.296183440 1
+3 0.162262688 1
+3 0.125661454 1
+3 0.192164590 1
+4 0.000394039 2
+4 0.034617321 40
+4 0.000414822 27
+3 0.796676353 1
+3 0.119589531 1
+3 0.120189440 1
+3 0.080002264 1
+3 0.120104599 1
+3 0.087897523 1
+3 0.088072936 1
+3 0.111980459 1
+3 0.064099904 1
+3 0.440166638 1
+3 0.159957933 1
+3 0.063988834 1
+3 0.247906778 1
+3 0.167767797 1
+3 0.151961605 1
+3 0.176237322 1
+3 0.368288839 1
+4 0.000364019 2
+4 0.034413644 79
diff --git a/lib/iolog/regress/iolog_filter/test3/ttyin b/lib/iolog/regress/iolog_filter/test3/ttyin
new file mode 100644
index 0000000..224e0b4
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/test3/ttyin
@@ -0,0 +1 @@
+not a password nope, sorry try again please \ No newline at end of file
diff --git a/lib/iolog/regress/iolog_filter/test3/ttyin.filtered b/lib/iolog/regress/iolog_filter/test3/ttyin.filtered
new file mode 100644
index 0000000..bc6dfb5
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/test3/ttyin.filtered
@@ -0,0 +1 @@
+************** *********** **************** \ No newline at end of file
diff --git a/lib/iolog/regress/iolog_filter/test3/ttyout b/lib/iolog/regress/iolog_filter/test3/ttyout
new file mode 100644
index 0000000..b6befb9
--- /dev/null
+++ b/lib/iolog/regress/iolog_filter/test3/ttyout
@@ -0,0 +1,6 @@
+ root@localhost's password:
+Permission denied, please try again.
+ root@localhost's password:
+Permission denied, please try again.
+ root@localhost's password:
+root@localhost: Permission denied (publickey,password,keyboard-interactive).
diff --git a/lib/iolog/regress/iolog_json/check_iolog_json.c b/lib/iolog/regress/iolog_json/check_iolog_json.c
new file mode 100644
index 0000000..ce8565f
--- /dev/null
+++ b/lib/iolog/regress/iolog_json/check_iolog_json.c
@@ -0,0 +1,265 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2020 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <unistd.h>
+
+#define SUDO_ERROR_WRAP 0
+
+#include "sudo_compat.h"
+#include "sudo_util.h"
+#include "sudo_fatal.h"
+
+#include "iolog_json.h"
+
+sudo_dso_public int main(int argc, char *argv[]);
+
+static bool
+json_print_object(struct json_container *jsonc, struct json_object *object)
+{
+ struct json_item *item;
+ struct json_value json_value;
+ bool ret = false;
+
+ TAILQ_FOREACH(item, &object->items, entries) {
+ switch (item->type) {
+ case JSON_STRING:
+ json_value.type = JSON_STRING;
+ json_value.u.string = item->u.string;
+ if (!sudo_json_add_value(jsonc, item->name, &json_value))
+ goto oom;
+ break;
+ case JSON_NUMBER:
+ json_value.type = JSON_NUMBER;
+ json_value.u.number = item->u.number;
+ if (!sudo_json_add_value(jsonc, item->name, &json_value))
+ goto oom;
+ break;
+ case JSON_OBJECT:
+ if (!sudo_json_open_object(jsonc, item->name))
+ goto oom;
+ if (!json_print_object(jsonc, &item->u.child))
+ goto done;
+ if (!sudo_json_close_object(jsonc))
+ goto oom;
+ break;
+ case JSON_ARRAY:
+ if (!sudo_json_open_array(jsonc, item->name))
+ goto oom;
+ if (!json_print_object(jsonc, &item->u.child))
+ goto done;
+ if (!sudo_json_close_array(jsonc))
+ goto oom;
+ break;
+ case JSON_BOOL:
+ json_value.type = JSON_BOOL;
+ json_value.u.boolean = item->u.boolean;
+ if (!sudo_json_add_value(jsonc, item->name, &json_value))
+ goto oom;
+ break;
+ case JSON_NULL:
+ json_value.type = JSON_NULL;
+ if (!sudo_json_add_value(jsonc, item->name, &json_value))
+ goto oom;
+ break;
+ default:
+ sudo_warnx("unsupported JSON type %d", item->type);
+ goto done;
+ }
+ }
+
+ ret = true;
+ goto done;
+
+oom:
+ sudo_warnx("%s: %s", __func__, "unable to allocate memory");
+done:
+ return ret;
+}
+
+static bool
+json_format(struct json_container *jsonc, struct json_object *object)
+{
+ struct json_item *item;
+ bool ret = false;
+
+ /* First object holds all the actual data. */
+ item = TAILQ_FIRST(&object->items);
+ if (item->type != JSON_OBJECT) {
+ sudo_warnx("expected JSON_OBJECT, got %d", item->type);
+ goto done;
+ }
+ object = &item->u.child;
+
+ if (!json_print_object(jsonc, object))
+ goto done;
+
+ ret = true;
+
+done:
+ return ret;
+}
+
+static void
+usage(void)
+{
+ fprintf(stderr, "usage: %s [-c] input_file ...\n",
+ getprogname());
+ exit(EXIT_FAILURE);
+}
+
+static bool
+compare(FILE *fp, const char *infile, struct json_container *jsonc)
+{
+ const char *cp;
+ unsigned int lineno = 0;
+ size_t linesize = 0;
+ char *line = NULL;
+ ssize_t len;
+
+ cp = sudo_json_get_buf(jsonc);
+
+ while ((len = getdelim(&line, &linesize, '\n', fp)) != -1) {
+ lineno++;
+
+ /* skip open/close brace, not present in formatted output */
+ if (lineno == 1 && strcmp(line, "{\n") == 0)
+ continue;
+ if (*cp == '\0' && strcmp(line, "}\n") == 0)
+ continue;
+
+ /* Ignore newlines in output to make comparison easier. */
+ if (*cp == '\n')
+ cp++;
+ if (line[len - 1] == '\n')
+ len--;
+
+ if (strncmp(line, cp, len) != 0) {
+ fprintf(stderr, "%s: mismatch on line %u\n", infile, lineno);
+ fprintf(stderr, "expected: %s", line);
+ fprintf(stderr, "got : %.*s\n", (int)len, cp);
+ return false;
+ }
+ cp += len;
+ }
+ free(line);
+
+ return true;
+}
+
+int
+main(int argc, char *argv[])
+{
+ struct json_object root;
+ int ch, i, ntests = 0, errors = 0;
+ bool cat = false;
+
+ initprogname(argc > 0 ? argv[0] : "check_iolog_json");
+
+ while ((ch = getopt(argc, argv, "c")) != -1) {
+ switch (ch) {
+ case 'c':
+ cat = true;
+ break;
+ default:
+ usage();
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ if (argc < 1)
+ usage();
+
+ for (i = 0; i < argc; i++) {
+ struct json_container jsonc;
+ const char *infile = argv[i];
+ const char *outfile = argv[i];
+ const char *cp;
+ char pathbuf[PATH_MAX];
+ FILE *infp = NULL;
+ FILE *outfp = NULL;
+
+ ntests++;
+
+ if (!sudo_json_init(&jsonc, 4, false, true, true)) {
+ errors++;
+ continue;
+ }
+
+ /* Parse input file. */
+ if ((infp = fopen(infile, "r")) == NULL) {
+ sudo_warn("%s", argv[i]);
+ errors++;
+ continue;
+ }
+ if (!iolog_parse_json(infp, infile, &root)) {
+ errors++;
+ goto next;
+ }
+
+ /* Format as pretty-printed JSON */
+ if (!json_format(&jsonc, &root)) {
+ errors++;
+ goto next;
+ }
+
+ /* Check for a .out.ok file in the same location as the .in file. */
+ cp = strrchr(infile, '.');
+ if (cp != NULL && strcmp(cp, ".in") == 0) {
+ snprintf(pathbuf, sizeof(pathbuf), "%.*s.out.ok",
+ (int)(cp - infile), infile);
+ if ((outfp = fopen(pathbuf, "r")) != NULL)
+ outfile = pathbuf;
+ }
+ if (outfp == NULL)
+ outfp = infp;
+
+ /* Compare output to expected output. */
+ rewind(outfp);
+ if (!compare(outfp, outfile, &jsonc))
+ errors++;
+
+ /* Write the formatted output to stdout for -c (cat) */
+ if (cat) {
+ fprintf(stdout, "{%s\n}\n", sudo_json_get_buf(&jsonc));
+ fflush(stdout);
+ }
+
+next:
+ free_json_items(&root.items);
+ sudo_json_free(&jsonc);
+ if (infp != NULL)
+ fclose(infp);
+ if (outfp != NULL && outfp != infp)
+ fclose(outfp);
+ }
+
+ if (ntests != 0) {
+ printf("iolog_json: %d test%s run, %d errors, %d%% success rate\n",
+ ntests, ntests == 1 ? "" : "s", errors,
+ (ntests - errors) * 100 / ntests);
+ }
+
+ return errors;
+}
diff --git a/lib/iolog/regress/iolog_json/test1.in b/lib/iolog/regress/iolog_json/test1.in
new file mode 100644
index 0000000..8ad3689
--- /dev/null
+++ b/lib/iolog/regress/iolog_json/test1.in
@@ -0,0 +1,34 @@
+{
+ "timestamp": {
+ "seconds": 1584993067,
+ "nanoseconds": 880288287
+ },
+ "columns": 80,
+ "command": "/usr/bin/make",
+ "lines": 24,
+ "runargv": [
+ "make",
+ "test"
+ ],
+ "runenv": [
+ "LANG=en_US.UTF-8",
+ "PATH=/bin:/sbin:/usr/games:/usr/bin:/usr/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin",
+ "TERM=vt100",
+ "MAIL=/var/mail/root",
+ "LOGNAME=root",
+ "USER=root",
+ "HOME=/root",
+ "SHELL=/bin/ksh",
+ "SUDO_COMMAND=/usr/bin/make test",
+ "SUDO_USER=millert",
+ "SUDO_UID=8036",
+ "SUDO_GID=20",
+ "A__z=\"*SHLVL"
+ ],
+ "runuid": 0,
+ "runuser": "root",
+ "submitcwd": "/home/test",
+ "submithost": "sudo.ws",
+ "submituser": "millert",
+ "ttyname": "/dev/console"
+}
diff --git a/lib/iolog/regress/iolog_json/test2.in b/lib/iolog/regress/iolog_json/test2.in
new file mode 100644
index 0000000..df7170f
--- /dev/null
+++ b/lib/iolog/regress/iolog_json/test2.in
@@ -0,0 +1,28 @@
+{
+ "timestamp": { "seconds": 1584993067, "nanoseconds": 880288287 },
+ "columns": 80,
+ "command": "/usr/bin/make",
+ "lines": 24,
+ "runargv": [ "make", "test" ],
+ "runenv": [
+ "LANG=en_US.UTF-8",
+ "PATH=/bin:/sbin:/usr/games:/usr/bin:/usr/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin",
+ "TERM=vt100",
+ "MAIL=/var/mail/root",
+ "LOGNAME=root",
+ "USER=root",
+ "HOME=/root",
+ "SHELL=/bin/ksh",
+ "SUDO_COMMAND=/usr/bin/make test",
+ "SUDO_USER=millert",
+ "SUDO_UID=8036",
+ "SUDO_GID=20",
+ "A__z=\"*SHLVL"
+ ],
+ "runuid": 0,
+ "runuser": "root",
+ "submitcwd": "/home/test",
+ "submithost": "sudo.ws",
+ "submituser": "millert",
+ "ttyname": "/dev/console"
+}
diff --git a/lib/iolog/regress/iolog_json/test2.out.ok b/lib/iolog/regress/iolog_json/test2.out.ok
new file mode 100644
index 0000000..8ad3689
--- /dev/null
+++ b/lib/iolog/regress/iolog_json/test2.out.ok
@@ -0,0 +1,34 @@
+{
+ "timestamp": {
+ "seconds": 1584993067,
+ "nanoseconds": 880288287
+ },
+ "columns": 80,
+ "command": "/usr/bin/make",
+ "lines": 24,
+ "runargv": [
+ "make",
+ "test"
+ ],
+ "runenv": [
+ "LANG=en_US.UTF-8",
+ "PATH=/bin:/sbin:/usr/games:/usr/bin:/usr/sbin:/usr/X11R6/bin:/usr/local/bin:/usr/local/sbin",
+ "TERM=vt100",
+ "MAIL=/var/mail/root",
+ "LOGNAME=root",
+ "USER=root",
+ "HOME=/root",
+ "SHELL=/bin/ksh",
+ "SUDO_COMMAND=/usr/bin/make test",
+ "SUDO_USER=millert",
+ "SUDO_UID=8036",
+ "SUDO_GID=20",
+ "A__z=\"*SHLVL"
+ ],
+ "runuid": 0,
+ "runuser": "root",
+ "submitcwd": "/home/test",
+ "submithost": "sudo.ws",
+ "submituser": "millert",
+ "ttyname": "/dev/console"
+}
diff --git a/lib/iolog/regress/iolog_json/test3.in b/lib/iolog/regress/iolog_json/test3.in
new file mode 100644
index 0000000..6f243e3
--- /dev/null
+++ b/lib/iolog/regress/iolog_json/test3.in
@@ -0,0 +1,22 @@
+{
+ "true": false,
+ "false": true,
+ "number": 1234567890,
+ "null": null,
+ "string": "non\u0073ense",
+ "scope": {
+ "a": "b",
+ "bah": null
+ },
+ "array1": [
+ "foo",
+ "bar",
+ [
+ 123,
+ null,
+ false,
+ "fizz",
+ "buzz"
+ ]
+ ]
+}
diff --git a/lib/iolog/regress/iolog_json/test3.out.ok b/lib/iolog/regress/iolog_json/test3.out.ok
new file mode 100644
index 0000000..ea2df89
--- /dev/null
+++ b/lib/iolog/regress/iolog_json/test3.out.ok
@@ -0,0 +1,22 @@
+{
+ "true": false,
+ "false": true,
+ "number": 1234567890,
+ "null": null,
+ "string": "nonsense",
+ "scope": {
+ "a": "b",
+ "bah": null
+ },
+ "array1": [
+ "foo",
+ "bar",
+ [
+ 123,
+ null,
+ false,
+ "fizz",
+ "buzz"
+ ]
+ ]
+}
diff --git a/lib/iolog/regress/iolog_mkpath/check_iolog_mkpath.c b/lib/iolog/regress/iolog_mkpath/check_iolog_mkpath.c
new file mode 100644
index 0000000..36935ee
--- /dev/null
+++ b/lib/iolog/regress/iolog_mkpath/check_iolog_mkpath.c
@@ -0,0 +1,115 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2020 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <config.h>
+
+#include <sys/wait.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#define SUDO_ERROR_WRAP 0
+
+#include "sudo_compat.h"
+#include "sudo_util.h"
+#include "sudo_fatal.h"
+#include "sudo_iolog.h"
+
+sudo_dso_public int main(int argc, char *argv[]);
+
+static const char *test_paths[] = {
+ "testdir/a/b/c/user", /* create new */
+ "testdir/a/b/c/user", /* open existing */
+ "testdir/a/b/c/user.XXXXXX", /* mkdtemp new */
+ NULL
+};
+
+static void
+test_iolog_mkpath(const char *testdir, int *ntests, int *nerrors)
+{
+ const char **tp;
+ char *path;
+
+ iolog_set_owner(geteuid(), getegid());
+
+ for (tp = test_paths; *tp != NULL; tp++) {
+ if (asprintf(&path, "%s/%s", testdir, *tp) == -1)
+ sudo_fatalx("unable to allocate memory");
+
+ (*ntests)++;
+ if (!iolog_mkpath(path)) {
+ sudo_warnx("unable to mkpath %s", path);
+ (*nerrors)++;
+ }
+ free(path);
+ }
+}
+
+int
+main(int argc, char *argv[])
+{
+ char testdir[] = "mkpath.XXXXXX";
+ const char *rmargs[] = { "rm", "-rf", NULL, NULL };
+ int ch, status, ntests = 0, errors = 0;
+
+ initprogname(argc > 0 ? argv[0] : "check_iolog_mkpath");
+
+ while ((ch = getopt(argc, argv, "v")) != -1) {
+ switch (ch) {
+ case 'v':
+ /* ignore */
+ break;
+ default:
+ fprintf(stderr, "usage: %s [-v]\n", getprogname());
+ return EXIT_FAILURE;
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ if (mkdtemp(testdir) == NULL)
+ sudo_fatal("unable to create test dir");
+ rmargs[2] = testdir;
+
+ test_iolog_mkpath(testdir, &ntests, &errors);
+
+ if (ntests != 0) {
+ printf("iolog_mkpath: %d test%s run, %d errors, %d%% success rate\n",
+ ntests, ntests == 1 ? "" : "s", errors,
+ (ntests - errors) * 100 / ntests);
+ }
+
+ /* Clean up (avoid running via shell) */
+ switch (fork()) {
+ case -1:
+ sudo_warn("fork");
+ _exit(1);
+ case 0:
+ execvp("rm", (char **)rmargs);
+ _exit(1);
+ default:
+ wait(&status);
+ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0)
+ errors++;
+ break;
+ }
+
+ return errors;
+}
diff --git a/lib/iolog/regress/iolog_path/check_iolog_path.c b/lib/iolog/regress/iolog_path/check_iolog_path.c
new file mode 100644
index 0000000..7a46735
--- /dev/null
+++ b/lib/iolog/regress/iolog_path/check_iolog_path.c
@@ -0,0 +1,296 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2011-2013 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+#include <time.h>
+#include <unistd.h>
+
+#define SUDO_ERROR_WRAP 0
+
+#include "sudo_compat.h"
+#include "sudo_util.h"
+#include "sudo_fatal.h"
+#include "sudo_iolog.h"
+
+static struct iolog_escape_data {
+ char sessid[7];
+ char *user;
+ char *group;
+ char *runas_user;
+ char *runas_group;
+ char *host;
+ char *command;
+} escape_data;
+
+sudo_dso_public int main(int argc, char *argv[]);
+
+static void
+usage(void)
+{
+ fprintf(stderr, "usage: %s datafile\n", getprogname());
+ exit(EXIT_FAILURE);
+}
+
+static void
+reset_escape_data(struct iolog_escape_data *data)
+{
+ free(data->user);
+ free(data->group);
+ free(data->runas_user);
+ free(data->runas_group);
+ free(data->host);
+ free(data->command);
+ memset(data, 0, sizeof(*data));
+}
+
+static size_t
+fill_seq(char *str, size_t strsize, void *unused)
+{
+ int len;
+
+ /* Path is of the form /var/log/sudo-io/00/00/01. */
+ len = snprintf(str, strsize, "%c%c/%c%c/%c%c", escape_data.sessid[0],
+ escape_data.sessid[1], escape_data.sessid[2], escape_data.sessid[3],
+ escape_data.sessid[4], escape_data.sessid[5]);
+ if (len < 0)
+ return strsize; /* handle non-standard snprintf() */
+ return len;
+}
+
+static size_t
+fill_user(char *str, size_t strsize, void *unused)
+{
+ return strlcpy(str, escape_data.user, strsize);
+}
+
+static size_t
+fill_group(char *str, size_t strsize, void *unused)
+{
+ return strlcpy(str, escape_data.group, strsize);
+}
+
+static size_t
+fill_runas_user(char *str, size_t strsize, void *unused)
+{
+ return strlcpy(str, escape_data.runas_user, strsize);
+}
+
+static size_t
+fill_runas_group(char *str, size_t strsize, void *unused)
+{
+ return strlcpy(str, escape_data.runas_group, strsize);
+}
+
+static size_t
+fill_hostname(char *str, size_t strsize, void *unused)
+{
+ return strlcpy(str, escape_data.host, strsize);
+}
+
+static size_t
+fill_command(char *str, size_t strsize, void *unused)
+{
+ return strlcpy(str, escape_data.command, strsize);
+}
+
+/* Note: "seq" must be first in the list. */
+static struct iolog_path_escape path_escapes[] = {
+ { "seq", fill_seq },
+ { "user", fill_user },
+ { "group", fill_group },
+ { "runas_user", fill_runas_user },
+ { "runas_group", fill_runas_group },
+ { "hostname", fill_hostname },
+ { "command", fill_command },
+ { NULL, NULL }
+};
+
+static int
+do_check(char *dir_in, char *file_in, char *tdir_out, char *tfile_out)
+{
+ char dir[PATH_MAX], dir_out[PATH_MAX] = "";
+ char file[PATH_MAX], file_out[PATH_MAX] = "";
+ int error = 0;
+ struct tm tm;
+ time_t now;
+ int len;
+
+ /*
+ * Expand any strftime(3) escapes
+ * XXX - want to pass tm to expand_iolog_path
+ */
+ time(&now);
+ if (localtime_r(&now, &tm) == NULL)
+ sudo_fatal("localtime_r");
+ if (tdir_out[0] != '\0') {
+ len = strftime(dir_out, sizeof(dir_out), tdir_out, &tm);
+ if (len == 0 || dir_out[sizeof(dir_out) - 1] != '\0')
+ sudo_fatalx("dir_out: strftime overflow");
+ }
+ if (tfile_out[0] != '\0') {
+ len = strftime(file_out, sizeof(file_out), tfile_out, &tm);
+ if (len == 0 || file_out[sizeof(file_out) - 1] != '\0')
+ sudo_fatalx("file_out: strftime overflow");
+ }
+
+ if (!expand_iolog_path(dir_in, dir, sizeof(dir), &path_escapes[1], NULL))
+ sudo_fatalx("unable to expand I/O log dir");
+ if (!expand_iolog_path(file_in, file, sizeof(file), &path_escapes[0], dir))
+ sudo_fatalx("unable to expand I/O log file");
+
+ if (strcmp(dir, dir_out) != 0) {
+ sudo_warnx("%s: expected %s, got %s", dir_in, dir_out, dir);
+ error = 1;
+ }
+ if (strcmp(file, file_out) != 0) {
+ sudo_warnx("%s: expected %s, got %s", file_in, file_out, file);
+ error = 1;
+ }
+
+ return error;
+}
+
+#define MAX_STATE 12
+
+int
+main(int argc, char *argv[])
+{
+ size_t len;
+ FILE *fp;
+ char line[2048];
+ char *file_in = NULL, *file_out = NULL;
+ char *dir_in = NULL, *dir_out = NULL;
+ int ch, state = 0, errors = 0, ntests = 0;
+
+ initprogname(argc > 0 ? argv[0] : "check_iolog_path");
+
+ while ((ch = getopt(argc, argv, "v")) != -1) {
+ switch (ch) {
+ case 'v':
+ /* ignore */
+ break;
+ default:
+ fprintf(stderr, "usage: %s [-v] data\n", getprogname());
+ return EXIT_FAILURE;
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ if (argc != 1)
+ usage();
+
+ fp = fopen(argv[0], "r");
+ if (fp == NULL)
+ sudo_fatalx("unable to open %s", argv[0]);
+
+ /*
+ * Input consists of 12 lines:
+ * sequence number
+ * user name
+ * user gid
+ * runas user name
+ * runas gid
+ * hostname [short form]
+ * command
+ * dir [with escapes]
+ * file [with escapes]
+ * expanded dir
+ * expanded file
+ * empty line
+ */
+ while (fgets(line, sizeof(line), fp) != NULL) {
+ len = strcspn(line, "\n");
+ line[len] = '\0';
+
+ switch (state) {
+ case 0:
+ strlcpy(escape_data.sessid, line, sizeof(escape_data.sessid));
+ break;
+ case 1:
+ if ((escape_data.user = strdup(line)) == NULL)
+ sudo_fatal(NULL);
+ break;
+ case 2:
+ if ((escape_data.group = strdup(line)) == NULL)
+ sudo_fatal(NULL);
+ break;
+ case 3:
+ if ((escape_data.runas_user = strdup(line)) == NULL)
+ sudo_fatal(NULL);
+ break;
+ case 4:
+ if ((escape_data.runas_group = strdup(line)) == NULL)
+ sudo_fatal(NULL);
+ break;
+ case 5:
+ if ((escape_data.host = strdup(line)) == NULL)
+ sudo_fatal(NULL);
+ break;
+ case 6:
+ if ((escape_data.command = strdup(line)) == NULL)
+ sudo_fatal(NULL);
+ break;
+ case 7:
+ if (dir_in != NULL)
+ free(dir_in);
+ dir_in = strdup(line);
+ break;
+ case 8:
+ if (file_in != NULL)
+ free(file_in);
+ file_in = strdup(line);
+ break;
+ case 9:
+ if (dir_out != NULL)
+ free(dir_out);
+ dir_out = strdup(line);
+ break;
+ case 10:
+ if (file_out != NULL)
+ free(file_out);
+ file_out = strdup(line);
+ break;
+ case 11:
+ errors += do_check(dir_in, file_in, dir_out, file_out);
+ ntests++;
+ reset_escape_data(&escape_data);
+ break;
+ default:
+ sudo_fatalx("internal error, invalid state %d", state);
+ }
+ state = (state + 1) % MAX_STATE;
+ }
+ free(dir_in);
+ free(dir_out);
+ free(file_in);
+ free(file_out);
+
+ if (ntests != 0) {
+ printf("iolog_path: %d test%s run, %d errors, %d%% success rate\n",
+ ntests, ntests == 1 ? "" : "s", errors,
+ (ntests - errors) * 100 / ntests);
+ }
+
+ return errors;
+}
diff --git a/lib/iolog/regress/iolog_path/data b/lib/iolog/regress/iolog_path/data
new file mode 100644
index 0000000..48dc87e
--- /dev/null
+++ b/lib/iolog/regress/iolog_path/data
@@ -0,0 +1,96 @@
+000001
+nobody
+nogroup
+root
+root
+somehost
+id
+/var/log/sudo-io
+%%{bogus}
+/var/log/sudo-io
+%%{bogus}
+
+000001
+nobody
+nogroup
+root
+wheel
+somehost
+id
+/var/log/sudo-io
+%%{seq}
+/var/log/sudo-io
+%%{seq}
+
+000001
+nobody
+nogroup
+root
+wheel
+somehost
+id
+/var/log/sudo-io
+%{seq}
+/var/log/sudo-io
+00/00/01
+
+000001
+nobody
+nogroup
+root
+wheel
+somehost
+id
+/var/log/sudo-io/%{user}
+%{seq}
+/var/log/sudo-io/nobody
+00/00/01
+
+000001
+nobody
+nogroup
+root
+wheel
+somehost
+su
+/var/log/sudo-io/%{user}/%{runas_user}
+%{command}_%Y%m%s_%H%M
+/var/log/sudo-io/nobody/root
+su_%Y%m%s_%H%M
+
+000001
+nobody
+nogroup
+root
+wheel
+somehost
+su
+/var/log/sudo-io/
+//%{user}/%{runas_user}/%{command}_%Y%m%s_%H%M
+/var/log/sudo-io
+/nobody/root/su_%Y%m%s_%H%M
+
+000001
+nobody
+nogroup
+root
+wheel
+somehost
+su
+/var/log/sudo-io/%d%m%Y
+%{user}/%{runas_user}/%{command}
+/var/log/sudo-io/%d%m%Y
+nobody/root/su
+
+000001
+nobody
+nogroup
+root
+wheel
+somehost
+su
+////////
+%{user}/%{runas_user}/%{command}
+
+nobody/root/su
+
diff --git a/lib/iolog/regress/iolog_timing/check_iolog_timing.c b/lib/iolog/regress/iolog_timing/check_iolog_timing.c
new file mode 100644
index 0000000..915b604
--- /dev/null
+++ b/lib/iolog/regress/iolog_timing/check_iolog_timing.c
@@ -0,0 +1,161 @@
+/*
+ * SPDX-License-Identifier: ISC
+ *
+ * Copyright (c) 2018 Todd C. Miller <Todd.Miller@sudo.ws>
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+
+#define SUDO_ERROR_WRAP 0
+
+#include "sudo_compat.h"
+#include "sudo_util.h"
+#include "sudo_fatal.h"
+#include "sudo_iolog.h"
+
+sudo_dso_public int main(int argc, char *argv[]);
+
+static struct parse_delay_test {
+ const char *input;
+ const char *next_field;
+ struct timespec expected_delay;
+} parse_delay_tests[] = {
+ { "10.99999999999 X", "X", { 10, 999999999 } }, /* clamp to nsec */
+ { "10.999999999 X", "X", { 10, 999999999 } }, /* nsec */
+ { "10.999999 X", "X", { 10, 999999000 } }, /* usec -> nsec */
+ { "10.000999999 X", "X", { 10, 999999 } },
+ { "10.9 X", "X", { 10, 900000000 } },
+ { "10.0 X", "X", { 10, 0 } }
+};
+
+/*
+ * Test iolog_parse_delay()
+ */
+static void
+test_parse_delay(int *ntests, int *nerrors)
+{
+ unsigned int i;
+
+ for (i = 0; i < nitems(parse_delay_tests); i++) {
+ struct timespec delay;
+ struct parse_delay_test *test = &parse_delay_tests[i];
+ char *cp = iolog_parse_delay(test->input, &delay, ".");
+ if (cp == NULL) {
+ sudo_warnx("%s:%u failed to parse delay: %s", __func__,
+ i, test->input);
+ (*nerrors)++;
+ continue;
+ }
+ if (strcmp(cp, test->next_field) != 0) {
+ sudo_warnx("%s:%u next field (want \"%s\", got \"%s\"", __func__,
+ i, test->next_field, cp);
+ (*nerrors)++;
+ continue;
+ }
+ if (delay.tv_sec != test->expected_delay.tv_sec) {
+ sudo_warnx("%s:%u wrong seconds (want %lld, got %lld)", __func__,
+ i, (long long)test->expected_delay.tv_sec,
+ (long long)delay.tv_sec);
+ (*nerrors)++;
+ continue;
+ }
+ if (delay.tv_nsec != test->expected_delay.tv_nsec) {
+ sudo_warnx("%s:%u wrong nanoseconds (want %ld, got %ld)", __func__,
+ i, test->expected_delay.tv_nsec, delay.tv_nsec);
+ (*nerrors)++;
+ continue;
+ }
+ }
+ (*ntests) += i;
+}
+
+static struct adjust_delay_test {
+ struct timespec in_delay;
+ struct timespec out_delay;
+ struct timespec max_delay;
+ double scale_factor;
+} adjust_delay_tests[] = {
+ { { 10, 300 }, { 10, 300 }, { 0, 0 }, 1.0 },
+ { { 10, 300 }, { 5, 150 }, { 0, 0 }, 2.0 },
+ { { 5, 300 }, { 2, 500000150 }, { 0, 0 }, 2.0 },
+ { { 0, 1000000 }, { 0, 333333 }, { 0, 0 }, 3 },
+ { { 10, 1000000 }, { 3, 333666666 }, { 0, 0 }, 3 },
+ { { 5, 150 }, { 10, 300 }, { 0, 0 }, 0.5 },
+ { { 5, 500000000 }, { 11, 0 }, { 0, 0 }, 0.5 },
+ { { 5, 150 }, { 5, 0 }, { 5, 0 }, 0.5 }
+};
+
+/*
+ * Test iolog_adjust_delay()
+ */
+static void
+test_adjust_delay(int *ntests, int *nerrors)
+{
+ unsigned int i;
+
+ for (i = 0; i < nitems(adjust_delay_tests); i++) {
+ struct adjust_delay_test *test = &adjust_delay_tests[i];
+
+ iolog_adjust_delay(&test->in_delay,
+ sudo_timespecisset(&test->max_delay) ? &test->max_delay : NULL,
+ test->scale_factor);
+ if (!sudo_timespeccmp(&test->in_delay, &test->out_delay, ==)) {
+ sudo_warnx("%s:%u want {%lld, %ld}, got {%lld, %ld}", __func__, i,
+ (long long)test->out_delay.tv_sec, test->out_delay.tv_nsec,
+ (long long)test->in_delay.tv_sec, test->in_delay.tv_nsec);
+ (*nerrors)++;
+ }
+ }
+ (*ntests) += i;
+}
+
+int
+main(int argc, char *argv[])
+{
+ int ch, ntests = 0, errors = 0;
+
+ initprogname(argc > 0 ? argv[0] : "check_iolog_timing");
+
+ while ((ch = getopt(argc, argv, "v")) != -1) {
+ switch (ch) {
+ case 'v':
+ /* ignore */
+ break;
+ default:
+ fprintf(stderr, "usage: %s [-v]\n", getprogname());
+ return EXIT_FAILURE;
+ }
+ }
+ argc -= optind;
+ argv += optind;
+
+ test_parse_delay(&ntests, &errors);
+
+ test_adjust_delay(&ntests, &errors);
+
+ if (ntests != 0) {
+ printf("iolog_timing: %d test%s run, %d errors, %d%% success rate\n",
+ ntests, ntests == 1 ? "" : "s", errors,
+ (ntests - errors) * 100 / ntests);
+ }
+
+ return errors;
+}